nxt-pick-datetime 18.0.0 → 19.0.4
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/fesm2022/nxt-pick-datetime-moment-adapter.mjs +23 -26
- package/fesm2022/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
- package/fesm2022/nxt-pick-datetime-native-adapter.mjs +22 -24
- package/fesm2022/nxt-pick-datetime-native-adapter.mjs.map +1 -1
- package/fesm2022/nxt-pick-datetime.mjs +76 -74
- package/fesm2022/nxt-pick-datetime.mjs.map +1 -1
- package/lib/class/date-time.class.d.ts +1 -1
- package/moment-adapter/moment-adapter.module.d.ts +2 -0
- package/moment-adapter/public-api.d.ts +1 -1
- package/native-adapter/native-adapter.module.d.ts +2 -0
- package/native-adapter/public-api.d.ts +1 -1
- package/package.json +9 -14
- package/esm2022/lib/class/date-time-adapter.class.mjs +0 -97
- package/esm2022/lib/class/date-time-format.class.mjs +0 -4
- package/esm2022/lib/class/date-time.class.mjs +0 -95
- package/esm2022/lib/class/dialog-config.class.mjs +0 -47
- package/esm2022/lib/class/dialog-ref.class.mjs +0 -119
- package/esm2022/lib/date-time/calendar/calendar.component.mjs +0 -346
- package/esm2022/lib/date-time/calendar-body/calendar-body.component.mjs +0 -151
- package/esm2022/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +0 -429
- package/esm2022/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -358
- package/esm2022/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +0 -362
- package/esm2022/lib/date-time/date-time-inline/date-time-inline.component.mjs +0 -275
- package/esm2022/lib/date-time/date-time-picker/date-time-picker.component.mjs +0 -541
- package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +0 -19
- package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +0 -389
- package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +0 -618
- package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +0 -61
- package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
- package/esm2022/lib/date-time/date-time.module.mjs +0 -96
- package/esm2022/lib/date-time/number-fixed-len.pipe.mjs +0 -22
- package/esm2022/lib/date-time/timer/timer.component.mjs +0 -299
- package/esm2022/lib/date-time/timer-box/timer-box.component.mjs +0 -95
- package/esm2022/lib/dialog/dialog-container/dialog-container.component.mjs +0 -248
- package/esm2022/lib/dialog/dialog.module.mjs +0 -42
- package/esm2022/lib/dialog/dialog.service.mjs +0 -251
- package/esm2022/lib/utils/object.mjs +0 -24
- package/esm2022/moment-adapter/date-time-adapter.class.mjs +0 -220
- package/esm2022/moment-adapter/date-time-format.class.mjs +0 -13
- package/esm2022/moment-adapter/moment-adapter.module.mjs +0 -37
- package/esm2022/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +0 -5
- package/esm2022/moment-adapter/public-api.mjs +0 -3
- package/esm2022/native-adapter/date-time-adapter.class.mjs +0 -366
- package/esm2022/native-adapter/date-time-format.class.mjs +0 -13
- package/esm2022/native-adapter/native-adapter.module.mjs +0 -37
- package/esm2022/native-adapter/nxt-pick-datetime-native-adapter.mjs +0 -5
- package/esm2022/native-adapter/public-api.mjs +0 -2
- package/esm2022/nxt-pick-datetime.mjs +0 -5
- package/esm2022/public-api.mjs +0 -14
package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs
DELETED
|
@@ -1,389 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, HostBinding, HostListener, ViewChild } from '@angular/core';
|
|
2
|
-
import { Subject } from 'rxjs';
|
|
3
|
-
import { CalendarComponent } from '../calendar/calendar.component';
|
|
4
|
-
import { TimerComponent } from '../timer/timer.component';
|
|
5
|
-
import { dateTimePickerAnimations } from './date-time-picker-container.animations';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "../date-time-picker-intl.service";
|
|
8
|
-
import * as i2 from "../../class/date-time-adapter.class";
|
|
9
|
-
import * as i3 from "@angular/common";
|
|
10
|
-
import * as i4 from "@angular/cdk/a11y";
|
|
11
|
-
import * as i5 from "../timer/timer.component";
|
|
12
|
-
import * as i6 from "../calendar/calendar.component";
|
|
13
|
-
/** @internal */
|
|
14
|
-
export class DateTimeContainerComponent {
|
|
15
|
-
get pickerMoment() {
|
|
16
|
-
return this._clamPickerMoment;
|
|
17
|
-
}
|
|
18
|
-
set pickerMoment(value) {
|
|
19
|
-
if (value) {
|
|
20
|
-
this._clamPickerMoment = this.dateTimeAdapter.clampDate(value, this.picker?.min, this.picker?.max);
|
|
21
|
-
}
|
|
22
|
-
this.cdRef.markForCheck();
|
|
23
|
-
}
|
|
24
|
-
get pickerType() {
|
|
25
|
-
return this.picker?.pickerType;
|
|
26
|
-
}
|
|
27
|
-
get cancelLabel() {
|
|
28
|
-
return this.pickerIntl.cancelBtnLabel;
|
|
29
|
-
}
|
|
30
|
-
get setLabel() {
|
|
31
|
-
return this.pickerIntl.setBtnLabel;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* The range 'from' label
|
|
35
|
-
*/
|
|
36
|
-
get fromLabel() {
|
|
37
|
-
return this.pickerIntl.rangeFromLabel;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* The range 'to' label
|
|
41
|
-
*/
|
|
42
|
-
get toLabel() {
|
|
43
|
-
return this.pickerIntl.rangeToLabel;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* The range 'from' formatted value
|
|
47
|
-
*/
|
|
48
|
-
get fromFormattedValue() {
|
|
49
|
-
const value = this.picker?.selecteds[0];
|
|
50
|
-
return value
|
|
51
|
-
? this.dateTimeAdapter.format(value, this.picker?.formatString)
|
|
52
|
-
: '';
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* The range 'to' formatted value
|
|
56
|
-
*/
|
|
57
|
-
get toFormattedValue() {
|
|
58
|
-
const value = this.picker?.selecteds[1];
|
|
59
|
-
return value
|
|
60
|
-
? this.dateTimeAdapter.format(value, this.picker?.formatString)
|
|
61
|
-
: '';
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Cases in which the control buttons show in the picker
|
|
65
|
-
* 1) picker mode is 'dialog'
|
|
66
|
-
* 2) picker type is NOT 'calendar' and the picker mode is NOT 'inline'
|
|
67
|
-
*/
|
|
68
|
-
get showControlButtons() {
|
|
69
|
-
return (this.picker?.pickerMode === 'dialog' ||
|
|
70
|
-
(this.picker?.pickerType !== 'calendar' &&
|
|
71
|
-
this.picker?.pickerMode !== 'inline'));
|
|
72
|
-
}
|
|
73
|
-
get containerElm() {
|
|
74
|
-
return this.elmRef.nativeElement;
|
|
75
|
-
}
|
|
76
|
-
/** @internal */
|
|
77
|
-
get containerClass() {
|
|
78
|
-
return true;
|
|
79
|
-
}
|
|
80
|
-
/** @internal */
|
|
81
|
-
get popupContainerClass() {
|
|
82
|
-
return this.picker?.pickerMode === 'popup';
|
|
83
|
-
}
|
|
84
|
-
/** @internal */
|
|
85
|
-
get dialogContainerClass() {
|
|
86
|
-
return this.picker?.pickerMode === 'dialog';
|
|
87
|
-
}
|
|
88
|
-
/** @internal */
|
|
89
|
-
get inlineContainerClass() {
|
|
90
|
-
return this.picker?.pickerMode === 'inline';
|
|
91
|
-
}
|
|
92
|
-
/** @internal */
|
|
93
|
-
get containerDisabledClass() {
|
|
94
|
-
return !!this.picker?.disabled;
|
|
95
|
-
}
|
|
96
|
-
/** @internal */
|
|
97
|
-
get containerId() {
|
|
98
|
-
return this.picker?.id;
|
|
99
|
-
}
|
|
100
|
-
/** @internal */
|
|
101
|
-
get containerAnimation() {
|
|
102
|
-
return this.picker?.pickerMode === 'inline' ? '' : 'enter';
|
|
103
|
-
}
|
|
104
|
-
constructor(cdRef, elmRef, pickerIntl, dateTimeAdapter) {
|
|
105
|
-
this.cdRef = cdRef;
|
|
106
|
-
this.elmRef = elmRef;
|
|
107
|
-
this.pickerIntl = pickerIntl;
|
|
108
|
-
this.dateTimeAdapter = dateTimeAdapter;
|
|
109
|
-
this.activeSelectedIndex = 0; // The current active SelectedIndex in range select mode (0: 'from', 1: 'to')
|
|
110
|
-
/**
|
|
111
|
-
* Stream emits when try to hide picker
|
|
112
|
-
*/
|
|
113
|
-
this.hidePicker$ = new Subject();
|
|
114
|
-
this.hidePickerStream = this.hidePicker$.asObservable();
|
|
115
|
-
/**
|
|
116
|
-
* Stream emits when try to confirm the selected value
|
|
117
|
-
*/
|
|
118
|
-
this.confirmSelected$ = new Subject();
|
|
119
|
-
this.confirmSelectedStream = this.confirmSelected$.asObservable();
|
|
120
|
-
this.pickerOpened$ = new Subject();
|
|
121
|
-
this.pickerOpenedStream = this.pickerOpened$.asObservable();
|
|
122
|
-
}
|
|
123
|
-
ngOnInit() { }
|
|
124
|
-
ngAfterContentInit() {
|
|
125
|
-
this.initPicker();
|
|
126
|
-
}
|
|
127
|
-
ngAfterViewInit() {
|
|
128
|
-
this.focusPicker();
|
|
129
|
-
}
|
|
130
|
-
handleContainerAnimationDone(event) {
|
|
131
|
-
const toState = event.toState;
|
|
132
|
-
if (toState === 'enter') {
|
|
133
|
-
this.pickerOpened$.next();
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
dateSelected(date) {
|
|
137
|
-
let result;
|
|
138
|
-
if (this.picker?.isInSingleMode) {
|
|
139
|
-
result = this.dateSelectedInSingleMode(date);
|
|
140
|
-
if (result) {
|
|
141
|
-
this.pickerMoment = result;
|
|
142
|
-
this.picker.select(result);
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
// we close the picker when result is undefined and pickerType is calendar.
|
|
146
|
-
if (this.pickerType === 'calendar') {
|
|
147
|
-
this.hidePicker$.next();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
if (this.picker?.isInRangeMode) {
|
|
153
|
-
result = this.dateSelectedInRangeMode(date);
|
|
154
|
-
if (result) {
|
|
155
|
-
this.pickerMoment = result[this.activeSelectedIndex];
|
|
156
|
-
this.picker.select(result);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
timeSelected(time) {
|
|
161
|
-
this.pickerMoment = this.dateTimeAdapter.clone(time);
|
|
162
|
-
if (!this.picker?.dateTimeChecker(this.pickerMoment)) {
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
if (this.picker.isInSingleMode) {
|
|
166
|
-
this.picker.select(this.pickerMoment);
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
if (this.picker.isInRangeMode) {
|
|
170
|
-
const selecteds = [...this.picker?.selecteds || []];
|
|
171
|
-
// check if the 'from' is after 'to' or 'to'is before 'from'
|
|
172
|
-
// In this case, we set both the 'from' and 'to' the same value
|
|
173
|
-
if ((this.activeSelectedIndex === 0 &&
|
|
174
|
-
selecteds[1] &&
|
|
175
|
-
this.dateTimeAdapter.compare(this.pickerMoment, selecteds[1]) === 1) ||
|
|
176
|
-
(this.activeSelectedIndex === 1 &&
|
|
177
|
-
selecteds[0] &&
|
|
178
|
-
this.dateTimeAdapter.compare(this.pickerMoment, selecteds[0]) === -1)) {
|
|
179
|
-
selecteds[0] = this.pickerMoment;
|
|
180
|
-
selecteds[1] = this.pickerMoment;
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
selecteds[this.activeSelectedIndex] = this.pickerMoment;
|
|
184
|
-
}
|
|
185
|
-
this.picker.select(selecteds);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Handle click on cancel button
|
|
190
|
-
*/
|
|
191
|
-
onCancelClicked(event) {
|
|
192
|
-
this.hidePicker$.next();
|
|
193
|
-
event.preventDefault();
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Handle click on set button
|
|
198
|
-
*/
|
|
199
|
-
onSetClicked(event) {
|
|
200
|
-
if (!this.picker?.dateTimeChecker?.(this.pickerMoment)) {
|
|
201
|
-
this.hidePicker$.next();
|
|
202
|
-
event.preventDefault();
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
this.confirmSelected$.next(event);
|
|
206
|
-
event.preventDefault();
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Handle click on inform radio group
|
|
211
|
-
*/
|
|
212
|
-
handleClickOnInfoGroup(event, index) {
|
|
213
|
-
this.setActiveSelectedIndex(index);
|
|
214
|
-
event.preventDefault();
|
|
215
|
-
event.stopPropagation();
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Handle click on inform radio group
|
|
219
|
-
*/
|
|
220
|
-
handleKeydownOnInfoGroup(event, next, index) {
|
|
221
|
-
switch (event.keyCode) {
|
|
222
|
-
case 'ArrowDown':
|
|
223
|
-
case 'ArrowRight':
|
|
224
|
-
case 'ArrowUp':
|
|
225
|
-
case 'ArrowLeft':
|
|
226
|
-
next.focus();
|
|
227
|
-
this.setActiveSelectedIndex(index === 0 ? 1 : 0);
|
|
228
|
-
event.preventDefault();
|
|
229
|
-
event.stopPropagation();
|
|
230
|
-
break;
|
|
231
|
-
case 'Space':
|
|
232
|
-
this.setActiveSelectedIndex(index);
|
|
233
|
-
event.preventDefault();
|
|
234
|
-
event.stopPropagation();
|
|
235
|
-
break;
|
|
236
|
-
default:
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Set the value of activeSelectedIndex
|
|
242
|
-
*/
|
|
243
|
-
setActiveSelectedIndex(index) {
|
|
244
|
-
if (this.picker?.selectMode === 'range' &&
|
|
245
|
-
this.activeSelectedIndex !== index) {
|
|
246
|
-
this.activeSelectedIndex = index;
|
|
247
|
-
const selected = this.picker?.selecteds[this.activeSelectedIndex];
|
|
248
|
-
if (this.picker.selecteds && selected) {
|
|
249
|
-
this.pickerMoment = this.dateTimeAdapter.clone(selected);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
initPicker() {
|
|
255
|
-
this.pickerMoment = this.picker?.startAt || this.dateTimeAdapter.now();
|
|
256
|
-
this.activeSelectedIndex = this.picker?.selectMode === 'rangeTo' ? 1 : 0;
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Select calendar date in single mode,
|
|
260
|
-
* it returns undefined when date is not selected.
|
|
261
|
-
*/
|
|
262
|
-
dateSelectedInSingleMode(date) {
|
|
263
|
-
if (this.dateTimeAdapter.isSameDay(date, this.picker?.selected)) {
|
|
264
|
-
return undefined;
|
|
265
|
-
}
|
|
266
|
-
return this.updateAndCheckCalendarDate(date);
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Select dates in range Mode
|
|
270
|
-
*/
|
|
271
|
-
dateSelectedInRangeMode(date) {
|
|
272
|
-
let from = this.picker?.selecteds[0];
|
|
273
|
-
let to = this.picker?.selecteds[1];
|
|
274
|
-
const result = this.updateAndCheckCalendarDate(date);
|
|
275
|
-
if (!result) {
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
278
|
-
// if the given calendar day is after or equal to 'from',
|
|
279
|
-
// set ths given date as 'to'
|
|
280
|
-
// otherwise, set it as 'from' and set 'to' to undefined
|
|
281
|
-
if (this.picker?.selectMode === 'range') {
|
|
282
|
-
if (this.picker.selecteds &&
|
|
283
|
-
this.picker.selecteds.length &&
|
|
284
|
-
!to &&
|
|
285
|
-
from &&
|
|
286
|
-
(this.dateTimeAdapter.differenceInCalendarDays(result, from) ?? 0) >= 0) {
|
|
287
|
-
to = result;
|
|
288
|
-
this.activeSelectedIndex = 1;
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
from = result;
|
|
292
|
-
to = undefined;
|
|
293
|
-
this.activeSelectedIndex = 0;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
else if (this.picker?.selectMode === 'rangeFrom') {
|
|
297
|
-
from = result;
|
|
298
|
-
// if the from value is after the to value, set the to value as undefined
|
|
299
|
-
if (to && this.dateTimeAdapter.compare(from, to) > 0) {
|
|
300
|
-
to = undefined;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
else if (this.picker?.selectMode === 'rangeTo') {
|
|
304
|
-
to = result;
|
|
305
|
-
// if the from value is after the to value, set the from value as undefined
|
|
306
|
-
if (from && this.dateTimeAdapter.compare(from, to) > 0) {
|
|
307
|
-
from = undefined;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
return [from, to];
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Update the given calendar date's time and check if it is valid
|
|
314
|
-
* Because the calendar date has 00:00:00 as default time, if the picker type is 'both',
|
|
315
|
-
* we need to update the given calendar date's time before selecting it.
|
|
316
|
-
* if it is valid, return the updated dateTime
|
|
317
|
-
* if it is not valid, return undefined
|
|
318
|
-
*/
|
|
319
|
-
updateAndCheckCalendarDate(date) {
|
|
320
|
-
let result;
|
|
321
|
-
// if the picker is 'both', update the calendar date's time value
|
|
322
|
-
if (this.picker?.pickerType === 'both') {
|
|
323
|
-
result = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(date), this.dateTimeAdapter.getMonth(date), this.dateTimeAdapter.getDate(date), this.dateTimeAdapter.getHours(this.pickerMoment), this.dateTimeAdapter.getMinutes(this.pickerMoment), this.dateTimeAdapter.getSeconds(this.pickerMoment));
|
|
324
|
-
result = this.dateTimeAdapter.clampDate(result, this.picker.min, this.picker.max);
|
|
325
|
-
}
|
|
326
|
-
else {
|
|
327
|
-
result = this.dateTimeAdapter.clone(date);
|
|
328
|
-
}
|
|
329
|
-
// check the updated dateTime
|
|
330
|
-
return this.picker?.dateTimeChecker(result) ? result : undefined;
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Focus to the picker
|
|
334
|
-
*/
|
|
335
|
-
focusPicker() {
|
|
336
|
-
if (this.picker?.pickerMode === 'inline') {
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
if (this.calendar) {
|
|
340
|
-
this.calendar.focusActiveCell();
|
|
341
|
-
}
|
|
342
|
-
else if (this.timer) {
|
|
343
|
-
this.timer.focus();
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DateTimeContainerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.DateTimeIntl }, { token: i2.DateTimeAdapter }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
347
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: DateTimeContainerComponent, selector: "nxt-date-time-container", host: { listeners: { "@transformPicker.done": "handleContainerAnimationDone($event)" }, properties: { "class.nxt-dt-container": "this.containerClass", "class.nxt-dt-popup-container": "this.popupContainerClass", "class.nxt-dt-dialog-container": "this.dialogContainerClass", "class.nxt-dt-inline-container": "this.inlineContainerClass", "class.nxt-dt-container-disabled": "this.containerDisabledClass", "attr.id": "this.containerId", "@transformPicker": "this.containerAnimation" } }, viewQueries: [{ propertyName: "calendar", first: true, predicate: CalendarComponent, descendants: true }, { propertyName: "timer", first: true, predicate: TimerComponent, descendants: true }], ngImport: i0, template: "<div [cdkTrapFocus]=\"picker?.pickerMode !== 'inline'\"\r\n [@fadeInPicker]=\"picker?.pickerMode === 'inline'? '' : 'enter'\"\r\n class=\"nxt-dt-container-inner\">\r\n\r\n <nxt-date-time-calendar *ngIf=\"pickerType === 'both' || pickerType === 'calendar'\"\r\n class=\"nxt-dt-container-row\"\r\n [firstDayOfWeek]=\"picker?.firstDayOfWeek ?? 0\"\r\n [(pickerMoment)]=\"pickerMoment\"\r\n [selected]=\"picker?.selected\"\r\n [selecteds]=\"picker?.selecteds ?? []\"\r\n [selectMode]=\"picker?.selectMode\"\r\n [min]=\"picker?.min\"\r\n [max]=\"picker?.max\"\r\n [dateTimeFilter]=\"picker?.dateTimeFilter\"\r\n [startView]=\"picker?.startView ?? 'month'\"\r\n [hideOtherMonths]=\"!!picker?.hideOtherMonths\"\r\n (yearSelected)=\"picker?.selectYear($event)\"\r\n (monthSelected)=\"picker?.selectMonth($event)\"\r\n (selectedChange)=\"dateSelected($event)\"></nxt-date-time-calendar>\r\n\r\n <nxt-date-time-timer *ngIf=\"pickerType === 'both' || pickerType === 'timer'\"\r\n class=\"nxt-dt-container-row\"\r\n [pickerMoment]=\"pickerMoment\"\r\n [min]=\"picker?.min\"\r\n [max]=\"picker?.max\"\r\n [showSecondsTimer]=\"!!picker?.showSecondsTimer\"\r\n [hour12Timer]=\"!!picker?.hour12Timer\"\r\n [stepHour]=\"picker?.stepHour ?? 1\"\r\n [stepMinute]=\"picker?.stepMinute ?? 1\"\r\n [stepSecond]=\"picker?.stepSecond ?? 1\"\r\n (selectedChange)=\"timeSelected($event)\"></nxt-date-time-timer>\r\n\r\n <div *ngIf=\"picker?.isInRangeMode\"\r\n role=\"radiogroup\"\r\n class=\"nxt-dt-container-info nxt-dt-container-row\">\r\n <div role=\"radio\"\r\n [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\r\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\r\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-from\"\r\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 0}\"\r\n (click)=\"handleClickOnInfoGroup($event, 0)\"\r\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\"\r\n #from>\r\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\r\n tabindex=\"-1\">\r\n <span class=\"nxt-dt-container-info-label\">{{fromLabel}}:</span>\r\n <span class=\"nxt-dt-container-info-value\">{{fromFormattedValue}}</span>\r\n </span>\r\n </div>\r\n <div role=\"radio\"\r\n [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\r\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\r\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-to\"\r\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 1}\"\r\n (click)=\"handleClickOnInfoGroup($event, 1)\"\r\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\"\r\n #to>\r\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\r\n tabindex=\"-1\">\r\n <span class=\"nxt-dt-container-info-label\">{{toLabel}}:</span>\r\n <span class=\"nxt-dt-container-info-value\">{{toFormattedValue}}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showControlButtons\"\r\n class=\"nxt-dt-container-buttons nxt-dt-container-row\">\r\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\r\n type=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"onCancelClicked($event)\">\r\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n {{cancelLabel}}\r\n </span>\r\n </button>\r\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\r\n type=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"onSetClicked($event)\">\r\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n {{setLabel}}\r\n </span>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i5.TimerComponent, selector: "nxt-date-time-timer", inputs: ["pickerMoment", "min", "max", "showSecondsTimer", "hour12Timer", "stepHour", "stepMinute", "stepSecond"], outputs: ["selectedChange"] }, { kind: "component", type: i6.CalendarComponent, selector: "nxt-date-time-calendar", inputs: ["dateTimeFilter", "firstDayOfWeek", "min", "max", "pickerMoment", "selectMode", "selected", "selecteds", "startView", "hideOtherMonths"], outputs: ["pickerMomentChange", "selectedChange", "userSelection", "yearSelected", "monthSelected"] }], animations: [
|
|
348
|
-
dateTimePickerAnimations.transformPicker,
|
|
349
|
-
dateTimePickerAnimations.fadeInPicker
|
|
350
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
351
|
-
}
|
|
352
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DateTimeContainerComponent, decorators: [{
|
|
353
|
-
type: Component,
|
|
354
|
-
args: [{ selector: 'nxt-date-time-container', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, animations: [
|
|
355
|
-
dateTimePickerAnimations.transformPicker,
|
|
356
|
-
dateTimePickerAnimations.fadeInPicker
|
|
357
|
-
], template: "<div [cdkTrapFocus]=\"picker?.pickerMode !== 'inline'\"\r\n [@fadeInPicker]=\"picker?.pickerMode === 'inline'? '' : 'enter'\"\r\n class=\"nxt-dt-container-inner\">\r\n\r\n <nxt-date-time-calendar *ngIf=\"pickerType === 'both' || pickerType === 'calendar'\"\r\n class=\"nxt-dt-container-row\"\r\n [firstDayOfWeek]=\"picker?.firstDayOfWeek ?? 0\"\r\n [(pickerMoment)]=\"pickerMoment\"\r\n [selected]=\"picker?.selected\"\r\n [selecteds]=\"picker?.selecteds ?? []\"\r\n [selectMode]=\"picker?.selectMode\"\r\n [min]=\"picker?.min\"\r\n [max]=\"picker?.max\"\r\n [dateTimeFilter]=\"picker?.dateTimeFilter\"\r\n [startView]=\"picker?.startView ?? 'month'\"\r\n [hideOtherMonths]=\"!!picker?.hideOtherMonths\"\r\n (yearSelected)=\"picker?.selectYear($event)\"\r\n (monthSelected)=\"picker?.selectMonth($event)\"\r\n (selectedChange)=\"dateSelected($event)\"></nxt-date-time-calendar>\r\n\r\n <nxt-date-time-timer *ngIf=\"pickerType === 'both' || pickerType === 'timer'\"\r\n class=\"nxt-dt-container-row\"\r\n [pickerMoment]=\"pickerMoment\"\r\n [min]=\"picker?.min\"\r\n [max]=\"picker?.max\"\r\n [showSecondsTimer]=\"!!picker?.showSecondsTimer\"\r\n [hour12Timer]=\"!!picker?.hour12Timer\"\r\n [stepHour]=\"picker?.stepHour ?? 1\"\r\n [stepMinute]=\"picker?.stepMinute ?? 1\"\r\n [stepSecond]=\"picker?.stepSecond ?? 1\"\r\n (selectedChange)=\"timeSelected($event)\"></nxt-date-time-timer>\r\n\r\n <div *ngIf=\"picker?.isInRangeMode\"\r\n role=\"radiogroup\"\r\n class=\"nxt-dt-container-info nxt-dt-container-row\">\r\n <div role=\"radio\"\r\n [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\r\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\r\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-from\"\r\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 0}\"\r\n (click)=\"handleClickOnInfoGroup($event, 0)\"\r\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\"\r\n #from>\r\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\r\n tabindex=\"-1\">\r\n <span class=\"nxt-dt-container-info-label\">{{fromLabel}}:</span>\r\n <span class=\"nxt-dt-container-info-value\">{{fromFormattedValue}}</span>\r\n </span>\r\n </div>\r\n <div role=\"radio\"\r\n [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\r\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\r\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-to\"\r\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 1}\"\r\n (click)=\"handleClickOnInfoGroup($event, 1)\"\r\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\"\r\n #to>\r\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\r\n tabindex=\"-1\">\r\n <span class=\"nxt-dt-container-info-label\">{{toLabel}}:</span>\r\n <span class=\"nxt-dt-container-info-value\">{{toFormattedValue}}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showControlButtons\"\r\n class=\"nxt-dt-container-buttons nxt-dt-container-row\">\r\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\r\n type=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"onCancelClicked($event)\">\r\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n {{cancelLabel}}\r\n </span>\r\n </button>\r\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\r\n type=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"onSetClicked($event)\">\r\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n {{setLabel}}\r\n </span>\r\n </button>\r\n </div>\r\n</div>\r\n" }]
|
|
358
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.DateTimeIntl }, { type: i2.DateTimeAdapter }], propDecorators: { calendar: [{
|
|
359
|
-
type: ViewChild,
|
|
360
|
-
args: [CalendarComponent]
|
|
361
|
-
}], timer: [{
|
|
362
|
-
type: ViewChild,
|
|
363
|
-
args: [TimerComponent]
|
|
364
|
-
}], containerClass: [{
|
|
365
|
-
type: HostBinding,
|
|
366
|
-
args: ['class.nxt-dt-container']
|
|
367
|
-
}], popupContainerClass: [{
|
|
368
|
-
type: HostBinding,
|
|
369
|
-
args: ['class.nxt-dt-popup-container']
|
|
370
|
-
}], dialogContainerClass: [{
|
|
371
|
-
type: HostBinding,
|
|
372
|
-
args: ['class.nxt-dt-dialog-container']
|
|
373
|
-
}], inlineContainerClass: [{
|
|
374
|
-
type: HostBinding,
|
|
375
|
-
args: ['class.nxt-dt-inline-container']
|
|
376
|
-
}], containerDisabledClass: [{
|
|
377
|
-
type: HostBinding,
|
|
378
|
-
args: ['class.nxt-dt-container-disabled']
|
|
379
|
-
}], containerId: [{
|
|
380
|
-
type: HostBinding,
|
|
381
|
-
args: ['attr.id']
|
|
382
|
-
}], containerAnimation: [{
|
|
383
|
-
type: HostBinding,
|
|
384
|
-
args: ['@transformPicker']
|
|
385
|
-
}], handleContainerAnimationDone: [{
|
|
386
|
-
type: HostListener,
|
|
387
|
-
args: ['@transformPicker.done', ['$event']]
|
|
388
|
-
}] } });
|
|
389
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcGljay1kYXRldGltZS9zcmMvbGliL2RhdGUtdGltZS9kYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci9kYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBbUMsdUJBQXVCLEVBQXFCLFNBQVMsRUFBYyxXQUFXLEVBQUUsWUFBWSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNoTCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRzlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBRWxFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQTs7Ozs7Ozs7QUFFbEYsZ0JBQWdCO0FBWWhCLE1BQU0sT0FBTywwQkFBMEI7SUFtQ25DLElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFBO0lBQ2pDLENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFvQjtRQUNqQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUNuRCxLQUFLLEVBQ0wsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQ2hCLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUNuQixDQUFBO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDN0IsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUE7SUFDbEMsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUE7SUFDekMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUE7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFBO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksa0JBQWtCO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLE9BQU8sS0FBSztZQUNSLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7WUFDL0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksZ0JBQWdCO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLE9BQU8sS0FBSztZQUNSLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7WUFDL0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNaLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxrQkFBa0I7UUFDbEIsT0FBTyxDQUNILElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLFFBQVE7WUFDcEMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxVQUFVO2dCQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FDNUMsQ0FBQTtJQUNMLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFBO0lBQ3BDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFDSSxjQUFjO1FBQ2QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLElBQ0ksbUJBQW1CO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssT0FBTyxDQUFBO0lBQzlDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFDSSxvQkFBb0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxRQUFRLENBQUE7SUFDL0MsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUNJLG9CQUFvQjtRQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLFFBQVEsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLElBQ0ksc0JBQXNCO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFBO0lBQ2xDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFDSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLElBQ0ksa0JBQWtCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtJQUM5RCxDQUFDO0lBRUQsWUFDcUIsS0FBd0IsRUFDeEIsTUFBK0IsRUFDL0IsVUFBd0IsRUFDeEIsZUFBbUM7UUFIbkMsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBeUI7UUFDL0IsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBb0I7UUF0SnhELHdCQUFtQixHQUFHLENBQUMsQ0FBQSxDQUFDLDZFQUE2RTtRQUVyRzs7V0FFRztRQUNjLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQTtRQUV6QyxxQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFBO1FBRTNEOztXQUVHO1FBQ2MscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQVMsQ0FBQTtRQUUvQywwQkFBcUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUE7UUFFcEQsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO1FBRTNDLHVCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUE7SUFxSTNELENBQUM7SUFFTCxRQUFRLEtBQUssQ0FBQztJQUVkLGtCQUFrQjtRQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUN0QixDQUFDO0lBR0QsNEJBQTRCLENBQUMsS0FBcUI7UUFDOUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQTtRQUM3QixJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQzdCLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQVE7UUFDakIsSUFBSSxNQUFNLENBQUE7UUFFVixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDOUIsTUFBTSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUM1QyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFBO2dCQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM5QixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osMkVBQTJFO2dCQUMzRSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUE7Z0JBQzNCLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTTtRQUNWLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDN0IsTUFBTSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMzQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2dCQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM5QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBUTtRQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXBELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFNO1FBQ1YsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDckMsT0FBTTtRQUNWLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDNUIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBRW5ELDREQUE0RDtZQUM1RCwrREFBK0Q7WUFDL0QsSUFDSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxDQUFDO2dCQUMzQixTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUN4QixJQUFJLENBQUMsWUFBWSxFQUNqQixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2YsS0FBSyxDQUFDLENBQUM7Z0JBQ1osQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQztvQkFDM0IsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDWixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FDeEIsSUFBSSxDQUFDLFlBQVksRUFDakIsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNmLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDZixDQUFDO2dCQUNDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFBO2dCQUNoQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQTtZQUNwQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7WUFDM0QsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2pDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsS0FBWTtRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3ZCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN0QixPQUFNO0lBQ1YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLEtBQVk7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUN2QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7WUFDdEIsT0FBTTtRQUNWLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2pDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN0QixPQUFNO0lBQ1YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsc0JBQXNCLENBQUMsS0FBVSxFQUFFLEtBQWE7UUFDNUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2xDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN0QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUE7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsd0JBQXdCLENBQ3BCLEtBQVUsRUFDVixJQUFTLEVBQ1QsS0FBYTtRQUViLFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLEtBQUssV0FBVyxDQUFDO1lBQ2pCLEtBQUssWUFBWSxDQUFDO1lBQ2xCLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxXQUFXO2dCQUNaLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtnQkFDWixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDaEQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFBO2dCQUN0QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUE7Z0JBQ3ZCLE1BQUs7WUFFVCxLQUFLLE9BQU87Z0JBQ1IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNsQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7Z0JBQ3RCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQTtnQkFDdkIsTUFBSztZQUVUO2dCQUNJLE9BQU07UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssc0JBQXNCLENBQUMsS0FBYTtRQUN4QyxJQUNJLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLE9BQU87WUFDbkMsSUFBSSxDQUFDLG1CQUFtQixLQUFLLEtBQUssRUFDcEMsQ0FBQztZQUNDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7WUFFaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7WUFDakUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM1RCxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU07SUFDVixDQUFDO0lBRU8sVUFBVTtRQUNkLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUN0RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssd0JBQXdCLENBQUMsSUFBUTtRQUNyQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTyxTQUFTLENBQUE7UUFDcEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNLLHVCQUF1QixDQUFDLElBQVE7UUFDcEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDcEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXBELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE9BQU07UUFDVixDQUFDO1FBRUQseURBQXlEO1FBQ3pELDZCQUE2QjtRQUM3Qix3REFBd0Q7UUFDeEQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxJQUNJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTTtnQkFDNUIsQ0FBQyxFQUFFO2dCQUNILElBQUk7Z0JBQ0osQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQ3pFLENBQUM7Z0JBQ0MsRUFBRSxHQUFHLE1BQU0sQ0FBQTtnQkFDWCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFBO1lBQ2hDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLEdBQUcsTUFBTSxDQUFBO2dCQUNiLEVBQUUsR0FBRyxTQUFTLENBQUE7Z0JBQ2QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtZQUNoQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakQsSUFBSSxHQUFHLE1BQU0sQ0FBQTtZQUViLHlFQUF5RTtZQUN6RSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELEVBQUUsR0FBRyxTQUFTLENBQUE7WUFDbEIsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLEVBQUUsR0FBRyxNQUFNLENBQUE7WUFFWCwyRUFBMkU7WUFDM0UsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxJQUFJLEdBQUcsU0FBUyxDQUFBO1lBQ3BCLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNyQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssMEJBQTBCLENBQUMsSUFBUTtRQUN2QyxJQUFJLE1BQU0sQ0FBQTtRQUVWLGlFQUFpRTtRQUNqRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUNoRCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQ2xELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FDckQsQ0FBQTtZQUNELE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FDbkMsTUFBTSxFQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNsQixDQUFBO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUVELDZCQUE2QjtRQUM3QixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXO1FBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxPQUFNO1FBQ1YsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUE7UUFDbkMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDdEIsQ0FBQztJQUNMLENBQUM7OEdBemJRLDBCQUEwQjtrR0FBMUIsMEJBQTBCLDRrQkFFeEIsaUJBQWlCLHdFQUdqQixjQUFjLGdEQzNCN0Isd3VJQXVGQSx5N0JEdEVnQjtZQUNSLHdCQUF3QixDQUFDLGVBQWU7WUFDeEMsd0JBQXdCLENBQUMsWUFBWTtTQUN4Qzs7MkZBRVEsMEJBQTBCO2tCQVh0QyxTQUFTOytCQUNJLHlCQUF5QixtQkFHbEIsdUJBQXVCLENBQUMsTUFBTSx1QkFDMUIsS0FBSyxjQUNkO3dCQUNSLHdCQUF3QixDQUFDLGVBQWU7d0JBQ3hDLHdCQUF3QixDQUFDLFlBQVk7cUJBQ3hDO3dLQUtELFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBSTVCLEtBQUs7c0JBREosU0FBUzt1QkFBQyxjQUFjO2dCQThHckIsY0FBYztzQkFEakIsV0FBVzt1QkFBQyx3QkFBd0I7Z0JBT2pDLG1CQUFtQjtzQkFEdEIsV0FBVzt1QkFBQyw4QkFBOEI7Z0JBT3ZDLG9CQUFvQjtzQkFEdkIsV0FBVzt1QkFBQywrQkFBK0I7Z0JBT3hDLG9CQUFvQjtzQkFEdkIsV0FBVzt1QkFBQywrQkFBK0I7Z0JBT3hDLHNCQUFzQjtzQkFEekIsV0FBVzt1QkFBQyxpQ0FBaUM7Z0JBTzFDLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxTQUFTO2dCQU9sQixrQkFBa0I7c0JBRHJCLFdBQVc7dUJBQUMsa0JBQWtCO2dCQXVCL0IsNEJBQTRCO3NCQUQzQixZQUFZO3VCQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5pbWF0aW9uRXZlbnQgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJ1xyXG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgRGF0ZVRpbWVBZGFwdGVyIH0gZnJvbSAnLi4vLi4vY2xhc3MvZGF0ZS10aW1lLWFkYXB0ZXIuY2xhc3MnXHJcbmltcG9ydCB7IERhdGVUaW1lRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vY2xhc3MvZGF0ZS10aW1lLmNsYXNzJ1xyXG5pbXBvcnQgeyBDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudCdcclxuaW1wb3J0IHsgRGF0ZVRpbWVJbnRsIH0gZnJvbSAnLi4vZGF0ZS10aW1lLXBpY2tlci1pbnRsLnNlcnZpY2UnXHJcbmltcG9ydCB7IFRpbWVyQ29tcG9uZW50IH0gZnJvbSAnLi4vdGltZXIvdGltZXIuY29tcG9uZW50J1xyXG5pbXBvcnQgeyBkYXRlVGltZVBpY2tlckFuaW1hdGlvbnMgfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmFuaW1hdGlvbnMnXHJcblxyXG4vKiogQGludGVybmFsICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdueHQtZGF0ZS10aW1lLWNvbnRhaW5lcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXHJcbiAgICBhbmltYXRpb25zOiBbXHJcbiAgICAgICAgZGF0ZVRpbWVQaWNrZXJBbmltYXRpb25zLnRyYW5zZm9ybVBpY2tlcixcclxuICAgICAgICBkYXRlVGltZVBpY2tlckFuaW1hdGlvbnMuZmFkZUluUGlja2VyXHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gICAgQFZpZXdDaGlsZChDYWxlbmRhckNvbXBvbmVudClcclxuICAgIGNhbGVuZGFyPzogQ2FsZW5kYXJDb21wb25lbnQ8VD5cclxuXHJcbiAgICBAVmlld0NoaWxkKFRpbWVyQ29tcG9uZW50KVxyXG4gICAgdGltZXI/OiBUaW1lckNvbXBvbmVudDxUPlxyXG5cclxuICAgIHBpY2tlcj86IERhdGVUaW1lRGlyZWN0aXZlPFQ+XHJcbiAgICBhY3RpdmVTZWxlY3RlZEluZGV4ID0gMCAvLyBUaGUgY3VycmVudCBhY3RpdmUgU2VsZWN0ZWRJbmRleCBpbiByYW5nZSBzZWxlY3QgbW9kZSAoMDogJ2Zyb20nLCAxOiAndG8nKVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RyZWFtIGVtaXRzIHdoZW4gdHJ5IHRvIGhpZGUgcGlja2VyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGlkZVBpY2tlciQgPSBuZXcgU3ViamVjdDx2b2lkPigpXHJcblxyXG4gICAgcmVhZG9ubHkgaGlkZVBpY2tlclN0cmVhbSA9IHRoaXMuaGlkZVBpY2tlciQuYXNPYnNlcnZhYmxlKClcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0cmVhbSBlbWl0cyB3aGVuIHRyeSB0byBjb25maXJtIHRoZSBzZWxlY3RlZCB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpcm1TZWxlY3RlZCQgPSBuZXcgU3ViamVjdDxFdmVudD4oKVxyXG5cclxuICAgIHJlYWRvbmx5IGNvbmZpcm1TZWxlY3RlZFN0cmVhbSA9IHRoaXMuY29uZmlybVNlbGVjdGVkJC5hc09ic2VydmFibGUoKVxyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGlja2VyT3BlbmVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcclxuXHJcbiAgICByZWFkb25seSBwaWNrZXJPcGVuZWRTdHJlYW0gPSB0aGlzLnBpY2tlck9wZW5lZCQuYXNPYnNlcnZhYmxlKClcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IHBpY2tlciBtb21lbnQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCB0aW1lIHBlcmlvZCBpcyBzaG93biBhbmQgd2hpY2ggZGF0ZSBpc1xyXG4gICAgICogaGlnaGxpZ2h0ZWQgd2hlbiB1c2luZyBrZXlib2FyZCBuYXZpZ2F0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9jbGFtUGlja2VyTW9tZW50PzogVFxyXG5cclxuICAgIGdldCBwaWNrZXJNb21lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYW1QaWNrZXJNb21lbnRcclxuICAgIH1cclxuXHJcbiAgICBzZXQgcGlja2VyTW9tZW50KHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsYW1QaWNrZXJNb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbGFtcERhdGUoXHJcbiAgICAgICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyPy5taW4sXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlcj8ubWF4XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwaWNrZXJUeXBlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlcj8ucGlja2VyVHlwZVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYW5jZWxMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwuY2FuY2VsQnRuTGFiZWxcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0TGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLnNldEJ0bkxhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFuZ2UgJ2Zyb20nIGxhYmVsXHJcbiAgICAgKi9cclxuICAgIGdldCBmcm9tTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLnJhbmdlRnJvbUxhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFuZ2UgJ3RvJyBsYWJlbFxyXG4gICAgICovXHJcbiAgICBnZXQgdG9MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwucmFuZ2VUb0xhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFuZ2UgJ2Zyb20nIGZvcm1hdHRlZCB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBnZXQgZnJvbUZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnBpY2tlcj8uc2VsZWN0ZWRzWzBdXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlXHJcbiAgICAgICAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aGlzLnBpY2tlcj8uZm9ybWF0U3RyaW5nKVxyXG4gICAgICAgICAgICA6ICcnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFuZ2UgJ3RvJyBmb3JtYXR0ZWQgdmFsdWVcclxuICAgICAqL1xyXG4gICAgZ2V0IHRvRm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucGlja2VyPy5zZWxlY3RlZHNbMV1cclxuICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgPyB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQodmFsdWUsIHRoaXMucGlja2VyPy5mb3JtYXRTdHJpbmcpXHJcbiAgICAgICAgICAgIDogJydcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhc2VzIGluIHdoaWNoIHRoZSBjb250cm9sIGJ1dHRvbnMgc2hvdyBpbiB0aGUgcGlja2VyXHJcbiAgICAgKiAxKSBwaWNrZXIgbW9kZSBpcyAnZGlhbG9nJ1xyXG4gICAgICogMikgcGlja2VyIHR5cGUgaXMgTk9UICdjYWxlbmRhcicgYW5kIHRoZSBwaWNrZXIgbW9kZSBpcyBOT1QgJ2lubGluZSdcclxuICAgICAqL1xyXG4gICAgZ2V0IHNob3dDb250cm9sQnV0dG9ucygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLnBpY2tlcj8ucGlja2VyTW9kZSA9PT0gJ2RpYWxvZycgfHxcclxuICAgICAgICAgICAgKHRoaXMucGlja2VyPy5waWNrZXJUeXBlICE9PSAnY2FsZW5kYXInICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlcj8ucGlja2VyTW9kZSAhPT0gJ2lubGluZScpXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb250YWluZXJFbG0oKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ueHQtZHQtY29udGFpbmVyJylcclxuICAgIGdldCBjb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mubnh0LWR0LXBvcHVwLWNvbnRhaW5lcicpXHJcbiAgICBnZXQgcG9wdXBDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXI/LnBpY2tlck1vZGUgPT09ICdwb3B1cCdcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm54dC1kdC1kaWFsb2ctY29udGFpbmVyJylcclxuICAgIGdldCBkaWFsb2dDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXI/LnBpY2tlck1vZGUgPT09ICdkaWFsb2cnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ueHQtZHQtaW5saW5lLWNvbnRhaW5lcicpXHJcbiAgICBnZXQgaW5saW5lQ29udGFpbmVyQ2xhc3MoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyPy5waWNrZXJNb2RlID09PSAnaW5saW5lJ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mubnh0LWR0LWNvbnRhaW5lci1kaXNhYmxlZCcpXHJcbiAgICBnZXQgY29udGFpbmVyRGlzYWJsZWRDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLnBpY2tlcj8uZGlzYWJsZWRcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxyXG4gICAgZ2V0IGNvbnRhaW5lcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyPy5pZFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIEBIb3N0QmluZGluZygnQHRyYW5zZm9ybVBpY2tlcicpXHJcbiAgICBnZXQgY29udGFpbmVyQW5pbWF0aW9uKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyPy5waWNrZXJNb2RlID09PSAnaW5saW5lJyA/ICcnIDogJ2VudGVyJ1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZWxtUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHBpY2tlckludGw6IERhdGVUaW1lSW50bCxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVUaW1lQWRhcHRlcjogRGF0ZVRpbWVBZGFwdGVyPFQ+XHJcbiAgICApIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCkgeyB9XHJcblxyXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5pdFBpY2tlcigpXHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZm9jdXNQaWNrZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ0B0cmFuc2Zvcm1QaWNrZXIuZG9uZScsIFsnJGV2ZW50J10pXHJcbiAgICBoYW5kbGVDb250YWluZXJBbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRvU3RhdGUgPSBldmVudC50b1N0YXRlXHJcbiAgICAgICAgaWYgKHRvU3RhdGUgPT09ICdlbnRlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5waWNrZXJPcGVuZWQkLm5leHQoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkYXRlU2VsZWN0ZWQoZGF0ZT86IFQpOiB2b2lkIHtcclxuICAgICAgICBsZXQgcmVzdWx0XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBpY2tlcj8uaXNJblNpbmdsZU1vZGUpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5kYXRlU2VsZWN0ZWRJblNpbmdsZU1vZGUoZGF0ZSlcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSByZXN1bHRcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLnNlbGVjdChyZXN1bHQpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBjbG9zZSB0aGUgcGlja2VyIHdoZW4gcmVzdWx0IGlzIHVuZGVmaW5lZCBhbmQgcGlja2VyVHlwZSBpcyBjYWxlbmRhci5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBpY2tlclR5cGUgPT09ICdjYWxlbmRhcicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVQaWNrZXIkLm5leHQoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGlja2VyPy5pc0luUmFuZ2VNb2RlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVNlbGVjdGVkSW5SYW5nZU1vZGUoZGF0ZSlcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSByZXN1bHRbdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4XVxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHJlc3VsdClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aW1lU2VsZWN0ZWQodGltZT86IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBpY2tlck1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsb25lKHRpbWUpXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5waWNrZXI/LmRhdGVUaW1lQ2hlY2tlcih0aGlzLnBpY2tlck1vbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5waWNrZXIuaXNJblNpbmdsZU1vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHRoaXMucGlja2VyTW9tZW50KVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBpY2tlci5pc0luUmFuZ2VNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkcyA9IFsuLi50aGlzLnBpY2tlcj8uc2VsZWN0ZWRzIHx8IFtdXVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlICdmcm9tJyBpcyBhZnRlciAndG8nIG9yICd0bydpcyBiZWZvcmUgJ2Zyb20nXHJcbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2Ugc2V0IGJvdGggdGhlICdmcm9tJyBhbmQgJ3RvJyB0aGUgc2FtZSB2YWx1ZVxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAodGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID09PSAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRzWzFdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkc1sxXVxyXG4gICAgICAgICAgICAgICAgICAgICkgPT09IDEpIHx8XHJcbiAgICAgICAgICAgICAgICAodGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID09PSAxICYmXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRzWzBdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkc1swXVxyXG4gICAgICAgICAgICAgICAgICAgICkgPT09IC0xKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkc1swXSA9IHRoaXMucGlja2VyTW9tZW50XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZHNbMV0gPSB0aGlzLnBpY2tlck1vbWVudFxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRzW3RoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleF0gPSB0aGlzLnBpY2tlck1vbWVudFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5zZWxlY3Qoc2VsZWN0ZWRzKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSBjbGljayBvbiBjYW5jZWwgYnV0dG9uXHJcbiAgICAgKi9cclxuICAgIG9uQ2FuY2VsQ2xpY2tlZChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmhpZGVQaWNrZXIkLm5leHQoKVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSBjbGljayBvbiBzZXQgYnV0dG9uXHJcbiAgICAgKi9cclxuICAgIG9uU2V0Q2xpY2tlZChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucGlja2VyPy5kYXRlVGltZUNoZWNrZXI/Lih0aGlzLnBpY2tlck1vbWVudCkpIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlUGlja2VyJC5uZXh0KClcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlybVNlbGVjdGVkJC5uZXh0KGV2ZW50KVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSBjbGljayBvbiBpbmZvcm0gcmFkaW8gZ3JvdXBcclxuICAgICAqL1xyXG4gICAgaGFuZGxlQ2xpY2tPbkluZm9Hcm91cChldmVudDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZEluZGV4KGluZGV4KVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIGNsaWNrIG9uIGluZm9ybSByYWRpbyBncm91cFxyXG4gICAgICovXHJcbiAgICBoYW5kbGVLZXlkb3duT25JbmZvR3JvdXAoXHJcbiAgICAgICAgZXZlbnQ6IGFueSxcclxuICAgICAgICBuZXh0OiBhbnksXHJcbiAgICAgICAgaW5kZXg6IG51bWJlclxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxyXG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcclxuICAgICAgICAgICAgICAgIG5leHQuZm9jdXMoKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZEluZGV4KGluZGV4ID09PSAwID8gMSA6IDApXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ1NwYWNlJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRJbmRleChpbmRleClcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYWN0aXZlU2VsZWN0ZWRJbmRleFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5waWNrZXI/LnNlbGVjdE1vZGUgPT09ICdyYW5nZScgJiZcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ICE9PSBpbmRleFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPSBpbmRleFxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnBpY2tlcj8uc2VsZWN0ZWRzW3RoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleF1cclxuICAgICAgICAgICAgaWYgKHRoaXMucGlja2VyLnNlbGVjdGVkcyAmJiBzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbG9uZShzZWxlY3RlZClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQaWNrZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSB0aGlzLnBpY2tlcj8uc3RhcnRBdCB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5ub3coKVxyXG4gICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IHRoaXMucGlja2VyPy5zZWxlY3RNb2RlID09PSAncmFuZ2VUbycgPyAxIDogMFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VsZWN0IGNhbGVuZGFyIGRhdGUgaW4gc2luZ2xlIG1vZGUsXHJcbiAgICAgKiBpdCByZXR1cm5zIHVuZGVmaW5lZCB3aGVuIGRhdGUgaXMgbm90IHNlbGVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGRhdGVTZWxlY3RlZEluU2luZ2xlTW9kZShkYXRlPzogVCk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgdGhpcy5waWNrZXI/LnNlbGVjdGVkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVBbmRDaGVja0NhbGVuZGFyRGF0ZShkYXRlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VsZWN0IGRhdGVzIGluIHJhbmdlIE1vZGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkYXRlU2VsZWN0ZWRJblJhbmdlTW9kZShkYXRlPzogVCk6IEFycmF5PFQgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBsZXQgZnJvbSA9IHRoaXMucGlja2VyPy5zZWxlY3RlZHNbMF1cclxuICAgICAgICBsZXQgdG8gPSB0aGlzLnBpY2tlcj8uc2VsZWN0ZWRzWzFdXHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudXBkYXRlQW5kQ2hlY2tDYWxlbmRhckRhdGUoZGF0ZSlcclxuXHJcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiB0aGUgZ2l2ZW4gY2FsZW5kYXIgZGF5IGlzIGFmdGVyIG9yIGVxdWFsIHRvICdmcm9tJyxcclxuICAgICAgICAvLyBzZXQgdGhzIGdpdmVuIGRhdGUgYXMgJ3RvJ1xyXG4gICAgICAgIC8vIG90aGVyd2lzZSwgc2V0IGl0IGFzICdmcm9tJyBhbmQgc2V0ICd0bycgdG8gdW5kZWZpbmVkXHJcbiAgICAgICAgaWYgKHRoaXMucGlja2VyPy5zZWxlY3RNb2RlID09PSAncmFuZ2UnKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLnNlbGVjdGVkcyAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0ZWRzLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICAgICAgIXRvICYmXHJcbiAgICAgICAgICAgICAgICBmcm9tICYmXHJcbiAgICAgICAgICAgICAgICAodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKHJlc3VsdCwgZnJvbSkgPz8gMCkgPj0gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRvID0gcmVzdWx0XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPSAxXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmcm9tID0gcmVzdWx0XHJcbiAgICAgICAgICAgICAgICB0byA9IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID0gMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlcj8uc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScpIHtcclxuICAgICAgICAgICAgZnJvbSA9IHJlc3VsdFxyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlIGZyb20gdmFsdWUgaXMgYWZ0ZXIgdGhlIHRvIHZhbHVlLCBzZXQgdGhlIHRvIHZhbHVlIGFzIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAodG8gJiYgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShmcm9tLCB0bykgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0byA9IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlcj8uc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nKSB7XHJcbiAgICAgICAgICAgIHRvID0gcmVzdWx0XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB0aGUgZnJvbSB2YWx1ZSBpcyBhZnRlciB0aGUgdG8gdmFsdWUsIHNldCB0aGUgZnJvbSB2YWx1ZSBhcyB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKGZyb20gJiYgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShmcm9tLCB0bykgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmcm9tID0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbZnJvbSwgdG9dXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIGdpdmVuIGNhbGVuZGFyIGRhdGUncyB0aW1lIGFuZCBjaGVjayBpZiBpdCBpcyB2YWxpZFxyXG4gICAgICogQmVjYXVzZSB0aGUgY2FsZW5kYXIgZGF0ZSBoYXMgMDA6MDA6MDAgYXMgZGVmYXVsdCB0aW1lLCBpZiB0aGUgcGlja2VyIHR5cGUgaXMgJ2JvdGgnLFxyXG4gICAgICogd2UgbmVlZCB0byB1cGRhdGUgdGhlIGdpdmVuIGNhbGVuZGFyIGRhdGUncyB0aW1lIGJlZm9yZSBzZWxlY3RpbmcgaXQuXHJcbiAgICAgKiBpZiBpdCBpcyB2YWxpZCwgcmV0dXJuIHRoZSB1cGRhdGVkIGRhdGVUaW1lXHJcbiAgICAgKiBpZiBpdCBpcyBub3QgdmFsaWQsIHJldHVybiB1bmRlZmluZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVBbmRDaGVja0NhbGVuZGFyRGF0ZShkYXRlPzogVCk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGxldCByZXN1bHRcclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIHBpY2tlciBpcyAnYm90aCcsIHVwZGF0ZSB0aGUgY2FsZW5kYXIgZGF0ZSdzIHRpbWUgdmFsdWVcclxuICAgICAgICBpZiAodGhpcy5waWNrZXI/LnBpY2tlclR5cGUgPT09ICdib3RoJykge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKGRhdGUpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZShkYXRlKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldEhvdXJzKHRoaXMucGlja2VyTW9tZW50KSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1pbnV0ZXModGhpcy5waWNrZXJNb21lbnQpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0U2Vjb25kcyh0aGlzLnBpY2tlck1vbWVudClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbGFtcERhdGUoXHJcbiAgICAgICAgICAgICAgICByZXN1bHQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5taW4sXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5tYXhcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsb25lKGRhdGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjaGVjayB0aGUgdXBkYXRlZCBkYXRlVGltZVxyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlcj8uZGF0ZVRpbWVDaGVja2VyKHJlc3VsdCkgPyByZXN1bHQgOiB1bmRlZmluZWRcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvY3VzIHRvIHRoZSBwaWNrZXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmb2N1c1BpY2tlcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5waWNrZXI/LnBpY2tlck1vZGUgPT09ICdpbmxpbmUnKSB7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXIpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5mb2N1c0FjdGl2ZUNlbGwoKVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lcikge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVyLmZvY3VzKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBbY2RrVHJhcEZvY3VzXT1cInBpY2tlcj8ucGlja2VyTW9kZSAhPT0gJ2lubGluZSdcIlxyXG4gICAgW0BmYWRlSW5QaWNrZXJdPVwicGlja2VyPy5waWNrZXJNb2RlID09PSAnaW5saW5lJz8gJycgOiAnZW50ZXInXCJcclxuICAgIGNsYXNzPVwibnh0LWR0LWNvbnRhaW5lci1pbm5lclwiPlxyXG5cclxuICAgIDxueHQtZGF0ZS10aW1lLWNhbGVuZGFyICpuZ0lmPVwicGlja2VyVHlwZSA9PT0gJ2JvdGgnIHx8IHBpY2tlclR5cGUgPT09ICdjYWxlbmRhcidcIlxyXG4gICAgICAgIGNsYXNzPVwibnh0LWR0LWNvbnRhaW5lci1yb3dcIlxyXG4gICAgICAgIFtmaXJzdERheU9mV2Vla109XCJwaWNrZXI/LmZpcnN0RGF5T2ZXZWVrID8/IDBcIlxyXG4gICAgICAgIFsocGlja2VyTW9tZW50KV09XCJwaWNrZXJNb21lbnRcIlxyXG4gICAgICAgIFtzZWxlY3RlZF09XCJwaWNrZXI/LnNlbGVjdGVkXCJcclxuICAgICAgICBbc2VsZWN0ZWRzXT1cInBpY2tlcj8uc2VsZWN0ZWRzID8/IFtdXCJcclxuICAgICAgICBbc2VsZWN0TW9kZV09XCJwaWNrZXI/LnNlbGVjdE1vZGVcIlxyXG4gICAgICAgIFttaW5dPVwicGlja2VyPy5taW5cIlxyXG4gICAgICAgIFttYXhdPVwicGlja2VyPy5tYXhcIlxyXG4gICAgICAgIFtkYXRlVGltZUZpbHRlcl09XCJwaWNrZXI/LmRhdGVUaW1lRmlsdGVyXCJcclxuICAgICAgICBbc3RhcnRWaWV3XT1cInBpY2tlcj8uc3RhcnRWaWV3ID8/ICdtb250aCdcIlxyXG4gICAgICAgIFtoaWRlT3RoZXJNb250aHNdPVwiISFwaWNrZXI/LmhpZGVPdGhlck1vbnRoc1wiXHJcbiAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJwaWNrZXI/LnNlbGVjdFllYXIoJGV2ZW50KVwiXHJcbiAgICAgICAgKG1vbnRoU2VsZWN0ZWQpPVwicGlja2VyPy5zZWxlY3RNb250aCgkZXZlbnQpXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiZGF0ZVNlbGVjdGVkKCRldmVudClcIj48L254dC1kYXRlLXRpbWUtY2FsZW5kYXI+XHJcblxyXG4gICAgPG54dC1kYXRlLXRpbWUtdGltZXIgKm5nSWY9XCJwaWNrZXJUeXBlID09PSAnYm90aCcgfHwgcGlja2VyVHlwZSA9PT0gJ3RpbWVyJ1wiXHJcbiAgICAgICAgY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLXJvd1wiXHJcbiAgICAgICAgW3BpY2tlck1vbWVudF09XCJwaWNrZXJNb21lbnRcIlxyXG4gICAgICAgIFttaW5dPVwicGlja2VyPy5taW5cIlxyXG4gICAgICAgIFttYXhdPVwicGlja2VyPy5tYXhcIlxyXG4gICAgICAgIFtzaG93U2Vjb25kc1RpbWVyXT1cIiEhcGlja2VyPy5zaG93U2Vjb25kc1RpbWVyXCJcclxuICAgICAgICBbaG91cjEyVGltZXJdPVwiISFwaWNrZXI/LmhvdXIxMlRpbWVyXCJcclxuICAgICAgICBbc3RlcEhvdXJdPVwicGlja2VyPy5zdGVwSG91ciA/PyAxXCJcclxuICAgICAgICBbc3RlcE1pbnV0ZV09XCJwaWNrZXI/LnN0ZXBNaW51dGUgPz8gMVwiXHJcbiAgICAgICAgW3N0ZXBTZWNvbmRdPVwicGlja2VyPy5zdGVwU2Vjb25kID8/IDFcIlxyXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJ0aW1lU2VsZWN0ZWQoJGV2ZW50KVwiPjwvbnh0LWRhdGUtdGltZS10aW1lcj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwicGlja2VyPy5pc0luUmFuZ2VNb2RlXCJcclxuICAgICAgICByb2xlPVwicmFkaW9ncm91cFwiXHJcbiAgICAgICAgY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLWluZm8gbnh0LWR0LWNvbnRhaW5lci1yb3dcIj5cclxuICAgICAgICA8ZGl2IHJvbGU9XCJyYWRpb1wiXHJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJhY3RpdmVTZWxlY3RlZEluZGV4ID09PSAwID8gMCA6IC0xXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDBcIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm54dC1kdC1jb250cm9sIG54dC1kdC1jb250YWluZXItcmFuZ2Ugbnh0LWR0LWNvbnRhaW5lci1mcm9tXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydueHQtZHQtY29udGFpbmVyLWluZm8tYWN0aXZlJzogYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMH1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2tPbkluZm9Hcm91cCgkZXZlbnQsIDApXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5ZG93bk9uSW5mb0dyb3VwKCRldmVudCwgdG8sIDApXCJcclxuICAgICAgICAgICAgI2Zyb20+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wtY29udGVudCBueHQtZHQtY29udGFpbmVyLXJhbmdlLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLWluZm8tbGFiZWxcIj57e2Zyb21MYWJlbH19Ojwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibnh0LWR0LWNvbnRhaW5lci1pbmZvLXZhbHVlXCI+e3tmcm9tRm9ybWF0dGVkVmFsdWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgcm9sZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgW3RhYmluZGV4XT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDEgPyAwIDogLTFcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wgbnh0LWR0LWNvbnRhaW5lci1yYW5nZSBueHQtZHQtY29udGFpbmVyLXRvXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydueHQtZHQtY29udGFpbmVyLWluZm8tYWN0aXZlJzogYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMX1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2tPbkluZm9Hcm91cCgkZXZlbnQsIDEpXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5ZG93bk9uSW5mb0dyb3VwKCRldmVudCwgZnJvbSwgMSlcIlxyXG4gICAgICAgICAgICAjdG8+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wtY29udGVudCBueHQtZHQtY29udGFpbmVyLXJhbmdlLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLWluZm8tbGFiZWxcIj57e3RvTGFiZWx9fTo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm54dC1kdC1jb250YWluZXItaW5mby12YWx1ZVwiPnt7dG9Gb3JtYXR0ZWRWYWx1ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0NvbnRyb2xCdXR0b25zXCJcclxuICAgICAgICBjbGFzcz1cIm54dC1kdC1jb250YWluZXItYnV0dG9ucyBueHQtZHQtY29udGFpbmVyLXJvd1wiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJueHQtZHQtY29udHJvbCBueHQtZHQtY29udHJvbC1idXR0b24gbnh0LWR0LWNvbnRhaW5lci1jb250cm9sLWJ1dHRvblwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25DYW5jZWxDbGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udHJvbC1jb250ZW50IG54dC1kdC1jb250cm9sLWJ1dHRvbi1jb250ZW50XCJcclxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgICAgIHt7Y2FuY2VsTGFiZWx9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm54dC1kdC1jb250cm9sIG54dC1kdC1jb250cm9sLWJ1dHRvbiBueHQtZHQtY29udGFpbmVyLWNvbnRyb2wtYnV0dG9uXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvblNldENsaWNrZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm54dC1kdC1jb250cm9sLWNvbnRlbnQgbnh0LWR0LWNvbnRyb2wtYnV0dG9uLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAge3tzZXRMYWJlbH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|