@smart-solutions-tech/smart-angular-calendar 0.0.9 → 0.0.11

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.
@@ -4,11 +4,13 @@ import * as i1 from "@angular/common";
4
4
  import * as i2 from "../calendar/calendar.component";
5
5
  import * as i3 from "../month-selector/month-selector.component";
6
6
  import * as i4 from "../day/day.component";
7
- import * as i5 from "../../pipes/translate.pipe";
8
- import * as i6 from "../../pipes/translate-month.pipe";
7
+ import * as i5 from "../week/week.component";
8
+ import * as i6 from "../../pipes/translate.pipe";
9
+ import * as i7 from "../../pipes/translate-month.pipe";
9
10
  export class SmartCalendarComponent {
10
11
  constructor() {
11
12
  this.mode = 'month';
13
+ this.startAt = 'sunday';
12
14
  this.currentMonth = {
13
15
  year: new Date().getFullYear(),
14
16
  month: new Date().getMonth() + 1
@@ -20,6 +22,9 @@ export class SmartCalendarComponent {
20
22
  this.showDateSelector = false;
21
23
  this.selectedDate = new Date();
22
24
  this.selectedDateEvents = [];
25
+ this.weekStartDate = new Date();
26
+ this.weekEndDate = new Date(this.weekStartDate.getTime() + 6 * 24 * 60 * 60 * 1000);
27
+ this.weekEvents = [];
23
28
  }
24
29
  onDocumentClick(event) {
25
30
  if (!this.showDateSelector)
@@ -89,24 +94,25 @@ export class SmartCalendarComponent {
89
94
  oldMonth
90
95
  });
91
96
  }
92
- goToToday() {
93
- const today = new Date();
97
+ nextDay() {
94
98
  const oldMonth = { ...this.currentMonth };
99
+ const newDate = new Date(this.selectedDate);
100
+ newDate.setDate(newDate.getDate() + 1);
101
+ this.selectDate(newDate);
95
102
  this.currentMonth = {
96
- year: today.getFullYear(),
97
- month: today.getMonth() + 1
103
+ year: newDate.getFullYear(),
104
+ month: newDate.getMonth() + 1
98
105
  };
99
- this.selectDate(today);
100
106
  if (this.currentMonth.month !== oldMonth.month || this.currentMonth.year !== oldMonth.year)
101
107
  this.monthChange.emit({
102
108
  newMonth: this.currentMonth,
103
109
  oldMonth
104
110
  });
105
111
  }
106
- nextDay() {
112
+ prevDay() {
107
113
  const oldMonth = { ...this.currentMonth };
108
114
  const newDate = new Date(this.selectedDate);
109
- newDate.setDate(newDate.getDate() + 1);
115
+ newDate.setDate(newDate.getDate() - 1);
110
116
  this.selectDate(newDate);
111
117
  this.currentMonth = {
112
118
  year: newDate.getFullYear(),
@@ -118,11 +124,26 @@ export class SmartCalendarComponent {
118
124
  oldMonth
119
125
  });
120
126
  }
121
- prevDay() {
127
+ nextWeek() {
122
128
  const oldMonth = { ...this.currentMonth };
123
- const newDate = new Date(this.selectedDate);
124
- newDate.setDate(newDate.getDate() - 1);
125
- this.selectDate(newDate);
129
+ const newDate = new Date(this.weekStartDate);
130
+ newDate.setDate(newDate.getDate() + 7);
131
+ this.selectWeekByDate(newDate);
132
+ this.currentMonth = {
133
+ year: newDate.getFullYear(),
134
+ month: newDate.getMonth() + 1
135
+ };
136
+ if (this.currentMonth.month !== oldMonth.month || this.currentMonth.year !== oldMonth.year)
137
+ this.monthChange.emit({
138
+ newMonth: this.currentMonth,
139
+ oldMonth
140
+ });
141
+ }
142
+ prevWeek() {
143
+ const oldMonth = { ...this.currentMonth };
144
+ const newDate = new Date(this.weekStartDate);
145
+ newDate.setDate(newDate.getDate() - 7);
146
+ this.selectWeekByDate(newDate);
126
147
  this.currentMonth = {
127
148
  year: newDate.getFullYear(),
128
149
  month: newDate.getMonth() + 1
@@ -136,29 +157,51 @@ export class SmartCalendarComponent {
136
157
  onNext() {
137
158
  if (this.mode === 'month')
138
159
  this.nextMonth();
160
+ else if (this.mode === 'week')
161
+ this.nextWeek();
139
162
  else if (this.mode === 'day')
140
163
  this.nextDay();
141
164
  }
142
165
  onPrev() {
143
166
  if (this.mode === 'month')
144
167
  this.prevMonth();
168
+ else if (this.mode === 'week')
169
+ this.prevWeek();
145
170
  else if (this.mode === 'day')
146
171
  this.prevDay();
147
172
  }
148
- selectDate(date) {
149
- this.selectedDate = date;
173
+ goToToday() {
174
+ const today = new Date();
175
+ const oldMonth = { ...this.currentMonth };
176
+ this.currentMonth = {
177
+ year: today.getFullYear(),
178
+ month: today.getMonth() + 1
179
+ };
180
+ this.selectDate(today);
181
+ this.selectWeekByDate(today);
182
+ if (this.currentMonth.month !== oldMonth.month || this.currentMonth.year !== oldMonth.year)
183
+ this.monthChange.emit({
184
+ newMonth: this.currentMonth,
185
+ oldMonth
186
+ });
187
+ }
188
+ setSelectedDateEvents() {
150
189
  this.selectedDateEvents = this.events.filter(event => {
151
190
  const eventDate = new Date(event.start);
152
191
  // return events that starts, ends or spans the selected date
153
- return (eventDate.getDate() === date.getDate() &&
154
- eventDate.getMonth() === date.getMonth() &&
155
- eventDate.getFullYear() === date.getFullYear()) ||
192
+ return (eventDate.getDate() === this.selectedDate.getDate() &&
193
+ eventDate.getMonth() === this.selectedDate.getMonth() &&
194
+ eventDate.getFullYear() === this.selectedDate.getFullYear()) ||
156
195
  (event.end &&
157
- event.end.getDate() === date.getDate() &&
158
- event.end.getMonth() === date.getMonth() &&
159
- event.end.getFullYear() === date.getFullYear()) ||
160
- (event.start < date && event.end && event.end > date);
196
+ event.end.getDate() === this.selectedDate.getDate() &&
197
+ event.end.getMonth() === this.selectedDate.getMonth() &&
198
+ event.end.getFullYear() === this.selectedDate.getFullYear()) ||
199
+ (event.start < this.selectedDate && event.end && event.end > this.selectedDate);
161
200
  });
201
+ }
202
+ selectDate(date) {
203
+ this.selectedDate = date;
204
+ this.setSelectedDateEvents();
162
205
  const oldMonth = this.currentMonth;
163
206
  this.currentMonth = {
164
207
  year: date.getFullYear(),
@@ -171,14 +214,56 @@ export class SmartCalendarComponent {
171
214
  });
172
215
  this.dateChanged.emit(this.selectedDate);
173
216
  }
217
+ selectWeekByDate(date) {
218
+ // Calculate the start date of the week based on startAt
219
+ const dayOfWeek = date.getDay(); // 0 (Sun) to 6 (Sat)
220
+ let diffToStart;
221
+ if (this.startAt === 'monday') {
222
+ diffToStart = (dayOfWeek === 0) ? -6 : 1 - dayOfWeek; // If Sunday, go back 6 days
223
+ }
224
+ else {
225
+ diffToStart = -dayOfWeek; // Sunday start
226
+ }
227
+ this.weekStartDate = new Date(date);
228
+ this.weekStartDate.setDate(date.getDate() + diffToStart);
229
+ this.weekEndDate = new Date(this.weekStartDate);
230
+ this.weekEndDate.setDate(this.weekStartDate.getDate() + 6);
231
+ // Filter events for the week
232
+ this.weekEvents = this.events.filter(event => {
233
+ const eventStart = new Date(event.start);
234
+ const eventEnd = event.end ? new Date(event.end) : eventStart;
235
+ return (eventStart <= this.weekEndDate) && (eventEnd >= this.weekStartDate);
236
+ });
237
+ const oldMonth = this.currentMonth;
238
+ this.currentMonth = {
239
+ year: this.weekStartDate.getFullYear(),
240
+ month: this.weekStartDate.getMonth() + 1
241
+ };
242
+ if (this.currentMonth.month !== oldMonth.month || this.currentMonth.year !== oldMonth.year)
243
+ this.monthChange.emit({
244
+ newMonth: this.currentMonth,
245
+ oldMonth
246
+ });
247
+ }
248
+ setMode(newMode) {
249
+ this.mode = newMode;
250
+ if (newMode === 'day') {
251
+ this.setSelectedDateEvents();
252
+ }
253
+ else if (newMode === 'week') {
254
+ this.selectWeekByDate(this.selectedDate);
255
+ }
256
+ }
174
257
  }
175
258
  SmartCalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SmartCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
176
- SmartCalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SmartCalendarComponent, selector: "smart-calendar", inputs: { mode: "mode", currentMonth: "currentMonth", events: "events" }, outputs: { monthChange: "monthChange", dateChanged: "dateChanged", eventClick: "eventClick" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "dateSelectorDropdown", first: true, predicate: ["dateSelectorDropdown"], descendants: true }], ngImport: i0, template: "<div class=\"smart-calendar-component\">\n <div class=\"header\">\n <div class=\"nav-controls\">\n <button class=\"btn-prev\" (click)=\"onPrev()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </svg>\n </button>\n\n <button class=\"btn-today\" (click)=\"goToToday()\">{{'today' | translate}}</button>\n\n <button class=\"btn-next\" (click)=\"onNext()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"date-selector-container\">\n <button class=\"btn-date-selector\" (click)=\"toggleDateSelector()\">\n <span *ngIf=\"mode === 'month'\">{{ currentMonth.month | translateMonth}} - {{ currentMonth.year }}</span>\n <span *ngIf=\"mode === 'day'\">{{ selectedDate.toDateString() }}</span>\n\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M480-360 280-560h400L480-360Z\" />\n </svg>\n </button>\n\n <div class=\"date-selector-dropdown\" *ngIf=\"showDateSelector\" #dateSelectorDropdown>\n <lib-month-selector [selectedMonth]=\"currentMonth\"\n (monthSelected)=\"onMonthSelected($event)\"></lib-month-selector>\n </div>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"view-selector\">\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'month'}\" (click)=\"mode = 'month'\">\n <!-- month view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'week'}\" (click)=\"mode = 'week'\">\n <!-- week view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm360-80h100v-480H520v480Zm-180 0h100v-480H340v480Zm-180 0h100v-480H160v480Zm540 0h100v-480H700v480Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'day'}\" (click)=\"mode = 'day'\">\n <!-- day view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M120-160v-80h720v80H120Zm0-560v-80h720v80H120Zm80 400q-33 0-56.5-23.5T120-400v-160q0-33 23.5-56.5T200-640h560q33 0 56.5 23.5T840-560v160q0 33-23.5 56.5T760-320H200Zm0-80h560v-160H200v160Zm0-160v160-160Z\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"view-container\">\n <lib-calendar [events]=\"events\" [currentMonth]=\"currentMonth\" *ngIf=\"mode === 'month'\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar>\n\n <lib-day *ngIf=\"mode === 'day'\" [date]=\"selectedDate\" [events]=\"selectedDateEvents\"\n (eventClick)=\"onEventClick($event)\"></lib-day>\n </div>\n\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.smart-calendar-component{display:flex;flex-direction:column;width:100%;height:100%;background-color:#fff}.header{flex-shrink:0;display:flex;align-items:center;gap:16px;padding:2px 16px}.header .spacer{flex:1 1 auto}.header .nav-controls{display:flex;align-items:center}.header .nav-controls .btn-prev,.header .nav-controls .btn-next{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:none;border-radius:50%;cursor:pointer;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-prev:hover,.header .nav-controls .btn-next:hover{background-color:#eee}.header .nav-controls .btn-today{display:flex;align-items:center;height:30px;padding:0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-today:hover{background-color:#eee}.header .view-selector{display:flex;align-items:center}.header .view-selector .btn-view{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid #cccccc;background:none;cursor:pointer;-webkit-user-select:none;user-select:none}.header .view-selector .btn-view:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px;border-right:none}.header .view-selector .btn-view:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-left:none}.header .view-selector .btn-view:hover{background-color:#eee}.header .view-selector .btn-view svg{width:22px;height:22px}.header .view-selector .btn-view.active{background-color:#0000001a}.header .date-selector-container{position:relative}.header .date-selector-container .date-selector-dropdown{position:absolute;top:100%;left:50%;transform:translate(-50%);background-color:#fff;border-radius:4px;box-shadow:0 2px 24px #0000004d;z-index:3}.header .date-selector-container .date-selector-dropdown:before{content:\"\";position:absolute;top:-6px;left:50%;transform:translate(-50%) rotate(45deg);width:12px;height:12px;background-color:#fff;border-radius:2px}.header .btn-date-selector{display:flex;align-items:center;gap:8px;height:30px;padding:0 8px 0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .btn-date-selector:hover{background-color:#eee}.view-container{flex:1 1 auto;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalendarComponent, selector: "lib-calendar", inputs: ["currentMonth", "events", "startAt"], outputs: ["eventClick"] }, { kind: "component", type: i3.MonthSelectorComponent, selector: "lib-month-selector", inputs: ["selectedMonth"], outputs: ["monthSelected"] }, { kind: "component", type: i4.DayComponent, selector: "lib-day", inputs: ["events", "date"], outputs: ["eventClick"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i6.TranslateMonthPipe, name: "translateMonth" }] });
259
+ SmartCalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SmartCalendarComponent, selector: "smart-calendar", inputs: { mode: "mode", startAt: "startAt", currentMonth: "currentMonth", events: "events" }, outputs: { monthChange: "monthChange", dateChanged: "dateChanged", eventClick: "eventClick" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "dateSelectorDropdown", first: true, predicate: ["dateSelectorDropdown"], descendants: true }], ngImport: i0, template: "<div class=\"smart-calendar-component\">\n <div class=\"header\">\n <div class=\"nav-controls\">\n <button class=\"btn-prev\" (click)=\"onPrev()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </svg>\n </button>\n\n <button class=\"btn-today\" (click)=\"goToToday()\">{{'today' | translate}}</button>\n\n <button class=\"btn-next\" (click)=\"onNext()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"date-selector-container\">\n <button class=\"btn-date-selector\" (click)=\"toggleDateSelector()\">\n <span *ngIf=\"mode === 'month'\">{{ currentMonth.month | translateMonth}} - {{ currentMonth.year }}</span>\n <span *ngIf=\"mode === 'week'\">\n {{ weekStartDate.toDateString() }} - {{ weekEndDate.toDateString() }}\n </span>\n <span *ngIf=\"mode === 'day'\">{{ selectedDate.toDateString() }}</span>\n\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M480-360 280-560h400L480-360Z\" />\n </svg>\n </button>\n\n <div class=\"date-selector-dropdown\" *ngIf=\"showDateSelector\" #dateSelectorDropdown>\n <lib-month-selector [selectedMonth]=\"currentMonth\"\n (monthSelected)=\"onMonthSelected($event)\"></lib-month-selector>\n </div>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"view-selector\">\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'month'}\" (click)=\"setMode('month')\">\n <!-- month view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'week'}\" (click)=\"setMode('week')\">\n <!-- week view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm360-80h100v-480H520v480Zm-180 0h100v-480H340v480Zm-180 0h100v-480H160v480Zm540 0h100v-480H700v480Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'day'}\" (click)=\"setMode('day')\">\n <!-- day view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M120-160v-80h720v80H120Zm0-560v-80h720v80H120Zm80 400q-33 0-56.5-23.5T120-400v-160q0-33 23.5-56.5T200-640h560q33 0 56.5 23.5T840-560v160q0 33-23.5 56.5T760-320H200Zm0-80h560v-160H200v160Zm0-160v160-160Z\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"view-container\">\n <lib-calendar [events]=\"events\" [currentMonth]=\"currentMonth\" *ngIf=\"mode === 'month'\" [startAt]=\"startAt\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar>\n\n <lib-week *ngIf=\"mode === 'week'\" [startAt]=\"startAt\" [startDate]=\"weekStartDate\"\n [events]=\"weekEvents\"></lib-week>\n\n <lib-day *ngIf=\"mode === 'day'\" [date]=\"selectedDate\" [events]=\"selectedDateEvents\"\n (eventClick)=\"onEventClick($event)\"></lib-day>\n </div>\n\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.smart-calendar-component{display:flex;flex-direction:column;width:100%;height:100%;background-color:#fff}.header{flex-shrink:0;display:flex;align-items:center;gap:16px;padding:2px 16px}.header .spacer{flex:1 1 auto}.header .nav-controls{display:flex;align-items:center}.header .nav-controls .btn-prev,.header .nav-controls .btn-next{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:none;border-radius:50%;cursor:pointer;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-prev:hover,.header .nav-controls .btn-next:hover{background-color:#eee}.header .nav-controls .btn-today{display:flex;align-items:center;height:30px;padding:0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-today:hover{background-color:#eee}.header .view-selector{display:flex;align-items:center}.header .view-selector .btn-view{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid #cccccc;background:none;cursor:pointer;-webkit-user-select:none;user-select:none}.header .view-selector .btn-view:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px;border-right:none}.header .view-selector .btn-view:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-left:none}.header .view-selector .btn-view:hover{background-color:#eee}.header .view-selector .btn-view svg{width:22px;height:22px}.header .view-selector .btn-view.active{background-color:#0000001a}.header .date-selector-container{position:relative}.header .date-selector-container .date-selector-dropdown{position:absolute;top:100%;left:50%;transform:translate(-50%);background-color:#fff;border-radius:4px;box-shadow:0 2px 24px #0000004d;z-index:3}.header .date-selector-container .date-selector-dropdown:before{content:\"\";position:absolute;top:-6px;left:50%;transform:translate(-50%) rotate(45deg);width:12px;height:12px;background-color:#fff;border-radius:2px}.header .btn-date-selector{display:flex;align-items:center;gap:8px;height:30px;padding:0 8px 0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .btn-date-selector:hover{background-color:#eee}.view-container{flex:1 1 auto;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalendarComponent, selector: "lib-calendar", inputs: ["currentMonth", "events", "startAt"], outputs: ["eventClick"] }, { kind: "component", type: i3.MonthSelectorComponent, selector: "lib-month-selector", inputs: ["selectedMonth"], outputs: ["monthSelected"] }, { kind: "component", type: i4.DayComponent, selector: "lib-day", inputs: ["events", "date"], outputs: ["eventClick"] }, { kind: "component", type: i5.WeekComponent, selector: "lib-week", inputs: ["startAt", "events", "startDate"], outputs: ["eventClick"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: i7.TranslateMonthPipe, name: "translateMonth" }] });
177
260
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SmartCalendarComponent, decorators: [{
178
261
  type: Component,
179
- args: [{ selector: 'smart-calendar', template: "<div class=\"smart-calendar-component\">\n <div class=\"header\">\n <div class=\"nav-controls\">\n <button class=\"btn-prev\" (click)=\"onPrev()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </svg>\n </button>\n\n <button class=\"btn-today\" (click)=\"goToToday()\">{{'today' | translate}}</button>\n\n <button class=\"btn-next\" (click)=\"onNext()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"date-selector-container\">\n <button class=\"btn-date-selector\" (click)=\"toggleDateSelector()\">\n <span *ngIf=\"mode === 'month'\">{{ currentMonth.month | translateMonth}} - {{ currentMonth.year }}</span>\n <span *ngIf=\"mode === 'day'\">{{ selectedDate.toDateString() }}</span>\n\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M480-360 280-560h400L480-360Z\" />\n </svg>\n </button>\n\n <div class=\"date-selector-dropdown\" *ngIf=\"showDateSelector\" #dateSelectorDropdown>\n <lib-month-selector [selectedMonth]=\"currentMonth\"\n (monthSelected)=\"onMonthSelected($event)\"></lib-month-selector>\n </div>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"view-selector\">\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'month'}\" (click)=\"mode = 'month'\">\n <!-- month view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'week'}\" (click)=\"mode = 'week'\">\n <!-- week view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm360-80h100v-480H520v480Zm-180 0h100v-480H340v480Zm-180 0h100v-480H160v480Zm540 0h100v-480H700v480Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'day'}\" (click)=\"mode = 'day'\">\n <!-- day view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M120-160v-80h720v80H120Zm0-560v-80h720v80H120Zm80 400q-33 0-56.5-23.5T120-400v-160q0-33 23.5-56.5T200-640h560q33 0 56.5 23.5T840-560v160q0 33-23.5 56.5T760-320H200Zm0-80h560v-160H200v160Zm0-160v160-160Z\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"view-container\">\n <lib-calendar [events]=\"events\" [currentMonth]=\"currentMonth\" *ngIf=\"mode === 'month'\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar>\n\n <lib-day *ngIf=\"mode === 'day'\" [date]=\"selectedDate\" [events]=\"selectedDateEvents\"\n (eventClick)=\"onEventClick($event)\"></lib-day>\n </div>\n\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.smart-calendar-component{display:flex;flex-direction:column;width:100%;height:100%;background-color:#fff}.header{flex-shrink:0;display:flex;align-items:center;gap:16px;padding:2px 16px}.header .spacer{flex:1 1 auto}.header .nav-controls{display:flex;align-items:center}.header .nav-controls .btn-prev,.header .nav-controls .btn-next{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:none;border-radius:50%;cursor:pointer;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-prev:hover,.header .nav-controls .btn-next:hover{background-color:#eee}.header .nav-controls .btn-today{display:flex;align-items:center;height:30px;padding:0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-today:hover{background-color:#eee}.header .view-selector{display:flex;align-items:center}.header .view-selector .btn-view{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid #cccccc;background:none;cursor:pointer;-webkit-user-select:none;user-select:none}.header .view-selector .btn-view:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px;border-right:none}.header .view-selector .btn-view:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-left:none}.header .view-selector .btn-view:hover{background-color:#eee}.header .view-selector .btn-view svg{width:22px;height:22px}.header .view-selector .btn-view.active{background-color:#0000001a}.header .date-selector-container{position:relative}.header .date-selector-container .date-selector-dropdown{position:absolute;top:100%;left:50%;transform:translate(-50%);background-color:#fff;border-radius:4px;box-shadow:0 2px 24px #0000004d;z-index:3}.header .date-selector-container .date-selector-dropdown:before{content:\"\";position:absolute;top:-6px;left:50%;transform:translate(-50%) rotate(45deg);width:12px;height:12px;background-color:#fff;border-radius:2px}.header .btn-date-selector{display:flex;align-items:center;gap:8px;height:30px;padding:0 8px 0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .btn-date-selector:hover{background-color:#eee}.view-container{flex:1 1 auto;overflow:hidden}\n"] }]
262
+ args: [{ selector: 'smart-calendar', template: "<div class=\"smart-calendar-component\">\n <div class=\"header\">\n <div class=\"nav-controls\">\n <button class=\"btn-prev\" (click)=\"onPrev()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </svg>\n </button>\n\n <button class=\"btn-today\" (click)=\"goToToday()\">{{'today' | translate}}</button>\n\n <button class=\"btn-next\" (click)=\"onNext()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"date-selector-container\">\n <button class=\"btn-date-selector\" (click)=\"toggleDateSelector()\">\n <span *ngIf=\"mode === 'month'\">{{ currentMonth.month | translateMonth}} - {{ currentMonth.year }}</span>\n <span *ngIf=\"mode === 'week'\">\n {{ weekStartDate.toDateString() }} - {{ weekEndDate.toDateString() }}\n </span>\n <span *ngIf=\"mode === 'day'\">{{ selectedDate.toDateString() }}</span>\n\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M480-360 280-560h400L480-360Z\" />\n </svg>\n </button>\n\n <div class=\"date-selector-dropdown\" *ngIf=\"showDateSelector\" #dateSelectorDropdown>\n <lib-month-selector [selectedMonth]=\"currentMonth\"\n (monthSelected)=\"onMonthSelected($event)\"></lib-month-selector>\n </div>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"view-selector\">\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'month'}\" (click)=\"setMode('month')\">\n <!-- month view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'week'}\" (click)=\"setMode('week')\">\n <!-- week view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm360-80h100v-480H520v480Zm-180 0h100v-480H340v480Zm-180 0h100v-480H160v480Zm540 0h100v-480H700v480Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'day'}\" (click)=\"setMode('day')\">\n <!-- day view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M120-160v-80h720v80H120Zm0-560v-80h720v80H120Zm80 400q-33 0-56.5-23.5T120-400v-160q0-33 23.5-56.5T200-640h560q33 0 56.5 23.5T840-560v160q0 33-23.5 56.5T760-320H200Zm0-80h560v-160H200v160Zm0-160v160-160Z\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"view-container\">\n <lib-calendar [events]=\"events\" [currentMonth]=\"currentMonth\" *ngIf=\"mode === 'month'\" [startAt]=\"startAt\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar>\n\n <lib-week *ngIf=\"mode === 'week'\" [startAt]=\"startAt\" [startDate]=\"weekStartDate\"\n [events]=\"weekEvents\"></lib-week>\n\n <lib-day *ngIf=\"mode === 'day'\" [date]=\"selectedDate\" [events]=\"selectedDateEvents\"\n (eventClick)=\"onEventClick($event)\"></lib-day>\n </div>\n\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.smart-calendar-component{display:flex;flex-direction:column;width:100%;height:100%;background-color:#fff}.header{flex-shrink:0;display:flex;align-items:center;gap:16px;padding:2px 16px}.header .spacer{flex:1 1 auto}.header .nav-controls{display:flex;align-items:center}.header .nav-controls .btn-prev,.header .nav-controls .btn-next{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:none;border-radius:50%;cursor:pointer;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-prev:hover,.header .nav-controls .btn-next:hover{background-color:#eee}.header .nav-controls .btn-today{display:flex;align-items:center;height:30px;padding:0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-today:hover{background-color:#eee}.header .view-selector{display:flex;align-items:center}.header .view-selector .btn-view{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid #cccccc;background:none;cursor:pointer;-webkit-user-select:none;user-select:none}.header .view-selector .btn-view:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px;border-right:none}.header .view-selector .btn-view:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-left:none}.header .view-selector .btn-view:hover{background-color:#eee}.header .view-selector .btn-view svg{width:22px;height:22px}.header .view-selector .btn-view.active{background-color:#0000001a}.header .date-selector-container{position:relative}.header .date-selector-container .date-selector-dropdown{position:absolute;top:100%;left:50%;transform:translate(-50%);background-color:#fff;border-radius:4px;box-shadow:0 2px 24px #0000004d;z-index:3}.header .date-selector-container .date-selector-dropdown:before{content:\"\";position:absolute;top:-6px;left:50%;transform:translate(-50%) rotate(45deg);width:12px;height:12px;background-color:#fff;border-radius:2px}.header .btn-date-selector{display:flex;align-items:center;gap:8px;height:30px;padding:0 8px 0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .btn-date-selector:hover{background-color:#eee}.view-container{flex:1 1 auto;overflow:hidden}\n"] }]
180
263
  }], ctorParameters: function () { return []; }, propDecorators: { mode: [{
181
264
  type: Input
265
+ }], startAt: [{
266
+ type: Input
182
267
  }], currentMonth: [{
183
268
  type: Input
184
269
  }], events: [{
@@ -196,4 +281,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
196
281
  type: HostListener,
197
282
  args: ['document:click', ['$event']]
198
283
  }] } });
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYW5ndWxhci1jYWxlbmRhci9zcmMvbGliL2NvbXBvbmVudHMvc21hcnQtY2FsZW5kYXIvc21hcnQtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYW5ndWxhci1jYWxlbmRhci9zcmMvbGliL2NvbXBvbmVudHMvc21hcnQtY2FsZW5kYXIvc21hcnQtY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFRbkksTUFBTSxPQUFPLHNCQUFzQjtJQXFDakM7UUFuQ1MsU0FBSSxHQUE2QixPQUFPLENBQUM7UUFFekMsaUJBQVksR0FBb0M7WUFDdkQsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQzlCLEtBQUssRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUM7U0FDakMsQ0FBQztRQUVPLFdBQU0sR0FBb0IsRUFBRSxDQUFDO1FBRTVCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBR3BDLENBQUM7UUFFSyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFdkMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBY3pELHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUVsQyxpQkFBWSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7UUFDaEMsdUJBQWtCLEdBQW9CLEVBQUUsQ0FBQztJQUV6QixDQUFDO0lBZGpCLGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQjtZQUFFLE9BQU87UUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQztRQUMxRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDNUQsSUFBSSxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFjLENBQUMsRUFBRTtZQUNwRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQVNELFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqRCxDQUFDO0lBRUQsZUFBZSxDQUFDLFFBQXlDO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFFN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDM0IsUUFBUTtTQUNULENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFvQjtRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFMUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRztnQkFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUM7Z0JBQ2hDLEtBQUssRUFBRSxDQUFDO2FBQ1QsQ0FBQztTQUNIO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHO2dCQUNsQixJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJO2dCQUM1QixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQzthQUNuQyxDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ3BCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMzQixRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDUCxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUc7Z0JBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDO2dCQUNoQyxLQUFLLEVBQUUsRUFBRTthQUNWLENBQUM7U0FDSDthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksR0FBRztnQkFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSTtnQkFDNUIsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLENBQUM7YUFDbkMsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDM0IsUUFBUTtTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRTFDLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDekIsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQzVCLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSTtZQUN4RixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDcEIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMzQixRQUFRO2FBQ1QsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRTFDLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpCLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDbEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDM0IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQzlCLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUk7WUFDeEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDM0IsUUFBUTthQUNULENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPO1FBQ0wsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUUxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2xCLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFO1lBQzNCLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQztTQUM5QixDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJO1lBQ3hGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQzNCLFFBQVE7YUFDVCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUNkLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLO1lBQzFCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUNkLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLO1lBQzFCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVU7UUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFekIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25ELE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV4Qyw2REFBNkQ7WUFDN0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUM1QyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDeEMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDL0MsQ0FBQyxLQUFLLENBQUMsR0FBRztvQkFDUixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ3RDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDeEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2pELENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUVuQyxJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3hCLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQztTQUMzQixDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJO1lBQ3hGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQzNCLFFBQVE7YUFDVCxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7bUhBck5VLHNCQUFzQjt1R0FBdEIsc0JBQXNCLG1hQ1JuQywwd0pBK0VNOzJGRHZFTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsZ0JBQWdCOzBFQU1qQixJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFLRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRStDLG9CQUFvQjtzQkFBekUsU0FBUzt1QkFBQyxzQkFBc0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBR3BELGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzbWFydC1jYWxlbmRhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zbWFydC1jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0LWNhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU21hcnRDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgbW9kZTogJ21vbnRoJyB8ICd3ZWVrJyB8ICdkYXknID0gJ21vbnRoJztcblxuICBASW5wdXQoKSBjdXJyZW50TW9udGg6IHsgeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyIH0gPSB7XG4gICAgeWVhcjogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxXG4gIH07XG5cbiAgQElucHV0KCkgZXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXTtcblxuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBuZXdNb250aDogeyB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIgfSxcbiAgICBvbGRNb250aDogeyB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIgfVxuICB9PigpO1xuXG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcblxuICBAT3V0cHV0KCkgZXZlbnRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJFdmVudD4oKTtcblxuICBAVmlld0NoaWxkKCdkYXRlU2VsZWN0b3JEcm9wZG93bicsIHsgc3RhdGljOiBmYWxzZSB9KSBkYXRlU2VsZWN0b3JEcm9wZG93biE6IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuc2hvd0RhdGVTZWxlY3RvcikgcmV0dXJuO1xuICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5kYXRlU2VsZWN0b3JEcm9wZG93bj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnRuLWRhdGUtc2VsZWN0b3InKTtcbiAgICBpZiAoZHJvcGRvd24gJiYgIWRyb3Bkb3duLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgYnV0dG9uICYmICFidXR0b24uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICB0aGlzLnNob3dEYXRlU2VsZWN0b3IgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzaG93RGF0ZVNlbGVjdG9yOiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2VsZWN0ZWREYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgc2VsZWN0ZWREYXRlRXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0RGF0ZShuZXcgRGF0ZSgpKTtcbiAgfVxuXG4gIHRvZ2dsZURhdGVTZWxlY3RvcigpIHtcbiAgICB0aGlzLnNob3dEYXRlU2VsZWN0b3IgPSAhdGhpcy5zaG93RGF0ZVNlbGVjdG9yO1xuICB9XG5cbiAgb25Nb250aFNlbGVjdGVkKG5ld01vbnRoOiB7IHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciB9KSB7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG4gICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXdNb250aDtcblxuICAgIHRoaXMuc2VsZWN0RGF0ZShuZXcgRGF0ZSh0aGlzLmN1cnJlbnRNb250aC55ZWFyLCB0aGlzLmN1cnJlbnRNb250aC5tb250aCAtIDEsIDEpKTtcblxuICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICBuZXdNb250aDogdGhpcy5jdXJyZW50TW9udGgsXG4gICAgICBvbGRNb250aFxuICAgIH0pO1xuXG4gICAgdGhpcy5zaG93RGF0ZVNlbGVjdG9yID0gZmFsc2U7XG4gIH1cblxuICBvbkV2ZW50Q2xpY2soZXZlbnQ6IENhbGVuZGFyRXZlbnQpIHtcbiAgICB0aGlzLmV2ZW50Q2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICBuZXh0TW9udGgoKSB7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG5cbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggPT09IDEyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50TW9udGgueWVhciArIDEsXG4gICAgICAgIG1vbnRoOiAxXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50TW9udGgueWVhcixcbiAgICAgICAgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoLm1vbnRoICsgMVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3IERhdGUodGhpcy5jdXJyZW50TW9udGgueWVhciwgdGhpcy5jdXJyZW50TW9udGgubW9udGggLSAxLCAxKSk7XG5cbiAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgbmV3TW9udGg6IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgb2xkTW9udGhcbiAgICB9KTtcbiAgfVxuXG4gIHByZXZNb250aCgpIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggPT09IDEpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRNb250aC55ZWFyIC0gMSxcbiAgICAgICAgbW9udGg6IDEyXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50TW9udGgueWVhcixcbiAgICAgICAgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoLm1vbnRoIC0gMVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3IERhdGUodGhpcy5jdXJyZW50TW9udGgueWVhciwgdGhpcy5jdXJyZW50TW9udGgubW9udGggLSAxLCAxKSk7XG5cbiAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgbmV3TW9udGg6IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgb2xkTW9udGhcbiAgICB9KTtcbiAgfVxuXG4gIGdvVG9Ub2RheSgpIHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IHRvZGF5LmdldEZ1bGxZZWFyKCksXG4gICAgICBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDFcbiAgICB9O1xuXG4gICAgdGhpcy5zZWxlY3REYXRlKHRvZGF5KTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgbmV4dERheSgpIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcblxuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXREYXRlKG5ld0RhdGUuZ2V0RGF0ZSgpICsgMSk7XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3RGF0ZSk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJldkRheSgpIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcblxuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXREYXRlKG5ld0RhdGUuZ2V0RGF0ZSgpIC0gMSk7XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3RGF0ZSk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgb25OZXh0KCkge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb250aCcpXG4gICAgICB0aGlzLm5leHRNb250aCgpO1xuICAgIGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2RheScpXG4gICAgICB0aGlzLm5leHREYXkoKTtcbiAgfVxuXG4gIG9uUHJldigpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnbW9udGgnKVxuICAgICAgdGhpcy5wcmV2TW9udGgoKTtcbiAgICBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdkYXknKVxuICAgICAgdGhpcy5wcmV2RGF5KCk7XG4gIH1cblxuICBzZWxlY3REYXRlKGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG5cbiAgICB0aGlzLnNlbGVjdGVkRGF0ZUV2ZW50cyA9IHRoaXMuZXZlbnRzLmZpbHRlcihldmVudCA9PiB7XG4gICAgICBjb25zdCBldmVudERhdGUgPSBuZXcgRGF0ZShldmVudC5zdGFydCk7XG5cbiAgICAgIC8vIHJldHVybiBldmVudHMgdGhhdCBzdGFydHMsIGVuZHMgb3Igc3BhbnMgdGhlIHNlbGVjdGVkIGRhdGVcbiAgICAgIHJldHVybiAoZXZlbnREYXRlLmdldERhdGUoKSA9PT0gZGF0ZS5nZXREYXRlKCkgJiZcbiAgICAgICAgZXZlbnREYXRlLmdldE1vbnRoKCkgPT09IGRhdGUuZ2V0TW9udGgoKSAmJlxuICAgICAgICBldmVudERhdGUuZ2V0RnVsbFllYXIoKSA9PT0gZGF0ZS5nZXRGdWxsWWVhcigpKSB8fFxuICAgICAgICAoZXZlbnQuZW5kICYmXG4gICAgICAgICAgZXZlbnQuZW5kLmdldERhdGUoKSA9PT0gZGF0ZS5nZXREYXRlKCkgJiZcbiAgICAgICAgICBldmVudC5lbmQuZ2V0TW9udGgoKSA9PT0gZGF0ZS5nZXRNb250aCgpICYmXG4gICAgICAgICAgZXZlbnQuZW5kLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUuZ2V0RnVsbFllYXIoKSkgfHxcbiAgICAgICAgKGV2ZW50LnN0YXJ0IDwgZGF0ZSAmJiBldmVudC5lbmQgJiYgZXZlbnQuZW5kID4gZGF0ZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbGRNb250aCA9IHRoaXMuY3VycmVudE1vbnRoO1xuXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSB7XG4gICAgICB5ZWFyOiBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBtb250aDogZGF0ZS5nZXRNb250aCgpICsgMVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggIT09IG9sZE1vbnRoLm1vbnRoIHx8IHRoaXMuY3VycmVudE1vbnRoLnllYXIgIT09IG9sZE1vbnRoLnllYXIpXG4gICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgICBuZXdNb250aDogdGhpcy5jdXJyZW50TW9udGgsXG4gICAgICAgIG9sZE1vbnRoXG4gICAgICB9KTtcblxuICAgIHRoaXMuZGF0ZUNoYW5nZWQuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInNtYXJ0LWNhbGVuZGFyLWNvbXBvbmVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1jb250cm9sc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmV2XCIgKGNsaWNrKT1cIm9uUHJldigpXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01NjAtMjQwIDMyMC00ODBsMjQwLTI0MCA1NiA1Ni0xODQgMTg0IDE4NCAxODQtNTYgNTZaXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXRvZGF5XCIgKGNsaWNrKT1cImdvVG9Ub2RheSgpXCI+e3sndG9kYXknIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cblxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1uZXh0XCIgKGNsaWNrKT1cIm9uTmV4dCgpXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01MDQtNDgwIDMyMC02NjRsNTYtNTYgMjQwIDI0MC0yNDAgMjQwLTU2LTU2IDE4NC0xODRaXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtc2VsZWN0b3ItY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWRhdGUtc2VsZWN0b3JcIiAoY2xpY2spPVwidG9nZ2xlRGF0ZVNlbGVjdG9yKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1vZGUgPT09ICdtb250aCdcIj57eyBjdXJyZW50TW9udGgubW9udGggfCB0cmFuc2xhdGVNb250aH19IC0ge3sgY3VycmVudE1vbnRoLnllYXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2RlID09PSAnZGF5J1wiPnt7IHNlbGVjdGVkRGF0ZS50b0RhdGVTdHJpbmcoKSB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNDgwLTM2MCAyODAtNTYwaDQwMEw0ODAtMzYwWlwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtc2VsZWN0b3ItZHJvcGRvd25cIiAqbmdJZj1cInNob3dEYXRlU2VsZWN0b3JcIiAjZGF0ZVNlbGVjdG9yRHJvcGRvd24+XG4gICAgICAgICAgICAgICAgPGxpYi1tb250aC1zZWxlY3RvciBbc2VsZWN0ZWRNb250aF09XCJjdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAobW9udGhTZWxlY3RlZCk9XCJvbk1vbnRoU2VsZWN0ZWQoJGV2ZW50KVwiPjwvbGliLW1vbnRoLXNlbGVjdG9yPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZXJcIj48L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1zZWxlY3RvclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi12aWV3XCIgW25nQ2xhc3NdPVwie2FjdGl2ZTogbW9kZSA9PT0gJ21vbnRoJ31cIiAoY2xpY2spPVwibW9kZSA9ICdtb250aCdcIj5cbiAgICAgICAgICAgICAgICA8IS0tIG1vbnRoIHZpZXcgLS0+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAwLTgwcS0zMyAwLTU2LjUtMjMuNVQxMjAtMTYwdi01NjBxMC0zMyAyMy41LTU2LjVUMjAwLTgwMGg0MHYtODBoODB2ODBoMzIwdi04MGg4MHY4MGg0MHEzMyAwIDU2LjUgMjMuNVQ4NDAtNzIwdjU2MHEwIDMzLTIzLjUgNTYuNVQ3NjAtODBIMjAwWm0wLTgwaDU2MHYtNDAwSDIwMHY0MDBabTAtNDgwaDU2MHYtODBIMjAwdjgwWm0wIDB2LTgwIDgwWm0yODAgMjQwcS0xNyAwLTI4LjUtMTEuNVQ0NDAtNDQwcTAtMTcgMTEuNS0yOC41VDQ4MC00ODBxMTcgMCAyOC41IDExLjVUNTIwLTQ0MHEwIDE3LTExLjUgMjguNVQ0ODAtNDAwWm0tMTYwIDBxLTE3IDAtMjguNS0xMS41VDI4MC00NDBxMC0xNyAxMS41LTI4LjVUMzIwLTQ4MHExNyAwIDI4LjUgMTEuNVQzNjAtNDQwcTAgMTctMTEuNSAyOC41VDMyMC00MDBabTMyMCAwcS0xNyAwLTI4LjUtMTEuNVQ2MDAtNDQwcTAtMTcgMTEuNS0yOC41VDY0MC00ODBxMTcgMCAyOC41IDExLjVUNjgwLTQ0MHEwIDE3LTExLjUgMjguNVQ2NDAtNDAwWk00ODAtMjQwcS0xNyAwLTI4LjUtMTEuNVQ0NDAtMjgwcTAtMTcgMTEuNS0yOC41VDQ4MC0zMjBxMTcgMCAyOC41IDExLjVUNTIwLTI4MHEwIDE3LTExLjUgMjguNVQ0ODAtMjQwWm0tMTYwIDBxLTE3IDAtMjguNS0xMS41VDI4MC0yODBxMC0xNyAxMS41LTI4LjVUMzIwLTMyMHExNyAwIDI4LjUgMTEuNVQzNjAtMjgwcTAgMTctMTEuNSAyOC41VDMyMC0yNDBabTMyMCAwcS0xNyAwLTI4LjUtMTEuNVQ2MDAtMjgwcTAtMTcgMTEuNS0yOC41VDY0MC0zMjBxMTcgMCAyOC41IDExLjVUNjgwLTI4MHEwIDE3LTExLjUgMjguNVQ2NDAtMjQwWlwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi12aWV3XCIgW25nQ2xhc3NdPVwie2FjdGl2ZTogbW9kZSA9PT0gJ3dlZWsnfVwiIChjbGljayk9XCJtb2RlID0gJ3dlZWsnXCI+XG4gICAgICAgICAgICAgICAgPCEtLSB3ZWVrIHZpZXcgLS0+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTYwLTE2MHEtMzMgMC01Ni41LTIzLjVUODAtMjQwdi00ODBxMC0zMyAyMy41LTU2LjVUMTYwLTgwMGg2NDBxMzMgMCA1Ni41IDIzLjVUODgwLTcyMHY0ODBxMCAzMy0yMy41IDU2LjVUODAwLTE2MEgxNjBabTM2MC04MGgxMDB2LTQ4MEg1MjB2NDgwWm0tMTgwIDBoMTAwdi00ODBIMzQwdjQ4MFptLTE4MCAwaDEwMHYtNDgwSDE2MHY0ODBabTU0MCAwaDEwMHYtNDgwSDcwMHY0ODBaXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXZpZXdcIiBbbmdDbGFzc109XCJ7YWN0aXZlOiBtb2RlID09PSAnZGF5J31cIiAoY2xpY2spPVwibW9kZSA9ICdkYXknXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBkYXkgdmlldyAtLT5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMjAtMTYwdi04MGg3MjB2ODBIMTIwWm0wLTU2MHYtODBoNzIwdjgwSDEyMFptODAgNDAwcS0zMyAwLTU2LjUtMjMuNVQxMjAtNDAwdi0xNjBxMC0zMyAyMy41LTU2LjVUMjAwLTY0MGg1NjBxMzMgMCA1Ni41IDIzLjVUODQwLTU2MHYxNjBxMCAzMy0yMy41IDU2LjVUNzYwLTMyMEgyMDBabTAtODBoNTYwdi0xNjBIMjAwdjE2MFptMC0xNjB2MTYwLTE2MFpcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInZpZXctY29udGFpbmVyXCI+XG4gICAgICAgIDxsaWItY2FsZW5kYXIgW2V2ZW50c109XCJldmVudHNcIiBbY3VycmVudE1vbnRoXT1cImN1cnJlbnRNb250aFwiICpuZ0lmPVwibW9kZSA9PT0gJ21vbnRoJ1wiXG4gICAgICAgICAgICAoZXZlbnRDbGljayk9XCJvbkV2ZW50Q2xpY2soJGV2ZW50KVwiPjwvbGliLWNhbGVuZGFyPlxuXG4gICAgICAgIDxsaWItZGF5ICpuZ0lmPVwibW9kZSA9PT0gJ2RheSdcIiBbZGF0ZV09XCJzZWxlY3RlZERhdGVcIiBbZXZlbnRzXT1cInNlbGVjdGVkRGF0ZUV2ZW50c1wiXG4gICAgICAgICAgICAoZXZlbnRDbGljayk9XCJvbkV2ZW50Q2xpY2soJGV2ZW50KVwiPjwvbGliLWRheT5cbiAgICA8L2Rpdj5cblxuPC9kaXY+Il19
284
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYW5ndWxhci1jYWxlbmRhci9zcmMvbGliL2NvbXBvbmVudHMvc21hcnQtY2FsZW5kYXIvc21hcnQtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYW5ndWxhci1jYWxlbmRhci9zcmMvbGliL2NvbXBvbmVudHMvc21hcnQtY2FsZW5kYXIvc21hcnQtY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBUW5JLE1BQU0sT0FBTyxzQkFBc0I7SUEyQ2pDO1FBekNTLFNBQUksR0FBNkIsT0FBTyxDQUFDO1FBRXpDLFlBQU8sR0FBd0IsUUFBUSxDQUFDO1FBRXhDLGlCQUFZLEdBQW9DO1lBQ3ZELElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUM5QixLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQ2pDLENBQUM7UUFFTyxXQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUU1QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUdwQyxDQUFDO1FBRUssZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXZDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQWN6RCxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFFbEMsaUJBQVksR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2hDLHVCQUFrQixHQUFvQixFQUFFLENBQUM7UUFFekMsa0JBQWEsR0FBUyxJQUFJLElB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QUFJO1lBQ3hGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQzNCLFFBQVE7YUFDVCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTyxDQUFDLE9BQXlCO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQ3BCLElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtZQUNyQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUM5QjthQUFNLElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzFDO0lBQ0gsQ0FBQzs7bUhBelRVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLHViQ1JuQyxnbUtBcUZNOzJGRDdFTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsZ0JBQWdCOzBFQU1qQixJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBS0csV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUUrQyxvQkFBb0I7c0JBQXpFLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUdwRCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc21hcnQtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zbWFydC1jYWxlbmRhci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNtYXJ0Q2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIG1vZGU6ICdtb250aCcgfCAnd2VlaycgfCAnZGF5JyA9ICdtb250aCc7XG5cbiAgQElucHV0KCkgc3RhcnRBdDogJ21vbmRheScgfCAnc3VuZGF5JyA9ICdzdW5kYXknO1xuXG4gIEBJbnB1dCgpIGN1cnJlbnRNb250aDogeyB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIgfSA9IHtcbiAgICB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXG4gICAgbW9udGg6IG5ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDFcbiAgfTtcblxuICBASW5wdXQoKSBldmVudHM6IENhbGVuZGFyRXZlbnRbXSA9IFtdO1xuXG4gIEBPdXRwdXQoKSBtb250aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIG5ld01vbnRoOiB7IHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciB9LFxuICAgIG9sZE1vbnRoOiB7IHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciB9XG4gIH0+KCk7XG5cbiAgQE91dHB1dCgpIGRhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuXG4gIEBPdXRwdXQoKSBldmVudENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhckV2ZW50PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2RhdGVTZWxlY3RvckRyb3Bkb3duJywgeyBzdGF0aWM6IGZhbHNlIH0pIGRhdGVTZWxlY3RvckRyb3Bkb3duITogRWxlbWVudFJlZjtcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5zaG93RGF0ZVNlbGVjdG9yKSByZXR1cm47XG4gICAgY29uc3QgZHJvcGRvd24gPSB0aGlzLmRhdGVTZWxlY3RvckRyb3Bkb3duPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idG4tZGF0ZS1zZWxlY3RvcicpO1xuICAgIGlmIChkcm9wZG93biAmJiAhZHJvcGRvd24uY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiBidXR0b24gJiYgIWJ1dHRvbi5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgIHRoaXMuc2hvd0RhdGVTZWxlY3RvciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNob3dEYXRlU2VsZWN0b3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzZWxlY3RlZERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICBzZWxlY3RlZERhdGVFdmVudHM6IENhbGVuZGFyRXZlbnRbXSA9IFtdO1xuXG4gIHdlZWtTdGFydERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICB3ZWVrRW5kRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRoaXMud2Vla1N0YXJ0RGF0ZS5nZXRUaW1lKCkgKyA2ICogMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gIHdlZWtFdmVudHM6IENhbGVuZGFyRXZlbnRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3REYXRlKG5ldyBEYXRlKCkpO1xuICB9XG5cbiAgdG9nZ2xlRGF0ZVNlbGVjdG9yKCkge1xuICAgIHRoaXMuc2hvd0RhdGVTZWxlY3RvciA9ICF0aGlzLnNob3dEYXRlU2VsZWN0b3I7XG4gIH1cblxuICBvbk1vbnRoU2VsZWN0ZWQobmV3TW9udGg6IHsgeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ld01vbnRoO1xuXG4gICAgdGhpcy5zZWxlY3REYXRlKG5ldyBEYXRlKHRoaXMuY3VycmVudE1vbnRoLnllYXIsIHRoaXMuY3VycmVudE1vbnRoLm1vbnRoIC0gMSwgMSkpO1xuXG4gICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHtcbiAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgIG9sZE1vbnRoXG4gICAgfSk7XG5cbiAgICB0aGlzLnNob3dEYXRlU2VsZWN0b3IgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRXZlbnRDbGljayhldmVudDogQ2FsZW5kYXJFdmVudCkge1xuICAgIHRoaXMuZXZlbnRDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG5leHRNb250aCgpIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCA9PT0gMTIpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRNb250aC55ZWFyICsgMSxcbiAgICAgICAgbW9udGg6IDFcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRNb250aC55ZWFyLFxuICAgICAgICBtb250aDogdGhpcy5jdXJyZW50TW9udGgubW9udGggKyAxXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0RGF0ZShuZXcgRGF0ZSh0aGlzLmN1cnJlbnRNb250aC55ZWFyLCB0aGlzLmN1cnJlbnRNb250aC5tb250aCAtIDEsIDEpKTtcblxuICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICBuZXdNb250aDogdGhpcy5jdXJyZW50TW9udGgsXG4gICAgICBvbGRNb250aFxuICAgIH0pO1xuICB9XG5cbiAgcHJldk1vbnRoKCkge1xuICAgIGNvbnN0IG9sZE1vbnRoID0geyAuLi50aGlzLmN1cnJlbnRNb250aCB9O1xuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCA9PT0gMSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSB7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudE1vbnRoLnllYXIgLSAxLFxuICAgICAgICBtb250aDogMTJcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRNb250aC55ZWFyLFxuICAgICAgICBtb250aDogdGhpcy5jdXJyZW50TW9udGgubW9udGggLSAxXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0RGF0ZShuZXcgRGF0ZSh0aGlzLmN1cnJlbnRNb250aC55ZWFyLCB0aGlzLmN1cnJlbnRNb250aC5tb250aCAtIDEsIDEpKTtcblxuICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICBuZXdNb250aDogdGhpcy5jdXJyZW50TW9udGgsXG4gICAgICBvbGRNb250aFxuICAgIH0pO1xuICB9XG5cbiAgbmV4dERheSgpIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcblxuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXREYXRlKG5ld0RhdGUuZ2V0RGF0ZSgpICsgMSk7XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3RGF0ZSk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJldkRheSgpIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcblxuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXREYXRlKG5ld0RhdGUuZ2V0RGF0ZSgpIC0gMSk7XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3RGF0ZSk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgbmV4dFdlZWsoKSB7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG5cbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy53ZWVrU3RhcnREYXRlKTtcbiAgICBuZXdEYXRlLnNldERhdGUobmV3RGF0ZS5nZXREYXRlKCkgKyA3KTtcbiAgICB0aGlzLnNlbGVjdFdlZWtCeURhdGUobmV3RGF0ZSk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJldldlZWsoKSB7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG5cbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy53ZWVrU3RhcnREYXRlKTtcbiAgICBuZXdEYXRlLnNldERhdGUobmV3RGF0ZS5nZXREYXRlKCkgLSA3KTtcbiAgICB0aGlzLnNlbGVjdFdlZWtCeURhdGUobmV3RGF0ZSk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgb25OZXh0KCkge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb250aCcpXG4gICAgICB0aGlzLm5leHRNb250aCgpO1xuICAgIGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ3dlZWsnKVxuICAgICAgdGhpcy5uZXh0V2VlaygpO1xuICAgIGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2RheScpXG4gICAgICB0aGlzLm5leHREYXkoKTtcbiAgfVxuXG4gIG9uUHJldigpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnbW9udGgnKVxuICAgICAgdGhpcy5wcmV2TW9udGgoKTtcbiAgICBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICd3ZWVrJylcbiAgICAgIHRoaXMucHJldldlZWsoKTtcbiAgICBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdkYXknKVxuICAgICAgdGhpcy5wcmV2RGF5KCk7XG4gIH1cblxuICBnb1RvVG9kYXkoKSB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IG9sZE1vbnRoID0geyAuLi50aGlzLmN1cnJlbnRNb250aCB9O1xuXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSB7XG4gICAgICB5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpLFxuICAgICAgbW9udGg6IHRvZGF5LmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIHRoaXMuc2VsZWN0RGF0ZSh0b2RheSk7XG4gICAgdGhpcy5zZWxlY3RXZWVrQnlEYXRlKHRvZGF5KTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWREYXRlRXZlbnRzKCkge1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlRXZlbnRzID0gdGhpcy5ldmVudHMuZmlsdGVyKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50RGF0ZSA9IG5ldyBEYXRlKGV2ZW50LnN0YXJ0KTtcblxuICAgICAgLy8gcmV0dXJuIGV2ZW50cyB0aGF0IHN0YXJ0cywgZW5kcyBvciBzcGFucyB0aGUgc2VsZWN0ZWQgZGF0ZVxuICAgICAgcmV0dXJuIChldmVudERhdGUuZ2V0RGF0ZSgpID09PSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXREYXRlKCkgJiZcbiAgICAgICAgZXZlbnREYXRlLmdldE1vbnRoKCkgPT09IHRoaXMuc2VsZWN0ZWREYXRlLmdldE1vbnRoKCkgJiZcbiAgICAgICAgZXZlbnREYXRlLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMuc2VsZWN0ZWREYXRlLmdldEZ1bGxZZWFyKCkpIHx8XG4gICAgICAgIChldmVudC5lbmQgJiZcbiAgICAgICAgICBldmVudC5lbmQuZ2V0RGF0ZSgpID09PSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXREYXRlKCkgJiZcbiAgICAgICAgICBldmVudC5lbmQuZ2V0TW9udGgoKSA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0TW9udGgoKSAmJlxuICAgICAgICAgIGV2ZW50LmVuZC5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpKSB8fFxuICAgICAgICAoZXZlbnQuc3RhcnQgPCB0aGlzLnNlbGVjdGVkRGF0ZSAmJiBldmVudC5lbmQgJiYgZXZlbnQuZW5kID4gdGhpcy5zZWxlY3RlZERhdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgc2VsZWN0RGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBkYXRlO1xuXG4gICAgdGhpcy5zZXRTZWxlY3RlZERhdGVFdmVudHMoKTtcblxuICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5jdXJyZW50TW9udGg7XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG1vbnRoOiBkYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5kYXRlQ2hhbmdlZC5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgfVxuXG4gIHNlbGVjdFdlZWtCeURhdGUoZGF0ZTogRGF0ZSkge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3RhcnQgZGF0ZSBvZiB0aGUgd2VlayBiYXNlZCBvbiBzdGFydEF0XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTsgLy8gMCAoU3VuKSB0byA2IChTYXQpXG4gICAgbGV0IGRpZmZUb1N0YXJ0OiBudW1iZXI7XG5cbiAgICBpZiAodGhpcy5zdGFydEF0ID09PSAnbW9uZGF5Jykge1xuICAgICAgZGlmZlRvU3RhcnQgPSAoZGF5T2ZXZWVrID09PSAwKSA/IC02IDogMSAtIGRheU9mV2VlazsgLy8gSWYgU3VuZGF5LCBnbyBiYWNrIDYgZGF5c1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWZmVG9TdGFydCA9IC1kYXlPZldlZWs7IC8vIFN1bmRheSBzdGFydFxuICAgIH1cblxuICAgIHRoaXMud2Vla1N0YXJ0RGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIHRoaXMud2Vla1N0YXJ0RGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgZGlmZlRvU3RhcnQpO1xuXG4gICAgdGhpcy53ZWVrRW5kRGF0ZSA9IG5ldyBEYXRlKHRoaXMud2Vla1N0YXJ0RGF0ZSk7XG4gICAgdGhpcy53ZWVrRW5kRGF0ZS5zZXREYXRlKHRoaXMud2Vla1N0YXJ0RGF0ZS5nZXREYXRlKCkgKyA2KTtcblxuICAgIC8vIEZpbHRlciBldmVudHMgZm9yIHRoZSB3ZWVrXG4gICAgdGhpcy53ZWVrRXZlbnRzID0gdGhpcy5ldmVudHMuZmlsdGVyKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50U3RhcnQgPSBuZXcgRGF0ZShldmVudC5zdGFydCk7XG4gICAgICBjb25zdCBldmVudEVuZCA9IGV2ZW50LmVuZCA/IG5ldyBEYXRlKGV2ZW50LmVuZCkgOiBldmVudFN0YXJ0O1xuICAgICAgcmV0dXJuIChldmVudFN0YXJ0IDw9IHRoaXMud2Vla0VuZERhdGUpICYmIChldmVudEVuZCA+PSB0aGlzLndlZWtTdGFydERhdGUpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb2xkTW9udGggPSB0aGlzLmN1cnJlbnRNb250aDtcblxuICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgeWVhcjogdGhpcy53ZWVrU3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBtb250aDogdGhpcy53ZWVrU3RhcnREYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgc2V0TW9kZShuZXdNb2RlOiB0eXBlb2YgdGhpcy5tb2RlKSB7XG4gICAgdGhpcy5tb2RlID0gbmV3TW9kZTtcbiAgICBpZiAobmV3TW9kZSA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlRXZlbnRzKCk7XG4gICAgfSBlbHNlIGlmIChuZXdNb2RlID09PSAnd2VlaycpIHtcbiAgICAgIHRoaXMuc2VsZWN0V2Vla0J5RGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJzbWFydC1jYWxlbmRhci1jb21wb25lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuYXYtY29udHJvbHNcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJldlwiIChjbGljayk9XCJvblByZXYoKVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNTYwLTI0MCAzMjAtNDgwbDI0MC0yNDAgNTYgNTYtMTg0IDE4NCAxODQgMTg0LTU2IDU2WlwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi10b2RheVwiIChjbGljayk9XCJnb1RvVG9kYXkoKVwiPnt7J3RvZGF5JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tbmV4dFwiIChjbGljayk9XCJvbk5leHQoKVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNTA0LTQ4MCAzMjAtNjY0bDU2LTU2IDI0MCAyNDAtMjQwIDI0MC01Ni01NiAxODQtMTg0WlwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNwYWNlclwiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXNlbGVjdG9yLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1kYXRlLXNlbGVjdG9yXCIgKGNsaWNrKT1cInRvZ2dsZURhdGVTZWxlY3RvcigpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2RlID09PSAnbW9udGgnXCI+e3sgY3VycmVudE1vbnRoLm1vbnRoIHwgdHJhbnNsYXRlTW9udGh9fSAtIHt7IGN1cnJlbnRNb250aC55ZWFyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibW9kZSA9PT0gJ3dlZWsnXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHdlZWtTdGFydERhdGUudG9EYXRlU3RyaW5nKCkgfX0gLSB7eyB3ZWVrRW5kRGF0ZS50b0RhdGVTdHJpbmcoKSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1vZGUgPT09ICdkYXknXCI+e3sgc2VsZWN0ZWREYXRlLnRvRGF0ZVN0cmluZygpIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00ODAtMzYwIDI4MC01NjBoNDAwTDQ4MC0zNjBaXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1zZWxlY3Rvci1kcm9wZG93blwiICpuZ0lmPVwic2hvd0RhdGVTZWxlY3RvclwiICNkYXRlU2VsZWN0b3JEcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8bGliLW1vbnRoLXNlbGVjdG9yIFtzZWxlY3RlZE1vbnRoXT1cImN1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgICAgICAgIChtb250aFNlbGVjdGVkKT1cIm9uTW9udGhTZWxlY3RlZCgkZXZlbnQpXCI+PC9saWItbW9udGgtc2VsZWN0b3I+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNwYWNlclwiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LXNlbGVjdG9yXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXZpZXdcIiBbbmdDbGFzc109XCJ7YWN0aXZlOiBtb2RlID09PSAnbW9udGgnfVwiIChjbGljayk9XCJzZXRNb2RlKCdtb250aCcpXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBtb250aCB2aWV3IC0tPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwMC04MHEtMzMgMC01Ni41LTIzLjVUMTIwLTE2MHYtNTYwcTAtMzMgMjMuNS01Ni41VDIwMC04MDBoNDB2LTgwaDgwdjgwaDMyMHYtODBoODB2ODBoNDBxMzMgMCA1Ni41IDIzLjVUODQwLTcyMHY1NjBxMCAzMy0yMy41IDU2LjVUNzYwLTgwSDIwMFptMC04MGg1NjB2LTQwMEgyMDB2NDAwWm0wLTQ4MGg1NjB2LTgwSDIwMHY4MFptMCAwdi04MCA4MFptMjgwIDI0MHEtMTcgMC0yOC41LTExLjVUNDQwLTQ0MHEwLTE3IDExLjUtMjguNVQ0ODAtNDgwcTE3IDAgMjguNSAxMS41VDUyMC00NDBxMCAxNy0xMS41IDI4LjVUNDgwLTQwMFptLTE2MCAwcS0xNyAwLTI4LjUtMTEuNVQyODAtNDQwcTAtMTcgMTEuNS0yOC41VDMyMC00ODBxMTcgMCAyOC41IDExLjVUMzYwLTQ0MHEwIDE3LTExLjUgMjguNVQzMjAtNDAwWm0zMjAgMHEtMTcgMC0yOC41LTExLjVUNjAwLTQ0MHEwLTE3IDExLjUtMjguNVQ2NDAtNDgwcTE3IDAgMjguNSAxMS41VDY4MC00NDBxMCAxNy0xMS41IDI4LjVUNjQwLTQwMFpNNDgwLTI0MHEtMTcgMC0yOC41LTExLjVUNDQwLTI4MHEwLTE3IDExLjUtMjguNVQ0ODAtMzIwcTE3IDAgMjguNSAxMS41VDUyMC0yODBxMCAxNy0xMS41IDI4LjVUNDgwLTI0MFptLTE2MCAwcS0xNyAwLTI4LjUtMTEuNVQyODAtMjgwcTAtMTcgMTEuNS0yOC41VDMyMC0zMjBxMTcgMCAyOC41IDExLjVUMzYwLTI4MHEwIDE3LTExLjUgMjguNVQzMjAtMjQwWm0zMjAgMHEtMTcgMC0yOC41LTExLjVUNjAwLTI4MHEwLTE3IDExLjUtMjguNVQ2NDAtMzIwcTE3IDAgMjguNSAxMS41VDY4MC0yODBxMCAxNy0xMS41IDI4LjVUNjQwLTI0MFpcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tdmlld1wiIFtuZ0NsYXNzXT1cInthY3RpdmU6IG1vZGUgPT09ICd3ZWVrJ31cIiAoY2xpY2spPVwic2V0TW9kZSgnd2VlaycpXCI+XG4gICAgICAgICAgICAgICAgPCEtLSB3ZWVrIHZpZXcgLS0+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTYwLTE2MHEtMzMgMC01Ni41LTIzLjVUODAtMjQwdi00ODBxMC0zMyAyMy41LTU2LjVUMTYwLTgwMGg2NDBxMzMgMCA1Ni41IDIzLjVUODgwLTcyMHY0ODBxMCAzMy0yMy41IDU2LjVUODAwLTE2MEgxNjBabTM2MC04MGgxMDB2LTQ4MEg1MjB2NDgwWm0tMTgwIDBoMTAwdi00ODBIMzQwdjQ4MFptLTE4MCAwaDEwMHYtNDgwSDE2MHY0ODBabTU0MCAwaDEwMHYtNDgwSDcwMHY0ODBaXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXZpZXdcIiBbbmdDbGFzc109XCJ7YWN0aXZlOiBtb2RlID09PSAnZGF5J31cIiAoY2xpY2spPVwic2V0TW9kZSgnZGF5JylcIj5cbiAgICAgICAgICAgICAgICA8IS0tIGRheSB2aWV3IC0tPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyMC0xNjB2LTgwaDcyMHY4MEgxMjBabTAtNTYwdi04MGg3MjB2ODBIMTIwWm04MCA0MDBxLTMzIDAtNTYuNS0yMy41VDEyMC00MDB2LTE2MHEwLTMzIDIzLjUtNTYuNVQyMDAtNjQwaDU2MHEzMyAwIDU2LjUgMjMuNVQ4NDAtNTYwdjE2MHEwIDMzLTIzLjUgNTYuNVQ3NjAtMzIwSDIwMFptMC04MGg1NjB2LTE2MEgyMDB2MTYwWm0wLTE2MHYxNjAtMTYwWlwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidmlldy1jb250YWluZXJcIj5cbiAgICAgICAgPGxpYi1jYWxlbmRhciBbZXZlbnRzXT1cImV2ZW50c1wiIFtjdXJyZW50TW9udGhdPVwiY3VycmVudE1vbnRoXCIgKm5nSWY9XCJtb2RlID09PSAnbW9udGgnXCIgW3N0YXJ0QXRdPVwic3RhcnRBdFwiXG4gICAgICAgICAgICAoZXZlbnRDbGljayk9XCJvbkV2ZW50Q2xpY2soJGV2ZW50KVwiPjwvbGliLWNhbGVuZGFyPlxuXG4gICAgICAgIDxsaWItd2VlayAqbmdJZj1cIm1vZGUgPT09ICd3ZWVrJ1wiIFtzdGFydEF0XT1cInN0YXJ0QXRcIiBbc3RhcnREYXRlXT1cIndlZWtTdGFydERhdGVcIlxuICAgICAgICAgICAgW2V2ZW50c109XCJ3ZWVrRXZlbnRzXCI+PC9saWItd2Vlaz5cblxuICAgICAgICA8bGliLWRheSAqbmdJZj1cIm1vZGUgPT09ICdkYXknXCIgW2RhdGVdPVwic2VsZWN0ZWREYXRlXCIgW2V2ZW50c109XCJzZWxlY3RlZERhdGVFdmVudHNcIlxuICAgICAgICAgICAgKGV2ZW50Q2xpY2spPVwib25FdmVudENsaWNrKCRldmVudClcIj48L2xpYi1kYXk+XG4gICAgPC9kaXY+XG5cbjwvZGl2PiJdfQ==
@@ -0,0 +1,133 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "../calendar-event/calendar-event.component";
5
+ import * as i3 from "../duration-event/duration-event.component";
6
+ import * as i4 from "../../pipes/translate.pipe";
7
+ export class WeekComponent {
8
+ constructor() {
9
+ this.startAt = 'sunday';
10
+ this.events = [];
11
+ this.eventClick = new EventEmitter();
12
+ this.weekDays = [
13
+ { tag: 'sun' },
14
+ { tag: 'mon' },
15
+ { tag: 'tue' },
16
+ { tag: 'wed' },
17
+ { tag: 'thu' },
18
+ { tag: 'fri' },
19
+ { tag: 'sat' },
20
+ ];
21
+ this.hourBlocks = Array.from({ length: 24 }, (_, i) => i);
22
+ this.allDayHeight = 60;
23
+ this.weekDayCols = [];
24
+ this.resizing = false;
25
+ this.startY = 0;
26
+ this.startHeight = 0;
27
+ this.onResizeMouseMove = (event) => {
28
+ if (!this.resizing)
29
+ return;
30
+ const delta = event.clientY - this.startY;
31
+ const newHeight = this.startHeight + delta;
32
+ this.allDayHeight = Math.max(60, newHeight); // mínimo 80px
33
+ };
34
+ this.onResizeMouseUp = () => {
35
+ this.resizing = false;
36
+ document.removeEventListener('mousemove', this.onResizeMouseMove);
37
+ document.removeEventListener('mouseup', this.onResizeMouseUp);
38
+ };
39
+ }
40
+ ngOnInit() {
41
+ if (this.startAt === 'monday') {
42
+ this.weekDays = [
43
+ { tag: 'mon' },
44
+ { tag: 'tue' },
45
+ { tag: 'wed' },
46
+ { tag: 'thu' },
47
+ { tag: 'fri' },
48
+ { tag: 'sat' },
49
+ { tag: 'sun' },
50
+ ];
51
+ }
52
+ this.initWeekDayCols();
53
+ }
54
+ initWeekDayCols() {
55
+ this.weekDayCols = [];
56
+ for (let i = 0; i < 7; i++) {
57
+ const currentDate = new Date(this.startDate.getTime() + i * 24 * 60 * 60 * 1000);
58
+ this.weekDayCols.push({
59
+ date: currentDate,
60
+ eventCols: [],
61
+ allDayEvents: []
62
+ });
63
+ }
64
+ this.events.forEach(event => this.addEvent(event));
65
+ }
66
+ addEvent(event) {
67
+ const index = this.weekDayCols.findIndex(col => col.date.getFullYear() === event.start.getFullYear() &&
68
+ col.date.getMonth() === event.start.getMonth() &&
69
+ col.date.getDate() === event.start.getDate());
70
+ if (index === -1)
71
+ return;
72
+ const eventCols = this.weekDayCols[index].eventCols;
73
+ if (event.allDay) {
74
+ this.weekDayCols[index].allDayEvents.push(event);
75
+ }
76
+ else {
77
+ const colIndex = this.findAvalailableColumn(event, index);
78
+ if (colIndex === eventCols.length) {
79
+ eventCols.push({ events: [event] });
80
+ }
81
+ else {
82
+ eventCols[colIndex].events.push(event);
83
+ }
84
+ }
85
+ }
86
+ findAvalailableColumn(event, dayIndex) {
87
+ const eventCols = this.weekDayCols[dayIndex].eventCols;
88
+ for (let colIndex = 0; colIndex < eventCols.length; colIndex++) {
89
+ const col = eventCols[colIndex];
90
+ // conflict if event overlaps with any existing event in the column
91
+ const hasConflict = col.events.some(existingEvent => {
92
+ const startsDuringExisting = event.start < existingEvent.end && event.start >= existingEvent.start;
93
+ const endsDuringExisting = event.end > existingEvent.start && event.end <= existingEvent.end;
94
+ const spansExisting = event.start <= existingEvent.start && event.end >= existingEvent.end;
95
+ return startsDuringExisting || endsDuringExisting || spansExisting;
96
+ });
97
+ if (!hasConflict) {
98
+ return colIndex;
99
+ }
100
+ }
101
+ return eventCols.length;
102
+ }
103
+ ngOnChanges(changes) {
104
+ if (changes['events'] || changes['startDate']) {
105
+ this.initWeekDayCols();
106
+ }
107
+ }
108
+ onResizeMouseDown(event) {
109
+ this.resizing = true;
110
+ this.startY = event.clientY;
111
+ this.startHeight = this.allDayHeight;
112
+ document.addEventListener('mousemove', this.onResizeMouseMove);
113
+ document.addEventListener('mouseup', this.onResizeMouseUp);
114
+ }
115
+ onEventClick(event) {
116
+ this.eventClick.emit(event);
117
+ }
118
+ }
119
+ WeekComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WeekComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
120
+ WeekComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: WeekComponent, selector: "lib-week", inputs: { startAt: "startAt", events: "events", startDate: "startDate" }, outputs: { eventClick: "eventClick" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"week-view-component\">\n <section class=\"all-day-events\" [style.height.px]=\"allDayHeight\">\n <div class=\"header\">\n {{'allDayEvents' | translate}}\n </div>\n\n <div class=\"days-container\">\n <div class=\"events-container\" *ngFor=\"let day of weekDayCols; let i = index\">\n <div class=\"week-day\">\n {{ weekDays[i].tag | translate | slice:0:3 }}\n </div>\n\n <lib-calendar-event *ngFor=\"let event of day.allDayEvents\" [event]=\"event\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar-event>\n </div>\n </div>\n </section>\n\n <div class=\"resize-divider\" (mousedown)=\"onResizeMouseDown($event)\"></div>\n\n <section class=\"duration-events\">\n <div class=\"hour-blocks\">\n <div class=\"hour-block\" *ngFor=\"let hour of hourBlocks\">\n <span>{{ hour }}:00</span>\n </div>\n </div>\n\n <div class=\"events-wrapper\">\n <div class=\"time-blocks\">\n <div class=\"day-block\" *ngFor=\"let day of weekDayCols\">\n <div class=\"time-block\" *ngFor=\"let hour of hourBlocks\">\n <div class=\"time-block-middle\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"days-container\">\n <div class=\"events-container\" *ngFor=\"let day of weekDayCols\"\n [style.gridTemplateColumns]=\"'repeat(' + day.eventCols.length + ', 1fr)'\">\n <div class=\"event-column\" *ngFor=\"let col of day.eventCols\">\n\n <lib-duration-event *ngFor=\"let event of col.events\" [event]=\"event\" [date]=\"day.date\"\n (eventClick)=\"onEventClick($event)\"></lib-duration-event>\n\n </div>\n </div>\n </div>\n </div>\n </section>\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.week-view-component{display:flex;flex-direction:column;width:100%;height:100%;max-height:100%;overflow:hidden}section.all-day-events{position:relative;flex-shrink:0;display:flex;flex-direction:column;width:100%;min-height:60px;border-top:1px solid rgba(0,0,0,.12);overflow-y:scroll}section.all-day-events .header{position:sticky;top:0;left:0;z-index:2;width:100%;flex-shrink:0;padding:2px 8px;background-color:#fff;font-size:12px;color:#000000b3;-webkit-user-select:none;user-select:none}section.all-day-events .days-container{display:grid;grid-template-columns:repeat(7,1fr);height:100%;padding-left:45px}section.all-day-events .events-container{display:flex;flex-direction:column;gap:1px;border-right:1px solid rgba(0,0,0,.12)}section.all-day-events .week-day{position:sticky;top:0;left:0;z-index:2;width:100%;font-size:12px;text-align:center;-webkit-user-select:none;user-select:none}section.duration-events{flex-grow:1;display:flex;width:100%;overflow:auto}section.duration-events .hour-blocks{display:flex;flex-direction:column;width:45px;-webkit-user-select:none;user-select:none}section.duration-events .hour-blocks .hour-block{flex-shrink:0;height:60px;padding:4px;border:1px solid rgba(0,0,0,.12);border-top:none;font-size:12px;color:#00000080}section.duration-events .events-wrapper{position:relative;flex-grow:1;width:100%}section.duration-events .events-wrapper .time-blocks{position:absolute;top:0;left:0;width:100%;height:100%;z-index:0;display:grid;grid-template-columns:repeat(7,1fr)}section.duration-events .events-wrapper .time-blocks .day-block{display:flex;flex-direction:column;border-right:1px solid rgba(0,0,0,.12)}section.duration-events .events-wrapper .time-blocks .time-block{flex-shrink:0;height:60px;padding:4px;border-bottom:1px solid rgba(0,0,0,.12);border-top:none;font-size:12px;color:#00000080}section.duration-events .events-wrapper .time-blocks .time-block .time-block-middle{width:100%;height:50%;border-bottom:1px dashed rgba(0,0,0,.12)}section.duration-events .events-wrapper .days-container{display:grid;grid-template-columns:repeat(7,1fr);column-gap:1px}section.duration-events .events-wrapper .events-container{display:grid;column-gap:1px}section.duration-events .events-wrapper .events-container .event-column{position:relative}.resize-divider{flex-shrink:0;width:100%;height:4px;background-color:#0000001f;cursor:row-resize;transition:transform .2s ease}.resize-divider:hover{z-index:5;background:repeating-linear-gradient(45deg,rgba(0,0,0,.12),rgba(0,0,0,.12) 4px,#ffffff 4px,#ffffff 8px);background-color:#fff;background-size:22px 8px;animation:stripe-move 1s linear infinite;transform:scaleY(2)}@keyframes stripe-move{0%{background-position:0 0}to{background-position:22px 0}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2.CalendarEventComponent, selector: "lib-calendar-event", inputs: ["event"], outputs: ["eventClick"] }, { kind: "component", type: i3.DurationEventComponent, selector: "lib-duration-event", inputs: ["event", "date"], outputs: ["eventClick"] }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WeekComponent, decorators: [{
122
+ type: Component,
123
+ args: [{ selector: 'lib-week', template: "<div class=\"week-view-component\">\n <section class=\"all-day-events\" [style.height.px]=\"allDayHeight\">\n <div class=\"header\">\n {{'allDayEvents' | translate}}\n </div>\n\n <div class=\"days-container\">\n <div class=\"events-container\" *ngFor=\"let day of weekDayCols; let i = index\">\n <div class=\"week-day\">\n {{ weekDays[i].tag | translate | slice:0:3 }}\n </div>\n\n <lib-calendar-event *ngFor=\"let event of day.allDayEvents\" [event]=\"event\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar-event>\n </div>\n </div>\n </section>\n\n <div class=\"resize-divider\" (mousedown)=\"onResizeMouseDown($event)\"></div>\n\n <section class=\"duration-events\">\n <div class=\"hour-blocks\">\n <div class=\"hour-block\" *ngFor=\"let hour of hourBlocks\">\n <span>{{ hour }}:00</span>\n </div>\n </div>\n\n <div class=\"events-wrapper\">\n <div class=\"time-blocks\">\n <div class=\"day-block\" *ngFor=\"let day of weekDayCols\">\n <div class=\"time-block\" *ngFor=\"let hour of hourBlocks\">\n <div class=\"time-block-middle\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"days-container\">\n <div class=\"events-container\" *ngFor=\"let day of weekDayCols\"\n [style.gridTemplateColumns]=\"'repeat(' + day.eventCols.length + ', 1fr)'\">\n <div class=\"event-column\" *ngFor=\"let col of day.eventCols\">\n\n <lib-duration-event *ngFor=\"let event of col.events\" [event]=\"event\" [date]=\"day.date\"\n (eventClick)=\"onEventClick($event)\"></lib-duration-event>\n\n </div>\n </div>\n </div>\n </div>\n </section>\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.week-view-component{display:flex;flex-direction:column;width:100%;height:100%;max-height:100%;overflow:hidden}section.all-day-events{position:relative;flex-shrink:0;display:flex;flex-direction:column;width:100%;min-height:60px;border-top:1px solid rgba(0,0,0,.12);overflow-y:scroll}section.all-day-events .header{position:sticky;top:0;left:0;z-index:2;width:100%;flex-shrink:0;padding:2px 8px;background-color:#fff;font-size:12px;color:#000000b3;-webkit-user-select:none;user-select:none}section.all-day-events .days-container{display:grid;grid-template-columns:repeat(7,1fr);height:100%;padding-left:45px}section.all-day-events .events-container{display:flex;flex-direction:column;gap:1px;border-right:1px solid rgba(0,0,0,.12)}section.all-day-events .week-day{position:sticky;top:0;left:0;z-index:2;width:100%;font-size:12px;text-align:center;-webkit-user-select:none;user-select:none}section.duration-events{flex-grow:1;display:flex;width:100%;overflow:auto}section.duration-events .hour-blocks{display:flex;flex-direction:column;width:45px;-webkit-user-select:none;user-select:none}section.duration-events .hour-blocks .hour-block{flex-shrink:0;height:60px;padding:4px;border:1px solid rgba(0,0,0,.12);border-top:none;font-size:12px;color:#00000080}section.duration-events .events-wrapper{position:relative;flex-grow:1;width:100%}section.duration-events .events-wrapper .time-blocks{position:absolute;top:0;left:0;width:100%;height:100%;z-index:0;display:grid;grid-template-columns:repeat(7,1fr)}section.duration-events .events-wrapper .time-blocks .day-block{display:flex;flex-direction:column;border-right:1px solid rgba(0,0,0,.12)}section.duration-events .events-wrapper .time-blocks .time-block{flex-shrink:0;height:60px;padding:4px;border-bottom:1px solid rgba(0,0,0,.12);border-top:none;font-size:12px;color:#00000080}section.duration-events .events-wrapper .time-blocks .time-block .time-block-middle{width:100%;height:50%;border-bottom:1px dashed rgba(0,0,0,.12)}section.duration-events .events-wrapper .days-container{display:grid;grid-template-columns:repeat(7,1fr);column-gap:1px}section.duration-events .events-wrapper .events-container{display:grid;column-gap:1px}section.duration-events .events-wrapper .events-container .event-column{position:relative}.resize-divider{flex-shrink:0;width:100%;height:4px;background-color:#0000001f;cursor:row-resize;transition:transform .2s ease}.resize-divider:hover{z-index:5;background:repeating-linear-gradient(45deg,rgba(0,0,0,.12),rgba(0,0,0,.12) 4px,#ffffff 4px,#ffffff 8px);background-color:#fff;background-size:22px 8px;animation:stripe-move 1s linear infinite;transform:scaleY(2)}@keyframes stripe-move{0%{background-position:0 0}to{background-position:22px 0}}\n"] }]
124
+ }], ctorParameters: function () { return []; }, propDecorators: { startAt: [{
125
+ type: Input
126
+ }], events: [{
127
+ type: Input
128
+ }], startDate: [{
129
+ type: Input
130
+ }], eventClick: [{
131
+ type: Output
132
+ }] } });
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vlay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1hbmd1bGFyLWNhbGVuZGFyL3NyYy9saWIvY29tcG9uZW50cy93ZWVrL3dlZWsuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYW5ndWxhci1jYWxlbmRhci9zcmMvbGliL2NvbXBvbmVudHMvd2Vlay93ZWVrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBUXpHLE1BQU0sT0FBTyxhQUFhO0lBK0J4QjtRQTdCUyxZQUFPLEdBQXdCLFFBQVEsQ0FBQztRQUV4QyxXQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUc1QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFFekQsYUFBUSxHQUFjO1lBQ3BCLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtTQUNmLENBQUM7UUFFRixlQUFVLEdBQWEsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRS9ELGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBRWxCLGdCQUFXLEdBTUwsRUFBRSxDQUFDO1FBcUZELGFBQVEsR0FBRyxL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QUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJFdmVudCwgV2Vla0RheSB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXdlZWsnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2Vlay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dlZWsuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBXZWVrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHN0YXJ0QXQ6ICdtb25kYXknIHwgJ3N1bmRheScgPSAnc3VuZGF5JztcblxuICBASW5wdXQoKSBldmVudHM6IENhbGVuZGFyRXZlbnRbXSA9IFtdO1xuICBASW5wdXQoKSBzdGFydERhdGUhOiBEYXRlO1xuXG4gIEBPdXRwdXQoKSBldmVudENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhckV2ZW50PigpO1xuXG4gIHdlZWtEYXlzOiBXZWVrRGF5W10gPSBbXG4gICAgeyB0YWc6ICdzdW4nIH0sXG4gICAgeyB0YWc6ICdtb24nIH0sXG4gICAgeyB0YWc6ICd0dWUnIH0sXG4gICAgeyB0YWc6ICd3ZWQnIH0sXG4gICAgeyB0YWc6ICd0aHUnIH0sXG4gICAgeyB0YWc6ICdmcmknIH0sXG4gICAgeyB0YWc6ICdzYXQnIH0sXG4gIF07XG5cbiAgaG91ckJsb2NrczogbnVtYmVyW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaSk7XG5cbiAgYWxsRGF5SGVpZ2h0ID0gNjA7XG5cbiAgd2Vla0RheUNvbHM6IHtcbiAgICBkYXRlOiBEYXRlO1xuICAgIGV2ZW50Q29sczoge1xuICAgICAgZXZlbnRzOiBDYWxlbmRhckV2ZW50W107XG4gICAgfVtdO1xuICAgIGFsbERheUV2ZW50czogQ2FsZW5kYXJFdmVudFtdO1xuICB9W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXJ0QXQgPT09ICdtb25kYXknKSB7XG4gICAgICB0aGlzLndlZWtEYXlzID0gW1xuICAgICAgICB7IHRhZzogJ21vbicgfSxcbiAgICAgICAgeyB0YWc6ICd0dWUnIH0sXG4gICAgICAgIHsgdGFnOiAnd2VkJyB9LFxuICAgICAgICB7IHRhZzogJ3RodScgfSxcbiAgICAgICAgeyB0YWc6ICdmcmknIH0sXG4gICAgICAgIHsgdGFnOiAnc2F0JyB9LFxuICAgICAgICB7IHRhZzogJ3N1bicgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgdGhpcy5pbml0V2Vla0RheUNvbHMoKTtcbiAgfVxuXG4gIGluaXRXZWVrRGF5Q29scygpIHtcbiAgICB0aGlzLndlZWtEYXlDb2xzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0VGltZSgpICsgaSAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgICAgdGhpcy53ZWVrRGF5Q29scy5wdXNoKHtcbiAgICAgICAgZGF0ZTogY3VycmVudERhdGUsXG4gICAgICAgIGV2ZW50Q29sczogW10sXG4gICAgICAgIGFsbERheUV2ZW50czogW11cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZXZlbnQgPT4gdGhpcy5hZGRFdmVudChldmVudCkpO1xuICB9XG5cbiAgYWRkRXZlbnQoZXZlbnQ6IENhbGVuZGFyRXZlbnQpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMud2Vla0RheUNvbHMuZmluZEluZGV4KGNvbCA9PlxuICAgICAgY29sLmRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gZXZlbnQuc3RhcnQuZ2V0RnVsbFllYXIoKSAmJlxuICAgICAgY29sLmRhdGUuZ2V0TW9udGgoKSA9PT0gZXZlbnQuc3RhcnQuZ2V0TW9udGgoKSAmJlxuICAgICAgY29sLmRhdGUuZ2V0RGF0ZSgpID09PSBldmVudC5zdGFydC5nZXREYXRlKClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXZlbnRDb2xzID0gdGhpcy53ZWVrRGF5Q29sc1tpbmRleF0uZXZlbnRDb2xzO1xuXG4gICAgaWYgKGV2ZW50LmFsbERheSkge1xuICAgICAgdGhpcy53ZWVrRGF5Q29sc1tpbmRleF0uYWxsRGF5RXZlbnRzLnB1c2goZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb2xJbmRleCA9IHRoaXMuZmluZEF2YWxhaWxhYmxlQ29sdW1uKGV2ZW50LCBpbmRleCk7XG5cbiAgICAgIGlmIChjb2xJbmRleCA9PT0gZXZlbnRDb2xzLmxlbmd0aCkge1xuICAgICAgICBldmVudENvbHMucHVzaCh7IGV2ZW50czogW2V2ZW50XSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50Q29sc1tjb2xJbmRleF0uZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZpbmRBdmFsYWlsYWJsZUNvbHVtbihldmVudDogQ2FsZW5kYXJFdmVudCwgZGF5SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgZXZlbnRDb2xzID0gdGhpcy53ZWVrRGF5Q29sc1tkYXlJbmRleF0uZXZlbnRDb2xzO1xuXG4gICAgZm9yIChsZXQgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGV2ZW50Q29scy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNvbCA9IGV2ZW50Q29sc1tjb2xJbmRleF07XG5cbiAgICAgIC8vIGNvbmZsaWN0IGlmIGV2ZW50IG92ZXJsYXBzIHdpdGggYW55IGV4aXN0aW5nIGV2ZW50IGluIHRoZSBjb2x1bW5cbiAgICAgIGNvbnN0IGhhc0NvbmZsaWN0ID0gY29sLmV2ZW50cy5zb21lKGV4aXN0aW5nRXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBzdGFydHNEdXJpbmdFeGlzdGluZyA9IGV2ZW50LnN0YXJ0IDwgZXhpc3RpbmdFdmVudC5lbmQhICYmIGV2ZW50LnN0YXJ0ID49IGV4aXN0aW5nRXZlbnQuc3RhcnQ7XG4gICAgICAgIGNvbnN0IGVuZHNEdXJpbmdFeGlzdGluZyA9IGV2ZW50LmVuZCEgPiBleGlzdGluZ0V2ZW50LnN0YXJ0ICYmIGV2ZW50LmVuZCEgPD0gZXhpc3RpbmdFdmVudC5lbmQhO1xuICAgICAgICBjb25zdCBzcGFuc0V4aXN0aW5nID0gZXZlbnQuc3RhcnQgPD0gZXhpc3RpbmdFdmVudC5zdGFydCAmJiBldmVudC5lbmQhID49IGV4aXN0aW5nRXZlbnQuZW5kITtcbiAgICAgICAgcmV0dXJuIHN0YXJ0c0R1cmluZ0V4aXN0aW5nIHx8IGVuZHNEdXJpbmdFeGlzdGluZyB8fCBzcGFuc0V4aXN0aW5nO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghaGFzQ29uZmxpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNvbEluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXZlbnRDb2xzLmxlbmd0aDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZXZlbnRzJ10gfHwgY2hhbmdlc1snc3RhcnREYXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdFdlZWtEYXlDb2xzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNpemluZyA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXJ0WSA9IDA7XG4gIHByaXZhdGUgc3RhcnRIZWlnaHQgPSAwO1xuXG4gIG9uUmVzaXplTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemluZyA9IHRydWU7XG4gICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuICAgIHRoaXMuc3RhcnRIZWlnaHQgPSB0aGlzLmFsbERheUhlaWdodDtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vblJlc2l6ZU1vdXNlVXApO1xuICB9XG5cbiAgb25SZXNpemVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMucmVzaXppbmcpIHJldHVybjtcbiAgICBjb25zdCBkZWx0YSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICBjb25zdCBuZXdIZWlnaHQgPSB0aGlzLnN0YXJ0SGVpZ2h0ICsgZGVsdGE7XG4gICAgdGhpcy5hbGxEYXlIZWlnaHQgPSBNYXRoLm1heCg2MCwgbmV3SGVpZ2h0KTsgLy8gbcOtbmltbyA4MHB4XG4gIH07XG5cbiAgb25SZXNpemVNb3VzZVVwID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMucmVzaXppbmcgPSBmYWxzZTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vblJlc2l6ZU1vdXNlVXApO1xuICB9O1xuXG4gIG9uRXZlbnRDbGljayhldmVudDogQ2FsZW5kYXJFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwid2Vlay12aWV3LWNvbXBvbmVudFwiPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwiYWxsLWRheS1ldmVudHNcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cImFsbERheUhlaWdodFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICB7eydhbGxEYXlFdmVudHMnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRheXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnRzLWNvbnRhaW5lclwiICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla0RheUNvbHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Vlay1kYXlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgd2Vla0RheXNbaV0udGFnIHwgdHJhbnNsYXRlIHwgc2xpY2U6MDozIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8bGliLWNhbGVuZGFyLWV2ZW50ICpuZ0Zvcj1cImxldCBldmVudCBvZiBkYXkuYWxsRGF5RXZlbnRzXCIgW2V2ZW50XT1cImV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgKGV2ZW50Q2xpY2spPVwib25FdmVudENsaWNrKCRldmVudClcIj48L2xpYi1jYWxlbmRhci1ldmVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3NlY3Rpb24+XG5cbiAgICA8ZGl2IGNsYXNzPVwicmVzaXplLWRpdmlkZXJcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplTW91c2VEb3duKCRldmVudClcIj48L2Rpdj5cblxuICAgIDxzZWN0aW9uIGNsYXNzPVwiZHVyYXRpb24tZXZlbnRzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJob3VyLWJsb2Nrc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdXItYmxvY2tcIiAqbmdGb3I9XCJsZXQgaG91ciBvZiBob3VyQmxvY2tzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgaG91ciB9fTowMDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnRzLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWJsb2Nrc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXktYmxvY2tcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtEYXlDb2xzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWJsb2NrXCIgKm5nRm9yPVwibGV0IGhvdXIgb2YgaG91ckJsb2Nrc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtYmxvY2stbWlkZGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXlzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudHMtY29udGFpbmVyXCIgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5Q29sc1wiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zXT1cIidyZXBlYXQoJyArIGRheS5ldmVudENvbHMubGVuZ3RoICsgJywgMWZyKSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LWNvbHVtblwiICpuZ0Zvcj1cImxldCBjb2wgb2YgZGF5LmV2ZW50Q29sc1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWR1cmF0aW9uLWV2ZW50ICpuZ0Zvcj1cImxldCBldmVudCBvZiBjb2wuZXZlbnRzXCIgW2V2ZW50XT1cImV2ZW50XCIgW2RhdGVdPVwiZGF5LmRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudENsaWNrKT1cIm9uRXZlbnRDbGljaygkZXZlbnQpXCI+PC9saWItZHVyYXRpb24tZXZlbnQ+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9zZWN0aW9uPlxuPC9kaXY+Il19