@hivegpt/hiveai-angular 0.0.593 → 0.0.596

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/environments/environment.d.ts.map +1 -1
  2. package/esm2020/environments/environment.mjs +15 -0
  3. package/esm2020/hivegpt-hiveai-angular.mjs +5 -0
  4. package/esm2020/lib/components/NotificationSocket.mjs +45 -0
  5. package/esm2020/lib/components/bot-html-editor/bot-html-editor.component.mjs +113 -0
  6. package/esm2020/lib/components/bot.service.mjs +45 -0
  7. package/esm2020/lib/components/chat-drawer/chat-drawer.component.mjs +3904 -0
  8. package/esm2020/lib/components/chatbot/chatbot.component.mjs +95 -0
  9. package/esm2020/lib/components/conversation.service.mjs +58 -0
  10. package/esm2020/lib/components/socket-service.service.mjs +65 -0
  11. package/esm2020/lib/components/translations/translation.service.mjs +244 -0
  12. package/esm2020/lib/components/video-player/video-player.component.mjs +131 -0
  13. package/esm2020/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.mjs +187 -0
  14. package/esm2020/lib/components/voice-agent/services/audio-analyzer.service.mjs +127 -0
  15. package/esm2020/lib/components/voice-agent/services/voice-agent.service.mjs +352 -0
  16. package/esm2020/lib/components/voice-agent/voice-agent.module.mjs +37 -0
  17. package/esm2020/lib/components/voice-agent/voice-modal-tokens.mjs +4 -0
  18. package/esm2020/lib/hivegpt.module.mjs +28 -0
  19. package/esm2020/lib/models/video.mjs +2 -0
  20. package/esm2020/lib/pipes/safe-html.pipe.mjs +20 -0
  21. package/esm2020/lib/services/platform-token-refresh.service.mjs +177 -0
  22. package/esm2020/lib/utils/utils.mjs +36 -0
  23. package/esm2020/public-api.mjs +15 -0
  24. package/fesm2015/hivegpt-hiveai-angular.mjs +5605 -0
  25. package/fesm2015/hivegpt-hiveai-angular.mjs.map +1 -0
  26. package/fesm2020/hivegpt-hiveai-angular.mjs +5606 -0
  27. package/fesm2020/hivegpt-hiveai-angular.mjs.map +1 -0
  28. package/hivegpt-hiveai-angular.d.ts.map +1 -1
  29. package/index.d.ts +6 -0
  30. package/lib/components/NotificationSocket.d.ts +6 -1
  31. package/lib/components/NotificationSocket.d.ts.map +1 -1
  32. package/lib/components/bot-html-editor/bot-html-editor.component.d.ts +3 -0
  33. package/lib/components/bot-html-editor/bot-html-editor.component.d.ts.map +1 -1
  34. package/lib/components/bot.service.d.ts +5 -1
  35. package/lib/components/bot.service.d.ts.map +1 -1
  36. package/lib/components/chat-drawer/chat-drawer.component.d.ts +7 -3
  37. package/lib/components/chat-drawer/chat-drawer.component.d.ts.map +1 -1
  38. package/lib/components/chatbot/chatbot.component.d.ts +3 -0
  39. package/lib/components/chatbot/chatbot.component.d.ts.map +1 -1
  40. package/lib/components/conversation.service.d.ts +3 -0
  41. package/lib/components/conversation.service.d.ts.map +1 -1
  42. package/lib/components/socket-service.service.d.ts +7 -3
  43. package/lib/components/socket-service.service.d.ts.map +1 -1
  44. package/lib/components/translations/translation.service.d.ts +3 -0
  45. package/lib/components/translations/translation.service.d.ts.map +1 -1
  46. package/lib/components/video-player/video-player.component.d.ts +3 -0
  47. package/lib/components/video-player/video-player.component.d.ts.map +1 -1
  48. package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts +3 -0
  49. package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts.map +1 -1
  50. package/lib/components/voice-agent/services/audio-analyzer.service.d.ts +3 -0
  51. package/lib/components/voice-agent/services/audio-analyzer.service.d.ts.map +1 -1
  52. package/lib/components/voice-agent/services/voice-agent.service.d.ts +4 -1
  53. package/lib/components/voice-agent/services/voice-agent.service.d.ts.map +1 -1
  54. package/lib/components/voice-agent/voice-agent.module.d.ts +6 -0
  55. package/lib/components/voice-agent/voice-agent.module.d.ts.map +1 -1
  56. package/lib/components/voice-agent/voice-modal-tokens.d.ts.map +1 -1
  57. package/lib/hivegpt.module.d.ts +16 -0
  58. package/lib/hivegpt.module.d.ts.map +1 -1
  59. package/lib/models/video.d.ts.map +1 -1
  60. package/lib/pipes/safe-html.pipe.d.ts +3 -0
  61. package/lib/pipes/safe-html.pipe.d.ts.map +1 -1
  62. package/lib/services/platform-token-refresh.service.d.ts +3 -0
  63. package/lib/services/platform-token-refresh.service.d.ts.map +1 -1
  64. package/lib/utils/utils.d.ts.map +1 -1
  65. package/package.json +24 -12
  66. package/public-api.d.ts +2 -0
  67. package/public-api.d.ts.map +1 -1
  68. package/bundles/hivegpt-hiveai-angular.umd.js +0 -6285
  69. package/bundles/hivegpt-hiveai-angular.umd.js.map +0 -1
  70. package/bundles/hivegpt-hiveai-angular.umd.min.js +0 -2
  71. package/bundles/hivegpt-hiveai-angular.umd.min.js.map +0 -1
  72. package/esm2015/environments/environment.js +0 -15
  73. package/esm2015/hivegpt-hiveai-angular.js +0 -13
  74. package/esm2015/lib/components/NotificationSocket.js +0 -39
  75. package/esm2015/lib/components/bot-html-editor/bot-html-editor.component.js +0 -112
  76. package/esm2015/lib/components/bot.service.js +0 -50
  77. package/esm2015/lib/components/chat-drawer/chat-drawer.component.js +0 -3809
  78. package/esm2015/lib/components/chatbot/chatbot.component.js +0 -57
  79. package/esm2015/lib/components/conversation.service.js +0 -57
  80. package/esm2015/lib/components/socket-service.service.js +0 -79
  81. package/esm2015/lib/components/translations/translation.service.js +0 -244
  82. package/esm2015/lib/components/video-player/video-player.component.js +0 -123
  83. package/esm2015/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.js +0 -192
  84. package/esm2015/lib/components/voice-agent/services/audio-analyzer.service.js +0 -125
  85. package/esm2015/lib/components/voice-agent/services/voice-agent.service.js +0 -364
  86. package/esm2015/lib/components/voice-agent/voice-agent.module.js +0 -29
  87. package/esm2015/lib/components/voice-agent/voice-modal-tokens.js +0 -4
  88. package/esm2015/lib/hivegpt.module.js +0 -23
  89. package/esm2015/lib/models/video.js +0 -2
  90. package/esm2015/lib/pipes/safe-html.pipe.js +0 -19
  91. package/esm2015/lib/services/platform-token-refresh.service.js +0 -173
  92. package/esm2015/lib/utils/utils.js +0 -38
  93. package/esm2015/public-api.js +0 -13
  94. package/fesm2015/hivegpt-hiveai-angular.js +0 -5484
  95. package/fesm2015/hivegpt-hiveai-angular.js.map +0 -1
  96. package/hivegpt-hiveai-angular.d.ts +0 -13
  97. package/hivegpt-hiveai-angular.metadata.json +0 -1
@@ -1,364 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { isPlatformBrowser } from '@angular/common';
3
- import { Inject, Injectable, NgZone, PLATFORM_ID } from '@angular/core';
4
- import { BehaviorSubject, Subject, Subscription } from 'rxjs';
5
- import { take } from 'rxjs/operators';
6
- import { PipecatClient, RTVIEvent } from '@pipecat-ai/client-js';
7
- import { WebSocketTransport } from '@pipecat-ai/websocket-transport';
8
- import { PlatformTokenRefreshService } from '../../../services/platform-token-refresh.service';
9
- import { AudioAnalyzerService } from './audio-analyzer.service';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./audio-analyzer.service";
12
- import * as i2 from "../../../services/platform-token-refresh.service";
13
- /**
14
- * Voice agent orchestrator using the official PipecatClient SDK.
15
- *
16
- * Audio flow (mirrors the React reference implementation):
17
- * - Local mic: acquired by PipecatClient.initDevices(); local track fed to
18
- * AudioAnalyzerService for waveform visualisation.
19
- * - Bot audio: received as a MediaStreamTrack via RTVIEvent.TrackStarted,
20
- * played through a hidden <audio> element.
21
- * - All binary protobuf framing / RTVI protocol handled by
22
- * @pipecat-ai/client-js + @pipecat-ai/websocket-transport.
23
- */
24
- export class VoiceAgentService {
25
- constructor(audioAnalyzer, platformTokenRefresh, ngZone,
26
- /** `Object` not `object` — ngc metadata collection rejects the `object` type in DI params. */
27
- platformId) {
28
- this.audioAnalyzer = audioAnalyzer;
29
- this.platformTokenRefresh = platformTokenRefresh;
30
- this.ngZone = ngZone;
31
- this.platformId = platformId;
32
- this.callStateSubject = new BehaviorSubject('idle');
33
- this.statusTextSubject = new BehaviorSubject('');
34
- this.durationSubject = new BehaviorSubject('00:00');
35
- this.isMicMutedSubject = new BehaviorSubject(false);
36
- this.isUserSpeakingSubject = new BehaviorSubject(false);
37
- this.audioLevelsSubject = new BehaviorSubject([]);
38
- this.userTranscriptSubject = new Subject();
39
- this.botTranscriptSubject = new Subject();
40
- this.callStartTime = 0;
41
- this.durationInterval = null;
42
- this.pcClient = null;
43
- this.botAudioElement = null;
44
- this.lifecycleToken = 0;
45
- this.subscriptions = new Subscription();
46
- this.destroy$ = new Subject();
47
- this.callState$ = this.callStateSubject.asObservable();
48
- this.statusText$ = this.statusTextSubject.asObservable();
49
- this.duration$ = this.durationSubject.asObservable();
50
- this.isMicMuted$ = this.isMicMutedSubject.asObservable();
51
- this.isUserSpeaking$ = this.isUserSpeakingSubject.asObservable();
52
- this.audioLevels$ = this.audioLevelsSubject.asObservable();
53
- this.userTranscript$ = this.userTranscriptSubject.asObservable();
54
- this.botTranscript$ = this.botTranscriptSubject.asObservable();
55
- this.subscriptions.add(this.audioAnalyzer.audioLevels$.subscribe((levels) => this.audioLevelsSubject.next(levels)));
56
- }
57
- ngOnDestroy() {
58
- this.destroy$.next();
59
- this.subscriptions.unsubscribe();
60
- void this.disconnect();
61
- }
62
- /** Reset to idle (e.g. when modal re-opens so user can click Start Call). */
63
- resetToIdle() {
64
- void this.prepareFreshSession();
65
- }
66
- /**
67
- * Hard reset voice session so each modal open starts from a clean state.
68
- * Closes any previous client and prevents stale callbacks from mutating UI state.
69
- */
70
- prepareFreshSession() {
71
- return __awaiter(this, void 0, void 0, function* () {
72
- this.lifecycleToken += 1;
73
- this.stopDurationTimer();
74
- this.callStartTime = 0;
75
- this.audioAnalyzer.stop();
76
- this.stopBotAudio();
77
- this.isUserSpeakingSubject.next(false);
78
- this.isMicMutedSubject.next(false);
79
- this.durationSubject.next('00:00');
80
- this.statusTextSubject.next('');
81
- this.callStateSubject.next('idle');
82
- yield this.cleanupPipecatClient();
83
- });
84
- }
85
- connect(apiUrl, token, botId, conversationId, apiKey, eventToken, eventId, eventUrl, domainAuthority, usersApiUrl) {
86
- return __awaiter(this, void 0, void 0, function* () {
87
- if (this.callStateSubject.value !== 'idle') {
88
- console.warn('[HiveGpt Voice] Call already in progress');
89
- return;
90
- }
91
- const connectToken = ++this.lifecycleToken;
92
- try {
93
- this.callStateSubject.next('connecting');
94
- this.statusTextSubject.next('Connecting...');
95
- let accessToken = token;
96
- if (usersApiUrl && isPlatformBrowser(this.platformId)) {
97
- try {
98
- const ensured = yield this.platformTokenRefresh
99
- .ensureValidAccessToken(token, usersApiUrl)
100
- .pipe(take(1))
101
- .toPromise();
102
- if (ensured === null || ensured === void 0 ? void 0 : ensured.accessToken)
103
- accessToken = ensured.accessToken;
104
- }
105
- catch (e) {
106
- console.warn('[HiveGpt Voice] Token refresh failed', e);
107
- }
108
- }
109
- const baseUrl = apiUrl.replace(/\/$/, '');
110
- const pcClient = new PipecatClient({
111
- transport: new WebSocketTransport(),
112
- enableMic: true,
113
- enableCam: false,
114
- callbacks: {
115
- onConnected: () => this.ngZone.run(() => {
116
- if (!this.isLifecycleActive(connectToken))
117
- return;
118
- this.onPipecatConnected();
119
- }),
120
- onDisconnected: () => this.ngZone.run(() => {
121
- if (!this.isLifecycleActive(connectToken))
122
- return;
123
- this.onPipecatDisconnected();
124
- }),
125
- onBotReady: () => this.ngZone.run(() => {
126
- if (!this.isLifecycleActive(connectToken))
127
- return;
128
- this.onBotReady();
129
- }),
130
- onUserTranscript: (data) => this.ngZone.run(() => this.isLifecycleActive(connectToken) &&
131
- this.userTranscriptSubject.next({ text: data.text, final: !!data.final })),
132
- onBotTranscript: (data) => this.ngZone.run(() => {
133
- if (!this.isLifecycleActive(connectToken))
134
- return;
135
- this.botTranscriptSubject.next(data.text);
136
- }),
137
- onError: (err) => {
138
- this.ngZone.run(() => {
139
- if (!this.isLifecycleActive(connectToken))
140
- return;
141
- console.error('[HiveGpt Voice] PipecatClient error', err);
142
- this.callStateSubject.next('ended');
143
- this.statusTextSubject.next('Connection failed');
144
- });
145
- },
146
- },
147
- });
148
- this.pcClient = pcClient;
149
- // Bot audio arrives as a MediaStreamTrack — wire to a hidden <audio> element
150
- pcClient.on(RTVIEvent.TrackStarted, (track, participant) => {
151
- if (!this.isLifecycleActive(connectToken))
152
- return;
153
- if (!(participant === null || participant === void 0 ? void 0 : participant.local) && track.kind === 'audio') {
154
- this.ngZone.run(() => this.setupBotAudioTrack(track));
155
- }
156
- });
157
- // Speaking state comes straight from RTVI events
158
- pcClient.on(RTVIEvent.BotStartedSpeaking, () => this.ngZone.run(() => {
159
- if (!this.isLifecycleActive(connectToken))
160
- return;
161
- this.onBotStartedSpeaking();
162
- }));
163
- pcClient.on(RTVIEvent.BotStoppedSpeaking, () => this.ngZone.run(() => {
164
- if (!this.isLifecycleActive(connectToken))
165
- return;
166
- this.onBotStoppedSpeaking();
167
- }));
168
- pcClient.on(RTVIEvent.UserStartedSpeaking, () => this.ngZone.run(() => {
169
- if (!this.isLifecycleActive(connectToken))
170
- return;
171
- this.isUserSpeakingSubject.next(true);
172
- this.callStateSubject.next('listening');
173
- this.statusTextSubject.next('Listening...');
174
- }));
175
- pcClient.on(RTVIEvent.UserStoppedSpeaking, () => this.ngZone.run(() => {
176
- if (!this.isLifecycleActive(connectToken))
177
- return;
178
- this.isUserSpeakingSubject.next(false);
179
- if (this.callStateSubject.value === 'listening') {
180
- // Brief 'Processing...' while we wait for the bot to respond.
181
- this.callStateSubject.next('connected');
182
- this.statusTextSubject.next('Processing...');
183
- }
184
- }));
185
- // Acquire mic (triggers browser permission prompt)
186
- yield pcClient.initDevices();
187
- // Build headers using the browser Headers API (required by pipecat's APIRequest type)
188
- const requestHeaders = new Headers();
189
- requestHeaders.append('Authorization', `Bearer ${accessToken}`);
190
- requestHeaders.append('x-api-key', apiKey);
191
- requestHeaders.append('hive-bot-id', botId);
192
- requestHeaders.append('domain-authority', domainAuthority);
193
- requestHeaders.append('eventUrl', eventUrl);
194
- requestHeaders.append('eventId', eventId);
195
- requestHeaders.append('eventToken', eventToken);
196
- requestHeaders.append('ngrok-skip-browser-warning', 'true');
197
- // POST to /ai/ask-voice-socket → receives { ws_url } → WebSocketTransport connects
198
- yield pcClient.startBotAndConnect({
199
- endpoint: `${baseUrl}/ai/ask-voice-socket`,
200
- headers: requestHeaders,
201
- requestData: {
202
- bot_id: botId,
203
- conversation_id: conversationId,
204
- voice: 'alloy',
205
- },
206
- });
207
- }
208
- catch (error) {
209
- if (!this.isLifecycleActive(connectToken))
210
- return;
211
- console.error('[HiveGpt Voice] connect failed', error);
212
- this.callStateSubject.next('ended');
213
- yield this.cleanupPipecatClient();
214
- this.statusTextSubject.next('Connection failed');
215
- throw error;
216
- }
217
- });
218
- }
219
- onPipecatConnected() {
220
- var _a;
221
- // Start the duration timer from the moment the session is live.
222
- this.callStartTime = Date.now();
223
- this.startDurationTimer();
224
- this.callStateSubject.next('connected');
225
- this.statusTextSubject.next('Connected');
226
- // Preserve any mute action the user made during "connecting".
227
- const shouldBeMuted = this.isMicMutedSubject.value;
228
- (_a = this.pcClient) === null || _a === void 0 ? void 0 : _a.enableMic(!shouldBeMuted);
229
- this.isMicMutedSubject.next(shouldBeMuted);
230
- this.startLocalMicAnalyzer();
231
- }
232
- onPipecatDisconnected() {
233
- this.stopDurationTimer();
234
- this.callStartTime = 0;
235
- this.audioAnalyzer.stop();
236
- this.stopBotAudio();
237
- this.callStateSubject.next('ended');
238
- this.statusTextSubject.next('Call Ended');
239
- }
240
- onBotReady() {
241
- var _a, _b, _c;
242
- // Retry track wiring in case tracks weren't ready at onConnected.
243
- this.startLocalMicAnalyzer();
244
- const botTrack = (_c = (_b = (_a = this.pcClient) === null || _a === void 0 ? void 0 : _a.tracks()) === null || _b === void 0 ? void 0 : _b.bot) === null || _c === void 0 ? void 0 : _c.audio;
245
- if (botTrack)
246
- this.setupBotAudioTrack(botTrack);
247
- // Bot is initialised — signal that we're now waiting for user input.
248
- this.statusTextSubject.next('Listening...');
249
- }
250
- startLocalMicAnalyzer() {
251
- var _a, _b, _c;
252
- const localTrack = (_c = (_b = (_a = this.pcClient) === null || _a === void 0 ? void 0 : _a.tracks()) === null || _b === void 0 ? void 0 : _b.local) === null || _c === void 0 ? void 0 : _c.audio;
253
- if (localTrack) {
254
- this.audioAnalyzer.start(new MediaStream([localTrack]));
255
- }
256
- }
257
- onBotStartedSpeaking() {
258
- this.callStateSubject.next('talking');
259
- this.statusTextSubject.next('Talking...');
260
- // Mark user as no longer speaking when bot takes the turn.
261
- this.isUserSpeakingSubject.next(false);
262
- }
263
- onBotStoppedSpeaking() {
264
- if (this.callStateSubject.value === 'talking') {
265
- this.callStateSubject.next('connected');
266
- this.statusTextSubject.next('Listening...');
267
- }
268
- }
269
- setupBotAudioTrack(track) {
270
- var _a;
271
- if (!this.botAudioElement) {
272
- this.botAudioElement = new Audio();
273
- this.botAudioElement.autoplay = true;
274
- }
275
- const existing = (_a = this.botAudioElement.srcObject) === null || _a === void 0 ? void 0 : _a.getAudioTracks()[0];
276
- if ((existing === null || existing === void 0 ? void 0 : existing.id) === track.id)
277
- return;
278
- this.botAudioElement.srcObject = new MediaStream([track]);
279
- this.botAudioElement.play().catch((err) => console.warn('[HiveGpt Voice] Bot audio play blocked', err));
280
- }
281
- stopBotAudio() {
282
- var _a;
283
- if (this.botAudioElement) {
284
- try {
285
- this.botAudioElement.pause();
286
- (_a = this.botAudioElement.srcObject) === null || _a === void 0 ? void 0 : _a.getAudioTracks().forEach((t) => t.stop());
287
- this.botAudioElement.srcObject = null;
288
- }
289
- catch (_b) {
290
- // ignore
291
- }
292
- this.botAudioElement = null;
293
- }
294
- }
295
- disconnect() {
296
- return __awaiter(this, void 0, void 0, function* () {
297
- this.lifecycleToken += 1;
298
- this.stopDurationTimer();
299
- this.callStartTime = 0;
300
- this.audioAnalyzer.stop();
301
- this.stopBotAudio();
302
- yield this.cleanupPipecatClient();
303
- this.callStateSubject.next('ended');
304
- this.statusTextSubject.next('Call Ended');
305
- });
306
- }
307
- isLifecycleActive(token) {
308
- return token === this.lifecycleToken;
309
- }
310
- cleanupPipecatClient() {
311
- return __awaiter(this, void 0, void 0, function* () {
312
- if (this.pcClient) {
313
- try {
314
- yield this.pcClient.disconnect();
315
- }
316
- catch (_a) {
317
- // ignore
318
- }
319
- this.pcClient = null;
320
- }
321
- });
322
- }
323
- toggleMic() {
324
- const nextMuted = !this.isMicMutedSubject.value;
325
- // Reflect the user's intent immediately, even if connect is still in progress.
326
- this.isMicMutedSubject.next(nextMuted);
327
- if (this.pcClient) {
328
- this.pcClient.enableMic(!nextMuted);
329
- }
330
- if (nextMuted)
331
- this.isUserSpeakingSubject.next(false);
332
- }
333
- startDurationTimer() {
334
- const tick = () => {
335
- if (this.callStartTime > 0) {
336
- const elapsed = Math.floor((Date.now() - this.callStartTime) / 1000);
337
- const m = Math.floor(elapsed / 60);
338
- const s = elapsed % 60;
339
- this.durationSubject.next(`${m}:${String(s).padStart(2, '0')}`);
340
- }
341
- };
342
- tick();
343
- this.durationInterval = setInterval(tick, 1000);
344
- }
345
- stopDurationTimer() {
346
- if (this.durationInterval) {
347
- clearInterval(this.durationInterval);
348
- this.durationInterval = null;
349
- }
350
- }
351
- }
352
- VoiceAgentService.ɵprov = i0.ɵɵdefineInjectable({ factory: function VoiceAgentService_Factory() { return new VoiceAgentService(i0.ɵɵinject(i1.AudioAnalyzerService), i0.ɵɵinject(i2.PlatformTokenRefreshService), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.PLATFORM_ID)); }, token: VoiceAgentService, providedIn: "root" });
353
- VoiceAgentService.decorators = [
354
- { type: Injectable, args: [{
355
- providedIn: 'root',
356
- },] }
357
- ];
358
- VoiceAgentService.ctorParameters = () => [
359
- { type: AudioAnalyzerService },
360
- { type: PlatformTokenRefreshService },
361
- { type: NgZone },
362
- { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
363
- ];
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9oaXR0aGFrdXIvaGl2ZS1ncHQvSGl2ZUFJLVBhY2thZ2VzL0FuZ3VsYXIvcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy92b2ljZS1hZ2VudC9zZXJ2aWNlcy92b2ljZS1hZ2VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQWEsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMvRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQWVoRTs7Ozs7Ozs7OztHQVVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQTZCNUIsWUFDVSxhQUFtQyxFQUNuQyxvQkFBaUQsRUFDakQsTUFBYztJQUN0Qiw4RkFBOEY7SUFDakUsVUFBa0I7UUFKdkMsa0JBQWEsR0FBYixhQUFhLENBQXNCO1FBQ25DLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBNkI7UUFDakQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUVPLGVBQVUsR0FBVixVQUFVLENBQVE7UUFqQ3pDLHFCQUFnQixHQUFHLElB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QyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNqRTtRQUNILENBQUMsQ0FBQztRQUNGLElBQUksRUFBRSxDQUFDO1FBQ1AsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUM5QjtJQUNILENBQUM7Ozs7WUFwWEYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUE1QlEsb0JBQW9CO1lBRHBCLDJCQUEyQjtZQUxQLE1BQU07WUFxRVUsTUFBTSx1QkFBOUMsTUFBTSxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95LCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQaXBlY2F0Q2xpZW50LCBSVFZJRXZlbnQgfSBmcm9tICdAcGlwZWNhdC1haS9jbGllbnQtanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0VHJhbnNwb3J0IH0gZnJvbSAnQHBpcGVjYXQtYWkvd2Vic29ja2V0LXRyYW5zcG9ydCc7XG5pbXBvcnQgeyBQbGF0Zm9ybVRva2VuUmVmcmVzaFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wbGF0Zm9ybS10b2tlbi1yZWZyZXNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXVkaW9BbmFseXplclNlcnZpY2UgfSBmcm9tICcuL2F1ZGlvLWFuYWx5emVyLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBDYWxsU3RhdGUgPVxuICB8ICdpZGxlJ1xuICB8ICdjb25uZWN0aW5nJ1xuICB8ICdjb25uZWN0ZWQnXG4gIHwgJ2xpc3RlbmluZydcbiAgfCAndGFsa2luZydcbiAgfCAnZW5kZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHREYXRhIHtcbiAgdGV4dDogc3RyaW5nO1xuICBmaW5hbDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBWb2ljZSBhZ2VudCBvcmNoZXN0cmF0b3IgdXNpbmcgdGhlIG9mZmljaWFsIFBpcGVjYXRDbGllbnQgU0RLLlxuICpcbiAqIEF1ZGlvIGZsb3cgKG1pcnJvcnMgdGhlIFJlYWN0IHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbik6XG4gKiAgLSBMb2NhbCBtaWM6IGFjcXVpcmVkIGJ5IFBpcGVjYXRDbGllbnQuaW5pdERldmljZXMoKTsgbG9jYWwgdHJhY2sgZmVkIHRvXG4gKiAgICBBdWRpb0FuYWx5emVyU2VydmljZSBmb3Igd2F2ZWZvcm0gdmlzdWFsaXNhdGlvbi5cbiAqICAtIEJvdCBhdWRpbzogcmVjZWl2ZWQgYXMgYSBNZWRpYVN0cmVhbVRyYWNrIHZpYSBSVFZJRXZlbnQuVHJhY2tTdGFydGVkLFxuICogICAgcGxheWVkIHRocm91Z2ggYSBoaWRkZW4gPGF1ZGlvPiBlbGVtZW50LlxuICogIC0gQWxsIGJpbmFyeSBwcm90b2J1ZiBmcmFtaW5nIC8gUlRWSSBwcm90b2NvbCBoYW5kbGVkIGJ5XG4gKiAgICBAcGlwZWNhdC1haS9jbGllbnQtanMgKyBAcGlwZWNhdC1haS93ZWJzb2NrZXQtdHJhbnNwb3J0LlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVm9pY2VBZ2VudFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGNhbGxTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhbGxTdGF0ZT4oJ2lkbGUnKTtcbiAgcHJpdmF0ZSBzdGF0dXNUZXh0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHByaXZhdGUgZHVyYXRpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcwMDowMCcpO1xuICBwcml2YXRlIGlzTWljTXV0ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaXNVc2VyU3BlYWtpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgYXVkaW9MZXZlbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXJbXT4oW10pO1xuICBwcml2YXRlIHVzZXJUcmFuc2NyaXB0U3ViamVjdCA9IG5ldyBTdWJqZWN0PFRyYW5zY3JpcHREYXRhPigpO1xuICBwcml2YXRlIGJvdFRyYW5zY3JpcHRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgY2FsbFN0YXJ0VGltZSA9IDA7XG4gIHByaXZhdGUgZHVyYXRpb25JbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBwY0NsaWVudDogUGlwZWNhdENsaWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGJvdEF1ZGlvRWxlbWVudDogSFRNTEF1ZGlvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxpZmVjeWNsZVRva2VuID0gMDtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNhbGxTdGF0ZSQ6IE9ic2VydmFibGU8Q2FsbFN0YXRlPiA9IHRoaXMuY2FsbFN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgc3RhdHVzVGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMuc3RhdHVzVGV4dFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGR1cmF0aW9uJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5kdXJhdGlvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGlzTWljTXV0ZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5pc01pY011dGVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgaXNVc2VyU3BlYWtpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGF1ZGlvTGV2ZWxzJDogT2JzZXJ2YWJsZTxudW1iZXJbXT4gPSB0aGlzLmF1ZGlvTGV2ZWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgdXNlclRyYW5zY3JpcHQkOiBPYnNlcnZhYmxlPFRyYW5zY3JpcHREYXRhPiA9IHRoaXMudXNlclRyYW5zY3JpcHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBib3RUcmFuc2NyaXB0JDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5ib3RUcmFuc2NyaXB0U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1ZGlvQW5hbHl6ZXI6IEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGxhdGZvcm1Ub2tlblJlZnJlc2g6IFBsYXRmb3JtVG9rZW5SZWZyZXNoU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIC8qKiBgT2JqZWN0YCBub3QgYG9iamVjdGAg4oCUIG5nYyBtZXRhZGF0YSBjb2xsZWN0aW9uIHJlamVjdHMgdGhlIGBvYmplY3RgIHR5cGUgaW4gREkgcGFyYW1zLiAqL1xuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5hdWRpb0FuYWx5emVyLmF1ZGlvTGV2ZWxzJC5zdWJzY3JpYmUoKGxldmVscykgPT5cbiAgICAgICAgdGhpcy5hdWRpb0xldmVsc1N1YmplY3QubmV4dChsZXZlbHMpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdm9pZCB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKiBSZXNldCB0byBpZGxlIChlLmcuIHdoZW4gbW9kYWwgcmUtb3BlbnMgc28gdXNlciBjYW4gY2xpY2sgU3RhcnQgQ2FsbCkuICovXG4gIHJlc2V0VG9JZGxlKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5wcmVwYXJlRnJlc2hTZXNzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFyZCByZXNldCB2b2ljZSBzZXNzaW9uIHNvIGVhY2ggbW9kYWwgb3BlbiBzdGFydHMgZnJvbSBhIGNsZWFuIHN0YXRlLlxuICAgKiBDbG9zZXMgYW55IHByZXZpb3VzIGNsaWVudCBhbmQgcHJldmVudHMgc3RhbGUgY2FsbGJhY2tzIGZyb20gbXV0YXRpbmcgVUkgc3RhdGUuXG4gICAqL1xuICBhc3luYyBwcmVwYXJlRnJlc2hTZXNzaW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGlmZWN5Y2xlVG9rZW4gKz0gMTtcbiAgICB0aGlzLnN0b3BEdXJhdGlvblRpbWVyKCk7XG4gICAgdGhpcy5jYWxsU3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLmF1ZGlvQW5hbHl6ZXIuc3RvcCgpO1xuICAgIHRoaXMuc3RvcEJvdEF1ZGlvKCk7XG4gICAgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5pc01pY011dGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmR1cmF0aW9uU3ViamVjdC5uZXh0KCcwMDowMCcpO1xuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnJyk7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2lkbGUnKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFudXBQaXBlY2F0Q2xpZW50KCk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KFxuICAgIGFwaVVybDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgYm90SWQ6IHN0cmluZyxcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICAgIGFwaUtleTogc3RyaW5nLFxuICAgIGV2ZW50VG9rZW46IHN0cmluZyxcbiAgICBldmVudElkOiBzdHJpbmcsXG4gICAgZXZlbnRVcmw6IHN0cmluZyxcbiAgICBkb21haW5BdXRob3JpdHk6IHN0cmluZyxcbiAgICB1c2Vyc0FwaVVybD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2FsbFN0YXRlU3ViamVjdC52YWx1ZSAhPT0gJ2lkbGUnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tIaXZlR3B0IFZvaWNlXSBDYWxsIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0VG9rZW4gPSArK3RoaXMubGlmZWN5Y2xlVG9rZW47XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2Nvbm5lY3RpbmcnKTtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGluZy4uLicpO1xuXG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0b2tlbjtcbiAgICAgIGlmICh1c2Vyc0FwaVVybCAmJiBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW5zdXJlZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1Ub2tlblJlZnJlc2hcbiAgICAgICAgICAgIC5lbnN1cmVWYWxpZEFjY2Vzc1Rva2VuKHRva2VuLCB1c2Vyc0FwaVVybClcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgICAgICAgaWYgKGVuc3VyZWQ/LmFjY2Vzc1Rva2VuKSBhY2Nlc3NUb2tlbiA9IGVuc3VyZWQuYWNjZXNzVG9rZW47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tIaXZlR3B0IFZvaWNlXSBUb2tlbiByZWZyZXNoIGZhaWxlZCcsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhcGlVcmwucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAgICAgY29uc3QgcGNDbGllbnQgPSBuZXcgUGlwZWNhdENsaWVudCh7XG4gICAgICAgIHRyYW5zcG9ydDogbmV3IFdlYlNvY2tldFRyYW5zcG9ydCgpLFxuICAgICAgICBlbmFibGVNaWM6IHRydWUsXG4gICAgICAgIGVuYWJsZUNhbTogZmFsc2UsXG4gICAgICAgIGNhbGxiYWNrczoge1xuICAgICAgICAgIG9uQ29ubmVjdGVkOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhpcy5vblBpcGVjYXRDb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uRGlzY29ubmVjdGVkOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhpcy5vblBpcGVjYXREaXNjb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uQm90UmVhZHk6ICgpID0+XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgICAgICB0aGlzLm9uQm90UmVhZHkoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uVXNlclRyYW5zY3JpcHQ6IChkYXRhKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+XG4gICAgICAgICAgICAgIHRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSAmJlxuICAgICAgICAgICAgICB0aGlzLnVzZXJUcmFuc2NyaXB0U3ViamVjdC5uZXh0KHsgdGV4dDogZGF0YS50ZXh0LCBmaW5hbDogISFkYXRhLmZpbmFsIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBvbkJvdFRyYW5zY3JpcHQ6IChkYXRhKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhpcy5ib3RUcmFuc2NyaXB0U3ViamVjdC5uZXh0KGRhdGEudGV4dCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBvbkVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbSGl2ZUdwdCBWb2ljZV0gUGlwZWNhdENsaWVudCBlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdlbmRlZCcpO1xuICAgICAgICAgICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0Nvbm5lY3Rpb24gZmFpbGVkJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucGNDbGllbnQgPSBwY0NsaWVudDtcblxuICAgICAgLy8gQm90IGF1ZGlvIGFycml2ZXMgYXMgYSBNZWRpYVN0cmVhbVRyYWNrIOKAlCB3aXJlIHRvIGEgaGlkZGVuIDxhdWRpbz4gZWxlbWVudFxuICAgICAgcGNDbGllbnQub24oXG4gICAgICAgIFJUVklFdmVudC5UcmFja1N0YXJ0ZWQsXG4gICAgICAgICh0cmFjazogTWVkaWFTdHJlYW1UcmFjaywgcGFydGljaXBhbnQ/OiB7IGxvY2FsPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICBpZiAoIXBhcnRpY2lwYW50Py5sb2NhbCAmJiB0cmFjay5raW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5zZXR1cEJvdEF1ZGlvVHJhY2sodHJhY2spKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICAvLyBTcGVha2luZyBzdGF0ZSBjb21lcyBzdHJhaWdodCBmcm9tIFJUVkkgZXZlbnRzXG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuQm90U3RhcnRlZFNwZWFraW5nLCAoKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5pc0xpZmVjeWNsZUFjdGl2ZShjb25uZWN0VG9rZW4pKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5vbkJvdFN0YXJ0ZWRTcGVha2luZygpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuQm90U3RvcHBlZFNwZWFraW5nLCAoKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5pc0xpZmVjeWNsZUFjdGl2ZShjb25uZWN0VG9rZW4pKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5vbkJvdFN0b3BwZWRTcGVha2luZygpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuVXNlclN0YXJ0ZWRTcGVha2luZywgKCkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2xpc3RlbmluZycpO1xuICAgICAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnTGlzdGVuaW5nLi4uJyk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHBjQ2xpZW50Lm9uKFJUVklFdmVudC5Vc2VyU3RvcHBlZFNwZWFraW5nLCAoKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5pc0xpZmVjeWNsZUFjdGl2ZShjb25uZWN0VG9rZW4pKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgaWYgKHRoaXMuY2FsbFN0YXRlU3ViamVjdC52YWx1ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIC8vIEJyaWVmICdQcm9jZXNzaW5nLi4uJyB3aGlsZSB3ZSB3YWl0IGZvciB0aGUgYm90IHRvIHJlc3BvbmQuXG4gICAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnY29ubmVjdGVkJyk7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ1Byb2Nlc3NpbmcuLi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gQWNxdWlyZSBtaWMgKHRyaWdnZXJzIGJyb3dzZXIgcGVybWlzc2lvbiBwcm9tcHQpXG4gICAgICBhd2FpdCBwY0NsaWVudC5pbml0RGV2aWNlcygpO1xuXG4gICAgICAvLyBCdWlsZCBoZWFkZXJzIHVzaW5nIHRoZSBicm93c2VyIEhlYWRlcnMgQVBJIChyZXF1aXJlZCBieSBwaXBlY2F0J3MgQVBJUmVxdWVzdCB0eXBlKVxuICAgICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCdBdXRob3JpemF0aW9uJywgYEJlYXJlciAke2FjY2Vzc1Rva2VufWApO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCd4LWFwaS1rZXknLCBhcGlLZXkpO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCdoaXZlLWJvdC1pZCcsIGJvdElkKTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLmFwcGVuZCgnZG9tYWluLWF1dGhvcml0eScsIGRvbWFpbkF1dGhvcml0eSk7XG4gICAgICByZXF1ZXN0SGVhZGVycy5hcHBlbmQoJ2V2ZW50VXJsJywgZXZlbnRVcmwpO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCdldmVudElkJywgZXZlbnRJZCk7XG4gICAgICByZXF1ZXN0SGVhZGVycy5hcHBlbmQoJ2V2ZW50VG9rZW4nLCBldmVudFRva2VuKTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLmFwcGVuZCgnbmdyb2stc2tpcC1icm93c2VyLXdhcm5pbmcnLCAndHJ1ZScpO1xuXG4gICAgICAvLyBQT1NUIHRvIC9haS9hc2stdm9pY2Utc29ja2V0IOKGkiByZWNlaXZlcyB7IHdzX3VybCB9IOKGkiBXZWJTb2NrZXRUcmFuc3BvcnQgY29ubmVjdHNcbiAgICAgIGF3YWl0IHBjQ2xpZW50LnN0YXJ0Qm90QW5kQ29ubmVjdCh7XG4gICAgICAgIGVuZHBvaW50OiBgJHtiYXNlVXJsfS9haS9hc2stdm9pY2Utc29ja2V0YCxcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHJlcXVlc3REYXRhOiB7XG4gICAgICAgICAgYm90X2lkOiBib3RJZCxcbiAgICAgICAgICBjb252ZXJzYXRpb25faWQ6IGNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgIHZvaWNlOiAnYWxsb3knLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghdGhpcy5pc0xpZmVjeWNsZUFjdGl2ZShjb25uZWN0VG9rZW4pKSByZXR1cm47XG4gICAgICBjb25zb2xlLmVycm9yKCdbSGl2ZUdwdCBWb2ljZV0gY29ubmVjdCBmYWlsZWQnLCBlcnJvcik7XG4gICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnZW5kZWQnKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cFBpcGVjYXRDbGllbnQoKTtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGlvbiBmYWlsZWQnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25QaXBlY2F0Q29ubmVjdGVkKCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHRoZSBkdXJhdGlvbiB0aW1lciBmcm9tIHRoZSBtb21lbnQgdGhlIHNlc3Npb24gaXMgbGl2ZS5cbiAgICB0aGlzLmNhbGxTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuc3RhcnREdXJhdGlvblRpbWVyKCk7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2Nvbm5lY3RlZCcpO1xuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGVkJyk7XG4gICAgLy8gUHJlc2VydmUgYW55IG11dGUgYWN0aW9uIHRoZSB1c2VyIG1hZGUgZHVyaW5nIFwiY29ubmVjdGluZ1wiLlxuICAgIGNvbnN0IHNob3VsZEJlTXV0ZWQgPSB0aGlzLmlzTWljTXV0ZWRTdWJqZWN0LnZhbHVlO1xuICAgIHRoaXMucGNDbGllbnQ/LmVuYWJsZU1pYyghc2hvdWxkQmVNdXRlZCk7XG4gICAgdGhpcy5pc01pY011dGVkU3ViamVjdC5uZXh0KHNob3VsZEJlTXV0ZWQpO1xuICAgIHRoaXMuc3RhcnRMb2NhbE1pY0FuYWx5emVyKCk7XG4gIH1cblxuICBwcml2YXRlIG9uUGlwZWNhdERpc2Nvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BEdXJhdGlvblRpbWVyKCk7XG4gICAgdGhpcy5jYWxsU3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLmF1ZGlvQW5hbHl6ZXIuc3RvcCgpO1xuICAgIHRoaXMuc3RvcEJvdEF1ZGlvKCk7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2VuZGVkJyk7XG4gICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdDYWxsIEVuZGVkJyk7XG4gIH1cblxuICBwcml2YXRlIG9uQm90UmVhZHkoKTogdm9pZCB7XG4gICAgLy8gUmV0cnkgdHJhY2sgd2lyaW5nIGluIGNhc2UgdHJhY2tzIHdlcmVuJ3QgcmVhZHkgYXQgb25Db25uZWN0ZWQuXG4gICAgdGhpcy5zdGFydExvY2FsTWljQW5hbHl6ZXIoKTtcbiAgICBjb25zdCBib3RUcmFjayA9ICh0aGlzLnBjQ2xpZW50Py50cmFja3MoKSBhcyB7IGJvdD86IHsgYXVkaW8/OiBNZWRpYVN0cmVhbVRyYWNrIH0gfSlcbiAgICAgID8uYm90Py5hdWRpbztcbiAgICBpZiAoYm90VHJhY2spIHRoaXMuc2V0dXBCb3RBdWRpb1RyYWNrKGJvdFRyYWNrKTtcbiAgICAvLyBCb3QgaXMgaW5pdGlhbGlzZWQg4oCUIHNpZ25hbCB0aGF0IHdlJ3JlIG5vdyB3YWl0aW5nIGZvciB1c2VyIGlucHV0LlxuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnTGlzdGVuaW5nLi4uJyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0TG9jYWxNaWNBbmFseXplcigpOiB2b2lkIHtcbiAgICBjb25zdCBsb2NhbFRyYWNrID0gKHRoaXMucGNDbGllbnQ/LnRyYWNrcygpIGFzIHsgbG9jYWw/OiB7IGF1ZGlvPzogTWVkaWFTdHJlYW1UcmFjayB9IH0pXG4gICAgICA/LmxvY2FsPy5hdWRpbztcbiAgICBpZiAobG9jYWxUcmFjaykge1xuICAgICAgdGhpcy5hdWRpb0FuYWx5emVyLnN0YXJ0KG5ldyBNZWRpYVN0cmVhbShbbG9jYWxUcmFja10pKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uQm90U3RhcnRlZFNwZWFraW5nKCk6IHZvaWQge1xuICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCd0YWxraW5nJyk7XG4gICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdUYWxraW5nLi4uJyk7XG4gICAgLy8gTWFyayB1c2VyIGFzIG5vIGxvbmdlciBzcGVha2luZyB3aGVuIGJvdCB0YWtlcyB0aGUgdHVybi5cbiAgICB0aGlzLmlzVXNlclNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Cb3RTdG9wcGVkU3BlYWtpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FsbFN0YXRlU3ViamVjdC52YWx1ZSA9PT0gJ3RhbGtpbmcnKSB7XG4gICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnY29ubmVjdGVkJyk7XG4gICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0xpc3RlbmluZy4uLicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBCb3RBdWRpb1RyYWNrKHRyYWNrOiBNZWRpYVN0cmVhbVRyYWNrKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmJvdEF1ZGlvRWxlbWVudCkge1xuICAgICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQgPSBuZXcgQXVkaW8oKTtcbiAgICAgIHRoaXMuYm90QXVkaW9FbGVtZW50LmF1dG9wbGF5ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSAodGhpcy5ib3RBdWRpb0VsZW1lbnQuc3JjT2JqZWN0IGFzIE1lZGlhU3RyZWFtIHwgbnVsbClcbiAgICAgID8uZ2V0QXVkaW9UcmFja3MoKVswXTtcbiAgICBpZiAoZXhpc3Rpbmc/LmlkID09PSB0cmFjay5pZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQuc3JjT2JqZWN0ID0gbmV3IE1lZGlhU3RyZWFtKFt0cmFja10pO1xuICAgIHRoaXMuYm90QXVkaW9FbGVtZW50LnBsYXkoKS5jYXRjaCgoZXJyKSA9PlxuICAgICAgY29uc29sZS53YXJuKCdbSGl2ZUdwdCBWb2ljZV0gQm90IGF1ZGlvIHBsYXkgYmxvY2tlZCcsIGVyciksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcEJvdEF1ZGlvKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJvdEF1ZGlvRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgKHRoaXMuYm90QXVkaW9FbGVtZW50LnNyY09iamVjdCBhcyBNZWRpYVN0cmVhbSB8IG51bGwpXG4gICAgICAgICAgPy5nZXRBdWRpb1RyYWNrcygpXG4gICAgICAgICAgLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcbiAgICAgICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQuc3JjT2JqZWN0ID0gbnVsbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICAgIHRoaXMuYm90QXVkaW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGlmZWN5Y2xlVG9rZW4gKz0gMTtcbiAgICB0aGlzLnN0b3BEdXJhdGlvblRpbWVyKCk7XG4gICAgdGhpcy5jYWxsU3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLmF1ZGlvQW5hbHl6ZXIuc3RvcCgpO1xuICAgIHRoaXMuc3RvcEJvdEF1ZGlvKCk7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwUGlwZWNhdENsaWVudCgpO1xuICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdlbmRlZCcpO1xuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ2FsbCBFbmRlZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xpZmVjeWNsZUFjdGl2ZSh0b2tlbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRva2VuID09PSB0aGlzLmxpZmVjeWNsZVRva2VuO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwUGlwZWNhdENsaWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5wY0NsaWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wY0NsaWVudC5kaXNjb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgICB0aGlzLnBjQ2xpZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVNaWMoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dE11dGVkID0gIXRoaXMuaXNNaWNNdXRlZFN1YmplY3QudmFsdWU7XG4gICAgLy8gUmVmbGVjdCB0aGUgdXNlcidzIGludGVudCBpbW1lZGlhdGVseSwgZXZlbiBpZiBjb25uZWN0IGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgIHRoaXMuaXNNaWNNdXRlZFN1YmplY3QubmV4dChuZXh0TXV0ZWQpO1xuICAgIGlmICh0aGlzLnBjQ2xpZW50KSB7XG4gICAgICB0aGlzLnBjQ2xpZW50LmVuYWJsZU1pYyghbmV4dE11dGVkKTtcbiAgICB9XG4gICAgaWYgKG5leHRNdXRlZCkgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RHVyYXRpb25UaW1lcigpOiB2b2lkIHtcbiAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2FsbFN0YXJ0VGltZSA+IDApIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZCA9IE1hdGguZmxvb3IoKERhdGUubm93KCkgLSB0aGlzLmNhbGxTdGFydFRpbWUpIC8gMTAwMCk7XG4gICAgICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCk7XG4gICAgICAgIGNvbnN0IHMgPSBlbGFwc2VkICUgNjA7XG4gICAgICAgIHRoaXMuZHVyYXRpb25TdWJqZWN0Lm5leHQoYCR7bX06JHtTdHJpbmcocykucGFkU3RhcnQoMiwgJzAnKX1gKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRpY2soKTtcbiAgICB0aGlzLmR1cmF0aW9uSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0aWNrLCAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcER1cmF0aW9uVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZHVyYXRpb25JbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmR1cmF0aW9uSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5kdXJhdGlvbkludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,29 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { VoiceAgentModalComponent } from './components/voice-agent-modal/voice-agent-modal.component';
4
- import { VoiceAgentService } from './services/voice-agent.service';
5
- import { AudioAnalyzerService } from './services/audio-analyzer.service';
6
- /**
7
- * Voice agent module. Uses @pipecat-ai/client-js + @pipecat-ai/websocket-transport
8
- * (peer dependencies) for WebSocket transport, RTVI protocol, and audio.
9
- */
10
- export class VoiceAgentModule {
11
- }
12
- VoiceAgentModule.decorators = [
13
- { type: NgModule, args: [{
14
- declarations: [
15
- VoiceAgentModalComponent
16
- ],
17
- imports: [
18
- CommonModule
19
- ],
20
- providers: [
21
- VoiceAgentService,
22
- AudioAnalyzerService,
23
- ],
24
- exports: [
25
- VoiceAgentModalComponent
26
- ]
27
- },] }
28
- ];
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3ZvaWNlLWFnZW50Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV6RTs7O0dBR0c7QUFnQkgsTUFBTSxPQUFPLGdCQUFnQjs7O1lBZjVCLFFBQVEsU0FBQztnQkFDUixZQUFZLEVBQUU7b0JBQ1osd0JBQXdCO2lCQUN6QjtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsWUFBWTtpQkFDYjtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsaUJBQWlCO29CQUNqQixvQkFBb0I7aUJBQ3JCO2dCQUNELE9BQU8sRUFBRTtvQkFDUCx3QkFBd0I7aUJBQ3pCO2FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFZvaWNlQWdlbnRNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy92b2ljZS1hZ2VudC1tb2RhbC92b2ljZS1hZ2VudC1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVm9pY2VBZ2VudFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQXVkaW9BbmFseXplclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2F1ZGlvLWFuYWx5emVyLnNlcnZpY2UnO1xuXG4vKipcbiAqIFZvaWNlIGFnZW50IG1vZHVsZS4gVXNlcyBAcGlwZWNhdC1haS9jbGllbnQtanMgKyBAcGlwZWNhdC1haS93ZWJzb2NrZXQtdHJhbnNwb3J0XG4gKiAocGVlciBkZXBlbmRlbmNpZXMpIGZvciBXZWJTb2NrZXQgdHJhbnNwb3J0LCBSVFZJIHByb3RvY29sLCBhbmQgYXVkaW8uXG4gKi9cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFZvaWNlQWdlbnRNb2RhbENvbXBvbmVudFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIFZvaWNlQWdlbnRTZXJ2aWNlLFxuICAgIEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgVm9pY2VBZ2VudE1vZGFsQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVm9pY2VBZ2VudE1vZHVsZSB7IH1cbiJdfQ==
@@ -1,4 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- export const VOICE_MODAL_CONFIG = new InjectionToken('VOICE_MODAL_CONFIG');
3
- export const VOICE_MODAL_CLOSE_CALLBACK = new InjectionToken('VOICE_MODAL_CLOSE_CALLBACK');
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtbW9kYWwtdG9rZW5zLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3ZvaWNlLW1vZGFsLXRva2Vucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBb0IvQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsQ0FBbUIsb0JBQW9CLENBQUMsQ0FBQztBQUM3RixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLGNBQWMsQ0FBYSw0QkFBNEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZU1vZGFsQ29uZmlnIHtcbiAgYXBpVXJsOiBzdHJpbmc7XG4gIHRva2VuOiBzdHJpbmc7XG4gIGJvdElkOiBzdHJpbmc7XG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIGFwaUtleTogc3RyaW5nO1xuICBldmVudFRva2VuOiBzdHJpbmc7XG4gIC8qKiBFdmVudCBzY29wZSBpZCAoc2FtZSBhcyBob3N0IGBldmVudElkYCAvIEFQSSBgZXZlbnRzLzpldmVudElkLy4uLmApLiAqL1xuICBldmVudElkOiBzdHJpbmc7XG4gIGV2ZW50VXJsOiBzdHJpbmc7XG4gIGRvbWFpbkF1dGhvcml0eTogc3RyaW5nO1xuICBhZ2VudE5hbWU6IHN0cmluZztcbiAgYWdlbnRSb2xlOiBzdHJpbmc7XG4gIGFnZW50QXZhdGFyPzogc3RyaW5nO1xuICAvKiogU2FtZSBiYXNlIGFzIGhvc3QgYFVTRVJTX0FQSWAgKGUuZy4gYGh0dHBzOi8vZXMtdXNlci5zb2NpYWwyNy5jb20vYXBpYCkgZm9yIHByb2FjdGl2ZSB0b2tlbiByZWZyZXNoLiAqL1xuICB1c2Vyc0FwaVVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFZPSUNFX01PREFMX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxWb2ljZU1vZGFsQ29uZmlnPignVk9JQ0VfTU9EQUxfQ09ORklHJyk7XG5leHBvcnQgY29uc3QgVk9JQ0VfTU9EQUxfQ0xPU0VfQ0FMTEJBQ0sgPSBuZXcgSW5qZWN0aW9uVG9rZW48KCkgPT4gdm9pZD4oJ1ZPSUNFX01PREFMX0NMT1NFX0NBTExCQUNLJyk7XG4iXX0=
@@ -1,23 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { NgModule } from '@angular/core';
3
- import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4
- import { OverlayModule } from '@angular/cdk/overlay';
5
- import { MatIconModule } from '@angular/material/icon';
6
- import { MatSidenavModule } from '@angular/material/sidenav';
7
- import { ChatDrawerComponent } from './components/chat-drawer/chat-drawer.component';
8
- import { ChatBotComponent } from './components/chatbot/chatbot.component';
9
- import { SafeHtmlPipe } from './pipes/safe-html.pipe';
10
- import { VideoPlayerComponent } from './components/video-player/video-player.component';
11
- import { QuillModule } from 'ngx-quill';
12
- import { BotHtmlEditorComponent } from './components/bot-html-editor/bot-html-editor.component';
13
- import { VoiceAgentModule } from './components/voice-agent/voice-agent.module';
14
- export class HiveGptModule {
15
- }
16
- HiveGptModule.decorators = [
17
- { type: NgModule, args: [{
18
- declarations: [ChatBotComponent, ChatDrawerComponent, VideoPlayerComponent, SafeHtmlPipe, BotHtmlEditorComponent],
19
- imports: [CommonModule, OverlayModule, MatIconModule, MatSidenavModule, FormsModule, ReactiveFormsModule, QuillModule, VoiceAgentModule],
20
- exports: [ChatBotComponent, ChatDrawerComponent, VideoPlayerComponent]
21
- },] }
22
- ];
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGl2ZWdwdC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvaGl0dGhha3VyL2hpdmUtZ3B0L0hpdmVBSS1QYWNrYWdlcy9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2hpdmVncHQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBTy9FLE1BQU0sT0FBTyxhQUFhOzs7WUFMekIsUUFBUSxTQUFDO2dCQUNSLFlBQVksRUFBRSxDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxzQkFBc0IsQ0FBQztnQkFDakgsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQztnQkFDeEksT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLENBQUM7YUFDdkUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFNpZGVuYXZNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zaWRlbmF2JztcbmltcG9ydCB7IENoYXREcmF3ZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY2hhdC1kcmF3ZXIvY2hhdC1kcmF3ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENoYXRCb3RDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY2hhdGJvdC9jaGF0Ym90LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYWZlSHRtbFBpcGUgfSBmcm9tICcuL3BpcGVzL3NhZmUtaHRtbC5waXBlJztcbmltcG9ydCB7IFZpZGVvUGxheWVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3ZpZGVvLXBsYXllci92aWRlby1wbGF5ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFF1aWxsTW9kdWxlIH0gZnJvbSAnbmd4LXF1aWxsJztcbmltcG9ydCB7IEJvdEh0bWxFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYm90LWh0bWwtZWRpdG9yL2JvdC1odG1sLWVkaXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVm9pY2VBZ2VudE1vZHVsZSB9IGZyb20gJy4vY29tcG9uZW50cy92b2ljZS1hZ2VudC92b2ljZS1hZ2VudC5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtDaGF0Qm90Q29tcG9uZW50LCBDaGF0RHJhd2VyQ29tcG9uZW50LCBWaWRlb1BsYXllckNvbXBvbmVudCwgU2FmZUh0bWxQaXBlLCBCb3RIdG1sRWRpdG9yQ29tcG9uZW50XSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgT3ZlcmxheU1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0U2lkZW5hdk1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFF1aWxsTW9kdWxlLCBWb2ljZUFnZW50TW9kdWxlXSxcbiAgZXhwb3J0czogW0NoYXRCb3RDb21wb25lbnQsIENoYXREcmF3ZXJDb21wb25lbnQsIFZpZGVvUGxheWVyQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBIaXZlR3B0TW9kdWxlIHsgfVxuIl19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8uanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvaGl0dGhha3VyL2hpdmUtZ3B0L0hpdmVBSS1QYWNrYWdlcy9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL21vZGVscy92aWRlby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJVmlkZW8ge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIGlzUGxheWluZzogYm9vbGVhbjtcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGV2ZW50SWQ6IHN0cmluZztcbiAgYW9pSWRzOiBzdHJpbmdbXTtcbiAgaW5zZXJ0VGltZVN0YW1wOiBzdHJpbmc7XG4gIGlzRGVsZXRlZDogYm9vbGVhbjtcbiAgYXBwcm9wcmlhdGU6IEFwcHJvcHJpYXRlW107XG4gIGlzSW50cm9WaWRlbzogYm9vbGVhbjtcbiAgdmlkZW9SYXRpbmc6IFZpZGVvUmF0aW5nW107XG4gIGxpa2VzOiBWaWRlb0xpa2VbXTtcbiAgdnR0VXJsOiBzdHJpbmc7XG4gIHByb2Nlc3NlZFVybHM6IHN0cmluZztcbiAgZHVyYXRpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFZpZGVvUmF0aW5nIHtcbiAgdXNlcklkOiBzdHJpbmc7XG4gIHJhdGVWYWx1ZTogc3RyaW5nO1xuICBpbnNlcnRUaW1lU3RhbXA6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFZpZGVvTGlrZSB7XG4gIHVzZXJJZDogc3RyaW5nO1xuICBpc0xpa2VkOiBib29sZWFuO1xuICBpbnNlcnRUaW1lU3RhbXA6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEFwcHJvcHJpYXRlIHtcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGluc2VydFRpbWVTdGFtcDogc3RyaW5nO1xufVxuIl19
@@ -1,19 +0,0 @@
1
- import { Pipe } from '@angular/core';
2
- import { DomSanitizer } from '@angular/platform-browser';
3
- export class SafeHtmlPipe {
4
- constructor(sanitizer) {
5
- this.sanitizer = sanitizer;
6
- }
7
- transform(html) {
8
- return html ? this.sanitizer.bypassSecurityTrustHtml(html) : '';
9
- }
10
- }
11
- SafeHtmlPipe.decorators = [
12
- { type: Pipe, args: [{
13
- name: 'safeHtml',
14
- },] }
15
- ];
16
- SafeHtmlPipe.ctorParameters = () => [
17
- { type: DomSanitizer }
18
- ];
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS1odG1sLnBpcGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvaGl0dGhha3VyL2hpdmUtZ3B0L0hpdmVBSS1QYWNrYWdlcy9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL3BpcGVzL3NhZmUtaHRtbC5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUt6RCxNQUFNLE9BQU8sWUFBWTtJQUV2QixZQUFvQixTQUF1QjtRQUF2QixjQUFTLEdBQVQsU0FBUyxDQUFjO0lBQzNDLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBSTtRQUNaLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEUsQ0FBQzs7O1lBVkYsSUFBSSxTQUFDO2dCQUNKLElBQUksRUFBRSxVQUFVO2FBQ2pCOzs7WUFKUSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ3NhZmVIdG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgU2FmZUh0bWxQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge1xuICB9XG5cbiAgdHJhbnNmb3JtKGh0bWwpOiB1bmtub3duIHtcbiAgICByZXR1cm4gaHRtbCA/IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpIDogJyc7XG4gIH1cblxufVxuIl19