tas-uell-sdk 0.0.6 → 0.1.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
@@ -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,28 @@ 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
+ }
226
+ ```
227
+
206
228
  ### Enums
207
229
  - **TasUserRole**: `OWNER`, `USER`, `MODERATOR`
208
230
  - **TasBusinessRole**: `ADMIN_MANAGER`, `MANAGER`, `BACKOFFICE`, `USER`
209
231
  - **TasRoomType**: `TAS`, `JM`, `WEBINAR`, `WELLNESS_MANAGER`
210
232
  - **CallState**: `IDLE`, `CONNECTING`, `CONNECTED`, `DISCONNECTED`, `ERROR`
211
233
  - **ViewMode**: `FULLSCREEN`, `PIP`
234
+ - **AppointmentStatus**: `CONFIRMED`, `CANCELLED`
212
235
 
213
236
  ## Exported Services
214
237
 
@@ -224,10 +247,56 @@ Core service for managing video sessions and state.
224
247
  - `toggleMute()` - Toggles local audio
225
248
  - `disconnectSession()` - Ends the current session
226
249
  - `getProxyVideoStatus(params)` - Gets session status
250
+ - `getAppointments(params)` - Gets user appointments within date range
227
251
 
228
252
  ## Exported Components
229
253
 
230
- - `TasButtonComponent` - `<tas-btn>`
254
+ ### TasButtonComponent - `<tas-btn>`
255
+
256
+ Initiates video calls. Supports style variants:
257
+
258
+ ```html
259
+ <!-- Default (pink) -->
260
+ <tas-btn [entityId]="123" [tenant]="'tenant'" [currentUser]="user"></tas-btn>
261
+
262
+ <!-- Teal variant with custom label -->
263
+ <tas-btn variant="teal" buttonLabel="Ingresar" [entityId]="123" [tenant]="'tenant'" [currentUser]="user"></tas-btn>
264
+ ```
265
+
266
+ | Property | Type | Default | Description |
267
+ | :--- | :--- | :--- | :--- |
268
+ | `variant` | `'default' \| 'teal'` | `'default'` | Button style variant |
269
+ | `buttonLabel` | `string` | `'Iniciar TAS'` | Button text |
270
+
271
+ ### TasIncomingAppointmentComponent - `<tas-incoming-appointment>`
272
+
273
+ Displays the user's next scheduled appointment or an empty state. Uses `<tas-btn>` internally.
274
+
275
+ ```html
276
+ <tas-incoming-appointment
277
+ [entityId]="123"
278
+ [tenant]="'tenant'"
279
+ [currentUser]="user"
280
+ [businessRole]="'USER'"
281
+ (enterCall)="onEnterCall($event)"
282
+ ></tas-incoming-appointment>
283
+ ```
284
+
285
+ | Property | Type | Required | Default | Description |
286
+ | :--- | :--- | :--- | :--- | :--- |
287
+ | `entityId` | `number` | Yes | - | Entity/ausencia ID |
288
+ | `tenant` | `string` | Yes | - | Tenant identifier |
289
+ | `currentUser` | `TasCurrentUser` | Yes | - | Current user info |
290
+ | `roomType` | `TasRoomType` | No | `'TAS'` | Room type |
291
+ | `businessRole` | `TasBusinessRole` | No | `'USER'` | User's business role |
292
+
293
+ | Output | Type | Description |
294
+ | :--- | :--- | :--- |
295
+ | `enterCall` | `EventEmitter<TasAppointment>` | Emits appointment when clicking "Ingresar" |
296
+
297
+ **Note:** Requires the `TasHttpClient` adapter to implement the `get()` method.
298
+
299
+ ### Other Components
231
300
  - `TasVideocallComponent` - Full-screen video call interface
232
301
  - `TasWaitingRoomComponent` - Pre-call waiting room
233
302
  - `TasFloatingCallComponent` - `<tas-floating-call>`
@@ -14,12 +14,15 @@ export class TasButtonComponent {
14
14
  // Status endpoint params
15
15
  this.roomType = TasRoomType.TAS;
16
16
  this.businessRole = TasBusinessRole.USER;
17
+ // Style customization
18
+ this.variant = 'default';
19
+ this.buttonLabel = 'Iniciar TAS';
17
20
  this.isLoading = false;
18
- this.buttonText = 'Iniciar TAS';
19
21
  // Status check state
20
22
  this.isCheckingStatus = false;
21
23
  this.isStatusError = false;
22
24
  this.statusErrorMessage = '';
25
+ this.isJoinable = false; // Tracks joinable field from status response
23
26
  this.subscriptions = new Subscription();
24
27
  this.currentModalRef = null;
25
28
  this.videoCallModalRef = null;
@@ -32,18 +35,22 @@ export class TasButtonComponent {
32
35
  this.businessRole === TasBusinessRole.ADMIN_MANAGER ||
33
36
  this.businessRole === TasBusinessRole.MANAGER);
34
37
  }
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
38
  /** Whether the button should be disabled */
45
39
  get isDisabled() {
46
- return this.isLoading || this.isCheckingStatus || this.isStatusError;
40
+ return this.isLoading || this.isStatusError || !this.isJoinable;
41
+ }
42
+ /** Reason why the button is disabled (for tooltip) */
43
+ get disabledReason() {
44
+ if (this.isLoading) {
45
+ return '';
46
+ }
47
+ if (this.isStatusError) {
48
+ return this.statusErrorMessage || 'Error al verificar el estado';
49
+ }
50
+ if (!this.isJoinable) {
51
+ return 'Todavía no es el horario de la llamada';
52
+ }
53
+ return '';
47
54
  }
48
55
  ngOnInit() {
49
56
  // Subscribe to viewMode to handle PiP return
@@ -86,17 +93,10 @@ export class TasButtonComponent {
86
93
  checkStatus() {
87
94
  // Skip if required inputs are not available
88
95
  if (!this.tenant || !this.entityId) {
89
- console.log('[TAS DEBUG] checkStatus skipped - missing required inputs');
90
96
  return;
91
97
  }
92
98
  this.isCheckingStatus = true;
93
99
  this.statusErrorMessage = '';
94
- console.log('[TAS DEBUG] checkStatus called with:', {
95
- roomType: this.roomType,
96
- entityId: this.entityId,
97
- tenant: this.tenant,
98
- businessRole: this.businessRole,
99
- });
100
100
  this.subscriptions.add(this.tasService.getProxyVideoStatus({
101
101
  roomType: this.roomType,
102
102
  entityId: this.entityId,
@@ -113,20 +113,19 @@ export class TasButtonComponent {
113
113
  response?.error ||
114
114
  response?.name === 'HttpErrorResponse';
115
115
  if (isErrorResponse) {
116
- console.error('[TAS DEBUG] Status check returned error in response:', response);
117
116
  this.isCheckingStatus = false;
118
117
  this.isStatusError = true;
119
118
  this.statusErrorMessage = response?.error?.message || response?.message || 'Error checking status';
120
119
  }
121
120
  else {
122
- console.log('[TAS DEBUG] Status check successful:', response);
123
121
  this.isCheckingStatus = false;
124
122
  this.isStatusError = false;
125
123
  this.statusErrorMessage = '';
124
+ // Update joinable state from response
125
+ this.isJoinable = response.content?.joinable ?? false;
126
126
  }
127
127
  },
128
128
  error: (err) => {
129
- console.error('[TAS DEBUG] Status check failed:', err);
130
129
  this.isCheckingStatus = false;
131
130
  this.isStatusError = true;
132
131
  this.statusErrorMessage = err?.error?.message || err?.message || 'Error checking status';
@@ -134,23 +133,12 @@ export class TasButtonComponent {
134
133
  }));
135
134
  }
136
135
  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
136
  if (!this.tenant || !this.currentUser?.name) {
146
- console.error('[TAS DEBUG] Tenant or current user not available');
147
137
  return;
148
138
  }
149
139
  if (!this.entityId) {
150
- console.error('[TAS DEBUG] entityId is required');
151
140
  return;
152
141
  }
153
- console.log('[TAS DEBUG] Validation passed, opening waiting room modal');
154
142
  this.openWaitingRoomModal();
155
143
  }
156
144
  openWaitingRoomModal() {
@@ -192,10 +180,10 @@ export class TasButtonComponent {
192
180
  }
193
181
  }
194
182
  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"] }] });
183
+ 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 [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;padding:10px 24px;font-weight:500;margin-right:0}.tas-btn--teal:hover:not(:disabled){background-color:#00838f!important;border-color:#00838f!important}\n"], directives: [{ type: i1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
196
184
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasButtonComponent, decorators: [{
197
185
  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"] }]
186
+ args: [{ selector: 'tas-btn', template: "<span\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;padding:10px 24px;font-weight:500;margin-right:0}.tas-btn--teal:hover:not(:disabled){background-color:#00838f!important;border-color:#00838f!important}\n"] }]
199
187
  }], ctorParameters: function () { return [{ type: i1.NgbModal }, { type: i2.TasService }]; }, propDecorators: { roomType: [{
200
188
  type: Input
201
189
  }], entityId: [{
@@ -206,5 +194,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
206
194
  type: Input
207
195
  }], currentUser: [{
208
196
  type: Input
197
+ }], variant: [{
198
+ type: Input
199
+ }], buttonLabel: [{
200
+ type: Input
209
201
  }] } });
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWJ0bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixlQUFlLEdBQ2hCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7O0FBUWpGLE1BQU0sT0FBTyxrQkFBa0I7SUFnRDdCLFlBQ1UsWUFBc0IsRUFDdEIsVUFBc0I7UUFEdEIsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWpEaEMseUJBQXlCO1FBQ2hCLGFBQVEsR0FBZ0IsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUd4QyxpQkFBWSxHQUFvQixlQUFlLENBQUMsSUFBSSxDQUFDO1FBS3ZELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDVCxlQUFVLEdBQUcsYUFBYSxDQUFDO1FBRTNDLHFCQUFxQjtRQUNkLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0Qix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFdkIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxD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QUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQy9FLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDdkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUVqRixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDaEMsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDLEVBQ0QsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7O2dIQWxPVSxrQkFBa0I7b0dBQWxCLGtCQUFrQixtTENsQi9CLHFWQVlBOzRGRE1hLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxTQUFTO3dIQU1WLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYk1vZGFsLCBOZ2JNb2RhbFJlZiB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgVGFzQ3VycmVudFVzZXIsXG4gIFRhc1Jvb21UeXBlLFxuICBWaWV3TW9kZSxcbiAgVGFzQnVzaW5lc3NSb2xlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRhc1dhaXRpbmdSb29tQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFzLXdhaXRpbmctcm9vbS90YXMtd2FpdGluZy1yb29tLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNWaWRlb2NhbGxDb21wb25lbnQgfSBmcm9tICcuLi90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50JztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Rhcy1idG4nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Rhcy1idG4uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFzQnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBTdGF0dXMgZW5kcG9pbnQgcGFyYW1zXG4gIEBJbnB1dCgpIHJvb21UeXBlOiBUYXNSb29tVHlwZSA9IFRhc1Jvb21UeXBlLlRBUztcbiAgQElucHV0KCkgZW50aXR5SWQhOiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlbmFudCE6IHN0cmluZztcbiAgQElucHV0KCkgYnVzaW5lc3NSb2xlOiBUYXNCdXNpbmVzc1JvbGUgPSBUYXNCdXNpbmVzc1JvbGUuVVNFUjtcblxuICAvLyBVc2VyIGluZm8gZm9yIHRva2VuIHJlcXVlc3RcbiAgQElucHV0KCkgY3VycmVudFVzZXIhOiBUYXNDdXJyZW50VXNlcjtcblxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XG4gIHB1YmxpYyByZWFkb25seSBidXR0b25UZXh0ID0gJ0luaWNpYXIgVEFTJztcblxuICAvLyBTdGF0dXMgY2hlY2sgc3RhdGVcbiAgcHVibGljIGlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgcHVibGljIGlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgcHVibGljIHN0YXR1c0Vycm9yTWVzc2FnZSA9ICcnO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBjdXJyZW50TW9kYWxSZWY6IE5nYk1vZGFsUmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdmlkZW9DYWxsTW9kYWxSZWY6IE5nYk1vZGFsUmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzUG9sbGluZ0ludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBTVEFUVVNfUE9MTF9JTlRFUlZBTF9NUyA9IDMwMDAwOyAvLyAzMCBzZWNvbmRzXG5cbiAgLyoqIFdoZXRoZXIgdXNlciBpcyBiYWNrb2ZmaWNlIChvciBhZG1pbi9tYW5hZ2VyKSAqL1xuICBwdWJsaWMgZ2V0IGlzQmFja29mZmljZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5CQUNLT0ZGSUNFIHx8XG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLkFETUlOX01BTkFHRVIgfHxcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuTUFOQUdFUlxuICAgICk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgYnV0dG9uIHNob3VsZCBiZSB2aXNpYmxlICovXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIC8vIEJhY2tvZmZpY2U6IGFsd2F5cyBzaG93IChkaXNhYmxlZCBpZiBlcnJvcilcbiAgICAvLyBPdGhlciByb2xlczogaGlkZSBpZiBzdGF0dXMgZXJyb3JcbiAgICBpZiAodGhpcy5pc0JhY2tvZmZpY2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuaXNTdGF0dXNFcnJvcjtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkICovXG4gIHB1YmxpYyBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgfHwgdGhpcy5pc0NoZWNraW5nU3RhdHVzIHx8IHRoaXMuaXNTdGF0dXNFcnJvcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgICBwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFN1YnNjcmliZSB0byB2aWV3TW9kZSB0byBoYW5kbGUgUGlQIHJldHVyblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uudmlld01vZGUkLnN1YnNjcmliZSgobW9kZSkgPT4ge1xuICAgICAgICAvLyBXaGVuIGVudGVyaW5nIFBpUCwgY2xlYXIgdGhlIHZpZGVvQ2FsbE1vZGFsUmVmIHNpbmNlIG1vZGFsIHdpbGwgY2xvc2VcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBTdGFydCBzdGF0dXMgY2hlY2tpbmdcbiAgICB0aGlzLnN0YXJ0U3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHBvbGxpbmcgc3RhdHVzIGV2ZXJ5IDMwIHNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgc3RhcnRTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIC8vIEluaXRpYWwgc3RhdHVzIGNoZWNrXG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuXG4gICAgLy8gU2V0IHVwIHBlcmlvZGljIHBvbGxpbmdcbiAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgICB9LCB0aGlzLlNUQVRVU19QT0xMX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHN0YXR1cyBwb2xsaW5nXG4gICAqL1xuICBwcml2YXRlIHN0b3BTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCk7XG4gICAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyBlbmRwb2ludCB0byBkZXRlcm1pbmUgaWYgYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIC8vIFNraXAgaWYgcmVxdWlyZWQgaW5wdXRzIGFyZSBub3QgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLnRlbmFudCB8fCAhdGhpcy5lbnRpdHlJZCkge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIGNoZWNrU3RhdHVzIHNraXBwZWQgLSBtaXNzaW5nIHJlcXVpcmVkIGlucHV0cycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IHRydWU7XG4gICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBjaGVja1N0YXR1cyBjYWxsZWQgd2l0aDonLCB7XG4gICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgdGVuYW50OiB0aGlzLnRlbmFudCxcbiAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmdldFByb3h5VmlkZW9TdGF0dXMoe1xuICAgICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgICAgZW50aXR5SWQ6IHRoaXMuZW50aXR5SWQsXG4gICAgICAgIHRlbmFudDogdGhpcy50ZW5hbnQsXG4gICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHJlc3BvbnNlIGlzIGFjdHVhbGx5IGFuIGVycm9yIChzb21lIEhUVFAgYWRhcHRlcnMgcmV0dXJuIGVycm9ycyBpbiBuZXh0KVxuICAgICAgICAgIC8vIEFsc28gY2hlY2sgZm9yIHVuZGVmaW5lZC9udWxsIG9yIG1pc3NpbmcgY29udGVudFxuICAgICAgICAgIGNvbnN0IGlzRXJyb3JSZXNwb25zZSA9ICFyZXNwb25zZSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVzcG9uc2UuY29udGVudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlPy5vayA9PT0gZmFsc2UgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/LnN0YXR1cyA+PSA0MDAgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/LmVycm9yIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/Lm5hbWUgPT09ICdIdHRwRXJyb3JSZXNwb25zZSc7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGlzRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gU3RhdHVzIGNoZWNrIHJldHVybmVkIGVycm9yIGluIHJlc3BvbnNlOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc1N0YXR1c0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yPy5tZXNzYWdlIHx8IHJlc3BvbnNlPy5tZXNzYWdlIHx8ICdFcnJvciBjaGVja2luZyBzdGF0dXMnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gU3RhdHVzIGNoZWNrIHN1Y2Nlc3NmdWw6JywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5pc0NoZWNraW5nU3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIFN0YXR1cyBjaGVjayBmYWlsZWQ6JywgZXJyKTtcbiAgICAgICAgICB0aGlzLmlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmlzU3RhdHVzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgJ0Vycm9yIGNoZWNraW5nIHN0YXR1cyc7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBvbkNsaWNrIGNhbGxlZCcpO1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBJbnB1dHM6Jywge1xuICAgICAgdGVuYW50OiB0aGlzLnRlbmFudCxcbiAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgcm9vbVR5cGU6IHRoaXMucm9vbVR5cGUsXG4gICAgICBidXNpbmVzc1JvbGU6IHRoaXMuYnVzaW5lc3NSb2xlLFxuICAgICAgY3VycmVudFVzZXI6IHRoaXMuY3VycmVudFVzZXIsXG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMudGVuYW50IHx8ICF0aGlzLmN1cnJlbnRVc2VyPy5uYW1lKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSBUZW5hbnQgb3IgY3VycmVudCB1c2VyIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW50aXR5SWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIGVudGl0eUlkIGlzIHJlcXVpcmVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFZhbGlkYXRpb24gcGFzc2VkLCBvcGVuaW5nIHdhaXRpbmcgcm9vbSBtb2RhbCcpO1xuICAgIHRoaXMub3BlbldhaXRpbmdSb29tTW9kYWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbldhaXRpbmdSb29tTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFRhc1dhaXRpbmdSb29tQ29tcG9uZW50LCB7XG4gICAgICBzaXplOiAnbGcnLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtd2FpdGluZy1yb29tLW1vZGFsJyxcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUGFzcyBhbGwgbmVjZXNzYXJ5IGlucHV0cyB0byB0aGUgd2FpdGluZyByb29tIGNvbXBvbmVudFxuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnJvb21UeXBlID0gdGhpcy5yb29tVHlwZTtcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5lbnRpdHlJZCA9IHRoaXMuZW50aXR5SWQ7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGVuYW50ID0gdGhpcy50ZW5hbnQ7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuYnVzaW5lc3NSb2xlID0gdGhpcy5idXNpbmVzc1JvbGU7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY3VycmVudFVzZXIgPSB0aGlzLmN1cnJlbnRVc2VyO1xuXG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYucmVzdWx0LnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuVmlkZW9DYWxsTW9kYWwoaXNSZXR1cm5pbmdGcm9tUGlwOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihUYXNWaWRlb2NhbGxDb21wb25lbnQsIHtcbiAgICAgIHNpemU6ICd4bCcsXG4gICAgICB3aW5kb3dDbGFzczogJ3Rhcy12aWRlby1tb2RhbCcsXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXG4gICAgICBrZXlib2FyZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnNlc3Npb25JZCA9IHRoaXMudGFzU2VydmljZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b2tlbiA9IHRoaXMudGFzU2VydmljZS50b2tlbjtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmJ1c2luZXNzUm9sZSA9IHRoaXMuYnVzaW5lc3NSb2xlO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaXNSZXR1cm5pbmdGcm9tUGlwID0gaXNSZXR1cm5pbmdGcm9tUGlwO1xuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5yZXN1bHQudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLCI8YnV0dG9uXG4gICpuZ0lmPVwiaXNWaXNpYmxlXCJcbiAgdHlwZT1cImJ1dHRvblwiXG4gIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRhcy1idG5cIlxuICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuPlxuICA8aSBjbGFzcz1cImZhIGZhLXZpZGVvLWNhbWVyYVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPjwvaT5cbiAgPHNwYW4gKm5nSWY9XCIhaXNMb2FkaW5nXCI+SW5pY2lhciBUQVM8L3NwYW4+XG4gIDxzcGFuICpuZ0lmPVwiaXNMb2FkaW5nXCI+UHJvY2Vzc2luZy4uLjwvc3Bhbj5cbjwvYnV0dG9uPlxuXG4iXX0=
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWJ0bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixlQUFlLEdBQ2hCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7O0FBUWpGLE1BQU0sT0FBTyxrQkFBa0I7SUF3RDdCLFlBQ1UsWUFBc0IsRUFDdEIsVUFBc0I7UUFEdEIsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQXpEaEMseUJBQXlCO1FBQ2hCLGFBQVEsR0FBZ0IsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUd4QyxpQkFBWSxHQUFvQixlQUFlLENBQUMsSUFBSSxDQUFDO1FBSzlELHNCQUFzQjtRQUNiLFlBQU8sR0FBdUIsU0FBUyxDQUFDO1FBQ3hDLGdCQUFXLEdBQVcsYUFBYSxDQUFDO1FBRXRDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFekIscUJBQXFCO1FBQ2QscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLHVCQUFrQixHQUFHLEVB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YSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsU0FBUzt3SEFNVixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JNb2RhbCwgTmdiTW9kYWxSZWYgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFRhc0N1cnJlbnRVc2VyLFxuICBUYXNSb29tVHlwZSxcbiAgVmlld01vZGUsXG4gIFRhc0J1c2luZXNzUm9sZSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUYXNXYWl0aW5nUm9vbUNvbXBvbmVudCB9IGZyb20gJy4uL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFzVmlkZW9jYWxsQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFzLXZpZGVvY2FsbC90YXMtdmlkZW9jYWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXMtYnRuJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhcy1idG4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YXMtYnRuLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhc0J1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLy8gU3RhdHVzIGVuZHBvaW50IHBhcmFtc1xuICBASW5wdXQoKSByb29tVHlwZTogVGFzUm9vbVR5cGUgPSBUYXNSb29tVHlwZS5UQVM7XG4gIEBJbnB1dCgpIGVudGl0eUlkITogbnVtYmVyO1xuICBASW5wdXQoKSB0ZW5hbnQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJ1c2luZXNzUm9sZTogVGFzQnVzaW5lc3NSb2xlID0gVGFzQnVzaW5lc3NSb2xlLlVTRVI7XG5cbiAgLy8gVXNlciBpbmZvIGZvciB0b2tlbiByZXF1ZXN0XG4gIEBJbnB1dCgpIGN1cnJlbnRVc2VyITogVGFzQ3VycmVudFVzZXI7XG5cbiAgLy8gU3R5bGUgY3VzdG9taXphdGlvblxuICBASW5wdXQoKSB2YXJpYW50OiAnZGVmYXVsdCcgfCAndGVhbCcgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIGJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnSW5pY2lhciBUQVMnO1xuXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcblxuICAvLyBTdGF0dXMgY2hlY2sgc3RhdGVcbiAgcHVibGljIGlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgcHVibGljIGlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgcHVibGljIHN0YXR1c0Vycm9yTWVzc2FnZSA9ICcnO1xuICBwdWJsaWMgaXNKb2luYWJsZSA9IGZhbHNlOyAvLyBUcmFja3Mgam9pbmFibGUgZmllbGQgZnJvbSBzdGF0dXMgcmVzcG9uc2VcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgY3VycmVudE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZpZGVvQ2FsbE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXR1c1BvbGxpbmdJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgU1RBVFVTX1BPTExfSU5URVJWQUxfTVMgPSAzMDAwMDsgLy8gMzAgc2Vjb25kc1xuXG4gIC8qKiBXaGV0aGVyIHVzZXIgaXMgYmFja29mZmljZSAob3IgYWRtaW4vbWFuYWdlcikgKi9cbiAgcHVibGljIGdldCBpc0JhY2tvZmZpY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuQkFDS09GRklDRSB8fFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5BRE1JTl9NQU5BR0VSIHx8XG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLk1BTkFHRVJcbiAgICApO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQgKi9cbiAgcHVibGljIGdldCBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGluZyB8fCB0aGlzLmlzU3RhdHVzRXJyb3IgfHwgIXRoaXMuaXNKb2luYWJsZTtcbiAgfVxuXG4gIC8qKiBSZWFzb24gd2h5IHRoZSBidXR0b24gaXMgZGlzYWJsZWQgKGZvciB0b29sdGlwKSAqL1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkUmVhc29uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzU3RhdHVzRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXR1c0Vycm9yTWVzc2FnZSB8fCAnRXJyb3IgYWwgdmVyaWZpY2FyIGVsIGVzdGFkbyc7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0pvaW5hYmxlKSB7XG4gICAgICByZXR1cm4gJ1RvZGF2w61hIG5vIGVzIGVsIGhvcmFyaW8gZGUgbGEgbGxhbWFkYSc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgICBwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFN1YnNjcmliZSB0byB2aWV3TW9kZSB0byBoYW5kbGUgUGlQIHJldHVyblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uudmlld01vZGUkLnN1YnNjcmliZSgobW9kZSkgPT4ge1xuICAgICAgICAvLyBXaGVuIGVudGVyaW5nIFBpUCwgY2xlYXIgdGhlIHZpZGVvQ2FsbE1vZGFsUmVmIHNpbmNlIG1vZGFsIHdpbGwgY2xvc2VcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBTdGFydCBzdGF0dXMgY2hlY2tpbmdcbiAgICB0aGlzLnN0YXJ0U3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHBvbGxpbmcgc3RhdHVzIGV2ZXJ5IDMwIHNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgc3RhcnRTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIC8vIEluaXRpYWwgc3RhdHVzIGNoZWNrXG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuXG4gICAgLy8gU2V0IHVwIHBlcmlvZGljIHBvbGxpbmdcbiAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgICB9LCB0aGlzLlNUQVRVU19QT0xMX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHN0YXR1cyBwb2xsaW5nXG4gICAqL1xuICBwcml2YXRlIHN0b3BTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCk7XG4gICAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyBlbmRwb2ludCB0byBkZXRlcm1pbmUgaWYgYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIC8vIFNraXAgaWYgcmVxdWlyZWQgaW5wdXRzIGFyZSBub3QgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLnRlbmFudCB8fCAhdGhpcy5lbnRpdHlJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IHRydWU7XG4gICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2UuZ2V0UHJveHlWaWRlb1N0YXR1cyh7XG4gICAgICAgIHJvb21UeXBlOiB0aGlzLnJvb21UeXBlLFxuICAgICAgICBlbnRpdHlJZDogdGhpcy5lbnRpdHlJZCxcbiAgICAgICAgdGVuYW50OiB0aGlzLnRlbmFudCxcbiAgICAgICAgYnVzaW5lc3NSb2xlOiB0aGlzLmJ1c2luZXNzUm9sZSxcbiAgICAgIH0pLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgcmVzcG9uc2UgaXMgYWN0dWFsbHkgYW4gZXJyb3IgKHNvbWUgSFRUUCBhZGFwdGVycyByZXR1cm4gZXJyb3JzIGluIG5leHQpXG4gICAgICAgICAgLy8gQWxzbyBjaGVjayBmb3IgdW5kZWZpbmVkL251bGwgb3IgbWlzc2luZyBjb250ZW50XG4gICAgICAgICAgY29uc3QgaXNFcnJvclJlc3BvbnNlID0gIXJlc3BvbnNlIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZXNwb25zZS5jb250ZW50IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/Lm9rID09PSBmYWxzZSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZT8uc3RhdHVzID49IDQwMCB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZT8uZXJyb3IgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZT8ubmFtZSA9PT0gJ0h0dHBFcnJvclJlc3BvbnNlJztcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaXNFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLmlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNTdGF0dXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0Vycm9yTWVzc2FnZSA9IHJlc3BvbnNlPy5lcnJvcj8ubWVzc2FnZSB8fCByZXNwb25zZT8ubWVzc2FnZSB8fCAnRXJyb3IgY2hlY2tpbmcgc3RhdHVzJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0NoZWNraW5nU3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgICAgICAgICAvLyBVcGRhdGUgam9pbmFibGUgc3RhdGUgZnJvbSByZXNwb25zZVxuICAgICAgICAgICAgdGhpcy5pc0pvaW5hYmxlID0gcmVzcG9uc2UuY29udGVudD8uam9pbmFibGUgPz8gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaXNTdGF0dXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCAnRXJyb3IgY2hlY2tpbmcgc3RhdHVzJztcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRlbmFudCB8fCAhdGhpcy5jdXJyZW50VXNlcj8ubmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5lbnRpdHlJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3BlbldhaXRpbmdSb29tTW9kYWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbldhaXRpbmdSb29tTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFRhc1dhaXRpbmdSb29tQ29tcG9uZW50LCB7XG4gICAgICBzaXplOiAnbGcnLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtd2FpdGluZy1yb29tLW1vZGFsJyxcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUGFzcyBhbGwgbmVjZXNzYXJ5IGlucHV0cyB0byB0aGUgd2FpdGluZyByb29tIGNvbXBvbmVudFxuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnJvb21UeXBlID0gdGhpcy5yb29tVHlwZTtcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5lbnRpdHlJZCA9IHRoaXMuZW50aXR5SWQ7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGVuYW50ID0gdGhpcy50ZW5hbnQ7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuYnVzaW5lc3NSb2xlID0gdGhpcy5idXNpbmVzc1JvbGU7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY3VycmVudFVzZXIgPSB0aGlzLmN1cnJlbnRVc2VyO1xuXG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYucmVzdWx0LnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuVmlkZW9DYWxsTW9kYWwoaXNSZXR1cm5pbmdGcm9tUGlwOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihUYXNWaWRlb2NhbGxDb21wb25lbnQsIHtcbiAgICAgIHNpemU6ICd4bCcsXG4gICAgICB3aW5kb3dDbGFzczogJ3Rhcy12aWRlby1tb2RhbCcsXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXG4gICAgICBrZXlib2FyZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnNlc3Npb25JZCA9IHRoaXMudGFzU2VydmljZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b2tlbiA9IHRoaXMudGFzU2VydmljZS50b2tlbjtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmJ1c2luZXNzUm9sZSA9IHRoaXMuYnVzaW5lc3NSb2xlO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaXNSZXR1cm5pbmdGcm9tUGlwID0gaXNSZXR1cm5pbmdGcm9tUGlwO1xuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5yZXN1bHQudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLCI8c3BhblxuICBbbmdiVG9vbHRpcF09XCJpc0Rpc2FibGVkICYmIGRpc2FibGVkUmVhc29uID8gZGlzYWJsZWRSZWFzb24gOiBudWxsXCJcbiAgY29udGFpbmVyPVwiYm9keVwiXG4gIHBsYWNlbWVudD1cInRvcFwiXG4gIHRvb2x0aXBDbGFzcz1cInRhcy1idG4tdG9vbHRpcFwiXG4+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0YXMtYnRuXCJcbiAgICBbY2xhc3MudGFzLWJ0bi0tdGVhbF09XCJ2YXJpYW50ID09PSAndGVhbCdcIlxuICAgIChjbGljayk9XCJvbkNsaWNrKClcIlxuICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgPlxuICAgIDxpIGNsYXNzPVwiZmEgZmEtdmlkZW8tY2FtZXJhXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+PC9pPlxuICAgIDxzcGFuICpuZ0lmPVwiIWlzTG9hZGluZ1wiPnt7IGJ1dHRvbkxhYmVsIH19PC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiaXNMb2FkaW5nXCI+UHJvY2Vzc2luZy4uLjwvc3Bhbj5cbiAgPC9idXR0b24+XG48L3NwYW4+XG4iXX0=
@@ -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) })
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]=\"roomType\"\n [entityId]=\"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]=\"roomType\"\n [entityId]=\"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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ICBPbkRlc3Ryb3ksXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQge1xuICBUYXNBcHBvaW50bWVudCxcbiAgQXBwb2ludG1lbnRTdGF0dXMsXG4gIFRhc1Jvb21UeXBlLFxuICBUYXNCdXNpbmVzc1JvbGUsXG4gIFRhc0N1cnJlbnRVc2VyLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLWluY29taW5nLWFwcG9pbnRtZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNJbmNvbWluZ0FwcG9pbnRtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBQYXNzdGhyb3VnaCBpbnB1dHMgZm9yIHRhcy1idG5cbiAgQElucHV0KCkgcm9vbVR5cGU6IFRhc1Jvb21UeXBlID0gVGFzUm9vbVR5cGUuVEFTO1xuICBASW5wdXQoKSBlbnRpdHlJZCE6IG51bWJlcjtcbiAgQElucHV0KCkgdGVuYW50ITogc3RyaW5nO1xuICBASW5wdXQoKSBidXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZSA9IFRhc0J1c2luZXNzUm9sZS5VU0VSO1xuICBASW5wdXQoKSBjdXJyZW50VXNlciE6IFRhc0N1cnJlbnRVc2VyO1xuXG4gIEBPdXRwdXQoKSBlbnRlckNhbGwgPSBuZXcgRXZlbnRFbWl0dGVyPFRhc0FwcG9pbnRtZW50PigpO1xuXG4gIHB1YmxpYyBhcHBvaW50bWVudDogVGFzQXBwb2ludG1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGlzTG9hZGluZyA9IHRydWU7XG4gIHB1YmxpYyBoYXNFcnJvciA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQXBwb2ludG1lbnRzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEFwcG9pbnRtZW50cygpOiB2b2lkIHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgaW43RGF5cyA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBpbjdEYXlzLnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpICsgNyk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlXG4gICAgICAgIC5nZXRBcHBvaW50bWVudHMoeyBmcm9tRGF0ZTogdGhpcy5mb3JtYXREYXRlKHRvZGF5KSwgdG9EYXRlOiB0aGlzLmZvcm1hdERhdGUoaW43RGF5cykgfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBib3RoIGFycmF5IHJlc3BvbnNlIGFuZCB3cmFwcGVkIHJlc3BvbnNlIChlLmcuLCB7IGNvbnRlbnQ6IFsuLi5dIH0pXG4gICAgICAgICAgICBjb25zdCBhcHBvaW50bWVudHM6IFRhc0FwcG9pbnRtZW50W10gPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlKVxuICAgICAgICAgICAgICA/IHJlc3BvbnNlXG4gICAgICAgICAgICAgIDogcmVzcG9uc2U/LmNvbnRlbnQgfHwgW107XG5cbiAgICAgICAgICAgIC8vIEZpbHRlciBmb3IgY29uZmlybWVkIGFwcG9pbnRtZW50cyBhbmQgZ2V0IHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGFwcG9pbnRtZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAgIChhKSA9PiBhLnN0YXR1cyA9PT0gQXBwb2ludG1lbnRTdGF0dXMuQ09ORklSTUVEXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5hcHBvaW50bWVudCA9IGNvbmZpcm1lZC5sZW5ndGggPiAwID8gY29uZmlybWVkWzBdIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVudGVyQ2FsbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hcHBvaW50bWVudCkge1xuICAgICAgdGhpcy5lbnRlckNhbGwuZW1pdCh0aGlzLmFwcG9pbnRtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGRhdGUgdG8gU3BhbmlzaCBmb3JtYXQ6IFwiTHVuZXMgOCBkZSBkaWNpZW1icmVcIlxuICAgKi9cbiAgcHVibGljIGdldCBmb3JtYXR0ZWREYXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmFwcG9pbnRtZW50KSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSB0aGlzLmFwcG9pbnRtZW50LmRhdGUuc3BsaXQoJy0nKS5tYXAoTnVtYmVyKTtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXkpO1xuXG4gICAgY29uc3QgZGF5TmFtZXMgPSBbXG4gICAgICAnRG9taW5nbycsICdMdW5lcycsICdNYXJ0ZXMnLCAnTWnDqXJjb2xlcycsXG4gICAgICAnSnVldmVzJywgJ1ZpZXJuZXMnLCAnU8OhYmFkbydcbiAgICBdO1xuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSBbXG4gICAgICAnZW5lcm8nLCAnZmVicmVybycsICdtYXJ6bycsICdhYnJpbCcsICdtYXlvJywgJ2p1bmlvJyxcbiAgICAgICdqdWxpbycsICdhZ29zdG8nLCAnc2VwdGllbWJyZScsICdvY3R1YnJlJywgJ25vdmllbWJyZScsICdkaWNpZW1icmUnXG4gICAgXTtcblxuICAgIGNvbnN0IGRheU5hbWUgPSBkYXlOYW1lc1tkYXRlLmdldERheSgpXTtcbiAgICBjb25zdCBkYXlOdW0gPSBkYXRlLmdldERhdGUoKTtcbiAgICBjb25zdCBtb250aE5hbWUgPSBtb250aE5hbWVzW2RhdGUuZ2V0TW9udGgoKV07XG5cbiAgICByZXR1cm4gYCR7ZGF5TmFtZX0gJHtkYXlOdW19IGRlICR7bW9udGhOYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHRpbWUgcmFuZ2U6IFwiOTowMCAtIDk6MzBcIlxuICAgKi9cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRUaW1lUmFuZ2UoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuYXBwb2ludG1lbnQpIHJldHVybiAnJztcbiAgICByZXR1cm4gYCR7dGhpcy5hcHBvaW50bWVudC5zdGFydFRpbWV9IC0gJHt0aGlzLmFwcG9pbnRtZW50LmVuZFRpbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGF0ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaW5jb21pbmctYXBwb2ludG1lbnQtY2FyZFwiPlxuICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlXCI+UHLDs3hpbW8gdHVybm88L2gzPlxuXG4gIDwhLS0gTG9hZGluZyBzdGF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEVtcHR5IHN0YXRlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50IGVtcHR5LXN0YXRlXCIgKm5nSWY9XCIhaXNMb2FkaW5nICYmICFhcHBvaW50bWVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImljb24tY2lyY2xlXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3BhcmtsZSBzcGFya2xlLTFcIj7inKY8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgc3BhcmtsZS0yXCI+4pymPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzcGFya2xlIHNwYXJrbGUtM1wiPuKcpjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3BhcmtsZSBzcGFya2xlLTRcIj7inKY8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGg0IGNsYXNzPVwiZW1wdHktdGl0bGVcIj5Ub2RhdsOtYSBubyB0ZW7DqXMgdHVybm9zIGFnZW5kYWRvczwvaDQ+XG4gICAgPHAgY2xhc3M9XCJlbXB0eS1zdWJ0aXRsZVwiPlxuICAgICAgRW4gY2FzbyBkZSBxdWUgTWVkaWNpbmEgTGFib3JhbCByZXF1aWVyYSB1bmEgY29uc3VsdGEsIGxvIHZlcsOhcyBlbiBlc3RhIHNlY2Npw7NuLlxuICAgIDwvcD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBcHBvaW50bWVudCBzdGF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudCBhcHBvaW50bWVudC1zdGF0ZVwiICpuZ0lmPVwiIWlzTG9hZGluZyAmJiBhcHBvaW50bWVudFwiPlxuICAgIFxuICAgIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXBwb2ludG1lbnQtaGVhZGVyXCI+XG4gICAgICAgIDx0YXMtYXZhdGFyIFtuYW1lXT1cImFwcG9pbnRtZW50LnRpdGxlXCIgW3NpemVdPVwiNDhcIj48L3Rhcy1hdmF0YXI+XG4gICAgICAgIFxuICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3Rvci1uYW1lXCI+e3sgYXBwb2ludG1lbnQudGl0bGUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC1kZXRhaWxzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXRpbWVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGVcIj57eyBmb3JtYXR0ZWREYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGltZVwiPnt7IGZvcm1hdHRlZFRpbWVSYW5nZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0YXMtYnRuXG4gICAgICAgICAgdmFyaWFudD1cInRlYWxcIlxuICAgICAgICAgIGJ1dHRvbkxhYmVsPVwiSW5ncmVzYXJcIlxuICAgICAgICAgIFtyb29tVHlwZV09XCJyb29tVHlwZVwiXG4gICAgICAgICAgW2VudGl0eUlkXT1cImVudGl0eUlkXCJcbiAgICAgICAgICBbdGVuYW50XT1cInRlbmFudFwiXG4gICAgICAgICAgW2J1c2luZXNzUm9sZV09XCJidXNpbmVzc1JvbGVcIlxuICAgICAgICAgIFtjdXJyZW50VXNlcl09XCJjdXJyZW50VXNlclwiXG4gICAgICAgID48L3Rhcy1idG4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==