@aakash58/chatbot 1.1.15 → 1.1.17

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 (167) hide show
  1. package/esm2022/aakash58-chatbot.mjs +5 -0
  2. package/esm2022/lib/app/chat/chat-ui-state.service.mjs +170 -0
  3. package/esm2022/lib/app/chat/chat.service.mjs +445 -0
  4. package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +50 -0
  5. package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +12 -0
  6. package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +66 -0
  7. package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +186 -0
  8. package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +312 -0
  9. package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +36 -0
  10. package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +115 -0
  11. package/esm2022/lib/app/chat/model/chat-history.model.mjs +2 -0
  12. package/esm2022/lib/app/chat/model/chat-request.model.mjs +2 -0
  13. package/esm2022/lib/app/chat/model/chat-response.model.mjs +2 -0
  14. package/esm2022/lib/app/chat/model/chat-session.model.mjs +2 -0
  15. package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +2 -0
  16. package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +2 -0
  17. package/esm2022/lib/app/chat/services/chat-api.service.mjs +61 -0
  18. package/esm2022/lib/app/chat/services/chat-audio.service.mjs +50 -0
  19. package/esm2022/lib/app/chat/services/chat-history.service.mjs +252 -0
  20. package/esm2022/lib/app/login/login-form.component.mjs +46 -0
  21. package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +194 -0
  22. package/esm2022/lib/app/personalization/personalization.service.mjs +149 -0
  23. package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +122 -0
  24. package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +86 -0
  25. package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +115 -0
  26. package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +29 -0
  27. package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +30 -0
  28. package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +12 -0
  29. package/esm2022/lib/constant/doohbot-constant.mjs +28 -0
  30. package/esm2022/lib/constant/html-entities.mjs +9 -0
  31. package/esm2022/lib/constant/utf8.mjs +10 -0
  32. package/esm2022/lib/core/app-const.mjs +61 -0
  33. package/esm2022/lib/core/auth/account-api.service.mjs +40 -0
  34. package/esm2022/lib/core/auth/auth.service.mjs +391 -0
  35. package/esm2022/lib/core/auth/models/auth-result.model.mjs +3 -0
  36. package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +6 -0
  37. package/esm2022/lib/core/auth/models/login-request.model.mjs +6 -0
  38. package/esm2022/lib/core/auth/storage.service.mjs +110 -0
  39. package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +112 -0
  40. package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +55 -0
  41. package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +179 -0
  42. package/esm2022/lib/core/environments/environment.mjs +15 -0
  43. package/esm2022/lib/core/environments/environment.prod.mjs +15 -0
  44. package/esm2022/lib/core/helpers/crypto-helper.service.mjs +52 -0
  45. package/esm2022/lib/core/http/http-stream.service.mjs +97 -0
  46. package/esm2022/lib/core/http/http.service.mjs +103 -0
  47. package/esm2022/lib/core/interceptors/auth.interceptor.mjs +96 -0
  48. package/esm2022/lib/core/interceptors/license.interceptor.mjs +44 -0
  49. package/esm2022/lib/core/models/api-config.model.mjs +18 -0
  50. package/esm2022/lib/core/models/api-request.model.mjs +2 -0
  51. package/esm2022/lib/core/models/api-response.model.mjs +8 -0
  52. package/esm2022/lib/core/models/doohbot-config.model.mjs +18 -0
  53. package/esm2022/lib/core/models/license.model.mjs +2 -0
  54. package/esm2022/lib/core/models/message.mjs +2 -0
  55. package/esm2022/lib/core/models/theme-config.model.mjs +2 -0
  56. package/esm2022/lib/core/services/core-config.service.mjs +52 -0
  57. package/esm2022/lib/core/services/license.service.mjs +145 -0
  58. package/esm2022/lib/core/services/markdown.service.mjs +64 -0
  59. package/esm2022/lib/core/services/theme.service.mjs +248 -0
  60. package/esm2022/lib/core/types/auth-mode.type.mjs +2 -0
  61. package/esm2022/lib/core/types/auth-status.type.mjs +5 -0
  62. package/esm2022/lib/core/types/chat-stream.type.mjs +2 -0
  63. package/esm2022/lib/core/types/message-role.type.mjs +2 -0
  64. package/esm2022/lib/core/types/prompt-mode.type.mjs +5 -0
  65. package/esm2022/lib/core/types/snackbar-error.type.mjs +5 -0
  66. package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +2 -0
  67. package/esm2022/lib/core/utils/logger.service.mjs +42 -0
  68. package/esm2022/lib/doohbot-input.mjs +20 -0
  69. package/esm2022/lib/doohbot.component.mjs +444 -0
  70. package/esm2022/lib/predefined_messages.mjs +15 -0
  71. package/esm2022/lib/shared/chips/chips.component.mjs +28 -0
  72. package/esm2022/lib/shared/dialog/dialog.component.mjs +36 -0
  73. package/esm2022/lib/shared/dialog/dialog.service.mjs +64 -0
  74. package/esm2022/lib/shared/dialog/dialog.utils.mjs +85 -0
  75. package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +29 -0
  76. package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +38 -0
  77. package/esm2022/lib/shared/menu-item/menu-item.component.mjs +24 -0
  78. package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +27 -0
  79. package/esm2022/lib/shared/snackbar/snackbar.component.mjs +43 -0
  80. package/esm2022/lib/shared/snackbar/snackbar.service.mjs +46 -0
  81. package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +43 -0
  82. package/esm2022/public-api.mjs +37 -0
  83. package/fesm2022/aakash58-chatbot.mjs +1114 -867
  84. package/fesm2022/aakash58-chatbot.mjs.map +1 -1
  85. package/index.d.ts +3 -377
  86. package/lib/app/chat/chat-ui-state.service.d.ts +96 -0
  87. package/lib/app/chat/chat.service.d.ts +88 -0
  88. package/lib/app/chat/components/chat-button/chat-button.component.d.ts +16 -0
  89. package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +5 -0
  90. package/lib/app/chat/components/chat-header/chat-header.component.d.ts +24 -0
  91. package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +49 -0
  92. package/lib/app/chat/components/chat-window/chat-window.component.d.ts +107 -0
  93. package/lib/app/chat/components/message-input/message-input.component.d.ts +12 -0
  94. package/lib/app/chat/components/message-list/message-list.component.d.ts +40 -0
  95. package/lib/app/chat/model/chat-history.model.d.ts +51 -0
  96. package/lib/app/chat/model/chat-request.model.d.ts +10 -0
  97. package/lib/app/chat/model/chat-response.model.d.ts +9 -0
  98. package/lib/app/chat/model/chat-session.model.d.ts +12 -0
  99. package/lib/app/chat/model/chat-stream-message.model.d.ts +5 -0
  100. package/lib/app/chat/model/chat-stream-response.model.d.ts +10 -0
  101. package/lib/app/chat/services/chat-api.service.d.ts +30 -0
  102. package/lib/app/chat/services/chat-audio.service.d.ts +19 -0
  103. package/lib/app/chat/services/chat-history.service.d.ts +53 -0
  104. package/lib/app/login/login-form.component.d.ts +20 -0
  105. package/lib/app/personalization/personalization-dialog.component.d.ts +53 -0
  106. package/lib/app/personalization/personalization.service.d.ts +66 -0
  107. package/lib/app/personalization/sections/account/account-section.component.d.ts +30 -0
  108. package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +17 -0
  109. package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +27 -0
  110. package/lib/app/personalization/sections/profile/profile-section.component.d.ts +17 -0
  111. package/lib/app/personalization/sections/settings/setting-section.component.d.ts +10 -0
  112. package/lib/app/personalization/sections/terms/terms-section.component.d.ts +5 -0
  113. package/lib/constant/doohbot-constant.d.ts +12 -0
  114. package/lib/constant/html-entities.d.ts +8 -0
  115. package/lib/constant/utf8.d.ts +9 -0
  116. package/lib/core/app-const.d.ts +11 -0
  117. package/lib/core/auth/account-api.service.d.ts +20 -0
  118. package/lib/core/auth/auth.service.d.ts +90 -0
  119. package/lib/core/auth/models/auth-result.model.d.ts +4 -0
  120. package/lib/core/auth/models/federated-login-request.model.d.ts +5 -0
  121. package/lib/core/auth/models/login-request.model.d.ts +6 -0
  122. package/lib/core/auth/storage.service.d.ts +21 -0
  123. package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +23 -0
  124. package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +14 -0
  125. package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +30 -0
  126. package/lib/core/environments/environment.d.ts +7 -0
  127. package/lib/core/environments/environment.prod.d.ts +7 -0
  128. package/lib/core/helpers/crypto-helper.service.d.ts +12 -0
  129. package/lib/core/http/http-stream.service.d.ts +18 -0
  130. package/lib/core/http/http.service.d.ts +20 -0
  131. package/lib/core/interceptors/auth.interceptor.d.ts +18 -0
  132. package/lib/core/interceptors/license.interceptor.d.ts +11 -0
  133. package/lib/core/models/api-config.model.d.ts +58 -0
  134. package/lib/core/models/api-request.model.d.ts +77 -0
  135. package/lib/core/models/api-response.model.d.ts +6 -0
  136. package/lib/core/models/doohbot-config.model.d.ts +81 -0
  137. package/lib/core/models/license.model.d.ts +23 -0
  138. package/lib/core/models/message.d.ts +16 -0
  139. package/lib/core/models/theme-config.model.d.ts +28 -0
  140. package/lib/core/services/core-config.service.d.ts +23 -0
  141. package/lib/core/services/license.service.d.ts +33 -0
  142. package/lib/core/services/markdown.service.d.ts +8 -0
  143. package/lib/core/services/theme.service.d.ts +40 -0
  144. package/lib/core/types/auth-mode.type.d.ts +4 -0
  145. package/lib/core/types/auth-status.type.d.ts +4 -0
  146. package/lib/core/types/chat-stream.type.d.ts +4 -0
  147. package/lib/core/types/message-role.type.d.ts +4 -0
  148. package/lib/core/types/prompt-mode.type.d.ts +4 -0
  149. package/lib/core/types/snackbar-error.type.d.ts +4 -0
  150. package/lib/core/types/tenant-resolution-strategy.type.d.ts +4 -0
  151. package/lib/core/utils/logger.service.d.ts +11 -0
  152. package/lib/doohbot-input.d.ts +19 -0
  153. package/lib/doohbot.component.d.ts +108 -0
  154. package/lib/predefined_messages.d.ts +2 -0
  155. package/lib/shared/chips/chips.component.d.ts +10 -0
  156. package/lib/shared/dialog/dialog.component.d.ts +19 -0
  157. package/lib/shared/dialog/dialog.service.d.ts +29 -0
  158. package/lib/shared/dialog/dialog.utils.d.ts +41 -0
  159. package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +11 -0
  160. package/lib/shared/input-dialog/input-dialog.component.d.ts +20 -0
  161. package/lib/shared/menu-item/menu-item.component.d.ts +9 -0
  162. package/lib/shared/pipes/simple-markdown.pipe.d.ts +10 -0
  163. package/lib/shared/snackbar/snackbar.component.d.ts +14 -0
  164. package/lib/shared/snackbar/snackbar.service.d.ts +19 -0
  165. package/lib/shared/snackbar/snackbar.utils.d.ts +33 -0
  166. package/package.json +4 -2
  167. package/public-api.d.ts +11 -0
@@ -0,0 +1,391 @@
1
+ import { inject, Injectable, signal } from '@angular/core';
2
+ import { BehaviorSubject, map, catchError, of, tap, retry, throwError, firstValueFrom, } from 'rxjs';
3
+ import { JwtHelperService } from '@auth0/angular-jwt';
4
+ import logger from '../utils/logger.service';
5
+ import { SnackbarUtils } from './../../shared/snackbar/snackbar.utils';
6
+ import { DoohbotConst } from '../../constant/doohbot-constant';
7
+ import { DOOHBOT_ADVANCED_CONFIG } from '../models/doohbot-config.model';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./account-api.service";
10
+ import * as i2 from "../helpers/crypto-helper.service";
11
+ import * as i3 from "./storage.service";
12
+ import * as i4 from "@angular/router";
13
+ import * as i5 from "../services/core-config.service";
14
+ export class AuthService {
15
+ get apiUrl() {
16
+ return this.coreConfig.apiUrl;
17
+ }
18
+ get storageKey() {
19
+ return this.coreConfig.storageKey;
20
+ }
21
+ get secretKey() {
22
+ return this.coreConfig.secretKey;
23
+ }
24
+ get companyCode() {
25
+ return this.coreConfig.companyCode;
26
+ }
27
+ constructor(accountService, cryptoHelper, tokenStorage, router, coreConfig) {
28
+ this.accountService = accountService;
29
+ this.cryptoHelper = cryptoHelper;
30
+ this.tokenStorage = tokenStorage;
31
+ this.router = router;
32
+ this.coreConfig = coreConfig;
33
+ this.jwtHelper = new JwtHelperService();
34
+ this.advancedConfig = inject(DOOHBOT_ADVANCED_CONFIG, { optional: true });
35
+ // Reactive Authentication State
36
+ this.authStatusSubject = new BehaviorSubject('unauthenticated');
37
+ this.authStatus$ = this.authStatusSubject.asObservable();
38
+ // UI State Signals (Merged from ChatAuthService)
39
+ this.isLoggingIn = signal(false);
40
+ this.authError = signal(null);
41
+ this.authSuccess = signal(null);
42
+ // Properties are now derived from coreConfig
43
+ }
44
+ /**
45
+ * Updates the service configuration from the component input
46
+ */
47
+ updateConfig(config) {
48
+ this.coreConfig.updateConfig(config);
49
+ if (config.secretKey) {
50
+ this.cryptoHelper.setSecretKey(config.secretKey);
51
+ }
52
+ }
53
+ getLoggedInUserName() {
54
+ const username = this.tokenStorage.get('username');
55
+ return username || '';
56
+ }
57
+ getLoggedInUserImageUrl() {
58
+ return DoohbotConst.userAvatar;
59
+ }
60
+ getLoggedInUserRole() {
61
+ const roles = this.tokenStorage.get('roles');
62
+ // If roles is an array, return the first role, otherwise return the string
63
+ if (Array.isArray(roles) && roles.length > 0) {
64
+ return roles[0];
65
+ }
66
+ return roles || 'User';
67
+ }
68
+ // Add getters for backward compatibility if needed, but preferably use authStatus$
69
+ get authStatus() {
70
+ return this.authStatusSubject.value;
71
+ }
72
+ /**
73
+ * Resolves a federated token from browser storage
74
+ */
75
+ resolveSilentToken() {
76
+ const config = this.coreConfig.config$();
77
+ const commonKeys = ['access_token', 'id_token', 'token', 'authToken'];
78
+ // 1. Try explicit authToken from config (Highest Priority)
79
+ if (config.authToken) {
80
+ logger.info(`[Auth] Using explicit authToken from input`);
81
+ return config.authToken;
82
+ }
83
+ // 2. Try configured storage key from advanced config
84
+ if (this.advancedConfig?.autoConfigFromStorage) {
85
+ const key = this.advancedConfig.autoConfigFromStorage;
86
+ const token = localStorage.getItem(key) || sessionStorage.getItem(key);
87
+ if (token) {
88
+ logger.debug(`[Auth] Resolved token from configured key: ${key}`);
89
+ return token;
90
+ }
91
+ }
92
+ // 3. Try common fallback keys
93
+ for (const key of commonKeys) {
94
+ const token = localStorage.getItem(key) || sessionStorage.getItem(key);
95
+ if (token) {
96
+ logger.debug(`[Auth] Resolved token from fallback key: ${key}`);
97
+ return token;
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ /**
103
+ * Authenticate user with federated credentials
104
+ */
105
+ async federatedLogin(credentials, silent = true) {
106
+ logger.log('>>>>>>>Attempting federated login...');
107
+ // Resolve token if not provided
108
+ if (!credentials.accessToken) {
109
+ credentials.accessToken = this.resolveSilentToken() || '';
110
+ }
111
+ // If still no token, exit gracefully
112
+ if (!credentials.accessToken) {
113
+ logger.log('[Auth] No federated token found in storage.');
114
+ return false;
115
+ }
116
+ this.isLoggingIn.set(true);
117
+ if (!silent) {
118
+ this.authError.set(null);
119
+ this.authSuccess.set(null);
120
+ }
121
+ try {
122
+ const response = await firstValueFrom(this.accountService.federateLogin(credentials));
123
+ logger.log('>>>>>>>>>>>Federated Login response<<<<<<<<<<:', response);
124
+ if (response && response.success && response.data) {
125
+ // Map federated result to something AuthService can handle
126
+ // Federated result: { access_token: string, remember_me: boolean }
127
+ const authResult = {
128
+ access_token: response.data.access_token,
129
+ refresh_token: credentials.rememberMe ? response.data.refresh_token : '',
130
+ };
131
+ this.setSession(authResult, credentials.rememberMe || false);
132
+ logger.log('Federated login successful, authenticated state set to true');
133
+ if (!silent) {
134
+ SnackbarUtils.success('Login successful!');
135
+ this.authSuccess.set('Login successful!');
136
+ }
137
+ this.isLoggingIn.set(false);
138
+ return true;
139
+ }
140
+ else {
141
+ if (!silent) {
142
+ this.authError.set('Federated login failed.');
143
+ }
144
+ this.isLoggingIn.set(false);
145
+ return false;
146
+ }
147
+ }
148
+ catch (error) {
149
+ logger.error('Federated login failed:', error);
150
+ if (!silent) {
151
+ this.authError.set('An error occurred during federated login.');
152
+ }
153
+ this.isLoggingIn.set(false);
154
+ return false;
155
+ }
156
+ }
157
+ /**
158
+ * Authenticate user with credentials
159
+ */
160
+ async login(credentials, silent = false) {
161
+ this.isLoggingIn.set(true);
162
+ if (!silent) {
163
+ this.authError.set(null); //TODO
164
+ this.authSuccess.set(null);
165
+ }
166
+ try {
167
+ const response = await firstValueFrom(this.accountService.login(credentials));
168
+ logger.log('>>>>>>>>>>>Login response<<<<<<<<<<:', response);
169
+ if (response && response.success && response.data) {
170
+ this.setSession(response.data, credentials.rememberMe);
171
+ logger.log('Login successful, authenticated state set to true');
172
+ if (!silent) {
173
+ this.authSuccess.set('Login successful!');
174
+ }
175
+ this.isLoggingIn.set(false);
176
+ return true;
177
+ }
178
+ else {
179
+ if (!silent) {
180
+ SnackbarUtils.error('Login failed. Please check your credentials.');
181
+ this.authError.set('Login failed. Please check your credentials.');
182
+ }
183
+ this.isLoggingIn.set(false);
184
+ return false;
185
+ }
186
+ }
187
+ catch (error) {
188
+ logger.error('Login failed:', error);
189
+ if (!silent) {
190
+ this.authError.set('An error occurred during login.');
191
+ }
192
+ this.isLoggingIn.set(false);
193
+ return false;
194
+ }
195
+ }
196
+ /*
197
+ * Logout logic enhanced with UI signals
198
+ */
199
+ async logout(refreshToken) {
200
+ const token = refreshToken || this.getRefreshToken() || '';
201
+ try {
202
+ // If no token, just clear local state
203
+ if (!token) {
204
+ this.clearAuth();
205
+ this.authSuccess.set('Logged out successfully!');
206
+ setTimeout(() => this.authSuccess.set(null), 3000);
207
+ return true;
208
+ }
209
+ const response = await firstValueFrom(this.accountService.logout(token));
210
+ if (response && response.success) {
211
+ this.clearAuth();
212
+ this.authSuccess.set('Logged out successfully!');
213
+ setTimeout(() => this.authSuccess.set(null), 3000);
214
+ return true;
215
+ }
216
+ else {
217
+ this.clearAuth();
218
+ return false;
219
+ }
220
+ }
221
+ catch (error) {
222
+ logger.error('Logout failed:', error);
223
+ SnackbarUtils.error('An error occurred during logout.');
224
+ // Force clear auth on error to ensure user isn't stuck
225
+ this.clearAuth();
226
+ return false;
227
+ }
228
+ }
229
+ // Utility
230
+ setSession(session, rememberMe = true) {
231
+ const user = this.jwtHelper.decodeToken(session.access_token);
232
+ // Set storage type based on rememberMe preference
233
+ this.tokenStorage.setRememberMe(rememberMe);
234
+ this.tokenStorage.set('access_token', session.access_token);
235
+ this.tokenStorage.set('refresh_token', session.refresh_token);
236
+ this.tokenStorage.set('user_id', user?.user_id);
237
+ this.tokenStorage.set('username', user?.username);
238
+ this.tokenStorage.set('roles', user?.roles);
239
+ this.tokenStorage.set('permissions', user?.permissions);
240
+ this.tokenStorage.set('organization_id', user?.organization_id);
241
+ this.tokenStorage.set('company_id', user?.company_id);
242
+ this.tokenStorage.set('office_id', user?.office_id);
243
+ // Notify subscribers
244
+ this.authStatusSubject.next('authenticated');
245
+ }
246
+ getOrganizationId() {
247
+ logger.debug('>>>>>>>>>>getOrganizationId<<<<<<<:', this.tokenStorage.get('organization_id'));
248
+ return this.tokenStorage.get('organization_id');
249
+ }
250
+ getRefreshToken() {
251
+ logger.debug('>>>>>>>>>>getRefreshToken<<<<<<<:', this.tokenStorage.get('refresh_token'));
252
+ return this.tokenStorage.get('refresh_token');
253
+ }
254
+ refreshToken() {
255
+ const refreshToken = this.getRefreshToken();
256
+ if (!refreshToken) {
257
+ return throwError(() => new Error('No refresh token available'));
258
+ }
259
+ return this.accountService.refreshLogin({ refresh_token: refreshToken }).pipe(retry(3), // Retry 3 times on failure
260
+ tap((response) => {
261
+ if (response && response.success && response.data) {
262
+ this.setSession(response.data);
263
+ }
264
+ }), map((response) => {
265
+ if (response && response.success && response.data) {
266
+ return response.data;
267
+ }
268
+ else {
269
+ throw new Error('Token refresh failed');
270
+ }
271
+ }), catchError((err) => {
272
+ logger.error('[Auth] Token refresh failed after retries:', err);
273
+ this.clearAuth();
274
+ SnackbarUtils.error('Session Expired. Please login.');
275
+ return throwError(() => err);
276
+ }));
277
+ }
278
+ isAuthenticated() {
279
+ const token = this.tokenStorage.get('access_token');
280
+ return !!token && !this.isTokenExpired();
281
+ }
282
+ isTokenExpired() {
283
+ let token = (this.tokenStorage.get('access_token') ?? '');
284
+ if (token) {
285
+ return this.jwtHelper.isTokenExpired(token);
286
+ }
287
+ else {
288
+ return true;
289
+ }
290
+ }
291
+ /**
292
+ * Validate stored token on app startup
293
+ */
294
+ validateStoredToken() {
295
+ const accessToken = this.tokenStorage.get('access_token');
296
+ //! No access token
297
+ if (!accessToken) {
298
+ //TODO: FORCE AUTHENTICATED FOR DEV
299
+ // this.authStatusSubject.next('authenticated');
300
+ // return of('authenticated');
301
+ //! For production ( Backend Validation )
302
+ this.authStatusSubject.next('unauthenticated');
303
+ return of('unauthenticated');
304
+ }
305
+ // Access token valid
306
+ if (!this.isTokenExpired()) {
307
+ this.authStatusSubject.next('authenticated');
308
+ return of('authenticated');
309
+ }
310
+ // Access Token expired -> try refresh
311
+ const refreshToken = this.getRefreshToken();
312
+ if (!refreshToken) {
313
+ this.clearAuth();
314
+ this.authStatusSubject.next('unauthenticated');
315
+ return of('unauthenticated');
316
+ }
317
+ //! Access expired but refresh token exists → attempt refresh
318
+ this.authStatusSubject.next('expired');
319
+ return this.refreshToken().pipe(map(() => {
320
+ this.authStatusSubject.next('authenticated');
321
+ return 'authenticated';
322
+ }), catchError((err) => {
323
+ logger.error('[Auth] Token refresh failed:', err);
324
+ this.clearAuth();
325
+ this.authStatusSubject.next('unauthenticated');
326
+ return of('unauthenticated');
327
+ }));
328
+ }
329
+ getUserId() {
330
+ return this.tokenStorage.get('user_id') || '';
331
+ }
332
+ getLicensingContext() {
333
+ const roles = this.tokenStorage.get('roles');
334
+ // Prefer company_id (specific tenant) over organization_id (system group)
335
+ const tenantId = this.tokenStorage.get('company_id') || this.getOrganizationId() || '';
336
+ return {
337
+ tenantId: tenantId,
338
+ principalId: this.getUserId() || '',
339
+ roles: Array.isArray(roles) ? roles : roles ? [roles] : [],
340
+ };
341
+ }
342
+ get licenseKey() {
343
+ return this.tokenStorage.get('license_key') || this.coreConfig.licenseKey || '';
344
+ }
345
+ get isFederated() {
346
+ return this.licenseKey.startsWith('doohbot_lic_');
347
+ }
348
+ setLicenseKey(key) {
349
+ this.tokenStorage.set('license_key', key);
350
+ }
351
+ //! clear local storage
352
+ /**
353
+ * Clear all authentication related data from local storage, session storage, cache, and tokens.
354
+ * This method is called when the user logs out.
355
+ */
356
+ clearAuth() {
357
+ const userId = this.getUserId();
358
+ logger.log('[Auth] Clearing auth:', { userId });
359
+ this.clearSession();
360
+ this.clearStorage();
361
+ this.clearCache();
362
+ this.clearLocalStorage();
363
+ // ENSURE authStatus$ emits unauthenticated
364
+ this.authStatusSubject.next('unauthenticated');
365
+ logger.log('[Auth] Auth cleared successfully');
366
+ }
367
+ clearSession() {
368
+ sessionStorage.clear();
369
+ }
370
+ clearTabInfo() {
371
+ localStorage.removeItem('tabs');
372
+ }
373
+ clearStorage() {
374
+ this.tokenStorage.clear();
375
+ }
376
+ clearLocalStorage() {
377
+ localStorage.clear();
378
+ }
379
+ clearCache() {
380
+ // this.cacheService.clear();
381
+ }
382
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, deps: [{ token: i1.AccountService }, { token: i2.CryptoHelperService }, { token: i3.StorageService }, { token: i4.Router }, { token: i5.CoreConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
383
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, providedIn: 'root' }); }
384
+ }
385
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, decorators: [{
386
+ type: Injectable,
387
+ args: [{
388
+ providedIn: 'root',
389
+ }]
390
+ }], ctorParameters: () => [{ type: i1.AccountService }, { type: i2.CryptoHelperService }, { type: i3.StorageService }, { type: i4.Router }, { type: i5.CoreConfigService }] });
391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9vaGJvdC9zcmMvbGliL2NvcmUvYXV0aC9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNELE9BQU8sRUFDTCxlQUFlLEVBQ2YsR0FBRyxFQUVILFVBQVUsRUFDVixFQUFFLEVBQ0YsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEVBQ1YsY0FBYyxHQUNmLE1BQU0sTUFBTSxDQUFDO0FBSWQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHdEQsT0FBTyxNQUFNLE1BQU0seUJBQXlCLENBQUM7QUFHN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcvRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7OztBQWdCekUsTUFBTSxPQUFPLFdBQVc7SUFDdEIsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxDQUFDO0lBY0QsWUFDVSxjQUE4QixFQUM5QixZQUFpQyxFQUNqQyxZQUE0QixFQUM1QixNQUFjLEVBQ2QsVUFBNkI7UUFKN0Is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Q0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNELGlCQUFpQjtRQUNmLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsVUFBVTtRQUNSLDZCQUE2QjtJQUMvQixDQUFDOytHQWpiVSxXQUFXO21IQUFYLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvcmVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29yZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IERvb2hib3RJbnB1dCB9IGZyb20gJy4uLy4uL2Rvb2hib3QtaW5wdXQnO1xyXG5pbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCxcclxuICBtYXAsXHJcbiAgT2JzZXJ2YWJsZSxcclxuICBjYXRjaEVycm9yLFxyXG4gIG9mLFxyXG4gIHRhcCxcclxuICByZXRyeSxcclxuICB0aHJvd0Vycm9yLFxyXG4gIGZpcnN0VmFsdWVGcm9tLFxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBdXRoUmVzdWx0IH0gZnJvbSAnLi9tb2RlbHMvYXV0aC1yZXN1bHQubW9kZWwnO1xyXG5pbXBvcnQgeyBGZWRlcmF0ZWRMb2dpblJlcXVlc3QgfSBmcm9tICcuL21vZGVscy9mZWRlcmF0ZWQtbG9naW4tcmVxdWVzdC5tb2RlbCc7XHJcbmltcG9ydCB7IExvZ2luUmVxdWVzdCB9IGZyb20gJy4vbW9kZWxzL2xvZ2luLXJlcXVlc3QubW9kZWwnO1xyXG5pbXBvcnQgeyBKd3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQGF1dGgwL2FuZ3VsYXItand0JztcclxuaW1wb3J0IHsgQ3J5cHRvSGVscGVyU2VydmljZSB9IGZyb20gJy4uL2hlbHBlcnMvY3J5cHRvLWhlbHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU3RhdHVzIH0gZnJvbSAnLi4vdHlwZXMvYXV0aC1zdGF0dXMudHlwZSc7XHJcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi9hY2NvdW50LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU25hY2tiYXJVdGlscyB9IGZyb20gJy4vLi4vLi4vc2hhcmVkL3NuYWNrYmFyL3NuYWNrYmFyLnV0aWxzJztcclxuaW1wb3J0IHsgRG9vaGJvdENvbnN0IH0gZnJvbSAnLi4vLi4vY29uc3RhbnQvZG9vaGJvdC1jb25zdGFudCc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IExpY2Vuc2luZ0NvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvbGljZW5zZS5tb2RlbCc7XHJcbmltcG9ydCB7IERPT0hCT1RfQURWQU5DRURfQ09ORklHIH0gZnJvbSAnLi4vbW9kZWxzL2Rvb2hib3QtY29uZmlnLm1vZGVsJztcclxuXHJcbi8vISBpbmhlcml0IFdpbmRvdyBzdG9yYWdlRXZlbnRBZGRlZCBmb3IgZHVwbGljYXRlIHRhYiBkZXRlY3Rpb25cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gIGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgc3RvcmFnZUV2ZW50QWRkZWQ/OiBib29sZWFuO1xyXG4gICAgdGFiQ0xvc2VFdmVudEFkZGVkPzogYm9vbGVhbjtcclxuICAgIGFicD86IGFueTtcclxuICAgIEFwcFByZUJvb3RzdHJhcD86IGFueTtcclxuICAgIEFwcENvbnN0cz86IGFueTtcclxuICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XHJcbiAgZ2V0IGFwaVVybCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29yZUNvbmZpZy5hcGlVcmw7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RvcmFnZUtleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29yZUNvbmZpZy5zdG9yYWdlS2V5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlY3JldEtleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29yZUNvbmZpZy5zZWNyZXRLZXk7XHJcbiAgfVxyXG5cclxuICBnZXQgY29tcGFueUNvZGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvcmVDb25maWcuY29tcGFueUNvZGU7XHJcbiAgfVxyXG5cclxuICBqd3RIZWxwZXI6IEp3dEhlbHBlclNlcnZpY2UgPSBuZXcgSnd0SGVscGVyU2VydmljZSgpO1xyXG4gIHByaXZhdGUgYWR2YW5jZWRDb25maWcgPSBpbmplY3QoRE9PSEJPVF9BRFZBTkNFRF9DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XHJcblxyXG4gIC8vIFJlYWN0aXZlIEF1dGhlbnRpY2F0aW9uIFN0YXRlXHJcbiAgcHJpdmF0ZSBhdXRoU3RhdHVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFN0YXR1cz4oJ3VuYXV0aGVudGljYXRlZCcpO1xyXG4gIHB1YmxpYyBhdXRoU3RhdHVzJCA9IHRoaXMuYXV0aFN0YXR1c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIC8vIFVJIFN0YXRlIFNpZ25hbHMgKE1lcmdlZCBmcm9tIENoYXRBdXRoU2VydmljZSlcclxuICBwdWJsaWMgaXNMb2dnaW5nSW4gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHB1YmxpYyBhdXRoRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgcHVibGljIGF1dGhTdWNjZXNzID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjcnlwdG9IZWxwZXI6IENyeXB0b0hlbHBlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRva2VuU3RvcmFnZTogU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBjb3JlQ29uZmlnOiBDb3JlQ29uZmlnU2VydmljZSxcclxuICApIHtcclxuICAgIC8vIFByb3BlcnRpZXMgYXJlIG5vdyBkZXJpdmVkIGZyb20gY29yZUNvbmZpZ1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGNvbXBvbmVudCBpbnB1dFxyXG4gICAqL1xyXG4gIHB1YmxpYyB1cGRhdGVDb25maWcoY29uZmlnOiBEb29oYm90SW5wdXQpOiB2b2lkIHtcclxuICAgIHRoaXMuY29yZUNvbmZpZy51cGRhdGVDb25maWcoY29uZmlnKTtcclxuICAgIGlmIChjb25maWcuc2VjcmV0S2V5KSB7XHJcbiAgICAgIHRoaXMuY3J5cHRvSGVscGVyLnNldFNlY3JldEtleShjb25maWcuc2VjcmV0S2V5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldExvZ2dlZEluVXNlck5hbWUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy50b2tlblN0b3JhZ2UuZ2V0KCd1c2VybmFtZScpO1xyXG4gICAgcmV0dXJuIHVzZXJuYW1lIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0TG9nZ2VkSW5Vc2VySW1hZ2VVcmwoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gRG9vaGJvdENvbnN0LnVzZXJBdmF0YXI7XHJcbiAgfVxyXG5cclxuICBnZXRMb2dnZWRJblVzZXJSb2xlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByb2xlcyA9IHRoaXMudG9rZW5TdG9yYWdlLmdldCgncm9sZXMnKTtcclxuICAgIC8vIElmIHJvbGVzIGlzIGFuIGFycmF5LCByZXR1cm4gdGhlIGZpcnN0IHJvbGUsIG90aGVyd2lzZSByZXR1cm4gdGhlIHN0cmluZ1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocm9sZXMpICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHJvbGVzWzBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvbGVzIHx8ICdVc2VyJztcclxuICB9XHJcblxyXG4gIC8vIEFkZCBnZXR0ZXJzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlmIG5lZWRlZCwgYnV0IHByZWZlcmFibHkgdXNlIGF1dGhTdGF0dXMkXHJcbiAgcHVibGljIGdldCBhdXRoU3RhdHVzKCk6IEF1dGhTdGF0dXMge1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0aFN0YXR1c1N1YmplY3QudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlcyBhIGZlZGVyYXRlZCB0b2tlbiBmcm9tIGJyb3dzZXIgc3RvcmFnZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzb2x2ZVNpbGVudFRva2VuKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb3JlQ29uZmlnLmNvbmZpZyQoKTtcclxuICAgIGNvbnN0IGNvbW1vbktleXMgPSBbJ2FjY2Vzc190b2tlbicsICdpZF90b2tlbicsICd0b2tlbicsICdhdXRoVG9rZW4nXTtcclxuXHJcbiAgICAvLyAxLiBUcnkgZXhwbGljaXQgYXV0aFRva2VuIGZyb20gY29uZmlnIChIaWdoZXN0IFByaW9yaXR5KVxyXG4gICAgaWYgKGNvbmZpZy5hdXRoVG9rZW4pIHtcclxuICAgICAgbG9nZ2VyLmluZm8oYFtBdXRoXSBVc2luZyBleHBsaWNpdCBhdXRoVG9rZW4gZnJvbSBpbnB1dGApO1xyXG4gICAgICByZXR1cm4gY29uZmlnLmF1dGhUb2tlbjtcclxuICAgIH1cclxuXHJcbiAgICAvLyAyLiBUcnkgY29uZmlndXJlZCBzdG9yYWdlIGtleSBmcm9tIGFkdmFuY2VkIGNvbmZpZ1xyXG4gICAgaWYgKHRoaXMuYWR2YW5jZWRDb25maWc/LmF1dG9Db25maWdGcm9tU3RvcmFnZSkge1xyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmFkdmFuY2VkQ29uZmlnLmF1dG9Db25maWdGcm9tU3RvcmFnZTtcclxuICAgICAgY29uc3QgdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpIHx8IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbQXV0aF0gUmVzb2x2ZWQgdG9rZW4gZnJvbSBjb25maWd1cmVkIGtleTogJHtrZXl9YCk7XHJcbiAgICAgICAgcmV0dXJuIHRva2VuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMy4gVHJ5IGNvbW1vbiBmYWxsYmFjayBrZXlzXHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBjb21tb25LZXlzKSB7XHJcbiAgICAgIGNvbnN0IHRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSB8fCBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0F1dGhdIFJlc29sdmVkIHRva2VuIGZyb20gZmFsbGJhY2sga2V5OiAke2tleX1gKTtcclxuICAgICAgICByZXR1cm4gdG9rZW47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF1dGhlbnRpY2F0ZSB1c2VyIHdpdGggZmVkZXJhdGVkIGNyZWRlbnRpYWxzXHJcbiAgICovXHJcbiAgYXN5bmMgZmVkZXJhdGVkTG9naW4oXHJcbiAgICBjcmVkZW50aWFsczogUGFydGlhbDxGZWRlcmF0ZWRMb2dpblJlcXVlc3Q+LFxyXG4gICAgc2lsZW50OiBib29sZWFuID0gdHJ1ZSxcclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxvZ2dlci5sb2coJz4+Pj4+Pj5BdHRlbXB0aW5nIGZlZGVyYXRlZCBsb2dpbi4uLicpO1xyXG5cclxuICAgIC8vIFJlc29sdmUgdG9rZW4gaWYgbm90IHByb3ZpZGVkXHJcbiAgICBpZiAoIWNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgIGNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuID0gdGhpcy5yZXNvbHZlU2lsZW50VG9rZW4oKSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBzdGlsbCBubyB0b2tlbiwgZXhpdCBncmFjZWZ1bGx5XHJcbiAgICBpZiAoIWNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgIGxvZ2dlci5sb2coJ1tBdXRoXSBObyBmZWRlcmF0ZWQgdG9rZW4gZm91bmQgaW4gc3RvcmFnZS4nKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2dnaW5nSW4uc2V0KHRydWUpO1xyXG4gICAgaWYgKCFzaWxlbnQpIHtcclxuICAgICAgdGhpcy5hdXRoRXJyb3Iuc2V0KG51bGwpO1xyXG4gICAgICB0aGlzLmF1dGhTdWNjZXNzLnNldChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UuZmVkZXJhdGVMb2dpbihjcmVkZW50aWFscyBhcyBGZWRlcmF0ZWRMb2dpblJlcXVlc3QpLFxyXG4gICAgICApO1xyXG4gICAgICBsb2dnZXIubG9nKCc+Pj4+Pj4+Pj4+PkZlZGVyYXRlZCBMb2dpbiByZXNwb25zZTw8PDw8PDw8PDw6JywgcmVzcG9uc2UpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XHJcbiAgICAgICAgLy8gTWFwIGZlZGVyYXRlZCByZXN1bHQgdG8gc29tZXRoaW5nIEF1dGhTZXJ2aWNlIGNhbiBoYW5kbGVcclxuICAgICAgICAvLyBGZWRlcmF0ZWQgcmVzdWx0OiB7IGFjY2Vzc190b2tlbjogc3RyaW5nLCByZW1lbWJlcl9tZTogYm9vbGVhbiB9XHJcbiAgICAgICAgY29uc3QgYXV0aFJlc3VsdCA9IHtcclxuICAgICAgICAgIGFjY2Vzc190b2tlbjogcmVzcG9uc2UuZGF0YS5hY2Nlc3NfdG9rZW4sXHJcbiAgICAgICAgICByZWZyZXNoX3Rva2VuOiBjcmVkZW50aWFscy5yZW1lbWJlck1lID8gcmVzcG9uc2UuZGF0YS5yZWZyZXNoX3Rva2VuIDogJycsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTZXNzaW9uKGF1dGhSZXN1bHQsIGNyZWRlbnRpYWxzLnJlbWVtYmVyTWUgfHwgZmFsc2UpO1xyXG5cclxuICAgICAgICBsb2dnZXIubG9nKCdGZWRlcmF0ZWQgbG9naW4gc3VjY2Vzc2Z1bCwgYXV0aGVudGljYXRlZCBzdGF0ZSBzZXQgdG8gdHJ1ZScpO1xyXG4gICAgICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgICAgICBTbmFja2JhclV0aWxzLnN1Y2Nlc3MoJ0xvZ2luIHN1Y2Nlc3NmdWwhJyk7XHJcbiAgICAgICAgICB0aGlzLmF1dGhTdWNjZXNzLnNldCgnTG9naW4gc3VjY2Vzc2Z1bCEnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0xvZ2dpbmdJbi5zZXQoZmFsc2UpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmF1dGhFcnJvci5zZXQoJ0ZlZGVyYXRlZCBsb2dpbiBmYWlsZWQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNMb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGxvZ2dlci5lcnJvcignRmVkZXJhdGVkIGxvZ2luIGZhaWxlZDonLCBlcnJvcik7XHJcbiAgICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgICAgdGhpcy5hdXRoRXJyb3Iuc2V0KCdBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgZmVkZXJhdGVkIGxvZ2luLicpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNMb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXV0aGVudGljYXRlIHVzZXIgd2l0aCBjcmVkZW50aWFsc1xyXG4gICAqL1xyXG4gIGFzeW5jIGxvZ2luKGNyZWRlbnRpYWxzOiBMb2dpblJlcXVlc3QsIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLmlzTG9nZ2luZ0luLnNldCh0cnVlKTtcclxuICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgIHRoaXMuYXV0aEVycm9yLnNldChudWxsKTsgLy9UT0RPXHJcbiAgICAgIHRoaXMuYXV0aFN1Y2Nlc3Muc2V0KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hY2NvdW50U2VydmljZS5sb2dpbihjcmVkZW50aWFscykpO1xyXG4gICAgICBsb2dnZXIubG9nKCc+Pj4+Pj4+Pj4+PkxvZ2luIHJlc3BvbnNlPDw8PDw8PDw8PDonLCByZXNwb25zZSk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcclxuICAgICAgICB0aGlzLnNldFNlc3Npb24ocmVzcG9uc2UuZGF0YSwgY3JlZGVudGlhbHMucmVtZW1iZXJNZSk7XHJcblxyXG4gICAgICAgIGxvZ2dlci5sb2coJ0xvZ2luIHN1Y2Nlc3NmdWwsIGF1dGhlbnRpY2F0ZWQgc3RhdGUgc2V0IHRvIHRydWUnKTtcclxuICAgICAgICBpZiAoIXNpbGVudCkge1xyXG4gICAgICAgICAgdGhpcy5hdXRoU3VjY2Vzcy5zZXQoJ0xvZ2luIHN1Y2Nlc3NmdWwhJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNMb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoIXNpbGVudCkge1xyXG4gICAgICAgICAgU25hY2tiYXJVdGlscy5lcnJvcignTG9naW4gZmFpbGVkLiBQbGVhc2UgY2hlY2sgeW91ciBjcmVkZW50aWFscy4nKTtcclxuICAgICAgICAgIHRoaXMuYXV0aEVycm9yLnNldCgnTG9naW4gZmFpbGVkLiBQbGVhc2UgY2hlY2sgeW91ciBjcmVkZW50aWFscy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0xvZ2dpbmdJbi5zZXQoZmFsc2UpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgbG9nZ2VyLmVycm9yKCdMb2dpbiBmYWlsZWQ6JywgZXJyb3IpO1xyXG4gICAgICBpZiAoIXNpbGVudCkge1xyXG4gICAgICAgIHRoaXMuYXV0aEVycm9yLnNldCgnQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGxvZ2luLicpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNMb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBMb2dvdXQgbG9naWMgZW5oYW5jZWQgd2l0aCBVSSBzaWduYWxzXHJcbiAgICovXHJcbiAgYXN5bmMgbG9nb3V0KHJlZnJlc2hUb2tlbj86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgdG9rZW4gPSByZWZyZXNoVG9rZW4gfHwgdGhpcy5nZXRSZWZyZXNoVG9rZW4oKSB8fCAnJztcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBJZiBubyB0b2tlbiwganVzdCBjbGVhciBsb2NhbCBzdGF0ZVxyXG4gICAgICBpZiAoIXRva2VuKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgICB0aGlzLmF1dGhTdWNjZXNzLnNldCgnTG9nZ2VkIG91dCBzdWNjZXNzZnVsbHkhJyk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dGhTdWNjZXNzLnNldChudWxsKSwgMzAwMCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hY2NvdW50U2VydmljZS5sb2dvdXQodG9rZW4pKTtcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgICB0aGlzLmF1dGhTdWNjZXNzLnNldCgnTG9nZ2VkIG91dCBzdWNjZXNzZnVsbHkhJyk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dGhTdWNjZXNzLnNldChudWxsKSwgMzAwMCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGxvZ2dlci5lcnJvcignTG9nb3V0IGZhaWxlZDonLCBlcnJvcik7XHJcbiAgICAgIFNuYWNrYmFyVXRpbHMuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBsb2dvdXQuJyk7XHJcbiAgICAgIC8vIEZvcmNlIGNsZWFyIGF1dGggb24gZXJyb3IgdG8gZW5zdXJlIHVzZXIgaXNuJ3Qgc3R1Y2tcclxuICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVXRpbGl0eVxyXG4gIHNldFNlc3Npb24oc2Vzc2lvbjogQXV0aFJlc3VsdCwgcmVtZW1iZXJNZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmp3dEhlbHBlci5kZWNvZGVUb2tlbihzZXNzaW9uLmFjY2Vzc190b2tlbik7XHJcblxyXG4gICAgLy8gU2V0IHN0b3JhZ2UgdHlwZSBiYXNlZCBvbiByZW1lbWJlck1lIHByZWZlcmVuY2VcclxuICAgIHRoaXMudG9rZW5TdG9yYWdlLnNldFJlbWVtYmVyTWUocmVtZW1iZXJNZSk7XHJcblxyXG4gICAgdGhpcy50b2tlblN0b3JhZ2Uuc2V0KCdhY2Nlc3NfdG9rZW4nLCBzZXNzaW9uLmFjY2Vzc190b2tlbik7XHJcbiAgICB0aGlzLnRva2VuU3RvcmFnZS5zZXQoJ3JlZnJlc2hfdG9rZW4nLCBzZXNzaW9uLnJlZnJlc2hfdG9rZW4pO1xyXG4gICAgdGhpcy50b2tlblN0b3JhZ2Uuc2V0KCd1c2VyX2lkJywgdXNlcj8udXNlcl9pZCk7XHJcbiAgICB0aGlzLnRva2VuU3RvcmFnZS5zZXQoJ3VzZXJuYW1lJywgdXNlcj8udXNlcm5hbWUpO1xyXG4gICAgdGhpcy50b2tlblN0b3JhZ2Uuc2V0KCdyb2xlcycsIHVzZXI/LnJvbGVzKTtcclxuICAgIHRoaXMudG9rZW5TdG9yYWdlLnNldCgncGVybWlzc2lvbnMnLCB1c2VyPy5wZXJtaXNzaW9ucyk7XHJcbiAgICB0aGlzLnRva2VuU3RvcmFnZS5zZXQoJ29yZ2FuaXphdGlvbl9pZCcsIHVzZXI/Lm9yZ2FuaXphdGlvbl9pZCk7XHJcbiAgICB0aGlzLnRva2VuU3RvcmFnZS5zZXQoJ2NvbXBhbnlfaWQnLCB1c2VyPy5jb21wYW55X2lkKTtcclxuICAgIHRoaXMudG9rZW5TdG9yYWdlLnNldCgnb2ZmaWNlX2lkJywgdXNlcj8ub2ZmaWNlX2lkKTtcclxuXHJcbiAgICAvLyBOb3RpZnkgc3Vic2NyaWJlcnNcclxuICAgIHRoaXMuYXV0aFN0YXR1c1N1YmplY3QubmV4dCgnYXV0aGVudGljYXRlZCcpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3JnYW5pemF0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBsb2dnZXIuZGVidWcoJz4+Pj4+Pj4+Pj5nZXRPcmdhbml6YXRpb25JZDw8PDw8PDw6JywgdGhpcy50b2tlblN0b3JhZ2UuZ2V0KCdvcmdhbml6YXRpb25faWQnKSk7XHJcbiAgICByZXR1cm4gdGhpcy50b2tlblN0b3JhZ2UuZ2V0KCdvcmdhbml6YXRpb25faWQnKTtcclxuICB9XHJcblxyXG4gIGdldFJlZnJlc2hUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGxvZ2dlci5kZWJ1ZygnPj4+Pj4+Pj4+PmdldFJlZnJlc2hUb2tlbjw8PDw8PDw6JywgdGhpcy50b2tlblN0b3JhZ2UuZ2V0KCdyZWZyZXNoX3Rva2VuJykpO1xyXG4gICAgcmV0dXJuIHRoaXMudG9rZW5TdG9yYWdlLmdldCgncmVmcmVzaF90b2tlbicpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaFRva2VuKCk6IE9ic2VydmFibGU8QXV0aFJlc3VsdD4ge1xyXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5nZXRSZWZyZXNoVG9rZW4oKTtcclxuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignTm8gcmVmcmVzaCB0b2tlbiBhdmFpbGFibGUnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYWNjb3VudFNlcnZpY2UucmVmcmVzaExvZ2luKHsgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuIH0pLnBpcGUoXHJcbiAgICAgIHJldHJ5KDMpLCAvLyBSZXRyeSAzIHRpbWVzIG9uIGZhaWx1cmVcclxuICAgICAgdGFwKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xyXG4gICAgICAgICAgdGhpcy5zZXRTZXNzaW9uKHJlc3BvbnNlLmRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhIGFzIEF1dGhSZXN1bHQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gcmVmcmVzaCBmYWlsZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICBsb2dnZXIuZXJyb3IoJ1tBdXRoXSBUb2tlbiByZWZyZXNoIGZhaWxlZCBhZnRlciByZXRyaWVzOicsIGVycik7XHJcbiAgICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgICBTbmFja2JhclV0aWxzLmVycm9yKCdTZXNzaW9uIEV4cGlyZWQuIFBsZWFzZSBsb2dpbi4nKTtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xyXG4gICAgICB9KSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5TdG9yYWdlLmdldCgnYWNjZXNzX3Rva2VuJyk7XHJcbiAgICByZXR1cm4gISF0b2tlbiAmJiAhdGhpcy5pc1Rva2VuRXhwaXJlZCgpO1xyXG4gIH1cclxuXHJcbiAgaXNUb2tlbkV4cGlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdG9rZW4gPSAodGhpcy50b2tlblN0b3JhZ2UuZ2V0KCdhY2Nlc3NfdG9rZW4nKSA/PyAnJykgYXMgc3RyaW5nO1xyXG4gICAgaWYgKHRva2VuKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmp3dEhlbHBlci5pc1Rva2VuRXhwaXJlZCh0b2tlbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIHN0b3JlZCB0b2tlbiBvbiBhcHAgc3RhcnR1cFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlU3RvcmVkVG9rZW4oKTogT2JzZXJ2YWJsZTxBdXRoU3RhdHVzPiB7XHJcbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IHRoaXMudG9rZW5TdG9yYWdlLmdldCgnYWNjZXNzX3Rva2VuJyk7XHJcblxyXG4gICAgLy8hIE5vIGFjY2VzcyB0b2tlblxyXG4gICAgaWYgKCFhY2Nlc3NUb2tlbikge1xyXG4gICAgICAvL1RPRE86IEZPUkNFIEFVVEhFTlRJQ0FURUQgRk9SIERFVlxyXG4gICAgICAvLyB0aGlzLmF1dGhTdGF0dXNTdWJqZWN0Lm5leHQoJ2F1dGhlbnRpY2F0ZWQnKTtcclxuICAgICAgLy8gcmV0dXJuIG9mKCdhdXRoZW50aWNhdGVkJyk7XHJcblxyXG4gICAgICAvLyEgRm9yIHByb2R1Y3Rpb24gKCBCYWNrZW5kIFZhbGlkYXRpb24gKVxyXG4gICAgICB0aGlzLmF1dGhTdGF0dXNTdWJqZWN0Lm5leHQoJ3VuYXV0aGVudGljYXRlZCcpO1xyXG4gICAgICByZXR1cm4gb2YoJ3VuYXV0aGVudGljYXRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFjY2VzcyB0b2tlbiB2YWxpZFxyXG4gICAgaWYgKCF0aGlzLmlzVG9rZW5FeHBpcmVkKCkpIHtcclxuICAgICAgdGhpcy5hdXRoU3RhdHVzU3ViamVjdC5uZXh0KCdhdXRoZW50aWNhdGVkJyk7XHJcbiAgICAgIHJldHVybiBvZignYXV0aGVudGljYXRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFjY2VzcyBUb2tlbiBleHBpcmVkIC0+IHRyeSByZWZyZXNoXHJcbiAgICBjb25zdCByZWZyZXNoVG9rZW4gPSB0aGlzLmdldFJlZnJlc2hUb2tlbigpO1xyXG4gICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcclxuICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgdGhpcy5hdXRoU3RhdHVzU3ViamVjdC5uZXh0KCd1bmF1dGhlbnRpY2F0ZWQnKTtcclxuICAgICAgcmV0dXJuIG9mKCd1bmF1dGhlbnRpY2F0ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyEgQWNjZXNzIGV4cGlyZWQgYnV0IHJlZnJlc2ggdG9rZW4gZXhpc3RzIOKGkiBhdHRlbXB0IHJlZnJlc2hcclxuICAgIHRoaXMuYXV0aFN0YXR1c1N1YmplY3QubmV4dCgnZXhwaXJlZCcpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuKCkucGlwZShcclxuICAgICAgbWFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLmF1dGhTdGF0dXNTdWJqZWN0Lm5leHQoJ2F1dGhlbnRpY2F0ZWQnKTtcclxuICAgICAgICByZXR1cm4gJ2F1dGhlbnRpY2F0ZWQnIGFzIEF1dGhTdGF0dXM7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICBsb2dnZXIuZXJyb3IoJ1tBdXRoXSBUb2tlbiByZWZyZXNoIGZhaWxlZDonLCBlcnIpO1xyXG4gICAgICAgIHRoaXMuY2xlYXJBdXRoKCk7XHJcbiAgICAgICAgdGhpcy5hdXRoU3RhdHVzU3ViamVjdC5uZXh0KCd1bmF1dGhlbnRpY2F0ZWQnKTtcclxuICAgICAgICByZXR1cm4gb2YoJ3VuYXV0aGVudGljYXRlZCcgYXMgQXV0aFN0YXR1cyk7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldFVzZXJJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRva2VuU3RvcmFnZS5nZXQoJ3VzZXJfaWQnKSB8fCAnJztcclxuICB9XHJcblxyXG4gIGdldExpY2Vuc2luZ0NvbnRleHQoKTogTGljZW5zaW5nQ29udGV4dCB7XHJcbiAgICBjb25zdCByb2xlcyA9IHRoaXMudG9rZW5TdG9yYWdlLmdldCgncm9sZXMnKTtcclxuICAgIC8vIFByZWZlciBjb21wYW55X2lkIChzcGVjaWZpYyB0ZW5hbnQpIG92ZXIgb3JnYW5pemF0aW9uX2lkIChzeXN0ZW0gZ3JvdXApXHJcbiAgICBjb25zdCB0ZW5hbnRJZCA9IHRoaXMudG9rZW5TdG9yYWdlLmdldCgnY29tcGFueV9pZCcpIHx8IHRoaXMuZ2V0T3JnYW5pemF0aW9uSWQoKSB8fCAnJztcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0ZW5hbnRJZDogdGVuYW50SWQsXHJcbiAgICAgIHByaW5jaXBhbElkOiB0aGlzLmdldFVzZXJJZCgpIHx8ICcnLFxyXG4gICAgICByb2xlczogQXJyYXkuaXNBcnJheShyb2xlcykgPyByb2xlcyA6IHJvbGVzID8gW3JvbGVzXSA6IFtdLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldCBsaWNlbnNlS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b2tlblN0b3JhZ2UuZ2V0KCdsaWNlbnNlX2tleScpIHx8IHRoaXMuY29yZUNvbmZpZy5saWNlbnNlS2V5IHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRmVkZXJhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubGljZW5zZUtleS5zdGFydHNXaXRoKCdkb29oYm90X2xpY18nKTtcclxuICB9XHJcblxyXG4gIHNldExpY2Vuc2VLZXkoa2V5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMudG9rZW5TdG9yYWdlLnNldCgnbGljZW5zZV9rZXknLCBrZXkpO1xyXG4gIH1cclxuXHJcbiAgLy8hIGNsZWFyIGxvY2FsIHN0b3JhZ2VcclxuICAvKipcclxuICAgKiBDbGVhciBhbGwgYXV0aGVudGljYXRpb24gcmVsYXRlZCBkYXRhIGZyb20gbG9jYWwgc3RvcmFnZSwgc2Vzc2lvbiBzdG9yYWdlLCBjYWNoZSwgYW5kIHRva2Vucy5cclxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBsb2dzIG91dC5cclxuICAgKi9cclxuICBjbGVhckF1dGgoKSB7XHJcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLmdldFVzZXJJZCgpO1xyXG4gICAgbG9nZ2VyLmxvZygnW0F1dGhdIENsZWFyaW5nIGF1dGg6JywgeyB1c2VySWQgfSk7XHJcblxyXG4gICAgdGhpcy5jbGVhclNlc3Npb24oKTtcclxuICAgIHRoaXMuY2xlYXJTdG9yYWdlKCk7XHJcbiAgICB0aGlzLmNsZWFyQ2FjaGUoKTtcclxuICAgIHRoaXMuY2xlYXJMb2NhbFN0b3JhZ2UoKTtcclxuXHJcbiAgICAvLyBFTlNVUkUgYXV0aFN0YXR1cyQgZW1pdHMgdW5hdXRoZW50aWNhdGVkXHJcbiAgICB0aGlzLmF1dGhTdGF0dXNTdWJqZWN0Lm5leHQoJ3VuYXV0aGVudGljYXRlZCcpO1xyXG5cclxuICAgIGxvZ2dlci5sb2coJ1tBdXRoXSBBdXRoIGNsZWFyZWQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgfVxyXG5cclxuICBjbGVhclNlc3Npb24oKSB7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJUYWJJbmZvKCkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RhYnMnKTtcclxuICB9XHJcblxyXG4gIGNsZWFyU3RvcmFnZSgpIHtcclxuICAgIHRoaXMudG9rZW5TdG9yYWdlLmNsZWFyKCk7XHJcbiAgfVxyXG4gIGNsZWFyTG9jYWxTdG9yYWdlKCkge1xyXG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBjbGVhckNhY2hlKCkge1xyXG4gICAgLy8gdGhpcy5jYWNoZVNlcnZpY2UuY2xlYXIoKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,3 @@
1
+ export class AuthResult {
2
+ }
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1yZXN1bHQubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvY29yZS9hdXRoL21vZGVscy9hdXRoLXJlc3VsdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sVUFBVTtDQUd0QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBBdXRoUmVzdWx0IHtcclxuICBhY2Nlc3NfdG9rZW4hOiBzdHJpbmc7XHJcbiAgcmVmcmVzaF90b2tlbiE6IHN0cmluZztcclxufVxyXG4iXX0=
@@ -0,0 +1,6 @@
1
+ export class FederatedLoginRequest {
2
+ constructor() {
3
+ this.rememberMe = false;
4
+ }
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVkZXJhdGVkLWxvZ2luLXJlcXVlc3QubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvY29yZS9hdXRoL21vZGVscy9mZWRlcmF0ZWQtbG9naW4tcmVxdWVzdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8scUJBQXFCO0lBQWxDO1FBRUUsZUFBVSxHQUFhLEtBQUssQ0FBQztJQUUvQixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRmVkZXJhdGVkTG9naW5SZXF1ZXN0IHtcclxuICBhY2Nlc3NUb2tlbiE6IHN0cmluZztcclxuICByZW1lbWJlck1lPzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGxpY2Vuc2U/OiBzdHJpbmc7XHJcbn1cclxuIl19
@@ -0,0 +1,6 @@
1
+ export class LoginRequest {
2
+ constructor() {
3
+ this.rememberMe = false;
4
+ }
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tcmVxdWVzdC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rvb2hib3Qvc3JjL2xpYi9jb3JlL2F1dGgvbW9kZWxzL2xvZ2luLXJlcXVlc3QubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFlBQVk7SUFBekI7UUFHRSxlQUFVLEdBQWEsS0FBSyxDQUFDO0lBRS9CLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBMb2dpblJlcXVlc3Qge1xyXG4gIHVzZXJuYW1lITogc3RyaW5nO1xyXG4gIHBhc3N3b3JkITogc3RyaW5nO1xyXG4gIHJlbWVtYmVyTWU/OiBib29sZWFuID0gZmFsc2U7XHJcbiAgbGljZW5zZT86IHN0cmluZztcclxufVxyXG4iXX0=
@@ -0,0 +1,110 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as CryptoJS from 'crypto-js';
3
+ import Logger from '../utils/logger.service';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../services/core-config.service";
6
+ export class StorageService {
7
+ get storageKey() {
8
+ return this.coreConfig.storageKey;
9
+ }
10
+ get secretKey() {
11
+ return this.coreConfig.secretKey;
12
+ }
13
+ constructor(coreConfig) {
14
+ this.coreConfig = coreConfig;
15
+ // Determine initial storage
16
+ // If session storage has data, use it (implies remember me was false)
17
+ // Otherwise default/fallback to local storage
18
+ if (sessionStorage.getItem(this.storageKey)) {
19
+ this.storage = sessionStorage;
20
+ }
21
+ else {
22
+ this.storage = localStorage;
23
+ }
24
+ }
25
+ setRememberMe(rememberMe) {
26
+ const currentData = this.storage.getItem(this.storageKey);
27
+ const targetStorage = rememberMe ? localStorage : sessionStorage;
28
+ // If storage type is changing, move data
29
+ if (this.storage !== targetStorage) {
30
+ if (currentData) {
31
+ targetStorage.setItem(this.storageKey, currentData);
32
+ this.storage.removeItem(this.storageKey);
33
+ }
34
+ this.storage = targetStorage;
35
+ }
36
+ }
37
+ set(key, value) {
38
+ const data = this.storage.getItem(this.storageKey);
39
+ let dataJson = {};
40
+ if (data) {
41
+ const dataDec = this.decrypt(data);
42
+ if (dataDec) {
43
+ dataJson = JSON.parse(dataDec);
44
+ }
45
+ }
46
+ dataJson = Object.assign(dataJson, { [key]: value });
47
+ this.storage.setItem(this.storageKey, this.encrypt(JSON.stringify(dataJson)));
48
+ }
49
+ get(key) {
50
+ const data = this.storage.getItem(this.storageKey);
51
+ if (data) {
52
+ const dataDec = this.decrypt(data);
53
+ if (dataDec) {
54
+ try {
55
+ const dataJson = JSON.parse(dataDec);
56
+ return dataJson[key] || null;
57
+ }
58
+ catch (e) {
59
+ Logger.error('[TokenStorage] Failed to parse decrypted data, clearing corrupt storage:', e);
60
+ this.clear();
61
+ return null;
62
+ }
63
+ }
64
+ else {
65
+ // Decrypt failed, auto-clear corrupt storage
66
+ Logger.error('[TokenStorage] Decrypt failed, clearing corrupt storage');
67
+ this.clear();
68
+ }
69
+ }
70
+ return null;
71
+ }
72
+ /**
73
+ * Check if storage is valid (can be decrypted) without side effects
74
+ */
75
+ isValid() {
76
+ const data = this.storage.getItem(this.storageKey);
77
+ if (!data)
78
+ return false;
79
+ const decrypted = this.decrypt(data);
80
+ return decrypted !== null && decrypted !== '';
81
+ }
82
+ clear() {
83
+ // Clear both to be safe
84
+ localStorage.removeItem(this.storageKey);
85
+ sessionStorage.removeItem(this.storageKey);
86
+ }
87
+ encrypt(value) {
88
+ return CryptoJS.AES.encrypt(value, this.secretKey).toString();
89
+ }
90
+ decrypt(value) {
91
+ try {
92
+ const bytes = CryptoJS.AES.decrypt(value, this.secretKey);
93
+ const decrypted = bytes.toString(CryptoJS.enc.Utf8);
94
+ return decrypted || null;
95
+ }
96
+ catch (e) {
97
+ Logger.error('[TokenStorage] Decryption error:', e);
98
+ return null;
99
+ }
100
+ }
101
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StorageService, deps: [{ token: i1.CoreConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
102
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StorageService, providedIn: 'root' }); }
103
+ }
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StorageService, decorators: [{
105
+ type: Injectable,
106
+ args: [{
107
+ providedIn: 'root',
108
+ }]
109
+ }], ctorParameters: () => [{ type: i1.CoreConfigService }] });
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9vaGJvdC9zcmMvbGliL2NvcmUvYXV0aC9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLE1BQU0sTUFBTSx5QkFBeUIsQ0FBQzs7O0FBSzdDLE1BQU0sT0FBTyxjQUFjO0lBQ3pCLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUlELFlBQW9CLFVBQTZCO1FBQTdCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQy9DLDRCQUE0QjtRQUM1QixzRUFBc0U7UUFDdEUsOENBQThDO1FBQzlDLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUM7U0FDL0I7YUFBTTtZQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFtQjtRQUMvQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUVqRSx5Q0FBeUM7UUFDekMsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLGFBQWEsRUFBRTtZQUNsQyxJQUFJLFdBQVcsRUFBRTtnQkFDZixhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUMxQztZQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBVTtRQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkQsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxFQUFFO1lBQ1IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLE9BQU8sRUFBRTtnQkFDWCxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNoQztTQUNGO1FBQ0QsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVc7UUFDYixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkQsSUFBSSxJQUFJLEVBQUU7WUFDUixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUk7b0JBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckMsT0FBTyxRQUFTLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDO2lCQUMvQjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDVixNQUFNLENBQUMsS0FBSyxDQUNWLDBFQUEwRSxFQUMxRSxDQUFDLENBQ0YsQ0FBQztvQkFDRixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2IsT0FBTyxJQUFJLENBQUM7aUJBQ2I7YUFDRjtpQkFBTTtnQkFDTCw2Q0FBNkM7Z0JBQzdDLE1BQU0sQ0FBQyxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztnQkFDeEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2Q7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsT0FBTyxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELEtBQUs7UUFDSCx3QkFBd0I7UUFDeEIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLE9BQU8sQ0FBQyxLQUFhO1FBQzNCLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBRU8sT0FBTyxDQUFDLEtBQWE7UUFDM0IsSUFBSTtZQUNGLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELE9BQU8sU0FBUyxJQUFJLElBQUksQ0FBQztTQUMxQjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQzsrR0F2R1UsY0FBYzttSEFBZCxjQUFjLGNBRmIsTUFBTTs7NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIENyeXB0b0pTIGZyb20gJ2NyeXB0by1qcyc7XHJcbmltcG9ydCB7IENvcmVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29yZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCBMb2dnZXIgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VTZXJ2aWNlIHtcclxuICBnZXQgc3RvcmFnZUtleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29yZUNvbmZpZy5zdG9yYWdlS2V5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlY3JldEtleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29yZUNvbmZpZy5zZWNyZXRLZXk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29yZUNvbmZpZzogQ29yZUNvbmZpZ1NlcnZpY2UpIHtcclxuICAgIC8vIERldGVybWluZSBpbml0aWFsIHN0b3JhZ2VcclxuICAgIC8vIElmIHNlc3Npb24gc3RvcmFnZSBoYXMgZGF0YSwgdXNlIGl0IChpbXBsaWVzIHJlbWVtYmVyIG1lIHdhcyBmYWxzZSlcclxuICAgIC8vIE90aGVyd2lzZSBkZWZhdWx0L2ZhbGxiYWNrIHRvIGxvY2FsIHN0b3JhZ2VcclxuICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZUtleSkpIHtcclxuICAgICAgdGhpcy5zdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRSZW1lbWJlck1lKHJlbWVtYmVyTWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGN1cnJlbnREYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlS2V5KTtcclxuICAgIGNvbnN0IHRhcmdldFN0b3JhZ2UgPSByZW1lbWJlck1lID8gbG9jYWxTdG9yYWdlIDogc2Vzc2lvblN0b3JhZ2U7XHJcblxyXG4gICAgLy8gSWYgc3RvcmFnZSB0eXBlIGlzIGNoYW5naW5nLCBtb3ZlIGRhdGFcclxuICAgIGlmICh0aGlzLnN0b3JhZ2UgIT09IHRhcmdldFN0b3JhZ2UpIHtcclxuICAgICAgaWYgKGN1cnJlbnREYXRhKSB7XHJcbiAgICAgICAgdGFyZ2V0U3RvcmFnZS5zZXRJdGVtKHRoaXMuc3RvcmFnZUtleSwgY3VycmVudERhdGEpO1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuc3RvcmFnZUtleSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdG9yYWdlID0gdGFyZ2V0U3RvcmFnZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZUtleSk7XHJcbiAgICBsZXQgZGF0YUpzb246IGFueSA9IHt9O1xyXG4gICAgaWYgKGRhdGEpIHtcclxuICAgICAgY29uc3QgZGF0YURlYyA9IHRoaXMuZGVjcnlwdChkYXRhKTtcclxuICAgICAgaWYgKGRhdGFEZWMpIHtcclxuICAgICAgICBkYXRhSnNvbiA9IEpTT04ucGFyc2UoZGF0YURlYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGRhdGFKc29uID0gT2JqZWN0LmFzc2lnbihkYXRhSnNvbiwgeyBba2V5XTogdmFsdWUgfSk7XHJcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXksIHRoaXMuZW5jcnlwdChKU09OLnN0cmluZ2lmeShkYXRhSnNvbikpKTtcclxuICB9XHJcblxyXG4gIGdldChrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlS2V5KTtcclxuICAgIGlmIChkYXRhKSB7XHJcbiAgICAgIGNvbnN0IGRhdGFEZWMgPSB0aGlzLmRlY3J5cHQoZGF0YSk7XHJcbiAgICAgIGlmIChkYXRhRGVjKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGRhdGFKc29uID0gSlNPTi5wYXJzZShkYXRhRGVjKTtcclxuICAgICAgICAgIHJldHVybiBkYXRhSnNvbiFba2V5XSB8fCBudWxsO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIExvZ2dlci5lcnJvcihcclxuICAgICAgICAgICAgJ1tUb2tlblN0b3JhZ2VdIEZhaWxlZCB0byBwYXJzZSBkZWNyeXB0ZWQgZGF0YSwgY2xlYXJpbmcgY29ycnVwdCBzdG9yYWdlOicsXHJcbiAgICAgICAgICAgIGUsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIERlY3J5cHQgZmFpbGVkLCBhdXRvLWNsZWFyIGNvcnJ1cHQgc3RvcmFnZVxyXG4gICAgICAgIExvZ2dlci5lcnJvcignW1Rva2VuU3RvcmFnZV0gRGVjcnlwdCBmYWlsZWQsIGNsZWFyaW5nIGNvcnJ1cHQgc3RvcmFnZScpO1xyXG4gICAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBzdG9yYWdlIGlzIHZhbGlkIChjYW4gYmUgZGVjcnlwdGVkKSB3aXRob3V0IHNpZGUgZWZmZWN0c1xyXG4gICAqL1xyXG4gIGlzVmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlS2V5KTtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgZGVjcnlwdGVkID0gdGhpcy5kZWNyeXB0KGRhdGEpO1xyXG4gICAgcmV0dXJuIGRlY3J5cHRlZCAhPT0gbnVsbCAmJiBkZWNyeXB0ZWQgIT09ICcnO1xyXG4gIH1cclxuXHJcbiAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAvLyBDbGVhciBib3RoIHRvIGJlIHNhZmVcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuc3RvcmFnZUtleSk7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuc3RvcmFnZUtleSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVuY3J5cHQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gQ3J5cHRvSlMuQUVTLmVuY3J5cHQodmFsdWUsIHRoaXMuc2VjcmV0S2V5KS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWNyeXB0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGJ5dGVzID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQodmFsdWUsIHRoaXMuc2VjcmV0S2V5KTtcclxuICAgICAgY29uc3QgZGVjcnlwdGVkID0gYnl0ZXMudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xyXG4gICAgICByZXR1cm4gZGVjcnlwdGVkIHx8IG51bGw7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIExvZ2dlci5lcnJvcignW1Rva2VuU3RvcmFnZV0gRGVjcnlwdGlvbiBlcnJvcjonLCBlKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==