tas-uell-sdk 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -234,6 +234,7 @@ interface TasAppointment {
234
234
  - **CallState**: `IDLE`, `CONNECTING`, `CONNECTED`, `DISCONNECTED`, `ERROR`
235
235
  - **ViewMode**: `FULLSCREEN`, `PIP`
236
236
  - **AppointmentStatus**: `CONFIRMED`, `CANCELLED`, `RESCHEDULED`
237
+ - **GeoStatus**: `PENDING`, `GRANTED`, `DENIED`
237
238
 
238
239
  ## Exported Services
239
240
 
@@ -272,12 +273,14 @@ Initiates video calls. Supports style variants:
272
273
 
273
274
  ### TasIncomingAppointmentComponent - `<tas-incoming-appointment>`
274
275
 
275
- Displays the user's next scheduled appointment or an empty state. Uses `<tas-btn>` internally.
276
+ Displays a list of appointments within a date range or an empty state. Uses `<tas-btn>` internally and only shows the button for appointments with `CONFIRMED` or `ACTIVE` status.
276
277
 
277
278
  ```html
278
279
  <tas-incoming-appointment
279
280
  [entityId]="123"
280
281
  [tenant]="'tenant'"
282
+ [fromDate]="'2024-01-01'"
283
+ [toDate]="'2024-01-31'"
281
284
  [currentUser]="user"
282
285
  [businessRole]="'USER'"
283
286
  (enterCall)="onEnterCall($event)"
@@ -288,6 +291,8 @@ Displays the user's next scheduled appointment or an empty state. Uses `<tas-btn
288
291
  | :--- | :--- | :--- | :--- | :--- |
289
292
  | `entityId` | `number` | Yes | - | Entity/ausencia ID |
290
293
  | `tenant` | `string` | Yes | - | Tenant identifier |
294
+ | `fromDate` | `string` | Yes | - | Start date (YYYY-MM-DD) |
295
+ | `toDate` | `string` | Yes | - | End date (YYYY-MM-DD) |
291
296
  | `currentUser` | `TasCurrentUser` | Yes | - | Current user info |
292
297
  | `roomType` | `TasRoomType` | No | `'TAS'` | Room type |
293
298
  | `businessRole` | `TasBusinessRole` | No | `'USER'` | User's business role |
@@ -296,6 +301,8 @@ Displays the user's next scheduled appointment or an empty state. Uses `<tas-btn
296
301
  | :--- | :--- | :--- |
297
302
  | `enterCall` | `EventEmitter<TasAppointment>` | Emits appointment when clicking "Ingresar" |
298
303
 
304
+ **Date format:** Dates must be in `YYYY-MM-DD` format (e.g., `2024-01-15`). If `fromDate` and `toDate` are the same, the API will be called with a single `initDate` parameter.
305
+
299
306
  **Note:** Requires the `TasHttpClient` adapter to implement the `get()` method.
300
307
 
301
308
  ### Other Components
@@ -19,13 +19,16 @@ export class TasButtonComponent {
19
19
  // Style customization
20
20
  this.variant = 'default';
21
21
  this.buttonLabel = 'Iniciar TAS';
22
+ // Skip status check - when true, button shows immediately without API call
23
+ // Useful when parent component already knows the appointment is valid
24
+ this.skipStatusCheck = false;
22
25
  this.isLoading = false;
23
26
  // Status check state
24
27
  this.isCheckingStatus = false;
25
28
  this.isStatusError = false;
26
29
  this.statusErrorMessage = '';
27
30
  this.isJoinable = false; // Tracks joinable field from status response
28
- this.shouldShowButton = true; // Controls button visibility
31
+ this.shouldShowButton = false; // Hidden by default, shown after status check confirms visibility
29
32
  this.subscriptions = new Subscription();
30
33
  this.currentModalRef = null;
31
34
  this.videoCallModalRef = null;
@@ -63,6 +66,12 @@ export class TasButtonComponent {
63
66
  this.videoCallModalRef = null;
64
67
  }
65
68
  }));
69
+ // If skipStatusCheck is true, show button immediately without polling
70
+ if (this.skipStatusCheck) {
71
+ this.shouldShowButton = true;
72
+ this.isJoinable = true;
73
+ return;
74
+ }
66
75
  // Start status checking
67
76
  this.startStatusPolling();
68
77
  }
@@ -109,6 +118,11 @@ export class TasButtonComponent {
109
118
  })
110
119
  .subscribe({
111
120
  next: (response) => {
121
+ // Validate response structure
122
+ if (!response || !response.content) {
123
+ this.handleStatusError('Invalid response');
124
+ return;
125
+ }
112
126
  this.isCheckingStatus = false;
113
127
  this.isStatusError = false;
114
128
  this.statusErrorMessage = '';
@@ -117,23 +131,20 @@ export class TasButtonComponent {
117
131
  this.isJoinable = response.content?.joinable ?? false;
118
132
  },
119
133
  error: (err) => {
120
- this.isCheckingStatus = false;
121
- const errorMessage = this.tasUtilityService.extractErrorMessage(err, 'Error checking status');
122
- this.statusErrorMessage = errorMessage;
123
- // Use utility service to determine if button should be shown
124
- this.shouldShowButton = this.tasUtilityService.shouldShowButton(errorMessage);
125
- // Stop polling on error
126
- this.stopStatusPolling();
127
- // If button should be hidden, don't treat as error
128
- if (!this.shouldShowButton) {
129
- this.isStatusError = false;
130
- }
131
- else {
132
- this.isStatusError = true;
133
- }
134
+ this.handleStatusError(err);
134
135
  },
135
136
  }));
136
137
  }
138
+ handleStatusError(err) {
139
+ this.isCheckingStatus = false;
140
+ const errorMessage = this.tasUtilityService.extractErrorMessage(err, 'Error checking status');
141
+ this.statusErrorMessage = errorMessage;
142
+ // On any status error, hide the button
143
+ this.shouldShowButton = false;
144
+ this.isStatusError = false; // We don't show error UI, just hide the button
145
+ // Stop polling on error
146
+ this.stopStatusPolling();
147
+ }
137
148
  onClick() {
138
149
  if (!this.tenant || !this.currentUser?.name) {
139
150
  return;
@@ -182,7 +193,7 @@ export class TasButtonComponent {
182
193
  }
183
194
  }
184
195
  TasButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasButtonComponent, deps: [{ token: i1.NgbModal }, { token: i2.TasService }, { token: i3.TasUtilityService }], target: i0.ɵɵFactoryTarget.Component });
185
- TasButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasButtonComponent, selector: "tas-btn", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser", variant: "variant", buttonLabel: "buttonLabel" }, ngImport: i0, template: "<span\n *ngIf=\"shouldShowButton\"\n [ngbTooltip]=\"isDisabled && disabledReason ? disabledReason : null\"\n container=\"body\"\n placement=\"top\"\n tooltipClass=\"tas-btn-tooltip\"\n>\n <button\n type=\"button\"\n class=\"btn btn-primary tas-btn\"\n [class.tas-btn--teal]=\"variant === 'teal'\"\n (click)=\"onClick()\"\n [disabled]=\"isDisabled\"\n >\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\">{{ buttonLabel }}</span>\n <span *ngIf=\"isLoading\">Processing...</span>\n </button>\n</span>\n", styles: [":host{display:inline-block}.tas-btn{background-color:#ee316b!important;color:#fff!important;border-color:#ee316b!important;margin-right:24px;display:flex;padding:6px 14px;justify-content:center;align-items:center;gap:7px;flex-shrink:0;flex-grow:0}.tas-btn:disabled{background-color:#ccc!important;border-color:#ccc!important;cursor:not-allowed}.tas-btn:hover:not(:disabled){background-color:#d62a5f!important;border-color:#d62a5f!important}.tas-btn i{margin-right:5px}.tas-btn--teal{background-color:#0097a7!important;border-color:#0097a7!important;border-radius:24px;font-weight:500;margin-right:0;padding:6px 14px}.tas-btn--teal:hover:not(:disabled){background-color:#00838f!important;border-color:#00838f!important}\n"], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] });
196
+ TasButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasButtonComponent, selector: "tas-btn", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser", variant: "variant", buttonLabel: "buttonLabel", skipStatusCheck: "skipStatusCheck" }, ngImport: i0, template: "<span\n *ngIf=\"shouldShowButton\"\n [ngbTooltip]=\"isDisabled && disabledReason ? disabledReason : null\"\n container=\"body\"\n placement=\"top\"\n tooltipClass=\"tas-btn-tooltip\"\n>\n <button\n type=\"button\"\n class=\"btn btn-primary tas-btn\"\n [class.tas-btn--teal]=\"variant === 'teal'\"\n (click)=\"onClick()\"\n [disabled]=\"isDisabled\"\n >\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\">{{ buttonLabel }}</span>\n <span *ngIf=\"isLoading\">Processing...</span>\n </button>\n</span>\n", styles: [":host{display:inline-block}.tas-btn{background-color:#ee316b!important;color:#fff!important;border-color:#ee316b!important;margin-right:24px;display:flex;padding:6px 14px;justify-content:center;align-items:center;gap:7px;flex-shrink:0;flex-grow:0}.tas-btn:disabled{background-color:#ccc!important;border-color:#ccc!important;cursor:not-allowed}.tas-btn:hover:not(:disabled){background-color:#d62a5f!important;border-color:#d62a5f!important}.tas-btn i{margin-right:5px}.tas-btn--teal{background-color:#0097a7!important;border-color:#0097a7!important;border-radius:24px;font-weight:500;margin-right:0;padding:6px 14px}.tas-btn--teal:hover:not(:disabled){background-color:#00838f!important;border-color:#00838f!important}\n"], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] });
186
197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasButtonComponent, decorators: [{
187
198
  type: Component,
188
199
  args: [{ selector: 'tas-btn', template: "<span\n *ngIf=\"shouldShowButton\"\n [ngbTooltip]=\"isDisabled && disabledReason ? disabledReason : null\"\n container=\"body\"\n placement=\"top\"\n tooltipClass=\"tas-btn-tooltip\"\n>\n <button\n type=\"button\"\n class=\"btn btn-primary tas-btn\"\n [class.tas-btn--teal]=\"variant === 'teal'\"\n (click)=\"onClick()\"\n [disabled]=\"isDisabled\"\n >\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\">{{ buttonLabel }}</span>\n <span *ngIf=\"isLoading\">Processing...</span>\n </button>\n</span>\n", styles: [":host{display:inline-block}.tas-btn{background-color:#ee316b!important;color:#fff!important;border-color:#ee316b!important;margin-right:24px;display:flex;padding:6px 14px;justify-content:center;align-items:center;gap:7px;flex-shrink:0;flex-grow:0}.tas-btn:disabled{background-color:#ccc!important;border-color:#ccc!important;cursor:not-allowed}.tas-btn:hover:not(:disabled){background-color:#d62a5f!important;border-color:#d62a5f!important}.tas-btn i{margin-right:5px}.tas-btn--teal{background-color:#0097a7!important;border-color:#0097a7!important;border-radius:24px;font-weight:500;margin-right:0;padding:6px 14px}.tas-btn--teal:hover:not(:disabled){background-color:#00838f!important;border-color:#00838f!important}\n"] }]
@@ -200,5 +211,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
200
211
  type: Input
201
212
  }], buttonLabel: [{
202
213
  type: Input
214
+ }], skipStatusCheck: [{
215
+ type: Input
203
216
  }] } });
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWJ0bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBR0wsV0FBVyxFQUNYLFFBQVEsRUFDUixlQUFlLEdBQ2hCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7OztBQVNqRixNQUFNLE9BQU8sa0JBQWtCO0lBeUQ3QixZQUNVLFlBQXNCLEVBQ3RCLFVBQXNCLEVBQ3RCLGlCQUFvQztRQUZwQyxpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUN0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUEzRDlDLHlCQUF5QjtRQUNoQixhQUFRLEdBQWdCLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFHeEMsaUJBQVksR0FBb0IsZUFBZSxDQUFDLElBQUksQ0FBQztRQUs5RCxzQkFBc0I7UUFDYixZQUFPLEdBQXVCLFNBQVMsQ0FBQztRQUN4QyxnQkFBVyxHQUFXLGFBQWEsQ0FBQztRQUV0QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRXpCLHFCQUFxQjtRQUNkLHFCQUFnQixHQUFHLEtBQUssQ0FBQztR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OUIsU0FBUzsrQkFDRSxTQUFTO3dKQU1WLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYk1vZGFsLCBOZ2JNb2RhbFJlZiB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgVGFzQ3VycmVudFVzZXIsXG4gIFxuICBUYXNSb29tVHlwZSxcbiAgVmlld01vZGUsXG4gIFRhc0J1c2luZXNzUm9sZSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUYXNXYWl0aW5nUm9vbUNvbXBvbmVudCB9IGZyb20gJy4uL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFzVmlkZW9jYWxsQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFzLXZpZGVvY2FsbC90YXMtdmlkZW9jYWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFzVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMtdXRpbGl0eS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLWJ0bicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXMtYnRuLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzLWJ0bi5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vIFN0YXR1cyBlbmRwb2ludCBwYXJhbXNcbiAgQElucHV0KCkgcm9vbVR5cGU6IFRhc1Jvb21UeXBlID0gVGFzUm9vbVR5cGUuVEFTO1xuICBASW5wdXQoKSBlbnRpdHlJZCE6IG51bWJlcjtcbiAgQElucHV0KCkgdGVuYW50ITogc3RyaW5nO1xuICBASW5wdXQoKSBidXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZSA9IFRhc0J1c2luZXNzUm9sZS5VU0VSO1xuXG4gIC8vIFVzZXIgaW5mbyBmb3IgdG9rZW4gcmVxdWVzdFxuICBASW5wdXQoKSBjdXJyZW50VXNlciE6IFRhc0N1cnJlbnRVc2VyO1xuXG4gIC8vIFN0eWxlIGN1c3RvbWl6YXRpb25cbiAgQElucHV0KCkgdmFyaWFudDogJ2RlZmF1bHQnIHwgJ3RlYWwnID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBidXR0b25MYWJlbDogc3RyaW5nID0gJ0luaWNpYXIgVEFTJztcblxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgLy8gU3RhdHVzIGNoZWNrIHN0YXRlXG4gIHB1YmxpYyBpc0NoZWNraW5nU3RhdHVzID0gZmFsc2U7XG4gIHB1YmxpYyBpc1N0YXR1c0Vycm9yID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcbiAgcHVibGljIGlzSm9pbmFibGUgPSBmYWxzZTsgLy8gVHJhY2tzIGpvaW5hYmxlIGZpZWxkIGZyb20gc3RhdHVzIHJlc3BvbnNlXG4gIHB1YmxpYyBzaG91bGRTaG93QnV0dG9uID0gdHJ1ZTsgLy8gQ29udHJvbHMgYnV0dG9uIHZpc2liaWxpdHlcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgY3VycmVudE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZpZGVvQ2FsbE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXR1c1BvbGxpbmdJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgU1RBVFVTX1BPTExfSU5URVJWQUxfTVMgPSAzMDAwMDsgLy8gMzAgc2Vjb25kc1xuXG4gIC8qKiBXaGV0aGVyIHVzZXIgaXMgYmFja29mZmljZSAob3IgYWRtaW4vbWFuYWdlcikgKi9cbiAgcHVibGljIGdldCBpc0JhY2tvZmZpY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuQkFDS09GRklDRSB8fFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5BRE1JTl9NQU5BR0VSIHx8XG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLk1BTkFHRVJcbiAgICApO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQgKi9cbiAgcHVibGljIGdldCBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGluZyB8fCB0aGlzLmlzU3RhdHVzRXJyb3IgfHwgIXRoaXMuaXNKb2luYWJsZTtcbiAgfVxuXG4gIC8qKiBSZWFzb24gd2h5IHRoZSBidXR0b24gaXMgZGlzYWJsZWQgKGZvciB0b29sdGlwKSAqL1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkUmVhc29uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzU3RhdHVzRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXR1c0Vycm9yTWVzc2FnZSB8fCAnRXJyb3IgYWwgdmVyaWZpY2FyIGVsIGVzdGFkbyc7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0pvaW5hYmxlKSB7XG4gICAgICByZXR1cm4gJ1RvZGF2w61hIG5vIGVzIGVsIGhvcmFyaW8gZGUgbGEgbGxhbWFkYSc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgICBwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YXNVdGlsaXR5U2VydmljZTogVGFzVXRpbGl0eVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFN1YnNjcmliZSB0byB2aWV3TW9kZSB0byBoYW5kbGUgUGlQIHJldHVyblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uudmlld01vZGUkLnN1YnNjcmliZSgobW9kZSkgPT4ge1xuICAgICAgICAvLyBXaGVuIGVudGVyaW5nIFBpUCwgY2xlYXIgdGhlIHZpZGVvQ2FsbE1vZGFsUmVmIHNpbmNlIG1vZGFsIHdpbGwgY2xvc2VcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBTdGFydCBzdGF0dXMgY2hlY2tpbmdcbiAgICB0aGlzLnN0YXJ0U3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHBvbGxpbmcgc3RhdHVzIGV2ZXJ5IDMwIHNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgc3RhcnRTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIC8vIEluaXRpYWwgc3RhdHVzIGNoZWNrXG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuXG4gICAgLy8gU2V0IHVwIHBlcmlvZGljIHBvbGxpbmdcbiAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgICB9LCB0aGlzLlNUQVRVU19QT0xMX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHN0YXR1cyBwb2xsaW5nXG4gICAqL1xuICBwcml2YXRlIHN0b3BTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCk7XG4gICAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyBlbmRwb2ludCB0byBkZXRlcm1pbmUgaWYgYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIC8vIFNraXAgaWYgcmVxdWlyZWQgaW5wdXRzIGFyZSBub3QgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLnRlbmFudCB8fCAhdGhpcy5lbnRpdHlJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IHRydWU7XG4gICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2VcbiAgICAgICAgLmdldFByb3h5VmlkZW9TdGF0dXMoe1xuICAgICAgICAgIHJvb21UeXBlOiB0aGlzLnJvb21UeXBlLFxuICAgICAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgICAgIHRlbmFudDogdGhpcy50ZW5hbnQsXG4gICAgICAgICAgYnVzaW5lc3NSb2xlOiB0aGlzLmJ1c2luZXNzUm9sZSxcbiAgICAgICAgfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNTdGF0dXNFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkU2hvd0J1dHRvbiA9IHRydWU7XG4gICAgICAgICAgICAvLyBVcGRhdGUgam9pbmFibGUgc3RhdGUgZnJvbSByZXNwb25zZVxuICAgICAgICAgICAgdGhpcy5pc0pvaW5hYmxlID0gcmVzcG9uc2UuY29udGVudD8uam9pbmFibGUgPz8gZmFsc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0NoZWNraW5nU3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0aGlzLnRhc1V0aWxpdHlTZXJ2aWNlLmV4dHJhY3RFcnJvck1lc3NhZ2UoZXJyLCAnRXJyb3IgY2hlY2tpbmcgc3RhdHVzJyk7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0Vycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTtcblxuICAgICAgICAgICAgLy8gVXNlIHV0aWxpdHkgc2VydmljZSB0byBkZXRlcm1pbmUgaWYgYnV0dG9uIHNob3VsZCBiZSBzaG93blxuICAgICAgICAgICAgdGhpcy5zaG91bGRTaG93QnV0dG9uID0gdGhpcy50YXNVdGlsaXR5U2VydmljZS5zaG91bGRTaG93QnV0dG9uKGVycm9yTWVzc2FnZSk7XG5cbiAgICAgICAgICAgIC8vIFN0b3AgcG9sbGluZyBvbiBlcnJvclxuICAgICAgICAgICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuXG4gICAgICAgICAgICAvLyBJZiBidXR0b24gc2hvdWxkIGJlIGhpZGRlbiwgZG9uJ3QgdHJlYXQgYXMgZXJyb3JcbiAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRTaG93QnV0dG9uKSB7XG4gICAgICAgICAgICAgIHRoaXMuaXNTdGF0dXNFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pc1N0YXR1c0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW5hbnQgfHwgIXRoaXMuY3VycmVudFVzZXI/Lm5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW50aXR5SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5XYWl0aW5nUm9vbU1vZGFsKCk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5XYWl0aW5nUm9vbU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihUYXNXYWl0aW5nUm9vbUNvbXBvbmVudCwge1xuICAgICAgc2l6ZTogJ2xnJyxcbiAgICAgIHdpbmRvd0NsYXNzOiAndGFzLXdhaXRpbmctcm9vbS1tb2RhbCcsXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXG4gICAgICBrZXlib2FyZDogZmFsc2UsXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFBhc3MgYWxsIG5lY2Vzc2FyeSBpbnB1dHMgdG8gdGhlIHdhaXRpbmcgcm9vbSBjb21wb25lbnRcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5yb29tVHlwZSA9IHRoaXMucm9vbVR5cGU7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZW50aXR5SWQgPSB0aGlzLmVudGl0eUlkO1xuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRlbmFudCA9IHRoaXMudGVuYW50O1xuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmJ1c2luZXNzUm9sZSA9IHRoaXMuYnVzaW5lc3NSb2xlO1xuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmN1cnJlbnRVc2VyID0gdGhpcy5jdXJyZW50VXNlcjtcblxuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLnJlc3VsdC50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlblZpZGVvQ2FsbE1vZGFsKGlzUmV0dXJuaW5nRnJvbVBpcDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVGFzVmlkZW9jYWxsQ29tcG9uZW50LCB7XG4gICAgICBzaXplOiAneGwnLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtdmlkZW8tbW9kYWwnLFxuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxuICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5zZXNzaW9uSWQgPSB0aGlzLnRhc1NlcnZpY2Uuc2Vzc2lvbklkO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudG9rZW4gPSB0aGlzLnRhc1NlcnZpY2UudG9rZW47XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5idXNpbmVzc1JvbGUgPSB0aGlzLmJ1c2luZXNzUm9sZTtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmlzUmV0dXJuaW5nRnJvbVBpcCA9IGlzUmV0dXJuaW5nRnJvbVBpcDtcblxuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYucmVzdWx0LnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwiPHNwYW5cbiAgKm5nSWY9XCJzaG91bGRTaG93QnV0dG9uXCJcbiAgW25nYlRvb2x0aXBdPVwiaXNEaXNhYmxlZCAmJiBkaXNhYmxlZFJlYXNvbiA/IGRpc2FibGVkUmVhc29uIDogbnVsbFwiXG4gIGNvbnRhaW5lcj1cImJvZHlcIlxuICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICB0b29sdGlwQ2xhc3M9XCJ0YXMtYnRuLXRvb2x0aXBcIlxuPlxuICA8YnV0dG9uXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGFzLWJ0blwiXG4gICAgW2NsYXNzLnRhcy1idG4tLXRlYWxdPVwidmFyaWFudCA9PT0gJ3RlYWwnXCJcbiAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4gID5cbiAgICA8aSBjbGFzcz1cImZhIGZhLXZpZGVvLWNhbWVyYVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPjwvaT5cbiAgICA8c3BhbiAqbmdJZj1cIiFpc0xvYWRpbmdcIj57eyBidXR0b25MYWJlbCB9fTwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cImlzTG9hZGluZ1wiPlByb2Nlc3NpbmcuLi48L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9zcGFuPlxuIl19
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWJ0bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBR0wsV0FBVyxFQUNYLFFBQVEsRUFDUixlQUFlLEdBQ2hCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7OztBQVNqRixNQUFNLE9BQU8sa0JBQWtCO0lBNkQ3QixZQUNVLFlBQXNCLEVBQ3RCLFVBQXNCLEVBQ3RCLGlCQUFvQztRQUZwQyxpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUN0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUEvRDlDLHlCQUF5QjtRQUNoQixhQUFRLEdBQWdCLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFHeEMsaUJBQVksR0FBb0IsZUFBZSxDQUFDLElBQUksQ0FBQztRQUs5RCxzQkFBc0I7UUFDYixZQUFPLEdBQXVCLFNBQVMsQ0FBQztRQUN4QyxnQkFBVyxHQUFXLGFBQWEsQ0FBQztRQUU3QywyRUFBMkU7UUFDM0Usc0VBQXNFO1FBQzdELG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRTFCLGNBQVMsR0FB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akYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2hDLEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQyxFQUNELEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDOztnSEF4T1Usa0JBQWtCO29HQUFsQixrQkFBa0IsdVFDcEIvQixpbEJBbUJBOzRGRENhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxTQUFTO3dKQU1WLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiTW9kYWwsIE5nYk1vZGFsUmVmIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBUYXNDdXJyZW50VXNlcixcbiAgXG4gIFRhc1Jvb21UeXBlLFxuICBWaWV3TW9kZSxcbiAgVGFzQnVzaW5lc3NSb2xlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRhc1dhaXRpbmdSb29tQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFzLXdhaXRpbmctcm9vbS90YXMtd2FpdGluZy1yb29tLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNWaWRlb2NhbGxDb21wb25lbnQgfSBmcm9tICcuLi90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50JztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQgeyBUYXNVdGlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Rhcy11dGlsaXR5LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXMtYnRuJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhcy1idG4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YXMtYnRuLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhc0J1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLy8gU3RhdHVzIGVuZHBvaW50IHBhcmFtc1xuICBASW5wdXQoKSByb29tVHlwZTogVGFzUm9vbVR5cGUgPSBUYXNSb29tVHlwZS5UQVM7XG4gIEBJbnB1dCgpIGVudGl0eUlkITogbnVtYmVyO1xuICBASW5wdXQoKSB0ZW5hbnQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJ1c2luZXNzUm9sZTogVGFzQnVzaW5lc3NSb2xlID0gVGFzQnVzaW5lc3NSb2xlLlVTRVI7XG5cbiAgLy8gVXNlciBpbmZvIGZvciB0b2tlbiByZXF1ZXN0XG4gIEBJbnB1dCgpIGN1cnJlbnRVc2VyITogVGFzQ3VycmVudFVzZXI7XG5cbiAgLy8gU3R5bGUgY3VzdG9taXphdGlvblxuICBASW5wdXQoKSB2YXJpYW50OiAnZGVmYXVsdCcgfCAndGVhbCcgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIGJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnSW5pY2lhciBUQVMnO1xuXG4gIC8vIFNraXAgc3RhdHVzIGNoZWNrIC0gd2hlbiB0cnVlLCBidXR0b24gc2hvd3MgaW1tZWRpYXRlbHkgd2l0aG91dCBBUEkgY2FsbFxuICAvLyBVc2VmdWwgd2hlbiBwYXJlbnQgY29tcG9uZW50IGFscmVhZHkga25vd3MgdGhlIGFwcG9pbnRtZW50IGlzIHZhbGlkXG4gIEBJbnB1dCgpIHNraXBTdGF0dXNDaGVjayA9IGZhbHNlO1xuXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcblxuICAvLyBTdGF0dXMgY2hlY2sgc3RhdGVcbiAgcHVibGljIGlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgcHVibGljIGlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgcHVibGljIHN0YXR1c0Vycm9yTWVzc2FnZSA9ICcnO1xuICBwdWJsaWMgaXNKb2luYWJsZSA9IGZhbHNlOyAvLyBUcmFja3Mgam9pbmFibGUgZmllbGQgZnJvbSBzdGF0dXMgcmVzcG9uc2VcbiAgcHVibGljIHNob3VsZFNob3dCdXR0b24gPSBmYWxzZTsgLy8gSGlkZGVuIGJ5IGRlZmF1bHQsIHNob3duIGFmdGVyIHN0YXR1cyBjaGVjayBjb25maXJtcyB2aXNpYmlsaXR5XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGN1cnJlbnRNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2aWRlb0NhbGxNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0dXNQb2xsaW5nSW50ZXJ2YWw6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IFNUQVRVU19QT0xMX0lOVEVSVkFMX01TID0gMzAwMDA7IC8vIDMwIHNlY29uZHNcblxuICAvKiogV2hldGhlciB1c2VyIGlzIGJhY2tvZmZpY2UgKG9yIGFkbWluL21hbmFnZXIpICovXG4gIHB1YmxpYyBnZXQgaXNCYWNrb2ZmaWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLkJBQ0tPRkZJQ0UgfHxcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuQURNSU5fTUFOQUdFUiB8fFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5NQU5BR0VSXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkICovXG4gIHB1YmxpYyBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgfHwgdGhpcy5pc1N0YXR1c0Vycm9yIHx8ICF0aGlzLmlzSm9pbmFibGU7XG4gIH1cblxuICAvKiogUmVhc29uIHdoeSB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIChmb3IgdG9vbHRpcCkgKi9cbiAgcHVibGljIGdldCBkaXNhYmxlZFJlYXNvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1N0YXR1c0Vycm9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgfHwgJ0Vycm9yIGFsIHZlcmlmaWNhciBlbCBlc3RhZG8nO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNKb2luYWJsZSkge1xuICAgICAgcmV0dXJuICdUb2RhdsOtYSBubyBlcyBlbCBob3JhcmlvIGRlIGxhIGxsYW1hZGEnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICAgcHJpdmF0ZSB0YXNTZXJ2aWNlOiBUYXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFzVXRpbGl0eVNlcnZpY2U6IFRhc1V0aWxpdHlTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTdWJzY3JpYmUgdG8gdmlld01vZGUgdG8gaGFuZGxlIFBpUCByZXR1cm5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLnZpZXdNb2RlJC5zdWJzY3JpYmUoKG1vZGUpID0+IHtcbiAgICAgICAgLy8gV2hlbiBlbnRlcmluZyBQaVAsIGNsZWFyIHRoZSB2aWRlb0NhbGxNb2RhbFJlZiBzaW5jZSBtb2RhbCB3aWxsIGNsb3NlXG4gICAgICAgIGlmIChtb2RlID09PSBWaWV3TW9kZS5QSVApIHtcbiAgICAgICAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gSWYgc2tpcFN0YXR1c0NoZWNrIGlzIHRydWUsIHNob3cgYnV0dG9uIGltbWVkaWF0ZWx5IHdpdGhvdXQgcG9sbGluZ1xuICAgIGlmICh0aGlzLnNraXBTdGF0dXNDaGVjaykge1xuICAgICAgdGhpcy5zaG91bGRTaG93QnV0dG9uID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNKb2luYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgc3RhdHVzIGNoZWNraW5nXG4gICAgdGhpcy5zdGFydFN0YXR1c1BvbGxpbmcoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3RvcFN0YXR1c1BvbGxpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBwb2xsaW5nIHN0YXR1cyBldmVyeSAzMCBzZWNvbmRzXG4gICAqL1xuICBwcml2YXRlIHN0YXJ0U3RhdHVzUG9sbGluZygpOiB2b2lkIHtcbiAgICAvLyBJbml0aWFsIHN0YXR1cyBjaGVja1xuICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcblxuICAgIC8vIFNldCB1cCBwZXJpb2RpYyBwb2xsaW5nXG4gICAgdGhpcy5zdGF0dXNQb2xsaW5nSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrU3RhdHVzKCk7XG4gICAgfSwgdGhpcy5TVEFUVVNfUE9MTF9JTlRFUlZBTF9NUyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBzdGF0dXMgcG9sbGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzdG9wU3RhdHVzUG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0dXNQb2xsaW5nSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zdGF0dXNQb2xsaW5nSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5zdGF0dXNQb2xsaW5nSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBzdGF0dXMgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIGlmIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZFxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1N0YXR1cygpOiB2b2lkIHtcbiAgICAvLyBTa2lwIGlmIHJlcXVpcmVkIGlucHV0cyBhcmUgbm90IGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy50ZW5hbnQgfHwgIXRoaXMuZW50aXR5SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzQ2hlY2tpbmdTdGF0dXMgPSB0cnVlO1xuICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gJyc7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlXG4gICAgICAgIC5nZXRQcm94eVZpZGVvU3RhdHVzKHtcbiAgICAgICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgICAgICBlbnRpdHlJZDogdGhpcy5lbnRpdHlJZCxcbiAgICAgICAgICB0ZW5hbnQ6IHRoaXMudGVuYW50LFxuICAgICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgcmVzcG9uc2Ugc3RydWN0dXJlXG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5jb250ZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RhdHVzRXJyb3IoJ0ludmFsaWQgcmVzcG9uc2UnKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNTdGF0dXNFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkU2hvd0J1dHRvbiA9IHRydWU7XG4gICAgICAgICAgICAvLyBVcGRhdGUgam9pbmFibGUgc3RhdGUgZnJvbSByZXNwb25zZVxuICAgICAgICAgICAgdGhpcy5pc0pvaW5hYmxlID0gcmVzcG9uc2UuY29udGVudD8uam9pbmFibGUgPz8gZmFsc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN0YXR1c0Vycm9yKGVycik7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdGF0dXNFcnJvcihlcnI6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IGZhbHNlO1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHRoaXMudGFzVXRpbGl0eVNlcnZpY2UuZXh0cmFjdEVycm9yTWVzc2FnZShlcnIsICdFcnJvciBjaGVja2luZyBzdGF0dXMnKTtcbiAgICB0aGlzLnN0YXR1c0Vycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTtcblxuICAgIC8vIE9uIGFueSBzdGF0dXMgZXJyb3IsIGhpZGUgdGhlIGJ1dHRvblxuICAgIHRoaXMuc2hvdWxkU2hvd0J1dHRvbiA9IGZhbHNlO1xuICAgIHRoaXMuaXNTdGF0dXNFcnJvciA9IGZhbHNlOyAvLyBXZSBkb24ndCBzaG93IGVycm9yIFVJLCBqdXN0IGhpZGUgdGhlIGJ1dHRvblxuXG4gICAgLy8gU3RvcCBwb2xsaW5nIG9uIGVycm9yXG4gICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgb25DbGljaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGVuYW50IHx8ICF0aGlzLmN1cnJlbnRVc2VyPy5uYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVudGl0eUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuV2FpdGluZ1Jvb21Nb2RhbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuV2FpdGluZ1Jvb21Nb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVGFzV2FpdGluZ1Jvb21Db21wb25lbnQsIHtcbiAgICAgIHNpemU6ICdsZycsXG4gICAgICB3aW5kb3dDbGFzczogJ3Rhcy13YWl0aW5nLXJvb20tbW9kYWwnLFxuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxuICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxuICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBQYXNzIGFsbCBuZWNlc3NhcnkgaW5wdXRzIHRvIHRoZSB3YWl0aW5nIHJvb20gY29tcG9uZW50XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uucm9vbVR5cGUgPSB0aGlzLnJvb21UeXBlO1xuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmVudGl0eUlkID0gdGhpcy5lbnRpdHlJZDtcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50ZW5hbnQgPSB0aGlzLnRlbmFudDtcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5idXNpbmVzc1JvbGUgPSB0aGlzLmJ1c2luZXNzUm9sZTtcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jdXJyZW50VXNlciA9IHRoaXMuY3VycmVudFVzZXI7XG5cbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5yZXN1bHQudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50TW9kYWxSZWYgPSBudWxsO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50TW9kYWxSZWYgPSBudWxsO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5WaWRlb0NhbGxNb2RhbChpc1JldHVybmluZ0Zyb21QaXA6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFRhc1ZpZGVvY2FsbENvbXBvbmVudCwge1xuICAgICAgc2l6ZTogJ3hsJyxcbiAgICAgIHdpbmRvd0NsYXNzOiAndGFzLXZpZGVvLW1vZGFsJyxcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uuc2Vzc2lvbklkID0gdGhpcy50YXNTZXJ2aWNlLnNlc3Npb25JZDtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRva2VuID0gdGhpcy50YXNTZXJ2aWNlLnRva2VuO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuYnVzaW5lc3NSb2xlID0gdGhpcy5idXNpbmVzc1JvbGU7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pc1JldHVybmluZ0Zyb21QaXAgPSBpc1JldHVybmluZ0Zyb21QaXA7XG5cbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLnJlc3VsdC50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsIjxzcGFuXG4gICpuZ0lmPVwic2hvdWxkU2hvd0J1dHRvblwiXG4gIFtuZ2JUb29sdGlwXT1cImlzRGlzYWJsZWQgJiYgZGlzYWJsZWRSZWFzb24gPyBkaXNhYmxlZFJlYXNvbiA6IG51bGxcIlxuICBjb250YWluZXI9XCJib2R5XCJcbiAgcGxhY2VtZW50PVwidG9wXCJcbiAgdG9vbHRpcENsYXNzPVwidGFzLWJ0bi10b29sdGlwXCJcbj5cbiAgPGJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRhcy1idG5cIlxuICAgIFtjbGFzcy50YXMtYnRuLS10ZWFsXT1cInZhcmlhbnQgPT09ICd0ZWFsJ1wiXG4gICAgKGNsaWNrKT1cIm9uQ2xpY2soKVwiXG4gICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuICA+XG4gICAgPGkgY2xhc3M9XCJmYSBmYS12aWRlby1jYW1lcmFcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAqbmdJZj1cIiFpc0xvYWRpbmdcIj48L2k+XG4gICAgPHNwYW4gKm5nSWY9XCIhaXNMb2FkaW5nXCI+e3sgYnV0dG9uTGFiZWwgfX08L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCJpc0xvYWRpbmdcIj5Qcm9jZXNzaW5nLi4uPC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvc3Bhbj5cbiJdfQ==
@@ -13,7 +13,7 @@ export class TasIncomingAppointmentComponent {
13
13
  this.roomType = TasRoomType.TAS;
14
14
  this.businessRole = TasBusinessRole.USER;
15
15
  this.enterCall = new EventEmitter();
16
- this.appointment = null;
16
+ this.appointments = [];
17
17
  this.isLoading = true;
18
18
  this.hasError = false;
19
19
  this.subscriptions = new Subscription();
@@ -25,20 +25,24 @@ export class TasIncomingAppointmentComponent {
25
25
  this.subscriptions.unsubscribe();
26
26
  }
27
27
  loadAppointments() {
28
- const today = new Date();
29
- const in7Days = new Date(today);
30
- in7Days.setDate(today.getDate() + 7);
31
28
  this.subscriptions.add(this.tasService
32
- .getAppointments({ fromDate: this.formatDate(today), toDate: this.formatDate(in7Days), entityId: this.entityId })
29
+ .getAppointments({
30
+ fromDate: this.fromDate,
31
+ toDate: this.toDate,
32
+ entityId: this.entityId
33
+ })
33
34
  .subscribe({
34
35
  next: (response) => {
35
36
  // Handle both array response and wrapped response (e.g., { content: [...] })
36
37
  const appointments = Array.isArray(response)
37
38
  ? response
38
39
  : response?.content || [];
39
- // Filter for confirmed appointments and get the first one
40
- const confirmed = appointments.filter((a) => a.status === AppointmentStatus.CONFIRMED);
41
- this.appointment = confirmed.length > 0 ? confirmed[0] : null;
40
+ // Sort by date and startTime descending (most recent first)
41
+ this.appointments = appointments.sort((a, b) => {
42
+ const dateTimeA = `${a.date}T${a.startTime}`;
43
+ const dateTimeB = `${b.date}T${b.startTime}`;
44
+ return dateTimeB.localeCompare(dateTimeA);
45
+ });
42
46
  this.isLoading = false;
43
47
  },
44
48
  error: () => {
@@ -47,18 +51,21 @@ export class TasIncomingAppointmentComponent {
47
51
  },
48
52
  }));
49
53
  }
50
- onEnterCall() {
51
- if (this.appointment) {
52
- this.enterCall.emit(this.appointment);
53
- }
54
+ onEnterCall(appointment) {
55
+ this.enterCall.emit(appointment);
56
+ }
57
+ /**
58
+ * Check if tas-btn should be shown for an appointment (CONFIRMED or ACTIVE status)
59
+ */
60
+ shouldShowTasBtn(appointment) {
61
+ return appointment.status === AppointmentStatus.CONFIRMED ||
62
+ appointment.status === AppointmentStatus.ACTIVE;
54
63
  }
55
64
  /**
56
65
  * Format date to Spanish format: "Lunes 8 de diciembre"
57
66
  */
58
- get formattedDate() {
59
- if (!this.appointment)
60
- return '';
61
- const [year, month, day] = this.appointment.date.split('-').map(Number);
67
+ formatAppointmentDate(appointment) {
68
+ const [year, month, day] = appointment.date.split('-').map(Number);
62
69
  const date = new Date(year, month - 1, day);
63
70
  const dayNames = [
64
71
  'Domingo', 'Lunes', 'Martes', 'Miércoles',
@@ -76,23 +83,25 @@ export class TasIncomingAppointmentComponent {
76
83
  /**
77
84
  * Format time range: "9:00 - 9:30"
78
85
  */
79
- get formattedTimeRange() {
80
- if (!this.appointment)
81
- return '';
82
- return `${this.appointment.startTime} - ${this.appointment.endTime}`;
86
+ formatTimeRange(appointment) {
87
+ return `${appointment.startTime} - ${appointment.endTime}`;
83
88
  }
84
- formatDate(date) {
85
- const year = date.getFullYear();
86
- const month = String(date.getMonth() + 1).padStart(2, '0');
87
- const day = String(date.getDate()).padStart(2, '0');
88
- return `${year}-${month}-${day}`;
89
+ /**
90
+ * Get the other participant in the call (not the current user)
91
+ */
92
+ getOtherParticipant(appointment) {
93
+ if (!appointment.participants || appointment.participants.length === 0) {
94
+ return appointment.title; // Fallback to title if no participants
95
+ }
96
+ const otherParticipant = appointment.participants.find(p => p.userId !== this.currentUser?.id);
97
+ return otherParticipant?.name || appointment.title;
89
98
  }
90
99
  }
91
100
  TasIncomingAppointmentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasIncomingAppointmentComponent, deps: [{ token: i1.TasService }], target: i0.ɵɵFactoryTarget.Component });
92
- TasIncomingAppointmentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasIncomingAppointmentComponent, selector: "tas-incoming-appointment", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser" }, outputs: { enterCall: "enterCall" }, ngImport: i0, template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && !appointment\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointment state -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointment\">\n \n <div class=\"appointment-card\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"appointment.title\" [size]=\"48\"></tas-avatar>\n \n <span class=\"doctor-name\">{{ appointment.title }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formattedDate }}</span>\n <span class=\"time\">{{ formattedTimeRange }}</span>\n </div>\n <tas-btn\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appointment.roomType\"\n [entityId]=\"appointment.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}\n"], components: [{ type: i2.TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }, { type: i3.TasButtonComponent, selector: "tas-btn", inputs: ["roomType", "entityId", "tenant", "businessRole", "currentUser", "variant", "buttonLabel"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
101
+ TasIncomingAppointmentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasIncomingAppointmentComponent, selector: "tas-incoming-appointment", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser", fromDate: "fromDate", toDate: "toDate" }, outputs: { enterCall: "enterCall" }, ngImport: i0, template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" *ngFor=\"let appt of appointments\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [":host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}\n"], components: [{ type: i2.TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }, { type: i3.TasButtonComponent, selector: "tas-btn", inputs: ["roomType", "entityId", "tenant", "businessRole", "currentUser", "variant", "buttonLabel", "skipStatusCheck"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
93
102
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasIncomingAppointmentComponent, decorators: [{
94
103
  type: Component,
95
- args: [{ selector: 'tas-incoming-appointment', template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && !appointment\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointment state -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointment\">\n \n <div class=\"appointment-card\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"appointment.title\" [size]=\"48\"></tas-avatar>\n \n <span class=\"doctor-name\">{{ appointment.title }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formattedDate }}</span>\n <span class=\"time\">{{ formattedTimeRange }}</span>\n </div>\n <tas-btn\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appointment.roomType\"\n [entityId]=\"appointment.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}\n"] }]
104
+ args: [{ selector: 'tas-incoming-appointment', template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" *ngFor=\"let appt of appointments\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [":host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}\n"] }]
96
105
  }], ctorParameters: function () { return [{ type: i1.TasService }]; }, propDecorators: { roomType: [{
97
106
  type: Input
98
107
  }], entityId: [{
@@ -103,7 +112,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
103
112
  type: Input
104
113
  }], currentUser: [{
105
114
  type: Input
115
+ }], fromDate: [{
116
+ type: Input
117
+ }], toDate: [{
118
+ type: Input
106
119
  }], enterCall: [{
107
120
  type: Output
108
121
  }] } });
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWluY29taW5nLWFwcG9pbnRtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rhcy11ZWxsLXNkay9zcmMvbGliL2NvbXBvbmVudHMvdGFzLWluY29taW5nLWFwcG9pbnRtZW50L3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC90YXMtaW5jb21pbmctYXBwb2ludG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFHVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLGVBQWUsR0FFaEIsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBT3pDLE1BQU0sT0FBTywrQkFBK0I7SUFnQjFDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFmMUMsaUNBQWlDO1FBQ3hCLGFBQVEsR0FBZ0IsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUd4QyxpQkFBWSxHQUFvQixlQUFlLENBQUMsSUFBSSxDQUFDO1FBR3BELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUVsRCxnQkFBVyxHQUEwQixJQUFJLENBQUM7UUFDMUMsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWhCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVFLENBQUM7SUFFOUMsUUFBUTtRQUNOLElBQUksQ0FBQyxnQkFBZ0IsRUFB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dCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQge1xuICBUYXNBcHBvaW50bWVudCxcbiAgQXBwb2ludG1lbnRTdGF0dXMsXG4gIFRhc1Jvb21UeXBlLFxuICBUYXNCdXNpbmVzc1JvbGUsXG4gIFRhc0N1cnJlbnRVc2VyLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLWluY29taW5nLWFwcG9pbnRtZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNJbmNvbWluZ0FwcG9pbnRtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBQYXNzdGhyb3VnaCBpbnB1dHMgZm9yIHRhcy1idG5cbiAgQElucHV0KCkgcm9vbVR5cGU6IFRhc1Jvb21UeXBlID0gVGFzUm9vbVR5cGUuVEFTO1xuICBASW5wdXQoKSBlbnRpdHlJZCE6IG51bWJlcjtcbiAgQElucHV0KCkgdGVuYW50ITogc3RyaW5nO1xuICBASW5wdXQoKSBidXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZSA9IFRhc0J1c2luZXNzUm9sZS5VU0VSO1xuICBASW5wdXQoKSBjdXJyZW50VXNlciE6IFRhc0N1cnJlbnRVc2VyO1xuXG4gIEBPdXRwdXQoKSBlbnRlckNhbGwgPSBuZXcgRXZlbnRFbWl0dGVyPFRhc0FwcG9pbnRtZW50PigpO1xuXG4gIHB1YmxpYyBhcHBvaW50bWVudDogVGFzQXBwb2ludG1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGlzTG9hZGluZyA9IHRydWU7XG4gIHB1YmxpYyBoYXNFcnJvciA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQXBwb2ludG1lbnRzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEFwcG9pbnRtZW50cygpOiB2b2lkIHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgaW43RGF5cyA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBpbjdEYXlzLnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpICsgNyk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlXG4gICAgICAgIC5nZXRBcHBvaW50bWVudHMoeyBmcm9tRGF0ZTogdGhpcy5mb3JtYXREYXRlKHRvZGF5KSwgdG9EYXRlOiB0aGlzLmZvcm1hdERhdGUoaW43RGF5cyksIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYm90aCBhcnJheSByZXNwb25zZSBhbmQgd3JhcHBlZCByZXNwb25zZSAoZS5nLiwgeyBjb250ZW50OiBbLi4uXSB9KVxuICAgICAgICAgICAgY29uc3QgYXBwb2ludG1lbnRzOiBUYXNBcHBvaW50bWVudFtdID0gQXJyYXkuaXNBcnJheShyZXNwb25zZSlcbiAgICAgICAgICAgICAgPyByZXNwb25zZVxuICAgICAgICAgICAgICA6IHJlc3BvbnNlPy5jb250ZW50IHx8IFtdO1xuXG4gICAgICAgICAgICAvLyBGaWx0ZXIgZm9yIGNvbmZpcm1lZCBhcHBvaW50bWVudHMgYW5kIGdldCB0aGUgZmlyc3Qgb25lXG4gICAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhcHBvaW50bWVudHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoYSkgPT4gYS5zdGF0dXMgPT09IEFwcG9pbnRtZW50U3RhdHVzLkNPTkZJUk1FRFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYXBwb2ludG1lbnQgPSBjb25maXJtZWQubGVuZ3RoID4gMCA/IGNvbmZpcm1lZFswXSA6IG51bGw7XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgb25FbnRlckNhbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXBwb2ludG1lbnQpIHtcbiAgICAgIHRoaXMuZW50ZXJDYWxsLmVtaXQodGhpcy5hcHBvaW50bWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBkYXRlIHRvIFNwYW5pc2ggZm9ybWF0OiBcIkx1bmVzIDggZGUgZGljaWVtYnJlXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGVkRGF0ZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5hcHBvaW50bWVudCkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gdGhpcy5hcHBvaW50bWVudC5kYXRlLnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcblxuICAgIGNvbnN0IGRheU5hbWVzID0gW1xuICAgICAgJ0RvbWluZ28nLCAnTHVuZXMnLCAnTWFydGVzJywgJ01pw6lyY29sZXMnLFxuICAgICAgJ0p1ZXZlcycsICdWaWVybmVzJywgJ1PDoWJhZG8nXG4gICAgXTtcbiAgICBjb25zdCBtb250aE5hbWVzID0gW1xuICAgICAgJ2VuZXJvJywgJ2ZlYnJlcm8nLCAnbWFyem8nLCAnYWJyaWwnLCAnbWF5bycsICdqdW5pbycsXG4gICAgICAnanVsaW8nLCAnYWdvc3RvJywgJ3NlcHRpZW1icmUnLCAnb2N0dWJyZScsICdub3ZpZW1icmUnLCAnZGljaWVtYnJlJ1xuICAgIF07XG5cbiAgICBjb25zdCBkYXlOYW1lID0gZGF5TmFtZXNbZGF0ZS5nZXREYXkoKV07XG4gICAgY29uc3QgZGF5TnVtID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhOYW1lID0gbW9udGhOYW1lc1tkYXRlLmdldE1vbnRoKCldO1xuXG4gICAgcmV0dXJuIGAke2RheU5hbWV9ICR7ZGF5TnVtfSBkZSAke21vbnRoTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aW1lIHJhbmdlOiBcIjk6MDAgLSA5OjMwXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGVkVGltZVJhbmdlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmFwcG9pbnRtZW50KSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGAke3RoaXMuYXBwb2ludG1lbnQuc3RhcnRUaW1lfSAtICR7dGhpcy5hcHBvaW50bWVudC5lbmRUaW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImluY29taW5nLWFwcG9pbnRtZW50LWNhcmRcIj5cbiAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZVwiPlByw7N4aW1vIHR1cm5vPC9oMz5cblxuICA8IS0tIExvYWRpbmcgc3RhdGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIiAqbmdJZj1cImlzTG9hZGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBFbXB0eSBzdGF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudCBlbXB0eS1zdGF0ZVwiICpuZ0lmPVwiIWlzTG9hZGluZyAmJiAhYXBwb2ludG1lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNpcmNsZVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgc3BhcmtsZS0xXCI+4pymPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzcGFya2xlIHNwYXJrbGUtMlwiPuKcpjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3BhcmtsZSBzcGFya2xlLTNcIj7inKY8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgc3BhcmtsZS00XCI+4pymPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxoNCBjbGFzcz1cImVtcHR5LXRpdGxlXCI+VG9kYXbDrWEgbm8gdGVuw6lzIHR1cm5vcyBhZ2VuZGFkb3M8L2g0PlxuICAgIDxwIGNsYXNzPVwiZW1wdHktc3VidGl0bGVcIj5cbiAgICAgIEVuIGNhc28gZGUgcXVlIE1lZGljaW5hIExhYm9yYWwgcmVxdWllcmEgdW5hIGNvbnN1bHRhLCBsbyB2ZXLDoXMgZW4gZXN0YSBzZWNjacOzbi5cbiAgICA8L3A+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQXBwb2ludG1lbnQgc3RhdGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnQgYXBwb2ludG1lbnQtc3RhdGVcIiAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgYXBwb2ludG1lbnRcIj5cbiAgICBcbiAgICA8ZGl2IGNsYXNzPVwiYXBwb2ludG1lbnQtY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImFwcG9pbnRtZW50LWhlYWRlclwiPlxuICAgICAgICA8dGFzLWF2YXRhciBbbmFtZV09XCJhcHBvaW50bWVudC50aXRsZVwiIFtzaXplXT1cIjQ4XCI+PC90YXMtYXZhdGFyPlxuICAgICAgICBcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2N0b3ItbmFtZVwiPnt7IGFwcG9pbnRtZW50LnRpdGxlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXBwb2ludG1lbnQtZGV0YWlsc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS10aW1lXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlXCI+e3sgZm9ybWF0dGVkRGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWVcIj57eyBmb3JtYXR0ZWRUaW1lUmFuZ2UgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dGFzLWJ0blxuICAgICAgICAgIHZhcmlhbnQ9XCJ0ZWFsXCJcbiAgICAgICAgICBidXR0b25MYWJlbD1cIkluZ3Jlc2FyXCJcbiAgICAgICAgICBbcm9vbVR5cGVdPVwiYXBwb2ludG1lbnQucm9vbVR5cGVcIlxuICAgICAgICAgIFtlbnRpdHlJZF09XCJhcHBvaW50bWVudC5lbnRpdHlJZFwiXG4gICAgICAgICAgW3RlbmFudF09XCJ0ZW5hbnRcIlxuICAgICAgICAgIFtidXNpbmVzc1JvbGVdPVwiYnVzaW5lc3NSb2xlXCJcbiAgICAgICAgICBbY3VycmVudFVzZXJdPVwiY3VycmVudFVzZXJcIlxuICAgICAgICA+PC90YXMtYnRuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWluY29taW5nLWFwcG9pbnRtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rhcy11ZWxsLXNkay9zcmMvbGliL2NvbXBvbmVudHMvdGFzLWluY29taW5nLWFwcG9pbnRtZW50L3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC90YXMtaW5jb21pbmctYXBwb2ludG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFHVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLGVBQWUsR0FFaEIsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBT3pDLE1BQU0sT0FBTywrQkFBK0I7SUFvQjFDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFuQjFDLGlDQUFpQztRQUN4QixhQUFRLEdBQWdCLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFHeEMsaUJBQVksR0FBb0IsZUFBZSxDQUFDLElBQUksQ0FBQztRQU9wRCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFbEQsaUJBQVksR0FBcUIsRUFBRSxDQUFDO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVoQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFRSxDQUFDO0lBRTlDLFFBQVE7UUFDTixJQUFJLENBQUMsZ0JBQWdCLEVB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LFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFOUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxNQUFNLE9BQU8sU0FBUyxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZSxDQUFDLFdBQTJCO1FBQ2hELE9BQU8sR0FBRyxXQUFXLENBQUMsU0FBUyxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxtQkFBbUIsQ0FBQyxXQUEyQjtRQUNwRCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEUsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsdUNBQXVDO1NBQ2xFO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUN2QyxDQUFDO1FBRUYsT0FBTyxnQkFBZ0IsRUFBRSxJQUFJLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQztJQUNyRCxDQUFDOzs2SEFwSFUsK0JBQStCO2lIQUEvQiwrQkFBK0IsaVJDdkI1QyxzOURBb0RBOzRGRDdCYSwrQkFBK0I7a0JBTDNDLFNBQVM7K0JBQ0UsMEJBQTBCO2lHQU0zQixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFSSxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGFzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Rhcy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFRhc0FwcG9pbnRtZW50LFxuICBBcHBvaW50bWVudFN0YXR1cyxcbiAgVGFzUm9vbVR5cGUsXG4gIFRhc0J1c2luZXNzUm9sZSxcbiAgVGFzQ3VycmVudFVzZXIsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdGFzLmludGVyZmFjZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXMtaW5jb21pbmctYXBwb2ludG1lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFzLWluY29taW5nLWFwcG9pbnRtZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzLWluY29taW5nLWFwcG9pbnRtZW50LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhc0luY29taW5nQXBwb2ludG1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vIFBhc3N0aHJvdWdoIGlucHV0cyBmb3IgdGFzLWJ0blxuICBASW5wdXQoKSByb29tVHlwZTogVGFzUm9vbVR5cGUgPSBUYXNSb29tVHlwZS5UQVM7XG4gIEBJbnB1dCgpIGVudGl0eUlkITogbnVtYmVyO1xuICBASW5wdXQoKSB0ZW5hbnQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJ1c2luZXNzUm9sZTogVGFzQnVzaW5lc3NSb2xlID0gVGFzQnVzaW5lc3NSb2xlLlVTRVI7XG4gIEBJbnB1dCgpIGN1cnJlbnRVc2VyITogVGFzQ3VycmVudFVzZXI7XG4gIFxuICAvLyBEYXRlIHJhbmdlIGlucHV0cyBmb3IgZmV0Y2hpbmcgYXBwb2ludG1lbnRzXG4gIEBJbnB1dCgpIGZyb21EYXRlITogc3RyaW5nOyAvLyBZWVlZLU1NLUREIGZvcm1hdFxuICBASW5wdXQoKSB0b0RhdGUhOiBzdHJpbmc7ICAgLy8gWVlZWS1NTS1ERCBmb3JtYXRcblxuICBAT3V0cHV0KCkgZW50ZXJDYWxsID0gbmV3IEV2ZW50RW1pdHRlcjxUYXNBcHBvaW50bWVudD4oKTtcblxuICBwdWJsaWMgYXBwb2ludG1lbnRzOiBUYXNBcHBvaW50bWVudFtdID0gW107XG4gIHB1YmxpYyBpc0xvYWRpbmcgPSB0cnVlO1xuICBwdWJsaWMgaGFzRXJyb3IgPSBmYWxzZTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0YXNTZXJ2aWNlOiBUYXNTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEFwcG9pbnRtZW50cygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRBcHBvaW50bWVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZVxuICAgICAgICAuZ2V0QXBwb2ludG1lbnRzKHsgXG4gICAgICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbURhdGUsIFxuICAgICAgICAgIHRvRGF0ZTogdGhpcy50b0RhdGUsIFxuICAgICAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkIFxuICAgICAgICB9KVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGJvdGggYXJyYXkgcmVzcG9uc2UgYW5kIHdyYXBwZWQgcmVzcG9uc2UgKGUuZy4sIHsgY29udGVudDogWy4uLl0gfSlcbiAgICAgICAgICAgIGNvbnN0IGFwcG9pbnRtZW50cyA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2UpXG4gICAgICAgICAgICAgID8gcmVzcG9uc2VcbiAgICAgICAgICAgICAgOiByZXNwb25zZT8uY29udGVudCB8fCBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU29ydCBieSBkYXRlIGFuZCBzdGFydFRpbWUgZGVzY2VuZGluZyAobW9zdCByZWNlbnQgZmlyc3QpXG4gICAgICAgICAgICB0aGlzLmFwcG9pbnRtZW50cyA9IGFwcG9pbnRtZW50cy5zb3J0KChhOiBUYXNBcHBvaW50bWVudCwgYjogVGFzQXBwb2ludG1lbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVBID0gYCR7YS5kYXRlfVQke2Euc3RhcnRUaW1lfWA7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGVUaW1lQiA9IGAke2IuZGF0ZX1UJHtiLnN0YXJ0VGltZX1gO1xuICAgICAgICAgICAgICByZXR1cm4gZGF0ZVRpbWVCLmxvY2FsZUNvbXBhcmUoZGF0ZVRpbWVBKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG9uRW50ZXJDYWxsKGFwcG9pbnRtZW50OiBUYXNBcHBvaW50bWVudCk6IHZvaWQge1xuICAgIHRoaXMuZW50ZXJDYWxsLmVtaXQoYXBwb2ludG1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRhcy1idG4gc2hvdWxkIGJlIHNob3duIGZvciBhbiBhcHBvaW50bWVudCAoQ09ORklSTUVEIG9yIEFDVElWRSBzdGF0dXMpXG4gICAqL1xuICBwdWJsaWMgc2hvdWxkU2hvd1Rhc0J0bihhcHBvaW50bWVudDogVGFzQXBwb2ludG1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXBwb2ludG1lbnQuc3RhdHVzID09PSBBcHBvaW50bWVudFN0YXR1cy5DT05GSVJNRUQgfHwgXG4gICAgICAgICAgIGFwcG9pbnRtZW50LnN0YXR1cyA9PT0gQXBwb2ludG1lbnRTdGF0dXMuQUNUSVZFO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBkYXRlIHRvIFNwYW5pc2ggZm9ybWF0OiBcIkx1bmVzIDggZGUgZGljaWVtYnJlXCJcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRBcHBvaW50bWVudERhdGUoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBhcHBvaW50bWVudC5kYXRlLnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcblxuICAgIGNvbnN0IGRheU5hbWVzID0gW1xuICAgICAgJ0RvbWluZ28nLCAnTHVuZXMnLCAnTWFydGVzJywgJ01pw6lyY29sZXMnLFxuICAgICAgJ0p1ZXZlcycsICdWaWVybmVzJywgJ1PDoWJhZG8nXG4gICAgXTtcbiAgICBjb25zdCBtb250aE5hbWVzID0gW1xuICAgICAgJ2VuZXJvJywgJ2ZlYnJlcm8nLCAnbWFyem8nLCAnYWJyaWwnLCAnbWF5bycsICdqdW5pbycsXG4gICAgICAnanVsaW8nLCAnYWdvc3RvJywgJ3NlcHRpZW1icmUnLCAnb2N0dWJyZScsICdub3ZpZW1icmUnLCAnZGljaWVtYnJlJ1xuICAgIF07XG5cbiAgICBjb25zdCBkYXlOYW1lID0gZGF5TmFtZXNbZGF0ZS5nZXREYXkoKV07XG4gICAgY29uc3QgZGF5TnVtID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhOYW1lID0gbW9udGhOYW1lc1tkYXRlLmdldE1vbnRoKCldO1xuXG4gICAgcmV0dXJuIGAke2RheU5hbWV9ICR7ZGF5TnVtfSBkZSAke21vbnRoTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aW1lIHJhbmdlOiBcIjk6MDAgLSA5OjMwXCJcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRUaW1lUmFuZ2UoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7YXBwb2ludG1lbnQuc3RhcnRUaW1lfSAtICR7YXBwb2ludG1lbnQuZW5kVGltZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3RoZXIgcGFydGljaXBhbnQgaW4gdGhlIGNhbGwgKG5vdCB0aGUgY3VycmVudCB1c2VyKVxuICAgKi9cbiAgcHVibGljIGdldE90aGVyUGFydGljaXBhbnQoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICBpZiAoIWFwcG9pbnRtZW50LnBhcnRpY2lwYW50cyB8fCBhcHBvaW50bWVudC5wYXJ0aWNpcGFudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYXBwb2ludG1lbnQudGl0bGU7IC8vIEZhbGxiYWNrIHRvIHRpdGxlIGlmIG5vIHBhcnRpY2lwYW50c1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBvdGhlclBhcnRpY2lwYW50ID0gYXBwb2ludG1lbnQucGFydGljaXBhbnRzLmZpbmQoXG4gICAgICBwID0+IHAudXNlcklkICE9PSB0aGlzLmN1cnJlbnRVc2VyPy5pZFxuICAgICk7XG4gICAgXG4gICAgcmV0dXJuIG90aGVyUGFydGljaXBhbnQ/Lm5hbWUgfHwgYXBwb2ludG1lbnQudGl0bGU7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJpbmNvbWluZy1hcHBvaW50bWVudC1jYXJkXCI+XG4gIDxoMyBjbGFzcz1cImNhcmQtdGl0bGVcIj5QcsOzeGltbyB0dXJubzwvaDM+XG5cbiAgPCEtLSBMb2FkaW5nIHN0YXRlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRW1wdHkgc3RhdGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnQgZW1wdHktc3RhdGVcIiAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgYXBwb2ludG1lbnRzLmxlbmd0aCA9PT0gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImljb24tY2lyY2xlXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3BhcmtsZSBzcGFya2xlLTFcIj7inKY8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgc3BhcmtsZS0yXCI+4pymPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzcGFya2xlIHNwYXJrbGUtM1wiPuKcpjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3BhcmtsZSBzcGFya2xlLTRcIj7inKY8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGg0IGNsYXNzPVwiZW1wdHktdGl0bGVcIj5Ub2RhdsOtYSBubyB0ZW7DqXMgdHVybm9zIGFnZW5kYWRvczwvaDQ+XG4gICAgPHAgY2xhc3M9XCJlbXB0eS1zdWJ0aXRsZVwiPlxuICAgICAgRW4gY2FzbyBkZSBxdWUgTWVkaWNpbmEgTGFib3JhbCByZXF1aWVyYSB1bmEgY29uc3VsdGEsIGxvIHZlcsOhcyBlbiBlc3RhIHNlY2Npw7NuLlxuICAgIDwvcD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBcHBvaW50bWVudHMgbGlzdCAtLT5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudCBhcHBvaW50bWVudC1zdGF0ZVwiICpuZ0lmPVwiIWlzTG9hZGluZyAmJiBhcHBvaW50bWVudHMubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC1jYXJkXCIgKm5nRm9yPVwibGV0IGFwcHQgb2YgYXBwb2ludG1lbnRzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXBwb2ludG1lbnQtaGVhZGVyXCI+XG4gICAgICAgIDx0YXMtYXZhdGFyIFtuYW1lXT1cImdldE90aGVyUGFydGljaXBhbnQoYXBwdClcIiBbc2l6ZV09XCI0OFwiPjwvdGFzLWF2YXRhcj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2N0b3ItbmFtZVwiPnt7IGdldE90aGVyUGFydGljaXBhbnQoYXBwdCkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC1kZXRhaWxzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXRpbWVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGVcIj57eyBmb3JtYXRBcHBvaW50bWVudERhdGUoYXBwdCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lXCI+e3sgZm9ybWF0VGltZVJhbmdlKGFwcHQpIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHRhcy1idG5cbiAgICAgICAgICAqbmdJZj1cInNob3VsZFNob3dUYXNCdG4oYXBwdClcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJ0ZWFsXCJcbiAgICAgICAgICBidXR0b25MYWJlbD1cIkluZ3Jlc2FyXCJcbiAgICAgICAgICBbcm9vbVR5cGVdPVwiYXBwdC5yb29tVHlwZVwiXG4gICAgICAgICAgW2VudGl0eUlkXT1cImFwcHQuZW50aXR5SWRcIlxuICAgICAgICAgIFt0ZW5hbnRdPVwidGVuYW50XCJcbiAgICAgICAgICBbYnVzaW5lc3NSb2xlXT1cImJ1c2luZXNzUm9sZVwiXG4gICAgICAgICAgW2N1cnJlbnRVc2VyXT1cImN1cnJlbnRVc2VyXCJcbiAgICAgICAgPjwvdGFzLWJ0bj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=