@aakash58/chatbot 1.1.24 → 1.1.25

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 (168) hide show
  1. package/fesm2022/aakash58-chatbot.mjs +684 -654
  2. package/fesm2022/aakash58-chatbot.mjs.map +1 -1
  3. package/index.d.ts +374 -3
  4. package/package.json +2 -4
  5. package/esm2022/aakash58-chatbot.mjs +0 -5
  6. package/esm2022/lib/app/chat/chat-ui-state.service.mjs +0 -170
  7. package/esm2022/lib/app/chat/chat.service.mjs +0 -445
  8. package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +0 -50
  9. package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +0 -12
  10. package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +0 -66
  11. package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +0 -186
  12. package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +0 -312
  13. package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +0 -36
  14. package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +0 -115
  15. package/esm2022/lib/app/chat/model/chat-history.model.mjs +0 -2
  16. package/esm2022/lib/app/chat/model/chat-request.model.mjs +0 -2
  17. package/esm2022/lib/app/chat/model/chat-response.model.mjs +0 -2
  18. package/esm2022/lib/app/chat/model/chat-session.model.mjs +0 -2
  19. package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +0 -2
  20. package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +0 -2
  21. package/esm2022/lib/app/chat/services/chat-api.service.mjs +0 -61
  22. package/esm2022/lib/app/chat/services/chat-audio.service.mjs +0 -50
  23. package/esm2022/lib/app/chat/services/chat-history.service.mjs +0 -252
  24. package/esm2022/lib/app/login/login-form.component.mjs +0 -46
  25. package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +0 -194
  26. package/esm2022/lib/app/personalization/personalization.service.mjs +0 -149
  27. package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +0 -122
  28. package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +0 -86
  29. package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +0 -115
  30. package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +0 -29
  31. package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +0 -30
  32. package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +0 -12
  33. package/esm2022/lib/constant/doohbot-constant.mjs +0 -28
  34. package/esm2022/lib/constant/html-entities.mjs +0 -9
  35. package/esm2022/lib/constant/utf8.mjs +0 -10
  36. package/esm2022/lib/core/app-const.mjs +0 -61
  37. package/esm2022/lib/core/auth/account-api.service.mjs +0 -40
  38. package/esm2022/lib/core/auth/auth.service.mjs +0 -391
  39. package/esm2022/lib/core/auth/models/auth-result.model.mjs +0 -3
  40. package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +0 -6
  41. package/esm2022/lib/core/auth/models/login-request.model.mjs +0 -6
  42. package/esm2022/lib/core/auth/storage.service.mjs +0 -110
  43. package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +0 -112
  44. package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +0 -55
  45. package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +0 -179
  46. package/esm2022/lib/core/environments/environment.mjs +0 -15
  47. package/esm2022/lib/core/environments/environment.prod.mjs +0 -15
  48. package/esm2022/lib/core/helpers/crypto-helper.service.mjs +0 -52
  49. package/esm2022/lib/core/http/http-stream.service.mjs +0 -97
  50. package/esm2022/lib/core/http/http.service.mjs +0 -103
  51. package/esm2022/lib/core/interceptors/auth.interceptor.mjs +0 -96
  52. package/esm2022/lib/core/interceptors/license.interceptor.mjs +0 -44
  53. package/esm2022/lib/core/models/api-config.model.mjs +0 -18
  54. package/esm2022/lib/core/models/api-request.model.mjs +0 -2
  55. package/esm2022/lib/core/models/api-response.model.mjs +0 -8
  56. package/esm2022/lib/core/models/doohbot-config.model.mjs +0 -18
  57. package/esm2022/lib/core/models/license.model.mjs +0 -2
  58. package/esm2022/lib/core/models/message.mjs +0 -2
  59. package/esm2022/lib/core/models/theme-config.model.mjs +0 -2
  60. package/esm2022/lib/core/services/core-config.service.mjs +0 -52
  61. package/esm2022/lib/core/services/license.service.mjs +0 -145
  62. package/esm2022/lib/core/services/markdown.service.mjs +0 -64
  63. package/esm2022/lib/core/services/theme.service.mjs +0 -248
  64. package/esm2022/lib/core/types/auth-mode.type.mjs +0 -2
  65. package/esm2022/lib/core/types/auth-status.type.mjs +0 -5
  66. package/esm2022/lib/core/types/chat-stream.type.mjs +0 -2
  67. package/esm2022/lib/core/types/message-role.type.mjs +0 -2
  68. package/esm2022/lib/core/types/prompt-mode.type.mjs +0 -5
  69. package/esm2022/lib/core/types/snackbar-error.type.mjs +0 -5
  70. package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +0 -2
  71. package/esm2022/lib/core/utils/logger.service.mjs +0 -42
  72. package/esm2022/lib/doohbot-input.mjs +0 -20
  73. package/esm2022/lib/doohbot.component.mjs +0 -444
  74. package/esm2022/lib/predefined_messages.mjs +0 -15
  75. package/esm2022/lib/shared/chips/chips.component.mjs +0 -28
  76. package/esm2022/lib/shared/dialog/dialog.component.mjs +0 -36
  77. package/esm2022/lib/shared/dialog/dialog.service.mjs +0 -64
  78. package/esm2022/lib/shared/dialog/dialog.utils.mjs +0 -85
  79. package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +0 -29
  80. package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +0 -38
  81. package/esm2022/lib/shared/menu-item/menu-item.component.mjs +0 -24
  82. package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +0 -27
  83. package/esm2022/lib/shared/snackbar/snackbar.component.mjs +0 -43
  84. package/esm2022/lib/shared/snackbar/snackbar.service.mjs +0 -46
  85. package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +0 -43
  86. package/esm2022/public-api.mjs +0 -37
  87. package/lib/app/chat/chat-ui-state.service.d.ts +0 -96
  88. package/lib/app/chat/chat.service.d.ts +0 -88
  89. package/lib/app/chat/components/chat-button/chat-button.component.d.ts +0 -16
  90. package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +0 -5
  91. package/lib/app/chat/components/chat-header/chat-header.component.d.ts +0 -24
  92. package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +0 -49
  93. package/lib/app/chat/components/chat-window/chat-window.component.d.ts +0 -107
  94. package/lib/app/chat/components/message-input/message-input.component.d.ts +0 -12
  95. package/lib/app/chat/components/message-list/message-list.component.d.ts +0 -40
  96. package/lib/app/chat/model/chat-history.model.d.ts +0 -51
  97. package/lib/app/chat/model/chat-request.model.d.ts +0 -10
  98. package/lib/app/chat/model/chat-response.model.d.ts +0 -9
  99. package/lib/app/chat/model/chat-session.model.d.ts +0 -12
  100. package/lib/app/chat/model/chat-stream-message.model.d.ts +0 -5
  101. package/lib/app/chat/model/chat-stream-response.model.d.ts +0 -10
  102. package/lib/app/chat/services/chat-api.service.d.ts +0 -30
  103. package/lib/app/chat/services/chat-audio.service.d.ts +0 -19
  104. package/lib/app/chat/services/chat-history.service.d.ts +0 -53
  105. package/lib/app/login/login-form.component.d.ts +0 -20
  106. package/lib/app/personalization/personalization-dialog.component.d.ts +0 -53
  107. package/lib/app/personalization/personalization.service.d.ts +0 -66
  108. package/lib/app/personalization/sections/account/account-section.component.d.ts +0 -30
  109. package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +0 -17
  110. package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +0 -27
  111. package/lib/app/personalization/sections/profile/profile-section.component.d.ts +0 -17
  112. package/lib/app/personalization/sections/settings/setting-section.component.d.ts +0 -10
  113. package/lib/app/personalization/sections/terms/terms-section.component.d.ts +0 -5
  114. package/lib/constant/doohbot-constant.d.ts +0 -12
  115. package/lib/constant/html-entities.d.ts +0 -8
  116. package/lib/constant/utf8.d.ts +0 -9
  117. package/lib/core/app-const.d.ts +0 -11
  118. package/lib/core/auth/account-api.service.d.ts +0 -20
  119. package/lib/core/auth/auth.service.d.ts +0 -90
  120. package/lib/core/auth/models/auth-result.model.d.ts +0 -4
  121. package/lib/core/auth/models/federated-login-request.model.d.ts +0 -5
  122. package/lib/core/auth/models/login-request.model.d.ts +0 -6
  123. package/lib/core/auth/storage.service.d.ts +0 -21
  124. package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +0 -23
  125. package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +0 -14
  126. package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +0 -30
  127. package/lib/core/environments/environment.d.ts +0 -7
  128. package/lib/core/environments/environment.prod.d.ts +0 -7
  129. package/lib/core/helpers/crypto-helper.service.d.ts +0 -12
  130. package/lib/core/http/http-stream.service.d.ts +0 -18
  131. package/lib/core/http/http.service.d.ts +0 -20
  132. package/lib/core/interceptors/auth.interceptor.d.ts +0 -18
  133. package/lib/core/interceptors/license.interceptor.d.ts +0 -11
  134. package/lib/core/models/api-config.model.d.ts +0 -58
  135. package/lib/core/models/api-request.model.d.ts +0 -77
  136. package/lib/core/models/api-response.model.d.ts +0 -6
  137. package/lib/core/models/doohbot-config.model.d.ts +0 -81
  138. package/lib/core/models/license.model.d.ts +0 -23
  139. package/lib/core/models/message.d.ts +0 -16
  140. package/lib/core/models/theme-config.model.d.ts +0 -28
  141. package/lib/core/services/core-config.service.d.ts +0 -23
  142. package/lib/core/services/license.service.d.ts +0 -33
  143. package/lib/core/services/markdown.service.d.ts +0 -8
  144. package/lib/core/services/theme.service.d.ts +0 -40
  145. package/lib/core/types/auth-mode.type.d.ts +0 -4
  146. package/lib/core/types/auth-status.type.d.ts +0 -4
  147. package/lib/core/types/chat-stream.type.d.ts +0 -4
  148. package/lib/core/types/message-role.type.d.ts +0 -4
  149. package/lib/core/types/prompt-mode.type.d.ts +0 -4
  150. package/lib/core/types/snackbar-error.type.d.ts +0 -4
  151. package/lib/core/types/tenant-resolution-strategy.type.d.ts +0 -4
  152. package/lib/core/utils/logger.service.d.ts +0 -11
  153. package/lib/doohbot-input.d.ts +0 -19
  154. package/lib/doohbot.component.d.ts +0 -108
  155. package/lib/predefined_messages.d.ts +0 -2
  156. package/lib/shared/chips/chips.component.d.ts +0 -10
  157. package/lib/shared/dialog/dialog.component.d.ts +0 -19
  158. package/lib/shared/dialog/dialog.service.d.ts +0 -29
  159. package/lib/shared/dialog/dialog.utils.d.ts +0 -41
  160. package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +0 -11
  161. package/lib/shared/input-dialog/input-dialog.component.d.ts +0 -20
  162. package/lib/shared/menu-item/menu-item.component.d.ts +0 -9
  163. package/lib/shared/pipes/simple-markdown.pipe.d.ts +0 -10
  164. package/lib/shared/snackbar/snackbar.component.d.ts +0 -14
  165. package/lib/shared/snackbar/snackbar.service.d.ts +0 -19
  166. package/lib/shared/snackbar/snackbar.utils.d.ts +0 -33
  167. package/public-api.d.ts +0 -11
  168. package/src/assets/bot.mp3 +0 -0
@@ -1,312 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { MatIconModule } from '@angular/material/icon';
4
- import { MatMenuModule } from '@angular/material/menu';
5
- import { MatDialog, MatDialogModule } from '@angular/material/dialog';
6
- import { MessageListComponent } from '../message-list/message-list.component';
7
- import { MessageInputComponent } from '../message-input/message-input.component';
8
- import { inject } from '@angular/core';
9
- import { ChatHistorySidebarComponent } from '../chat-history-sidebar/chat-history-sidebar.component';
10
- import { FormsModule } from '@angular/forms';
11
- import { AuthService } from '../../../../core/auth/auth.service';
12
- import { DraggableDialogDirective } from '../../../../core/directives/draggable/draggable-dialog.directive';
13
- import { ResizableDialogDirective } from '../../../../core/directives/resizable/resizable-dialog.directive';
14
- import { ThemeService } from '../../../../core/services/theme.service';
15
- import { ChatHeaderComponent } from '../chat-header/chat-header.component';
16
- import { LoginFormComponent } from '../../../login/login-form.component';
17
- import { ChatFooterComponent } from '../chat-footer/chat-footer.component';
18
- import logger from '../../../../core/utils/logger.service';
19
- import { Chips } from '../../../../shared/chips/chips.component';
20
- import { PersonalizationDialogComponent } from '../../../personalization/personalization-dialog.component';
21
- import * as i0 from "@angular/core";
22
- import * as i1 from "@angular/material/icon";
23
- import * as i2 from "@angular/material/menu";
24
- export class ChatWindowComponent {
25
- get canDrag() {
26
- return this.enableDrag && this.buttonStyle === 'fab' && !this.isFullScreen;
27
- }
28
- get canResize() {
29
- return this.enableResize && this.buttonStyle === 'fab' && !this.isFullScreen;
30
- }
31
- constructor() {
32
- this.isChatOpen = false;
33
- this.enableDrag = false;
34
- this.enableResize = false;
35
- this.isFullScreen = false;
36
- this.isStreaming = true;
37
- this.isAuthenticated = false;
38
- this.appTitle = '';
39
- this.appLogoUrl = '';
40
- this.appTextLogoUrl = '';
41
- this.appHeaderLogoUrl = '';
42
- this.messages = [];
43
- this.isBotTyping = false;
44
- this.appSubtitle = '';
45
- this.welcomeDesc = '';
46
- this.predefinedMessages = [];
47
- this.suggestedMessages = [];
48
- this.botAvatarUrl = '';
49
- this.userAvatarUrl = '';
50
- this.userName = '';
51
- this.trackByMessageId = (index, item) => item.id ?? index;
52
- this.hintText = '';
53
- this.messageError = null;
54
- this.showSuggestionChips = false;
55
- this.isHistorySidebarOpen = false;
56
- this.chatSessions = [];
57
- this.chatHistoryUserName = 'User';
58
- this.isLoggingIn = false;
59
- this.authError = null;
60
- this.authSuccess = null;
61
- this.isLoadingSessions = false;
62
- this.hasMoreSessions = false;
63
- this.isLoadingMoreSessions = false;
64
- this.processingSessionId = null;
65
- this.buttonStyle = 'fab';
66
- this.toggleChat = new EventEmitter();
67
- this.toggleFullScreen = new EventEmitter();
68
- this.toggleHistorySidebar = new EventEmitter();
69
- this.openSettings = new EventEmitter();
70
- this.suggestionClick = new EventEmitter();
71
- this.send = new EventEmitter();
72
- this.stop = new EventEmitter();
73
- this.clearMessageError = new EventEmitter();
74
- this.clearChat = new EventEmitter();
75
- this.sessionSelected = new EventEmitter();
76
- this.sessionDeleted = new EventEmitter();
77
- this.loadMoreSessions = new EventEmitter();
78
- this.refreshSessions = new EventEmitter();
79
- this.sessionRenamed = new EventEmitter();
80
- this.deleteAllSessions = new EventEmitter();
81
- this.loginSubmit = new EventEmitter();
82
- this.logout = new EventEmitter();
83
- this.themeService = inject(ThemeService);
84
- this.authService = inject(AuthService);
85
- this.dialog = inject(MatDialog);
86
- // UI state
87
- this.showLoginForm = false;
88
- }
89
- onToggleChat() {
90
- this.toggleChat.emit();
91
- }
92
- onToggleHistorySidebar() {
93
- logger.log('History button clicked!');
94
- this.toggleHistorySidebar.emit();
95
- }
96
- onLoginClick() {
97
- this.showLoginForm = true;
98
- }
99
- onLoginSubmit(credentials) {
100
- this.loginSubmit.emit(credentials);
101
- }
102
- onCancelLogin() {
103
- this.showLoginForm = false;
104
- }
105
- onToggleFullScreen() {
106
- this.toggleFullScreen.emit();
107
- }
108
- onOpenSettings() {
109
- this.openSettings.emit();
110
- }
111
- onOpenPersonalization() {
112
- this.dialog.open(PersonalizationDialogComponent, {
113
- width: '1100px',
114
- height: '700px',
115
- maxWidth: '95vw',
116
- panelClass: 'personalization-dialog-panel',
117
- });
118
- }
119
- onSuggestionClick(text) {
120
- this.suggestionClick.emit(text);
121
- }
122
- onSend(text) {
123
- this.send.emit(text);
124
- }
125
- onStop() {
126
- this.stop.emit();
127
- }
128
- onClearMessageError() {
129
- this.messageError = null;
130
- this.clearMessageError.emit();
131
- }
132
- onClearAuthError() {
133
- this.clearMessageError.emit();
134
- }
135
- onClearChat() {
136
- this.clearChat.emit();
137
- }
138
- onLogout() {
139
- this.logout.emit();
140
- }
141
- onSessionSelected(session) {
142
- this.sessionSelected.emit(session);
143
- }
144
- onSessionDeleted(sessionId) {
145
- this.sessionDeleted.emit(sessionId);
146
- }
147
- onSessionRenamed(event) {
148
- this.sessionRenamed.emit(event);
149
- }
150
- onDeleteAllSessions() {
151
- this.deleteAllSessions.emit();
152
- }
153
- onPopoutShown(win) {
154
- // Apply theme classes
155
- const activeTheme = this.themeService.activeTheme();
156
- logger.log('Popout shown, applying theme:', activeTheme);
157
- const body = win.document.body;
158
- // We cannot use renderer easily on another document without custom renderer factory,
159
- // but native DOM manipulation is fine here since it's a separate window object.
160
- body.classList.remove('light-theme', 'dark-theme');
161
- body.classList.add(activeTheme);
162
- // Apply CSS variables
163
- this.themeService.applyCssVariables(body, this.themeConfig);
164
- }
165
- ngOnInit() {
166
- // Initialization logic if needed
167
- }
168
- ngOnChanges(changes) {
169
- //? Handle authentication status changes
170
- if (changes['isAuthenticated']) {
171
- if (this.isAuthenticated) {
172
- this.showLoginForm = false;
173
- }
174
- }
175
- //? Handle logging in status changes
176
- if (changes['isLoggingIn']) {
177
- if (this.isLoggingIn) {
178
- this.showLoginForm = false;
179
- }
180
- else if (!this.isAuthenticated && !changes['isLoggingIn'].firstChange) {
181
- this.showLoginForm = true;
182
- }
183
- }
184
- }
185
- ngOnDestroy() { }
186
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
187
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ChatWindowComponent, isStandalone: true, selector: "app-chat-window", inputs: { isChatOpen: "isChatOpen", enableDrag: "enableDrag", enableResize: "enableResize", isFullScreen: "isFullScreen", isStreaming: "isStreaming", isAuthenticated: "isAuthenticated", appTitle: "appTitle", appLogoUrl: "appLogoUrl", appTextLogoUrl: "appTextLogoUrl", appHeaderLogoUrl: "appHeaderLogoUrl", messages: "messages", isBotTyping: "isBotTyping", appSubtitle: "appSubtitle", welcomeDesc: "welcomeDesc", predefinedMessages: "predefinedMessages", suggestedMessages: "suggestedMessages", botAvatarUrl: "botAvatarUrl", userAvatarUrl: "userAvatarUrl", userName: "userName", trackByMessageId: "trackByMessageId", hintText: "hintText", messageError: "messageError", showSuggestionChips: "showSuggestionChips", isHistorySidebarOpen: "isHistorySidebarOpen", chatSessions: "chatSessions", chatHistoryUserName: "chatHistoryUserName", isLoggingIn: "isLoggingIn", authError: "authError", authSuccess: "authSuccess", isLoadingSessions: "isLoadingSessions", hasMoreSessions: "hasMoreSessions", isLoadingMoreSessions: "isLoadingMoreSessions", processingSessionId: "processingSessionId", themeConfig: "themeConfig", buttonStyle: "buttonStyle" }, outputs: { toggleChat: "toggleChat", toggleFullScreen: "toggleFullScreen", toggleHistorySidebar: "toggleHistorySidebar", openSettings: "openSettings", suggestionClick: "suggestionClick", send: "send", stop: "stop", clearMessageError: "clearMessageError", clearChat: "clearChat", sessionSelected: "sessionSelected", sessionDeleted: "sessionDeleted", loadMoreSessions: "loadMoreSessions", refreshSessions: "refreshSessions", sessionRenamed: "sessionRenamed", deleteAllSessions: "deleteAllSessions", loginSubmit: "loginSubmit", logout: "logout" }, usesOnChanges: true, ngImport: i0, template: "@if (isChatOpen) {\r\n <div\r\n draggableDialog\r\n [enableDrag]=\"canDrag\"\r\n resizableDialog\r\n [enableResize]=\"canResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n [class.layout-sidebar]=\"buttonStyle.includes('sidebar')\"\r\n >\r\n <!-- chat window header -->\r\n <app-chat-header\r\n [appHeaderLogoUrl]=\"appHeaderLogoUrl\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isFullScreen]=\"isFullScreen\"\r\n [settingsMenu]=\"settingsMenu\"\r\n [isNewChatDisabled]=\"messages.length === 0\"\r\n (toggleChat)=\"onToggleChat()\"\r\n (toggleFullScreen)=\"onToggleFullScreen()\"\r\n (toggleHistorySidebar)=\"onToggleHistorySidebar()\"\r\n (clearChat)=\"onClearChat()\"\r\n ></app-chat-header>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [class.sidebar-closed]=\"!isHistorySidebarOpen\"\r\n [sessions]=\"chatSessions\"\r\n [isOpen]=\"isHistorySidebarOpen\"\r\n [userName]=\"chatHistoryUserName\"\r\n [isLoading]=\"isLoadingSessions\"\r\n [hasMoreSessions]=\"hasMoreSessions\"\r\n [isLoadingMore]=\"isLoadingMoreSessions\"\r\n [processingSessionId]=\"processingSessionId\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (loadMore)=\"loadMoreSessions.emit()\"\r\n (refresh)=\"refreshSessions.emit()\"\r\n (sessionRenamed)=\"onSessionRenamed($event)\"\r\n (deleteAll)=\"onDeleteAllSessions()\"\r\n (closed)=\"onToggleHistorySidebar()\"\r\n >\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen && !isFullScreen\">\r\n <!-- Messages / Welcome Screen -->\r\n @if (!showLoginForm) {\r\n <app-message-list\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [isStreaming]=\"isStreaming\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isLoggingIn]=\"isLoggingIn\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n (loginClick)=\"onLoginClick()\"\r\n ></app-message-list>\r\n }\r\n\r\n @if (showSuggestionChips && isAuthenticated) {\r\n <app-chips\r\n [messages]=\"suggestedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n }\r\n\r\n <!-- Chat Input: Only show when authenticated -->\r\n @if (isAuthenticated) {\r\n <app-message-input\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n (send)=\"onSend($event)\"\r\n (stop)=\"onStop()\"\r\n ></app-message-input>\r\n }\r\n\r\n <!-- Login Form -->\r\n @if (showLoginForm && !isAuthenticated) {\r\n <app-login-form\r\n [isLoggingIn]=\"isLoggingIn\"\r\n (loginSubmit)=\"onLoginSubmit($event)\"\r\n (cancel)=\"onCancelLogin()\"\r\n ></app-login-form>\r\n }\r\n\r\n <!-- Auth error snackbar (login/logout errors only) -->\r\n <!-- <app-snackbar\r\n *ngIf=\"authError\"\r\n [message]=\"authError\"\r\n (closed)=\"onClearAuthError()\"\r\n ></app-snackbar> -->\r\n\r\n <!-- footer -->\r\n <app-chat-footer></app-chat-footer>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Personalization -->\r\n @if (isAuthenticated) {\r\n <button\r\n mat-menu-item\r\n (click)=\"onOpenPersonalization()\"\r\n style=\"display: flex; align-items: center\"\r\n >\r\n <mat-icon>settings_suggest</mat-icon>\r\n <span>Personalization</span>\r\n </button>\r\n }\r\n\r\n <!-- Change Theme -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n @if (isAuthenticated && messages.length > 0) {\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon> clear_all</mat-icon>\r\n <span>End Chat</span>\r\n </button>\r\n }\r\n\r\n <!-- Logout -->\r\n @if (isAuthenticated) {\r\n <button mat-menu-item (click)=\"onLogout()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n }\r\n</mat-menu>\r\n", styles: [".doohbot-container{position:fixed;bottom:20px;right:20px;z-index:1000}.chat-window{width:clamp(400px,30vw,450px);height:clamp(620px,70vh,660px);background-color:var(--background-color);border-radius:20px;border-color:var(--border-color);box-shadow:var(--border-shadow-color);display:flex;flex-direction:column;overflow:hidden;animation:slide-in .5s ease;position:fixed;right:20px;bottom:20px;-webkit-user-select:none;user-select:none;cursor:move}.chat-window:active{cursor:grabbing}@media (max-width: 768px){.chat-window{width:95%;height:calc(100vh - 20px)}}.chat-window.layout-sidebar{height:100vh;top:0;bottom:0;right:0;width:clamp(400px,25vw,450px);border-radius:20px 0 0 20px;animation:slide-in-sidebar .4s ease-out}.chat-window.layout-sidebar.fullscreen{width:100vw;height:100vh;border-radius:0;transform:none;top:0;left:0}@keyframes slide-in-sidebar{0%{transform:translate(100%)}to{transform:translate(0)}}@media (max-width: 480px){.chat-window{width:90%;height:calc(100vh - 40px)}}.chat-window.fullscreen{width:100vw;height:100vh;border-radius:0;position:fixed;top:0;left:0;transform:none;-webkit-user-select:none;user-select:none}.chat-content-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}.chat-content-wrapper app-chat-history-sidebar{height:100%;width:100%;display:flex;flex-direction:column;flex:1;min-height:0}.chat-window.fullscreen .chat-content-wrapper{flex-direction:row}.chat-window.fullscreen app-chat-history-sidebar{width:260px;flex:0 0 260px;border-right:1px solid var(--border-color)}.chat-window.fullscreen app-chat-history-sidebar.sidebar-closed{display:none}.messages-view{display:flex;flex-direction:column;height:100%;width:100%}.messages-view.hidden{display:none}.messages-view app-message-list,.messages-view app-login-form{flex:1;min-height:0}.messages-view app-snackbar{flex-shrink:0;margin-top:auto}.messages-view app-message-input{flex-shrink:0}.theme-selector{display:flex;align-items:center;padding:4px 12px;gap:8px}.theme-btn{background:none;border:none;color:var(--white);transition:color .2s ease}.theme-btn.selected{color:var(--primary-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "component", type: Chips, selector: "app-chips", inputs: ["messages", "disabled"], outputs: ["chipClick"] }, { kind: "component", type: MessageListComponent, selector: "app-message-list", inputs: ["messages", "isBotTyping", "isStreaming", "appLogoUrl", "appSubtitle", "welcomeDesc", "predefinedMessages", "botAvatarUrl", "userAvatarUrl", "userName", "isAuthenticated", "isLoggingIn", "trackByMessageId"], outputs: ["suggestionClick", "loginClick"] }, { kind: "component", type: MessageInputComponent, selector: "app-message-input", inputs: ["isBotTyping", "hintText"], outputs: ["send", "stop"] }, { kind: "directive", type: DraggableDialogDirective, selector: "[draggableDialog]", inputs: ["dragHandle", "enableDrag"] }, { kind: "directive", type: ResizableDialogDirective, selector: "[resizableDialog]", inputs: ["enableResize"] }, { kind: "component", type: ChatHistorySidebarComponent, selector: "app-chat-history-sidebar", inputs: ["sessions", "isOpen", "userName", "isLoading", "hasMoreSessions", "isLoadingMore", "processingSessionId"], outputs: ["sessionSelected", "sessionDeleted", "closed", "loadMore", "refresh", "sessionRenamed", "deleteAll"] }, { kind: "component", type: ChatHeaderComponent, selector: "app-chat-header", inputs: ["appHeaderLogoUrl", "isAuthenticated", "isFullScreen", "settingsMenu", "isNewChatDisabled"], outputs: ["toggleChat", "toggleFullScreen", "toggleHistorySidebar", "clearChat"] }, { kind: "component", type: LoginFormComponent, selector: "app-login-form", inputs: ["isLoggingIn"], outputs: ["loginSubmit", "cancel"] }, { kind: "component", type: ChatFooterComponent, selector: "app-chat-footer" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatDialogModule }] }); }
188
- }
189
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWindowComponent, decorators: [{
190
- type: Component,
191
- args: [{ selector: 'app-chat-window', standalone: true, imports: [
192
- CommonModule,
193
- MatIconModule,
194
- MatMenuModule,
195
- Chips,
196
- MessageListComponent,
197
- MessageInputComponent,
198
- DraggableDialogDirective,
199
- ResizableDialogDirective,
200
- ChatHistorySidebarComponent,
201
- ChatHeaderComponent,
202
- LoginFormComponent,
203
- ChatFooterComponent,
204
- FormsModule,
205
- MatDialogModule,
206
- ], template: "@if (isChatOpen) {\r\n <div\r\n draggableDialog\r\n [enableDrag]=\"canDrag\"\r\n resizableDialog\r\n [enableResize]=\"canResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n [class.layout-sidebar]=\"buttonStyle.includes('sidebar')\"\r\n >\r\n <!-- chat window header -->\r\n <app-chat-header\r\n [appHeaderLogoUrl]=\"appHeaderLogoUrl\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isFullScreen]=\"isFullScreen\"\r\n [settingsMenu]=\"settingsMenu\"\r\n [isNewChatDisabled]=\"messages.length === 0\"\r\n (toggleChat)=\"onToggleChat()\"\r\n (toggleFullScreen)=\"onToggleFullScreen()\"\r\n (toggleHistorySidebar)=\"onToggleHistorySidebar()\"\r\n (clearChat)=\"onClearChat()\"\r\n ></app-chat-header>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [class.sidebar-closed]=\"!isHistorySidebarOpen\"\r\n [sessions]=\"chatSessions\"\r\n [isOpen]=\"isHistorySidebarOpen\"\r\n [userName]=\"chatHistoryUserName\"\r\n [isLoading]=\"isLoadingSessions\"\r\n [hasMoreSessions]=\"hasMoreSessions\"\r\n [isLoadingMore]=\"isLoadingMoreSessions\"\r\n [processingSessionId]=\"processingSessionId\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (loadMore)=\"loadMoreSessions.emit()\"\r\n (refresh)=\"refreshSessions.emit()\"\r\n (sessionRenamed)=\"onSessionRenamed($event)\"\r\n (deleteAll)=\"onDeleteAllSessions()\"\r\n (closed)=\"onToggleHistorySidebar()\"\r\n >\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen && !isFullScreen\">\r\n <!-- Messages / Welcome Screen -->\r\n @if (!showLoginForm) {\r\n <app-message-list\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [isStreaming]=\"isStreaming\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isLoggingIn]=\"isLoggingIn\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n (loginClick)=\"onLoginClick()\"\r\n ></app-message-list>\r\n }\r\n\r\n @if (showSuggestionChips && isAuthenticated) {\r\n <app-chips\r\n [messages]=\"suggestedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n }\r\n\r\n <!-- Chat Input: Only show when authenticated -->\r\n @if (isAuthenticated) {\r\n <app-message-input\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n (send)=\"onSend($event)\"\r\n (stop)=\"onStop()\"\r\n ></app-message-input>\r\n }\r\n\r\n <!-- Login Form -->\r\n @if (showLoginForm && !isAuthenticated) {\r\n <app-login-form\r\n [isLoggingIn]=\"isLoggingIn\"\r\n (loginSubmit)=\"onLoginSubmit($event)\"\r\n (cancel)=\"onCancelLogin()\"\r\n ></app-login-form>\r\n }\r\n\r\n <!-- Auth error snackbar (login/logout errors only) -->\r\n <!-- <app-snackbar\r\n *ngIf=\"authError\"\r\n [message]=\"authError\"\r\n (closed)=\"onClearAuthError()\"\r\n ></app-snackbar> -->\r\n\r\n <!-- footer -->\r\n <app-chat-footer></app-chat-footer>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Personalization -->\r\n @if (isAuthenticated) {\r\n <button\r\n mat-menu-item\r\n (click)=\"onOpenPersonalization()\"\r\n style=\"display: flex; align-items: center\"\r\n >\r\n <mat-icon>settings_suggest</mat-icon>\r\n <span>Personalization</span>\r\n </button>\r\n }\r\n\r\n <!-- Change Theme -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n @if (isAuthenticated && messages.length > 0) {\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon> clear_all</mat-icon>\r\n <span>End Chat</span>\r\n </button>\r\n }\r\n\r\n <!-- Logout -->\r\n @if (isAuthenticated) {\r\n <button mat-menu-item (click)=\"onLogout()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n }\r\n</mat-menu>\r\n", styles: [".doohbot-container{position:fixed;bottom:20px;right:20px;z-index:1000}.chat-window{width:clamp(400px,30vw,450px);height:clamp(620px,70vh,660px);background-color:var(--background-color);border-radius:20px;border-color:var(--border-color);box-shadow:var(--border-shadow-color);display:flex;flex-direction:column;overflow:hidden;animation:slide-in .5s ease;position:fixed;right:20px;bottom:20px;-webkit-user-select:none;user-select:none;cursor:move}.chat-window:active{cursor:grabbing}@media (max-width: 768px){.chat-window{width:95%;height:calc(100vh - 20px)}}.chat-window.layout-sidebar{height:100vh;top:0;bottom:0;right:0;width:clamp(400px,25vw,450px);border-radius:20px 0 0 20px;animation:slide-in-sidebar .4s ease-out}.chat-window.layout-sidebar.fullscreen{width:100vw;height:100vh;border-radius:0;transform:none;top:0;left:0}@keyframes slide-in-sidebar{0%{transform:translate(100%)}to{transform:translate(0)}}@media (max-width: 480px){.chat-window{width:90%;height:calc(100vh - 40px)}}.chat-window.fullscreen{width:100vw;height:100vh;border-radius:0;position:fixed;top:0;left:0;transform:none;-webkit-user-select:none;user-select:none}.chat-content-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}.chat-content-wrapper app-chat-history-sidebar{height:100%;width:100%;display:flex;flex-direction:column;flex:1;min-height:0}.chat-window.fullscreen .chat-content-wrapper{flex-direction:row}.chat-window.fullscreen app-chat-history-sidebar{width:260px;flex:0 0 260px;border-right:1px solid var(--border-color)}.chat-window.fullscreen app-chat-history-sidebar.sidebar-closed{display:none}.messages-view{display:flex;flex-direction:column;height:100%;width:100%}.messages-view.hidden{display:none}.messages-view app-message-list,.messages-view app-login-form{flex:1;min-height:0}.messages-view app-snackbar{flex-shrink:0;margin-top:auto}.messages-view app-message-input{flex-shrink:0}.theme-selector{display:flex;align-items:center;padding:4px 12px;gap:8px}.theme-btn{background:none;border:none;color:var(--white);transition:color .2s ease}.theme-btn.selected{color:var(--primary-color)}\n"] }]
207
- }], ctorParameters: () => [], propDecorators: { isChatOpen: [{
208
- type: Input
209
- }], enableDrag: [{
210
- type: Input
211
- }], enableResize: [{
212
- type: Input
213
- }], isFullScreen: [{
214
- type: Input
215
- }], isStreaming: [{
216
- type: Input
217
- }], isAuthenticated: [{
218
- type: Input
219
- }], appTitle: [{
220
- type: Input
221
- }], appLogoUrl: [{
222
- type: Input
223
- }], appTextLogoUrl: [{
224
- type: Input
225
- }], appHeaderLogoUrl: [{
226
- type: Input
227
- }], messages: [{
228
- type: Input
229
- }], isBotTyping: [{
230
- type: Input
231
- }], appSubtitle: [{
232
- type: Input
233
- }], welcomeDesc: [{
234
- type: Input
235
- }], predefinedMessages: [{
236
- type: Input
237
- }], suggestedMessages: [{
238
- type: Input
239
- }], botAvatarUrl: [{
240
- type: Input
241
- }], userAvatarUrl: [{
242
- type: Input
243
- }], userName: [{
244
- type: Input
245
- }], trackByMessageId: [{
246
- type: Input
247
- }], hintText: [{
248
- type: Input
249
- }], messageError: [{
250
- type: Input
251
- }], showSuggestionChips: [{
252
- type: Input
253
- }], isHistorySidebarOpen: [{
254
- type: Input
255
- }], chatSessions: [{
256
- type: Input
257
- }], chatHistoryUserName: [{
258
- type: Input
259
- }], isLoggingIn: [{
260
- type: Input
261
- }], authError: [{
262
- type: Input
263
- }], authSuccess: [{
264
- type: Input
265
- }], isLoadingSessions: [{
266
- type: Input
267
- }], hasMoreSessions: [{
268
- type: Input
269
- }], isLoadingMoreSessions: [{
270
- type: Input
271
- }], processingSessionId: [{
272
- type: Input
273
- }], themeConfig: [{
274
- type: Input
275
- }], buttonStyle: [{
276
- type: Input
277
- }], toggleChat: [{
278
- type: Output
279
- }], toggleFullScreen: [{
280
- type: Output
281
- }], toggleHistorySidebar: [{
282
- type: Output
283
- }], openSettings: [{
284
- type: Output
285
- }], suggestionClick: [{
286
- type: Output
287
- }], send: [{
288
- type: Output
289
- }], stop: [{
290
- type: Output
291
- }], clearMessageError: [{
292
- type: Output
293
- }], clearChat: [{
294
- type: Output
295
- }], sessionSelected: [{
296
- type: Output
297
- }], sessionDeleted: [{
298
- type: Output
299
- }], loadMoreSessions: [{
300
- type: Output
301
- }], refreshSessions: [{
302
- type: Output
303
- }], sessionRenamed: [{
304
- type: Output
305
- }], deleteAllSessions: [{
306
- type: Output
307
- }], loginSubmit: [{
308
- type: Output
309
- }], logout: [{
310
- type: Output
311
- }] } });
312
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9vaGJvdC9zcmMvbGliL2FwcC9jaGF0L2NvbXBvbmVudHMvY2hhdC13aW5kb3cvY2hhdC13aW5kb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9vaGJvdC9zcmMvbGliL2FwcC9jaGF0L2NvbXBvbmVudHMvY2hhdC13aW5kb3cvY2hhdC13aW5kb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FNUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDckcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUM1RyxPQUFPLEVBQUUsd0JBQXdCLEVB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LGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBS0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBUcmFja0J5RnVuY3Rpb24sXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIE9uQ2hhbmdlcyxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWVzc2FnZUxpc3RDb21wb25lbnQgfSBmcm9tICcuLi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1lc3NhZ2VJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL21lc3NhZ2UtaW5wdXQvbWVzc2FnZS1pbnB1dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2hhdEhpc3RvcnlTaWRlYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hhdC1oaXN0b3J5LXNpZGViYXIvY2hhdC1oaXN0b3J5LXNpZGViYXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9hdXRoL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IERyYWdnYWJsZURpYWxvZ0RpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvZGlyZWN0aXZlcy9kcmFnZ2FibGUvZHJhZ2dhYmxlLWRpYWxvZy5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBSZXNpemFibGVEaWFsb2dEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2RpcmVjdGl2ZXMvcmVzaXphYmxlL3Jlc2l6YWJsZS1kaWFsb2cuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL21lc3NhZ2UnO1xyXG5pbXBvcnQgeyBEb29oYm90VGhlbWVDb25maWcgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy90aGVtZS1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3RoZW1lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDaGF0SGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hhdC1oZWFkZXIvY2hhdC1oZWFkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTG9naW5Gb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vbG9naW4vbG9naW4tZm9ybS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGF0Rm9vdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hhdC1mb290ZXIvY2hhdC1mb290ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzL2xvZ2dlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2hpcHMgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvY2hpcHMvY2hpcHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2hhdFNlc3Npb24gfSBmcm9tICcuLi8uLi9tb2RlbC9jaGF0LXNlc3Npb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBQZXJzb25hbGl6YXRpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9wZXJzb25hbGl6YXRpb24vcGVyc29uYWxpemF0aW9uLWRpYWxvZy5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtY2hhdC13aW5kb3cnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdE1lbnVNb2R1bGUsXHJcbiAgICBDaGlwcyxcclxuICAgIE1lc3NhZ2VMaXN0Q29tcG9uZW50LFxyXG4gICAgTWVzc2FnZUlucHV0Q29tcG9uZW50LFxyXG4gICAgRHJhZ2dhYmxlRGlhbG9nRGlyZWN0aXZlLFxyXG4gICAgUmVzaXphYmxlRGlhbG9nRGlyZWN0aXZlLFxyXG4gICAgQ2hhdEhpc3RvcnlTaWRlYmFyQ29tcG9uZW50LFxyXG4gICAgQ2hhdEhlYWRlckNvbXBvbmVudCxcclxuICAgIExvZ2luRm9ybUNvbXBvbmVudCxcclxuICAgIENoYXRGb290ZXJDb21wb25lbnQsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIE1hdERpYWxvZ01vZHVsZSxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGF0LXdpbmRvdy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2hhdC13aW5kb3cuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENoYXRXaW5kb3dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBpc0NoYXRPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZW5hYmxlRHJhZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGVuYWJsZVJlc2l6ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGlzRnVsbFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGlzU3RyZWFtaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBpc0F1dGhlbnRpY2F0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBhcHBUaXRsZTogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgYXBwTG9nb1VybDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgYXBwVGV4dExvZ29Vcmw6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGFwcEhlYWRlckxvZ29Vcmw6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIG1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcclxuICBASW5wdXQoKSBpc0JvdFR5cGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFwcFN1YnRpdGxlOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB3ZWxjb21lRGVzYzogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgcHJlZGVmaW5lZE1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHN1Z2dlc3RlZE1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGJvdEF2YXRhclVybDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgdXNlckF2YXRhclVybDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgdXNlck5hbWU6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIHRyYWNrQnlNZXNzYWdlSWQ6IFRyYWNrQnlGdW5jdGlvbjxNZXNzYWdlPiA9IChpbmRleCwgaXRlbSkgPT4gaXRlbS5pZCA/PyBpbmRleDtcclxuICBASW5wdXQoKSBoaW50VGV4dDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgbWVzc2FnZUVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBzaG93U3VnZ2VzdGlvbkNoaXBzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgaXNIaXN0b3J5U2lkZWJhck9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjaGF0U2Vzc2lvbnM6IENoYXRTZXNzaW9uW10gPSBbXTtcclxuICBASW5wdXQoKSBjaGF0SGlzdG9yeVVzZXJOYW1lOiBzdHJpbmcgPSAnVXNlcic7XHJcblxyXG4gIEBJbnB1dCgpIGlzTG9nZ2luZ0luOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgYXV0aEVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBhdXRoU3VjY2Vzczogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgaXNMb2FkaW5nU2Vzc2lvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBoYXNNb3JlU2Vzc2lvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBpc0xvYWRpbmdNb3JlU2Vzc2lvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwcm9jZXNzaW5nU2Vzc2lvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSB0aGVtZUNvbmZpZzogRG9vaGJvdFRoZW1lQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGJ1dHRvblN0eWxlOiBzdHJpbmcgPSAnZmFiJztcclxuXHJcbiAgQE91dHB1dCgpIHRvZ2dsZUNoYXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIHRvZ2dsZUZ1bGxTY3JlZW4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIHRvZ2dsZUhpc3RvcnlTaWRlYmFyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBvcGVuU2V0dGluZ3MgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIHN1Z2dlc3Rpb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBzZW5kID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIHN0b3AgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGNsZWFyTWVzc2FnZUVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBjbGVhckNoYXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIHNlc3Npb25TZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdFNlc3Npb24+KCk7XHJcbiAgQE91dHB1dCgpIHNlc3Npb25EZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGxvYWRNb3JlU2Vzc2lvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIHJlZnJlc2hTZXNzaW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgc2Vzc2lvblJlbmFtZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2Vzc2lvbklkOiBzdHJpbmc7IG5ld1RpdGxlOiBzdHJpbmcgfT4oKTtcclxuICBAT3V0cHV0KCkgZGVsZXRlQWxsU2Vzc2lvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBsb2dpblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgdXNlcm5hbWU6IHN0cmluZztcclxuICAgIHBhc3N3b3JkOiBzdHJpbmc7XHJcbiAgICByZW1lbWJlck1lOiBib29sZWFuO1xyXG4gIH0+KCk7XHJcbiAgQE91dHB1dCgpIGxvZ291dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHRoZW1lU2VydmljZSA9IGluamVjdChUaGVtZVNlcnZpY2UpO1xyXG4gIHB1YmxpYyBhdXRoU2VydmljZSA9IGluamVjdChBdXRoU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBkaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcclxuXHJcbiAgLy8gVUkgc3RhdGVcclxuICBwdWJsaWMgc2hvd0xvZ2luRm9ybSA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgZ2V0IGNhbkRyYWcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmFibGVEcmFnICYmIHRoaXMuYnV0dG9uU3R5bGUgPT09ICdmYWInICYmICF0aGlzLmlzRnVsbFNjcmVlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2FuUmVzaXplKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlUmVzaXplICYmIHRoaXMuYnV0dG9uU3R5bGUgPT09ICdmYWInICYmICF0aGlzLmlzRnVsbFNjcmVlbjtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgb25Ub2dnbGVDaGF0KCkge1xyXG4gICAgdGhpcy50b2dnbGVDaGF0LmVtaXQoKTtcclxuICB9XHJcblxyXG4gIG9uVG9nZ2xlSGlzdG9yeVNpZGViYXIoKSB7XHJcbiAgICBsb2dnZXIubG9nKCdIaXN0b3J5IGJ1dHRvbiBjbGlja2VkIScpO1xyXG4gICAgdGhpcy50b2dnbGVIaXN0b3J5U2lkZWJhci5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvbkxvZ2luQ2xpY2soKSB7XHJcbiAgICB0aGlzLnNob3dMb2dpbkZvcm0gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25Mb2dpblN1Ym1pdChjcmVkZW50aWFsczogeyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nOyByZW1lbWJlck1lOiBib29sZWFuIH0pIHtcclxuICAgIHRoaXMubG9naW5TdWJtaXQuZW1pdChjcmVkZW50aWFscyk7XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbExvZ2luKCkge1xyXG4gICAgdGhpcy5zaG93TG9naW5Gb3JtID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvblRvZ2dsZUZ1bGxTY3JlZW4oKSB7XHJcbiAgICB0aGlzLnRvZ2dsZUZ1bGxTY3JlZW4uZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuU2V0dGluZ3MoKSB7XHJcbiAgICB0aGlzLm9wZW5TZXR0aW5ncy5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvbk9wZW5QZXJzb25hbGl6YXRpb24oKSB7XHJcbiAgICB0aGlzLmRpYWxvZy5vcGVuKFBlcnNvbmFsaXphdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICB3aWR0aDogJzExMDBweCcsXHJcbiAgICAgIGhlaWdodDogJzcwMHB4JyxcclxuICAgICAgbWF4V2lkdGg6ICc5NXZ3JyxcclxuICAgICAgcGFuZWxDbGFzczogJ3BlcnNvbmFsaXphdGlvbi1kaWFsb2ctcGFuZWwnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblN1Z2dlc3Rpb25DbGljayh0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3VnZ2VzdGlvbkNsaWNrLmVtaXQodGV4dCk7XHJcbiAgfVxyXG5cclxuICBvblNlbmQodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlbmQuZW1pdCh0ZXh0KTtcclxuICB9XHJcblxyXG4gIG9uU3RvcCgpIHtcclxuICAgIHRoaXMuc3RvcC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyTWVzc2FnZUVycm9yKCkge1xyXG4gICAgdGhpcy5tZXNzYWdlRXJyb3IgPSBudWxsO1xyXG4gICAgdGhpcy5jbGVhck1lc3NhZ2VFcnJvci5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyQXV0aEVycm9yKCkge1xyXG4gICAgdGhpcy5jbGVhck1lc3NhZ2VFcnJvci5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyQ2hhdCgpIHtcclxuICAgIHRoaXMuY2xlYXJDaGF0LmVtaXQoKTtcclxuICB9XHJcblxyXG4gIG9uTG9nb3V0KCkge1xyXG4gICAgdGhpcy5sb2dvdXQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25TZXNzaW9uU2VsZWN0ZWQoc2Vzc2lvbjogQ2hhdFNlc3Npb24pIHtcclxuICAgIHRoaXMuc2Vzc2lvblNlbGVjdGVkLmVtaXQoc2Vzc2lvbik7XHJcbiAgfVxyXG5cclxuICBvblNlc3Npb25EZWxldGVkKHNlc3Npb25JZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlc3Npb25EZWxldGVkLmVtaXQoc2Vzc2lvbklkKTtcclxuICB9XHJcblxyXG4gIG9uU2Vzc2lvblJlbmFtZWQoZXZlbnQ6IHsgc2Vzc2lvbklkOiBzdHJpbmc7IG5ld1RpdGxlOiBzdHJpbmcgfSkge1xyXG4gICAgdGhpcy5zZXNzaW9uUmVuYW1lZC5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIG9uRGVsZXRlQWxsU2Vzc2lvbnMoKSB7XHJcbiAgICB0aGlzLmRlbGV0ZUFsbFNlc3Npb25zLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIG9uUG9wb3V0U2hvd24od2luOiBXaW5kb3cpIHtcclxuICAgIC8vIEFwcGx5IHRoZW1lIGNsYXNzZXNcclxuICAgIGNvbnN0IGFjdGl2ZVRoZW1lID0gdGhpcy50aGVtZVNlcnZpY2UuYWN0aXZlVGhlbWUoKTtcclxuICAgIGxvZ2dlci5sb2coJ1BvcG91dCBzaG93biwgYXBwbHlpbmcgdGhlbWU6JywgYWN0aXZlVGhlbWUpO1xyXG5cclxuICAgIGNvbnN0IGJvZHkgPSB3aW4uZG9jdW1lbnQuYm9keTtcclxuICAgIC8vIFdlIGNhbm5vdCB1c2UgcmVuZGVyZXIgZWFzaWx5IG9uIGFub3RoZXIgZG9jdW1lbnQgd2l0aG91dCBjdXN0b20gcmVuZGVyZXIgZmFjdG9yeSxcclxuICAgIC8vIGJ1dCBuYXRpdmUgRE9NIG1hbmlwdWxhdGlvbiBpcyBmaW5lIGhlcmUgc2luY2UgaXQncyBhIHNlcGFyYXRlIHdpbmRvdyBvYmplY3QuXHJcbiAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2xpZ2h0LXRoZW1lJywgJ2RhcmstdGhlbWUnKTtcclxuICAgIGJvZHkuY2xhc3NMaXN0LmFkZChhY3RpdmVUaGVtZSk7XHJcblxyXG4gICAgLy8gQXBwbHkgQ1NTIHZhcmlhYmxlc1xyXG4gICAgdGhpcy50aGVtZVNlcnZpY2UuYXBwbHlDc3NWYXJpYWJsZXMoYm9keSwgdGhpcy50aGVtZUNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vIEluaXRpYWxpemF0aW9uIGxvZ2ljIGlmIG5lZWRlZFxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgLy8/IEhhbmRsZSBhdXRoZW50aWNhdGlvbiBzdGF0dXMgY2hhbmdlc1xyXG4gICAgaWYgKGNoYW5nZXNbJ2lzQXV0aGVudGljYXRlZCddKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICAgIHRoaXMuc2hvd0xvZ2luRm9ybSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8/IEhhbmRsZSBsb2dnaW5nIGluIHN0YXR1cyBjaGFuZ2VzXHJcbiAgICBpZiAoY2hhbmdlc1snaXNMb2dnaW5nSW4nXSkge1xyXG4gICAgICBpZiAodGhpcy5pc0xvZ2dpbmdJbikge1xyXG4gICAgICAgIHRoaXMuc2hvd0xvZ2luRm9ybSA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzQXV0aGVudGljYXRlZCAmJiAhY2hhbmdlc1snaXNMb2dnaW5nSW4nXS5maXJzdENoYW5nZSkge1xyXG4gICAgICAgIHRoaXMuc2hvd0xvZ2luRm9ybSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge31cclxufVxyXG4iLCJAaWYgKGlzQ2hhdE9wZW4pIHtcclxuICA8ZGl2XHJcbiAgICBkcmFnZ2FibGVEaWFsb2dcclxuICAgIFtlbmFibGVEcmFnXT1cImNhbkRyYWdcIlxyXG4gICAgcmVzaXphYmxlRGlhbG9nXHJcbiAgICBbZW5hYmxlUmVzaXplXT1cImNhblJlc2l6ZVwiXHJcbiAgICBjbGFzcz1cImNoYXQtd2luZG93XCJcclxuICAgIFtjbGFzcy5mdWxsc2NyZWVuXT1cImlzRnVsbFNjcmVlblwiXHJcbiAgICBbY2xhc3MubGF5b3V0LXNpZGViYXJdPVwiYnV0dG9uU3R5bGUuaW5jbHVkZXMoJ3NpZGViYXInKVwiXHJcbiAgPlxyXG4gICAgPCEtLSBjaGF0IHdpbmRvdyBoZWFkZXIgLS0+XHJcbiAgICA8YXBwLWNoYXQtaGVhZGVyXHJcbiAgICAgIFthcHBIZWFkZXJMb2dvVXJsXT1cImFwcEhlYWRlckxvZ29VcmxcIlxyXG4gICAgICBbaXNBdXRoZW50aWNhdGVkXT1cImlzQXV0aGVudGljYXRlZFwiXHJcbiAgICAgIFtpc0Z1bGxTY3JlZW5dPVwiaXNGdWxsU2NyZWVuXCJcclxuICAgICAgW3NldHRpbmdzTWVudV09XCJzZXR0aW5nc01lbnVcIlxyXG4gICAgICBbaXNOZXdDaGF0RGlzYWJsZWRdPVwibWVzc2FnZXMubGVuZ3RoID09PSAwXCJcclxuICAgICAgKHRvZ2dsZUNoYXQpPVwib25Ub2dnbGVDaGF0KClcIlxyXG4gICAgICAodG9nZ2xlRnVsbFNjcmVlbik9XCJvblRvZ2dsZUZ1bGxTY3JlZW4oKVwiXHJcbiAgICAgICh0b2dnbGVIaXN0b3J5U2lkZWJhcik9XCJvblRvZ2dsZUhpc3RvcnlTaWRlYmFyKClcIlxyXG4gICAgICAoY2xlYXJDaGF0KT1cIm9uQ2xlYXJDaGF0KClcIlxyXG4gICAgPjwvYXBwLWNoYXQtaGVhZGVyPlxyXG5cclxuICAgIDwhLS0gTWFpbiBDb250ZW50IEFyZWE6IFRvZ2dsZSBiZXR3ZWVuIE1lc3NhZ2VzIGFuZCBIaXN0b3J5IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNoYXQtY29udGVudC13cmFwcGVyXCI+XHJcbiAgICAgIDwhLS0gQ2hhdCBIaXN0b3J5IFZpZXcgLS0+XHJcbiAgICAgIDxhcHAtY2hhdC1oaXN0b3J5LXNpZGViYXJcclxuICAgICAgICBbY2xhc3Muc2lkZWJhci1jbG9zZWRdPVwiIWlzSGlzdG9yeVNpZGViYXJPcGVuXCJcclxuICAgICAgICBbc2Vzc2lvbnNdPVwiY2hhdFNlc3Npb25zXCJcclxuICAgICAgICBbaXNPcGVuXT1cImlzSGlzdG9yeVNpZGViYXJPcGVuXCJcclxuICAgICAgICBbdXNlck5hbWVdPVwiY2hhdEhpc3RvcnlVc2VyTmFtZVwiXHJcbiAgICAgICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdTZXNzaW9uc1wiXHJcbiAgICAgICAgW2hhc01vcmVTZXNzaW9uc109XCJoYXNNb3JlU2Vzc2lvbnNcIlxyXG4gICAgICAgIFtpc0xvYWRpbmdNb3JlXT1cImlzTG9hZGluZ01vcmVTZXNzaW9uc1wiXHJcbiAgICAgICAgW3Byb2Nlc3NpbmdTZXNzaW9uSWRdPVwicHJvY2Vzc2luZ1Nlc3Npb25JZFwiXHJcbiAgICAgICAgKHNlc3Npb25TZWxlY3RlZCk9XCJvblNlc3Npb25TZWxlY3RlZCgkZXZlbnQpXCJcclxuICAgICAgICAoc2Vzc2lvbkRlbGV0ZWQpPVwib25TZXNzaW9uRGVsZXRlZCgkZXZlbnQpXCJcclxuICAgICAgICAobG9hZE1vcmUpPVwibG9hZE1vcmVTZXNzaW9ucy5lbWl0KClcIlxyXG4gICAgICAgIChyZWZyZXNoKT1cInJlZnJlc2hTZXNzaW9ucy5lbWl0KClcIlxyXG4gICAgICAgIChzZXNzaW9uUmVuYW1lZCk9XCJvblNlc3Npb25SZW5hbWVkKCRldmVudClcIlxyXG4gICAgICAgIChkZWxldGVBbGwpPVwib25EZWxldGVBbGxTZXNzaW9ucygpXCJcclxuICAgICAgICAoY2xvc2VkKT1cIm9uVG9nZ2xlSGlzdG9yeVNpZGViYXIoKVwiXHJcbiAgICAgID5cclxuICAgICAgPC9hcHAtY2hhdC1oaXN0b3J5LXNpZGViYXI+XHJcblxyXG4gICAgICA8IS0tIE1lc3NhZ2VzIFZpZXcgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlcy12aWV3XCIgW2NsYXNzLmhpZGRlbl09XCJpc0hpc3RvcnlTaWRlYmFyT3BlbiAmJiAhaXNGdWxsU2NyZWVuXCI+XHJcbiAgICAgICAgPCEtLSBNZXNzYWdlcyAvIFdlbGNvbWUgU2NyZWVuIC0tPlxyXG4gICAgICAgIEBpZiAoIXNob3dMb2dpbkZvcm0pIHtcclxuICAgICAgICAgIDxhcHAtbWVzc2FnZS1saXN0XHJcbiAgICAgICAgICAgIFttZXNzYWdlc109XCJtZXNzYWdlc1wiXHJcbiAgICAgICAgICAgIFtpc0JvdFR5cGluZ109XCJpc0JvdFR5cGluZ1wiXHJcbiAgICAgICAgICAgIFtpc1N0cmVhbWluZ109XCJpc1N0cmVhbWluZ1wiXHJcbiAgICAgICAgICAgIFthcHBMb2dvVXJsXT1cImFwcExvZ29VcmxcIlxyXG4gICAgICAgICAgICBbYXBwU3VidGl0bGVdPVwiYXBwU3VidGl0bGVcIlxyXG4gICAgICAgICAgICBbd2VsY29tZURlc2NdPVwid2VsY29tZURlc2NcIlxyXG4gICAgICAgICAgICBbcHJlZGVmaW5lZE1lc3NhZ2VzXT1cInByZWRlZmluZWRNZXNzYWdlc1wiXHJcbiAgICAgICAgICAgIFtib3RBdmF0YXJVcmxdPVwiYm90QXZhdGFyVXJsXCJcclxuICAgICAgICAgICAgW3VzZXJBdmF0YXJVcmxdPVwidXNlckF2YXRhclVybFwiXHJcbiAgICAgICAgICAgIFt1c2VyTmFtZV09XCJ1c2VyTmFtZVwiXHJcbiAgICAgICAgICAgIFtpc0F1dGhlbnRpY2F0ZWRdPVwiaXNBdXRoZW50aWNhdGVkXCJcclxuICAgICAgICAgICAgW2lzTG9nZ2luZ0luXT1cImlzTG9nZ2luZ0luXCJcclxuICAgICAgICAgICAgW3RyYWNrQnlNZXNzYWdlSWRdPVwidHJhY2tCeU1lc3NhZ2VJZFwiXHJcbiAgICAgICAgICAgIChzdWdnZXN0aW9uQ2xpY2spPVwib25TdWdnZXN0aW9uQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChsb2dpbkNsaWNrKT1cIm9uTG9naW5DbGljaygpXCJcclxuICAgICAgICAgID48L2FwcC1tZXNzYWdlLWxpc3Q+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBAaWYgKHNob3dTdWdnZXN0aW9uQ2hpcHMgJiYgaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgICA8YXBwLWNoaXBzXHJcbiAgICAgICAgICAgIFttZXNzYWdlc109XCJzdWdnZXN0ZWRNZXNzYWdlc1wiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0JvdFR5cGluZ1wiXHJcbiAgICAgICAgICAgIChjaGlwQ2xpY2spPVwib25TdWdnZXN0aW9uQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICA+PC9hcHAtY2hpcHM+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8IS0tIENoYXQgSW5wdXQ6IE9ubHkgc2hvdyB3aGVuIGF1dGhlbnRpY2F0ZWQgLS0+XHJcbiAgICAgICAgQGlmIChpc0F1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgICAgIDxhcHAtbWVzc2FnZS1pbnB1dFxyXG4gICAgICAgICAgICBbaXNCb3RUeXBpbmddPVwiaXNCb3RUeXBpbmdcIlxyXG4gICAgICAgICAgICBbaGludFRleHRdPVwiaGludFRleHRcIlxyXG4gICAgICAgICAgICAoc2VuZCk9XCJvblNlbmQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChzdG9wKT1cIm9uU3RvcCgpXCJcclxuICAgICAgICAgID48L2FwcC1tZXNzYWdlLWlucHV0PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBMb2dpbiBGb3JtIC0tPlxyXG4gICAgICAgIEBpZiAoc2hvd0xvZ2luRm9ybSAmJiAhaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgICA8YXBwLWxvZ2luLWZvcm1cclxuICAgICAgICAgICAgW2lzTG9nZ2luZ0luXT1cImlzTG9nZ2luZ0luXCJcclxuICAgICAgICAgICAgKGxvZ2luU3VibWl0KT1cIm9uTG9naW5TdWJtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjYW5jZWwpPVwib25DYW5jZWxMb2dpbigpXCJcclxuICAgICAgICAgID48L2FwcC1sb2dpbi1mb3JtPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSAgQXV0aCBlcnJvciBzbmFja2JhciAobG9naW4vbG9nb3V0IGVycm9ycyBvbmx5KSAtLT5cclxuICAgICAgICA8IS0tIDxhcHAtc25hY2tiYXJcclxuICAgICAgICAqbmdJZj1cImF1dGhFcnJvclwiXHJcbiAgICAgICAgW21lc3NhZ2VdPVwiYXV0aEVycm9yXCJcclxuICAgICAgICAoY2xvc2VkKT1cIm9uQ2xlYXJBdXRoRXJyb3IoKVwiXHJcbiAgICAgID48L2FwcC1zbmFja2Jhcj4gLS0+XHJcblxyXG4gICAgICAgIDwhLS0gZm9vdGVyIC0tPlxyXG4gICAgICAgIDxhcHAtY2hhdC1mb290ZXI+PC9hcHAtY2hhdC1mb290ZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbn1cclxuXHJcbjxtYXQtbWVudSAjc2V0dGluZ3NNZW51PVwibWF0TWVudVwiPlxyXG4gIDwhLS0gUGVyc29uYWxpemF0aW9uIC0tPlxyXG4gIEBpZiAoaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIG1hdC1tZW51LWl0ZW1cclxuICAgICAgKGNsaWNrKT1cIm9uT3BlblBlcnNvbmFsaXphdGlvbigpXCJcclxuICAgICAgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uPnNldHRpbmdzX3N1Z2dlc3Q8L21hdC1pY29uPlxyXG4gICAgICA8c3Bhbj5QZXJzb25hbGl6YXRpb248L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICB9XHJcblxyXG4gIDwhLS0gQ2hhbmdlIFRoZW1lIC0tPlxyXG5cclxuICA8IS0tIEZ1bGwtU2NyZWVuIEJ1dHRvbiAtLT5cclxuICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uVG9nZ2xlRnVsbFNjcmVlbigpXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyXCI+XHJcbiAgICA8bWF0LWljb24+e3sgaXNGdWxsU2NyZWVuID8gJ2Z1bGxzY3JlZW5fZXhpdCcgOiAnZnVsbHNjcmVlbicgfX08L21hdC1pY29uPlxyXG4gICAgPHNwYW4+IHt7IGlzRnVsbFNjcmVlbiA/ICdNaW5pbWl6ZScgOiAnRXhwYW5kJyB9fTwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPCEtLSBDbGVhciBDaGF0IC0tPlxyXG4gIEBpZiAoaXNBdXRoZW50aWNhdGVkICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25DbGVhckNoYXQoKVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlclwiPlxyXG4gICAgICA8bWF0LWljb24+IGNsZWFyX2FsbDwvbWF0LWljb24+XHJcbiAgICAgIDxzcGFuPkVuZCBDaGF0PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgfVxyXG5cclxuICA8IS0tIExvZ291dCAtLT5cclxuICBAaWYgKGlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbkxvZ291dCgpXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5sb2dvdXQ8L21hdC1pY29uPlxyXG4gICAgICA8c3Bhbj5Mb2dvdXQ8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICB9XHJcbjwvbWF0LW1lbnU+XHJcbiJdfQ==
@@ -1,36 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { MatIconModule } from '@angular/material/icon';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/material/icon";
6
- export class MessageInputComponent {
7
- constructor() {
8
- this.isBotTyping = false;
9
- this.hintText = 'Type a message...';
10
- this.send = new EventEmitter();
11
- this.stop = new EventEmitter();
12
- }
13
- onSend(text) {
14
- if (text.trim()) {
15
- this.send.emit(text);
16
- }
17
- }
18
- onStop() {
19
- this.stop.emit();
20
- }
21
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MessageInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MessageInputComponent, isStandalone: true, selector: "app-message-input", inputs: { isBotTyping: "isBotTyping", hintText: "hintText" }, outputs: { send: "send", stop: "stop" }, ngImport: i0, template: "<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input #messageInput type=\"text\" [disabled]=\"isBotTyping\" (keydown.enter)=\"\r\n !isBotTyping && onSend(messageInput.value); !isBotTyping && (messageInput.value = '')\r\n \" [placeholder]=\"hintText\" />\r\n\r\n <button (click)=\"\r\n isBotTyping ? onStop() : onSend(messageInput.value);\r\n !isBotTyping && (messageInput.value = '')\r\n \">\r\n <mat-icon [class.stop-icon]=\"isBotTyping\">{{\r\n isBotTyping ? 'stop_circle' : 'send'\r\n }}</mat-icon>\r\n </button>\r\n </div>\r\n</div>", styles: [":host{display:block;width:100%}.chat-input{display:flex;padding:10px;border-top:1px solid var(--border-top-color);background-color:var(--background-color)}.chat-input .input-wrapper{position:relative;flex-grow:1}.chat-input input{width:100%;background-color:var(--background-color);border:1px solid var(--border-color);border-radius:16px;padding:10px 50px 10px 15px;font-size:14px;color:var(--text-color);caret-color:var(--hint-text-color);font-family:var(--font-family);box-sizing:border-box}.chat-input input::placeholder{color:var(--hint-text-color)}.chat-input input:focus{border-color:var(--primary-color);outline:none}.chat-input button{position:absolute;right:5px;top:50%;transform:translateY(-50%);background-color:transparent;color:var(--primary-color);border:none;cursor:pointer;display:flex;justify-content:center;align-items:center}.chat-input button .stop-icon{color:var(--red)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
23
- }
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MessageInputComponent, decorators: [{
25
- type: Component,
26
- args: [{ selector: 'app-message-input', standalone: true, imports: [CommonModule, MatIconModule], template: "<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input #messageInput type=\"text\" [disabled]=\"isBotTyping\" (keydown.enter)=\"\r\n !isBotTyping && onSend(messageInput.value); !isBotTyping && (messageInput.value = '')\r\n \" [placeholder]=\"hintText\" />\r\n\r\n <button (click)=\"\r\n isBotTyping ? onStop() : onSend(messageInput.value);\r\n !isBotTyping && (messageInput.value = '')\r\n \">\r\n <mat-icon [class.stop-icon]=\"isBotTyping\">{{\r\n isBotTyping ? 'stop_circle' : 'send'\r\n }}</mat-icon>\r\n </button>\r\n </div>\r\n</div>", styles: [":host{display:block;width:100%}.chat-input{display:flex;padding:10px;border-top:1px solid var(--border-top-color);background-color:var(--background-color)}.chat-input .input-wrapper{position:relative;flex-grow:1}.chat-input input{width:100%;background-color:var(--background-color);border:1px solid var(--border-color);border-radius:16px;padding:10px 50px 10px 15px;font-size:14px;color:var(--text-color);caret-color:var(--hint-text-color);font-family:var(--font-family);box-sizing:border-box}.chat-input input::placeholder{color:var(--hint-text-color)}.chat-input input:focus{border-color:var(--primary-color);outline:none}.chat-input button{position:absolute;right:5px;top:50%;transform:translateY(-50%);background-color:transparent;color:var(--primary-color);border:none;cursor:pointer;display:flex;justify-content:center;align-items:center}.chat-input button .stop-icon{color:var(--red)}\n"] }]
27
- }], propDecorators: { isBotTyping: [{
28
- type: Input
29
- }], hintText: [{
30
- type: Input
31
- }], send: [{
32
- type: Output
33
- }], stop: [{
34
- type: Output
35
- }] } });
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvYXBwL2NoYXQvY29tcG9uZW50cy9tZXNzYWdlLWlucHV0L21lc3NhZ2UtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9vaGJvdC9zcmMvbGliL2FwcC9jaGF0L2NvbXBvbmVudHMvbWVzc2FnZS1pbnB1dC9tZXNzYWdlLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBU3ZELE1BQU0sT0FBTyxxQkFBcUI7SUFQbEM7UUFRVyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixhQUFRLEdBQVcsbUJBQW1CLENBQUM7UUFFdEMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDbEMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FXM0M7SUFUQyxNQUFNLENBQUMsSUFBWTtRQUNqQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25CLENBQUM7K0dBZlUscUJBQXFCO21HQUFyQixxQkFBcUIsb0xDWGxDLGlvQkFnQk0sczdCRFRNLFlBQVksOEJBQUUsYUFBYTs7NEZBSTFCLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQzs4QkFLN0IsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1tZXNzYWdlLWlucHV0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEljb25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9tZXNzYWdlLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZXNzYWdlSW5wdXRDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGlzQm90VHlwaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgaGludFRleHQ6IHN0cmluZyA9ICdUeXBlIGEgbWVzc2FnZS4uLic7XHJcblxyXG4gIEBPdXRwdXQoKSBzZW5kID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIHN0b3AgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIG9uU2VuZCh0ZXh0OiBzdHJpbmcpIHtcclxuICAgIGlmICh0ZXh0LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnNlbmQuZW1pdCh0ZXh0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU3RvcCgpIHtcclxuICAgIHRoaXMuc3RvcC5lbWl0KCk7XHJcbiAgfVxyXG59XHJcbiIsIjwhLS0gQ2hhdCBJbnB1dCAtLT5cclxuPGRpdiBjbGFzcz1cImNoYXQtaW5wdXRcIj5cclxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgPGlucHV0ICNtZXNzYWdlSW5wdXQgdHlwZT1cInRleHRcIiBbZGlzYWJsZWRdPVwiaXNCb3RUeXBpbmdcIiAoa2V5ZG93bi5lbnRlcik9XCJcclxuICAgICAgICAhaXNCb3RUeXBpbmcgJiYgb25TZW5kKG1lc3NhZ2VJbnB1dC52YWx1ZSk7ICFpc0JvdFR5cGluZyAmJiAobWVzc2FnZUlucHV0LnZhbHVlID0gJycpXHJcbiAgICAgIFwiIFtwbGFjZWhvbGRlcl09XCJoaW50VGV4dFwiIC8+XHJcblxyXG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiXHJcbiAgICAgICAgaXNCb3RUeXBpbmcgPyBvblN0b3AoKSA6IG9uU2VuZChtZXNzYWdlSW5wdXQudmFsdWUpO1xyXG4gICAgICAgICFpc0JvdFR5cGluZyAmJiAobWVzc2FnZUlucHV0LnZhbHVlID0gJycpXHJcbiAgICAgIFwiPlxyXG4gICAgICA8bWF0LWljb24gW2NsYXNzLnN0b3AtaWNvbl09XCJpc0JvdFR5cGluZ1wiPnt7XHJcbiAgICAgICAgaXNCb3RUeXBpbmcgPyAnc3RvcF9jaXJjbGUnIDogJ3NlbmQnXHJcbiAgICAgICAgfX08L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==