@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.
- package/esm2022/aakash58-chatbot.mjs +5 -0
- package/esm2022/lib/app/chat/chat-ui-state.service.mjs +170 -0
- package/esm2022/lib/app/chat/chat.service.mjs +445 -0
- package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +50 -0
- package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +12 -0
- package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +66 -0
- package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +186 -0
- package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +312 -0
- package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +36 -0
- package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +115 -0
- package/esm2022/lib/app/chat/model/chat-history.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-request.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-response.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-session.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +2 -0
- package/esm2022/lib/app/chat/services/chat-api.service.mjs +61 -0
- package/esm2022/lib/app/chat/services/chat-audio.service.mjs +50 -0
- package/esm2022/lib/app/chat/services/chat-history.service.mjs +252 -0
- package/esm2022/lib/app/login/login-form.component.mjs +46 -0
- package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +194 -0
- package/esm2022/lib/app/personalization/personalization.service.mjs +149 -0
- package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +122 -0
- package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +86 -0
- package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +115 -0
- package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +29 -0
- package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +30 -0
- package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +12 -0
- package/esm2022/lib/constant/doohbot-constant.mjs +28 -0
- package/esm2022/lib/constant/html-entities.mjs +9 -0
- package/esm2022/lib/constant/utf8.mjs +10 -0
- package/esm2022/lib/core/app-const.mjs +61 -0
- package/esm2022/lib/core/auth/account-api.service.mjs +40 -0
- package/esm2022/lib/core/auth/auth.service.mjs +391 -0
- package/esm2022/lib/core/auth/models/auth-result.model.mjs +3 -0
- package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +6 -0
- package/esm2022/lib/core/auth/models/login-request.model.mjs +6 -0
- package/esm2022/lib/core/auth/storage.service.mjs +110 -0
- package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +112 -0
- package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +55 -0
- package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +179 -0
- package/esm2022/lib/core/environments/environment.mjs +15 -0
- package/esm2022/lib/core/environments/environment.prod.mjs +15 -0
- package/esm2022/lib/core/helpers/crypto-helper.service.mjs +52 -0
- package/esm2022/lib/core/http/http-stream.service.mjs +97 -0
- package/esm2022/lib/core/http/http.service.mjs +103 -0
- package/esm2022/lib/core/interceptors/auth.interceptor.mjs +96 -0
- package/esm2022/lib/core/interceptors/license.interceptor.mjs +44 -0
- package/esm2022/lib/core/models/api-config.model.mjs +18 -0
- package/esm2022/lib/core/models/api-request.model.mjs +2 -0
- package/esm2022/lib/core/models/api-response.model.mjs +8 -0
- package/esm2022/lib/core/models/doohbot-config.model.mjs +18 -0
- package/esm2022/lib/core/models/license.model.mjs +2 -0
- package/esm2022/lib/core/models/message.mjs +2 -0
- package/esm2022/lib/core/models/theme-config.model.mjs +2 -0
- package/esm2022/lib/core/services/core-config.service.mjs +52 -0
- package/esm2022/lib/core/services/license.service.mjs +145 -0
- package/esm2022/lib/core/services/markdown.service.mjs +64 -0
- package/esm2022/lib/core/services/theme.service.mjs +248 -0
- package/esm2022/lib/core/types/auth-mode.type.mjs +2 -0
- package/esm2022/lib/core/types/auth-status.type.mjs +5 -0
- package/esm2022/lib/core/types/chat-stream.type.mjs +2 -0
- package/esm2022/lib/core/types/message-role.type.mjs +2 -0
- package/esm2022/lib/core/types/prompt-mode.type.mjs +5 -0
- package/esm2022/lib/core/types/snackbar-error.type.mjs +5 -0
- package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +2 -0
- package/esm2022/lib/core/utils/logger.service.mjs +42 -0
- package/esm2022/lib/doohbot-input.mjs +20 -0
- package/esm2022/lib/doohbot.component.mjs +444 -0
- package/esm2022/lib/predefined_messages.mjs +15 -0
- package/esm2022/lib/shared/chips/chips.component.mjs +28 -0
- package/esm2022/lib/shared/dialog/dialog.component.mjs +36 -0
- package/esm2022/lib/shared/dialog/dialog.service.mjs +64 -0
- package/esm2022/lib/shared/dialog/dialog.utils.mjs +85 -0
- package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +29 -0
- package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +38 -0
- package/esm2022/lib/shared/menu-item/menu-item.component.mjs +24 -0
- package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +27 -0
- package/esm2022/lib/shared/snackbar/snackbar.component.mjs +43 -0
- package/esm2022/lib/shared/snackbar/snackbar.service.mjs +46 -0
- package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +43 -0
- package/esm2022/public-api.mjs +37 -0
- package/fesm2022/aakash58-chatbot.mjs +1114 -867
- package/fesm2022/aakash58-chatbot.mjs.map +1 -1
- package/index.d.ts +3 -377
- package/lib/app/chat/chat-ui-state.service.d.ts +96 -0
- package/lib/app/chat/chat.service.d.ts +88 -0
- package/lib/app/chat/components/chat-button/chat-button.component.d.ts +16 -0
- package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +5 -0
- package/lib/app/chat/components/chat-header/chat-header.component.d.ts +24 -0
- package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +49 -0
- package/lib/app/chat/components/chat-window/chat-window.component.d.ts +107 -0
- package/lib/app/chat/components/message-input/message-input.component.d.ts +12 -0
- package/lib/app/chat/components/message-list/message-list.component.d.ts +40 -0
- package/lib/app/chat/model/chat-history.model.d.ts +51 -0
- package/lib/app/chat/model/chat-request.model.d.ts +10 -0
- package/lib/app/chat/model/chat-response.model.d.ts +9 -0
- package/lib/app/chat/model/chat-session.model.d.ts +12 -0
- package/lib/app/chat/model/chat-stream-message.model.d.ts +5 -0
- package/lib/app/chat/model/chat-stream-response.model.d.ts +10 -0
- package/lib/app/chat/services/chat-api.service.d.ts +30 -0
- package/lib/app/chat/services/chat-audio.service.d.ts +19 -0
- package/lib/app/chat/services/chat-history.service.d.ts +53 -0
- package/lib/app/login/login-form.component.d.ts +20 -0
- package/lib/app/personalization/personalization-dialog.component.d.ts +53 -0
- package/lib/app/personalization/personalization.service.d.ts +66 -0
- package/lib/app/personalization/sections/account/account-section.component.d.ts +30 -0
- package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +17 -0
- package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +27 -0
- package/lib/app/personalization/sections/profile/profile-section.component.d.ts +17 -0
- package/lib/app/personalization/sections/settings/setting-section.component.d.ts +10 -0
- package/lib/app/personalization/sections/terms/terms-section.component.d.ts +5 -0
- package/lib/constant/doohbot-constant.d.ts +12 -0
- package/lib/constant/html-entities.d.ts +8 -0
- package/lib/constant/utf8.d.ts +9 -0
- package/lib/core/app-const.d.ts +11 -0
- package/lib/core/auth/account-api.service.d.ts +20 -0
- package/lib/core/auth/auth.service.d.ts +90 -0
- package/lib/core/auth/models/auth-result.model.d.ts +4 -0
- package/lib/core/auth/models/federated-login-request.model.d.ts +5 -0
- package/lib/core/auth/models/login-request.model.d.ts +6 -0
- package/lib/core/auth/storage.service.d.ts +21 -0
- package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +23 -0
- package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +14 -0
- package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +30 -0
- package/lib/core/environments/environment.d.ts +7 -0
- package/lib/core/environments/environment.prod.d.ts +7 -0
- package/lib/core/helpers/crypto-helper.service.d.ts +12 -0
- package/lib/core/http/http-stream.service.d.ts +18 -0
- package/lib/core/http/http.service.d.ts +20 -0
- package/lib/core/interceptors/auth.interceptor.d.ts +18 -0
- package/lib/core/interceptors/license.interceptor.d.ts +11 -0
- package/lib/core/models/api-config.model.d.ts +58 -0
- package/lib/core/models/api-request.model.d.ts +77 -0
- package/lib/core/models/api-response.model.d.ts +6 -0
- package/lib/core/models/doohbot-config.model.d.ts +81 -0
- package/lib/core/models/license.model.d.ts +23 -0
- package/lib/core/models/message.d.ts +16 -0
- package/lib/core/models/theme-config.model.d.ts +28 -0
- package/lib/core/services/core-config.service.d.ts +23 -0
- package/lib/core/services/license.service.d.ts +33 -0
- package/lib/core/services/markdown.service.d.ts +8 -0
- package/lib/core/services/theme.service.d.ts +40 -0
- package/lib/core/types/auth-mode.type.d.ts +4 -0
- package/lib/core/types/auth-status.type.d.ts +4 -0
- package/lib/core/types/chat-stream.type.d.ts +4 -0
- package/lib/core/types/message-role.type.d.ts +4 -0
- package/lib/core/types/prompt-mode.type.d.ts +4 -0
- package/lib/core/types/snackbar-error.type.d.ts +4 -0
- package/lib/core/types/tenant-resolution-strategy.type.d.ts +4 -0
- package/lib/core/utils/logger.service.d.ts +11 -0
- package/lib/doohbot-input.d.ts +19 -0
- package/lib/doohbot.component.d.ts +108 -0
- package/lib/predefined_messages.d.ts +2 -0
- package/lib/shared/chips/chips.component.d.ts +10 -0
- package/lib/shared/dialog/dialog.component.d.ts +19 -0
- package/lib/shared/dialog/dialog.service.d.ts +29 -0
- package/lib/shared/dialog/dialog.utils.d.ts +41 -0
- package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +11 -0
- package/lib/shared/input-dialog/input-dialog.component.d.ts +20 -0
- package/lib/shared/menu-item/menu-item.component.d.ts +9 -0
- package/lib/shared/pipes/simple-markdown.pipe.d.ts +10 -0
- package/lib/shared/snackbar/snackbar.component.d.ts +14 -0
- package/lib/shared/snackbar/snackbar.service.d.ts +19 -0
- package/lib/shared/snackbar/snackbar.utils.d.ts +33 -0
- package/package.json +4 -2
- package/public-api.d.ts +11 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
|
5
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
7
|
+
import { MatTabsModule } from '@angular/material/tabs';
|
|
8
|
+
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
9
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
10
|
+
import { MatInputModule } from '@angular/material/input';
|
|
11
|
+
import { MatSelectModule } from '@angular/material/select';
|
|
12
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
13
|
+
import { PreferencesSectionComponent } from './sections/preferences/preferences-section.component';
|
|
14
|
+
import { ProfileSectionComponent } from './sections/profile/profile-section.component';
|
|
15
|
+
import { TermsSectionComponent } from './sections/terms/terms-section.component';
|
|
16
|
+
import { SettingSectionComponent } from './sections/settings/setting-section.component';
|
|
17
|
+
import { AccountSectionComponent } from './sections/account/account-section.component';
|
|
18
|
+
import { ChatHistoryService } from '../chat/services/chat-history.service';
|
|
19
|
+
import { AuthService } from '../../core/auth/auth.service';
|
|
20
|
+
import { PersonalizationService } from './personalization.service';
|
|
21
|
+
import { DialogService } from '../../shared/dialog/dialog.service';
|
|
22
|
+
import { DialogUtils } from '../../shared/dialog/dialog.utils';
|
|
23
|
+
import { SnackbarService } from '../../shared/snackbar/snackbar.service';
|
|
24
|
+
import { ThemeService } from '../../core/services/theme.service';
|
|
25
|
+
import * as i0 from "@angular/core";
|
|
26
|
+
import * as i1 from "@angular/material/dialog";
|
|
27
|
+
import * as i2 from "@angular/material/button";
|
|
28
|
+
import * as i3 from "@angular/material/icon";
|
|
29
|
+
import * as i4 from "@angular/material/tooltip";
|
|
30
|
+
export class PersonalizationDialogComponent {
|
|
31
|
+
constructor() {
|
|
32
|
+
this.dialogRef = inject((MatDialogRef));
|
|
33
|
+
this.dialogService = inject(DialogService);
|
|
34
|
+
this.personalization = inject(PersonalizationService);
|
|
35
|
+
this.authService = inject(AuthService);
|
|
36
|
+
this.chatHistory = inject(ChatHistoryService);
|
|
37
|
+
this.snackbar = inject(SnackbarService);
|
|
38
|
+
// Local copy of settings for editing
|
|
39
|
+
this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));
|
|
40
|
+
this.activeSection = 'profile';
|
|
41
|
+
this.sections = [
|
|
42
|
+
{ id: 'account', label: 'Account', type: 'header' },
|
|
43
|
+
{ id: 'profile', label: 'My profile', icon: 'person_outline', type: 'item' },
|
|
44
|
+
{ id: 'account_settings', label: 'Manage Account', icon: 'manage_accounts', type: 'item' },
|
|
45
|
+
{ id: 'preferences', label: 'Preferences', icon: 'tune', type: 'item' },
|
|
46
|
+
{ id: 'workspace', label: 'Workspace', type: 'header' },
|
|
47
|
+
{ id: 'general', label: 'Settings', icon: 'settings', type: 'item' },
|
|
48
|
+
{ id: 'info', label: 'Support', type: 'header' },
|
|
49
|
+
{ id: 'terms', label: 'Terms & Conditions', icon: 'description', type: 'item' },
|
|
50
|
+
];
|
|
51
|
+
this.colorTokens = [
|
|
52
|
+
{
|
|
53
|
+
name: 'Standard',
|
|
54
|
+
value: 'default',
|
|
55
|
+
},
|
|
56
|
+
{ name: 'Purple', value: '#7c3aed' },
|
|
57
|
+
{ name: 'Pink', value: '#db2777' },
|
|
58
|
+
{ name: 'Red', value: '#dc2626' },
|
|
59
|
+
{ name: 'Orange', value: '#ea580c' },
|
|
60
|
+
{ name: 'Green', value: '#16a34a' },
|
|
61
|
+
{ name: 'Teal', value: '#0d9488' },
|
|
62
|
+
{ name: 'Blue', value: '#2563eb' },
|
|
63
|
+
];
|
|
64
|
+
this.themeService = inject(ThemeService);
|
|
65
|
+
this.originalColor = '';
|
|
66
|
+
this.isSaved = false;
|
|
67
|
+
this.originalColor = this.personalization.settings().appearance.primaryColor;
|
|
68
|
+
}
|
|
69
|
+
onSave() {
|
|
70
|
+
if (this.activeSection === 'preferences') {
|
|
71
|
+
this.isSaved = true;
|
|
72
|
+
this.personalization.updateAppearance(this.settings.appearance);
|
|
73
|
+
// Re-apply to ensure consistency (effect handles it, but just in case)
|
|
74
|
+
this.snackbar.success('Appearance settings saved');
|
|
75
|
+
}
|
|
76
|
+
else if (this.activeSection === 'general') {
|
|
77
|
+
this.personalization.updateInstructions(this.settings.customInstructions);
|
|
78
|
+
this.snackbar.success('Settings saved');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
onCancel() {
|
|
82
|
+
this.dialogRef.close(false);
|
|
83
|
+
// ngOnDestroy will handle revert
|
|
84
|
+
}
|
|
85
|
+
ngOnDestroy() {
|
|
86
|
+
if (!this.isSaved) {
|
|
87
|
+
// Revert to original color if not saved
|
|
88
|
+
this.themeService.applyPrimaryColorToGlobal(this.originalColor);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
onReset() {
|
|
92
|
+
DialogUtils.confirmReset(this.dialogService).subscribe((confirmed) => {
|
|
93
|
+
if (confirmed) {
|
|
94
|
+
// Only reset the current section
|
|
95
|
+
if (this.activeSection === 'preferences') {
|
|
96
|
+
// Reset only appearance settings to defaults
|
|
97
|
+
this.personalization.resetToDefaults();
|
|
98
|
+
// Re-clone settings to update UI
|
|
99
|
+
this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));
|
|
100
|
+
// Live preview the reset
|
|
101
|
+
this.themeService.applyPrimaryColorToGlobal(this.settings.appearance.primaryColor);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
selectTheme(theme) {
|
|
107
|
+
this.settings.appearance.theme = theme;
|
|
108
|
+
// Optional: Preview theme? User only asked for color.
|
|
109
|
+
}
|
|
110
|
+
selectColor(color) {
|
|
111
|
+
this.settings.appearance.primaryColor = color;
|
|
112
|
+
//! Live Preview for changed color
|
|
113
|
+
// this.themeService.applyPrimaryColorToGlobal(color);
|
|
114
|
+
}
|
|
115
|
+
selectButtonStyle(style) {
|
|
116
|
+
this.settings.appearance.buttonStyle = style;
|
|
117
|
+
}
|
|
118
|
+
selectSection(sectionId) {
|
|
119
|
+
if (this.sections.find((s) => s.id === sectionId && s.type === 'item')) {
|
|
120
|
+
this.activeSection = sectionId;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
get hasChanges() {
|
|
124
|
+
if (this.activeSection === 'preferences')
|
|
125
|
+
return this.hasPreferencesChanges();
|
|
126
|
+
if (this.activeSection === 'general')
|
|
127
|
+
return this.hasInstructionChanges();
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
hasPreferencesChanges() {
|
|
131
|
+
const original = this.personalization.settings().appearance;
|
|
132
|
+
const current = this.settings.appearance;
|
|
133
|
+
return JSON.stringify(original) !== JSON.stringify(current);
|
|
134
|
+
}
|
|
135
|
+
hasInstructionChanges() {
|
|
136
|
+
const original = this.personalization.settings().customInstructions;
|
|
137
|
+
const current = this.settings.customInstructions;
|
|
138
|
+
return JSON.stringify(original) !== JSON.stringify(current);
|
|
139
|
+
}
|
|
140
|
+
get username() {
|
|
141
|
+
return this.authService.getLoggedInUserName();
|
|
142
|
+
}
|
|
143
|
+
get userImageUrl() {
|
|
144
|
+
return this.authService.getLoggedInUserImageUrl();
|
|
145
|
+
}
|
|
146
|
+
get userRole() {
|
|
147
|
+
return this.authService.getLoggedInUserRole();
|
|
148
|
+
}
|
|
149
|
+
isCustomColorSelected() {
|
|
150
|
+
return !this.colorTokens.some((token) => token.value.toLowerCase() === this.settings.appearance.primaryColor.toLowerCase());
|
|
151
|
+
}
|
|
152
|
+
onCustomColorChange(event) {
|
|
153
|
+
const color = event.target.value;
|
|
154
|
+
this.selectColor(color);
|
|
155
|
+
}
|
|
156
|
+
deleteAllHistory() {
|
|
157
|
+
const userId = this.authService.getUserId() || '';
|
|
158
|
+
this.chatHistory.deleteAllHistory(userId.toString()).subscribe(() => {
|
|
159
|
+
// History cleared
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
logoutAllDevices() {
|
|
163
|
+
console.log('Logging out of all devices...');
|
|
164
|
+
// Implement service call when API is ready
|
|
165
|
+
}
|
|
166
|
+
deleteAccount() {
|
|
167
|
+
console.log('Deleting account...');
|
|
168
|
+
// Implement service call when API is ready
|
|
169
|
+
}
|
|
170
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
171
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PersonalizationDialogComponent, isStandalone: true, selector: "app-personalization-dialog", ngImport: i0, template: "<div class=\"personalization-container\">\r\n <div class=\"header\">\r\n <div class=\"title-section\">\r\n <mat-icon class=\"header-icon\">settings_suggest</mat-icon>\r\n <h2>Personalization</h2>\r\n </div>\r\n <button mat-icon-button (click)=\"onCancel()\" matTooltip=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"dialog-layout no-padding\">\r\n <!-- Sidebar Navigation -->\r\n <aside class=\"sidebar\">\r\n @for (section of sections; track section.id) {\r\n @if (section.type === 'header') {\r\n <div class=\"nav-header\">{{ section.label }}</div>\r\n } @else {\r\n <div\r\n class=\"nav-item\"\r\n [class.active]=\"activeSection === section.id\"\r\n (click)=\"selectSection(section.id)\"\r\n >\r\n <mat-icon>{{ section.icon }}</mat-icon>\r\n <span>{{ section.label }}</span>\r\n </div>\r\n }\r\n }\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <main class=\"main-content\">\r\n <!-- Appearance / Preferences Section -->\r\n @if (activeSection === 'preferences') {\r\n <app-preferences-section\r\n [settings]=\"settings\"\r\n [colorTokens]=\"colorTokens\"\r\n [isCustomColorSelected]=\"isCustomColorSelected()\"\r\n [defaultColor]=\"personalization.developerDefaults().primaryColor || 'default'\"\r\n (onThemeSelect)=\"selectTheme($event)\"\r\n (onColorSelect)=\"selectColor($event)\"\r\n (onButtonStyleSelect)=\"selectButtonStyle($event)\"\r\n (onSave)=\"onSave()\"\r\n (onReset)=\"onReset()\"\r\n >\r\n </app-preferences-section>\r\n }\r\n\r\n <!-- Account / Profile Section -->\r\n @if (activeSection === 'account_settings') {\r\n <app-account-section\r\n (onDeleteAllHistory)=\"deleteAllHistory()\"\r\n (onLogoutAll)=\"logoutAllDevices()\"\r\n (onDeleteAccount)=\"deleteAccount()\"\r\n ></app-account-section>\r\n }\r\n\r\n @if (activeSection === 'profile') {\r\n <app-profile-section\r\n [username]=\"username\"\r\n [userImageUrl]=\"userImageUrl\"\r\n [userRole]=\"userRole\"\r\n ></app-profile-section>\r\n }\r\n\r\n <!-- General Section -->\r\n @if (activeSection === 'general') {\r\n <app-setting-section\r\n [settings]=\"settings\"\r\n [hasChanges]=\"hasChanges\"\r\n (onSave)=\"onSave()\"\r\n ></app-setting-section>\r\n }\r\n\r\n <!-- Terms and Conditions Section -->\r\n @if (activeSection === 'terms') {\r\n <app-terms-section></app-terms-section>\r\n }\r\n </main>\r\n </mat-dialog-content>\r\n</div>\r\n", styles: [".personalization-container{display:flex;flex-direction:column;width:100%;height:100%;max-width:none;max-height:none;max-height:90vh;background:var(--background-color);color:var(--text-color);border-radius:12px;overflow:hidden;box-shadow:var(--border-shadow-color)}.personalization-container .header{flex:0 0 auto;display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-bottom:1px solid var(--border-color);background:var(--background-color)}.personalization-container .header .title-section{display:flex;align-items:center;gap:10px}.personalization-container .header .title-section .header-icon{color:var(--secondary-text-color);font-size:20px;width:20px;height:20px}.personalization-container .header .title-section h2{margin:0;font-size:.95rem;font-weight:500;color:var(--secondary-text-color)}.personalization-container .dialog-layout{display:flex;padding:0;margin:0;flex:1;overflow:hidden}.personalization-container .sidebar{width:240px;background:rgba(var(--black-rgb),.02);border-right:1px solid var(--border-color);padding:16px 8px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;scrollbar-gutter:stable}.personalization-container .sidebar::-webkit-scrollbar{width:4px}.personalization-container .sidebar::-webkit-scrollbar-track{background:transparent}.personalization-container .sidebar::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .sidebar::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.personalization-container .sidebar .nav-header{padding:12px 12px 6px;font-size:.75rem;font-weight:600;text-transform:uppercase;color:var(--secondary-text-color);letter-spacing:.5px}.personalization-container .sidebar .nav-item{display:flex;align-items:center;gap:12px;padding:8px 12px;border-radius:6px;cursor:pointer;transition:all .2s ease;color:var(--text-color)}.personalization-container .sidebar .nav-item mat-icon{font-size:18px;width:18px;height:18px;color:var(--secondary-text-color)}.personalization-container .sidebar .nav-item span{font-size:.9rem;font-weight:400}.personalization-container .sidebar .nav-item:hover{background:rgba(var(--black-rgb),.05)}.personalization-container .sidebar .nav-item.active{background:rgba(var(--primary-color-rgb),.1);font-weight:500;color:var(--primary-color)}.personalization-container .sidebar .nav-item.active mat-icon{color:var(--primary-color)}.personalization-container .main-content{flex:1;overflow-y:auto;background:var(--background-color);position:relative}.personalization-container .main-content::-webkit-scrollbar{width:6px}.personalization-container .main-content::-webkit-scrollbar-track{background:transparent}.personalization-container .main-content::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .main-content::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.full-width{width:100%}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}:host-context(.dark-theme) .personalization-container .sidebar{background:var(--background-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PreferencesSectionComponent, selector: "app-preferences-section", inputs: ["settings", "colorTokens", "isCustomColorSelected", "defaultColor"], outputs: ["onThemeSelect", "onColorSelect", "onButtonStyleSelect", "onSave", "onReset"] }, { kind: "component", type: ProfileSectionComponent, selector: "app-profile-section", inputs: ["username", "userImageUrl", "userRole"] }, { kind: "component", type: SettingSectionComponent, selector: "app-setting-section", inputs: ["settings", "hasChanges"], outputs: ["onSave"] }, { kind: "component", type: TermsSectionComponent, selector: "app-terms-section" }, { kind: "component", type: AccountSectionComponent, selector: "app-account-section", inputs: ["organizationId"], outputs: ["onDeleteAllHistory", "onLogoutAll", "onLogoutSession", "onDeleteAccount"] }] }); }
|
|
172
|
+
}
|
|
173
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationDialogComponent, decorators: [{
|
|
174
|
+
type: Component,
|
|
175
|
+
args: [{ selector: 'app-personalization-dialog', standalone: true, imports: [
|
|
176
|
+
CommonModule,
|
|
177
|
+
FormsModule,
|
|
178
|
+
MatDialogModule,
|
|
179
|
+
MatButtonModule,
|
|
180
|
+
MatIconModule,
|
|
181
|
+
MatTabsModule,
|
|
182
|
+
MatSlideToggleModule,
|
|
183
|
+
MatFormFieldModule,
|
|
184
|
+
MatInputModule,
|
|
185
|
+
MatSelectModule,
|
|
186
|
+
MatTooltipModule,
|
|
187
|
+
PreferencesSectionComponent,
|
|
188
|
+
ProfileSectionComponent,
|
|
189
|
+
SettingSectionComponent,
|
|
190
|
+
TermsSectionComponent,
|
|
191
|
+
AccountSectionComponent,
|
|
192
|
+
], template: "<div class=\"personalization-container\">\r\n <div class=\"header\">\r\n <div class=\"title-section\">\r\n <mat-icon class=\"header-icon\">settings_suggest</mat-icon>\r\n <h2>Personalization</h2>\r\n </div>\r\n <button mat-icon-button (click)=\"onCancel()\" matTooltip=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"dialog-layout no-padding\">\r\n <!-- Sidebar Navigation -->\r\n <aside class=\"sidebar\">\r\n @for (section of sections; track section.id) {\r\n @if (section.type === 'header') {\r\n <div class=\"nav-header\">{{ section.label }}</div>\r\n } @else {\r\n <div\r\n class=\"nav-item\"\r\n [class.active]=\"activeSection === section.id\"\r\n (click)=\"selectSection(section.id)\"\r\n >\r\n <mat-icon>{{ section.icon }}</mat-icon>\r\n <span>{{ section.label }}</span>\r\n </div>\r\n }\r\n }\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <main class=\"main-content\">\r\n <!-- Appearance / Preferences Section -->\r\n @if (activeSection === 'preferences') {\r\n <app-preferences-section\r\n [settings]=\"settings\"\r\n [colorTokens]=\"colorTokens\"\r\n [isCustomColorSelected]=\"isCustomColorSelected()\"\r\n [defaultColor]=\"personalization.developerDefaults().primaryColor || 'default'\"\r\n (onThemeSelect)=\"selectTheme($event)\"\r\n (onColorSelect)=\"selectColor($event)\"\r\n (onButtonStyleSelect)=\"selectButtonStyle($event)\"\r\n (onSave)=\"onSave()\"\r\n (onReset)=\"onReset()\"\r\n >\r\n </app-preferences-section>\r\n }\r\n\r\n <!-- Account / Profile Section -->\r\n @if (activeSection === 'account_settings') {\r\n <app-account-section\r\n (onDeleteAllHistory)=\"deleteAllHistory()\"\r\n (onLogoutAll)=\"logoutAllDevices()\"\r\n (onDeleteAccount)=\"deleteAccount()\"\r\n ></app-account-section>\r\n }\r\n\r\n @if (activeSection === 'profile') {\r\n <app-profile-section\r\n [username]=\"username\"\r\n [userImageUrl]=\"userImageUrl\"\r\n [userRole]=\"userRole\"\r\n ></app-profile-section>\r\n }\r\n\r\n <!-- General Section -->\r\n @if (activeSection === 'general') {\r\n <app-setting-section\r\n [settings]=\"settings\"\r\n [hasChanges]=\"hasChanges\"\r\n (onSave)=\"onSave()\"\r\n ></app-setting-section>\r\n }\r\n\r\n <!-- Terms and Conditions Section -->\r\n @if (activeSection === 'terms') {\r\n <app-terms-section></app-terms-section>\r\n }\r\n </main>\r\n </mat-dialog-content>\r\n</div>\r\n", styles: [".personalization-container{display:flex;flex-direction:column;width:100%;height:100%;max-width:none;max-height:none;max-height:90vh;background:var(--background-color);color:var(--text-color);border-radius:12px;overflow:hidden;box-shadow:var(--border-shadow-color)}.personalization-container .header{flex:0 0 auto;display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-bottom:1px solid var(--border-color);background:var(--background-color)}.personalization-container .header .title-section{display:flex;align-items:center;gap:10px}.personalization-container .header .title-section .header-icon{color:var(--secondary-text-color);font-size:20px;width:20px;height:20px}.personalization-container .header .title-section h2{margin:0;font-size:.95rem;font-weight:500;color:var(--secondary-text-color)}.personalization-container .dialog-layout{display:flex;padding:0;margin:0;flex:1;overflow:hidden}.personalization-container .sidebar{width:240px;background:rgba(var(--black-rgb),.02);border-right:1px solid var(--border-color);padding:16px 8px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;scrollbar-gutter:stable}.personalization-container .sidebar::-webkit-scrollbar{width:4px}.personalization-container .sidebar::-webkit-scrollbar-track{background:transparent}.personalization-container .sidebar::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .sidebar::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.personalization-container .sidebar .nav-header{padding:12px 12px 6px;font-size:.75rem;font-weight:600;text-transform:uppercase;color:var(--secondary-text-color);letter-spacing:.5px}.personalization-container .sidebar .nav-item{display:flex;align-items:center;gap:12px;padding:8px 12px;border-radius:6px;cursor:pointer;transition:all .2s ease;color:var(--text-color)}.personalization-container .sidebar .nav-item mat-icon{font-size:18px;width:18px;height:18px;color:var(--secondary-text-color)}.personalization-container .sidebar .nav-item span{font-size:.9rem;font-weight:400}.personalization-container .sidebar .nav-item:hover{background:rgba(var(--black-rgb),.05)}.personalization-container .sidebar .nav-item.active{background:rgba(var(--primary-color-rgb),.1);font-weight:500;color:var(--primary-color)}.personalization-container .sidebar .nav-item.active mat-icon{color:var(--primary-color)}.personalization-container .main-content{flex:1;overflow-y:auto;background:var(--background-color);position:relative}.personalization-container .main-content::-webkit-scrollbar{width:6px}.personalization-container .main-content::-webkit-scrollbar-track{background:transparent}.personalization-container .main-content::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .main-content::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.full-width{width:100%}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}:host-context(.dark-theme) .personalization-container .sidebar{background:var(--background-color)}\n"] }]
|
|
193
|
+
}], ctorParameters: () => [] });
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uYWxpemF0aW9uLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvYXBwL3BlcnNvbmFsaXphdGlvbi9wZXJzb25hbGl6YXRpb24tZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rvb2hib3Qvc3JjL2xpYi9hcHAvcGVyc29uYWxpemF0aW9uL3BlcnNvbmFsaXphdGlvbi1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFD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QUNuQywyQ0FBMkM7SUFDN0MsQ0FBQzsrR0F0S1UsOEJBQThCO21HQUE5Qiw4QkFBOEIsc0ZDakQzQyx5eUZBaUZBLG1vR0RwREksWUFBWSw4QkFDWixXQUFXLDhCQUNYLGVBQWUsMEpBQ2YsZUFBZSwySUFDZixhQUFhLG1MQUNiLGFBQWEsOEJBQ2Isb0JBQW9CLDhCQUNwQixrQkFBa0IsOEJBQ2xCLGNBQWMsOEJBQ2QsZUFBZSw4QkFDZixnQkFBZ0IsNlRBQ2hCLDJCQUEyQiwyT0FDM0IsdUJBQXVCLGtIQUN2Qix1QkFBdUIseUhBQ3ZCLHFCQUFxQiw4REFDckIsdUJBQXVCOzs0RkFLZCw4QkFBOEI7a0JBeEIxQyxTQUFTOytCQUNFLDRCQUE0QixjQUMxQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGFBQWE7d0JBQ2Isb0JBQW9CO3dCQUNwQixrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLDJCQUEyQjt3QkFDM0IsdUJBQXVCO3dCQUN2Qix1QkFBdUI7d0JBQ3ZCLHFCQUFxQjt3QkFDckIsdUJBQXVCO3FCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XHJcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IFByZWZlcmVuY2VzU2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vc2VjdGlvbnMvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXMtc2VjdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQcm9maWxlU2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vc2VjdGlvbnMvcHJvZmlsZS9wcm9maWxlLXNlY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGVybXNTZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9zZWN0aW9ucy90ZXJtcy90ZXJtcy1zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNldHRpbmdTZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9zZWN0aW9ucy9zZXR0aW5ncy9zZXR0aW5nLXNlY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQWNjb3VudFNlY3Rpb25Db21wb25lbnQgfSBmcm9tICcuL3NlY3Rpb25zL2FjY291bnQvYWNjb3VudC1zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENoYXRIaXN0b3J5U2VydmljZSB9IGZyb20gJy4uL2NoYXQvc2VydmljZXMvY2hhdC1oaXN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvYXV0aC9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQZXJzb25hbGl6YXRpb25TZXJ2aWNlLCBQZXJzb25hbGl6YXRpb25TZXR0aW5ncyB9IGZyb20gJy4vcGVyc29uYWxpemF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RpYWxvZy9kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWxvZ1V0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RpYWxvZy9kaWFsb2cudXRpbHMnO1xyXG5pbXBvcnQgeyBTbmFja2JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc25hY2tiYXIvc25hY2tiYXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvdGhlbWUuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1wZXJzb25hbGl6YXRpb24tZGlhbG9nJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdFRhYnNNb2R1bGUsXHJcbiAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIFByZWZlcmVuY2VzU2VjdGlvbkNvbXBvbmVudCxcclxuICAgIFByb2ZpbGVTZWN0aW9uQ29tcG9uZW50LFxyXG4gICAgU2V0dGluZ1NlY3Rpb25Db21wb25lbnQsXHJcbiAgICBUZXJtc1NlY3Rpb25Db21wb25lbnQsXHJcbiAgICBBY2NvdW50U2VjdGlvbkNvbXBvbmVudCxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wZXJzb25hbGl6YXRpb24tZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wZXJzb25hbGl6YXRpb24tZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQZXJzb25hbGl6YXRpb25EaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgZGlhbG9nUmVmID0gaW5qZWN0KE1hdERpYWxvZ1JlZjxQZXJzb25hbGl6YXRpb25EaWFsb2dDb21wb25lbnQ+KTtcclxuICBwcml2YXRlIGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoRGlhbG9nU2VydmljZSk7XHJcbiAgcHVibGljIHBlcnNvbmFsaXphdGlvbiA9IGluamVjdChQZXJzb25hbGl6YXRpb25TZXJ2aWNlKTtcclxuICBwcml2YXRlIGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcclxuICBwcml2YXRlIGNoYXRIaXN0b3J5ID0gaW5qZWN0KENoYXRIaXN0b3J5U2VydmljZSk7XHJcbiAgcHJpdmF0ZSBzbmFja2JhciA9IGluamVjdChTbmFja2JhclNlcnZpY2UpO1xyXG5cclxuICAvLyBMb2NhbCBjb3B5IG9mIHNldHRpbmdzIGZvciBlZGl0aW5nXHJcbiAgcHVibGljIHNldHRpbmdzOiBQZXJzb25hbGl6YXRpb25TZXR0aW5ncyA9IEpTT04ucGFyc2UoXHJcbiAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnBlcnNvbmFsaXphdGlvbi5zZXR0aW5ncygpKSxcclxuICApO1xyXG5cclxuICBwdWJsaWMgYWN0aXZlU2VjdGlvbiA9ICdwcm9maWxlJztcclxuXHJcbiAgcHVibGljIHNlY3Rpb25zID0gW1xyXG4gICAgeyBpZDogJ2FjY291bnQnLCBsYWJlbDogJ0FjY291bnQnLCB0eXBlOiAnaGVhZGVyJyB9LFxyXG4gICAgeyBpZDogJ3Byb2ZpbGUnLCBsYWJlbDogJ015IHByb2ZpbGUnLCBpY29uOiAncGVyc29uX291dGxpbmUnLCB0eXBlOiAnaXRlbScgfSxcclxuICAgIHsgaWQ6ICdhY2NvdW50X3NldHRpbmdzJywgbGFiZWw6ICdNYW5hZ2UgQWNjb3VudCcsIGljb246ICdtYW5hZ2VfYWNjb3VudHMnLCB0eXBlOiAnaXRlbScgfSxcclxuICAgIHsgaWQ6ICdwcmVmZXJlbmNlcycsIGxhYmVsOiAnUHJlZmVyZW5jZXMnLCBpY29uOiAndHVuZScsIHR5cGU6ICdpdGVtJyB9LFxyXG4gICAgeyBpZDogJ3dvcmtzcGFjZScsIGxhYmVsOiAnV29ya3NwYWNlJywgdHlwZTogJ2hlYWRlcicgfSxcclxuICAgIHsgaWQ6ICdnZW5lcmFsJywgbGFiZWw6ICdTZXR0aW5ncycsIGljb246ICdzZXR0aW5ncycsIHR5cGU6ICdpdGVtJyB9LFxyXG4gICAgeyBpZDogJ2luZm8nLCBsYWJlbDogJ1N1cHBvcnQnLCB0eXBlOiAnaGVhZGVyJyB9LFxyXG4gICAgeyBpZDogJ3Rlcm1zJywgbGFiZWw6ICdUZXJtcyAmIENvbmRpdGlvbnMnLCBpY29uOiAnZGVzY3JpcHRpb24nLCB0eXBlOiAnaXRlbScgfSxcclxuICBdO1xyXG5cclxuICBwdWJsaWMgY29sb3JUb2tlbnMgPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdTdGFuZGFyZCcsXHJcbiAgICAgIHZhbHVlOiAnZGVmYXVsdCcsXHJcbiAgICB9LFxyXG4gICAgeyBuYW1lOiAnUHVycGxlJywgdmFsdWU6ICcjN2MzYWVkJyB9LFxyXG4gICAgeyBuYW1lOiAnUGluaycsIHZhbHVlOiAnI2RiMjc3NycgfSxcclxuICAgIHsgbmFtZTogJ1JlZCcsIHZhbHVlOiAnI2RjMjYyNicgfSxcclxuICAgIHsgbmFtZTogJ09yYW5nZScsIHZhbHVlOiAnI2VhNTgwYycgfSxcclxuICAgIHsgbmFtZTogJ0dyZWVuJywgdmFsdWU6ICcjMTZhMzRhJyB9LFxyXG4gICAgeyBuYW1lOiAnVGVhbCcsIHZhbHVlOiAnIzBkOTQ4OCcgfSxcclxuICAgIHsgbmFtZTogJ0JsdWUnLCB2YWx1ZTogJyMyNTYzZWInIH0sXHJcbiAgXTtcclxuXHJcbiAgcHJpdmF0ZSB0aGVtZVNlcnZpY2UgPSBpbmplY3QoVGhlbWVTZXJ2aWNlKTtcclxuICBwcml2YXRlIG9yaWdpbmFsQ29sb3I6IHN0cmluZyA9ICcnO1xyXG4gIHByaXZhdGUgaXNTYXZlZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMub3JpZ2luYWxDb2xvciA9IHRoaXMucGVyc29uYWxpemF0aW9uLnNldHRpbmdzKCkuYXBwZWFyYW5jZS5wcmltYXJ5Q29sb3I7XHJcbiAgfVxyXG5cclxuICBvblNhdmUoKSB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVTZWN0aW9uID09PSAncHJlZmVyZW5jZXMnKSB7XHJcbiAgICAgIHRoaXMuaXNTYXZlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMucGVyc29uYWxpemF0aW9uLnVwZGF0ZUFwcGVhcmFuY2UodGhpcy5zZXR0aW5ncy5hcHBlYXJhbmNlKTtcclxuICAgICAgLy8gUmUtYXBwbHkgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IChlZmZlY3QgaGFuZGxlcyBpdCwgYnV0IGp1c3QgaW4gY2FzZSlcclxuICAgICAgdGhpcy5zbmFja2Jhci5zdWNjZXNzKCdBcHBlYXJhbmNlIHNldHRpbmdzIHNhdmVkJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlU2VjdGlvbiA9PT0gJ2dlbmVyYWwnKSB7XHJcbiAgICAgIHRoaXMucGVyc29uYWxpemF0aW9uLnVwZGF0ZUluc3RydWN0aW9ucyh0aGlzLnNldHRpbmdzLmN1c3RvbUluc3RydWN0aW9ucyk7XHJcbiAgICAgIHRoaXMuc25hY2tiYXIuc3VjY2VzcygnU2V0dGluZ3Mgc2F2ZWQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xyXG4gICAgLy8gbmdPbkRlc3Ryb3kgd2lsbCBoYW5kbGUgcmV2ZXJ0XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICghdGhpcy5pc1NhdmVkKSB7XHJcbiAgICAgIC8vIFJldmVydCB0byBvcmlnaW5hbCBjb2xvciBpZiBub3Qgc2F2ZWRcclxuICAgICAgdGhpcy50aGVtZVNlcnZpY2UuYXBwbHlQcmltYXJ5Q29sb3JUb0dsb2JhbCh0aGlzLm9yaWdpbmFsQ29sb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25SZXNldCgpIHtcclxuICAgIERpYWxvZ1V0aWxzLmNvbmZpcm1SZXNldCh0aGlzLmRpYWxvZ1NlcnZpY2UpLnN1YnNjcmliZSgoY29uZmlybWVkKSA9PiB7XHJcbiAgICAgIGlmIChjb25maXJtZWQpIHtcclxuICAgICAgICAvLyBPbmx5IHJlc2V0IHRoZSBjdXJyZW50IHNlY3Rpb25cclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVTZWN0aW9uID09PSAncHJlZmVyZW5jZXMnKSB7XHJcbiAgICAgICAgICAvLyBSZXNldCBvbmx5IGFwcGVhcmFuY2Ugc2V0dGluZ3MgdG8gZGVmYXVsdHNcclxuICAgICAgICAgIHRoaXMucGVyc29uYWxpemF0aW9uLnJlc2V0VG9EZWZhdWx0cygpO1xyXG4gICAgICAgICAgLy8gUmUtY2xvbmUgc2V0dGluZ3MgdG8gdXBkYXRlIFVJXHJcbiAgICAgICAgICB0aGlzLnNldHRpbmdzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnBlcnNvbmFsaXphdGlvbi5zZXR0aW5ncygpKSk7XHJcblxyXG4gICAgICAgICAgLy8gTGl2ZSBwcmV2aWV3IHRoZSByZXNldFxyXG4gICAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UuYXBwbHlQcmltYXJ5Q29sb3JUb0dsb2JhbCh0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2UucHJpbWFyeUNvbG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0VGhlbWUodGhlbWU6ICdsaWdodCcgfCAnZGFyaycgfCAnYXV0bycpIHtcclxuICAgIHRoaXMuc2V0dGluZ3MuYXBwZWFyYW5jZS50aGVtZSA9IHRoZW1lO1xyXG4gICAgLy8gT3B0aW9uYWw6IFByZXZpZXcgdGhlbWU/IFVzZXIgb25seSBhc2tlZCBmb3IgY29sb3IuXHJcbiAgfVxyXG5cclxuICBzZWxlY3RDb2xvcihjb2xvcjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2UucHJpbWFyeUNvbG9yID0gY29sb3I7XHJcbiAgICAvLyEgTGl2ZSBQcmV2aWV3IGZvciBjaGFuZ2VkIGNvbG9yXHJcbiAgICAvLyB0aGlzLnRoZW1lU2VydmljZS5hcHBseVByaW1hcnlDb2xvclRvR2xvYmFsKGNvbG9yKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEJ1dHRvblN0eWxlKHN0eWxlOiAnZmFiJyB8ICdzaWRlYmFyJyB8ICdzaWRlYmFyLXRvcCcgfCAnc2lkZWJhci1ib3R0b20nKSB7XHJcbiAgICB0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2UuYnV0dG9uU3R5bGUgPSBzdHlsZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFNlY3Rpb24oc2VjdGlvbklkOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLnNlY3Rpb25zLmZpbmQoKHMpID0+IHMuaWQgPT09IHNlY3Rpb25JZCAmJiBzLnR5cGUgPT09ICdpdGVtJykpIHtcclxuICAgICAgdGhpcy5hY3RpdmVTZWN0aW9uID0gc2VjdGlvbklkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0NoYW5nZXMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVTZWN0aW9uID09PSAncHJlZmVyZW5jZXMnKSByZXR1cm4gdGhpcy5oYXNQcmVmZXJlbmNlc0NoYW5nZXMoKTtcclxuICAgIGlmICh0aGlzLmFjdGl2ZVNlY3Rpb24gPT09ICdnZW5lcmFsJykgcmV0dXJuIHRoaXMuaGFzSW5zdHJ1Y3Rpb25DaGFuZ2VzKCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBoYXNQcmVmZXJlbmNlc0NoYW5nZXMoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMucGVyc29uYWxpemF0aW9uLnNldHRpbmdzKCkuYXBwZWFyYW5jZTtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2U7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyZW50KTtcclxuICB9XHJcblxyXG4gIGhhc0luc3RydWN0aW9uQ2hhbmdlcygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG9yaWdpbmFsID0gdGhpcy5wZXJzb25hbGl6YXRpb24uc2V0dGluZ3MoKS5jdXN0b21JbnN0cnVjdGlvbnM7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zZXR0aW5ncy5jdXN0b21JbnN0cnVjdGlvbnM7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyZW50KTtcclxuICB9XHJcblxyXG4gIGdldCB1c2VybmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VkSW5Vc2VyTmFtZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHVzZXJJbWFnZVVybCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlZEluVXNlckltYWdlVXJsKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdXNlclJvbGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlZEluVXNlclJvbGUoKTtcclxuICB9XHJcblxyXG4gIGlzQ3VzdG9tQ29sb3JTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5jb2xvclRva2Vucy5zb21lKFxyXG4gICAgICAodG9rZW4pID0+IHRva2VuLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2V0dGluZ3MuYXBwZWFyYW5jZS5wcmltYXJ5Q29sb3IudG9Mb3dlckNhc2UoKSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvbkN1c3RvbUNvbG9yQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3QgY29sb3IgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgdGhpcy5zZWxlY3RDb2xvcihjb2xvcik7XHJcbiAgfVxyXG5cclxuICBkZWxldGVBbGxIaXN0b3J5KCkge1xyXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5hdXRoU2VydmljZS5nZXRVc2VySWQoKSB8fCAnJztcclxuICAgIHRoaXMuY2hhdEhpc3RvcnkuZGVsZXRlQWxsSGlzdG9yeSh1c2VySWQudG9TdHJpbmcoKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgLy8gSGlzdG9yeSBjbGVhcmVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvZ291dEFsbERldmljZXMoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnTG9nZ2luZyBvdXQgb2YgYWxsIGRldmljZXMuLi4nKTtcclxuICAgIC8vIEltcGxlbWVudCBzZXJ2aWNlIGNhbGwgd2hlbiBBUEkgaXMgcmVhZHlcclxuICB9XHJcblxyXG4gIGRlbGV0ZUFjY291bnQoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnRGVsZXRpbmcgYWNjb3VudC4uLicpO1xyXG4gICAgLy8gSW1wbGVtZW50IHNlcnZpY2UgY2FsbCB3aGVuIEFQSSBpcyByZWFkeVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicGVyc29uYWxpemF0aW9uLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1zZWN0aW9uXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImhlYWRlci1pY29uXCI+c2V0dGluZ3Nfc3VnZ2VzdDwvbWF0LWljb24+XHJcbiAgICAgIDxoMj5QZXJzb25hbGl6YXRpb248L2gyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoKVwiIG1hdFRvb2x0aXA9XCJDbG9zZVwiPlxyXG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJkaWFsb2ctbGF5b3V0IG5vLXBhZGRpbmdcIj5cclxuICAgIDwhLS0gU2lkZWJhciBOYXZpZ2F0aW9uIC0tPlxyXG4gICAgPGFzaWRlIGNsYXNzPVwic2lkZWJhclwiPlxyXG4gICAgICBAZm9yIChzZWN0aW9uIG9mIHNlY3Rpb25zOyB0cmFjayBzZWN0aW9uLmlkKSB7XHJcbiAgICAgICAgQGlmIChzZWN0aW9uLnR5cGUgPT09ICdoZWFkZXInKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWhlYWRlclwiPnt7IHNlY3Rpb24ubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJuYXYtaXRlbVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU2VjdGlvbiA9PT0gc2VjdGlvbi5pZFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTZWN0aW9uKHNlY3Rpb24uaWQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uPnt7IHNlY3Rpb24uaWNvbiB9fTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IHNlY3Rpb24ubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIDwvYXNpZGU+XHJcblxyXG4gICAgPCEtLSBNYWluIENvbnRlbnQgQXJlYSAtLT5cclxuICAgIDxtYWluIGNsYXNzPVwibWFpbi1jb250ZW50XCI+XHJcbiAgICAgIDwhLS0gQXBwZWFyYW5jZSAvIFByZWZlcmVuY2VzIFNlY3Rpb24gLS0+XHJcbiAgICAgIEBpZiAoYWN0aXZlU2VjdGlvbiA9PT0gJ3ByZWZlcmVuY2VzJykge1xyXG4gICAgICAgIDxhcHAtcHJlZmVyZW5jZXMtc2VjdGlvblxyXG4gICAgICAgICAgW3NldHRpbmdzXT1cInNldHRpbmdzXCJcclxuICAgICAgICAgIFtjb2xvclRva2Vuc109XCJjb2xvclRva2Vuc1wiXHJcbiAgICAgICAgICBbaXNDdXN0b21Db2xvclNlbGVjdGVkXT1cImlzQ3VzdG9tQ29sb3JTZWxlY3RlZCgpXCJcclxuICAgICAgICAgIFtkZWZhdWx0Q29sb3JdPVwicGVyc29uYWxpemF0aW9uLmRldmVsb3BlckRlZmF1bHRzKCkucHJpbWFyeUNvbG9yIHx8ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgICAob25UaGVtZVNlbGVjdCk9XCJzZWxlY3RUaGVtZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChvbkNvbG9yU2VsZWN0KT1cInNlbGVjdENvbG9yKCRldmVudClcIlxyXG4gICAgICAgICAgKG9uQnV0dG9uU3R5bGVTZWxlY3QpPVwic2VsZWN0QnV0dG9uU3R5bGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAob25TYXZlKT1cIm9uU2F2ZSgpXCJcclxuICAgICAgICAgIChvblJlc2V0KT1cIm9uUmVzZXQoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvYXBwLXByZWZlcmVuY2VzLXNlY3Rpb24+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDwhLS0gQWNjb3VudCAvIFByb2ZpbGUgU2VjdGlvbiAtLT5cclxuICAgICAgQGlmIChhY3RpdmVTZWN0aW9uID09PSAnYWNjb3VudF9zZXR0aW5ncycpIHtcclxuICAgICAgICA8YXBwLWFjY291bnQtc2VjdGlvblxyXG4gICAgICAgICAgKG9uRGVsZXRlQWxsSGlzdG9yeSk9XCJkZWxldGVBbGxIaXN0b3J5KClcIlxyXG4gICAgICAgICAgKG9uTG9nb3V0QWxsKT1cImxvZ291dEFsbERldmljZXMoKVwiXHJcbiAgICAgICAgICAob25EZWxldGVBY2NvdW50KT1cImRlbGV0ZUFjY291bnQoKVwiXHJcbiAgICAgICAgPjwvYXBwLWFjY291bnQtc2VjdGlvbj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmIChhY3RpdmVTZWN0aW9uID09PSAncHJvZmlsZScpIHtcclxuICAgICAgICA8YXBwLXByb2ZpbGUtc2VjdGlvblxyXG4gICAgICAgICAgW3VzZXJuYW1lXT1cInVzZXJuYW1lXCJcclxuICAgICAgICAgIFt1c2VySW1hZ2VVcmxdPVwidXNlckltYWdlVXJsXCJcclxuICAgICAgICAgIFt1c2VyUm9sZV09XCJ1c2VyUm9sZVwiXHJcbiAgICAgICAgPjwvYXBwLXByb2ZpbGUtc2VjdGlvbj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPCEtLSBHZW5lcmFsIFNlY3Rpb24gLS0+XHJcbiAgICAgIEBpZiAoYWN0aXZlU2VjdGlvbiA9PT0gJ2dlbmVyYWwnKSB7XHJcbiAgICAgICAgPGFwcC1zZXR0aW5nLXNlY3Rpb25cclxuICAgICAgICAgIFtzZXR0aW5nc109XCJzZXR0aW5nc1wiXHJcbiAgICAgICAgICBbaGFzQ2hhbmdlc109XCJoYXNDaGFuZ2VzXCJcclxuICAgICAgICAgIChvblNhdmUpPVwib25TYXZlKClcIlxyXG4gICAgICAgID48L2FwcC1zZXR0aW5nLXNlY3Rpb24+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDwhLS0gVGVybXMgYW5kIENvbmRpdGlvbnMgU2VjdGlvbiAtLT5cclxuICAgICAgQGlmIChhY3RpdmVTZWN0aW9uID09PSAndGVybXMnKSB7XHJcbiAgICAgICAgPGFwcC10ZXJtcy1zZWN0aW9uPjwvYXBwLXRlcm1zLXNlY3Rpb24+XHJcbiAgICAgIH1cclxuICAgIDwvbWFpbj5cclxuICA8L21hdC1kaWFsb2ctY29udGVudD5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Injectable, signal, inject, effect } from '@angular/core';
|
|
2
|
+
import { StorageService } from '../../core/auth/storage.service';
|
|
3
|
+
import { AuthService } from '../../core/auth/auth.service';
|
|
4
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
const BASE_STORAGE_KEY = 'app.personalization.v1';
|
|
7
|
+
const DEFAULT_SETTINGS = {
|
|
8
|
+
customInstructions: {
|
|
9
|
+
enabled: false,
|
|
10
|
+
aboutUser: '',
|
|
11
|
+
responseStyle: '',
|
|
12
|
+
characteristics: {
|
|
13
|
+
warm: 'Default',
|
|
14
|
+
enthusiastic: 'Default',
|
|
15
|
+
headersAndLists: 'Default',
|
|
16
|
+
emoji: 'Default',
|
|
17
|
+
},
|
|
18
|
+
aboutYou: {
|
|
19
|
+
nickname: '',
|
|
20
|
+
occupation: '',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
appearance: {
|
|
24
|
+
theme: 'auto',
|
|
25
|
+
primaryColor: 'default',
|
|
26
|
+
buttonStyle: 'fab',
|
|
27
|
+
},
|
|
28
|
+
meta: {
|
|
29
|
+
version: 1,
|
|
30
|
+
lastUpdated: Date.now(),
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
export class PersonalizationService {
|
|
34
|
+
constructor() {
|
|
35
|
+
this.storage = inject(StorageService);
|
|
36
|
+
this.authService = inject(AuthService);
|
|
37
|
+
// Reactive Authentication Status
|
|
38
|
+
this.authStatus = toSignal(this.authService.authStatus$);
|
|
39
|
+
// State Signals
|
|
40
|
+
this._settings = signal(DEFAULT_SETTINGS);
|
|
41
|
+
this.settings = this._settings.asReadonly();
|
|
42
|
+
// Developer-provided defaults (from DoohbotInput)
|
|
43
|
+
this._developerDefaults = signal({});
|
|
44
|
+
this.developerDefaults = this._developerDefaults.asReadonly();
|
|
45
|
+
// Reload settings when auth status changes (user logins or logouts)
|
|
46
|
+
effect(() => {
|
|
47
|
+
const status = this.authStatus();
|
|
48
|
+
this._settings.set(this.loadSettings());
|
|
49
|
+
}, { allowSignalWrites: true });
|
|
50
|
+
// Automatically persist changes when settings signal updates
|
|
51
|
+
effect(() => {
|
|
52
|
+
const currentSettings = this._settings();
|
|
53
|
+
this.saveSettings(currentSettings);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
getStorageKey() {
|
|
57
|
+
const userId = this.authService.getUserId();
|
|
58
|
+
return userId ? `${BASE_STORAGE_KEY}_${userId}` : BASE_STORAGE_KEY;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Update custom instructions
|
|
62
|
+
*/
|
|
63
|
+
updateInstructions(instructions) {
|
|
64
|
+
this._settings.update((s) => ({
|
|
65
|
+
...s,
|
|
66
|
+
customInstructions: { ...s.customInstructions, ...instructions },
|
|
67
|
+
meta: { ...s.meta, lastUpdated: Date.now() },
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Update appearance settings
|
|
72
|
+
*/
|
|
73
|
+
updateAppearance(appearance) {
|
|
74
|
+
this._settings.update((s) => ({
|
|
75
|
+
...s,
|
|
76
|
+
appearance: { ...s.appearance, ...appearance },
|
|
77
|
+
meta: { ...s.meta, lastUpdated: Date.now() },
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set initial developer defaults (called from DoohbotComponent)
|
|
82
|
+
*/
|
|
83
|
+
setDeveloperDefaults(defaults) {
|
|
84
|
+
this._developerDefaults.set(defaults);
|
|
85
|
+
// Refresh settings to apply defaults if no user settings are saved
|
|
86
|
+
this._settings.set(this.loadSettings());
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Reset all personalization to defaults
|
|
90
|
+
*/
|
|
91
|
+
resetToDefaults() {
|
|
92
|
+
this._settings.set({
|
|
93
|
+
...DEFAULT_SETTINGS,
|
|
94
|
+
meta: { ...DEFAULT_SETTINGS.meta, lastUpdated: Date.now() },
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get the formatted instructions block for chat requests
|
|
99
|
+
*/
|
|
100
|
+
getFormattedInstructions() {
|
|
101
|
+
const s = this._settings().customInstructions;
|
|
102
|
+
if (!s.enabled)
|
|
103
|
+
return '';
|
|
104
|
+
let block = '--- CUSTOM INSTRUCTIONS ---\n';
|
|
105
|
+
if (s.aboutUser) {
|
|
106
|
+
block += `USER CONTEXT: ${s.aboutUser}\n`;
|
|
107
|
+
}
|
|
108
|
+
if (s.responseStyle) {
|
|
109
|
+
block += `RESPONSE STYLE: ${s.responseStyle}\n`;
|
|
110
|
+
}
|
|
111
|
+
block += '---------------------------';
|
|
112
|
+
return s.aboutUser || s.responseStyle ? block : '';
|
|
113
|
+
}
|
|
114
|
+
loadSettings() {
|
|
115
|
+
try {
|
|
116
|
+
const key = this.getStorageKey();
|
|
117
|
+
// StorageService.get handles decryption/parsing
|
|
118
|
+
const saved = this.storage.get(key);
|
|
119
|
+
if (saved) {
|
|
120
|
+
return { ...DEFAULT_SETTINGS, ...saved };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
console.error('Failed to load personalization settings', e);
|
|
125
|
+
}
|
|
126
|
+
// Return defaults merged with developer overrides
|
|
127
|
+
return {
|
|
128
|
+
...DEFAULT_SETTINGS,
|
|
129
|
+
appearance: {
|
|
130
|
+
...DEFAULT_SETTINGS.appearance,
|
|
131
|
+
...this._developerDefaults(),
|
|
132
|
+
primaryColor: 'default', //! Force 'default' for fresh loads so it resolves dynamically
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
saveSettings(settings) {
|
|
137
|
+
const key = this.getStorageKey();
|
|
138
|
+
this.storage.set(key, settings);
|
|
139
|
+
}
|
|
140
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
141
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationService, providedIn: 'root' }); }
|
|
142
|
+
}
|
|
143
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationService, decorators: [{
|
|
144
|
+
type: Injectable,
|
|
145
|
+
args: [{
|
|
146
|
+
providedIn: 'root',
|
|
147
|
+
}]
|
|
148
|
+
}], ctorParameters: () => [] });
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uYWxpemF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvYXBwL3BlcnNvbmFsaXphdGlvbi9wZXJzb25hbGl6YXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQXFDdEQsTUFBTSxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQztBQUVsRCxNQUFNLGdCQUFnQixHQUE0QjtJQUNoRCxrQkFBa0IsRUFBRTtRQUNsQixPQUFPLEVBQUUsS0FBSztRQUNkLFNBQVMsRUFBRSxFQUFFO1FBQ2IsYUFBYSxFQUFFLEVBQUU7UUFDakIsZUFBZSxFQUFFO1lBQ2YsSUFBSSxFQUFFLFNBQVM7WUFDZixZQUFZLEVBQUUsU0FBUztZQUN2QixlQUFlLEVBQUUsU0FBUztZQUMxQixLQUFLLEVBQUUsU0FBUztTQUNqQjtRQUNELFFBQVEsRUFBRTtZQUNSLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLEVBQUU7U0FDZjtLQUNGO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsS0FBSyxFQUFFLE1BQU07UUFDYixZQUFZLEVBQUUsU0FBUztRQUN2QixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELElBQUksRUFBRTtRQUNKLE9BQU8sRUFBRSxDQUFDO1FBQ1YsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7S0FDeEI7Q0FDRixDQUFDO0FBS0YsTUFBTSxPQUFPLHNCQUFzQjtJQWVqQztRQWRR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QUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDNUIsWUFBWSxFQUFFLFNBQVMsRUFBRSwrREFBK0Q7YUFDekY7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLFlBQVksQ0FBQyxRQUFpQztRQUNwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7K0dBM0hVLHNCQUFzQjttSEFBdEIsc0JBQXNCLGNBRnJCLE1BQU07OzRGQUVQLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGluamVjdCwgZWZmZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaGFyYWN0ZXJpc3RpY3Mge1xyXG4gIHdhcm06IHN0cmluZztcclxuICBlbnRodXNpYXN0aWM6IHN0cmluZztcclxuICBoZWFkZXJzQW5kTGlzdHM6IHN0cmluZztcclxuICBlbW9qaTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFib3V0WW91IHtcclxuICBuaWNrbmFtZTogc3RyaW5nO1xyXG4gIG9jY3VwYXRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21JbnN0cnVjdGlvbnMge1xyXG4gIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgYWJvdXRVc2VyOiBzdHJpbmc7XHJcbiAgcmVzcG9uc2VTdHlsZTogc3RyaW5nO1xyXG4gIGNoYXJhY3RlcmlzdGljczogQ2hhcmFjdGVyaXN0aWNzO1xyXG4gIGFib3V0WW91OiBBYm91dFlvdTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBcHBlYXJhbmNlU2V0dGluZ3Mge1xyXG4gIHRoZW1lOiAnbGlnaHQnIHwgJ2RhcmsnIHwgJ2F1dG8nO1xyXG4gIHByaW1hcnlDb2xvcjogc3RyaW5nO1xyXG4gIGJ1dHRvblN0eWxlOiAnZmFiJyB8ICdzaWRlYmFyJyB8ICdzaWRlYmFyLXRvcCcgfCAnc2lkZWJhci1ib3R0b20nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvbmFsaXphdGlvblNldHRpbmdzIHtcclxuICBjdXN0b21JbnN0cnVjdGlvbnM6IEN1c3RvbUluc3RydWN0aW9ucztcclxuICBhcHBlYXJhbmNlOiBBcHBlYXJhbmNlU2V0dGluZ3M7XHJcbiAgbWV0YToge1xyXG4gICAgdmVyc2lvbjogbnVtYmVyO1xyXG4gICAgbGFzdFVwZGF0ZWQ6IG51bWJlcjtcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBCQVNFX1NUT1JBR0VfS0VZID0gJ2FwcC5wZXJzb25hbGl6YXRpb24udjEnO1xyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogUGVyc29uYWxpemF0aW9uU2V0dGluZ3MgPSB7XHJcbiAgY3VzdG9tSW5zdHJ1Y3Rpb25zOiB7XHJcbiAgICBlbmFibGVkOiBmYWxzZSxcclxuICAgIGFib3V0VXNlcjogJycsXHJcbiAgICByZXNwb25zZVN0eWxlOiAnJyxcclxuICAgIGNoYXJhY3RlcmlzdGljczoge1xyXG4gICAgICB3YXJtOiAnRGVmYXVsdCcsXHJcbiAgICAgIGVudGh1c2lhc3RpYzogJ0RlZmF1bHQnLFxyXG4gICAgICBoZWFkZXJzQW5kTGlzdHM6ICdEZWZhdWx0JyxcclxuICAgICAgZW1vamk6ICdEZWZhdWx0JyxcclxuICAgIH0sXHJcbiAgICBhYm91dFlvdToge1xyXG4gICAgICBuaWNrbmFtZTogJycsXHJcbiAgICAgIG9jY3VwYXRpb246ICcnLFxyXG4gICAgfSxcclxuICB9LFxyXG4gIGFwcGVhcmFuY2U6IHtcclxuICAgIHRoZW1lOiAnYXV0bycsXHJcbiAgICBwcmltYXJ5Q29sb3I6ICdkZWZhdWx0JywgLy8gU3RhbmRhcmQgcHJpbWFyeSBjb2xvciAocmVzb2x2ZXMgdG8gZGV2ZWxvcGVyIGRlZmF1bHQpXHJcbiAgICBidXR0b25TdHlsZTogJ2ZhYicsXHJcbiAgfSxcclxuICBtZXRhOiB7XHJcbiAgICB2ZXJzaW9uOiAxLFxyXG4gICAgbGFzdFVwZGF0ZWQ6IERhdGUubm93KCksXHJcbiAgfSxcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQZXJzb25hbGl6YXRpb25TZXJ2aWNlIHtcclxuICBwcml2YXRlIHN0b3JhZ2UgPSBpbmplY3QoU3RvcmFnZVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgYXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xyXG5cclxuICAvLyBSZWFjdGl2ZSBBdXRoZW50aWNhdGlvbiBTdGF0dXNcclxuICBwcml2YXRlIGF1dGhTdGF0dXMgPSB0b1NpZ25hbCh0aGlzLmF1dGhTZXJ2aWNlLmF1dGhTdGF0dXMkKTtcclxuXHJcbiAgLy8gU3RhdGUgU2lnbmFsc1xyXG4gIHByaXZhdGUgX3NldHRpbmdzID0gc2lnbmFsPFBlcnNvbmFsaXphdGlvblNldHRpbmdzPihERUZBVUxUX1NFVFRJTkdTKTtcclxuICBwdWJsaWMgc2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncy5hc1JlYWRvbmx5KCk7XHJcblxyXG4gIC8vIERldmVsb3Blci1wcm92aWRlZCBkZWZhdWx0cyAoZnJvbSBEb29oYm90SW5wdXQpXHJcbiAgcHJpdmF0ZSBfZGV2ZWxvcGVyRGVmYXVsdHMgPSBzaWduYWw8UGFydGlhbDxBcHBlYXJhbmNlU2V0dGluZ3M+Pih7fSk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGRldmVsb3BlckRlZmF1bHRzID0gdGhpcy5fZGV2ZWxvcGVyRGVmYXVsdHMuYXNSZWFkb25seSgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIFJlbG9hZCBzZXR0aW5ncyB3aGVuIGF1dGggc3RhdHVzIGNoYW5nZXMgKHVzZXIgbG9naW5zIG9yIGxvZ291dHMpXHJcbiAgICBlZmZlY3QoXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmF1dGhTdGF0dXMoKTtcclxuICAgICAgICB0aGlzLl9zZXR0aW5ncy5zZXQodGhpcy5sb2FkU2V0dGluZ3MoKSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSwgLy8gVE9ET1xyXG4gICAgKTtcclxuXHJcbiAgICAvLyBBdXRvbWF0aWNhbGx5IHBlcnNpc3QgY2hhbmdlcyB3aGVuIHNldHRpbmdzIHNpZ25hbCB1cGRhdGVzXHJcbiAgICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50U2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncygpO1xyXG4gICAgICB0aGlzLnNhdmVTZXR0aW5ncyhjdXJyZW50U2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFN0b3JhZ2VLZXkoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VXNlcklkKCk7XHJcbiAgICByZXR1cm4gdXNlcklkID8gYCR7QkFTRV9TVE9SQUdFX0tFWX1fJHt1c2VySWR9YCA6IEJBU0VfU1RPUkFHRV9LRVk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgY3VzdG9tIGluc3RydWN0aW9uc1xyXG4gICAqL1xyXG4gIHVwZGF0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFBhcnRpYWw8Q3VzdG9tSW5zdHJ1Y3Rpb25zPikge1xyXG4gICAgdGhpcy5fc2V0dGluZ3MudXBkYXRlKChzKSA9PiAoe1xyXG4gICAgICAuLi5zLFxyXG4gICAgICBjdXN0b21JbnN0cnVjdGlvbnM6IHsgLi4ucy5jdXN0b21JbnN0cnVjdGlvbnMsIC4uLmluc3RydWN0aW9ucyB9LFxyXG4gICAgICBtZXRhOiB7IC4uLnMubWV0YSwgbGFzdFVwZGF0ZWQ6IERhdGUubm93KCkgfSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBhcHBlYXJhbmNlIHNldHRpbmdzXHJcbiAgICovXHJcbiAgdXBkYXRlQXBwZWFyYW5jZShhcHBlYXJhbmNlOiBQYXJ0aWFsPEFwcGVhcmFuY2VTZXR0aW5ncz4pIHtcclxuICAgIHRoaXMuX3NldHRpbmdzLnVwZGF0ZSgocykgPT4gKHtcclxuICAgICAgLi4ucyxcclxuICAgICAgYXBwZWFyYW5jZTogeyAuLi5zLmFwcGVhcmFuY2UsIC4uLmFwcGVhcmFuY2UgfSxcclxuICAgICAgbWV0YTogeyAuLi5zLm1ldGEsIGxhc3RVcGRhdGVkOiBEYXRlLm5vdygpIH0sXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgaW5pdGlhbCBkZXZlbG9wZXIgZGVmYXVsdHMgKGNhbGxlZCBmcm9tIERvb2hib3RDb21wb25lbnQpXHJcbiAgICovXHJcbiAgc2V0RGV2ZWxvcGVyRGVmYXVsdHMoZGVmYXVsdHM6IFBhcnRpYWw8QXBwZWFyYW5jZVNldHRpbmdzPikge1xyXG4gICAgdGhpcy5fZGV2ZWxvcGVyRGVmYXVsdHMuc2V0KGRlZmF1bHRzKTtcclxuICAgIC8vIFJlZnJlc2ggc2V0dGluZ3MgdG8gYXBwbHkgZGVmYXVsdHMgaWYgbm8gdXNlciBzZXR0aW5ncyBhcmUgc2F2ZWRcclxuICAgIHRoaXMuX3NldHRpbmdzLnNldCh0aGlzLmxvYWRTZXR0aW5ncygpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IGFsbCBwZXJzb25hbGl6YXRpb24gdG8gZGVmYXVsdHNcclxuICAgKi9cclxuICByZXNldFRvRGVmYXVsdHMoKSB7XHJcbiAgICB0aGlzLl9zZXR0aW5ncy5zZXQoe1xyXG4gICAgICAuLi5ERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgICBtZXRhOiB7IC4uLkRFRkFVTFRfU0VUVElOR1MubWV0YSwgbGFzdFVwZGF0ZWQ6IERhdGUubm93KCkgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBmb3JtYXR0ZWQgaW5zdHJ1Y3Rpb25zIGJsb2NrIGZvciBjaGF0IHJlcXVlc3RzXHJcbiAgICovXHJcbiAgZ2V0Rm9ybWF0dGVkSW5zdHJ1Y3Rpb25zKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzID0gdGhpcy5fc2V0dGluZ3MoKS5jdXN0b21JbnN0cnVjdGlvbnM7XHJcbiAgICBpZiAoIXMuZW5hYmxlZCkgcmV0dXJuICcnO1xyXG5cclxuICAgIGxldCBibG9jayA9ICctLS0gQ1VTVE9NIElOU1RSVUNUSU9OUyAtLS1cXG4nO1xyXG4gICAgaWYgKHMuYWJvdXRVc2VyKSB7XHJcbiAgICAgIGJsb2NrICs9IGBVU0VSIENPTlRFWFQ6ICR7cy5hYm91dFVzZXJ9XFxuYDtcclxuICAgIH1cclxuICAgIGlmIChzLnJlc3BvbnNlU3R5bGUpIHtcclxuICAgICAgYmxvY2sgKz0gYFJFU1BPTlNFIFNUWUxFOiAke3MucmVzcG9uc2VTdHlsZX1cXG5gO1xyXG4gICAgfVxyXG4gICAgYmxvY2sgKz0gJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSc7XHJcblxyXG4gICAgcmV0dXJuIHMuYWJvdXRVc2VyIHx8IHMucmVzcG9uc2VTdHlsZSA/IGJsb2NrIDogJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRTZXR0aW5ncygpOiBQZXJzb25hbGl6YXRpb25TZXR0aW5ncyB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmdldFN0b3JhZ2VLZXkoKTtcclxuICAgICAgLy8gU3RvcmFnZVNlcnZpY2UuZ2V0IGhhbmRsZXMgZGVjcnlwdGlvbi9wYXJzaW5nXHJcbiAgICAgIGNvbnN0IHNhdmVkID0gdGhpcy5zdG9yYWdlLmdldChrZXkpO1xyXG4gICAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICByZXR1cm4geyAuLi5ERUZBVUxUX1NFVFRJTkdTLCAuLi5zYXZlZCB9O1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHBlcnNvbmFsaXphdGlvbiBzZXR0aW5ncycsIGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybiBkZWZhdWx0cyBtZXJnZWQgd2l0aCBkZXZlbG9wZXIgb3ZlcnJpZGVzXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5ERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgICBhcHBlYXJhbmNlOiB7XHJcbiAgICAgICAgLi4uREVGQVVMVF9TRVRUSU5HUy5hcHBlYXJhbmNlLFxyXG4gICAgICAgIC4uLnRoaXMuX2RldmVsb3BlckRlZmF1bHRzKCksXHJcbiAgICAgICAgcHJpbWFyeUNvbG9yOiAnZGVmYXVsdCcsIC8vISBGb3JjZSAnZGVmYXVsdCcgIGZvciBmcmVzaCBsb2FkcyBzbyBpdCByZXNvbHZlcyBkeW5hbWljYWxseVxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZVNldHRpbmdzKHNldHRpbmdzOiBQZXJzb25hbGl6YXRpb25TZXR0aW5ncykge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRTdG9yYWdlS2V5KCk7XHJcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0KGtleSwgc2V0dGluZ3MpO1xyXG4gIH1cclxufVxyXG4iXX0=
|