simpo-component-library 2.0.27 → 2.0.28

Sign up to get free protection for your applications and to get access to all the features.
@@ -36,6 +36,7 @@ import { MatSelectModule } from '@angular/material/select';
36
36
  import { MatDatepickerModule } from '@angular/material/datepicker';
37
37
  import { MatNativeDateModule } from '@angular/material/core';
38
38
  import { MatIconModule } from '@angular/material/icon';
39
+ import moment from 'moment';
39
40
  import * as i0 from "@angular/core";
40
41
  import * as i1 from "./../../services/events.service";
41
42
  import * as i2 from "@angular/material/dialog";
@@ -53,42 +54,55 @@ import * as i13 from "@angular/material/datepicker";
53
54
  import * as i14 from "@angular/material/input";
54
55
  import * as i15 from "@angular/material/icon";
55
56
  export class AppointmentFormComponent extends BaseSection {
56
- constructor(_eventService, matDialog, restService, snackBar) {
57
+ constructor(_eventService, matDialog, appointmentService, snackbar) {
57
58
  super();
58
59
  this._eventService = _eventService;
59
60
  this.matDialog = matDialog;
60
- this.restService = restService;
61
- this.snackBar = snackBar;
61
+ this.appointmentService = appointmentService;
62
+ this.snackbar = snackbar;
62
63
  this.isMoved = false;
64
+ this.minDate = new Date();
65
+ this.bookedSlots = new Set();
66
+ this.locationTiming = [];
67
+ this.selectedLocation = "";
68
+ this.formattedTimeIntervals = [];
69
+ this.dateFilter = (date) => {
70
+ const day = date?.getDay();
71
+ // Disable Sundays
72
+ return day !== 0;
73
+ };
74
+ this.selectedServices = '';
75
+ this.selectedStaff = '';
63
76
  this.CreateData = {
77
+ //appointmentId: "",
64
78
  business: {
65
79
  id: "",
66
80
  name: ""
67
81
  },
68
82
  clientName: "",
69
83
  mobile: "",
70
- scheduledDate: "",
71
- staff: [],
84
+ scheduledDate: new Date(),
72
85
  services: [
73
86
  {
74
87
  id: "",
75
88
  name: ""
76
89
  }
77
90
  ],
78
- time: "",
91
+ staff: [
92
+ {
93
+ id: "",
94
+ name: ""
95
+ }
96
+ ],
97
+ location: {
98
+ id: "",
99
+ name: ""
100
+ },
101
+ scheduledTime: "",
79
102
  message: ""
80
103
  };
81
- this.minDate = new Date();
82
- this.selectedLocation = "";
83
- this.staffList = [];
84
- this.selectedStaff = '';
85
- this.selectedServices = '';
86
- this.dateFilter = (date) => {
87
- const day = date?.getDay();
88
- // Disable Sundays
89
- return day !== 0;
90
- };
91
104
  this.createLoader = false;
105
+ this.availableTimes = [];
92
106
  }
93
107
  ngOnInit() {
94
108
  console.log(this.data);
@@ -99,9 +113,9 @@ export class AppointmentFormComponent extends BaseSection {
99
113
  return;
100
114
  this.businessId = localStorage.getItem("bId") ?? localStorage.getItem("businessId"),
101
115
  this.businessName = localStorage.getItem("bName") ?? localStorage.getItem("businessName");
102
- this.getAllServices();
103
- this.getAllLocations();
116
+ // this.getAllServices();
104
117
  // this.styles.layout.bannerImageDisplay = this.content.image.showImage;
118
+ this.getAllLocations();
105
119
  }
106
120
  get stylesLayout() {
107
121
  return { ...this.styles?.layout };
@@ -159,14 +173,47 @@ export class AppointmentFormComponent extends BaseSection {
159
173
  return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
160
174
  });
161
175
  }
176
+ changeLocation() {
177
+ this.getAllServices();
178
+ this.getAllStaff();
179
+ this.updateLocationTiming();
180
+ // console.log(this.locationTiming)
181
+ }
182
+ updateLocationTiming() {
183
+ this.locationTiming = [];
184
+ const day = this.getDay();
185
+ for (let location of this.locationData) {
186
+ if (location.id === this.selectedLocation) {
187
+ let data = location.storeTimings[day.toUpperCase()];
188
+ if (!data.dayType) {
189
+ this.snackbar.open('Opps shop is closed on selected date', 'close', { duration: 2000 });
190
+ return;
191
+ }
192
+ this.locationTiming = this.generateTimeSlots(data.startTime, data.endTime) || [];
193
+ }
194
+ }
195
+ }
196
+ getDay() {
197
+ const daysOfWeek = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
198
+ return daysOfWeek[this.CreateData.scheduledDate.getDay()];
199
+ }
162
200
  getAllServices() {
163
- this.restService.getAllServices(this.businessId, 1000, 0).subscribe((res) => {
201
+ this.selectedServices = '';
202
+ this.appointmentService.getAllService(this.businessId, 1000, 0, this.selectedLocation).subscribe((res) => {
164
203
  if (res.data.data.length > 0) {
165
- this.serviceData = res.data.data;
166
- console.log(this.serviceData);
204
+ // Filter services to only include those with status 'ACTIVE'
205
+ this.serviceData = res.data.data.filter((service) => service.status === 'ACTIVE');
206
+ if (this.serviceData.length > 0) {
207
+ console.log(this.serviceData);
208
+ }
209
+ else {
210
+ this.snackbar.open(`No active services available for this business.`, 'Close', {
211
+ duration: 1500
212
+ });
213
+ }
167
214
  }
168
215
  else {
169
- this.snackBar.open(`Service is not created yet with this business`, 'Close', {
216
+ this.snackbar.open(`Service is not created yet with this business`, 'Close', {
170
217
  duration: 1500
171
218
  });
172
219
  }
@@ -174,36 +221,191 @@ export class AppointmentFormComponent extends BaseSection {
174
221
  console.error("Error fetching services:", error); // Handle errors gracefully
175
222
  });
176
223
  }
177
- getAllLocations() {
178
- this.restService.getAllLocation(this.businessId, 1000, 0).subscribe((res) => {
224
+ getAllStaff() {
225
+ this.selectedStaff = '';
226
+ this.CreateData.scheduledTime = '';
227
+ this.getAvailableSlots();
228
+ this.appointmentService.getAllStaffByLocation(this.businessId, 1000, 0, this.selectedLocation, this.selectedServices).subscribe((res) => {
179
229
  if (res.data.data.length > 0) {
180
- this.locationData = res.data.data;
230
+ // Filter services to only include those with status 'ACTIVE'
231
+ this.staffData = res.data.data.filter((staff) => staff.status === 'ACTIVE');
232
+ if (this.staffData.length > 0) {
233
+ console.log(this.staffData);
234
+ }
235
+ else {
236
+ this.snackbar.open(`No active staff available for this business.`, 'Close', {
237
+ duration: 1500
238
+ });
239
+ }
181
240
  }
182
241
  else {
183
- this.snackBar.open(`Location is not created yet with this business`, 'Close', {
242
+ this.snackbar.open(`Staff is not created yet with this business`, 'Close', {
184
243
  duration: 1500
185
244
  });
186
245
  }
187
246
  }, (error) => {
188
- console.error("Error fetching services:", error); // Handle errors gracefully
247
+ console.error("Error fetching staff:", error); // Handle errors gracefully
189
248
  });
190
249
  }
191
- getAllStaff() {
192
- this.restService.getAllStaff(this.businessId, 1000, 0, this.selectedLocation, this.selectedServices).subscribe((res) => {
193
- this.staffList = res.data.data;
250
+ changeDate() {
251
+ this.updateLocationTiming();
252
+ this.getAvailableSlots();
253
+ }
254
+ getAvailableSlots() {
255
+ this.bookedSlots = new Set();
256
+ let payload = {
257
+ "locationId": this.selectedLocation,
258
+ "serviceId": this.selectedServices,
259
+ "staffId": this.selectedStaff,
260
+ "businessId": this.businessId,
261
+ "appointmentDate": this.CreateData.scheduledDate
262
+ };
263
+ this.appointmentService.getAvailableSlots(payload).subscribe((res) => {
264
+ // let selectedDate = moment(this.CreateData.scheduledDate).format('DD-MM-YYYY');;
265
+ // for (let staff of res.data) {
266
+ // if(!staff.bookedSlots?.[selectedDate]){
267
+ // this.bookedSlots = new Set();
268
+ // break;
269
+ // }
270
+ // if (staff?.bookedSlots?.[selectedDate]) {
271
+ // for (let apppointment of staff?.bookedSlots?.[selectedDate]) {
272
+ // const timeSlots = this.getTime(apppointment.appointmentStartTime, apppointment.appointmentEndTime, 15);
273
+ // timeSlots.splice(timeSlots.length - 1, 1);
274
+ // timeSlots?.forEach(slot => this.bookedSlots.add(slot));
275
+ // // this.bookedSlots = new Set(timeSlots);
276
+ // }
277
+ // }
278
+ // }
279
+ // console.log(this.bookedSlots)
280
+ // this.getBookedSlots(res);
281
+ this.getBookedSlots(res);
282
+ });
283
+ }
284
+ getBookedSlots(res) {
285
+ let selectedDate = moment(this.CreateData.scheduledDate).format('DD-MM-YYYY');
286
+ let slots = [];
287
+ for (let staff of res.data) {
288
+ if (!staff.bookedSlots?.[selectedDate]) {
289
+ this.bookedSlots = new Set();
290
+ return;
291
+ }
292
+ slots.push(...staff?.bookedSlots?.[selectedDate]);
293
+ }
294
+ slots.sort((a, b) => {
295
+ const dateA = new Date(a.appointmentStartTime).getTime();
296
+ const dateB = new Date(b.appointmentStartTime).getTime();
297
+ return dateA - dateB; // Ascending order
298
+ });
299
+ console.log(slots);
300
+ let startTime = new Date(slots[0].appointmentStartTime);
301
+ let endTime = new Date(slots[0].appointmentEndTime);
302
+ for (let apppointment of slots) {
303
+ let currentStartTime = new Date(apppointment.appointmentStartTime);
304
+ let currentEndTime = new Date(apppointment.appointmentEndTime);
305
+ if (currentStartTime.getTime() <= endTime.getTime()) {
306
+ startTime = currentStartTime.getTime() > startTime.getTime() ? currentStartTime : startTime;
307
+ endTime = currentEndTime.getTime() < endTime.getTime() ? currentEndTime : endTime;
308
+ }
309
+ else {
310
+ const timeSlots = this.getTime(startTime.toString(), endTime.toString(), 15);
311
+ timeSlots.splice(timeSlots.length - 1, 1);
312
+ timeSlots?.forEach(slot => this.bookedSlots.add(slot));
313
+ startTime = currentStartTime;
314
+ endTime = currentEndTime;
315
+ }
316
+ }
317
+ const timeSlots = this.getTime(startTime.toString(), endTime.toString(), 15);
318
+ timeSlots.splice(timeSlots.length - 1, 1);
319
+ timeSlots?.forEach(slot => this.bookedSlots.add(slot));
320
+ console.log(this.bookedSlots);
321
+ }
322
+ getTime(start, end, intervalMinutes) {
323
+ const startDate = new Date(start);
324
+ const endDate = new Date(end);
325
+ const slots = [];
326
+ while (startDate <= endDate) {
327
+ // Format the time as needed (e.g., "05:15 PM")
328
+ let hours = startDate.getHours();
329
+ const minutes = startDate.getMinutes();
330
+ const period = hours >= 12 ? 'PM' : 'AM';
331
+ // Convert hours to 12-hour format and pad with '0' if needed
332
+ hours = ((hours + 11) % 12) + 1;
333
+ const formattedHours = hours.toString().padStart(2, '0');
334
+ const formattedTime = `${formattedHours}:${minutes.toString().padStart(2, '0')} ${period}`;
335
+ slots.push(formattedTime);
336
+ // Increment time by the interval
337
+ startDate.setMinutes(startDate.getMinutes() + intervalMinutes);
338
+ }
339
+ return slots;
340
+ }
341
+ generateTimeSlots(startTime, endTime) {
342
+ console.log(startTime, endTime);
343
+ this.availableTimes = []; // Clear previous times
344
+ if (!startTime || !endTime) {
345
+ console.error("StartTime or EndTime is undefined:", startTime, endTime);
346
+ return;
347
+ }
348
+ const [startHour, startMinute, startPeriod] = this.parseTime(startTime);
349
+ const [endHour, endMinute, endPeriod] = this.parseTime(endTime);
350
+ let currentHour = startHour;
351
+ let currentMinute = startMinute;
352
+ let currentPeriod = startPeriod;
353
+ while (true) {
354
+ const formattedHour = this.padZero(currentHour === 0 ? 12 : currentHour);
355
+ const formattedMinute = this.padZero(currentMinute);
356
+ const timeString = `${formattedHour}:${formattedMinute} ${currentPeriod}`;
357
+ this.availableTimes.push(timeString);
358
+ // Increment time by 15 minutes
359
+ currentMinute += 15;
360
+ if (currentMinute === 60) {
361
+ currentMinute = 0;
362
+ currentHour = (currentHour % 12) + 1;
363
+ if (currentHour === 12) {
364
+ currentPeriod = currentPeriod === 'AM' ? 'PM' : 'AM';
365
+ }
366
+ }
367
+ // Stop the loop when reaching the end time
368
+ if (currentHour === endHour &&
369
+ currentMinute === endMinute &&
370
+ currentPeriod === endPeriod) {
371
+ break;
372
+ }
373
+ }
374
+ return this.availableTimes;
375
+ }
376
+ parseTime(time) {
377
+ if (!time) {
378
+ console.error("Time is undefined or null:", time);
379
+ return [0, 0, 'AM']; // Default or fallback values
380
+ }
381
+ const [timeString, period] = time.split(" ");
382
+ const [hour, minute] = timeString.split(":").map(num => parseInt(num, 10)); // Ensures parsed as numbers
383
+ return [hour % 12, minute, period];
384
+ }
385
+ getAllLocations() {
386
+ this.appointmentService.getAllLocation(this.businessId, 1000, 0).subscribe((res) => {
387
+ if (res.data.data.length > 0) {
388
+ this.locationData = res.data.data.filter((service) => service.status === 'ACTIVE');
389
+ }
390
+ else {
391
+ this.snackbar.open(`Location is not created yet with this business`, 'Close', {
392
+ duration: 1500
393
+ });
394
+ }
194
395
  }, (error) => {
195
396
  console.error("Error fetching services:", error); // Handle errors gracefully
196
397
  });
197
398
  }
198
399
  formatDate(date) {
199
400
  const year = date.getFullYear();
200
- const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based
401
+ const month = String(date.getMonth() + 1).padStart(2, '0');
201
402
  const day = String(date.getDate()).padStart(2, '0');
202
403
  return `${year}-${month}-${day}`;
203
404
  }
405
+ // Function to get time slots
204
406
  getTimeSlots() {
205
407
  this.formattedDate = this.formatDate(new Date(this.CreateData.scheduledDate));
206
- this.restService.getAllTimeSlots(this.selectedLocation, this.formattedDate).subscribe((res) => {
408
+ this.appointmentService.getAllTimeSlots(this.selectedLocation, this.formattedDate).subscribe((res) => {
207
409
  if (res) {
208
410
  this.timeSlotsData = res;
209
411
  this.formattedTimeIntervals = this.timeSlotsData.map((interval) => ({
@@ -212,103 +414,97 @@ export class AppointmentFormComponent extends BaseSection {
212
414
  this.filterTimeSlots();
213
415
  }
214
416
  else {
215
- this.snackBar.open(`Time is not created yet with this business`, 'Close', {
216
- duration: 1500
217
- });
417
+ this.snackbar.open(`Location is not created yet with this business`, 'Close', { duration: 1500 });
218
418
  }
219
419
  }, (error) => {
220
- console.error("Error fetching services:", error); // Handle errors gracefully
420
+ console.error("Error fetching services:", error);
221
421
  });
222
422
  }
423
+ // Function to filter time slots
223
424
  filterTimeSlots() {
224
425
  const now = new Date();
225
426
  const selectedDate = new Date(this.CreateData.scheduledDate);
226
427
  // Check if the selected date is today
227
428
  if (selectedDate.toDateString() === now.toDateString()) {
228
- const currentTime = now.getHours() * 60 + now.getMinutes(); // Convert current time to total minutes
429
+ const currentTime = now.getHours() * 60 + now.getMinutes();
229
430
  // Filter out the time slots that are before the current time
230
- this.formattedTimeIntervals = this.formattedTimeIntervals.filter((timeSlot) => {
231
- const [time, period] = timeSlot.startTime.split(' '); // Split time and period
232
- const [hours, minutes] = time.split(':').map(Number);
233
- const adjustedHours = (period === 'PM' && hours !== 12) ? hours + 12 : (period === 'AM' && hours === 12) ? 0 : hours; // Adjust for 24-hour format
234
- const slotTime = adjustedHours * 60 + minutes; // Convert slot time to total minutes
431
+ this.formattedTimeIntervals = this.formattedTimeIntervals.filter(timeSlot => {
432
+ const [hours, minutes] = timeSlot.startTime.split(':').map(Number);
433
+ const slotTime = hours * 60 + minutes; // Convert slot time to total minutes
235
434
  return slotTime > currentTime; // Only show slots after the current time
236
435
  });
237
436
  }
238
437
  }
239
- isFormValid() {
240
- return !this.CreateData.clientName ||
241
- !this.selectedServices ||
242
- !this.selectedLocation ||
243
- !this.CreateData.scheduledDate;
244
- }
245
438
  prepareCreateData() {
246
439
  this.CreateData.services = [];
440
+ this.CreateData.staff = [];
247
441
  this.serviceData.forEach((service) => {
248
- if (this.selectedServices === service.id) {
442
+ if (this.selectedServices.includes(service.id)) {
249
443
  this.CreateData.services.push({
250
444
  id: service.id,
251
445
  name: service.name
252
446
  });
253
447
  }
254
448
  });
449
+ this.staffData.forEach((staff) => {
450
+ if (this.selectedStaff.includes(staff.id)) {
451
+ this.CreateData.staff.push({
452
+ id: staff.id,
453
+ name: staff.name
454
+ });
455
+ }
456
+ });
255
457
  }
256
458
  prepareLocationData() {
257
- this.CreateData.locations = [];
258
459
  this.locationData.forEach((location) => {
259
460
  if (this.selectedLocation == location.id) {
260
- this.CreateData.locations.push({
261
- id: location.id,
262
- name: location.name
263
- });
461
+ this.CreateData.location.id = location.id;
462
+ this.CreateData.location.name = location.name;
264
463
  }
265
464
  });
266
465
  }
267
- prepareStaffData() {
268
- this.CreateData.staff = [];
269
- this.staffList.forEach((staff) => {
270
- if (staff.id === this.selectedStaff) {
271
- this.CreateData.staff.push({
272
- id: staff.id,
273
- name: staff.name
274
- });
275
- }
276
- });
466
+ padZero(value) {
467
+ return value < 10 ? `0${value}` : `${value}`;
277
468
  }
278
- bookAppointment() {
279
- if (!this.CreateData.mobile || this.CreateData.mobile.length != 10) {
280
- this.snackBar.open('Invalid mobile number', 'close', { duration: 2000 });
281
- return;
282
- }
469
+ isTimeGreaterThanCurrent(time, currentHour, currentMinute) {
470
+ const [hour, minute] = time.split(':').map(Number);
471
+ return (hour > currentHour) || (hour === currentHour && minute >= currentMinute);
472
+ }
473
+ createAppointment() {
283
474
  this.prepareCreateData();
284
475
  this.prepareLocationData();
285
- this.prepareStaffData();
286
476
  this.CreateData.business.id = this.businessId;
287
477
  this.CreateData.business.name = this.businessName;
288
478
  if (this.CreateData.scheduledDate) {
289
- const originalDate = new Date(this.CreateData.scheduledDate);
290
- originalDate.setDate(originalDate.getDate() + 1); // Add one day
291
- this.CreateData.scheduledDate = originalDate.toISOString().split('T')[0];
479
+ this.CreateData.scheduledDate = moment(this.CreateData.scheduledDate).format('DD-MM-YYYY');
292
480
  }
481
+ this.CreateData.scheduledTime = this.CreateData.scheduledTime.toLowerCase();
293
482
  this.createLoader = true;
294
- this.restService.createAppointment(this.CreateData).subscribe((res) => {
483
+ this.appointmentService.createAppointment(this.CreateData).subscribe((res) => {
295
484
  if (res) {
296
485
  this.createLoader = false;
297
- this.snackBar.open(`Appointment is Created`, 'Close', {
486
+ this.snackbar.open(`Appointment is Created`, 'Close', {
298
487
  duration: 1500
299
488
  });
300
- this.matDialog.closeAll();
301
489
  }
302
490
  }, (error) => {
303
491
  this.createLoader = false;
304
- this.snackBar.open(`Internal Server Error`, 'Close', {
492
+ this.snackbar.open(`Internal Server Error`, 'Close', {
305
493
  duration: 1500
306
494
  });
307
495
  console.error("Error fetching Creation:", error); // Handle errors gracefully
308
496
  });
309
497
  }
498
+ isFormValid() {
499
+ return this.CreateData.clientName !== '' &&
500
+ this.CreateData.mobile !== '' &&
501
+ this.selectedServices.length > 0 &&
502
+ this.selectedLocation !== '' &&
503
+ this.CreateData.scheduledDate !== '' &&
504
+ this.CreateData.scheduledTime !== '';
505
+ }
310
506
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: AppointmentFormComponent, deps: [{ token: i1.EventsService }, { token: i2.MatDialog }, { token: i3.RestService }, { token: i4.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
311
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: AppointmentFormComponent, isStandalone: true, selector: "simpo-appointment-form", inputs: { data: "data", index: "index", edit: "edit", delete: "delete", customClass: "customClass" }, usesInheritance: true, ngImport: i0, template: "<div [id]=\"data?.id\"\r\n [ngClass]=\"{'mergeNavbar': canMergeNavbar && index == 1, 'justify-content-between d-flex': isBorderlessImage}\"\r\n [simpoBackground]=\"styles?.background\" class=\"total-container\" style=\"overflow-x: hidden;\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n <div class=\"px-4 py-5\" [ngClass]=\"{'col-lg-6 col-xxl-6': isBorderlessImage, 'w-100 col-xxl-8': !isBorderlessImage}\"\r\n [id]=\"data?.id\" #mainContainer [simpoOverlay]=\"styles?.background\" [simpoBorder]=\"styles?.border\">\r\n <div class=\"row g-5 justify-content-start\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\"\r\n [simpoLayout]=\"styles?.layout\" [simpoPositionLayoutDirective]=\"styles?.positionLayout\"\r\n [ngClass]=\"{ 'align-items-stretch': styles?.positionLayout?.value === 'left' || styles?.positionLayout?.value === 'right', 'flex-lg-row': true }\">\r\n <div class=\"col-10 col-sm-8 col-lg-6\" *ngIf=\"content?.image?.showImage && !isBorderlessImage\"\r\n [simpoContainerAlignment]=\"stylesLayout\">\r\n <img loading=\"lazy\" [src]=\"content?.image?.url\" [simpoImageDirective]=\"styles?.image\" [id]=\"data?.id\"\r\n [simpoObjectPosition]=\"content?.image?.position\" [simpoCorner]=\"styles?.corners\"\r\n [class]=\"data?.id+(content?.image?.id || '')\" class=\"d-block w-100 insideImg\" style=\"object-fit: cover;\"\r\n [alt]=\"content?.image?.altText\" width=\"700\" height=\"500\" loading=\"lazy\" />\r\n </div>\r\n <div class=\"d-flex flex-column justify-content-start gap-15\"\r\n [ngClass]=\"{'col-lg-12': isBorderlessImage, 'col-lg-6': !isBorderlessImage}\"\r\n [simpoContainerAlignment]=\"stylesLayout\" [id]=\"data?.id\" [simpoContentAlignment]=\"styles?.contentAlignment\">\r\n <div *ngFor=\"let item of content?.inputText\">\r\n <div [innerHTML]=\"item.value | sanitizeHtml\" class=\"text-element\"\r\n [ngClass]=\"item.label === 'Heading' ? 'heading-large lh-2 mb-3' : 'body-large'\"></div>\r\n </div>\r\n <div *ngFor=\"let item of content?.listItem?.data\" class=\"carder\">\r\n <div class=\"card_wrapper\">\r\n <div class=\"container_card visible\">\r\n <div class=\"card-section\">\r\n <div class=\"second-part-card\">\r\n\r\n </div>\r\n <div class=\"first-part-card\"\r\n [ngClass]=\"item.inputText[0].label=== 'Heading' ? 'heading-large lh-2 mb-3' : 'body-large'\">\r\n <img loading=\"lazy\" class=\"tick-img\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/933997c1718790303127907598c1696063061900green_verified_image.png\"\r\n alt=\"something\" />\r\n\r\n {{ item.inputText[0].value }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"data?.action && data?.action?.display\" class=\"button-display\"\r\n [simpoContainerAlignment]=\"stylesLayout\">\r\n <div *ngFor=\"let button of data?.action?.buttons\">\r\n <app-button-element [buttonContent]=\"button.content\" [buttonStyle]=\"button.styles\" [buttonId]=\"button.id\"\r\n (click)=\"opendailogbox(dialogBox)\" [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\"></app-button-element>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div style=\" width: 100%; height: 500px;\">\r\n <img loading=\"lazy\" src=\"../../assets/divider.svg\" style=\"clip-path: polygon(0 55%, 100% 0, 100% 100%, 0% 100%); background-color: red;\">\r\n </div> -->\r\n <div [ngClass]=\"{'hover_effect': edit && false }\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isMerged]=\"styles?.merge ?? false\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n</div>\r\n<ng-template #ImageSection>\r\n <div class=\"col-10 col-sm-8 col-lg-6\"\r\n [ngStyle]=\"{'width': styles?.positionLayout?.value === 'right' ? 'fit-content' : ''}\"\r\n style=\"padding: 0px !important;\" *ngIf=\"content?.image?.showImage && isBorderlessImage;\"\r\n [simpoBorderless]=\"getPositionLayout\">\r\n <img loading=\"lazy\" [src]=\"content?.image?.url\" class=\"d-block img-fluid h-100 w-100\"\r\n [alt]=\"content?.image?.altText\" width=\"700\" height=\"500\" loading=\"lazy\" />\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- Dialog template -->\r\n<ng-template #dialogBox class=\"dialogbox\">\r\n <div class=\"appointment-form\">\r\n <div class=\"header-section\">\r\n <div class=\"header-left-side\">\r\n <h2 style=\"text-align: left;\">Book an Appointment</h2>\r\n </div>\r\n <div class=\"header-right-side\">\r\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <form>\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Name</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput placeholder=\"Enter Your Name\" pattern=\"[a-zA-Z ]*\"\r\n [(ngModel)]=\"CreateData.clientName\" (ngModelChange)=\"onUserNameChange($event)\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Mobile Number</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input type=\"text\" class=\"inputStyle\" matInput placeholder=\"Enter Your Mobile Number\"\r\n pattern=\"^[0-9]{10,15}$\" maxlength=\"15\" (focus)=\"onFocus()\" (keypress)=\"restrictNonNumeric($event)\"\r\n [(ngModel)]=\"CreateData.mobile\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Location</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Location\" [(ngModel)]=\"selectedLocation\" (ngModelChange)=\"getAllStaff()\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let location of locationData\">\r\n <mat-option [value]=\"location.id\">\r\n {{ location.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Service</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Service\" [(ngModel)]=\"selectedServices\" (ngModelChange)=\"getAllStaff()\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let service of serviceData\">\r\n <mat-option [value]=\"service.id\">\r\n {{ service.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Staff</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Staff\" [(ngModel)]=\"selectedStaff\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let staff of staffList\">\r\n <mat-option [value]=\"staff.id\">\r\n {{ staff.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Date</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput [matDatepicker]=\"picker\" placeholder=\"Select Date\"\r\n [(ngModel)]=\"CreateData.scheduledDate\" (ngModelChange)=\"getTimeSlots()\" [min]=\"minDate\"\r\n [matDatepickerFilter]=\"dateFilter\" [ngModelOptions]=\"{standalone: true}\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Time</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Location\" [(ngModel)]=\"CreateData.time\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let time of formattedTimeIntervals\">\r\n <mat-option [value]=\"time.startTime\">\r\n {{ time.startTime }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"full-message-section\">\r\n <div class=\"business-field-section\">\r\n <div class=\"input-text\">Message</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput placeholder=\"Enter Your Name\" pattern=\"[a-zA-Z ]*\"\r\n [(ngModel)]=\"CreateData.message\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bottom-section\">\r\n <div class=\"button-section\">\r\n <button class=\"booking-button\" [disabled]=\"isFormValid()\" (click)=\"bookAppointment()\">\r\n Book Appointment\r\n </button>\r\n </div>\r\n </div>\r\n\r\n\r\n </form>\r\n </div>\r\n</ng-template>\r\n", styles: [".btn-primary{border:none}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.total-container{position:relative;height:auto}.button-display{display:flex;gap:10px}.gap-15{gap:15px}.appointment-form{width:60vw;margin:auto;background-color:#fff;border-radius:8px;padding:20px;box-shadow:0 4px 8px #0000001a}h2{text-align:center;margin-bottom:20px}.form-group{display:flex;flex-direction:column;margin-bottom:15px;width:100%}label{font-weight:700;margin-bottom:5px}input,select,textarea{padding:8px;border:1px solid #ccc;border-radius:4px;font-size:14px}input::placeholder,textarea::placeholder{color:#888}.name-mobile,.date-time{display:flex;justify-content:space-between}textarea{resize:vertical}.book-btn{width:100%;background-color:#007bff;color:#fff;border:none;padding:10px;border-radius:4px;font-size:16px;cursor:pointer}.book-btn:hover{background-color:#0056b3}@media only screen and (max-width: 475px){.col-10{width:100%;max-width:100%;flex-basis:100%;height:32vh;padding-right:13px;padding-left:13px}.total-container{flex-direction:column}.insideImg{height:100%!important}}.text-element{inline-size:100%;overflow-wrap:break-word}.mergeNavbar{margin-top:-75px;padding-top:75px}.container_card .card-section{align-items:center;gap:20px;padding-top:5px;padding-bottom:5px;width:100%;border-radius:10px;opacity:0;transform:translateY(150px);transition:2s all ease}.card_wrapper{display:flex;flex-direction:column;gap:20px}.visible{visibility:visible!important}.visible .card-section{opacity:1;transform:translateY(0)}.first-part-card{min-width:fit-content}.first-part-card .body-large{font-size:1.1rem;font-weight:700}.second-part-card{width:2px;height:2px;border-radius:50%;display:flex;justify-content:center;align-items:center}.third-part-card .heading-large{font-size:1.1rem;font-weight:700}.third-part-card .body-large{font-size:12px;font-weight:400;line-height:15px}.tick-img{width:25px;height:25px;border-radius:50%}.third-part-card{display:flex;flex-direction:column;gap:10px}.sfull-width{width:49%;height:75px}.input-text{margin-bottom:5px}.full-width{width:100%}.bottom-section{width:100%;display:flex;justify-content:right}.button-section{width:30%}.booking-button{background:#0496ff;color:#fff;border:1px solid#0496FF;border-radius:10px;padding:7px 5px}.header-section{display:flex;width:100%;justify-content:space-between}.header-left-side{width:50%}.header-right-side{width:5%;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: SimpoElementsModule }, { kind: "component", type: i6.SimpoButtonComponent, selector: "app-button-element", inputs: ["buttonContent", "buttonStyle", "buttonId", "color", "sectionId"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i7.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i8.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "ngmodule", type: MatGridListModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i9.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i13.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i13.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i13.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type:
507
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: AppointmentFormComponent, isStandalone: true, selector: "simpo-appointment-form", inputs: { data: "data", index: "index", edit: "edit", delete: "delete", customClass: "customClass" }, usesInheritance: true, ngImport: i0, template: "<div [id]=\"data?.id\"\r\n [ngClass]=\"{'mergeNavbar': canMergeNavbar && index == 1, 'justify-content-between d-flex': isBorderlessImage}\"\r\n [simpoBackground]=\"styles?.background\" class=\"total-container\" style=\"overflow-x: hidden;\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n <div class=\"px-4 py-5\" [ngClass]=\"{'col-lg-6 col-xxl-6': isBorderlessImage, 'w-100 col-xxl-8': !isBorderlessImage}\"\r\n [id]=\"data?.id\" #mainContainer [simpoOverlay]=\"styles?.background\" [simpoBorder]=\"styles?.border\">\r\n <div class=\"row g-5 justify-content-start\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\"\r\n [simpoLayout]=\"styles?.layout\" [simpoPositionLayoutDirective]=\"styles?.positionLayout\"\r\n [ngClass]=\"{ 'align-items-stretch': styles?.positionLayout?.value === 'left' || styles?.positionLayout?.value === 'right', 'flex-lg-row': true }\">\r\n <div class=\"col-10 col-sm-8 col-lg-6\" *ngIf=\"content?.image?.showImage && !isBorderlessImage\"\r\n [simpoContainerAlignment]=\"stylesLayout\">\r\n <img loading=\"lazy\" [src]=\"content?.image?.url\" [simpoImageDirective]=\"styles?.image\" [id]=\"data?.id\"\r\n [simpoObjectPosition]=\"content?.image?.position\" [simpoCorner]=\"styles?.corners\"\r\n [class]=\"data?.id+(content?.image?.id || '')\" class=\"d-block w-100 insideImg\" style=\"object-fit: cover;\"\r\n [alt]=\"content?.image?.altText\" width=\"700\" height=\"500\" loading=\"lazy\" />\r\n </div>\r\n <div class=\"d-flex flex-column justify-content-start gap-15\"\r\n [ngClass]=\"{'col-lg-12': isBorderlessImage, 'col-lg-6': !isBorderlessImage}\"\r\n [simpoContainerAlignment]=\"stylesLayout\" [id]=\"data?.id\" [simpoContentAlignment]=\"styles?.contentAlignment\">\r\n <div *ngFor=\"let item of content?.inputText\">\r\n <div [innerHTML]=\"item.value | sanitizeHtml\" class=\"text-element\"\r\n [ngClass]=\"item.label === 'Heading' ? 'heading-large lh-2 mb-3' : 'body-large'\"></div>\r\n </div>\r\n <div *ngFor=\"let item of content?.listItem?.data\" class=\"carder\">\r\n <div class=\"card_wrapper\">\r\n <div class=\"container_card visible\">\r\n <div class=\"card-section\">\r\n <div class=\"second-part-card\">\r\n\r\n </div>\r\n <div class=\"first-part-card\"\r\n [ngClass]=\"item.inputText[0].label=== 'Heading' ? 'heading-large lh-2 mb-3' : 'body-large'\">\r\n <img loading=\"lazy\" class=\"tick-img\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/933997c1718790303127907598c1696063061900green_verified_image.png\"\r\n alt=\"something\" />\r\n\r\n {{ item.inputText[0].value }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"data?.action && data?.action?.display\" class=\"button-display\"\r\n [simpoContainerAlignment]=\"stylesLayout\">\r\n <div *ngFor=\"let button of data?.action?.buttons\">\r\n <app-button-element [buttonContent]=\"button.content\" [buttonStyle]=\"button.styles\" [buttonId]=\"button.id\"\r\n (click)=\"opendailogbox(dialogBox)\" [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\"></app-button-element>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div style=\" width: 100%; height: 500px;\">\r\n <img loading=\"lazy\" src=\"../../assets/divider.svg\" style=\"clip-path: polygon(0 55%, 100% 0, 100% 100%, 0% 100%); background-color: red;\">\r\n </div> -->\r\n <div [ngClass]=\"{'hover_effect': edit && false }\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isMerged]=\"styles?.merge ?? false\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n</div>\r\n<ng-template #ImageSection>\r\n <div class=\"col-10 col-sm-8 col-lg-6\"\r\n [ngStyle]=\"{'width': styles?.positionLayout?.value === 'right' ? 'fit-content' : ''}\"\r\n style=\"padding: 0px !important;\" *ngIf=\"content?.image?.showImage && isBorderlessImage;\"\r\n [simpoBorderless]=\"getPositionLayout\">\r\n <img loading=\"lazy\" [src]=\"content?.image?.url\" class=\"d-block img-fluid h-100 w-100\"\r\n [alt]=\"content?.image?.altText\" width=\"700\" height=\"500\" loading=\"lazy\" />\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- Dialog template -->\r\n<ng-template #dialogBox class=\"dialogbox\">\r\n <div class=\"appointment-form\">\r\n <div class=\"header-section\">\r\n <div class=\"header-left-side\">\r\n <h2 style=\"text-align: left;\">Book an Appointment</h2>\r\n </div>\r\n <div class=\"header-right-side\">\r\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <form>\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Name</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput placeholder=\"Enter Your Name\" pattern=\"[a-zA-Z ]*\"\r\n [(ngModel)]=\"CreateData.clientName\" (ngModelChange)=\"onUserNameChange($event)\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Mobile Number</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input type=\"text\" class=\"inputStyle\" matInput placeholder=\"Enter Your Mobile Number\"\r\n pattern=\"^[0-9]{10,15}$\" maxlength=\"15\" (focus)=\"onFocus()\" (keypress)=\"restrictNonNumeric($event)\"\r\n [(ngModel)]=\"CreateData.mobile\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Location</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Location\" [(ngModel)]=\"selectedLocation\" (ngModelChange)=\"changeLocation()\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let location of locationData\">\r\n <mat-option [value]=\"location.id\">\r\n {{ location.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Service</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Service\" [(ngModel)]=\"selectedServices\" (ngModelChange)=\"getAllStaff()\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let service of serviceData\">\r\n <mat-option [value]=\"service.id\">\r\n {{ service.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Staff</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Staff\" [(ngModel)]=\"selectedStaff\" (ngModelChange)=\"getAvailableSlots()\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let staff of staffData\">\r\n <mat-option [value]=\"staff.id\">\r\n {{ staff.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Date</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput [matDatepicker]=\"picker\" placeholder=\"Select Date\"\r\n [(ngModel)]=\"CreateData.scheduledDate\" (ngModelChange)=\"changeDate()\" [min]=\"minDate\"\r\n [matDatepickerFilter]=\"dateFilter\" [ngModelOptions]=\"{standalone: true}\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Time</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Location\" [(ngModel)]=\"CreateData.scheduledTime\" [ngModelOptions]=\"{standalone: true}\">\r\n <mat-option *ngFor=\"let time of locationTiming\" [value]=\"time\" [disabled]=\"bookedSlots.has(time)\">\r\n {{ time }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"full-message-section\">\r\n <div class=\"business-field-section\">\r\n <div class=\"input-text\">Message</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput placeholder=\"Enter Your Name\" pattern=\"[a-zA-Z ]*\"\r\n [(ngModel)]=\"CreateData.message\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bottom-section\">\r\n <div class=\"button-section\">\r\n <button class=\"booking-button\" [disabled]=\"isFormValid()\" (click)=\"createAppointment()\">\r\n Book Appointment\r\n </button>\r\n </div>\r\n </div>\r\n\r\n\r\n </form>\r\n </div>\r\n</ng-template>\r\n", styles: [".btn-primary{border:none}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.total-container{position:relative;height:auto}.button-display{display:flex;gap:10px}.gap-15{gap:15px}.appointment-form{width:60vw;margin:auto;background-color:#fff;border-radius:8px;padding:20px;box-shadow:0 4px 8px #0000001a}h2{text-align:center;margin-bottom:20px}.form-group{display:flex;flex-direction:column;margin-bottom:15px;width:100%}label{font-weight:700;margin-bottom:5px}input,select,textarea{padding:8px;border:1px solid #ccc;border-radius:4px;font-size:14px}input::placeholder,textarea::placeholder{color:#888}.name-mobile,.date-time{display:flex;justify-content:space-between}textarea{resize:vertical}.book-btn{width:100%;background-color:#007bff;color:#fff;border:none;padding:10px;border-radius:4px;font-size:16px;cursor:pointer}.book-btn:hover{background-color:#0056b3}@media only screen and (max-width: 475px){.col-10{width:100%;max-width:100%;flex-basis:100%;height:32vh;padding-right:13px;padding-left:13px}.total-container{flex-direction:column}.insideImg{height:100%!important}}.text-element{inline-size:100%;overflow-wrap:break-word}.mergeNavbar{margin-top:-75px;padding-top:75px}.container_card .card-section{align-items:center;gap:20px;padding-top:5px;padding-bottom:5px;width:100%;border-radius:10px;opacity:0;transform:translateY(150px);transition:2s all ease}.card_wrapper{display:flex;flex-direction:column;gap:20px}.visible{visibility:visible!important}.visible .card-section{opacity:1;transform:translateY(0)}.first-part-card{min-width:fit-content}.first-part-card .body-large{font-size:1.1rem;font-weight:700}.second-part-card{width:2px;height:2px;border-radius:50%;display:flex;justify-content:center;align-items:center}.third-part-card .heading-large{font-size:1.1rem;font-weight:700}.third-part-card .body-large{font-size:12px;font-weight:400;line-height:15px}.tick-img{width:25px;height:25px;border-radius:50%}.third-part-card{display:flex;flex-direction:column;gap:10px}.sfull-width{width:49%;height:75px}.input-text{margin-bottom:5px}.full-width{width:100%}.bottom-section{width:100%;display:flex;justify-content:right}.button-section{width:30%}.booking-button{background:#0496ff;color:#fff;border:1px solid#0496FF;border-radius:10px;padding:7px 5px}.header-section{display:flex;width:100%;justify-content:space-between}.header-left-side{width:50%}.header-right-side{width:5%;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: SimpoElementsModule }, { kind: "component", type: i6.SimpoButtonComponent, selector: "app-button-element", inputs: ["buttonContent", "buttonStyle", "buttonId", "color", "sectionId"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i7.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i8.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "ngmodule", type: MatGridListModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i9.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i13.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i13.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i13.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type:
312
508
  //directive
313
509
  SimpoBorderlessDirective, selector: "[simpoBorderless]", inputs: ["simpoBorderless"] }, { kind: "directive", type: SimpoContainerAligment, selector: "[simpoContainerAlignment]", inputs: ["simpoContainerAlignment"] }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: BorderDirective, selector: "[simpoBorder]", inputs: ["simpoBorder"] }, { kind: "directive", type: simpoConetenAlignmentDirective, selector: "[simpoContentAlignment]", inputs: ["simpoContentAlignment"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: CornerDirective, selector: "[simpoCorner]", inputs: ["simpoCorner"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "directive", type: ImageDirectiveDirective, selector: "[simpoImageDirective]", inputs: ["simpoImageDirective"] }, { kind: "directive", type: OverlayDirective, selector: "[simpoOverlay]", inputs: ["simpoOverlay"] }, { kind: "directive", type: PositionLayoutDirectiveDirective, selector: "[simpoPositionLayoutDirective]", inputs: ["simpoPositionLayoutDirective"] }, { kind: "directive", type: ObjectPositionDirective, selector: "[simpoObjectPosition]", inputs: ["simpoObjectPosition"] }, { kind: "pipe", type: SanitizeHtmlPipe, name: "sanitizeHtml" }] }); }
314
510
  }
@@ -353,7 +549,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImpor
353
549
  ColorDirective,
354
550
  TextSizeDirective,
355
551
  SanitizeHtmlPipe
356
- ], template: "<div [id]=\"data?.id\"\r\n [ngClass]=\"{'mergeNavbar': canMergeNavbar && index == 1, 'justify-content-between d-flex': isBorderlessImage}\"\r\n [simpoBackground]=\"styles?.background\" class=\"total-container\" style=\"overflow-x: hidden;\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n <div class=\"px-4 py-5\" [ngClass]=\"{'col-lg-6 col-xxl-6': isBorderlessImage, 'w-100 col-xxl-8': !isBorderlessImage}\"\r\n [id]=\"data?.id\" #mainContainer [simpoOverlay]=\"styles?.background\" [simpoBorder]=\"styles?.border\">\r\n <div class=\"row g-5 justify-content-start\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\"\r\n [simpoLayout]=\"styles?.layout\" [simpoPositionLayoutDirective]=\"styles?.positionLayout\"\r\n [ngClass]=\"{ 'align-items-stretch': styles?.positionLayout?.value === 'left' || styles?.positionLayout?.value === 'right', 'flex-lg-row': true }\">\r\n <div class=\"col-10 col-sm-8 col-lg-6\" *ngIf=\"content?.image?.showImage && !isBorderlessImage\"\r\n [simpoContainerAlignment]=\"stylesLayout\">\r\n <img loading=\"lazy\" [src]=\"content?.image?.url\" [simpoImageDirective]=\"styles?.image\" [id]=\"data?.id\"\r\n [simpoObjectPosition]=\"content?.image?.position\" [simpoCorner]=\"styles?.corners\"\r\n [class]=\"data?.id+(content?.image?.id || '')\" class=\"d-block w-100 insideImg\" style=\"object-fit: cover;\"\r\n [alt]=\"content?.image?.altText\" width=\"700\" height=\"500\" loading=\"lazy\" />\r\n </div>\r\n <div class=\"d-flex flex-column justify-content-start gap-15\"\r\n [ngClass]=\"{'col-lg-12': isBorderlessImage, 'col-lg-6': !isBorderlessImage}\"\r\n [simpoContainerAlignment]=\"stylesLayout\" [id]=\"data?.id\" [simpoContentAlignment]=\"styles?.contentAlignment\">\r\n <div *ngFor=\"let item of content?.inputText\">\r\n <div [innerHTML]=\"item.value | sanitizeHtml\" class=\"text-element\"\r\n [ngClass]=\"item.label === 'Heading' ? 'heading-large lh-2 mb-3' : 'body-large'\"></div>\r\n </div>\r\n <div *ngFor=\"let item of content?.listItem?.data\" class=\"carder\">\r\n <div class=\"card_wrapper\">\r\n <div class=\"container_card visible\">\r\n <div class=\"card-section\">\r\n <div class=\"second-part-card\">\r\n\r\n </div>\r\n <div class=\"first-part-card\"\r\n [ngClass]=\"item.inputText[0].label=== 'Heading' ? 'heading-large lh-2 mb-3' : 'body-large'\">\r\n <img loading=\"lazy\" class=\"tick-img\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/933997c1718790303127907598c1696063061900green_verified_image.png\"\r\n alt=\"something\" />\r\n\r\n {{ item.inputText[0].value }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"data?.action && data?.action?.display\" class=\"button-display\"\r\n [simpoContainerAlignment]=\"stylesLayout\">\r\n <div *ngFor=\"let button of data?.action?.buttons\">\r\n <app-button-element [buttonContent]=\"button.content\" [buttonStyle]=\"button.styles\" [buttonId]=\"button.id\"\r\n (click)=\"opendailogbox(dialogBox)\" [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\"></app-button-element>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div style=\" width: 100%; height: 500px;\">\r\n <img loading=\"lazy\" src=\"../../assets/divider.svg\" style=\"clip-path: polygon(0 55%, 100% 0, 100% 100%, 0% 100%); background-color: red;\">\r\n </div> -->\r\n <div [ngClass]=\"{'hover_effect': edit && false }\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isMerged]=\"styles?.merge ?? false\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n</div>\r\n<ng-template #ImageSection>\r\n <div class=\"col-10 col-sm-8 col-lg-6\"\r\n [ngStyle]=\"{'width': styles?.positionLayout?.value === 'right' ? 'fit-content' : ''}\"\r\n style=\"padding: 0px !important;\" *ngIf=\"content?.image?.showImage && isBorderlessImage;\"\r\n [simpoBorderless]=\"getPositionLayout\">\r\n <img loading=\"lazy\" [src]=\"content?.image?.url\" class=\"d-block img-fluid h-100 w-100\"\r\n [alt]=\"content?.image?.altText\" width=\"700\" height=\"500\" loading=\"lazy\" />\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- Dialog template -->\r\n<ng-template #dialogBox class=\"dialogbox\">\r\n <div class=\"appointment-form\">\r\n <div class=\"header-section\">\r\n <div class=\"header-left-side\">\r\n <h2 style=\"text-align: left;\">Book an Appointment</h2>\r\n </div>\r\n <div class=\"header-right-side\">\r\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <form>\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Name</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput placeholder=\"Enter Your Name\" pattern=\"[a-zA-Z ]*\"\r\n [(ngModel)]=\"CreateData.clientName\" (ngModelChange)=\"onUserNameChange($event)\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Mobile Number</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input type=\"text\" class=\"inputStyle\" matInput placeholder=\"Enter Your Mobile Number\"\r\n pattern=\"^[0-9]{10,15}$\" maxlength=\"15\" (focus)=\"onFocus()\" (keypress)=\"restrictNonNumeric($event)\"\r\n [(ngModel)]=\"CreateData.mobile\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Location</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Location\" [(ngModel)]=\"selectedLocation\" (ngModelChange)=\"getAllStaff()\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let location of locationData\">\r\n <mat-option [value]=\"location.id\">\r\n {{ location.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Service</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Service\" [(ngModel)]=\"selectedServices\" (ngModelChange)=\"getAllStaff()\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let service of serviceData\">\r\n <mat-option [value]=\"service.id\">\r\n {{ service.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Staff</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Staff\" [(ngModel)]=\"selectedStaff\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let staff of staffList\">\r\n <mat-option [value]=\"staff.id\">\r\n {{ staff.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Date</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput [matDatepicker]=\"picker\" placeholder=\"Select Date\"\r\n [(ngModel)]=\"CreateData.scheduledDate\" (ngModelChange)=\"getTimeSlots()\" [min]=\"minDate\"\r\n [matDatepickerFilter]=\"dateFilter\" [ngModelOptions]=\"{standalone: true}\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Time</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Location\" [(ngModel)]=\"CreateData.time\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let time of formattedTimeIntervals\">\r\n <mat-option [value]=\"time.startTime\">\r\n {{ time.startTime }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"full-message-section\">\r\n <div class=\"business-field-section\">\r\n <div class=\"input-text\">Message</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput placeholder=\"Enter Your Name\" pattern=\"[a-zA-Z ]*\"\r\n [(ngModel)]=\"CreateData.message\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bottom-section\">\r\n <div class=\"button-section\">\r\n <button class=\"booking-button\" [disabled]=\"isFormValid()\" (click)=\"bookAppointment()\">\r\n Book Appointment\r\n </button>\r\n </div>\r\n </div>\r\n\r\n\r\n </form>\r\n </div>\r\n</ng-template>\r\n", styles: [".btn-primary{border:none}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.total-container{position:relative;height:auto}.button-display{display:flex;gap:10px}.gap-15{gap:15px}.appointment-form{width:60vw;margin:auto;background-color:#fff;border-radius:8px;padding:20px;box-shadow:0 4px 8px #0000001a}h2{text-align:center;margin-bottom:20px}.form-group{display:flex;flex-direction:column;margin-bottom:15px;width:100%}label{font-weight:700;margin-bottom:5px}input,select,textarea{padding:8px;border:1px solid #ccc;border-radius:4px;font-size:14px}input::placeholder,textarea::placeholder{color:#888}.name-mobile,.date-time{display:flex;justify-content:space-between}textarea{resize:vertical}.book-btn{width:100%;background-color:#007bff;color:#fff;border:none;padding:10px;border-radius:4px;font-size:16px;cursor:pointer}.book-btn:hover{background-color:#0056b3}@media only screen and (max-width: 475px){.col-10{width:100%;max-width:100%;flex-basis:100%;height:32vh;padding-right:13px;padding-left:13px}.total-container{flex-direction:column}.insideImg{height:100%!important}}.text-element{inline-size:100%;overflow-wrap:break-word}.mergeNavbar{margin-top:-75px;padding-top:75px}.container_card .card-section{align-items:center;gap:20px;padding-top:5px;padding-bottom:5px;width:100%;border-radius:10px;opacity:0;transform:translateY(150px);transition:2s all ease}.card_wrapper{display:flex;flex-direction:column;gap:20px}.visible{visibility:visible!important}.visible .card-section{opacity:1;transform:translateY(0)}.first-part-card{min-width:fit-content}.first-part-card .body-large{font-size:1.1rem;font-weight:700}.second-part-card{width:2px;height:2px;border-radius:50%;display:flex;justify-content:center;align-items:center}.third-part-card .heading-large{font-size:1.1rem;font-weight:700}.third-part-card .body-large{font-size:12px;font-weight:400;line-height:15px}.tick-img{width:25px;height:25px;border-radius:50%}.third-part-card{display:flex;flex-direction:column;gap:10px}.sfull-width{width:49%;height:75px}.input-text{margin-bottom:5px}.full-width{width:100%}.bottom-section{width:100%;display:flex;justify-content:right}.button-section{width:30%}.booking-button{background:#0496ff;color:#fff;border:1px solid#0496FF;border-radius:10px;padding:7px 5px}.header-section{display:flex;width:100%;justify-content:space-between}.header-left-side{width:50%}.header-right-side{width:5%;cursor:pointer}\n"] }]
552
+ ], template: "<div [id]=\"data?.id\"\r\n [ngClass]=\"{'mergeNavbar': canMergeNavbar && index == 1, 'justify-content-between d-flex': isBorderlessImage}\"\r\n [simpoBackground]=\"styles?.background\" class=\"total-container\" style=\"overflow-x: hidden;\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n <div class=\"px-4 py-5\" [ngClass]=\"{'col-lg-6 col-xxl-6': isBorderlessImage, 'w-100 col-xxl-8': !isBorderlessImage}\"\r\n [id]=\"data?.id\" #mainContainer [simpoOverlay]=\"styles?.background\" [simpoBorder]=\"styles?.border\">\r\n <div class=\"row g-5 justify-content-start\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\"\r\n [simpoLayout]=\"styles?.layout\" [simpoPositionLayoutDirective]=\"styles?.positionLayout\"\r\n [ngClass]=\"{ 'align-items-stretch': styles?.positionLayout?.value === 'left' || styles?.positionLayout?.value === 'right', 'flex-lg-row': true }\">\r\n <div class=\"col-10 col-sm-8 col-lg-6\" *ngIf=\"content?.image?.showImage && !isBorderlessImage\"\r\n [simpoContainerAlignment]=\"stylesLayout\">\r\n <img loading=\"lazy\" [src]=\"content?.image?.url\" [simpoImageDirective]=\"styles?.image\" [id]=\"data?.id\"\r\n [simpoObjectPosition]=\"content?.image?.position\" [simpoCorner]=\"styles?.corners\"\r\n [class]=\"data?.id+(content?.image?.id || '')\" class=\"d-block w-100 insideImg\" style=\"object-fit: cover;\"\r\n [alt]=\"content?.image?.altText\" width=\"700\" height=\"500\" loading=\"lazy\" />\r\n </div>\r\n <div class=\"d-flex flex-column justify-content-start gap-15\"\r\n [ngClass]=\"{'col-lg-12': isBorderlessImage, 'col-lg-6': !isBorderlessImage}\"\r\n [simpoContainerAlignment]=\"stylesLayout\" [id]=\"data?.id\" [simpoContentAlignment]=\"styles?.contentAlignment\">\r\n <div *ngFor=\"let item of content?.inputText\">\r\n <div [innerHTML]=\"item.value | sanitizeHtml\" class=\"text-element\"\r\n [ngClass]=\"item.label === 'Heading' ? 'heading-large lh-2 mb-3' : 'body-large'\"></div>\r\n </div>\r\n <div *ngFor=\"let item of content?.listItem?.data\" class=\"carder\">\r\n <div class=\"card_wrapper\">\r\n <div class=\"container_card visible\">\r\n <div class=\"card-section\">\r\n <div class=\"second-part-card\">\r\n\r\n </div>\r\n <div class=\"first-part-card\"\r\n [ngClass]=\"item.inputText[0].label=== 'Heading' ? 'heading-large lh-2 mb-3' : 'body-large'\">\r\n <img loading=\"lazy\" class=\"tick-img\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/933997c1718790303127907598c1696063061900green_verified_image.png\"\r\n alt=\"something\" />\r\n\r\n {{ item.inputText[0].value }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"data?.action && data?.action?.display\" class=\"button-display\"\r\n [simpoContainerAlignment]=\"stylesLayout\">\r\n <div *ngFor=\"let button of data?.action?.buttons\">\r\n <app-button-element [buttonContent]=\"button.content\" [buttonStyle]=\"button.styles\" [buttonId]=\"button.id\"\r\n (click)=\"opendailogbox(dialogBox)\" [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\"></app-button-element>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div style=\" width: 100%; height: 500px;\">\r\n <img loading=\"lazy\" src=\"../../assets/divider.svg\" style=\"clip-path: polygon(0 55%, 100% 0, 100% 100%, 0% 100%); background-color: red;\">\r\n </div> -->\r\n <div [ngClass]=\"{'hover_effect': edit && false }\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isMerged]=\"styles?.merge ?? false\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n</div>\r\n<ng-template #ImageSection>\r\n <div class=\"col-10 col-sm-8 col-lg-6\"\r\n [ngStyle]=\"{'width': styles?.positionLayout?.value === 'right' ? 'fit-content' : ''}\"\r\n style=\"padding: 0px !important;\" *ngIf=\"content?.image?.showImage && isBorderlessImage;\"\r\n [simpoBorderless]=\"getPositionLayout\">\r\n <img loading=\"lazy\" [src]=\"content?.image?.url\" class=\"d-block img-fluid h-100 w-100\"\r\n [alt]=\"content?.image?.altText\" width=\"700\" height=\"500\" loading=\"lazy\" />\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- Dialog template -->\r\n<ng-template #dialogBox class=\"dialogbox\">\r\n <div class=\"appointment-form\">\r\n <div class=\"header-section\">\r\n <div class=\"header-left-side\">\r\n <h2 style=\"text-align: left;\">Book an Appointment</h2>\r\n </div>\r\n <div class=\"header-right-side\">\r\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <form>\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Name</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput placeholder=\"Enter Your Name\" pattern=\"[a-zA-Z ]*\"\r\n [(ngModel)]=\"CreateData.clientName\" (ngModelChange)=\"onUserNameChange($event)\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Mobile Number</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input type=\"text\" class=\"inputStyle\" matInput placeholder=\"Enter Your Mobile Number\"\r\n pattern=\"^[0-9]{10,15}$\" maxlength=\"15\" (focus)=\"onFocus()\" (keypress)=\"restrictNonNumeric($event)\"\r\n [(ngModel)]=\"CreateData.mobile\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Location</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Location\" [(ngModel)]=\"selectedLocation\" (ngModelChange)=\"changeLocation()\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let location of locationData\">\r\n <mat-option [value]=\"location.id\">\r\n {{ location.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Service</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Service\" [(ngModel)]=\"selectedServices\" (ngModelChange)=\"getAllStaff()\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let service of serviceData\">\r\n <mat-option [value]=\"service.id\">\r\n {{ service.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Staff</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Staff\" [(ngModel)]=\"selectedStaff\" (ngModelChange)=\"getAvailableSlots()\" [ngModelOptions]=\"{standalone: true}\">\r\n <ng-container *ngFor=\"let staff of staffData\">\r\n <mat-option [value]=\"staff.id\">\r\n {{ staff.name }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"name-mobile\">\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Date</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput [matDatepicker]=\"picker\" placeholder=\"Select Date\"\r\n [(ngModel)]=\"CreateData.scheduledDate\" (ngModelChange)=\"changeDate()\" [min]=\"minDate\"\r\n [matDatepickerFilter]=\"dateFilter\" [ngModelOptions]=\"{standalone: true}\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"sfull-width\">\r\n <div class=\"input-text\">Time</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"Select Location\" [(ngModel)]=\"CreateData.scheduledTime\" [ngModelOptions]=\"{standalone: true}\">\r\n <mat-option *ngFor=\"let time of locationTiming\" [value]=\"time\" [disabled]=\"bookedSlots.has(time)\">\r\n {{ time }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"full-message-section\">\r\n <div class=\"business-field-section\">\r\n <div class=\"input-text\">Message</div>\r\n <mat-form-field class=\"full-width\" appearance=\"outline\">\r\n <input class=\"inputStyle\" matInput placeholder=\"Enter Your Name\" pattern=\"[a-zA-Z ]*\"\r\n [(ngModel)]=\"CreateData.message\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bottom-section\">\r\n <div class=\"button-section\">\r\n <button class=\"booking-button\" [disabled]=\"isFormValid()\" (click)=\"createAppointment()\">\r\n Book Appointment\r\n </button>\r\n </div>\r\n </div>\r\n\r\n\r\n </form>\r\n </div>\r\n</ng-template>\r\n", styles: [".btn-primary{border:none}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.total-container{position:relative;height:auto}.button-display{display:flex;gap:10px}.gap-15{gap:15px}.appointment-form{width:60vw;margin:auto;background-color:#fff;border-radius:8px;padding:20px;box-shadow:0 4px 8px #0000001a}h2{text-align:center;margin-bottom:20px}.form-group{display:flex;flex-direction:column;margin-bottom:15px;width:100%}label{font-weight:700;margin-bottom:5px}input,select,textarea{padding:8px;border:1px solid #ccc;border-radius:4px;font-size:14px}input::placeholder,textarea::placeholder{color:#888}.name-mobile,.date-time{display:flex;justify-content:space-between}textarea{resize:vertical}.book-btn{width:100%;background-color:#007bff;color:#fff;border:none;padding:10px;border-radius:4px;font-size:16px;cursor:pointer}.book-btn:hover{background-color:#0056b3}@media only screen and (max-width: 475px){.col-10{width:100%;max-width:100%;flex-basis:100%;height:32vh;padding-right:13px;padding-left:13px}.total-container{flex-direction:column}.insideImg{height:100%!important}}.text-element{inline-size:100%;overflow-wrap:break-word}.mergeNavbar{margin-top:-75px;padding-top:75px}.container_card .card-section{align-items:center;gap:20px;padding-top:5px;padding-bottom:5px;width:100%;border-radius:10px;opacity:0;transform:translateY(150px);transition:2s all ease}.card_wrapper{display:flex;flex-direction:column;gap:20px}.visible{visibility:visible!important}.visible .card-section{opacity:1;transform:translateY(0)}.first-part-card{min-width:fit-content}.first-part-card .body-large{font-size:1.1rem;font-weight:700}.second-part-card{width:2px;height:2px;border-radius:50%;display:flex;justify-content:center;align-items:center}.third-part-card .heading-large{font-size:1.1rem;font-weight:700}.third-part-card .body-large{font-size:12px;font-weight:400;line-height:15px}.tick-img{width:25px;height:25px;border-radius:50%}.third-part-card{display:flex;flex-direction:column;gap:10px}.sfull-width{width:49%;height:75px}.input-text{margin-bottom:5px}.full-width{width:100%}.bottom-section{width:100%;display:flex;justify-content:right}.button-section{width:30%}.booking-button{background:#0496ff;color:#fff;border:1px solid#0496FF;border-radius:10px;padding:7px 5px}.header-section{display:flex;width:100%;justify-content:space-between}.header-left-side{width:50%}.header-right-side{width:5%;cursor:pointer}\n"] }]
357
553
  }], ctorParameters: () => [{ type: i1.EventsService }, { type: i2.MatDialog }, { type: i3.RestService }, { type: i4.MatSnackBar }], propDecorators: { data: [{
358
554
  type: Input
359
555
  }], index: [{
@@ -365,4 +561,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImpor
365
561
  }], customClass: [{
366
562
  type: Input
367
563
  }] } });
368
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwb2ludG1lbnQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL3NlY3Rpb25zL2FwcG9pbnRtZW50LWZvcm0vYXBwb2ludG1lbnQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL3NlY3Rpb25zL2FwcG9pbnRtZW50LWZvcm0vYXBwb2ludG1lbnQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBaUQsTUFBTSxlQUFlLENBQUM7QUFFNUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0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d0JBQ25CLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixtQkFBbUI7d0JBQ25CLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLGFBQWE7d0JBR2IsV0FBVzt3QkFDWCx3QkFBd0I7d0JBQ3hCLHNCQUFzQjt3QkFDdEIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLHlCQUF5Qjt3QkFDekIsZUFBZTt3QkFDZix3QkFBd0I7d0JBQ3hCLHdCQUF3Qjt3QkFDeEIscUJBQXFCO3dCQUNyQiw4QkFBOEI7d0JBQzlCLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZiwwQkFBMEI7d0JBQzFCLGNBQWM7d0JBQ2QsdUJBQXVCO3dCQUN2QixnQkFBZ0I7d0JBQ2hCLGdDQUFnQzt3QkFDaEMsZ0NBQWdDO3dCQUNoQyx1QkFBdUI7d0JBQ3ZCLGNBQWM7d0JBQ2QsaUJBQWlCO3dCQUNqQixnQkFBZ0I7cUJBQ2pCOzhKQU1RLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJhbm5lclN0eWxlc01vZGVsLCBMYXlPdXRNb2RlbCwgUG9zaXRpb25MYXlvdXRNb2RhbCB9IGZyb20gJy4uLy4uL3N0eWxlcy9zdHlsZS5tb2RlbCc7XHJcbmltcG9ydCB7IFNpbXBvRWxlbWVudHNNb2R1bGUgfSBmcm9tICcuLy4uLy4uL2VsZW1lbnRzL2luZGV4JztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgU2ltcG9Db21wb25lbnRNb2R1bGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2luZGV4JztcclxuaW1wb3J0IHsgTWF0R3JpZExpc3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9ncmlkLWxpc3QnO1xyXG5pbXBvcnQgeyBTaW1wb0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL3NpbXBvLWJ1dHRvbi9zaW1wby1idXR0b24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQW5pbWF0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL2FuaW1hdGlvbi1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBCYWNrZ3JvdW5kRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL2JhY2tncm91bmQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29udGVudEZpdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9jb250ZW50LWZpdC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBCYW5uZXJDb250ZW50Rml0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL2Jhbm5lci1jb250ZW50LWZpdC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBCb3JkZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvYm9yZGVyLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZGlyZWN0aXZlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbHVtbkRpcmVjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9jb2x1bW4tZGlyZWN0aXZlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbnRhaW5lckZpdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9jb250YWluZXItZmlyLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IHNpbXBvQ29uZXRlbkFsaWdubWVudERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9jb250ZW50LWFsaWdubWVudC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb3JuZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvY29ybmVyLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNpbXBvRm9vdGVyTGF5b3V0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL2Zvb3Rlci1sYXlvdXQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgSG92ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvaG92ZXItZWxlbWVudC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBJbWFnZURpcmVjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9pbWFnZS1kaXJlY3RpdmUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgT3ZlcmxheURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9vdmVybGF5LWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFBvc2l0aW9uTGF5b3V0RGlyZWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL3Bvc2l0aW9uLWxheW91dC1kaXJlY3RpdmUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVGV4dEJhY2tncm91bmREaXJlY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvdGV4dC1iYWNrZ3JvdW5kLWRpcmVjdGl2ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9ldmVudHMuc2VydmljZSc7XHJcbmltcG9ydCB7IE9iamVjdFBvc2l0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi8uLi8uLi9kaXJlY3RpdmUvaW1hZ2UtcG9zaXRpb24uZGlyZWN0aXZlJztcclxuaW1wb3J0IEJhc2VTZWN0aW9uIGZyb20gJy4uL0Jhc2VTZWN0aW9uJztcclxuaW1wb3J0IHsgU2ltcG9Db250YWluZXJBbGlnbWVudCB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9jb250YWluZXItYWxpZ25tZW50LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbG9yRGlyZWN0aXZlIH0gZnJvbSAnLi8uLi8uLi9kaXJlY3RpdmUvY29sb3IuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVGV4dFNpemVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvdGV4dC1zaXplLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNpbXBvQm9yZGVybGVzc0RpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9ib3JkZXJsZXNzSW1hZ2UuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2ltcG9Ib3ZlckJvcmRlckRpcmVjdGl2ZSB9IGZyb20gXCIuLi8uLi9kaXJlY3RpdmUvaG92ZXJib3JkZXIuZGlyZWN0aXZlXCI7XHJcbmltcG9ydCB7IFNhbml0aXplSHRtbFBpcGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zYW5pdGl6ZUh0bWwnO1xyXG5pbXBvcnQgeyBCYW5uZXJDb250ZW50TW9kZWwsIEJhbm5lclNlY3Rpb25Nb2RlbCB9IGZyb20gJy4vYXBwb2ludG1lbnQtZm9ybS5tb2RlbCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQ29udGVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcclxuaW1wb3J0IHsgTWF0TmF0aXZlRGF0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5cclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLWFwcG9pbnRtZW50LWZvcm0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgU2ltcG9FbGVtZW50c01vZHVsZSxcclxuICAgIFNpbXBvQ29tcG9uZW50TW9kdWxlLFxyXG4gICAgTWF0R3JpZExpc3RNb2R1bGUsXHJcbiAgICBTaW1wb0J1dHRvbkNvbXBvbmVudCxcclxuICAgIFNpbXBvSG92ZXJCb3JkZXJEaXJlY3RpdmUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRTZWxlY3RNb2R1bGUsXHJcbiAgICBNYXREaWFsb2dNb2R1bGUsXHJcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxyXG4gICAgTWF0TmF0aXZlRGF0ZU1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuXHJcblxyXG4gICAgLy9kaXJlY3RpdmVcclxuICAgIFNpbXBvQm9yZGVybGVzc0RpcmVjdGl2ZSxcclxuICAgIFNpbXBvQ29udGFpbmVyQWxpZ21lbnQsXHJcbiAgICBBbmltYXRpb25EaXJlY3RpdmUsXHJcbiAgICBCYWNrZ3JvdW5kRGlyZWN0aXZlLFxyXG4gICAgQmFubmVyQ29udGVudEZpdERpcmVjdGl2ZSxcclxuICAgIEJvcmRlckRpcmVjdGl2ZSxcclxuICAgIEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSxcclxuICAgIENvbHVtbkRpcmVjdGl2ZURpcmVjdGl2ZSxcclxuICAgIENvbnRhaW5lckZpdERpcmVjdGl2ZSxcclxuICAgIHNpbXBvQ29uZXRlbkFsaWdubWVudERpcmVjdGl2ZSxcclxuICAgIENvbnRlbnRGaXREaXJlY3RpdmUsXHJcbiAgICBDb3JuZXJEaXJlY3RpdmUsXHJcbiAgICBTaW1wb0Zvb3RlckxheW91dERpcmVjdGl2ZSxcclxuICAgIEhvdmVyRGlyZWN0aXZlLFxyXG4gICAgSW1hZ2VEaXJlY3RpdmVEaXJlY3RpdmUsXHJcbiAgICBPdmVybGF5RGlyZWN0aXZlLFxyXG4gICAgUG9zaXRpb25MYXlvdXREaXJlY3RpdmVEaXJlY3RpdmUsXHJcbiAgICBUZXh0QmFja2dyb3VuZERpcmVjdGl2ZURpcmVjdGl2ZSxcclxuICAgIE9iamVjdFBvc2l0aW9uRGlyZWN0aXZlLFxyXG4gICAgQ29sb3JEaXJlY3RpdmUsXHJcbiAgICBUZXh0U2l6ZURpcmVjdGl2ZSxcclxuICAgIFNhbml0aXplSHRtbFBpcGVcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHBvaW50bWVudC1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXBwb2ludG1lbnQtZm9ybS5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwb2ludG1lbnRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24gaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBkYXRhPzogQmFubmVyU2VjdGlvbk1vZGVsO1xyXG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xyXG4gIGNvbnRlbnQ/OiBCYW5uZXJDb250ZW50TW9kZWw7XHJcbiAgQElucHV0KCkgZWRpdD86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZGVsZXRlPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBjdXN0b21DbGFzcz86IHN0cmluZztcclxuICBzdHlsZXM/OiBCYW5uZXJTdHlsZXNNb2RlbDtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfZXZlbnRTZXJ2aWNlOiBFdmVudHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtYXREaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXJcclxuXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgYnVzaW5lc3NJZDogYW55O1xyXG4gIGJ1c2luZXNzTmFtZTogYW55O1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2codGhpcy5kYXRhKTtcclxuICAgIHRoaXMuZGVsZXRlU2VsZWN0ZWQgPSB0aGlzLmRlbGV0ZVxyXG4gICAgdGhpcy5jb250ZW50ID0gdGhpcy5kYXRhPy5jb250ZW50O1xyXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcclxuICAgIGlmICghdGhpcy5zdHlsZXMgfHwgIXRoaXMuY29udGVudCkgcmV0dXJuO1xyXG4gICAgdGhpcy5idXNpbmVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiSWRcIikgPz8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJidXNpbmVzc0lkXCIpLFxyXG4gICAgICB0aGlzLmJ1c2luZXNzTmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYk5hbWVcIikgPz8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJidXNpbmVzc05hbWVcIilcclxuXHJcblxyXG4gICAgdGhpcy5nZXRBbGxTZXJ2aWNlcygpO1xyXG4gICAgdGhpcy5nZXRBbGxMb2NhdGlvbnMoKTtcclxuICAgIC8vIHRoaXMuc3R5bGVzLmxheW91dC5iYW5uZXJJbWFnZURpc3BsYXkgPSB0aGlzLmNvbnRlbnQuaW1hZ2Uuc2hvd0ltYWdlO1xyXG4gIH1cclxuICBnZXQgc3R5bGVzTGF5b3V0KCkge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy5zdHlsZXM/LmxheW91dCB9IGFzIExheU91dE1vZGVsO1xyXG4gIH1cclxuICBnZXQgZ2V0SnVzdGlmeUNvbnRlbnQoKSB7XHJcbiAgICByZXR1cm4gXCJqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50O1wiO1xyXG4gIH1cclxuICBnZXQgY2FuTWVyZ2VOYXZiYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdHlsZXM/Lm1lcmdlO1xyXG4gIH1cclxuICBnZXQgaXNCb3JkZXJsZXNzSW1hZ2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdHlsZXM/LmJvcmRlckxlc3NJbWFnZSAmJiAodGhpcy5zdHlsZXM/LnBvc2l0aW9uTGF5b3V0LnZhbHVlID09IFwibGVmdFwiIHx8IHRoaXMuc3R5bGVzPy5wb3NpdGlvbkxheW91dC52YWx1ZSA9PSBcInJpZ2h0XCIpO1xyXG4gIH1cclxuICBnZXQgZ2V0UG9zaXRpb25MYXlvdXQoKSB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLnN0eWxlcz8ucG9zaXRpb25MYXlvdXQgfSBhcyBQb3NpdGlvbkxheW91dE1vZGFsO1xyXG4gIH1cclxuXHJcbiAgZWRpdFNlY3Rpb24oKSB7XHJcblxyXG4gICAgdGhpcy5fZXZlbnRTZXJ2aWNlLnRvZ2dsZUVkaXRvckV2ZW50LmVtaXQoZmFsc2UpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2V2ZW50U2VydmljZS5lZGl0U2VjdGlvbi5lbWl0KHsgZGF0YTogdGhpcy5kYXRhIH0pO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcbiAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50OiBhbnkpIHtcclxuXHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIG9wZW5kYWlsb2dib3godGVtcGxhdGU6IFRlbXBsYXRlUmVmPEhUTUxEaXZFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgdGhpcy5tYXREaWFsb2cub3Blbih0ZW1wbGF0ZSxcclxuICAgICAgLy8gIHt3aWR0aDonNTAwcHgnfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG5cclxuICBjbG9zZURpYWxvZygpIHtcclxuICAgIHRoaXMubWF0RGlhbG9nLmNsb3NlQWxsKCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICBpc01vdmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgb25Gb2N1cygpIHtcclxuICAgIHRoaXMuaXNNb3ZlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICByZXN0cmljdE5vbk51bWVyaWMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGNvbnN0IGNoYXJDb2RlID0gZXZlbnQuY2hhckNvZGU7XHJcbiAgICBpZiAoY2hhckNvZGUgIT0gMCkge1xyXG4gICAgICAvLyBBbGxvdyBvbmx5IG51bWJlcnNcclxuICAgICAgaWYgKGNoYXJDb2RlIDwgNDggfHwgY2hhckNvZGUgPiA1Nykge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBvblVzZXJOYW1lQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlZ2V4ID0gL15bYS16QS1aXFxzXSokLztcclxuICAgIGlmICghcmVnZXgudGVzdCh2YWx1ZSkpIHtcclxuICAgICAgdGhpcy5DcmVhdGVEYXRhLmNsaWVudE5hbWUgPSB2YWx1ZS5yZXBsYWNlKC9bXmEtekEtWlxcc10vZywgJycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5DcmVhdGVEYXRhLmNsaWVudE5hbWUgPSB0aGlzLnRvVGl0bGVDYXNlKHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvVGl0bGVDYXNlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFx3XFxTKi9nLCBmdW5jdGlvbiAodHh0KSB7XHJcbiAgICAgIHJldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBDcmVhdGVEYXRhOiBhbnkgPSB7XHJcbiAgICBidXNpbmVzczoge1xyXG4gICAgICBpZDogXCJcIixcclxuICAgICAgbmFtZTogXCJcIlxyXG4gICAgfSxcclxuICAgIGNsaWVudE5hbWU6IFwiXCIsXHJcbiAgICBtb2JpbGU6IFwiXCIsXHJcbiAgICBzY2hlZHVsZWREYXRlOiBcIlwiLFxyXG4gICAgc3RhZmY6IFtdLFxyXG4gICAgc2VydmljZXM6IFtcclxuICAgICAge1xyXG4gICAgICAgIGlkOiBcIlwiLFxyXG4gICAgICAgIG5hbWU6IFwiXCJcclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIHRpbWU6IFwiXCIsXHJcbiAgICBtZXNzYWdlOiBcIlwiXHJcbiAgfVxyXG5cclxuXHJcbiAgbWluRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG5cclxuICBzZXJ2aWNlRGF0YTogYW55O1xyXG4gIGdldEFsbFNlcnZpY2VzKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxTZXJ2aWNlcyh0aGlzLmJ1c2luZXNzSWQsIDEwMDAsIDApLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5kYXRhLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5zZXJ2aWNlRGF0YSA9IHJlcy5kYXRhLmRhdGE7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnNlcnZpY2VEYXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcclxuICAgICAgICAgICAgYFNlcnZpY2UgaXMgbm90IGNyZWF0ZWQgeWV0IHdpdGggdGhpcyBidXNpbmVzc2AsXHJcbiAgICAgICAgICAgICdDbG9zZScsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgc2VydmljZXM6XCIsIGVycm9yKTsgLy8gSGFuZGxlIGVycm9ycyBncmFjZWZ1bGx5XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBsb2NhdGlvbkRhdGE6IGFueTtcclxuICBzZWxlY3RlZExvY2F0aW9uOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGdldEFsbExvY2F0aW9ucygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsTG9jYXRpb24odGhpcy5idXNpbmVzc0lkLCAxMDAwLCAwKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuZGF0YS5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMubG9jYXRpb25EYXRhID0gcmVzLmRhdGEuZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXHJcbiAgICAgICAgICAgIGBMb2NhdGlvbiBpcyBub3QgY3JlYXRlZCB5ZXQgd2l0aCB0aGlzIGJ1c2luZXNzYCxcclxuICAgICAgICAgICAgJ0Nsb3NlJyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBzZXJ2aWNlczpcIiwgZXJyb3IpOyAvLyBIYW5kbGUgZXJyb3JzIGdyYWNlZnVsbHlcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHN0YWZmTGlzdDogYW55W10gPSBbXTtcclxuICBzZWxlY3RlZFN0YWZmOiBzdHJpbmcgPSAnJ1xyXG4gIGdldEFsbFN0YWZmKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxTdGFmZih0aGlzLmJ1c2luZXNzSWQsIDEwMDAsIDAsIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiwgdGhpcy5zZWxlY3RlZFNlcnZpY2VzKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhZmZMaXN0ID0gcmVzLmRhdGEuZGF0YTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIHNlcnZpY2VzOlwiLCBlcnJvcik7IC8vIEhhbmRsZSBlcnJvcnMgZ3JhY2VmdWxseVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIHNlbGVjdGVkU2VydmljZXM6IHN0cmluZyA9ICcnO1xyXG5cclxuICBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7IC8vIE1vbnRocyBhcmUgemVyby1iYXNlZFxyXG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG5cclxuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gO1xyXG4gIH1cclxuXHJcblxyXG4gIGZvcm1hdHRlZERhdGU6IGFueTtcclxuICB0aW1lU2xvdHNEYXRhOiBhbnk7XHJcbiAgZm9ybWF0dGVkVGltZUludGVydmFsczogYW55O1xyXG4gIGdldFRpbWVTbG90cygpIHtcclxuICAgIHRoaXMuZm9ybWF0dGVkRGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZShuZXcgRGF0ZSh0aGlzLkNyZWF0ZURhdGEuc2NoZWR1bGVkRGF0ZSkpO1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxUaW1lU2xvdHModGhpcy5zZWxlY3RlZExvY2F0aW9uLCB0aGlzLmZvcm1hdHRlZERhdGUpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgdGhpcy50aW1lU2xvdHNEYXRhID0gcmVzO1xyXG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWRUaW1lSW50ZXJ2YWxzID0gdGhpcy50aW1lU2xvdHNEYXRhLm1hcCgoaW50ZXJ2YWw6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgc3RhcnRUaW1lOiBpbnRlcnZhbC5zdGFydFRpbWUuc2xpY2UoMCwgNSksIC8vIEdldCBISDpNTVxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJUaW1lU2xvdHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXHJcbiAgICAgICAgICAgIGBUaW1lIGlzIG5vdCBjcmVhdGVkIHlldCB3aXRoIHRoaXMgYnVzaW5lc3NgLFxyXG4gICAgICAgICAgICAnQ2xvc2UnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIHNlcnZpY2VzOlwiLCBlcnJvcik7IC8vIEhhbmRsZSBlcnJvcnMgZ3JhY2VmdWxseVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIGZpbHRlclRpbWVTbG90cygpIHtcclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCBzZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLkNyZWF0ZURhdGEuc2NoZWR1bGVkRGF0ZSk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIGRhdGUgaXMgdG9kYXlcclxuICAgIGlmIChzZWxlY3RlZERhdGUudG9EYXRlU3RyaW5nKCkgPT09IG5vdy50b0RhdGVTdHJpbmcoKSkge1xyXG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IG5vdy5nZXRIb3VycygpICogNjAgKyBub3cuZ2V0TWludXRlcygpOyAvLyBDb252ZXJ0IGN1cnJlbnQgdGltZSB0byB0b3RhbCBtaW51dGVzXHJcblxyXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB0aW1lIHNsb3RzIHRoYXQgYXJlIGJlZm9yZSB0aGUgY3VycmVudCB0aW1lXHJcbiAgICAgIHRoaXMuZm9ybWF0dGVkVGltZUludGVydmFscyA9IHRoaXMuZm9ybWF0dGVkVGltZUludGVydmFscy5maWx0ZXIoKHRpbWVTbG90OiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBbdGltZSwgcGVyaW9kXSA9IHRpbWVTbG90LnN0YXJ0VGltZS5zcGxpdCgnICcpOyAvLyBTcGxpdCB0aW1lIGFuZCBwZXJpb2RcclxuICAgICAgICBjb25zdCBbaG91cnMsIG1pbnV0ZXNdID0gdGltZS5zcGxpdCgnOicpLm1hcChOdW1iZXIpO1xyXG4gICAgICAgIGNvbnN0IGFkanVzdGVkSG91cnMgPSAocGVyaW9kID09PSAnUE0nICYmIGhvdXJzICE9PSAxMikgPyBob3VycyArIDEyIDogKHBlcmlvZCA9PT0gJ0FNJyAmJiBob3VycyA9PT0gMTIpID8gMCA6IGhvdXJzOyAvLyBBZGp1c3QgZm9yIDI0LWhvdXIgZm9ybWF0XHJcbiAgICAgICAgY29uc3Qgc2xvdFRpbWUgPSBhZGp1c3RlZEhvdXJzICogNjAgKyBtaW51dGVzOyAvLyBDb252ZXJ0IHNsb3QgdGltZSB0byB0b3RhbCBtaW51dGVzXHJcbiAgICAgICAgcmV0dXJuIHNsb3RUaW1lID4gY3VycmVudFRpbWU7IC8vIE9ubHkgc2hvdyBzbG90cyBhZnRlciB0aGUgY3VycmVudCB0aW1lXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF0ZUZpbHRlciA9IChkYXRlOiBEYXRlIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xyXG4gICAgY29uc3QgZGF5ID0gZGF0ZT8uZ2V0RGF5KCk7XHJcbiAgICAvLyBEaXNhYmxlIFN1bmRheXNcclxuICAgIHJldHVybiBkYXkgIT09IDA7XHJcbiAgfTtcclxuXHJcblxyXG4gIGlzRm9ybVZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLkNyZWF0ZURhdGEuY2xpZW50TmFtZSB8fFxyXG4gICAgICAhdGhpcy5zZWxlY3RlZFNlcnZpY2VzIHx8XHJcbiAgICAgICF0aGlzLnNlbGVjdGVkTG9jYXRpb24gfHxcclxuICAgICAgIXRoaXMuQ3JlYXRlRGF0YS5zY2hlZHVsZWREYXRlXHJcbiAgfVxyXG5cclxuICBwcmVwYXJlQ3JlYXRlRGF0YSgpIHtcclxuICAgIHRoaXMuQ3JlYXRlRGF0YS5zZXJ2aWNlcyA9IFtdO1xyXG4gICAgdGhpcy5zZXJ2aWNlRGF0YS5mb3JFYWNoKChzZXJ2aWNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlcyA9PT0gc2VydmljZS5pZCkge1xyXG4gICAgICAgIHRoaXMuQ3JlYXRlRGF0YS5zZXJ2aWNlcy5wdXNoKHtcclxuICAgICAgICAgIGlkOiBzZXJ2aWNlLmlkLFxyXG4gICAgICAgICAgbmFtZTogc2VydmljZS5uYW1lXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcmVwYXJlTG9jYXRpb25EYXRhKCkge1xyXG4gICAgdGhpcy5DcmVhdGVEYXRhLmxvY2F0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5sb2NhdGlvbkRhdGEuZm9yRWFjaCgobG9jYXRpb246IGFueSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZExvY2F0aW9uID09IGxvY2F0aW9uLmlkKSB7XHJcbiAgICAgICAgdGhpcy5DcmVhdGVEYXRhLmxvY2F0aW9ucy5wdXNoKHtcclxuICAgICAgICAgIGlkOiBsb2NhdGlvbi5pZCxcclxuICAgICAgICAgIG5hbWU6IGxvY2F0aW9uLm5hbWVcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJlcGFyZVN0YWZmRGF0YSgpIHtcclxuICAgIHRoaXMuQ3JlYXRlRGF0YS5zdGFmZiA9IFtdO1xyXG4gICAgdGhpcy5zdGFmZkxpc3QuZm9yRWFjaCgoc3RhZmY6IGFueSkgPT4ge1xyXG4gICAgICBpZihzdGFmZi5pZCA9PT0gdGhpcy5zZWxlY3RlZFN0YWZmKSB7XHJcbiAgICAgICAgdGhpcy5DcmVhdGVEYXRhLnN0YWZmLnB1c2goe1xyXG4gICAgICAgICAgaWQ6IHN0YWZmLmlkLFxyXG4gICAgICAgICAgbmFtZTogc3RhZmYubmFtZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjcmVhdGVMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBib29rQXBwb2ludG1lbnQoKSB7XHJcbiAgICBpZighdGhpcy5DcmVhdGVEYXRhLm1vYmlsZSB8fCB0aGlzLkNyZWF0ZURhdGEubW9iaWxlLmxlbmd0aCAhPSAxMCkge1xyXG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0ludmFsaWQgbW9iaWxlIG51bWJlcicsICdjbG9zZScsIHtkdXJhdGlvbjogMjAwMH0pXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnByZXBhcmVDcmVhdGVEYXRhKCk7XHJcbiAgICB0aGlzLnByZXBhcmVMb2NhdGlvbkRhdGEoKTtcclxuICAgIHRoaXMucHJlcGFyZVN0YWZmRGF0YSgpO1xyXG4gICAgdGhpcy5DcmVhdGVEYXRhLmJ1c2luZXNzLmlkID0gdGhpcy5idXNpbmVzc0lkO1xyXG4gICAgdGhpcy5DcmVhdGVEYXRhLmJ1c2luZXNzLm5hbWUgPSB0aGlzLmJ1c2luZXNzTmFtZTtcclxuXHJcbiAgICBpZiAodGhpcy5DcmVhdGVEYXRhLnNjaGVkdWxlZERhdGUpIHtcclxuICAgICAgY29uc3Qgb3JpZ2luYWxEYXRlID0gbmV3IERhdGUodGhpcy5DcmVhdGVEYXRhLnNjaGVkdWxlZERhdGUpO1xyXG4gICAgICBvcmlnaW5hbERhdGUuc2V0RGF0ZShvcmlnaW5hbERhdGUuZ2V0RGF0ZSgpICsgMSk7IC8vIEFkZCBvbmUgZGF5XHJcbiAgICAgIHRoaXMuQ3JlYXRlRGF0YS5zY2hlZHVsZWREYXRlID0gb3JpZ2luYWxEYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcclxuXHJcbiAgICB9XHJcbiAgICB0aGlzLmNyZWF0ZUxvYWRlciA9IHRydWU7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmNyZWF0ZUFwcG9pbnRtZW50KHRoaXMuQ3JlYXRlRGF0YSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXHJcbiAgICAgICAgICBgQXBwb2ludG1lbnQgaXMgQ3JlYXRlZGAsXHJcbiAgICAgICAgICAnQ2xvc2UnLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLm1hdERpYWxvZy5jbG9zZUFsbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXHJcbiAgICAgICAgICBgSW50ZXJuYWwgU2VydmVyIEVycm9yYCxcclxuICAgICAgICAgICdDbG9zZScsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBDcmVhdGlvbjpcIiwgZXJyb3IpOyAvLyBIYW5kbGUgZXJyb3JzIGdyYWNlZnVsbHlcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IFtpZF09XCJkYXRhPy5pZFwiXHJcbiAgW25nQ2xhc3NdPVwieydtZXJnZU5hdmJhcic6IGNhbk1lcmdlTmF2YmFyICYmIGluZGV4ID09IDEsICdqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBkLWZsZXgnOiBpc0JvcmRlcmxlc3NJbWFnZX1cIlxyXG4gIFtzaW1wb0JhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCIgY2xhc3M9XCJ0b3RhbC1jb250YWluZXJcIiBzdHlsZT1cIm92ZXJmbG93LXg6IGhpZGRlbjtcIiBzaW1wb0hvdmVyXHJcbiAgKGhvdmVyaW5nKT1cInNob3dFZGl0VGFicygkZXZlbnQpXCIgW2F0dHIuc3R5bGVdPVwiY3VzdG9tQ2xhc3NcIj5cclxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiSW1hZ2VTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgPGRpdiBjbGFzcz1cInB4LTQgcHktNVwiIFtuZ0NsYXNzXT1cInsnY29sLWxnLTYgY29sLXh4bC02JzogaXNCb3JkZXJsZXNzSW1hZ2UsICd3LTEwMCBjb2wteHhsLTgnOiAhaXNCb3JkZXJsZXNzSW1hZ2V9XCJcclxuICAgIFtpZF09XCJkYXRhPy5pZFwiICNtYWluQ29udGFpbmVyIFtzaW1wb092ZXJsYXldPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCIgW3NpbXBvQm9yZGVyXT1cInN0eWxlcz8uYm9yZGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGctNSBqdXN0aWZ5LWNvbnRlbnQtc3RhcnRcIiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9BbmltYXRpb25dPVwic3R5bGVzPy5hbmltYXRpb25cIlxyXG4gICAgICBbc2ltcG9MYXlvdXRdPVwic3R5bGVzPy5sYXlvdXRcIiBbc2ltcG9Qb3NpdGlvbkxheW91dERpcmVjdGl2ZV09XCJzdHlsZXM/LnBvc2l0aW9uTGF5b3V0XCJcclxuICAgICAgW25nQ2xhc3NdPVwieyAnYWxpZ24taXRlbXMtc3RyZXRjaCc6IHN0eWxlcz8ucG9zaXRpb25MYXlvdXQ/LnZhbHVlID09PSAnbGVmdCcgfHwgc3R5bGVzPy5wb3NpdGlvbkxheW91dD8udmFsdWUgPT09ICdyaWdodCcsICdmbGV4LWxnLXJvdyc6IHRydWUgfVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwIGNvbC1zbS04IGNvbC1sZy02XCIgKm5nSWY9XCJjb250ZW50Py5pbWFnZT8uc2hvd0ltYWdlICYmICFpc0JvcmRlcmxlc3NJbWFnZVwiXHJcbiAgICAgICAgW3NpbXBvQ29udGFpbmVyQWxpZ25tZW50XT1cInN0eWxlc0xheW91dFwiPlxyXG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBbc3JjXT1cImNvbnRlbnQ/LmltYWdlPy51cmxcIiBbc2ltcG9JbWFnZURpcmVjdGl2ZV09XCJzdHlsZXM/LmltYWdlXCIgW2lkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICAgIFtzaW1wb09iamVjdFBvc2l0aW9uXT1cImNvbnRlbnQ/LmltYWdlPy5wb3NpdGlvblwiIFtzaW1wb0Nvcm5lcl09XCJzdHlsZXM/LmNvcm5lcnNcIlxyXG4gICAgICAgICAgW2NsYXNzXT1cImRhdGE/LmlkKyhjb250ZW50Py5pbWFnZT8uaWQgfHwgJycpXCIgY2xhc3M9XCJkLWJsb2NrIHctMTAwIGluc2lkZUltZ1wiIHN0eWxlPVwib2JqZWN0LWZpdDogY292ZXI7XCJcclxuICAgICAgICAgIFthbHRdPVwiY29udGVudD8uaW1hZ2U/LmFsdFRleHRcIiB3aWR0aD1cIjcwMFwiIGhlaWdodD1cIjUwMFwiIGxvYWRpbmc9XCJsYXp5XCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LXN0YXJ0IGdhcC0xNVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydjb2wtbGctMTInOiBpc0JvcmRlcmxlc3NJbWFnZSwgJ2NvbC1sZy02JzogIWlzQm9yZGVybGVzc0ltYWdlfVwiXHJcbiAgICAgICAgW3NpbXBvQ29udGFpbmVyQWxpZ25tZW50XT1cInN0eWxlc0xheW91dFwiIFtpZF09XCJkYXRhPy5pZFwiIFtzaW1wb0NvbnRlbnRBbGlnbm1lbnRdPVwic3R5bGVzPy5jb250ZW50QWxpZ25tZW50XCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb250ZW50Py5pbnB1dFRleHRcIj5cclxuICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJpdGVtLnZhbHVlIHwgc2FuaXRpemVIdG1sXCIgY2xhc3M9XCJ0ZXh0LWVsZW1lbnRcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJpdGVtLmxhYmVsID09PSAnSGVhZGluZycgPyAnaGVhZGluZy1sYXJnZSBsaC0yIG1iLTMnIDogJ2JvZHktbGFyZ2UnXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb250ZW50Py5saXN0SXRlbT8uZGF0YVwiIGNsYXNzPVwiY2FyZGVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZF93cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJfY2FyZCB2aXNpYmxlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtc2VjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY29uZC1wYXJ0LWNhcmRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXJzdC1wYXJ0LWNhcmRcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpdGVtLmlucHV0VGV4dFswXS5sYWJlbD09PSAnSGVhZGluZycgPyAnaGVhZGluZy1sYXJnZSBsaC0yIG1iLTMnIDogJ2JvZHktbGFyZ2UnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBjbGFzcz1cInRpY2staW1nXCJcclxuICAgICAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzkzMzk5N2MxNzE4NzkwMzAzMTI3OTA3NTk4YzE2OTYwNjMwNjE5MDBncmVlbl92ZXJpZmllZF9pbWFnZS5wbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cInNvbWV0aGluZ1wiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmlucHV0VGV4dFswXS52YWx1ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGE/LmFjdGlvbiAmJiBkYXRhPy5hY3Rpb24/LmRpc3BsYXlcIiBjbGFzcz1cImJ1dHRvbi1kaXNwbGF5XCJcclxuICAgICAgICAgIFtzaW1wb0NvbnRhaW5lckFsaWdubWVudF09XCJzdHlsZXNMYXlvdXRcIj5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBkYXRhPy5hY3Rpb24/LmJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgPGFwcC1idXR0b24tZWxlbWVudCBbYnV0dG9uQ29udGVudF09XCJidXR0b24uY29udGVudFwiIFtidXR0b25TdHlsZV09XCJidXR0b24uc3R5bGVzXCIgW2J1dHRvbklkXT1cImJ1dHRvbi5pZFwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5kYWlsb2dib3goZGlhbG9nQm94KVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+PC9hcHAtYnV0dG9uLWVsZW1lbnQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPCEtLSA8ZGl2IHN0eWxlPVwiIHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDUwMHB4O1wiPlxyXG4gICAgPGltZyBsb2FkaW5nPVwibGF6eVwiICBzcmM9XCIuLi8uLi9hc3NldHMvZGl2aWRlci5zdmdcIiBzdHlsZT1cImNsaXAtcGF0aDogcG9seWdvbigwIDU1JSwgMTAwJSAwLCAxMDAlIDEwMCUsIDAlIDEwMCUpOyBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XCI+XHJcbiAgPC9kaXY+IC0tPlxyXG4gIDxkaXYgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBlZGl0ICYmIGZhbHNlIH1cIiAqbmdJZj1cInNob3dFZGl0b3JzXCI+XHJcbiAgICA8c2ltcG8taG92ZXItZWxlbWVudHMgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiIFtlZGl0T3B0aW9uc109XCJlZGl0XCJcclxuICAgICAgW2lzTWVyZ2VkXT1cInN0eWxlcz8ubWVyZ2UgPz8gZmFsc2VcIj48L3NpbXBvLWhvdmVyLWVsZW1lbnRzPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgKm5nSWY9XCJzaG93RGVsZXRlXCIgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBkZWxldGV9XCI+XHJcbiAgICA8c2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiPjwvc2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQ+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48bmctdGVtcGxhdGUgI0ltYWdlU2VjdGlvbj5cclxuICA8ZGl2IGNsYXNzPVwiY29sLTEwIGNvbC1zbS04IGNvbC1sZy02XCJcclxuICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBzdHlsZXM/LnBvc2l0aW9uTGF5b3V0Py52YWx1ZSA9PT0gJ3JpZ2h0JyA/ICdmaXQtY29udGVudCcgOiAnJ31cIlxyXG4gICAgc3R5bGU9XCJwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcIiAqbmdJZj1cImNvbnRlbnQ/LmltYWdlPy5zaG93SW1hZ2UgJiYgaXNCb3JkZXJsZXNzSW1hZ2U7XCJcclxuICAgIFtzaW1wb0JvcmRlcmxlc3NdPVwiZ2V0UG9zaXRpb25MYXlvdXRcIj5cclxuICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBbc3JjXT1cImNvbnRlbnQ/LmltYWdlPy51cmxcIiBjbGFzcz1cImQtYmxvY2sgaW1nLWZsdWlkIGgtMTAwIHctMTAwXCJcclxuICAgICAgW2FsdF09XCJjb250ZW50Py5pbWFnZT8uYWx0VGV4dFwiIHdpZHRoPVwiNzAwXCIgaGVpZ2h0PVwiNTAwXCIgbG9hZGluZz1cImxhenlcIiAvPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbjwhLS0gRGlhbG9nIHRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2RpYWxvZ0JveCBjbGFzcz1cImRpYWxvZ2JveFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC1mb3JtXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXNlY3Rpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0LXNpZGVcIj5cclxuICAgICAgICA8aDIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0O1wiPkJvb2sgYW4gQXBwb2ludG1lbnQ8L2gyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yaWdodC1zaWRlXCI+XHJcbiAgICAgICAgPG1hdC1pY29uIChjbGljayk9XCJjbG9zZURpYWxvZygpXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxmb3JtPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibmFtZS1tb2JpbGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Z1bGwtd2lkdGhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC10ZXh0XCI+TmFtZTwvZGl2PlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0U3R5bGVcIiBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIkVudGVyIFlvdXIgTmFtZVwiIHBhdHRlcm49XCJbYS16QS1aIF0qXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIkNyZWF0ZURhdGEuY2xpZW50TmFtZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXNlck5hbWVDaGFuZ2UoJGV2ZW50KVwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXRleHRcIj5Nb2JpbGUgTnVtYmVyPC9kaXY+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJpbnB1dFN0eWxlXCIgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJFbnRlciBZb3VyIE1vYmlsZSBOdW1iZXJcIlxyXG4gICAgICAgICAgICAgIHBhdHRlcm49XCJeWzAtOV17MTAsMTV9JFwiIG1heGxlbmd0aD1cIjE1XCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIChrZXlwcmVzcyk9XCJyZXN0cmljdE5vbk51bWVyaWMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJDcmVhdGVEYXRhLm1vYmlsZVwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm5hbWUtbW9iaWxlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNmdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtdGV4dFwiPkxvY2F0aW9uPC9kaXY+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgY2xhc3M9XCJpbnB1dFN0eWxlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgTG9jYXRpb25cIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkTG9jYXRpb25cIiAobmdNb2RlbENoYW5nZSk9XCJnZXRBbGxTdGFmZigpXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxvY2F0aW9uIG9mIGxvY2F0aW9uRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImxvY2F0aW9uLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGxvY2F0aW9uLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Z1bGwtd2lkdGhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC10ZXh0XCI+U2VydmljZTwvZGl2PlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGNsYXNzPVwiaW5wdXRTdHlsZVwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFNlcnZpY2VcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU2VydmljZXNcIiAobmdNb2RlbENoYW5nZSk9XCJnZXRBbGxTdGFmZigpXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlcnZpY2Ugb2Ygc2VydmljZURhdGFcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJzZXJ2aWNlLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHNlcnZpY2UubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJuYW1lLW1vYmlsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXRleHRcIj5TdGFmZjwvZGl2PlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGNsYXNzPVwiaW5wdXRTdHlsZVwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFN0YWZmXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFN0YWZmXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YWZmIG9mIHN0YWZmTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInN0YWZmLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHN0YWZmLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibmFtZS1tb2JpbGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Z1bGwtd2lkdGhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC10ZXh0XCI+RGF0ZTwvZGl2PlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0U3R5bGVcIiBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBEYXRlXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIkNyZWF0ZURhdGEuc2NoZWR1bGVkRGF0ZVwiIChuZ01vZGVsQ2hhbmdlKT1cImdldFRpbWVTbG90cygpXCIgW21pbl09XCJtaW5EYXRlXCJcclxuICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJkYXRlRmlsdGVyXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdEljb25TdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXRleHRcIj5UaW1lPC9kaXY+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgY2xhc3M9XCJpbnB1dFN0eWxlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgTG9jYXRpb25cIiBbKG5nTW9kZWwpXT1cIkNyZWF0ZURhdGEudGltZVwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0aW1lIG9mIGZvcm1hdHRlZFRpbWVJbnRlcnZhbHNcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ0aW1lLnN0YXJ0VGltZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyB0aW1lLnN0YXJ0VGltZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZnVsbC1tZXNzYWdlLXNlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnVzaW5lc3MtZmllbGQtc2VjdGlvblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXRleHRcIj5NZXNzYWdlPC9kaXY+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRTdHlsZVwiIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiRW50ZXIgWW91ciBOYW1lXCIgcGF0dGVybj1cIlthLXpBLVogXSpcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiQ3JlYXRlRGF0YS5tZXNzYWdlXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLXNlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXNlY3Rpb25cIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJib29raW5nLWJ1dHRvblwiIFtkaXNhYmxlZF09XCJpc0Zvcm1WYWxpZCgpXCIgKGNsaWNrKT1cImJvb2tBcHBvaW50bWVudCgpXCI+XHJcbiAgICAgICAgICAgIEJvb2sgQXBwb2ludG1lbnRcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPC9mb3JtPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
564
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwb2ludG1lbnQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL3NlY3Rpb25zL2FwcG9pbnRtZW50LWZvcm0vYXBwb2ludG1lbnQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL3NlY3Rpb25zL2FwcG9pbnRtZW50LWZvcm0vYXBwb2ludG1lbnQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBaUQsTUFBTSxlQUFlLENBQUM7QUFFNUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0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QkFBd0IsY0FDdEIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixvQkFBb0I7d0JBQ3BCLGlCQUFpQjt3QkFDakIsb0JBQW9CO3dCQUNwQix5QkFBeUI7d0JBQ3pCLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsbUJBQW1CO3dCQUNuQixtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxhQUFhO3dCQUdiLFdBQVc7d0JBQ1gsd0JBQXdCO3dCQUN4QixzQkFBc0I7d0JBQ3RCLGtCQUFrQjt3QkFDbEIsbUJBQW1CO3dCQUNuQix5QkFBeUI7d0JBQ3pCLGVBQWU7d0JBQ2Ysd0JBQXdCO3dCQUN4Qix3QkFBd0I7d0JBQ3hCLHFCQUFxQjt3QkFDckIsOEJBQThCO3dCQUM5QixtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsMEJBQTBCO3dCQUMxQixjQUFjO3dCQUNkLHVCQUF1Qjt3QkFDdkIsZ0JBQWdCO3dCQUNoQixnQ0FBZ0M7d0JBQ2hDLGdDQUFnQzt3QkFDaEMsdUJBQXVCO3dCQUN2QixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3FCQUNqQjs4SkFNUSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCYW5uZXJTdHlsZXNNb2RlbCwgTGF5T3V0TW9kZWwsIFBvc2l0aW9uTGF5b3V0TW9kYWwgfSBmcm9tICcuLi8uLi9zdHlsZXMvc3R5bGUubW9kZWwnO1xyXG5pbXBvcnQgeyBTaW1wb0VsZW1lbnRzTW9kdWxlIH0gZnJvbSAnLi8uLi8uLi9lbGVtZW50cy9pbmRleCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IFNpbXBvQ29tcG9uZW50TW9kdWxlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9pbmRleCc7XHJcbmltcG9ydCB7IE1hdEdyaWRMaXN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZ3JpZC1saXN0JztcclxuaW1wb3J0IHsgU2ltcG9CdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9zaW1wby1idXR0b24vc2ltcG8tYnV0dG9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9hbmltYXRpb24tZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQmFja2dyb3VuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9iYWNrZ3JvdW5kLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbnRlbnRGaXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvY29udGVudC1maXQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQmFubmVyQ29udGVudEZpdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9iYW5uZXItY29udGVudC1maXQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQm9yZGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL2JvcmRlci1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvYnV0dG9uLWRpcmVjdGl2ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb2x1bW5EaXJlY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvY29sdW1uLWRpcmVjdGl2ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb250YWluZXJGaXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvY29udGFpbmVyLWZpci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBzaW1wb0NvbmV0ZW5BbGlnbm1lbnREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvY29udGVudC1hbGlnbm1lbnQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29ybmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL2Nvcm5lci1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTaW1wb0Zvb3RlckxheW91dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9mb290ZXItbGF5b3V0LWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEhvdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL2hvdmVyLWVsZW1lbnQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgSW1hZ2VEaXJlY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvaW1hZ2UtZGlyZWN0aXZlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvb3ZlcmxheS1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBQb3NpdGlvbkxheW91dERpcmVjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZS9wb3NpdGlvbi1sYXlvdXQtZGlyZWN0aXZlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFRleHRCYWNrZ3JvdW5kRGlyZWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL3RleHQtYmFja2dyb3VuZC1kaXJlY3RpdmUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPYmplY3RQb3NpdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4vLi4vLi4vZGlyZWN0aXZlL2ltYWdlLXBvc2l0aW9uLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCBCYXNlU2VjdGlvbiBmcm9tICcuLi9CYXNlU2VjdGlvbic7XHJcbmltcG9ydCB7IFNpbXBvQ29udGFpbmVyQWxpZ21lbnQgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvY29udGFpbmVyLWFsaWdubWVudC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb2xvckRpcmVjdGl2ZSB9IGZyb20gJy4vLi4vLi4vZGlyZWN0aXZlL2NvbG9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFRleHRTaXplRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL3RleHQtc2l6ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTaW1wb0JvcmRlcmxlc3NEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvYm9yZGVybGVzc0ltYWdlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNpbXBvSG92ZXJCb3JkZXJEaXJlY3RpdmUgfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlL2hvdmVyYm9yZGVyLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBTYW5pdGl6ZUh0bWxQaXBlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2FuaXRpemVIdG1sJztcclxuaW1wb3J0IHsgQmFubmVyQ29udGVudE1vZGVsLCBCYW5uZXJTZWN0aW9uTW9kZWwgfSBmcm9tICcuL2FwcG9pbnRtZW50LWZvcm0ubW9kZWwnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbnRlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XHJcbmltcG9ydCB7IE1hdE5hdGl2ZURhdGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLWFwcG9pbnRtZW50LWZvcm0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgU2ltcG9FbGVtZW50c01vZHVsZSxcclxuICAgIFNpbXBvQ29tcG9uZW50TW9kdWxlLFxyXG4gICAgTWF0R3JpZExpc3RNb2R1bGUsXHJcbiAgICBTaW1wb0J1dHRvbkNvbXBvbmVudCxcclxuICAgIFNpbXBvSG92ZXJCb3JkZXJEaXJlY3RpdmUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRTZWxlY3RNb2R1bGUsXHJcbiAgICBNYXREaWFsb2dNb2R1bGUsXHJcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxyXG4gICAgTWF0TmF0aXZlRGF0ZU1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuXHJcblxyXG4gICAgLy9kaXJlY3RpdmVcclxuICAgIFNpbXBvQm9yZGVybGVzc0RpcmVjdGl2ZSxcclxuICAgIFNpbXBvQ29udGFpbmVyQWxpZ21lbnQsXHJcbiAgICBBbmltYXRpb25EaXJlY3RpdmUsXHJcbiAgICBCYWNrZ3JvdW5kRGlyZWN0aXZlLFxyXG4gICAgQmFubmVyQ29udGVudEZpdERpcmVjdGl2ZSxcclxuICAgIEJvcmRlckRpcmVjdGl2ZSxcclxuICAgIEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSxcclxuICAgIENvbHVtbkRpcmVjdGl2ZURpcmVjdGl2ZSxcclxuICAgIENvbnRhaW5lckZpdERpcmVjdGl2ZSxcclxuICAgIHNpbXBvQ29uZXRlbkFsaWdubWVudERpcmVjdGl2ZSxcclxuICAgIENvbnRlbnRGaXREaXJlY3RpdmUsXHJcbiAgICBDb3JuZXJEaXJlY3RpdmUsXHJcbiAgICBTaW1wb0Zvb3RlckxheW91dERpcmVjdGl2ZSxcclxuICAgIEhvdmVyRGlyZWN0aXZlLFxyXG4gICAgSW1hZ2VEaXJlY3RpdmVEaXJlY3RpdmUsXHJcbiAgICBPdmVybGF5RGlyZWN0aXZlLFxyXG4gICAgUG9zaXRpb25MYXlvdXREaXJlY3RpdmVEaXJlY3RpdmUsXHJcbiAgICBUZXh0QmFja2dyb3VuZERpcmVjdGl2ZURpcmVjdGl2ZSxcclxuICAgIE9iamVjdFBvc2l0aW9uRGlyZWN0aXZlLFxyXG4gICAgQ29sb3JEaXJlY3RpdmUsXHJcbiAgICBUZXh0U2l6ZURpcmVjdGl2ZSxcclxuICAgIFNhbml0aXplSHRtbFBpcGVcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHBvaW50bWVudC1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXBwb2ludG1lbnQtZm9ybS5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwb2ludG1lbnRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24gaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBkYXRhPzogQmFubmVyU2VjdGlvbk1vZGVsO1xyXG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xyXG4gIGNvbnRlbnQ/OiBCYW5uZXJDb250ZW50TW9kZWw7XHJcbiAgQElucHV0KCkgZWRpdD86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZGVsZXRlPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBjdXN0b21DbGFzcz86IHN0cmluZztcclxuICBzdHlsZXM/OiBCYW5uZXJTdHlsZXNNb2RlbDtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfZXZlbnRTZXJ2aWNlOiBFdmVudHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtYXREaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgYXBwb2ludG1lbnRTZXJ2aWNlOiBSZXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgc25hY2tiYXI6IE1hdFNuYWNrQmFyXHJcblxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGJ1c2luZXNzSWQ6IGFueTtcclxuICBidXNpbmVzc05hbWU6IGFueTtcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuZGF0YSk7XHJcbiAgICB0aGlzLmRlbGV0ZVNlbGVjdGVkID0gdGhpcy5kZWxldGVcclxuICAgIHRoaXMuY29udGVudCA9IHRoaXMuZGF0YT8uY29udGVudDtcclxuICAgIHRoaXMuc3R5bGVzID0gdGhpcy5kYXRhPy5zdHlsZXM7XHJcbiAgICBpZiAoIXRoaXMuc3R5bGVzIHx8ICF0aGlzLmNvbnRlbnQpIHJldHVybjtcclxuICAgIHRoaXMuYnVzaW5lc3NJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYklkXCIpID8/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYnVzaW5lc3NJZFwiKSxcclxuICAgICAgdGhpcy5idXNpbmVzc05hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJOYW1lXCIpID8/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYnVzaW5lc3NOYW1lXCIpXHJcblxyXG5cclxuICAgIC8vIHRoaXMuZ2V0QWxsU2VydmljZXMoKTtcclxuICAgIC8vIHRoaXMuc3R5bGVzLmxheW91dC5iYW5uZXJJbWFnZURpc3BsYXkgPSB0aGlzLmNvbnRlbnQuaW1hZ2Uuc2hvd0ltYWdlO1xyXG4gICAgdGhpcy5nZXRBbGxMb2NhdGlvbnMoKTtcclxuXHJcbiAgfVxyXG4gIGdldCBzdHlsZXNMYXlvdXQoKSB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLnN0eWxlcz8ubGF5b3V0IH0gYXMgTGF5T3V0TW9kZWw7XHJcbiAgfVxyXG4gIGdldCBnZXRKdXN0aWZ5Q29udGVudCgpIHtcclxuICAgIHJldHVybiBcImp1c3RpZnktY29udGVudDogY2VudGVyICFpbXBvcnRhbnQ7XCI7XHJcbiAgfVxyXG4gIGdldCBjYW5NZXJnZU5hdmJhcigpIHtcclxuICAgIHJldHVybiB0aGlzLnN0eWxlcz8ubWVyZ2U7XHJcbiAgfVxyXG4gIGdldCBpc0JvcmRlcmxlc3NJbWFnZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnN0eWxlcz8uYm9yZGVyTGVzc0ltYWdlICYmICh0aGlzLnN0eWxlcz8ucG9zaXRpb25MYXlvdXQudmFsdWUgPT0gXCJsZWZ0XCIgfHwgdGhpcy5zdHlsZXM/LnBvc2l0aW9uTGF5b3V0LnZhbHVlID09IFwicmlnaHRcIik7XHJcbiAgfVxyXG4gIGdldCBnZXRQb3NpdGlvbkxheW91dCgpIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuc3R5bGVzPy5wb3NpdGlvbkxheW91dCB9IGFzIFBvc2l0aW9uTGF5b3V0TW9kYWw7XHJcbiAgfVxyXG5cclxuICBlZGl0U2VjdGlvbigpIHtcclxuXHJcbiAgICB0aGlzLl9ldmVudFNlcnZpY2UudG9nZ2xlRWRpdG9yRXZlbnQuZW1pdChmYWxzZSk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5fZXZlbnRTZXJ2aWNlLmVkaXRTZWN0aW9uLmVtaXQoeyBkYXRhOiB0aGlzLmRhdGEgfSk7XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuICBzdG9wUHJvcGFnYXRpb24oZXZlbnQ6IGFueSkge1xyXG5cclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgb3BlbmRhaWxvZ2JveCh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICB0aGlzLm1hdERpYWxvZy5vcGVuKHRlbXBsYXRlLFxyXG4gICAgICAvLyAge3dpZHRoOic1MDBweCd9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIGNsb3NlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG4gIGlzTW92ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBvbkZvY3VzKCkge1xyXG4gICAgdGhpcy5pc01vdmVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHJlc3RyaWN0Tm9uTnVtZXJpYyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgY29uc3QgY2hhckNvZGUgPSBldmVudC5jaGFyQ29kZTtcclxuICAgIGlmIChjaGFyQ29kZSAhPSAwKSB7XHJcbiAgICAgIC8vIEFsbG93IG9ubHkgbnVtYmVyc1xyXG4gICAgICBpZiAoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIG9uVXNlck5hbWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgcmVnZXggPSAvXlthLXpBLVpcXHNdKiQvO1xyXG4gICAgaWYgKCFyZWdleC50ZXN0KHZhbHVlKSkge1xyXG4gICAgICB0aGlzLkNyZWF0ZURhdGEuY2xpZW50TmFtZSA9IHZhbHVlLnJlcGxhY2UoL1teYS16QS1aXFxzXS9nLCAnJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLkNyZWF0ZURhdGEuY2xpZW50TmFtZSA9IHRoaXMudG9UaXRsZUNhc2UodmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9UaXRsZUNhc2Uoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHdcXFMqL2csIGZ1bmN0aW9uICh0eHQpIHtcclxuICAgICAgcmV0dXJuIHR4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHR4dC5zdWJzdHIoMSkudG9Mb3dlckNhc2UoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VydmljZURhdGE6IGFueTtcclxuICBzdGFmZkRhdGE6IGFueTtcclxuXHJcbiAgY2hhbmdlTG9jYXRpb24oKSB7XHJcbiAgICB0aGlzLmdldEFsbFNlcnZpY2VzKCk7XHJcbiAgICB0aGlzLmdldEFsbFN0YWZmKClcclxuICAgIHRoaXMudXBkYXRlTG9jYXRpb25UaW1pbmcoKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubG9jYXRpb25UaW1pbmcpXHJcbiAgfVxyXG5cclxuICB1cGRhdGVMb2NhdGlvblRpbWluZygpIHtcclxuICAgIHRoaXMubG9jYXRpb25UaW1pbmcgPSBbXTtcclxuICAgIGNvbnN0IGRheSA9IHRoaXMuZ2V0RGF5KCk7XHJcbiAgICBmb3IgKGxldCBsb2NhdGlvbiBvZiB0aGlzLmxvY2F0aW9uRGF0YSkge1xyXG4gICAgICBpZiAobG9jYXRpb24uaWQgPT09IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbikge1xyXG4gICAgICAgIGxldCBkYXRhID0gbG9jYXRpb24uc3RvcmVUaW1pbmdzW2RheS50b1VwcGVyQ2FzZSgpXTtcclxuICAgICAgICBpZiAoIWRhdGEuZGF5VHlwZSkge1xyXG4gICAgICAgICAgdGhpcy5zbmFja2Jhci5vcGVuKCdPcHBzIHNob3AgaXMgY2xvc2VkIG9uIHNlbGVjdGVkIGRhdGUnLCAnY2xvc2UnLCB7ZHVyYXRpb246IDIwMDB9KVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2NhdGlvblRpbWluZyA9IHRoaXMuZ2VuZXJhdGVUaW1lU2xvdHMoZGF0YS5zdGFydFRpbWUsIGRhdGEuZW5kVGltZSkgfHwgW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBnZXREYXkoKSB7XHJcbiAgICBjb25zdCBkYXlzT2ZXZWVrID0gW1wiU3VuZGF5XCIsIFwiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLCBcIlRodXJzZGF5XCIsIFwiRnJpZGF5XCIsIFwiU2F0dXJkYXlcIl07XHJcbiAgICByZXR1cm4gZGF5c09mV2Vla1t0aGlzLkNyZWF0ZURhdGEuc2NoZWR1bGVkRGF0ZS5nZXREYXkoKV07XHJcbiAgfVxyXG5cclxuICBnZXRBbGxTZXJ2aWNlcygpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlcyA9ICcnXHJcbiAgICB0aGlzLmFwcG9pbnRtZW50U2VydmljZS5nZXRBbGxTZXJ2aWNlKHRoaXMuYnVzaW5lc3NJZCwgMTAwMCwgMCwgdGhpcy5zZWxlY3RlZExvY2F0aW9uKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuZGF0YS5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIC8vIEZpbHRlciBzZXJ2aWNlcyB0byBvbmx5IGluY2x1ZGUgdGhvc2Ugd2l0aCBzdGF0dXMgJ0FDVElWRSdcclxuICAgICAgICAgIHRoaXMuc2VydmljZURhdGEgPSByZXMuZGF0YS5kYXRhLmZpbHRlcigoc2VydmljZTogYW55KSA9PiBzZXJ2aWNlLnN0YXR1cyA9PT0gJ0FDVElWRScpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnNlcnZpY2VEYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5zZXJ2aWNlRGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNuYWNrYmFyLm9wZW4oXHJcbiAgICAgICAgICAgICAgYE5vIGFjdGl2ZSBzZXJ2aWNlcyBhdmFpbGFibGUgZm9yIHRoaXMgYnVzaW5lc3MuYCxcclxuICAgICAgICAgICAgICAnQ2xvc2UnLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNuYWNrYmFyLm9wZW4oXHJcbiAgICAgICAgICAgIGBTZXJ2aWNlIGlzIG5vdCBjcmVhdGVkIHlldCB3aXRoIHRoaXMgYnVzaW5lc3NgLFxyXG4gICAgICAgICAgICAnQ2xvc2UnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBzZXJ2aWNlczpcIiwgZXJyb3IpOyAvLyBIYW5kbGUgZXJyb3JzIGdyYWNlZnVsbHlcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldEFsbFN0YWZmKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0YWZmID0gJydcclxuICAgIHRoaXMuQ3JlYXRlRGF0YS5zY2hlZHVsZWRUaW1lID0gJydcclxuICAgIHRoaXMuZ2V0QXZhaWxhYmxlU2xvdHMoKTtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRTZXJ2aWNlLmdldEFsbFN0YWZmQnlMb2NhdGlvbih0aGlzLmJ1c2luZXNzSWQsIDEwMDAsIDAsIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiwgdGhpcy5zZWxlY3RlZFNlcnZpY2VzKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuZGF0YS5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIC8vIEZpbHRlciBzZXJ2aWNlcyB0byBvbmx5IGluY2x1ZGUgdGhvc2Ugd2l0aCBzdGF0dXMgJ0FDVElWRSdcclxuICAgICAgICAgIHRoaXMuc3RhZmZEYXRhID0gcmVzLmRhdGEuZGF0YS5maWx0ZXIoKHN0YWZmOiBhbnkpID0+IHN0YWZmLnN0YXR1cyA9PT0gJ0FDVElWRScpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnN0YWZmRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuc3RhZmZEYXRhKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc25hY2tiYXIub3BlbihcclxuICAgICAgICAgICAgICBgTm8gYWN0aXZlIHN0YWZmIGF2YWlsYWJsZSBmb3IgdGhpcyBidXNpbmVzcy5gLFxyXG4gICAgICAgICAgICAgICdDbG9zZScsXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc25hY2tiYXIub3BlbihcclxuICAgICAgICAgICAgYFN0YWZmIGlzIG5vdCBjcmVhdGVkIHlldCB3aXRoIHRoaXMgYnVzaW5lc3NgLFxyXG4gICAgICAgICAgICAnQ2xvc2UnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBzdGFmZjpcIiwgZXJyb3IpOyAvLyBIYW5kbGUgZXJyb3JzIGdyYWNlZnVsbHlcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG1pbkRhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIGJvb2tlZFNsb3RzID0gbmV3IFNldCgpO1xyXG4gIGxvY2F0aW9uVGltaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBjaGFuZ2VEYXRlKCkge1xyXG4gICAgdGhpcy51cGRhdGVMb2NhdGlvblRpbWluZygpO1xyXG4gICAgdGhpcy5nZXRBdmFpbGFibGVTbG90cygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXZhaWxhYmxlU2xvdHMoKSB7XHJcbiAgICB0aGlzLmJvb2tlZFNsb3RzID0gbmV3IFNldCgpXHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgXCJsb2NhdGlvbklkXCI6IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbixcclxuICAgICAgXCJzZXJ2aWNlSWRcIjogdGhpcy5zZWxlY3RlZFNlcnZpY2VzLFxyXG4gICAgICBcInN0YWZmSWRcIjogdGhpcy5zZWxlY3RlZFN0YWZmLFxyXG4gICAgICBcImJ1c2luZXNzSWRcIjogdGhpcy5idXNpbmVzc0lkLFxyXG4gICAgICBcImFwcG9pbnRtZW50RGF0ZVwiOiB0aGlzLkNyZWF0ZURhdGEuc2NoZWR1bGVkRGF0ZVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXBwb2ludG1lbnRTZXJ2aWNlLmdldEF2YWlsYWJsZVNsb3RzKHBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgLy8gbGV0IHNlbGVjdGVkRGF0ZSA9IG1vbWVudCh0aGlzLkNyZWF0ZURhdGEuc2NoZWR1bGVkRGF0ZSkuZm9ybWF0KCdERC1NTS1ZWVlZJyk7O1xyXG4gICAgICAvLyBmb3IgKGxldCBzdGFmZiBvZiByZXMuZGF0YSkge1xyXG4gICAgICAvLyAgIGlmKCFzdGFmZi5ib29rZWRTbG90cz8uW3NlbGVjdGVkRGF0ZV0pe1xyXG4gICAgICAvLyAgICAgdGhpcy5ib29rZWRTbG90cyA9IG5ldyBTZXQoKTtcclxuICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gICBpZiAoc3RhZmY/LmJvb2tlZFNsb3RzPy5bc2VsZWN0ZWREYXRlXSkge1xyXG4gICAgICAvLyAgICAgZm9yIChsZXQgYXBwcG9pbnRtZW50IG9mIHN0YWZmPy5ib29rZWRTbG90cz8uW3NlbGVjdGVkRGF0ZV0pIHtcclxuICAgICAgLy8gICAgICAgY29uc3QgdGltZVNsb3RzID0gdGhpcy5nZXRUaW1lKGFwcHBvaW50bWVudC5hcHBvaW50bWVudFN0YXJ0VGltZSwgYXBwcG9pbnRtZW50LmFwcG9pbnRtZW50RW5kVGltZSwgMTUpO1xyXG4gICAgICAvLyAgICAgICB0aW1lU2xvdHMuc3BsaWNlKHRpbWVTbG90cy5sZW5ndGggLSAxLCAxKTtcclxuICAgICAgLy8gICAgICAgdGltZVNsb3RzPy5mb3JFYWNoKHNsb3QgPT4gdGhpcy5ib29rZWRTbG90cy5hZGQoc2xvdCkpO1xyXG4gICAgICAvLyAgICAgICAvLyB0aGlzLmJvb2tlZFNsb3RzID0gbmV3IFNldCh0aW1lU2xvdHMpO1xyXG4gICAgICAvLyAgICAgfVxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmJvb2tlZFNsb3RzKVxyXG4gICAgICAvLyB0aGlzLmdldEJvb2tlZFNsb3RzKHJlcyk7XHJcbiAgICAgIHRoaXMuZ2V0Qm9va2VkU2xvdHMocmVzKTtcclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0Qm9va2VkU2xvdHMocmVzOiBhbnkpIHtcclxuICAgIGxldCBzZWxlY3RlZERhdGUgPSBtb21lbnQodGhpcy5DcmVhdGVEYXRhLnNjaGVkdWxlZERhdGUpLmZvcm1hdCgnREQtTU0tWVlZWScpO1xyXG5cclxuICAgIGxldCBzbG90czogYW55W10gPSBbXTtcclxuICAgIGZvciAobGV0IHN0YWZmIG9mIHJlcy5kYXRhKSB7XHJcbiAgICAgIGlmICghc3RhZmYuYm9va2VkU2xvdHM/LltzZWxlY3RlZERhdGVdKSB7XHJcbiAgICAgICAgdGhpcy5ib29rZWRTbG90cyA9IG5ldyBTZXQoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNsb3RzLnB1c2goLi4uc3RhZmY/LmJvb2tlZFNsb3RzPy5bc2VsZWN0ZWREYXRlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2xvdHMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBjb25zdCBkYXRlQSA9IG5ldyBEYXRlKGEuYXBwb2ludG1lbnRTdGFydFRpbWUpLmdldFRpbWUoKTtcclxuICAgICAgY29uc3QgZGF0ZUIgPSBuZXcgRGF0ZShiLmFwcG9pbnRtZW50U3RhcnRUaW1lKS5nZXRUaW1lKCk7XHJcbiAgICAgIHJldHVybiBkYXRlQSAtIGRhdGVCOyAvLyBBc2NlbmRpbmcgb3JkZXJcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKHNsb3RzKTtcclxuXHJcbiAgICBsZXQgc3RhcnRUaW1lOiBEYXRlID0gbmV3IERhdGUoc2xvdHNbMF0uYXBwb2ludG1lbnRTdGFydFRpbWUpO1xyXG4gICAgbGV0IGVuZFRpbWU6IERhdGUgPSBuZXcgRGF0ZShzbG90c1swXS5hcHBvaW50bWVudEVuZFRpbWUpO1xyXG5cclxuICAgIGZvciAobGV0IGFwcHBvaW50bWVudCBvZiBzbG90cykge1xyXG5cclxuICAgICAgbGV0IGN1cnJlbnRTdGFydFRpbWU6IERhdGUgPSBuZXcgRGF0ZShhcHBwb2ludG1lbnQuYXBwb2ludG1lbnRTdGFydFRpbWUpO1xyXG4gICAgICBsZXQgY3VycmVudEVuZFRpbWU6IERhdGUgPSBuZXcgRGF0ZShhcHBwb2ludG1lbnQuYXBwb2ludG1lbnRFbmRUaW1lKTtcclxuXHJcbiAgICAgIGlmIChjdXJyZW50U3RhcnRUaW1lLmdldFRpbWUoKSA8PSBlbmRUaW1lLmdldFRpbWUoKSkge1xyXG4gICAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRTdGFydFRpbWUuZ2V0VGltZSgpID4gc3RhcnRUaW1lLmdldFRpbWUoKSA/IGN1cnJlbnRTdGFydFRpbWUgOiBzdGFydFRpbWU7XHJcbiAgICAgICAgZW5kVGltZSA9IGN1cnJlbnRFbmRUaW1lLmdldFRpbWUoKSA8IGVuZFRpbWUuZ2V0VGltZSgpID8gY3VycmVudEVuZFRpbWUgOiBlbmRUaW1lO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHRpbWVTbG90cyA9IHRoaXMuZ2V0VGltZShzdGFydFRpbWUudG9TdHJpbmcoKSwgZW5kVGltZS50b1N0cmluZygpLCAxNSk7XHJcbiAgICAgICAgdGltZVNsb3RzLnNwbGljZSh0aW1lU2xvdHMubGVuZ3RoIC0gMSwgMSk7XHJcbiAgICAgICAgdGltZVNsb3RzPy5mb3JFYWNoKHNsb3QgPT4gdGhpcy5ib29rZWRTbG90cy5hZGQoc2xvdCkpO1xyXG5cclxuICAgICAgICBzdGFydFRpbWUgPSBjdXJyZW50U3RhcnRUaW1lO1xyXG4gICAgICAgIGVuZFRpbWUgPSBjdXJyZW50RW5kVGltZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRpbWVTbG90cyA9IHRoaXMuZ2V0VGltZShzdGFydFRpbWUudG9TdHJpbmcoKSwgZW5kVGltZS50b1N0cmluZygpLCAxNSk7XHJcbiAgICB0aW1lU2xvdHMuc3BsaWNlKHRpbWVTbG90cy5sZW5ndGggLSAxLCAxKTtcclxuICAgIHRpbWVTbG90cz8uZm9yRWFjaChzbG90ID0+IHRoaXMuYm9va2VkU2xvdHMuYWRkKHNsb3QpKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmJvb2tlZFNsb3RzKTtcclxuICB9XHJcblxyXG4gIGdldFRpbWUoc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsIGludGVydmFsTWludXRlczogbnVtYmVyKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoc3RhcnQpO1xyXG4gICAgY29uc3QgZW5kRGF0ZSA9IG5ldyBEYXRlKGVuZCk7XHJcbiAgICBjb25zdCBzbG90czogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICB3aGlsZSAoc3RhcnREYXRlIDw9IGVuZERhdGUpIHtcclxuICAgICAgLy8gRm9ybWF0IHRoZSB0aW1lIGFzIG5lZWRlZCAoZS5nLiwgXCIwNToxNSBQTVwiKVxyXG4gICAgICBsZXQgaG91cnMgPSBzdGFydERhdGUuZ2V0SG91cnMoKTtcclxuICAgICAgY29uc3QgbWludXRlcyA9IHN0YXJ0RGF0ZS5nZXRNaW51dGVzKCk7XHJcbiAgICAgIGNvbnN0IHBlcmlvZCA9IGhvdXJzID49IDEyID8gJ1BNJyA6ICdBTSc7XHJcblxyXG4gICAgICAvLyBDb252ZXJ0IGhvdXJzIHRvIDEyLWhvdXIgZm9ybWF0IGFuZCBwYWQgd2l0aCAnMCcgaWYgbmVlZGVkXHJcbiAgICAgIGhvdXJzID0gKChob3VycyArIDExKSAlIDEyKSArIDE7XHJcbiAgICAgIGNvbnN0IGZvcm1hdHRlZEhvdXJzID0gaG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICBjb25zdCBmb3JtYXR0ZWRUaW1lID0gYCR7Zm9ybWF0dGVkSG91cnN9OiR7bWludXRlcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9ICR7cGVyaW9kfWA7XHJcblxyXG4gICAgICBzbG90cy5wdXNoKGZvcm1hdHRlZFRpbWUpO1xyXG5cclxuICAgICAgLy8gSW5jcmVtZW50IHRpbWUgYnkgdGhlIGludGVydmFsXHJcbiAgICAgIHN0YXJ0RGF0ZS5zZXRNaW51dGVzKHN0YXJ0RGF0ZS5nZXRNaW51dGVzKCkgKyBpbnRlcnZhbE1pbnV0ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzbG90cztcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlVGltZVNsb3RzKHN0YXJ0VGltZTogc3RyaW5nLCBlbmRUaW1lOiBzdHJpbmcpIHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhzdGFydFRpbWUsIGVuZFRpbWUpXHJcbiAgICB0aGlzLmF2YWlsYWJsZVRpbWVzID0gW107IC8vIENsZWFyIHByZXZpb3VzIHRpbWVzXHJcblxyXG4gICAgaWYgKCFzdGFydFRpbWUgfHwgIWVuZFRpbWUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIlN0YXJ0VGltZSBvciBFbmRUaW1lIGlzIHVuZGVmaW5lZDpcIiwgc3RhcnRUaW1lLCBlbmRUaW1lKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjb25zdCBbc3RhcnRIb3VyLCBzdGFydE1pbnV0ZSwgc3RhcnRQZXJpb2RdID0gdGhpcy5wYXJzZVRpbWUoc3RhcnRUaW1lKTtcclxuICAgIGNvbnN0IFtlbmRIb3VyLCBlbmRNaW51dGUsIGVuZFBlcmlvZF0gPSB0aGlzLnBhcnNlVGltZShlbmRUaW1lKTtcclxuXHJcbiAgICBsZXQgY3VycmVudEhvdXI6IG51bWJlciA9IHN0YXJ0SG91cjtcclxuICAgIGxldCBjdXJyZW50TWludXRlOiBudW1iZXIgPSBzdGFydE1pbnV0ZTtcclxuICAgIGxldCBjdXJyZW50UGVyaW9kID0gc3RhcnRQZXJpb2Q7XHJcblxyXG5cclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1hdHRlZEhvdXIgPSB0aGlzLnBhZFplcm8oY3VycmVudEhvdXIgPT09IDAgPyAxMiA6IGN1cnJlbnRIb3VyKTtcclxuICAgICAgY29uc3QgZm9ybWF0dGVkTWludXRlID0gdGhpcy5wYWRaZXJvKGN1cnJlbnRNaW51dGUpO1xyXG4gICAgICBjb25zdCB0aW1lU3RyaW5nID0gYCR7Zm9ybWF0dGVkSG91cn06JHtmb3JtYXR0ZWRNaW51dGV9ICR7Y3VycmVudFBlcmlvZH1gO1xyXG5cclxuICAgICAgdGhpcy5hdmFpbGFibGVUaW1lcy5wdXNoKHRpbWVTdHJpbmcpO1xyXG5cclxuICAgICAgLy8gSW5jcmVtZW50IHRpbWUgYnkgMTUgbWludXRlc1xyXG4gICAgICBjdXJyZW50TWludXRlICs9IDE1O1xyXG4gICAgICBpZiAoY3VycmVudE1pbnV0ZSA9PT0gNjApIHtcclxuICAgICAgICBjdXJyZW50TWludXRlID0gMDtcclxuICAgICAgICBjdXJyZW50SG91ciA9IChjdXJyZW50SG91ciAlIDEyKSArIDE7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50SG91ciA9PT0gMTIpIHtcclxuICAgICAgICAgIGN1cnJlbnRQZXJpb2QgPSBjdXJyZW50UGVyaW9kID09PSAnQU0nID8gJ1BNJyA6ICdBTSc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBTdG9wIHRoZSBsb29wIHdoZW4gcmVhY2hpbmcgdGhlIGVuZCB0aW1lXHJcbiAgICAgIGlmIChcclxuICAgICAgICBjdXJyZW50SG91ciA9PT0gZW5kSG91ciAmJlxyXG4gICAgICAgIGN1cnJlbnRNaW51dGUgPT09IGVuZE1pbnV0ZSAmJlxyXG4gICAgICAgIGN1cnJlbnRQZXJpb2QgPT09IGVuZFBlcmlvZFxyXG4gICAgICApIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlVGltZXM7XHJcbiAgfVxyXG5cclxuICBwYXJzZVRpbWUodGltZTogc3RyaW5nKTogW251bWJlciwgbnVtYmVyLCBzdHJpbmddIHtcclxuICAgIGlmICghdGltZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiVGltZSBpcyB1bmRlZmluZWQgb3IgbnVsbDpcIiwgdGltZSk7XHJcbiAgICAgIHJldHVybiBbMCwgMCwgJ0FNJ107IC8vIERlZmF1bHQgb3IgZmFsbGJhY2sgdmFsdWVzXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgW3RpbWVTdHJpbmcsIHBlcmlvZF0gPSB0aW1lLnNwbGl0KFwiIFwiKTtcclxuICAgIGNvbnN0IFtob3VyLCBtaW51dGVdID0gdGltZVN0cmluZy5zcGxpdChcIjpcIikubWFwKG51bSA9PiBwYXJzZUludChudW0sIDEwKSk7IC8vIEVuc3VyZXMgcGFyc2VkIGFzIG51bWJlcnNcclxuICAgIHJldHVybiBbaG91ciAlIDEyLCBtaW51dGUsIHBlcmlvZF07XHJcbiAgfVxyXG5cclxuXHJcbiAgbG9jYXRpb25EYXRhOiBhbnk7XHJcbiAgc2VsZWN0ZWRMb2NhdGlvbjogc3RyaW5nID0gXCJcIjtcclxuICBnZXRBbGxMb2NhdGlvbnMoKSB7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50U2VydmljZS5nZXRBbGxMb2NhdGlvbih0aGlzLmJ1c2luZXNzSWQsIDEwMDAsIDApLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5kYXRhLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5sb2NhdGlvbkRhdGEgPSByZXMuZGF0YS5kYXRhLmZpbHRlcigoc2VydmljZTogYW55KSA9PiBzZXJ2aWNlLnN0YXR1cyA9PT0gJ0FDVElWRScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc25hY2tiYXIub3BlbihcclxuICAgICAgICAgICAgYExvY2F0aW9uIGlzIG5vdCBjcmVhdGVkIHlldCB3aXRoIHRoaXMgYnVzaW5lc3NgLFxyXG4gICAgICAgICAgICAnQ2xvc2UnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIHNlcnZpY2VzOlwiLCBlcnJvcik7IC8vIEhhbmRsZSBlcnJvcnMgZ3JhY2VmdWxseVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XHJcbiAgfVxyXG5cclxuICAvLyBWYXJpYWJsZXNcclxuICBmb3JtYXR0ZWREYXRlOiBhbnk7XHJcbiAgdGltZVNsb3RzRGF0YTogYW55O1xyXG4gIGZvcm1hdHRlZFRpbWVJbnRlcnZhbHM6IHsgc3RhcnRUaW1lOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gIC8vIEZ1bmN0aW9uIHRvIGdldCB0aW1lIHNsb3RzXHJcbiAgZ2V0VGltZVNsb3RzKCkge1xyXG4gICAgdGhpcy5mb3JtYXR0ZWREYXRlID0gdGhpcy5mb3JtYXREYXRlKG5ldyBEYXRlKHRoaXMuQ3JlYXRlRGF0YS5zY2hlZHVsZWREYXRlKSk7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50U2VydmljZS5nZXRBbGxUaW1lU2xvdHModGhpcy5zZWxlY3RlZExvY2F0aW9uLCB0aGlzLmZvcm1hdHRlZERhdGUpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgdGhpcy50aW1lU2xvdHNEYXRhID0gcmVzO1xyXG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWRUaW1lSW50ZXJ2YWxzID0gdGhpcy50aW1lU2xvdHNEYXRhLm1hcCgoaW50ZXJ2YWw6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgc3RhcnRUaW1lOiBpbnRlcnZhbC5zdGFydFRpbWUuc2xpY2UoMCwgNSksIC8vIEdldCBISDpNTVxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJUaW1lU2xvdHMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zbmFja2Jhci5vcGVuKFxyXG4gICAgICAgICAgICBgTG9jYXRpb24gaXMgbm90IGNyZWF0ZWQgeWV0IHdpdGggdGhpcyBidXNpbmVzc2AsXHJcbiAgICAgICAgICAgICdDbG9zZScsXHJcbiAgICAgICAgICAgIHsgZHVyYXRpb246IDE1MDAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBzZXJ2aWNlczpcIiwgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gRnVuY3Rpb24gdG8gZmlsdGVyIHRpbWUgc2xvdHNcclxuICBmaWx0ZXJUaW1lU2xvdHMoKSB7XHJcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gbmV3IERhdGUodGhpcy5DcmVhdGVEYXRhLnNjaGVkdWxlZERhdGUpO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBkYXRlIGlzIHRvZGF5XHJcbiAgICBpZiAoc2VsZWN0ZWREYXRlLnRvRGF0ZVN0cmluZygpID09PSBub3cudG9EYXRlU3RyaW5nKCkpIHtcclxuICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBub3cuZ2V0SG91cnMoKSAqIDYwICsgbm93LmdldE1pbnV0ZXMoKTtcclxuXHJcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHRpbWUgc2xvdHMgdGhhdCBhcmUgYmVmb3JlIHRoZSBjdXJyZW50IHRpbWVcclxuICAgICAgdGhpcy5mb3JtYXR0ZWRUaW1lSW50ZXJ2YWxzID0gdGhpcy5mb3JtYXR0ZWRUaW1lSW50ZXJ2YWxzLmZpbHRlcih0aW1lU2xvdCA9PiB7XHJcbiAgICAgICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHRpbWVTbG90LnN0YXJ0VGltZS5zcGxpdCgnOicpLm1hcChOdW1iZXIpO1xyXG4gICAgICAgIGNvbnN0IHNsb3RUaW1lID0gaG91cnMgKiA2MCArIG1pbnV0ZXM7IC8vIENvbnZlcnQgc2xvdCB0aW1lIHRvIHRvdGFsIG1pbnV0ZXNcclxuICAgICAgICByZXR1cm4gc2xvdFRpbWUgPiBjdXJyZW50VGltZTsgLy8gT25seSBzaG93IHNsb3RzIGFmdGVyIHRoZSBjdXJyZW50IHRpbWVcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkYXRlRmlsdGVyID0gKGRhdGU6IERhdGUgfCBudWxsKTogYm9vbGVhbiA9PiB7XHJcbiAgICBjb25zdCBkYXkgPSBkYXRlPy5nZXREYXkoKTtcclxuICAgIC8vIERpc2FibGUgU3VuZGF5c1xyXG4gICAgcmV0dXJuIGRheSAhPT0gMDtcclxuICB9O1xyXG5cclxuICBzZWxlY3RlZFNlcnZpY2VzOiBzdHJpbmcgPSAnJztcclxuICBzZWxlY3RlZFN0YWZmOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgQ3JlYXRlRGF0YTogYW55ID0ge1xyXG4gICAgLy9hcHBvaW50bWVudElkOiBcIlwiLFxyXG4gICAgYnVzaW5lc3M6IHtcclxuICAgICAgaWQ6IFwiXCIsXHJcbiAgICAgIG5hbWU6IFwiXCJcclxuICAgIH0sXHJcbiAgICBjbGllbnROYW1lOiBcIlwiLFxyXG4gICAgbW9iaWxlOiBcIlwiLFxyXG4gICAgc2NoZWR1bGVkRGF0ZTogbmV3IERhdGUoKSxcclxuICAgIHNlcnZpY2VzOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogXCJcIixcclxuICAgICAgICBuYW1lOiBcIlwiXHJcbiAgICAgIH1cclxuICAgIF0sXHJcbiAgICBzdGFmZjogW1xyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6IFwiXCIsXHJcbiAgICAgICAgbmFtZTogXCJcIlxyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgbG9jYXRpb246XHJcbiAgICB7XHJcbiAgICAgIGlkOiBcIlwiLFxyXG4gICAgICBuYW1lOiBcIlwiXHJcbiAgICB9XHJcbiAgICAsXHJcbiAgICBzY2hlZHVsZWRUaW1lOiBcIlwiLFxyXG4gICAgbWVzc2FnZTogXCJcIlxyXG4gIH1cclxuXHJcbiAgcHJlcGFyZUNyZWF0ZURhdGEoKSB7XHJcbiAgICB0aGlzLkNyZWF0ZURhdGEuc2VydmljZXMgPSBbXTtcclxuICAgIHRoaXMuQ3JlYXRlRGF0YS5zdGFmZiA9IFtdO1xyXG4gICAgdGhpcy5zZXJ2aWNlRGF0YS5mb3JFYWNoKChzZXJ2aWNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlLmlkKSkge1xyXG4gICAgICAgIHRoaXMuQ3JlYXRlRGF0YS5zZXJ2aWNlcy5wdXNoKHtcclxuICAgICAgICAgIGlkOiBzZXJ2aWNlLmlkLFxyXG4gICAgICAgICAgbmFtZTogc2VydmljZS5uYW1lXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnN0YWZmRGF0YS5mb3JFYWNoKChzdGFmZjogYW55KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkU3RhZmYuaW5jbHVkZXMoc3RhZmYuaWQpKSB7XHJcbiAgICAgICAgdGhpcy5DcmVhdGVEYXRhLnN0YWZmLnB1c2goe1xyXG4gICAgICAgICAgaWQ6IHN0YWZmLmlkLFxyXG4gICAgICAgICAgbmFtZTogc3RhZmYubmFtZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJlcGFyZUxvY2F0aW9uRGF0YSgpIHtcclxuXHJcbiAgICB0aGlzLmxvY2F0aW9uRGF0YS5mb3JFYWNoKChsb2NhdGlvbjogYW55KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkTG9jYXRpb24gPT0gbG9jYXRpb24uaWQpIHtcclxuICAgICAgICB0aGlzLkNyZWF0ZURhdGEubG9jYXRpb24uaWQgPSBsb2NhdGlvbi5pZFxyXG4gICAgICAgIHRoaXMuQ3JlYXRlRGF0YS5sb2NhdGlvbi5uYW1lID0gbG9jYXRpb24ubmFtZVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlTG9hZGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgYXZhaWxhYmxlVGltZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHBhZFplcm8odmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWUgPCAxMCA/IGAwJHt2YWx1ZX1gIDogYCR7dmFsdWV9YDtcclxuICB9XHJcbiAgaXNUaW1lR3JlYXRlclRoYW5DdXJyZW50KHRpbWU6IHN0cmluZywgY3VycmVudEhvdXI6IG51bWJlciwgY3VycmVudE1pbnV0ZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBbaG91ciwgbWludXRlXSA9IHRpbWUuc3BsaXQoJzonKS5tYXAoTnVtYmVyKTtcclxuICAgIHJldHVybiAoaG91ciA+IGN1cnJlbnRIb3VyKSB8fCAoaG91ciA9PT0gY3VycmVudEhvdXIgJiYgbWludXRlID49IGN1cnJlbnRNaW51dGUpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlQXBwb2ludG1lbnQoKSB7XHJcbiAgICB0aGlzLnByZXBhcmVDcmVhdGVEYXRhKCk7XHJcbiAgICB0aGlzLnByZXBhcmVMb2NhdGlvbkRhdGEoKTtcclxuICAgIHRoaXMuQ3JlYXRlRGF0YS5idXNpbmVzcy5pZCA9IHRoaXMuYnVzaW5lc3NJZDtcclxuICAgIHRoaXMuQ3JlYXRlRGF0YS5idXNpbmVzcy5uYW1lID0gdGhpcy5idXNpbmVzc05hbWU7XHJcblxyXG4gICAgaWYgKHRoaXMuQ3JlYXRlRGF0YS5zY2hlZHVsZWREYXRlKSB7XHJcbiAgICAgIHRoaXMuQ3JlYXRlRGF0YS5zY2hlZHVsZWREYXRlID0gbW9tZW50KHRoaXMuQ3JlYXRlRGF0YS5zY2hlZHVsZWREYXRlKS5mb3JtYXQoJ0RELU1NLVlZWVknKTtcclxuICAgIH1cclxuICAgIHRoaXMuQ3JlYXRlRGF0YS5zY2hlZHVsZWRUaW1lID0gdGhpcy5DcmVhdGVEYXRhLnNjaGVkdWxlZFRpbWUudG9Mb3dlckNhc2UoKVxyXG4gICAgdGhpcy5jcmVhdGVMb2FkZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5hcHBvaW50bWVudFNlcnZpY2UuY3JlYXRlQXBwb2ludG1lbnQodGhpcy5DcmVhdGVEYXRhKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUxvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc25hY2tiYXIub3BlbihcclxuICAgICAgICAgIGBBcHBvaW50bWVudCBpcyBDcmVhdGVkYCxcclxuICAgICAgICAgICdDbG9zZScsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcblxyXG4gICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNuYWNrYmFyLm9wZW4oXHJcbiAgICAgICAgICBgSW50ZXJuYWwgU2VydmVyIEVycm9yYCxcclxuICAgICAgICAgICdDbG9zZScsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBDcmVhdGlvbjpcIiwgZXJyb3IpOyAvLyBIYW5kbGUgZXJyb3JzIGdyYWNlZnVsbHlcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgfVxyXG5cclxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkNyZWF0ZURhdGEuY2xpZW50TmFtZSAhPT0gJycgJiZcclxuICAgICAgdGhpcy5DcmVhdGVEYXRhLm1vYmlsZSAhPT0gJycgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2VzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uICE9PSAnJyAmJlxyXG4gICAgICB0aGlzLkNyZWF0ZURhdGEuc2NoZWR1bGVkRGF0ZSAhPT0gJycgJiZcclxuICAgICAgdGhpcy5DcmVhdGVEYXRhLnNjaGVkdWxlZFRpbWUgIT09ICcnXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgW2lkXT1cImRhdGE/LmlkXCJcclxuICBbbmdDbGFzc109XCJ7J21lcmdlTmF2YmFyJzogY2FuTWVyZ2VOYXZiYXIgJiYgaW5kZXggPT0gMSwgJ2p1c3RpZnktY29udGVudC1iZXR3ZWVuIGQtZmxleCc6IGlzQm9yZGVybGVzc0ltYWdlfVwiXHJcbiAgW3NpbXBvQmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmRcIiBjbGFzcz1cInRvdGFsLWNvbnRhaW5lclwiIHN0eWxlPVwib3ZlcmZsb3cteDogaGlkZGVuO1wiIHNpbXBvSG92ZXJcclxuICAoaG92ZXJpbmcpPVwic2hvd0VkaXRUYWJzKCRldmVudClcIiBbYXR0ci5zdHlsZV09XCJjdXN0b21DbGFzc1wiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJJbWFnZVNlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cclxuICA8ZGl2IGNsYXNzPVwicHgtNCBweS01XCIgW25nQ2xhc3NdPVwieydjb2wtbGctNiBjb2wteHhsLTYnOiBpc0JvcmRlcmxlc3NJbWFnZSwgJ3ctMTAwIGNvbC14eGwtOCc6ICFpc0JvcmRlcmxlc3NJbWFnZX1cIlxyXG4gICAgW2lkXT1cImRhdGE/LmlkXCIgI21haW5Db250YWluZXIgW3NpbXBvT3ZlcmxheV09XCJzdHlsZXM/LmJhY2tncm91bmRcIiBbc2ltcG9Cb3JkZXJdPVwic3R5bGVzPy5ib3JkZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZy01IGp1c3RpZnktY29udGVudC1zdGFydFwiIFtpZF09XCJkYXRhPy5pZFwiIFtzaW1wb0FuaW1hdGlvbl09XCJzdHlsZXM/LmFuaW1hdGlvblwiXHJcbiAgICAgIFtzaW1wb0xheW91dF09XCJzdHlsZXM/LmxheW91dFwiIFtzaW1wb1Bvc2l0aW9uTGF5b3V0RGlyZWN0aXZlXT1cInN0eWxlcz8ucG9zaXRpb25MYXlvdXRcIlxyXG4gICAgICBbbmdDbGFzc109XCJ7ICdhbGlnbi1pdGVtcy1zdHJldGNoJzogc3R5bGVzPy5wb3NpdGlvbkxheW91dD8udmFsdWUgPT09ICdsZWZ0JyB8fCBzdHlsZXM/LnBvc2l0aW9uTGF5b3V0Py52YWx1ZSA9PT0gJ3JpZ2h0JywgJ2ZsZXgtbGctcm93JzogdHJ1ZSB9XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTAgY29sLXNtLTggY29sLWxnLTZcIiAqbmdJZj1cImNvbnRlbnQ/LmltYWdlPy5zaG93SW1hZ2UgJiYgIWlzQm9yZGVybGVzc0ltYWdlXCJcclxuICAgICAgICBbc2ltcG9Db250YWluZXJBbGlnbm1lbnRdPVwic3R5bGVzTGF5b3V0XCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIFtzcmNdPVwiY29udGVudD8uaW1hZ2U/LnVybFwiIFtzaW1wb0ltYWdlRGlyZWN0aXZlXT1cInN0eWxlcz8uaW1hZ2VcIiBbaWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgICAgICAgW3NpbXBvT2JqZWN0UG9zaXRpb25dPVwiY29udGVudD8uaW1hZ2U/LnBvc2l0aW9uXCIgW3NpbXBvQ29ybmVyXT1cInN0eWxlcz8uY29ybmVyc1wiXHJcbiAgICAgICAgICBbY2xhc3NdPVwiZGF0YT8uaWQrKGNvbnRlbnQ/LmltYWdlPy5pZCB8fCAnJylcIiBjbGFzcz1cImQtYmxvY2sgdy0xMDAgaW5zaWRlSW1nXCIgc3R5bGU9XCJvYmplY3QtZml0OiBjb3ZlcjtcIlxyXG4gICAgICAgICAgW2FsdF09XCJjb250ZW50Py5pbWFnZT8uYWx0VGV4dFwiIHdpZHRoPVwiNzAwXCIgaGVpZ2h0PVwiNTAwXCIgbG9hZGluZz1cImxhenlcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgZ2FwLTE1XCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2NvbC1sZy0xMic6IGlzQm9yZGVybGVzc0ltYWdlLCAnY29sLWxnLTYnOiAhaXNCb3JkZXJsZXNzSW1hZ2V9XCJcclxuICAgICAgICBbc2ltcG9Db250YWluZXJBbGlnbm1lbnRdPVwic3R5bGVzTGF5b3V0XCIgW2lkXT1cImRhdGE/LmlkXCIgW3NpbXBvQ29udGVudEFsaWdubWVudF09XCJzdHlsZXM/LmNvbnRlbnRBbGlnbm1lbnRcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbnRlbnQ/LmlucHV0VGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cIml0ZW0udmFsdWUgfCBzYW5pdGl6ZUh0bWxcIiBjbGFzcz1cInRleHQtZWxlbWVudFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIml0ZW0ubGFiZWwgPT09ICdIZWFkaW5nJyA/ICdoZWFkaW5nLWxhcmdlIGxoLTIgbWItMycgOiAnYm9keS1sYXJnZSdcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbnRlbnQ/Lmxpc3RJdGVtPy5kYXRhXCIgY2xhc3M9XCJjYXJkZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkX3dyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lcl9jYXJkIHZpc2libGVcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vjb25kLXBhcnQtY2FyZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpcnN0LXBhcnQtY2FyZFwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIml0ZW0uaW5wdXRUZXh0WzBdLmxhYmVsPT09ICdIZWFkaW5nJyA/ICdoZWFkaW5nLWxhcmdlIGxoLTIgbWItMycgOiAnYm9keS1sYXJnZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIGNsYXNzPVwidGljay1pbWdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHNyYz1cImh0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvOTMzOTk3YzE3MTg3OTAzMDMxMjc5MDc1OThjMTY5NjA2MzA2MTkwMGdyZWVuX3ZlcmlmaWVkX2ltYWdlLnBuZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwic29tZXRoaW5nXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uaW5wdXRUZXh0WzBdLnZhbHVlIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YT8uYWN0aW9uICYmIGRhdGE/LmFjdGlvbj8uZGlzcGxheVwiIGNsYXNzPVwiYnV0dG9uLWRpc3BsYXlcIlxyXG4gICAgICAgICAgW3NpbXBvQ29udGFpbmVyQWxpZ25tZW50XT1cInN0eWxlc0xheW91dFwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGRhdGE/LmFjdGlvbj8uYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8YXBwLWJ1dHRvbi1lbGVtZW50IFtidXR0b25Db250ZW50XT1cImJ1dHRvbi5jb250ZW50XCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbi5zdHlsZXNcIiBbYnV0dG9uSWRdPVwiYnV0dG9uLmlkXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbmRhaWxvZ2JveChkaWFsb2dCb3gpXCIgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj48L2FwcC1idXR0b24tZWxlbWVudD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8IS0tIDxkaXYgc3R5bGU9XCIgd2lkdGg6IDEwMCU7IGhlaWdodDogNTAwcHg7XCI+XHJcbiAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgIHNyYz1cIi4uLy4uL2Fzc2V0cy9kaXZpZGVyLnN2Z1wiIHN0eWxlPVwiY2xpcC1wYXRoOiBwb2x5Z29uKDAgNTUlLCAxMDAlIDAsIDEwMCUgMTAwJSwgMCUgMTAwJSk7IGJhY2tncm91bmQtY29sb3I6IHJlZDtcIj5cclxuICA8L2Rpdj4gLS0+XHJcbiAgPGRpdiBbbmdDbGFzc109XCJ7J2hvdmVyX2VmZmVjdCc6IGVkaXQgJiYgZmFsc2UgfVwiICpuZ0lmPVwic2hvd0VkaXRvcnNcIj5cclxuICAgIDxzaW1wby1ob3Zlci1lbGVtZW50cyBbZGF0YV09XCJkYXRhXCIgW2luZGV4XT1cImluZGV4XCIgW2VkaXRPcHRpb25zXT1cImVkaXRcIlxyXG4gICAgICBbaXNNZXJnZWRdPVwic3R5bGVzPy5tZXJnZSA/PyBmYWxzZVwiPjwvc2ltcG8taG92ZXItZWxlbWVudHM+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cInNob3dEZWxldGVcIiBbbmdDbGFzc109XCJ7J2hvdmVyX2VmZmVjdCc6IGRlbGV0ZX1cIj5cclxuICAgIDxzaW1wby1kZWxldGUtaG92ZXItZWxlbWVudCBbZGF0YV09XCJkYXRhXCIgW2luZGV4XT1cImluZGV4XCI+PC9zaW1wby1kZWxldGUtaG92ZXItZWxlbWVudD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxuZy10ZW1wbGF0ZSAjSW1hZ2VTZWN0aW9uPlxyXG4gIDxkaXYgY2xhc3M9XCJjb2wtMTAgY29sLXNtLTggY29sLWxnLTZcIlxyXG4gICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IHN0eWxlcz8ucG9zaXRpb25MYXlvdXQ/LnZhbHVlID09PSAncmlnaHQnID8gJ2ZpdC1jb250ZW50JyA6ICcnfVwiXHJcbiAgICBzdHlsZT1cInBhZGRpbmc6IDBweCAhaW1wb3J0YW50O1wiICpuZ0lmPVwiY29udGVudD8uaW1hZ2U/LnNob3dJbWFnZSAmJiBpc0JvcmRlcmxlc3NJbWFnZTtcIlxyXG4gICAgW3NpbXBvQm9yZGVybGVzc109XCJnZXRQb3NpdGlvbkxheW91dFwiPlxyXG4gICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIFtzcmNdPVwiY29udGVudD8uaW1hZ2U/LnVybFwiIGNsYXNzPVwiZC1ibG9jayBpbWctZmx1aWQgaC0xMDAgdy0xMDBcIlxyXG4gICAgICBbYWx0XT1cImNvbnRlbnQ/LmltYWdlPy5hbHRUZXh0XCIgd2lkdGg9XCI3MDBcIiBoZWlnaHQ9XCI1MDBcIiBsb2FkaW5nPVwibGF6eVwiIC8+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPCEtLSBEaWFsb2cgdGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGlhbG9nQm94IGNsYXNzPVwiZGlhbG9nYm94XCI+XHJcbiAgPGRpdiBjbGFzcz1cImFwcG9pbnRtZW50LWZvcm1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItc2VjdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnQtc2lkZVwiPlxyXG4gICAgICAgIDxoMiBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7XCI+Qm9vayBhbiBBcHBvaW50bWVudDwvaDI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0LXNpZGVcIj5cclxuICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGZvcm0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJuYW1lLW1vYmlsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXRleHRcIj5OYW1lPC9kaXY+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRTdHlsZVwiIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiRW50ZXIgWW91ciBOYW1lXCIgcGF0dGVybj1cIlthLXpBLVogXSpcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiQ3JlYXRlRGF0YS5jbGllbnROYW1lXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Vc2VyTmFtZUNoYW5nZSgkZXZlbnQpXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNmdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtdGV4dFwiPk1vYmlsZSBOdW1iZXI8L2Rpdj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImlucHV0U3R5bGVcIiBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIkVudGVyIFlvdXIgTW9iaWxlIE51bWJlclwiXHJcbiAgICAgICAgICAgICAgcGF0dGVybj1cIl5bMC05XXsxMCwxNX0kXCIgbWF4bGVuZ3RoPVwiMTVcIiAoZm9jdXMpPVwib25Gb2N1cygpXCIgKGtleXByZXNzKT1cInJlc3RyaWN0Tm9uTnVtZXJpYygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIkNyZWF0ZURhdGEubW9iaWxlXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibmFtZS1tb2JpbGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Z1bGwtd2lkdGhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC10ZXh0XCI+TG9jYXRpb248L2Rpdj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cImlucHV0U3R5bGVcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBMb2NhdGlvblwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRMb2NhdGlvblwiIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUxvY2F0aW9uKClcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbG9jYXRpb24gb2YgbG9jYXRpb25EYXRhXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwibG9jYXRpb24uaWRcIj5cclxuICAgICAgICAgICAgICAgICAge3sgbG9jYXRpb24ubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXRleHRcIj5TZXJ2aWNlPC9kaXY+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgY2xhc3M9XCJpbnB1dFN0eWxlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgU2VydmljZVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRTZXJ2aWNlc1wiIChuZ01vZGVsQ2hhbmdlKT1cImdldEFsbFN0YWZmKClcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VydmljZSBvZiBzZXJ2aWNlRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInNlcnZpY2UuaWRcIj5cclxuICAgICAgICAgICAgICAgICAge3sgc2VydmljZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm5hbWUtbW9iaWxlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNmdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtdGV4dFwiPlN0YWZmPC9kaXY+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgY2xhc3M9XCJpbnB1dFN0eWxlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgU3RhZmZcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU3RhZmZcIiAgKG5nTW9kZWxDaGFuZ2UpPVwiZ2V0QXZhaWxhYmxlU2xvdHMoKVwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdGFmZiBvZiBzdGFmZkRhdGFcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJzdGFmZi5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBzdGFmZi5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm5hbWUtbW9iaWxlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNmdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtdGV4dFwiPkRhdGU8L2Rpdj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFN0eWxlXCIgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgRGF0ZVwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJDcmVhdGVEYXRhLnNjaGVkdWxlZERhdGVcIiAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VEYXRlKClcIiBbbWluXT1cIm1pbkRhdGVcIlxyXG4gICAgICAgICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cImRhdGVGaWx0ZXJcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+XHJcbiAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0SWNvblN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNmdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtdGV4dFwiPlRpbWU8L2Rpdj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cImlucHV0U3R5bGVcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBMb2NhdGlvblwiIFsobmdNb2RlbCldPVwiQ3JlYXRlRGF0YS5zY2hlZHVsZWRUaW1lXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB0aW1lIG9mIGxvY2F0aW9uVGltaW5nXCIgW3ZhbHVlXT1cInRpbWVcIiBbZGlzYWJsZWRdPVwiYm9va2VkU2xvdHMuaGFzKHRpbWUpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyB0aW1lIH19XHJcbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZnVsbC1tZXNzYWdlLXNlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnVzaW5lc3MtZmllbGQtc2VjdGlvblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXRleHRcIj5NZXNzYWdlPC9kaXY+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRTdHlsZVwiIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiRW50ZXIgWW91ciBOYW1lXCIgcGF0dGVybj1cIlthLXpBLVogXSpcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiQ3JlYXRlRGF0YS5tZXNzYWdlXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLXNlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXNlY3Rpb25cIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJib29raW5nLWJ1dHRvblwiIFtkaXNhYmxlZF09XCJpc0Zvcm1WYWxpZCgpXCIgKGNsaWNrKT1cImNyZWF0ZUFwcG9pbnRtZW50KClcIj5cclxuICAgICAgICAgICAgQm9vayBBcHBvaW50bWVudFxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8L2Zvcm0+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==