@memberjunction/ng-dashboards 5.11.0 → 5.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -2
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +586 -223
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +8 -0
  7. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  8. package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
  9. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  10. package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
  11. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
  12. package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
  13. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
  14. package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
  15. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
  16. package/dist/AI/components/charts/time-series-chart.component.js +23 -8
  17. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
  18. package/dist/AI/components/execution-monitoring.component.js +2 -2
  19. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  20. package/dist/AI/components/models/model-management.component.js +2 -2
  21. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
  22. package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
  23. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  24. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
  26. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
  27. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
  28. package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
  29. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
  30. package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
  31. package/dist/AI/components/system/system-configuration.component.js +2 -2
  32. package/dist/AI/components/widgets/kpi-card.component.js +7 -7
  33. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  34. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
  35. package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
  36. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
  37. package/dist/AI/index.d.ts +1 -0
  38. package/dist/AI/index.d.ts.map +1 -1
  39. package/dist/AI/index.js +2 -0
  40. package/dist/AI/index.js.map +1 -1
  41. package/dist/APIKeys/api-applications-panel.component.js +3 -3
  42. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  43. package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
  44. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  45. package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
  46. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  47. package/dist/APIKeys/api-key-list.component.js +3 -3
  48. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  49. package/dist/APIKeys/api-keys-resource.component.js +1 -1
  50. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  51. package/dist/APIKeys/api-scopes-panel.component.js +2 -2
  52. package/dist/APIKeys/api-usage-panel.component.js +2 -2
  53. package/dist/Actions/components/actions-overview.component.js +2 -2
  54. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  55. package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
  56. package/dist/Actions/components/explorer/action-card.component.js +2 -2
  57. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  58. package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
  59. package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
  61. package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
  62. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  63. package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
  64. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  65. package/dist/Communication/communication-dashboard.component.js +2 -2
  66. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  67. package/dist/Communication/communication-logs-resource.component.js +3 -3
  68. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  69. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  70. package/dist/Communication/communication-monitor-resource.component.js +5 -5
  71. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  72. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  73. package/dist/Communication/communication-providers-resource.component.js +3 -3
  74. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  75. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  76. package/dist/Communication/communication-runs-resource.component.js +3 -3
  77. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  78. package/dist/Communication/communication-templates-resource.component.js +2 -2
  79. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  80. package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
  81. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
  82. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
  83. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
  84. package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
  86. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
  88. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
  90. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
  92. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  96. package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  98. package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
  99. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
  100. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
  102. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  104. package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
  105. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  106. package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
  107. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  108. package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
  109. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  110. package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
  111. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  112. package/dist/Credentials/credentials-dashboard.component.js +2 -2
  113. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
  114. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
  115. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
  116. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
  117. package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
  118. package/dist/DataExplorer/data-explorer-dashboard.component.js +4 -4
  119. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  120. package/dist/Home/home-dashboard.component.js +2 -2
  121. package/dist/Integration/components/activity/activity.component.d.ts +1 -1
  122. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  123. package/dist/Integration/components/activity/activity.component.js +5 -5
  124. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  125. package/dist/Integration/components/connections/connections.component.d.ts +31 -2
  126. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  127. package/dist/Integration/components/connections/connections.component.js +753 -412
  128. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  129. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
  130. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  131. package/dist/Integration/components/overview/overview.component.d.ts +0 -1
  132. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  133. package/dist/Integration/components/overview/overview.component.js +3 -6
  134. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  135. package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
  136. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  137. package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
  138. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  139. package/dist/Integration/components/schedules/schedules.component.js +97 -5
  140. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  141. package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
  142. package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
  143. package/dist/Integration/components/widgets/integration-card.component.js +5 -1
  144. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  145. package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
  146. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  147. package/dist/Integration/integration.module.d.ts +2 -1
  148. package/dist/Integration/integration.module.d.ts.map +1 -1
  149. package/dist/Integration/integration.module.js +7 -3
  150. package/dist/Integration/integration.module.js.map +1 -1
  151. package/dist/Integration/services/integration-data.service.d.ts +27 -2
  152. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  153. package/dist/Integration/services/integration-data.service.js +107 -4
  154. package/dist/Integration/services/integration-data.service.js.map +1 -1
  155. package/dist/Lists/components/lists-browse-resource.component.js +2 -2
  156. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  157. package/dist/Lists/components/lists-categories-resource.component.js +2 -2
  158. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  159. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
  160. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  161. package/dist/Lists/components/lists-operations-resource.component.js +2 -2
  162. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  163. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
  164. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  165. package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
  166. package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
  167. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  168. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  169. package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
  170. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  171. package/dist/MCP/mcp-dashboard.component.js +2 -2
  172. package/dist/MCP/mcp-filter-panel.component.js +2 -2
  173. package/dist/QueryBrowser/query-browser-resource.component.js +7 -7
  174. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  175. package/dist/Scheduling/components/index.d.ts +0 -1
  176. package/dist/Scheduling/components/index.d.ts.map +1 -1
  177. package/dist/Scheduling/components/index.js +0 -1
  178. package/dist/Scheduling/components/index.js.map +1 -1
  179. package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
  180. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
  181. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  182. package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
  183. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  184. package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
  185. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  186. package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
  187. package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
  188. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  189. package/dist/Testing/components/testing-analytics.component.js +2 -2
  190. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  191. package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
  192. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  193. package/dist/Testing/components/testing-explorer.component.js +2 -2
  194. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  195. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  196. package/dist/Testing/components/testing-review.component.js +5 -5
  197. package/dist/Testing/components/testing-review.component.js.map +1 -1
  198. package/dist/Testing/components/testing-runs.component.js +2 -2
  199. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  200. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
  201. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
  202. package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
  203. package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
  204. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
  205. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
  206. package/dist/Testing/testing-dashboard.component.js +2 -2
  207. package/dist/VersionHistory/components/diff-resource.component.js +2 -2
  208. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  209. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  210. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  211. package/dist/VersionHistory/components/restore-resource.component.js +3 -3
  212. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  213. package/dist/__tests__/integration-data-service.test.js +1 -0
  214. package/dist/__tests__/integration-data-service.test.js.map +1 -1
  215. package/dist/module.d.ts +52 -49
  216. package/dist/module.d.ts.map +1 -1
  217. package/dist/module.js +25 -6
  218. package/dist/module.js.map +1 -1
  219. package/dist/public-api.d.ts +1 -1
  220. package/dist/public-api.d.ts.map +1 -1
  221. package/dist/public-api.js +1 -1
  222. package/dist/public-api.js.map +1 -1
  223. package/package.json +42 -40
  224. package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
  225. package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
  226. package/dist/Scheduling/components/job-slideout.component.js +0 -459
  227. package/dist/Scheduling/components/job-slideout.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"lists-operations-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-operations-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, SharedService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListEntity, MJListDetailEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { Metadata, RunView, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { ListSetOperationsService, VennData, VennIntersection, SetOperation, SetOperationResult } from '../services/list-set-operations.service';\nimport { VennRegionClickEvent } from './venn-diagram/venn-diagram.component';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\ninterface ListSelection {\n list: MJListEntity;\n entityName: string;\n color: string;\n}\n\n/**\n * Preview record with meaningful display fields\n */\ninterface PreviewRecord {\n id: string;\n displayName: string;\n secondaryInfo?: string;\n entityName: string;\n}\n\n/**\n * Entity option for filtering\n */\ninterface EntityOption {\n id: string;\n name: string;\n listCount: number;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsOperationsResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-operations-resource',\n template: `\n <div class=\"operations-container\">\n <!-- Header -->\n <div class=\"operations-header\">\n <div class=\"header-top\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n <h2>List Operations</h2>\n </div>\n @if (selectedLists.length > 0 || selectedEntityId) {\n <button\n class=\"clear-all-btn\"\n (click)=\"clearAllSelections()\"\n title=\"Clear all selections\">\n <i class=\"fa-solid fa-xmark\"></i>\n Clear\n </button>\n }\n </div>\n <div class=\"header-subtitle\">\n Visualize overlaps and perform set operations on your lists\n </div>\n </div>\n \n <!-- Main Content -->\n <div class=\"operations-content\">\n <!-- Left Panel: List Selection -->\n <div class=\"selection-panel\">\n <div class=\"panel-header\">\n <h3>Selected Lists</h3>\n @if (selectedLists.length > 0) {\n <span class=\"list-count\">\n {{selectedLists.length}}/{{maxLists}}\n </span>\n }\n </div>\n \n <!-- Entity Filter Selector -->\n <div class=\"entity-filter-section\">\n <label class=\"filter-label\">Filter by Entity</label>\n <div class=\"entity-selector\">\n <select\n [(ngModel)]=\"selectedEntityId\"\n (ngModelChange)=\"onEntityFilterChange()\"\n class=\"entity-select\">\n <option value=\"\">All Entities</option>\n @for (entity of entityOptions; track entity) {\n <option [value]=\"entity.id\">\n {{entity.name}} ({{entity.listCount}})\n </option>\n }\n </select>\n </div>\n </div>\n \n <!-- Selected lists -->\n <div class=\"selected-lists\">\n @for (item of selectedLists; track item; let i = $index) {\n <div class=\"selected-item\">\n <div class=\"item-color\" [style.background-color]=\"item.color\"></div>\n <div class=\"item-info\">\n <span class=\"item-name\">{{item.list.Name}}</span>\n <span class=\"item-entity\">{{item.entityName}}</span>\n </div>\n <button class=\"remove-btn\" (click)=\"removeList(i)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n \n @if (selectedLists.length < maxLists) {\n <div class=\"add-list-area\">\n <div class=\"add-list-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"listSearchTerm\"\n (ngModelChange)=\"filterAvailableLists()\"\n placeholder=\"Search lists to add...\"\n (focus)=\"showListDropdown = true\" />\n </div>\n <!-- Available lists dropdown -->\n @if (showListDropdown && filteredAvailableLists.length > 0) {\n <div class=\"list-dropdown\">\n <div class=\"dropdown-backdrop\" (click)=\"showListDropdown = false\"></div>\n <div class=\"dropdown-content\">\n @for (list of filteredAvailableLists; track list) {\n <div\n class=\"dropdown-item\"\n (click)=\"addList(list)\">\n <span class=\"dropdown-name\">{{list.Name}}</span>\n <span class=\"dropdown-entity\">{{list.Entity}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n \n @if (selectedLists.length >= maxLists) {\n <div class=\"lists-full\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Maximum {{maxLists}} lists can be compared\n </div>\n }\n </div>\n \n <!-- Entity consistency note -->\n @if (selectedLists.length > 0) {\n <div class=\"entity-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Comparing lists of type: <strong>{{selectedLists[0].entityName}}</strong></span>\n </div>\n }\n \n <!-- Quick Operations -->\n @if (selectedLists.length >= 2) {\n <div class=\"quick-operations\">\n <h4>Quick Operations</h4>\n <div class=\"operation-buttons\">\n <button class=\"op-btn\" (click)=\"performOperation('union')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>Union All</span>\n </button>\n <button class=\"op-btn\" (click)=\"performOperation('intersection')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-circle-notch\"></i>\n <span>Intersection</span>\n </button>\n <button class=\"op-btn\" (click)=\"performOperation('symmetric_difference')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-arrows-split-up-and-left\"></i>\n <span>Unique Each</span>\n </button>\n </div>\n </div>\n }\n </div>\n \n <!-- Center: Venn Diagram -->\n <div class=\"venn-panel\">\n @if (selectedLists.length > 0) {\n <mj-venn-diagram\n [data]=\"vennData\"\n [selectedRegion]=\"selectedRegion\"\n (regionClick)=\"onRegionClick($event)\">\n </mj-venn-diagram>\n }\n \n @if (selectedLists.length === 0) {\n <div class=\"venn-empty\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-circle-nodes\"></i>\n </div>\n <h3>Add Lists to Compare</h3>\n <p>Select 2-4 lists from the same entity to visualize their overlaps and perform set operations.</p>\n </div>\n }\n \n @if (isCalculating) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Calculating...\"></mj-loading>\n </div>\n }\n </div>\n \n <!-- Right Panel: Selected Region / Results -->\n <div class=\"results-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-crosshairs\"></i>\n {{selectedRegion ? 'Selected Region' : 'Results'}}\n </h3>\n </div>\n \n <!-- Selected region details -->\n @if (selectedRegion) {\n <div class=\"region-details\">\n <div class=\"region-header\">\n <span class=\"region-label\">{{selectedRegion.label}}</span>\n <span class=\"region-count\">{{selectedRegion.size}} records</span>\n </div>\n <div class=\"region-actions\">\n <button class=\"action-btn primary\" (click)=\"createListFromSelection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New List\n </button>\n <button class=\"action-btn\" (click)=\"addToExistingList()\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n Add to List\n </button>\n <button class=\"action-btn\" (click)=\"exportToExcel()\">\n <i class=\"fa-solid fa-file-excel\"></i>\n Export\n </button>\n </div>\n @if (previewRecordsDisplay.length > 0) {\n <div class=\"record-preview\">\n <h5>Preview (first 10)</h5>\n <div class=\"preview-list\">\n @for (record of previewRecordsDisplay; track record) {\n <div class=\"preview-card\">\n <div class=\"preview-card-content\">\n <span class=\"preview-name\">{{record.displayName}}</span>\n @if (record.secondaryInfo) {\n <span class=\"preview-secondary\">{{record.secondaryInfo}}</span>\n }\n </div>\n <button class=\"preview-open-btn\" (click)=\"openRecord(record)\" title=\"Open record\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n </div>\n }\n </div>\n @if (loadingPreview) {\n <div class=\"preview-loading\">\n <mj-loading text=\"Loading preview...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n }\n </div>\n }\n \n <!-- Operation result -->\n @if (lastOperationResult && !selectedRegion) {\n <div class=\"operation-result\">\n <div class=\"result-header\">\n <span class=\"result-operation\">{{getOperationLabel(lastOperationResult.operation)}}</span>\n <span class=\"result-count\">{{lastOperationResult.resultCount}} records</span>\n </div>\n <div class=\"region-actions\">\n <button class=\"action-btn primary\" (click)=\"createListFromResult()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New List\n </button>\n <button class=\"action-btn\" (click)=\"addResultToExistingList()\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n Add to List\n </button>\n </div>\n </div>\n }\n \n <!-- Empty state -->\n @if (!selectedRegion && !lastOperationResult) {\n <div class=\"results-empty\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Click a region in the diagram or run an operation to see results</p>\n </div>\n }\n </div>\n </div>\n \n <!-- Create List Dialog -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"cancelCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>Create New List from Selection</h3>\n <button class=\"modal-close\" (click)=\"cancelCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>List Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"newListName\"\n placeholder=\"Enter list name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"newListDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"form-info\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{recordsToAdd.length}} record{{recordsToAdd.length !== 1 ? 's' : ''}} will be added to this list\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-primary\" (click)=\"confirmCreateList()\" [disabled]=\"!newListName || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Creating...' : 'Create List'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelCreateDialog()\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Add to Existing List Dialog -->\n @if (showAddToListDialog) {\n <div class=\"modal-overlay\" (click)=\"cancelAddToListDialog()\"></div>\n }\n @if (showAddToListDialog) {\n <div class=\"modal-dialog add-to-list-dialog\">\n <div class=\"modal-header\">\n <h3>Add to Existing List</h3>\n <button class=\"modal-close\" (click)=\"cancelAddToListDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-info\" style=\"margin-bottom: 16px;\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{recordsToAdd.length}} record{{recordsToAdd.length !== 1 ? 's' : ''}} will be added\n </div>\n <!-- Search input -->\n <div class=\"list-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"addToListSearchTerm\"\n (ngModelChange)=\"filterAddToListOptions()\"\n placeholder=\"Search lists...\"\n class=\"form-input\" />\n </div>\n <!-- List options -->\n <div class=\"list-options\">\n @for (list of filteredAddToListOptions; track list) {\n <div\n class=\"list-option\"\n [class.selected]=\"IsTargetListSelected(list)\"\n (click)=\"selectTargetList(list.ID)\">\n <div class=\"list-option-radio\">\n <input\n type=\"radio\"\n [checked]=\"IsTargetListSelected(list)\"\n name=\"targetList\" />\n </div>\n <div class=\"list-option-info\">\n <span class=\"list-option-name\">{{list.Name}}</span>\n <span class=\"list-option-entity\">{{list.Entity}}</span>\n </div>\n </div>\n }\n @if (filteredAddToListOptions.length === 0) {\n <div class=\"list-options-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>{{addToListSearchTerm ? 'No lists match your search' : 'No other lists available'}}</p>\n </div>\n }\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-primary\" (click)=\"confirmAddToList()\" [disabled]=\"!selectedTargetListId || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Adding...' : 'Add to List'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelAddToListDialog()\">Cancel</button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .operations-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f5f7fa;\n }\n\n .operations-header {\n padding: 20px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .clear-all-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #f5f5f5;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 13px;\n color: #666;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .clear-all-btn:hover {\n background: #ffebee;\n border-color: #f44336;\n color: #d32f2f;\n }\n\n .clear-all-btn i {\n font-size: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: #9C27B0;\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n }\n\n .header-subtitle {\n color: #666;\n font-size: 14px;\n }\n\n .operations-content {\n display: grid;\n grid-template-columns: 280px 1fr 300px;\n gap: 16px;\n flex: 1;\n padding: 16px;\n overflow: hidden;\n }\n\n /* Panels */\n .selection-panel,\n .results-panel {\n background: white;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.08);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .venn-panel {\n background: white;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.08);\n position: relative;\n min-height: 400px;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .list-count {\n font-size: 12px;\n color: #999;\n background: #f0f0f0;\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n /* Entity Filter */\n .entity-filter-section {\n padding: 12px 16px;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .filter-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .entity-select {\n width: 100%;\n padding: 8px 12px;\n font-size: 13px;\n border: 1px solid #ddd;\n border-radius: 6px;\n background: white;\n cursor: pointer;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .entity-select:focus {\n border-color: #9C27B0;\n }\n\n .entity-note {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 8px 12px;\n padding: 8px 10px;\n background: #e8f5e9;\n border-radius: 6px;\n font-size: 12px;\n color: #2e7d32;\n }\n\n .entity-note i {\n color: #4caf50;\n }\n\n /* Selected Lists */\n .selected-lists {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n }\n\n .selected-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px;\n background: #f8f9fa;\n border-radius: 6px;\n margin-bottom: 8px;\n }\n\n .item-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .item-name {\n font-size: 13px;\n font-weight: 500;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-entity {\n font-size: 11px;\n color: #999;\n }\n\n .remove-btn {\n background: none;\n border: none;\n color: #999;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n }\n\n .remove-btn:hover {\n background: #e0e0e0;\n color: #666;\n }\n\n /* Add list area */\n .add-list-area {\n position: relative;\n }\n\n .add-list-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px dashed #ddd;\n border-radius: 6px;\n transition: border-color 0.2s;\n }\n\n .add-list-search:focus-within {\n border-color: #9C27B0;\n }\n\n .add-list-search i {\n color: #999;\n }\n\n .add-list-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 13px;\n }\n\n .list-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 100;\n margin-top: 4px;\n }\n\n .dropdown-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .dropdown-content {\n position: relative;\n background: white;\n border: 1px solid #ddd;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n max-height: 200px;\n overflow-y: auto;\n }\n\n .dropdown-item {\n display: flex;\n flex-direction: column;\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .dropdown-item:hover {\n background: #f5f5f5;\n }\n\n .dropdown-name {\n font-size: 13px;\n font-weight: 500;\n color: #333;\n }\n\n .dropdown-entity {\n font-size: 11px;\n color: #999;\n }\n\n .lists-full {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n font-size: 12px;\n color: #999;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .entity-warning {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin: 12px;\n padding: 10px;\n background: #fff8e1;\n border-radius: 6px;\n font-size: 12px;\n color: #856404;\n }\n\n .entity-warning i {\n color: #ffc107;\n margin-top: 2px;\n }\n\n /* Quick Operations */\n .quick-operations {\n padding: 12px;\n border-top: 1px solid #f0f0f0;\n }\n\n .quick-operations h4 {\n margin: 0 0 10px;\n font-size: 12px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .operation-buttons {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .op-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 13px;\n color: #333;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .op-btn:hover:not(:disabled) {\n background: #e8f4fd;\n border-color: #9C27B0;\n color: #9C27B0;\n }\n\n .op-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* Venn Panel */\n .venn-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n }\n\n .empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, rgba(156, 39, 176, 0.1) 0%, rgba(156, 39, 176, 0.05) 100%);\n border-radius: 50%;\n margin-bottom: 20px;\n }\n\n .empty-icon i {\n font-size: 36px;\n color: #9C27B0;\n }\n\n .venn-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n color: #333;\n }\n\n .venn-empty p {\n margin: 0;\n color: #666;\n font-size: 14px;\n max-width: 300px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255,255,255,0.9);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Results Panel */\n .region-details,\n .operation-result {\n padding: 16px;\n }\n\n .region-header,\n .result-header {\n margin-bottom: 16px;\n }\n\n .region-label,\n .result-operation {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n margin-bottom: 4px;\n }\n\n .region-count,\n .result-count {\n font-size: 13px;\n color: #9C27B0;\n font-weight: 500;\n }\n\n .region-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .action-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: white;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 13px;\n color: #333;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .action-btn:hover {\n background: #f5f5f5;\n }\n\n .action-btn.primary {\n background: #9C27B0;\n border-color: #9C27B0;\n color: white;\n }\n\n .action-btn.primary:hover {\n background: #7B1FA2;\n }\n\n .record-preview h5 {\n margin: 0 0 8px;\n font-size: 12px;\n color: #666;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .preview-list {\n max-height: 200px;\n overflow-y: auto;\n }\n\n .preview-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: #f8f9fa;\n border-radius: 6px;\n margin-bottom: 6px;\n transition: all 0.15s ease;\n }\n\n .preview-card:hover {\n background: #eef1f5;\n box-shadow: 0 1px 3px rgba(0,0,0,0.08);\n }\n\n .preview-card-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .preview-name {\n font-size: 13px;\n font-weight: 500;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-secondary {\n font-size: 11px;\n color: #888;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-open-btn {\n background: none;\n border: none;\n color: #9C27B0;\n cursor: pointer;\n padding: 6px 8px;\n border-radius: 4px;\n opacity: 0.6;\n transition: all 0.15s ease;\n flex-shrink: 0;\n }\n\n .preview-open-btn:hover {\n opacity: 1;\n background: rgba(156, 39, 176, 0.1);\n }\n\n .preview-loading {\n padding: 12px;\n text-align: center;\n }\n\n .results-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n text-align: center;\n color: #999;\n }\n\n .results-empty i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.5;\n }\n\n .results-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 200px;\n }\n\n /* Modal */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0,0,0,0.5);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: white;\n border-radius: 12px;\n width: 420px;\n max-width: 90vw;\n z-index: 1001;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 16px;\n color: #333;\n }\n\n .modal-close {\n background: none;\n border: none;\n color: #999;\n cursor: pointer;\n padding: 4px 8px;\n }\n\n .modal-body {\n padding: 20px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #666;\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: #9C27B0;\n box-shadow: 0 0 0 3px rgba(156, 39, 176, 0.1);\n }\n\n textarea.form-input {\n resize: vertical;\n }\n\n .form-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n background: #f8f9fa;\n border-radius: 6px;\n font-size: 13px;\n color: #666;\n }\n\n .form-info i {\n color: #9C27B0;\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: #9C27B0;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: #7B1FA2;\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: white;\n color: #666;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-secondary:hover {\n background: #f5f5f5;\n }\n\n /* Add to List Dialog */\n .add-to-list-dialog {\n width: 480px;\n }\n\n .add-to-list-dialog .modal-body {\n max-height: 400px;\n overflow-y: auto;\n }\n\n .list-search {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n margin-bottom: 12px;\n }\n\n .list-search i {\n color: #999;\n flex-shrink: 0;\n }\n\n .list-search .form-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0;\n font-size: 14px;\n }\n\n .list-search .form-input:focus {\n box-shadow: none;\n outline: none;\n }\n\n .list-options {\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n max-height: 250px;\n overflow-y: auto;\n }\n\n .list-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .list-option:last-child {\n border-bottom: none;\n }\n\n .list-option:hover {\n background: #f8f9fa;\n }\n\n .list-option.selected {\n background: #f3e5f5;\n }\n\n .list-option-radio {\n flex-shrink: 0;\n }\n\n .list-option-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: #9C27B0;\n }\n\n .list-option-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .list-option-name {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-option-entity {\n font-size: 12px;\n color: #888;\n }\n\n .list-options-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 30px 20px;\n text-align: center;\n color: #999;\n }\n\n .list-options-empty i {\n font-size: 28px;\n margin-bottom: 10px;\n opacity: 0.5;\n }\n\n .list-options-empty p {\n margin: 0;\n font-size: 13px;\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .operations-content {\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr auto;\n }\n\n .selection-panel {\n order: 1;\n }\n\n .venn-panel {\n order: 2;\n min-height: 300px;\n }\n\n .results-panel {\n order: 3;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsOperationsResource extends BaseResourceComponent implements OnDestroy {\n private destroy$ = new Subject<void>();\n\n maxLists = 4;\n selectedLists: ListSelection[] = [];\n availableLists: MJListEntity[] = [];\n filteredAvailableLists: MJListEntity[] = [];\n listSearchTerm = '';\n showListDropdown = false;\n\n // Entity filter\n entityOptions: EntityOption[] = [];\n selectedEntityId = '';\n\n vennData: VennData | null = null;\n selectedRegion: VennIntersection | null = null;\n lastOperationResult: SetOperationResult | null = null;\n previewRecords: string[] = [];\n previewRecordsDisplay: PreviewRecord[] = [];\n loadingPreview = false;\n\n isCalculating = false;\n isSaving = false;\n\n // Create dialog\n showCreateDialog = false;\n newListName = '';\n newListDescription = '';\n recordsToAdd: string[] = [];\n\n // Add to existing list dialog\n showAddToListDialog = false;\n addToListSearchTerm = '';\n filteredAddToListOptions: MJListEntity[] = [];\n selectedTargetListId: string | null = null;\n\n private entityIdFromSelectedLists: string | null = null;\n private currentEntityInfo: EntityInfo | null = null;\n\n // User Settings persistence\n private readonly USER_SETTING_KEY = 'ListsOperations.State';\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n private isLoadingSettings = false;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private setOperationsService: ListSetOperationsService,\n private notificationService: MJNotificationService\n ) {\n super();\n }\n\n get hasMultipleEntities(): boolean {\n if (this.selectedLists.length < 2) return false;\n const entities = new Set(this.selectedLists.map(s => s.list.EntityID));\n return entities.size > 1;\n }\n\n async ngOnInit() {\n await this.loadAvailableLists();\n await this.loadSavedState();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n }\n\n async loadAvailableLists() {\n const rv = new RunView();\n const md = new Metadata();\n\n const result = await rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: `UserID = '${md.CurrentUser?.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.availableLists = result.Results || [];\n this.buildEntityOptions();\n this.filterAvailableLists();\n }\n }\n\n /**\n * Build entity options for the filter dropdown\n */\n private buildEntityOptions(): void {\n const entityCounts = new Map<string, { name: string; count: number }>();\n\n for (const list of this.availableLists) {\n const existing = entityCounts.get(list.EntityID);\n if (existing) {\n existing.count++;\n } else {\n entityCounts.set(list.EntityID, { name: list.Entity || 'Unknown', count: 1 });\n }\n }\n\n this.entityOptions = Array.from(entityCounts.entries())\n .map(([id, data]) => ({\n id,\n name: data.name,\n listCount: data.count\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Handle entity filter change\n */\n onEntityFilterChange(): void {\n // Clear selected lists if changing entity filter\n if (this.selectedLists.length > 0) {\n const firstEntityId = this.selectedLists[0].list.EntityID;\n if (this.selectedEntityId && this.selectedEntityId !== firstEntityId) {\n // Entity changed - clear selections\n this.selectedLists = [];\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n this.previewRecordsDisplay = [];\n }\n }\n this.filterAvailableLists();\n this.saveState();\n }\n\n filterAvailableLists() {\n const selectedIds = new Set(this.selectedLists.map(s => s.list.ID));\n let filtered = this.availableLists.filter(l => !selectedIds.has(l.ID));\n\n // Apply entity filter from dropdown\n if (this.selectedEntityId) {\n filtered = filtered.filter(l => UUIDsEqual(l.EntityID, this.selectedEntityId));\n }\n\n // If we have selected lists, restrict to same entity\n if (this.selectedLists.length > 0) {\n this.entityIdFromSelectedLists = this.selectedLists[0].list.EntityID;\n filtered = filtered.filter(l => UUIDsEqual(l.EntityID, this.entityIdFromSelectedLists));\n }\n\n if (this.listSearchTerm) {\n const term = this.listSearchTerm.toLowerCase();\n filtered = filtered.filter(l =>\n l.Name.toLowerCase().includes(term) ||\n (l.Entity && l.Entity.toLowerCase().includes(term))\n );\n }\n\n this.filteredAvailableLists = filtered.slice(0, 10);\n }\n\n addList(list: MJListEntity) {\n const color = this.setOperationsService.getColorForIndex(this.selectedLists.length);\n\n this.selectedLists.push({\n list,\n entityName: list.Entity || 'Unknown',\n color\n });\n\n this.listSearchTerm = '';\n this.showListDropdown = false;\n this.filterAvailableLists();\n this.recalculateVenn();\n this.saveState();\n }\n\n removeList(index: number) {\n this.selectedLists.splice(index, 1);\n\n // Reassign colors\n this.selectedLists.forEach((item, i) => {\n item.color = this.setOperationsService.getColorForIndex(i);\n });\n\n this.filterAvailableLists();\n this.recalculateVenn();\n this.saveState();\n }\n\n async recalculateVenn() {\n if (this.selectedLists.length === 0) {\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n return;\n }\n\n this.isCalculating = true;\n this.cdr.detectChanges();\n\n try {\n const lists = this.selectedLists.map(s => s.list);\n this.vennData = await this.setOperationsService.calculateVennData(lists);\n this.selectedRegion = null;\n this.lastOperationResult = null;\n } catch (error) {\n console.error('Error calculating Venn data:', error);\n } finally {\n this.isCalculating = false;\n this.cdr.detectChanges();\n }\n }\n\n onRegionClick(event: VennRegionClickEvent) {\n this.selectedRegion = event.intersection;\n this.lastOperationResult = null;\n this.previewRecords = event.recordIds.slice(0, 10);\n this.loadPreviewRecords(event.recordIds.slice(0, 10));\n this.cdr.detectChanges();\n }\n\n /**\n * Load preview records with meaningful display fields\n */\n private async loadPreviewRecords(recordIds: string[]): Promise<void> {\n if (recordIds.length === 0 || this.selectedLists.length === 0) {\n this.previewRecordsDisplay = [];\n return;\n }\n\n this.loadingPreview = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entityId = this.selectedLists[0].list.EntityID;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityId));\n\n if (!entityInfo) {\n // Fallback to showing just IDs\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: this.selectedLists[0].entityName\n }));\n return;\n }\n\n this.currentEntityInfo = entityInfo;\n\n // Find the best display fields\n const displayFields = this.getDisplayFields(entityInfo);\n\n // Build filter for the records\n const primaryKeyFields = entityInfo.PrimaryKeys;\n const primaryKeyField = primaryKeyFields.length > 0 ? primaryKeyFields[0].Name : 'ID';\n const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');\n\n const rv = new RunView();\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: entityInfo.Name,\n ExtraFilter: `${primaryKeyField} IN (${recordIdFilter})`,\n Fields: [primaryKeyField, ...displayFields],\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results) {\n this.previewRecordsDisplay = result.Results.map(record => {\n const id = String(record[primaryKeyField] || '');\n const displayName = this.getDisplayValue(record, displayFields[0]) || id;\n const secondaryInfo = displayFields.length > 1\n ? this.getDisplayValue(record, displayFields[1])\n : undefined;\n\n return {\n id,\n displayName,\n secondaryInfo,\n entityName: entityInfo.Name\n };\n });\n } else {\n // Fallback\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: entityInfo.Name\n }));\n }\n } catch (error) {\n console.error('Error loading preview records:', error);\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: this.selectedLists[0]?.entityName || 'Unknown'\n }));\n } finally {\n this.loadingPreview = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get the best display fields for an entity based on metadata\n */\n private getDisplayFields(entityInfo: EntityInfo): string[] {\n const fields: string[] = [];\n\n // First priority: NameField (IsNameField = true)\n const nameField = entityInfo.Fields.find(f => f.IsNameField);\n if (nameField) {\n fields.push(nameField.Name);\n }\n\n // Second priority: DefaultInView fields (excluding primary key unless it's also the name field)\n const defaultViewFields = entityInfo.Fields\n .filter(f => f.DefaultInView && !f.IsPrimaryKey && f.Name !== nameField?.Name)\n .slice(0, 2); // Take up to 2 more fields\n\n for (const field of defaultViewFields) {\n if (!fields.includes(field.Name)) {\n fields.push(field.Name);\n }\n }\n\n // If we still don't have any fields, use common field names\n if (fields.length === 0) {\n const commonNames = ['Name', 'Title', 'Subject', 'Description', 'Email', 'FirstName'];\n for (const name of commonNames) {\n const field = entityInfo.Fields.find(f => f.Name === name);\n if (field) {\n fields.push(field.Name);\n break;\n }\n }\n }\n\n // If still nothing, include primary key\n if (fields.length === 0 && entityInfo.PrimaryKeys.length > 0) {\n fields.push(entityInfo.PrimaryKeys[0].Name);\n }\n\n return fields.slice(0, 3); // Max 3 fields\n }\n\n /**\n * Get a display value from a record\n */\n private getDisplayValue(record: Record<string, unknown>, fieldName: string): string | undefined {\n const value = record[fieldName];\n if (value === null || value === undefined) return undefined;\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n return String(value);\n }\n\n /**\n * Open a record in the entity viewer\n */\n openRecord(record: PreviewRecord): void {\n if (!this.currentEntityInfo) {\n // Try to get entity info\n const md = new Metadata();\n const entityId = this.selectedLists[0]?.list.EntityID;\n if (entityId) {\n this.currentEntityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityId)) || null;\n }\n }\n\n if (this.currentEntityInfo) {\n SharedService.Instance.InvokeManualResize();\n // Create composite key for navigation\n const primaryKeyField = this.currentEntityInfo.PrimaryKeys.length > 0\n ? this.currentEntityInfo.PrimaryKeys[0].Name\n : 'ID';\n const compositeKey = new CompositeKey([{ FieldName: primaryKeyField, Value: record.id }]);\n SharedService.Instance.OpenEntityRecord(this.currentEntityInfo.Name, compositeKey);\n } else {\n this.notificationService.CreateSimpleNotification('Unable to open record', 'error', 3000);\n }\n }\n\n async performOperation(operation: SetOperation) {\n if (this.selectedLists.length < 2) return;\n\n this.isCalculating = true;\n this.selectedRegion = null;\n this.cdr.detectChanges();\n\n try {\n const listIds = this.selectedLists.map(s => s.list.ID);\n this.lastOperationResult = await this.setOperationsService.performOperation(operation, listIds);\n this.previewRecords = this.lastOperationResult.resultRecordIds.slice(0, 10);\n } catch (error) {\n console.error('Error performing operation:', error);\n } finally {\n this.isCalculating = false;\n this.cdr.detectChanges();\n }\n }\n\n getOperationLabel(operation: SetOperation): string {\n switch (operation) {\n case 'union': return 'Union (All Records)';\n case 'intersection': return 'Intersection (Common Records)';\n case 'difference': return 'Difference';\n case 'symmetric_difference': return 'Unique to Each List';\n case 'complement': return 'Complement';\n default: return operation;\n }\n }\n\n createListFromSelection() {\n if (!this.selectedRegion || this.selectedRegion.size === 0) return;\n this.recordsToAdd = [...this.selectedRegion.recordIds];\n this.newListName = '';\n this.newListDescription = `Created from: ${this.selectedRegion.label}`;\n this.showCreateDialog = true;\n }\n\n createListFromResult() {\n if (!this.lastOperationResult || this.lastOperationResult.resultCount === 0) return;\n this.recordsToAdd = [...this.lastOperationResult.resultRecordIds];\n this.newListName = '';\n this.newListDescription = `Created from: ${this.getOperationLabel(this.lastOperationResult.operation)}`;\n this.showCreateDialog = true;\n }\n\n cancelCreateDialog() {\n this.showCreateDialog = false;\n this.newListName = '';\n this.newListDescription = '';\n this.recordsToAdd = [];\n }\n\n async confirmCreateList() {\n if (!this.newListName || this.recordsToAdd.length === 0) return;\n\n // Get entity ID from selected lists\n if (this.selectedLists.length === 0) return;\n const entityId = this.selectedLists[0].list.EntityID;\n\n this.isSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n\n // Create the list\n const list = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.EntityID = entityId;\n list.UserID = md.CurrentUser!.ID;\n\n const saved = await list.Save();\n if (!saved) {\n this.notificationService.CreateSimpleNotification('Failed to create list', 'error', 4000);\n return;\n }\n\n // Add records to the list using transaction group\n const tg = await md.CreateTransactionGroup();\n\n for (const recordId of this.recordsToAdd) {\n const detail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n detail.ListID = list.ID;\n detail.RecordID = recordId;\n detail.Sequence = 0;\n detail.TransactionGroup = tg;\n await detail.Save();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n this.notificationService.CreateSimpleNotification(\n `Created \"${this.newListName}\" with ${this.recordsToAdd.length} items`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification(\n `Created list but failed to add some records`,\n 'warning',\n 4000\n );\n }\n\n this.cancelCreateDialog();\n\n // Refresh available lists\n await this.loadAvailableLists();\n } catch (error) {\n console.error('Error creating list:', error);\n this.notificationService.CreateSimpleNotification('Error creating list', 'error', 4000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n addToExistingList() {\n if (!this.selectedRegion || this.selectedRegion.size === 0) return;\n this.recordsToAdd = [...this.selectedRegion.recordIds];\n this.openAddToListDialog();\n }\n\n addResultToExistingList() {\n if (!this.lastOperationResult || this.lastOperationResult.resultCount === 0) return;\n this.recordsToAdd = [...this.lastOperationResult.resultRecordIds];\n this.openAddToListDialog();\n }\n\n /**\n * Open the Add to Existing List dialog\n */\n private openAddToListDialog(): void {\n this.showAddToListDialog = true;\n this.addToListSearchTerm = '';\n this.selectedTargetListId = null;\n this.filterAddToListOptions();\n }\n\n /**\n * Filter available lists for add-to-list dialog\n */\n filterAddToListOptions(): void {\n // Get entity ID from selected lists to filter to same entity type\n if (this.selectedLists.length === 0) {\n this.filteredAddToListOptions = [];\n return;\n }\n\n const entityId = this.selectedLists[0].list.EntityID;\n\n // Filter to same entity, exclude already selected lists\n const selectedIds = new Set(this.selectedLists.map(s => s.list.ID));\n let filtered = this.availableLists.filter(l =>\n UUIDsEqual(l.EntityID, entityId) && !selectedIds.has(l.ID)\n );\n\n // Apply search filter\n if (this.addToListSearchTerm) {\n const term = this.addToListSearchTerm.toLowerCase();\n filtered = filtered.filter(l =>\n l.Name.toLowerCase().includes(term)\n );\n }\n\n this.filteredAddToListOptions = filtered;\n }\n\n /**\n * Select a target list for adding records\n */\n IsTargetListSelected(list: MJListEntity): boolean {\n return UUIDsEqual(this.selectedTargetListId, list.ID);\n }\n\n selectTargetList(listId: string): void {\n this.selectedTargetListId = listId;\n }\n\n /**\n * Cancel the add to list dialog\n */\n cancelAddToListDialog(): void {\n this.showAddToListDialog = false;\n this.addToListSearchTerm = '';\n this.selectedTargetListId = null;\n this.recordsToAdd = [];\n }\n\n /**\n * Confirm adding records to selected list\n */\n async confirmAddToList(): Promise<void> {\n if (!this.selectedTargetListId || this.recordsToAdd.length === 0) return;\n\n this.isSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const tg = await md.CreateTransactionGroup();\n\n for (const recordId of this.recordsToAdd) {\n const detail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n detail.ListID = this.selectedTargetListId;\n detail.RecordID = recordId;\n detail.Sequence = 0;\n detail.TransactionGroup = tg;\n await detail.Save();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n const targetList = this.availableLists.find(l => UUIDsEqual(l.ID, this.selectedTargetListId));\n this.notificationService.CreateSimpleNotification(\n `Added ${this.recordsToAdd.length} records to \"${targetList?.Name || 'list'}\"`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification(\n 'Failed to add some records',\n 'warning',\n 4000\n );\n }\n\n this.cancelAddToListDialog();\n } catch (error) {\n console.error('Error adding to list:', error);\n this.notificationService.CreateSimpleNotification('Error adding records to list', 'error', 4000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n exportToExcel() {\n // TODO: Implement Excel export\n this.notificationService.CreateSimpleNotification('Export to Excel - coming soon', 'info', 2000);\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Operations';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-diagram-project';\n }\n\n /**\n * Clear all selections and reset state\n */\n clearAllSelections(): void {\n this.selectedLists = [];\n this.selectedEntityId = '';\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n this.previewRecordsDisplay = [];\n this.filterAvailableLists();\n this.saveState();\n this.cdr.detectChanges();\n }\n\n /**\n * Save state to User Settings (debounced to avoid excessive writes)\n */\n private saveState(): void {\n // Don't save during initial load\n if (this.isLoadingSettings) return;\n\n // Debounce the server save\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveStateToServer();\n }, 1000); // 1 second debounce\n }\n\n /**\n * Save state to User Settings entity on server\n */\n private async saveStateToServer(): Promise<void> {\n try {\n const md = new Metadata();\n const userId = md.CurrentUser?.ID;\n if (!userId) return;\n\n const stateToSave = {\n entityId: this.selectedEntityId,\n listIds: this.selectedLists.map(s => s.list.ID)\n };\n\n const engine = UserInfoEngine.Instance;\n\n // Find existing setting from cached user settings\n let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_KEY);\n\n if (!setting) {\n // Create new setting\n setting = await md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = this.USER_SETTING_KEY;\n }\n\n setting.Value = JSON.stringify(stateToSave);\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save operations state to User Settings:', error);\n }\n }\n\n /**\n * Load saved state from User Settings\n */\n private async loadSavedState(): Promise<void> {\n this.isLoadingSettings = true;\n\n try {\n const md = new Metadata();\n const userId = md.CurrentUser?.ID;\n if (!userId) {\n this.isLoadingSettings = false;\n return;\n }\n\n // Load from cached User Settings\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_KEY);\n\n if (setting?.Value) {\n const state = JSON.parse(setting.Value) as { entityId?: string; listIds?: string[] };\n\n // Restore entity filter\n if (state.entityId) {\n this.selectedEntityId = state.entityId;\n }\n\n // Restore selected lists\n if (state.listIds && state.listIds.length > 0) {\n for (const listId of state.listIds) {\n const list = this.availableLists.find(l => UUIDsEqual(l.ID, listId));\n if (list) {\n const color = this.setOperationsService.getColorForIndex(this.selectedLists.length);\n this.selectedLists.push({\n list,\n entityName: list.Entity || 'Unknown',\n color\n });\n }\n }\n\n // If we restored lists, recalculate venn\n if (this.selectedLists.length > 0) {\n this.filterAvailableLists();\n await this.recalculateVenn();\n }\n }\n\n this.cdr.detectChanges();\n }\n } catch (error) {\n console.warn('Failed to load operations state from User Settings:', error);\n } finally {\n this.isLoadingSettings = false;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"lists-operations-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-operations-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAgC,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAG,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAuE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpI,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAc,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;;;;;;;;;IA2CnB,kCAG+B;IAD7B,2LAAS,2BAAoB,KAAC;IAE9B,wBAAiC;IACjC,uBACF;IAAA,iBAAS;;;IAeP,gCAAyB;IACvB,YACF;IAAA,iBAAO;;;IADL,cACF;IADE,kFACF;;;IAcI,kCAA4B;IAC1B,YACF;IAAA,iBAAS;;;IAFD,oCAAmB;IACzB,cACF;IADE,2EACF;;;;IASJ,+BAA2B;IACzB,0BAAoE;IAElE,AADF,+BAAuB,eACG;IAAA,YAAkB;IAAA,iBAAO;IACjD,gCAA0B;IAAA,YAAmB;IAC/C,AAD+C,iBAAO,EAChD;IACN,kCAAmD;IAAxB,iNAAS,gCAAa,KAAC;IAChD,wBAAiC;IAErC,AADE,iBAAS,EACL;;;IARoB,cAAqC;IAArC,iDAAqC;IAEnC,eAAkB;IAAlB,uCAAkB;IAChB,eAAmB;IAAnB,wCAAmB;;;;IAyBvC,+BAE0B;IAAxB,yOAAS,wBAAa,KAAC;IACvB,gCAA4B;IAAA,YAAa;IAAA,iBAAO;IAChD,gCAA8B;IAAA,YAAe;IAC/C,AAD+C,iBAAO,EAChD;;;IAFwB,eAAa;IAAb,mCAAa;IACX,eAAe;IAAf,qCAAe;;;;IAPnD,AADF,+BAA2B,cACyC;IAAnC,kOAA4B,KAAK,KAAC;IAAC,iBAAM;IACxE,+BAA8B;IAC5B,0IAOC;IAEL,AADE,iBAAM,EACF;;;IATF,eAOC;IAPD,4CAOC;;;;IArBP,AADF,+BAA2B,cACI;IAC3B,wBAAkC;IAClC,iCAKsC;IAHpC,4TAA4B;IAG5B,AAFA,2MAAiB,6BAAsB,KAAC,wMAEZ,IAAI,KAAC;IACrC,AANE,iBAKsC,EAClC;IAEN,yGAA6D;IAe/D,iBAAM;;;IArBA,eAA4B;IAA5B,qDAA4B;IAMhC,cAcC;IAdD,8FAcC;;;IAKH,+BAAwB;IACtB,wBAAuC;IACvC,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,8EACF;;;IAMF,+BAAyB;IACvB,wBAAuC;IACvC,4BAAM;IAAA,yCAAyB;IAAA,8BAAQ;IAAA,YAA+B;IACxE,AADiF,AAAT,iBAAS,EAAO,EAClF;;;IADmC,eAA+B;IAA/B,wDAA+B;;;;IAOtE,AADF,+BAA8B,SACxB;IAAA,gCAAgB;IAAA,iBAAK;IAEvB,AADF,+BAA+B,iBACyD;IAA/D,6LAAS,wBAAiB,OAAO,CAAC,KAAC;IACxD,wBAAuC;IACvC,4BAAM;IAAA,yBAAS;IACjB,AADiB,iBAAO,EACf;IACT,kCAA6F;IAAtE,6LAAS,wBAAiB,cAAc,CAAC,KAAC;IAC/D,wBAAwC;IACxC,6BAAM;IAAA,6BAAY;IACpB,AADoB,iBAAO,EAClB;IACT,mCAAqG;IAA9E,8LAAS,wBAAiB,sBAAsB,CAAC,KAAC;IACvE,yBAAoD;IACpD,6BAAM;IAAA,4BAAW;IAGvB,AADE,AADE,AADmB,iBAAO,EACjB,EACL,EACF;;;IAbyD,eAA0B;IAA1B,+CAA0B;IAInB,eAA0B;IAA1B,+CAA0B;IAIlB,eAA0B;IAA1B,+CAA0B;;;;IAYxG,2CAGwC;IAAtC,wNAAe,4BAAqB,KAAC;IACvC,iBAAkB;;;IAFhB,AADA,sCAAiB,yCACgB;;;IAOjC,AADF,+BAAwB,cACE;IACtB,wBAAwC;IAC1C,iBAAM;IACN,0BAAI;IAAA,oCAAoB;IAAA,iBAAK;IAC7B,yBAAG;IAAA,6GAA6F;IAClG,AADkG,iBAAI,EAChG;;;IAIN,+BAA6B;IAC3B,iCAA+C;IACjD,iBAAM;;;IA2CU,gCAAgC;IAAA,YAAwB;IAAA,iBAAO;;;IAA/B,cAAwB;IAAxB,8CAAwB;;;;IAF1D,AADF,AADF,+BAA0B,cACU,eACL;IAAA,YAAsB;IAAA,iBAAO;IACxD,+HAA4B;IAG9B,iBAAM;IACN,kCAAkF;IAAjD,gPAAS,6BAAkB,KAAC;IAC3D,wBAA6C;IAEjD,AADE,iBAAS,EACL;;;IARyB,eAAsB;IAAtB,4CAAsB;IACjD,cAEC;IAFD,mDAEC;;;IASP,+BAA6B;IAC3B,iCAAgE;IAClE,iBAAM;;;IAnBR,AADF,+BAA4B,SACtB;IAAA,kCAAkB;IAAA,iBAAK;IAC3B,+BAA0B;IACxB,2IAYC;IACH,iBAAM;IACN,wHAAsB;IAKxB,iBAAM;;;IAnBF,eAYC;IAZD,2CAYC;IAEH,eAIC;IAJD,gDAIC;;;;IAvCH,AADF,AADF,+BAA4B,cACC,eACE;IAAA,YAAwB;IAAA,iBAAO;IAC1D,gCAA2B;IAAA,YAA+B;IAC5D,AAD4D,iBAAO,EAC7D;IAEJ,AADF,+BAA4B,iBAC6C;IAApC,6LAAS,gCAAyB,KAAC;IACpE,wBAAgC;IAChC,iCACF;IAAA,iBAAS;IACT,mCAAyD;IAA9B,8LAAS,0BAAmB,KAAC;IACtD,yBAAuC;IACvC,8BACF;IAAA,iBAAS;IACT,mCAAqD;IAA1B,8LAAS,sBAAe,KAAC;IAClD,yBAAsC;IACtC,yBACF;IACF,AADE,iBAAS,EACL;IACN,2GAAwC;IAyB1C,iBAAM;;;IA1CyB,eAAwB;IAAxB,iDAAwB;IACxB,eAA+B;IAA/B,iEAA+B;IAgB5D,gBAwBC;IAxBD,mEAwBC;;;;IAQC,AADF,AADF,+BAA8B,cACD,eACM;IAAA,YAAoD;IAAA,iBAAO;IAC1F,gCAA2B;IAAA,YAA2C;IACxE,AADwE,iBAAO,EACzE;IAEJ,AADF,+BAA4B,iBAC0C;IAAjC,6LAAS,6BAAsB,KAAC;IACjE,wBAAgC;IAChC,iCACF;IAAA,iBAAS;IACT,mCAA+D;IAApC,8LAAS,gCAAyB,KAAC;IAC5D,yBAAuC;IACvC,8BACF;IAEJ,AADE,AADE,iBAAS,EACL,EACF;;;IAb6B,eAAoD;IAApD,oFAAoD;IACxD,eAA2C;IAA3C,6EAA2C;;;IAiB1E,+BAA2B;IACzB,wBAAwC;IACxC,yBAAG;IAAA,gFAAgE;IACrE,AADqE,iBAAI,EACnE;;;;IAOV,+BAA0D;IAA/B,0LAAS,2BAAoB,KAAC;IAAC,iBAAM;;;IAmCxD,wBAA2C;;;;IA9B/C,AADF,AADF,+BAA0B,cACE,SACpB;IAAA,8CAA8B;IAAA,iBAAK;IACvC,kCAA2D;IAA/B,6LAAS,2BAAoB,KAAC;IACxD,wBAAiC;IAErC,AADE,iBAAS,EACL;IAGF,AADF,AADF,+BAAwB,cACE,YACf;IAAA,2BAAW;IAAA,iBAAQ;IAC1B,kCAIuB;IAFrB,wTAAyB;IAG7B,AALE,iBAIuB,EACnB;IAEJ,AADF,gCAAwB,aACf;IAAA,4BAAW;IAAA,iBAAQ;IAC1B,qCAIS;IAHP,yUAAgC;IAIpC,AADW,iBAAW,EAChB;IACN,gCAAuB;IACrB,yBAAuC;IACvC,aACF;IACF,AADE,iBAAM,EACF;IAEJ,AADF,gCAA0B,kBACwE;IAApE,8LAAS,0BAAmB,KAAC;IACvD,yGAAgB;IAGhB,aACF;IAAA,iBAAS;IACT,mCAA6D;IAA/B,8LAAS,2BAAoB,KAAC;IAAC,uBAAM;IAEvE,AADE,AADqE,iBAAS,EACxE,EACF;;;IA1BE,gBAAyB;IAAzB,kDAAyB;IAOzB,eAAgC;IAAhC,yDAAgC;IAOlC,eACF;IADE,8IACF;IAG0D,eAAqC;IAArC,iEAAqC;IAC7F,cAEC;IAFD,2CAEC;IACD,cACF;IADE,gFACF;;;;IAQJ,+BAA6D;IAAlC,0LAAS,8BAAuB,KAAC;IAAC,iBAAM;;;;IA4B3D,gCAGsC;IAApC,6NAAS,oCAAyB,KAAC;IACnC,gCAA+B;IAC7B,6BAGsB;IACxB,iBAAM;IAEJ,AADF,gCAA8B,gBACG;IAAA,YAAa;IAAA,iBAAO;IACnD,iCAAiC;IAAA,YAAe;IAEpD,AADE,AADkD,iBAAO,EACnD,EACF;;;;IAZJ,iEAA6C;IAKzC,eAAsC;IAAtC,+DAAsC;IAIT,eAAa;IAAb,mCAAa;IACX,eAAe;IAAf,qCAAe;;;IAKpD,gCAAgC;IAC9B,yBAAiC;IACjC,yBAAG;IAAA,YAAmF;IACxF,AADwF,iBAAI,EACtF;;;IADD,eAAmF;IAAnF,4GAAmF;;;IAQxF,wBAA2C;;;;IAlD/C,AADF,AADF,+BAA6C,cACjB,SACpB;IAAA,oCAAoB;IAAA,iBAAK;IAC7B,kCAA8D;IAAlC,6LAAS,8BAAuB,KAAC;IAC3D,wBAAiC;IAErC,AADE,iBAAS,EACL;IAEJ,AADF,+BAAwB,cAC8B;IAClD,wBAAuC;IACvC,YACF;IAAA,iBAAM;IAEN,gCAAyB;IACvB,yBAAkC;IAClC,mCAKuB;IAHrB,wUAAiC;IACjC,6MAAiB,+BAAwB,KAAC;IAG9C,AANE,iBAKuB,EACnB;IAEN,iCAA0B;IACxB,+HAgBC;IACD,4GAA6C;IAOjD,AADE,iBAAM,EACF;IAEJ,AADF,gCAA0B,kBACgF;IAA5E,8LAAS,yBAAkB,KAAC;IACtD,yGAAgB;IAGhB,aACF;IAAA,iBAAS;IACT,mCAAgE;IAAlC,8LAAS,8BAAuB,KAAC;IAAC,uBAAM;IAE1E,AADE,AADwE,iBAAS,EAC3E,EACF;;;IAhDA,eACF;IADE,iIACF;IAMI,eAAiC;IAAjC,0DAAiC;IAOnC,eAgBC;IAhBD,8CAgBC;IACD,eAKC;IALD,wEAKC;IAIsD,eAA8C;IAA9C,0EAA8C;IACrG,cAEC;IAFD,2CAEC;IACD,cACF;IADE,8EACF;;AA43BL,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,qBAAqB;IA6CtD;IACA;IACA;IA9CF,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAEvC,QAAQ,GAAG,CAAC,CAAC;IACb,aAAa,GAAoB,EAAE,CAAC;IACpC,cAAc,GAAmB,EAAE,CAAC;IACpC,sBAAsB,GAAmB,EAAE,CAAC;IAC5C,cAAc,GAAG,EAAE,CAAC;IACpB,gBAAgB,GAAG,KAAK,CAAC;IAEzB,gBAAgB;IAChB,aAAa,GAAmB,EAAE,CAAC;IACnC,gBAAgB,GAAG,EAAE,CAAC;IAEtB,QAAQ,GAAoB,IAAI,CAAC;IACjC,cAAc,GAA4B,IAAI,CAAC;IAC/C,mBAAmB,GAA8B,IAAI,CAAC;IACtD,cAAc,GAAa,EAAE,CAAC;IAC9B,qBAAqB,GAAoB,EAAE,CAAC;IAC5C,cAAc,GAAG,KAAK,CAAC;IAEvB,aAAa,GAAG,KAAK,CAAC;IACtB,QAAQ,GAAG,KAAK,CAAC;IAEjB,gBAAgB;IAChB,gBAAgB,GAAG,KAAK,CAAC;IACzB,WAAW,GAAG,EAAE,CAAC;IACjB,kBAAkB,GAAG,EAAE,CAAC;IACxB,YAAY,GAAa,EAAE,CAAC;IAE5B,8BAA8B;IAC9B,mBAAmB,GAAG,KAAK,CAAC;IAC5B,mBAAmB,GAAG,EAAE,CAAC;IACzB,wBAAwB,GAAmB,EAAE,CAAC;IAC9C,oBAAoB,GAAkB,IAAI,CAAC;IAEnC,yBAAyB,GAAkB,IAAI,CAAC;IAChD,iBAAiB,GAAsB,IAAI,CAAC;IAEpD,4BAA4B;IACX,gBAAgB,GAAG,uBAAuB,CAAC;IACpD,mBAAmB,GAAyC,IAAI,CAAC;IACjE,iBAAiB,GAAG,KAAK,CAAC;IAElC,YACU,GAAsB,EACtB,oBAA8C,EAC9C,mBAA0C;QAElD,KAAK,EAAE,CAAC;QAJA,QAAG,GAAH,GAAG,CAAmB;QACtB,yBAAoB,GAApB,oBAAoB,CAA0B;QAC9C,wBAAmB,GAAnB,mBAAmB,CAAuB;IAGpD,CAAC;IAED,IAAI,mBAAmB;QACrB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvE,OAAO,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,WAAW;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAEzB,iCAAiC;QACjC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAE1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAe;YAC5C,UAAU,EAAE,WAAW;YACvB,WAAW,EAAE,aAAa,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG;YAC/C,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,eAAe;SAC5B,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB;QACxB,MAAM,YAAY,GAAG,IAAI,GAAG,EAA2C,CAAC;QAExE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;aACpD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACpB,EAAE;YACF,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,KAAK;SACtB,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,iDAAiD;QACjD,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1D,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,KAAK,aAAa,EAAE,CAAC;gBACrE,oCAAoC;gBACpC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAChC,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,oBAAoB;QAClB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEvE,oCAAoC;QACpC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACjF,CAAC;QAED,qDAAqD;QACrD,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrE,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;YAC/C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC7B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACpD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,IAAkB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAEpF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACtB,IAAI;YACJ,UAAU,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;YACpC,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEpC,kBAAkB;QAClB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,aAAa,CAAC,KAA2B;QACvC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,SAAmB;QAClD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrD,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;YAErE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,+BAA+B;gBAC/B,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAChD,EAAE;oBACF,WAAW,EAAE,EAAE;oBACf,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU;iBAC7C,CAAC,CAAC,CAAC;gBACJ,OAAO;YACT,CAAC;YAED,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;YAEpC,+BAA+B;YAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAExD,+BAA+B;YAC/B,MAAM,gBAAgB,GAAG,UAAU,CAAC,WAAW,CAAC;YAChD,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACtF,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEhE,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAA0B;gBACvD,UAAU,EAAE,UAAU,CAAC,IAAI;gBAC3B,WAAW,EAAE,GAAG,eAAe,QAAQ,cAAc,GAAG;gBACxD,MAAM,EAAE,CAAC,eAAe,EAAE,GAAG,aAAa,CAAC;gBAC3C,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;oBACvD,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;oBACjD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzE,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC;wBAC5C,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;wBAChD,CAAC,CAAC,SAAS,CAAC;oBAEd,OAAO;wBACL,EAAE;wBACF,WAAW;wBACX,aAAa;wBACb,UAAU,EAAE,UAAU,CAAC,IAAI;qBAC5B,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,WAAW;gBACX,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAChD,EAAE;oBACF,WAAW,EAAE,EAAE;oBACf,UAAU,EAAE,UAAU,CAAC,IAAI;iBAC5B,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACvD,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAChD,EAAE;gBACF,WAAW,EAAE,EAAE;gBACf,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,SAAS;aAC3D,CAAC,CAAC,CAAC;QACN,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,UAAsB;QAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,iDAAiD;QACjD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAED,gGAAgG;QAChG,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM;aACxC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,IAAI,CAAC;aAC7E,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B;QAE3C,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YACtF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBAC3D,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACxB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe;IAC5C,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,MAA+B,EAAE,SAAiB;QACxE,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC5D,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,kBAAkB,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAqB;QAC9B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,yBAAyB;YACzB,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;YACtD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;YACrF,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,aAAa,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YAC5C,sCAAsC;YACtC,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;gBACnE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC5C,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1F,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,uBAAuB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,SAAuB;QAC5C,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAE1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,mBAAmB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,SAAuB;QACvC,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,OAAO,CAAC,CAAC,OAAO,qBAAqB,CAAC;YAC3C,KAAK,cAAc,CAAC,CAAC,OAAO,+BAA+B,CAAC;YAC5D,KAAK,YAAY,CAAC,CAAC,OAAO,YAAY,CAAC;YACvC,KAAK,sBAAsB,CAAC,CAAC,OAAO,qBAAqB,CAAC;YAC1D,KAAK,YAAY,CAAC,CAAC,OAAO,YAAY,CAAC;YACvC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,uBAAuB;QACrB,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnE,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QACvE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,WAAW,KAAK,CAAC;YAAE,OAAO;QACpF,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;QAClE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEhE,oCAAoC;QACpC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAErD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAE1B,kBAAkB;YAClB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,eAAe,CAAe,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;YACjF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;YAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC;YACnD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACzB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,WAAY,CAAC,EAAE,CAAC;YAEjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,uBAAuB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC1F,OAAO;YACT,CAAC;YAED,kDAAkD;YAClD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,sBAAsB,EAAE,CAAC;YAE7C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAqB,kBAAkB,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;gBAChG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC3B,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACpB,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;YAElC,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,YAAY,IAAI,CAAC,WAAW,UAAU,IAAI,CAAC,YAAY,CAAC,MAAM,QAAQ,EACtE,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,6CAA6C,EAC7C,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,0BAA0B;YAC1B,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,qBAAqB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnE,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED,uBAAuB;QACrB,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,WAAW,KAAK,CAAC;YAAE,OAAO;QACpF,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;QAClE,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,sBAAsB;QACpB,kEAAkE;QAClE,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAErD,wDAAwD;QACxD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC5C,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAC3D,CAAC;QAEF,sBAAsB;QACtB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC;YACpD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC7B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CACpC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,IAAkB;QACrC,OAAO,UAAU,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,qBAAqB;QACnB,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEzE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,sBAAsB,EAAE,CAAC;YAE7C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAqB,kBAAkB,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;gBAChG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC;gBAC1C,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC3B,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACpB,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;YAElC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC9F,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,SAAS,IAAI,CAAC,YAAY,CAAC,MAAM,gBAAgB,UAAU,EAAE,IAAI,IAAI,MAAM,GAAG,EAC9E,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,4BAA4B,EAC5B,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,8BAA8B,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACnG,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,aAAa;QACX,+BAA+B;QAC/B,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,+BAA+B,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,KAAmB;QAC9C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAAmB;QAC5C,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,SAAS;QACf,iCAAiC;QACjC,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAEnC,2BAA2B;QAC3B,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,oBAAoB;IAChC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,MAAM,WAAW,GAAG;gBAClB,QAAQ,EAAE,IAAI,CAAC,gBAAgB;gBAC/B,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;aAChD,CAAC;YAEF,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC;YAEvC,kDAAkD;YAClD,IAAI,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAEjF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,qBAAqB;gBACrB,OAAO,GAAG,MAAM,EAAE,CAAC,eAAe,CAAsB,mBAAmB,CAAC,CAAC;gBAC7E,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;gBACxB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAC1C,CAAC;YAED,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mDAAmD,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;gBAC/B,OAAO;YACT,CAAC;YAED,iCAAiC;YACjC,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAEnF,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAA8C,CAAC;gBAErF,wBAAwB;gBACxB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACnB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC;gBACzC,CAAC;gBAED,yBAAyB;gBACzB,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9C,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBACnC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;wBACrE,IAAI,IAAI,EAAE,CAAC;4BACT,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;4BACpF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gCACtB,IAAI;gCACJ,UAAU,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;gCACpC,KAAK;6BACN,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAED,yCAAyC;oBACzC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;wBAC5B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,KAAK,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACjC,CAAC;IACH,CAAC;iHArvBU,uBAAuB;6DAAvB,uBAAuB;YA9tC1B,AADF,AADF,AAFF,8BAAkC,aAED,aACL,aACI;YACxB,uBAA2C;YAC3C,0BAAI;YAAA,+BAAe;YACrB,AADqB,iBAAK,EACpB;YACN,4FAAoD;YAStD,iBAAM;YACN,8BAA6B;YAC3B,6EACF;YACF,AADE,iBAAM,EACF;YAOA,AADF,AADF,AAFF,+BAAgC,cAED,cACD,UACpB;YAAA,+BAAc;YAAA,iBAAK;YACvB,6FAAgC;YAKlC,iBAAM;YAIJ,AADF,gCAAmC,iBACL;YAAA,iCAAgB;YAAA,iBAAQ;YAElD,AADF,gCAA6B,kBAIH;YAFtB,mOAA8B;YAC9B,qHAAiB,0BAAsB,IAAC;YAExC,mCAAiB;YAAA,6BAAY;YAAA,iBAAS;YACtC,kHAIC;YAGP,AADE,AADE,iBAAS,EACL,EACF;YAGN,gCAA4B;YAC1B,+GAWC;YAED,4FAAuC;YA8BvC,4FAAwC;YAM1C,iBAAM;YAGN,4FAAgC;YAQhC,6FAAiC;YAmBnC,iBAAM;YAGN,gCAAwB;YACtB,wGAAgC;YAQhC,4FAAkC;YAUlC,4FAAqB;YAKvB,iBAAM;YAKF,AADF,AADF,gCAA2B,cACC,UACpB;YACF,yBAAsC;YACtC,aACF;YACF,AADE,iBAAK,EACD;YAGN,6FAAsB;YAiDtB,6FAA8C;YAoB9C,4FAA+C;YAOnD,AADE,iBAAM,EACF;YAGN,4FAAwB;YAGxB,6FAAwB;YA2CxB,4FAA2B;YAG3B,6FAA2B;YA6D7B,iBAAM;;YAnWA,eAQC;YARD,+EAQC;YAaC,eAIC;YAJD,wDAIC;YAQG,eAA8B;YAA9B,oDAA8B;YAI9B,eAIC;YAJD,gCAIC;YAOL,eAWC;YAXD,gCAWC;YAED,eA4BC;YA5BD,mEA4BC;YAED,cAKC;YALD,oEAKC;YAIH,cAKC;YALD,wDAKC;YAGD,cAkBC;YAlBD,yDAkBC;YAKD,eAMC;YAND,wDAMC;YAED,cAQC;YARD,0DAQC;YAED,cAIC;YAJD,6CAIC;YAQG,eACF;YADE,mFACF;YAIF,cA8CC;YA9CD,8CA8CC;YAGD,cAiBC;YAjBD,0EAiBC;YAGD,cAKC;YALD,2EAKC;YAKL,cAEC;YAFD,gDAEC;YACD,cAwCC;YAxCD,gDAwCC;YAGD,cAEC;YAFD,mDAEC;YACD,cA4DC;YA5DD,mDA4DC;;;AAw3BM,uBAAuB;IAvuCnC,aAAa,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;GAuuCnD,uBAAuB,CAsvBnC;;iFAtvBY,uBAAuB;cAtuCnC,SAAS;6BACI,KAAK,YACP,8BAA8B,YAC9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6WP,iBAo3BY,iBAAiB,CAAC,IAAI;;kFAE1B,uBAAuB","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, SharedService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListEntity, MJListDetailEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { Metadata, RunView, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { ListSetOperationsService, VennData, VennIntersection, SetOperation, SetOperationResult } from '../services/list-set-operations.service';\nimport { VennRegionClickEvent } from './venn-diagram/venn-diagram.component';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\ninterface ListSelection {\n list: MJListEntity;\n entityName: string;\n color: string;\n}\n\n/**\n * Preview record with meaningful display fields\n */\ninterface PreviewRecord {\n id: string;\n displayName: string;\n secondaryInfo?: string;\n entityName: string;\n}\n\n/**\n * Entity option for filtering\n */\ninterface EntityOption {\n id: string;\n name: string;\n listCount: number;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsOperationsResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-operations-resource',\n template: `\n <div class=\"operations-container\">\n <!-- Header -->\n <div class=\"operations-header\">\n <div class=\"header-top\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n <h2>List Operations</h2>\n </div>\n @if (selectedLists.length > 0 || selectedEntityId) {\n <button\n class=\"clear-all-btn\"\n (click)=\"clearAllSelections()\"\n title=\"Clear all selections\">\n <i class=\"fa-solid fa-xmark\"></i>\n Clear\n </button>\n }\n </div>\n <div class=\"header-subtitle\">\n Visualize overlaps and perform set operations on your lists\n </div>\n </div>\n \n <!-- Main Content -->\n <div class=\"operations-content\">\n <!-- Left Panel: List Selection -->\n <div class=\"selection-panel\">\n <div class=\"panel-header\">\n <h3>Selected Lists</h3>\n @if (selectedLists.length > 0) {\n <span class=\"list-count\">\n {{selectedLists.length}}/{{maxLists}}\n </span>\n }\n </div>\n \n <!-- Entity Filter Selector -->\n <div class=\"entity-filter-section\">\n <label class=\"filter-label\">Filter by Entity</label>\n <div class=\"entity-selector\">\n <select\n [(ngModel)]=\"selectedEntityId\"\n (ngModelChange)=\"onEntityFilterChange()\"\n class=\"entity-select\">\n <option value=\"\">All Entities</option>\n @for (entity of entityOptions; track entity) {\n <option [value]=\"entity.id\">\n {{entity.name}} ({{entity.listCount}})\n </option>\n }\n </select>\n </div>\n </div>\n \n <!-- Selected lists -->\n <div class=\"selected-lists\">\n @for (item of selectedLists; track item; let i = $index) {\n <div class=\"selected-item\">\n <div class=\"item-color\" [style.background-color]=\"item.color\"></div>\n <div class=\"item-info\">\n <span class=\"item-name\">{{item.list.Name}}</span>\n <span class=\"item-entity\">{{item.entityName}}</span>\n </div>\n <button class=\"remove-btn\" (click)=\"removeList(i)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n \n @if (selectedLists.length < maxLists) {\n <div class=\"add-list-area\">\n <div class=\"add-list-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"listSearchTerm\"\n (ngModelChange)=\"filterAvailableLists()\"\n placeholder=\"Search lists to add...\"\n (focus)=\"showListDropdown = true\" />\n </div>\n <!-- Available lists dropdown -->\n @if (showListDropdown && filteredAvailableLists.length > 0) {\n <div class=\"list-dropdown\">\n <div class=\"dropdown-backdrop\" (click)=\"showListDropdown = false\"></div>\n <div class=\"dropdown-content\">\n @for (list of filteredAvailableLists; track list) {\n <div\n class=\"dropdown-item\"\n (click)=\"addList(list)\">\n <span class=\"dropdown-name\">{{list.Name}}</span>\n <span class=\"dropdown-entity\">{{list.Entity}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n \n @if (selectedLists.length >= maxLists) {\n <div class=\"lists-full\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Maximum {{maxLists}} lists can be compared\n </div>\n }\n </div>\n \n <!-- Entity consistency note -->\n @if (selectedLists.length > 0) {\n <div class=\"entity-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Comparing lists of type: <strong>{{selectedLists[0].entityName}}</strong></span>\n </div>\n }\n \n <!-- Quick Operations -->\n @if (selectedLists.length >= 2) {\n <div class=\"quick-operations\">\n <h4>Quick Operations</h4>\n <div class=\"operation-buttons\">\n <button class=\"op-btn\" (click)=\"performOperation('union')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>Union All</span>\n </button>\n <button class=\"op-btn\" (click)=\"performOperation('intersection')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-circle-notch\"></i>\n <span>Intersection</span>\n </button>\n <button class=\"op-btn\" (click)=\"performOperation('symmetric_difference')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-arrows-split-up-and-left\"></i>\n <span>Unique Each</span>\n </button>\n </div>\n </div>\n }\n </div>\n \n <!-- Center: Venn Diagram -->\n <div class=\"venn-panel\">\n @if (selectedLists.length > 0) {\n <mj-venn-diagram\n [data]=\"vennData\"\n [selectedRegion]=\"selectedRegion\"\n (regionClick)=\"onRegionClick($event)\">\n </mj-venn-diagram>\n }\n \n @if (selectedLists.length === 0) {\n <div class=\"venn-empty\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-circle-nodes\"></i>\n </div>\n <h3>Add Lists to Compare</h3>\n <p>Select 2-4 lists from the same entity to visualize their overlaps and perform set operations.</p>\n </div>\n }\n \n @if (isCalculating) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Calculating...\"></mj-loading>\n </div>\n }\n </div>\n \n <!-- Right Panel: Selected Region / Results -->\n <div class=\"results-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-crosshairs\"></i>\n {{selectedRegion ? 'Selected Region' : 'Results'}}\n </h3>\n </div>\n \n <!-- Selected region details -->\n @if (selectedRegion) {\n <div class=\"region-details\">\n <div class=\"region-header\">\n <span class=\"region-label\">{{selectedRegion.label}}</span>\n <span class=\"region-count\">{{selectedRegion.size}} records</span>\n </div>\n <div class=\"region-actions\">\n <button class=\"action-btn primary\" (click)=\"createListFromSelection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New List\n </button>\n <button class=\"action-btn\" (click)=\"addToExistingList()\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n Add to List\n </button>\n <button class=\"action-btn\" (click)=\"exportToExcel()\">\n <i class=\"fa-solid fa-file-excel\"></i>\n Export\n </button>\n </div>\n @if (previewRecordsDisplay.length > 0) {\n <div class=\"record-preview\">\n <h5>Preview (first 10)</h5>\n <div class=\"preview-list\">\n @for (record of previewRecordsDisplay; track record) {\n <div class=\"preview-card\">\n <div class=\"preview-card-content\">\n <span class=\"preview-name\">{{record.displayName}}</span>\n @if (record.secondaryInfo) {\n <span class=\"preview-secondary\">{{record.secondaryInfo}}</span>\n }\n </div>\n <button class=\"preview-open-btn\" (click)=\"openRecord(record)\" title=\"Open record\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n </div>\n }\n </div>\n @if (loadingPreview) {\n <div class=\"preview-loading\">\n <mj-loading text=\"Loading preview...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n }\n </div>\n }\n \n <!-- Operation result -->\n @if (lastOperationResult && !selectedRegion) {\n <div class=\"operation-result\">\n <div class=\"result-header\">\n <span class=\"result-operation\">{{getOperationLabel(lastOperationResult.operation)}}</span>\n <span class=\"result-count\">{{lastOperationResult.resultCount}} records</span>\n </div>\n <div class=\"region-actions\">\n <button class=\"action-btn primary\" (click)=\"createListFromResult()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New List\n </button>\n <button class=\"action-btn\" (click)=\"addResultToExistingList()\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n Add to List\n </button>\n </div>\n </div>\n }\n \n <!-- Empty state -->\n @if (!selectedRegion && !lastOperationResult) {\n <div class=\"results-empty\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Click a region in the diagram or run an operation to see results</p>\n </div>\n }\n </div>\n </div>\n \n <!-- Create List Dialog -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"cancelCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>Create New List from Selection</h3>\n <button class=\"modal-close\" (click)=\"cancelCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>List Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"newListName\"\n placeholder=\"Enter list name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"newListDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"form-info\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{recordsToAdd.length}} record{{recordsToAdd.length !== 1 ? 's' : ''}} will be added to this list\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-primary\" (click)=\"confirmCreateList()\" [disabled]=\"!newListName || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Creating...' : 'Create List'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelCreateDialog()\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Add to Existing List Dialog -->\n @if (showAddToListDialog) {\n <div class=\"modal-overlay\" (click)=\"cancelAddToListDialog()\"></div>\n }\n @if (showAddToListDialog) {\n <div class=\"modal-dialog add-to-list-dialog\">\n <div class=\"modal-header\">\n <h3>Add to Existing List</h3>\n <button class=\"modal-close\" (click)=\"cancelAddToListDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-info\" style=\"margin-bottom: 16px;\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{recordsToAdd.length}} record{{recordsToAdd.length !== 1 ? 's' : ''}} will be added\n </div>\n <!-- Search input -->\n <div class=\"list-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"addToListSearchTerm\"\n (ngModelChange)=\"filterAddToListOptions()\"\n placeholder=\"Search lists...\"\n class=\"form-input\" />\n </div>\n <!-- List options -->\n <div class=\"list-options\">\n @for (list of filteredAddToListOptions; track list) {\n <div\n class=\"list-option\"\n [class.selected]=\"IsTargetListSelected(list)\"\n (click)=\"selectTargetList(list.ID)\">\n <div class=\"list-option-radio\">\n <input\n type=\"radio\"\n [checked]=\"IsTargetListSelected(list)\"\n name=\"targetList\" />\n </div>\n <div class=\"list-option-info\">\n <span class=\"list-option-name\">{{list.Name}}</span>\n <span class=\"list-option-entity\">{{list.Entity}}</span>\n </div>\n </div>\n }\n @if (filteredAddToListOptions.length === 0) {\n <div class=\"list-options-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>{{addToListSearchTerm ? 'No lists match your search' : 'No other lists available'}}</p>\n </div>\n }\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-primary\" (click)=\"confirmAddToList()\" [disabled]=\"!selectedTargetListId || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Adding...' : 'Add to List'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelAddToListDialog()\">Cancel</button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .operations-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .operations-header {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .clear-all-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .clear-all-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n }\n\n .clear-all-btn i {\n font-size: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-subtitle {\n color: var(--mj-text-secondary);\n font-size: 14px;\n }\n\n .operations-content {\n display: grid;\n grid-template-columns: 280px 1fr 300px;\n gap: 16px;\n flex: 1;\n padding: 16px;\n overflow: hidden;\n }\n\n /* Panels */\n .selection-panel,\n .results-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .venn-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n min-height: 400px;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .list-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n /* Entity Filter */\n .entity-filter-section {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .filter-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .entity-select {\n width: 100%;\n padding: 8px 12px;\n font-size: 13px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .entity-select:focus {\n border-color: var(--mj-brand-primary);\n }\n\n .entity-note {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 8px 12px;\n padding: 8px 10px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-success);\n }\n\n .entity-note i {\n color: var(--mj-status-success);\n }\n\n /* Selected Lists */\n .selected-lists {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n }\n\n .selected-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 8px;\n }\n\n .item-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .remove-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n }\n\n .remove-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Add list area */\n .add-list-area {\n position: relative;\n }\n\n .add-list-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px dashed var(--mj-border-default);\n border-radius: 6px;\n transition: border-color 0.2s;\n }\n\n .add-list-search:focus-within {\n border-color: var(--mj-brand-primary);\n }\n\n .add-list-search i {\n color: var(--mj-text-muted);\n }\n\n .add-list-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 13px;\n }\n\n .list-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 100;\n margin-top: 4px;\n }\n\n .dropdown-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .dropdown-content {\n position: relative;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n max-height: 200px;\n overflow-y: auto;\n }\n\n .dropdown-item {\n display: flex;\n flex-direction: column;\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .dropdown-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .dropdown-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .lists-full {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n }\n\n .entity-warning {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin: 12px;\n padding: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-warning);\n }\n\n .entity-warning i {\n color: var(--mj-status-warning);\n margin-top: 2px;\n }\n\n /* Quick Operations */\n .quick-operations {\n padding: 12px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .quick-operations h4 {\n margin: 0 0 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .operation-buttons {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .op-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .op-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n .op-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* Venn Panel */\n .venn-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n }\n\n .empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 50%;\n margin-bottom: 20px;\n }\n\n .empty-icon i {\n font-size: 36px;\n color: var(--mj-brand-primary);\n }\n\n .venn-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n color: var(--mj-text-primary);\n }\n\n .venn-empty p {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n max-width: 300px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 90%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Results Panel */\n .region-details,\n .operation-result {\n padding: 16px;\n }\n\n .region-header,\n .result-header {\n margin-bottom: 16px;\n }\n\n .region-label,\n .result-operation {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .region-count,\n .result-count {\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .region-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .action-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .action-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .action-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .record-preview h5 {\n margin: 0 0 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .preview-list {\n max-height: 200px;\n overflow-y: auto;\n }\n\n .preview-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 6px;\n transition: all 0.15s ease;\n }\n\n .preview-card:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .preview-card-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .preview-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-secondary {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-open-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n padding: 6px 8px;\n border-radius: 4px;\n opacity: 0.6;\n transition: all 0.15s ease;\n flex-shrink: 0;\n }\n\n .preview-open-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .preview-loading {\n padding: 12px;\n text-align: center;\n }\n\n .results-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .results-empty i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.5;\n }\n\n .results-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 200px;\n }\n\n /* Modal */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n width: 420px;\n max-width: 90vw;\n z-index: 1001;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px 8px;\n }\n\n .modal-body {\n padding: 20px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n textarea.form-input {\n resize: vertical;\n }\n\n .form-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .form-info i {\n color: var(--mj-brand-primary);\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-secondary:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n /* Add to List Dialog */\n .add-to-list-dialog {\n width: 480px;\n }\n\n .add-to-list-dialog .modal-body {\n max-height: 400px;\n overflow-y: auto;\n }\n\n .list-search {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-bottom: 12px;\n }\n\n .list-search i {\n color: var(--mj-text-muted);\n flex-shrink: 0;\n }\n\n .list-search .form-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0;\n font-size: 14px;\n }\n\n .list-search .form-input:focus {\n box-shadow: none;\n outline: none;\n }\n\n .list-options {\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n max-height: 250px;\n overflow-y: auto;\n }\n\n .list-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-option:last-child {\n border-bottom: none;\n }\n\n .list-option:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-option-radio {\n flex-shrink: 0;\n }\n\n .list-option-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n }\n\n .list-option-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .list-option-name {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-option-entity {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 30px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty i {\n font-size: 28px;\n margin-bottom: 10px;\n opacity: 0.5;\n }\n\n .list-options-empty p {\n margin: 0;\n font-size: 13px;\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .operations-content {\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr auto;\n }\n\n .selection-panel {\n order: 1;\n }\n\n .venn-panel {\n order: 2;\n min-height: 300px;\n }\n\n .results-panel {\n order: 3;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsOperationsResource extends BaseResourceComponent implements OnDestroy {\n private destroy$ = new Subject<void>();\n\n maxLists = 4;\n selectedLists: ListSelection[] = [];\n availableLists: MJListEntity[] = [];\n filteredAvailableLists: MJListEntity[] = [];\n listSearchTerm = '';\n showListDropdown = false;\n\n // Entity filter\n entityOptions: EntityOption[] = [];\n selectedEntityId = '';\n\n vennData: VennData | null = null;\n selectedRegion: VennIntersection | null = null;\n lastOperationResult: SetOperationResult | null = null;\n previewRecords: string[] = [];\n previewRecordsDisplay: PreviewRecord[] = [];\n loadingPreview = false;\n\n isCalculating = false;\n isSaving = false;\n\n // Create dialog\n showCreateDialog = false;\n newListName = '';\n newListDescription = '';\n recordsToAdd: string[] = [];\n\n // Add to existing list dialog\n showAddToListDialog = false;\n addToListSearchTerm = '';\n filteredAddToListOptions: MJListEntity[] = [];\n selectedTargetListId: string | null = null;\n\n private entityIdFromSelectedLists: string | null = null;\n private currentEntityInfo: EntityInfo | null = null;\n\n // User Settings persistence\n private readonly USER_SETTING_KEY = 'ListsOperations.State';\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n private isLoadingSettings = false;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private setOperationsService: ListSetOperationsService,\n private notificationService: MJNotificationService\n ) {\n super();\n }\n\n get hasMultipleEntities(): boolean {\n if (this.selectedLists.length < 2) return false;\n const entities = new Set(this.selectedLists.map(s => s.list.EntityID));\n return entities.size > 1;\n }\n\n async ngOnInit() {\n await this.loadAvailableLists();\n await this.loadSavedState();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n }\n\n async loadAvailableLists() {\n const rv = new RunView();\n const md = new Metadata();\n\n const result = await rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: `UserID = '${md.CurrentUser?.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.availableLists = result.Results || [];\n this.buildEntityOptions();\n this.filterAvailableLists();\n }\n }\n\n /**\n * Build entity options for the filter dropdown\n */\n private buildEntityOptions(): void {\n const entityCounts = new Map<string, { name: string; count: number }>();\n\n for (const list of this.availableLists) {\n const existing = entityCounts.get(list.EntityID);\n if (existing) {\n existing.count++;\n } else {\n entityCounts.set(list.EntityID, { name: list.Entity || 'Unknown', count: 1 });\n }\n }\n\n this.entityOptions = Array.from(entityCounts.entries())\n .map(([id, data]) => ({\n id,\n name: data.name,\n listCount: data.count\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Handle entity filter change\n */\n onEntityFilterChange(): void {\n // Clear selected lists if changing entity filter\n if (this.selectedLists.length > 0) {\n const firstEntityId = this.selectedLists[0].list.EntityID;\n if (this.selectedEntityId && this.selectedEntityId !== firstEntityId) {\n // Entity changed - clear selections\n this.selectedLists = [];\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n this.previewRecordsDisplay = [];\n }\n }\n this.filterAvailableLists();\n this.saveState();\n }\n\n filterAvailableLists() {\n const selectedIds = new Set(this.selectedLists.map(s => s.list.ID));\n let filtered = this.availableLists.filter(l => !selectedIds.has(l.ID));\n\n // Apply entity filter from dropdown\n if (this.selectedEntityId) {\n filtered = filtered.filter(l => UUIDsEqual(l.EntityID, this.selectedEntityId));\n }\n\n // If we have selected lists, restrict to same entity\n if (this.selectedLists.length > 0) {\n this.entityIdFromSelectedLists = this.selectedLists[0].list.EntityID;\n filtered = filtered.filter(l => UUIDsEqual(l.EntityID, this.entityIdFromSelectedLists));\n }\n\n if (this.listSearchTerm) {\n const term = this.listSearchTerm.toLowerCase();\n filtered = filtered.filter(l =>\n l.Name.toLowerCase().includes(term) ||\n (l.Entity && l.Entity.toLowerCase().includes(term))\n );\n }\n\n this.filteredAvailableLists = filtered.slice(0, 10);\n }\n\n addList(list: MJListEntity) {\n const color = this.setOperationsService.getColorForIndex(this.selectedLists.length);\n\n this.selectedLists.push({\n list,\n entityName: list.Entity || 'Unknown',\n color\n });\n\n this.listSearchTerm = '';\n this.showListDropdown = false;\n this.filterAvailableLists();\n this.recalculateVenn();\n this.saveState();\n }\n\n removeList(index: number) {\n this.selectedLists.splice(index, 1);\n\n // Reassign colors\n this.selectedLists.forEach((item, i) => {\n item.color = this.setOperationsService.getColorForIndex(i);\n });\n\n this.filterAvailableLists();\n this.recalculateVenn();\n this.saveState();\n }\n\n async recalculateVenn() {\n if (this.selectedLists.length === 0) {\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n return;\n }\n\n this.isCalculating = true;\n this.cdr.detectChanges();\n\n try {\n const lists = this.selectedLists.map(s => s.list);\n this.vennData = await this.setOperationsService.calculateVennData(lists);\n this.selectedRegion = null;\n this.lastOperationResult = null;\n } catch (error) {\n console.error('Error calculating Venn data:', error);\n } finally {\n this.isCalculating = false;\n this.cdr.detectChanges();\n }\n }\n\n onRegionClick(event: VennRegionClickEvent) {\n this.selectedRegion = event.intersection;\n this.lastOperationResult = null;\n this.previewRecords = event.recordIds.slice(0, 10);\n this.loadPreviewRecords(event.recordIds.slice(0, 10));\n this.cdr.detectChanges();\n }\n\n /**\n * Load preview records with meaningful display fields\n */\n private async loadPreviewRecords(recordIds: string[]): Promise<void> {\n if (recordIds.length === 0 || this.selectedLists.length === 0) {\n this.previewRecordsDisplay = [];\n return;\n }\n\n this.loadingPreview = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entityId = this.selectedLists[0].list.EntityID;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityId));\n\n if (!entityInfo) {\n // Fallback to showing just IDs\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: this.selectedLists[0].entityName\n }));\n return;\n }\n\n this.currentEntityInfo = entityInfo;\n\n // Find the best display fields\n const displayFields = this.getDisplayFields(entityInfo);\n\n // Build filter for the records\n const primaryKeyFields = entityInfo.PrimaryKeys;\n const primaryKeyField = primaryKeyFields.length > 0 ? primaryKeyFields[0].Name : 'ID';\n const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');\n\n const rv = new RunView();\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: entityInfo.Name,\n ExtraFilter: `${primaryKeyField} IN (${recordIdFilter})`,\n Fields: [primaryKeyField, ...displayFields],\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results) {\n this.previewRecordsDisplay = result.Results.map(record => {\n const id = String(record[primaryKeyField] || '');\n const displayName = this.getDisplayValue(record, displayFields[0]) || id;\n const secondaryInfo = displayFields.length > 1\n ? this.getDisplayValue(record, displayFields[1])\n : undefined;\n\n return {\n id,\n displayName,\n secondaryInfo,\n entityName: entityInfo.Name\n };\n });\n } else {\n // Fallback\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: entityInfo.Name\n }));\n }\n } catch (error) {\n console.error('Error loading preview records:', error);\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: this.selectedLists[0]?.entityName || 'Unknown'\n }));\n } finally {\n this.loadingPreview = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get the best display fields for an entity based on metadata\n */\n private getDisplayFields(entityInfo: EntityInfo): string[] {\n const fields: string[] = [];\n\n // First priority: NameField (IsNameField = true)\n const nameField = entityInfo.Fields.find(f => f.IsNameField);\n if (nameField) {\n fields.push(nameField.Name);\n }\n\n // Second priority: DefaultInView fields (excluding primary key unless it's also the name field)\n const defaultViewFields = entityInfo.Fields\n .filter(f => f.DefaultInView && !f.IsPrimaryKey && f.Name !== nameField?.Name)\n .slice(0, 2); // Take up to 2 more fields\n\n for (const field of defaultViewFields) {\n if (!fields.includes(field.Name)) {\n fields.push(field.Name);\n }\n }\n\n // If we still don't have any fields, use common field names\n if (fields.length === 0) {\n const commonNames = ['Name', 'Title', 'Subject', 'Description', 'Email', 'FirstName'];\n for (const name of commonNames) {\n const field = entityInfo.Fields.find(f => f.Name === name);\n if (field) {\n fields.push(field.Name);\n break;\n }\n }\n }\n\n // If still nothing, include primary key\n if (fields.length === 0 && entityInfo.PrimaryKeys.length > 0) {\n fields.push(entityInfo.PrimaryKeys[0].Name);\n }\n\n return fields.slice(0, 3); // Max 3 fields\n }\n\n /**\n * Get a display value from a record\n */\n private getDisplayValue(record: Record<string, unknown>, fieldName: string): string | undefined {\n const value = record[fieldName];\n if (value === null || value === undefined) return undefined;\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n return String(value);\n }\n\n /**\n * Open a record in the entity viewer\n */\n openRecord(record: PreviewRecord): void {\n if (!this.currentEntityInfo) {\n // Try to get entity info\n const md = new Metadata();\n const entityId = this.selectedLists[0]?.list.EntityID;\n if (entityId) {\n this.currentEntityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityId)) || null;\n }\n }\n\n if (this.currentEntityInfo) {\n SharedService.Instance.InvokeManualResize();\n // Create composite key for navigation\n const primaryKeyField = this.currentEntityInfo.PrimaryKeys.length > 0\n ? this.currentEntityInfo.PrimaryKeys[0].Name\n : 'ID';\n const compositeKey = new CompositeKey([{ FieldName: primaryKeyField, Value: record.id }]);\n SharedService.Instance.OpenEntityRecord(this.currentEntityInfo.Name, compositeKey);\n } else {\n this.notificationService.CreateSimpleNotification('Unable to open record', 'error', 3000);\n }\n }\n\n async performOperation(operation: SetOperation) {\n if (this.selectedLists.length < 2) return;\n\n this.isCalculating = true;\n this.selectedRegion = null;\n this.cdr.detectChanges();\n\n try {\n const listIds = this.selectedLists.map(s => s.list.ID);\n this.lastOperationResult = await this.setOperationsService.performOperation(operation, listIds);\n this.previewRecords = this.lastOperationResult.resultRecordIds.slice(0, 10);\n } catch (error) {\n console.error('Error performing operation:', error);\n } finally {\n this.isCalculating = false;\n this.cdr.detectChanges();\n }\n }\n\n getOperationLabel(operation: SetOperation): string {\n switch (operation) {\n case 'union': return 'Union (All Records)';\n case 'intersection': return 'Intersection (Common Records)';\n case 'difference': return 'Difference';\n case 'symmetric_difference': return 'Unique to Each List';\n case 'complement': return 'Complement';\n default: return operation;\n }\n }\n\n createListFromSelection() {\n if (!this.selectedRegion || this.selectedRegion.size === 0) return;\n this.recordsToAdd = [...this.selectedRegion.recordIds];\n this.newListName = '';\n this.newListDescription = `Created from: ${this.selectedRegion.label}`;\n this.showCreateDialog = true;\n }\n\n createListFromResult() {\n if (!this.lastOperationResult || this.lastOperationResult.resultCount === 0) return;\n this.recordsToAdd = [...this.lastOperationResult.resultRecordIds];\n this.newListName = '';\n this.newListDescription = `Created from: ${this.getOperationLabel(this.lastOperationResult.operation)}`;\n this.showCreateDialog = true;\n }\n\n cancelCreateDialog() {\n this.showCreateDialog = false;\n this.newListName = '';\n this.newListDescription = '';\n this.recordsToAdd = [];\n }\n\n async confirmCreateList() {\n if (!this.newListName || this.recordsToAdd.length === 0) return;\n\n // Get entity ID from selected lists\n if (this.selectedLists.length === 0) return;\n const entityId = this.selectedLists[0].list.EntityID;\n\n this.isSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n\n // Create the list\n const list = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.EntityID = entityId;\n list.UserID = md.CurrentUser!.ID;\n\n const saved = await list.Save();\n if (!saved) {\n this.notificationService.CreateSimpleNotification('Failed to create list', 'error', 4000);\n return;\n }\n\n // Add records to the list using transaction group\n const tg = await md.CreateTransactionGroup();\n\n for (const recordId of this.recordsToAdd) {\n const detail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n detail.ListID = list.ID;\n detail.RecordID = recordId;\n detail.Sequence = 0;\n detail.TransactionGroup = tg;\n await detail.Save();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n this.notificationService.CreateSimpleNotification(\n `Created \"${this.newListName}\" with ${this.recordsToAdd.length} items`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification(\n `Created list but failed to add some records`,\n 'warning',\n 4000\n );\n }\n\n this.cancelCreateDialog();\n\n // Refresh available lists\n await this.loadAvailableLists();\n } catch (error) {\n console.error('Error creating list:', error);\n this.notificationService.CreateSimpleNotification('Error creating list', 'error', 4000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n addToExistingList() {\n if (!this.selectedRegion || this.selectedRegion.size === 0) return;\n this.recordsToAdd = [...this.selectedRegion.recordIds];\n this.openAddToListDialog();\n }\n\n addResultToExistingList() {\n if (!this.lastOperationResult || this.lastOperationResult.resultCount === 0) return;\n this.recordsToAdd = [...this.lastOperationResult.resultRecordIds];\n this.openAddToListDialog();\n }\n\n /**\n * Open the Add to Existing List dialog\n */\n private openAddToListDialog(): void {\n this.showAddToListDialog = true;\n this.addToListSearchTerm = '';\n this.selectedTargetListId = null;\n this.filterAddToListOptions();\n }\n\n /**\n * Filter available lists for add-to-list dialog\n */\n filterAddToListOptions(): void {\n // Get entity ID from selected lists to filter to same entity type\n if (this.selectedLists.length === 0) {\n this.filteredAddToListOptions = [];\n return;\n }\n\n const entityId = this.selectedLists[0].list.EntityID;\n\n // Filter to same entity, exclude already selected lists\n const selectedIds = new Set(this.selectedLists.map(s => s.list.ID));\n let filtered = this.availableLists.filter(l =>\n UUIDsEqual(l.EntityID, entityId) && !selectedIds.has(l.ID)\n );\n\n // Apply search filter\n if (this.addToListSearchTerm) {\n const term = this.addToListSearchTerm.toLowerCase();\n filtered = filtered.filter(l =>\n l.Name.toLowerCase().includes(term)\n );\n }\n\n this.filteredAddToListOptions = filtered;\n }\n\n /**\n * Select a target list for adding records\n */\n IsTargetListSelected(list: MJListEntity): boolean {\n return UUIDsEqual(this.selectedTargetListId, list.ID);\n }\n\n selectTargetList(listId: string): void {\n this.selectedTargetListId = listId;\n }\n\n /**\n * Cancel the add to list dialog\n */\n cancelAddToListDialog(): void {\n this.showAddToListDialog = false;\n this.addToListSearchTerm = '';\n this.selectedTargetListId = null;\n this.recordsToAdd = [];\n }\n\n /**\n * Confirm adding records to selected list\n */\n async confirmAddToList(): Promise<void> {\n if (!this.selectedTargetListId || this.recordsToAdd.length === 0) return;\n\n this.isSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const tg = await md.CreateTransactionGroup();\n\n for (const recordId of this.recordsToAdd) {\n const detail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n detail.ListID = this.selectedTargetListId;\n detail.RecordID = recordId;\n detail.Sequence = 0;\n detail.TransactionGroup = tg;\n await detail.Save();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n const targetList = this.availableLists.find(l => UUIDsEqual(l.ID, this.selectedTargetListId));\n this.notificationService.CreateSimpleNotification(\n `Added ${this.recordsToAdd.length} records to \"${targetList?.Name || 'list'}\"`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification(\n 'Failed to add some records',\n 'warning',\n 4000\n );\n }\n\n this.cancelAddToListDialog();\n } catch (error) {\n console.error('Error adding to list:', error);\n this.notificationService.CreateSimpleNotification('Error adding records to list', 'error', 4000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n exportToExcel() {\n // TODO: Implement Excel export\n this.notificationService.CreateSimpleNotification('Export to Excel - coming soon', 'info', 2000);\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Operations';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-diagram-project';\n }\n\n /**\n * Clear all selections and reset state\n */\n clearAllSelections(): void {\n this.selectedLists = [];\n this.selectedEntityId = '';\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n this.previewRecordsDisplay = [];\n this.filterAvailableLists();\n this.saveState();\n this.cdr.detectChanges();\n }\n\n /**\n * Save state to User Settings (debounced to avoid excessive writes)\n */\n private saveState(): void {\n // Don't save during initial load\n if (this.isLoadingSettings) return;\n\n // Debounce the server save\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveStateToServer();\n }, 1000); // 1 second debounce\n }\n\n /**\n * Save state to User Settings entity on server\n */\n private async saveStateToServer(): Promise<void> {\n try {\n const md = new Metadata();\n const userId = md.CurrentUser?.ID;\n if (!userId) return;\n\n const stateToSave = {\n entityId: this.selectedEntityId,\n listIds: this.selectedLists.map(s => s.list.ID)\n };\n\n const engine = UserInfoEngine.Instance;\n\n // Find existing setting from cached user settings\n let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_KEY);\n\n if (!setting) {\n // Create new setting\n setting = await md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = this.USER_SETTING_KEY;\n }\n\n setting.Value = JSON.stringify(stateToSave);\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save operations state to User Settings:', error);\n }\n }\n\n /**\n * Load saved state from User Settings\n */\n private async loadSavedState(): Promise<void> {\n this.isLoadingSettings = true;\n\n try {\n const md = new Metadata();\n const userId = md.CurrentUser?.ID;\n if (!userId) {\n this.isLoadingSettings = false;\n return;\n }\n\n // Load from cached User Settings\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_KEY);\n\n if (setting?.Value) {\n const state = JSON.parse(setting.Value) as { entityId?: string; listIds?: string[] };\n\n // Restore entity filter\n if (state.entityId) {\n this.selectedEntityId = state.entityId;\n }\n\n // Restore selected lists\n if (state.listIds && state.listIds.length > 0) {\n for (const listId of state.listIds) {\n const list = this.availableLists.find(l => UUIDsEqual(l.ID, listId));\n if (list) {\n const color = this.setOperationsService.getColorForIndex(this.selectedLists.length);\n this.selectedLists.push({\n list,\n entityName: list.Entity || 'Unknown',\n color\n });\n }\n }\n\n // If we restored lists, recalculate venn\n if (this.selectedLists.length > 0) {\n this.filterAvailableLists();\n await this.recalculateVenn();\n }\n }\n\n this.cdr.detectChanges();\n }\n } catch (error) {\n console.warn('Failed to load operations state from User Settings:', error);\n } finally {\n this.isLoadingSettings = false;\n }\n }\n}\n"]}
@@ -530,7 +530,7 @@ export class VennDiagramComponent {
530
530
  .attr('x', cx)
531
531
  .attr('y', cy + radius + 16)
532
532
  .attr('text-anchor', 'middle')
533
- .attr('fill', '#666')
533
+ .attr('fill', 'var(--mj-text-secondary)')
534
534
  .attr('font-size', '11px')
535
535
  .text(set.listName.length > 15 ? set.listName.substring(0, 15) + '...' : set.listName);
536
536
  });
@@ -656,7 +656,7 @@ export class VennDiagramComponent {
656
656
  i0.ɵɵconditional(ctx.data && ctx.data.sets.length > 0 ? 9 : -1);
657
657
  i0.ɵɵadvance();
658
658
  i0.ɵɵconditional(!ctx.data || ctx.data.sets.length === 0 ? 10 : -1);
659
- } }, styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .venn-container[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 300px;\n background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .venn-svg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n }\n\n .venn-tooltip[_ngcontent-%COMP%] {\n position: absolute;\n background: rgba(0, 0, 0, 0.85);\n color: white;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 13px;\n pointer-events: none;\n opacity: 0;\n transform: translateY(8px);\n transition: opacity 0.15s, transform 0.15s;\n z-index: 100;\n white-space: nowrap;\n }\n\n .venn-tooltip.visible[_ngcontent-%COMP%] {\n opacity: 1;\n transform: translateY(0);\n }\n\n .tooltip-title[_ngcontent-%COMP%] {\n font-weight: 600;\n margin-bottom: 2px;\n }\n\n .tooltip-count[_ngcontent-%COMP%] {\n color: rgba(255, 255, 255, 0.8);\n font-size: 12px;\n }\n\n .venn-legend[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 16px;\n left: 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: rgba(255, 255, 255, 0.95);\n padding: 12px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .legend-color[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n\n .legend-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n }\n\n .legend-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: #333;\n }\n\n .legend-count[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #999;\n }\n\n .empty-state[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n color: #999;\n }\n\n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n margin: 0;\n }\n\n \n\n [_nghost-%COMP%] .venn-circle {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n [_nghost-%COMP%] .venn-circle:hover {\n opacity: 0.9;\n }\n\n [_nghost-%COMP%] .venn-label {\n font-size: 12px;\n font-weight: 600;\n fill: white;\n text-anchor: middle;\n pointer-events: none;\n }\n\n [_nghost-%COMP%] .intersection-region {\n cursor: pointer;\n transition: all 0.2s;\n }\n\n [_nghost-%COMP%] .intersection-region:hover {\n fill: rgba(0,0,0,0.75);\n }\n\n [_nghost-%COMP%] .intersection-region.selected {\n fill: rgba(156, 39, 176, 0.9);\n stroke: #7B1FA2;\n stroke-width: 2;\n }\n\n [_nghost-%COMP%] .intersection-label-group {\n transition: transform 0.15s ease;\n }\n\n [_nghost-%COMP%] .intersection-label-group:hover {\n transform: scale(1.05);\n }"] });
659
+ } }, styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .venn-container[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 300px;\n background: linear-gradient(135deg, var(--mj-bg-surface-sunken) 0%, var(--mj-bg-surface-card) 100%);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .venn-svg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n }\n\n .venn-tooltip[_ngcontent-%COMP%] {\n position: absolute;\n background: rgba(0, 0, 0, 0.85);\n color: white;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 13px;\n pointer-events: none;\n opacity: 0;\n transform: translateY(8px);\n transition: opacity 0.15s, transform 0.15s;\n z-index: 100;\n white-space: nowrap;\n }\n\n .venn-tooltip.visible[_ngcontent-%COMP%] {\n opacity: 1;\n transform: translateY(0);\n }\n\n .tooltip-title[_ngcontent-%COMP%] {\n font-weight: 600;\n margin-bottom: 2px;\n }\n\n .tooltip-count[_ngcontent-%COMP%] {\n color: rgba(255, 255, 255, 0.8);\n font-size: 12px;\n }\n\n .venn-legend[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 16px;\n left: 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: var(--mj-bg-surface-card);\n padding: 12px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .legend-color[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n\n .legend-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n }\n\n .legend-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .legend-count[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .empty-state[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n margin: 0;\n }\n\n \n\n [_nghost-%COMP%] .venn-circle {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n [_nghost-%COMP%] .venn-circle:hover {\n opacity: 0.9;\n }\n\n [_nghost-%COMP%] .venn-label {\n font-size: 12px;\n font-weight: 600;\n fill: white;\n text-anchor: middle;\n pointer-events: none;\n }\n\n [_nghost-%COMP%] .intersection-region {\n cursor: pointer;\n transition: all 0.2s;\n }\n\n [_nghost-%COMP%] .intersection-region:hover {\n fill: rgba(0,0,0,0.75);\n }\n\n [_nghost-%COMP%] .intersection-region.selected {\n fill: rgba(156, 39, 176, 0.9);\n stroke: #7B1FA2;\n stroke-width: 2;\n }\n\n [_nghost-%COMP%] .intersection-label-group {\n transition: transform 0.15s ease;\n }\n\n [_nghost-%COMP%] .intersection-label-group:hover {\n transform: scale(1.05);\n }"] });
660
660
  }
661
661
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VennDiagramComponent, [{
662
662
  type: Component,
@@ -694,7 +694,7 @@ export class VennDiagramComponent {
694
694
  </div>
695
695
  }
696
696
  </div>
697
- `, styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .venn-container {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 300px;\n background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .venn-svg {\n width: 100%;\n height: 100%;\n }\n\n .venn-tooltip {\n position: absolute;\n background: rgba(0, 0, 0, 0.85);\n color: white;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 13px;\n pointer-events: none;\n opacity: 0;\n transform: translateY(8px);\n transition: opacity 0.15s, transform 0.15s;\n z-index: 100;\n white-space: nowrap;\n }\n\n .venn-tooltip.visible {\n opacity: 1;\n transform: translateY(0);\n }\n\n .tooltip-title {\n font-weight: 600;\n margin-bottom: 2px;\n }\n\n .tooltip-count {\n color: rgba(255, 255, 255, 0.8);\n font-size: 12px;\n }\n\n .venn-legend {\n position: absolute;\n bottom: 16px;\n left: 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: rgba(255, 255, 255, 0.95);\n padding: 12px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .legend-color {\n width: 16px;\n height: 16px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n\n .legend-info {\n display: flex;\n flex-direction: column;\n }\n\n .legend-name {\n font-size: 13px;\n font-weight: 500;\n color: #333;\n }\n\n .legend-count {\n font-size: 11px;\n color: #999;\n }\n\n .empty-state {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n color: #999;\n }\n\n .empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .empty-state p {\n font-size: 14px;\n margin: 0;\n }\n\n /* SVG styles */\n :host ::ng-deep .venn-circle {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n :host ::ng-deep .venn-circle:hover {\n opacity: 0.9;\n }\n\n :host ::ng-deep .venn-label {\n font-size: 12px;\n font-weight: 600;\n fill: white;\n text-anchor: middle;\n pointer-events: none;\n }\n\n :host ::ng-deep .intersection-region {\n cursor: pointer;\n transition: all 0.2s;\n }\n\n :host ::ng-deep .intersection-region:hover {\n fill: rgba(0,0,0,0.75);\n }\n\n :host ::ng-deep .intersection-region.selected {\n fill: rgba(156, 39, 176, 0.9);\n stroke: #7B1FA2;\n stroke-width: 2;\n }\n\n :host ::ng-deep .intersection-label-group {\n transition: transform 0.15s ease;\n }\n\n :host ::ng-deep .intersection-label-group:hover {\n transform: scale(1.05);\n }\n "] }]
697
+ `, styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .venn-container {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 300px;\n background: linear-gradient(135deg, var(--mj-bg-surface-sunken) 0%, var(--mj-bg-surface-card) 100%);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .venn-svg {\n width: 100%;\n height: 100%;\n }\n\n .venn-tooltip {\n position: absolute;\n background: rgba(0, 0, 0, 0.85);\n color: white;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 13px;\n pointer-events: none;\n opacity: 0;\n transform: translateY(8px);\n transition: opacity 0.15s, transform 0.15s;\n z-index: 100;\n white-space: nowrap;\n }\n\n .venn-tooltip.visible {\n opacity: 1;\n transform: translateY(0);\n }\n\n .tooltip-title {\n font-weight: 600;\n margin-bottom: 2px;\n }\n\n .tooltip-count {\n color: rgba(255, 255, 255, 0.8);\n font-size: 12px;\n }\n\n .venn-legend {\n position: absolute;\n bottom: 16px;\n left: 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: var(--mj-bg-surface-card);\n padding: 12px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .legend-color {\n width: 16px;\n height: 16px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n\n .legend-info {\n display: flex;\n flex-direction: column;\n }\n\n .legend-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .legend-count {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .empty-state {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .empty-state p {\n font-size: 14px;\n margin: 0;\n }\n\n /* SVG styles */\n :host ::ng-deep .venn-circle {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n :host ::ng-deep .venn-circle:hover {\n opacity: 0.9;\n }\n\n :host ::ng-deep .venn-label {\n font-size: 12px;\n font-weight: 600;\n fill: white;\n text-anchor: middle;\n pointer-events: none;\n }\n\n :host ::ng-deep .intersection-region {\n cursor: pointer;\n transition: all 0.2s;\n }\n\n :host ::ng-deep .intersection-region:hover {\n fill: rgba(0,0,0,0.75);\n }\n\n :host ::ng-deep .intersection-region.selected {\n fill: rgba(156, 39, 176, 0.9);\n stroke: #7B1FA2;\n stroke-width: 2;\n }\n\n :host ::ng-deep .intersection-label-group {\n transition: transform 0.15s ease;\n }\n\n :host ::ng-deep .intersection-label-group:hover {\n transform: scale(1.05);\n }\n "] }]
698
698
  }], () => [{ type: i0.ChangeDetectorRef }], { containerRef: [{
699
699
  type: ViewChild,
700
700
  args: ['vennContainer']