@senior-gestao-relacionamento/angular-components 2.0.0-master-d6f488bf → 2.0.0-master-d4967c15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,8 +8,9 @@ import { DividerModule } from 'primeng/divider';
8
8
  import { TooltipModule } from 'primeng/tooltip';
9
9
  import { ConfirmDialogModule } from 'primeng/confirmdialog';
10
10
  import { ConfirmationService } from 'primeng/api';
11
+ import { TableModule } from 'primeng/table';
11
12
  // Components AI
12
- import { TranslatePipe } from '@seniorsistemas/components-ai';
13
+ import { TranslatePipe, LoadingComponent } from '@seniorsistemas/components-ai';
13
14
  import { SchedulePriority } from '../models/schedule.enums';
14
15
  import * as i0 from "@angular/core";
15
16
  import * as i1 from "@seniorsistemas/components-ai";
@@ -19,12 +20,15 @@ import * as i4 from "primeng/dialog";
19
20
  import * as i5 from "primeng/button";
20
21
  import * as i6 from "primeng/tag";
21
22
  import * as i7 from "primeng/divider";
22
- import * as i8 from "primeng/confirmdialog";
23
+ import * as i8 from "primeng/tooltip";
24
+ import * as i9 from "primeng/confirmdialog";
25
+ import * as i10 from "primeng/table";
23
26
  export class ScheduleDetailComponent {
24
27
  t;
25
28
  confirmationService;
26
29
  visible = false;
27
30
  schedule = null;
31
+ loading = false;
28
32
  showAcceptButton = false;
29
33
  showRejectButton = false;
30
34
  showCancelButton = false;
@@ -38,7 +42,7 @@ export class ScheduleDetailComponent {
38
42
  this.confirmationService = confirmationService;
39
43
  }
40
44
  get dialogHeader() {
41
- return this.schedule?.name ?? this.t.translate('sr.schedule.schedule_details');
45
+ return this.schedule?.name ?? this.t.translate('crmx.components.schedule_details');
42
46
  }
43
47
  closeDialog() {
44
48
  this.visible = false;
@@ -51,66 +55,49 @@ export class ScheduleDetailComponent {
51
55
  }
52
56
  }
53
57
  acceptSchedule() {
54
- if (!this.schedule)
58
+ if (!this.schedule) {
55
59
  return;
56
- this.confirmAction('sr.schedule.confirm_accept', 'pi pi-question-circle', 'accept');
60
+ }
61
+ this.onAction.emit({ type: 'accept', schedule: this.schedule });
57
62
  }
58
63
  rejectSchedule() {
59
- if (!this.schedule)
64
+ if (!this.schedule) {
60
65
  return;
61
- this.confirmAction('sr.schedule.confirm_reject', 'pi pi-exclamation-triangle', 'reject');
66
+ }
67
+ this.onAction.emit({ type: 'reject', schedule: this.schedule });
62
68
  }
63
69
  cancelSchedule() {
64
- if (!this.schedule)
70
+ if (!this.schedule) {
65
71
  return;
66
- this.confirmAction('sr.schedule.confirm_cancel', 'pi pi-exclamation-triangle', 'cancel');
72
+ }
73
+ this.onAction.emit({ type: 'cancel', schedule: this.schedule });
67
74
  }
68
75
  deleteSchedule() {
69
- if (!this.schedule)
76
+ if (!this.schedule) {
70
77
  return;
71
- this.confirmAction('sr.schedule.confirm_delete', 'pi pi-exclamation-triangle', 'delete');
72
- }
73
- confirmAction(messageKey, icon, type) {
78
+ }
74
79
  this.confirmationService.confirm({
75
- message: this.t.translate(messageKey),
76
- header: this.t.translate('sr.schedule.confirmation'),
77
- icon,
78
- acceptLabel: this.t.translate('sr.schedule.yes'),
79
- rejectLabel: this.t.translate('sr.schedule.no'),
80
+ message: this.t.translate('crmx.components.delete_confirm'),
81
+ header: this.t.translate('crmx.components.confirm_delete'),
82
+ icon: 'pi pi-exclamation-triangle',
83
+ acceptLabel: this.t.translate('crmx.components.yes'),
84
+ rejectLabel: this.t.translate('crmx.components.no'),
80
85
  accept: () => {
81
86
  if (this.schedule) {
82
- this.onAction.emit({ type, schedule: this.schedule });
87
+ this.onAction.emit({ type: 'delete', schedule: this.schedule });
83
88
  }
84
89
  }
85
90
  });
86
91
  }
87
- formatDate(date) {
88
- if (!date) {
89
- return this.t.translate('sr.schedule.not_informed');
90
- }
91
- try {
92
- const dateObj = new Date(date);
93
- if (isNaN(dateObj.getTime())) {
94
- return this.t.translate('sr.schedule.invalid_date');
95
- }
96
- return dateObj.toLocaleString('pt-BR', {
97
- day: '2-digit', month: '2-digit', year: 'numeric',
98
- hour: '2-digit', minute: '2-digit'
99
- });
100
- }
101
- catch {
102
- return this.t.translate('sr.schedule.invalid_date');
103
- }
104
- }
105
92
  getPriorityLabel(priority) {
106
93
  if (!priority) {
107
- return this.t.translate('sr.schedule.not_informed');
94
+ return '';
108
95
  }
109
96
  const labels = {
110
- [SchedulePriority.Low]: this.t.translate('sr.schedule.priority_low'),
111
- [SchedulePriority.Medium]: this.t.translate('sr.schedule.priority_medium'),
112
- [SchedulePriority.High]: this.t.translate('sr.schedule.priority_high'),
113
- [SchedulePriority.Critical]: this.t.translate('sr.schedule.priority_critical')
97
+ [SchedulePriority.Low]: this.t.translate('crmx.components.priority_low'),
98
+ [SchedulePriority.Medium]: this.t.translate('crmx.components.priority_medium'),
99
+ [SchedulePriority.High]: this.t.translate('crmx.components.priority_high'),
100
+ [SchedulePriority.Critical]: this.t.translate('crmx.components.priority_critical')
114
101
  };
115
102
  return labels[priority] ?? priority;
116
103
  }
@@ -126,64 +113,54 @@ export class ScheduleDetailComponent {
126
113
  };
127
114
  return severities[priority] ?? 'info';
128
115
  }
129
- getRecurrenceLabel(recurrence) {
130
- if (!recurrence) {
131
- return this.t.translate('sr.schedule.recurrence_none');
132
- }
133
- const labels = {
134
- 'NONE': this.t.translate('sr.schedule.recurrence_none'),
135
- 'DAILY': this.t.translate('sr.schedule.recurrence_daily'),
136
- 'WEEKLY': this.t.translate('sr.schedule.recurrence_weekly'),
137
- 'MONTHLY': this.t.translate('sr.schedule.recurrence_monthly'),
138
- 'YEARLY': this.t.translate('sr.schedule.recurrence_yearly'),
139
- 'CUSTOM': this.t.translate('sr.schedule.recurrence_custom')
140
- };
141
- return labels[recurrence] ?? recurrence;
142
- }
143
- getOrganizerName() {
144
- const organizer = this.schedule?.participants?.find((p) => p.organizer);
145
- return organizer?.collaborator?.name ?? this.t.translate('sr.schedule.not_informed');
116
+ getParticipantName(p) {
117
+ return p.collaborator?.name ?? '';
146
118
  }
147
- getParticipantsCount() {
148
- return this.schedule?.participants?.filter((p) => !p.organizer).length ?? 0;
119
+ getParticipantType(p) {
120
+ if (p.organizer) {
121
+ return this.t.translate('crmx.components.organizer');
122
+ }
123
+ return this.t.translate('crmx.components.participant_collaborator');
149
124
  }
150
- getParticipantsList() {
151
- const participants = this.schedule?.participants?.filter((p) => !p.organizer) ?? [];
152
- if (participants.length === 0) {
153
- return this.t.translate('sr.schedule.no_participants');
125
+ getParticipantTypeIcon(p) {
126
+ if (p.organizer) {
127
+ return 'pi pi-star';
154
128
  }
155
- return participants.map((p) => p.collaborator?.name ?? this.t.translate('sr.schedule.no_name')).join(', ');
129
+ return 'pi pi-user';
156
130
  }
157
131
  getConfirmationLabel(confirmation) {
158
132
  if (!confirmation) {
159
133
  return '';
160
134
  }
161
135
  const labels = {
162
- 'CONFIRMED': this.t.translate('sr.schedule.status_accepted'),
163
- 'DECLINED': this.t.translate('sr.schedule.status_rejected')
136
+ 'YES': this.t.translate('crmx.components.confirmation_yes'),
137
+ 'NO': this.t.translate('crmx.components.confirmation_no')
164
138
  };
165
- return labels[confirmation] ?? this.t.translate('sr.schedule.status_pending');
139
+ return labels[confirmation] ?? this.t.translate('crmx.components.confirmation_pending');
166
140
  }
167
141
  getConfirmationSeverity(confirmation) {
168
142
  const severities = {
169
- 'CONFIRMED': 'success',
170
- 'DECLINED': 'danger'
143
+ 'YES': 'success',
144
+ 'NO': 'danger'
171
145
  };
172
146
  return severities[confirmation ?? ''] ?? 'warn';
173
147
  }
174
148
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScheduleDetailComponent, deps: [{ token: i1.TranslationService }, { token: i2.ConfirmationService }], target: i0.ɵɵFactoryTarget.Component });
175
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ScheduleDetailComponent, isStandalone: true, selector: "s-schedule-detail", inputs: { visible: "visible", schedule: "schedule", showAcceptButton: "showAcceptButton", showRejectButton: "showRejectButton", showCancelButton: "showCancelButton", showEditButton: "showEditButton", showDeleteButton: "showDeleteButton" }, outputs: { visibleChange: "visibleChange", onAction: "onAction", onClose: "onClose" }, providers: [ConfirmationService], ngImport: i0, template: "<p-dialog\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [styleClass]=\"'schedule-detail-dialog'\"\n [header]=\"dialogHeader\"\n (onHide)=\"closeDialog()\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"dialog-header\">\n <h3>{{ dialogHeader }}</h3>\n <p-tag \n *ngIf=\"schedule?.priority\"\n [severity]=\"getPrioritySeverity(schedule?.priority)\"\n [value]=\"getPriorityLabel(schedule?.priority)\">\n </p-tag>\n </div>\n </ng-template>\n\n <div class=\"schedule-detail-content\" *ngIf=\"schedule\">\n \n <!-- Informa\u00E7\u00F5es B\u00E1sicas -->\n <div class=\"detail-section\">\n <h4 class=\"section-title\">{{ 'sr.schedule.basic_info' | translate }}</h4>\n \n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-calendar\"></i>\n {{ 'sr.schedule.type' | translate }}:\n </span>\n <span class=\"detail-value\">{{ schedule.type?.name ?? ('sr.schedule.not_informed' | translate) }}</span>\n </div>\n\n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-clock\"></i>\n {{ 'sr.schedule.when_occurs' | translate }}:\n </span>\n <span class=\"detail-value\">{{ schedule.whenOccurs }}</span>\n </div>\n\n <div class=\"detail-row\" *ngIf=\"schedule.duration\">\n <span class=\"detail-label\">\n <i class=\"pi pi-hourglass\"></i>\n {{ 'sr.schedule.duration' | translate }}:\n </span>\n <span class=\"detail-value\">{{ schedule.duration }} {{ 'sr.schedule.minutes' | translate }}</span>\n </div>\n\n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-refresh\"></i>\n {{ 'sr.schedule.recurrence' | translate }}:\n </span>\n <span class=\"detail-value\">{{ getRecurrenceLabel(schedule.recurrence) }}</span>\n </div>\n </div>\n\n <p-divider></p-divider>\n\n <!-- Descri\u00E7\u00E3o -->\n <div class=\"detail-section\" *ngIf=\"schedule.description\">\n <h4 class=\"section-title\">{{ 'sr.schedule.description' | translate }}</h4>\n <p class=\"description-text\">{{ schedule.description }}</p>\n </div>\n\n <p-divider *ngIf=\"schedule.description\"></p-divider>\n\n <!-- Participantes -->\n <div class=\"detail-section\">\n <h4 class=\"section-title\">{{ 'sr.schedule.participants' | translate }}</h4>\n \n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-user\"></i>\n {{ 'sr.schedule.organizer' | translate }}:\n </span>\n <span class=\"detail-value\">{{ getOrganizerName() }}</span>\n </div>\n\n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-users\"></i>\n {{ 'sr.schedule.participants' | translate }} ({{ getParticipantsCount() }}):\n </span>\n </div>\n \n <div class=\"participants-list\" *ngIf=\"getParticipantsCount() > 0\">\n <div class=\"participant-item\" *ngFor=\"let participant of schedule.participants\">\n <ng-container *ngIf=\"!participant.organizer\">\n <i class=\"pi pi-user\"></i>\n <span>{{ participant.collaborator?.name ?? ('sr.schedule.no_name' | translate) }}</span>\n <p-tag \n *ngIf=\"participant.confirmation\"\n [severity]=\"getConfirmationSeverity(participant.confirmation)\"\n [value]=\"getConfirmationLabel(participant.confirmation)\"\n styleClass=\"participant-status\">\n </p-tag>\n </ng-container>\n </div>\n </div>\n <p class=\"no-participants\" *ngIf=\"getParticipantsCount() === 0\">\n {{ 'sr.schedule.no_participants_besides_organizer' | translate }}\n </p>\n </div>\n\n <p-divider></p-divider>\n\n <!-- Local -->\n <div class=\"detail-section\" *ngIf=\"schedule.location\">\n <h4 class=\"section-title\">{{ 'sr.schedule.location' | translate }}</h4>\n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-map-marker\"></i>\n {{ 'sr.schedule.address' | translate }}:\n </span>\n <span class=\"detail-value\">{{ schedule.location }}</span>\n </div>\n </div>\n\n <!-- Observa\u00E7\u00F5es -->\n <div class=\"detail-section\" *ngIf=\"schedule.observations\">\n <h4 class=\"section-title\">{{ 'sr.schedule.notes' | translate }}</h4>\n <p class=\"observations-text\">{{ schedule.observations }}</p>\n </div>\n\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n <button \n *ngIf=\"showDeleteButton\"\n pButton type=\"button\" \n [label]=\"'sr.schedule.delete' | translate\" \n icon=\"pi pi-trash\"\n class=\"p-button-danger p-button-text\"\n (click)=\"deleteSchedule()\">\n </button>\n </div>\n <div class=\"footer-right\">\n <button \n *ngIf=\"showRejectButton\"\n pButton type=\"button\" \n [label]=\"'sr.schedule.reject' | translate\" \n icon=\"pi pi-times\"\n class=\"p-button-warning\"\n (click)=\"rejectSchedule()\">\n </button>\n <button \n *ngIf=\"showCancelButton\"\n pButton type=\"button\" \n [label]=\"'sr.schedule.cancel' | translate\" \n icon=\"pi pi-ban\"\n class=\"p-button-secondary\"\n (click)=\"cancelSchedule()\">\n </button>\n <button \n *ngIf=\"showAcceptButton\"\n pButton type=\"button\" \n [label]=\"'sr.schedule.accept' | translate\" \n icon=\"pi pi-check\"\n class=\"p-button-success\"\n (click)=\"acceptSchedule()\">\n </button>\n <button \n *ngIf=\"showEditButton\"\n pButton type=\"button\" \n [label]=\"'sr.schedule.edit_schedule' | translate\" \n icon=\"pi pi-pencil\"\n (click)=\"editSchedule()\">\n </button>\n <button \n pButton type=\"button\" \n [label]=\"'sr.schedule.close' | translate\" \n icon=\"pi pi-times\"\n class=\"p-button-text\"\n (click)=\"closeDialog()\">\n </button>\n </div>\n </div>\n </ng-template>\n\n</p-dialog>\n\n<p-confirmDialog></p-confirmDialog>\n", styles: [".dialog-header{display:flex;align-items:center;justify-content:space-between;width:100%;gap:1rem}.dialog-header h3{margin:0;font-size:1.25rem;font-weight:600;flex:1}.schedule-detail-content{padding:.5rem 0}.detail-section{margin-bottom:1rem}.detail-section .section-title{font-size:1rem;font-weight:600;margin:0 0 1rem;color:var(--text-color)}.detail-section .detail-row{display:flex;align-items:flex-start;margin-bottom:.75rem;gap:.5rem}.detail-section .detail-row .detail-label{display:flex;align-items:center;gap:.5rem;font-weight:500;color:var(--text-color-secondary);min-width:140px;flex-shrink:0}.detail-section .detail-row .detail-label i{font-size:.875rem}.detail-section .detail-row .detail-value{color:var(--text-color);flex:1}.detail-section .description-text,.detail-section .observations-text{color:var(--text-color);line-height:1.6;margin:0;white-space:pre-wrap}.detail-section .participants-list{margin-top:.5rem;display:flex;flex-direction:column;gap:.5rem}.detail-section .participants-list .participant-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;background:var(--surface-50);border-radius:4px}.detail-section .participants-list .participant-item i{color:var(--text-color-secondary);font-size:.875rem}.detail-section .participants-list .participant-item span{flex:1;color:var(--text-color)}.detail-section .participants-list .participant-item .participant-status{font-size:.75rem}.detail-section .no-participants{color:var(--text-color-secondary);font-style:italic;margin:.5rem 0 0}.dialog-footer{display:flex;justify-content:space-between;align-items:center;width:100%;gap:.5rem}.dialog-footer .footer-left{display:flex;gap:.5rem}.dialog-footer .footer-right{display:flex;gap:.5rem;margin-left:auto}:host ::ng-deep .schedule-detail-dialog{width:600px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i6.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: DividerModule }, { kind: "component", type: i7.Divider, selector: "p-divider", inputs: ["style", "styleClass", "layout", "type", "align"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "ngmodule", type: ConfirmDialogModule }, { kind: "component", type: i8.ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
149
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ScheduleDetailComponent, isStandalone: true, selector: "s-schedule-detail", inputs: { visible: "visible", schedule: "schedule", loading: "loading", showAcceptButton: "showAcceptButton", showRejectButton: "showRejectButton", showCancelButton: "showCancelButton", showEditButton: "showEditButton", showDeleteButton: "showDeleteButton" }, outputs: { visibleChange: "visibleChange", onAction: "onAction", onClose: "onClose" }, providers: [ConfirmationService], ngImport: i0, template: "<p-dialog [(visible)]=\"visible\" [header]=\"dialogHeader\" [modal]=\"true\"\n [styleClass]=\"'schedule-detail-dialog'\" [draggable]=\"false\" [resizable]=\"false\"\n (onHide)=\"closeDialog()\">\n\n <div class=\"detail-dialog-body\" *ngIf=\"schedule\">\n <sia-loading *ngIf=\"loading\"></sia-loading>\n\n <div class=\"detail-dialog-section\" *ngIf=\"!loading\">\n <div class=\"detail-dialog-row\">\n <span class=\"detail-label\">{{ 'crmx.components.priority' | translate }}</span>\n <p-tag [value]=\"getPriorityLabel(schedule.priority)\"\n [severity]=\"getPrioritySeverity(schedule.priority)\"></p-tag>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.scheduleType ?? schedule.type\">\n <span class=\"detail-label\">{{ 'crmx.components.type' | translate }}</span>\n <span>{{ (schedule.scheduleType ?? schedule.type)?.name }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.startDate\">\n <span class=\"detail-label\">{{ 'crmx.components.start_date' | translate }}</span>\n <span>{{ schedule.startDate }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.endDate\">\n <span class=\"detail-label\">{{ 'crmx.components.end_date' | translate }}</span>\n <span>{{ schedule.endDate }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"!schedule.allDay && schedule.startTime\">\n <span class=\"detail-label\">{{ 'crmx.components.start_time' | translate }}</span>\n <span>{{ schedule.startTime }} - {{ schedule.endTime }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.allDay\">\n <span class=\"detail-label\">{{ 'crmx.components.start_time' | translate }}</span>\n <span>{{ 'crmx.components.all_day' | translate }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.whenOccurs\">\n <span class=\"detail-label\">{{ 'crmx.components.recurrence' | translate }}</span>\n <span>{{ schedule.whenOccurs }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.comments\">\n <span class=\"detail-label\">{{ 'crmx.components.comments' | translate }}</span>\n <span>{{ schedule.comments }}</span>\n </div>\n </div>\n\n <p-divider *ngIf=\"!loading\"></p-divider>\n\n <div class=\"detail-dialog-section\" *ngIf=\"!loading && schedule.participants\">\n <div class=\"drawer-section-header\">\n <i class=\"pi pi-users\"></i>\n <span>{{ 'crmx.components.participants' | translate }}</span>\n </div>\n <p-table [value]=\"schedule.participants\" styleClass=\"p-datatable-sm p-datatable-striped\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"col\">{{ 'crmx.components.name' | translate }}</th>\n <th scope=\"col\" class=\"col-participant-type\">{{ 'crmx.components.participant_type' | translate }}</th>\n <th scope=\"col\" class=\"col-status\">{{ 'crmx.components.status' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-p>\n <tr>\n <td>{{ getParticipantName(p) }}</td>\n <td>\n <div class=\"participant-type-cell\">\n <i [class]=\"getParticipantTypeIcon(p)\"></i>\n <span>{{ getParticipantType(p) }}</span>\n </div>\n </td>\n <td>\n <p-tag *ngIf=\"p.organizer\"\n [value]=\"'crmx.components.participant_organizer_label' | translate\"\n severity=\"info\"></p-tag>\n <p-tag *ngIf=\"!p.organizer\"\n [value]=\"getConfirmationLabel(p.confirmation)\"\n [severity]=\"getConfirmationSeverity(p.confirmation)\"></p-tag>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"3\">\n <div class=\"participants-empty\">\n <i class=\"pi pi-users\"></i>\n <p>{{ 'crmx.components.no_participants' | translate }}</p>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n <button *ngIf=\"showDeleteButton\" pButton type=\"button\"\n [label]=\"'crmx.components.delete' | translate\"\n icon=\"pi pi-trash\" class=\"p-button-danger p-button-text\"\n (click)=\"deleteSchedule()\">{{ 'crmx.components.delete' | translate }}</button>\n </div>\n <div class=\"footer-right\">\n <button *ngIf=\"showRejectButton\" pButton type=\"button\"\n icon=\"pi pi-times\" class=\"p-button-text p-button-danger\"\n [pTooltip]=\"'crmx.components.reject' | translate\" tooltipPosition=\"top\"\n [attr.aria-label]=\"'crmx.components.reject' | translate\"\n (click)=\"rejectSchedule()\"></button>\n <button *ngIf=\"showAcceptButton\" pButton type=\"button\"\n icon=\"pi pi-check\" class=\"p-button-text p-button-success\"\n [pTooltip]=\"'crmx.components.accept' | translate\" tooltipPosition=\"top\"\n [attr.aria-label]=\"'crmx.components.accept' | translate\"\n (click)=\"acceptSchedule()\"></button>\n <button *ngIf=\"showCancelButton\" pButton type=\"button\"\n icon=\"pi pi-ban\" class=\"p-button-text p-button-warning\"\n [pTooltip]=\"'crmx.components.cancel_schedule' | translate\" tooltipPosition=\"top\"\n [attr.aria-label]=\"'crmx.components.cancel_schedule' | translate\"\n (click)=\"cancelSchedule()\"></button>\n <button *ngIf=\"showEditButton\" pButton type=\"button\"\n [label]=\"'crmx.components.edit' | translate\"\n icon=\"pi pi-pencil\" (click)=\"editSchedule()\">{{ 'crmx.components.edit' | translate }}</button>\n <button pButton type=\"button\"\n [label]=\"'crmx.components.close' | translate\"\n icon=\"pi pi-times\" class=\"p-button-text\"\n (click)=\"closeDialog()\">{{ 'crmx.components.close' | translate }}</button>\n </div>\n </div>\n </ng-template>\n</p-dialog>\n\n<p-confirmDialog></p-confirmDialog>\n", styles: [".detail-dialog-body{display:flex;flex-direction:column;gap:.5rem}.detail-dialog-section{margin-bottom:.5rem}.detail-dialog-row{display:flex;align-items:center;gap:.75rem;padding:.4rem 0}.detail-label{font-weight:500;color:var(--p-text-secondary-color);min-width:8rem}.drawer-section-header{display:flex;align-items:center;gap:.5rem;padding-bottom:1rem;margin-bottom:1rem;border-bottom:1px solid var(--p-surface-200);font-weight:600;font-size:.95rem;color:var(--p-text-color)}.drawer-section-header i{color:var(--p-primary-color);font-size:1rem}.participant-type-cell{display:flex;align-items:center;gap:.5rem;font-size:.85rem;color:var(--p-text-secondary-color)}.participant-type-cell i{font-size:.9rem}.participants-empty{display:flex;flex-direction:column;align-items:center;padding:2rem;text-align:center;color:var(--p-text-secondary-color)}.participants-empty i{font-size:2rem;margin-bottom:.5rem;opacity:.4}.participants-empty p{margin:0}.dialog-footer{display:flex;justify-content:space-between;align-items:center;width:100%;gap:.5rem}.dialog-footer .footer-left{display:flex;gap:.5rem}.dialog-footer .footer-right{display:flex;gap:.5rem;margin-left:auto}.schedule-detail-dialog{width:600px}.col-participant-type{width:10rem}.col-status{width:8rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i6.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: DividerModule }, { kind: "component", type: i7.Divider, selector: "p-divider", inputs: ["style", "styleClass", "layout", "type", "align"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: ConfirmDialogModule }, { kind: "component", type: i9.ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i10.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: LoadingComponent, selector: "sia-loading", inputs: ["variant", "color", "size", "text", "padding"] }] });
176
150
  }
177
151
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScheduleDetailComponent, decorators: [{
178
152
  type: Component,
179
153
  args: [{ selector: 's-schedule-detail', standalone: true, imports: [
180
154
  CommonModule, DialogModule, ButtonModule, TagModule,
181
- DividerModule, TooltipModule, ConfirmDialogModule, TranslatePipe
182
- ], providers: [ConfirmationService], template: "<p-dialog\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [styleClass]=\"'schedule-detail-dialog'\"\n [header]=\"dialogHeader\"\n (onHide)=\"closeDialog()\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"dialog-header\">\n <h3>{{ dialogHeader }}</h3>\n <p-tag \n *ngIf=\"schedule?.priority\"\n [severity]=\"getPrioritySeverity(schedule?.priority)\"\n [value]=\"getPriorityLabel(schedule?.priority)\">\n </p-tag>\n </div>\n </ng-template>\n\n <div class=\"schedule-detail-content\" *ngIf=\"schedule\">\n \n <!-- Informa\u00E7\u00F5es B\u00E1sicas -->\n <div class=\"detail-section\">\n <h4 class=\"section-title\">{{ 'sr.schedule.basic_info' | translate }}</h4>\n \n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-calendar\"></i>\n {{ 'sr.schedule.type' | translate }}:\n </span>\n <span class=\"detail-value\">{{ schedule.type?.name ?? ('sr.schedule.not_informed' | translate) }}</span>\n </div>\n\n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-clock\"></i>\n {{ 'sr.schedule.when_occurs' | translate }}:\n </span>\n <span class=\"detail-value\">{{ schedule.whenOccurs }}</span>\n </div>\n\n <div class=\"detail-row\" *ngIf=\"schedule.duration\">\n <span class=\"detail-label\">\n <i class=\"pi pi-hourglass\"></i>\n {{ 'sr.schedule.duration' | translate }}:\n </span>\n <span class=\"detail-value\">{{ schedule.duration }} {{ 'sr.schedule.minutes' | translate }}</span>\n </div>\n\n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-refresh\"></i>\n {{ 'sr.schedule.recurrence' | translate }}:\n </span>\n <span class=\"detail-value\">{{ getRecurrenceLabel(schedule.recurrence) }}</span>\n </div>\n </div>\n\n <p-divider></p-divider>\n\n <!-- Descri\u00E7\u00E3o -->\n <div class=\"detail-section\" *ngIf=\"schedule.description\">\n <h4 class=\"section-title\">{{ 'sr.schedule.description' | translate }}</h4>\n <p class=\"description-text\">{{ schedule.description }}</p>\n </div>\n\n <p-divider *ngIf=\"schedule.description\"></p-divider>\n\n <!-- Participantes -->\n <div class=\"detail-section\">\n <h4 class=\"section-title\">{{ 'sr.schedule.participants' | translate }}</h4>\n \n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-user\"></i>\n {{ 'sr.schedule.organizer' | translate }}:\n </span>\n <span class=\"detail-value\">{{ getOrganizerName() }}</span>\n </div>\n\n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-users\"></i>\n {{ 'sr.schedule.participants' | translate }} ({{ getParticipantsCount() }}):\n </span>\n </div>\n \n <div class=\"participants-list\" *ngIf=\"getParticipantsCount() > 0\">\n <div class=\"participant-item\" *ngFor=\"let participant of schedule.participants\">\n <ng-container *ngIf=\"!participant.organizer\">\n <i class=\"pi pi-user\"></i>\n <span>{{ participant.collaborator?.name ?? ('sr.schedule.no_name' | translate) }}</span>\n <p-tag \n *ngIf=\"participant.confirmation\"\n [severity]=\"getConfirmationSeverity(participant.confirmation)\"\n [value]=\"getConfirmationLabel(participant.confirmation)\"\n styleClass=\"participant-status\">\n </p-tag>\n </ng-container>\n </div>\n </div>\n <p class=\"no-participants\" *ngIf=\"getParticipantsCount() === 0\">\n {{ 'sr.schedule.no_participants_besides_organizer' | translate }}\n </p>\n </div>\n\n <p-divider></p-divider>\n\n <!-- Local -->\n <div class=\"detail-section\" *ngIf=\"schedule.location\">\n <h4 class=\"section-title\">{{ 'sr.schedule.location' | translate }}</h4>\n <div class=\"detail-row\">\n <span class=\"detail-label\">\n <i class=\"pi pi-map-marker\"></i>\n {{ 'sr.schedule.address' | translate }}:\n </span>\n <span class=\"detail-value\">{{ schedule.location }}</span>\n </div>\n </div>\n\n <!-- Observa\u00E7\u00F5es -->\n <div class=\"detail-section\" *ngIf=\"schedule.observations\">\n <h4 class=\"section-title\">{{ 'sr.schedule.notes' | translate }}</h4>\n <p class=\"observations-text\">{{ schedule.observations }}</p>\n </div>\n\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n <button \n *ngIf=\"showDeleteButton\"\n pButton type=\"button\" \n [label]=\"'sr.schedule.delete' | translate\" \n icon=\"pi pi-trash\"\n class=\"p-button-danger p-button-text\"\n (click)=\"deleteSchedule()\">\n </button>\n </div>\n <div class=\"footer-right\">\n <button \n *ngIf=\"showRejectButton\"\n pButton type=\"button\" \n [label]=\"'sr.schedule.reject' | translate\" \n icon=\"pi pi-times\"\n class=\"p-button-warning\"\n (click)=\"rejectSchedule()\">\n </button>\n <button \n *ngIf=\"showCancelButton\"\n pButton type=\"button\" \n [label]=\"'sr.schedule.cancel' | translate\" \n icon=\"pi pi-ban\"\n class=\"p-button-secondary\"\n (click)=\"cancelSchedule()\">\n </button>\n <button \n *ngIf=\"showAcceptButton\"\n pButton type=\"button\" \n [label]=\"'sr.schedule.accept' | translate\" \n icon=\"pi pi-check\"\n class=\"p-button-success\"\n (click)=\"acceptSchedule()\">\n </button>\n <button \n *ngIf=\"showEditButton\"\n pButton type=\"button\" \n [label]=\"'sr.schedule.edit_schedule' | translate\" \n icon=\"pi pi-pencil\"\n (click)=\"editSchedule()\">\n </button>\n <button \n pButton type=\"button\" \n [label]=\"'sr.schedule.close' | translate\" \n icon=\"pi pi-times\"\n class=\"p-button-text\"\n (click)=\"closeDialog()\">\n </button>\n </div>\n </div>\n </ng-template>\n\n</p-dialog>\n\n<p-confirmDialog></p-confirmDialog>\n", styles: [".dialog-header{display:flex;align-items:center;justify-content:space-between;width:100%;gap:1rem}.dialog-header h3{margin:0;font-size:1.25rem;font-weight:600;flex:1}.schedule-detail-content{padding:.5rem 0}.detail-section{margin-bottom:1rem}.detail-section .section-title{font-size:1rem;font-weight:600;margin:0 0 1rem;color:var(--text-color)}.detail-section .detail-row{display:flex;align-items:flex-start;margin-bottom:.75rem;gap:.5rem}.detail-section .detail-row .detail-label{display:flex;align-items:center;gap:.5rem;font-weight:500;color:var(--text-color-secondary);min-width:140px;flex-shrink:0}.detail-section .detail-row .detail-label i{font-size:.875rem}.detail-section .detail-row .detail-value{color:var(--text-color);flex:1}.detail-section .description-text,.detail-section .observations-text{color:var(--text-color);line-height:1.6;margin:0;white-space:pre-wrap}.detail-section .participants-list{margin-top:.5rem;display:flex;flex-direction:column;gap:.5rem}.detail-section .participants-list .participant-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;background:var(--surface-50);border-radius:4px}.detail-section .participants-list .participant-item i{color:var(--text-color-secondary);font-size:.875rem}.detail-section .participants-list .participant-item span{flex:1;color:var(--text-color)}.detail-section .participants-list .participant-item .participant-status{font-size:.75rem}.detail-section .no-participants{color:var(--text-color-secondary);font-style:italic;margin:.5rem 0 0}.dialog-footer{display:flex;justify-content:space-between;align-items:center;width:100%;gap:.5rem}.dialog-footer .footer-left{display:flex;gap:.5rem}.dialog-footer .footer-right{display:flex;gap:.5rem;margin-left:auto}:host ::ng-deep .schedule-detail-dialog{width:600px}\n"] }]
155
+ DividerModule, TooltipModule, ConfirmDialogModule,
156
+ TableModule, TranslatePipe, LoadingComponent
157
+ ], providers: [ConfirmationService], template: "<p-dialog [(visible)]=\"visible\" [header]=\"dialogHeader\" [modal]=\"true\"\n [styleClass]=\"'schedule-detail-dialog'\" [draggable]=\"false\" [resizable]=\"false\"\n (onHide)=\"closeDialog()\">\n\n <div class=\"detail-dialog-body\" *ngIf=\"schedule\">\n <sia-loading *ngIf=\"loading\"></sia-loading>\n\n <div class=\"detail-dialog-section\" *ngIf=\"!loading\">\n <div class=\"detail-dialog-row\">\n <span class=\"detail-label\">{{ 'crmx.components.priority' | translate }}</span>\n <p-tag [value]=\"getPriorityLabel(schedule.priority)\"\n [severity]=\"getPrioritySeverity(schedule.priority)\"></p-tag>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.scheduleType ?? schedule.type\">\n <span class=\"detail-label\">{{ 'crmx.components.type' | translate }}</span>\n <span>{{ (schedule.scheduleType ?? schedule.type)?.name }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.startDate\">\n <span class=\"detail-label\">{{ 'crmx.components.start_date' | translate }}</span>\n <span>{{ schedule.startDate }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.endDate\">\n <span class=\"detail-label\">{{ 'crmx.components.end_date' | translate }}</span>\n <span>{{ schedule.endDate }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"!schedule.allDay && schedule.startTime\">\n <span class=\"detail-label\">{{ 'crmx.components.start_time' | translate }}</span>\n <span>{{ schedule.startTime }} - {{ schedule.endTime }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.allDay\">\n <span class=\"detail-label\">{{ 'crmx.components.start_time' | translate }}</span>\n <span>{{ 'crmx.components.all_day' | translate }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.whenOccurs\">\n <span class=\"detail-label\">{{ 'crmx.components.recurrence' | translate }}</span>\n <span>{{ schedule.whenOccurs }}</span>\n </div>\n <div class=\"detail-dialog-row\" *ngIf=\"schedule.comments\">\n <span class=\"detail-label\">{{ 'crmx.components.comments' | translate }}</span>\n <span>{{ schedule.comments }}</span>\n </div>\n </div>\n\n <p-divider *ngIf=\"!loading\"></p-divider>\n\n <div class=\"detail-dialog-section\" *ngIf=\"!loading && schedule.participants\">\n <div class=\"drawer-section-header\">\n <i class=\"pi pi-users\"></i>\n <span>{{ 'crmx.components.participants' | translate }}</span>\n </div>\n <p-table [value]=\"schedule.participants\" styleClass=\"p-datatable-sm p-datatable-striped\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"col\">{{ 'crmx.components.name' | translate }}</th>\n <th scope=\"col\" class=\"col-participant-type\">{{ 'crmx.components.participant_type' | translate }}</th>\n <th scope=\"col\" class=\"col-status\">{{ 'crmx.components.status' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-p>\n <tr>\n <td>{{ getParticipantName(p) }}</td>\n <td>\n <div class=\"participant-type-cell\">\n <i [class]=\"getParticipantTypeIcon(p)\"></i>\n <span>{{ getParticipantType(p) }}</span>\n </div>\n </td>\n <td>\n <p-tag *ngIf=\"p.organizer\"\n [value]=\"'crmx.components.participant_organizer_label' | translate\"\n severity=\"info\"></p-tag>\n <p-tag *ngIf=\"!p.organizer\"\n [value]=\"getConfirmationLabel(p.confirmation)\"\n [severity]=\"getConfirmationSeverity(p.confirmation)\"></p-tag>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"3\">\n <div class=\"participants-empty\">\n <i class=\"pi pi-users\"></i>\n <p>{{ 'crmx.components.no_participants' | translate }}</p>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n <button *ngIf=\"showDeleteButton\" pButton type=\"button\"\n [label]=\"'crmx.components.delete' | translate\"\n icon=\"pi pi-trash\" class=\"p-button-danger p-button-text\"\n (click)=\"deleteSchedule()\">{{ 'crmx.components.delete' | translate }}</button>\n </div>\n <div class=\"footer-right\">\n <button *ngIf=\"showRejectButton\" pButton type=\"button\"\n icon=\"pi pi-times\" class=\"p-button-text p-button-danger\"\n [pTooltip]=\"'crmx.components.reject' | translate\" tooltipPosition=\"top\"\n [attr.aria-label]=\"'crmx.components.reject' | translate\"\n (click)=\"rejectSchedule()\"></button>\n <button *ngIf=\"showAcceptButton\" pButton type=\"button\"\n icon=\"pi pi-check\" class=\"p-button-text p-button-success\"\n [pTooltip]=\"'crmx.components.accept' | translate\" tooltipPosition=\"top\"\n [attr.aria-label]=\"'crmx.components.accept' | translate\"\n (click)=\"acceptSchedule()\"></button>\n <button *ngIf=\"showCancelButton\" pButton type=\"button\"\n icon=\"pi pi-ban\" class=\"p-button-text p-button-warning\"\n [pTooltip]=\"'crmx.components.cancel_schedule' | translate\" tooltipPosition=\"top\"\n [attr.aria-label]=\"'crmx.components.cancel_schedule' | translate\"\n (click)=\"cancelSchedule()\"></button>\n <button *ngIf=\"showEditButton\" pButton type=\"button\"\n [label]=\"'crmx.components.edit' | translate\"\n icon=\"pi pi-pencil\" (click)=\"editSchedule()\">{{ 'crmx.components.edit' | translate }}</button>\n <button pButton type=\"button\"\n [label]=\"'crmx.components.close' | translate\"\n icon=\"pi pi-times\" class=\"p-button-text\"\n (click)=\"closeDialog()\">{{ 'crmx.components.close' | translate }}</button>\n </div>\n </div>\n </ng-template>\n</p-dialog>\n\n<p-confirmDialog></p-confirmDialog>\n", styles: [".detail-dialog-body{display:flex;flex-direction:column;gap:.5rem}.detail-dialog-section{margin-bottom:.5rem}.detail-dialog-row{display:flex;align-items:center;gap:.75rem;padding:.4rem 0}.detail-label{font-weight:500;color:var(--p-text-secondary-color);min-width:8rem}.drawer-section-header{display:flex;align-items:center;gap:.5rem;padding-bottom:1rem;margin-bottom:1rem;border-bottom:1px solid var(--p-surface-200);font-weight:600;font-size:.95rem;color:var(--p-text-color)}.drawer-section-header i{color:var(--p-primary-color);font-size:1rem}.participant-type-cell{display:flex;align-items:center;gap:.5rem;font-size:.85rem;color:var(--p-text-secondary-color)}.participant-type-cell i{font-size:.9rem}.participants-empty{display:flex;flex-direction:column;align-items:center;padding:2rem;text-align:center;color:var(--p-text-secondary-color)}.participants-empty i{font-size:2rem;margin-bottom:.5rem;opacity:.4}.participants-empty p{margin:0}.dialog-footer{display:flex;justify-content:space-between;align-items:center;width:100%;gap:.5rem}.dialog-footer .footer-left{display:flex;gap:.5rem}.dialog-footer .footer-right{display:flex;gap:.5rem;margin-left:auto}.schedule-detail-dialog{width:600px}.col-participant-type{width:10rem}.col-status{width:8rem}\n"] }]
183
158
  }], ctorParameters: () => [{ type: i1.TranslationService }, { type: i2.ConfirmationService }], propDecorators: { visible: [{
184
159
  type: Input
185
160
  }], schedule: [{
186
161
  type: Input
162
+ }], loading: [{
163
+ type: Input
187
164
  }], showAcceptButton: [{
188
165
  type: Input
189
166
  }], showRejectButton: [{
@@ -201,4 +178,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
201
178
  }], onClose: [{
202
179
  type: Output
203
180
  }] } });
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUtZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvc2NoZWR1bGUvY29tcG9uZW50cy9zY2hlZHVsZS1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9zY2hlZHVsZS9jb21wb25lbnRzL3NjaGVkdWxlLWRldGFpbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxVQUFVO0FBQ1YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWxELGdCQUFnQjtBQUNoQixPQUFPLEVBQXNCLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSWxGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7O0FBNEI1RCxNQUFNLE9BQU8sdUJBQXVCO0lBY2Y7SUFDQTtJQWRWLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsUUFBUSxHQUFvQyxJQUFJLENBQUM7SUFDakQsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDekIsY0FBYyxHQUFHLElBQUksQ0FBQztJQUN0QixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFFeEIsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDNUMsUUFBUSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO0lBQ3BELE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRTdDLFlBQ21CLENBQXFCLEVBQ3JCLG1CQUF3QztRQUR4QyxNQUFDLEdBQUQsQ0FBQyxDQUFvQjtRQUNyQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO0lBQ3hELENBQUM7SUFFSixJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLEVBQUUsNEJBQTRCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLEVBQUUsNEJBQTRCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLEVBQUUsNEJBQTRCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVPLGFBQWEsQ0FBQyxVQUFrQixFQUFFLElBQVksRUFBRSxJQUFrQztRQUN4RixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDO1lBQy9CLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDBCQUEwQixDQUFDO1lBQ3BELElBQUk7WUFDSixXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7WUFDaEQsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQy9DLE1BQU0sRUFBRSxHQUFHLEVBQUU7Z0JBQ1gsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQStCO1FBQ3hDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO2dCQUNyQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVM7Z0JBQ2pELElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVM7YUFDbkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQStDO1FBQzlELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQTJCO1lBQ3JDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUM7WUFDcEUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQztZQUMxRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDO1lBQ3RFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsK0JBQStCLENBQUM7U0FDL0UsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUN0QyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsUUFBK0M7UUFDakUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQUMsT0FBTyxNQUFNLENBQUM7UUFBQyxDQUFDO1FBQ2pDLE1BQU0sVUFBVSxHQUFxQztZQUNuRCxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU07WUFDOUIsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTO1lBQ3BDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTTtZQUMvQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVE7U0FDdEMsQ0FBQztRQUNGLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQztJQUN4QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsVUFBOEI7UUFDL0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQTJCO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQztZQUN2RCxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUM7WUFDekQsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLCtCQUErQixDQUFDO1lBQzNELFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQ0FBZ0MsQ0FBQztZQUM3RCxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsK0JBQStCLENBQUM7WUFDM0QsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLCtCQUErQixDQUFDO1NBQzVELENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUM7SUFDMUMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQXNCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RixPQUFPLFNBQVMsRUFBRSxZQUFZLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQXNCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFzQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekcsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsSSxDQUFDO0lBRUQsb0JBQW9CLENBQUMsWUFBZ0M7UUFDbkQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQUMsT0FBTyxFQUFFLENBQUM7UUFBQyxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxHQUEyQjtZQUNyQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUM7WUFDNUQsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDO1NBQzVELENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxZQUFnQztRQUN0RCxNQUFNLFVBQVUsR0FBa0Q7WUFDaEUsV0FBVyxFQUFFLFNBQVM7WUFDdEIsVUFBVSxFQUFFLFFBQVE7U0FDckIsQ0FBQztRQUNGLE9BQU8sVUFBVSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDbEQsQ0FBQzt3R0E5SlUsdUJBQXVCOzRGQUF2Qix1QkFBdUIsdVlBSnZCLENBQUMsbUJBQW1CLENBQUMsMEJDekNsQyw0N01BMkxBLHN6RERySkksWUFBWSwrUEFBRSxZQUFZLDBnQ0FBRSxZQUFZLG9RQUFFLFNBQVMsK0pBQ25ELGFBQWEsMEpBQUUsYUFBYSw4QkFBRSxtQkFBbUIsbW9CQUFFLGFBQWE7OzRGQU12RCx1QkFBdUI7a0JBWG5DLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksV0FDUDt3QkFDUCxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxTQUFTO3dCQUNuRCxhQUFhLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGFBQWE7cUJBQ2pFLGFBQ1UsQ0FBQyxtQkFBbUIsQ0FBQzt5SEFLdkIsT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLy8gUHJpbWVOR1xuaW1wb3J0IHsgRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kaWFsb2cnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHsgVGFnTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWcnO1xuaW1wb3J0IHsgRGl2aWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGl2aWRlcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NvbmZpcm1kaWFsb2cnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcblxuLy8gQ29tcG9uZW50cyBBSVxuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlLCBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2NvbXBvbmVudHMtYWknO1xuXG4vLyBMb2NhbFxuaW1wb3J0IHsgU2NoZWR1bGUsIFNjaGVkdWxlUGFydGljaXBhbnQgfSBmcm9tICcuLi9tb2RlbHMvc2NoZWR1bGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNjaGVkdWxlUHJpb3JpdHkgfSBmcm9tICcuLi9tb2RlbHMvc2NoZWR1bGUuZW51bXMnO1xuXG50eXBlIFByaW9yaXR5U2V2ZXJpdHkgPSAnc3VjY2VzcycgfCAnaW5mbycgfCAnd2FybicgfCAnZGFuZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZVdpdGhQYXJ0aWNpcGFudHMgZXh0ZW5kcyBTY2hlZHVsZSB7XG4gIHBhcnRpY2lwYW50cz86IFNjaGVkdWxlUGFydGljaXBhbnRbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGR1cmF0aW9uPzogbnVtYmVyO1xuICBsb2NhdGlvbj86IHN0cmluZztcbiAgb2JzZXJ2YXRpb25zPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlRGV0YWlsQWN0aW9uIHtcbiAgdHlwZTogJ2FjY2VwdCcgfCAncmVqZWN0JyB8ICdjYW5jZWwnIHwgJ2VkaXQnIHwgJ2RlbGV0ZSc7XG4gIHNjaGVkdWxlOiBTY2hlZHVsZVdpdGhQYXJ0aWNpcGFudHM7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Mtc2NoZWR1bGUtZGV0YWlsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSwgRGlhbG9nTW9kdWxlLCBCdXR0b25Nb2R1bGUsIFRhZ01vZHVsZSxcbiAgICBEaXZpZGVyTW9kdWxlLCBUb29sdGlwTW9kdWxlLCBDb25maXJtRGlhbG9nTW9kdWxlLCBUcmFuc2xhdGVQaXBlXG4gIF0sXG4gIHByb3ZpZGVyczogW0NvbmZpcm1hdGlvblNlcnZpY2VdLFxuICB0ZW1wbGF0ZVVybDogJy4vc2NoZWR1bGUtZGV0YWlsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2NoZWR1bGUtZGV0YWlsLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU2NoZWR1bGVEZXRhaWxDb21wb25lbnQge1xuICBASW5wdXQoKSB2aXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNjaGVkdWxlOiBTY2hlZHVsZVdpdGhQYXJ0aWNpcGFudHMgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgc2hvd0FjY2VwdEJ1dHRvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93UmVqZWN0QnV0dG9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dDYW5jZWxCdXR0b24gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0VkaXRCdXR0b24gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RGVsZXRlQnV0dG9uID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBvbkFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8U2NoZWR1bGVEZXRhaWxBY3Rpb24+KCk7XG4gIEBPdXRwdXQoKSBvbkNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdDogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZVxuICApIHt9XG5cbiAgZ2V0IGRpYWxvZ0hlYWRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNjaGVkdWxlPy5uYW1lID8/IHRoaXMudC50cmFuc2xhdGUoJ3NyLnNjaGVkdWxlLnNjaGVkdWxlX2RldGFpbHMnKTtcbiAgfVxuXG4gIGNsb3NlRGlhbG9nKCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLm9uQ2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgZWRpdFNjaGVkdWxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNjaGVkdWxlKSB7XG4gICAgICB0aGlzLm9uQWN0aW9uLmVtaXQoeyB0eXBlOiAnZWRpdCcsIHNjaGVkdWxlOiB0aGlzLnNjaGVkdWxlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFjY2VwdFNjaGVkdWxlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY2hlZHVsZSkgcmV0dXJuO1xuICAgIHRoaXMuY29uZmlybUFjdGlvbignc3Iuc2NoZWR1bGUuY29uZmlybV9hY2NlcHQnLCAncGkgcGktcXVlc3Rpb24tY2lyY2xlJywgJ2FjY2VwdCcpO1xuICB9XG5cbiAgcmVqZWN0U2NoZWR1bGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNjaGVkdWxlKSByZXR1cm47XG4gICAgdGhpcy5jb25maXJtQWN0aW9uKCdzci5zY2hlZHVsZS5jb25maXJtX3JlamVjdCcsICdwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZScsICdyZWplY3QnKTtcbiAgfVxuXG4gIGNhbmNlbFNjaGVkdWxlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY2hlZHVsZSkgcmV0dXJuO1xuICAgIHRoaXMuY29uZmlybUFjdGlvbignc3Iuc2NoZWR1bGUuY29uZmlybV9jYW5jZWwnLCAncGkgcGktZXhjbGFtYXRpb24tdHJpYW5nbGUnLCAnY2FuY2VsJyk7XG4gIH1cblxuICBkZWxldGVTY2hlZHVsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2NoZWR1bGUpIHJldHVybjtcbiAgICB0aGlzLmNvbmZpcm1BY3Rpb24oJ3NyLnNjaGVkdWxlLmNvbmZpcm1fZGVsZXRlJywgJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJywgJ2RlbGV0ZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maXJtQWN0aW9uKG1lc3NhZ2VLZXk6IHN0cmluZywgaWNvbjogc3RyaW5nLCB0eXBlOiBTY2hlZHVsZURldGFpbEFjdGlvblsndHlwZSddKTogdm9pZCB7XG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgbWVzc2FnZTogdGhpcy50LnRyYW5zbGF0ZShtZXNzYWdlS2V5KSxcbiAgICAgIGhlYWRlcjogdGhpcy50LnRyYW5zbGF0ZSgnc3Iuc2NoZWR1bGUuY29uZmlybWF0aW9uJyksXG4gICAgICBpY29uLFxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ3NyLnNjaGVkdWxlLnllcycpLFxuICAgICAgcmVqZWN0TGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ3NyLnNjaGVkdWxlLm5vJyksXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2NoZWR1bGUpIHtcbiAgICAgICAgICB0aGlzLm9uQWN0aW9uLmVtaXQoeyB0eXBlLCBzY2hlZHVsZTogdGhpcy5zY2hlZHVsZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9ybWF0RGF0ZShkYXRlOiBEYXRlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnQudHJhbnNsYXRlKCdzci5zY2hlZHVsZS5ub3RfaW5mb3JtZWQnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGVPYmogPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgIGlmIChpc05hTihkYXRlT2JqLmdldFRpbWUoKSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudC50cmFuc2xhdGUoJ3NyLnNjaGVkdWxlLmludmFsaWRfZGF0ZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGVPYmoudG9Mb2NhbGVTdHJpbmcoJ3B0LUJSJywge1xuICAgICAgICBkYXk6ICcyLWRpZ2l0JywgbW9udGg6ICcyLWRpZ2l0JywgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLnQudHJhbnNsYXRlKCdzci5zY2hlZHVsZS5pbnZhbGlkX2RhdGUnKTtcbiAgICB9XG4gIH1cblxuICBnZXRQcmlvcml0eUxhYmVsKHByaW9yaXR5OiBzdHJpbmcgfCBTY2hlZHVsZVByaW9yaXR5IHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIXByaW9yaXR5KSB7XG4gICAgICByZXR1cm4gdGhpcy50LnRyYW5zbGF0ZSgnc3Iuc2NoZWR1bGUubm90X2luZm9ybWVkJyk7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFtTY2hlZHVsZVByaW9yaXR5Lkxvd106IHRoaXMudC50cmFuc2xhdGUoJ3NyLnNjaGVkdWxlLnByaW9yaXR5X2xvdycpLFxuICAgICAgW1NjaGVkdWxlUHJpb3JpdHkuTWVkaXVtXTogdGhpcy50LnRyYW5zbGF0ZSgnc3Iuc2NoZWR1bGUucHJpb3JpdHlfbWVkaXVtJyksXG4gICAgICBbU2NoZWR1bGVQcmlvcml0eS5IaWdoXTogdGhpcy50LnRyYW5zbGF0ZSgnc3Iuc2NoZWR1bGUucHJpb3JpdHlfaGlnaCcpLFxuICAgICAgW1NjaGVkdWxlUHJpb3JpdHkuQ3JpdGljYWxdOiB0aGlzLnQudHJhbnNsYXRlKCdzci5zY2hlZHVsZS5wcmlvcml0eV9jcml0aWNhbCcpXG4gICAgfTtcbiAgICByZXR1cm4gbGFiZWxzW3ByaW9yaXR5XSA/PyBwcmlvcml0eTtcbiAgfVxuXG4gIGdldFByaW9yaXR5U2V2ZXJpdHkocHJpb3JpdHk6IHN0cmluZyB8IFNjaGVkdWxlUHJpb3JpdHkgfCB1bmRlZmluZWQpOiBQcmlvcml0eVNldmVyaXR5IHtcbiAgICBpZiAoIXByaW9yaXR5KSB7IHJldHVybiAnaW5mbyc7IH1cbiAgICBjb25zdCBzZXZlcml0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcmlvcml0eVNldmVyaXR5PiA9IHtcbiAgICAgIFtTY2hlZHVsZVByaW9yaXR5Lkxvd106ICdpbmZvJyxcbiAgICAgIFtTY2hlZHVsZVByaW9yaXR5Lk1lZGl1bV06ICdzdWNjZXNzJyxcbiAgICAgIFtTY2hlZHVsZVByaW9yaXR5LkhpZ2hdOiAnd2FybicsXG4gICAgICBbU2NoZWR1bGVQcmlvcml0eS5Dcml0aWNhbF06ICdkYW5nZXInXG4gICAgfTtcbiAgICByZXR1cm4gc2V2ZXJpdGllc1twcmlvcml0eV0gPz8gJ2luZm8nO1xuICB9XG5cbiAgZ2V0UmVjdXJyZW5jZUxhYmVsKHJlY3VycmVuY2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFyZWN1cnJlbmNlKSB7XG4gICAgICByZXR1cm4gdGhpcy50LnRyYW5zbGF0ZSgnc3Iuc2NoZWR1bGUucmVjdXJyZW5jZV9ub25lJyk7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdOT05FJzogdGhpcy50LnRyYW5zbGF0ZSgnc3Iuc2NoZWR1bGUucmVjdXJyZW5jZV9ub25lJyksXG4gICAgICAnREFJTFknOiB0aGlzLnQudHJhbnNsYXRlKCdzci5zY2hlZHVsZS5yZWN1cnJlbmNlX2RhaWx5JyksXG4gICAgICAnV0VFS0xZJzogdGhpcy50LnRyYW5zbGF0ZSgnc3Iuc2NoZWR1bGUucmVjdXJyZW5jZV93ZWVrbHknKSxcbiAgICAgICdNT05USExZJzogdGhpcy50LnRyYW5zbGF0ZSgnc3Iuc2NoZWR1bGUucmVjdXJyZW5jZV9tb250aGx5JyksXG4gICAgICAnWUVBUkxZJzogdGhpcy50LnRyYW5zbGF0ZSgnc3Iuc2NoZWR1bGUucmVjdXJyZW5jZV95ZWFybHknKSxcbiAgICAgICdDVVNUT00nOiB0aGlzLnQudHJhbnNsYXRlKCdzci5zY2hlZHVsZS5yZWN1cnJlbmNlX2N1c3RvbScpXG4gICAgfTtcbiAgICByZXR1cm4gbGFiZWxzW3JlY3VycmVuY2VdID8/IHJlY3VycmVuY2U7XG4gIH1cblxuICBnZXRPcmdhbml6ZXJOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3JnYW5pemVyID0gdGhpcy5zY2hlZHVsZT8ucGFydGljaXBhbnRzPy5maW5kKChwOiBTY2hlZHVsZVBhcnRpY2lwYW50KSA9PiBwLm9yZ2FuaXplcik7XG4gICAgcmV0dXJuIG9yZ2FuaXplcj8uY29sbGFib3JhdG9yPy5uYW1lID8/IHRoaXMudC50cmFuc2xhdGUoJ3NyLnNjaGVkdWxlLm5vdF9pbmZvcm1lZCcpO1xuICB9XG5cbiAgZ2V0UGFydGljaXBhbnRzQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlZHVsZT8ucGFydGljaXBhbnRzPy5maWx0ZXIoKHA6IFNjaGVkdWxlUGFydGljaXBhbnQpID0+ICFwLm9yZ2FuaXplcikubGVuZ3RoID8/IDA7XG4gIH1cblxuICBnZXRQYXJ0aWNpcGFudHNMaXN0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydGljaXBhbnRzID0gdGhpcy5zY2hlZHVsZT8ucGFydGljaXBhbnRzPy5maWx0ZXIoKHA6IFNjaGVkdWxlUGFydGljaXBhbnQpID0+ICFwLm9yZ2FuaXplcikgPz8gW107XG4gICAgaWYgKHBhcnRpY2lwYW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnQudHJhbnNsYXRlKCdzci5zY2hlZHVsZS5ub19wYXJ0aWNpcGFudHMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRpY2lwYW50cy5tYXAoKHA6IFNjaGVkdWxlUGFydGljaXBhbnQpID0+IHAuY29sbGFib3JhdG9yPy5uYW1lID8/IHRoaXMudC50cmFuc2xhdGUoJ3NyLnNjaGVkdWxlLm5vX25hbWUnKSkuam9pbignLCAnKTtcbiAgfVxuXG4gIGdldENvbmZpcm1hdGlvbkxhYmVsKGNvbmZpcm1hdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIWNvbmZpcm1hdGlvbikgeyByZXR1cm4gJyc7IH1cbiAgICBjb25zdCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQ09ORklSTUVEJzogdGhpcy50LnRyYW5zbGF0ZSgnc3Iuc2NoZWR1bGUuc3RhdHVzX2FjY2VwdGVkJyksXG4gICAgICAnREVDTElORUQnOiB0aGlzLnQudHJhbnNsYXRlKCdzci5zY2hlZHVsZS5zdGF0dXNfcmVqZWN0ZWQnKVxuICAgIH07XG4gICAgcmV0dXJuIGxhYmVsc1tjb25maXJtYXRpb25dID8/IHRoaXMudC50cmFuc2xhdGUoJ3NyLnNjaGVkdWxlLnN0YXR1c19wZW5kaW5nJyk7XG4gIH1cblxuICBnZXRDb25maXJtYXRpb25TZXZlcml0eShjb25maXJtYXRpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6ICdzdWNjZXNzJyB8ICdkYW5nZXInIHwgJ3dhcm4nIHtcbiAgICBjb25zdCBzZXZlcml0aWVzOiBSZWNvcmQ8c3RyaW5nLCAnc3VjY2VzcycgfCAnZGFuZ2VyJyB8ICd3YXJuJz4gPSB7XG4gICAgICAnQ09ORklSTUVEJzogJ3N1Y2Nlc3MnLFxuICAgICAgJ0RFQ0xJTkVEJzogJ2RhbmdlcidcbiAgICB9O1xuICAgIHJldHVybiBzZXZlcml0aWVzW2NvbmZpcm1hdGlvbiA/PyAnJ10gPz8gJ3dhcm4nO1xuICB9XG59XG4iLCI8cC1kaWFsb2dcbiAgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBbZHJhZ2dhYmxlXT1cImZhbHNlXCJcbiAgW3Jlc2l6YWJsZV09XCJmYWxzZVwiXG4gIFtzdHlsZUNsYXNzXT1cIidzY2hlZHVsZS1kZXRhaWwtZGlhbG9nJ1wiXG4gIFtoZWFkZXJdPVwiZGlhbG9nSGVhZGVyXCJcbiAgKG9uSGlkZSk9XCJjbG9zZURpYWxvZygpXCI+XG4gIFxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZy1oZWFkZXJcIj5cbiAgICAgIDxoMz57eyBkaWFsb2dIZWFkZXIgfX08L2gzPlxuICAgICAgPHAtdGFnIFxuICAgICAgICAqbmdJZj1cInNjaGVkdWxlPy5wcmlvcml0eVwiXG4gICAgICAgIFtzZXZlcml0eV09XCJnZXRQcmlvcml0eVNldmVyaXR5KHNjaGVkdWxlPy5wcmlvcml0eSlcIlxuICAgICAgICBbdmFsdWVdPVwiZ2V0UHJpb3JpdHlMYWJlbChzY2hlZHVsZT8ucHJpb3JpdHkpXCI+XG4gICAgICA8L3AtdGFnPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxkaXYgY2xhc3M9XCJzY2hlZHVsZS1kZXRhaWwtY29udGVudFwiICpuZ0lmPVwic2NoZWR1bGVcIj5cbiAgICBcbiAgICA8IS0tIEluZm9ybWHDp8O1ZXMgQsOhc2ljYXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImRldGFpbC1zZWN0aW9uXCI+XG4gICAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+e3sgJ3NyLnNjaGVkdWxlLmJhc2ljX2luZm8nIHwgdHJhbnNsYXRlIH19PC9oND5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNhbGVuZGFyXCI+PC9pPlxuICAgICAgICAgIHt7ICdzci5zY2hlZHVsZS50eXBlJyB8IHRyYW5zbGF0ZSB9fTpcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHNjaGVkdWxlLnR5cGU/Lm5hbWUgPz8gKCdzci5zY2hlZHVsZS5ub3RfaW5mb3JtZWQnIHwgdHJhbnNsYXRlKSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY2xvY2tcIj48L2k+XG4gICAgICAgICAge3sgJ3NyLnNjaGVkdWxlLndoZW5fb2NjdXJzJyB8IHRyYW5zbGF0ZSB9fTpcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHNjaGVkdWxlLndoZW5PY2N1cnMgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIiAqbmdJZj1cInNjaGVkdWxlLmR1cmF0aW9uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1ob3VyZ2xhc3NcIj48L2k+XG4gICAgICAgICAge3sgJ3NyLnNjaGVkdWxlLmR1cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fTpcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHNjaGVkdWxlLmR1cmF0aW9uIH19IHt7ICdzci5zY2hlZHVsZS5taW51dGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktcmVmcmVzaFwiPjwvaT5cbiAgICAgICAgICB7eyAnc3Iuc2NoZWR1bGUucmVjdXJyZW5jZScgfCB0cmFuc2xhdGUgfX06XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBnZXRSZWN1cnJlbmNlTGFiZWwoc2NoZWR1bGUucmVjdXJyZW5jZSkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxwLWRpdmlkZXI+PC9wLWRpdmlkZXI+XG5cbiAgICA8IS0tIERlc2NyacOnw6NvIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtc2VjdGlvblwiICpuZ0lmPVwic2NoZWR1bGUuZGVzY3JpcHRpb25cIj5cbiAgICAgIDxoNCBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj57eyAnc3Iuc2NoZWR1bGUuZGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19PC9oND5cbiAgICAgIDxwIGNsYXNzPVwiZGVzY3JpcHRpb24tdGV4dFwiPnt7IHNjaGVkdWxlLmRlc2NyaXB0aW9uIH19PC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPHAtZGl2aWRlciAqbmdJZj1cInNjaGVkdWxlLmRlc2NyaXB0aW9uXCI+PC9wLWRpdmlkZXI+XG5cbiAgICA8IS0tIFBhcnRpY2lwYW50ZXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImRldGFpbC1zZWN0aW9uXCI+XG4gICAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+e3sgJ3NyLnNjaGVkdWxlLnBhcnRpY2lwYW50cycgfCB0cmFuc2xhdGUgfX08L2g0PlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktdXNlclwiPjwvaT5cbiAgICAgICAgICB7eyAnc3Iuc2NoZWR1bGUub3JnYW5pemVyJyB8IHRyYW5zbGF0ZSB9fTpcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IGdldE9yZ2FuaXplck5hbWUoKSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktdXNlcnNcIj48L2k+XG4gICAgICAgICAge3sgJ3NyLnNjaGVkdWxlLnBhcnRpY2lwYW50cycgfCB0cmFuc2xhdGUgfX0gKHt7IGdldFBhcnRpY2lwYW50c0NvdW50KCkgfX0pOlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz1cInBhcnRpY2lwYW50cy1saXN0XCIgKm5nSWY9XCJnZXRQYXJ0aWNpcGFudHNDb3VudCgpID4gMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljaXBhbnQtaXRlbVwiICpuZ0Zvcj1cImxldCBwYXJ0aWNpcGFudCBvZiBzY2hlZHVsZS5wYXJ0aWNpcGFudHNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXBhcnRpY2lwYW50Lm9yZ2FuaXplclwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS11c2VyXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgcGFydGljaXBhbnQuY29sbGFib3JhdG9yPy5uYW1lID8/ICgnc3Iuc2NoZWR1bGUubm9fbmFtZScgfCB0cmFuc2xhdGUpIH19PC9zcGFuPlxuICAgICAgICAgICAgPHAtdGFnIFxuICAgICAgICAgICAgICAqbmdJZj1cInBhcnRpY2lwYW50LmNvbmZpcm1hdGlvblwiXG4gICAgICAgICAgICAgIFtzZXZlcml0eV09XCJnZXRDb25maXJtYXRpb25TZXZlcml0eShwYXJ0aWNpcGFudC5jb25maXJtYXRpb24pXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldENvbmZpcm1hdGlvbkxhYmVsKHBhcnRpY2lwYW50LmNvbmZpcm1hdGlvbilcIlxuICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicGFydGljaXBhbnQtc3RhdHVzXCI+XG4gICAgICAgICAgICA8L3AtdGFnPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgY2xhc3M9XCJuby1wYXJ0aWNpcGFudHNcIiAqbmdJZj1cImdldFBhcnRpY2lwYW50c0NvdW50KCkgPT09IDBcIj5cbiAgICAgICAge3sgJ3NyLnNjaGVkdWxlLm5vX3BhcnRpY2lwYW50c19iZXNpZGVzX29yZ2FuaXplcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxwLWRpdmlkZXI+PC9wLWRpdmlkZXI+XG5cbiAgICA8IS0tIExvY2FsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtc2VjdGlvblwiICpuZ0lmPVwic2NoZWR1bGUubG9jYXRpb25cIj5cbiAgICAgIDxoNCBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj57eyAnc3Iuc2NoZWR1bGUubG9jYXRpb24nIHwgdHJhbnNsYXRlIH19PC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1tYXAtbWFya2VyXCI+PC9pPlxuICAgICAgICAgIHt7ICdzci5zY2hlZHVsZS5hZGRyZXNzJyB8IHRyYW5zbGF0ZSB9fTpcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHNjaGVkdWxlLmxvY2F0aW9uIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE9ic2VydmHDp8O1ZXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImRldGFpbC1zZWN0aW9uXCIgKm5nSWY9XCJzY2hlZHVsZS5vYnNlcnZhdGlvbnNcIj5cbiAgICAgIDxoNCBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj57eyAnc3Iuc2NoZWR1bGUubm90ZXMnIHwgdHJhbnNsYXRlIH19PC9oND5cbiAgICAgIDxwIGNsYXNzPVwib2JzZXJ2YXRpb25zLXRleHRcIj57eyBzY2hlZHVsZS5vYnNlcnZhdGlvbnMgfX08L3A+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctZm9vdGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWxlZnRcIj5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIlxuICAgICAgICAgIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgIFtsYWJlbF09XCInc3Iuc2NoZWR1bGUuZGVsZXRlJyB8IHRyYW5zbGF0ZVwiIFxuICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVNjaGVkdWxlKClcIj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXItcmlnaHRcIj5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInNob3dSZWplY3RCdXR0b25cIlxuICAgICAgICAgIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgIFtsYWJlbF09XCInc3Iuc2NoZWR1bGUucmVqZWN0JyB8IHRyYW5zbGF0ZVwiIFxuICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi13YXJuaW5nXCJcbiAgICAgICAgICAoY2xpY2spPVwicmVqZWN0U2NoZWR1bGUoKVwiPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxCdXR0b25cIlxuICAgICAgICAgIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgIFtsYWJlbF09XCInc3Iuc2NoZWR1bGUuY2FuY2VsJyB8IHRyYW5zbGF0ZVwiIFxuICAgICAgICAgIGljb249XCJwaSBwaS1iYW5cIlxuICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsU2NoZWR1bGUoKVwiPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInNob3dBY2NlcHRCdXR0b25cIlxuICAgICAgICAgIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgIFtsYWJlbF09XCInc3Iuc2NoZWR1bGUuYWNjZXB0JyB8IHRyYW5zbGF0ZVwiIFxuICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWNjZXB0U2NoZWR1bGUoKVwiPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCJcbiAgICAgICAgICBwQnV0dG9uIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICBbbGFiZWxdPVwiJ3NyLnNjaGVkdWxlLmVkaXRfc2NoZWR1bGUnIHwgdHJhbnNsYXRlXCIgXG4gICAgICAgICAgaWNvbj1cInBpIHBpLXBlbmNpbFwiXG4gICAgICAgICAgKGNsaWNrKT1cImVkaXRTY2hlZHVsZSgpXCI+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgIFtsYWJlbF09XCInc3Iuc2NoZWR1bGUuY2xvc2UnIHwgdHJhbnNsYXRlXCIgXG4gICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZURpYWxvZygpXCI+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbjwvcC1kaWFsb2c+XG5cbjxwLWNvbmZpcm1EaWFsb2c+PC9wLWNvbmZpcm1EaWFsb2c+XG4iXX0=
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUtZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvc2NoZWR1bGUvY29tcG9uZW50cy9zY2hlZHVsZS1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9zY2hlZHVsZS9jb21wb25lbnRzL3NjaGVkdWxlLWRldGFpbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxVQUFVO0FBQ1YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUMsZ0JBQWdCO0FBQ2hCLE9BQU8sRUFBc0IsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJcEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1B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QUVELHVCQUF1QixDQUFDLFlBQWdDO1FBQ3RELE1BQU0sVUFBVSxHQUFxQztZQUNuRCxLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7UUFDRixPQUFPLFVBQVUsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDO0lBQ2xELENBQUM7d0dBckhVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDJaQUp2QixDQUFDLG1CQUFtQixDQUFDLDBCQzVDbEMsa3dNQWdJQSxpeUNEeEZJLFlBQVksa0lBQUUsWUFBWSwwZ0NBQUUsWUFBWSxvUUFBRSxTQUFTLCtKQUNuRCxhQUFhLDBKQUFFLGFBQWEscVhBQUUsbUJBQW1CLHVvQkFDakQsV0FBVyx3K0RBQUUsYUFBYSxrREFBRSxnQkFBZ0I7OzRGQU1uQyx1QkFBdUI7a0JBWm5DLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksV0FDUDt3QkFDUCxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxTQUFTO3dCQUNuRCxhQUFhLEVBQUUsYUFBYSxFQUFFLG1CQUFtQjt3QkFDakQsV0FBVyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0I7cUJBQzdDLGFBQ1UsQ0FBQyxtQkFBbUIsQ0FBQzt5SEFLdkIsT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8vIFByaW1lTkdcbmltcG9ydCB7IERpYWxvZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGlhbG9nJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IFRhZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFnJztcbmltcG9ydCB7IERpdmlkZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpdmlkZXInO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5pbXBvcnQgeyBDb25maXJtRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jb25maXJtZGlhbG9nJztcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBUYWJsZU1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuXG4vLyBDb21wb25lbnRzIEFJXG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UsIFRyYW5zbGF0ZVBpcGUsIExvYWRpbmdDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvY29tcG9uZW50cy1haSc7XG5cbi8vIExvY2FsXG5pbXBvcnQgeyBTY2hlZHVsZSwgU2NoZWR1bGVQYXJ0aWNpcGFudCB9IGZyb20gJy4uL21vZGVscy9zY2hlZHVsZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2NoZWR1bGVQcmlvcml0eSB9IGZyb20gJy4uL21vZGVscy9zY2hlZHVsZS5lbnVtcyc7XG5cbnR5cGUgUHJpb3JpdHlTZXZlcml0eSA9ICdzdWNjZXNzJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdkYW5nZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlV2l0aFBhcnRpY2lwYW50cyBleHRlbmRzIFNjaGVkdWxlIHtcbiAgcGFydGljaXBhbnRzPzogU2NoZWR1bGVQYXJ0aWNpcGFudFtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZHVyYXRpb24/OiBudW1iZXI7XG4gIGxvY2F0aW9uPzogc3RyaW5nO1xuICBvYnNlcnZhdGlvbnM/OiBzdHJpbmc7XG4gIHNjaGVkdWxlVHlwZT86IHsgaWQ/OiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZURldGFpbEFjdGlvbiB7XG4gIHR5cGU6ICdhY2NlcHQnIHwgJ3JlamVjdCcgfCAnY2FuY2VsJyB8ICdlZGl0JyB8ICdkZWxldGUnO1xuICBzY2hlZHVsZTogU2NoZWR1bGVXaXRoUGFydGljaXBhbnRzO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzLXNjaGVkdWxlLWRldGFpbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsIERpYWxvZ01vZHVsZSwgQnV0dG9uTW9kdWxlLCBUYWdNb2R1bGUsXG4gICAgRGl2aWRlck1vZHVsZSwgVG9vbHRpcE1vZHVsZSwgQ29uZmlybURpYWxvZ01vZHVsZSxcbiAgICBUYWJsZU1vZHVsZSwgVHJhbnNsYXRlUGlwZSwgTG9hZGluZ0NvbXBvbmVudFxuICBdLFxuICBwcm92aWRlcnM6IFtDb25maXJtYXRpb25TZXJ2aWNlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3NjaGVkdWxlLWRldGFpbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NjaGVkdWxlLWRldGFpbC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNjaGVkdWxlRGV0YWlsQ29tcG9uZW50IHtcbiAgQElucHV0KCkgdmlzaWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBzY2hlZHVsZTogU2NoZWR1bGVXaXRoUGFydGljaXBhbnRzIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxvYWRpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0FjY2VwdEJ1dHRvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93UmVqZWN0QnV0dG9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dDYW5jZWxCdXR0b24gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0VkaXRCdXR0b24gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RGVsZXRlQnV0dG9uID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBvbkFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8U2NoZWR1bGVEZXRhaWxBY3Rpb24+KCk7XG4gIEBPdXRwdXQoKSBvbkNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdDogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZVxuICApIHt9XG5cbiAgZ2V0IGRpYWxvZ0hlYWRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNjaGVkdWxlPy5uYW1lID8/IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9kZXRhaWxzJyk7XG4gIH1cblxuICBjbG9zZURpYWxvZygpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5vbkNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIGVkaXRTY2hlZHVsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zY2hlZHVsZSkge1xuICAgICAgdGhpcy5vbkFjdGlvbi5lbWl0KHsgdHlwZTogJ2VkaXQnLCBzY2hlZHVsZTogdGhpcy5zY2hlZHVsZSB9KTtcbiAgICB9XG4gIH1cblxuICBhY2NlcHRTY2hlZHVsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2NoZWR1bGUpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5vbkFjdGlvbi5lbWl0KHsgdHlwZTogJ2FjY2VwdCcsIHNjaGVkdWxlOiB0aGlzLnNjaGVkdWxlIH0pO1xuICB9XG5cbiAgcmVqZWN0U2NoZWR1bGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNjaGVkdWxlKSB7IHJldHVybjsgfVxuICAgIHRoaXMub25BY3Rpb24uZW1pdCh7IHR5cGU6ICdyZWplY3QnLCBzY2hlZHVsZTogdGhpcy5zY2hlZHVsZSB9KTtcbiAgfVxuXG4gIGNhbmNlbFNjaGVkdWxlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY2hlZHVsZSkgeyByZXR1cm47IH1cbiAgICB0aGlzLm9uQWN0aW9uLmVtaXQoeyB0eXBlOiAnY2FuY2VsJywgc2NoZWR1bGU6IHRoaXMuc2NoZWR1bGUgfSk7XG4gIH1cblxuICBkZWxldGVTY2hlZHVsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2NoZWR1bGUpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgbWVzc2FnZTogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLmRlbGV0ZV9jb25maXJtJyksXG4gICAgICBoZWFkZXI6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5jb25maXJtX2RlbGV0ZScpLFxuICAgICAgaWNvbjogJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJyxcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMueWVzJyksXG4gICAgICByZWplY3RMYWJlbDogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLm5vJyksXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2NoZWR1bGUpIHtcbiAgICAgICAgICB0aGlzLm9uQWN0aW9uLmVtaXQoeyB0eXBlOiAnZGVsZXRlJywgc2NoZWR1bGU6IHRoaXMuc2NoZWR1bGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldFByaW9yaXR5TGFiZWwocHJpb3JpdHk6IHN0cmluZyB8IFNjaGVkdWxlUHJpb3JpdHkgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghcHJpb3JpdHkpIHsgcmV0dXJuICcnOyB9XG4gICAgY29uc3QgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgW1NjaGVkdWxlUHJpb3JpdHkuTG93XTogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnByaW9yaXR5X2xvdycpLFxuICAgICAgW1NjaGVkdWxlUHJpb3JpdHkuTWVkaXVtXTogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnByaW9yaXR5X21lZGl1bScpLFxuICAgICAgW1NjaGVkdWxlUHJpb3JpdHkuSGlnaF06IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5wcmlvcml0eV9oaWdoJyksXG4gICAgICBbU2NoZWR1bGVQcmlvcml0eS5Dcml0aWNhbF06IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5wcmlvcml0eV9jcml0aWNhbCcpXG4gICAgfTtcbiAgICByZXR1cm4gbGFiZWxzW3ByaW9yaXR5XSA/PyBwcmlvcml0eTtcbiAgfVxuXG4gIGdldFByaW9yaXR5U2V2ZXJpdHkocHJpb3JpdHk6IHN0cmluZyB8IFNjaGVkdWxlUHJpb3JpdHkgfCB1bmRlZmluZWQpOiBQcmlvcml0eVNldmVyaXR5IHtcbiAgICBpZiAoIXByaW9yaXR5KSB7IHJldHVybiAnaW5mbyc7IH1cbiAgICBjb25zdCBzZXZlcml0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcmlvcml0eVNldmVyaXR5PiA9IHtcbiAgICAgIFtTY2hlZHVsZVByaW9yaXR5Lkxvd106ICdpbmZvJyxcbiAgICAgIFtTY2hlZHVsZVByaW9yaXR5Lk1lZGl1bV06ICdzdWNjZXNzJyxcbiAgICAgIFtTY2hlZHVsZVByaW9yaXR5LkhpZ2hdOiAnd2FybicsXG4gICAgICBbU2NoZWR1bGVQcmlvcml0eS5Dcml0aWNhbF06ICdkYW5nZXInXG4gICAgfTtcbiAgICByZXR1cm4gc2V2ZXJpdGllc1twcmlvcml0eV0gPz8gJ2luZm8nO1xuICB9XG5cbiAgZ2V0UGFydGljaXBhbnROYW1lKHA6IFNjaGVkdWxlUGFydGljaXBhbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBwLmNvbGxhYm9yYXRvcj8ubmFtZSA/PyAnJztcbiAgfVxuXG4gIGdldFBhcnRpY2lwYW50VHlwZShwOiBTY2hlZHVsZVBhcnRpY2lwYW50KTogc3RyaW5nIHtcbiAgICBpZiAocC5vcmdhbml6ZXIpIHsgcmV0dXJuIHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5vcmdhbml6ZXInKTsgfVxuICAgIHJldHVybiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMucGFydGljaXBhbnRfY29sbGFib3JhdG9yJyk7XG4gIH1cblxuICBnZXRQYXJ0aWNpcGFudFR5cGVJY29uKHA6IFNjaGVkdWxlUGFydGljaXBhbnQpOiBzdHJpbmcge1xuICAgIGlmIChwLm9yZ2FuaXplcikgeyByZXR1cm4gJ3BpIHBpLXN0YXInOyB9XG4gICAgcmV0dXJuICdwaSBwaS11c2VyJztcbiAgfVxuXG4gIGdldENvbmZpcm1hdGlvbkxhYmVsKGNvbmZpcm1hdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIWNvbmZpcm1hdGlvbikgeyByZXR1cm4gJyc7IH1cbiAgICBjb25zdCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnWUVTJzogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLmNvbmZpcm1hdGlvbl95ZXMnKSxcbiAgICAgICdOTyc6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5jb25maXJtYXRpb25fbm8nKVxuICAgIH07XG4gICAgcmV0dXJuIGxhYmVsc1tjb25maXJtYXRpb25dID8/IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5jb25maXJtYXRpb25fcGVuZGluZycpO1xuICB9XG5cbiAgZ2V0Q29uZmlybWF0aW9uU2V2ZXJpdHkoY29uZmlybWF0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcmlvcml0eVNldmVyaXR5IHtcbiAgICBjb25zdCBzZXZlcml0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcmlvcml0eVNldmVyaXR5PiA9IHtcbiAgICAgICdZRVMnOiAnc3VjY2VzcycsXG4gICAgICAnTk8nOiAnZGFuZ2VyJ1xuICAgIH07XG4gICAgcmV0dXJuIHNldmVyaXRpZXNbY29uZmlybWF0aW9uID8/ICcnXSA/PyAnd2Fybic7XG4gIH1cbn1cbiIsIjxwLWRpYWxvZyBbKHZpc2libGUpXT1cInZpc2libGVcIiBbaGVhZGVyXT1cImRpYWxvZ0hlYWRlclwiIFttb2RhbF09XCJ0cnVlXCJcbiAgW3N0eWxlQ2xhc3NdPVwiJ3NjaGVkdWxlLWRldGFpbC1kaWFsb2cnXCIgW2RyYWdnYWJsZV09XCJmYWxzZVwiIFtyZXNpemFibGVdPVwiZmFsc2VcIlxuICAob25IaWRlKT1cImNsb3NlRGlhbG9nKClcIj5cblxuICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWRpYWxvZy1ib2R5XCIgKm5nSWY9XCJzY2hlZHVsZVwiPlxuICAgIDxzaWEtbG9hZGluZyAqbmdJZj1cImxvYWRpbmdcIj48L3NpYS1sb2FkaW5nPlxuXG4gICAgPGRpdiBjbGFzcz1cImRldGFpbC1kaWFsb2ctc2VjdGlvblwiICpuZ0lmPVwiIWxvYWRpbmdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtZGlhbG9nLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPnt7ICdjcm14LmNvbXBvbmVudHMucHJpb3JpdHknIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8cC10YWcgW3ZhbHVlXT1cImdldFByaW9yaXR5TGFiZWwoc2NoZWR1bGUucHJpb3JpdHkpXCJcbiAgICAgICAgICBbc2V2ZXJpdHldPVwiZ2V0UHJpb3JpdHlTZXZlcml0eShzY2hlZHVsZS5wcmlvcml0eSlcIj48L3AtdGFnPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWRpYWxvZy1yb3dcIiAqbmdJZj1cInNjaGVkdWxlLnNjaGVkdWxlVHlwZSA/PyBzY2hlZHVsZS50eXBlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+e3sgJ2NybXguY29tcG9uZW50cy50eXBlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgKHNjaGVkdWxlLnNjaGVkdWxlVHlwZSA/PyBzY2hlZHVsZS50eXBlKT8ubmFtZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1kaWFsb2ctcm93XCIgKm5nSWY9XCJzY2hlZHVsZS5zdGFydERhdGVcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj57eyAnY3JteC5jb21wb25lbnRzLnN0YXJ0X2RhdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBzY2hlZHVsZS5zdGFydERhdGUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtZGlhbG9nLXJvd1wiICpuZ0lmPVwic2NoZWR1bGUuZW5kRGF0ZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPnt7ICdjcm14LmNvbXBvbmVudHMuZW5kX2RhdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBzY2hlZHVsZS5lbmREYXRlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWRpYWxvZy1yb3dcIiAqbmdJZj1cIiFzY2hlZHVsZS5hbGxEYXkgJiYgc2NoZWR1bGUuc3RhcnRUaW1lXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+e3sgJ2NybXguY29tcG9uZW50cy5zdGFydF90aW1lJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgc2NoZWR1bGUuc3RhcnRUaW1lIH19IC0ge3sgc2NoZWR1bGUuZW5kVGltZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1kaWFsb2ctcm93XCIgKm5nSWY9XCJzY2hlZHVsZS5hbGxEYXlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj57eyAnY3JteC5jb21wb25lbnRzLnN0YXJ0X3RpbWUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyAnY3JteC5jb21wb25lbnRzLmFsbF9kYXknIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWRpYWxvZy1yb3dcIiAqbmdJZj1cInNjaGVkdWxlLndoZW5PY2N1cnNcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj57eyAnY3JteC5jb21wb25lbnRzLnJlY3VycmVuY2UnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBzY2hlZHVsZS53aGVuT2NjdXJzIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWRpYWxvZy1yb3dcIiAqbmdJZj1cInNjaGVkdWxlLmNvbW1lbnRzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+e3sgJ2NybXguY29tcG9uZW50cy5jb21tZW50cycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IHNjaGVkdWxlLmNvbW1lbnRzIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8cC1kaXZpZGVyICpuZ0lmPVwiIWxvYWRpbmdcIj48L3AtZGl2aWRlcj5cblxuICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtZGlhbG9nLXNlY3Rpb25cIiAqbmdJZj1cIiFsb2FkaW5nICYmIHNjaGVkdWxlLnBhcnRpY2lwYW50c1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXVzZXJzXCI+PC9pPlxuICAgICAgICA8c3Bhbj57eyAnY3JteC5jb21wb25lbnRzLnBhcnRpY2lwYW50cycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJzY2hlZHVsZS5wYXJ0aWNpcGFudHNcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc20gcC1kYXRhdGFibGUtc3RyaXBlZFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3sgJ2NybXguY29tcG9uZW50cy5uYW1lJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiBjbGFzcz1cImNvbC1wYXJ0aWNpcGFudC10eXBlXCI+e3sgJ2NybXguY29tcG9uZW50cy5wYXJ0aWNpcGFudF90eXBlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiBjbGFzcz1cImNvbC1zdGF0dXNcIj57eyAnY3JteC5jb21wb25lbnRzLnN0YXR1cycgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXA+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkPnt7IGdldFBhcnRpY2lwYW50TmFtZShwKSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNpcGFudC10eXBlLWNlbGxcIj5cbiAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiZ2V0UGFydGljaXBhbnRUeXBlSWNvbihwKVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRQYXJ0aWNpcGFudFR5cGUocCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPHAtdGFnICpuZ0lmPVwicC5vcmdhbml6ZXJcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCInY3JteC5jb21wb25lbnRzLnBhcnRpY2lwYW50X29yZ2FuaXplcl9sYWJlbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHNldmVyaXR5PVwiaW5mb1wiPjwvcC10YWc+XG4gICAgICAgICAgICAgIDxwLXRhZyAqbmdJZj1cIiFwLm9yZ2FuaXplclwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldENvbmZpcm1hdGlvbkxhYmVsKHAuY29uZmlybWF0aW9uKVwiXG4gICAgICAgICAgICAgICAgW3NldmVyaXR5XT1cImdldENvbmZpcm1hdGlvblNldmVyaXR5KHAuY29uZmlybWF0aW9uKVwiPjwvcC10YWc+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhcnRpY2lwYW50cy1lbXB0eVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktdXNlcnNcIj48L2k+XG4gICAgICAgICAgICAgICAgPHA+e3sgJ2NybXguY29tcG9uZW50cy5ub19wYXJ0aWNpcGFudHMnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvcC10YWJsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctZm9vdGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWxlZnRcIj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtsYWJlbF09XCInY3JteC5jb21wb25lbnRzLmRlbGV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiIGNsYXNzPVwicC1idXR0b24tZGFuZ2VyIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgIChjbGljayk9XCJkZWxldGVTY2hlZHVsZSgpXCI+e3sgJ2NybXguY29tcG9uZW50cy5kZWxldGUnIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXItcmlnaHRcIj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dSZWplY3RCdXR0b25cIiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIGNsYXNzPVwicC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXJcIlxuICAgICAgICAgIFtwVG9vbHRpcF09XCInY3JteC5jb21wb25lbnRzLnJlamVjdCcgfCB0cmFuc2xhdGVcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2NybXguY29tcG9uZW50cy5yZWplY3QnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAoY2xpY2spPVwicmVqZWN0U2NoZWR1bGUoKVwiPjwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd0FjY2VwdEJ1dHRvblwiIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXN1Y2Nlc3NcIlxuICAgICAgICAgIFtwVG9vbHRpcF09XCInY3JteC5jb21wb25lbnRzLmFjY2VwdCcgfCB0cmFuc2xhdGVcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2NybXguY29tcG9uZW50cy5hY2NlcHQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWNjZXB0U2NoZWR1bGUoKVwiPjwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvblwiIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgaWNvbj1cInBpIHBpLWJhblwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBwLWJ1dHRvbi13YXJuaW5nXCJcbiAgICAgICAgICBbcFRvb2x0aXBdPVwiJ2NybXguY29tcG9uZW50cy5jYW5jZWxfc2NoZWR1bGUnIHwgdHJhbnNsYXRlXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidjcm14LmNvbXBvbmVudHMuY2FuY2VsX3NjaGVkdWxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNhbmNlbFNjaGVkdWxlKClcIj48L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJ2NybXguY29tcG9uZW50cy5lZGl0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgaWNvbj1cInBpIHBpLXBlbmNpbFwiIChjbGljayk9XCJlZGl0U2NoZWR1bGUoKVwiPnt7ICdjcm14LmNvbXBvbmVudHMuZWRpdCcgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtsYWJlbF09XCInY3JteC5jb21wb25lbnRzLmNsb3NlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VEaWFsb2coKVwiPnt7ICdjcm14LmNvbXBvbmVudHMuY2xvc2UnIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC1kaWFsb2c+XG5cbjxwLWNvbmZpcm1EaWFsb2c+PC9wLWNvbmZpcm1EaWFsb2c+XG4iXX0=