tas-uell-sdk 0.0.6 → 0.1.1

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.
Files changed (28) hide show
  1. package/README.md +74 -3
  2. package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +55 -61
  3. package/esm2020/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.mjs +109 -0
  4. package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +114 -8
  5. package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +104 -46
  6. package/esm2020/lib/config/tas.config.mjs +1 -1
  7. package/esm2020/lib/interfaces/tas.interfaces.mjs +8 -1
  8. package/esm2020/lib/services/geolocation.service.mjs +56 -0
  9. package/esm2020/lib/services/tas-utility.service.mjs +60 -0
  10. package/esm2020/lib/services/tas.service.mjs +49 -12
  11. package/esm2020/lib/tas-uell-sdk.module.mjs +11 -5
  12. package/esm2020/public-api.mjs +4 -1
  13. package/fesm2015/tas-uell-sdk.mjs +553 -126
  14. package/fesm2015/tas-uell-sdk.mjs.map +1 -1
  15. package/fesm2020/tas-uell-sdk.mjs +540 -124
  16. package/fesm2020/tas-uell-sdk.mjs.map +1 -1
  17. package/lib/components/tas-btn/tas-btn.component.d.ts +10 -5
  18. package/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.d.ts +33 -0
  19. package/lib/components/tas-videocall/tas-videocall.component.d.ts +27 -2
  20. package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +29 -8
  21. package/lib/config/tas.config.d.ts +3 -0
  22. package/lib/interfaces/tas.interfaces.d.ts +30 -2
  23. package/lib/services/geolocation.service.d.ts +24 -0
  24. package/lib/services/tas-utility.service.d.ts +26 -0
  25. package/lib/services/tas.service.d.ts +16 -6
  26. package/lib/tas-uell-sdk.module.d.ts +5 -3
  27. package/package.json +1 -1
  28. package/public-api.d.ts +3 -0
package/README.md CHANGED
@@ -29,7 +29,7 @@ npm install @ng-bootstrap/ng-bootstrap @opentok/client interactjs
29
29
 
30
30
  ### 1. Create an HTTP Adapter
31
31
 
32
- The library requires an HTTP adapter that implements the `TasHttpClient` interface (which includes `post` and `patch` methods):
32
+ The library requires an HTTP adapter that implements the `TasHttpClient` interface:
33
33
 
34
34
  ```typescript
35
35
  import { Injectable } from '@angular/core';
@@ -41,6 +41,12 @@ import { TasHttpClient } from 'tas-uell-sdk';
41
41
  export class TasHttpAdapterService implements TasHttpClient {
42
42
  constructor(private http: HttpClient) {}
43
43
 
44
+ get<T>(url: string, options: { headers?: Record<string, string> }): Observable<T> {
45
+ return this.http.get<T>(`https://your-api.com/${url}`, {
46
+ headers: options.headers,
47
+ });
48
+ }
49
+
44
50
  post<T>(url: string, options: { body: any; headers?: Record<string, string> }): Observable<T> {
45
51
  return this.http.post<T>(`https://your-api.com/${url}`, options.body, {
46
52
  headers: options.headers,
@@ -151,7 +157,7 @@ Use the `<tas-btn>` component to initiate a video call:
151
157
 
152
158
  | Property | Type | Required | Default | Description |
153
159
  | :--- | :--- | :--- | :--- | :--- |
154
- | `entityId` | `number` | Yes | - | The entity/license ID |
160
+ | `entityId` | `number` | Yes | - | The entity/ausencia ID |
155
161
  | `tenant` | `string` | Yes | - | Tenant identifier |
156
162
  | `roomType` | `TasRoomType` | No | `'TAS'` | Room type (TAS, JM, WEBINAR, WELLNESS_MANAGER) |
157
163
  | `businessRole` | `TasBusinessRole` | No | `'USER'` | Role (ADMIN_MANAGER, MANAGER, BACKOFFICE, USER) |
@@ -186,6 +192,7 @@ The library handles errors gracefully:
186
192
  ### TasCurrentUser
187
193
  ```typescript
188
194
  interface TasCurrentUser {
195
+ id: number;
189
196
  name: string;
190
197
  lastname: string;
191
198
  role: TasUserRole;
@@ -203,12 +210,30 @@ interface TasCallConfig {
203
210
  }
204
211
  ```
205
212
 
213
+ ### TasAppointment
214
+ ```typescript
215
+ interface TasAppointment {
216
+ id: number;
217
+ agendaId: number;
218
+ date: string; // "YYYY-MM-DD"
219
+ startTime: string; // "HH:mm"
220
+ endTime: string; // "HH:mm"
221
+ bookingType: string;
222
+ status: AppointmentStatus;
223
+ title: string;
224
+ notes: string;
225
+ entityId: number; // Entity/ausencia ID
226
+ roomType: TasRoomType; // Room type (always TAS)
227
+ }
228
+ ```
229
+
206
230
  ### Enums
207
231
  - **TasUserRole**: `OWNER`, `USER`, `MODERATOR`
208
232
  - **TasBusinessRole**: `ADMIN_MANAGER`, `MANAGER`, `BACKOFFICE`, `USER`
209
233
  - **TasRoomType**: `TAS`, `JM`, `WEBINAR`, `WELLNESS_MANAGER`
210
234
  - **CallState**: `IDLE`, `CONNECTING`, `CONNECTED`, `DISCONNECTED`, `ERROR`
211
235
  - **ViewMode**: `FULLSCREEN`, `PIP`
236
+ - **AppointmentStatus**: `CONFIRMED`, `CANCELLED`, `RESCHEDULED`
212
237
 
213
238
  ## Exported Services
214
239
 
@@ -224,10 +249,56 @@ Core service for managing video sessions and state.
224
249
  - `toggleMute()` - Toggles local audio
225
250
  - `disconnectSession()` - Ends the current session
226
251
  - `getProxyVideoStatus(params)` - Gets session status
252
+ - `getAppointments(params)` - Gets user appointments within date range
227
253
 
228
254
  ## Exported Components
229
255
 
230
- - `TasButtonComponent` - `<tas-btn>`
256
+ ### TasButtonComponent - `<tas-btn>`
257
+
258
+ Initiates video calls. Supports style variants:
259
+
260
+ ```html
261
+ <!-- Default (pink) -->
262
+ <tas-btn [entityId]="123" [tenant]="'tenant'" [currentUser]="user"></tas-btn>
263
+
264
+ <!-- Teal variant with custom label -->
265
+ <tas-btn variant="teal" buttonLabel="Ingresar" [entityId]="123" [tenant]="'tenant'" [currentUser]="user"></tas-btn>
266
+ ```
267
+
268
+ | Property | Type | Default | Description |
269
+ | :--- | :--- | :--- | :--- |
270
+ | `variant` | `'default' \| 'teal'` | `'default'` | Button style variant |
271
+ | `buttonLabel` | `string` | `'Iniciar TAS'` | Button text |
272
+
273
+ ### TasIncomingAppointmentComponent - `<tas-incoming-appointment>`
274
+
275
+ Displays the user's next scheduled appointment or an empty state. Uses `<tas-btn>` internally.
276
+
277
+ ```html
278
+ <tas-incoming-appointment
279
+ [entityId]="123"
280
+ [tenant]="'tenant'"
281
+ [currentUser]="user"
282
+ [businessRole]="'USER'"
283
+ (enterCall)="onEnterCall($event)"
284
+ ></tas-incoming-appointment>
285
+ ```
286
+
287
+ | Property | Type | Required | Default | Description |
288
+ | :--- | :--- | :--- | :--- | :--- |
289
+ | `entityId` | `number` | Yes | - | Entity/ausencia ID |
290
+ | `tenant` | `string` | Yes | - | Tenant identifier |
291
+ | `currentUser` | `TasCurrentUser` | Yes | - | Current user info |
292
+ | `roomType` | `TasRoomType` | No | `'TAS'` | Room type |
293
+ | `businessRole` | `TasBusinessRole` | No | `'USER'` | User's business role |
294
+
295
+ | Output | Type | Description |
296
+ | :--- | :--- | :--- |
297
+ | `enterCall` | `EventEmitter<TasAppointment>` | Emits appointment when clicking "Ingresar" |
298
+
299
+ **Note:** Requires the `TasHttpClient` adapter to implement the `get()` method.
300
+
301
+ ### Other Components
231
302
  - `TasVideocallComponent` - Full-screen video call interface
232
303
  - `TasWaitingRoomComponent` - Pre-call waiting room
233
304
  - `TasFloatingCallComponent` - `<tas-floating-call>`
@@ -6,20 +6,26 @@ import { TasVideocallComponent } from '../tas-videocall/tas-videocall.component'
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "@ng-bootstrap/ng-bootstrap";
8
8
  import * as i2 from "../../services/tas.service";
9
- import * as i3 from "@angular/common";
9
+ import * as i3 from "../../services/tas-utility.service";
10
+ import * as i4 from "@angular/common";
10
11
  export class TasButtonComponent {
11
- constructor(modalService, tasService) {
12
+ constructor(modalService, tasService, tasUtilityService) {
12
13
  this.modalService = modalService;
13
14
  this.tasService = tasService;
15
+ this.tasUtilityService = tasUtilityService;
14
16
  // Status endpoint params
15
17
  this.roomType = TasRoomType.TAS;
16
18
  this.businessRole = TasBusinessRole.USER;
19
+ // Style customization
20
+ this.variant = 'default';
21
+ this.buttonLabel = 'Iniciar TAS';
17
22
  this.isLoading = false;
18
- this.buttonText = 'Iniciar TAS';
19
23
  // Status check state
20
24
  this.isCheckingStatus = false;
21
25
  this.isStatusError = false;
22
26
  this.statusErrorMessage = '';
27
+ this.isJoinable = false; // Tracks joinable field from status response
28
+ this.shouldShowButton = true; // Controls button visibility
23
29
  this.subscriptions = new Subscription();
24
30
  this.currentModalRef = null;
25
31
  this.videoCallModalRef = null;
@@ -32,18 +38,22 @@ export class TasButtonComponent {
32
38
  this.businessRole === TasBusinessRole.ADMIN_MANAGER ||
33
39
  this.businessRole === TasBusinessRole.MANAGER);
34
40
  }
35
- /** Whether the button should be visible */
36
- get isVisible() {
37
- // Backoffice: always show (disabled if error)
38
- // Other roles: hide if status error
39
- if (this.isBackoffice) {
40
- return true;
41
- }
42
- return !this.isStatusError;
43
- }
44
41
  /** Whether the button should be disabled */
45
42
  get isDisabled() {
46
- return this.isLoading || this.isCheckingStatus || this.isStatusError;
43
+ return this.isLoading || this.isStatusError || !this.isJoinable;
44
+ }
45
+ /** Reason why the button is disabled (for tooltip) */
46
+ get disabledReason() {
47
+ if (this.isLoading) {
48
+ return '';
49
+ }
50
+ if (this.isStatusError) {
51
+ return this.statusErrorMessage || 'Error al verificar el estado';
52
+ }
53
+ if (!this.isJoinable) {
54
+ return 'Todavía no es el horario de la llamada';
55
+ }
56
+ return '';
47
57
  }
48
58
  ngOnInit() {
49
59
  // Subscribe to viewMode to handle PiP return
@@ -86,71 +96,51 @@ export class TasButtonComponent {
86
96
  checkStatus() {
87
97
  // Skip if required inputs are not available
88
98
  if (!this.tenant || !this.entityId) {
89
- console.log('[TAS DEBUG] checkStatus skipped - missing required inputs');
90
99
  return;
91
100
  }
92
101
  this.isCheckingStatus = true;
93
102
  this.statusErrorMessage = '';
94
- console.log('[TAS DEBUG] checkStatus called with:', {
103
+ this.subscriptions.add(this.tasService
104
+ .getProxyVideoStatus({
95
105
  roomType: this.roomType,
96
106
  entityId: this.entityId,
97
107
  tenant: this.tenant,
98
108
  businessRole: this.businessRole,
99
- });
100
- this.subscriptions.add(this.tasService.getProxyVideoStatus({
101
- roomType: this.roomType,
102
- entityId: this.entityId,
103
- tenant: this.tenant,
104
- businessRole: this.businessRole,
105
- }).subscribe({
109
+ })
110
+ .subscribe({
106
111
  next: (response) => {
107
- // Check if response is actually an error (some HTTP adapters return errors in next)
108
- // Also check for undefined/null or missing content
109
- const isErrorResponse = !response ||
110
- !response.content ||
111
- response?.ok === false ||
112
- response?.status >= 400 ||
113
- response?.error ||
114
- response?.name === 'HttpErrorResponse';
115
- if (isErrorResponse) {
116
- console.error('[TAS DEBUG] Status check returned error in response:', response);
117
- this.isCheckingStatus = false;
118
- this.isStatusError = true;
119
- this.statusErrorMessage = response?.error?.message || response?.message || 'Error checking status';
120
- }
121
- else {
122
- console.log('[TAS DEBUG] Status check successful:', response);
123
- this.isCheckingStatus = false;
124
- this.isStatusError = false;
125
- this.statusErrorMessage = '';
126
- }
112
+ this.isCheckingStatus = false;
113
+ this.isStatusError = false;
114
+ this.statusErrorMessage = '';
115
+ this.shouldShowButton = true;
116
+ // Update joinable state from response
117
+ this.isJoinable = response.content?.joinable ?? false;
127
118
  },
128
119
  error: (err) => {
129
- console.error('[TAS DEBUG] Status check failed:', err);
130
120
  this.isCheckingStatus = false;
131
- this.isStatusError = true;
132
- this.statusErrorMessage = err?.error?.message || err?.message || 'Error checking status';
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
+ }
133
134
  },
134
135
  }));
135
136
  }
136
137
  onClick() {
137
- console.log('[TAS DEBUG] onClick called');
138
- console.log('[TAS DEBUG] Inputs:', {
139
- tenant: this.tenant,
140
- entityId: this.entityId,
141
- roomType: this.roomType,
142
- businessRole: this.businessRole,
143
- currentUser: this.currentUser,
144
- });
145
138
  if (!this.tenant || !this.currentUser?.name) {
146
- console.error('[TAS DEBUG] Tenant or current user not available');
147
139
  return;
148
140
  }
149
141
  if (!this.entityId) {
150
- console.error('[TAS DEBUG] entityId is required');
151
142
  return;
152
143
  }
153
- console.log('[TAS DEBUG] Validation passed, opening waiting room modal');
154
144
  this.openWaitingRoomModal();
155
145
  }
156
146
  openWaitingRoomModal() {
@@ -191,12 +181,12 @@ export class TasButtonComponent {
191
181
  });
192
182
  }
193
183
  }
194
- TasButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasButtonComponent, deps: [{ token: i1.NgbModal }, { token: i2.TasService }], target: i0.ɵɵFactoryTarget.Component });
195
- 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" }, ngImport: i0, template: "<button\n *ngIf=\"isVisible\"\n type=\"button\"\n class=\"btn btn-primary tas-btn\"\n (click)=\"onClick()\"\n [disabled]=\"isDisabled\"\n>\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\">Iniciar TAS</span>\n <span *ngIf=\"isLoading\">Processing...</span>\n</button>\n\n", styles: [":host{display:inline-block}.tas-btn{background-color:#ee316b!important;color:#fff!important;border-color:#ee316b!important;margin-right:24px}.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}\n"], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
184
+ 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
186
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasButtonComponent, decorators: [{
197
187
  type: Component,
198
- args: [{ selector: 'tas-btn', template: "<button\n *ngIf=\"isVisible\"\n type=\"button\"\n class=\"btn btn-primary tas-btn\"\n (click)=\"onClick()\"\n [disabled]=\"isDisabled\"\n>\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\">Iniciar TAS</span>\n <span *ngIf=\"isLoading\">Processing...</span>\n</button>\n\n", styles: [":host{display:inline-block}.tas-btn{background-color:#ee316b!important;color:#fff!important;border-color:#ee316b!important;margin-right:24px}.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}\n"] }]
199
- }], ctorParameters: function () { return [{ type: i1.NgbModal }, { type: i2.TasService }]; }, propDecorators: { roomType: [{
188
+ 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"] }]
189
+ }], ctorParameters: function () { return [{ type: i1.NgbModal }, { type: i2.TasService }, { type: i3.TasUtilityService }]; }, propDecorators: { roomType: [{
200
190
  type: Input
201
191
  }], entityId: [{
202
192
  type: Input
@@ -206,5 +196,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
206
196
  type: Input
207
197
  }], currentUser: [{
208
198
  type: Input
199
+ }], variant: [{
200
+ type: Input
201
+ }], buttonLabel: [{
202
+ type: Input
209
203
  }] } });
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWJ0bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixlQUFlLEdBQ2hCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7O0FBUWpGLE1BQU0sT0FBTyxrQkFBa0I7SUFnRDdCLFlBQ1UsWUFBc0IsRUFDdEIsVUFBc0I7UUFEdEIsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWpEaEMseUJBQXlCO1FBQ2hCLGFBQVEsR0FBZ0IsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUd4QyxpQkFBWSxHQUFvQixlQUFlLENBQUMsSUFBSSxDQUFDO1FBS3ZELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDVCxlQUFVLEdBQUcsYUFBYSxDQUFDO1FBRTNDLHFCQUFxQjtRQUNkLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0Qix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFdkIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxD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QUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQy9FLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDdkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUVqRixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDaEMsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDLEVBQ0QsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7O2dIQWxPVSxrQkFBa0I7b0dBQWxCLGtCQUFrQixtTENsQi9CLHFWQVlBOzRGRE1hLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxTQUFTO3dIQU1WLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYk1vZGFsLCBOZ2JNb2RhbFJlZiB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgVGFzQ3VycmVudFVzZXIsXG4gIFRhc1Jvb21UeXBlLFxuICBWaWV3TW9kZSxcbiAgVGFzQnVzaW5lc3NSb2xlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRhc1dhaXRpbmdSb29tQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFzLXdhaXRpbmctcm9vbS90YXMtd2FpdGluZy1yb29tLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNWaWRlb2NhbGxDb21wb25lbnQgfSBmcm9tICcuLi90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50JztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Rhcy1idG4nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Rhcy1idG4uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFzQnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBTdGF0dXMgZW5kcG9pbnQgcGFyYW1zXG4gIEBJbnB1dCgpIHJvb21UeXBlOiBUYXNSb29tVHlwZSA9IFRhc1Jvb21UeXBlLlRBUztcbiAgQElucHV0KCkgZW50aXR5SWQhOiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlbmFudCE6IHN0cmluZztcbiAgQElucHV0KCkgYnVzaW5lc3NSb2xlOiBUYXNCdXNpbmVzc1JvbGUgPSBUYXNCdXNpbmVzc1JvbGUuVVNFUjtcblxuICAvLyBVc2VyIGluZm8gZm9yIHRva2VuIHJlcXVlc3RcbiAgQElucHV0KCkgY3VycmVudFVzZXIhOiBUYXNDdXJyZW50VXNlcjtcblxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XG4gIHB1YmxpYyByZWFkb25seSBidXR0b25UZXh0ID0gJ0luaWNpYXIgVEFTJztcblxuICAvLyBTdGF0dXMgY2hlY2sgc3RhdGVcbiAgcHVibGljIGlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgcHVibGljIGlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgcHVibGljIHN0YXR1c0Vycm9yTWVzc2FnZSA9ICcnO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBjdXJyZW50TW9kYWxSZWY6IE5nYk1vZGFsUmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdmlkZW9DYWxsTW9kYWxSZWY6IE5nYk1vZGFsUmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzUG9sbGluZ0ludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBTVEFUVVNfUE9MTF9JTlRFUlZBTF9NUyA9IDMwMDAwOyAvLyAzMCBzZWNvbmRzXG5cbiAgLyoqIFdoZXRoZXIgdXNlciBpcyBiYWNrb2ZmaWNlIChvciBhZG1pbi9tYW5hZ2VyKSAqL1xuICBwdWJsaWMgZ2V0IGlzQmFja29mZmljZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5CQUNLT0ZGSUNFIHx8XG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLkFETUlOX01BTkFHRVIgfHxcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuTUFOQUdFUlxuICAgICk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgYnV0dG9uIHNob3VsZCBiZSB2aXNpYmxlICovXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIC8vIEJhY2tvZmZpY2U6IGFsd2F5cyBzaG93IChkaXNhYmxlZCBpZiBlcnJvcilcbiAgICAvLyBPdGhlciByb2xlczogaGlkZSBpZiBzdGF0dXMgZXJyb3JcbiAgICBpZiAodGhpcy5pc0JhY2tvZmZpY2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuaXNTdGF0dXNFcnJvcjtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkICovXG4gIHB1YmxpYyBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgfHwgdGhpcy5pc0NoZWNraW5nU3RhdHVzIHx8IHRoaXMuaXNTdGF0dXNFcnJvcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgICBwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFN1YnNjcmliZSB0byB2aWV3TW9kZSB0byBoYW5kbGUgUGlQIHJldHVyblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uudmlld01vZGUkLnN1YnNjcmliZSgobW9kZSkgPT4ge1xuICAgICAgICAvLyBXaGVuIGVudGVyaW5nIFBpUCwgY2xlYXIgdGhlIHZpZGVvQ2FsbE1vZGFsUmVmIHNpbmNlIG1vZGFsIHdpbGwgY2xvc2VcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBTdGFydCBzdGF0dXMgY2hlY2tpbmdcbiAgICB0aGlzLnN0YXJ0U3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHBvbGxpbmcgc3RhdHVzIGV2ZXJ5IDMwIHNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgc3RhcnRTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIC8vIEluaXRpYWwgc3RhdHVzIGNoZWNrXG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuXG4gICAgLy8gU2V0IHVwIHBlcmlvZGljIHBvbGxpbmdcbiAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgICB9LCB0aGlzLlNUQVRVU19QT0xMX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHN0YXR1cyBwb2xsaW5nXG4gICAqL1xuICBwcml2YXRlIHN0b3BTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCk7XG4gICAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyBlbmRwb2ludCB0byBkZXRlcm1pbmUgaWYgYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIC8vIFNraXAgaWYgcmVxdWlyZWQgaW5wdXRzIGFyZSBub3QgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLnRlbmFudCB8fCAhdGhpcy5lbnRpdHlJZCkge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIGNoZWNrU3RhdHVzIHNraXBwZWQgLSBtaXNzaW5nIHJlcXVpcmVkIGlucHV0cycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IHRydWU7XG4gICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBjaGVja1N0YXR1cyBjYWxsZWQgd2l0aDonLCB7XG4gICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgdGVuYW50OiB0aGlzLnRlbmFudCxcbiAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmdldFByb3h5VmlkZW9TdGF0dXMoe1xuICAgICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgICAgZW50aXR5SWQ6IHRoaXMuZW50aXR5SWQsXG4gICAgICAgIHRlbmFudDogdGhpcy50ZW5hbnQsXG4gICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHJlc3BvbnNlIGlzIGFjdHVhbGx5IGFuIGVycm9yIChzb21lIEhUVFAgYWRhcHRlcnMgcmV0dXJuIGVycm9ycyBpbiBuZXh0KVxuICAgICAgICAgIC8vIEFsc28gY2hlY2sgZm9yIHVuZGVmaW5lZC9udWxsIG9yIG1pc3NpbmcgY29udGVudFxuICAgICAgICAgIGNvbnN0IGlzRXJyb3JSZXNwb25zZSA9ICFyZXNwb25zZSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVzcG9uc2UuY29udGVudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlPy5vayA9PT0gZmFsc2UgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/LnN0YXR1cyA+PSA0MDAgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/LmVycm9yIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/Lm5hbWUgPT09ICdIdHRwRXJyb3JSZXNwb25zZSc7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGlzRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gU3RhdHVzIGNoZWNrIHJldHVybmVkIGVycm9yIGluIHJlc3BvbnNlOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc1N0YXR1c0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yPy5tZXNzYWdlIHx8IHJlc3BvbnNlPy5tZXNzYWdlIHx8ICdFcnJvciBjaGVja2luZyBzdGF0dXMnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gU3RhdHVzIGNoZWNrIHN1Y2Nlc3NmdWw6JywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5pc0NoZWNraW5nU3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIFN0YXR1cyBjaGVjayBmYWlsZWQ6JywgZXJyKTtcbiAgICAgICAgICB0aGlzLmlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmlzU3RhdHVzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgJ0Vycm9yIGNoZWNraW5nIHN0YXR1cyc7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBvbkNsaWNrIGNhbGxlZCcpO1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBJbnB1dHM6Jywge1xuICAgICAgdGVuYW50OiB0aGlzLnRlbmFudCxcbiAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgcm9vbVR5cGU6IHRoaXMucm9vbVR5cGUsXG4gICAgICBidXNpbmVzc1JvbGU6IHRoaXMuYnVzaW5lc3NSb2xlLFxuICAgICAgY3VycmVudFVzZXI6IHRoaXMuY3VycmVudFVzZXIsXG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMudGVuYW50IHx8ICF0aGlzLmN1cnJlbnRVc2VyPy5uYW1lKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSBUZW5hbnQgb3IgY3VycmVudCB1c2VyIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW50aXR5SWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIGVudGl0eUlkIGlzIHJlcXVpcmVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFZhbGlkYXRpb24gcGFzc2VkLCBvcGVuaW5nIHdhaXRpbmcgcm9vbSBtb2RhbCcpO1xuICAgIHRoaXMub3BlbldhaXRpbmdSb29tTW9kYWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbldhaXRpbmdSb29tTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFRhc1dhaXRpbmdSb29tQ29tcG9uZW50LCB7XG4gICAgICBzaXplOiAnbGcnLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtd2FpdGluZy1yb29tLW1vZGFsJyxcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUGFzcyBhbGwgbmVjZXNzYXJ5IGlucHV0cyB0byB0aGUgd2FpdGluZyByb29tIGNvbXBvbmVudFxuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnJvb21UeXBlID0gdGhpcy5yb29tVHlwZTtcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5lbnRpdHlJZCA9IHRoaXMuZW50aXR5SWQ7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGVuYW50ID0gdGhpcy50ZW5hbnQ7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuYnVzaW5lc3NSb2xlID0gdGhpcy5idXNpbmVzc1JvbGU7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY3VycmVudFVzZXIgPSB0aGlzLmN1cnJlbnRVc2VyO1xuXG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYucmVzdWx0LnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuVmlkZW9DYWxsTW9kYWwoaXNSZXR1cm5pbmdGcm9tUGlwOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihUYXNWaWRlb2NhbGxDb21wb25lbnQsIHtcbiAgICAgIHNpemU6ICd4bCcsXG4gICAgICB3aW5kb3dDbGFzczogJ3Rhcy12aWRlby1tb2RhbCcsXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXG4gICAgICBrZXlib2FyZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnNlc3Npb25JZCA9IHRoaXMudGFzU2VydmljZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b2tlbiA9IHRoaXMudGFzU2VydmljZS50b2tlbjtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmJ1c2luZXNzUm9sZSA9IHRoaXMuYnVzaW5lc3NSb2xlO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaXNSZXR1cm5pbmdGcm9tUGlwID0gaXNSZXR1cm5pbmdGcm9tUGlwO1xuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5yZXN1bHQudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLCI8YnV0dG9uXG4gICpuZ0lmPVwiaXNWaXNpYmxlXCJcbiAgdHlwZT1cImJ1dHRvblwiXG4gIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRhcy1idG5cIlxuICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuPlxuICA8aSBjbGFzcz1cImZhIGZhLXZpZGVvLWNhbWVyYVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPjwvaT5cbiAgPHNwYW4gKm5nSWY9XCIhaXNMb2FkaW5nXCI+SW5pY2lhciBUQVM8L3NwYW4+XG4gIDxzcGFuICpuZ0lmPVwiaXNMb2FkaW5nXCI+UHJvY2Vzc2luZy4uLjwvc3Bhbj5cbjwvYnV0dG9uPlxuXG4iXX0=
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWJ0bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBR0wsV0FBVyxFQUNYLFFBQVEsRUFDUixlQUFlLEdBQ2hCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7OztBQVNqRixNQUFNLE9BQU8sa0JBQWtCO0lBeUQ3QixZQUNVLFlBQXNCLEVBQ3RCLFVBQXNCLEVBQ3RCLGlCQUFvQztRQUZwQyxpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUN0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUEzRDlDLHlCQUF5QjtRQUNoQixhQUFRLEdBQWdCLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFHeEMsaUJBQVksR0FBb0IsZUFBZSxDQUFDLElBQUksQ0FBQztRQUs5RCxzQkFBc0I7UUFDYixZQUFPLEdBQXVCLFNBQVMsQ0FBQztRQUN4QyxnQkFBVyxHQUFXLGFBQWEsQ0FBQztRQUV0QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRXpCLHFCQUFxQjtRQUNkLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0Qix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDeEIsZUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLDZDQUE2QztRQUNqRSxxQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQyw2QkFBNkI7UUFFckQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLG9CQUFlLEdBQXVCLElBQUksQ0FBQztRQUMzQyxzQkFBaUIsR0FBdUIsSUFBSSxDQUFDO1FBQzdDLDBCQUFxQixHQUEwQyxJQUFJLENBQUM7UUFDM0QsNEJBQXVCLEdBQUcsS0FBSyxDQUFDLENBQUMsYUFBYTtJQWtDNUQsQ0FBQztJQWhDSixvREFBb0Q7SUFDcEQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sQ0FDTCxJQUFJLENBQUMsWUFBWSxLQUFLLGVBQWUsQ0FBQyxVQUFVO1lBQ2hELElBQUksQ0FBQyxZQUFZLEtBQUssZUFBZSxDQUFDLGFBQWE7WUFDbkQsSUFBSSxDQUFDLFlBQVksS0FBSyxlQUFlLENBQUMsT0FBTyxDQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUVELDRDQUE0QztJQUM1QyxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ2xFLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsSUFBVyxjQUFjO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixJQUFJLDhCQUE4QixDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsT0FBTyx3Q0FBd0MsQ0FBQztTQUNqRDtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQVFELFFBQVE7UUFDTiw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzNDLHdFQUF3RTtZQUN4RSxJQUFJLElBQUksS0FBSyxRQUFRLENBQUMsR0FBRyxFQUFFO2dCQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2FBQy9CO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCO1FBQ3hCLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzVDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzlCLGFBQWEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVztRQUNqQiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUU3QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLFVBQVU7YUFDWixtQkFBbUIsQ0FBQztZQUNuQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDaEMsQ0FBQzthQUNELFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDN0Isc0NBQXNDO2dCQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxJQUFJLEtBQUssQ0FBQztZQUN4RCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO2dCQUM5RixJQUFJLENBQUMsa0JBQWtCLEdBQUcsWUFBWSxDQUFDO2dCQUV2Qyw2REFBNkQ7Z0JBQzdELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBRTlFLHdCQUF3QjtnQkFDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBRXpCLG1EQUFtRDtnQkFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7aUJBQzVCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2lCQUMzQjtZQUNILENBQUM7U0FDRixDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRTtZQUMzQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDckUsSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQUUsd0JBQXdCO1lBQ3JDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDLENBQUM7UUFFSCwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNoRSxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN4RSxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRXRFLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDOUIsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQyxFQUNELEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGtCQUFrQixDQUFDLHFCQUE4QixLQUFLO1FBQzVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUNyRSxJQUFJLEVBQUUsSUFBSTtZQUNWLFdBQVcsRUFBRSxpQkFBaUI7WUFDOUIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUMvRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMxRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFFakYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2hDLEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQyxFQUNELEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDOztnSEF4TlUsa0JBQWtCO29HQUFsQixrQkFBa0IsbU9DcEIvQixpbEJBbUJBOzRGRENhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxTQUFTO3dKQU1WLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYk1vZGFsLCBOZ2JNb2RhbFJlZiB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgVGFzQ3VycmVudFVzZXIsXG4gIFxuICBUYXNSb29tVHlwZSxcbiAgVmlld01vZGUsXG4gIFRhc0J1c2luZXNzUm9sZSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUYXNXYWl0aW5nUm9vbUNvbXBvbmVudCB9IGZyb20gJy4uL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFzVmlkZW9jYWxsQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFzLXZpZGVvY2FsbC90YXMtdmlkZW9jYWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFzVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMtdXRpbGl0eS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLWJ0bicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXMtYnRuLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzLWJ0bi5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vIFN0YXR1cyBlbmRwb2ludCBwYXJhbXNcbiAgQElucHV0KCkgcm9vbVR5cGU6IFRhc1Jvb21UeXBlID0gVGFzUm9vbVR5cGUuVEFTO1xuICBASW5wdXQoKSBlbnRpdHlJZCE6IG51bWJlcjtcbiAgQElucHV0KCkgdGVuYW50ITogc3RyaW5nO1xuICBASW5wdXQoKSBidXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZSA9IFRhc0J1c2luZXNzUm9sZS5VU0VSO1xuXG4gIC8vIFVzZXIgaW5mbyBmb3IgdG9rZW4gcmVxdWVzdFxuICBASW5wdXQoKSBjdXJyZW50VXNlciE6IFRhc0N1cnJlbnRVc2VyO1xuXG4gIC8vIFN0eWxlIGN1c3RvbWl6YXRpb25cbiAgQElucHV0KCkgdmFyaWFudDogJ2RlZmF1bHQnIHwgJ3RlYWwnID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBidXR0b25MYWJlbDogc3RyaW5nID0gJ0luaWNpYXIgVEFTJztcblxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgLy8gU3RhdHVzIGNoZWNrIHN0YXRlXG4gIHB1YmxpYyBpc0NoZWNraW5nU3RhdHVzID0gZmFsc2U7XG4gIHB1YmxpYyBpc1N0YXR1c0Vycm9yID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcbiAgcHVibGljIGlzSm9pbmFibGUgPSBmYWxzZTsgLy8gVHJhY2tzIGpvaW5hYmxlIGZpZWxkIGZyb20gc3RhdHVzIHJlc3BvbnNlXG4gIHB1YmxpYyBzaG91bGRTaG93QnV0dG9uID0gdHJ1ZTsgLy8gQ29udHJvbHMgYnV0dG9uIHZpc2liaWxpdHlcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgY3VycmVudE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZpZGVvQ2FsbE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXR1c1BvbGxpbmdJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgU1RBVFVTX1BPTExfSU5URVJWQUxfTVMgPSAzMDAwMDsgLy8gMzAgc2Vjb25kc1xuXG4gIC8qKiBXaGV0aGVyIHVzZXIgaXMgYmFja29mZmljZSAob3IgYWRtaW4vbWFuYWdlcikgKi9cbiAgcHVibGljIGdldCBpc0JhY2tvZmZpY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuQkFDS09GRklDRSB8fFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5BRE1JTl9NQU5BR0VSIHx8XG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLk1BTkFHRVJcbiAgICApO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQgKi9cbiAgcHVibGljIGdldCBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGluZyB8fCB0aGlzLmlzU3RhdHVzRXJyb3IgfHwgIXRoaXMuaXNKb2luYWJsZTtcbiAgfVxuXG4gIC8qKiBSZWFzb24gd2h5IHRoZSBidXR0b24gaXMgZGlzYWJsZWQgKGZvciB0b29sdGlwKSAqL1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkUmVhc29uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzU3RhdHVzRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXR1c0Vycm9yTWVzc2FnZSB8fCAnRXJyb3IgYWwgdmVyaWZpY2FyIGVsIGVzdGFkbyc7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0pvaW5hYmxlKSB7XG4gICAgICByZXR1cm4gJ1RvZGF2w61hIG5vIGVzIGVsIGhvcmFyaW8gZGUgbGEgbGxhbWFkYSc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgICBwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YXNVdGlsaXR5U2VydmljZTogVGFzVXRpbGl0eVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFN1YnNjcmliZSB0byB2aWV3TW9kZSB0byBoYW5kbGUgUGlQIHJldHVyblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uudmlld01vZGUkLnN1YnNjcmliZSgobW9kZSkgPT4ge1xuICAgICAgICAvLyBXaGVuIGVudGVyaW5nIFBpUCwgY2xlYXIgdGhlIHZpZGVvQ2FsbE1vZGFsUmVmIHNpbmNlIG1vZGFsIHdpbGwgY2xvc2VcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBTdGFydCBzdGF0dXMgY2hlY2tpbmdcbiAgICB0aGlzLnN0YXJ0U3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHBvbGxpbmcgc3RhdHVzIGV2ZXJ5IDMwIHNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgc3RhcnRTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIC8vIEluaXRpYWwgc3RhdHVzIGNoZWNrXG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuXG4gICAgLy8gU2V0IHVwIHBlcmlvZGljIHBvbGxpbmdcbiAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgICB9LCB0aGlzLlNUQVRVU19QT0xMX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHN0YXR1cyBwb2xsaW5nXG4gICAqL1xuICBwcml2YXRlIHN0b3BTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCk7XG4gICAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyBlbmRwb2ludCB0byBkZXRlcm1pbmUgaWYgYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIC8vIFNraXAgaWYgcmVxdWlyZWQgaW5wdXRzIGFyZSBub3QgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLnRlbmFudCB8fCAhdGhpcy5lbnRpdHlJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IHRydWU7XG4gICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2VcbiAgICAgICAgLmdldFByb3h5VmlkZW9TdGF0dXMoe1xuICAgICAgICAgIHJvb21UeXBlOiB0aGlzLnJvb21UeXBlLFxuICAgICAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgICAgIHRlbmFudDogdGhpcy50ZW5hbnQsXG4gICAgICAgICAgYnVzaW5lc3NSb2xlOiB0aGlzLmJ1c2luZXNzUm9sZSxcbiAgICAgICAgfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNTdGF0dXNFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkU2hvd0J1dHRvbiA9IHRydWU7XG4gICAgICAgICAgICAvLyBVcGRhdGUgam9pbmFibGUgc3RhdGUgZnJvbSByZXNwb25zZVxuICAgICAgICAgICAgdGhpcy5pc0pvaW5hYmxlID0gcmVzcG9uc2UuY29udGVudD8uam9pbmFibGUgPz8gZmFsc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0NoZWNraW5nU3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0aGlzLnRhc1V0aWxpdHlTZXJ2aWNlLmV4dHJhY3RFcnJvck1lc3NhZ2UoZXJyLCAnRXJyb3IgY2hlY2tpbmcgc3RhdHVzJyk7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0Vycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTtcblxuICAgICAgICAgICAgLy8gVXNlIHV0aWxpdHkgc2VydmljZSB0byBkZXRlcm1pbmUgaWYgYnV0dG9uIHNob3VsZCBiZSBzaG93blxuICAgICAgICAgICAgdGhpcy5zaG91bGRTaG93QnV0dG9uID0gdGhpcy50YXNVdGlsaXR5U2VydmljZS5zaG91bGRTaG93QnV0dG9uKGVycm9yTWVzc2FnZSk7XG5cbiAgICAgICAgICAgIC8vIFN0b3AgcG9sbGluZyBvbiBlcnJvclxuICAgICAgICAgICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuXG4gICAgICAgICAgICAvLyBJZiBidXR0b24gc2hvdWxkIGJlIGhpZGRlbiwgZG9uJ3QgdHJlYXQgYXMgZXJyb3JcbiAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRTaG93QnV0dG9uKSB7XG4gICAgICAgICAgICAgIHRoaXMuaXNTdGF0dXNFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pc1N0YXR1c0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW5hbnQgfHwgIXRoaXMuY3VycmVudFVzZXI/Lm5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW50aXR5SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5XYWl0aW5nUm9vbU1vZGFsKCk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5XYWl0aW5nUm9vbU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihUYXNXYWl0aW5nUm9vbUNvbXBvbmVudCwge1xuICAgICAgc2l6ZTogJ2xnJyxcbiAgICAgIHdpbmRvd0NsYXNzOiAndGFzLXdhaXRpbmctcm9vbS1tb2RhbCcsXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXG4gICAgICBrZXlib2FyZDogZmFsc2UsXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFBhc3MgYWxsIG5lY2Vzc2FyeSBpbnB1dHMgdG8gdGhlIHdhaXRpbmcgcm9vbSBjb21wb25lbnRcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5yb29tVHlwZSA9IHRoaXMucm9vbVR5cGU7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZW50aXR5SWQgPSB0aGlzLmVudGl0eUlkO1xuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRlbmFudCA9IHRoaXMudGVuYW50O1xuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmJ1c2luZXNzUm9sZSA9IHRoaXMuYnVzaW5lc3NSb2xlO1xuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmN1cnJlbnRVc2VyID0gdGhpcy5jdXJyZW50VXNlcjtcblxuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLnJlc3VsdC50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlblZpZGVvQ2FsbE1vZGFsKGlzUmV0dXJuaW5nRnJvbVBpcDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVGFzVmlkZW9jYWxsQ29tcG9uZW50LCB7XG4gICAgICBzaXplOiAneGwnLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtdmlkZW8tbW9kYWwnLFxuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxuICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5zZXNzaW9uSWQgPSB0aGlzLnRhc1NlcnZpY2Uuc2Vzc2lvbklkO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudG9rZW4gPSB0aGlzLnRhc1NlcnZpY2UudG9rZW47XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5idXNpbmVzc1JvbGUgPSB0aGlzLmJ1c2luZXNzUm9sZTtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmlzUmV0dXJuaW5nRnJvbVBpcCA9IGlzUmV0dXJuaW5nRnJvbVBpcDtcblxuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYucmVzdWx0LnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwiPHNwYW5cbiAgKm5nSWY9XCJzaG91bGRTaG93QnV0dG9uXCJcbiAgW25nYlRvb2x0aXBdPVwiaXNEaXNhYmxlZCAmJiBkaXNhYmxlZFJlYXNvbiA/IGRpc2FibGVkUmVhc29uIDogbnVsbFwiXG4gIGNvbnRhaW5lcj1cImJvZHlcIlxuICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICB0b29sdGlwQ2xhc3M9XCJ0YXMtYnRuLXRvb2x0aXBcIlxuPlxuICA8YnV0dG9uXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGFzLWJ0blwiXG4gICAgW2NsYXNzLnRhcy1idG4tLXRlYWxdPVwidmFyaWFudCA9PT0gJ3RlYWwnXCJcbiAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4gID5cbiAgICA8aSBjbGFzcz1cImZhIGZhLXZpZGVvLWNhbWVyYVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPjwvaT5cbiAgICA8c3BhbiAqbmdJZj1cIiFpc0xvYWRpbmdcIj57eyBidXR0b25MYWJlbCB9fTwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cImlzTG9hZGluZ1wiPlByb2Nlc3NpbmcuLi48L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9zcGFuPlxuIl19
@@ -0,0 +1,109 @@
1
+ import { Component, Input, Output, EventEmitter, } from '@angular/core';
2
+ import { Subscription } from 'rxjs';
3
+ import { AppointmentStatus, TasRoomType, TasBusinessRole, } from '../../interfaces/tas.interfaces';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../services/tas.service";
6
+ import * as i2 from "../tas-avatar/tas-avatar.component";
7
+ import * as i3 from "../tas-btn/tas-btn.component";
8
+ import * as i4 from "@angular/common";
9
+ export class TasIncomingAppointmentComponent {
10
+ constructor(tasService) {
11
+ this.tasService = tasService;
12
+ // Passthrough inputs for tas-btn
13
+ this.roomType = TasRoomType.TAS;
14
+ this.businessRole = TasBusinessRole.USER;
15
+ this.enterCall = new EventEmitter();
16
+ this.appointment = null;
17
+ this.isLoading = true;
18
+ this.hasError = false;
19
+ this.subscriptions = new Subscription();
20
+ }
21
+ ngOnInit() {
22
+ this.loadAppointments();
23
+ }
24
+ ngOnDestroy() {
25
+ this.subscriptions.unsubscribe();
26
+ }
27
+ loadAppointments() {
28
+ const today = new Date();
29
+ const in7Days = new Date(today);
30
+ in7Days.setDate(today.getDate() + 7);
31
+ this.subscriptions.add(this.tasService
32
+ .getAppointments({ fromDate: this.formatDate(today), toDate: this.formatDate(in7Days), entityId: this.entityId })
33
+ .subscribe({
34
+ next: (response) => {
35
+ // Handle both array response and wrapped response (e.g., { content: [...] })
36
+ const appointments = Array.isArray(response)
37
+ ? response
38
+ : 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;
42
+ this.isLoading = false;
43
+ },
44
+ error: () => {
45
+ this.hasError = true;
46
+ this.isLoading = false;
47
+ },
48
+ }));
49
+ }
50
+ onEnterCall() {
51
+ if (this.appointment) {
52
+ this.enterCall.emit(this.appointment);
53
+ }
54
+ }
55
+ /**
56
+ * Format date to Spanish format: "Lunes 8 de diciembre"
57
+ */
58
+ get formattedDate() {
59
+ if (!this.appointment)
60
+ return '';
61
+ const [year, month, day] = this.appointment.date.split('-').map(Number);
62
+ const date = new Date(year, month - 1, day);
63
+ const dayNames = [
64
+ 'Domingo', 'Lunes', 'Martes', 'Miércoles',
65
+ 'Jueves', 'Viernes', 'Sábado'
66
+ ];
67
+ const monthNames = [
68
+ 'enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',
69
+ 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'
70
+ ];
71
+ const dayName = dayNames[date.getDay()];
72
+ const dayNum = date.getDate();
73
+ const monthName = monthNames[date.getMonth()];
74
+ return `${dayName} ${dayNum} de ${monthName}`;
75
+ }
76
+ /**
77
+ * Format time range: "9:00 - 9:30"
78
+ */
79
+ get formattedTimeRange() {
80
+ if (!this.appointment)
81
+ return '';
82
+ return `${this.appointment.startTime} - ${this.appointment.endTime}`;
83
+ }
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
+ }
91
+ 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"] }] });
93
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasIncomingAppointmentComponent, decorators: [{
94
+ 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"] }]
96
+ }], ctorParameters: function () { return [{ type: i1.TasService }]; }, propDecorators: { roomType: [{
97
+ type: Input
98
+ }], entityId: [{
99
+ type: Input
100
+ }], tenant: [{
101
+ type: Input
102
+ }], businessRole: [{
103
+ type: Input
104
+ }], currentUser: [{
105
+ type: Input
106
+ }], enterCall: [{
107
+ type: Output
108
+ }] } });
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=