nxt-pick-datetime 10.0.0 → 13.0.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.
- package/{esm2015/lib/class/date-time-adapter.class.js → esm2020/lib/class/date-time-adapter.class.mjs} +0 -0
- package/{esm2015/lib/class/date-time-format.class.js → esm2020/lib/class/date-time-format.class.mjs} +1 -1
- package/esm2020/lib/class/date-time.class.mjs +161 -0
- package/{esm2015/lib/class/dialog-config.class.js → esm2020/lib/class/dialog-config.class.mjs} +0 -0
- package/esm2020/lib/class/dialog-ref.class.mjs +121 -0
- package/esm2020/lib/date-time/calendar/calendar.component.mjs +345 -0
- package/esm2020/lib/date-time/calendar-body/calendar-body.component.mjs +145 -0
- package/esm2020/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +438 -0
- package/esm2020/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +359 -0
- package/esm2020/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +369 -0
- package/esm2020/lib/date-time/date-time-inline/date-time-inline.component.mjs +264 -0
- package/esm2020/lib/date-time/date-time-picker/date-time-picker.component.mjs +529 -0
- package/{esm2015/lib/date-time/date-time-picker-container/date-time-picker-container.animations.js → esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs} +1 -1
- package/esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +390 -0
- package/esm2020/lib/date-time/date-time-picker-input.directive.mjs +624 -0
- package/esm2020/lib/date-time/date-time-picker-intl.service.mjs +61 -0
- package/esm2020/lib/date-time/date-time-picker-trigger.directive.mjs +68 -0
- package/esm2020/lib/date-time/date-time.module.mjs +88 -0
- package/esm2020/lib/date-time/number-fixed-len.pipe.mjs +25 -0
- package/esm2020/lib/date-time/timer/timer.component.mjs +292 -0
- package/esm2020/lib/date-time/timer-box/timer-box.component.mjs +88 -0
- package/esm2020/lib/dialog/dialog-container/dialog-container.component.mjs +243 -0
- package/esm2020/lib/dialog/dialog.module.mjs +34 -0
- package/esm2020/lib/dialog/dialog.service.mjs +240 -0
- package/{esm2015/lib/utils/object.js → esm2020/lib/utils/object.mjs} +0 -0
- package/esm2020/moment-adapter/date-time-adapter.class.mjs +215 -0
- package/{esm2015/moment-adapter/date-time-format.class.js → esm2020/moment-adapter/date-time-format.class.mjs} +0 -0
- package/esm2020/moment-adapter/moment-adapter.module.mjs +41 -0
- package/esm2020/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +5 -0
- package/{esm2015/moment-adapter/public-api.js → esm2020/moment-adapter/public-api.mjs} +0 -0
- package/esm2020/native-adapter/date-time-adapter.class.mjs +344 -0
- package/{esm2015/native-adapter/date-time-format.class.js → esm2020/native-adapter/date-time-format.class.mjs} +0 -0
- package/esm2020/native-adapter/native-adapter.module.mjs +35 -0
- package/esm2020/native-adapter/nxt-pick-datetime-native-adapter.mjs +5 -0
- package/{esm2015/native-adapter/public-api.js → esm2020/native-adapter/public-api.mjs} +0 -0
- package/esm2020/nxt-pick-datetime.mjs +5 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/nxt-pick-datetime-moment-adapter.mjs +269 -0
- package/fesm2015/nxt-pick-datetime-moment-adapter.mjs.map +1 -0
- package/fesm2015/{nxt-pick-datetime-native-adapter.js → nxt-pick-datetime-native-adapter.mjs} +41 -27
- package/fesm2015/nxt-pick-datetime-native-adapter.mjs.map +1 -0
- package/fesm2015/nxt-pick-datetime.mjs +4974 -0
- package/fesm2015/nxt-pick-datetime.mjs.map +1 -0
- package/{fesm2015/nxt-pick-datetime-moment-adapter.js → fesm2020/nxt-pick-datetime-moment-adapter.mjs} +48 -27
- package/fesm2020/nxt-pick-datetime-moment-adapter.mjs.map +1 -0
- package/fesm2020/nxt-pick-datetime-native-adapter.mjs +390 -0
- package/fesm2020/nxt-pick-datetime-native-adapter.mjs.map +1 -0
- package/{fesm2015/nxt-pick-datetime.js → fesm2020/nxt-pick-datetime.mjs} +2207 -1967
- package/fesm2020/nxt-pick-datetime.mjs.map +1 -0
- package/lib/class/date-time.class.d.ts +3 -0
- package/lib/class/dialog-ref.class.d.ts +2 -0
- package/lib/date-time/calendar/calendar.component.d.ts +3 -0
- package/lib/date-time/calendar-body/calendar-body.component.d.ts +3 -0
- package/lib/date-time/calendar-month-view/calendar-month-view.component.d.ts +3 -0
- package/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +3 -0
- package/lib/date-time/calendar-year-view/calendar-year-view.component.d.ts +3 -0
- package/lib/date-time/date-time-inline/date-time-inline.component.d.ts +3 -0
- package/lib/date-time/date-time-picker/date-time-picker.component.d.ts +3 -0
- package/lib/date-time/date-time-picker-container/date-time-picker-container.component.d.ts +3 -0
- package/lib/date-time/date-time-picker-input.directive.d.ts +3 -0
- package/lib/date-time/date-time-picker-intl.service.d.ts +3 -0
- package/lib/date-time/date-time-picker-trigger.directive.d.ts +3 -0
- package/lib/date-time/date-time.module.d.ts +21 -0
- package/lib/date-time/number-fixed-len.pipe.d.ts +3 -0
- package/lib/date-time/timer/timer.component.d.ts +3 -0
- package/lib/date-time/timer-box/timer-box.component.d.ts +3 -0
- package/lib/dialog/dialog-container/dialog-container.component.d.ts +5 -2
- package/lib/dialog/dialog.module.d.ts +9 -0
- package/lib/dialog/dialog.service.d.ts +6 -2
- package/moment-adapter/date-time-adapter.class.d.ts +3 -0
- package/moment-adapter/moment-adapter.module.d.ts +7 -0
- package/moment-adapter/nxt-pick-datetime-moment-adapter.d.ts +1 -3
- package/moment-adapter/package.json +6 -7
- package/native-adapter/date-time-adapter.class.d.ts +3 -0
- package/native-adapter/native-adapter.module.d.ts +8 -0
- package/native-adapter/nxt-pick-datetime-native-adapter.d.ts +1 -3
- package/native-adapter/package.json +6 -7
- package/nxt-pick-datetime.d.ts +1 -14
- package/package.json +48 -13
- package/bundles/nxt-pick-datetime-moment-adapter.umd.js +0 -577
- package/bundles/nxt-pick-datetime-moment-adapter.umd.js.map +0 -1
- package/bundles/nxt-pick-datetime-moment-adapter.umd.min.js +0 -17
- package/bundles/nxt-pick-datetime-moment-adapter.umd.min.js.map +0 -1
- package/bundles/nxt-pick-datetime-native-adapter.umd.js +0 -706
- package/bundles/nxt-pick-datetime-native-adapter.umd.js.map +0 -1
- package/bundles/nxt-pick-datetime-native-adapter.umd.min.js +0 -16
- package/bundles/nxt-pick-datetime-native-adapter.umd.min.js.map +0 -1
- package/bundles/nxt-pick-datetime.umd.js +0 -5809
- package/bundles/nxt-pick-datetime.umd.js.map +0 -1
- package/bundles/nxt-pick-datetime.umd.min.js +0 -17
- package/bundles/nxt-pick-datetime.umd.min.js.map +0 -1
- package/esm2015/lib/class/date-time.class.js +0 -151
- package/esm2015/lib/class/dialog-ref.class.js +0 -113
- package/esm2015/lib/date-time/calendar/calendar.component.js +0 -331
- package/esm2015/lib/date-time/calendar-body/calendar-body.component.js +0 -144
- package/esm2015/lib/date-time/calendar-month-view/calendar-month-view.component.js +0 -425
- package/esm2015/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.js +0 -347
- package/esm2015/lib/date-time/calendar-year-view/calendar-year-view.component.js +0 -356
- package/esm2015/lib/date-time/date-time-inline/date-time-inline.component.js +0 -246
- package/esm2015/lib/date-time/date-time-picker/date-time-picker.component.js +0 -511
- package/esm2015/lib/date-time/date-time-picker-container/date-time-picker-container.component.js +0 -373
- package/esm2015/lib/date-time/date-time-picker-input.directive.js +0 -592
- package/esm2015/lib/date-time/date-time-picker-intl.service.js +0 -59
- package/esm2015/lib/date-time/date-time-picker-trigger.directive.js +0 -63
- package/esm2015/lib/date-time/date-time.module.js +0 -60
- package/esm2015/lib/date-time/number-fixed-len.pipe.js +0 -21
- package/esm2015/lib/date-time/timer/timer.component.js +0 -287
- package/esm2015/lib/date-time/timer-box/timer-box.component.js +0 -77
- package/esm2015/lib/dialog/dialog-container/dialog-container.component.js +0 -202
- package/esm2015/lib/dialog/dialog.module.js +0 -26
- package/esm2015/lib/dialog/dialog.service.js +0 -225
- package/esm2015/moment-adapter/date-time-adapter.class.js +0 -206
- package/esm2015/moment-adapter/moment-adapter.module.js +0 -28
- package/esm2015/moment-adapter/nxt-pick-datetime-moment-adapter.js +0 -8
- package/esm2015/native-adapter/date-time-adapter.class.js +0 -342
- package/esm2015/native-adapter/native-adapter.module.js +0 -26
- package/esm2015/native-adapter/nxt-pick-datetime-native-adapter.js +0 -8
- package/esm2015/nxt-pick-datetime.js +0 -19
- package/fesm2015/nxt-pick-datetime-moment-adapter.js.map +0 -1
- package/fesm2015/nxt-pick-datetime-native-adapter.js.map +0 -1
- package/fesm2015/nxt-pick-datetime.js.map +0 -1
- package/moment-adapter/nxt-pick-datetime-moment-adapter.metadata.json +0 -1
- package/native-adapter/nxt-pick-datetime-native-adapter.metadata.json +0 -1
- package/nxt-pick-datetime.metadata.json +0 -1
|
@@ -0,0 +1,624 @@
|
|
|
1
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
2
|
+
import { DOWN_ARROW } from '@angular/cdk/keycodes';
|
|
3
|
+
import { Directive, EventEmitter, forwardRef, HostBinding, HostListener, Inject, Input, Optional, Output } from '@angular/core';
|
|
4
|
+
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
|
|
5
|
+
import { Subscription } from 'rxjs';
|
|
6
|
+
import { OWL_DATE_TIME_FORMATS } from '../class/date-time-format.class';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../class/date-time-adapter.class";
|
|
9
|
+
export const OWL_DATETIME_VALUE_ACCESSOR = {
|
|
10
|
+
provide: NG_VALUE_ACCESSOR,
|
|
11
|
+
useExisting: forwardRef(() => OwlDateTimeInputDirective),
|
|
12
|
+
multi: true
|
|
13
|
+
};
|
|
14
|
+
export const OWL_DATETIME_VALIDATORS = {
|
|
15
|
+
provide: NG_VALIDATORS,
|
|
16
|
+
useExisting: forwardRef(() => OwlDateTimeInputDirective),
|
|
17
|
+
multi: true
|
|
18
|
+
};
|
|
19
|
+
export class OwlDateTimeInputDirective {
|
|
20
|
+
constructor(elmRef, renderer, dateTimeAdapter, dateTimeFormats) {
|
|
21
|
+
this.elmRef = elmRef;
|
|
22
|
+
this.renderer = renderer;
|
|
23
|
+
this.dateTimeAdapter = dateTimeAdapter;
|
|
24
|
+
this.dateTimeFormats = dateTimeFormats;
|
|
25
|
+
/**
|
|
26
|
+
* The picker's select mode
|
|
27
|
+
*/
|
|
28
|
+
this._selectMode = 'single';
|
|
29
|
+
/**
|
|
30
|
+
* The character to separate the 'from' and 'to' in input value
|
|
31
|
+
*/
|
|
32
|
+
this.rangeSeparator = '~';
|
|
33
|
+
this._values = [];
|
|
34
|
+
/**
|
|
35
|
+
* Callback to invoke when `change` event is fired on this `<input>`
|
|
36
|
+
* */
|
|
37
|
+
this.dateTimeChange = new EventEmitter();
|
|
38
|
+
/**
|
|
39
|
+
* Callback to invoke when an `input` event is fired on this `<input>`.
|
|
40
|
+
* */
|
|
41
|
+
this.dateTimeInput = new EventEmitter();
|
|
42
|
+
this.dtPickerSub = Subscription.EMPTY;
|
|
43
|
+
this.localeSub = Subscription.EMPTY;
|
|
44
|
+
this.lastValueValid = true;
|
|
45
|
+
this.onModelChange = () => { };
|
|
46
|
+
this.onModelTouched = () => { };
|
|
47
|
+
this.validatorOnChange = () => { };
|
|
48
|
+
/** The form control validator for whether the input parses. */
|
|
49
|
+
this.parseValidator = () => this.lastValueValid
|
|
50
|
+
? null
|
|
51
|
+
: { owlDateTimeParse: { text: this.elmRef.nativeElement.value } };
|
|
52
|
+
/** The form control validator for the min date. */
|
|
53
|
+
this.minValidator = (control) => {
|
|
54
|
+
if (this.isInSingleMode) {
|
|
55
|
+
const controlValue = this.getValidDate(this.dateTimeAdapter.deserialize(control.value));
|
|
56
|
+
return !this.min ||
|
|
57
|
+
!controlValue ||
|
|
58
|
+
this.dateTimeAdapter.compare(this.min, controlValue) <= 0
|
|
59
|
+
? null
|
|
60
|
+
: { owlDateTimeMin: { min: this.min, actual: controlValue } };
|
|
61
|
+
}
|
|
62
|
+
else if (this.isInRangeMode && control.value) {
|
|
63
|
+
const controlValueFrom = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[0]));
|
|
64
|
+
const controlValueTo = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[1]));
|
|
65
|
+
return !this.min ||
|
|
66
|
+
!controlValueFrom ||
|
|
67
|
+
!controlValueTo ||
|
|
68
|
+
this.dateTimeAdapter.compare(this.min, controlValueFrom) <= 0
|
|
69
|
+
? null
|
|
70
|
+
: {
|
|
71
|
+
owlDateTimeMin: {
|
|
72
|
+
min: this.min,
|
|
73
|
+
actual: [controlValueFrom, controlValueTo]
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
/** The form control validator for the max date. */
|
|
79
|
+
this.maxValidator = (control) => {
|
|
80
|
+
if (this.isInSingleMode) {
|
|
81
|
+
const controlValue = this.getValidDate(this.dateTimeAdapter.deserialize(control.value));
|
|
82
|
+
return !this.max ||
|
|
83
|
+
!controlValue ||
|
|
84
|
+
this.dateTimeAdapter.compare(this.max, controlValue) >= 0
|
|
85
|
+
? null
|
|
86
|
+
: { owlDateTimeMax: { max: this.max, actual: controlValue } };
|
|
87
|
+
}
|
|
88
|
+
else if (this.isInRangeMode && control.value) {
|
|
89
|
+
const controlValueFrom = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[0]));
|
|
90
|
+
const controlValueTo = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[1]));
|
|
91
|
+
return !this.max ||
|
|
92
|
+
!controlValueFrom ||
|
|
93
|
+
!controlValueTo ||
|
|
94
|
+
this.dateTimeAdapter.compare(this.max, controlValueTo) >= 0
|
|
95
|
+
? null
|
|
96
|
+
: {
|
|
97
|
+
owlDateTimeMax: {
|
|
98
|
+
max: this.max,
|
|
99
|
+
actual: [controlValueFrom, controlValueTo]
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
/** The form control validator for the date filter. */
|
|
105
|
+
this.filterValidator = (control) => {
|
|
106
|
+
const controlValue = this.getValidDate(this.dateTimeAdapter.deserialize(control.value));
|
|
107
|
+
return !this._dateTimeFilter ||
|
|
108
|
+
!controlValue ||
|
|
109
|
+
this._dateTimeFilter(controlValue)
|
|
110
|
+
? null
|
|
111
|
+
: { owlDateTimeFilter: true };
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* The form control validator for the range.
|
|
115
|
+
* Check whether the 'before' value is before the 'to' value
|
|
116
|
+
* */
|
|
117
|
+
this.rangeValidator = (control) => {
|
|
118
|
+
if (this.isInSingleMode || !control.value) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const controlValueFrom = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[0]));
|
|
122
|
+
const controlValueTo = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[1]));
|
|
123
|
+
return !controlValueFrom ||
|
|
124
|
+
!controlValueTo ||
|
|
125
|
+
this.dateTimeAdapter.compare(controlValueFrom, controlValueTo) <= 0
|
|
126
|
+
? null
|
|
127
|
+
: { owlDateTimeRange: true };
|
|
128
|
+
};
|
|
129
|
+
/** The combined form control validator for this input. */
|
|
130
|
+
this.validator = Validators.compose([
|
|
131
|
+
this.parseValidator,
|
|
132
|
+
this.minValidator,
|
|
133
|
+
this.maxValidator,
|
|
134
|
+
this.filterValidator,
|
|
135
|
+
this.rangeValidator
|
|
136
|
+
]);
|
|
137
|
+
/** Emits when the value changes (either due to user input or programmatic change). */
|
|
138
|
+
this.valueChange = new EventEmitter();
|
|
139
|
+
/** Emits when the disabled state has changed */
|
|
140
|
+
this.disabledChange = new EventEmitter();
|
|
141
|
+
if (!this.dateTimeAdapter) {
|
|
142
|
+
throw Error('OwlDateTimePicker: No provider found for DateTimePicker. You must import one of the following ' +
|
|
143
|
+
'modules at your application root: OwlNativeDateTimeModule, OwlMomentDateTimeModule, or provide a ' +
|
|
144
|
+
'custom implementation.');
|
|
145
|
+
}
|
|
146
|
+
if (!this.dateTimeFormats) {
|
|
147
|
+
throw Error('OwlDateTimePicker: No provider found for OWL_DATE_TIME_FORMATS. You must import one of the following ' +
|
|
148
|
+
'modules at your application root: OwlNativeDateTimeModule, OwlMomentDateTimeModule, or provide a ' +
|
|
149
|
+
'custom implementation.');
|
|
150
|
+
}
|
|
151
|
+
this.localeSub = this.dateTimeAdapter.localeChanges.subscribe(() => {
|
|
152
|
+
this.value = this.value;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The date time picker that this input is associated with.
|
|
157
|
+
* */
|
|
158
|
+
set owlDateTime(value) {
|
|
159
|
+
this.registerDateTimePicker(value);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* A function to filter date time
|
|
163
|
+
*/
|
|
164
|
+
set owlDateTimeFilter(filter) {
|
|
165
|
+
this._dateTimeFilter = filter;
|
|
166
|
+
this.validatorOnChange();
|
|
167
|
+
}
|
|
168
|
+
get dateTimeFilter() {
|
|
169
|
+
return this._dateTimeFilter;
|
|
170
|
+
}
|
|
171
|
+
get disabled() {
|
|
172
|
+
return !!this._disabled;
|
|
173
|
+
}
|
|
174
|
+
set disabled(value) {
|
|
175
|
+
const newValue = coerceBooleanProperty(value);
|
|
176
|
+
const element = this.elmRef.nativeElement;
|
|
177
|
+
if (this._disabled !== newValue) {
|
|
178
|
+
this._disabled = newValue;
|
|
179
|
+
this.disabledChange.emit(newValue);
|
|
180
|
+
}
|
|
181
|
+
// We need to null check the `blur` method, because it's undefined during SSR.
|
|
182
|
+
if (newValue && element.blur) {
|
|
183
|
+
// Normally, native input elements automatically blur if they turn disabled. This behavior
|
|
184
|
+
// is problematic, because it would mean that it triggers another change detection cycle,
|
|
185
|
+
// which then causes a changed after checked error if the input element was focused before.
|
|
186
|
+
element.blur();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
get min() {
|
|
190
|
+
return this._min;
|
|
191
|
+
}
|
|
192
|
+
set min(value) {
|
|
193
|
+
this._min = this.getValidDate(this.dateTimeAdapter.deserialize(value));
|
|
194
|
+
this.validatorOnChange();
|
|
195
|
+
}
|
|
196
|
+
get max() {
|
|
197
|
+
return this._max;
|
|
198
|
+
}
|
|
199
|
+
set max(value) {
|
|
200
|
+
this._max = this.getValidDate(this.dateTimeAdapter.deserialize(value));
|
|
201
|
+
this.validatorOnChange();
|
|
202
|
+
}
|
|
203
|
+
get selectMode() {
|
|
204
|
+
return this._selectMode;
|
|
205
|
+
}
|
|
206
|
+
set selectMode(mode) {
|
|
207
|
+
if (mode !== 'single' &&
|
|
208
|
+
mode !== 'range' &&
|
|
209
|
+
mode !== 'rangeFrom' &&
|
|
210
|
+
mode !== 'rangeTo') {
|
|
211
|
+
throw Error('OwlDateTime Error: invalid selectMode value!');
|
|
212
|
+
}
|
|
213
|
+
this._selectMode = mode;
|
|
214
|
+
}
|
|
215
|
+
get value() {
|
|
216
|
+
return this._value;
|
|
217
|
+
}
|
|
218
|
+
set value(value) {
|
|
219
|
+
value = this.dateTimeAdapter.deserialize(value);
|
|
220
|
+
this.lastValueValid = !value || this.dateTimeAdapter.isValid(value);
|
|
221
|
+
value = this.getValidDate(value);
|
|
222
|
+
const oldDate = this._value;
|
|
223
|
+
this._value = value;
|
|
224
|
+
// set the input property 'value'
|
|
225
|
+
this.formatNativeInputValue();
|
|
226
|
+
// check if the input value changed
|
|
227
|
+
if (!this.dateTimeAdapter.isEqual(oldDate, value)) {
|
|
228
|
+
this.valueChange.emit(value);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
get values() {
|
|
232
|
+
return this._values;
|
|
233
|
+
}
|
|
234
|
+
set values(values) {
|
|
235
|
+
if (values && values.length > 0) {
|
|
236
|
+
this._values = values.map(v => {
|
|
237
|
+
v = this.dateTimeAdapter.deserialize(v);
|
|
238
|
+
return this.getValidDate(v);
|
|
239
|
+
});
|
|
240
|
+
this.lastValueValid =
|
|
241
|
+
(!this._values[0] ||
|
|
242
|
+
this.dateTimeAdapter.isValid(this._values[0])) &&
|
|
243
|
+
(!this._values[1] ||
|
|
244
|
+
this.dateTimeAdapter.isValid(this._values[1]));
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
this._values = [];
|
|
248
|
+
this.lastValueValid = true;
|
|
249
|
+
}
|
|
250
|
+
// set the input property 'value'
|
|
251
|
+
this.formatNativeInputValue();
|
|
252
|
+
this.valueChange.emit(this._values);
|
|
253
|
+
}
|
|
254
|
+
get elementRef() {
|
|
255
|
+
return this.elmRef;
|
|
256
|
+
}
|
|
257
|
+
get isInSingleMode() {
|
|
258
|
+
return this._selectMode === 'single';
|
|
259
|
+
}
|
|
260
|
+
get isInRangeMode() {
|
|
261
|
+
return (this._selectMode === 'range' ||
|
|
262
|
+
this._selectMode === 'rangeFrom' ||
|
|
263
|
+
this._selectMode === 'rangeTo');
|
|
264
|
+
}
|
|
265
|
+
get owlDateTimeInputAriaHaspopup() {
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
get owlDateTimeInputAriaOwns() {
|
|
269
|
+
return (this.dtPicker.opened && this.dtPicker.id) || null;
|
|
270
|
+
}
|
|
271
|
+
get minIso8601() {
|
|
272
|
+
return this.min ? this.dateTimeAdapter.toIso8601(this.min) : null;
|
|
273
|
+
}
|
|
274
|
+
get maxIso8601() {
|
|
275
|
+
return this.max ? this.dateTimeAdapter.toIso8601(this.max) : null;
|
|
276
|
+
}
|
|
277
|
+
get owlDateTimeInputDisabled() {
|
|
278
|
+
return this.disabled;
|
|
279
|
+
}
|
|
280
|
+
ngOnInit() {
|
|
281
|
+
if (!this.dtPicker) {
|
|
282
|
+
throw Error('OwlDateTimePicker: the picker input doesn\'t have any associated owl-date-time component');
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
ngAfterContentInit() {
|
|
286
|
+
this.dtPickerSub = this.dtPicker.confirmSelectedChange.subscribe((selecteds) => {
|
|
287
|
+
if (Array.isArray(selecteds)) {
|
|
288
|
+
this.values = selecteds;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
this.value = selecteds;
|
|
292
|
+
}
|
|
293
|
+
this.onModelChange(selecteds);
|
|
294
|
+
this.onModelTouched();
|
|
295
|
+
this.dateTimeChange.emit({
|
|
296
|
+
source: this,
|
|
297
|
+
value: selecteds,
|
|
298
|
+
input: this.elmRef.nativeElement
|
|
299
|
+
});
|
|
300
|
+
this.dateTimeInput.emit({
|
|
301
|
+
source: this,
|
|
302
|
+
value: selecteds,
|
|
303
|
+
input: this.elmRef.nativeElement
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
ngOnDestroy() {
|
|
308
|
+
this.dtPickerSub.unsubscribe();
|
|
309
|
+
this.localeSub.unsubscribe();
|
|
310
|
+
this.valueChange.complete();
|
|
311
|
+
this.disabledChange.complete();
|
|
312
|
+
}
|
|
313
|
+
writeValue(value) {
|
|
314
|
+
if (this.isInSingleMode) {
|
|
315
|
+
this.value = value;
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
this.values = value;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
registerOnChange(fn) {
|
|
322
|
+
this.onModelChange = fn;
|
|
323
|
+
}
|
|
324
|
+
registerOnTouched(fn) {
|
|
325
|
+
this.onModelTouched = fn;
|
|
326
|
+
}
|
|
327
|
+
setDisabledState(isDisabled) {
|
|
328
|
+
this.disabled = isDisabled;
|
|
329
|
+
}
|
|
330
|
+
validate(c) {
|
|
331
|
+
return this.validator ? this.validator(c) : null;
|
|
332
|
+
}
|
|
333
|
+
registerOnValidatorChange(fn) {
|
|
334
|
+
this.validatorOnChange = fn;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Open the picker when user hold alt + DOWN_ARROW
|
|
338
|
+
* */
|
|
339
|
+
handleKeydownOnHost(event) {
|
|
340
|
+
if (event.altKey && event.keyCode === DOWN_ARROW) {
|
|
341
|
+
this.dtPicker.open();
|
|
342
|
+
event.preventDefault();
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
handleBlurOnHost(_event) {
|
|
346
|
+
this.onModelTouched();
|
|
347
|
+
}
|
|
348
|
+
handleInputOnHost(event) {
|
|
349
|
+
const value = event.target.value;
|
|
350
|
+
if (this._selectMode === 'single') {
|
|
351
|
+
this.changeInputInSingleMode(value);
|
|
352
|
+
}
|
|
353
|
+
else if (this._selectMode === 'range') {
|
|
354
|
+
this.changeInputInRangeMode(value);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
this.changeInputInRangeFromToMode(value);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
handleChangeOnHost(_event) {
|
|
361
|
+
let v;
|
|
362
|
+
if (this.isInSingleMode) {
|
|
363
|
+
v = this.value;
|
|
364
|
+
}
|
|
365
|
+
else if (this.isInRangeMode) {
|
|
366
|
+
v = this.values;
|
|
367
|
+
}
|
|
368
|
+
this.dateTimeChange.emit({
|
|
369
|
+
source: this,
|
|
370
|
+
value: v,
|
|
371
|
+
input: this.elmRef.nativeElement
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Set the native input property 'value'
|
|
376
|
+
*/
|
|
377
|
+
formatNativeInputValue() {
|
|
378
|
+
if (this.isInSingleMode) {
|
|
379
|
+
this.renderer.setProperty(this.elmRef.nativeElement, 'value', this._value
|
|
380
|
+
? this.dateTimeAdapter.format(this._value, this.dtPicker.formatString)
|
|
381
|
+
: '');
|
|
382
|
+
}
|
|
383
|
+
else if (this.isInRangeMode) {
|
|
384
|
+
if (this._values && this.values.length > 0) {
|
|
385
|
+
const from = this._values[0];
|
|
386
|
+
const to = this._values[1];
|
|
387
|
+
const fromFormatted = from
|
|
388
|
+
? this.dateTimeAdapter.format(from, this.dtPicker.formatString)
|
|
389
|
+
: '';
|
|
390
|
+
const toFormatted = to
|
|
391
|
+
? this.dateTimeAdapter.format(to, this.dtPicker.formatString)
|
|
392
|
+
: '';
|
|
393
|
+
if (!fromFormatted && !toFormatted) {
|
|
394
|
+
this.renderer.setProperty(this.elmRef.nativeElement, 'value', null);
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
if (this._selectMode === 'range') {
|
|
398
|
+
this.renderer.setProperty(this.elmRef.nativeElement, 'value', fromFormatted +
|
|
399
|
+
' ' +
|
|
400
|
+
this.rangeSeparator +
|
|
401
|
+
' ' +
|
|
402
|
+
toFormatted);
|
|
403
|
+
}
|
|
404
|
+
else if (this._selectMode === 'rangeFrom') {
|
|
405
|
+
this.renderer.setProperty(this.elmRef.nativeElement, 'value', fromFormatted);
|
|
406
|
+
}
|
|
407
|
+
else if (this._selectMode === 'rangeTo') {
|
|
408
|
+
this.renderer.setProperty(this.elmRef.nativeElement, 'value', toFormatted);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
this.renderer.setProperty(this.elmRef.nativeElement, 'value', '');
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Register the relationship between this input and its picker component
|
|
420
|
+
*/
|
|
421
|
+
registerDateTimePicker(picker) {
|
|
422
|
+
if (picker) {
|
|
423
|
+
this.dtPicker = picker;
|
|
424
|
+
this.dtPicker.registerInput(this);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Convert a given obj to a valid date object
|
|
429
|
+
*/
|
|
430
|
+
getValidDate(obj) {
|
|
431
|
+
return this.dateTimeAdapter.isDateInstance(obj) &&
|
|
432
|
+
this.dateTimeAdapter.isValid(obj)
|
|
433
|
+
? obj
|
|
434
|
+
: null;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Convert a time string to a date-time string
|
|
438
|
+
* When pickerType is 'timer', the value in the picker's input is a time string.
|
|
439
|
+
* The dateTimeAdapter parse fn could not parse a time string to a Date Object.
|
|
440
|
+
* Therefore we need this fn to convert a time string to a date-time string.
|
|
441
|
+
*/
|
|
442
|
+
convertTimeStringToDateTimeString(timeString, dateTime) {
|
|
443
|
+
if (timeString) {
|
|
444
|
+
const v = dateTime || this.dateTimeAdapter.now();
|
|
445
|
+
const dateString = this.dateTimeAdapter.format(v, this.dateTimeFormats.datePickerInput);
|
|
446
|
+
return dateString + ' ' + timeString;
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
return null;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Handle input change in single mode
|
|
454
|
+
*/
|
|
455
|
+
changeInputInSingleMode(inputValue) {
|
|
456
|
+
let value = inputValue;
|
|
457
|
+
if (this.dtPicker.pickerType === 'timer') {
|
|
458
|
+
value = this.convertTimeStringToDateTimeString(value, this.value);
|
|
459
|
+
}
|
|
460
|
+
let result = this.dateTimeAdapter.parse(value, this.dateTimeFormats.parseInput);
|
|
461
|
+
this.lastValueValid = !result || this.dateTimeAdapter.isValid(result);
|
|
462
|
+
result = this.getValidDate(result);
|
|
463
|
+
// if the newValue is the same as the oldValue, we intend to not fire the valueChange event
|
|
464
|
+
// result equals to null means there is input event, but the input value is invalid
|
|
465
|
+
if (!this.isSameValue(result, this._value) || result === null) {
|
|
466
|
+
this._value = result;
|
|
467
|
+
this.valueChange.emit(result);
|
|
468
|
+
this.onModelChange(result);
|
|
469
|
+
this.dateTimeInput.emit({
|
|
470
|
+
source: this,
|
|
471
|
+
value: result,
|
|
472
|
+
input: this.elmRef.nativeElement
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Handle input change in rangeFrom or rangeTo mode
|
|
478
|
+
*/
|
|
479
|
+
changeInputInRangeFromToMode(inputValue) {
|
|
480
|
+
const originalValue = this._selectMode === 'rangeFrom'
|
|
481
|
+
? this._values[0]
|
|
482
|
+
: this._values[1];
|
|
483
|
+
if (this.dtPicker.pickerType === 'timer') {
|
|
484
|
+
inputValue = this.convertTimeStringToDateTimeString(inputValue, originalValue);
|
|
485
|
+
}
|
|
486
|
+
let result = this.dateTimeAdapter.parse(inputValue, this.dateTimeFormats.parseInput);
|
|
487
|
+
this.lastValueValid = !result || this.dateTimeAdapter.isValid(result);
|
|
488
|
+
result = this.getValidDate(result);
|
|
489
|
+
// if the newValue is the same as the oldValue, we intend to not fire the valueChange event
|
|
490
|
+
if ((this._selectMode === 'rangeFrom' &&
|
|
491
|
+
this.isSameValue(result, this._values[0]) &&
|
|
492
|
+
result) ||
|
|
493
|
+
(this._selectMode === 'rangeTo' &&
|
|
494
|
+
this.isSameValue(result, this._values[1]) &&
|
|
495
|
+
result)) {
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
this._values =
|
|
499
|
+
this._selectMode === 'rangeFrom'
|
|
500
|
+
? [result, this._values[1]]
|
|
501
|
+
: [this._values[0], result];
|
|
502
|
+
this.valueChange.emit(this._values);
|
|
503
|
+
this.onModelChange(this._values);
|
|
504
|
+
this.dateTimeInput.emit({
|
|
505
|
+
source: this,
|
|
506
|
+
value: this._values,
|
|
507
|
+
input: this.elmRef.nativeElement
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Handle input change in range mode
|
|
512
|
+
*/
|
|
513
|
+
changeInputInRangeMode(inputValue) {
|
|
514
|
+
const selecteds = inputValue.split(this.rangeSeparator);
|
|
515
|
+
let fromString = selecteds[0];
|
|
516
|
+
let toString = selecteds[1];
|
|
517
|
+
if (this.dtPicker.pickerType === 'timer') {
|
|
518
|
+
fromString = this.convertTimeStringToDateTimeString(fromString, this.values[0]);
|
|
519
|
+
toString = this.convertTimeStringToDateTimeString(toString, this.values[1]);
|
|
520
|
+
}
|
|
521
|
+
let from = this.dateTimeAdapter.parse(fromString, this.dateTimeFormats.parseInput);
|
|
522
|
+
let to = this.dateTimeAdapter.parse(toString, this.dateTimeFormats.parseInput);
|
|
523
|
+
this.lastValueValid =
|
|
524
|
+
(!from || this.dateTimeAdapter.isValid(from)) &&
|
|
525
|
+
(!to || this.dateTimeAdapter.isValid(to));
|
|
526
|
+
from = this.getValidDate(from);
|
|
527
|
+
to = this.getValidDate(to);
|
|
528
|
+
// if the newValue is the same as the oldValue, we intend to not fire the valueChange event
|
|
529
|
+
if (!this.isSameValue(from, this._values[0]) ||
|
|
530
|
+
!this.isSameValue(to, this._values[1]) ||
|
|
531
|
+
(from === null && to === null)) {
|
|
532
|
+
this._values = [from, to];
|
|
533
|
+
this.valueChange.emit(this._values);
|
|
534
|
+
this.onModelChange(this._values);
|
|
535
|
+
this.dateTimeInput.emit({
|
|
536
|
+
source: this,
|
|
537
|
+
value: this._values,
|
|
538
|
+
input: this.elmRef.nativeElement
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Check if the two value is the same
|
|
544
|
+
*/
|
|
545
|
+
isSameValue(first, second) {
|
|
546
|
+
if (first && second) {
|
|
547
|
+
return this.dateTimeAdapter.compare(first, second) === 0;
|
|
548
|
+
}
|
|
549
|
+
return first == second;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
OwlDateTimeInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OwlDateTimeInputDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.DateTimeAdapter, optional: true }, { token: OWL_DATE_TIME_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
553
|
+
OwlDateTimeInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.2", type: OwlDateTimeInputDirective, selector: "input[owlDateTime]", inputs: { owlDateTime: "owlDateTime", owlDateTimeFilter: "owlDateTimeFilter", _disabled: "_disabled", min: "min", max: "max", selectMode: "selectMode", rangeSeparator: "rangeSeparator", value: "value", values: "values" }, outputs: { dateTimeChange: "dateTimeChange", dateTimeInput: "dateTimeInput" }, host: { listeners: { "keydown": "handleKeydownOnHost($event)", "blur": "handleBlurOnHost($event)", "input": "handleInputOnHost($event)", "change": "handleChangeOnHost($event)" }, properties: { "attr.aria-haspopup": "this.owlDateTimeInputAriaHaspopup", "attr.aria-owns": "this.owlDateTimeInputAriaOwns", "attr.min": "this.minIso8601", "attr.max": "this.maxIso8601", "disabled": "this.owlDateTimeInputDisabled" } }, providers: [
|
|
554
|
+
OWL_DATETIME_VALUE_ACCESSOR,
|
|
555
|
+
OWL_DATETIME_VALIDATORS
|
|
556
|
+
], exportAs: ["owlDateTimeInput"], ngImport: i0 });
|
|
557
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OwlDateTimeInputDirective, decorators: [{
|
|
558
|
+
type: Directive,
|
|
559
|
+
args: [{
|
|
560
|
+
selector: 'input[owlDateTime]',
|
|
561
|
+
exportAs: 'owlDateTimeInput',
|
|
562
|
+
providers: [
|
|
563
|
+
OWL_DATETIME_VALUE_ACCESSOR,
|
|
564
|
+
OWL_DATETIME_VALIDATORS
|
|
565
|
+
]
|
|
566
|
+
}]
|
|
567
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.DateTimeAdapter, decorators: [{
|
|
568
|
+
type: Optional
|
|
569
|
+
}] }, { type: undefined, decorators: [{
|
|
570
|
+
type: Optional
|
|
571
|
+
}, {
|
|
572
|
+
type: Inject,
|
|
573
|
+
args: [OWL_DATE_TIME_FORMATS]
|
|
574
|
+
}] }]; }, propDecorators: { owlDateTime: [{
|
|
575
|
+
type: Input
|
|
576
|
+
}], owlDateTimeFilter: [{
|
|
577
|
+
type: Input
|
|
578
|
+
}], _disabled: [{
|
|
579
|
+
type: Input
|
|
580
|
+
}], min: [{
|
|
581
|
+
type: Input
|
|
582
|
+
}], max: [{
|
|
583
|
+
type: Input
|
|
584
|
+
}], selectMode: [{
|
|
585
|
+
type: Input
|
|
586
|
+
}], rangeSeparator: [{
|
|
587
|
+
type: Input
|
|
588
|
+
}], value: [{
|
|
589
|
+
type: Input
|
|
590
|
+
}], values: [{
|
|
591
|
+
type: Input
|
|
592
|
+
}], dateTimeChange: [{
|
|
593
|
+
type: Output
|
|
594
|
+
}], dateTimeInput: [{
|
|
595
|
+
type: Output
|
|
596
|
+
}], owlDateTimeInputAriaHaspopup: [{
|
|
597
|
+
type: HostBinding,
|
|
598
|
+
args: ['attr.aria-haspopup']
|
|
599
|
+
}], owlDateTimeInputAriaOwns: [{
|
|
600
|
+
type: HostBinding,
|
|
601
|
+
args: ['attr.aria-owns']
|
|
602
|
+
}], minIso8601: [{
|
|
603
|
+
type: HostBinding,
|
|
604
|
+
args: ['attr.min']
|
|
605
|
+
}], maxIso8601: [{
|
|
606
|
+
type: HostBinding,
|
|
607
|
+
args: ['attr.max']
|
|
608
|
+
}], owlDateTimeInputDisabled: [{
|
|
609
|
+
type: HostBinding,
|
|
610
|
+
args: ['disabled']
|
|
611
|
+
}], handleKeydownOnHost: [{
|
|
612
|
+
type: HostListener,
|
|
613
|
+
args: ['keydown', ['$event']]
|
|
614
|
+
}], handleBlurOnHost: [{
|
|
615
|
+
type: HostListener,
|
|
616
|
+
args: ['blur', ['$event']]
|
|
617
|
+
}], handleInputOnHost: [{
|
|
618
|
+
type: HostListener,
|
|
619
|
+
args: ['input', ['$event']]
|
|
620
|
+
}], handleChangeOnHost: [{
|
|
621
|
+
type: HostListener,
|
|
622
|
+
args: ['change', ['$event']]
|
|
623
|
+
}] } });
|
|
624
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtcGljay1kYXRldGltZS9zcmMvbGliL2RhdGUtdGltZS9kYXRlLXRpbWUtcGlja2VyLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDbEQsT0FBTyxFQUFvQixTQUFTLEVBQWMsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUE7QUFDM0wsT0FBTyxFQUF5QyxhQUFhLEVBQUUsaUJBQWlCLEVBQTRDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzlKLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFbkMsT0FBTyxFQUFzQixxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFBOzs7QUFJM0YsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQVE7SUFDNUMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUFDO0lBQ3hELEtBQUssRUFBRSxJQUFJO0NBQ2QsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFRO0lBQ3hDLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMseUJBQXlCLENBQUM7SUFDeEQsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFBO0FBVUQsTUFBTSxPQUFPLHlCQUF5QjtJQTRWbEMsWUFBb0IsTUFBa0IsRUFDMUIsUUFB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LFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbidcbmltcG9ydCB7IERPV05fQVJST1cgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnXG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJ1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IERhdGVUaW1lQWRhcHRlciB9IGZyb20gJy4uL2NsYXNzL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJ1xuaW1wb3J0IHsgT3dsRGF0ZVRpbWVGb3JtYXRzLCBPV0xfREFURV9USU1FX0ZPUk1BVFMgfSBmcm9tICcuLi9jbGFzcy9kYXRlLXRpbWUtZm9ybWF0LmNsYXNzJ1xuaW1wb3J0IHsgU2VsZWN0TW9kZSB9IGZyb20gJy4uL2NsYXNzL2RhdGUtdGltZS5jbGFzcydcbmltcG9ydCB7IE93bERhdGVUaW1lQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlLXRpbWUtcGlja2VyL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50J1xuXG5leHBvcnQgY29uc3QgT1dMX0RBVEVUSU1FX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gT3dsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZSksXG4gICAgbXVsdGk6IHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IE9XTF9EQVRFVElNRV9WQUxJREFUT1JTOiBhbnkgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPd2xEYXRlVGltZUlucHV0RGlyZWN0aXZlKSxcbiAgICBtdWx0aTogdHJ1ZVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2lucHV0W293bERhdGVUaW1lXScsXG4gICAgZXhwb3J0QXM6ICdvd2xEYXRlVGltZUlucHV0JyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgT1dMX0RBVEVUSU1FX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICBPV0xfREFURVRJTUVfVkFMSURBVE9SU1xuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgT3dsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZTxUPlxuICAgIGltcGxlbWVudHNcbiAgICBPbkluaXQsXG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgVmFsaWRhdG9yIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aW1lIHBpY2tlciB0aGF0IHRoaXMgaW5wdXQgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgICAqICovXG4gICAgQElucHV0KClcbiAgICBzZXQgb3dsRGF0ZVRpbWUodmFsdWU6IE93bERhdGVUaW1lQ29tcG9uZW50PFQ+KSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEYXRlVGltZVBpY2tlcih2YWx1ZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHRvIGZpbHRlciBkYXRlIHRpbWVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBvd2xEYXRlVGltZUZpbHRlcihmaWx0ZXI6IChkYXRlOiBUIHwgbnVsbCkgPT4gYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kYXRlVGltZUZpbHRlciA9IGZpbHRlclxuICAgICAgICB0aGlzLnZhbGlkYXRvck9uQ2hhbmdlKClcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kYXRlVGltZUZpbHRlcjogKGRhdGU6IFQgfCBudWxsKSA9PiBib29sZWFuXG4gICAgZ2V0IGRhdGVUaW1lRmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVRpbWVGaWx0ZXJcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciB0aGUgZGF0ZSB0aW1lIHBpY2tlcidzIGlucHV0IGlzIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW5cbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2Rpc2FibGVkXG4gICAgfVxuXG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudFxuXG4gICAgICAgIGlmICh0aGlzLl9kaXNhYmxlZCAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID0gbmV3VmFsdWVcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRDaGFuZ2UuZW1pdChuZXdWYWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbnVsbCBjaGVjayB0aGUgYGJsdXJgIG1ldGhvZCwgYmVjYXVzZSBpdCdzIHVuZGVmaW5lZCBkdXJpbmcgU1NSLlxuICAgICAgICBpZiAobmV3VmFsdWUgJiYgZWxlbWVudC5ibHVyKSB7XG4gICAgICAgICAgICAvLyBOb3JtYWxseSwgbmF0aXZlIGlucHV0IGVsZW1lbnRzIGF1dG9tYXRpY2FsbHkgYmx1ciBpZiB0aGV5IHR1cm4gZGlzYWJsZWQuIFRoaXMgYmVoYXZpb3JcbiAgICAgICAgICAgIC8vIGlzIHByb2JsZW1hdGljLCBiZWNhdXNlIGl0IHdvdWxkIG1lYW4gdGhhdCBpdCB0cmlnZ2VycyBhbm90aGVyIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUsXG4gICAgICAgICAgICAvLyB3aGljaCB0aGVuIGNhdXNlcyBhIGNoYW5nZWQgYWZ0ZXIgY2hlY2tlZCBlcnJvciBpZiB0aGUgaW5wdXQgZWxlbWVudCB3YXMgZm9jdXNlZCBiZWZvcmUuXG4gICAgICAgICAgICBlbGVtZW50LmJsdXIoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBtaW5pbXVtIHZhbGlkIGRhdGUuICovXG4gICAgcHJpdmF0ZSBfbWluOiBUIHwgbnVsbFxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1pbigpOiBUIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5cbiAgICB9XG5cbiAgICBzZXQgbWluKHZhbHVlOiBUIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9taW4gPSB0aGlzLmdldFZhbGlkRGF0ZSh0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpXG4gICAgICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UoKVxuICAgIH1cblxuICAgIC8qKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiAqL1xuICAgIHByaXZhdGUgX21heDogVCB8IG51bGxcbiAgICBASW5wdXQoKVxuICAgIGdldCBtYXgoKTogVCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4XG4gICAgfVxuXG4gICAgc2V0IG1heCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbWF4ID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKVxuICAgICAgICB0aGlzLnZhbGlkYXRvck9uQ2hhbmdlKClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGlja2VyJ3Mgc2VsZWN0IG1vZGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZWxlY3RNb2RlOiBTZWxlY3RNb2RlID0gJ3NpbmdsZSdcbiAgICBASW5wdXQoKVxuICAgIGdldCBzZWxlY3RNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZVxuICAgIH1cblxuICAgIHNldCBzZWxlY3RNb2RlKG1vZGU6IFNlbGVjdE1vZGUpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgbW9kZSAhPT0gJ3NpbmdsZScgJiZcbiAgICAgICAgICAgIG1vZGUgIT09ICdyYW5nZScgJiZcbiAgICAgICAgICAgIG1vZGUgIT09ICdyYW5nZUZyb20nICYmXG4gICAgICAgICAgICBtb2RlICE9PSAncmFuZ2VUbydcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignT3dsRGF0ZVRpbWUgRXJyb3I6IGludmFsaWQgc2VsZWN0TW9kZSB2YWx1ZSEnKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2VsZWN0TW9kZSA9IG1vZGVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2hhcmFjdGVyIHRvIHNlcGFyYXRlIHRoZSAnZnJvbScgYW5kICd0bycgaW4gaW5wdXQgdmFsdWVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHJhbmdlU2VwYXJhdG9yID0gJ34nXG5cbiAgICBwcml2YXRlIF92YWx1ZTogVCB8IG51bGxcbiAgICBASW5wdXQoKVxuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlXG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBUIHwgbnVsbCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxuICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID0gIXZhbHVlIHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodmFsdWUpXG4gICAgICAgIHZhbHVlID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpXG4gICAgICAgIGNvbnN0IG9sZERhdGUgPSB0aGlzLl92YWx1ZVxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlXG5cbiAgICAgICAgLy8gc2V0IHRoZSBpbnB1dCBwcm9wZXJ0eSAndmFsdWUnXG4gICAgICAgIHRoaXMuZm9ybWF0TmF0aXZlSW5wdXRWYWx1ZSgpXG5cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGlucHV0IHZhbHVlIGNoYW5nZWRcbiAgICAgICAgaWYgKCF0aGlzLmRhdGVUaW1lQWRhcHRlci5pc0VxdWFsKG9sZERhdGUsIHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmFsdWVzOiBUW10gPSBbXVxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1xuICAgIH1cblxuICAgIHNldCB2YWx1ZXModmFsdWVzOiBUW10pIHtcbiAgICAgICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzLm1hcCh2ID0+IHtcbiAgICAgICAgICAgICAgICB2ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWxpZERhdGUodilcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID1cbiAgICAgICAgICAgICAgICAoIXRoaXMuX3ZhbHVlc1swXSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuX3ZhbHVlc1swXSkpICYmXG4gICAgICAgICAgICAgICAgKCF0aGlzLl92YWx1ZXNbMV0gfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLl92YWx1ZXNbMV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW11cbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgdGhlIGlucHV0IHByb3BlcnR5ICd2YWx1ZSdcbiAgICAgICAgdGhpcy5mb3JtYXROYXRpdmVJbnB1dFZhbHVlKClcblxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWVzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGBjaGFuZ2VgIGV2ZW50IGlzIGZpcmVkIG9uIHRoaXMgYDxpbnB1dD5gXG4gICAgICogKi9cbiAgICBAT3V0cHV0KClcbiAgICBkYXRlVGltZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhbiBgaW5wdXRgIGV2ZW50IGlzIGZpcmVkIG9uIHRoaXMgYDxpbnB1dD5gLlxuICAgICAqICovXG4gICAgQE91dHB1dCgpXG4gICAgZGF0ZVRpbWVJbnB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG5cbiAgICBnZXQgZWxlbWVudFJlZigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxtUmVmXG4gICAgfVxuXG4gICAgZ2V0IGlzSW5TaW5nbGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZSdcbiAgICB9XG5cbiAgICBnZXQgaXNJblJhbmdlTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZScgfHxcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nIHx8XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VUbydcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKiBUaGUgZGF0ZS10aW1lLXBpY2tlciB0aGF0IHRoaXMgaW5wdXQgaXMgYXNzb2NpYXRlZCB3aXRoLiAqL1xuICAgIHB1YmxpYyBkdFBpY2tlcjogT3dsRGF0ZVRpbWVDb21wb25lbnQ8VD5cblxuICAgIHByaXZhdGUgZHRQaWNrZXJTdWI6IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWVxuICAgIHByaXZhdGUgbG9jYWxlU3ViOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFlcblxuICAgIHByaXZhdGUgbGFzdFZhbHVlVmFsaWQgPSB0cnVlXG5cbiAgICBwcml2YXRlIG9uTW9kZWxDaGFuZ2U6IChkYXRlOiBUIHwgVFtdKSA9PiB2b2lkID0gKCkgPT4geyB9XG4gICAgcHJpdmF0ZSBvbk1vZGVsVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHsgfVxuICAgIHByaXZhdGUgdmFsaWRhdG9yT25DaGFuZ2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH1cblxuICAgIC8qKiBUaGUgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3Igd2hldGhlciB0aGUgaW5wdXQgcGFyc2VzLiAqL1xuICAgIHByaXZhdGUgcGFyc2VWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHRoaXMubGFzdFZhbHVlVmFsaWRcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogeyBvd2xEYXRlVGltZVBhcnNlOiB7IHRleHQ6IHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgfSB9XG5cbiAgICAvKiogVGhlIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHRoZSBtaW4gZGF0ZS4gKi9cbiAgICBwcml2YXRlIG1pblZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoXG4gICAgICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxuICAgICk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMubWluIHx8XG4gICAgICAgICAgICAgICAgIWNvbnRyb2xWYWx1ZSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUodGhpcy5taW4sIGNvbnRyb2xWYWx1ZSkgPD0gMFxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogeyBvd2xEYXRlVGltZU1pbjogeyBtaW46IHRoaXMubWluLCBhY3R1YWw6IGNvbnRyb2xWYWx1ZSB9IH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUgJiYgY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbFZhbHVlRnJvbSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWVbMF0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBjb250cm9sVmFsdWVUbyA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWVbMV0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMubWluIHx8XG4gICAgICAgICAgICAgICAgIWNvbnRyb2xWYWx1ZUZyb20gfHxcbiAgICAgICAgICAgICAgICAhY29udHJvbFZhbHVlVG8gfHxcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKHRoaXMubWluLCBjb250cm9sVmFsdWVGcm9tKSA8PSAwXG4gICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIG93bERhdGVUaW1lTWluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW46IHRoaXMubWluLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBbY29udHJvbFZhbHVlRnJvbSwgY29udHJvbFZhbHVlVG9dXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHRoZSBtYXggZGF0ZS4gKi9cbiAgICBwcml2YXRlIG1heFZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoXG4gICAgICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxuICAgICk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMubWF4IHx8XG4gICAgICAgICAgICAgICAgIWNvbnRyb2xWYWx1ZSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUodGhpcy5tYXgsIGNvbnRyb2xWYWx1ZSkgPj0gMFxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogeyBvd2xEYXRlVGltZU1heDogeyBtYXg6IHRoaXMubWF4LCBhY3R1YWw6IGNvbnRyb2xWYWx1ZSB9IH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUgJiYgY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbFZhbHVlRnJvbSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWVbMF0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBjb250cm9sVmFsdWVUbyA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWVbMV0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMubWF4IHx8XG4gICAgICAgICAgICAgICAgIWNvbnRyb2xWYWx1ZUZyb20gfHxcbiAgICAgICAgICAgICAgICAhY29udHJvbFZhbHVlVG8gfHxcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKHRoaXMubWF4LCBjb250cm9sVmFsdWVUbykgPj0gMFxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBvd2xEYXRlVGltZU1heDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiB0aGlzLm1heCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogW2NvbnRyb2xWYWx1ZUZyb20sIGNvbnRyb2xWYWx1ZVRvXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGUgZGF0ZSBmaWx0ZXIuICovXG4gICAgcHJpdmF0ZSBmaWx0ZXJWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKFxuICAgICAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbiAgICApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUoY29udHJvbC52YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gIXRoaXMuX2RhdGVUaW1lRmlsdGVyIHx8XG4gICAgICAgICAgICAhY29udHJvbFZhbHVlIHx8XG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUZpbHRlcihjb250cm9sVmFsdWUpXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogeyBvd2xEYXRlVGltZUZpbHRlcjogdHJ1ZSB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHRoZSByYW5nZS5cbiAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSAnYmVmb3JlJyB2YWx1ZSBpcyBiZWZvcmUgdGhlICd0bycgdmFsdWVcbiAgICAgKiAqL1xuICAgIHByaXZhdGUgcmFuZ2VWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKFxuICAgICAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbiAgICApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlIHx8ICFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udHJvbFZhbHVlRnJvbSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUoY29udHJvbC52YWx1ZVswXSlcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBjb250cm9sVmFsdWVUbyA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUoY29udHJvbC52YWx1ZVsxXSlcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiAhY29udHJvbFZhbHVlRnJvbSB8fFxuICAgICAgICAgICAgIWNvbnRyb2xWYWx1ZVRvIHx8XG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKGNvbnRyb2xWYWx1ZUZyb20sIGNvbnRyb2xWYWx1ZVRvKSA8PSAwXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogeyBvd2xEYXRlVGltZVJhbmdlOiB0cnVlIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIGNvbWJpbmVkIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHRoaXMgaW5wdXQuICovXG4gICAgcHJpdmF0ZSB2YWxpZGF0b3I6IFZhbGlkYXRvckZuIHwgbnVsbCA9IFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgIHRoaXMucGFyc2VWYWxpZGF0b3IsXG4gICAgICAgIHRoaXMubWluVmFsaWRhdG9yLFxuICAgICAgICB0aGlzLm1heFZhbGlkYXRvcixcbiAgICAgICAgdGhpcy5maWx0ZXJWYWxpZGF0b3IsXG4gICAgICAgIHRoaXMucmFuZ2VWYWxpZGF0b3JcbiAgICBdKVxuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMgKGVpdGhlciBkdWUgdG8gdXNlciBpbnB1dCBvciBwcm9ncmFtbWF0aWMgY2hhbmdlKS4gKi9cbiAgICBwdWJsaWMgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXSB8IFQgfCBudWxsPigpXG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgZGlzYWJsZWQgc3RhdGUgaGFzIGNoYW5nZWQgKi9cbiAgICBwdWJsaWMgZGlzYWJsZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KClcblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhhc3BvcHVwJylcbiAgICBnZXQgb3dsRGF0ZVRpbWVJbnB1dEFyaWFIYXNwb3B1cCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1vd25zJylcbiAgICBnZXQgb3dsRGF0ZVRpbWVJbnB1dEFyaWFPd25zKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAodGhpcy5kdFBpY2tlci5vcGVuZWQgJiYgdGhpcy5kdFBpY2tlci5pZCkgfHwgbnVsbFxuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5taW4nKVxuICAgIGdldCBtaW5Jc284NjAxKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbiA/IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLm1pbikgOiBudWxsXG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLm1heCcpXG4gICAgZ2V0IG1heElzbzg2MDEoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4ID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIudG9Jc284NjAxKHRoaXMubWF4KSA6IG51bGxcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2Rpc2FibGVkJylcbiAgICBnZXQgb3dsRGF0ZVRpbWVJbnB1dERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxtUmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZGF0ZVRpbWVBZGFwdGVyOiBEYXRlVGltZUFkYXB0ZXI8VD4sXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoT1dMX0RBVEVfVElNRV9GT1JNQVRTKSBwcml2YXRlIGRhdGVUaW1lRm9ybWF0czogT3dsRGF0ZVRpbWVGb3JtYXRzKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXRlVGltZUFkYXB0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICdPd2xEYXRlVGltZVBpY2tlcjogTm8gcHJvdmlkZXIgZm91bmQgZm9yIERhdGVUaW1lUGlja2VyLiBZb3UgbXVzdCBpbXBvcnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgJyArXG4gICAgICAgICAgICAgICAgJ21vZHVsZXMgYXQgeW91ciBhcHBsaWNhdGlvbiByb290OiBPd2xOYXRpdmVEYXRlVGltZU1vZHVsZSwgT3dsTW9tZW50RGF0ZVRpbWVNb2R1bGUsIG9yIHByb3ZpZGUgYSAnICtcbiAgICAgICAgICAgICAgICAnY3VzdG9tIGltcGxlbWVudGF0aW9uLidcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5kYXRlVGltZUZvcm1hdHMpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICdPd2xEYXRlVGltZVBpY2tlcjogTm8gcHJvdmlkZXIgZm91bmQgZm9yIE9XTF9EQVRFX1RJTUVfRk9STUFUUy4gWW91IG11c3QgaW1wb3J0IG9uZSBvZiB0aGUgZm9sbG93aW5nICcgK1xuICAgICAgICAgICAgICAgICdtb2R1bGVzIGF0IHlvdXIgYXBwbGljYXRpb24gcm9vdDogT3dsTmF0aXZlRGF0ZVRpbWVNb2R1bGUsIE93bE1vbWVudERhdGVUaW1lTW9kdWxlLCBvciBwcm92aWRlIGEgJyArXG4gICAgICAgICAgICAgICAgJ2N1c3RvbSBpbXBsZW1lbnRhdGlvbi4nXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvY2FsZVN1YiA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmxvY2FsZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZHRQaWNrZXIpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICdPd2xEYXRlVGltZVBpY2tlcjogdGhlIHBpY2tlciBpbnB1dCBkb2VzblxcJ3QgaGF2ZSBhbnkgYXNzb2NpYXRlZCBvd2wtZGF0ZS10aW1lIGNvbXBvbmVudCdcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZHRQaWNrZXJTdWIgPSB0aGlzLmR0UGlja2VyLmNvbmZpcm1TZWxlY3RlZENoYW5nZS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoc2VsZWN0ZWRzOiBUW10gfCBUKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHNlbGVjdGVkc1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBzZWxlY3RlZHNcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2Uoc2VsZWN0ZWRzKVxuICAgICAgICAgICAgICAgIHRoaXMub25Nb2RlbFRvdWNoZWQoKVxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkcyxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVJbnB1dC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRzLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZHRQaWNrZXJTdWIudW5zdWJzY3JpYmUoKVxuICAgICAgICB0aGlzLmxvY2FsZVN1Yi51bnN1YnNjcmliZSgpXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuY29tcGxldGUoKVxuICAgICAgICB0aGlzLmRpc2FibGVkQ2hhbmdlLmNvbXBsZXRlKClcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlID0gZm5cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uTW9kZWxUb3VjaGVkID0gZm5cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkXG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlKGM6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0b3IgPyB0aGlzLnZhbGlkYXRvcihjKSA6IG51bGxcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbGlkYXRvck9uQ2hhbmdlID0gZm5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIHRoZSBwaWNrZXIgd2hlbiB1c2VyIGhvbGQgYWx0ICsgRE9XTl9BUlJPV1xuICAgICAqICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGhhbmRsZUtleWRvd25Pbkhvc3QoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiBldmVudC5rZXlDb2RlID09PSBET1dOX0FSUk9XKSB7XG4gICAgICAgICAgICB0aGlzLmR0UGlja2VyLm9wZW4oKVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGhhbmRsZUJsdXJPbkhvc3QoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uTW9kZWxUb3VjaGVkKClcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGhhbmRsZUlucHV0T25Ib3N0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdE1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZUlucHV0SW5TaW5nbGVNb2RlKHZhbHVlKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlSW5wdXRJblJhbmdlTW9kZSh2YWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlSW5wdXRJblJhbmdlRnJvbVRvTW9kZSh2YWx1ZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGhhbmRsZUNoYW5nZU9uSG9zdChfZXZlbnQ6IGFueSk6IHZvaWQge1xuXG4gICAgICAgIGxldCB2XG4gICAgICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlKSB7XG4gICAgICAgICAgICB2ID0gdGhpcy52YWx1ZVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJblJhbmdlTW9kZSkge1xuICAgICAgICAgICAgdiA9IHRoaXMudmFsdWVzXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGVUaW1lQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgICAgICBpbnB1dDogdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbmF0aXZlIGlucHV0IHByb3BlcnR5ICd2YWx1ZSdcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybWF0TmF0aXZlSW5wdXRWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICAgICAgdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR0UGlja2VyLmZvcm1hdFN0cmluZ1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZXMgJiYgdGhpcy52YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLl92YWx1ZXNbMF1cbiAgICAgICAgICAgICAgICBjb25zdCB0byA9IHRoaXMuX3ZhbHVlc1sxXVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUZvcm1hdHRlZCA9IGZyb21cbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdFBpY2tlci5mb3JtYXRTdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICAgICAgY29uc3QgdG9Gb3JtYXR0ZWQgPSB0b1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdFBpY2tlci5mb3JtYXRTdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6ICcnXG5cbiAgICAgICAgICAgICAgICBpZiAoIWZyb21Gb3JtYXR0ZWQgJiYgIXRvRm9ybWF0dGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRm9ybWF0dGVkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VTZXBhcmF0b3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Gb3JtYXR0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUZvcm1hdHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZVRvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Gb3JtYXR0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhpcyBpbnB1dCBhbmQgaXRzIHBpY2tlciBjb21wb25lbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZ2lzdGVyRGF0ZVRpbWVQaWNrZXIocGlja2VyOiBPd2xEYXRlVGltZUNvbXBvbmVudDxUPikge1xuICAgICAgICBpZiAocGlja2VyKSB7XG4gICAgICAgICAgICB0aGlzLmR0UGlja2VyID0gcGlja2VyXG4gICAgICAgICAgICB0aGlzLmR0UGlja2VyLnJlZ2lzdGVySW5wdXQodGhpcylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBnaXZlbiBvYmogdG8gYSB2YWxpZCBkYXRlIG9iamVjdFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0VmFsaWREYXRlKG9iajogYW55KTogVCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNEYXRlSW5zdGFuY2Uob2JqKSAmJlxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChvYmopXG4gICAgICAgICAgICA/IG9ialxuICAgICAgICAgICAgOiBudWxsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIHRpbWUgc3RyaW5nIHRvIGEgZGF0ZS10aW1lIHN0cmluZ1xuICAgICAqIFdoZW4gcGlja2VyVHlwZSBpcyAndGltZXInLCB0aGUgdmFsdWUgaW4gdGhlIHBpY2tlcidzIGlucHV0IGlzIGEgdGltZSBzdHJpbmcuXG4gICAgICogVGhlIGRhdGVUaW1lQWRhcHRlciBwYXJzZSBmbiBjb3VsZCBub3QgcGFyc2UgYSB0aW1lIHN0cmluZyB0byBhIERhdGUgT2JqZWN0LlxuICAgICAqIFRoZXJlZm9yZSB3ZSBuZWVkIHRoaXMgZm4gdG8gY29udmVydCBhIHRpbWUgc3RyaW5nIHRvIGEgZGF0ZS10aW1lIHN0cmluZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnZlcnRUaW1lU3RyaW5nVG9EYXRlVGltZVN0cmluZyhcbiAgICAgICAgdGltZVN0cmluZzogc3RyaW5nLFxuICAgICAgICBkYXRlVGltZTogVFxuICAgICk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodGltZVN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgdiA9IGRhdGVUaW1lIHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLm5vdygpXG4gICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KFxuICAgICAgICAgICAgICAgIHYsXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdHMuZGF0ZVBpY2tlcklucHV0XG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gZGF0ZVN0cmluZyArICcgJyArIHRpbWVTdHJpbmdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgaW5wdXQgY2hhbmdlIGluIHNpbmdsZSBtb2RlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjaGFuZ2VJbnB1dEluU2luZ2xlTW9kZShpbnB1dFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbGV0IHZhbHVlID0gaW5wdXRWYWx1ZVxuICAgICAgICBpZiAodGhpcy5kdFBpY2tlci5waWNrZXJUeXBlID09PSAndGltZXInKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY29udmVydFRpbWVTdHJpbmdUb0RhdGVUaW1lU3RyaW5nKHZhbHVlLCB0aGlzLnZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLnBhcnNlKFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0cy5wYXJzZUlucHV0XG4gICAgICAgIClcbiAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9ICFyZXN1bHQgfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChyZXN1bHQpXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0VmFsaWREYXRlKHJlc3VsdClcblxuICAgICAgICAvLyBpZiB0aGUgbmV3VmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZFZhbHVlLCB3ZSBpbnRlbmQgdG8gbm90IGZpcmUgdGhlIHZhbHVlQ2hhbmdlIGV2ZW50XG4gICAgICAgIC8vIHJlc3VsdCBlcXVhbHMgdG8gbnVsbCBtZWFucyB0aGVyZSBpcyBpbnB1dCBldmVudCwgYnV0IHRoZSBpbnB1dCB2YWx1ZSBpcyBpbnZhbGlkXG4gICAgICAgIGlmICghdGhpcy5pc1NhbWVWYWx1ZShyZXN1bHQsIHRoaXMuX3ZhbHVlKSB8fCByZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gcmVzdWx0XG4gICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQocmVzdWx0KVxuICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHJlc3VsdClcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVJbnB1dC5lbWl0KHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICBpbnB1dDogdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpbnB1dCBjaGFuZ2UgaW4gcmFuZ2VGcm9tIG9yIHJhbmdlVG8gbW9kZVxuICAgICAqL1xuICAgIHByaXZhdGUgY2hhbmdlSW5wdXRJblJhbmdlRnJvbVRvTW9kZShpbnB1dFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5fdmFsdWVzWzBdXG4gICAgICAgICAgICAgICAgOiB0aGlzLl92YWx1ZXNbMV1cblxuICAgICAgICBpZiAodGhpcy5kdFBpY2tlci5waWNrZXJUeXBlID09PSAndGltZXInKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5jb252ZXJ0VGltZVN0cmluZ1RvRGF0ZVRpbWVTdHJpbmcoXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbHVlXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIucGFyc2UoXG4gICAgICAgICAgICBpbnB1dFZhbHVlLFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdHMucGFyc2VJbnB1dFxuICAgICAgICApXG4gICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSAhcmVzdWx0IHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQocmVzdWx0KVxuICAgICAgICByZXN1bHQgPSB0aGlzLmdldFZhbGlkRGF0ZShyZXN1bHQpXG5cbiAgICAgICAgLy8gaWYgdGhlIG5ld1ZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGRWYWx1ZSwgd2UgaW50ZW5kIHRvIG5vdCBmaXJlIHRoZSB2YWx1ZUNoYW5nZSBldmVudFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2FtZVZhbHVlKHJlc3VsdCwgdGhpcy5fdmFsdWVzWzBdKSAmJlxuICAgICAgICAgICAgICAgIHJlc3VsdCkgfHxcbiAgICAgICAgICAgICh0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VUbycgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2FtZVZhbHVlKHJlc3VsdCwgdGhpcy5fdmFsdWVzWzFdKSAmJlxuICAgICAgICAgICAgICAgIHJlc3VsdClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJ1xuICAgICAgICAgICAgICAgID8gW3Jlc3VsdCwgdGhpcy5fdmFsdWVzWzFdXVxuICAgICAgICAgICAgICAgIDogW3RoaXMuX3ZhbHVlc1swXSwgcmVzdWx0XVxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWVzKVxuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5fdmFsdWVzKVxuICAgICAgICB0aGlzLmRhdGVUaW1lSW5wdXQuZW1pdCh7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fdmFsdWVzLFxuICAgICAgICAgICAgaW5wdXQ6IHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgaW5wdXQgY2hhbmdlIGluIHJhbmdlIG1vZGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNoYW5nZUlucHV0SW5SYW5nZU1vZGUoaW5wdXRWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkcyA9IGlucHV0VmFsdWUuc3BsaXQodGhpcy5yYW5nZVNlcGFyYXRvcilcbiAgICAgICAgbGV0IGZyb21TdHJpbmcgPSBzZWxlY3RlZHNbMF1cbiAgICAgICAgbGV0IHRvU3RyaW5nID0gc2VsZWN0ZWRzWzFdXG5cbiAgICAgICAgaWYgKHRoaXMuZHRQaWNrZXIucGlja2VyVHlwZSA9PT0gJ3RpbWVyJykge1xuICAgICAgICAgICAgZnJvbVN0cmluZyA9IHRoaXMuY29udmVydFRpbWVTdHJpbmdUb0RhdGVUaW1lU3RyaW5nKFxuICAgICAgICAgICAgICAgIGZyb21TdHJpbmcsXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNbMF1cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHRvU3RyaW5nID0gdGhpcy5jb252ZXJ0VGltZVN0cmluZ1RvRGF0ZVRpbWVTdHJpbmcoXG4gICAgICAgICAgICAgICAgdG9TdHJpbmcsXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNbMV1cbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmcm9tID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIucGFyc2UoXG4gICAgICAgICAgICBmcm9tU3RyaW5nLFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdHMucGFyc2VJbnB1dFxuICAgICAgICApXG4gICAgICAgIGxldCB0byA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLnBhcnNlKFxuICAgICAgICAgICAgdG9TdHJpbmcsXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0cy5wYXJzZUlucHV0XG4gICAgICAgIClcbiAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9XG4gICAgICAgICAgICAoIWZyb20gfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChmcm9tKSkgJiZcbiAgICAgICAgICAgICghdG8gfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0bykpXG4gICAgICAgIGZyb20gPSB0aGlzLmdldFZhbGlkRGF0ZShmcm9tKVxuICAgICAgICB0byA9IHRoaXMuZ2V0VmFsaWREYXRlKHRvKVxuXG4gICAgICAgIC8vIGlmIHRoZSBuZXdWYWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkVmFsdWUsIHdlIGludGVuZCB0byBub3QgZmlyZSB0aGUgdmFsdWVDaGFuZ2UgZXZlbnRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuaXNTYW1lVmFsdWUoZnJvbSwgdGhpcy5fdmFsdWVzWzBdKSB8fFxuICAgICAgICAgICAgIXRoaXMuaXNTYW1lVmFsdWUodG8sIHRoaXMuX3ZhbHVlc1sxXSkgfHxcbiAgICAgICAgICAgIChmcm9tID09PSBudWxsICYmIHRvID09PSBudWxsKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtmcm9tLCB0b11cbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZXMpXG4gICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5fdmFsdWVzKVxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0LmVtaXQoe1xuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5fdmFsdWVzLFxuICAgICAgICAgICAgICAgIGlucHV0OiB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHR3byB2YWx1ZSBpcyB0aGUgc2FtZVxuICAgICAqL1xuICAgIHByaXZhdGUgaXNTYW1lVmFsdWUoZmlyc3Q6IFQgfCBudWxsLCBzZWNvbmQ6IFQgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKGZpcnN0LCBzZWNvbmQpID09PSAwXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlyc3QgPT0gc2Vjb25kXG4gICAgfVxufVxuIl19
|