tas-uell-sdk 0.0.4 → 0.0.6
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 +94 -53
- package/esm2020/lib/components/tas-avatar/tas-avatar.component.mjs +75 -0
- package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +156 -63
- package/esm2020/lib/components/tas-floating-call/tas-floating-call.component.mjs +48 -23
- package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +109 -18
- package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +163 -131
- package/esm2020/lib/config/tas.config.mjs +1 -1
- package/esm2020/lib/interfaces/tas.interfaces.mjs +39 -2
- package/esm2020/lib/services/tas.service.mjs +363 -34
- package/esm2020/lib/tas-uell-sdk.module.mjs +20 -18
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/tas-uell-sdk.mjs +951 -270
- package/fesm2015/tas-uell-sdk.mjs.map +1 -1
- package/fesm2020/tas-uell-sdk.mjs +946 -268
- package/fesm2020/tas-uell-sdk.mjs.map +1 -1
- package/lib/components/tas-avatar/tas-avatar.component.d.ts +9 -0
- package/lib/components/tas-btn/tas-btn.component.d.ts +33 -15
- package/lib/components/tas-floating-call/tas-floating-call.component.d.ts +5 -1
- package/lib/components/tas-videocall/tas-videocall.component.d.ts +23 -2
- package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +30 -26
- package/lib/config/tas.config.d.ts +4 -0
- package/lib/interfaces/tas.interfaces.d.ts +103 -35
- package/lib/services/tas.service.d.ts +86 -9
- package/lib/tas-uell-sdk.module.d.ts +4 -2
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/src/lib/styles/tas-global.scss +27 -28
- package/INSTALL_AND_TEST.md +0 -427
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 `TasHttpClient` interface:
|
|
32
|
+
The library requires an HTTP adapter that implements the `TasHttpClient` interface (which includes `post` and `patch` methods):
|
|
33
33
|
|
|
34
34
|
```typescript
|
|
35
35
|
import { Injectable } from '@angular/core';
|
|
@@ -42,8 +42,14 @@ export class TasHttpAdapterService implements TasHttpClient {
|
|
|
42
42
|
constructor(private http: HttpClient) {}
|
|
43
43
|
|
|
44
44
|
post<T>(url: string, options: { body: any; headers?: Record<string, string> }): Observable<T> {
|
|
45
|
-
return this.http.post<T>(`https://your-api.com/${url}`, options.body, {
|
|
46
|
-
headers: options.headers
|
|
45
|
+
return this.http.post<T>(`https://your-api.com/${url}`, options.body, {
|
|
46
|
+
headers: options.headers,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
patch<T>(url: string, options: { body: any; headers?: Record<string, string> }): Observable<T> {
|
|
51
|
+
return this.http.patch<T>(`https://your-api.com/${url}`, options.body, {
|
|
52
|
+
headers: options.headers,
|
|
47
53
|
});
|
|
48
54
|
}
|
|
49
55
|
}
|
|
@@ -60,22 +66,26 @@ import { TasHttpAdapterService } from './adapters/tas-http-adapter.service';
|
|
|
60
66
|
@NgModule({
|
|
61
67
|
imports: [
|
|
62
68
|
TasUellSdkModule.forRoot({
|
|
63
|
-
config: {
|
|
64
|
-
tokBoxApiKey: 'YOUR_TOKBOX_API_KEY'
|
|
69
|
+
config: {
|
|
70
|
+
tokBoxApiKey: 'YOUR_TOKBOX_API_KEY',
|
|
71
|
+
// apiBaseUrl: 'https://your-api.com/v2', // Optional
|
|
65
72
|
},
|
|
66
|
-
httpClient: TasHttpAdapterService
|
|
67
|
-
})
|
|
68
|
-
]
|
|
73
|
+
httpClient: TasHttpAdapterService,
|
|
74
|
+
}),
|
|
75
|
+
],
|
|
69
76
|
})
|
|
70
|
-
export class AppModule {
|
|
77
|
+
export class AppModule {}
|
|
71
78
|
```
|
|
72
79
|
|
|
73
80
|
### 3. Add Global Styles
|
|
74
81
|
|
|
75
|
-
Add the TAS modal styles to your global `styles.scss
|
|
82
|
+
Add the TAS modal styles to your global `styles.scss`. You can either import the library's global styles or copy the CSS below:
|
|
76
83
|
|
|
77
84
|
```scss
|
|
78
|
-
/*
|
|
85
|
+
/* Option 1: Import from library */
|
|
86
|
+
@import 'tas-uell-sdk/src/lib/styles/tas-global.scss';
|
|
87
|
+
|
|
88
|
+
/* Option 2: Manual styles */
|
|
79
89
|
.tas-video-modal {
|
|
80
90
|
.modal-dialog {
|
|
81
91
|
max-width: 100vw;
|
|
@@ -93,7 +103,6 @@ Add the TAS modal styles to your global `styles.scss`:
|
|
|
93
103
|
}
|
|
94
104
|
}
|
|
95
105
|
|
|
96
|
-
/* TAS Waiting Room Modal */
|
|
97
106
|
.tas-waiting-room-modal {
|
|
98
107
|
.modal-dialog {
|
|
99
108
|
max-width: 480px;
|
|
@@ -122,75 +131,107 @@ Add `<tas-floating-call>` to your root component template (e.g., `app.component.
|
|
|
122
131
|
|
|
123
132
|
## Usage
|
|
124
133
|
|
|
134
|
+
> **Note:** The appointment/room must be pre-created in your backend before using this library.
|
|
135
|
+
|
|
125
136
|
### TAS Button Component
|
|
126
137
|
|
|
127
138
|
Use the `<tas-btn>` component to initiate a video call:
|
|
128
139
|
|
|
129
140
|
```html
|
|
130
141
|
<tas-btn
|
|
131
|
-
[
|
|
132
|
-
[
|
|
133
|
-
[
|
|
142
|
+
[roomType]="'TAS'"
|
|
143
|
+
[entityId]="appointment.entityId"
|
|
144
|
+
[tenant]="tenantId"
|
|
145
|
+
[businessRole]="'BACKOFFICE'"
|
|
134
146
|
[currentUser]="currentUser"
|
|
135
|
-
[ownerUserIds]="[ownerId]"
|
|
136
|
-
[regularUserIds]="regularUserIds"
|
|
137
|
-
[moderatorUserIds]="moderatorUserIds"
|
|
138
147
|
></tas-btn>
|
|
139
148
|
```
|
|
140
149
|
|
|
141
150
|
### Input Properties
|
|
142
151
|
|
|
143
|
-
| Property | Type | Required | Description |
|
|
144
|
-
|
|
145
|
-
| `
|
|
146
|
-
| `
|
|
147
|
-
| `
|
|
148
|
-
| `
|
|
149
|
-
| `
|
|
150
|
-
|
|
151
|
-
|
|
152
|
+
| Property | Type | Required | Default | Description |
|
|
153
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
154
|
+
| `entityId` | `number` | Yes | - | The entity/license ID |
|
|
155
|
+
| `tenant` | `string` | Yes | - | Tenant identifier |
|
|
156
|
+
| `roomType` | `TasRoomType` | No | `'TAS'` | Room type (TAS, JM, WEBINAR, WELLNESS_MANAGER) |
|
|
157
|
+
| `businessRole` | `TasBusinessRole` | No | `'USER'` | Role (ADMIN_MANAGER, MANAGER, BACKOFFICE, USER) |
|
|
158
|
+
| `currentUser` | `TasCurrentUser` | Yes | - | Current user info (name, lastname, role) |
|
|
159
|
+
|
|
160
|
+
### Waiting Room Behavior
|
|
161
|
+
|
|
162
|
+
When clicking the TAS button, a waiting room modal opens:
|
|
163
|
+
|
|
164
|
+
1. **Status Check**: The library calls `/v2/proxy/video/status` to get session info
|
|
165
|
+
2. **Token Acquisition**: Calls `/v2/proxy/video/start` to get the video call token
|
|
166
|
+
|
|
167
|
+
**Owner/Backoffice Users** (`businessRole: 'BACKOFFICE'` or user with `role: 'OWNER'`):
|
|
168
|
+
- Token is obtained immediately after status check
|
|
169
|
+
- Once token is received, the "Join" button appears
|
|
170
|
+
- If `/start` fails, an error screen is shown with a "Retry" button
|
|
171
|
+
|
|
172
|
+
**Non-Owner Users** (regular attendees):
|
|
173
|
+
- See "Medicina laboral te va a admitir en unos instantes..."
|
|
174
|
+
- Wait until the backend marks the session as `joinable: true`
|
|
175
|
+
- Once joinable, the token is obtained and the "Join" button appears
|
|
176
|
+
|
|
177
|
+
### Error Handling
|
|
178
|
+
|
|
179
|
+
The library handles errors gracefully:
|
|
180
|
+
- If `/status` fails: Shows error with retry option
|
|
181
|
+
- If `/start` fails: Shows error message from backend, stops polling, shows retry option
|
|
182
|
+
- Network errors: Displays user-friendly error message
|
|
152
183
|
|
|
153
|
-
|
|
184
|
+
## Interfaces & Enums
|
|
154
185
|
|
|
186
|
+
### TasCurrentUser
|
|
155
187
|
```typescript
|
|
156
188
|
interface TasCurrentUser {
|
|
157
189
|
name: string;
|
|
158
190
|
lastname: string;
|
|
159
|
-
role: TasUserRole;
|
|
191
|
+
role: TasUserRole;
|
|
160
192
|
}
|
|
161
193
|
```
|
|
162
194
|
|
|
163
|
-
|
|
195
|
+
### TasCallConfig
|
|
196
|
+
```typescript
|
|
197
|
+
interface TasCallConfig {
|
|
198
|
+
roomType: TasRoomType;
|
|
199
|
+
entityId: number;
|
|
200
|
+
tenant: string;
|
|
201
|
+
businessRole: TasBusinessRole;
|
|
202
|
+
currentUser: TasCurrentUser;
|
|
203
|
+
}
|
|
204
|
+
```
|
|
164
205
|
|
|
165
|
-
|
|
166
|
-
- `
|
|
167
|
-
- `
|
|
168
|
-
- `
|
|
206
|
+
### Enums
|
|
207
|
+
- **TasUserRole**: `OWNER`, `USER`, `MODERATOR`
|
|
208
|
+
- **TasBusinessRole**: `ADMIN_MANAGER`, `MANAGER`, `BACKOFFICE`, `USER`
|
|
209
|
+
- **TasRoomType**: `TAS`, `JM`, `WEBINAR`, `WELLNESS_MANAGER`
|
|
210
|
+
- **CallState**: `IDLE`, `CONNECTING`, `CONNECTED`, `DISCONNECTED`, `ERROR`
|
|
211
|
+
- **ViewMode**: `FULLSCREEN`, `PIP`
|
|
169
212
|
|
|
170
213
|
## Exported Services
|
|
171
214
|
|
|
172
|
-
|
|
215
|
+
### TasService
|
|
216
|
+
Core service for managing video sessions and state.
|
|
173
217
|
|
|
174
|
-
|
|
218
|
+
**Public API:**
|
|
219
|
+
- `callState$: Observable<CallState>` - Current connection status
|
|
220
|
+
- `viewMode$: Observable<ViewMode>` - Current view mode
|
|
221
|
+
- `isMuted$: Observable<boolean>` - Local audio mute state
|
|
222
|
+
- `joinable$: Observable<boolean>` - Whether the call is joinable
|
|
223
|
+
- `ownerHasJoined$: Observable<boolean>` - Whether an owner has joined
|
|
224
|
+
- `toggleMute()` - Toggles local audio
|
|
225
|
+
- `disconnectSession()` - Ends the current session
|
|
226
|
+
- `getProxyVideoStatus(params)` - Gets session status
|
|
175
227
|
|
|
176
|
-
|
|
177
|
-
- `TasHttpClient`
|
|
178
|
-
- `TasCurrentUser`
|
|
179
|
-
- `CreateRoomRequest`
|
|
180
|
-
- `CreateRoomResponse`
|
|
181
|
-
- `GenerateTokenRequest`
|
|
182
|
-
- `GenerateTokenResponse`
|
|
183
|
-
- `TasRoomType`
|
|
184
|
-
- `TasSessionType`
|
|
185
|
-
- `TasUserRole`
|
|
186
|
-
- `CallState`
|
|
187
|
-
- `ViewMode`
|
|
188
|
-
|
|
189
|
-
## Building the Library
|
|
228
|
+
## Exported Components
|
|
190
229
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
230
|
+
- `TasButtonComponent` - `<tas-btn>`
|
|
231
|
+
- `TasVideocallComponent` - Full-screen video call interface
|
|
232
|
+
- `TasWaitingRoomComponent` - Pre-call waiting room
|
|
233
|
+
- `TasFloatingCallComponent` - `<tas-floating-call>`
|
|
234
|
+
- `TasAvatarComponent` - `<tas-avatar>`
|
|
194
235
|
|
|
195
236
|
## License
|
|
196
237
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class TasAvatarComponent {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.name = '';
|
|
6
|
+
this.size = 80;
|
|
7
|
+
}
|
|
8
|
+
get initials() {
|
|
9
|
+
if (!this.name)
|
|
10
|
+
return '';
|
|
11
|
+
return this.name
|
|
12
|
+
.split(' ')
|
|
13
|
+
.filter((n) => n.length > 0)
|
|
14
|
+
.map((n) => n[0])
|
|
15
|
+
.join('')
|
|
16
|
+
.toUpperCase()
|
|
17
|
+
.substring(0, 2);
|
|
18
|
+
}
|
|
19
|
+
get fontSize() {
|
|
20
|
+
return Math.round(this.size * 0.4);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
TasAvatarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
24
|
+
TasAvatarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasAvatarComponent, selector: "tas-avatar", inputs: { name: "name", size: "size" }, ngImport: i0, template: `
|
|
25
|
+
<div
|
|
26
|
+
class="avatar"
|
|
27
|
+
[style.width.px]="size"
|
|
28
|
+
[style.height.px]="size"
|
|
29
|
+
[style.fontSize.px]="fontSize"
|
|
30
|
+
>
|
|
31
|
+
<span class="initials">{{ initials }}</span>
|
|
32
|
+
</div>
|
|
33
|
+
`, isInline: true, styles: [".avatar{display:flex;align-items:center;justify-content:center;border-radius:50%;background-color:#fff;color:#0072ac;font-weight:600;font-family:inherit;box-shadow:0 4px 12px #00000026}.initials{text-transform:uppercase;-webkit-user-select:none;user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
34
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasAvatarComponent, decorators: [{
|
|
35
|
+
type: Component,
|
|
36
|
+
args: [{
|
|
37
|
+
selector: 'tas-avatar',
|
|
38
|
+
template: `
|
|
39
|
+
<div
|
|
40
|
+
class="avatar"
|
|
41
|
+
[style.width.px]="size"
|
|
42
|
+
[style.height.px]="size"
|
|
43
|
+
[style.fontSize.px]="fontSize"
|
|
44
|
+
>
|
|
45
|
+
<span class="initials">{{ initials }}</span>
|
|
46
|
+
</div>
|
|
47
|
+
`,
|
|
48
|
+
styles: [
|
|
49
|
+
`
|
|
50
|
+
.avatar {
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
justify-content: center;
|
|
54
|
+
border-radius: 50%;
|
|
55
|
+
background-color: #ffffff;
|
|
56
|
+
color: #0072ac;
|
|
57
|
+
font-weight: 600;
|
|
58
|
+
font-family: inherit;
|
|
59
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.initials {
|
|
63
|
+
text-transform: uppercase;
|
|
64
|
+
user-select: none;
|
|
65
|
+
}
|
|
66
|
+
`,
|
|
67
|
+
],
|
|
68
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
69
|
+
}]
|
|
70
|
+
}], propDecorators: { name: [{
|
|
71
|
+
type: Input
|
|
72
|
+
}], size: [{
|
|
73
|
+
type: Input
|
|
74
|
+
}] } });
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWF2YXRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1hdmF0YXIvdGFzLWF2YXRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBb0MxRSxNQUFNLE9BQU8sa0JBQWtCO0lBbEMvQjtRQW1DVyxTQUFJLEdBQVcsRUFBRSxDQUFDO1FBQ2xCLFNBQUksR0FBVyxFQUFFLENBQUM7S0FnQjVCO0lBZEMsSUFBSSxRQUFRO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNiLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUM7YUFDUixXQUFXLEVBQUU7YUFDYixTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDOztnSEFqQlUsa0JBQWtCO29HQUFsQixrQkFBa0IsMEZBaENuQjs7Ozs7Ozs7O0dBU1Q7NEZBdUJVLGtCQUFrQjtrQkFsQzlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFFBQVEsRUFBRTs7Ozs7Ozs7O0dBU1Q7b0JBQ0QsTUFBTSxFQUFFO3dCQUNOOzs7Ozs7Ozs7Ozs7Ozs7OztLQWlCQztxQkFDRjtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7OEJBRVUsSUFBSTtzQkFBWixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Rhcy1hdmF0YXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiYXZhdGFyXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzaXplXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2l6ZVwiXG4gICAgICBbc3R5bGUuZm9udFNpemUucHhdPVwiZm9udFNpemVcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaW5pdGlhbHNcIj57eyBpbml0aWFscyB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmF2YXRhciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XG4gICAgICAgIGNvbG9yOiAjMDA3MmFjO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAgICAgfVxuXG4gICAgICAuaW5pdGlhbHMge1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFzQXZhdGFyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgbmFtZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNpemU6IG51bWJlciA9IDgwO1xuXG4gIGdldCBpbml0aWFscygpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5uYW1lKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHRoaXMubmFtZVxuICAgICAgLnNwbGl0KCcgJylcbiAgICAgIC5maWx0ZXIoKG4pID0+IG4ubGVuZ3RoID4gMClcbiAgICAgIC5tYXAoKG4pID0+IG5bMF0pXG4gICAgICAuam9pbignJylcbiAgICAgIC50b1VwcGVyQ2FzZSgpXG4gICAgICAuc3Vic3RyaW5nKDAsIDIpO1xuICB9XG5cbiAgZ2V0IGZvbnRTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5zaXplICogMC40KTtcbiAgfVxufVxuIl19
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Component, Input } from
|
|
2
|
-
import { Subscription } from
|
|
3
|
-
import { ViewMode } from
|
|
4
|
-
import { TasWaitingRoomComponent } from
|
|
5
|
-
import { TasVideocallComponent } from
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { Subscription } from 'rxjs';
|
|
3
|
+
import { TasRoomType, ViewMode, TasBusinessRole, } from '../../interfaces/tas.interfaces';
|
|
4
|
+
import { TasWaitingRoomComponent } from '../tas-waiting-room/tas-waiting-room.component';
|
|
5
|
+
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";
|
|
@@ -11,107 +11,200 @@ export class TasButtonComponent {
|
|
|
11
11
|
constructor(modalService, tasService) {
|
|
12
12
|
this.modalService = modalService;
|
|
13
13
|
this.tasService = tasService;
|
|
14
|
-
|
|
15
|
-
this.
|
|
16
|
-
this.
|
|
17
|
-
this.regularUserIds = [];
|
|
18
|
-
this.moderatorUserIds = [];
|
|
19
|
-
/** Optional: If provided, skips room creation and goes directly to getting a token */
|
|
20
|
-
this.existingSessionId = "";
|
|
21
|
-
/** Optional: Custom button text */
|
|
22
|
-
this.buttonText = "Iniciar TAS";
|
|
14
|
+
// Status endpoint params
|
|
15
|
+
this.roomType = TasRoomType.TAS;
|
|
16
|
+
this.businessRole = TasBusinessRole.USER;
|
|
23
17
|
this.isLoading = false;
|
|
18
|
+
this.buttonText = 'Iniciar TAS';
|
|
19
|
+
// Status check state
|
|
20
|
+
this.isCheckingStatus = false;
|
|
21
|
+
this.isStatusError = false;
|
|
22
|
+
this.statusErrorMessage = '';
|
|
24
23
|
this.subscriptions = new Subscription();
|
|
25
24
|
this.currentModalRef = null;
|
|
26
25
|
this.videoCallModalRef = null;
|
|
26
|
+
this.statusPollingInterval = null;
|
|
27
|
+
this.STATUS_POLL_INTERVAL_MS = 30000; // 30 seconds
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
/** Whether user is backoffice (or admin/manager) */
|
|
30
|
+
get isBackoffice() {
|
|
31
|
+
return (this.businessRole === TasBusinessRole.BACKOFFICE ||
|
|
32
|
+
this.businessRole === TasBusinessRole.ADMIN_MANAGER ||
|
|
33
|
+
this.businessRole === TasBusinessRole.MANAGER);
|
|
34
|
+
}
|
|
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;
|
|
31
41
|
}
|
|
42
|
+
return !this.isStatusError;
|
|
43
|
+
}
|
|
44
|
+
/** Whether the button should be disabled */
|
|
45
|
+
get isDisabled() {
|
|
46
|
+
return this.isLoading || this.isCheckingStatus || this.isStatusError;
|
|
47
|
+
}
|
|
48
|
+
ngOnInit() {
|
|
32
49
|
// Subscribe to viewMode to handle PiP return
|
|
33
|
-
this.subscriptions.add(this.tasService.viewMode$.subscribe(mode => {
|
|
34
|
-
// Reopen video call modal when returning from PiP
|
|
35
|
-
if (mode === ViewMode.FULLSCREEN &&
|
|
36
|
-
this.tasService.isCallActive() &&
|
|
37
|
-
!this.videoCallModalRef) {
|
|
38
|
-
const sessionId = this.tasService.sessionId;
|
|
39
|
-
const token = this.tasService.token;
|
|
40
|
-
if (sessionId && token) {
|
|
41
|
-
this.openVideoCallModal(true);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
50
|
+
this.subscriptions.add(this.tasService.viewMode$.subscribe((mode) => {
|
|
44
51
|
// When entering PiP, clear the videoCallModalRef since modal will close
|
|
45
52
|
if (mode === ViewMode.PIP) {
|
|
46
53
|
this.videoCallModalRef = null;
|
|
47
54
|
}
|
|
48
55
|
}));
|
|
56
|
+
// Start status checking
|
|
57
|
+
this.startStatusPolling();
|
|
49
58
|
}
|
|
50
59
|
ngOnDestroy() {
|
|
51
60
|
this.subscriptions.unsubscribe();
|
|
61
|
+
this.stopStatusPolling();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Start polling status every 30 seconds
|
|
65
|
+
*/
|
|
66
|
+
startStatusPolling() {
|
|
67
|
+
// Initial status check
|
|
68
|
+
this.checkStatus();
|
|
69
|
+
// Set up periodic polling
|
|
70
|
+
this.statusPollingInterval = setInterval(() => {
|
|
71
|
+
this.checkStatus();
|
|
72
|
+
}, this.STATUS_POLL_INTERVAL_MS);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Stop status polling
|
|
76
|
+
*/
|
|
77
|
+
stopStatusPolling() {
|
|
78
|
+
if (this.statusPollingInterval) {
|
|
79
|
+
clearInterval(this.statusPollingInterval);
|
|
80
|
+
this.statusPollingInterval = null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check status endpoint to determine if button should be enabled
|
|
85
|
+
*/
|
|
86
|
+
checkStatus() {
|
|
87
|
+
// Skip if required inputs are not available
|
|
88
|
+
if (!this.tenant || !this.entityId) {
|
|
89
|
+
console.log('[TAS DEBUG] checkStatus skipped - missing required inputs');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
this.isCheckingStatus = true;
|
|
93
|
+
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
|
+
this.subscriptions.add(this.tasService.getProxyVideoStatus({
|
|
101
|
+
roomType: this.roomType,
|
|
102
|
+
entityId: this.entityId,
|
|
103
|
+
tenant: this.tenant,
|
|
104
|
+
businessRole: this.businessRole,
|
|
105
|
+
}).subscribe({
|
|
106
|
+
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
|
+
}
|
|
127
|
+
},
|
|
128
|
+
error: (err) => {
|
|
129
|
+
console.error('[TAS DEBUG] Status check failed:', err);
|
|
130
|
+
this.isCheckingStatus = false;
|
|
131
|
+
this.isStatusError = true;
|
|
132
|
+
this.statusErrorMessage = err?.error?.message || err?.message || 'Error checking status';
|
|
133
|
+
},
|
|
134
|
+
}));
|
|
52
135
|
}
|
|
53
136
|
onClick() {
|
|
54
|
-
|
|
55
|
-
|
|
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
|
+
if (!this.tenant || !this.currentUser?.name) {
|
|
146
|
+
console.error('[TAS DEBUG] Tenant or current user not available');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (!this.entityId) {
|
|
150
|
+
console.error('[TAS DEBUG] entityId is required');
|
|
56
151
|
return;
|
|
57
152
|
}
|
|
153
|
+
console.log('[TAS DEBUG] Validation passed, opening waiting room modal');
|
|
58
154
|
this.openWaitingRoomModal();
|
|
59
155
|
}
|
|
60
156
|
openWaitingRoomModal() {
|
|
61
157
|
this.currentModalRef = this.modalService.open(TasWaitingRoomComponent, {
|
|
62
|
-
size:
|
|
63
|
-
windowClass:
|
|
64
|
-
backdrop:
|
|
158
|
+
size: 'lg',
|
|
159
|
+
windowClass: 'tas-waiting-room-modal',
|
|
160
|
+
backdrop: 'static',
|
|
65
161
|
keyboard: false,
|
|
66
|
-
centered: true
|
|
162
|
+
centered: true,
|
|
67
163
|
});
|
|
68
164
|
// Pass all necessary inputs to the waiting room component
|
|
69
|
-
this.currentModalRef.componentInstance.
|
|
70
|
-
this.currentModalRef.componentInstance.
|
|
71
|
-
this.currentModalRef.componentInstance.
|
|
165
|
+
this.currentModalRef.componentInstance.roomType = this.roomType;
|
|
166
|
+
this.currentModalRef.componentInstance.entityId = this.entityId;
|
|
167
|
+
this.currentModalRef.componentInstance.tenant = this.tenant;
|
|
168
|
+
this.currentModalRef.componentInstance.businessRole = this.businessRole;
|
|
72
169
|
this.currentModalRef.componentInstance.currentUser = this.currentUser;
|
|
73
|
-
this.currentModalRef.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
this.currentModalRef.result.then(() => { this.currentModalRef = null; }, () => { this.currentModalRef = null; });
|
|
170
|
+
this.currentModalRef.result.then(() => {
|
|
171
|
+
this.currentModalRef = null;
|
|
172
|
+
}, () => {
|
|
173
|
+
this.currentModalRef = null;
|
|
174
|
+
});
|
|
79
175
|
}
|
|
80
176
|
openVideoCallModal(isReturningFromPip = false) {
|
|
81
177
|
this.videoCallModalRef = this.modalService.open(TasVideocallComponent, {
|
|
82
178
|
size: 'xl',
|
|
83
179
|
windowClass: 'tas-video-modal',
|
|
84
180
|
backdrop: 'static',
|
|
85
|
-
keyboard: false
|
|
181
|
+
keyboard: false,
|
|
86
182
|
});
|
|
87
183
|
this.videoCallModalRef.componentInstance.sessionId = this.tasService.sessionId;
|
|
88
184
|
this.videoCallModalRef.componentInstance.token = this.tasService.token;
|
|
185
|
+
this.videoCallModalRef.componentInstance.businessRole = this.businessRole;
|
|
89
186
|
this.videoCallModalRef.componentInstance.isReturningFromPip = isReturningFromPip;
|
|
90
|
-
this.videoCallModalRef.result.then(() => {
|
|
187
|
+
this.videoCallModalRef.result.then(() => {
|
|
188
|
+
this.videoCallModalRef = null;
|
|
189
|
+
}, () => {
|
|
190
|
+
this.videoCallModalRef = null;
|
|
191
|
+
});
|
|
91
192
|
}
|
|
92
193
|
}
|
|
93
|
-
TasButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.
|
|
94
|
-
TasButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.
|
|
95
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.
|
|
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"] }] });
|
|
196
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasButtonComponent, decorators: [{
|
|
96
197
|
type: Component,
|
|
97
|
-
args: [{ selector:
|
|
98
|
-
}], ctorParameters: function () { return [{ type: i1.NgbModal }, { type: i2.TasService }]; }, propDecorators: {
|
|
99
|
-
type: Input
|
|
100
|
-
}], product: [{
|
|
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: [{
|
|
101
200
|
type: Input
|
|
102
|
-
}],
|
|
103
|
-
type: Input
|
|
104
|
-
}], currentUser: [{
|
|
201
|
+
}], entityId: [{
|
|
105
202
|
type: Input
|
|
106
|
-
}],
|
|
203
|
+
}], tenant: [{
|
|
107
204
|
type: Input
|
|
108
|
-
}],
|
|
205
|
+
}], businessRole: [{
|
|
109
206
|
type: Input
|
|
110
|
-
}],
|
|
111
|
-
type: Input
|
|
112
|
-
}], existingSessionId: [{
|
|
113
|
-
type: Input
|
|
114
|
-
}], buttonText: [{
|
|
207
|
+
}], currentUser: [{
|
|
115
208
|
type: Input
|
|
116
209
|
}] } });
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWJ0bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQWtCLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7OztBQVFqRixNQUFNLE9BQU8sa0JBQWtCO0lBcUI5QixZQUNTLFlBQXNCLEVBQ3RCLFVBQXNCO1FBRHRCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQVk7UUF0QnRCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQzFCLFlBQU8sR0FBVyxNQUFNLENBQUM7UUFDekIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUd0QixtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUM5QixxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFFekMsc0ZBQXNGO1FBQzdFLHNCQUFpQixHQUFXLEVBQUUsQ0FBQztRQUV4QyxtQ0FBbUM7UUFDMUIsZUFBVSxHQUFXLGFBQWEsQ0FBQztRQUVyQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuQyxvQkFB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QUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTmdiTW9kYWwsIE5nYk1vZGFsUmVmIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgVGFzQ3VycmVudFVzZXIsIFZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvdGFzLmludGVyZmFjZXNcIjtcbmltcG9ydCB7IFRhc1dhaXRpbmdSb29tQ29tcG9uZW50IH0gZnJvbSBcIi4uL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRhc1ZpZGVvY2FsbENvbXBvbmVudCB9IGZyb20gXCIuLi90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3Rhcy5zZXJ2aWNlXCI7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJ0YXMtYnRuXCIsXG5cdHRlbXBsYXRlVXJsOiBcIi4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbFwiLFxuXHRzdHlsZVVybHM6IFtcIi4vdGFzLWJ0bi5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFzQnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXHRASW5wdXQoKSBhcHBvaW50bWVudElkOiBudW1iZXIgPSAxO1xuXHRASW5wdXQoKSBwcm9kdWN0OiBzdHJpbmcgPSBcInVlbGxcIjtcblx0QElucHV0KCkgdGVuYW50SWQ6IHN0cmluZyA9IFwiXCI7XG5cdEBJbnB1dCgpIGN1cnJlbnRVc2VyITogVGFzQ3VycmVudFVzZXI7XG5cdEBJbnB1dCgpIG93bmVyVXNlcklkcyE6IG51bWJlcltdO1xuXHRASW5wdXQoKSByZWd1bGFyVXNlcklkczogbnVtYmVyW10gPSBbXTtcblx0QElucHV0KCkgbW9kZXJhdG9yVXNlcklkczogbnVtYmVyW10gPSBbXTtcblx0XG5cdC8qKiBPcHRpb25hbDogSWYgcHJvdmlkZWQsIHNraXBzIHJvb20gY3JlYXRpb24gYW5kIGdvZXMgZGlyZWN0bHkgdG8gZ2V0dGluZyBhIHRva2VuICovXG5cdEBJbnB1dCgpIGV4aXN0aW5nU2Vzc2lvbklkOiBzdHJpbmcgPSBcIlwiO1xuXHRcblx0LyoqIE9wdGlvbmFsOiBDdXN0b20gYnV0dG9uIHRleHQgKi9cblx0QElucHV0KCkgYnV0dG9uVGV4dDogc3RyaW5nID0gXCJJbmljaWFyIFRBU1wiO1xuXHRcblx0cHVibGljIGlzTG9hZGluZyA9IGZhbHNlO1xuXHRcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXHRwcml2YXRlIGN1cnJlbnRNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSB2aWRlb0NhbGxNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG5cdFx0cHJpdmF0ZSB0YXNTZXJ2aWNlOiBUYXNTZXJ2aWNlXG5cdCkge31cblxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMub3duZXJVc2VySWRzIHx8IHRoaXMub3duZXJVc2VySWRzLmxlbmd0aCAhPT0gMSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCd0YXMtYnRuOiBvd25lclVzZXJJZHMgaW5wdXQgaXMgcmVxdWlyZWQgYW5kIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSB1c2VyJyk7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIFN1YnNjcmliZSB0byB2aWV3TW9kZSB0byBoYW5kbGUgUGlQIHJldHVyblxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG5cdFx0XHR0aGlzLnRhc1NlcnZpY2Uudmlld01vZGUkLnN1YnNjcmliZShtb2RlID0+IHtcblx0XHRcdFx0Ly8gUmVvcGVuIHZpZGVvIGNhbGwgbW9kYWwgd2hlbiByZXR1cm5pbmcgZnJvbSBQaVBcblx0XHRcdFx0aWYgKG1vZGUgPT09IFZpZXdNb2RlLkZVTExTQ1JFRU4gJiYgXG5cdFx0XHRcdFx0dGhpcy50YXNTZXJ2aWNlLmlzQ2FsbEFjdGl2ZSgpICYmIFxuXHRcdFx0XHRcdCF0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2Vzc2lvbklkID0gdGhpcy50YXNTZXJ2aWNlLnNlc3Npb25JZDtcblx0XHRcdFx0XHRjb25zdCB0b2tlbiA9IHRoaXMudGFzU2VydmljZS50b2tlbjtcblx0XHRcdFx0XHRpZiAoc2Vzc2lvbklkICYmIHRva2VuKSB7XG5cdFx0XHRcdFx0XHR0aGlzLm9wZW5WaWRlb0NhbGxNb2RhbCh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0XG5cdFx0XHRcdC8vIFdoZW4gZW50ZXJpbmcgUGlQLCBjbGVhciB0aGUgdmlkZW9DYWxsTW9kYWxSZWYgc2luY2UgbW9kYWwgd2lsbCBjbG9zZVxuXHRcdFx0XHRpZiAobW9kZSA9PT0gVmlld01vZGUuUElQKSB7XG5cdFx0XHRcdFx0dGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuXHR9XG5cblx0b25DbGljaygpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMudGVuYW50SWQgfHwgIXRoaXMuY3VycmVudFVzZXI/Lm5hbWUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJUZW5hbnQgSUQgb3IgY3VycmVudCB1c2VyIG5vdCBhdmFpbGFibGVcIik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5vcGVuV2FpdGluZ1Jvb21Nb2RhbCgpO1xuXHR9XG5cblx0cHJpdmF0ZSBvcGVuV2FpdGluZ1Jvb21Nb2RhbCgpOiB2b2lkIHtcblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVGFzV2FpdGluZ1Jvb21Db21wb25lbnQsIHtcblx0XHRcdHNpemU6IFwibGdcIixcblx0XHRcdHdpbmRvd0NsYXNzOiBcInRhcy13YWl0aW5nLXJvb20tbW9kYWxcIixcblx0XHRcdGJhY2tkcm9wOiBcInN0YXRpY1wiLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0Y2VudGVyZWQ6IHRydWVcblx0XHR9KTtcblxuXHRcdC8vIFBhc3MgYWxsIG5lY2Vzc2FyeSBpbnB1dHMgdG8gdGhlIHdhaXRpbmcgcm9vbSBjb21wb25lbnRcblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5hcHBvaW50bWVudElkID0gdGhpcy5hcHBvaW50bWVudElkO1xuXHRcdHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnByb2R1Y3QgPSB0aGlzLnByb2R1Y3Q7XG5cdFx0dGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGVuYW50SWQgPSB0aGlzLnRlbmFudElkO1xuXHRcdHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmN1cnJlbnRVc2VyID0gdGhpcy5jdXJyZW50VXNlcjtcblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5vd25lclVzZXJJZHMgPSB0aGlzLm93bmVyVXNlcklkcztcblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5yZWd1bGFyVXNlcklkcyA9IHRoaXMucmVndWxhclVzZXJJZHM7XG5cdFx0dGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubW9kZXJhdG9yVXNlcklkcyA9IHRoaXMubW9kZXJhdG9yVXNlcklkcztcblx0XHRcblx0XHQvLyBQYXNzIGV4aXN0aW5nIHNlc3Npb24gSUQgaWYgcHJvdmlkZWRcblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5leGlzdGluZ1Nlc3Npb25JZCA9IHRoaXMuZXhpc3RpbmdTZXNzaW9uSWQ7XG5cblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZi5yZXN1bHQudGhlbihcblx0XHRcdCgpID0+IHsgdGhpcy5jdXJyZW50TW9kYWxSZWYgPSBudWxsOyB9LFxuXHRcdFx0KCkgPT4geyB0aGlzLmN1cnJlbnRNb2RhbFJlZiA9IG51bGw7IH1cblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBvcGVuVmlkZW9DYWxsTW9kYWwoaXNSZXR1cm5pbmdGcm9tUGlwOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcblx0XHR0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihUYXNWaWRlb2NhbGxDb21wb25lbnQsIHtcblx0XHRcdHNpemU6ICd4bCcsXG5cdFx0XHR3aW5kb3dDbGFzczogJ3Rhcy12aWRlby1tb2RhbCcsXG5cdFx0XHRiYWNrZHJvcDogJ3N0YXRpYycsXG5cdFx0XHRrZXlib2FyZDogZmFsc2Vcblx0XHR9KTtcblxuXHRcdHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uuc2Vzc2lvbklkID0gdGhpcy50YXNTZXJ2aWNlLnNlc3Npb25JZDtcblx0XHR0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRva2VuID0gdGhpcy50YXNTZXJ2aWNlLnRva2VuO1xuXHRcdHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaXNSZXR1cm5pbmdGcm9tUGlwID0gaXNSZXR1cm5pbmdGcm9tUGlwO1xuXG5cdFx0dGhpcy52aWRlb0NhbGxNb2RhbFJlZi5yZXN1bHQudGhlbihcblx0XHRcdCgpID0+IHsgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7IH0sXG5cdFx0XHQoKSA9PiB7IHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsOyB9XG5cdFx0KTtcblx0fVxufVxuIiwiPGJ1dHRvblxuXHR0eXBlPVwiYnV0dG9uXCJcblx0Y2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGFzLWJ0blwiXG5cdChjbGljayk9XCJvbkNsaWNrKClcIlxuXHRbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbj5cblx0PGkgY2xhc3M9XCJmYSBmYS12aWRlby1jYW1lcmFcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAqbmdJZj1cIiFpc0xvYWRpbmdcIj48L2k+XG5cdDxzcGFuICpuZ0lmPVwiIWlzTG9hZGluZ1wiPiB7eyBidXR0b25UZXh0IH19PC9zcGFuPlxuXHQ8c3BhbiAqbmdJZj1cImlzTG9hZGluZ1wiPiBQcm9jZXNzaW5nLi4uPC9zcGFuPlxuPC9idXR0b24+XG4iXX0=
|
|
210
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWJ0bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixlQUFlLEdBQ2hCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7O0FBUWpGLE1BQU0sT0FBTyxrQkFBa0I7SUFnRDdCLFlBQ1UsWUFBc0IsRUFDdEIsVUFBc0I7UUFEdEIsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWpEaEMseUJBQXlCO1FBQ2hCLGFBQVEsR0FBZ0IsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUd4QyxpQkFBWSxHQUFvQixlQUFlLENBQUMsSUFBSSxDQUFDO1FBS3ZELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDVCxlQUFVLEdBQUcsYUFBYSxDQUFDO1FBRTNDLHFCQUFxQjtRQUNkLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0Qix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFdkIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxD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QUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQy9FLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDdkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUVqRixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDaEMsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDLEVBQ0QsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7O2dIQWxPVSxrQkFBa0I7b0dBQWxCLGtCQUFrQixtTENsQi9CLHFWQVlBOzRGRE1hLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxTQUFTO3dIQU1WLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYk1vZGFsLCBOZ2JNb2RhbFJlZiB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgVGFzQ3VycmVudFVzZXIsXG4gIFRhc1Jvb21UeXBlLFxuICBWaWV3TW9kZSxcbiAgVGFzQnVzaW5lc3NSb2xlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRhc1dhaXRpbmdSb29tQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFzLXdhaXRpbmctcm9vbS90YXMtd2FpdGluZy1yb29tLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNWaWRlb2NhbGxDb21wb25lbnQgfSBmcm9tICcuLi90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50JztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Rhcy1idG4nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Rhcy1idG4uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFzQnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBTdGF0dXMgZW5kcG9pbnQgcGFyYW1zXG4gIEBJbnB1dCgpIHJvb21UeXBlOiBUYXNSb29tVHlwZSA9IFRhc1Jvb21UeXBlLlRBUztcbiAgQElucHV0KCkgZW50aXR5SWQhOiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlbmFudCE6IHN0cmluZztcbiAgQElucHV0KCkgYnVzaW5lc3NSb2xlOiBUYXNCdXNpbmVzc1JvbGUgPSBUYXNCdXNpbmVzc1JvbGUuVVNFUjtcblxuICAvLyBVc2VyIGluZm8gZm9yIHRva2VuIHJlcXVlc3RcbiAgQElucHV0KCkgY3VycmVudFVzZXIhOiBUYXNDdXJyZW50VXNlcjtcblxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XG4gIHB1YmxpYyByZWFkb25seSBidXR0b25UZXh0ID0gJ0luaWNpYXIgVEFTJztcblxuICAvLyBTdGF0dXMgY2hlY2sgc3RhdGVcbiAgcHVibGljIGlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgcHVibGljIGlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgcHVibGljIHN0YXR1c0Vycm9yTWVzc2FnZSA9ICcnO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBjdXJyZW50TW9kYWxSZWY6IE5nYk1vZGFsUmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdmlkZW9DYWxsTW9kYWxSZWY6IE5nYk1vZGFsUmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzUG9sbGluZ0ludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBTVEFUVVNfUE9MTF9JTlRFUlZBTF9NUyA9IDMwMDAwOyAvLyAzMCBzZWNvbmRzXG5cbiAgLyoqIFdoZXRoZXIgdXNlciBpcyBiYWNrb2ZmaWNlIChvciBhZG1pbi9tYW5hZ2VyKSAqL1xuICBwdWJsaWMgZ2V0IGlzQmFja29mZmljZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5CQUNLT0ZGSUNFIHx8XG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLkFETUlOX01BTkFHRVIgfHxcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuTUFOQUdFUlxuICAgICk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgYnV0dG9uIHNob3VsZCBiZSB2aXNpYmxlICovXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIC8vIEJhY2tvZmZpY2U6IGFsd2F5cyBzaG93IChkaXNhYmxlZCBpZiBlcnJvcilcbiAgICAvLyBPdGhlciByb2xlczogaGlkZSBpZiBzdGF0dXMgZXJyb3JcbiAgICBpZiAodGhpcy5pc0JhY2tvZmZpY2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuaXNTdGF0dXNFcnJvcjtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkICovXG4gIHB1YmxpYyBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgfHwgdGhpcy5pc0NoZWNraW5nU3RhdHVzIHx8IHRoaXMuaXNTdGF0dXNFcnJvcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgICBwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFN1YnNjcmliZSB0byB2aWV3TW9kZSB0byBoYW5kbGUgUGlQIHJldHVyblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uudmlld01vZGUkLnN1YnNjcmliZSgobW9kZSkgPT4ge1xuICAgICAgICAvLyBXaGVuIGVudGVyaW5nIFBpUCwgY2xlYXIgdGhlIHZpZGVvQ2FsbE1vZGFsUmVmIHNpbmNlIG1vZGFsIHdpbGwgY2xvc2VcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBTdGFydCBzdGF0dXMgY2hlY2tpbmdcbiAgICB0aGlzLnN0YXJ0U3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHBvbGxpbmcgc3RhdHVzIGV2ZXJ5IDMwIHNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgc3RhcnRTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIC8vIEluaXRpYWwgc3RhdHVzIGNoZWNrXG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuXG4gICAgLy8gU2V0IHVwIHBlcmlvZGljIHBvbGxpbmdcbiAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgICB9LCB0aGlzLlNUQVRVU19QT0xMX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHN0YXR1cyBwb2xsaW5nXG4gICAqL1xuICBwcml2YXRlIHN0b3BTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCk7XG4gICAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyBlbmRwb2ludCB0byBkZXRlcm1pbmUgaWYgYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIC8vIFNraXAgaWYgcmVxdWlyZWQgaW5wdXRzIGFyZSBub3QgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLnRlbmFudCB8fCAhdGhpcy5lbnRpdHlJZCkge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIGNoZWNrU3RhdHVzIHNraXBwZWQgLSBtaXNzaW5nIHJlcXVpcmVkIGlucHV0cycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IHRydWU7XG4gICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBjaGVja1N0YXR1cyBjYWxsZWQgd2l0aDonLCB7XG4gICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgdGVuYW50OiB0aGlzLnRlbmFudCxcbiAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmdldFByb3h5VmlkZW9TdGF0dXMoe1xuICAgICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgICAgZW50aXR5SWQ6IHRoaXMuZW50aXR5SWQsXG4gICAgICAgIHRlbmFudDogdGhpcy50ZW5hbnQsXG4gICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHJlc3BvbnNlIGlzIGFjdHVhbGx5IGFuIGVycm9yIChzb21lIEhUVFAgYWRhcHRlcnMgcmV0dXJuIGVycm9ycyBpbiBuZXh0KVxuICAgICAgICAgIC8vIEFsc28gY2hlY2sgZm9yIHVuZGVmaW5lZC9udWxsIG9yIG1pc3NpbmcgY29udGVudFxuICAgICAgICAgIGNvbnN0IGlzRXJyb3JSZXNwb25zZSA9ICFyZXNwb25zZSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVzcG9uc2UuY29udGVudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlPy5vayA9PT0gZmFsc2UgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/LnN0YXR1cyA+PSA0MDAgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/LmVycm9yIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/Lm5hbWUgPT09ICdIdHRwRXJyb3JSZXNwb25zZSc7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGlzRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gU3RhdHVzIGNoZWNrIHJldHVybmVkIGVycm9yIGluIHJlc3BvbnNlOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc1N0YXR1c0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yPy5tZXNzYWdlIHx8IHJlc3BvbnNlPy5tZXNzYWdlIHx8ICdFcnJvciBjaGVja2luZyBzdGF0dXMnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gU3RhdHVzIGNoZWNrIHN1Y2Nlc3NmdWw6JywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5pc0NoZWNraW5nU3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIFN0YXR1cyBjaGVjayBmYWlsZWQ6JywgZXJyKTtcbiAgICAgICAgICB0aGlzLmlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmlzU3RhdHVzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgJ0Vycm9yIGNoZWNraW5nIHN0YXR1cyc7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBvbkNsaWNrIGNhbGxlZCcpO1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBJbnB1dHM6Jywge1xuICAgICAgdGVuYW50OiB0aGlzLnRlbmFudCxcbiAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgcm9vbVR5cGU6IHRoaXMucm9vbVR5cGUsXG4gICAgICBidXNpbmVzc1JvbGU6IHRoaXMuYnVzaW5lc3NSb2xlLFxuICAgICAgY3VycmVudFVzZXI6IHRoaXMuY3VycmVudFVzZXIsXG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMudGVuYW50IHx8ICF0aGlzLmN1cnJlbnRVc2VyPy5uYW1lKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSBUZW5hbnQgb3IgY3VycmVudCB1c2VyIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW50aXR5SWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIGVudGl0eUlkIGlzIHJlcXVpcmVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFZhbGlkYXRpb24gcGFzc2VkLCBvcGVuaW5nIHdhaXRpbmcgcm9vbSBtb2RhbCcpO1xuICAgIHRoaXMub3BlbldhaXRpbmdSb29tTW9kYWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbldhaXRpbmdSb29tTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFRhc1dhaXRpbmdSb29tQ29tcG9uZW50LCB7XG4gICAgICBzaXplOiAnbGcnLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtd2FpdGluZy1yb29tLW1vZGFsJyxcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUGFzcyBhbGwgbmVjZXNzYXJ5IGlucHV0cyB0byB0aGUgd2FpdGluZyByb29tIGNvbXBvbmVudFxuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnJvb21UeXBlID0gdGhpcy5yb29tVHlwZTtcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5lbnRpdHlJZCA9IHRoaXMuZW50aXR5SWQ7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGVuYW50ID0gdGhpcy50ZW5hbnQ7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuYnVzaW5lc3NSb2xlID0gdGhpcy5idXNpbmVzc1JvbGU7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY3VycmVudFVzZXIgPSB0aGlzLmN1cnJlbnRVc2VyO1xuXG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYucmVzdWx0LnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuVmlkZW9DYWxsTW9kYWwoaXNSZXR1cm5pbmdGcm9tUGlwOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihUYXNWaWRlb2NhbGxDb21wb25lbnQsIHtcbiAgICAgIHNpemU6ICd4bCcsXG4gICAgICB3aW5kb3dDbGFzczogJ3Rhcy12aWRlby1tb2RhbCcsXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXG4gICAgICBrZXlib2FyZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnNlc3Npb25JZCA9IHRoaXMudGFzU2VydmljZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b2tlbiA9IHRoaXMudGFzU2VydmljZS50b2tlbjtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmJ1c2luZXNzUm9sZSA9IHRoaXMuYnVzaW5lc3NSb2xlO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaXNSZXR1cm5pbmdGcm9tUGlwID0gaXNSZXR1cm5pbmdGcm9tUGlwO1xuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5yZXN1bHQudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLCI8YnV0dG9uXG4gICpuZ0lmPVwiaXNWaXNpYmxlXCJcbiAgdHlwZT1cImJ1dHRvblwiXG4gIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRhcy1idG5cIlxuICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuPlxuICA8aSBjbGFzcz1cImZhIGZhLXZpZGVvLWNhbWVyYVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPjwvaT5cbiAgPHNwYW4gKm5nSWY9XCIhaXNMb2FkaW5nXCI+SW5pY2lhciBUQVM8L3NwYW4+XG4gIDxzcGFuICpuZ0lmPVwiaXNMb2FkaW5nXCI+UHJvY2Vzc2luZy4uLjwvc3Bhbj5cbjwvYnV0dG9uPlxuXG4iXX0=
|