@mintplayer/ng-bootstrap 13.3.3 → 13.3.7

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 (81) hide show
  1. package/_bootstrap.scss +1 -0
  2. package/esm2020/lib/components/calendar/calendar.component.mjs +4 -4
  3. package/esm2020/lib/components/index.mjs +2 -1
  4. package/esm2020/lib/components/navbar/navbar/navbar.component.mjs +2 -2
  5. package/esm2020/lib/components/navbar/navbar-content/navbar-content.directive.mjs +40 -18
  6. package/esm2020/lib/components/offcanvas/components/index.mjs +4 -0
  7. package/esm2020/lib/components/offcanvas/components/offcanvas/offcanvas.component.mjs +62 -0
  8. package/esm2020/lib/components/offcanvas/components/offcanvas-body/offcanvas-body.component.mjs +14 -0
  9. package/esm2020/lib/components/offcanvas/components/offcanvas-header/offcanvas-header.component.mjs +14 -0
  10. package/esm2020/lib/components/offcanvas/directives/index.mjs +2 -0
  11. package/esm2020/lib/components/offcanvas/directives/offcanvas-close/offcanvas-close.directive.mjs +27 -0
  12. package/esm2020/lib/components/offcanvas/index.mjs +7 -0
  13. package/esm2020/lib/components/offcanvas/interfaces/index.mjs +2 -0
  14. package/esm2020/lib/components/offcanvas/interfaces/offcanvas-animation-meta.mjs +2 -0
  15. package/esm2020/lib/components/offcanvas/offcanvas.module.mjs +45 -0
  16. package/esm2020/lib/components/offcanvas/providers/offcanvas-content.provider.mjs +3 -0
  17. package/esm2020/lib/components/offcanvas/services/index.mjs +2 -0
  18. package/esm2020/lib/components/offcanvas/services/offcanvas/offcanvas.service.mjs +72 -0
  19. package/esm2020/lib/components/offcanvas/types/index.mjs +2 -0
  20. package/esm2020/lib/components/offcanvas/types/position.mjs +2 -0
  21. package/esm2020/lib/components/scheduler/components/index.mjs +2 -1
  22. package/esm2020/lib/components/scheduler/components/resource-group-presenter/resource-group-presenter.component.mjs +84 -0
  23. package/esm2020/lib/components/scheduler/components/scheduler/scheduler.component.mjs +197 -72
  24. package/esm2020/lib/components/scheduler/constants/available-scales.mjs +12 -0
  25. package/esm2020/lib/components/scheduler/constants/index.mjs +2 -0
  26. package/esm2020/lib/components/scheduler/enums/index.mjs +2 -0
  27. package/esm2020/lib/components/scheduler/enums/scheduler-mode.mjs +6 -0
  28. package/esm2020/lib/components/scheduler/index.mjs +4 -1
  29. package/esm2020/lib/components/scheduler/interfaces/index.mjs +6 -0
  30. package/esm2020/lib/components/scheduler/interfaces/resource-group.mjs +2 -0
  31. package/esm2020/lib/components/scheduler/interfaces/resource-or-group.mjs +2 -0
  32. package/esm2020/lib/components/scheduler/interfaces/resource.mjs +2 -0
  33. package/esm2020/lib/components/scheduler/interfaces/scheduler-schale.mjs +2 -0
  34. package/esm2020/lib/components/scheduler/interfaces/scheduler-stamp-with-slots.mjs +2 -0
  35. package/esm2020/lib/components/scheduler/interfaces/timeline-options.mjs +2 -0
  36. package/esm2020/lib/components/scheduler/interfaces/week-options.mjs +2 -0
  37. package/esm2020/lib/components/scheduler/scheduler.module.mjs +9 -4
  38. package/esm2020/lib/components/snackbar/service/snackbar.service.mjs +6 -7
  39. package/esm2020/lib/components/snackbar/snackbar.module.mjs +2 -9
  40. package/fesm2015/mintplayer-ng-bootstrap.mjs +553 -106
  41. package/fesm2015/mintplayer-ng-bootstrap.mjs.map +1 -1
  42. package/fesm2020/mintplayer-ng-bootstrap.mjs +550 -106
  43. package/fesm2020/mintplayer-ng-bootstrap.mjs.map +1 -1
  44. package/lib/components/calendar/calendar.component.d.ts +1 -1
  45. package/lib/components/index.d.ts +1 -0
  46. package/lib/components/navbar/navbar-content/navbar-content.directive.d.ts +4 -1
  47. package/lib/components/offcanvas/components/index.d.ts +3 -0
  48. package/lib/components/offcanvas/components/offcanvas/offcanvas.component.d.ts +20 -0
  49. package/lib/components/offcanvas/components/offcanvas-body/offcanvas-body.component.d.ts +8 -0
  50. package/lib/components/offcanvas/components/offcanvas-header/offcanvas-header.component.d.ts +8 -0
  51. package/lib/components/offcanvas/directives/index.d.ts +1 -0
  52. package/lib/components/offcanvas/directives/offcanvas-close/offcanvas-close.directive.d.ts +11 -0
  53. package/lib/components/offcanvas/index.d.ts +6 -0
  54. package/lib/components/offcanvas/interfaces/index.d.ts +1 -0
  55. package/lib/components/offcanvas/interfaces/offcanvas-animation-meta.d.ts +7 -0
  56. package/lib/components/offcanvas/offcanvas.module.d.ts +12 -0
  57. package/lib/components/offcanvas/providers/offcanvas-content.provider.d.ts +2 -0
  58. package/lib/components/offcanvas/services/index.d.ts +1 -0
  59. package/lib/components/offcanvas/services/offcanvas/offcanvas.service.d.ts +13 -0
  60. package/lib/components/offcanvas/types/index.d.ts +1 -0
  61. package/lib/components/offcanvas/types/position.d.ts +1 -0
  62. package/lib/components/scheduler/components/index.d.ts +1 -0
  63. package/lib/components/scheduler/components/resource-group-presenter/resource-group-presenter.component.d.ts +26 -0
  64. package/lib/components/scheduler/components/scheduler/scheduler.component.d.ts +32 -11
  65. package/lib/components/scheduler/constants/available-scales.d.ts +2 -0
  66. package/lib/components/scheduler/constants/index.d.ts +1 -0
  67. package/lib/components/scheduler/enums/index.d.ts +1 -0
  68. package/lib/components/scheduler/enums/scheduler-mode.d.ts +4 -0
  69. package/lib/components/scheduler/index.d.ts +3 -0
  70. package/lib/components/scheduler/interfaces/index.d.ts +5 -0
  71. package/lib/components/scheduler/interfaces/resource-group.d.ts +5 -0
  72. package/lib/components/scheduler/interfaces/resource-or-group.d.ts +6 -0
  73. package/lib/components/scheduler/interfaces/resource.d.ts +5 -0
  74. package/lib/components/scheduler/interfaces/scheduler-schale.d.ts +5 -0
  75. package/lib/components/scheduler/interfaces/scheduler-stamp-with-slots.d.ts +6 -0
  76. package/lib/components/scheduler/interfaces/timeline-options.d.ts +3 -0
  77. package/lib/components/scheduler/interfaces/week-options.d.ts +3 -0
  78. package/lib/components/scheduler/scheduler.module.d.ts +3 -2
  79. package/lib/components/snackbar/service/snackbar.service.d.ts +2 -3
  80. package/package.json +1 -1
  81. package/src/styles/utilities/overflow.scss +10 -0
@@ -1,20 +1,24 @@
1
1
  import { Component, EventEmitter, HostListener, Input, Output, QueryList, ViewChildren } from '@angular/core';
2
2
  import { BehaviorSubject, combineLatest, filter, map, Subject, take, takeUntil } from 'rxjs';
3
+ import { ESchedulerMode } from '../../enums/scheduler-mode';
3
4
  import { BsCalendarMonthService } from '../../../../services/calendar-month/calendar-month.service';
4
5
  import { EDragOperation } from '../../enums/drag-operation';
5
6
  import { BsTimelineService } from '../../services/timeline/timeline.service';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "../../../../services/calendar-month/calendar-month.service";
8
9
  import * as i2 from "../../services/timeline/timeline.service";
9
- import * as i3 from "@angular/common";
10
- import * as i4 from "../../pipes/bs-seconds-today-offset/bs-seconds-today-offset.pipe";
11
- import * as i5 from "../../pipes/bs-seconds-timespan.pipe/bs-seconds-timespan.pipe";
12
- import * as i6 from "../../pipes/day-of-week/day-of-week.pipe";
10
+ import * as i3 from "../resource-group-presenter/resource-group-presenter.component";
11
+ import * as i4 from "@angular/common";
12
+ import * as i5 from "../../pipes/bs-seconds-today-offset/bs-seconds-today-offset.pipe";
13
+ import * as i6 from "../../pipes/bs-seconds-timespan.pipe/bs-seconds-timespan.pipe";
14
+ import * as i7 from "../../pipes/day-of-week/day-of-week.pipe";
13
15
  export class BsSchedulerComponent {
14
16
  constructor(calendarMonthService, timelineService) {
15
17
  this.calendarMonthService = calendarMonthService;
16
18
  this.timelineService = timelineService;
17
- this.events$ = new BehaviorSubject([]);
19
+ this.resources$ = new BehaviorSubject([]);
20
+ this.weekOptions$ = new BehaviorSubject({ unitHeight: 30 });
21
+ this.timelineOptions$ = new BehaviorSubject({ unitWidth: 50 });
18
22
  this.previewEvent$ = new BehaviorSubject(null);
19
23
  this.timeSlotDuration$ = new BehaviorSubject(1800);
20
24
  this.timeSlots$ = new BehaviorSubject([]);
@@ -22,35 +26,66 @@ export class BsSchedulerComponent {
22
26
  this.hoveredTimeSlot$ = new BehaviorSubject(null);
23
27
  this.hoveredEvent$ = new BehaviorSubject(null);
24
28
  this.destroyed$ = new Subject();
25
- //#region UnitHeight
26
- this.unitHeight$ = new BehaviorSubject(40);
27
- this.unitHeightChange = new EventEmitter();
29
+ //#region Mode
30
+ this.modes = ESchedulerMode;
31
+ this.mode$ = new BehaviorSubject(ESchedulerMode.week);
32
+ this.modeChange = new EventEmitter();
33
+ //#endregion
34
+ // //#region Scale
35
+ // scale$ = new BehaviorSubject<SchedulerScale>(availableScales[4]);
36
+ // @Output() public scaleChange = new EventEmitter<SchedulerScale>();
37
+ // public get scale() {
38
+ // return this.scale$.value;
39
+ // }
40
+ // @Input() public set scale(value: SchedulerScale) {
41
+ // this.scale$.next(value);
42
+ // }
43
+ // //#endregion
44
+ //#region WeekOptions
45
+ this.weekOptionsChange = new EventEmitter();
46
+ //#endregion
47
+ //#region TimelineOptions
48
+ this.timelineOptionsChange = new EventEmitter();
28
49
  //#endregion
29
50
  //#region maxInnerHeight
30
51
  this.maxInnerHeight = null;
31
52
  this.operation = null;
32
53
  this.dragStartTimeslot = null;
33
54
  const monday = this.calendarMonthService.getMondayBefore(new Date());
34
- this.currentWeek$ = new BehaviorSubject(monday);
35
- this.daysOfWeek$ = this.currentWeek$.pipe(map((weekMonday) => {
36
- weekMonday.setHours(0);
37
- weekMonday.setMinutes(0);
38
- weekMonday.setSeconds(0);
39
- weekMonday.setMilliseconds(0);
40
- return Array.from(Array(7).keys()).map((x) => this.addDays(weekMonday, x));
55
+ this.currentWeekOrMonth$ = new BehaviorSubject(monday);
56
+ this.shownDays$ = combineLatest([this.currentWeekOrMonth$, this.mode$])
57
+ .pipe(map(([currentDay, mode]) => {
58
+ currentDay.setHours(0);
59
+ currentDay.setMinutes(0);
60
+ currentDay.setSeconds(0);
61
+ currentDay.setMilliseconds(0);
62
+ switch (mode) {
63
+ case ESchedulerMode.week: {
64
+ return Array.from(Array(7).keys()).map((x) => this.addDays(currentDay, x));
65
+ }
66
+ case ESchedulerMode.timeline: {
67
+ const firstDay = new Date(currentDay.getFullYear(), currentDay.getMonth(), 1);
68
+ const daysOfMonth = new Date(currentDay.getFullYear(), currentDay.getMonth() + 1, 0).getDate();
69
+ return Array.from(Array(daysOfMonth).keys()).map((x) => this.addDays(firstDay, x));
70
+ }
71
+ }
41
72
  }));
42
- this.daysOfWeekWithTimestamps$ = this.daysOfWeek$
43
- .pipe(map((daysOfWeek) => {
44
- return { start: daysOfWeek[0].getTime(), end: daysOfWeek[daysOfWeek.length - 1].getTime() + 24 * 60 * 60 * 1000 };
73
+ this.daysOfWeekWithTimestamps$ = this.shownDays$
74
+ .pipe(map((shownDays) => {
75
+ return { start: shownDays[0].getTime(), end: shownDays[shownDays.length - 1].getTime() + 24 * 60 * 60 * 1000 };
45
76
  }));
77
+ this.events$ = this.resources$
78
+ .pipe(map((resourcesOrGroups) => resourcesOrGroups.map(resOrGroup => this.getResourcesForGroup(resOrGroup))))
79
+ .pipe(map(jaggedResources => jaggedResources.reduce((flat, toFlatten) => flat.concat(toFlatten), [])))
80
+ .pipe(map(resources => resources.map(res => res.events)))
81
+ .pipe(map(jaggedEvents => jaggedEvents.reduce((flat, toFlatten) => flat.concat(toFlatten), [])));
82
+ // groups.reduce((flat, toFlatten) => flat.concat(toFlatten.children), [])
46
83
  this.eventParts$ = this.events$.pipe(map((events) => events.map((ev) => this.timelineService.splitInParts(ev))));
47
84
  this.eventPartsForThisWeek$ = combineLatest([
48
85
  this.daysOfWeekWithTimestamps$,
49
86
  this.eventParts$
50
87
  .pipe(map(eventParts => eventParts.map(evp => evp.parts)))
51
- .pipe(map(jaggedParts => {
52
- return jaggedParts.reduce((flat, toFlatten) => flat.concat(toFlatten), []);
53
- }))
88
+ .pipe(map(jaggedParts => jaggedParts.reduce((flat, toFlatten) => flat.concat(toFlatten), [])))
54
89
  ])
55
90
  .pipe(map(([startAndEnd, eventParts]) => {
56
91
  return eventParts.filter(eventPart => {
@@ -99,45 +134,109 @@ export class BsSchedulerComponent {
99
134
  parts: result
100
135
  };
101
136
  }));
102
- combineLatest([this.daysOfWeek$, this.timeSlotDuration$])
103
- .pipe(map(([daysOfWeek, duration]) => {
104
- const timeSlotsPerDay = Math.floor((60 * 60 * 24) / duration);
105
- return Array.from(Array(timeSlotsPerDay).keys()).map((index) => {
106
- const timeSlotStart = new Date(daysOfWeek[0]);
107
- timeSlotStart.setTime(+timeSlotStart.getTime() + index * duration * 1000);
108
- const timeSlotEnd = new Date(timeSlotStart);
109
- timeSlotEnd.setTime(+timeSlotEnd.getTime() + duration * 1000);
110
- return daysOfWeek.map((day) => {
111
- const start = new Date(day);
112
- start.setHours(timeSlotStart.getHours());
113
- start.setMinutes(timeSlotStart.getMinutes());
114
- start.setSeconds(timeSlotStart.getSeconds());
115
- start.setMilliseconds(timeSlotStart.getMilliseconds());
116
- const end = new Date(day);
117
- end.setHours(timeSlotEnd.getHours());
118
- end.setMinutes(timeSlotEnd.getMinutes());
119
- end.setSeconds(timeSlotEnd.getSeconds());
120
- end.setMilliseconds(timeSlotEnd.getMilliseconds());
121
- end.setDate(end.getDate() + timeSlotEnd.getDate() - timeSlotStart.getDate());
122
- return { start, end };
123
- });
124
- });
137
+ combineLatest([this.mode$, this.shownDays$, this.timeSlotDuration$])
138
+ .pipe(filter(([mode, shownDays, duration]) => mode !== null))
139
+ .pipe(map(([mode, shownDays, duration]) => {
140
+ switch (mode) {
141
+ case ESchedulerMode.week: {
142
+ const timeSlotsPerDay = Math.floor((60 * 60 * 24) / duration);
143
+ return Array.from(Array(timeSlotsPerDay).keys()).map((index) => {
144
+ const timeslotForMonday = this.createTimeslot(shownDays[0], index, duration);
145
+ return {
146
+ slots: shownDays.map((day) => {
147
+ const start = new Date(day);
148
+ start.setHours(timeslotForMonday.start.getHours());
149
+ start.setMinutes(timeslotForMonday.start.getMinutes());
150
+ start.setSeconds(timeslotForMonday.start.getSeconds());
151
+ start.setMilliseconds(timeslotForMonday.start.getMilliseconds());
152
+ const end = new Date(day);
153
+ end.setHours(timeslotForMonday.end.getHours());
154
+ end.setMinutes(timeslotForMonday.end.getMinutes());
155
+ end.setSeconds(timeslotForMonday.end.getSeconds());
156
+ end.setMilliseconds(timeslotForMonday.end.getMilliseconds());
157
+ end.setDate(end.getDate() + timeslotForMonday.end.getDate() - timeslotForMonday.start.getDate());
158
+ return { start, end };
159
+ }),
160
+ stamp: timeslotForMonday.start
161
+ };
162
+ });
163
+ }
164
+ case ESchedulerMode.timeline: {
165
+ const totalTimeslots = (24 * 60 * 60) / duration;
166
+ return shownDays.map((day) => {
167
+ return {
168
+ slots: Array.from(Array(totalTimeslots).keys())
169
+ .map((index) => {
170
+ return this.createTimeslot(day, index, duration);
171
+ }),
172
+ stamp: day
173
+ };
174
+ });
175
+ }
176
+ default: {
177
+ throw 'Unknown value for Mode: ' + mode;
178
+ }
179
+ }
125
180
  }))
126
181
  .subscribe((timeslots) => {
127
182
  // For performance reasons, we're not using an observable here, but persist the timeslots in a BehaviorSubject.
128
183
  this.timeSlots$.next(timeslots);
129
184
  });
130
- this.unitHeight$
185
+ this.weekOptions$
131
186
  .pipe(takeUntil(this.destroyed$))
132
- .subscribe((unitHeight) => {
133
- this.unitHeightChange.emit(unitHeight);
187
+ .subscribe((weekOptions) => {
188
+ this.weekOptionsChange.emit(weekOptions);
134
189
  });
190
+ this.timelineOptions$
191
+ .pipe(takeUntil(this.destroyed$))
192
+ .subscribe((timelineOptions) => {
193
+ this.timelineOptionsChange.emit(timelineOptions);
194
+ });
195
+ // combineLatest([this.mode$, this.scale$])
196
+ // .pipe(filter(([mode, scale]) => mode === ESchedulerMode.timeline))
197
+ }
198
+ createTimeslot(date, index, duration) {
199
+ const timeSlotStart = new Date(date);
200
+ timeSlotStart.setTime(+timeSlotStart.getTime() + index * duration * 1000);
201
+ const timeSlotEnd = new Date(timeSlotStart);
202
+ timeSlotEnd.setTime(+timeSlotEnd.getTime() + duration * 1000);
203
+ return { start: timeSlotStart, end: timeSlotEnd };
204
+ }
205
+ getResourcesForGroup(resourceOrGroup) {
206
+ if ('children' in resourceOrGroup) {
207
+ return resourceOrGroup.children
208
+ .map((child) => this.getResourcesForGroup(child))
209
+ .reduce((flat, toFlatten) => flat.concat(toFlatten), []);
210
+ }
211
+ else {
212
+ return [resourceOrGroup];
213
+ }
214
+ }
215
+ get mode() {
216
+ return this.mode$.value;
217
+ }
218
+ set mode(value) {
219
+ this.mode$.next(value);
220
+ }
221
+ get weekOptions() {
222
+ return this.weekOptions$.value;
135
223
  }
136
- get unitHeight() {
137
- return this.unitHeight$.value;
224
+ set weekOptions(value) {
225
+ this.weekOptions$.next(value);
138
226
  }
139
- set unitHeight(value) {
140
- this.unitHeight$.next(value);
227
+ get timelineOptions() {
228
+ return this.timelineOptions$.value;
229
+ }
230
+ set timelineOptions(value) {
231
+ this.timelineOptions$.next(value);
232
+ }
233
+ //#endregion
234
+ //#region Resources
235
+ get resources() {
236
+ return this.resources$.value;
237
+ }
238
+ set resources(value) {
239
+ this.resources$.next(value);
141
240
  }
142
241
  //#endregion
143
242
  addDays(date, days) {
@@ -145,15 +244,25 @@ export class BsSchedulerComponent {
145
244
  result.setDate(result.getDate() + days);
146
245
  return result;
147
246
  }
148
- onPreviousWeek() {
149
- this.currentWeek$
150
- .pipe(map((w) => this.addDays(w, -7)), take(1))
151
- .subscribe((w) => this.currentWeek$.next(w));
247
+ onPreviousWeekOrMonth() {
248
+ this.onChangeWeekOrMonth(false);
152
249
  }
153
- onNextWeek() {
154
- this.currentWeek$
155
- .pipe(map((w) => this.addDays(w, 7)), take(1))
156
- .subscribe((w) => this.currentWeek$.next(w));
250
+ onNextWeekOrMonth() {
251
+ this.onChangeWeekOrMonth(true);
252
+ }
253
+ onChangeWeekOrMonth(next) {
254
+ combineLatest([this.currentWeekOrMonth$, this.mode$])
255
+ .pipe(map(([currentWeekOrMonth, mode]) => {
256
+ switch (mode) {
257
+ case ESchedulerMode.week: {
258
+ return this.addDays(currentWeekOrMonth, (next ? 7 : -7));
259
+ }
260
+ case ESchedulerMode.timeline: {
261
+ return new Date(currentWeekOrMonth.getFullYear(), currentWeekOrMonth.getMonth() + (next ? 1 : -1), 1);
262
+ }
263
+ }
264
+ }), take(1))
265
+ .subscribe((w) => this.currentWeekOrMonth$.next(w));
157
266
  }
158
267
  onHoverEvent(ev) {
159
268
  console.log('hovered', ev);
@@ -253,7 +362,7 @@ export class BsSchedulerComponent {
253
362
  return null;
254
363
  }
255
364
  const column = parseInt(strColumn);
256
- const slot = timeSlots[row][column];
365
+ const slot = timeSlots[row].slots[column];
257
366
  return slot;
258
367
  }
259
368
  onMousemove(ev) {
@@ -361,12 +470,18 @@ export class BsSchedulerComponent {
361
470
  if (previewEvent) {
362
471
  this.operation = null;
363
472
  this.dragStartTimeslot = null;
364
- this.events$.next([...this.events$.value, {
365
- start: previewEvent.start,
366
- end: previewEvent.end,
367
- color: this.randomColor(),
368
- description: 'New event'
369
- }]);
473
+ this.resources$.next([
474
+ ...this.resources$.value,
475
+ {
476
+ description: 'New resource group',
477
+ events: [{
478
+ start: previewEvent.start,
479
+ end: previewEvent.end,
480
+ color: this.randomColor(),
481
+ description: 'New event'
482
+ }]
483
+ }
484
+ ]);
370
485
  this.previewEvent$.next(null);
371
486
  }
372
487
  });
@@ -384,7 +499,7 @@ export class BsSchedulerComponent {
384
499
  this.operation.event.end = previewEvent.end;
385
500
  this.operation = null;
386
501
  this.dragStartTimeslot = null;
387
- this.events$.next(this.events$.value);
502
+ this.resources$.next(this.resources$.value);
388
503
  this.previewEvent$.next(null);
389
504
  }
390
505
  });
@@ -398,19 +513,29 @@ export class BsSchedulerComponent {
398
513
  }
399
514
  }
400
515
  BsSchedulerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: BsSchedulerComponent, deps: [{ token: i1.BsCalendarMonthService }, { token: i2.BsTimelineService }], target: i0.ɵɵFactoryTarget.Component });
401
- BsSchedulerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.0", type: BsSchedulerComponent, selector: "bs-scheduler", inputs: { unitHeight: "unitHeight", maxInnerHeight: "maxInnerHeight" }, outputs: { unitHeightChange: "unitHeightChange" }, host: { listeners: { "document:mousemove": "onMousemove($event)", "document:mouseup": "onMouseUp($event)" } }, viewQueries: [{ propertyName: "timeSlotElements", predicate: ["slot"], descendants: true }], ngImport: i0, template: "<div class=\"table d-flex w-100 overflow-y-auto\" [style.max-height.px]=\"null\">\n <div class=\"calendar-head\">\n <div class=\"w-100 d-flex flex-row\">\n <div class=\"d-flex calendar-left justify-content-between\">\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeek()\">&lt;</button>\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeek()\">&gt;</button>\n </div>\n <div class=\"flex-grow-1 calendar-head-cell\" *ngFor=\"let day of (daysOfWeek$ | async)\">\n <span class=\"d-block col-form-label text-center\">\n <span>{{ day | date: 'dd-MM' }}</span><span class=\"d-none d-lg-inline-block\">-{{ day | date: 'yyyy' }}</span>\n </span>\n </div>\n </div>\n </div>\n <div class=\"calendar-body\" [style.height.px]=\"maxInnerHeight\">\n <div class=\"position-relative\">\n <!-- Timeslots -->\n <div *ngFor=\"let timeslots of (timeSlots$ | async); let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"unitHeight$ | async\">\n <div class=\"calendar-cell calendar-left align-top px-2 py-0\">{{ timeslots[0].start | date: 'HH:mm:ss' }}</div>\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\n </div>\n \n <!-- Events -->\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\n <ng-container *ngIf=\"(unitHeight$ | async) as unitHeight\">\n <ng-container *ngIf=\"(timelinedEventPartsForThisWeek$ | async) as partData\">\n <div *ngFor=\"let eventPart of partData.parts\" class=\"event p-0\"\n [style.top.px]=\"(eventPart.part | bsSecondsTodayOffset) / timeSlotDuration * unitHeight\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart.part | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\"\n [class.hover]=\"(hoveredEvent$ | async) === eventPart.part.event\"\n [style.width]=\"'calc(100% / ' + partData.total + ')'\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * unitHeight\"\n [style.margin-left]=\"'calc(100% / ' + partData.total + ' * ' + eventPart.index + ')'\">\n\n <div class=\"event-resize top\" *ngIf=\"eventPart.part.start === eventPart.part.event?.start\" (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'top')\"></div>\n <div class=\"event-border\"></div>\n <div class=\"event-wrapper\" *ngIf=\"eventPart.part.event\"\n (mousedown)=\"onStartDragEvent(eventPart.part, $event)\"\n (mouseenter)=\"onHoverEvent(eventPart.part.event)\"\n (mouseleave)=\"onLeaveEvent(eventPart.part.event)\">\n <div class=\"event-bg\" [style.background-color]=\"eventPart.part.event.color\"></div>\n <div class=\"event-label\">{{ eventPart.part.event.description }}</div>\n </div>\n <div class=\"event-resize bottom\" *ngIf=\"eventPart.part.end === eventPart.part.event?.end\" (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'bottom')\"></div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(previewEventPartsForThisWeek$ | async) as previewPartData\">\n <div *ngFor=\"let eventPart of previewPartData\" class=\"event preview p-0\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * unitHeight\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner w-100\" [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * unitHeight\"></div>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>", styles: [":host{display:block}.table{flex-flow:column}.table .calendar-head{flex:0 0 auto}.table .calendar-head>div{padding-right:18px}.table .calendar-body{flex:1 1 auto;display:block;overflow-y:scroll;overflow-x:hidden}.table .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.table .calendar-body .calendar-cell.hover{border-top-width:3px}.table .calendar-left{width:90px}.event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:absolute;-webkit-user-select:none;user-select:none;pointer-events:none}.event.preview{background:#666;opacity:.6}.event .event-border{background:black;top:0;left:0;bottom:3px;width:3px;position:absolute;z-index:10;opacity:.3}.event .event-inner{position:relative;left:0px;right:5px;top:0px;bottom:5px;cursor:move;pointer-events:all;overflow:hidden}.event .event-inner .event-wrapper{width:calc(100% - 2px);margin:1px auto 1px 0;height:calc(100% - 3px)}.event .event-inner .event-wrapper .event-bg{opacity:.5;height:100%;transition:opacity .15s ease-in-out}.event .event-inner .event-wrapper .event-label{position:absolute;top:0;font-size:12px;font-weight:600;padding:4px}.event .event-inner .event-resize{position:absolute;cursor:ns-resize;height:4px;left:0;right:0;z-index:400}.event .event-inner .event-resize.top{top:0}.event .event-inner .event-resize.bottom{bottom:0}.event .event-inner .event-resize:hover{background:#DDD}.event .event-inner.hover .event-bg{opacity:.7!important}@media (max-width: 767px){.table .calendar-head .calendar-head-cell{text-orientation:sideways;writing-mode:vertical-rl}}\n"], directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i3.AsyncPipe, "date": i3.DatePipe, "bsSecondsTodayOffset": i4.BsSecondsTodayOffsetPipe, "bsSecondsTimespan": i5.BsSecondsTimespanPipe, "dayOfWeek": i6.DayOfWeekPipe } });
516
+ BsSchedulerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.0", type: BsSchedulerComponent, selector: "bs-scheduler", inputs: { mode: "mode", weekOptions: "weekOptions", timelineOptions: "timelineOptions", maxInnerHeight: "maxInnerHeight", resources: "resources" }, outputs: { modeChange: "modeChange", weekOptionsChange: "weekOptionsChange", timelineOptionsChange: "timelineOptionsChange" }, host: { listeners: { "document:mousemove": "onMousemove($event)", "document:mouseup": "onMouseUp($event)" } }, viewQueries: [{ propertyName: "timeSlotElements", predicate: ["slot"], descendants: true }], ngImport: i0, template: "<div class=\"table d-flex w-100 overflow-y-auto mb-0 week-schedule\" [style.max-height.px]=\"null\"\n *ngIf=\"(mode$ | async) === modes.week\">\n <div class=\"calendar-head\">\n <div class=\"w-100 d-flex flex-row\">\n <div class=\"d-flex calendar-left justify-content-between\">\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeekOrMonth()\">\n <i class=\"bi-chevron-left px-0\"></i>\n </button>\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeekOrMonth()\">\n <i class=\"bi-chevron-right px-0\"></i>\n </button>\n </div>\n <div class=\"flex-grow-1 calendar-head-cell\" *ngFor=\"let day of (shownDays$ | async)\">\n <span class=\"d-block col-form-label text-center\">\n <span>{{ day | date: 'dd-MM' }}</span><span class=\"d-none d-lg-inline-block\">-{{ day | date: 'yyyy' }}</span>\n </span>\n </div>\n </div>\n </div>\n <div class=\"calendar-body\" [style.height.px]=\"maxInnerHeight\">\n <div class=\"position-relative\" *ngIf=\"(timeSlots$ | async) as row\">\n <ng-container *ngIf=\"(weekOptions$ | async) as weekOptions\">\n <!-- Timeslots -->\n <div *ngFor=\"let timeslots of row; let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"weekOptions.unitHeight\">\n <div class=\"calendar-cell calendar-left align-top px-2 py-0\">{{ timeslots.slots[0].start | date: 'HH:mm:ss' }}</div>\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots.slots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\n </div>\n\n <!-- Events -->\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\n <ng-container *ngIf=\"(timelinedEventPartsForThisWeek$ | async) as partData\">\n <div *ngFor=\"let eventPart of partData.parts\" class=\"event p-0\"\n [style.top.px]=\"(eventPart.part | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart.part | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\" [class.hover]=\"(hoveredEvent$ | async) === eventPart.part.event\"\n [style.width]=\"'calc(100% / ' + partData.total + ')'\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.margin-left]=\"'calc(100% / ' + partData.total + ' * ' + eventPart.index + ')'\">\n\n <div class=\"event-resize top\"\n *ngIf=\"eventPart.part.start === eventPart.part.event?.start\"\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'top')\"></div>\n <div class=\"event-border\"></div>\n <div class=\"event-wrapper\" *ngIf=\"eventPart.part.event\"\n (mousedown)=\"onStartDragEvent(eventPart.part, $event)\"\n (mouseenter)=\"onHoverEvent(eventPart.part.event)\"\n (mouseleave)=\"onLeaveEvent(eventPart.part.event)\">\n <div class=\"event-bg\" [style.background-color]=\"eventPart.part.event.color\"></div>\n <div class=\"event-label\">{{ eventPart.part.event.description }}</div>\n </div>\n <div class=\"event-resize bottom\"\n *ngIf=\"eventPart.part.end === eventPart.part.event?.end\"\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'bottom')\"></div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(previewEventPartsForThisWeek$ | async) as previewPartData\">\n <div *ngFor=\"let eventPart of previewPartData\" class=\"event preview p-0\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner w-100\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\">\n </div>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n<div class=\"table d-flex w-100 overflow-y-auto mb-0 bg-white timeline\" *ngIf=\"(mode$ | async) === modes.timeline\">\n <div class=\"calendar-head d-flex\">\n <button class=\"btn flex-start\" (click)=\"onPreviousWeekOrMonth()\">\n <i class=\"bi-chevron-left px-0\"></i>\n </button>\n <div class=\"flex-grow-1 h3 py-2 mb-0 text-center\">{{ currentWeekOrMonth$ | async | date: 'MMMM yyyy' }}</div>\n <button class=\"btn flex-start\" (click)=\"onNextWeekOrMonth()\">\n <i class=\"bi-chevron-right px-0\"></i>\n </button>\n </div>\n <div class=\"calendar-body table-responsive overflow-x-auto\">\n <table class=\"table mb-0\">\n <ng-container *ngIf=\"(timeSlots$ | async) as timeSlots\">\n <tr>\n <td></td>\n <td *ngFor=\"let day of timeSlots\" [attr.colspan]=\"day.slots.length\" class=\"text-center px-2\">\n <span class=\"position-sticky day-label\">{{ day.stamp | date: 'd EE' }}</span>\n </td>\n </tr>\n <tr>\n <td></td>\n <ng-container *ngIf=\"(timelineOptions$ | async) as timelineOptions\">\n <ng-container *ngFor=\"let day of timeSlots\">\n <td *ngFor=\"let slot of day.slots\">\n <span class=\"d-block p-0 text-center\" [style.width.px]=\"timelineOptions.unitWidth\">\n {{ slot.start | date: 'HH:mm' }}\n </span>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n <bs-resource-group-presenter *ngFor=\"let group of (resources$ | async)\" [resourceGroup]=\"group\" [timeSlots]=\"timeSlots\"></bs-resource-group-presenter>\n </ng-container>\n </table>\n </div>\n</div>", styles: [":host{display:block;border:1px solid #333;border-top-right-radius:10px;border-top-left-radius:10px;overflow:hidden}.calendar-head{background:#F7F7F7;color:#007aff}.table .calendar-head{flex:0 0 auto}.table .calendar-body{display:block;flex:1 1 auto}.week-schedule.table{flex-flow:column}.week-schedule.table .calendar-head>div{padding-right:18px}.week-schedule.table .calendar-body{overflow-y:scroll;overflow-x:hidden}.week-schedule.table .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.week-schedule.table .calendar-body .calendar-cell.hover{border-top-width:3px}.week-schedule.table .calendar-left{width:90px}.week-schedule .event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:absolute;-webkit-user-select:none;user-select:none;pointer-events:none}.week-schedule .event.preview{background:#666;opacity:.6}.week-schedule .event .event-border{background:black;top:0;left:0;bottom:3px;width:3px;position:absolute;z-index:10;opacity:.3}.week-schedule .event .event-inner{position:relative;left:0px;right:5px;top:0px;bottom:5px;cursor:move;pointer-events:all;overflow:hidden}.week-schedule .event .event-inner .event-wrapper{width:calc(100% - 2px);margin:1px auto 1px 0;height:calc(100% - 3px)}.week-schedule .event .event-inner .event-wrapper .event-bg{opacity:.5;height:100%;transition:opacity .15s ease-in-out}.week-schedule .event .event-inner .event-wrapper .event-label{position:absolute;top:0;font-size:12px;font-weight:600;padding:4px}.week-schedule .event .event-inner .event-resize{position:absolute;cursor:ns-resize;height:4px;left:0;right:0;z-index:400}.week-schedule .event .event-inner .event-resize.top{top:0}.week-schedule .event .event-inner .event-resize.bottom{bottom:0}.week-schedule .event .event-inner .event-resize:hover{background:#DDD}.week-schedule .event .event-inner.hover .event-bg{opacity:.7!important}@media (max-width: 767px){.week-schedule.table .calendar-head .calendar-head-cell{text-orientation:sideways;writing-mode:vertical-rl}}.timeline.table{flex-flow:column}.timeline .calendar-body .table{background-color:#f7f7f7}.timeline .calendar-body .table tr:first-child td{background-color:#fff;border:1px solid #000}.timeline .calendar-body .table tr:first-child td:first-child{min-width:10rem}.timeline .calendar-body .table tr:first-child span.day-label{left:0;right:0}.timeline .calendar-body .table tr:nth-child(2) td{border-width:1px;border-color:inherit}.timeline .calendar-body .table>:not(:first-child){border-top:none!important}\n"], components: [{ type: i3.ResourceGroupPresenterComponent, selector: "bs-resource-group-presenter", inputs: ["level", "resourceGroup", "timeSlots", "isExpanded"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i4.AsyncPipe, "date": i4.DatePipe, "bsSecondsTodayOffset": i5.BsSecondsTodayOffsetPipe, "bsSecondsTimespan": i6.BsSecondsTimespanPipe, "dayOfWeek": i7.DayOfWeekPipe } });
402
517
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: BsSchedulerComponent, decorators: [{
403
518
  type: Component,
404
- args: [{ selector: 'bs-scheduler', template: "<div class=\"table d-flex w-100 overflow-y-auto\" [style.max-height.px]=\"null\">\n <div class=\"calendar-head\">\n <div class=\"w-100 d-flex flex-row\">\n <div class=\"d-flex calendar-left justify-content-between\">\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeek()\">&lt;</button>\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeek()\">&gt;</button>\n </div>\n <div class=\"flex-grow-1 calendar-head-cell\" *ngFor=\"let day of (daysOfWeek$ | async)\">\n <span class=\"d-block col-form-label text-center\">\n <span>{{ day | date: 'dd-MM' }}</span><span class=\"d-none d-lg-inline-block\">-{{ day | date: 'yyyy' }}</span>\n </span>\n </div>\n </div>\n </div>\n <div class=\"calendar-body\" [style.height.px]=\"maxInnerHeight\">\n <div class=\"position-relative\">\n <!-- Timeslots -->\n <div *ngFor=\"let timeslots of (timeSlots$ | async); let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"unitHeight$ | async\">\n <div class=\"calendar-cell calendar-left align-top px-2 py-0\">{{ timeslots[0].start | date: 'HH:mm:ss' }}</div>\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\n </div>\n \n <!-- Events -->\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\n <ng-container *ngIf=\"(unitHeight$ | async) as unitHeight\">\n <ng-container *ngIf=\"(timelinedEventPartsForThisWeek$ | async) as partData\">\n <div *ngFor=\"let eventPart of partData.parts\" class=\"event p-0\"\n [style.top.px]=\"(eventPart.part | bsSecondsTodayOffset) / timeSlotDuration * unitHeight\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart.part | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\"\n [class.hover]=\"(hoveredEvent$ | async) === eventPart.part.event\"\n [style.width]=\"'calc(100% / ' + partData.total + ')'\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * unitHeight\"\n [style.margin-left]=\"'calc(100% / ' + partData.total + ' * ' + eventPart.index + ')'\">\n\n <div class=\"event-resize top\" *ngIf=\"eventPart.part.start === eventPart.part.event?.start\" (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'top')\"></div>\n <div class=\"event-border\"></div>\n <div class=\"event-wrapper\" *ngIf=\"eventPart.part.event\"\n (mousedown)=\"onStartDragEvent(eventPart.part, $event)\"\n (mouseenter)=\"onHoverEvent(eventPart.part.event)\"\n (mouseleave)=\"onLeaveEvent(eventPart.part.event)\">\n <div class=\"event-bg\" [style.background-color]=\"eventPart.part.event.color\"></div>\n <div class=\"event-label\">{{ eventPart.part.event.description }}</div>\n </div>\n <div class=\"event-resize bottom\" *ngIf=\"eventPart.part.end === eventPart.part.event?.end\" (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'bottom')\"></div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(previewEventPartsForThisWeek$ | async) as previewPartData\">\n <div *ngFor=\"let eventPart of previewPartData\" class=\"event preview p-0\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * unitHeight\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner w-100\" [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * unitHeight\"></div>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>", styles: [":host{display:block}.table{flex-flow:column}.table .calendar-head{flex:0 0 auto}.table .calendar-head>div{padding-right:18px}.table .calendar-body{flex:1 1 auto;display:block;overflow-y:scroll;overflow-x:hidden}.table .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.table .calendar-body .calendar-cell.hover{border-top-width:3px}.table .calendar-left{width:90px}.event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:absolute;-webkit-user-select:none;user-select:none;pointer-events:none}.event.preview{background:#666;opacity:.6}.event .event-border{background:black;top:0;left:0;bottom:3px;width:3px;position:absolute;z-index:10;opacity:.3}.event .event-inner{position:relative;left:0px;right:5px;top:0px;bottom:5px;cursor:move;pointer-events:all;overflow:hidden}.event .event-inner .event-wrapper{width:calc(100% - 2px);margin:1px auto 1px 0;height:calc(100% - 3px)}.event .event-inner .event-wrapper .event-bg{opacity:.5;height:100%;transition:opacity .15s ease-in-out}.event .event-inner .event-wrapper .event-label{position:absolute;top:0;font-size:12px;font-weight:600;padding:4px}.event .event-inner .event-resize{position:absolute;cursor:ns-resize;height:4px;left:0;right:0;z-index:400}.event .event-inner .event-resize.top{top:0}.event .event-inner .event-resize.bottom{bottom:0}.event .event-inner .event-resize:hover{background:#DDD}.event .event-inner.hover .event-bg{opacity:.7!important}@media (max-width: 767px){.table .calendar-head .calendar-head-cell{text-orientation:sideways;writing-mode:vertical-rl}}\n"] }]
519
+ args: [{ selector: 'bs-scheduler', template: "<div class=\"table d-flex w-100 overflow-y-auto mb-0 week-schedule\" [style.max-height.px]=\"null\"\n *ngIf=\"(mode$ | async) === modes.week\">\n <div class=\"calendar-head\">\n <div class=\"w-100 d-flex flex-row\">\n <div class=\"d-flex calendar-left justify-content-between\">\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeekOrMonth()\">\n <i class=\"bi-chevron-left px-0\"></i>\n </button>\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeekOrMonth()\">\n <i class=\"bi-chevron-right px-0\"></i>\n </button>\n </div>\n <div class=\"flex-grow-1 calendar-head-cell\" *ngFor=\"let day of (shownDays$ | async)\">\n <span class=\"d-block col-form-label text-center\">\n <span>{{ day | date: 'dd-MM' }}</span><span class=\"d-none d-lg-inline-block\">-{{ day | date: 'yyyy' }}</span>\n </span>\n </div>\n </div>\n </div>\n <div class=\"calendar-body\" [style.height.px]=\"maxInnerHeight\">\n <div class=\"position-relative\" *ngIf=\"(timeSlots$ | async) as row\">\n <ng-container *ngIf=\"(weekOptions$ | async) as weekOptions\">\n <!-- Timeslots -->\n <div *ngFor=\"let timeslots of row; let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"weekOptions.unitHeight\">\n <div class=\"calendar-cell calendar-left align-top px-2 py-0\">{{ timeslots.slots[0].start | date: 'HH:mm:ss' }}</div>\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots.slots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\n </div>\n\n <!-- Events -->\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\n <ng-container *ngIf=\"(timelinedEventPartsForThisWeek$ | async) as partData\">\n <div *ngFor=\"let eventPart of partData.parts\" class=\"event p-0\"\n [style.top.px]=\"(eventPart.part | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart.part | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\" [class.hover]=\"(hoveredEvent$ | async) === eventPart.part.event\"\n [style.width]=\"'calc(100% / ' + partData.total + ')'\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.margin-left]=\"'calc(100% / ' + partData.total + ' * ' + eventPart.index + ')'\">\n\n <div class=\"event-resize top\"\n *ngIf=\"eventPart.part.start === eventPart.part.event?.start\"\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'top')\"></div>\n <div class=\"event-border\"></div>\n <div class=\"event-wrapper\" *ngIf=\"eventPart.part.event\"\n (mousedown)=\"onStartDragEvent(eventPart.part, $event)\"\n (mouseenter)=\"onHoverEvent(eventPart.part.event)\"\n (mouseleave)=\"onLeaveEvent(eventPart.part.event)\">\n <div class=\"event-bg\" [style.background-color]=\"eventPart.part.event.color\"></div>\n <div class=\"event-label\">{{ eventPart.part.event.description }}</div>\n </div>\n <div class=\"event-resize bottom\"\n *ngIf=\"eventPart.part.end === eventPart.part.event?.end\"\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'bottom')\"></div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(previewEventPartsForThisWeek$ | async) as previewPartData\">\n <div *ngFor=\"let eventPart of previewPartData\" class=\"event preview p-0\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner w-100\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\">\n </div>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n<div class=\"table d-flex w-100 overflow-y-auto mb-0 bg-white timeline\" *ngIf=\"(mode$ | async) === modes.timeline\">\n <div class=\"calendar-head d-flex\">\n <button class=\"btn flex-start\" (click)=\"onPreviousWeekOrMonth()\">\n <i class=\"bi-chevron-left px-0\"></i>\n </button>\n <div class=\"flex-grow-1 h3 py-2 mb-0 text-center\">{{ currentWeekOrMonth$ | async | date: 'MMMM yyyy' }}</div>\n <button class=\"btn flex-start\" (click)=\"onNextWeekOrMonth()\">\n <i class=\"bi-chevron-right px-0\"></i>\n </button>\n </div>\n <div class=\"calendar-body table-responsive overflow-x-auto\">\n <table class=\"table mb-0\">\n <ng-container *ngIf=\"(timeSlots$ | async) as timeSlots\">\n <tr>\n <td></td>\n <td *ngFor=\"let day of timeSlots\" [attr.colspan]=\"day.slots.length\" class=\"text-center px-2\">\n <span class=\"position-sticky day-label\">{{ day.stamp | date: 'd EE' }}</span>\n </td>\n </tr>\n <tr>\n <td></td>\n <ng-container *ngIf=\"(timelineOptions$ | async) as timelineOptions\">\n <ng-container *ngFor=\"let day of timeSlots\">\n <td *ngFor=\"let slot of day.slots\">\n <span class=\"d-block p-0 text-center\" [style.width.px]=\"timelineOptions.unitWidth\">\n {{ slot.start | date: 'HH:mm' }}\n </span>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n <bs-resource-group-presenter *ngFor=\"let group of (resources$ | async)\" [resourceGroup]=\"group\" [timeSlots]=\"timeSlots\"></bs-resource-group-presenter>\n </ng-container>\n </table>\n </div>\n</div>", styles: [":host{display:block;border:1px solid #333;border-top-right-radius:10px;border-top-left-radius:10px;overflow:hidden}.calendar-head{background:#F7F7F7;color:#007aff}.table .calendar-head{flex:0 0 auto}.table .calendar-body{display:block;flex:1 1 auto}.week-schedule.table{flex-flow:column}.week-schedule.table .calendar-head>div{padding-right:18px}.week-schedule.table .calendar-body{overflow-y:scroll;overflow-x:hidden}.week-schedule.table .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.week-schedule.table .calendar-body .calendar-cell.hover{border-top-width:3px}.week-schedule.table .calendar-left{width:90px}.week-schedule .event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:absolute;-webkit-user-select:none;user-select:none;pointer-events:none}.week-schedule .event.preview{background:#666;opacity:.6}.week-schedule .event .event-border{background:black;top:0;left:0;bottom:3px;width:3px;position:absolute;z-index:10;opacity:.3}.week-schedule .event .event-inner{position:relative;left:0px;right:5px;top:0px;bottom:5px;cursor:move;pointer-events:all;overflow:hidden}.week-schedule .event .event-inner .event-wrapper{width:calc(100% - 2px);margin:1px auto 1px 0;height:calc(100% - 3px)}.week-schedule .event .event-inner .event-wrapper .event-bg{opacity:.5;height:100%;transition:opacity .15s ease-in-out}.week-schedule .event .event-inner .event-wrapper .event-label{position:absolute;top:0;font-size:12px;font-weight:600;padding:4px}.week-schedule .event .event-inner .event-resize{position:absolute;cursor:ns-resize;height:4px;left:0;right:0;z-index:400}.week-schedule .event .event-inner .event-resize.top{top:0}.week-schedule .event .event-inner .event-resize.bottom{bottom:0}.week-schedule .event .event-inner .event-resize:hover{background:#DDD}.week-schedule .event .event-inner.hover .event-bg{opacity:.7!important}@media (max-width: 767px){.week-schedule.table .calendar-head .calendar-head-cell{text-orientation:sideways;writing-mode:vertical-rl}}.timeline.table{flex-flow:column}.timeline .calendar-body .table{background-color:#f7f7f7}.timeline .calendar-body .table tr:first-child td{background-color:#fff;border:1px solid #000}.timeline .calendar-body .table tr:first-child td:first-child{min-width:10rem}.timeline .calendar-body .table tr:first-child span.day-label{left:0;right:0}.timeline .calendar-body .table tr:nth-child(2) td{border-width:1px;border-color:inherit}.timeline .calendar-body .table>:not(:first-child){border-top:none!important}\n"] }]
405
520
  }], ctorParameters: function () { return [{ type: i1.BsCalendarMonthService }, { type: i2.BsTimelineService }]; }, propDecorators: { timeSlotElements: [{
406
521
  type: ViewChildren,
407
522
  args: ['slot']
408
- }], unitHeightChange: [{
523
+ }], modeChange: [{
409
524
  type: Output
410
- }], unitHeight: [{
525
+ }], mode: [{
526
+ type: Input
527
+ }], weekOptionsChange: [{
528
+ type: Output
529
+ }], weekOptions: [{
530
+ type: Input
531
+ }], timelineOptionsChange: [{
532
+ type: Output
533
+ }], timelineOptions: [{
411
534
  type: Input
412
535
  }], maxInnerHeight: [{
413
536
  type: Input
537
+ }], resources: [{
538
+ type: Input
414
539
  }], onMousemove: [{
415
540
  type: HostListener,
416
541
  args: ['document:mousemove', ['$event']]
@@ -418,4 +543,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImpor
418
543
  type: HostListener,
419
544
  args: ['document:mouseup', ['$event']]
420
545
  }] } });
421
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvc3JjL2xpYi9jb21wb25lbnRzL3NjaGVkdWxlci9jb21wb25lbnRzL3NjaGVkdWxlci9zY2hlZHVsZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9taW50cGxheWVyLW5nLWJvb3RzdHJhcC9zcmMvbGliL2NvbXBvbmVudHMvc2NoZWR1bGVyL2NvbXBvbmVudHMvc2NoZWR1bGVyL3NjaGVkdWxlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQU8sTUFBTSxNQUFNLENBQUM7QUFDOUcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDcEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBTzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7OztBQU83RSxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLFlBQW9CLG9CQUE0QyxFQUFVLGVBQWtDO1FBQXhGLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBd0I7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBbUI7UUEySDVHLFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBbUIsRUFBRSxDQUFDLENBQUM7UUFLcEQsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBc0IsSUFBSSxD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O3FHQUFwQixvQkFBb0IsMlhDakJqQyxrd0pBNkRNOzJGRDVDTyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsY0FBYzs2SUFtSkYsZ0JBQWdCO3NCQUFyQyxZQUFZO3VCQUFDLE1BQU07Z0JBSUgsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUlhLFVBQVU7c0JBQTdCLEtBQUs7Z0JBS1UsY0FBYztzQkFBN0IsS0FBSztnQkFvSU4sV0FBVztzQkFEVixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTJGOUMsU0FBUztzQkFEUixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJzQ2FsZW5kYXJNb250aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1tb250aC9jYWxlbmRhci1tb250aC5zZXJ2aWNlJztcbmltcG9ydCB7IEVEcmFnT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vZW51bXMvZHJhZy1vcGVyYXRpb24nO1xuaW1wb3J0IHsgRHJhZ09wZXJhdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZHJhZy1vcGVyYXRpb24nO1xuaW1wb3J0IHsgUHJldmlld0V2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wcmV2aWV3LWV2ZW50JztcbmltcG9ydCB7IFNjaGVkdWxlckV2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zY2hlZHVsZXItZXZlbnQnO1xuaW1wb3J0IHsgU2NoZWR1bGVyRXZlbnRQYXJ0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zY2hlZHVsZXItZXZlbnQtcGFydCc7XG5pbXBvcnQgeyBTY2hlZHVsZXJFdmVudFdpdGhQYXJ0cyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2NoZWR1bGVyLWV2ZW50LXdpdGgtcGFydHMnO1xuaW1wb3J0IHsgVGltZVNsb3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3RpbWUtc2xvdCc7XG5pbXBvcnQgeyBCc1RpbWVsaW5lU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpbWVsaW5lL3RpbWVsaW5lLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicy1zY2hlZHVsZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc2NoZWR1bGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2NoZWR1bGVyLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEJzU2NoZWR1bGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjYWxlbmRhck1vbnRoU2VydmljZTogQnNDYWxlbmRhck1vbnRoU2VydmljZSwgcHJpdmF0ZSB0aW1lbGluZVNlcnZpY2U6IEJzVGltZWxpbmVTZXJ2aWNlKSB7XG4gICAgY29uc3QgbW9uZGF5ID0gdGhpcy5jYWxlbmRhck1vbnRoU2VydmljZS5nZXRNb25kYXlCZWZvcmUobmV3IERhdGUoKSk7XG4gICAgdGhpcy5jdXJyZW50V2VlayQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGU+KG1vbmRheSk7XG5cbiAgICB0aGlzLmRheXNPZldlZWskID0gdGhpcy5jdXJyZW50V2VlayQucGlwZShcbiAgICAgIG1hcCgod2Vla01vbmRheSkgPT4ge1xuICAgICAgICB3ZWVrTW9uZGF5LnNldEhvdXJzKDApO1xuICAgICAgICB3ZWVrTW9uZGF5LnNldE1pbnV0ZXMoMCk7XG4gICAgICAgIHdlZWtNb25kYXkuc2V0U2Vjb25kcygwKTtcbiAgICAgICAgd2Vla01vbmRheS5zZXRNaWxsaXNlY29uZHMoMCk7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKEFycmF5KDcpLmtleXMoKSkubWFwKCh4KSA9PiB0aGlzLmFkZERheXMod2Vla01vbmRheSwgeCkpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5kYXlzT2ZXZWVrV2l0aFRpbWVzdGFtcHMkID0gdGhpcy5kYXlzT2ZXZWVrJFxuICAgICAgLnBpcGUobWFwKChkYXlzT2ZXZWVrKSA9PiB7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBkYXlzT2ZXZWVrWzBdLmdldFRpbWUoKSwgZW5kOiBkYXlzT2ZXZWVrW2RheXNPZldlZWsubGVuZ3RoIC0gMV0uZ2V0VGltZSgpICsgMjQgKiA2MCAqIDYwICogMTAwMCB9O1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5ldmVudFBhcnRzJCA9IHRoaXMuZXZlbnRzJC5waXBlKFxuICAgICAgbWFwKChldmVudHMpID0+ICBldmVudHMubWFwKChldikgPT4gdGhpcy50aW1lbGluZVNlcnZpY2Uuc3BsaXRJblBhcnRzKGV2KSkpXG4gICAgKTtcblxuICAgIHRoaXMuZXZlbnRQYXJ0c0ZvclRoaXNXZWVrJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5kYXlzT2ZXZWVrV2l0aFRpbWVzdGFtcHMkLFxuICAgICAgdGhpcy5ldmVudFBhcnRzJFxuICAgICAgICAucGlwZShtYXAoZXZlbnRQYXJ0cyA9PiBldmVudFBhcnRzLm1hcChldnAgPT4gZXZwLnBhcnRzKSkpXG4gICAgICAgIC5waXBlKG1hcChqYWdnZWRQYXJ0cyA9PiB7XG4gICAgICAgICAgcmV0dXJuIGphZ2dlZFBhcnRzLnJlZHVjZSgoZmxhdCwgdG9GbGF0dGVuKSA9PiBmbGF0LmNvbmNhdCh0b0ZsYXR0ZW4pLCBbXSk7XG4gICAgICAgIH0pKVxuICAgICAgXSlcbiAgICAgIC5waXBlKG1hcCgoW3N0YXJ0QW5kRW5kLCBldmVudFBhcnRzXSkgPT4ge1xuICAgICAgICByZXR1cm4gZXZlbnRQYXJ0cy5maWx0ZXIoZXZlbnRQYXJ0ID0+IHtcbiAgICAgICAgICByZXR1cm4gISgoZXZlbnRQYXJ0LmVuZC5nZXRUaW1lKCkgPD0gc3RhcnRBbmRFbmQuc3RhcnQpIHx8IChldmVudFBhcnQuc3RhcnQuZ2V0VGltZSgpID49IHN0YXJ0QW5kRW5kLmVuZCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pKTtcblxuICAgIHRoaXMucHJldmlld0V2ZW50UGFydHMkID0gdGhpcy5wcmV2aWV3RXZlbnQkLnBpcGUoXG4gICAgICBtYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRpbWVsaW5lU2VydmljZS5zcGxpdEluUGFydHMoZXZlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnByZXZpZXdFdmVudFBhcnRzRm9yVGhpc1dlZWskID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXlzT2ZXZWVrV2l0aFRpbWVzdGFtcHMkLCB0aGlzLnByZXZpZXdFdmVudFBhcnRzJF0pXG4gICAgICAucGlwZShtYXAoKFtzdGFydEFuZEVuZCwgcHJldmlld0V2ZW50UGFydHNdKSA9PiB7XG4gICAgICAgIGlmIChwcmV2aWV3RXZlbnRQYXJ0cykge1xuICAgICAgICAgIHJldHVybiBwcmV2aWV3RXZlbnRQYXJ0cy5wYXJ0cy5maWx0ZXIoZXZlbnRQYXJ0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhKChldmVudFBhcnQuZW5kLmdldFRpbWUoKSA8PSBzdGFydEFuZEVuZC5zdGFydCkgfHwgKGV2ZW50UGFydC5zdGFydC5nZXRUaW1lKCkgPj0gc3RhcnRBbmRFbmQuZW5kKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLnRpbWVsaW5lZEV2ZW50UGFydHNGb3JUaGlzV2VlayQgPSB0aGlzLmV2ZW50UGFydHNGb3JUaGlzV2VlayRcbiAgICAgIC5waXBlKG1hcChldmVudFBhcnRzID0+IHtcbiAgICAgICAgLy8gV2UnbGwgb25seSB1c2UgdGhlIGV2ZW50cyBmb3IgdGhpcyB3ZWVrXG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50UGFydHMubWFwKGVwID0+IGVwLmV2ZW50KVxuICAgICAgICAgIC5maWx0ZXIoKGUsIGksIGxpc3QpID0+IGxpc3QuaW5kZXhPZihlKSA9PT0gaSlcbiAgICAgICAgICAuZmlsdGVyKChlKSA9PiAhIWUpXG4gICAgICAgICAgLm1hcCgoZSkgPT4gPFNjaGVkdWxlckV2ZW50PmUpO1xuICAgICAgICBjb25zdCB0aW1lbGluZSA9IHRoaXMudGltZWxpbmVTZXJ2aWNlLmdldFRpbWVsaW5lKGV2ZW50cyk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGltZWxpbmUubWFwKHRyYWNrID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJhY2suZXZlbnRzLm1hcChldiA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBldmVudDogZXYsIGluZGV4OiB0cmFjay5pbmRleCB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbiksIFtdKVxuICAgICAgICAubWFwKChldmkpID0+IGV2ZW50UGFydHMuZmlsdGVyKHAgPT4gcC5ldmVudCA9PT0gZXZpLmV2ZW50KS5tYXAocCA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBwYXJ0OiBwLCBpbmRleDogZXZpLmluZGV4IH07XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbiksIFtdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRvdGFsOiB0aW1lbGluZS5sZW5ndGgsXG4gICAgICAgICAgcGFydHM6IHJlc3VsdFxuICAgICAgICB9O1xuICAgICAgfSkpXG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmRheXNPZldlZWskLCB0aGlzLnRpbWVTbG90RHVyYXRpb24kXSlcbiAgICAgIC5waXBlKG1hcCgoW2RheXNPZldlZWssIGR1cmF0aW9uXSkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lU2xvdHNQZXJEYXkgPSBNYXRoLmZsb29yKCg2MCAqIDYwICogMjQpIC8gZHVyYXRpb24pO1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShBcnJheSh0aW1lU2xvdHNQZXJEYXkpLmtleXMoKSkubWFwKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRpbWVTbG90U3RhcnQgPSBuZXcgRGF0ZShkYXlzT2ZXZWVrWzBdKTtcbiAgICAgICAgICB0aW1lU2xvdFN0YXJ0LnNldFRpbWUoK3RpbWVTbG90U3RhcnQuZ2V0VGltZSgpICsgaW5kZXggKiBkdXJhdGlvbiAqIDEwMDApO1xuICAgICAgICAgIGNvbnN0IHRpbWVTbG90RW5kID0gbmV3IERhdGUodGltZVNsb3RTdGFydCk7XG4gICAgICAgICAgdGltZVNsb3RFbmQuc2V0VGltZSgrdGltZVNsb3RFbmQuZ2V0VGltZSgpICsgZHVyYXRpb24gKiAxMDAwKTtcblxuICAgICAgICAgIHJldHVybiBkYXlzT2ZXZWVrLm1hcCgoZGF5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKGRheSk7XG4gICAgICAgICAgICBzdGFydC5zZXRIb3Vycyh0aW1lU2xvdFN0YXJ0LmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgc3RhcnQuc2V0TWludXRlcyh0aW1lU2xvdFN0YXJ0LmdldE1pbnV0ZXMoKSk7XG4gICAgICAgICAgICBzdGFydC5zZXRTZWNvbmRzKHRpbWVTbG90U3RhcnQuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgICAgIHN0YXJ0LnNldE1pbGxpc2Vjb25kcyh0aW1lU2xvdFN0YXJ0LmdldE1pbGxpc2Vjb25kcygpKTtcblxuICAgICAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoZGF5KTtcbiAgICAgICAgICAgIGVuZC5zZXRIb3Vycyh0aW1lU2xvdEVuZC5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIGVuZC5zZXRNaW51dGVzKHRpbWVTbG90RW5kLmdldE1pbnV0ZXMoKSk7XG4gICAgICAgICAgICBlbmQuc2V0U2Vjb25kcyh0aW1lU2xvdEVuZC5nZXRTZWNvbmRzKCkpO1xuICAgICAgICAgICAgZW5kLnNldE1pbGxpc2Vjb25kcyh0aW1lU2xvdEVuZC5nZXRNaWxsaXNlY29uZHMoKSk7XG4gICAgICAgICAgICBlbmQuc2V0RGF0ZShlbmQuZ2V0RGF0ZSgpICsgdGltZVNsb3RFbmQuZ2V0RGF0ZSgpIC0gdGltZVNsb3RTdGFydC5nZXREYXRlKCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gPFRpbWVTbG90Pnsgc3RhcnQsIGVuZCB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pKVxuICAgICAgLnN1YnNjcmliZSgodGltZXNsb3RzKSA9PiB7XG4gICAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSdyZSBub3QgdXNpbmcgYW4gb2JzZXJ2YWJsZSBoZXJlLCBidXQgcGVyc2lzdCB0aGUgdGltZXNsb3RzIGluIGEgQmVoYXZpb3JTdWJqZWN0LlxuICAgICAgICB0aGlzLnRpbWVTbG90cyQubmV4dCh0aW1lc2xvdHMpO1xuICAgICAgfSk7XG4gICAgXG4gICAgdGhpcy51bml0SGVpZ2h0JFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKCh1bml0SGVpZ2h0KSA9PiB7XG4gICAgICAgIHRoaXMudW5pdEhlaWdodENoYW5nZS5lbWl0KHVuaXRIZWlnaHQpO1xuICAgICAgfSlcbiAgfVxuXG4gIGV2ZW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjaGVkdWxlckV2ZW50W10+KFtdKTtcbiAgZXZlbnRQYXJ0cyQ6IE9ic2VydmFibGU8U2NoZWR1bGVyRXZlbnRXaXRoUGFydHNbXT47XG4gIGV2ZW50UGFydHNGb3JUaGlzV2VlayQ6IE9ic2VydmFibGU8U2NoZWR1bGVyRXZlbnRQYXJ0W10+O1xuICB0aW1lbGluZWRFdmVudFBhcnRzRm9yVGhpc1dlZWskOiBPYnNlcnZhYmxlPHsgdG90YWw6IG51bWJlciwgcGFydHM6IHsgcGFydDogU2NoZWR1bGVyRXZlbnRQYXJ0LCBpbmRleDogbnVtYmVyfVtdIH0+O1xuICBcbiAgcHJldmlld0V2ZW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJldmlld0V2ZW50IHwgbnVsbD4obnVsbCk7XG4gIHByZXZpZXdFdmVudFBhcnRzJDogT2JzZXJ2YWJsZTxTY2hlZHVsZXJFdmVudFdpdGhQYXJ0cyB8IG51bGw+O1xuICBwcmV2aWV3RXZlbnRQYXJ0c0ZvclRoaXNXZWVrJDogT2JzZXJ2YWJsZTxTY2hlZHVsZXJFdmVudFBhcnRbXT47XG4gIFxuICBjdXJyZW50V2VlayQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlPjtcbiAgZGF5c09mV2VlayQ6IE9ic2VydmFibGU8RGF0ZVtdPjtcbiAgZGF5c09mV2Vla1dpdGhUaW1lc3RhbXBzJDogT2JzZXJ2YWJsZTx7c3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXJ9PjtcbiAgdGltZVNsb3REdXJhdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMTgwMCk7XG4gIHRpbWVTbG90cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRpbWVTbG90W11bXT4oW10pO1xuICBtb3VzZVN0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBob3ZlcmVkVGltZVNsb3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUaW1lU2xvdCB8IG51bGw+KG51bGwpO1xuICBob3ZlcmVkRXZlbnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTY2hlZHVsZXJFdmVudCB8IG51bGw+KG51bGwpO1xuICBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3QoKTtcblxuICBAVmlld0NoaWxkcmVuKCdzbG90JykgdGltZVNsb3RFbGVtZW50cyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj47XG5cbiAgLy8jcmVnaW9uIFVuaXRIZWlnaHRcbiAgdW5pdEhlaWdodCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oNDApO1xuICBAT3V0cHV0KCkgcHVibGljIHVuaXRIZWlnaHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgcHVibGljIGdldCB1bml0SGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLnVuaXRIZWlnaHQkLnZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdW5pdEhlaWdodCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy51bml0SGVpZ2h0JC5uZXh0KHZhbHVlKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cbiAgLy8jcmVnaW9uIG1heElubmVySGVpZ2h0XG4gIEBJbnB1dCgpIHB1YmxpYyBtYXhJbm5lckhlaWdodDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHByaXZhdGUgYWRkRGF5cyhkYXRlOiBEYXRlLCBkYXlzOiBudW1iZXIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICByZXN1bHQuc2V0RGF0ZShyZXN1bHQuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG9uUHJldmlvdXNXZWVrKCkge1xuICAgIHRoaXMuY3VycmVudFdlZWskXG4gICAgICAucGlwZShtYXAoKHcpID0+IHRoaXMuYWRkRGF5cyh3LCAtNykpLCB0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgodykgPT4gdGhpcy5jdXJyZW50V2VlayQubmV4dCh3KSk7XG4gIH1cblxuICBvbk5leHRXZWVrKCkge1xuICAgIHRoaXMuY3VycmVudFdlZWskXG4gICAgICAucGlwZShtYXAoKHcpID0+IHRoaXMuYWRkRGF5cyh3LCA3KSksIHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCh3KSA9PiB0aGlzLmN1cnJlbnRXZWVrJC5uZXh0KHcpKTtcbiAgfVxuXG4gIG9uSG92ZXJFdmVudChldjogU2NoZWR1bGVyRXZlbnQgfCBudWxsKSB7XG4gICAgY29uc29sZS5sb2coJ2hvdmVyZWQnLCBldik7XG4gICAgdGhpcy5ob3ZlcmVkRXZlbnQkLm5leHQoZXYpO1xuICB9XG5cbiAgb25MZWF2ZUV2ZW50KGV2OiBTY2hlZHVsZXJFdmVudCB8IG51bGwpIHtcbiAgICB0aGlzLmhvdmVyZWRFdmVudCQubmV4dChudWxsKTtcbiAgfVxuXG4gIG9wZXJhdGlvbjogRHJhZ09wZXJhdGlvbiB8IG51bGwgPSBudWxsO1xuICBkcmFnU3RhcnRUaW1lc2xvdDogVGltZVNsb3QgfCBudWxsID0gbnVsbDtcbiAgb25DcmVhdGVFdmVudChldjogTW91c2VFdmVudCwgc2xvdDogVGltZVNsb3QpIHtcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubW91c2VTdGF0ZSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRyYWdTdGFydFRpbWVzbG90ID0gc2xvdDtcbiAgICB0aGlzLm9wZXJhdGlvbiA9IHtcbiAgICAgIG9wZXJhdGlvbjogRURyYWdPcGVyYXRpb24uY3JlYXRlRXZlbnQsXG4gICAgICBldmVudDoge1xuICAgICAgICBzdGFydDogc2xvdC5zdGFydCxcbiAgICAgICAgZW5kOiBzbG90LmVuZCxcbiAgICAgICAgY29sb3I6ICcjRjAwJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdUZXN0IGV2ZW50JyxcbiAgICAgIH0sXG4gICAgICBtZXRhOiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoeyBzdGFydDogc2xvdC5zdGFydCwgZW5kOiBzbG90LmVuZCB9KTtcbiAgfVxuXG4gIHJhbmRvbUNvbG9yKCkge1xuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAxMjg7XG4gICAgcmV0dXJuICcjJyArIHRoaXMucmFuZG9tQ2hhbm5lbChicmlnaHRuZXNzKSArIHRoaXMucmFuZG9tQ2hhbm5lbChicmlnaHRuZXNzKSArIHRoaXMucmFuZG9tQ2hhbm5lbChicmlnaHRuZXNzKTtcbiAgfVxuICByYW5kb21DaGFubmVsKGJyaWdodG5lc3M6IG51bWJlcil7XG4gICAgY29uc3QgciA9IDI1NS1icmlnaHRuZXNzO1xuICAgIGNvbnN0IG4gPSAwfCgoTWF0aC5yYW5kb20oKSAqIHIpICsgYnJpZ2h0bmVzcyk7XG4gICAgY29uc3QgcyA9IG4udG9TdHJpbmcoMTYpO1xuICAgIHJldHVybiAocy5sZW5ndGg9PTEpID8gJzAnK3MgOiBzO1xuICB9XG5cbiAgb25TdGFydERyYWdFdmVudChldmVudFBhcnQ6IFNjaGVkdWxlckV2ZW50UGFydCwgZXY6IE1vdXNlRXZlbnQpIHtcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuaG92ZXJlZFRpbWVTbG90JC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoaG92ZXJlZFRpbWVTbG90KSA9PiB7XG4gICAgICBpZiAoZXZlbnRQYXJ0LmV2ZW50KSB7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgPSBob3ZlcmVkVGltZVNsb3Q7XG4gICAgICAgIHRoaXMub3BlcmF0aW9uID0ge1xuICAgICAgICAgIG9wZXJhdGlvbjogRURyYWdPcGVyYXRpb24ubW92ZUV2ZW50LFxuICAgICAgICAgIGV2ZW50OiBldmVudFBhcnQuZXZlbnQsXG4gICAgICAgICAgbWV0YTogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoeyBzdGFydDogZXZlbnRQYXJ0LmV2ZW50LnN0YXJ0LCBlbmQ6IGV2ZW50UGFydC5ldmVudC5lbmQgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblN0YXJ0UmVzaXplRXZlbnQoZXZlbnQ6IFNjaGVkdWxlckV2ZW50IHwgbnVsbCwgcG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbScpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgICAgY2FzZSAndG9wJzoge1xuICAgICAgICAgIHRoaXMub3BlcmF0aW9uID0ge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBFRHJhZ09wZXJhdGlvbi5yZXNpemVFdmVudCxcbiAgICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICAgIG1ldGE6IHsgcG9zaXRpb24gfSxcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoeyBzdGFydDogZXZlbnQuc3RhcnQsIGVuZDogZXZlbnQuZW5kIH0pO1xuICAgICAgICB9IGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20nOiB7XG4gICAgICAgICAgdGhpcy5vcGVyYXRpb24gPSB7XG4gICAgICAgICAgICBvcGVyYXRpb246IEVEcmFnT3BlcmF0aW9uLnJlc2l6ZUV2ZW50LFxuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgbWV0YTogeyBwb3NpdGlvbiB9LFxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCQubmV4dCh7IHN0YXJ0OiBldmVudC5zdGFydCwgZW5kOiBldmVudC5lbmQgfSk7XG4gICAgICAgIH0gYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8jcmVnaW9uIGhvdmVyZWRUaW1lc2xvdCRcbiAgcHJpdmF0ZSBnZXRIb3ZlcmVkVGltZXNsb3QoZXY6IE1vdXNlRXZlbnQsIHRpbWVTbG90czogVGltZVNsb3RbXVtdKSB7XG4gICAgY29uc3QgaG92ZXJlZFNsb3RzID0gdGhpcy50aW1lU2xvdEVsZW1lbnRzLmZpbHRlcigoZWwpID0+IHtcbiAgICAgIGNvbnN0IHJjdCA9IGVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAocmN0LmxlZnQgPD0gZXYueCAmJiBldi54IDw9IHJjdC5yaWdodCAmJiByY3QudG9wIDw9IGV2LnkgJiYgZXYueSA8PSByY3QuYm90dG9tKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFob3ZlcmVkU2xvdHMgfHwgaG92ZXJlZFNsb3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc2xvdEVsZW1lbnQgPSBob3ZlcmVkU2xvdHNbMF0ubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnN0IHN0clJvdyA9IHNsb3RFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yb3cnKTtcbiAgICBpZiAoIXN0clJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJvdyA9IHBhcnNlSW50KHN0clJvdyk7XG5cbiAgICBjb25zdCBzdHJDb2x1bW4gPSBzbG90RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29sdW1uJyk7XG4gICAgaWYgKCFzdHJDb2x1bW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW4gPSBwYXJzZUludChzdHJDb2x1bW4pO1xuXG4gICAgY29uc3Qgc2xvdCA9IHRpbWVTbG90c1tyb3ddW2NvbHVtbl07XG4gICAgcmV0dXJuIHNsb3Q7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZW1vdmUnLCBbJyRldmVudCddKVxuICBvbk1vdXNlbW92ZShldjogTW91c2VFdmVudCkge1xuICAgIHRoaXMudGltZVNsb3RzJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgodGltZVNsb3RzKSA9PiB7XG4gICAgICBjb25zdCBob3ZlcmVkID0gdGhpcy5nZXRIb3ZlcmVkVGltZXNsb3QoZXYsIHRpbWVTbG90cyk7XG4gICAgICB0aGlzLmhvdmVyZWRUaW1lU2xvdCQubmV4dChob3ZlcmVkKTtcblxuICAgICAgaWYgKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5vcGVyYXRpb24ub3BlcmF0aW9uKSB7XG4gICAgICAgICAgY2FzZSBFRHJhZ09wZXJhdGlvbi5jcmVhdGVFdmVudDoge1xuICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uLmV2ZW50ICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgJiYgaG92ZXJlZCAmJiAodGhpcy5vcGVyYXRpb24uZXZlbnQuZW5kLmdldFRpbWUoKSAhPSBob3ZlcmVkLmVuZC5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0LmdldFRpbWUoKSA9PT0gaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICAvLyAxIHNsb3RcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0LmdldFRpbWUoKSA8IGhvdmVyZWQuc3RhcnQuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRHJhZyBkb3duXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkXG4gICAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2KSA9PiAhIWV2ICYmICEhdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkpXG4gICAgICAgICAgICAgICAgICAucGlwZShtYXAoKGV2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldiAmJiB0aGlzLmRyYWdTdGFydFRpbWVzbG90KSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuc3RhcnQgPSB0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgIGV2LmVuZCA9IGhvdmVyZWQuZW5kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldjtcbiAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2KSA9PiB0aGlzLnByZXZpZXdFdmVudCQubmV4dChldikpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpID4gaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBEcmFnIHVwXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkXG4gICAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2KSA9PiAhIWV2ICYmICEhdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkpXG4gICAgICAgICAgICAgICAgICAucGlwZShtYXAoKGV2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldiAmJiB0aGlzLmRyYWdTdGFydFRpbWVzbG90KSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuc3RhcnQgPSBob3ZlcmVkLnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgIGV2LmVuZCA9IHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QuZW5kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldjtcbiAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2KSA9PiB0aGlzLnByZXZpZXdFdmVudCQubmV4dChldikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLm1vdmVFdmVudDoge1xuICAgICAgICAgICAgaWYgKGhvdmVyZWQgJiYgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkge1xuICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCRcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2KSA9PiAhIWV2ICYmICEhdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkpXG4gICAgICAgICAgICAgICAgLnBpcGUobWFwKChldikgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGV2ICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gIDxQcmV2aWV3RXZlbnQ+e1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBuZXcgRGF0ZShldi5zdGFydC5nZXRUaW1lKCkgKyBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSAtIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG5ldyBEYXRlKGV2LmVuZC5nZXRUaW1lKCkgKyBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSAtIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IGhvdmVyZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZXYgPT4gdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoZXYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGJyZWFrO1xuICAgICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24ucmVzaXplRXZlbnQ6IHtcbiAgICAgICAgICAgIGlmIChob3ZlcmVkKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JFxuICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZXYpID0+ICEhZXYpKVxuICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXYpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChldiAmJiB0aGlzLm9wZXJhdGlvbiAmJiB0aGlzLm9wZXJhdGlvbi5ldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb24ubWV0YS5wb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBldi5zdGFydCA9IGhvdmVyZWQuc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuZW5kID0gdGhpcy5vcGVyYXRpb24uZXZlbnQuZW5kO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3BlcmF0aW9uLm1ldGEucG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuc3RhcnQgPSB0aGlzLm9wZXJhdGlvbi5ldmVudC5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICBldi5lbmQgPSBob3ZlcmVkLmVuZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2O1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXYpID0+IHRoaXMucHJldmlld0V2ZW50JC5uZXh0KGV2KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIG9uTW91c2VVcChldjogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLm9wZXJhdGlvbikge1xuICAgICAgc3dpdGNoICh0aGlzLm9wZXJhdGlvbi5vcGVyYXRpb24pIHtcbiAgICAgICAgY2FzZSBFRHJhZ09wZXJhdGlvbi5jcmVhdGVFdmVudDoge1xuICAgICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMucHJldmlld0V2ZW50JF0pXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW3ByZXZpZXdFdmVudF0pID0+IHtcbiAgICAgICAgICAgICAgaWYgKHByZXZpZXdFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydFRpbWVzbG90ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cyQubmV4dChbLi4udGhpcy5ldmVudHMkLnZhbHVlLCB7XG4gICAgICAgICAgICAgICAgICBzdGFydDogcHJldmlld0V2ZW50LnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgZW5kOiBwcmV2aWV3RXZlbnQuZW5kLFxuICAgICAgICAgICAgICAgICAgY29sb3I6IHRoaXMucmFuZG9tQ29sb3IoKSxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTmV3IGV2ZW50J1xuICAgICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCQubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24ubW92ZUV2ZW50OlxuICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLnJlc2l6ZUV2ZW50OiB7XG4gICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2KSA9PiAhIWV2KSlcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChwcmV2aWV3RXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uICYmIHRoaXMub3BlcmF0aW9uLmV2ZW50ICYmIHByZXZpZXdFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uLmV2ZW50LnN0YXJ0ID0gcHJldmlld0V2ZW50LnN0YXJ0O1xuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uLmV2ZW50LmVuZCA9IHByZXZpZXdFdmVudC5lbmQ7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzJC5uZXh0KHRoaXMuZXZlbnRzJC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KHRydWUpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFibGUgZC1mbGV4IHctMTAwIG92ZXJmbG93LXktYXV0b1wiIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cIm51bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItaGVhZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNhbGVuZGFyLWxlZnQganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGZsZXgtc3RhcnRcIiAoY2xpY2spPVwib25QcmV2aW91c1dlZWsoKVwiPiZsdDs8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGZsZXgtZW5kXCIgKGNsaWNrKT1cIm9uTmV4dFdlZWsoKVwiPiZndDs8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xIGNhbGVuZGFyLWhlYWQtY2VsbFwiICpuZ0Zvcj1cImxldCBkYXkgb2YgKGRheXNPZldlZWskIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWJsb2NrIGNvbC1mb3JtLWxhYmVsIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRheSB8IGRhdGU6ICdkZC1NTScgfX08L3NwYW4+PHNwYW4gY2xhc3M9XCJkLW5vbmUgZC1sZy1pbmxpbmUtYmxvY2tcIj4te3sgZGF5IHwgZGF0ZTogJ3l5eXknIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItYm9keVwiIFtzdHlsZS5oZWlnaHQucHhdPVwibWF4SW5uZXJIZWlnaHRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICA8IS0tIFRpbWVzbG90cyAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRpbWVzbG90cyBvZiAodGltZVNsb3RzJCB8IGFzeW5jKTsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IHAtMCB0aW1lc2xvdFwiIFtzdHlsZS5oZWlnaHQucHhdPVwidW5pdEhlaWdodCQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1jZWxsIGNhbGVuZGFyLWxlZnQgYWxpZ24tdG9wIHB4LTIgcHktMFwiPnt7IHRpbWVzbG90c1swXS5zdGFydCB8IGRhdGU6ICdISDptbTpzcycgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY2VsbCBmbGV4LWdyb3ctMVwiICpuZ0Zvcj1cImxldCBzbG90IG9mIHRpbWVzbG90czsgbGV0IGogPSBpbmRleFwiICNzbG90IChtb3VzZWRvd24pPVwib25DcmVhdGVFdmVudCgkZXZlbnQsIHNsb3QpXCIgW2F0dHIuZGF0YS1yb3ddPVwiaVwiIFthdHRyLmRhdGEtY29sdW1uXT1cImpcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8IS0tIEV2ZW50cyAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodGltZVNsb3REdXJhdGlvbiQgfCBhc3luYykgYXMgdGltZVNsb3REdXJhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodW5pdEhlaWdodCQgfCBhc3luYykgYXMgdW5pdEhlaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHRpbWVsaW5lZEV2ZW50UGFydHNGb3JUaGlzV2VlayQgfCBhc3luYykgYXMgcGFydERhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGV2ZW50UGFydCBvZiBwYXJ0RGF0YS5wYXJ0c1wiIGNsYXNzPVwiZXZlbnQgcC0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cIihldmVudFBhcnQucGFydCB8IGJzU2Vjb25kc1RvZGF5T2Zmc2V0KSAvIHRpbWVTbG90RHVyYXRpb24gKiB1bml0SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQucGFydCB8IGJzU2Vjb25kc1RpbWVzcGFuKSAvIHRpbWVTbG90RHVyYXRpb24gKiB1bml0SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdF09XCInY2FsYyg5MHB4ICsgKCgxMDAlIC0gOTBweCkgLyA3ICogJyArICgoZXZlbnRQYXJ0LnBhcnQgfCBkYXlPZldlZWspIC0gMSkgKyAnKSknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LWlubmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhvdmVyXT1cIihob3ZlcmVkRXZlbnQkIHwgYXN5bmMpID09PSBldmVudFBhcnQucGFydC5ldmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInY2FsYygxMDAlIC8gJyArIHBhcnREYXRhLnRvdGFsICsgJyknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCIoZXZlbnRQYXJ0LnBhcnQgfCBic1NlY29uZHNUaW1lc3BhbikgLyB0aW1lU2xvdER1cmF0aW9uICogdW5pdEhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW4tbGVmdF09XCInY2FsYygxMDAlIC8gJyArIHBhcnREYXRhLnRvdGFsICsgJyAqICcgKyBldmVudFBhcnQuaW5kZXggKyAnKSdcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtcmVzaXplIHRvcFwiICpuZ0lmPVwiZXZlbnRQYXJ0LnBhcnQuc3RhcnQgPT09IGV2ZW50UGFydC5wYXJ0LmV2ZW50Py5zdGFydFwiIChtb3VzZWRvd24pPVwib25TdGFydFJlc2l6ZUV2ZW50KGV2ZW50UGFydC5wYXJ0LmV2ZW50LCAndG9wJylcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LWJvcmRlclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtd3JhcHBlclwiICpuZ0lmPVwiZXZlbnRQYXJ0LnBhcnQuZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblN0YXJ0RHJhZ0V2ZW50KGV2ZW50UGFydC5wYXJ0LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uSG92ZXJFdmVudChldmVudFBhcnQucGFydC5ldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25MZWF2ZUV2ZW50KGV2ZW50UGFydC5wYXJ0LmV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LWJnXCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiZXZlbnRQYXJ0LnBhcnQuZXZlbnQuY29sb3JcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1sYWJlbFwiPnt7IGV2ZW50UGFydC5wYXJ0LmV2ZW50LmRlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtcmVzaXplIGJvdHRvbVwiICpuZ0lmPVwiZXZlbnRQYXJ0LnBhcnQuZW5kID09PSBldmVudFBhcnQucGFydC5ldmVudD8uZW5kXCIgKG1vdXNlZG93bik9XCJvblN0YXJ0UmVzaXplRXZlbnQoZXZlbnRQYXJ0LnBhcnQuZXZlbnQsICdib3R0b20nKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHByZXZpZXdFdmVudFBhcnRzRm9yVGhpc1dlZWskIHwgYXN5bmMpIGFzIHByZXZpZXdQYXJ0RGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXZlbnRQYXJ0IG9mIHByZXZpZXdQYXJ0RGF0YVwiIGNsYXNzPVwiZXZlbnQgcHJldmlldyBwLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiKGV2ZW50UGFydCB8IGJzU2Vjb25kc1RvZGF5T2Zmc2V0KSAvIHRpbWVTbG90RHVyYXRpb24gKiB1bml0SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQgfCBic1NlY29uZHNUaW1lc3BhbikgLyB0aW1lU2xvdER1cmF0aW9uICogdW5pdEhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnRdPVwiJ2NhbGMoOTBweCArICgoMTAwJSAtIDkwcHgpIC8gNyAqICcgKyAoKGV2ZW50UGFydCB8IGRheU9mV2VlaykgLSAxKSArICcpKSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtaW5uZXIgdy0xMDBcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQgfCBic1NlY29uZHNUaW1lc3BhbikgLyB0aW1lU2xvdER1cmF0aW9uICogdW5pdEhlaWdodFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
546
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvc3JjL2xpYi9jb21wb25lbnRzL3NjaGVkdWxlci9jb21wb25lbnRzL3NjaGVkdWxlci9zY2hlZHVsZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9taW50cGxheWVyLW5nLWJvb3RzdHJhcC9zcmMvbGliL2NvbXBvbmVudHMvc2NoZWR1bGVyL2NvbXBvbmVudHMvc2NoZWR1bGVyL3NjaGVkdWxlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU81RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7O0FBWTdFLE1BQU0sT0FBTyxvQkFBb0I7SUFDL0IsWUFBb0Isb0JBQTRDLEVBQVUsZUFBa0M7UUFBeEYseUJBQW9CLEdBQXBCLG9CQUFvQixDQUF3QjtRQUFVLG9CQUFlLEdBQWYsZUFBZSxDQUFtQjtRQXNLNUcsZUFBVSxHQUFHLElBQUksZUFBZSxDQUErQixFQUFFLENBQUMs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Q0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIFN1YmplY3QsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRVNjaGVkdWxlck1vZGUgfSBmcm9tICcuLi8uLi9lbnVtcy9zY2hlZHVsZXItbW9kZSc7XG5pbXBvcnQgeyBCc0NhbGVuZGFyTW9udGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvY2FsZW5kYXItbW9udGgvY2FsZW5kYXItbW9udGguc2VydmljZSc7XG5pbXBvcnQgeyBFRHJhZ09wZXJhdGlvbiB9IGZyb20gJy4uLy4uL2VudW1zL2RyYWctb3BlcmF0aW9uJztcbmltcG9ydCB7IERyYWdPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RyYWctb3BlcmF0aW9uJztcbmltcG9ydCB7IFByZXZpZXdFdmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcHJldmlldy1ldmVudCc7XG5pbXBvcnQgeyBTY2hlZHVsZXJFdmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2NoZWR1bGVyLWV2ZW50JztcbmltcG9ydCB7IFNjaGVkdWxlckV2ZW50UGFydCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2NoZWR1bGVyLWV2ZW50LXBhcnQnO1xuaW1wb3J0IHsgU2NoZWR1bGVyRXZlbnRXaXRoUGFydHMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3NjaGVkdWxlci1ldmVudC13aXRoLXBhcnRzJztcbmltcG9ydCB7IFRpbWVTbG90IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90aW1lLXNsb3QnO1xuaW1wb3J0IHsgQnNUaW1lbGluZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aW1lbGluZS90aW1lbGluZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlc291cmNlR3JvdXAgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Jlc291cmNlLWdyb3VwJztcbmltcG9ydCB7IFJlc291cmNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTY2hlZHVsZXJTdGFtcFdpdGhTbG90cyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2NoZWR1bGVyLXN0YW1wLXdpdGgtc2xvdHMnO1xuaW1wb3J0IHsgV2Vla09wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3dlZWstb3B0aW9ucyc7XG5pbXBvcnQgeyBUaW1lbGluZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3RpbWVsaW5lLW9wdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicy1zY2hlZHVsZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc2NoZWR1bGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2NoZWR1bGVyLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEJzU2NoZWR1bGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjYWxlbmRhck1vbnRoU2VydmljZTogQnNDYWxlbmRhck1vbnRoU2VydmljZSwgcHJpdmF0ZSB0aW1lbGluZVNlcnZpY2U6IEJzVGltZWxpbmVTZXJ2aWNlKSB7XG4gICAgY29uc3QgbW9uZGF5ID0gdGhpcy5jYWxlbmRhck1vbnRoU2VydmljZS5nZXRNb25kYXlCZWZvcmUobmV3IERhdGUoKSk7XG4gICAgdGhpcy5jdXJyZW50V2Vla09yTW9udGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRlPihtb25kYXkpO1xuXG4gICAgdGhpcy5zaG93bkRheXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50V2Vla09yTW9udGgkLCB0aGlzLm1vZGUkXSlcbiAgICAgIC5waXBlKG1hcCgoW2N1cnJlbnREYXksIG1vZGVdKSA9PiB7XG4gICAgICAgIGN1cnJlbnREYXkuc2V0SG91cnMoMCk7XG4gICAgICAgIGN1cnJlbnREYXkuc2V0TWludXRlcygwKTtcbiAgICAgICAgY3VycmVudERheS5zZXRTZWNvbmRzKDApO1xuICAgICAgICBjdXJyZW50RGF5LnNldE1pbGxpc2Vjb25kcygwKTtcbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgY2FzZSBFU2NoZWR1bGVyTW9kZS53ZWVrOiB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShBcnJheSg3KS5rZXlzKCkpLm1hcCgoeCkgPT4gdGhpcy5hZGREYXlzKGN1cnJlbnREYXksIHgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBFU2NoZWR1bGVyTW9kZS50aW1lbGluZToge1xuICAgICAgICAgICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZShjdXJyZW50RGF5LmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXkuZ2V0TW9udGgoKSwgMSk7XG4gICAgICAgICAgICBjb25zdCBkYXlzT2ZNb250aCA9IG5ldyBEYXRlKGN1cnJlbnREYXkuZ2V0RnVsbFllYXIoKSwgY3VycmVudERheS5nZXRNb250aCgpICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oQXJyYXkoZGF5c09mTW9udGgpLmtleXMoKSkubWFwKCh4KSA9PiB0aGlzLmFkZERheXMoZmlyc3REYXksIHgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuZGF5c09mV2Vla1dpdGhUaW1lc3RhbXBzJCA9IHRoaXMuc2hvd25EYXlzJFxuICAgICAgLnBpcGUobWFwKChzaG93bkRheXMpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHNob3duRGF5c1swXS5nZXRUaW1lKCksIGVuZDogc2hvd25EYXlzW3Nob3duRGF5cy5sZW5ndGggLSAxXS5nZXRUaW1lKCkgKyAyNCAqIDYwICogNjAgKiAxMDAwIH07XG4gICAgICB9KSk7XG4gICAgXG4gICAgdGhpcy5ldmVudHMkID0gdGhpcy5yZXNvdXJjZXMkXG4gICAgICAucGlwZShtYXAoKHJlc291cmNlc09yR3JvdXBzKSA9PiByZXNvdXJjZXNPckdyb3Vwcy5tYXAocmVzT3JHcm91cCA9PiB0aGlzLmdldFJlc291cmNlc0Zvckdyb3VwKHJlc09yR3JvdXApKSkpXG4gICAgICAucGlwZShtYXAoamFnZ2VkUmVzb3VyY2VzID0+IGphZ2dlZFJlc291cmNlcy5yZWR1Y2UoKGZsYXQsIHRvRmxhdHRlbikgPT4gZmxhdC5jb25jYXQodG9GbGF0dGVuKSwgW10pKSlcbiAgICAgIC5waXBlKG1hcChyZXNvdXJjZXMgPT4gcmVzb3VyY2VzLm1hcChyZXMgPT4gcmVzLmV2ZW50cykpKVxuICAgICAgLnBpcGUobWFwKGphZ2dlZEV2ZW50cyA9PiBqYWdnZWRFdmVudHMucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbiksIFtdKSkpO1xuXG4gICAgICAvLyBncm91cHMucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbi5jaGlsZHJlbiksIFtdKVxuICAgIHRoaXMuZXZlbnRQYXJ0cyQgPSB0aGlzLmV2ZW50cyQucGlwZShcbiAgICAgIG1hcCgoZXZlbnRzKSA9PiAgZXZlbnRzLm1hcCgoZXYpID0+IHRoaXMudGltZWxpbmVTZXJ2aWNlLnNwbGl0SW5QYXJ0cyhldikpKVxuICAgICk7XG5cbiAgICB0aGlzLmV2ZW50UGFydHNGb3JUaGlzV2VlayQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZGF5c09mV2Vla1dpdGhUaW1lc3RhbXBzJCxcbiAgICAgIHRoaXMuZXZlbnRQYXJ0cyRcbiAgICAgICAgLnBpcGUobWFwKGV2ZW50UGFydHMgPT4gZXZlbnRQYXJ0cy5tYXAoZXZwID0+IGV2cC5wYXJ0cykpKVxuICAgICAgICAucGlwZShtYXAoamFnZ2VkUGFydHMgPT4gIGphZ2dlZFBhcnRzLnJlZHVjZSgoZmxhdCwgdG9GbGF0dGVuKSA9PiBmbGF0LmNvbmNhdCh0b0ZsYXR0ZW4pLCBbXSkpKVxuICAgICAgXSlcbiAgICAgIC5waXBlKG1hcCgoW3N0YXJ0QW5kRW5kLCBldmVudFBhcnRzXSkgPT4ge1xuICAgICAgICByZXR1cm4gZXZlbnRQYXJ0cy5maWx0ZXIoZXZlbnRQYXJ0ID0+IHtcbiAgICAgICAgICByZXR1cm4gISgoZXZlbnRQYXJ0LmVuZC5nZXRUaW1lKCkgPD0gc3RhcnRBbmRFbmQuc3RhcnQpIHx8IChldmVudFBhcnQuc3RhcnQuZ2V0VGltZSgpID49IHN0YXJ0QW5kRW5kLmVuZCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pKTtcblxuICAgIHRoaXMucHJldmlld0V2ZW50UGFydHMkID0gdGhpcy5wcmV2aWV3RXZlbnQkLnBpcGUoXG4gICAgICBtYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRpbWVsaW5lU2VydmljZS5zcGxpdEluUGFydHMoZXZlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnByZXZpZXdFdmVudFBhcnRzRm9yVGhpc1dlZWskID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXlzT2ZXZWVrV2l0aFRpbWVzdGFtcHMkLCB0aGlzLnByZXZpZXdFdmVudFBhcnRzJF0pXG4gICAgICAucGlwZShtYXAoKFtzdGFydEFuZEVuZCwgcHJldmlld0V2ZW50UGFydHNdKSA9PiB7XG4gICAgICAgIGlmIChwcmV2aWV3RXZlbnRQYXJ0cykge1xuICAgICAgICAgIHJldHVybiBwcmV2aWV3RXZlbnRQYXJ0cy5wYXJ0cy5maWx0ZXIoZXZlbnRQYXJ0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhKChldmVudFBhcnQuZW5kLmdldFRpbWUoKSA8PSBzdGFydEFuZEVuZC5zdGFydCkgfHwgKGV2ZW50UGFydC5zdGFydC5nZXRUaW1lKCkgPj0gc3RhcnRBbmRFbmQuZW5kKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLnRpbWVsaW5lZEV2ZW50UGFydHNGb3JUaGlzV2VlayQgPSB0aGlzLmV2ZW50UGFydHNGb3JUaGlzV2VlayRcbiAgICAgIC5waXBlKG1hcChldmVudFBhcnRzID0+IHtcbiAgICAgICAgLy8gV2UnbGwgb25seSB1c2UgdGhlIGV2ZW50cyBmb3IgdGhpcyB3ZWVrXG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50UGFydHMubWFwKGVwID0+IGVwLmV2ZW50KVxuICAgICAgICAgIC5maWx0ZXIoKGUsIGksIGxpc3QpID0+IGxpc3QuaW5kZXhPZihlKSA9PT0gaSlcbiAgICAgICAgICAuZmlsdGVyKChlKSA9PiAhIWUpXG4gICAgICAgICAgLm1hcCgoZSkgPT4gPFNjaGVkdWxlckV2ZW50PmUpO1xuICAgICAgICBjb25zdCB0aW1lbGluZSA9IHRoaXMudGltZWxpbmVTZXJ2aWNlLmdldFRpbWVsaW5lKGV2ZW50cyk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGltZWxpbmUubWFwKHRyYWNrID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJhY2suZXZlbnRzLm1hcChldiA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBldmVudDogZXYsIGluZGV4OiB0cmFjay5pbmRleCB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbiksIFtdKVxuICAgICAgICAubWFwKChldmkpID0+IGV2ZW50UGFydHMuZmlsdGVyKHAgPT4gcC5ldmVudCA9PT0gZXZpLmV2ZW50KS5tYXAocCA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBwYXJ0OiBwLCBpbmRleDogZXZpLmluZGV4IH07XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbiksIFtdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRvdGFsOiB0aW1lbGluZS5sZW5ndGgsXG4gICAgICAgICAgcGFydHM6IHJlc3VsdFxuICAgICAgICB9O1xuICAgICAgfSkpO1xuXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5tb2RlJCwgdGhpcy5zaG93bkRheXMkLCB0aGlzLnRpbWVTbG90RHVyYXRpb24kXSlcbiAgICAgIC5waXBlKGZpbHRlcigoW21vZGUsIHNob3duRGF5cywgZHVyYXRpb25dKSA9PiBtb2RlICE9PSBudWxsKSlcbiAgICAgIC5waXBlKG1hcCgoW21vZGUsIHNob3duRGF5cywgZHVyYXRpb25dKSA9PiB7XG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgIGNhc2UgRVNjaGVkdWxlck1vZGUud2Vlazoge1xuICAgICAgICAgICAgY29uc3QgdGltZVNsb3RzUGVyRGF5ID0gTWF0aC5mbG9vcigoNjAgKiA2MCAqIDI0KSAvIGR1cmF0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKEFycmF5KHRpbWVTbG90c1BlckRheSkua2V5cygpKS5tYXAoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRpbWVzbG90Rm9yTW9uZGF5ID0gdGhpcy5jcmVhdGVUaW1lc2xvdChzaG93bkRheXNbMF0sIGluZGV4LCBkdXJhdGlvbik7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIDxTY2hlZHVsZXJTdGFtcFdpdGhTbG90cz57XG4gICAgICAgICAgICAgICAgc2xvdHM6IHNob3duRGF5cy5tYXAoKGRheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShkYXkpO1xuICAgICAgICAgICAgICAgICAgc3RhcnQuc2V0SG91cnModGltZXNsb3RGb3JNb25kYXkuc3RhcnQuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICAgICAgICBzdGFydC5zZXRNaW51dGVzKHRpbWVzbG90Rm9yTW9uZGF5LnN0YXJ0LmdldE1pbnV0ZXMoKSk7XG4gICAgICAgICAgICAgICAgICBzdGFydC5zZXRTZWNvbmRzKHRpbWVzbG90Rm9yTW9uZGF5LnN0YXJ0LmdldFNlY29uZHMoKSk7XG4gICAgICAgICAgICAgICAgICBzdGFydC5zZXRNaWxsaXNlY29uZHModGltZXNsb3RGb3JNb25kYXkuc3RhcnQuZ2V0TWlsbGlzZWNvbmRzKCkpO1xuICAgICAgXG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShkYXkpO1xuICAgICAgICAgICAgICAgICAgZW5kLnNldEhvdXJzKHRpbWVzbG90Rm9yTW9uZGF5LmVuZC5nZXRIb3VycygpKTtcbiAgICAgICAgICAgICAgICAgIGVuZC5zZXRNaW51dGVzKHRpbWVzbG90Rm9yTW9uZGF5LmVuZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICAgICAgICAgICAgZW5kLnNldFNlY29uZHModGltZXNsb3RGb3JNb25kYXkuZW5kLmdldFNlY29uZHMoKSk7XG4gICAgICAgICAgICAgICAgICBlbmQuc2V0TWlsbGlzZWNvbmRzKHRpbWVzbG90Rm9yTW9uZGF5LmVuZC5nZXRNaWxsaXNlY29uZHMoKSk7XG4gICAgICAgICAgICAgICAgICBlbmQuc2V0RGF0ZShlbmQuZ2V0RGF0ZSgpICsgdGltZXNsb3RGb3JNb25kYXkuZW5kLmdldERhdGUoKSAtIHRpbWVzbG90Rm9yTW9uZGF5LnN0YXJ0LmdldERhdGUoKSk7XG4gICAgICBcbiAgICAgICAgICAgICAgICAgIHJldHVybiA8VGltZVNsb3Q+eyBzdGFydCwgZW5kIH07XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3RhbXA6IHRpbWVzbG90Rm9yTW9uZGF5LnN0YXJ0XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBFU2NoZWR1bGVyTW9kZS50aW1lbGluZToge1xuICAgICAgICAgICAgY29uc3QgdG90YWxUaW1lc2xvdHMgPSAoMjQgKiA2MCAqIDYwKSAvIGR1cmF0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHNob3duRGF5cy5tYXAoKGRheSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gPFNjaGVkdWxlclN0YW1wV2l0aFNsb3RzPntcbiAgICAgICAgICAgICAgICBzbG90czogQXJyYXkuZnJvbShBcnJheSh0b3RhbFRpbWVzbG90cykua2V5cygpKVxuICAgICAgICAgICAgICAgICAgLm1hcCgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGltZXNsb3QoZGF5LCBpbmRleCwgZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3RhbXA6IGRheVxuICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRocm93ICdVbmtub3duIHZhbHVlIGZvciBNb2RlOiAnICsgbW9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pKVxuICAgICAgLnN1YnNjcmliZSgodGltZXNsb3RzKSA9PiB7XG4gICAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSdyZSBub3QgdXNpbmcgYW4gb2JzZXJ2YWJsZSBoZXJlLCBidXQgcGVyc2lzdCB0aGUgdGltZXNsb3RzIGluIGEgQmVoYXZpb3JTdWJqZWN0LlxuICAgICAgICB0aGlzLnRpbWVTbG90cyQubmV4dCh0aW1lc2xvdHMpO1xuICAgICAgfSk7XG4gICAgXG4gICAgICB0aGlzLndlZWtPcHRpb25zJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKCh3ZWVrT3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLndlZWtPcHRpb25zQ2hhbmdlLmVtaXQod2Vla09wdGlvbnMpO1xuICAgICAgfSk7XG4gICAgdGhpcy50aW1lbGluZU9wdGlvbnMkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHRpbWVsaW5lT3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLnRpbWVsaW5lT3B0aW9uc0NoYW5nZS5lbWl0KHRpbWVsaW5lT3B0aW9ucyk7XG4gICAgICB9KTtcblxuICAgIC8vIGNvbWJpbmVMYXRlc3QoW3RoaXMubW9kZSQsIHRoaXMuc2NhbGUkXSlcbiAgICAvLyAgIC5waXBlKGZpbHRlcigoW21vZGUsIHNjYWxlXSkgPT4gbW9kZSA9PT0gRVNjaGVkdWxlck1vZGUudGltZWxpbmUpKVxuXG4gIH1cblxuICByZXNvdXJjZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDwoUmVzb3VyY2UgfCBSZXNvdXJjZUdyb3VwKVtdPihbXSk7XG4gIGV2ZW50cyQ6IE9ic2VydmFibGU8U2NoZWR1bGVyRXZlbnRbXT47XG4gIGV2ZW50UGFydHMkOiBPYnNlcnZhYmxlPFNjaGVkdWxlckV2ZW50V2l0aFBhcnRzW10+O1xuICBldmVudFBhcnRzRm9yVGhpc1dlZWskOiBPYnNlcnZhYmxlPFNjaGVkdWxlckV2ZW50UGFydFtdPjtcbiAgdGltZWxpbmVkRXZlbnRQYXJ0c0ZvclRoaXNXZWVrJDogT2JzZXJ2YWJsZTx7IHRvdGFsOiBudW1iZXIsIHBhcnRzOiB7IHBhcnQ6IFNjaGVkdWxlckV2ZW50UGFydCwgaW5kZXg6IG51bWJlcn1bXSB9PjtcbiAgd2Vla09wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxXZWVrT3B0aW9ucz4oeyB1bml0SGVpZ2h0OiAzMCB9KTtcbiAgdGltZWxpbmVPcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGltZWxpbmVPcHRpb25zPih7IHVuaXRXaWR0aDogNTAgfSk7XG4gIFxuICBwcmV2aWV3RXZlbnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcmV2aWV3RXZlbnQgfCBudWxsPihudWxsKTtcbiAgcHJldmlld0V2ZW50UGFydHMkOiBPYnNlcnZhYmxlPFNjaGVkdWxlckV2ZW50V2l0aFBhcnRzIHwgbnVsbD47XG4gIHByZXZpZXdFdmVudFBhcnRzRm9yVGhpc1dlZWskOiBPYnNlcnZhYmxlPFNjaGVkdWxlckV2ZW50UGFydFtdPjtcbiAgXG4gIGN1cnJlbnRXZWVrT3JNb250aCQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlPjtcbiAgc2hvd25EYXlzJDogT2JzZXJ2YWJsZTxEYXRlW10+O1xuICBkYXlzT2ZXZWVrV2l0aFRpbWVzdGFtcHMkOiBPYnNlcnZhYmxlPHtzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcn0+O1xuICB0aW1lU2xvdER1cmF0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigxODAwKTtcbiAgdGltZVNsb3RzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2NoZWR1bGVyU3RhbXBXaXRoU2xvdHNbXT4oW10pO1xuICBtb3VzZVN0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBob3ZlcmVkVGltZVNsb3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUaW1lU2xvdCB8IG51bGw+KG51bGwpO1xuICBob3ZlcmVkRXZlbnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTY2hlZHVsZXJFdmVudCB8IG51bGw+KG51bGwpO1xuICBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3QoKTtcblxuICBAVmlld0NoaWxkcmVuKCdzbG90JykgdGltZVNsb3RFbGVtZW50cyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj47XG5cbiAgY3JlYXRlVGltZXNsb3QoZGF0ZTogRGF0ZSwgaW5kZXg6IG51bWJlciwgZHVyYXRpb246IG51bWJlcikge1xuICAgIGNvbnN0IHRpbWVTbG90U3RhcnQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICB0aW1lU2xvdFN0YXJ0LnNldFRpbWUoK3RpbWVTbG90U3RhcnQuZ2V0VGltZSgpICsgaW5kZXggKiBkdXJhdGlvbiAqIDEwMDApO1xuICAgIGNvbnN0IHRpbWVTbG90RW5kID0gbmV3IERhdGUodGltZVNsb3RTdGFydCk7XG4gICAgdGltZVNsb3RFbmQuc2V0VGltZSgrdGltZVNsb3RFbmQuZ2V0VGltZSgpICsgZHVyYXRpb24gKiAxMDAwKTtcblxuICAgIHJldHVybiA8VGltZVNsb3Q+eyBzdGFydDogdGltZVNsb3RTdGFydCwgZW5kOiB0aW1lU2xvdEVuZCB9O1xuICB9XG5cbiAgZ2V0UmVzb3VyY2VzRm9yR3JvdXAocmVzb3VyY2VPckdyb3VwOiBSZXNvdXJjZSB8IFJlc291cmNlR3JvdXApIDogUmVzb3VyY2VbXSB7XG4gICAgaWYgKCdjaGlsZHJlbicgaW4gcmVzb3VyY2VPckdyb3VwKSB7XG4gICAgICByZXR1cm4gcmVzb3VyY2VPckdyb3VwLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkKSA9PiB0aGlzLmdldFJlc291cmNlc0Zvckdyb3VwKGNoaWxkKSlcbiAgICAgICAgLnJlZHVjZSgoZmxhdCwgdG9GbGF0dGVuKSA9PiBmbGF0LmNvbmNhdCh0b0ZsYXR0ZW4pLCBbXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbcmVzb3VyY2VPckdyb3VwXTtcbiAgICB9XG4gIH1cblxuICAvLyNyZWdpb24gTW9kZVxuICBtb2RlcyA9IEVTY2hlZHVsZXJNb2RlO1xuICBtb2RlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RVNjaGVkdWxlck1vZGU+KEVTY2hlZHVsZXJNb2RlLndlZWspO1xuICBAT3V0cHV0KCkgcHVibGljIG1vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEVTY2hlZHVsZXJNb2RlPigpO1xuICBwdWJsaWMgZ2V0IG1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSQudmFsdWU7XG4gIH1cbiAgQElucHV0KCkgcHVibGljIHNldCBtb2RlKHZhbHVlOiBFU2NoZWR1bGVyTW9kZSkge1xuICAgIHRoaXMubW9kZSQubmV4dCh2YWx1ZSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG4gIC8vIC8vI3JlZ2lvbiBTY2FsZVxuICAvLyBzY2FsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjaGVkdWxlclNjYWxlPihhdmFpbGFibGVTY2FsZXNbNF0pO1xuICAvLyBAT3V0cHV0KCkgcHVibGljIHNjYWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTY2hlZHVsZXJTY2FsZT4oKTtcbiAgLy8gcHVibGljIGdldCBzY2FsZSgpIHtcbiAgLy8gICByZXR1cm4gdGhpcy5zY2FsZSQudmFsdWU7XG4gIC8vIH1cbiAgLy8gQElucHV0KCkgcHVibGljIHNldCBzY2FsZSh2YWx1ZTogU2NoZWR1bGVyU2NhbGUpIHtcbiAgLy8gICB0aGlzLnNjYWxlJC5uZXh0KHZhbHVlKTtcbiAgLy8gfVxuICAvLyAvLyNlbmRyZWdpb25cbiAgLy8jcmVnaW9uIFdlZWtPcHRpb25zXG4gIEBPdXRwdXQoKSBwdWJsaWMgd2Vla09wdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFdlZWtPcHRpb25zPigpO1xuICBwdWJsaWMgZ2V0IHdlZWtPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLndlZWtPcHRpb25zJC52YWx1ZTtcbiAgfVxuICBASW5wdXQoKSBwdWJsaWMgc2V0IHdlZWtPcHRpb25zKHZhbHVlOiBXZWVrT3B0aW9ucykge1xuICAgIHRoaXMud2Vla09wdGlvbnMkLm5leHQodmFsdWUpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICAvLyNyZWdpb24gVGltZWxpbmVPcHRpb25zXG4gIEBPdXRwdXQoKSBwdWJsaWMgdGltZWxpbmVPcHRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUaW1lbGluZU9wdGlvbnM+KCk7XG4gIHB1YmxpYyBnZXQgdGltZWxpbmVPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRpbWVsaW5lT3B0aW9ucyQudmFsdWU7XG4gIH1cbiAgQElucHV0KCkgcHVibGljIHNldCB0aW1lbGluZU9wdGlvbnModmFsdWU6IFRpbWVsaW5lT3B0aW9ucykge1xuICAgIHRoaXMudGltZWxpbmVPcHRpb25zJC5uZXh0KHZhbHVlKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cbiAgLy8jcmVnaW9uIG1heElubmVySGVpZ2h0XG4gIEBJbnB1dCgpIHB1YmxpYyBtYXhJbm5lckhlaWdodDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8vI2VuZHJlZ2lvblxuICAvLyNyZWdpb24gUmVzb3VyY2VzXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlcyQudmFsdWU7XG4gIH1cbiAgQElucHV0KCkgcHVibGljIHNldCByZXNvdXJjZXModmFsdWU6IChSZXNvdXJjZSB8IFJlc291cmNlR3JvdXApW10pIHtcbiAgICB0aGlzLnJlc291cmNlcyQubmV4dCh2YWx1ZSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgcHJpdmF0ZSBhZGREYXlzKGRhdGU6IERhdGUsIGRheXM6IG51bWJlcikge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIHJlc3VsdC5zZXREYXRlKHJlc3VsdC5nZXREYXRlKCkgKyBkYXlzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb25QcmV2aW91c1dlZWtPck1vbnRoKCkge1xuICAgIHRoaXMub25DaGFuZ2VXZWVrT3JNb250aChmYWxzZSk7XG4gIH1cblxuICBvbk5leHRXZWVrT3JNb250aCgpIHtcbiAgICB0aGlzLm9uQ2hhbmdlV2Vla09yTW9udGgodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIG9uQ2hhbmdlV2Vla09yTW9udGgobmV4dDogYm9vbGVhbikge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuY3VycmVudFdlZWtPck1vbnRoJCwgdGhpcy5tb2RlJF0pXG4gICAgICAucGlwZShtYXAoKFtjdXJyZW50V2Vla09yTW9udGgsIG1vZGVdKSA9PiB7XG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgIGNhc2UgRVNjaGVkdWxlck1vZGUud2Vlazoge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkRGF5cyhjdXJyZW50V2Vla09yTW9udGgsIChuZXh0ID8gNyA6IC03KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgRVNjaGVkdWxlck1vZGUudGltZWxpbmU6IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShjdXJyZW50V2Vla09yTW9udGguZ2V0RnVsbFllYXIoKSwgY3VycmVudFdlZWtPck1vbnRoLmdldE1vbnRoKCkgKyAobmV4dCA/IDEgOiAtMSksIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksIHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCh3KSA9PiB0aGlzLmN1cnJlbnRXZWVrT3JNb250aCQubmV4dCh3KSk7XG4gIH1cblxuICBvbkhvdmVyRXZlbnQoZXY6IFNjaGVkdWxlckV2ZW50IHwgbnVsbCkge1xuICAgIGNvbnNvbGUubG9nKCdob3ZlcmVkJywgZXYpO1xuICAgIHRoaXMuaG92ZXJlZEV2ZW50JC5uZXh0KGV2KTtcbiAgfVxuXG4gIG9uTGVhdmVFdmVudChldjogU2NoZWR1bGVyRXZlbnQgfCBudWxsKSB7XG4gICAgdGhpcy5ob3ZlcmVkRXZlbnQkLm5leHQobnVsbCk7XG4gIH1cblxuICBvcGVyYXRpb246IERyYWdPcGVyYXRpb24gfCBudWxsID0gbnVsbDtcbiAgZHJhZ1N0YXJ0VGltZXNsb3Q6IFRpbWVTbG90IHwgbnVsbCA9IG51bGw7XG4gIG9uQ3JlYXRlRXZlbnQoZXY6IE1vdXNlRXZlbnQsIHNsb3Q6IFRpbWVTbG90KSB7XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLm1vdXNlU3RhdGUkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IHNsb3Q7XG4gICAgdGhpcy5vcGVyYXRpb24gPSB7XG4gICAgICBvcGVyYXRpb246IEVEcmFnT3BlcmF0aW9uLmNyZWF0ZUV2ZW50LFxuICAgICAgZXZlbnQ6IHtcbiAgICAgICAgc3RhcnQ6IHNsb3Quc3RhcnQsXG4gICAgICAgIGVuZDogc2xvdC5lbmQsXG4gICAgICAgIGNvbG9yOiAnI0YwMCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGVzdCBldmVudCcsXG4gICAgICB9LFxuICAgICAgbWV0YTogbnVsbCxcbiAgICB9O1xuICAgIHRoaXMucHJldmlld0V2ZW50JC5uZXh0KHsgc3RhcnQ6IHNsb3Quc3RhcnQsIGVuZDogc2xvdC5lbmQgfSk7XG4gIH1cblxuICByYW5kb21Db2xvcigpIHtcbiAgICBjb25zdCBicmlnaHRuZXNzID0gMTI4O1xuICAgIHJldHVybiAnIycgKyB0aGlzLnJhbmRvbUNoYW5uZWwoYnJpZ2h0bmVzcykgKyB0aGlzLnJhbmRvbUNoYW5uZWwoYnJpZ2h0bmVzcykgKyB0aGlzLnJhbmRvbUNoYW5uZWwoYnJpZ2h0bmVzcyk7XG4gIH1cbiAgcmFuZG9tQ2hhbm5lbChicmlnaHRuZXNzOiBudW1iZXIpe1xuICAgIGNvbnN0IHIgPSAyNTUtYnJpZ2h0bmVzcztcbiAgICBjb25zdCBuID0gMHwoKE1hdGgucmFuZG9tKCkgKiByKSArIGJyaWdodG5lc3MpO1xuICAgIGNvbnN0IHMgPSBuLnRvU3RyaW5nKDE2KTtcbiAgICByZXR1cm4gKHMubGVuZ3RoPT0xKSA/ICcwJytzIDogcztcbiAgfVxuXG4gIG9uU3RhcnREcmFnRXZlbnQoZXZlbnRQYXJ0OiBTY2hlZHVsZXJFdmVudFBhcnQsIGV2OiBNb3VzZUV2ZW50KSB7XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmhvdmVyZWRUaW1lU2xvdCQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKGhvdmVyZWRUaW1lU2xvdCkgPT4ge1xuICAgICAgaWYgKGV2ZW50UGFydC5ldmVudCkge1xuICAgICAgICB0aGlzLmRyYWdTdGFydFRpbWVzbG90ID0gaG92ZXJlZFRpbWVTbG90O1xuICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IHtcbiAgICAgICAgICBvcGVyYXRpb246IEVEcmFnT3BlcmF0aW9uLm1vdmVFdmVudCxcbiAgICAgICAgICBldmVudDogZXZlbnRQYXJ0LmV2ZW50LFxuICAgICAgICAgIG1ldGE6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJldmlld0V2ZW50JC5uZXh0KHsgc3RhcnQ6IGV2ZW50UGFydC5ldmVudC5zdGFydCwgZW5kOiBldmVudFBhcnQuZXZlbnQuZW5kIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25TdGFydFJlc2l6ZUV2ZW50KGV2ZW50OiBTY2hlZHVsZXJFdmVudCB8IG51bGwsIHBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nKSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6IHtcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogRURyYWdPcGVyYXRpb24ucmVzaXplRXZlbnQsXG4gICAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgICBtZXRhOiB7IHBvc2l0aW9uIH0sXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JC5uZXh0KHsgc3RhcnQ6IGV2ZW50LnN0YXJ0LCBlbmQ6IGV2ZW50LmVuZCB9KTtcbiAgICAgICAgfSBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzoge1xuICAgICAgICAgIHRoaXMub3BlcmF0aW9uID0ge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBFRHJhZ09wZXJhdGlvbi5yZXNpemVFdmVudCxcbiAgICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICAgIG1ldGE6IHsgcG9zaXRpb24gfSxcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoeyBzdGFydDogZXZlbnQuc3RhcnQsIGVuZDogZXZlbnQuZW5kIH0pO1xuICAgICAgICB9IGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vI3JlZ2lvbiBob3ZlcmVkVGltZXNsb3QkXG4gIHByaXZhdGUgZ2V0SG92ZXJlZFRpbWVzbG90KGV2OiBNb3VzZUV2ZW50LCB0aW1lU2xvdHM6IFNjaGVkdWxlclN0YW1wV2l0aFNsb3RzW10pIHtcbiAgICBjb25zdCBob3ZlcmVkU2xvdHMgPSB0aGlzLnRpbWVTbG90RWxlbWVudHMuZmlsdGVyKChlbCkgPT4ge1xuICAgICAgY29uc3QgcmN0ID0gZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChyY3QubGVmdCA8PSBldi54ICYmIGV2LnggPD0gcmN0LnJpZ2h0ICYmIHJjdC50b3AgPD0gZXYueSAmJiBldi55IDw9IHJjdC5ib3R0b20pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWhvdmVyZWRTbG90cyB8fCBob3ZlcmVkU2xvdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzbG90RWxlbWVudCA9IGhvdmVyZWRTbG90c1swXS5uYXRpdmVFbGVtZW50O1xuXG4gICAgY29uc3Qgc3RyUm93ID0gc2xvdEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJvdycpO1xuICAgIGlmICghc3RyUm93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gcGFyc2VJbnQoc3RyUm93KTtcblxuICAgIGNvbnN0IHN0ckNvbHVtbiA9IHNsb3RFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jb2x1bW4nKTtcbiAgICBpZiAoIXN0ckNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbiA9IHBhcnNlSW50KHN0ckNvbHVtbik7XG5cbiAgICBjb25zdCBzbG90ID0gdGltZVNsb3RzW3Jvd10uc2xvdHNbY29sdW1uXTtcbiAgICByZXR1cm4gc2xvdDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXG4gIG9uTW91c2Vtb3ZlKGV2OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy50aW1lU2xvdHMkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCh0aW1lU2xvdHMpID0+IHtcbiAgICAgIGNvbnN0IGhvdmVyZWQgPSB0aGlzLmdldEhvdmVyZWRUaW1lc2xvdChldiwgdGltZVNsb3RzKTtcbiAgICAgIHRoaXMuaG92ZXJlZFRpbWVTbG90JC5uZXh0KGhvdmVyZWQpO1xuXG4gICAgICBpZiAodGhpcy5vcGVyYXRpb24pIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLm9wZXJhdGlvbi5vcGVyYXRpb24pIHtcbiAgICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLmNyZWF0ZUV2ZW50OiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb24uZXZlbnQgJiYgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCAmJiBob3ZlcmVkICYmICh0aGlzLm9wZXJhdGlvbi5ldmVudC5lbmQuZ2V0VGltZSgpICE9IGhvdmVyZWQuZW5kLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpID09PSBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgIC8vIDEgc2xvdFxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpIDwgaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBEcmFnIGRvd25cbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCRcbiAgICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZXYpID0+ICEhZXYgJiYgISF0aGlzLmRyYWdTdGFydFRpbWVzbG90KSlcbiAgICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICBldi5zdGFydCA9IHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuZW5kID0gaG92ZXJlZC5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2O1xuICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXYpID0+IHRoaXMucHJldmlld0V2ZW50JC5uZXh0KGV2KSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5zdGFydC5nZXRUaW1lKCkgPiBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgIC8vIERyYWcgdXBcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCRcbiAgICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZXYpID0+ICEhZXYgJiYgISF0aGlzLmRyYWdTdGFydFRpbWVzbG90KSlcbiAgICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICBldi5zdGFydCA9IGhvdmVyZWQuc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuZW5kID0gdGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2O1xuICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXYpID0+IHRoaXMucHJldmlld0V2ZW50JC5uZXh0KGV2KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGJyZWFrO1xuICAgICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24ubW92ZUV2ZW50OiB7XG4gICAgICAgICAgICBpZiAoaG92ZXJlZCAmJiB0aGlzLmRyYWdTdGFydFRpbWVzbG90KSB7XG4gICAgICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JFxuICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZXYpID0+ICEhZXYgJiYgISF0aGlzLmRyYWdTdGFydFRpbWVzbG90KSlcbiAgICAgICAgICAgICAgICAucGlwZShtYXAoKGV2KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoZXYgJiYgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSAgPFByZXZpZXdFdmVudD57XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG5ldyBEYXRlKGV2LnN0YXJ0LmdldFRpbWUoKSArIGhvdmVyZWQuc3RhcnQuZ2V0VGltZSgpIC0gdGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5zdGFydC5nZXRUaW1lKCkpLFxuICAgICAgICAgICAgICAgICAgICAgIGVuZDogbmV3IERhdGUoZXYuZW5kLmdldFRpbWUoKSArIGhvdmVyZWQuc3RhcnQuZ2V0VGltZSgpIC0gdGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5zdGFydC5nZXRUaW1lKCkpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydFRpbWVzbG90ID0gaG92ZXJlZDtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShldiA9PiB0aGlzLnByZXZpZXdFdmVudCQubmV4dChldikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgICAgY2FzZSBFRHJhZ09wZXJhdGlvbi5yZXNpemVFdmVudDoge1xuICAgICAgICAgICAgaWYgKGhvdmVyZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKChldikgPT4gISFldikpXG4gICAgICAgICAgICAgICAgLnBpcGUobWFwKChldikgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGV2ICYmIHRoaXMub3BlcmF0aW9uICYmIHRoaXMub3BlcmF0aW9uLmV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbi5tZXRhLnBvc2l0aW9uID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgICAgICAgIGV2LnN0YXJ0ID0gaG92ZXJlZC5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICBldi5lbmQgPSB0aGlzLm9wZXJhdGlvbi5ldmVudC5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcGVyYXRpb24ubWV0YS5wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgICAgICAgICAgICBldi5zdGFydCA9IHRoaXMub3BlcmF0aW9uLmV2ZW50LnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgIGV2LmVuZCA9IGhvdmVyZWQuZW5kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZXY7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldikgPT4gdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoZXYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgb25Nb3VzZVVwKGV2OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uLm9wZXJhdGlvbikge1xuICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLmNyZWF0ZUV2ZW50OiB7XG4gICAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5wcmV2aWV3RXZlbnQkXSlcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChbcHJldmlld0V2ZW50XSkgPT4ge1xuICAgICAgICAgICAgICBpZiAocHJldmlld0V2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzJC5uZXh0KFtcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMucmVzb3VyY2VzJC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgIDxSZXNvdXJjZT57XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTmV3IHJlc291cmNlIGdyb3VwJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwcmV2aWV3RXZlbnQuc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgZW5kOiBwcmV2aWV3RXZlbnQuZW5kLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0aGlzLnJhbmRvbUNvbG9yKCksXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdOZXcgZXZlbnQnXG4gICAgICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGJyZWFrO1xuICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLm1vdmVFdmVudDpcbiAgICAgICAgY2FzZSBFRHJhZ09wZXJhdGlvbi5yZXNpemVFdmVudDoge1xuICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JFxuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKChldikgPT4gISFldikpXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocHJldmlld0V2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbiAmJiB0aGlzLm9wZXJhdGlvbi5ldmVudCAmJiBwcmV2aWV3RXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbi5ldmVudC5zdGFydCA9IHByZXZpZXdFdmVudC5zdGFydDtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbi5ldmVudC5lbmQgPSBwcmV2aWV3RXZlbnQuZW5kO1xuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydFRpbWVzbG90ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlcyQubmV4dCh0aGlzLnJlc291cmNlcyQudmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JC5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCh0cnVlKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRhYmxlIGQtZmxleCB3LTEwMCBvdmVyZmxvdy15LWF1dG8gbWItMCB3ZWVrLXNjaGVkdWxlXCIgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwibnVsbFwiXG4gICAgKm5nSWY9XCIobW9kZSQgfCBhc3luYykgPT09IG1vZGVzLndlZWtcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItaGVhZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNhbGVuZGFyLWxlZnQganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGZsZXgtc3RhcnRcIiAoY2xpY2spPVwib25QcmV2aW91c1dlZWtPck1vbnRoKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaS1jaGV2cm9uLWxlZnQgcHgtMFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGZsZXgtZW5kXCIgKGNsaWNrKT1cIm9uTmV4dFdlZWtPck1vbnRoKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaS1jaGV2cm9uLXJpZ2h0IHB4LTBcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSBjYWxlbmRhci1oZWFkLWNlbGxcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIChzaG93bkRheXMkIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWJsb2NrIGNvbC1mb3JtLWxhYmVsIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRheSB8IGRhdGU6ICdkZC1NTScgfX08L3NwYW4+PHNwYW4gY2xhc3M9XCJkLW5vbmUgZC1sZy1pbmxpbmUtYmxvY2tcIj4te3sgZGF5IHwgZGF0ZTogJ3l5eXknIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItYm9keVwiIFtzdHlsZS5oZWlnaHQucHhdPVwibWF4SW5uZXJIZWlnaHRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgKm5nSWY9XCIodGltZVNsb3RzJCB8IGFzeW5jKSBhcyByb3dcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIod2Vla09wdGlvbnMkIHwgYXN5bmMpIGFzIHdlZWtPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBUaW1lc2xvdHMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGltZXNsb3RzIG9mIHJvdzsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IHAtMCB0aW1lc2xvdFwiIFtzdHlsZS5oZWlnaHQucHhdPVwid2Vla09wdGlvbnMudW5pdEhlaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY2VsbCBjYWxlbmRhci1sZWZ0IGFsaWduLXRvcCBweC0yIHB5LTBcIj57eyB0aW1lc2xvdHMuc2xvdHNbMF0uc3RhcnQgfCBkYXRlOiAnSEg6bW06c3MnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1jZWxsIGZsZXgtZ3Jvdy0xXCIgKm5nRm9yPVwibGV0IHNsb3Qgb2YgdGltZXNsb3RzLnNsb3RzOyBsZXQgaiA9IGluZGV4XCIgI3Nsb3QgKG1vdXNlZG93bik9XCJvbkNyZWF0ZUV2ZW50KCRldmVudCwgc2xvdClcIiBbYXR0ci5kYXRhLXJvd109XCJpXCIgW2F0dHIuZGF0YS1jb2x1bW5dPVwialwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBFdmVudHMgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIih0aW1lU2xvdER1cmF0aW9uJCB8IGFzeW5jKSBhcyB0aW1lU2xvdER1cmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodGltZWxpbmVkRXZlbnRQYXJ0c0ZvclRoaXNXZWVrJCB8IGFzeW5jKSBhcyBwYXJ0RGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXZlbnRQYXJ0IG9mIHBhcnREYXRhLnBhcnRzXCIgY2xhc3M9XCJldmVudCBwLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiKGV2ZW50UGFydC5wYXJ0IHwgYnNTZWNvbmRzVG9kYXlPZmZzZXQpIC8gdGltZVNsb3REdXJhdGlvbiAqIHdlZWtPcHRpb25zLnVuaXRIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiKGV2ZW50UGFydC5wYXJ0IHwgYnNTZWNvbmRzVGltZXNwYW4pIC8gdGltZVNsb3REdXJhdGlvbiAqIHdlZWtPcHRpb25zLnVuaXRIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0XT1cIidjYWxjKDkwcHggKyAoKDEwMCUgLSA5MHB4KSAvIDcgKiAnICsgKChldmVudFBhcnQucGFydCB8IGRheU9mV2VlaykgLSAxKSArICcpKSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtaW5uZXJcIiBbY2xhc3MuaG92ZXJdPVwiKGhvdmVyZWRFdmVudCQgfCBhc3luYykgPT09IGV2ZW50UGFydC5wYXJ0LmV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIidjYWxjKDEwMCUgLyAnICsgcGFydERhdGEudG90YWwgKyAnKSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQucGFydCB8IGJzU2Vjb25kc1RpbWVzcGFuKSAvIHRpbWVTbG90RHVyYXRpb24gKiB3ZWVrT3B0aW9ucy51bml0SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1hcmdpbi1sZWZ0XT1cIidjYWxjKDEwMCUgLyAnICsgcGFydERhdGEudG90YWwgKyAnICogJyArIGV2ZW50UGFydC5pbmRleCArICcpJ1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1yZXNpemUgdG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZXZlbnRQYXJ0LnBhcnQuc3RhcnQgPT09IGV2ZW50UGFydC5wYXJ0LmV2ZW50Py5zdGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uU3RhcnRSZXNpemVFdmVudChldmVudFBhcnQucGFydC5ldmVudCwgJ3RvcCcpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1ib3JkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LXdyYXBwZXJcIiAqbmdJZj1cImV2ZW50UGFydC5wYXJ0LmV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25TdGFydERyYWdFdmVudChldmVudFBhcnQucGFydCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkhvdmVyRXZlbnQoZXZlbnRQYXJ0LnBhcnQuZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uTGVhdmVFdmVudChldmVudFBhcnQucGFydC5ldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1iZ1wiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImV2ZW50UGFydC5wYXJ0LmV2ZW50LmNvbG9yXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtbGFiZWxcIj57eyBldmVudFBhcnQucGFydC5ldmVudC5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LXJlc2l6ZSBib3R0b21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJldmVudFBhcnQucGFydC5lbmQgPT09IGV2ZW50UGFydC5wYXJ0LmV2ZW50Py5lbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblN0YXJ0UmVzaXplRXZlbnQoZXZlbnRQYXJ0LnBhcnQuZXZlbnQsICdib3R0b20nKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHByZXZpZXdFdmVudFBhcnRzRm9yVGhpc1dlZWskIHwgYXN5bmMpIGFzIHByZXZpZXdQYXJ0RGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXZlbnRQYXJ0IG9mIHByZXZpZXdQYXJ0RGF0YVwiIGNsYXNzPVwiZXZlbnQgcHJldmlldyBwLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiKGV2ZW50UGFydCB8IGJzU2Vjb25kc1RvZGF5T2Zmc2V0KSAvIHRpbWVTbG90RHVyYXRpb24gKiB3ZWVrT3B0aW9ucy51bml0SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQgfCBic1NlY29uZHNUaW1lc3BhbikgLyB0aW1lU2xvdER1cmF0aW9uICogd2Vla09wdGlvbnMudW5pdEhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnRdPVwiJ2NhbGMoOTBweCArICgoMTAwJSAtIDkwcHgpIC8gNyAqICcgKyAoKGV2ZW50UGFydCB8IGRheU9mV2VlaykgLSAxKSArICcpKSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtaW5uZXIgdy0xMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQgfCBic1NlY29uZHNUaW1lc3BhbikgLyB0aW1lU2xvdER1cmF0aW9uICogd2Vla09wdGlvbnMudW5pdEhlaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwidGFibGUgZC1mbGV4IHctMTAwIG92ZXJmbG93LXktYXV0byBtYi0wIGJnLXdoaXRlIHRpbWVsaW5lXCIgKm5nSWY9XCIobW9kZSQgfCBhc3luYykgPT09IG1vZGVzLnRpbWVsaW5lXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWQgZC1mbGV4XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gZmxleC1zdGFydFwiIChjbGljayk9XCJvblByZXZpb3VzV2Vla09yTW9udGgoKVwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJiaS1jaGV2cm9uLWxlZnQgcHgtMFwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSBoMyBweS0yIG1iLTAgdGV4dC1jZW50ZXJcIj57eyBjdXJyZW50V2Vla09yTW9udGgkIHwgYXN5bmMgfCBkYXRlOiAnTU1NTSB5eXl5JyB9fTwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGZsZXgtc3RhcnRcIiAoY2xpY2spPVwib25OZXh0V2Vla09yTW9udGgoKVwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJiaS1jaGV2cm9uLXJpZ2h0IHB4LTBcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1ib2R5IHRhYmxlLXJlc3BvbnNpdmUgb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIG1iLTBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodGltZVNsb3RzJCB8IGFzeW5jKSBhcyB0aW1lU2xvdHNcIj5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGRheSBvZiB0aW1lU2xvdHNcIiBbYXR0ci5jb2xzcGFuXT1cImRheS5zbG90cy5sZW5ndGhcIiBjbGFzcz1cInRleHQtY2VudGVyIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicG9zaXRpb24tc3RpY2t5IGRheS1sYWJlbFwiPnt7IGRheS5zdGFtcCB8IGRhdGU6ICdkIEVFJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodGltZWxpbmVPcHRpb25zJCB8IGFzeW5jKSBhcyB0aW1lbGluZU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRheSBvZiB0aW1lU2xvdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IHNsb3Qgb2YgZGF5LnNsb3RzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9jayBwLTAgdGV4dC1jZW50ZXJcIiBbc3R5bGUud2lkdGgucHhdPVwidGltZWxpbmVPcHRpb25zLnVuaXRXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2xvdC5zdGFydCB8IGRhdGU6ICdISDptbScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8YnMtcmVzb3VyY2UtZ3JvdXAtcHJlc2VudGVyICpuZ0Zvcj1cImxldCBncm91cCBvZiAocmVzb3VyY2VzJCB8IGFzeW5jKVwiIFtyZXNvdXJjZUdyb3VwXT1cImdyb3VwXCIgW3RpbWVTbG90c109XCJ0aW1lU2xvdHNcIj48L2JzLXJlc291cmNlLWdyb3VwLXByZXNlbnRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19