ngx-mat-tui-calendar 0.0.11 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/ngx-mat-tui-calendar.umd.js +1170 -13
- package/bundles/ngx-mat-tui-calendar.umd.js.map +1 -1
- package/esm2015/lib/calendar-editor-options.js +2 -0
- package/esm2015/lib/calendar-options.js +2 -0
- package/esm2015/lib/local-date.js +102 -0
- package/esm2015/lib/ngx-mat-tui-calendar-editor-dialog/ngx-mat-tui-calendar-editor-dialog.component.js +147 -0
- package/esm2015/lib/ngx-mat-tui-calendar-wrapper/ngx-mat-tui-calendar-wrapper.component.js +19 -0
- package/esm2015/lib/ngx-mat-tui-calendar.component.js +496 -16
- package/esm2015/lib/ngx-mat-tui-calendar.module.js +109 -4
- package/esm2015/public-api.js +4 -1
- package/fesm2015/ngx-mat-tui-calendar.js +852 -19
- package/fesm2015/ngx-mat-tui-calendar.js.map +1 -1
- package/lib/calendar-editor-options.d.ts +6 -0
- package/lib/calendar-options.d.ts +6 -0
- package/lib/local-date.d.ts +43 -0
- package/lib/ngx-mat-tui-calendar-editor-dialog/ngx-mat-tui-calendar-editor-dialog.component.d.ts +35 -0
- package/lib/ngx-mat-tui-calendar-wrapper/ngx-mat-tui-calendar-wrapper.component.d.ts +8 -0
- package/lib/ngx-mat-tui-calendar.component.d.ts +71 -4
- package/lib/ngx-mat-tui-calendar.module.d.ts +24 -1
- package/package.json +34 -9
- package/public-api.d.ts +3 -0
@@ -1,26 +1,506 @@
|
|
1
|
-
import { Component } from '@angular/core';
|
1
|
+
import { Component, Output, EventEmitter, Input } from '@angular/core';
|
2
|
+
import { MatDialogConfig } from '@angular/material/dialog';
|
3
|
+
import distinctColors from 'distinct-colors';
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
5
|
+
import { faCalendarCheck, faTable, faColumns, faListAlt, faForward, faBackward, faCaretLeft, faCaretRight, } from '@fortawesome/free-solid-svg-icons';
|
6
|
+
import { default as Calendar, } from 'tui-calendar';
|
7
|
+
// project
|
8
|
+
import { LocalDate } from './local-date.js';
|
9
|
+
import { NgxMatTuiCalendarEditorDialogComponent } from './ngx-mat-tui-calendar-editor-dialog/ngx-mat-tui-calendar-editor-dialog.component';
|
2
10
|
import * as i0 from "@angular/core";
|
11
|
+
import * as i1 from "@angular/material/dialog";
|
12
|
+
import * as i2 from "@angular/material/toolbar";
|
13
|
+
import * as i3 from "@angular/material/button";
|
14
|
+
import * as i4 from "@fortawesome/angular-fontawesome";
|
15
|
+
import * as i5 from "@angular/material/button-toggle";
|
16
|
+
import * as i6 from "./ngx-mat-tui-calendar-wrapper/ngx-mat-tui-calendar-wrapper.component";
|
3
17
|
export class NgxMatTuiCalendarComponent {
|
4
|
-
constructor() {
|
18
|
+
constructor(dialog) {
|
19
|
+
this.dialog = dialog;
|
20
|
+
this.iconToday = faCalendarCheck;
|
21
|
+
// iconPrev = faCaretSquareLeft;
|
22
|
+
// iconNext = faCaretSquareRight;
|
23
|
+
this.iconPrev = faCaretLeft;
|
24
|
+
this.iconNext = faCaretRight;
|
25
|
+
this.iconLongPrev = faBackward;
|
26
|
+
this.iconLongNext = faForward;
|
27
|
+
this.iconByMonth = faTable;
|
28
|
+
this.iconByWeek = faColumns;
|
29
|
+
this.iconByDay = faListAlt;
|
30
|
+
this.userCreatedSchedule = new EventEmitter();
|
31
|
+
this.userUpdatedSchedule = new EventEmitter();
|
32
|
+
this.userDeletedSchedule = new EventEmitter();
|
33
|
+
// we slice off the first color since it is gray
|
34
|
+
this.colors = distinctColors({ lightMin: 70, count: 15 }).slice(1);
|
35
|
+
this.colorIndex = 0;
|
36
|
+
this.calendarId = uuidv4();
|
37
|
+
}
|
5
38
|
ngOnInit() {
|
39
|
+
this.createTUICalendar(null);
|
40
|
+
this.bindCallbacks();
|
41
|
+
}
|
42
|
+
ngOnChanges(changes) {
|
43
|
+
console.warn(changes);
|
44
|
+
if (this.calendar) {
|
45
|
+
if (changes.options) {
|
46
|
+
console.warn(`change.option:`, changes.options);
|
47
|
+
let options = changes.options.currentValue;
|
48
|
+
if (!options.theme) {
|
49
|
+
options.theme = this.getDefaultTheme();
|
50
|
+
}
|
51
|
+
console.warn(`TUI theme:`, options.theme);
|
52
|
+
this.calendar.setOptions(options.ioptions);
|
53
|
+
this.calendar.setTheme(options.theme);
|
54
|
+
this.calendar.render(true);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
ngOnDestroy() {
|
59
|
+
this.calendar.destroy();
|
60
|
+
}
|
61
|
+
onCalendarLongPrev() {
|
62
|
+
let date = this.calendar.getDate().toDate();
|
63
|
+
let days = 0;
|
64
|
+
let months = 0;
|
65
|
+
let years = 0;
|
66
|
+
switch (this.calendar.getViewName()) {
|
67
|
+
case 'day':
|
68
|
+
days = -7;
|
69
|
+
break;
|
70
|
+
case 'week':
|
71
|
+
days = -28;
|
72
|
+
break;
|
73
|
+
case 'month':
|
74
|
+
years = -1;
|
75
|
+
break;
|
76
|
+
}
|
77
|
+
date.setFullYear(date.getFullYear() + years);
|
78
|
+
date.setMonth(date.getMonth() + months); // date class does the modular arithmetic
|
79
|
+
date.setDate(date.getDate() + days); // date class does the modular arithmetic
|
80
|
+
this.calendar.setDate(date);
|
81
|
+
}
|
82
|
+
onCalendarPrev() {
|
83
|
+
this.calendar.prev();
|
84
|
+
}
|
85
|
+
onCalendarToday() {
|
86
|
+
this.calendar.today();
|
87
|
+
}
|
88
|
+
onCalendarNext() {
|
89
|
+
this.calendar.next();
|
90
|
+
}
|
91
|
+
onCalendarLongNext() {
|
92
|
+
let date = this.calendar.getDate().toDate();
|
93
|
+
let days = 0;
|
94
|
+
let months = 0;
|
95
|
+
let years = 0;
|
96
|
+
switch (this.calendar.getViewName()) {
|
97
|
+
case 'day':
|
98
|
+
days = 7;
|
99
|
+
break;
|
100
|
+
case 'week':
|
101
|
+
days = 28;
|
102
|
+
break;
|
103
|
+
case 'month':
|
104
|
+
years = 1;
|
105
|
+
break;
|
106
|
+
}
|
107
|
+
date.setFullYear(date.getFullYear() + years);
|
108
|
+
date.setMonth(date.getMonth() + months); // date class does the modular arithmetic
|
109
|
+
date.setDate(date.getDate() + days); // date class does the modular arithmetic
|
110
|
+
this.calendar.setDate(date);
|
111
|
+
}
|
112
|
+
onMonthView() {
|
113
|
+
this.calendar.changeView('month');
|
114
|
+
}
|
115
|
+
onWeekView() {
|
116
|
+
this.calendar.changeView('week');
|
117
|
+
}
|
118
|
+
onDayView() {
|
119
|
+
this.calendar.changeView('day');
|
120
|
+
}
|
121
|
+
getDate() {
|
122
|
+
let date = this.calendar.getDate();
|
123
|
+
let str = date.toDate().toLocaleDateString("en-US", {
|
124
|
+
year: 'numeric',
|
125
|
+
month: 'short',
|
126
|
+
});
|
127
|
+
return str;
|
128
|
+
}
|
129
|
+
createTUICalendar(options) {
|
130
|
+
this.calendar = new Calendar('#calendar', this.prerocessOptions(options));
|
131
|
+
}
|
132
|
+
bindCallbacks() {
|
133
|
+
this.bindAfterRenderSchedule();
|
134
|
+
this.bindClickTimezonesCollapseBtn();
|
135
|
+
this.bindClickDayname();
|
136
|
+
this.bindClickMore();
|
137
|
+
this.bindClickSchedule();
|
138
|
+
this.bindBeforeCreateSchedule();
|
139
|
+
this.bindBeforeUpdateSchedule();
|
140
|
+
this.bindBeforeDeleteSchedule();
|
141
|
+
}
|
142
|
+
bindAfterRenderSchedule() {
|
143
|
+
let that = this;
|
144
|
+
this.calendar.on('afterRenderSchedule', function (event) {
|
145
|
+
// console.warn(`afterRenderSchedule`, event);
|
146
|
+
});
|
147
|
+
}
|
148
|
+
bindClickTimezonesCollapseBtn() {
|
149
|
+
let that = this;
|
150
|
+
this.calendar.on('clickTimezonesCollapseBtn', function (timezonesCollapsed) {
|
151
|
+
// console.warn(`clickTimezonesCollapseBtn`, timezonesCollapsed);
|
152
|
+
});
|
153
|
+
}
|
154
|
+
bindClickDayname() {
|
155
|
+
let that = this;
|
156
|
+
this.calendar.on('clickDayname', function (event) {
|
157
|
+
// console.warn(`clickDayname`, event);
|
158
|
+
});
|
159
|
+
}
|
160
|
+
bindClickMore() {
|
161
|
+
let that = this;
|
162
|
+
this.calendar.on('clickMore', function (event) {
|
163
|
+
// console.warn(`clickMore`, event);
|
164
|
+
});
|
165
|
+
}
|
166
|
+
bindClickSchedule() {
|
167
|
+
// only works if useDetailPopup: false,
|
168
|
+
let that = this;
|
169
|
+
this.calendar.on('clickSchedule', function (event) {
|
170
|
+
// console.warn(`clickSchedule`, event);
|
171
|
+
let schedule = Object.assign({}, event.schedule);
|
172
|
+
schedule.start = (new LocalDate(schedule.start)).toDate();
|
173
|
+
schedule.end = (new LocalDate(schedule.end)).toDate();
|
174
|
+
that.openPopupScheduleEditor(schedule);
|
175
|
+
});
|
176
|
+
}
|
177
|
+
bindBeforeCreateSchedule() {
|
178
|
+
let that = this;
|
179
|
+
this.calendar.on('beforeCreateSchedule', function (event) {
|
180
|
+
// console.log(`beforeCreateSchedule`, event);
|
181
|
+
let start = (new LocalDate(event.start)).toDate();
|
182
|
+
start.setHours(9);
|
183
|
+
let end = (new LocalDate(event.end)).toDate();
|
184
|
+
end.setHours(10);
|
185
|
+
that.openPopupScheduleEditor({
|
186
|
+
title: '',
|
187
|
+
start: start,
|
188
|
+
end: end,
|
189
|
+
id: null,
|
190
|
+
});
|
191
|
+
});
|
192
|
+
}
|
193
|
+
bindBeforeUpdateSchedule() {
|
194
|
+
let that = this;
|
195
|
+
this.calendar.on('beforeUpdateSchedule', function (event) {
|
196
|
+
// console.log(`beforeUpdateSchedule`, event);
|
197
|
+
that.updateScheduleAndNotifyParent(event);
|
198
|
+
});
|
199
|
+
}
|
200
|
+
bindBeforeDeleteSchedule() {
|
201
|
+
let that = this;
|
202
|
+
this.calendar.on('beforeDeleteSchedule', function (event) {
|
203
|
+
// console.log(`beforeDeleteSchedule`, event.schedule);
|
204
|
+
// console.log(`beforeDeleteSchedule`, event.schedule);
|
205
|
+
that.deleteScheduleAndNotifyParent({ id: event.schedule.id, calendarId: event.schedule.calendarId });
|
206
|
+
});
|
207
|
+
}
|
208
|
+
nextColor() {
|
209
|
+
let color = this.colors[this.colorIndex++].hex();
|
210
|
+
if (this.colorIndex >= this.colors.length)
|
211
|
+
this.colorIndex = 0;
|
212
|
+
return color;
|
213
|
+
}
|
214
|
+
createScheduleAndNotifyParent(args) {
|
215
|
+
let schedule = this.createSchedule(args);
|
216
|
+
this.userCreatedSchedule.emit(schedule);
|
217
|
+
return schedule;
|
218
|
+
}
|
219
|
+
createSchedules(schedules) {
|
220
|
+
let newSchedules = [];
|
221
|
+
for (let schedule of schedules) {
|
222
|
+
newSchedules.push(this.createSchedule(schedule));
|
223
|
+
}
|
224
|
+
return newSchedules;
|
225
|
+
}
|
226
|
+
createSchedule(args) {
|
227
|
+
// if (form.invalid) return;
|
228
|
+
// create a color
|
229
|
+
let color = this.nextColor();
|
230
|
+
// console.log(color);
|
231
|
+
// create an id
|
232
|
+
let id = (args.id == null) ? '' : args.id.toString();
|
233
|
+
if (id.length === 0) {
|
234
|
+
id = uuidv4();
|
235
|
+
}
|
236
|
+
let start = LocalDate.convertToJsDate(args.start);
|
237
|
+
let end = LocalDate.convertToJsDate(args.end);
|
238
|
+
let schedule = {
|
239
|
+
id,
|
240
|
+
calendarId: (args.calendarId == null) ? this.calendarId : args.calendarId,
|
241
|
+
title: args.title,
|
242
|
+
start: start,
|
243
|
+
end: end,
|
244
|
+
category: args.category,
|
245
|
+
isAllDay: args.isAllDay,
|
246
|
+
dueDateClass: '',
|
247
|
+
bgColor: color,
|
248
|
+
};
|
249
|
+
// console.log(`event-calendar.component.ts: createEvent:`, schedule);
|
250
|
+
this.calendar.createSchedules([schedule]);
|
251
|
+
return this.calendar.getSchedule(schedule.id, schedule.calendarId);
|
252
|
+
}
|
253
|
+
updateScheduleAndNotifyParent(args) {
|
254
|
+
let schedule = this.updateSchedule(args);
|
255
|
+
this.userUpdatedSchedule.emit(schedule);
|
256
|
+
return schedule;
|
257
|
+
}
|
258
|
+
updateSchedule(schedule) {
|
259
|
+
// console.log(`event-calendar.component.ts: updateSchedule:`, schedule);
|
260
|
+
let calendarId = (schedule.calendarId == null) ? this.calendarId : schedule.calendarId;
|
261
|
+
this.calendar.updateSchedule(schedule.id, calendarId, schedule, false);
|
262
|
+
return this.calendar.getSchedule(schedule.id, calendarId);
|
263
|
+
}
|
264
|
+
getSchedule(args) {
|
265
|
+
// console.log(`event-calendar.component.ts: getSchedule:`, schedule);
|
266
|
+
let calendarId = (args.calendarId == null) ? this.calendarId : args.calendarId;
|
267
|
+
return this.calendar.getSchedule(args.id, calendarId);
|
268
|
+
}
|
269
|
+
deleteScheduleAndNotifyParent(args) {
|
270
|
+
this.deleteSchedule(args);
|
271
|
+
let calendarId = (args.calendarId == null) ? this.calendarId : args.calendarId;
|
272
|
+
this.userDeletedSchedule.emit({ id: args.id, calendarId });
|
273
|
+
}
|
274
|
+
deleteSchedule(args) {
|
275
|
+
// console.log(`event-calendar.component.ts: deleteSchedule:`, schedule);
|
276
|
+
let calendarId = (args.calendarId == null) ? this.calendarId : args.calendarId;
|
277
|
+
this.calendar.deleteSchedule(args.id, calendarId, false);
|
278
|
+
}
|
279
|
+
deleteAllSchedules() {
|
280
|
+
this.calendar.clear();
|
281
|
+
}
|
282
|
+
openPopupScheduleEditor(schedule) {
|
283
|
+
// console.log('openPopupScheduleEditor: calevent:', schedule);
|
284
|
+
const dialogConfig = new MatDialogConfig();
|
285
|
+
dialogConfig.panelClass = this.options.themeClass;
|
286
|
+
console.warn(`options: `, this.options);
|
287
|
+
dialogConfig.data = { schedule, darkMode: this.options.darkMode, themeClass: this.options.themeClass };
|
288
|
+
dialogConfig.autoFocus = true;
|
289
|
+
const dialogRef = this.dialog.open(NgxMatTuiCalendarEditorDialogComponent, dialogConfig);
|
290
|
+
// const dialogRef = this.dialog.open(NgxMatTuiCalendarScheduleEditorDialogComponent, {
|
291
|
+
// data: schedule,
|
292
|
+
// });
|
293
|
+
dialogRef.afterClosed().subscribe((result) => {
|
294
|
+
// console.log('openPopupScheduleEditor: The dialog was closed', result);
|
295
|
+
this.calendar.render(true); // <-- so that selection is cleared
|
296
|
+
if (result && result.schedule) {
|
297
|
+
let schedule = result.schedule;
|
298
|
+
if (result.performDelete == true) {
|
299
|
+
// delete
|
300
|
+
// console.log(`openPopupScheduleEditor:afterCLosed: deleteSchedule`);
|
301
|
+
this.deleteScheduleAndNotifyParent({ id: schedule.id, calendarId: schedule.calendarId });
|
302
|
+
}
|
303
|
+
else if (schedule.id == null) {
|
304
|
+
// console.log(`openPopupScheduleEditor:afterCLosed: addSchedule`);
|
305
|
+
this.createScheduleAndNotifyParent(schedule);
|
306
|
+
}
|
307
|
+
else {
|
308
|
+
// console.log(`openPopupScheduleEditor:afterCLosed: updateSchedule`);
|
309
|
+
this.updateScheduleAndNotifyParent(schedule);
|
310
|
+
}
|
311
|
+
}
|
312
|
+
});
|
313
|
+
}
|
314
|
+
setOptions(options) {
|
315
|
+
this.calendar.setOptions(this.prerocessOptions(options));
|
316
|
+
}
|
317
|
+
prerocessOptions(options) {
|
318
|
+
let defs = this.getDefaultOptions();
|
319
|
+
if (options == null) {
|
320
|
+
options = defs;
|
321
|
+
}
|
322
|
+
else {
|
323
|
+
options = Object.assign(Object.assign({}, defs), options);
|
324
|
+
}
|
325
|
+
options.useCreationPopup = false;
|
326
|
+
options.useDetailPopup = false;
|
327
|
+
return options;
|
328
|
+
}
|
329
|
+
getDefaultOptions() {
|
330
|
+
return {
|
331
|
+
defaultView: 'month',
|
332
|
+
taskView: true,
|
333
|
+
useCreationPopup: false,
|
334
|
+
useDetailPopup: false,
|
335
|
+
theme: this.getDefaultTheme(),
|
336
|
+
template: {
|
337
|
+
monthDayname: function (dayname) {
|
338
|
+
return '<span class="calendar-week-dayname-name">' + dayname.label + '</span>';
|
339
|
+
}
|
340
|
+
},
|
341
|
+
week: {
|
342
|
+
// startDayOfWeek: undefined,
|
343
|
+
// daynames: undefined,
|
344
|
+
narrowWeekend: false,
|
345
|
+
// workweek: true,
|
346
|
+
showTimezoneCollapseButton: true,
|
347
|
+
timezonesCollapsed: true,
|
348
|
+
hourStart: 7,
|
349
|
+
hourEnd: 20,
|
350
|
+
},
|
351
|
+
};
|
352
|
+
}
|
353
|
+
getColor(name) {
|
354
|
+
const el = document.getElementById(`theme-${name}`);
|
355
|
+
if (el) {
|
356
|
+
const style = window.getComputedStyle(el, null);
|
357
|
+
console.warn(`color:`, style.color);
|
358
|
+
return style.color;
|
359
|
+
}
|
360
|
+
return '';
|
361
|
+
}
|
362
|
+
getDefaultTheme() {
|
363
|
+
function adjustHexOpacity(color, opacity) {
|
364
|
+
const r = parseInt(color.slice(1, 3), 16);
|
365
|
+
const g = parseInt(color.slice(3, 5), 16);
|
366
|
+
const b = parseInt(color.slice(5, 7), 16);
|
367
|
+
return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + opacity + ')';
|
368
|
+
}
|
369
|
+
// default keys and styles
|
370
|
+
// TODO: apply Material Design Theme
|
371
|
+
let background = this.getColor("background");
|
372
|
+
let border = this.getColor("divider");
|
373
|
+
let borderLight = this.getColor("divider-light");
|
374
|
+
let shadow = this.getColor("divider");
|
375
|
+
let highlight = this.getColor("highlight");
|
376
|
+
let primary = this.getColor("primary");
|
377
|
+
let warn = this.getColor("warn");
|
378
|
+
let text = this.getColor("foreground");
|
379
|
+
let primaryShaded = this.getColor("primary-shaded");
|
380
|
+
// tui-full-calendar-weekday-schedule-title
|
381
|
+
//calendar-week-dayname-name
|
382
|
+
return {
|
383
|
+
'common.border': `1px solid ${border}`,
|
384
|
+
'common.backgroundColor': background,
|
385
|
+
'common.holiday.color': warn,
|
386
|
+
'common.saturday.color': text,
|
387
|
+
'common.dayname.color': text,
|
388
|
+
'common.today.color': '#0f0',
|
389
|
+
// creation guide style
|
390
|
+
'common.creationGuide.backgroundColor': primaryShaded,
|
391
|
+
'common.creationGuide.border': `1px solid ${highlight}`,
|
392
|
+
// month header 'dayname'
|
393
|
+
'month.dayname.height': '31px',
|
394
|
+
'month.dayname.borderLeft': `1px solid ${border}`,
|
395
|
+
'month.dayname.paddingLeft': '10px',
|
396
|
+
'month.dayname.paddingRight': '10px',
|
397
|
+
'month.dayname.backgroundColor': 'inherit',
|
398
|
+
'month.dayname.fontSize': '12px',
|
399
|
+
'month.dayname.fontWeight': 'normal',
|
400
|
+
'month.dayname.textAlign': 'left',
|
401
|
+
// month day grid cell 'day'
|
402
|
+
'month.holidayExceptThisMonth.color': 'rgba(255, 64, 64, 0.4)',
|
403
|
+
'month.dayExceptThisMonth.color': 'rgba(51, 51, 51, 0.4)',
|
404
|
+
'month.weekend.backgroundColor': 'inherit',
|
405
|
+
'month.day.fontSize': '14px',
|
406
|
+
'month.schedule.color': highlight,
|
407
|
+
// month schedule style
|
408
|
+
'month.schedule.borderRadius': '2px',
|
409
|
+
'month.schedule.height': '24px',
|
410
|
+
'month.schedule.marginTop': '2px',
|
411
|
+
'month.schedule.marginLeft': '8px',
|
412
|
+
'month.schedule.marginRight': '8px',
|
413
|
+
// month more view
|
414
|
+
'month.moreView.border': `1px solid ${border}`,
|
415
|
+
'month.moreView.boxShadow': `0 2px 6px 0 ${shadow}`,
|
416
|
+
'month.moreView.backgroundColor': background,
|
417
|
+
'month.moreView.paddingBottom': '17px',
|
418
|
+
'month.moreViewTitle.height': '44px',
|
419
|
+
'month.moreViewTitle.marginBottom': '12px',
|
420
|
+
'month.moreViewTitle.backgroundColor': 'inherit',
|
421
|
+
'month.moreViewTitle.borderBottom': 'none',
|
422
|
+
'month.moreViewTitle.padding': '12px 17px 0 17px',
|
423
|
+
'month.moreViewList.padding': '0 17px',
|
424
|
+
// week header 'dayname'
|
425
|
+
'week.dayname.height': '42px',
|
426
|
+
'week.dayname.borderTop': `1px solid ${border}`,
|
427
|
+
'week.dayname.borderBottom': `1px solid ${border}`,
|
428
|
+
'week.dayname.borderLeft': 'inherit',
|
429
|
+
'week.dayname.paddingLeft': '0',
|
430
|
+
'week.dayname.backgroundColor': 'inherit',
|
431
|
+
'week.dayname.textAlign': 'left',
|
432
|
+
'week.today.color': text,
|
433
|
+
'week.pastDay.color': borderLight,
|
434
|
+
// week vertical panel 'vpanel'
|
435
|
+
'week.vpanelSplitter.border': `1px solid ${border}`,
|
436
|
+
'week.vpanelSplitter.height': '3px',
|
437
|
+
// week daygrid 'daygrid'
|
438
|
+
'week.daygrid.borderRight': `1px solid ${border}`,
|
439
|
+
'week.daygrid.backgroundColor': background,
|
440
|
+
'week.daygridLeft.width': '72px',
|
441
|
+
'week.daygridLeft.backgroundColor': background,
|
442
|
+
'week.daygridLeft.paddingRight': '8px',
|
443
|
+
'week.daygridLeft.borderRight': `1px solid ${border}`,
|
444
|
+
'week.today.backgroundColor': primaryShaded,
|
445
|
+
'week.weekend.backgroundColor': 'inherit',
|
446
|
+
// week timegrid 'timegrid'
|
447
|
+
'week.timegridLeft.width': '72px',
|
448
|
+
'week.timegridLeft.backgroundColor': 'inherit',
|
449
|
+
'week.timegridLeft.borderRight': `1px solid ${border}`,
|
450
|
+
'week.timegridLeft.fontSize': '11px',
|
451
|
+
'week.timegridLeftTimezoneLabel.height': '40px',
|
452
|
+
'week.timegridLeftAdditionalTimezone.backgroundColor': background,
|
453
|
+
'week.timegridOneHour.height': '52px',
|
454
|
+
'week.timegridHalfHour.height': '26px',
|
455
|
+
'week.timegridHalfHour.borderBottom': 'none',
|
456
|
+
'week.timegridHorizontalLine.borderBottom': `1px solid ${border}`,
|
457
|
+
'week.timegrid.paddingRight': '8px',
|
458
|
+
'week.timegrid.borderRight': `1px solid ${border}`,
|
459
|
+
'week.timegridSchedule.borderRadius': '2px',
|
460
|
+
'week.timegridSchedule.paddingLeft': '2px',
|
461
|
+
// #515ce6 is a slate blue
|
462
|
+
'week.currentTime.color': highlight,
|
463
|
+
'week.currentTime.fontSize': '11px',
|
464
|
+
'week.currentTime.fontWeight': 'normal',
|
465
|
+
'week.pastTime.color': borderLight,
|
466
|
+
'week.pastTime.fontWeight': 'normal',
|
467
|
+
'week.futureTime.color': border,
|
468
|
+
'week.futureTime.fontWeight': 'normal',
|
469
|
+
'week.currentTimeLinePast.border': `1px dashed ${highlight}`,
|
470
|
+
'week.currentTimeLineBullet.backgroundColor': highlight,
|
471
|
+
'week.currentTimeLineToday.border': `1px solid ${highlight}`,
|
472
|
+
'week.currentTimeLineFuture.border': 'none',
|
473
|
+
// week creation guide style
|
474
|
+
'week.creationGuide.color': highlight,
|
475
|
+
'week.creationGuide.fontSize': '11px',
|
476
|
+
'week.creationGuide.fontWeight': 'bold',
|
477
|
+
// week daygrid schedule style
|
478
|
+
'week.dayGridSchedule.borderRadius': '2px',
|
479
|
+
'week.dayGridSchedule.height': '24px',
|
480
|
+
'week.dayGridSchedule.marginTop': '2px',
|
481
|
+
'week.dayGridSchedule.marginLeft': '8px',
|
482
|
+
'week.dayGridSchedule.marginRight': '8px'
|
483
|
+
};
|
6
484
|
}
|
7
485
|
}
|
8
|
-
NgxMatTuiCalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgxMatTuiCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
9
|
-
NgxMatTuiCalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: NgxMatTuiCalendarComponent, selector: "ngx-mat-tui-calendar", ngImport: i0, template:
|
10
|
-
<p>
|
11
|
-
ngx-mat-tui-calendar v0.0.11 works!
|
12
|
-
</p>
|
13
|
-
`, isInline: true });
|
486
|
+
NgxMatTuiCalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgxMatTuiCalendarComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
487
|
+
NgxMatTuiCalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: NgxMatTuiCalendarComponent, selector: "ngx-mat-tui-calendar", inputs: { options: "options" }, outputs: { userCreatedSchedule: "userCreatedSchedule", userUpdatedSchedule: "userUpdatedSchedule", userDeletedSchedule: "userDeletedSchedule" }, usesOnChanges: true, ngImport: i0, template: "<p>\r\n ngx-mat-tui-calendar v0.0.15 works!!!\r\n</p>\r\n<section class=\"content-container\">\r\n <!-- These divs are here so that we can read the theme colors for the tui theme -->\r\n <div id=\"theme-primary\"></div>\r\n <div id=\"theme-primary-shaded\"></div>\r\n <div id=\"theme-highlight\"></div>\r\n <div id=\"theme-accent\"></div>\r\n <div id=\"theme-warn\"></div>\r\n <div id=\"theme-foreground\"></div>\r\n <div id=\"theme-divider\"></div>\r\n <div id=\"theme-background\"></div>\r\n \r\n <div class=\"calendar-container\">\r\n <!-- calendar titlebar -->\r\n <mat-toolbar class=\"menu-bar\" color=\"primary\">\r\n <!-- <div style=\"align-self: center;display: flex;\r\n align-items: center;\r\n justify-content: flex-start;\"> -->\r\n <div style=\"display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n width: 100%; \">\r\n <div class=\"left-div\">\r\n <!-- LEFT -->\r\n <button mat-button \r\n class=\"navigation-button\"\r\n style=\"margin-left: 0px; margin-right: 0px; font-size: 1.5rem !important;\" \r\n (click)=\"onCalendarLongPrev()\">\r\n <fa-icon [icon]=\"iconLongPrev\"></fa-icon>\r\n </button>\r\n <button mat-button \r\n class=\"navigation-button\" \r\n style=\"margin-left: 0px; margin-right: 0px; font-size: 2rem !important;\" \r\n (click)=\"onCalendarPrev()\">\r\n <fa-icon [icon]=\"iconPrev\"></fa-icon>\r\n </button>\r\n <button mat-button \r\n class=\"navigation-button\"\r\n style=\"margin-left: 0px; margin-right: 0px; font-size: 1.7rem !important;\" \r\n (click)=\"onCalendarToday()\">\r\n <fa-icon [icon]=\"iconToday\"></fa-icon>\r\n </button>\r\n <button mat-button \r\n class=\"navigation-button\" \r\n style=\"margin-left: 0px; margin-right: 0px; font-size: 2rem !important;\" \r\n (click)=\"onCalendarNext()\">\r\n <fa-icon [icon]=\"iconNext\"></fa-icon>\r\n </button>\r\n <button mat-button \r\n class=\"navigation-button\"\r\n style=\"margin-left: 0px; margin-right: 0px; font-size: 1.5rem !important;\" \r\n (click)=\"onCalendarLongNext()\">\r\n <fa-icon [icon]=\"iconLongNext\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"center-div\">\r\n <!-- CENTER -->\r\n <span class=\"event-calendar-title\">{{ getDate() }}</span>\r\n </div>\r\n <div class=\"right-div\">\r\n \r\n <!-- RIGHT -->\r\n <mat-button-toggle-group class=\"view-button\" value=\"month\" id=\"@+id/toggleButton\" layout_width=\"wrap_content\"\r\n layout_height=\"wrap_content\">\r\n <mat-button-toggle mat-button value=\"month\" class=\"view-button\" (click)=\"onMonthView()\">\r\n <fa-icon [icon]=\"iconByMonth\"></fa-icon>\r\n </mat-button-toggle>\r\n <mat-button-toggle mat-button value=\"week\" class=\"view-button\" (click)=\"onWeekView()\">\r\n <fa-icon [icon]=\"iconByWeek\"></fa-icon>\r\n </mat-button-toggle>\r\n <mat-button-toggle mat-button value=\"day\" class=\"view-button\" (click)=\"onDayView()\">\r\n <fa-icon [icon]=\"iconByDay\"></fa-icon>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n </div>\r\n </mat-toolbar>\r\n <ngx-mat-tui-calendar-wrapper></ngx-mat-tui-calendar-wrapper>\r\n </div>\r\n \r\n </section>", styles: [".calendar-container{transform-origin:top left}.menu-bar{display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:2rem!important}.mat-button{font-size:1.1rem!important}.mat-button.navigation-button{padding:0;min-width:32px}.left-div{width:33%;float:left;display:flex;white-space:nowrap;vertical-align:middle}.center-div{width:33%;float:right;text-align:center;white-space:nowrap;vertical-align:middle}.event-calendar-title{font-size:2rem;vertical-align:middle}.right-div{width:33%;display:flex;white-space:nowrap;vertical-align:middle;flex-flow:row-reverse}@media screen and (max-width: 599px){.left-div{transform:scale(.75);transform-origin:center left}.center-div{transform:scale(.5)}.right-div{transform:scale(1);transform-origin:center right}.right-div .mat-button-toggle-group.view-button{font-size:1.1rem!important}.right-div ::ng-deep .mat-button-toggle-label-content{padding:0 8px!important}}.mat-button-toggle-group.view-button{height:36px;font-size:1.25rem!important}.view-button{align-items:center}::ng-deep .mat-button-toggle-label-content{padding:0 10px!important}\n"], components: [{ type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { type: i5.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-labelledby", "tabIndex", "appearance", "checked", "disabled", "id", "name", "aria-label", "value"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { type: i6.NgxMatTuiCalendarWrapperComponent, selector: "ngx-mat-tui-calendar-wrapper" }], directives: [{ type: i5.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }] });
|
14
488
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgxMatTuiCalendarComponent, decorators: [{
|
15
489
|
type: Component,
|
16
490
|
args: [{
|
17
491
|
selector: 'ngx-mat-tui-calendar',
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
`,
|
23
|
-
styles: []
|
492
|
+
templateUrl: './ngx-mat-tui-calendar.component.html',
|
493
|
+
styleUrls: [
|
494
|
+
'./ngx-mat-tui-calendar.component.scss'
|
495
|
+
],
|
24
496
|
}]
|
25
|
-
}], ctorParameters: function () { return []; }
|
26
|
-
|
497
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { userCreatedSchedule: [{
|
498
|
+
type: Output
|
499
|
+
}], userUpdatedSchedule: [{
|
500
|
+
type: Output
|
501
|
+
}], userDeletedSchedule: [{
|
502
|
+
type: Output
|
503
|
+
}], options: [{
|
504
|
+
type: Input
|
505
|
+
}] } });
|
506
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hdC10dWktY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdC10dWktY2FsZW5kYXIvc3JjL2xpYi9uZ3gtbWF0LXR1aS1jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0LXR1aS1jYWxlbmRhci9zcmMvbGliL25neC1tYXQtdHVpLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUEwRCxNQUFNLGVBQWUsQ0FBQztBQUNsSixPQUFPLEVBQWEsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBRXBGLE9BQU8sY0FBYyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFDTCxlQUFlLEVBR2YsT0FBTyxFQUNQLFNBQVMsRUFFVCxTQUFTLEVBQ1QsU0FBUyxFQUVULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxHQUNiLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUNMLE9BQU8sSUFBSSxRQUFRLEdBYXBCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLFdBQVc7QUFDWCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sbUZBQW1GLENBQUM7Ozs7Ozs7O0FBVzNJLE1BQU0sT0FBTywwQkFBMEI7SUFxQnJDLFlBQW9CLE1BQWlCO1FBQWpCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFwQnJDLGNBQVMsR0FBRyxlQUFlLENBQUM7UUFDNUIsZ0NBQWdDO1FBQ2hDLGlDQUFpQztRQUNqQyxhQUFRLEdBQUcsV0FBVyxDQUFDO1FB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QUFvQyxFQUFFLEtBQUs7WUFDM0MsbUNBQW1DLEVBQUUsS0FBSztZQUUxQywwQkFBMEI7WUFFMUIsd0JBQXdCLEVBQUUsU0FBUztZQUNuQywyQkFBMkIsRUFBRSxNQUFNO1lBQ25DLDZCQUE2QixFQUFFLFFBQVE7WUFFdkMscUJBQXFCLEVBQUUsV0FBVztZQUNsQywwQkFBMEIsRUFBRSxRQUFRO1lBRXBDLHVCQUF1QixFQUFFLE1BQU07WUFDL0IsNEJBQTRCLEVBQUUsUUFBUTtZQUV0QyxpQ0FBaUMsRUFBRSxjQUFjLFNBQVMsRUFBRTtZQUM1RCw0Q0FBNEMsRUFBRSxTQUFTO1lBQ3ZELGtDQUFrQyxFQUFFLGFBQWEsU0FBUyxFQUFFO1lBQzVELG1DQUFtQyxFQUFFLE1BQU07WUFFM0MsNEJBQTRCO1lBQzVCLDBCQUEwQixFQUFFLFNBQVM7WUFDckMsNkJBQTZCLEVBQUUsTUFBTTtZQUNyQywrQkFBK0IsRUFBRSxNQUFNO1lBRXZDLDhCQUE4QjtZQUM5QixtQ0FBbUMsRUFBRSxLQUFLO1lBQzFDLDZCQUE2QixFQUFFLE1BQU07WUFDckMsZ0NBQWdDLEVBQUUsS0FBSztZQUN2QyxpQ0FBaUMsRUFBRSxLQUFLO1lBQ3hDLGtDQUFrQyxFQUFFLEtBQUs7U0FDaEMsQ0FBQztJQUNkLENBQUM7O3dIQS9oQlUsMEJBQTBCOzRHQUExQiwwQkFBMEIsa1FDbER2QywwdUhBa0ZZOzRGRGhDQywwQkFBMEI7a0JBUHRDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsV0FBVyxFQUFFLHVDQUF1QztvQkFDcEQsU0FBUyxFQUFFO3dCQUNULHVDQUF1QztxQkFDeEM7aUJBQ0Y7Z0dBaUJXLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNFLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3ksIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQ29uZmlnLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5cclxuaW1wb3J0IGRpc3RpbmN0Q29sb3JzIGZyb20gJ2Rpc3RpbmN0LWNvbG9ycyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSBcImNocm9tYS1qc1wiO1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcclxuXHJcbmltcG9ydCB7XHJcbiAgZmFDYWxlbmRhckNoZWNrLFxyXG4gIGZhQ2FyZXRTcXVhcmVMZWZ0LFxyXG4gIGZhQ2FyZXRTcXVhcmVSaWdodCxcclxuICBmYVRhYmxlLFxyXG4gIGZhQ29sdW1ucyxcclxuICBmYUxpc3QsXHJcbiAgZmFMaXN0QWx0LFxyXG4gIGZhRm9yd2FyZCxcclxuICBmYUZhc3RCYWNrd2FyZCxcclxuICBmYUJhY2t3YXJkLFxyXG4gIGZhQ2FyZXRMZWZ0LFxyXG4gIGZhQ2FyZXRSaWdodCxcclxufSBmcm9tICdAZm9ydGF3ZXNvbWUvZnJlZS1zb2xpZC1zdmctaWNvbnMnO1xyXG5pbXBvcnQge1xyXG4gIGRlZmF1bHQgYXMgQ2FsZW5kYXIsXHJcbiAgSUNhbGVuZGFySW5mbyxcclxuICBJRXZlbnREYXRlT2JqZWN0LFxyXG4gIElFdmVudE1vcmVPYmplY3QsXHJcbiAgSUV2ZW50T2JqZWN0LFxyXG4gIElFdmVudFNjaGVkdWxlT2JqZWN0LFxyXG4gIElPcHRpb25zLFxyXG4gIElTY2hlZHVsZSxcclxuICBJVGhlbWUsXHJcbiAgSVRpbWV6b25lLFxyXG4gIElXZWVrT3B0aW9ucyxcclxuICBURXZlbnRCZWZvcmVDcmVhdGVTY2hlZHVsZSxcclxuICBUWkRhdGUsXHJcbn0gZnJvbSAndHVpLWNhbGVuZGFyJztcclxuXHJcbi8vIHByb2plY3QgXHJcbmltcG9ydCB7IExvY2FsRGF0ZSB9IGZyb20gJy4vbG9jYWwtZGF0ZS5qcyc7XHJcbmltcG9ydCB7IE5neE1hdFR1aUNhbGVuZGFyRWRpdG9yRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9uZ3gtbWF0LXR1aS1jYWxlbmRhci1lZGl0b3ItZGlhbG9nL25neC1tYXQtdHVpLWNhbGVuZGFyLWVkaXRvci1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2FsZW5kYXJPcHRpb25zIH0gZnJvbSAnLi9jYWxlbmRhci1vcHRpb25zJztcclxuaW1wb3J0IHsgQ2FsZW5kYXJFZGl0b3JPcHRpb25zIH0gZnJvbSAnLi9jYWxlbmRhci1lZGl0b3Itb3B0aW9ucyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25neC1tYXQtdHVpLWNhbGVuZGFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LW1hdC10dWktY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW1xyXG4gICAgJy4vbmd4LW1hdC10dWktY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neE1hdFR1aUNhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgaWNvblRvZGF5ID0gZmFDYWxlbmRhckNoZWNrO1xyXG4gIC8vIGljb25QcmV2ID0gZmFDYXJldFNxdWFyZUxlZnQ7XHJcbiAgLy8gaWNvbk5leHQgPSBmYUNhcmV0U3F1YXJlUmlnaHQ7XHJcbiAgaWNvblByZXYgPSBmYUNhcmV0TGVmdDtcclxuICBpY29uTmV4dCA9IGZhQ2FyZXRSaWdodDtcclxuICBpY29uTG9uZ1ByZXYgPSBmYUJhY2t3YXJkO1xyXG4gIGljb25Mb25nTmV4dCA9IGZhRm9yd2FyZDtcclxuICBpY29uQnlNb250aCA9IGZhVGFibGU7XHJcbiAgaWNvbkJ5V2VlayA9IGZhQ29sdW1ucztcclxuICBpY29uQnlEYXkgPSBmYUxpc3RBbHQ7XHJcblxyXG4gIGNhbGVuZGFyOiBDYWxlbmRhcjsgIC8vIHRoZSBUVUkgQ2FsZW5kYXIgT2JqZWN0XHJcbiAgY2FsZW5kYXJJZDogc3RyaW5nO1xyXG4gIGNvbG9yczogQ29sb3JbXTtcclxuICBjb2xvckluZGV4OiBudW1iZXI7XHJcbiAgQE91dHB1dCgpIHVzZXJDcmVhdGVkU2NoZWR1bGU6IEV2ZW50RW1pdHRlcjxJU2NoZWR1bGU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSB1c2VyVXBkYXRlZFNjaGVkdWxlOiBFdmVudEVtaXR0ZXI8SVNjaGVkdWxlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgdXNlckRlbGV0ZWRTY2hlZHVsZTogRXZlbnRFbWl0dGVyPElTY2hlZHVsZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQElucHV0KCkgb3B0aW9uczogQ2FsZW5kYXJPcHRpb25zO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nKSB7XHJcbiAgICAvLyB3ZSBzbGljZSBvZmYgdGhlIGZpcnN0IGNvbG9yIHNpbmNlIGl0IGlzIGdyYXlcclxuICAgIHRoaXMuY29sb3JzID0gZGlzdGluY3RDb2xvcnMoeyBsaWdodE1pbjogNzAsIGNvdW50OiAxNSB9KS5zbGljZSgxKTtcclxuICAgIHRoaXMuY29sb3JJbmRleCA9IDA7XHJcbiAgICB0aGlzLmNhbGVuZGFySWQgPSB1dWlkdjQoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVUVUlDYWxlbmRhcihudWxsKTtcclxuICAgIHRoaXMuYmluZENhbGxiYWNrcygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgY29uc29sZS53YXJuKGNoYW5nZXMpO1xyXG4gICAgaWYgKHRoaXMuY2FsZW5kYXIpIHtcclxuXHJcbiAgICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYGNoYW5nZS5vcHRpb246YCwgY2hhbmdlcy5vcHRpb25zKTtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IGNoYW5nZXMub3B0aW9ucy5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgaWYgKCFvcHRpb25zLnRoZW1lKSB7XHJcbiAgICAgICAgICBvcHRpb25zLnRoZW1lID0gdGhpcy5nZXREZWZhdWx0VGhlbWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBUVUkgdGhlbWU6YCwgb3B0aW9ucy50aGVtZSk7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhci5zZXRPcHRpb25zKG9wdGlvbnMuaW9wdGlvbnMgYXMgSU9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXIuc2V0VGhlbWUob3B0aW9ucy50aGVtZSk7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhci5yZW5kZXIodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuY2FsZW5kYXIuZGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgb25DYWxlbmRhckxvbmdQcmV2KCkge1xyXG4gICAgbGV0IGRhdGU6IERhdGUgPSAodGhpcy5jYWxlbmRhci5nZXREYXRlKCkgYXMgVFpEYXRlKS50b0RhdGUoKTtcclxuICAgIGxldCBkYXlzID0gMDtcclxuICAgIGxldCBtb250aHMgPSAwO1xyXG4gICAgbGV0IHllYXJzID0gMDtcclxuICAgIHN3aXRjaCAodGhpcy5jYWxlbmRhci5nZXRWaWV3TmFtZSgpKSB7XHJcbiAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgZGF5cyA9IC03O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICd3ZWVrJzpcclxuICAgICAgICBkYXlzID0gLTI4O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgeWVhcnMgPSAtMTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgeWVhcnMpO1xyXG4gICAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBtb250aHMpOyAgLy8gZGF0ZSBjbGFzcyBkb2VzIHRoZSBtb2R1bGFyIGFyaXRobWV0aWNcclxuICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRheXMpOyAgLy8gZGF0ZSBjbGFzcyBkb2VzIHRoZSBtb2R1bGFyIGFyaXRobWV0aWNcclxuICAgIHRoaXMuY2FsZW5kYXIuc2V0RGF0ZShkYXRlKTtcclxuICB9XHJcblxyXG4gIG9uQ2FsZW5kYXJQcmV2KCkge1xyXG4gICAgdGhpcy5jYWxlbmRhci5wcmV2KCk7XHJcbiAgfVxyXG5cclxuICBvbkNhbGVuZGFyVG9kYXkoKSB7XHJcbiAgICB0aGlzLmNhbGVuZGFyLnRvZGF5KCk7XHJcbiAgfVxyXG5cclxuICBvbkNhbGVuZGFyTmV4dCgpIHtcclxuICAgIHRoaXMuY2FsZW5kYXIubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgb25DYWxlbmRhckxvbmdOZXh0KCkge1xyXG4gICAgbGV0IGRhdGU6IERhdGUgPSAodGhpcy5jYWxlbmRhci5nZXREYXRlKCkgYXMgVFpEYXRlKS50b0RhdGUoKTtcclxuICAgIGxldCBkYXlzID0gMDtcclxuICAgIGxldCBtb250aHMgPSAwO1xyXG4gICAgbGV0IHllYXJzID0gMDtcclxuICAgIHN3aXRjaCAodGhpcy5jYWxlbmRhci5nZXRWaWV3TmFtZSgpKSB7XHJcbiAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgZGF5cyA9IDc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3dlZWsnOlxyXG4gICAgICAgIGRheXMgPSAyODtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbW9udGgnOlxyXG4gICAgICAgIHllYXJzID0gMTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgeWVhcnMpO1xyXG4gICAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBtb250aHMpOyAgLy8gZGF0ZSBjbGFzcyBkb2VzIHRoZSBtb2R1bGFyIGFyaXRobWV0aWNcclxuICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRheXMpOyAgLy8gZGF0ZSBjbGFzcyBkb2VzIHRoZSBtb2R1bGFyIGFyaXRobWV0aWNcclxuICAgIHRoaXMuY2FsZW5kYXIuc2V0RGF0ZShkYXRlKTtcclxuICB9XHJcblxyXG5cclxuICBvbk1vbnRoVmlldygpIHtcclxuICAgIHRoaXMuY2FsZW5kYXIuY2hhbmdlVmlldygnbW9udGgnKTtcclxuICB9XHJcblxyXG4gIG9uV2Vla1ZpZXcoKSB7XHJcbiAgICB0aGlzLmNhbGVuZGFyLmNoYW5nZVZpZXcoJ3dlZWsnKTtcclxuICB9XHJcblxyXG4gIG9uRGF5VmlldygpIHtcclxuICAgIHRoaXMuY2FsZW5kYXIuY2hhbmdlVmlldygnZGF5Jyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0RGF0ZSgpIHtcclxuICAgIGxldCBkYXRlID0gdGhpcy5jYWxlbmRhci5nZXREYXRlKCk7XHJcbiAgICBsZXQgc3RyID0gZGF0ZS50b0RhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoXCJlbi1VU1wiLCB7XHJcbiAgICAgIHllYXI6ICdudW1lcmljJyxcclxuICAgICAgbW9udGg6ICdzaG9ydCcsXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVUVUlDYWxlbmRhcihvcHRpb25zOiBJT3B0aW9ucykge1xyXG4gICAgdGhpcy5jYWxlbmRhciA9IG5ldyBDYWxlbmRhcignI2NhbGVuZGFyJywgdGhpcy5wcmVyb2Nlc3NPcHRpb25zKG9wdGlvbnMpKTtcclxuICB9XHJcblxyXG5cclxuICBiaW5kQ2FsbGJhY2tzKCkge1xyXG4gICAgdGhpcy5iaW5kQWZ0ZXJSZW5kZXJTY2hlZHVsZSgpO1xyXG4gICAgdGhpcy5iaW5kQ2xpY2tUaW1lem9uZXNDb2xsYXBzZUJ0bigpO1xyXG4gICAgdGhpcy5iaW5kQ2xpY2tEYXluYW1lKCk7XHJcbiAgICB0aGlzLmJpbmRDbGlja01vcmUoKTtcclxuICAgIHRoaXMuYmluZENsaWNrU2NoZWR1bGUoKTtcclxuICAgIHRoaXMuYmluZEJlZm9yZUNyZWF0ZVNjaGVkdWxlKCk7XHJcbiAgICB0aGlzLmJpbmRCZWZvcmVVcGRhdGVTY2hlZHVsZSgpO1xyXG4gICAgdGhpcy5iaW5kQmVmb3JlRGVsZXRlU2NoZWR1bGUoKTtcclxuICB9XHJcblxyXG4gIGJpbmRBZnRlclJlbmRlclNjaGVkdWxlKCkge1xyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgdGhpcy5jYWxlbmRhci5vbignYWZ0ZXJSZW5kZXJTY2hlZHVsZScsIGZ1bmN0aW9uIChldmVudDogeyBzY2hlZHVsZTogSVNjaGVkdWxlIH0pIHtcclxuICAgICAgLy8gY29uc29sZS53YXJuKGBhZnRlclJlbmRlclNjaGVkdWxlYCwgZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBiaW5kQ2xpY2tUaW1lem9uZXNDb2xsYXBzZUJ0bigpIHtcclxuICAgIGxldCB0aGF0ID0gdGhpcztcclxuICAgIHRoaXMuY2FsZW5kYXIub24oJ2NsaWNrVGltZXpvbmVzQ29sbGFwc2VCdG4nLCBmdW5jdGlvbiAodGltZXpvbmVzQ29sbGFwc2VkOiBib29sZWFuKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUud2FybihgY2xpY2tUaW1lem9uZXNDb2xsYXBzZUJ0bmAsIHRpbWV6b25lc0NvbGxhcHNlZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBiaW5kQ2xpY2tEYXluYW1lKCkge1xyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgdGhpcy5jYWxlbmRhci5vbignY2xpY2tEYXluYW1lJywgZnVuY3Rpb24gKGV2ZW50OiBJRXZlbnREYXRlT2JqZWN0KSB7XHJcbiAgICAgIC8vIGNvbnNvbGUud2FybihgY2xpY2tEYXluYW1lYCwgZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBiaW5kQ2xpY2tNb3JlKCkge1xyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgdGhpcy5jYWxlbmRhci5vbignY2xpY2tNb3JlJywgZnVuY3Rpb24gKGV2ZW50OiBJRXZlbnRNb3JlT2JqZWN0KSB7XHJcbiAgICAgIC8vIGNvbnNvbGUud2FybihgY2xpY2tNb3JlYCwgZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBiaW5kQ2xpY2tTY2hlZHVsZSgpIHtcclxuICAgIC8vIG9ubHkgd29ya3MgaWYgdXNlRGV0YWlsUG9wdXA6IGZhbHNlLFxyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgdGhpcy5jYWxlbmRhci5vbignY2xpY2tTY2hlZHVsZScsIGZ1bmN0aW9uIChldmVudDogSUV2ZW50U2NoZWR1bGVPYmplY3QpIHtcclxuICAgICAgLy8gY29uc29sZS53YXJuKGBjbGlja1NjaGVkdWxlYCwgZXZlbnQpO1xyXG4gICAgICBsZXQgc2NoZWR1bGU6IElTY2hlZHVsZSA9IHsgLi4uZXZlbnQuc2NoZWR1bGUgfTtcclxuICAgICAgc2NoZWR1bGUuc3RhcnQgPSAobmV3IExvY2FsRGF0ZShzY2hlZHVsZS5zdGFydCkpLnRvRGF0ZSgpO1xyXG4gICAgICBzY2hlZHVsZS5lbmQgPSAobmV3IExvY2FsRGF0ZShzY2hlZHVsZS5lbmQpKS50b0RhdGUoKTtcclxuICAgICAgdGhhdC5vcGVuUG9wdXBTY2hlZHVsZUVkaXRvcihzY2hlZHVsZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGJpbmRCZWZvcmVDcmVhdGVTY2hlZHVsZSgpIHtcclxuICAgIGxldCB0aGF0ID0gdGhpcztcclxuICAgIHRoaXMuY2FsZW5kYXIub24oJ2JlZm9yZUNyZWF0ZVNjaGVkdWxlJywgZnVuY3Rpb24gKGV2ZW50OiBURXZlbnRCZWZvcmVDcmVhdGVTY2hlZHVsZSkge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhgYmVmb3JlQ3JlYXRlU2NoZWR1bGVgLCBldmVudCk7XHJcbiAgICAgIGxldCBzdGFydDogRGF0ZSA9IChuZXcgTG9jYWxEYXRlKGV2ZW50LnN0YXJ0KSkudG9EYXRlKCk7XHJcbiAgICAgIHN0YXJ0LnNldEhvdXJzKDkpO1xyXG4gICAgICBsZXQgZW5kOiBEYXRlID0gKG5ldyBMb2NhbERhdGUoZXZlbnQuZW5kKSkudG9EYXRlKCk7XHJcbiAgICAgIGVuZC5zZXRIb3VycygxMCk7XHJcbiAgICAgIHRoYXQub3BlblBvcHVwU2NoZWR1bGVFZGl0b3Ioe1xyXG4gICAgICAgIHRpdGxlOiAnJyxcclxuICAgICAgICBzdGFydDogc3RhcnQsXHJcbiAgICAgICAgZW5kOiBlbmQsXHJcbiAgICAgICAgaWQ6IG51bGwsXHJcbiAgICAgIH0gYXMgSVNjaGVkdWxlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYmluZEJlZm9yZVVwZGF0ZVNjaGVkdWxlKCkge1xyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgdGhpcy5jYWxlbmRhci5vbignYmVmb3JlVXBkYXRlU2NoZWR1bGUnLCBmdW5jdGlvbiAoZXZlbnQ6IElFdmVudE9iamVjdCkge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhgYmVmb3JlVXBkYXRlU2NoZWR1bGVgLCBldmVudCk7XHJcbiAgICAgIHRoYXQudXBkYXRlU2NoZWR1bGVBbmROb3RpZnlQYXJlbnQoZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBiaW5kQmVmb3JlRGVsZXRlU2NoZWR1bGUoKSB7XHJcbiAgICBsZXQgdGhhdCA9IHRoaXM7XHJcbiAgICB0aGlzLmNhbGVuZGFyLm9uKCdiZWZvcmVEZWxldGVTY2hlZHVsZScsIGZ1bmN0aW9uIChldmVudDogSUV2ZW50U2NoZWR1bGVPYmplY3QpIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coYGJlZm9yZURlbGV0ZVNjaGVkdWxlYCwgZXZlbnQuc2NoZWR1bGUpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhgYmVmb3JlRGVsZXRlU2NoZWR1bGVgLCBldmVudC5zY2hlZHVsZSk7XHJcbiAgICAgIHRoYXQuZGVsZXRlU2NoZWR1bGVBbmROb3RpZnlQYXJlbnQoeyBpZDogZXZlbnQuc2NoZWR1bGUuaWQsIGNhbGVuZGFySWQ6IGV2ZW50LnNjaGVkdWxlLmNhbGVuZGFySWQgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5leHRDb2xvcigpIHtcclxuICAgIGxldCBjb2xvciA9IHRoaXMuY29sb3JzW3RoaXMuY29sb3JJbmRleCsrXS5oZXgoKTtcclxuICAgIGlmICh0aGlzLmNvbG9ySW5kZXggPj0gdGhpcy5jb2xvcnMubGVuZ3RoKSB0aGlzLmNvbG9ySW5kZXggPSAwO1xyXG4gICAgcmV0dXJuIGNvbG9yO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlU2NoZWR1bGVBbmROb3RpZnlQYXJlbnQoYXJnczogSVNjaGVkdWxlKSB7XHJcbiAgICBsZXQgc2NoZWR1bGUgPSB0aGlzLmNyZWF0ZVNjaGVkdWxlKGFyZ3MpO1xyXG4gICAgdGhpcy51c2VyQ3JlYXRlZFNjaGVkdWxlLmVtaXQoc2NoZWR1bGUpO1xyXG4gICAgcmV0dXJuIHNjaGVkdWxlO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlU2NoZWR1bGVzKHNjaGVkdWxlczogSVNjaGVkdWxlW10pIHtcclxuICAgIGxldCBuZXdTY2hlZHVsZXMgPSBbXTtcclxuICAgIGZvciAobGV0IHNjaGVkdWxlIG9mIHNjaGVkdWxlcykge1xyXG4gICAgICBuZXdTY2hlZHVsZXMucHVzaCh0aGlzLmNyZWF0ZVNjaGVkdWxlKHNjaGVkdWxlKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3U2NoZWR1bGVzO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlU2NoZWR1bGUoYXJnczogSVNjaGVkdWxlKTogSVNjaGVkdWxlIHtcclxuICAgIC8vIGlmIChmb3JtLmludmFsaWQpIHJldHVybjtcclxuXHJcbiAgICAvLyBjcmVhdGUgYSBjb2xvclxyXG4gICAgbGV0IGNvbG9yID0gdGhpcy5uZXh0Q29sb3IoKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKGNvbG9yKTtcclxuXHJcbiAgICAvLyBjcmVhdGUgYW4gaWRcclxuICAgIGxldCBpZCA9IChhcmdzLmlkID09IG51bGwpID8gJycgOiBhcmdzLmlkLnRvU3RyaW5nKCk7XHJcbiAgICBpZiAoaWQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGlkID0gdXVpZHY0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHN0YXJ0OiBEYXRlID0gTG9jYWxEYXRlLmNvbnZlcnRUb0pzRGF0ZShhcmdzLnN0YXJ0KTtcclxuICAgIGxldCBlbmQ6IERhdGUgPSBMb2NhbERhdGUuY29udmVydFRvSnNEYXRlKGFyZ3MuZW5kKTtcclxuXHJcbiAgICBsZXQgc2NoZWR1bGU6IElTY2hlZHVsZSA9IHtcclxuICAgICAgaWQsXHJcbiAgICAgIGNhbGVuZGFySWQ6IChhcmdzLmNhbGVuZGFySWQgPT0gbnVsbCkgPyB0aGlzLmNhbGVuZGFySWQgOiBhcmdzLmNhbGVuZGFySWQsXHJcbiAgICAgIHRpdGxlOiBhcmdzLnRpdGxlLFxyXG4gICAgICBzdGFydDogc3RhcnQsXHJcbiAgICAgIGVuZDogZW5kLFxyXG4gICAgICBjYXRlZ29yeTogYXJncy5jYXRlZ29yeSxcclxuICAgICAgaXNBbGxEYXk6IGFyZ3MuaXNBbGxEYXksXHJcbiAgICAgIGR1ZURhdGVDbGFzczogJycsXHJcbiAgICAgIGJnQ29sb3I6IGNvbG9yLFxyXG4gICAgfSBhcyBJU2NoZWR1bGVcclxuICAgIC8vIGNvbnNvbGUubG9nKGBldmVudC1jYWxlbmRhci5jb21wb25lbnQudHM6IGNyZWF0ZUV2ZW50OmAsIHNjaGVkdWxlKTtcclxuICAgIHRoaXMuY2FsZW5kYXIuY3JlYXRlU2NoZWR1bGVzKFtzY2hlZHVsZV0pO1xyXG4gICAgcmV0dXJuIHRoaXMuY2FsZW5kYXIuZ2V0U2NoZWR1bGUoc2NoZWR1bGUuaWQsIHNjaGVkdWxlLmNhbGVuZGFySWQpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2NoZWR1bGVBbmROb3RpZnlQYXJlbnQoYXJnczogSVNjaGVkdWxlKSB7XHJcbiAgICBsZXQgc2NoZWR1bGUgPSB0aGlzLnVwZGF0ZVNjaGVkdWxlKGFyZ3MpO1xyXG4gICAgdGhpcy51c2VyVXBkYXRlZFNjaGVkdWxlLmVtaXQoc2NoZWR1bGUpO1xyXG4gICAgcmV0dXJuIHNjaGVkdWxlO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2NoZWR1bGUoc2NoZWR1bGU6IElTY2hlZHVsZSkge1xyXG4gICAgLy8gY29uc29sZS5sb2coYGV2ZW50LWNhbGVuZGFyLmNvbXBvbmVudC50czogdXBkYXRlU2NoZWR1bGU6YCwgc2NoZWR1bGUpO1xyXG4gICAgbGV0IGNhbGVuZGFySWQgPSAoc2NoZWR1bGUuY2FsZW5kYXJJZCA9PSBudWxsKSA/IHRoaXMuY2FsZW5kYXJJZCA6IHNjaGVkdWxlLmNhbGVuZGFySWQ7XHJcbiAgICB0aGlzLmNhbGVuZGFyLnVwZGF0ZVNjaGVkdWxlKHNjaGVkdWxlLmlkLCBjYWxlbmRhcklkLCBzY2hlZHVsZSwgZmFsc2UpO1xyXG4gICAgcmV0dXJuIHRoaXMuY2FsZW5kYXIuZ2V0U2NoZWR1bGUoc2NoZWR1bGUuaWQsIGNhbGVuZGFySWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2NoZWR1bGUoYXJnczogeyBpZDogc3RyaW5nLCBjYWxlbmRhcklkOiBzdHJpbmcgfSkge1xyXG4gICAgLy8gY29uc29sZS5sb2coYGV2ZW50LWNhbGVuZGFyLmNvbXBvbmVudC50czogZ2V0U2NoZWR1bGU6YCwgc2NoZWR1bGUpO1xyXG4gICAgbGV0IGNhbGVuZGFySWQgPSAoYXJncy5jYWxlbmRhcklkID09IG51bGwpID8gdGhpcy5jYWxlbmRhcklkIDogYXJncy5jYWxlbmRhcklkO1xyXG4gICAgcmV0dXJuIHRoaXMuY2FsZW5kYXIuZ2V0U2NoZWR1bGUoYXJncy5pZCwgY2FsZW5kYXJJZCk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVTY2hlZHVsZUFuZE5vdGlmeVBhcmVudChhcmdzOiB7IGlkOiBzdHJpbmcsIGNhbGVuZGFySWQ6IHN0cmluZyB9KSB7XHJcbiAgICB0aGlzLmRlbGV0ZVNjaGVkdWxlKGFyZ3MpO1xyXG4gICAgbGV0IGNhbGVuZGFySWQgPSAoYXJncy5jYWxlbmRhcklkID09IG51bGwpID8gdGhpcy5jYWxlbmRhcklkIDogYXJncy5jYWxlbmRhcklkO1xyXG4gICAgdGhpcy51c2VyRGVsZXRlZFNjaGVkdWxlLmVtaXQoeyBpZDogYXJncy5pZCwgY2FsZW5kYXJJZCB9KTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZVNjaGVkdWxlKGFyZ3M6IHsgaWQ6IHN0cmluZywgY2FsZW5kYXJJZDogc3RyaW5nIH0pIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKGBldmVudC1jYWxlbmRhci5jb21wb25lbnQudHM6IGRlbGV0ZVNjaGVkdWxlOmAsIHNjaGVkdWxlKTtcclxuICAgIGxldCBjYWxlbmRhcklkID0gKGFyZ3MuY2FsZW5kYXJJZCA9PSBudWxsKSA/IHRoaXMuY2FsZW5kYXJJZCA6IGFyZ3MuY2FsZW5kYXJJZDtcclxuICAgIHRoaXMuY2FsZW5kYXIuZGVsZXRlU2NoZWR1bGUoYXJncy5pZCwgY2FsZW5kYXJJZCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlQWxsU2NoZWR1bGVzKCkge1xyXG4gICAgdGhpcy5jYWxlbmRhci5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgb3BlblBvcHVwU2NoZWR1bGVFZGl0b3Ioc2NoZWR1bGU6IElTY2hlZHVsZSkge1xyXG4gICAgLy8gY29uc29sZS5sb2coJ29wZW5Qb3B1cFNjaGVkdWxlRWRpdG9yOiBjYWxldmVudDonLCBzY2hlZHVsZSk7XHJcbiAgICBjb25zdCBkaWFsb2dDb25maWcgPSBuZXcgTWF0RGlhbG9nQ29uZmlnKCk7XHJcbiAgICBkaWFsb2dDb25maWcucGFuZWxDbGFzcyA9IHRoaXMub3B0aW9ucy50aGVtZUNsYXNzO1xyXG4gICAgY29uc29sZS53YXJuKGBvcHRpb25zOiBgLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgZGlhbG9nQ29uZmlnLmRhdGEgPSB7IHNjaGVkdWxlLCBkYXJrTW9kZTogdGhpcy5vcHRpb25zLmRhcmtNb2RlLCB0aGVtZUNsYXNzOiB0aGlzLm9wdGlvbnMudGhlbWVDbGFzcyB9IGFzIENhbGVuZGFyRWRpdG9yT3B0aW9ucztcclxuICAgIGRpYWxvZ0NvbmZpZy5hdXRvRm9jdXMgPSB0cnVlO1xyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRUdWlDYWxlbmRhckVkaXRvckRpYWxvZ0NvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcclxuICAgIC8vIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0VHVpQ2FsZW5kYXJTY2hlZHVsZUVkaXRvckRpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgLy8gICBkYXRhOiBzY2hlZHVsZSxcclxuICAgIC8vIH0pO1xyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IHsgc2NoZWR1bGU6IElTY2hlZHVsZSwgcGVyZm9ybURlbGV0ZTogYm9vbGVhbiB9KSA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdvcGVuUG9wdXBTY2hlZHVsZUVkaXRvcjogVGhlIGRpYWxvZyB3YXMgY2xvc2VkJywgcmVzdWx0KTtcclxuICAgICAgdGhpcy5jYWxlbmRhci5yZW5kZXIodHJ1ZSk7ICAvLyA8LS0gc28gdGhhdCBzZWxlY3Rpb24gaXMgY2xlYXJlZFxyXG4gICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5zY2hlZHVsZSkge1xyXG4gICAgICAgIGxldCBzY2hlZHVsZSA9IHJlc3VsdC5zY2hlZHVsZTtcclxuICAgICAgICBpZiAocmVzdWx0LnBlcmZvcm1EZWxldGUgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgLy8gZGVsZXRlXHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgb3BlblBvcHVwU2NoZWR1bGVFZGl0b3I6YWZ0ZXJDTG9zZWQ6IGRlbGV0ZVNjaGVkdWxlYCk7XHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZVNjaGVkdWxlQW5kTm90aWZ5UGFyZW50KHsgaWQ6IHNjaGVkdWxlLmlkLCBjYWxlbmRhcklkOiBzY2hlZHVsZS5jYWxlbmRhcklkIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc2NoZWR1bGUuaWQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coYG9wZW5Qb3B1cFNjaGVkdWxlRWRpdG9yOmFmdGVyQ0xvc2VkOiBhZGRTY2hlZHVsZWApO1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVTY2hlZHVsZUFuZE5vdGlmeVBhcmVudChzY2hlZHVsZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBvcGVuUG9wdXBTY2hlZHVsZUVkaXRvcjphZnRlckNMb3NlZDogdXBkYXRlU2NoZWR1bGVgKTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlU2NoZWR1bGVBbmROb3RpZnlQYXJlbnQoc2NoZWR1bGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRPcHRpb25zKG9wdGlvbnM6IElPcHRpb25zKSB7XHJcbiAgICB0aGlzLmNhbGVuZGFyLnNldE9wdGlvbnModGhpcy5wcmVyb2Nlc3NPcHRpb25zKG9wdGlvbnMpKTtcclxuICB9XHJcblxyXG4gIHByZXJvY2Vzc09wdGlvbnMob3B0aW9uczogSU9wdGlvbnMpOiBJT3B0aW9ucyB7XHJcbiAgICBsZXQgZGVmcyA9IHRoaXMuZ2V0RGVmYXVsdE9wdGlvbnMoKTtcclxuICAgIGlmIChvcHRpb25zID09IG51bGwpIHtcclxuICAgICAgb3B0aW9ucyA9IGRlZnM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvcHRpb25zID0geyAuLi5kZWZzLCAuLi5vcHRpb25zIH07XHJcbiAgICB9XHJcbiAgICBvcHRpb25zLnVzZUNyZWF0aW9uUG9wdXAgPSBmYWxzZTtcclxuICAgIG9wdGlvbnMudXNlRGV0YWlsUG9wdXAgPSBmYWxzZTtcclxuICAgIHJldHVybiBvcHRpb25zO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldERlZmF1bHRPcHRpb25zKCk6IElPcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRlZmF1bHRWaWV3OiAnbW9udGgnLFxyXG4gICAgICB0YXNrVmlldzogdHJ1ZSxcclxuICAgICAgdXNlQ3JlYXRpb25Qb3B1cDogZmFsc2UsXHJcbiAgICAgIHVzZURldGFpbFBvcHVwOiBmYWxzZSxcclxuICAgICAgdGhlbWU6IHRoaXMuZ2V0RGVmYXVsdFRoZW1lKCksXHJcbiAgICAgIHRlbXBsYXRlOiB7XHJcbiAgICAgICAgbW9udGhEYXluYW1lOiBmdW5jdGlvbiAoZGF5bmFtZSkge1xyXG4gICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz1cImNhbGVuZGFyLXdlZWstZGF5bmFtZS1uYW1lXCI+JyArIGRheW5hbWUubGFiZWwgKyAnPC9zcGFuPic7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB3ZWVrOiB7XHJcbiAgICAgICAgLy8gc3RhcnREYXlPZldlZWs6IHVuZGVmaW5lZCxcclxuICAgICAgICAvLyBkYXluYW1lczogdW5kZWZpbmVkLFxyXG4gICAgICAgIG5hcnJvd1dlZWtlbmQ6IGZhbHNlLFxyXG4gICAgICAgIC8vIHdvcmt3ZWVrOiB0cnVlLFxyXG4gICAgICAgIHNob3dUaW1lem9uZUNvbGxhcHNlQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgIHRpbWV6b25lc0NvbGxhcHNlZDogdHJ1ZSxcclxuICAgICAgICBob3VyU3RhcnQ6IDcsXHJcbiAgICAgICAgaG91ckVuZDogMjAsXHJcbiAgICAgIH0gYXMgSVdlZWtPcHRpb25zLFxyXG4gICAgfSBhcyBJT3B0aW9ucztcclxuXHJcbiAgfVxyXG5cclxuICBnZXRDb2xvcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdGhlbWUtJHtuYW1lfWApO1xyXG4gICAgaWYgKGVsKSB7XHJcbiAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpO1xyXG4gICAgICBjb25zb2xlLndhcm4oYGNvbG9yOmAsIHN0eWxlLmNvbG9yKTtcclxuICAgICAgcmV0dXJuIHN0eWxlLmNvbG9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVmYXVsdFRoZW1lKCk6IElUaGVtZSB7XHJcbiAgICBmdW5jdGlvbiBhZGp1c3RIZXhPcGFjaXR5KGNvbG9yLCBvcGFjaXR5KSB7XHJcbiAgICAgIGNvbnN0IHIgPSBwYXJzZUludChjb2xvci5zbGljZSgxLCAzKSwgMTYpO1xyXG4gICAgICBjb25zdCBnID0gcGFyc2VJbnQoY29sb3Iuc2xpY2UoMywgNSksIDE2KTtcclxuICAgICAgY29uc3QgYiA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDUsIDcpLCAxNik7XHJcblxyXG4gICAgICByZXR1cm4gJ3JnYmEoJyArIHIgKyAnLCAnICsgZyArICcsICcgKyBiICsgJywgJyArIG9wYWNpdHkgKyAnKSc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGVmYXVsdCBrZXlzIGFuZCBzdHlsZXNcclxuICAgIC8vIFRPRE86IGFwcGx5IE1hdGVyaWFsIERlc2lnbiBUaGVtZSBcclxuICAgIGxldCBiYWNrZ3JvdW5kID0gdGhpcy5nZXRDb2xvcihcImJhY2tncm91bmRcIik7XHJcbiAgICBsZXQgYm9yZGVyID0gdGhpcy5nZXRDb2xvcihcImRpdmlkZXJcIik7XHJcbiAgICBsZXQgYm9yZGVyTGlnaHQgPSB0aGlzLmdldENvbG9yKFwiZGl2aWRlci1saWdodFwiKTtcclxuICAgIGxldCBzaGFkb3cgPSB0aGlzLmdldENvbG9yKFwiZGl2aWRlclwiKTtcclxuICAgIGxldCBoaWdobGlnaHQgPSB0aGlzLmdldENvbG9yKFwiaGlnaGxpZ2h0XCIpO1xyXG4gICAgbGV0IHByaW1hcnkgPSB0aGlzLmdldENvbG9yKFwicHJpbWFyeVwiKTtcclxuICAgIGxldCB3YXJuID0gdGhpcy5nZXRDb2xvcihcIndhcm5cIik7XHJcbiAgICBsZXQgdGV4dCA9IHRoaXMuZ2V0Q29sb3IoXCJmb3JlZ3JvdW5kXCIpO1xyXG4gICAgbGV0IHByaW1hcnlTaGFkZWQgPSB0aGlzLmdldENvbG9yKFwicHJpbWFyeS1zaGFkZWRcIik7XHJcblxyXG4gICAgLy8gdHVpLWZ1bGwtY2FsZW5kYXItd2Vla2RheS1zY2hlZHVsZS10aXRsZVxyXG4gICAgLy9jYWxlbmRhci13ZWVrLWRheW5hbWUtbmFtZVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ2NvbW1vbi5ib3JkZXInOiBgMXB4IHNvbGlkICR7Ym9yZGVyfWAsXHJcbiAgICAgICdjb21tb24uYmFja2dyb3VuZENvbG9yJzogYmFja2dyb3VuZCxcclxuICAgICAgJ2NvbW1vbi5ob2xpZGF5LmNvbG9yJzogd2FybixcclxuICAgICAgJ2NvbW1vbi5zYXR1cmRheS5jb2xvcic6IHRleHQsXHJcbiAgICAgICdjb21tb24uZGF5bmFtZS5jb2xvcic6IHRleHQsXHJcbiAgICAgICdjb21tb24udG9kYXkuY29sb3InOiAnIzBmMCcsXHJcblxyXG4gICAgICAvLyBjcmVhdGlvbiBndWlkZSBzdHlsZVxyXG4gICAgICAnY29tbW9uLmNyZWF0aW9uR3VpZGUuYmFja2dyb3VuZENvbG9yJzogcHJpbWFyeVNoYWRlZCxcclxuICAgICAgJ2NvbW1vbi5jcmVhdGlvbkd1aWRlLmJvcmRlcic6IGAxcHggc29saWQgJHtoaWdobGlnaHR9YCxcclxuXHJcbiAgICAgIC8vIG1vbnRoIGhlYWRlciAnZGF5bmFtZSdcclxuICAgICAgJ21vbnRoLmRheW5hbWUuaGVpZ2h0JzogJzMxcHgnLFxyXG4gICAgICAnbW9udGguZGF5bmFtZS5ib3JkZXJMZWZ0JzogYDFweCBzb2xpZCAke2JvcmRlcn1gLFxyXG4gICAgICAnbW9udGguZGF5bmFtZS5wYWRkaW5nTGVmdCc6ICcxMHB4JyxcclxuICAgICAgJ21vbnRoLmRheW5hbWUucGFkZGluZ1JpZ2h0JzogJzEwcHgnLFxyXG4gICAgICAnbW9udGguZGF5bmFtZS5iYWNrZ3JvdW5kQ29sb3InOiAnaW5oZXJpdCcsXHJcbiAgICAgICdtb250aC5kYXluYW1lLmZvbnRTaXplJzogJzEycHgnLFxyXG4gICAgICAnbW9udGguZGF5bmFtZS5mb250V2VpZ2h0JzogJ25vcm1hbCcsXHJcbiAgICAgICdtb250aC5kYXluYW1lLnRleHRBbGlnbic6ICdsZWZ0JyxcclxuXHJcbiAgICAgIC8vIG1vbnRoIGRheSBncmlkIGNlbGwgJ2RheSdcclxuICAgICAgJ21vbnRoLmhvbGlkYXlFeGNlcHRUaGlzTW9udGguY29sb3InOiAncmdiYSgyNTUsIDY0LCA2NCwgMC40KScsXHJcbiAgICAgICdtb250aC5kYXlFeGNlcHRUaGlzTW9udGguY29sb3InOiAncmdiYSg1MSwgNTEsIDUxLCAwLjQpJyxcclxuICAgICAgJ21vbnRoLndlZWtlbmQuYmFja2dyb3VuZENvbG9yJzogJ2luaGVyaXQnLFxyXG4gICAgICAnbW9udGguZGF5LmZvbnRTaXplJzogJzE0cHgnLFxyXG4gICAgICAnbW9udGguc2NoZWR1bGUuY29sb3InOiBoaWdobGlnaHQsXHJcblxyXG4gICAgICAvLyBtb250aCBzY2hlZHVsZSBzdHlsZVxyXG4gICAgICAnbW9udGguc2NoZWR1bGUuYm9yZGVyUmFkaXVzJzogJzJweCcsXHJcbiAgICAgICdtb250aC5zY2hlZHVsZS5oZWlnaHQnOiAnMjRweCcsXHJcbiAgICAgICdtb250aC5zY2hlZHVsZS5tYXJnaW5Ub3AnOiAnMnB4JyxcclxuICAgICAgJ21vbnRoLnNjaGVkdWxlLm1hcmdpbkxlZnQnOiAnOHB4JyxcclxuICAgICAgJ21vbnRoLnNjaGVkdWxlLm1hcmdpblJpZ2h0JzogJzhweCcsXHJcblxyXG4gICAgICAvLyBtb250aCBtb3JlIHZpZXdcclxuICAgICAgJ21vbnRoLm1vcmVWaWV3LmJvcmRlcic6IGAxcHggc29saWQgJHtib3JkZXJ9YCxcclxuICAgICAgJ21vbnRoLm1vcmVWaWV3LmJveFNoYWRvdyc6IGAwIDJweCA2cHggMCAke3NoYWRvd31gLFxyXG4gICAgICAnbW9udGgubW9yZVZpZXcuYmFja2dyb3VuZENvbG9yJzogYmFja2dyb3VuZCxcclxuICAgICAgJ21vbnRoLm1vcmVWaWV3LnBhZGRpbmdCb3R0b20nOiAnMTdweCcsXHJcbiAgICAgICdtb250aC5tb3JlVmlld1RpdGxlLmhlaWdodCc6ICc0NHB4JyxcclxuICAgICAgJ21vbnRoLm1vcmVWaWV3VGl0bGUubWFyZ2luQm90dG9tJzogJzEycHgnLFxyXG4gICAgICAnbW9udGgubW9yZVZpZXdUaXRsZS5iYWNrZ3JvdW5kQ29sb3InOiAnaW5oZXJpdCcsXHJcbiAgICAgICdtb250aC5tb3JlVmlld1RpdGxlLmJvcmRlckJvdHRvbSc6ICdub25lJyxcclxuICAgICAgJ21vbnRoLm1vcmVWaWV3VGl0bGUucGFkZGluZyc6ICcxMnB4IDE3cHggMCAxN3B4JyxcclxuICAgICAgJ21vbnRoLm1vcmVWaWV3TGlzdC5wYWRkaW5nJzogJzAgMTdweCcsXHJcblxyXG4gICAgICAvLyB3ZWVrIGhlYWRlciAnZGF5bmFtZSdcclxuICAgICAgJ3dlZWsuZGF5bmFtZS5oZWlnaHQnOiAnNDJweCcsXHJcbiAgICAgICd3ZWVrLmRheW5hbWUuYm9yZGVyVG9wJzogYDFweCBzb2xpZCAke2JvcmRlcn1gLFxyXG4gICAgICAnd2Vlay5kYXluYW1lLmJvcmRlckJvdHRvbSc6IGAxcHggc29saWQgJHtib3JkZXJ9YCxcclxuICAgICAgJ3dlZWsuZGF5bmFtZS5ib3JkZXJMZWZ0JzogJ2luaGVyaXQnLFxyXG4gICAgICAnd2Vlay5kYXluYW1lLnBhZGRpbmdMZWZ0JzogJzAnLFxyXG4gICAgICAnd2Vlay5kYXluYW1lLmJhY2tncm91bmRDb2xvcic6ICdpbmhlcml0JyxcclxuICAgICAgJ3dlZWsuZGF5bmFtZS50ZXh0QWxpZ24nOiAnbGVmdCcsXHJcbiAgICAgICd3ZWVrLnRvZGF5LmNvbG9yJzogdGV4dCxcclxuICAgICAgJ3dlZWsucGFzdERheS5jb2xvcic6IGJvcmRlckxpZ2h0LFxyXG5cclxuICAgICAgLy8gd2VlayB2ZXJ0aWNhbCBwYW5lbCAndnBhbmVsJ1xyXG4gICAgICAnd2Vlay52cGFuZWxTcGxpdHRlci5ib3JkZXInOiBgMXB4IHNvbGlkICR7Ym9yZGVyfWAsXHJcbiAgICAgICd3ZWVrLnZwYW5lbFNwbGl0dGVyLmhlaWdodCc6ICczcHgnLFxyXG5cclxuICAgICAgLy8gd2VlayBkYXlncmlkICdkYXlncmlkJ1xyXG4gICAgICAnd2Vlay5kYXlncmlkLmJvcmRlclJpZ2h0JzogYDFweCBzb2xpZCAke2JvcmRlcn1gLFxyXG4gICAgICAnd2Vlay5kYXlncmlkLmJhY2tncm91bmRDb2xvcic6IGJhY2tncm91bmQsXHJcblxyXG4gICAgICAnd2Vlay5kYXlncmlkTGVmdC53aWR0aCc6ICc3MnB4JyxcclxuICAgICAgJ3dlZWsuZGF5Z3JpZExlZnQuYmFja2dyb3VuZENvbG9yJzogYmFja2dyb3VuZCxcclxuICAgICAgJ3dlZWsuZGF5Z3JpZExlZnQucGFkZGluZ1JpZ2h0JzogJzhweCcsXHJcbiAgICAgICd3ZWVrLmRheWdyaWRMZWZ0LmJvcmRlclJpZ2h0JzogYDFweCBzb2xpZCAke2JvcmRlcn1gLFxyXG5cclxuXHJcbiAgICAgICd3ZWVrLnRvZGF5LmJhY2tncm91bmRDb2xvcic6IHByaW1hcnlTaGFkZWQsXHJcbiAgICAgICd3ZWVrLndlZWtlbmQuYmFja2dyb3VuZENvbG9yJzogJ2luaGVyaXQnLFxyXG5cclxuICAgICAgLy8gd2VlayB0aW1lZ3JpZCAndGltZWdyaWQnXHJcbiAgICAgICd3ZWVrLnRpbWVncmlkTGVmdC53aWR0aCc6ICc3MnB4JyxcclxuICAgICAgJ3dlZWsudGltZWdyaWRMZWZ0LmJhY2tncm91bmRDb2xvcic6ICdpbmhlcml0JyxcclxuICAgICAgJ3dlZWsudGltZWdyaWRMZWZ0LmJvcmRlclJpZ2h0JzogYDFweCBzb2xpZCAke2JvcmRlcn1gLFxyXG4gICAgICAnd2Vlay50aW1lZ3JpZExlZnQuZm9udFNpemUnOiAnMTFweCcsXHJcbiAgICAgICd3ZWVrLnRpbWVncmlkTGVmdFRpbWV6b25lTGFiZWwuaGVpZ2h0JzogJzQwcHgnLFxyXG4gICAgICAnd2Vlay50aW1lZ3JpZExlZnRBZGRpdGlvbmFsVGltZXpvbmUuYmFja2dyb3VuZENvbG9yJzogYmFja2dyb3VuZCxcclxuXHJcbiAgICAgICd3ZWVrLnRpbWVncmlkT25lSG91ci5oZWlnaHQnOiAnNTJweCcsXHJcbiAgICAgICd3ZWVrLnRpbWVncmlkSGFsZkhvdXIuaGVpZ2h0JzogJzI2cHgnLFxyXG4gICAgICAnd2Vlay50aW1lZ3JpZEhhbGZIb3VyLmJvcmRlckJvdHRvbSc6ICdub25lJyxcclxuICAgICAgJ3dlZWsudGltZWdyaWRIb3Jpem9udGFsTGluZS5ib3JkZXJCb3R0b20nOiBgMXB4IHNvbGlkICR7Ym9yZGVyfWAsXHJcblxyXG4gICAgICAnd2Vlay50aW1lZ3JpZC5wYWRkaW5nUmlnaHQnOiAnOHB4JyxcclxuICAgICAgJ3dlZWsudGltZWdyaWQuYm9yZGVyUmlnaHQnOiBgMXB4IHNvbGlkICR7Ym9yZGVyfWAsXHJcbiAgICAgICd3ZWVrLnRpbWVncmlkU2NoZWR1bGUuYm9yZGVyUmFkaXVzJzogJzJweCcsXHJcbiAgICAgICd3ZWVrLnRpbWVncmlkU2NoZWR1bGUucGFkZGluZ0xlZnQnOiAnMnB4JyxcclxuXHJcbiAgICAgIC8vICM1MTVjZTYgaXMgYSBzbGF0ZSBibHVlXHJcblxyXG4gICAgICAnd2Vlay5jdXJyZW50VGltZS5jb2xvcic6IGhpZ2hsaWdodCxcclxuICAgICAgJ3dlZWsuY3VycmVudFRpbWUuZm9udFNpemUnOiAnMTFweCcsXHJcbiAgICAgICd3ZWVrLmN1cnJlbnRUaW1lLmZvbnRXZWlnaHQnOiAnbm9ybWFsJyxcclxuXHJcbiAgICAgICd3ZWVrLnBhc3RUaW1lLmNvbG9yJzogYm9yZGVyTGlnaHQsXHJcbiAgICAgICd3ZWVrLnBhc3RUaW1lLmZvbnRXZWlnaHQnOiAnbm9ybWFsJyxcclxuXHJcbiAgICAgICd3ZWVrLmZ1dHVyZVRpbWUuY29sb3InOiBib3JkZXIsXHJcbiAgICAgICd3ZWVrLmZ1dHVyZVRpbWUuZm9udFdlaWdodCc6ICdub3JtYWwnLFxyXG5cclxuICAgICAgJ3dlZWsuY3VycmVudFRpbWVMaW5lUGFzdC5ib3JkZXInOiBgMXB4IGRhc2hlZCAke2hpZ2hsaWdodH1gLFxyXG4gICAgICAnd2Vlay5jdXJyZW50VGltZUxpbmVCdWxsZXQuYmFja2dyb3VuZENvbG9yJzogaGlnaGxpZ2h0LFxyXG4gICAgICAnd2Vlay5jdXJyZW50VGltZUxpbmVUb2RheS5ib3JkZXInOiBgMXB4IHNvbGlkICR7aGlnaGxpZ2h0fWAsXHJcbiAgICAgICd3ZWVrLmN1cnJlbnRUaW1lTGluZUZ1dHVyZS5ib3JkZXInOiAnbm9uZScsXHJcblxyXG4gICAgICAvLyB3ZWVrIGNyZWF0aW9uIGd1aWRlIHN0eWxlXHJcbiAgICAgICd3ZWVrLmNyZWF0aW9uR3VpZGUuY29sb3InOiBoaWdobGlnaHQsXHJcbiAgICAgICd3ZWVrLmNyZWF0aW9uR3VpZGUuZm9udFNpemUnOiAnMTFweCcsXHJcbiAgICAgICd3ZWVrLmNyZWF0aW9uR3VpZGUuZm9udFdlaWdodCc6ICdib2xkJyxcclxuXHJcbiAgICAgIC8vIHdlZWsgZGF5Z3JpZCBzY2hlZHVsZSBzdHlsZVxyXG4gICAgICAnd2Vlay5kYXlHcmlkU2NoZWR1bGUuYm9yZGVyUmFkaXVzJzogJzJweCcsXHJcbiAgICAgICd3ZWVrLmRheUdyaWRTY2hlZHVsZS5oZWlnaHQnOiAnMjRweCcsXHJcbiAgICAgICd3ZWVrLmRheUdyaWRTY2hlZHVsZS5tYXJnaW5Ub3AnOiAnMnB4JyxcclxuICAgICAgJ3dlZWsuZGF5R3JpZFNjaGVkdWxlLm1hcmdpbkxlZnQnOiAnOHB4JyxcclxuICAgICAgJ3dlZWsuZGF5R3JpZFNjaGVkdWxlLm1hcmdpblJpZ2h0JzogJzhweCdcclxuICAgIH0gYXMgSVRoZW1lO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPHA+XHJcbiAgICBuZ3gtbWF0LXR1aS1jYWxlbmRhciB2MC4wLjE1IHdvcmtzISEhXHJcbjwvcD5cclxuPHNlY3Rpb24gY2xhc3M9XCJjb250ZW50LWNvbnRhaW5lclwiPlxyXG4gICAgPCEtLSBUaGVzZSBkaXZzIGFyZSBoZXJlIHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHRoZW1lIGNvbG9ycyBmb3IgdGhlIHR1aSB0aGVtZSAtLT5cclxuICAgIDxkaXYgaWQ9XCJ0aGVtZS1wcmltYXJ5XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGlkPVwidGhlbWUtcHJpbWFyeS1zaGFkZWRcIj48L2Rpdj5cclxuICAgIDxkaXYgaWQ9XCJ0aGVtZS1oaWdobGlnaHRcIj48L2Rpdj5cclxuICAgIDxkaXYgaWQ9XCJ0aGVtZS1hY2NlbnRcIj48L2Rpdj5cclxuICAgIDxkaXYgaWQ9XCJ0aGVtZS13YXJuXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGlkPVwidGhlbWUtZm9yZWdyb3VuZFwiPjwvZGl2PlxyXG4gICAgPGRpdiBpZD1cInRoZW1lLWRpdmlkZXJcIj48L2Rpdj5cclxuICAgIDxkaXYgaWQ9XCJ0aGVtZS1iYWNrZ3JvdW5kXCI+PC9kaXY+XHJcbiAgXHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGFpbmVyXCI+XHJcbiAgICAgIDwhLS0gY2FsZW5kYXIgdGl0bGViYXIgLS0+XHJcbiAgICAgIDxtYXQtdG9vbGJhciBjbGFzcz1cIm1lbnUtYmFyXCIgY29sb3I9XCJwcmltYXJ5XCI+XHJcbiAgICAgICAgPCEtLSA8ZGl2IHN0eWxlPVwiYWxpZ24tc2VsZjogY2VudGVyO2Rpc3BsYXk6IGZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1wiPiAtLT5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcclxuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgd2lkdGg6IDEwMCU7ICBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LWRpdlwiPlxyXG4gICAgICAgICAgICA8IS0tIExFRlQgLS0+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBcclxuICAgICAgICAgICAgICBjbGFzcz1cIm5hdmlnYXRpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAwcHg7IG1hcmdpbi1yaWdodDogMHB4OyBmb250LXNpemU6IDEuNXJlbSAhaW1wb3J0YW50O1wiIFxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkNhbGVuZGFyTG9uZ1ByZXYoKVwiPlxyXG4gICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImljb25Mb25nUHJldlwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBcclxuICAgICAgICAgICAgICBjbGFzcz1cIm5hdmlnYXRpb24tYnV0dG9uXCIgXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tbGVmdDogMHB4OyBtYXJnaW4tcmlnaHQ6IDBweDsgZm9udC1zaXplOiAycmVtICFpbXBvcnRhbnQ7XCIgXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2FsZW5kYXJQcmV2KClcIj5cclxuICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJpY29uUHJldlwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBcclxuICAgICAgICAgICAgICBjbGFzcz1cIm5hdmlnYXRpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAwcHg7IG1hcmdpbi1yaWdodDogMHB4OyBmb250LXNpemU6IDEuN3JlbSAhaW1wb3J0YW50O1wiIFxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkNhbGVuZGFyVG9kYXkoKVwiPlxyXG4gICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImljb25Ub2RheVwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBcclxuICAgICAgICAgICAgICBjbGFzcz1cIm5hdmlnYXRpb24tYnV0dG9uXCIgXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tbGVmdDogMHB4OyBtYXJnaW4tcmlnaHQ6IDBweDsgZm9udC1zaXplOiAycmVtICFpbXBvcnRhbnQ7XCIgXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2FsZW5kYXJOZXh0KClcIj5cclxuICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJpY29uTmV4dFwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBcclxuICAgICAgICAgICAgICBjbGFzcz1cIm5hdmlnYXRpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAwcHg7IG1hcmdpbi1yaWdodDogMHB4OyBmb250LXNpemU6IDEuNXJlbSAhaW1wb3J0YW50O1wiIFxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkNhbGVuZGFyTG9uZ05leHQoKVwiPlxyXG4gICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImljb25Mb25nTmV4dFwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXItZGl2XCI+XHJcbiAgICAgICAgICAgIDwhLS0gQ0VOVEVSIC0tPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV2ZW50LWNhbGVuZGFyLXRpdGxlXCI+e3sgZ2V0RGF0ZSgpIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtZGl2XCI+XHJcbiAgXHJcbiAgICAgICAgICAgIDwhLS0gUklHSFQgLS0+XHJcbiAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBjbGFzcz1cInZpZXctYnV0dG9uXCIgdmFsdWU9XCJtb250aFwiIGlkPVwiQCtpZC90b2dnbGVCdXR0b25cIiBsYXlvdXRfd2lkdGg9XCJ3cmFwX2NvbnRlbnRcIlxyXG4gICAgICAgICAgICAgIGxheW91dF9oZWlnaHQ9XCJ3cmFwX2NvbnRlbnRcIj5cclxuICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgbWF0LWJ1dHRvbiB2YWx1ZT1cIm1vbnRoXCIgY2xhc3M9XCJ2aWV3LWJ1dHRvblwiIChjbGljayk9XCJvbk1vbnRoVmlldygpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJpY29uQnlNb250aFwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSBtYXQtYnV0dG9uIHZhbHVlPVwid2Vla1wiIGNsYXNzPVwidmlldy1idXR0b25cIiAoY2xpY2spPVwib25XZWVrVmlldygpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJpY29uQnlXZWVrXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIG1hdC1idXR0b24gdmFsdWU9XCJkYXlcIiBjbGFzcz1cInZpZXctYnV0dG9uXCIgKGNsaWNrKT1cIm9uRGF5VmlldygpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJpY29uQnlEYXlcIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cclxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L21hdC10b29sYmFyPlxyXG4gICAgICA8bmd4LW1hdC10dWktY2FsZW5kYXItd3JhcHBlcj48L25neC1tYXQtdHVpLWNhbGVuZGFyLXdyYXBwZXI+XHJcbiAgICA8L2Rpdj5cclxuICBcclxuICA8L3NlY3Rpb24+Il19
|