nxt-pick-datetime 18.0.0 → 19.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.
Files changed (49) hide show
  1. package/fesm2022/nxt-pick-datetime-moment-adapter.mjs +23 -26
  2. package/fesm2022/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
  3. package/fesm2022/nxt-pick-datetime-native-adapter.mjs +22 -24
  4. package/fesm2022/nxt-pick-datetime-native-adapter.mjs.map +1 -1
  5. package/fesm2022/nxt-pick-datetime.mjs +76 -74
  6. package/fesm2022/nxt-pick-datetime.mjs.map +1 -1
  7. package/lib/class/date-time.class.d.ts +1 -1
  8. package/moment-adapter/moment-adapter.module.d.ts +2 -0
  9. package/moment-adapter/public-api.d.ts +1 -1
  10. package/native-adapter/native-adapter.module.d.ts +2 -0
  11. package/native-adapter/public-api.d.ts +1 -1
  12. package/package.json +9 -14
  13. package/esm2022/lib/class/date-time-adapter.class.mjs +0 -97
  14. package/esm2022/lib/class/date-time-format.class.mjs +0 -4
  15. package/esm2022/lib/class/date-time.class.mjs +0 -95
  16. package/esm2022/lib/class/dialog-config.class.mjs +0 -47
  17. package/esm2022/lib/class/dialog-ref.class.mjs +0 -119
  18. package/esm2022/lib/date-time/calendar/calendar.component.mjs +0 -346
  19. package/esm2022/lib/date-time/calendar-body/calendar-body.component.mjs +0 -151
  20. package/esm2022/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +0 -429
  21. package/esm2022/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -358
  22. package/esm2022/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +0 -362
  23. package/esm2022/lib/date-time/date-time-inline/date-time-inline.component.mjs +0 -275
  24. package/esm2022/lib/date-time/date-time-picker/date-time-picker.component.mjs +0 -541
  25. package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +0 -19
  26. package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +0 -389
  27. package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +0 -618
  28. package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +0 -61
  29. package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
  30. package/esm2022/lib/date-time/date-time.module.mjs +0 -96
  31. package/esm2022/lib/date-time/number-fixed-len.pipe.mjs +0 -22
  32. package/esm2022/lib/date-time/timer/timer.component.mjs +0 -299
  33. package/esm2022/lib/date-time/timer-box/timer-box.component.mjs +0 -95
  34. package/esm2022/lib/dialog/dialog-container/dialog-container.component.mjs +0 -248
  35. package/esm2022/lib/dialog/dialog.module.mjs +0 -42
  36. package/esm2022/lib/dialog/dialog.service.mjs +0 -251
  37. package/esm2022/lib/utils/object.mjs +0 -24
  38. package/esm2022/moment-adapter/date-time-adapter.class.mjs +0 -220
  39. package/esm2022/moment-adapter/date-time-format.class.mjs +0 -13
  40. package/esm2022/moment-adapter/moment-adapter.module.mjs +0 -37
  41. package/esm2022/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +0 -5
  42. package/esm2022/moment-adapter/public-api.mjs +0 -3
  43. package/esm2022/native-adapter/date-time-adapter.class.mjs +0 -366
  44. package/esm2022/native-adapter/date-time-format.class.mjs +0 -13
  45. package/esm2022/native-adapter/native-adapter.module.mjs +0 -37
  46. package/esm2022/native-adapter/nxt-pick-datetime-native-adapter.mjs +0 -5
  47. package/esm2022/native-adapter/public-api.mjs +0 -2
  48. package/esm2022/nxt-pick-datetime.mjs +0 -5
  49. package/esm2022/public-api.mjs +0 -14
@@ -1,429 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Inject, Input, Output, ViewChild } from '@angular/core';
2
- import { NXT_DATE_TIME_FORMATS } from '../../class/date-time-format.class';
3
- import { CalendarBodyComponent, CalendarCell } from '../calendar-body/calendar-body.component';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../../class/date-time-adapter.class";
6
- import * as i2 from "@angular/common";
7
- import * as i3 from "../calendar-body/calendar-body.component";
8
- /** @internal */
9
- const DAYS_PER_WEEK = 7;
10
- /** @internal */
11
- const WEEKS_PER_VIEW = 6;
12
- export class MonthViewComponent {
13
- get firstDayOfWeek() {
14
- return this._firstDayOfWeek;
15
- }
16
- set firstDayOfWeek(val) {
17
- if (val >= 0 && val <= 6 && val !== this._firstDayOfWeek) {
18
- this._firstDayOfWeek = val;
19
- if (this.initiated) {
20
- this.generateWeekDays();
21
- this.generateCalendar();
22
- this.cdRef.markForCheck();
23
- }
24
- }
25
- }
26
- get selectMode() {
27
- return this._selectMode;
28
- }
29
- set selectMode(val) {
30
- this._selectMode = val;
31
- if (this.initiated) {
32
- this.generateCalendar();
33
- this.cdRef.markForCheck();
34
- }
35
- }
36
- get selected() {
37
- return this._selected;
38
- }
39
- set selected(value) {
40
- const oldSelected = this._selected;
41
- value = this.dateTimeAdapter.deserialize(value);
42
- this._selected = this.getValidDate(value);
43
- if (!this.dateTimeAdapter.isSameDay(oldSelected, this._selected)) {
44
- this.setSelectedDates();
45
- }
46
- }
47
- get selecteds() {
48
- return this._selecteds || [];
49
- }
50
- set selecteds(values) {
51
- this._selecteds = values.map(v => {
52
- v = this.dateTimeAdapter.deserialize(v);
53
- return this.getValidDate(v);
54
- });
55
- this.setSelectedDates();
56
- }
57
- get pickerMoment() {
58
- return this._pickerMoment;
59
- }
60
- set pickerMoment(value) {
61
- const oldMoment = this._pickerMoment;
62
- value = this.dateTimeAdapter.deserialize(value);
63
- this._pickerMoment =
64
- this.getValidDate(value) || this.dateTimeAdapter.now();
65
- this.firstDateOfMonth = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(this._pickerMoment), this.dateTimeAdapter.getMonth(this._pickerMoment), 1);
66
- if (!this.isSameMonth(oldMoment, this._pickerMoment) &&
67
- this.initiated) {
68
- this.generateCalendar();
69
- }
70
- }
71
- get dateTimeFilter() {
72
- return this._dateTimeFilter;
73
- }
74
- set dateTimeFilter(filter) {
75
- this._dateTimeFilter = filter;
76
- if (this.initiated) {
77
- this.generateCalendar();
78
- this.cdRef.markForCheck();
79
- }
80
- }
81
- get min() {
82
- return this._minDate;
83
- }
84
- set min(value) {
85
- value = this.dateTimeAdapter.deserialize(value);
86
- this._minDate = this.getValidDate(value);
87
- if (this.initiated) {
88
- this.generateCalendar();
89
- this.cdRef.markForCheck();
90
- }
91
- }
92
- get max() {
93
- return this._maxDate;
94
- }
95
- set max(value) {
96
- value = this.dateTimeAdapter.deserialize(value);
97
- this._maxDate = this.getValidDate(value);
98
- if (this.initiated) {
99
- this.generateCalendar();
100
- this.cdRef.markForCheck();
101
- }
102
- }
103
- get weekdays() {
104
- return this._weekdays;
105
- }
106
- get days() {
107
- return this._days;
108
- }
109
- get activeCell() {
110
- if (this.pickerMoment) {
111
- return (this.dateTimeAdapter.getDate(this.pickerMoment) +
112
- this.firstRowOffset -
113
- 1);
114
- }
115
- return;
116
- }
117
- get isInSingleMode() {
118
- return this.selectMode === 'single';
119
- }
120
- get isInRangeMode() {
121
- return (this.selectMode === 'range' ||
122
- this.selectMode === 'rangeFrom' ||
123
- this.selectMode === 'rangeTo');
124
- }
125
- /** @internal */
126
- get calendarView() {
127
- return true;
128
- }
129
- constructor(cdRef, dateTimeAdapter, dateTimeFormats) {
130
- this.cdRef = cdRef;
131
- this.dateTimeAdapter = dateTimeAdapter;
132
- this.dateTimeFormats = dateTimeFormats;
133
- /**
134
- * Whether to hide dates in other months at the start or end of the current month
135
- */
136
- this.hideOtherMonths = false;
137
- /**
138
- * Define the first day of a week
139
- * Sunday: 0 ~ Saturday: 6
140
- */
141
- this._firstDayOfWeek = 0;
142
- /**
143
- * The select mode of the picker;
144
- */
145
- this._selectMode = 'single';
146
- this._selecteds = new Array();
147
- this.initiated = false;
148
- // the index of cell that contains the first date of the month
149
- this.firstRowOffset = 0;
150
- /**
151
- * Callback to invoke when a new date is selected
152
- */
153
- this.selectedChange = new EventEmitter();
154
- /**
155
- * Callback to invoke when any date is selected.
156
- */
157
- this.userSelection = new EventEmitter();
158
- /** Emits when any date is activated */
159
- this.pickerMomentChange = new EventEmitter();
160
- }
161
- ngOnInit() {
162
- this.generateWeekDays();
163
- this.localeSub = this.dateTimeAdapter.localeChanges.subscribe(() => {
164
- this.generateWeekDays();
165
- this.generateCalendar();
166
- this.cdRef.markForCheck();
167
- });
168
- }
169
- ngAfterContentInit() {
170
- this.generateCalendar();
171
- this.initiated = true;
172
- }
173
- ngOnDestroy() {
174
- this.localeSub?.unsubscribe();
175
- this.localeSub = undefined;
176
- }
177
- /**
178
- * Handle a calendarCell selected
179
- */
180
- selectCalendarCell(cell) {
181
- // Cases in which the date would not be selected
182
- // 1, the calendar cell is NOT enabled (is NOT valid)
183
- // 2, the selected date is NOT in current picker's month and the hideOtherMonths is enabled
184
- if (!cell.enabled || (this.hideOtherMonths && cell.out)) {
185
- return;
186
- }
187
- this.selectDate(cell.value);
188
- }
189
- /**
190
- * Handle a new date selected
191
- */
192
- selectDate(date) {
193
- const daysDiff = date - 1;
194
- const selected = this.dateTimeAdapter.addCalendarDays(this.firstDateOfMonth, daysDiff);
195
- this.selectedChange.emit(selected);
196
- this.userSelection.emit();
197
- }
198
- /**
199
- * Handle keydown event on calendar body
200
- */
201
- handleCalendarKeydown(event) {
202
- let moment;
203
- switch (event.code.toLowerCase()) {
204
- // minus 1 day
205
- case 'arrowleft':
206
- moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, -1);
207
- this.pickerMomentChange.emit(moment);
208
- break;
209
- // add 1 day
210
- case 'arrowright':
211
- moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, 1);
212
- this.pickerMomentChange.emit(moment);
213
- break;
214
- // minus 1 week
215
- case 'arrowup':
216
- moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, -7);
217
- this.pickerMomentChange.emit(moment);
218
- break;
219
- // add 1 week
220
- case 'arrowdown':
221
- moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, 7);
222
- this.pickerMomentChange.emit(moment);
223
- break;
224
- // move to first day of current month
225
- case 'home':
226
- moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, 1 - this.dateTimeAdapter.getDate(this.pickerMoment));
227
- this.pickerMomentChange.emit(moment);
228
- break;
229
- // move to last day of current month
230
- case 'end':
231
- moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, this.dateTimeAdapter.getNumDaysInMonth(this.pickerMoment) -
232
- this.dateTimeAdapter.getDate(this.pickerMoment));
233
- this.pickerMomentChange.emit(moment);
234
- break;
235
- // minus 1 month (or 1 year)
236
- case 'pageup':
237
- moment = event.altKey
238
- ? this.dateTimeAdapter.addCalendarYears(this.pickerMoment, -1)
239
- : this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, -1);
240
- this.pickerMomentChange.emit(moment);
241
- break;
242
- // add 1 month (or 1 year)
243
- case 'pagedown':
244
- moment = event.altKey
245
- ? this.dateTimeAdapter.addCalendarYears(this.pickerMoment, 1)
246
- : this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, 1);
247
- this.pickerMomentChange.emit(moment);
248
- break;
249
- // select the pickerMoment
250
- case 'enter':
251
- if (!this.dateTimeFilter || this.dateTimeFilter(this.pickerMoment, 'date')) {
252
- this.selectDate(this.dateTimeAdapter.getDate(this.pickerMoment));
253
- }
254
- break;
255
- default:
256
- return;
257
- }
258
- this.focusActiveCell();
259
- event.preventDefault();
260
- }
261
- /**
262
- * Generate the calendar weekdays array
263
- */
264
- generateWeekDays() {
265
- const longWeekdays = this.dateTimeAdapter.getDayOfWeekNames('long');
266
- const shortWeekdays = this.dateTimeAdapter.getDayOfWeekNames('short');
267
- const narrowWeekdays = this.dateTimeAdapter.getDayOfWeekNames('narrow');
268
- const firstDayOfWeek = this.firstDayOfWeek;
269
- const weekdays = longWeekdays.map((long, i) => ({ long, short: shortWeekdays[i], narrow: narrowWeekdays[i] }));
270
- this._weekdays = weekdays
271
- .slice(firstDayOfWeek)
272
- .concat(weekdays.slice(0, firstDayOfWeek));
273
- return;
274
- }
275
- /**
276
- * Generate the calendar days array
277
- */
278
- generateCalendar() {
279
- if (!this.pickerMoment) {
280
- return;
281
- }
282
- this.todayDate = undefined;
283
- // the first weekday of the month
284
- const startWeekdayOfMonth = this.dateTimeAdapter.getDay(this.firstDateOfMonth);
285
- const firstDayOfWeek = this.firstDayOfWeek;
286
- // the amount of days from the first date of the month
287
- // if it is < 0, it means the date is in previous month
288
- let daysDiff = 0 -
289
- ((startWeekdayOfMonth + (DAYS_PER_WEEK - firstDayOfWeek)) %
290
- DAYS_PER_WEEK);
291
- // the index of cell that contains the first date of the month
292
- this.firstRowOffset = Math.abs(daysDiff);
293
- this._days = [];
294
- for (let i = 0; i < WEEKS_PER_VIEW; i++) {
295
- const week = [];
296
- for (let j = 0; j < DAYS_PER_WEEK; j++) {
297
- const date = this.dateTimeAdapter.addCalendarDays(this.firstDateOfMonth, daysDiff);
298
- const dateCell = this.createDateCell(date, daysDiff);
299
- // check if the date is today
300
- if (this.dateTimeAdapter.isSameDay(this.dateTimeAdapter.now(), date)) {
301
- this.todayDate = daysDiff + 1;
302
- }
303
- week.push(dateCell);
304
- daysDiff += 1;
305
- }
306
- this._days.push(week);
307
- }
308
- this.setSelectedDates();
309
- }
310
- /**
311
- * Creates CalendarCell for days.
312
- */
313
- createDateCell(date, daysDiff) {
314
- // total days of the month
315
- const daysInMonth = this.dateTimeAdapter.getNumDaysInMonth(this.pickerMoment);
316
- const dateNum = this.dateTimeAdapter.getDate(date);
317
- // const dateName = this.dateNames[dateNum - 1];
318
- const dateName = dateNum.toString();
319
- const ariaLabel = this.dateTimeAdapter.format(date, this.dateTimeFormats.dateA11yLabel);
320
- // check if the date if selectable
321
- const enabled = this.isDateEnabled(date);
322
- // check if date is not in current month
323
- const dayValue = daysDiff + 1;
324
- const out = dayValue < 1 || dayValue > daysInMonth;
325
- const cellClass = 'nxt-dt-day-' + this.dateTimeAdapter.getDay(date);
326
- return new CalendarCell(dayValue, dateName, ariaLabel, enabled, out, cellClass);
327
- }
328
- /**
329
- * Check if the date is valid
330
- */
331
- isDateEnabled(date) {
332
- return (!!date &&
333
- (!this.dateTimeFilter || this.dateTimeFilter(date, 'date')) &&
334
- (!this.min ||
335
- this.dateTimeAdapter.compare(date, this.min) >= 0) &&
336
- (!this.max ||
337
- this.dateTimeAdapter.compare(date, this.max) <= 0));
338
- }
339
- /**
340
- * Get a valid date object
341
- */
342
- getValidDate(obj) {
343
- return this.dateTimeAdapter.isDateInstance(obj) &&
344
- this.dateTimeAdapter.isValid(obj)
345
- ? obj
346
- : undefined;
347
- }
348
- /**
349
- * Check if the give dates are defined and in the same month
350
- */
351
- isSameMonth(dateLeft, dateRight) {
352
- return !!(dateLeft &&
353
- dateRight &&
354
- this.dateTimeAdapter.isValid(dateLeft) &&
355
- this.dateTimeAdapter.isValid(dateRight) &&
356
- this.dateTimeAdapter.getYear(dateLeft) ===
357
- this.dateTimeAdapter.getYear(dateRight) &&
358
- this.dateTimeAdapter.getMonth(dateLeft) ===
359
- this.dateTimeAdapter.getMonth(dateRight));
360
- }
361
- /**
362
- * Set the selectedDates value.
363
- * In single mode, it has only one value which represent the selected date
364
- * In range mode, it would has two values, one for the fromValue and the other for the toValue
365
- */
366
- setSelectedDates() {
367
- this.selectedDates = [];
368
- if (!this.firstDateOfMonth) {
369
- return;
370
- }
371
- if (this.isInSingleMode && this.selected) {
372
- const dayDiff = this.dateTimeAdapter.differenceInCalendarDays(this.selected, this.firstDateOfMonth) ?? 0;
373
- this.selectedDates[0] = dayDiff + 1;
374
- return;
375
- }
376
- if (this.isInRangeMode && this.selecteds) {
377
- this.selectedDates = this.selecteds.map(selected => {
378
- if (this.dateTimeAdapter.isValid(selected)) {
379
- const dayDiff = this.dateTimeAdapter.differenceInCalendarDays(selected, this.firstDateOfMonth) ?? 0;
380
- return dayDiff + 1;
381
- }
382
- return;
383
- });
384
- }
385
- }
386
- focusActiveCell() {
387
- this.calendarBodyElm?.focusActiveCell();
388
- }
389
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: MonthViewComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DateTimeAdapter }, { token: NXT_DATE_TIME_FORMATS }], target: i0.ɵɵFactoryTarget.Component }); }
390
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: MonthViewComponent, selector: "nxt-date-time-month-view", inputs: { hideOtherMonths: "hideOtherMonths", firstDayOfWeek: "firstDayOfWeek", selectMode: "selectMode", selected: "selected", selecteds: "selecteds", pickerMoment: "pickerMoment", dateTimeFilter: "dateTimeFilter", min: "min", max: "max" }, outputs: { selectedChange: "selectedChange", userSelection: "userSelection", pickerMomentChange: "pickerMomentChange" }, host: { properties: { "class.nxt-dt-calendar-view": "this.calendarView" } }, viewQueries: [{ propertyName: "calendarBodyElm", first: true, predicate: CalendarBodyComponent, descendants: true, static: true }], ngImport: i0, template: "<table class=\"nxt-dt-calendar-table nxt-dt-calendar-month-table\"\r\n [class.nxt-dt-calendar-only-current-month]=\"hideOtherMonths\">\r\n <thead class=\"nxt-dt-calendar-header\">\r\n <tr class=\"nxt-dt-weekdays\">\r\n <th *ngFor=\"let weekday of weekdays\"\r\n [attr.aria-label]=\"weekday.long\"\r\n class=\"nxt-dt-weekday\"\r\n scope=\"col\">\r\n <span>{{weekday.short}}</span>\r\n </th>\r\n </tr>\r\n <tr>\r\n <th class=\"nxt-dt-calendar-table-divider\"\r\n aria-hidden=\"true\"\r\n colspan=\"7\"></th>\r\n </tr>\r\n </thead>\r\n <tbody nxtDateTimeCalendarBody\r\n role=\"grid\"\r\n [rows]=\"days\"\r\n [todayValue]=\"todayDate ?? undefined\"\r\n [selectedValues]=\"selectedDates\"\r\n [selectMode]=\"selectMode\"\r\n [activeCell]=\"activeCell ?? 0\"\r\n (keydown)=\"handleCalendarKeydown($event)\"\r\n (select)=\"selectCalendarCell($event)\">\r\n </tbody>\r\n</table>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.CalendarBodyComponent, selector: "[nxtDateTimeCalendarBody]", inputs: ["activeCell", "rows", "numCols", "cellRatio", "todayValue", "selectedValues", "selectMode"], outputs: ["select"], exportAs: ["nxtDateTimeCalendarBody"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
391
- }
392
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: MonthViewComponent, decorators: [{
393
- type: Component,
394
- args: [{ selector: 'nxt-date-time-month-view', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"nxt-dt-calendar-table nxt-dt-calendar-month-table\"\r\n [class.nxt-dt-calendar-only-current-month]=\"hideOtherMonths\">\r\n <thead class=\"nxt-dt-calendar-header\">\r\n <tr class=\"nxt-dt-weekdays\">\r\n <th *ngFor=\"let weekday of weekdays\"\r\n [attr.aria-label]=\"weekday.long\"\r\n class=\"nxt-dt-weekday\"\r\n scope=\"col\">\r\n <span>{{weekday.short}}</span>\r\n </th>\r\n </tr>\r\n <tr>\r\n <th class=\"nxt-dt-calendar-table-divider\"\r\n aria-hidden=\"true\"\r\n colspan=\"7\"></th>\r\n </tr>\r\n </thead>\r\n <tbody nxtDateTimeCalendarBody\r\n role=\"grid\"\r\n [rows]=\"days\"\r\n [todayValue]=\"todayDate ?? undefined\"\r\n [selectedValues]=\"selectedDates\"\r\n [selectMode]=\"selectMode\"\r\n [activeCell]=\"activeCell ?? 0\"\r\n (keydown)=\"handleCalendarKeydown($event)\"\r\n (select)=\"selectCalendarCell($event)\">\r\n </tbody>\r\n</table>\r\n" }]
395
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.DateTimeAdapter }, { type: undefined, decorators: [{
396
- type: Inject,
397
- args: [NXT_DATE_TIME_FORMATS]
398
- }] }], propDecorators: { hideOtherMonths: [{
399
- type: Input
400
- }], firstDayOfWeek: [{
401
- type: Input
402
- }], selectMode: [{
403
- type: Input
404
- }], selected: [{
405
- type: Input
406
- }], selecteds: [{
407
- type: Input
408
- }], pickerMoment: [{
409
- type: Input
410
- }], dateTimeFilter: [{
411
- type: Input
412
- }], min: [{
413
- type: Input
414
- }], max: [{
415
- type: Input
416
- }], selectedChange: [{
417
- type: Output
418
- }], userSelection: [{
419
- type: Output
420
- }], pickerMomentChange: [{
421
- type: Output
422
- }], calendarBodyElm: [{
423
- type: ViewChild,
424
- args: [CalendarBodyComponent, { static: true }]
425
- }], calendarView: [{
426
- type: HostBinding,
427
- args: ['class.nxt-dt-calendar-view']
428
- }] } });
429
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2NhbGVuZGFyLW1vbnRoLXZpZXcvY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2NhbGVuZGFyLW1vbnRoLXZpZXcvY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBR3ZMLE9BQU8sRUFBbUIscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUUzRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0sMENBQTBDLENBQUE7Ozs7O0FBRTlGLGdCQUFnQjtBQUNoQixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFdkIsZ0JBQWdCO0FBQ2hCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQTtBQVN4QixNQUFNLE9BQU8sa0JBQWtCO0lBWTNCLElBQ0ksY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQTtJQUMvQixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsR0FBVztRQUMxQixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFBO1lBRTFCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFB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O2dCQUs5QyxZQUFZO3NCQURmLFdBQVc7dUJBQUMsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IERhdGVUaW1lQWRhcHRlciB9IGZyb20gJy4uLy4uL2NsYXNzL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJ1xyXG5pbXBvcnQgeyBEYXRlVGltZUZvcm1hdHMsIE5YVF9EQVRFX1RJTUVfRk9STUFUUyB9IGZyb20gJy4uLy4uL2NsYXNzL2RhdGUtdGltZS1mb3JtYXQuY2xhc3MnXHJcbmltcG9ydCB7IERhdGVGaWx0ZXIsIFNlbGVjdE1vZGUgfSBmcm9tICcuLi8uLi9jbGFzcy9kYXRlLXRpbWUuY2xhc3MnXHJcbmltcG9ydCB7IENhbGVuZGFyQm9keUNvbXBvbmVudCwgQ2FsZW5kYXJDZWxsIH0gZnJvbSAnLi4vY2FsZW5kYXItYm9keS9jYWxlbmRhci1ib2R5LmNvbXBvbmVudCdcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY29uc3QgREFZU19QRVJfV0VFSyA9IDdcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY29uc3QgV0VFS1NfUEVSX1ZJRVcgPSA2XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbnh0LWRhdGUtdGltZS1tb250aC12aWV3JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1tb250aC12aWV3LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLW1vbnRoLXZpZXcuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIE1vbnRoVmlld0NvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0byBoaWRlIGRhdGVzIGluIG90aGVyIG1vbnRocyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBjdXJyZW50IG1vbnRoXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBoaWRlT3RoZXJNb250aHM6IGJvb2xlYW4gPSBmYWxzZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lIHRoZSBmaXJzdCBkYXkgb2YgYSB3ZWVrXHJcbiAgICAgKiBTdW5kYXk6IDAgfiBTYXR1cmRheTogNlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9maXJzdERheU9mV2VlazogbnVtYmVyID0gMFxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBmaXJzdERheU9mV2VlaygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9maXJzdERheU9mV2Vla1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBmaXJzdERheU9mV2Vlayh2YWw6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh2YWwgPj0gMCAmJiB2YWwgPD0gNiAmJiB2YWwgIT09IHRoaXMuX2ZpcnN0RGF5T2ZXZWVrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0RGF5T2ZXZWVrID0gdmFsXHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVXZWVrRGF5cygpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNlbGVjdCBtb2RlIG9mIHRoZSBwaWNrZXI7XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NlbGVjdE1vZGU6IFNlbGVjdE1vZGUgPSAnc2luZ2xlJ1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBzZWxlY3RNb2RlKCk6IFNlbGVjdE1vZGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RNb2RlXHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNlbGVjdE1vZGUodmFsOiBTZWxlY3RNb2RlKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0TW9kZSA9IHZhbFxyXG4gICAgICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKVxyXG4gICAgICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGUgKi9cclxuICAgIHByaXZhdGUgX3NlbGVjdGVkPzogVFxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBzZWxlY3RlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRcclxuICAgIH1cclxuXHJcbiAgICBzZXQgc2VsZWN0ZWQodmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBvbGRTZWxlY3RlZCA9IHRoaXMuX3NlbGVjdGVkXHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSlcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuZ2V0VmFsaWREYXRlKHZhbHVlKVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzU2FtZURheShvbGRTZWxlY3RlZCwgdGhpcy5fc2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlcygpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NlbGVjdGVkcyA9IG5ldyBBcnJheTxUIHwgdW5kZWZpbmVkPigpXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHNlbGVjdGVkcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRzIHx8IFtdXHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNlbGVjdGVkcyh2YWx1ZXM6IEFycmF5PFQgfCB1bmRlZmluZWQ+KSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRzID0gdmFsdWVzLm1hcCh2ID0+IHtcclxuICAgICAgICAgICAgdiA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHYpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkRGF0ZSh2KVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGVzKClcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9waWNrZXJNb21lbnQ/OiBUXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHBpY2tlck1vbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcGlja2VyTW9tZW50XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHBpY2tlck1vbWVudCh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IG9sZE1vbWVudCA9IHRoaXMuX3BpY2tlck1vbWVudFxyXG4gICAgICAgIHZhbHVlID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpXHJcbiAgICAgICAgdGhpcy5fcGlja2VyTW9tZW50ID1cclxuICAgICAgICAgICAgdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpIHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLm5vdygpXHJcblxyXG4gICAgICAgIHRoaXMuZmlyc3REYXRlT2ZNb250aCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5fcGlja2VyTW9tZW50KSxcclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fcGlja2VyTW9tZW50KSxcclxuICAgICAgICAgICAgMVxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhdGhpcy5pc1NhbWVNb250aChvbGRNb21lbnQsIHRoaXMuX3BpY2tlck1vbWVudCkgJiZcclxuICAgICAgICAgICAgdGhpcy5pbml0aWF0ZWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGZ1bmN0aW9uIHVzZWQgdG8gZmlsdGVyIHdoaWNoIGRhdGVzIGFyZSBzZWxlY3RhYmxlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2RhdGVUaW1lRmlsdGVyPzogRGF0ZUZpbHRlcjxUPlxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBkYXRlVGltZUZpbHRlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVRpbWVGaWx0ZXJcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZGF0ZVRpbWVGaWx0ZXIoZmlsdGVyOiBEYXRlRmlsdGVyPFQ+IHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5fZGF0ZVRpbWVGaWx0ZXIgPSBmaWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKClcclxuICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIG1pbmltdW0gc2VsZWN0YWJsZSBkYXRlICovXHJcbiAgICBwcml2YXRlIF9taW5EYXRlPzogVFxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBtaW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbkRhdGVcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbWluKHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSlcclxuICAgICAgICB0aGlzLl9taW5EYXRlID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpXHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpXHJcbiAgICAgICAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBtYXhpbXVtIHNlbGVjdGFibGUgZGF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4RGF0ZT86IFRcclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgbWF4KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhEYXRlXHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG1heCh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHZhbHVlID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpXHJcbiAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKHZhbHVlKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKClcclxuICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF93ZWVrZGF5cz86IEFycmF5PHsgbG9uZzogc3RyaW5nLCBzaG9ydDogc3RyaW5nLCBuYXJyb3c6IHN0cmluZyB9PlxyXG4gICAgZ2V0IHdlZWtkYXlzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2RheXM/OiBDYWxlbmRhckNlbGxbXVtdXHJcbiAgICBnZXQgZGF5cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF5c1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBhY3RpdmVDZWxsKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBpY2tlck1vbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLnBpY2tlck1vbWVudCkgK1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFJvd09mZnNldCAtXHJcbiAgICAgICAgICAgICAgICAxXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzSW5TaW5nbGVNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdE1vZGUgPT09ICdzaW5nbGUnXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzSW5SYW5nZU1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2UnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2VUbydcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaXJzdERhdGVPZk1vbnRoPzogVFxyXG5cclxuICAgIHByaXZhdGUgbG9jYWxlU3ViPzogU3Vic2NyaXB0aW9uXHJcblxyXG4gICAgcHJpdmF0ZSBpbml0aWF0ZWQgPSBmYWxzZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG1vbnRoIHRoYXQgdG9kYXkgZmFsbHMgb24uXHJcbiAgICAgKi9cclxuICAgIHRvZGF5RGF0ZT86IG51bWJlclxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgdG8gaG9sZCBhbGwgc2VsZWN0ZWREYXRlcycgdmFsdWVcclxuICAgICAqIHRoZSB2YWx1ZSBpcyB0aGUgZGF5IG51bWJlciBpbiBjdXJyZW50IG1vbnRoXHJcbiAgICAgKi9cclxuICAgIHNlbGVjdGVkRGF0ZXM/OiBBcnJheTxudW1iZXIgfCB1bmRlZmluZWQ+XHJcblxyXG4gICAgLy8gdGhlIGluZGV4IG9mIGNlbGwgdGhhdCBjb250YWlucyB0aGUgZmlyc3QgZGF0ZSBvZiB0aGUgbW9udGhcclxuICAgIGZpcnN0Um93T2Zmc2V0OiBudW1iZXIgPSAwXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIG5ldyBkYXRlIGlzIHNlbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFQgfCB1bmRlZmluZWQ+KClcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGFueSBkYXRlIGlzIHNlbGVjdGVkLlxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHJlYWRvbmx5IHVzZXJTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KClcclxuXHJcbiAgICAvKiogRW1pdHMgd2hlbiBhbnkgZGF0ZSBpcyBhY3RpdmF0ZWQgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcmVhZG9ubHkgcGlja2VyTW9tZW50Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpXHJcblxyXG4gICAgLyoqIFRoZSBib2R5IG9mIGNhbGVuZGFyIHRhYmxlICovXHJcbiAgICBAVmlld0NoaWxkKENhbGVuZGFyQm9keUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHByaXZhdGUgY2FsZW5kYXJCb2R5RWxtPzogQ2FsZW5kYXJCb2R5Q29tcG9uZW50XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ueHQtZHQtY2FsZW5kYXItdmlldycpXHJcbiAgICBnZXQgY2FsZW5kYXJWaWV3KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkYXRlVGltZUFkYXB0ZXI6IERhdGVUaW1lQWRhcHRlcjxUPixcclxuICAgICAgICBASW5qZWN0KE5YVF9EQVRFX1RJTUVfRk9STUFUUylcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVUaW1lRm9ybWF0czogRGF0ZVRpbWVGb3JtYXRzXHJcbiAgICApIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVXZWVrRGF5cygpXHJcblxyXG4gICAgICAgIHRoaXMubG9jYWxlU3ViID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIubG9jYWxlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlV2Vla0RheXMoKVxyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKVxyXG4gICAgICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKClcclxuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvY2FsZVN1Yj8udW5zdWJzY3JpYmUoKVxyXG4gICAgICAgIHRoaXMubG9jYWxlU3ViID0gdW5kZWZpbmVkXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgYSBjYWxlbmRhckNlbGwgc2VsZWN0ZWRcclxuICAgICAqL1xyXG4gICAgc2VsZWN0Q2FsZW5kYXJDZWxsKGNlbGw6IENhbGVuZGFyQ2VsbCk6IHZvaWQge1xyXG4gICAgICAgIC8vIENhc2VzIGluIHdoaWNoIHRoZSBkYXRlIHdvdWxkIG5vdCBiZSBzZWxlY3RlZFxyXG4gICAgICAgIC8vIDEsIHRoZSBjYWxlbmRhciBjZWxsIGlzIE5PVCBlbmFibGVkIChpcyBOT1QgdmFsaWQpXHJcbiAgICAgICAgLy8gMiwgdGhlIHNlbGVjdGVkIGRhdGUgaXMgTk9UIGluIGN1cnJlbnQgcGlja2VyJ3MgbW9udGggYW5kIHRoZSBoaWRlT3RoZXJNb250aHMgaXMgZW5hYmxlZFxyXG4gICAgICAgIGlmICghY2VsbC5lbmFibGVkIHx8ICh0aGlzLmhpZGVPdGhlck1vbnRocyAmJiBjZWxsLm91dCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdERhdGUoY2VsbC52YWx1ZSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSBhIG5ldyBkYXRlIHNlbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2VsZWN0RGF0ZShkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkYXlzRGlmZiA9IGRhdGUgLSAxXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhckRheXMoXHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3REYXRlT2ZNb250aCxcclxuICAgICAgICAgICAgZGF5c0RpZmZcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChzZWxlY3RlZClcclxuICAgICAgICB0aGlzLnVzZXJTZWxlY3Rpb24uZW1pdCgpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUga2V5ZG93biBldmVudCBvbiBjYWxlbmRhciBib2R5XHJcbiAgICAgKi9cclxuICAgIGhhbmRsZUNhbGVuZGFyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBtb21lbnRcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmNvZGUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAvLyBtaW51cyAxIGRheVxyXG4gICAgICAgICAgICBjYXNlICdhcnJvd2xlZnQnOlxyXG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIC0xXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgICAgICAvLyBhZGQgMSBkYXlcclxuICAgICAgICAgICAgY2FzZSAnYXJyb3dyaWdodCc6XHJcbiAgICAgICAgICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhckRheXMoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgMVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICAgICAgLy8gbWludXMgMSB3ZWVrXHJcbiAgICAgICAgICAgIGNhc2UgJ2Fycm93dXAnOlxyXG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIC03XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgICAgICAvLyBhZGQgMSB3ZWVrXHJcbiAgICAgICAgICAgIGNhc2UgJ2Fycm93ZG93bic6XHJcbiAgICAgICAgICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhckRheXMoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgN1xyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICAgICAgLy8gbW92ZSB0byBmaXJzdCBkYXkgb2YgY3VycmVudCBtb250aFxyXG4gICAgICAgICAgICBjYXNlICdob21lJzpcclxuICAgICAgICAgICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAxIC0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLnBpY2tlck1vbWVudClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgICAgIC8vIG1vdmUgdG8gbGFzdCBkYXkgb2YgY3VycmVudCBtb250aFxyXG4gICAgICAgICAgICBjYXNlICdlbmQnOlxyXG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKHRoaXMucGlja2VyTW9tZW50KSAtXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLnBpY2tlck1vbWVudClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgICAgIC8vIG1pbnVzIDEgbW9udGggKG9yIDEgeWVhcilcclxuICAgICAgICAgICAgY2FzZSAncGFnZXVwJzpcclxuICAgICAgICAgICAgICAgIG1vbWVudCA9IGV2ZW50LmFsdEtleVxyXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC0xXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAtMVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCAxIG1vbnRoIChvciAxIHllYXIpXHJcbiAgICAgICAgICAgIGNhc2UgJ3BhZ2Vkb3duJzpcclxuICAgICAgICAgICAgICAgIG1vbWVudCA9IGV2ZW50LmFsdEtleVxyXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDFcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDFcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgICAgICAvLyBzZWxlY3QgdGhlIHBpY2tlck1vbWVudFxyXG4gICAgICAgICAgICBjYXNlICdlbnRlcic6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGF0ZVRpbWVGaWx0ZXIgfHwgdGhpcy5kYXRlVGltZUZpbHRlcih0aGlzLnBpY2tlck1vbWVudCwgJ2RhdGUnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLnBpY2tlck1vbWVudClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZvY3VzQWN0aXZlQ2VsbCgpXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGUgdGhlIGNhbGVuZGFyIHdlZWtkYXlzIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVXZWVrRGF5cygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBsb25nV2Vla2RheXMgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbG9uZycpXHJcbiAgICAgICAgY29uc3Qgc2hvcnRXZWVrZGF5cyA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCdzaG9ydCcpXHJcbiAgICAgICAgY29uc3QgbmFycm93V2Vla2RheXMgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbmFycm93JylcclxuICAgICAgICBjb25zdCBmaXJzdERheU9mV2VlayA9IHRoaXMuZmlyc3REYXlPZldlZWtcclxuXHJcbiAgICAgICAgY29uc3Qgd2Vla2RheXMgPSBsb25nV2Vla2RheXMubWFwKChsb25nLCBpKSA9PiAoeyBsb25nLCBzaG9ydDogc2hvcnRXZWVrZGF5c1tpXSwgbmFycm93OiBuYXJyb3dXZWVrZGF5c1tpXSB9KSlcclxuXHJcbiAgICAgICAgdGhpcy5fd2Vla2RheXMgPSB3ZWVrZGF5c1xyXG4gICAgICAgICAgICAuc2xpY2UoZmlyc3REYXlPZldlZWspXHJcbiAgICAgICAgICAgIC5jb25jYXQod2Vla2RheXMuc2xpY2UoMCwgZmlyc3REYXlPZldlZWspKVxyXG5cclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlIHRoZSBjYWxlbmRhciBkYXlzIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVDYWxlbmRhcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucGlja2VyTW9tZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50b2RheURhdGUgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy8gdGhlIGZpcnN0IHdlZWtkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICAgICAgY29uc3Qgc3RhcnRXZWVrZGF5T2ZNb250aCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERheShcclxuICAgICAgICAgICAgdGhpcy5maXJzdERhdGVPZk1vbnRoXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZXZWVrID0gdGhpcy5maXJzdERheU9mV2Vla1xyXG5cclxuICAgICAgICAvLyB0aGUgYW1vdW50IG9mIGRheXMgZnJvbSB0aGUgZmlyc3QgZGF0ZSBvZiB0aGUgbW9udGhcclxuICAgICAgICAvLyBpZiBpdCBpcyA8IDAsIGl0IG1lYW5zIHRoZSBkYXRlIGlzIGluIHByZXZpb3VzIG1vbnRoXHJcbiAgICAgICAgbGV0IGRheXNEaWZmID1cclxuICAgICAgICAgICAgMCAtXHJcbiAgICAgICAgICAgICgoc3RhcnRXZWVrZGF5T2ZNb250aCArIChEQVlTX1BFUl9XRUVLIC0gZmlyc3REYXlPZldlZWspKSAlXHJcbiAgICAgICAgICAgICAgICBEQVlTX1BFUl9XRUVLKVxyXG5cclxuICAgICAgICAvLyB0aGUgaW5kZXggb2YgY2VsbCB0aGF0IGNvbnRhaW5zIHRoZSBmaXJzdCBkYXRlIG9mIHRoZSBtb250aFxyXG4gICAgICAgIHRoaXMuZmlyc3RSb3dPZmZzZXQgPSBNYXRoLmFicyhkYXlzRGlmZilcclxuXHJcbiAgICAgICAgdGhpcy5fZGF5cyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBXRUVLU19QRVJfVklFVzsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdlZWsgPSBbXVxyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IERBWVNfUEVSX1dFRUs7IGorKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0RGF0ZU9mTW9udGgsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF5c0RpZmZcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVDZWxsID0gdGhpcy5jcmVhdGVEYXRlQ2VsbChkYXRlLCBkYXlzRGlmZilcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZGF0ZSBpcyB0b2RheVxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzU2FtZURheShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIubm93KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZGF5RGF0ZSA9IGRheXNEaWZmICsgMVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHdlZWsucHVzaChkYXRlQ2VsbClcclxuICAgICAgICAgICAgICAgIGRheXNEaWZmICs9IDFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9kYXlzLnB1c2god2VlaylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlcygpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIENhbGVuZGFyQ2VsbCBmb3IgZGF5cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVEYXRlQ2VsbChkYXRlOiBULCBkYXlzRGlmZjogbnVtYmVyKTogQ2FsZW5kYXJDZWxsIHtcclxuICAgICAgICAvLyB0b3RhbCBkYXlzIG9mIHRoZSBtb250aFxyXG4gICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoXHJcbiAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGNvbnN0IGRhdGVOdW0gPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXRlKGRhdGUpXHJcbiAgICAgICAgLy8gY29uc3QgZGF0ZU5hbWUgPSB0aGlzLmRhdGVOYW1lc1tkYXRlTnVtIC0gMV07XHJcbiAgICAgICAgY29uc3QgZGF0ZU5hbWUgPSBkYXRlTnVtLnRvU3RyaW5nKClcclxuICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQoXHJcbiAgICAgICAgICAgIGRhdGUsXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRzLmRhdGVBMTF5TGFiZWxcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBkYXRlIGlmIHNlbGVjdGFibGVcclxuICAgICAgICBjb25zdCBlbmFibGVkID0gdGhpcy5pc0RhdGVFbmFibGVkKGRhdGUpXHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGlmIGRhdGUgaXMgbm90IGluIGN1cnJlbnQgbW9udGhcclxuICAgICAgICBjb25zdCBkYXlWYWx1ZSA9IGRheXNEaWZmICsgMVxyXG4gICAgICAgIGNvbnN0IG91dCA9IGRheVZhbHVlIDwgMSB8fCBkYXlWYWx1ZSA+IGRheXNJbk1vbnRoXHJcbiAgICAgICAgY29uc3QgY2VsbENsYXNzID0gJ254dC1kdC1kYXktJyArIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERheShkYXRlKVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3IENhbGVuZGFyQ2VsbChcclxuICAgICAgICAgICAgZGF5VmFsdWUsXHJcbiAgICAgICAgICAgIGRhdGVOYW1lLFxyXG4gICAgICAgICAgICBhcmlhTGFiZWwsXHJcbiAgICAgICAgICAgIGVuYWJsZWQsXHJcbiAgICAgICAgICAgIG91dCxcclxuICAgICAgICAgICAgY2VsbENsYXNzXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaWYgdGhlIGRhdGUgaXMgdmFsaWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc0RhdGVFbmFibGVkKGRhdGU6IFQpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAhIWRhdGUgJiZcclxuICAgICAgICAgICAgKCF0aGlzLmRhdGVUaW1lRmlsdGVyIHx8IHRoaXMuZGF0ZVRpbWVGaWx0ZXIoZGF0ZSwgJ2RhdGUnKSkgJiZcclxuICAgICAgICAgICAgKCF0aGlzLm1pbiB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShkYXRlLCB0aGlzLm1pbikgPj0gMCkgJiZcclxuICAgICAgICAgICAgKCF0aGlzLm1heCB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShkYXRlLCB0aGlzLm1heCkgPD0gMClcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSB2YWxpZCBkYXRlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhbGlkRGF0ZShvYmo6IGFueSk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc0RhdGVJbnN0YW5jZShvYmopICYmXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQob2JqKVxyXG4gICAgICAgICAgICA/IG9ialxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmUgZGF0ZXMgYXJlIGRlZmluZWQgYW5kIGluIHRoZSBzYW1lIG1vbnRoXHJcbiAgICAgKi9cclxuICAgIGlzU2FtZU1vbnRoKGRhdGVMZWZ0PzogVCwgZGF0ZVJpZ2h0PzogVCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhIShcclxuICAgICAgICAgICAgZGF0ZUxlZnQgJiZcclxuICAgICAgICAgICAgZGF0ZVJpZ2h0ICYmXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQoZGF0ZUxlZnQpICYmXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQoZGF0ZVJpZ2h0KSAmJlxyXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKGRhdGVMZWZ0KSA9PT1cclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcihkYXRlUmlnaHQpICYmXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKGRhdGVMZWZ0KSA9PT1cclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZVJpZ2h0KVxyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2VsZWN0ZWREYXRlcyB2YWx1ZS5cclxuICAgICAqIEluIHNpbmdsZSBtb2RlLCBpdCBoYXMgb25seSBvbmUgdmFsdWUgd2hpY2ggcmVwcmVzZW50IHRoZSBzZWxlY3RlZCBkYXRlXHJcbiAgICAgKiBJbiByYW5nZSBtb2RlLCBpdCB3b3VsZCBoYXMgdHdvIHZhbHVlcywgb25lIGZvciB0aGUgZnJvbVZhbHVlIGFuZCB0aGUgb3RoZXIgZm9yIHRoZSB0b1ZhbHVlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0U2VsZWN0ZWREYXRlcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZXMgPSBbXVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZmlyc3REYXRlT2ZNb250aCkge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlICYmIHRoaXMuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF5RGlmZiA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0RGF0ZU9mTW9udGhcclxuICAgICAgICAgICAgKSA/PyAwXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlc1swXSA9IGRheURpZmYgKyAxXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNJblJhbmdlTW9kZSAmJiB0aGlzLnNlbGVjdGVkcykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZXMgPSB0aGlzLnNlbGVjdGVkcy5tYXAoc2VsZWN0ZWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQoc2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5RGlmZiA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3REYXRlT2ZNb250aFxyXG4gICAgICAgICAgICAgICAgICAgICkgPz8gMFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlEaWZmICsgMVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9jdXNBY3RpdmVDZWxsKCkge1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJCb2R5RWxtPy5mb2N1c0FjdGl2ZUNlbGwoKVxyXG4gICAgfVxyXG59XHJcbiIsIjx0YWJsZSBjbGFzcz1cIm54dC1kdC1jYWxlbmRhci10YWJsZSBueHQtZHQtY2FsZW5kYXItbW9udGgtdGFibGVcIlxyXG4gICAgW2NsYXNzLm54dC1kdC1jYWxlbmRhci1vbmx5LWN1cnJlbnQtbW9udGhdPVwiaGlkZU90aGVyTW9udGhzXCI+XHJcbiAgICA8dGhlYWQgY2xhc3M9XCJueHQtZHQtY2FsZW5kYXItaGVhZGVyXCI+XHJcbiAgICAgICAgPHRyIGNsYXNzPVwibnh0LWR0LXdlZWtkYXlzXCI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgd2Vla2RheSBvZiB3ZWVrZGF5c1wiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIndlZWtkYXkubG9uZ1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm54dC1kdC13ZWVrZGF5XCJcclxuICAgICAgICAgICAgICAgIHNjb3BlPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57e3dlZWtkYXkuc2hvcnR9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwibnh0LWR0LWNhbGVuZGFyLXRhYmxlLWRpdmlkZXJcIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIGNvbHNwYW49XCI3XCI+PC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgPC90aGVhZD5cclxuICAgIDx0Ym9keSBueHREYXRlVGltZUNhbGVuZGFyQm9keVxyXG4gICAgICAgIHJvbGU9XCJncmlkXCJcclxuICAgICAgICBbcm93c109XCJkYXlzXCJcclxuICAgICAgICBbdG9kYXlWYWx1ZV09XCJ0b2RheURhdGUgPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICBbc2VsZWN0ZWRWYWx1ZXNdPVwic2VsZWN0ZWREYXRlc1wiXHJcbiAgICAgICAgW3NlbGVjdE1vZGVdPVwic2VsZWN0TW9kZVwiXHJcbiAgICAgICAgW2FjdGl2ZUNlbGxdPVwiYWN0aXZlQ2VsbCA/PyAwXCJcclxuICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVDYWxlbmRhcktleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgKHNlbGVjdCk9XCJzZWxlY3RDYWxlbmRhckNlbGwoJGV2ZW50KVwiPlxyXG4gICAgPC90Ym9keT5cclxuPC90YWJsZT5cclxuIl19