@acorex/components 20.8.33 → 20.9.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-components-conversation-emoji-categories-C7Gm95V0.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,223 @@
1
+ import { resolveComposerMaxFiles, notifyPickerValidationErrors } from './acorex-components-conversation.mjs';
2
+
3
+ async function openComposerPickerPopup(popupService, composerService, registry, action, conversation, files, config) {
4
+ const component = action.component ?? (action.componentLoader ? await action.componentLoader() : undefined);
5
+ if (!component || files.length === 0) {
6
+ return;
7
+ }
8
+ await popupService.open(component, {
9
+ title: registry.getActionLabel(action),
10
+ size: 'md',
11
+ closeButton: true,
12
+ header: false,
13
+ panelClass: ['ax-conversation-composer-picker-popup'],
14
+ inputs: {
15
+ conversation,
16
+ maxFiles: resolveComposerMaxFiles(action, config),
17
+ initialFiles: files,
18
+ service: composerService,
19
+ },
20
+ });
21
+ }
22
+
23
+ /** Catalogs registered on picker actions (conversation-image, conversation-file, …). */
24
+ function pickerCatalogNames(registry) {
25
+ const names = new Set();
26
+ for (const action of registry.actions()) {
27
+ if ((action.component || action.componentLoader) && action.fileType) {
28
+ names.add(action.fileType);
29
+ }
30
+ }
31
+ return [...names];
32
+ }
33
+ /** Files that are not accepted by any registered picker catalog. */
34
+ async function collectUnsupportedInboundFiles(deps, files, catalogs) {
35
+ const unsupported = [];
36
+ for (const file of files) {
37
+ let acceptedByAny = false;
38
+ let lastErrors = [];
39
+ for (const catalog of catalogs) {
40
+ const errors = await deps.fileService.validate(file, catalog);
41
+ if (errors.length === 0) {
42
+ acceptedByAny = true;
43
+ break;
44
+ }
45
+ lastErrors = errors;
46
+ }
47
+ if (!acceptedByAny) {
48
+ unsupported.push({ file, errors: lastErrors });
49
+ }
50
+ }
51
+ return unsupported;
52
+ }
53
+ async function analyzeInboundFiles(deps, files) {
54
+ if (!files.length) {
55
+ return { matchingCatalogs: [], actions: [], supportedFiles: [], unsupportedFiles: [] };
56
+ }
57
+ const catalogs = pickerCatalogNames(deps.composerActionRegistry);
58
+ const unsupportedFiles = await collectUnsupportedInboundFiles(deps, files, catalogs);
59
+ const unsupportedSet = new Set(unsupportedFiles.map((entry) => entry.file));
60
+ const supportedFiles = files.filter((file) => !unsupportedSet.has(file));
61
+ if (supportedFiles.length === 0) {
62
+ return { matchingCatalogs: [], actions: [], supportedFiles: [], unsupportedFiles };
63
+ }
64
+ const context = deps.composerService.actionContext();
65
+ const matchingCatalogs = [];
66
+ for (const catalog of catalogs) {
67
+ const { rejected } = await deps.fileService.validateMany(supportedFiles, catalog);
68
+ if (rejected.length === 0) {
69
+ matchingCatalogs.push(catalog);
70
+ }
71
+ }
72
+ const seen = new Set();
73
+ const actions = [];
74
+ for (const catalog of matchingCatalogs) {
75
+ for (const action of deps.composerActionRegistry.findPickerActionsForFileType(catalog, context)) {
76
+ if (!seen.has(action.id)) {
77
+ seen.add(action.id);
78
+ actions.push(action);
79
+ }
80
+ }
81
+ }
82
+ return {
83
+ matchingCatalogs,
84
+ actions: actions.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),
85
+ supportedFiles,
86
+ unsupportedFiles,
87
+ };
88
+ }
89
+ function notifyInboundFilesValidationFailures(deps, analysis) {
90
+ if (analysis.supportedFiles.length === 0) {
91
+ if (analysis.unsupportedFiles.length === 0) {
92
+ deps.toast.warning(deps.translation.translateSync('@acorex:chat.errors.inbound-files-none-supported'));
93
+ }
94
+ return;
95
+ }
96
+ if (analysis.actions.length === 0) {
97
+ const key = analysis.matchingCatalogs.length === 0
98
+ ? '@acorex:chat.errors.inbound-files-none-supported'
99
+ : '@acorex:chat.errors.inbound-files-no-send-option';
100
+ deps.toast.warning(deps.translation.translateSync(key));
101
+ }
102
+ }
103
+ /**
104
+ * File catalogs that accept every supported file in the batch, then matching visible picker actions.
105
+ */
106
+ async function resolvePickerActionsForAllFiles(deps, files) {
107
+ const analysis = await analyzeInboundFiles(deps, files);
108
+ return analysis.actions;
109
+ }
110
+ async function promptComposerActionChoice(deps, actions, fileCount) {
111
+ const { AXConversationComposerActionChoiceDialogComponent } = await import('./acorex-components-conversation-composer-action-choice-dialog.component-CYutyq7i.mjs');
112
+ const result = await deps.popupService.open(AXConversationComposerActionChoiceDialogComponent, {
113
+ title: deps.translation.translateSync('@acorex:chat.dialog.choose-send-option.title'),
114
+ size: 'sm',
115
+ closeButton: true,
116
+ header: true,
117
+ inputs: {
118
+ actions,
119
+ fileCount,
120
+ composerActionRegistry: deps.composerActionRegistry,
121
+ },
122
+ });
123
+ const action = result?.data;
124
+ if (!action?.component && !action?.componentLoader) {
125
+ return undefined;
126
+ }
127
+ return action;
128
+ }
129
+ /**
130
+ * Match dropped/pasted files to composer picker action(s) and open the popup.
131
+ * Unsupported files are skipped after a warning toast; supported files continue.
132
+ * @returns true when a picker popup was opened
133
+ */
134
+ async function openComposerPickerForFiles(deps, files) {
135
+ if (!files.length) {
136
+ return false;
137
+ }
138
+ const conversation = deps.conversation;
139
+ if (!conversation) {
140
+ return false;
141
+ }
142
+ const analysis = await analyzeInboundFiles(deps, files);
143
+ if (analysis.unsupportedFiles.length > 0) {
144
+ notifyPickerValidationErrors(deps.toast, deps.translation, analysis.unsupportedFiles);
145
+ }
146
+ if (!analysis.supportedFiles.length || !analysis.actions.length) {
147
+ notifyInboundFilesValidationFailures(deps, analysis);
148
+ return false;
149
+ }
150
+ let action = analysis.actions[0];
151
+ if (analysis.actions.length > 1) {
152
+ const chosen = await promptComposerActionChoice(deps, analysis.actions, analysis.supportedFiles.length);
153
+ if (!chosen) {
154
+ return false;
155
+ }
156
+ action = chosen;
157
+ }
158
+ const catalog = action.fileType;
159
+ if (!catalog) {
160
+ deps.toast.warning(deps.translation.translateSync('@acorex:chat.errors.inbound-files-none-supported'));
161
+ return false;
162
+ }
163
+ const { accepted, rejected } = await deps.fileService.validateMany(analysis.supportedFiles, catalog);
164
+ if (rejected.length > 0) {
165
+ notifyPickerValidationErrors(deps.toast, deps.translation, rejected);
166
+ }
167
+ if (accepted.length === 0) {
168
+ return false;
169
+ }
170
+ await openComposerPickerPopup(deps.popupService, deps.composerService, deps.composerActionRegistry, action, conversation, accepted, deps.config);
171
+ return true;
172
+ }
173
+ /** Extract OS-copied files from a paste event (e.g. Ctrl+V after copying a file in Explorer). */
174
+ function filesFromClipboardEvent(event) {
175
+ const items = event.clipboardData?.items;
176
+ if (!items?.length) {
177
+ return [];
178
+ }
179
+ const files = [];
180
+ for (let i = 0; i < items.length; i++) {
181
+ const item = items[i];
182
+ if (item.kind === 'file') {
183
+ const file = item.getAsFile();
184
+ if (file) {
185
+ files.push(file);
186
+ }
187
+ }
188
+ }
189
+ return files;
190
+ }
191
+ /** Whether a paste event target lies in the chat panel (not sidebar). */
192
+ function isPasteTargetInChatPanel(host, target) {
193
+ if (!(target instanceof Node) || !host.contains(target)) {
194
+ return false;
195
+ }
196
+ const excluded = host.querySelector('.conversation-sidebar-container, .sidebar-container');
197
+ if (excluded?.contains(target)) {
198
+ return false;
199
+ }
200
+ const chatMain = host.querySelector('.conversation-main-container, .main-area, .conversation-view');
201
+ if (chatMain) {
202
+ return chatMain.contains(target);
203
+ }
204
+ return true;
205
+ }
206
+ /** Handle Ctrl+V / paste when the clipboard holds files copied from the OS. */
207
+ async function handleConversationFilePaste(event, host, deps) {
208
+ if (!isPasteTargetInChatPanel(host, event.target)) {
209
+ return;
210
+ }
211
+ const files = filesFromClipboardEvent(event);
212
+ if (!files.length) {
213
+ return;
214
+ }
215
+ const handled = await openComposerPickerForFiles(deps, files);
216
+ if (handled) {
217
+ event.preventDefault();
218
+ event.stopImmediatePropagation();
219
+ }
220
+ }
221
+
222
+ export { filesFromClipboardEvent, handleConversationFilePaste, isPasteTargetInChatPanel, openComposerPickerForFiles, resolvePickerActionsForAllFiles };
223
+ //# sourceMappingURL=acorex-components-conversation-open-composer-picker-for-files-BLInQalk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-components-conversation-open-composer-picker-for-files-BLInQalk.mjs","sources":["../tmp-esm2022/conversation/lib/components/message-list/open-composer-picker-popup.js","../tmp-esm2022/conversation/lib/components/message-list/open-composer-picker-for-files.js"],"sourcesContent":["import { resolveComposerMaxFiles } from '../../plugins/composer/composer-upload.config';\nexport async function openComposerPickerPopup(popupService, composerService, registry, action, conversation, files, config) {\n const component = action.component ?? (action.componentLoader ? await action.componentLoader() : undefined);\n if (!component || files.length === 0) {\n return;\n }\n await popupService.open(component, {\n title: registry.getActionLabel(action),\n size: 'md',\n closeButton: true,\n header: false,\n panelClass: ['ax-conversation-composer-picker-popup'],\n inputs: {\n conversation,\n maxFiles: resolveComposerMaxFiles(action, config),\n initialFiles: files,\n service: composerService,\n },\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1jb21wb3Nlci1waWNrZXItcG9wdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21wb25lbnRzL2NvbnZlcnNhdGlvbi9zcmMvbGliL2NvbXBvbmVudHMvbWVzc2FnZS1saXN0L29wZW4tY29tcG9zZXItcGlja2VyLXBvcHVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBR3hGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFlBQTRCLEVBQzVCLGVBQThDLEVBQzlDLFFBQThDLEVBQzlDLE1BQW9DLEVBQ3BDLFlBQTRCLEVBQzVCLEtBQWEsRUFDYixNQUFrRTtJQUVsRSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVHLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDakMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1FBQ3RDLElBQUksRUFBRSxJQUFJO1FBQ1YsV0FBVyxFQUFFLElBQUk7UUFDakIsTUFBTSxFQUFFLEtBQUs7UUFDYixVQUFVLEVBQUUsQ0FBQyx1Q0FBdUMsQ0FBQztRQUNyRCxNQUFNLEVBQUU7WUFDTixZQUFZO1lBQ1osUUFBUSxFQUFFLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDakQsWUFBWSxFQUFFLEtBQUs7WUFDbkIsT0FBTyxFQUFFLGVBQWU7U0FDekI7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBWFBvcHVwU2VydmljZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9wb3B1cCc7XG5pbXBvcnQgdHlwZSB7IEFYQ29udmVyc2F0aW9uQ29tcG9zZXJTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9zZXIvY29tcG9zZXIuc2VydmljZSc7XG5pbXBvcnQgdHlwZSB7IEFYQ29udmVyc2F0aW9uQ29tcG9zZXJBY3Rpb24sIEFYQ29udmVyc2F0aW9uQ29tcG9zZXJBY3Rpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3JlZ2lzdHJpZXMvY29tcG9zZXItYWN0aW9uLnJlZ2lzdHJ5JztcbmltcG9ydCB0eXBlIHsgQVhDb252ZXJzYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgcmVzb2x2ZUNvbXBvc2VyTWF4RmlsZXMgfSBmcm9tICcuLi8uLi9wbHVnaW5zL2NvbXBvc2VyL2NvbXBvc2VyLXVwbG9hZC5jb25maWcnO1xuaW1wb3J0IHR5cGUgeyBBWENvbnZlcnNhdGlvbkNvbmZpZyB9IGZyb20gJy4uLy4uL3Rva2Vucy9jb252ZXJzYXRpb24tY29uZmlnLmludGVyZmFjZSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuQ29tcG9zZXJQaWNrZXJQb3B1cChcbiAgcG9wdXBTZXJ2aWNlOiBBWFBvcHVwU2VydmljZSxcbiAgY29tcG9zZXJTZXJ2aWNlOiBBWENvbnZlcnNhdGlvbkNvbXBvc2VyU2VydmljZSxcbiAgcmVnaXN0cnk6IEFYQ29udmVyc2F0aW9uQ29tcG9zZXJBY3Rpb25SZWdpc3RyeSxcbiAgYWN0aW9uOiBBWENvbnZlcnNhdGlvbkNvbXBvc2VyQWN0aW9uLFxuICBjb252ZXJzYXRpb246IEFYQ29udmVyc2F0aW9uLFxuICBmaWxlczogRmlsZVtdLFxuICBjb25maWc6IFBpY2s8UmVxdWlyZWQ8QVhDb252ZXJzYXRpb25Db25maWc+LCAnbWF4RmlsZXNQZXJNZXNzYWdlJz4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29tcG9uZW50ID0gYWN0aW9uLmNvbXBvbmVudCA/PyAoYWN0aW9uLmNvbXBvbmVudExvYWRlciA/IGF3YWl0IGFjdGlvbi5jb21wb25lbnRMb2FkZXIoKSA6IHVuZGVmaW5lZCk7XG4gIGlmICghY29tcG9uZW50IHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHBvcHVwU2VydmljZS5vcGVuKGNvbXBvbmVudCwge1xuICAgIHRpdGxlOiByZWdpc3RyeS5nZXRBY3Rpb25MYWJlbChhY3Rpb24pLFxuICAgIHNpemU6ICdtZCcsXG4gICAgY2xvc2VCdXR0b246IHRydWUsXG4gICAgaGVhZGVyOiBmYWxzZSxcbiAgICBwYW5lbENsYXNzOiBbJ2F4LWNvbnZlcnNhdGlvbi1jb21wb3Nlci1waWNrZXItcG9wdXAnXSxcbiAgICBpbnB1dHM6IHtcbiAgICAgIGNvbnZlcnNhdGlvbixcbiAgICAgIG1heEZpbGVzOiByZXNvbHZlQ29tcG9zZXJNYXhGaWxlcyhhY3Rpb24sIGNvbmZpZyksXG4gICAgICBpbml0aWFsRmlsZXM6IGZpbGVzLFxuICAgICAgc2VydmljZTogY29tcG9zZXJTZXJ2aWNlLFxuICAgIH0sXG4gIH0pO1xufVxuIl19","import { notifyPickerValidationErrors } from '../../plugins/composer/components/shared/picker-upload';\nimport { openComposerPickerPopup } from './open-composer-picker-popup';\n/** Catalogs registered on picker actions (conversation-image, conversation-file, …). */\nfunction pickerCatalogNames(registry) {\n const names = new Set();\n for (const action of registry.actions()) {\n if ((action.component || action.componentLoader) && action.fileType) {\n names.add(action.fileType);\n }\n }\n return [...names];\n}\n/** Files that are not accepted by any registered picker catalog. */\nasync function collectUnsupportedInboundFiles(deps, files, catalogs) {\n const unsupported = [];\n for (const file of files) {\n let acceptedByAny = false;\n let lastErrors = [];\n for (const catalog of catalogs) {\n const errors = await deps.fileService.validate(file, catalog);\n if (errors.length === 0) {\n acceptedByAny = true;\n break;\n }\n lastErrors = errors;\n }\n if (!acceptedByAny) {\n unsupported.push({ file, errors: lastErrors });\n }\n }\n return unsupported;\n}\nasync function analyzeInboundFiles(deps, files) {\n if (!files.length) {\n return { matchingCatalogs: [], actions: [], supportedFiles: [], unsupportedFiles: [] };\n }\n const catalogs = pickerCatalogNames(deps.composerActionRegistry);\n const unsupportedFiles = await collectUnsupportedInboundFiles(deps, files, catalogs);\n const unsupportedSet = new Set(unsupportedFiles.map((entry) => entry.file));\n const supportedFiles = files.filter((file) => !unsupportedSet.has(file));\n if (supportedFiles.length === 0) {\n return { matchingCatalogs: [], actions: [], supportedFiles: [], unsupportedFiles };\n }\n const context = deps.composerService.actionContext();\n const matchingCatalogs = [];\n for (const catalog of catalogs) {\n const { rejected } = await deps.fileService.validateMany(supportedFiles, catalog);\n if (rejected.length === 0) {\n matchingCatalogs.push(catalog);\n }\n }\n const seen = new Set();\n const actions = [];\n for (const catalog of matchingCatalogs) {\n for (const action of deps.composerActionRegistry.findPickerActionsForFileType(catalog, context)) {\n if (!seen.has(action.id)) {\n seen.add(action.id);\n actions.push(action);\n }\n }\n }\n return {\n matchingCatalogs,\n actions: actions.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n supportedFiles,\n unsupportedFiles,\n };\n}\nfunction notifyInboundFilesValidationFailures(deps, analysis) {\n if (analysis.supportedFiles.length === 0) {\n if (analysis.unsupportedFiles.length === 0) {\n deps.toast.warning(deps.translation.translateSync('@acorex:chat.errors.inbound-files-none-supported'));\n }\n return;\n }\n if (analysis.actions.length === 0) {\n const key = analysis.matchingCatalogs.length === 0\n ? '@acorex:chat.errors.inbound-files-none-supported'\n : '@acorex:chat.errors.inbound-files-no-send-option';\n deps.toast.warning(deps.translation.translateSync(key));\n }\n}\n/**\n * File catalogs that accept every supported file in the batch, then matching visible picker actions.\n */\nexport async function resolvePickerActionsForAllFiles(deps, files) {\n const analysis = await analyzeInboundFiles(deps, files);\n return analysis.actions;\n}\nasync function promptComposerActionChoice(deps, actions, fileCount) {\n const { AXConversationComposerActionChoiceDialogComponent } = await import('./composer-action-choice-dialog.component');\n const result = await deps.popupService.open(AXConversationComposerActionChoiceDialogComponent, {\n title: deps.translation.translateSync('@acorex:chat.dialog.choose-send-option.title'),\n size: 'sm',\n closeButton: true,\n header: true,\n inputs: {\n actions,\n fileCount,\n composerActionRegistry: deps.composerActionRegistry,\n },\n });\n const action = result?.data;\n if (!action?.component && !action?.componentLoader) {\n return undefined;\n }\n return action;\n}\n/**\n * Match dropped/pasted files to composer picker action(s) and open the popup.\n * Unsupported files are skipped after a warning toast; supported files continue.\n * @returns true when a picker popup was opened\n */\nexport async function openComposerPickerForFiles(deps, files) {\n if (!files.length) {\n return false;\n }\n const conversation = deps.conversation;\n if (!conversation) {\n return false;\n }\n const analysis = await analyzeInboundFiles(deps, files);\n if (analysis.unsupportedFiles.length > 0) {\n notifyPickerValidationErrors(deps.toast, deps.translation, analysis.unsupportedFiles);\n }\n if (!analysis.supportedFiles.length || !analysis.actions.length) {\n notifyInboundFilesValidationFailures(deps, analysis);\n return false;\n }\n let action = analysis.actions[0];\n if (analysis.actions.length > 1) {\n const chosen = await promptComposerActionChoice(deps, analysis.actions, analysis.supportedFiles.length);\n if (!chosen) {\n return false;\n }\n action = chosen;\n }\n const catalog = action.fileType;\n if (!catalog) {\n deps.toast.warning(deps.translation.translateSync('@acorex:chat.errors.inbound-files-none-supported'));\n return false;\n }\n const { accepted, rejected } = await deps.fileService.validateMany(analysis.supportedFiles, catalog);\n if (rejected.length > 0) {\n notifyPickerValidationErrors(deps.toast, deps.translation, rejected);\n }\n if (accepted.length === 0) {\n return false;\n }\n await openComposerPickerPopup(deps.popupService, deps.composerService, deps.composerActionRegistry, action, conversation, accepted, deps.config);\n return true;\n}\n/** Extract OS-copied files from a paste event (e.g. Ctrl+V after copying a file in Explorer). */\nexport function filesFromClipboardEvent(event) {\n const items = event.clipboardData?.items;\n if (!items?.length) {\n return [];\n }\n const files = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n return files;\n}\n/** Whether a paste event target lies in the chat panel (not sidebar). */\nexport function isPasteTargetInChatPanel(host, target) {\n if (!(target instanceof Node) || !host.contains(target)) {\n return false;\n }\n const excluded = host.querySelector('.conversation-sidebar-container, .sidebar-container');\n if (excluded?.contains(target)) {\n return false;\n }\n const chatMain = host.querySelector('.conversation-main-container, .main-area, .conversation-view');\n if (chatMain) {\n return chatMain.contains(target);\n }\n return true;\n}\n/** Handle Ctrl+V / paste when the clipboard holds files copied from the OS. */\nexport async function handleConversationFilePaste(event, host, deps) {\n if (!isPasteTargetInChatPanel(host, event.target)) {\n return;\n }\n const files = filesFromClipboardEvent(event);\n if (!files.length) {\n return;\n }\n const handled = await openComposerPickerForFiles(deps, files);\n if (handled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1jb21wb3Nlci1waWNrZXItZm9yLWZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcG9uZW50cy9jb252ZXJzYXRpb24vc3JjL2xpYi9jb21wb25lbnRzL21lc3NhZ2UtbGlzdC9vcGVuLWNvbXBvc2VyLXBpY2tlci1mb3ItZmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFFdEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFhdkUsd0ZBQXdGO0FBQ3hGLFNBQVMsa0JBQWtCLENBQUMsUUFBOEM7SUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNoQyxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBU0Qsb0VBQW9FO0FBQ3BFLEtBQUssVUFBVSw4QkFBOEIsQ0FDM0MsSUFBa0csRUFDbEcsS0FBYSxFQUNiLFFBQWtCO0lBRWxCLE1BQU0sV0FBVyxHQUF1RCxFQUFFLENBQUM7SUFFM0UsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxVQUFVLEdBQTZCLEVBQUUsQ0FBQztRQUU5QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEs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OUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQVhQb3B1cFNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvcG9wdXAnO1xuaW1wb3J0IHR5cGUgeyBBWFRvYXN0U2VydmljZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy90b2FzdCc7XG5pbXBvcnQgeyBBWFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJ0BhY29yZXgvY29yZS90cmFuc2xhdGlvbic7XG5pbXBvcnQgdHlwZSB7IEFYRmlsZVNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L2NvcmUvZmlsZSc7XG5pbXBvcnQgdHlwZSB7IEFYVmFsaWRhdGlvblJ1bGVSZXN1bHQgfSBmcm9tICdAYWNvcmV4L2NvcmUvdmFsaWRhdGlvbic7XG5pbXBvcnQgdHlwZSB7IEFYQ29udmVyc2F0aW9uQ29tcG9zZXJTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9zZXIvY29tcG9zZXIuc2VydmljZSc7XG5pbXBvcnQgdHlwZSB7IEFYQ29udmVyc2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB0eXBlIHsgQVhDb252ZXJzYXRpb25Db21wb3NlckFjdGlvbiwgQVhDb252ZXJzYXRpb25Db21wb3NlckFjdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vcmVnaXN0cmllcy9jb21wb3Nlci1hY3Rpb24ucmVnaXN0cnknO1xuaW1wb3J0IHsgbm90aWZ5UGlja2VyVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJy4uLy4uL3BsdWdpbnMvY29tcG9zZXIvY29tcG9uZW50cy9zaGFyZWQvcGlja2VyLXVwbG9hZCc7XG5pbXBvcnQgdHlwZSB7IEFYQ29udmVyc2F0aW9uQ29uZmlnIH0gZnJvbSAnLi4vLi4vdG9rZW5zL2NvbnZlcnNhdGlvbi1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IG9wZW5Db21wb3NlclBpY2tlclBvcHVwIH0gZnJvbSAnLi9vcGVuLWNvbXBvc2VyLXBpY2tlci1wb3B1cCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhDb252ZXJzYXRpb25PcGVuQ29tcG9zZXJQaWNrZXJGb3JGaWxlc0RlcHMge1xuICBmaWxlU2VydmljZTogQVhGaWxlU2VydmljZTtcbiAgY29tcG9zZXJTZXJ2aWNlOiBBWENvbnZlcnNhdGlvbkNvbXBvc2VyU2VydmljZTtcbiAgY29tcG9zZXJBY3Rpb25SZWdpc3RyeTogQVhDb252ZXJzYXRpb25Db21wb3NlckFjdGlvblJlZ2lzdHJ5O1xuICBwb3B1cFNlcnZpY2U6IEFYUG9wdXBTZXJ2aWNlO1xuICB0b2FzdDogQVhUb2FzdFNlcnZpY2U7XG4gIHRyYW5zbGF0aW9uOiBBWFRyYW5zbGF0aW9uU2VydmljZTtcbiAgY29udmVyc2F0aW9uOiBBWENvbnZlcnNhdGlvbiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIGNvbmZpZzogUGljazxSZXF1aXJlZDxBWENvbnZlcnNhdGlvbkNvbmZpZz4sICdtYXhGaWxlc1Blck1lc3NhZ2UnPjtcbn1cblxuLyoqIENhdGFsb2dzIHJlZ2lzdGVyZWQgb24gcGlja2VyIGFjdGlvbnMgKGNvbnZlcnNhdGlvbi1pbWFnZSwgY29udmVyc2F0aW9uLWZpbGUsIOKApikuICovXG5mdW5jdGlvbiBwaWNrZXJDYXRhbG9nTmFtZXMocmVnaXN0cnk6IEFYQ29udmVyc2F0aW9uQ29tcG9zZXJBY3Rpb25SZWdpc3RyeSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBhY3Rpb24gb2YgcmVnaXN0cnkuYWN0aW9ucygpKSB7XG4gICAgaWYgKChhY3Rpb24uY29tcG9uZW50IHx8IGFjdGlvbi5jb21wb25lbnRMb2FkZXIpICYmIGFjdGlvbi5maWxlVHlwZSkge1xuICAgICAgbmFtZXMuYWRkKGFjdGlvbi5maWxlVHlwZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmFtZXNdO1xufVxuXG5pbnRlcmZhY2UgQVhDb252ZXJzYXRpb25JbmJvdW5kRmlsZXNBbmFseXNpcyB7XG4gIG1hdGNoaW5nQ2F0YWxvZ3M6IHN0cmluZ1tdO1xuICBhY3Rpb25zOiBBWENvbnZlcnNhdGlvbkNvbXBvc2VyQWN0aW9uW107XG4gIHN1cHBvcnRlZEZpbGVzOiBGaWxlW107XG4gIHVuc3VwcG9ydGVkRmlsZXM6IHsgZmlsZTogRmlsZTsgZXJyb3JzOiBBWFZhbGlkYXRpb25SdWxlUmVzdWx0W10gfVtdO1xufVxuXG4vKiogRmlsZXMgdGhhdCBhcmUgbm90IGFjY2VwdGVkIGJ5IGFueSByZWdpc3RlcmVkIHBpY2tlciBjYXRhbG9nLiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFVuc3VwcG9ydGVkSW5ib3VuZEZpbGVzKFxuICBkZXBzOiBQaWNrPEFYQ29udmVyc2F0aW9uT3BlbkNvbXBvc2VyUGlja2VyRm9yRmlsZXNEZXBzLCAnZmlsZVNlcnZpY2UnIHwgJ2NvbXBvc2VyQWN0aW9uUmVnaXN0cnknPixcbiAgZmlsZXM6IEZpbGVbXSxcbiAgY2F0YWxvZ3M6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTx7IGZpbGU6IEZpbGU7IGVycm9yczogQVhWYWxpZGF0aW9uUnVsZVJlc3VsdFtdIH1bXT4ge1xuICBjb25zdCB1bnN1cHBvcnRlZDogeyBmaWxlOiBGaWxlOyBlcnJvcnM6IEFYVmFsaWRhdGlvblJ1bGVSZXN1bHRbXSB9W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBsZXQgYWNjZXB0ZWRCeUFueSA9IGZhbHNlO1xuICAgIGxldCBsYXN0RXJyb3JzOiBBWFZhbGlkYXRpb25SdWxlUmVzdWx0W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY2F0YWxvZyBvZiBjYXRhbG9ncykge1xuICAgICAgY29uc3QgZXJyb3JzID0gYXdhaXQgZGVwcy5maWxlU2VydmljZS52YWxpZGF0ZShmaWxlLCBjYXRhbG9nKTtcbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGFjY2VwdGVkQnlBbnkgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGxhc3RFcnJvcnMgPSBlcnJvcnM7XG4gICAgfVxuXG4gICAgaWYgKCFhY2NlcHRlZEJ5QW55KSB7XG4gICAgICB1bnN1cHBvcnRlZC5wdXNoKHsgZmlsZSwgZXJyb3JzOiBsYXN0RXJyb3JzIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bnN1cHBvcnRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYW5hbHl6ZUluYm91bmRGaWxlcyhcbiAgZGVwczogUGljazxcbiAgICBBWENvbnZlcnNhdGlvbk9wZW5Db21wb3NlclBpY2tlckZvckZpbGVzRGVwcyxcbiAgICAnZmlsZVNlcnZpY2UnIHwgJ2NvbXBvc2VyU2VydmljZScgfCAnY29tcG9zZXJBY3Rpb25SZWdpc3RyeSdcbiAgPixcbiAgZmlsZXM6IEZpbGVbXSxcbik6IFByb21pc2U8QVhDb252ZXJzYXRpb25JbmJvdW5kRmlsZXNBbmFseXNpcz4ge1xuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIHJldHVybiB7IG1hdGNoaW5nQ2F0YWxvZ3M6IFtdLCBhY3Rpb25zOiBbXSwgc3VwcG9ydGVkRmlsZXM6IFtdLCB1bnN1cHBvcnRlZEZpbGVzOiBbXSB9O1xuICB9XG5cbiAgY29uc3QgY2F0YWxvZ3MgPSBwaWNrZXJDYXRhbG9nTmFtZXMoZGVwcy5jb21wb3NlckFjdGlvblJlZ2lzdHJ5KTtcbiAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlcyA9IGF3YWl0IGNvbGxlY3RVbnN1cHBvcnRlZEluYm91bmRGaWxlcyhkZXBzLCBmaWxlcywgY2F0YWxvZ3MpO1xuICBjb25zdCB1bnN1cHBvcnRlZFNldCA9IG5ldyBTZXQodW5zdXBwb3J0ZWRGaWxlcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5maWxlKSk7XG4gIGNvbnN0IHN1cHBvcnRlZEZpbGVzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAhdW5zdXBwb3J0ZWRTZXQuaGFzKGZpbGUpKTtcblxuICBpZiAoc3VwcG9ydGVkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgbWF0Y2hpbmdDYXRhbG9nczogW10sIGFjdGlvbnM6IFtdLCBzdXBwb3J0ZWRGaWxlczogW10sIHVuc3VwcG9ydGVkRmlsZXMgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQgPSBkZXBzLmNvbXBvc2VyU2VydmljZS5hY3Rpb25Db250ZXh0KCk7XG4gIGNvbnN0IG1hdGNoaW5nQ2F0YWxvZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBjYXRhbG9nIG9mIGNhdGFsb2dzKSB7XG4gICAgY29uc3QgeyByZWplY3RlZCB9ID0gYXdhaXQgZGVwcy5maWxlU2VydmljZS52YWxpZGF0ZU1hbnkoc3VwcG9ydGVkRmlsZXMsIGNhdGFsb2cpO1xuICAgIGlmIChyZWplY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIG1hdGNoaW5nQ2F0YWxvZ3MucHVzaChjYXRhbG9nKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGFjdGlvbnM6IEFYQ29udmVyc2F0aW9uQ29tcG9zZXJBY3Rpb25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgY2F0YWxvZyBvZiBtYXRjaGluZ0NhdGFsb2dzKSB7XG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgZGVwcy5jb21wb3NlckFjdGlvblJlZ2lzdHJ5LmZpbmRQaWNrZXJBY3Rpb25zRm9yRmlsZVR5cGUoY2F0YWxvZywgY29udGV4dCkpIHtcbiAgICAgIGlmICghc2Vlbi5oYXMoYWN0aW9uLmlkKSkge1xuICAgICAgICBzZWVuLmFkZChhY3Rpb24uaWQpO1xuICAgICAgICBhY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hdGNoaW5nQ2F0YWxvZ3MsXG4gICAgYWN0aW9uczogYWN0aW9ucy5zb3J0KChhLCBiKSA9PiAoYi5wcmlvcml0eSA/PyAwKSAtIChhLnByaW9yaXR5ID8/IDApKSxcbiAgICBzdXBwb3J0ZWRGaWxlcyxcbiAgICB1bnN1cHBvcnRlZEZpbGVzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3RpZnlJbmJvdW5kRmlsZXNWYWxpZGF0aW9uRmFpbHVyZXMoXG4gIGRlcHM6IFBpY2s8QVhDb252ZXJzYXRpb25PcGVuQ29tcG9zZXJQaWNrZXJGb3JGaWxlc0RlcHMsICd0b2FzdCcgfCAndHJhbnNsYXRpb24nPixcbiAgYW5hbHlzaXM6IEFYQ29udmVyc2F0aW9uSW5ib3VuZEZpbGVzQW5hbHlzaXMsXG4pOiB2b2lkIHtcbiAgaWYgKGFuYWx5c2lzLnN1cHBvcnRlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChhbmFseXNpcy51bnN1cHBvcnRlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVwcy50b2FzdC53YXJuaW5nKGRlcHMudHJhbnNsYXRpb24udHJhbnNsYXRlU3luYygnQGFjb3JleDpjaGF0LmVycm9ycy5pbmJvdW5kLWZpbGVzLW5vbmUtc3VwcG9ydGVkJykpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYW5hbHlzaXMuYWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zdCBrZXkgPVxuICAgICAgYW5hbHlzaXMubWF0Y2hpbmdDYXRhbG9ncy5sZW5ndGggPT09IDBcbiAgICAgICAgPyAnQGFjb3JleDpjaGF0LmVycm9ycy5pbmJvdW5kLWZpbGVzLW5vbmUtc3VwcG9ydGVkJ1xuICAgICAgICA6ICdAYWNvcmV4OmNoYXQuZXJyb3JzLmluYm91bmQtZmlsZXMtbm8tc2VuZC1vcHRpb24nO1xuICAgIGRlcHMudG9hc3Qud2FybmluZyhkZXBzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZVN5bmMoa2V5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBGaWxlIGNhdGFsb2dzIHRoYXQgYWNjZXB0IGV2ZXJ5IHN1cHBvcnRlZCBmaWxlIGluIHRoZSBiYXRjaCwgdGhlbiBtYXRjaGluZyB2aXNpYmxlIHBpY2tlciBhY3Rpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBpY2tlckFjdGlvbnNGb3JBbGxGaWxlcyhcbiAgZGVwczogUGljazxBWENvbnZlcnNhdGlvbk9wZW5Db21wb3NlclBpY2tlckZvckZpbGVzRGVwcywgJ2ZpbGVTZXJ2aWNlJyB8ICdjb21wb3NlclNlcnZpY2UnIHwgJ2NvbXBvc2VyQWN0aW9uUmVnaXN0cnknPixcbiAgZmlsZXM6IEZpbGVbXSxcbik6IFByb21pc2U8QVhDb252ZXJzYXRpb25Db21wb3NlckFjdGlvbltdPiB7XG4gIGNvbnN0IGFuYWx5c2lzID0gYXdhaXQgYW5hbHl6ZUluYm91bmRGaWxlcyhkZXBzLCBmaWxlcyk7XG4gIHJldHVybiBhbmFseXNpcy5hY3Rpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRDb21wb3NlckFjdGlvbkNob2ljZShcbiAgZGVwczogQVhDb252ZXJzYXRpb25PcGVuQ29tcG9zZXJQaWNrZXJGb3JGaWxlc0RlcHMsXG4gIGFjdGlvbnM6IEFYQ29udmVyc2F0aW9uQ29tcG9zZXJBY3Rpb25bXSxcbiAgZmlsZUNvdW50OiBudW1iZXIsXG4pOiBQcm9taXNlPEFYQ29udmVyc2F0aW9uQ29tcG9zZXJBY3Rpb24gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgeyBBWENvbnZlcnNhdGlvbkNvbXBvc2VyQWN0aW9uQ2hvaWNlRGlhbG9nQ29tcG9uZW50IH0gPSBhd2FpdCBpbXBvcnQoJy4vY29tcG9zZXItYWN0aW9uLWNob2ljZS1kaWFsb2cuY29tcG9uZW50Jyk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlcHMucG9wdXBTZXJ2aWNlLm9wZW4oQVhDb252ZXJzYXRpb25Db21wb3NlckFjdGlvbkNob2ljZURpYWxvZ0NvbXBvbmVudCwge1xuICAgIHRpdGxlOiBkZXBzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZVN5bmMoJ0BhY29yZXg6Y2hhdC5kaWFsb2cuY2hvb3NlLXNlbmQtb3B0aW9uLnRpdGxlJyksXG4gICAgc2l6ZTogJ3NtJyxcbiAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICBoZWFkZXI6IHRydWUsXG4gICAgaW5wdXRzOiB7XG4gICAgICBhY3Rpb25zLFxuICAgICAgZmlsZUNvdW50LFxuICAgICAgY29tcG9zZXJBY3Rpb25SZWdpc3RyeTogZGVwcy5jb21wb3NlckFjdGlvblJlZ2lzdHJ5LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGFjdGlvbiA9IHJlc3VsdD8uZGF0YSBhcyBBWENvbnZlcnNhdGlvbkNvbXBvc2VyQWN0aW9uIHwgdW5kZWZpbmVkO1xuICBpZiAoIWFjdGlvbj8uY29tcG9uZW50ICYmICFhY3Rpb24/LmNvbXBvbmVudExvYWRlcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGFjdGlvbjtcbn1cblxuLyoqXG4gKiBNYXRjaCBkcm9wcGVkL3Bhc3RlZCBmaWxlcyB0byBjb21wb3NlciBwaWNrZXIgYWN0aW9uKHMpIGFuZCBvcGVuIHRoZSBwb3B1cC5cbiAqIFVuc3VwcG9ydGVkIGZpbGVzIGFyZSBza2lwcGVkIGFmdGVyIGEgd2FybmluZyB0b2FzdDsgc3VwcG9ydGVkIGZpbGVzIGNvbnRpbnVlLlxuICogQHJldHVybnMgdHJ1ZSB3aGVuIGEgcGlja2VyIHBvcHVwIHdhcyBvcGVuZWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5Db21wb3NlclBpY2tlckZvckZpbGVzKFxuICBkZXBzOiBBWENvbnZlcnNhdGlvbk9wZW5Db21wb3NlclBpY2tlckZvckZpbGVzRGVwcyxcbiAgZmlsZXM6IEZpbGVbXSxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGRlcHMuY29udmVyc2F0aW9uO1xuICBpZiAoIWNvbnZlcnNhdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFuYWx5c2lzID0gYXdhaXQgYW5hbHl6ZUluYm91bmRGaWxlcyhkZXBzLCBmaWxlcyk7XG5cbiAgaWYgKGFuYWx5c2lzLnVuc3VwcG9ydGVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgIG5vdGlmeVBpY2tlclZhbGlkYXRpb25FcnJvcnMoZGVwcy50b2FzdCwgZGVwcy50cmFuc2xhdGlvbiwgYW5hbHlzaXMudW5zdXBwb3J0ZWRGaWxlcyk7XG4gIH1cblxuICBpZiAoIWFuYWx5c2lzLnN1cHBvcnRlZEZpbGVzLmxlbmd0aCB8fCAhYW5hbHlzaXMuYWN0aW9ucy5sZW5ndGgpIHtcbiAgICBub3RpZnlJbmJvdW5kRmlsZXNWYWxpZGF0aW9uRmFpbHVyZXMoZGVwcywgYW5hbHlzaXMpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBhY3Rpb24gPSBhbmFseXNpcy5hY3Rpb25zWzBdO1xuICBpZiAoYW5hbHlzaXMuYWN0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgY2hvc2VuID0gYXdhaXQgcHJvbXB0Q29tcG9zZXJBY3Rpb25DaG9pY2UoZGVwcywgYW5hbHlzaXMuYWN0aW9ucywgYW5hbHlzaXMuc3VwcG9ydGVkRmlsZXMubGVuZ3RoKTtcbiAgICBpZiAoIWNob3Nlbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhY3Rpb24gPSBjaG9zZW47XG4gIH1cblxuICBjb25zdCBjYXRhbG9nID0gYWN0aW9uLmZpbGVUeXBlO1xuICBpZiAoIWNhdGFsb2cpIHtcbiAgICBkZXBzLnRvYXN0Lndhcm5pbmcoZGVwcy50cmFuc2xhdGlvbi50cmFuc2xhdGVTeW5jKCdAYWNvcmV4OmNoYXQuZXJyb3JzLmluYm91bmQtZmlsZXMtbm9uZS1zdXBwb3J0ZWQnKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgeyBhY2NlcHRlZCwgcmVqZWN0ZWQgfSA9IGF3YWl0IGRlcHMuZmlsZVNlcnZpY2UudmFsaWRhdGVNYW55KGFuYWx5c2lzLnN1cHBvcnRlZEZpbGVzLCBjYXRhbG9nKTtcbiAgaWYgKHJlamVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICBub3RpZnlQaWNrZXJWYWxpZGF0aW9uRXJyb3JzKGRlcHMudG9hc3QsIGRlcHMudHJhbnNsYXRpb24sIHJlamVjdGVkKTtcbiAgfVxuICBpZiAoYWNjZXB0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXdhaXQgb3BlbkNvbXBvc2VyUGlja2VyUG9wdXAoXG4gICAgZGVwcy5wb3B1cFNlcnZpY2UsXG4gICAgZGVwcy5jb21wb3NlclNlcnZpY2UsXG4gICAgZGVwcy5jb21wb3NlckFjdGlvblJlZ2lzdHJ5LFxuICAgIGFjdGlvbixcbiAgICBjb252ZXJzYXRpb24sXG4gICAgYWNjZXB0ZWQsXG4gICAgZGVwcy5jb25maWcsXG4gICk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogRXh0cmFjdCBPUy1jb3BpZWQgZmlsZXMgZnJvbSBhIHBhc3RlIGV2ZW50IChlLmcuIEN0cmwrViBhZnRlciBjb3B5aW5nIGEgZmlsZSBpbiBFeHBsb3JlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsZXNGcm9tQ2xpcGJvYXJkRXZlbnQoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogRmlsZVtdIHtcbiAgY29uc3QgaXRlbXMgPSBldmVudC5jbGlwYm9hcmREYXRhPy5pdGVtcztcbiAgaWYgKCFpdGVtcz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgZmlsZXM6IEZpbGVbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgIGlmIChpdGVtLmtpbmQgPT09ICdmaWxlJykge1xuICAgICAgY29uc3QgZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7XG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG5cbi8qKiBXaGV0aGVyIGEgcGFzdGUgZXZlbnQgdGFyZ2V0IGxpZXMgaW4gdGhlIGNoYXQgcGFuZWwgKG5vdCBzaWRlYmFyKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Bhc3RlVGFyZ2V0SW5DaGF0UGFuZWwoaG9zdDogSFRNTEVsZW1lbnQsIHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogYm9vbGVhbiB7XG4gIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHx8ICFob3N0LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBleGNsdWRlZCA9IGhvc3QucXVlcnlTZWxlY3RvcignLmNvbnZlcnNhdGlvbi1zaWRlYmFyLWNvbnRhaW5lciwgLnNpZGViYXItY29udGFpbmVyJyk7XG4gIGlmIChleGNsdWRlZD8uY29udGFpbnModGFyZ2V0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNoYXRNYWluID0gaG9zdC5xdWVyeVNlbGVjdG9yKCcuY29udmVyc2F0aW9uLW1haW4tY29udGFpbmVyLCAubWFpbi1hcmVhLCAuY29udmVyc2F0aW9uLXZpZXcnKTtcbiAgaWYgKGNoYXRNYWluKSB7XG4gICAgcmV0dXJuIGNoYXRNYWluLmNvbnRhaW5zKHRhcmdldCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIEhhbmRsZSBDdHJsK1YgLyBwYXN0ZSB3aGVuIHRoZSBjbGlwYm9hcmQgaG9sZHMgZmlsZXMgY29waWVkIGZyb20gdGhlIE9TLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNvbnZlcnNhdGlvbkZpbGVQYXN0ZShcbiAgZXZlbnQ6IENsaXBib2FyZEV2ZW50LFxuICBob3N0OiBIVE1MRWxlbWVudCxcbiAgZGVwczogQVhDb252ZXJzYXRpb25PcGVuQ29tcG9zZXJQaWNrZXJGb3JGaWxlc0RlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1Bhc3RlVGFyZ2V0SW5DaGF0UGFuZWwoaG9zdCwgZXZlbnQudGFyZ2V0KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZmlsZXNGcm9tQ2xpcGJvYXJkRXZlbnQoZXZlbnQpO1xuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZWQgPSBhd2FpdCBvcGVuQ29tcG9zZXJQaWNrZXJGb3JGaWxlcyhkZXBzLCBmaWxlcyk7XG4gIGlmIChoYW5kbGVkKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfVxufVxuIl19"],"names":[],"mappings":"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"}