From 86f70d9acfe1a61aad3b5ff301606476423147d2 Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Tue, 15 Apr 2025 10:06:49 +0000 Subject: [PATCH 01/25] New React UI for ProductivitySuite which contains ChatQnA, Odcument Summarize and Code Generation Signed-off-by: Gurunath S --- ProductivitySuite/assets/img/Login_page.png | Bin 108466 -> 96993 bytes .../assets/img/chat_qna_init.png | Bin 46481 -> 78827 bytes .../assets/img/chatqna_with_conversation.png | Bin 138453 -> 41293 bytes ProductivitySuite/assets/img/codegen.png | Bin 98394 -> 50679 bytes ProductivitySuite/assets/img/data_source.png | Bin 51658 -> 36596 bytes ProductivitySuite/assets/img/doc_summary.png | Bin 0 -> 96936 bytes ProductivitySuite/ui/react/README.md | 72 +- ProductivitySuite/ui/react/index.html | 28 +- ProductivitySuite/ui/react/package.json | 111 ++- ProductivitySuite/ui/react/postcss.config.cjs | 14 - ProductivitySuite/ui/react/public/favicon.ico | Bin 0 -> 22382 bytes ProductivitySuite/ui/react/public/logo192.png | Bin 0 -> 8581 bytes ProductivitySuite/ui/react/public/logo512.png | Bin 0 -> 22920 bytes .../ui/react/public/manifest.json | 25 + .../ui/react/public/model_configs.json | 15 + ProductivitySuite/ui/react/public/robots.txt | 2 + ProductivitySuite/ui/react/src/App.scss | 43 +- ProductivitySuite/ui/react/src/App.tsx | 172 +++-- .../ui/react/src/__tests__/util.test.ts | 14 - .../ui/react/src/assets/icons/moon.svg | 1 + .../ui/react/src/assets/icons/sun.svg | 4 + .../ui/react/src/assets/opea-icon-black.svg | 39 - .../ui/react/src/assets/opea-icon-color.svg | 40 - .../ui/react/src/assets/react.svg | 1 - .../ui/react/src/common/client.ts | 8 - ProductivitySuite/ui/react/src/common/util.ts | 12 - .../Chat_Assistant/ChatAssistant.module.scss | 70 ++ .../Chat_Assistant/ChatAssistant.tsx | 213 +++++ .../components/Chat_Markdown/ChatMarkdown.tsx | 75 ++ .../Chat_Markdown/CodeRender/CodeRender.tsx | 72 ++ .../CodeRender/codeRender.module.scss | 36 + .../Chat_Markdown/markdown.module.scss | 30 + .../ChatSettingsModal.module.scss | 0 .../Chat_SettingsModal/ChatSettingsModal.tsx | 38 + .../Chat_Sources/ChatSources.module.scss | 47 ++ .../components/Chat_Sources/ChatSources.tsx | 31 + .../components/Chat_User/ChatUser.module.scss | 27 + .../src/components/Chat_User/ChatUser.tsx | 45 ++ .../react/src/components/CodeGen/CodeGen.tsx | 140 ---- .../components/CodeGen/codeGen.module.scss | 59 -- .../components/Conversation/Conversation.tsx | 197 ----- .../Conversation/ConversationSideBar.tsx | 66 -- .../components/Conversation/DataSource.tsx | 93 --- .../Conversation/PromptTemplate.tsx | 31 - .../Conversation/conversation.module.scss | 78 -- .../Conversation/dataSource.module.scss | 11 - .../Conversation/promptTemplate.module.scss | 14 - .../src/components/Conversation/settings.tsx | 48 -- .../src/components/Data_Web/DataWebInput.tsx | 66 ++ .../ui/react/src/components/DocSum/DocSum.tsx | 153 ---- .../src/components/DocSum/FileUpload.tsx | 79 -- .../src/components/DocSum/docSum.module.scss | 44 -- .../components/DropDown/DropDown.module.scss | 69 ++ .../src/components/DropDown/DropDown.tsx | 94 +++ .../ui/react/src/components/FaqGen/FaqGen.tsx | 167 ---- .../src/components/FaqGen/FileUpload.tsx | 79 -- .../src/components/FaqGen/faqGen.module.scss | 45 -- .../File_Display/FileDisplay.module.scss | 44 ++ .../components/File_Display/FileDisplay.tsx | 55 ++ .../File_Input/FileInput.module.scss | 75 ++ .../src/components/File_Input/FileInput.tsx | 332 ++++++++ .../src/components/Header/Header.module.scss | 142 ++++ .../ui/react/src/components/Header/Header.tsx | 185 +++++ .../Header_DownloadChat/DownloadChat.tsx | 66 ++ .../ThemeToggle.module.scss | 72 ++ .../Header_ThemeToggle/ThemeToggle.tsx | 36 + .../Message/conversationMessage.module.scss | 15 - .../Message/conversationMessage.tsx | 62 -- .../components/Notification/Notification.tsx | 132 ++++ .../PrimaryInput/PrimaryInput.module.scss | 46 ++ .../components/PrimaryInput/PrimaryInput.tsx | 168 ++++ .../PrimaryInput_AudioInput/AudioInput.tsx | 79 ++ .../PromptSelector.module.scss | 89 +++ .../PromptSelector.tsx | 92 +++ .../components/ProgressIcon/ProgressIcon.tsx | 13 + .../PromptSettings/PromptSettings.module.scss | 92 +++ .../PromptSettings/PromptSettings.tsx | 179 +++++ .../PromptSettings_Slider/Slider.module.scss | 90 +++ .../PromptSettings_Slider/Slider.tsx | 46 ++ .../TokensInput.module.scss | 40 + .../PromptSettings_Tokens/TokensInput.tsx | 58 ++ .../SearchInput/SearchInput.module.scss | 18 + .../components/SearchInput/SearchInput.tsx | 58 ++ .../Shared/CodeRender/CodeRender.tsx | 52 -- .../Shared/CodeRender/codeRender.module.scss | 23 - .../components/Shared/Markdown/Markdown.tsx | 62 -- .../Shared/Markdown/markdown.module.scss | 14 - .../components/SideBar/SideBar.module.scss | 119 +++ .../react/src/components/SideBar/SideBar.tsx | 196 +++++ .../SideBar_UploadChat/UploadChat.tsx | 125 +++ .../Summary_WebInput/WebInput.module.scss | 19 + .../components/Summary_WebInput/WebInput.tsx | 108 +++ .../components/sidebar/sidebar.module.scss | 87 --- .../react/src/components/sidebar/sidebar.tsx | 87 --- ProductivitySuite/ui/react/src/config.ts | 20 +- .../ui/react/src/contexts/ThemeContext.tsx | 39 + ProductivitySuite/ui/react/src/icons/Atom.tsx | 63 ++ .../ui/react/src/icons/ChatBubble.tsx | 24 + .../ui/react/src/icons/Database.tsx | 21 + .../ui/react/src/icons/Recent.tsx | 21 + .../ui/react/src/icons/Waiting.tsx | 23 + ProductivitySuite/ui/react/src/index.scss | 66 +- ProductivitySuite/ui/react/src/index.tsx | 23 + ProductivitySuite/ui/react/src/keycloack.ts | 12 - ProductivitySuite/ui/react/src/keycloak.ts | 14 + .../src/layouts/Main/MainLayout.module.scss | 21 + .../ui/react/src/layouts/Main/MainLayout.tsx | 30 + .../layouts/Minimal/MinimalLayout.module.scss | 10 + .../src/layouts/Minimal/MinimalLayout.tsx | 13 + .../layouts/ProtectedRoute/ProtectedRoute.tsx | 29 + ProductivitySuite/ui/react/src/logo.svg | 1 + ProductivitySuite/ui/react/src/main.tsx | 22 - .../react/src/pages/Chat/ChatView.module.scss | 41 + .../ui/react/src/pages/Chat/ChatView.tsx | 353 +++++++++ .../DataSourceManagement.module.scss | 75 ++ .../pages/DataSource/DataSourceManagement.tsx | 202 +++++ .../src/pages/History/HistoryView.module.scss | 90 +++ .../react/src/pages/History/HistoryView.tsx | 181 +++++ .../ui/react/src/pages/Home/Home.module.scss | 40 + .../ui/react/src/pages/Home/Home.tsx | 94 +++ .../src/redux/Conversation/Conversation.ts | 71 +- .../redux/Conversation/ConversationSlice.ts | 731 +++++++++++++++--- .../ui/react/src/redux/Prompt/PromptSlice.ts | 61 +- .../ui/react/src/redux/User/user.d.ts | 5 +- .../ui/react/src/redux/User/userSlice.ts | 15 +- ProductivitySuite/ui/react/src/redux/store.ts | 9 +- .../ui/react/src/redux/thunkUtil.ts | 3 - .../ui/react/src/shared/ActionButtons.tsx | 45 ++ .../src/shared/ModalBox/Modal.module.scss | 50 ++ .../ui/react/src/shared/ModalBox/ModalBox.tsx | 24 + .../react/src/styles/components/_sidebar.scss | 8 - .../react/src/styles/components/content.scss | 5 - .../src/styles/components/context.module.scss | 88 --- .../ui/react/src/styles/layout/_basics.scss | 7 - .../ui/react/src/styles/layout/_flex.scss | 6 - .../ui/react/src/styles/styles.scss | 5 - .../ui/react/src/theme/theme.tsx | 457 +++++++++++ .../ui/react/src/types/common.ts | 11 + .../ui/react/src/types/conversation.ts | 58 ++ .../ui/react/src/types/global.d.ts | 4 + .../ui/react/src/types/speech.d.ts | 16 + .../ui/react/src/types/styles.d.ts | 4 + .../ui/react/src/types/theme.d.ts | 45 ++ ProductivitySuite/ui/react/src/utils/utils.js | 88 +++ ProductivitySuite/ui/react/src/vite-env.d.ts | 4 +- ProductivitySuite/ui/react/tsconfig.json | 47 +- ProductivitySuite/ui/react/vite.config.js | 115 +++ ProductivitySuite/ui/react/vite.config.ts | 27 - 148 files changed, 7151 insertions(+), 2380 deletions(-) create mode 100644 ProductivitySuite/assets/img/doc_summary.png delete mode 100644 ProductivitySuite/ui/react/postcss.config.cjs create mode 100644 ProductivitySuite/ui/react/public/favicon.ico create mode 100644 ProductivitySuite/ui/react/public/logo192.png create mode 100644 ProductivitySuite/ui/react/public/logo512.png create mode 100644 ProductivitySuite/ui/react/public/manifest.json create mode 100644 ProductivitySuite/ui/react/public/model_configs.json create mode 100644 ProductivitySuite/ui/react/public/robots.txt delete mode 100644 ProductivitySuite/ui/react/src/__tests__/util.test.ts create mode 100644 ProductivitySuite/ui/react/src/assets/icons/moon.svg create mode 100644 ProductivitySuite/ui/react/src/assets/icons/sun.svg delete mode 100644 ProductivitySuite/ui/react/src/assets/opea-icon-black.svg delete mode 100644 ProductivitySuite/ui/react/src/assets/opea-icon-color.svg delete mode 100644 ProductivitySuite/ui/react/src/assets/react.svg delete mode 100644 ProductivitySuite/ui/react/src/common/client.ts delete mode 100644 ProductivitySuite/ui/react/src/common/util.ts create mode 100644 ProductivitySuite/ui/react/src/components/Chat_Assistant/ChatAssistant.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/Chat_Assistant/ChatAssistant.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Chat_Markdown/ChatMarkdown.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/CodeRender.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/codeRender.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/Chat_Markdown/markdown.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/CodeGen/CodeGen.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/CodeGen/codeGen.module.scss delete mode 100644 ProductivitySuite/ui/react/src/components/Conversation/Conversation.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/Conversation/ConversationSideBar.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/Conversation/DataSource.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/Conversation/PromptTemplate.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/Conversation/conversation.module.scss delete mode 100644 ProductivitySuite/ui/react/src/components/Conversation/dataSource.module.scss delete mode 100644 ProductivitySuite/ui/react/src/components/Conversation/promptTemplate.module.scss delete mode 100644 ProductivitySuite/ui/react/src/components/Conversation/settings.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Data_Web/DataWebInput.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/DocSum/DocSum.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/DocSum/FileUpload.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/DocSum/docSum.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/DropDown/DropDown.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/DropDown/DropDown.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/FaqGen/FaqGen.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/FaqGen/FileUpload.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/FaqGen/faqGen.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/File_Display/FileDisplay.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/File_Display/FileDisplay.tsx create mode 100644 ProductivitySuite/ui/react/src/components/File_Input/FileInput.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/File_Input/FileInput.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Header/Header.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/Header/Header.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Header_DownloadChat/DownloadChat.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Header_ThemeToggle/ThemeToggle.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/Header_ThemeToggle/ThemeToggle.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/Message/conversationMessage.module.scss delete mode 100644 ProductivitySuite/ui/react/src/components/Message/conversationMessage.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Notification/Notification.tsx create mode 100644 ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.tsx create mode 100644 ProductivitySuite/ui/react/src/components/PrimaryInput_AudioInput/AudioInput.tsx create mode 100644 ProductivitySuite/ui/react/src/components/PrimparyInput_PromptSelector/PromptSelector.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/PrimparyInput_PromptSelector/PromptSelector.tsx create mode 100644 ProductivitySuite/ui/react/src/components/ProgressIcon/ProgressIcon.tsx create mode 100644 ProductivitySuite/ui/react/src/components/PromptSettings/PromptSettings.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/PromptSettings/PromptSettings.tsx create mode 100644 ProductivitySuite/ui/react/src/components/PromptSettings_Slider/Slider.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/PromptSettings_Slider/Slider.tsx create mode 100644 ProductivitySuite/ui/react/src/components/PromptSettings_Tokens/TokensInput.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/PromptSettings_Tokens/TokensInput.tsx create mode 100644 ProductivitySuite/ui/react/src/components/SearchInput/SearchInput.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/SearchInput/SearchInput.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/Shared/CodeRender/CodeRender.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/Shared/CodeRender/codeRender.module.scss delete mode 100644 ProductivitySuite/ui/react/src/components/Shared/Markdown/Markdown.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/Shared/Markdown/markdown.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/SideBar/SideBar.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/SideBar/SideBar.tsx create mode 100644 ProductivitySuite/ui/react/src/components/SideBar_UploadChat/UploadChat.tsx create mode 100644 ProductivitySuite/ui/react/src/components/Summary_WebInput/WebInput.module.scss create mode 100644 ProductivitySuite/ui/react/src/components/Summary_WebInput/WebInput.tsx delete mode 100644 ProductivitySuite/ui/react/src/components/sidebar/sidebar.module.scss delete mode 100644 ProductivitySuite/ui/react/src/components/sidebar/sidebar.tsx create mode 100644 ProductivitySuite/ui/react/src/contexts/ThemeContext.tsx create mode 100644 ProductivitySuite/ui/react/src/icons/Atom.tsx create mode 100644 ProductivitySuite/ui/react/src/icons/ChatBubble.tsx create mode 100644 ProductivitySuite/ui/react/src/icons/Database.tsx create mode 100644 ProductivitySuite/ui/react/src/icons/Recent.tsx create mode 100644 ProductivitySuite/ui/react/src/icons/Waiting.tsx create mode 100644 ProductivitySuite/ui/react/src/index.tsx delete mode 100644 ProductivitySuite/ui/react/src/keycloack.ts create mode 100644 ProductivitySuite/ui/react/src/keycloak.ts create mode 100644 ProductivitySuite/ui/react/src/layouts/Main/MainLayout.module.scss create mode 100644 ProductivitySuite/ui/react/src/layouts/Main/MainLayout.tsx create mode 100644 ProductivitySuite/ui/react/src/layouts/Minimal/MinimalLayout.module.scss create mode 100644 ProductivitySuite/ui/react/src/layouts/Minimal/MinimalLayout.tsx create mode 100644 ProductivitySuite/ui/react/src/layouts/ProtectedRoute/ProtectedRoute.tsx create mode 100644 ProductivitySuite/ui/react/src/logo.svg delete mode 100644 ProductivitySuite/ui/react/src/main.tsx create mode 100644 ProductivitySuite/ui/react/src/pages/Chat/ChatView.module.scss create mode 100644 ProductivitySuite/ui/react/src/pages/Chat/ChatView.tsx create mode 100644 ProductivitySuite/ui/react/src/pages/DataSource/DataSourceManagement.module.scss create mode 100644 ProductivitySuite/ui/react/src/pages/DataSource/DataSourceManagement.tsx create mode 100644 ProductivitySuite/ui/react/src/pages/History/HistoryView.module.scss create mode 100644 ProductivitySuite/ui/react/src/pages/History/HistoryView.tsx create mode 100644 ProductivitySuite/ui/react/src/pages/Home/Home.module.scss create mode 100644 ProductivitySuite/ui/react/src/pages/Home/Home.tsx create mode 100644 ProductivitySuite/ui/react/src/shared/ActionButtons.tsx create mode 100644 ProductivitySuite/ui/react/src/shared/ModalBox/Modal.module.scss create mode 100644 ProductivitySuite/ui/react/src/shared/ModalBox/ModalBox.tsx delete mode 100644 ProductivitySuite/ui/react/src/styles/components/_sidebar.scss delete mode 100644 ProductivitySuite/ui/react/src/styles/components/content.scss delete mode 100644 ProductivitySuite/ui/react/src/styles/components/context.module.scss delete mode 100644 ProductivitySuite/ui/react/src/styles/layout/_basics.scss delete mode 100644 ProductivitySuite/ui/react/src/styles/layout/_flex.scss delete mode 100644 ProductivitySuite/ui/react/src/styles/styles.scss create mode 100644 ProductivitySuite/ui/react/src/theme/theme.tsx create mode 100644 ProductivitySuite/ui/react/src/types/common.ts create mode 100644 ProductivitySuite/ui/react/src/types/conversation.ts create mode 100644 ProductivitySuite/ui/react/src/types/global.d.ts create mode 100644 ProductivitySuite/ui/react/src/types/speech.d.ts create mode 100644 ProductivitySuite/ui/react/src/types/styles.d.ts create mode 100644 ProductivitySuite/ui/react/src/types/theme.d.ts create mode 100644 ProductivitySuite/ui/react/src/utils/utils.js create mode 100644 ProductivitySuite/ui/react/vite.config.js delete mode 100644 ProductivitySuite/ui/react/vite.config.ts diff --git a/ProductivitySuite/assets/img/Login_page.png b/ProductivitySuite/assets/img/Login_page.png index 0c325e5f2e71388b05d7e025f523fb5843cf62f1..7d56b16728edb56d035482e7d686d320e2020416 100644 GIT binary patch literal 96993 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

?U6sK~c##>rj;#&k)U7#?zF4ye8ijJ;4a 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 literal 108466 zcmYJadpOhYA3si#cL|ll6gHiR%Aw>qLnY@kNjZedDaVoHEUDx;g~*vX%a$bOEHMdl zo*2upvE^)L8}sw|{=UEKx9i#;_v^Z^>-l(|?&slt-tm^^1_CF}o#5i)5->8nYt6;Q z2j$}8q5gO5@Jl>1hKo2gidib9I+=5}OkhMW-3{p+v!Pny>5bq1K7H^;oXJr8=9klayX zol|?}dCusI791sa-{}5}oi6{i{m2JC`?KikYL5cg;2)2J2^MNCLNk)`x_PyUR={(J z^Z)*&<*<@u&Xx{(cH7|p`^LqkyKk;O_qwyj-5+~j5E>Fj3nIc8Zw|KL99$oO{yx^} z|KIu`SI{?vQ-$!E_^h!x{B+ln@mg!GWvd|MW#n2bQc+O#F|Yl2-ToAmhP}yBxg)5yT)~*FK$S_mU76eOpl5 zID}+fTf_uTt=mp3p;w(W=Sg2fK)aT^wgDCN$j>T6snQG~E7q{;8k?*qF9y;a`z`iWDPfyivIo+)5{yKHZZ#DX zDwt=-!NzQzlhKh1yUdQ`+zwSm-! z8FjxL4Bza8LDh$9uG)Ln47MB>H`~9^4e*mQ=#H!38H$6b>`~Di@5!%EO~N{OfB_4U z=DRF>I|m0pWTGkPNbV5R2z|8N8!uouCHtzNG=w^yiTa{8#=t z#j&WMosu7!b(71zMDw1UPO@gdX!0LiZSNR6wTVjXK{(wm5Y< z?7H>8d^%x^*R$H!*lmiRhuhO~j#zvUd0}+c&?;sB z#G>UtFYpuBcZ4usy??i(vSPO@^RhDCof9Ow5zcuF_E%1ubjagqIZMJ3jy(<~h8xZ- z^$su~>l%akH5fK#P~2+8!&nH&vaQ+UuE02rsbLmLIDm$?)l30u{`_iFw;VFIqXs~&P=CT zS#g}k(^STJ&uR&HcrcD9GTIottydbhx*Y9fa;_UX2f^Z%Z&RLE#j<_p}ec?fdB%SI~qfway#BQYZ`jeC_)6nuSQxv8+5+((htwgk+&W zX}6Cb^kJcI>5A9Pi)r5(DYE?Bk`nLoU)|6fA<@TvZ3JbBEHlHu+F0K(_!P8cb0rO0 zdLos7LM-bICDt%@>J?L?XQSnATtl>|LhX@j_h1z%(F=P53&p6(wQN)jMp(%~0aikV z?)}de`~;zYo*N1CVMdi7q?EA?Tg|uk(nHhXo;oGw%El-?dy&Y#3|&ERTiy38ivr4l zhSbtWg1I*znKDnuIFIRMOw;8ZVNd){j+yLxy$`h1u_!o7R`Umq;KCe_Dm{$f>On`- zt5-l|@1mY({6S@RJ8o}2s7g$y-B~GZCp{~Ubu5`Jw^Ud(5)69Jzi0$H%DrXzuLPpA zAPs;av)&Q!o$Yn#(;)Z^hC{#fSnNDVMe36vyc+#3F{nz!!U(P!f?I>FMXmtJ@_zzS za}=CEX-UYS3`#Xmk3fTFe_f8@Nw5pzZ~8lV(M2^5a~}rosT)S<*PfpcK$nU`rKxe6 zE!t7LN0J~09$jy8^UhiT!~ z#kR#f3I8(of<&k6=@b?U7~jm?SBG-ML>m$Pk}{4V>dhQF_Nl$Gku zA*JY_4=Q}HNbE33OXs&qMxUARf;r!$=WR6z2G-xdcG8NA%!2Vt8PJN;#(v2WkIbG!0gF@)I>-6b-1)Zf`%K~slT3# zRA1!c@-^JhZAfn^ig?<;EJX2bO}+tt$5VptYw8G>)QudIWxA_BZh~y5-4le`c}Z3* zB%1YfZ+it*x8>jdFb1{!@hm9T5u>Y};y(*zsApkbLs{fV!1H`J_ zp=5eTzuj8?hUUQ-Ykb#^JEG(O>ZzC#g4($rirjY~`9qm02 z*cYsjVK6<$Db6%kRJ0r)rbC_{_ksNijsAVtXi)FCF;3Jl&CQ%y_ghlXbY7je>BC5j z9}51wnl&GQHuZia^>^>;x1rP-M$xdcQ9M*>`I!D65(~FFwlQFp%1VkN3FQ zB8*2`icem)JSmJll<+07H#2VexAKFEd%~RGC#GNVc+omBaNR#_a1f|>b}VITYtA=4 zhGVH?Ph_+tMI#_qEum+(sFD3eFTI;q(Y_CNmFz{k3!Qb z@VlqqjFho@3f7B(`QpApTl-Xz%;!~h^KJc-vi=F7|3@+%Zb3kw3@qJ1@?hKIKxDOz zy?PPdhtE&K>IZ3CD$?cX$~{hxn?6iP+M(Qwx*Ye92#`(^bZ=3wUOw5=l=7Y38eIT5 zseAmvZn1BI21oo@rCY9nU`t@~FI$6tsMx68j0OPul7IVAF8{U_--xrx6}2TxdzVq} zHK))S(bbl%!3+c|YOF|cUN)#C+L96GxTw6Ws2gIoJ(@lM%c?deNjEs|Wkf^AJc2;! z)8^?_imJkvXBb7Q?9(i>+A>Mw{`2|?CcZn$gBSUn{Jt!HxwloOJ#XgRGP^l_g=eXJ z&an_TeS3(2H71i@{d}l=}1~_bfTm4m5)|hUi*F)k#E4AWezJX*(mO-?+?kU zjI*VstU!K}u6QN)nA-pJy^ye?vdovv1563UtAW z_{f#~R^4M$f0NIYywRBO zh9s#83=6mgLi(zIu37<_ij96Y{I`J@&j^ zK&(w~7ZtOO(cqKH4M(fCCM~nQ!k?8L#_-f*cev=kt~0+W#|+Q=oIxH*FH43T&FTSg zt{juIHuZMWdw#*g*T1PWVjZPv=`>V8vk7&oN)F~K{&9|fNo|n_l#ud!rb!VJlP)7 zlKZiazCRlD7Id>=4^3GK^qH!L#RRlRev9Xg8T{*{&Dy_razy<5s&$P;G9TKf@>`wpr+z-C zb~k%C27GA2MCGCXwHZaK>L`qP=lk>M?Rj4{FJMRDIF+c|iijUv)D+EDmJ z4GSh;$8nT%q*VFfBcqmR_N*TC4xNEXe&#D1?2!+-kunX`y#@4Vd6QgGACB{3blKK< zNAVi2%G$s*z_wlipusb9vr;uUzG0ib$YoZ$WUsymi82mSEx4`rqT0vY>{|FI%sIeq4Z0&S4+E2Hkn1?52z|Np3i_ zsv`gYW9I+kA0pu%QfJ#>M+@DJ40*Kj&9i`q^>f~&AaDI+L(5|0=lK$$cWyDArCQnB zv=vk{+33l5e4k20i@w-7T?LVOQ}r)bx~&}V%}_{DHMMu1u1wWSuF9DD-j{dEaeE)4 zKSkP$i3sD&j!8O)w^i?Kig&e?X&_lhsNB9t?`TDI>wh}VdCW;B>FhhMPu$FX8$ELkuSge2N1_5JnC+|kBHH&euw!faw`9Y?k`2nq+Z8ngXJ?%r zM!4Ud98?1BnI!!>LlL&H$D5Vhb0q_k_3bT~tdx28l~t8Fb*Kd;(~%ORzZDBASNsK# zhVLMzrk?IXiTDLalZ`SS6$#+YZH(ALnoOK$=6vy`CYi&WML8E~30fq`Y}QOwt#C?- zzrbw{-ZrA+A>fZZy~GRipW&*5r$cP~&^J)K;r%R06<`nVVn9w0J0qX*b7cilnt%=w zVYrJXZ}gYHq!Rp}Nks@c@+ip zZTJ*zAw}bsT->o~Wg(Z4J^8bhM8U}rz55a z-O%DNKNYY=pYpvZSQjBvfB%#Ai^r-|wR{Oi%w}(6=(yJ0fPeIs4z%NyS9U(wO?6|T zTp&@#tXnWmbUT^kwEwoz!h`^9TEXor&*t{}5+pKx%CEoHF57(!Sds9nb6nO`?;Su) z{pKAA$gjDH?U}b5Z4r~cN2cspe;RwyS9Ak6Rc#z)_et244XoVM=1K`VK>r9YPHv$Q zORdL06LtFCFN7bR54)By|I;c$-9_Z8;AK{b0L%V zO8>0P)|2E1Msb=i@+5B0R}9p@%kubIR4|UKWyV6X8;Flz1V(T8!nRk!_T({UBGBvw z!JMao)q(o@!dQoB!NhoXb^E4chw3j;h3Y}Up=cit5aDY!GWo+XT6NXJ4_O68gdx2@ z7MQ#z!KT2)ePE<9+_mkMq`G3#JX(ur&YIPf!!3ml-qx`(h~8{81ogCtXej^{_l6nR zw>tiP>ywL+n);E?`vOZ^Xnhtrn$b-BJ5g&M)+I69QFYR$JI%P{V*VGE?liW;^sMqI z_BDT4jLBf`OoiqajI}f!xIa<*DOGFyjcN>byc^7KpRA}kCdB~6R3O|n>=U%wvrmS* z^?S!rRzv!U)1Ei?Q`+_~?}5QP)cKZ`;#+AT>;r@GJNtf9;EFzQW#7DE#+sgv03*<< z&GKvpPd1sTaSXbHk#kQ z;Ql&#!oSlI%YF2o1pY;(&A-6ZoObntVu!xUkOiB1`!x4bU~^*Eo3YASCq_tp4A8)R z_sZw;J`!{CTew38+T#D%il;@cVy@1!8K25D_`zqAT4Q)umYW)EpYPIJjav2!}DALYwyPo^|+tv{rXQ6&3A@c!p>On)i(gnjV?t#V@4O= zP1w(6cQjIJ*iM&#{J|14))Ka#79s*2_z-FwpH59sGrFwa#dzB>gJx^_RvnF$8bl`c z&*XSEKp6f`k&aVKfGUa?R4(W`tI$~C^9|x>cb$^>@ETUQJh~qm{b&JmjkT2)7WD)c zL(oXc$v5G;Or=HqOxL+L;PpRD=c2~q#b1w*|GmaPn#hP79pBkcxO#>XTq1 z0sU^Y-JD@j?N-CPU<8}lS9^o0Ex;8sEp&*%Ks#7BZ|{4`{RCHZh7|7SEv0O>S%I9+ zu96xMN(*NKBVuD@ghEU|)9Xf~on7!UcZtH+3OV0B`z|oZ?4M5Bs8} zl8`8M0*ou)*K$yj?Rc={5=Q-=XzWktkV;(bSc;zw7d;SIQ0_ne zNv*}p`u5<&tw!g0rVUt!%F?8RpDFKUGPy>|!N@igqOyN07X&D!d9kv$!P=0CjocW8 zM)Z}pw+_~wQ^=R{5vPb9R$Hh<<9R}1(>uI^B-u^I*L2cSC^RB;$H9#4a9P+4V)&(F zi9=%F6BX*&IEIv^OAfh-rBseBX~;P{RDA4Q`IRN4atGG$&i+h&kh2IzuTPRRw+Zq< zxOKCtc6s<0LB7qxsQG$l<6K$jJSC5&&U+GSiro@L*S`zgmfC-uL3JGi_D}gve{YQr zkf?Yqm;tEAgX7kX#k!8)0WYujfGxAbNmKimS3#_b7(73-aR~xPzz2CN`ZiQ82;VU0 z|527HRN_EcFmUYI)Z;AKL9YIC@8~hc^(nQC9BtWOF=%_xe#?Bg9Tj7Y3!H62AzQgs zeq-cTtEtUSxJY_bQ1AP+T}-)Ufv#P`wAcRN{wU@mC)!O4_O%y`5gFv2(t2@VZ@&I8 z4t^7G(?-cm;$3RK184t-y3x<5_7g*;;Xy+c1!vnV3M^P{fi6gwLjJztt(0F*iYNBh zc$vg^Pu@3q=YN0xAzz3OvtOwCLa!lRC_^F-R6hJb$-jA-qLOkF$Fw2&j2gK3^x;CY z_3qfaqPy;2t3qjQGhbkqz)QqX4y4DY%1&@pQFFG3NJc=a8Xh*k3L>-b!D@_H zux){0J!OE!_OpyWH_Q1CLNC~Dy1rU)vtrE4!v=~_f;J!+2i>VU^o=PqowTXFZv5PX zV7aF&m?b@wGUez9vaO~~qY7dFYtbwS=zAekmELF<_W2*1#qDKtAf74lY%UDn^hep^ zAM#QNJ%bRI1PocB&UfwS9{Oy5T76px%3A%j>ACF;UE6*meUQ~h2lmGQh4_@fpcvyv zDDA*IY9gUsn27snJuwPP%%5>hmD=s!OHx4@IQ8BY0AfJyC+NN$pFGH1>!@YUz)ijl z@sX!F>`?Z(?cq|D5Ok^7*#qt|6Ad3nh?%Q-HDT0taL671Y5LhB%d99r#wr&?{U@6c zf;+8kaf$Q3xoxFdUM=jTROk${M^zB2TxTR~x6t|P@z`UKg-Y%N&o#e+hYVz!3nRH1 zo*qa<%vU1D=*IkoRhlHfG4a$B*NxdM)qW@PnSDR37)#%G?N#sul?EIQIZ>!J%3?IaGQVH3Q2Df$hix7-04lP-J<|me_;Rw>)Ujc0 zOSqWauxl$3*Sum;!|om#^v-q7)I%A*iA}tbl>JZh(@&5WZTVRZ(u%moe%r3PT05?~ zl+QZO2l7k{dPPF@{q)Zs14KAyu~tf0UzDUWw{q@#IG)$>h675v!vn(3``3NXV~3CW zu3+&7Xjw;AS!MlA=DDR5==8T+%tpeDn0C7i^bPI&8^Y?wS0Nhj!X4NhSinP6MIt3> zm4BOWK^MCCon@FAoLrakyKC#eL&0UL@?B85n*T520_swgs$b9u@r?sO9N9)>2*7;_ z?xPlc<?yc2nlW z@@Qwqo(gBCX@z3LSo>vV!-u&o#WQ0`v{9%TX}~V7s9w=g2dVvPmlXxxG;z8rtvCp9 z+CGhwn&;@Y>w1r=Ri#v7M(UR}DSxzp`33=5iI}jj_k#>*!UAM@^J^heXZqbIvd%H~ zo8Y@Xby13zZ%Fsj1Vsz44~~Z{))2&kfpsLfOT#5!gaHfYl)^TQC3Wz6S);bz628dO zZon*@a^g8otR>>gE9BH<%TvJ<-%P^I_ff`eTe)r8F(TXZV$F<<9wMay~~FDp%?3ViL22lD>U9 zSa1Kr_=fvwAiznisO>Dn;!vwWhYp7X!}p82dSvRU1`t>B#8y6L`Y4y=-V9+9Jg7D#PyAiMh7w7;W#kLXKdD8J+NjcnqMY&?toki2R$jMrX%m)PdfSfUxom%R{k&XZqR zEt`7R{e2Irw6yeM;t{I1%6KBxIOOP|orK!4*S@Wd&oh-Xv|1tW@JH<6fcuq$QLKz;{E zDbuh7>w+(H52$1xllRmio>KbdQV0_N&jhLi~hw&9%B0 zDwO_AN9k=HMVDsxB!Qsw(rQA+^1!6|m`Rr{eDVw4s=x#8sT;XyE_0Y7y=VoWPg?>XTFu;6_vE)+`M{TX%>pLe{k-4?hqVcsF^2ZK1LMNxj z5m53@i$2nTd>!gz`)-ZeYH(~&dTOk8zNb?u!go#y0Cn%oQk50;p94Vfe3mFUAdn1j@vvC#SPIVeR!+aKLvJJp!78>%#oy*;^Y zl$hq4YujT+-f!h1-vQmudDp=5bR65Q=n{ZkgPpFTjohL|a4-B0@6+F(f<_+{_05D5 zrT*8=4Zu5vN;&W?MGk`zmz_qYa_Jgh#Od=QtgX-6QBF;%?i?#8uiPh}k3K_kioul_ zkEkyuF1JNBQff)ccQ#f-?gI|1q1z9X$~upC$1Z;>A+33&@`@coc$C|aGf|#3Q7@=? z+eAWQ-sfm4AN>(v@sg5d~snar56oc^YK&%U!78pD)>%j3vd2HMXa zt8P5_y&Er+(G-e`7DiXnhqo@UMDAHRE{I4(pb|W=;duA!H(}Ra#}fR)hsIuY@sPj0 zR`)G7&N(t(A!J7L*L8Z=@T}5LTSM_FH`T|QJ5`JlEQ%W#x4%`+Xqk&&T5OVrfG!K-=O&x12&zOl(N+g9MpvFUR|!k=&56P6Zf$LR>CM zx3-${@4>3EqsL*=c>bEmbh+TaCnNz7%=rx;E-*fA=jh9A^|gkl1o2@$6wQiH)))W# zg8SF}YVvU>1@%-}@+*4Ks-=~J)yAHazJwFx3%x9J)t*Slop0)OGn}xh@vSu(@*&>35kM*wu8g+eW$y&LKYEo_J4Yy zOiie99^%ciHBeZ6h_}qgFdNQ-YH^6F|YS$M{hJ}2@DZosb9$6)8u0r?S- zi0Dei4=)K7{+J4QWmxnoX+X~T>9kNvtZnT*J{cSHd=LMp*{bY3?4_Pe7RImAr7)Um z)7PGTwY;tEp7t0@uAwGBhlHawi4;^92*+U_h$sGJX~h4`xyyWj^cERWJ+ea)nvvL!kt$d-e5YEUk9gAl>75cw~zn4`A%YV{{sTli25dZt~*${e23?b}vVZsB+8fk=h zcm6r5t;&a4y4l^9zN6$~YRav90jEMAf zku>Q)|8l1S=fwdYaLd4yVct2mQ&{FS?Wg1XTL*3LPCdU6W3hA3Nk^?2cL~34;C~+F zGV~!O{t55=Gv;Q4D8(LQbucXh(PwbT8Jz7~m#4pFgs7z5->2bW$q*aj_=BNs^`U2= z(fSfFihiCFW@^}a{pFeP>wlR#P)=~ASyR5wRT)yfJ09m@B}pz8yCztkm=<>|r%X&F z!t|I@p$7HQwxY`QQuT|o03=Jo`MJUkb1Z@{{cddyNx$8=Wqs#-4Wx(f`>Kt+u5fNB zWnfzF?>J@&d4{#B)YBZS-Zloj+$~PU=7&QGLaq0P3|LRk*&aB3kBM#|>2CbZ>diyN zoYnU3`WxJ$9{4lI%xq)rk&45}$BrjX=7vK;gOn?YQ{#yP;bPgG@B!JEP4&tLHYb~} z?AVdQzb2@;A2Li^Lr=N9Y)U^9`gvnWmRfhtWs2JDizt$_aoUz6R%nCGOJ-G<1lTFmCAW7%3?W zok_LXI&xiUKDNqgWtEw+if_5iYnbQm5V%6>{sxJNeY)GBy2`J6!Z^XeIWG~iK8f5Y zscD;@aLz&tEL%-`rgTXjGmK*)C&at>nzu*EnEYvS;0SH-%=D)}U~lB{=R~1k?HHR4 z-Qjzrp|yY?N4OS}qh=NJwUSsg*Wr~gy(1+*wk#;uM7t}5o{HjTb%%>;bny7Sece9E z=|Sw}zq)|S(1PoMZ3{lX^<5Zz^MS~cTAtoKR_TQF!_2Un8!fB%U{ixJET;|4ZwsnU z^L^Ku7h+^8*TOna3H|503FR8P)?@PR{J8qXog9jOnNW*L!H}=iYvn=Y)j^{KJpeA; zZZGb?F7(%@u}3wa{h4Czd)%tVrES!}a$nzVIVaG(7m)OzWZ-Zbz&|2yps6&v3j4js zjq(U>GRWH{k zl3mHKS2iTw$5y@@_r2?W=6U+xPN;(Qup_>k|7oTqsZ`N3j-}pavJj$Wd7`_nryNCU zTGoh1U2TY3&^(X-Ji)tlzd~^cG_oM6xpXauhWU8Cu|cU~P46yNSCH6dND=!ts>wjtUZ&Z|zcK(#o8=s@r$hM+b)k3+x*2;rUuC10Aax&XH7WekcYgTtE zw>GvPi~@0Sm|g__*n=eeZCHhg+cAvI-iub%>Koq`Zttt$+o~w0`5MN7#a%@*^SsL= zgxkE~*2IwaWl%UOI|+)AgMBJT)SZjDY55e>c*Kr${H=~4Kw2%~5f&qMyt3tCLNqVe z;zm|lgrCPhFZ_B-EXyKis(i3`2VMPh>rbG5yYSLg2BvMBNA>*ss|>s3M@~LpLCcy> zsXAESf}XR5B0%VNii5Kn6P(0p>0{RTRT0CarWve!rc$V+T}gt3dB(rO`y2Q@SfHMU zG4r=bcd7dW^xI*qt(zUL3wHc)3WTy0>Y2T%bxJ~1c;SLdOyg~$9C61>QsL=JO7!r9 zL&MX~M%|i$N7Z01U?p+BRXSaR6y0{X3T z*2<9>$qGb-PHk}01jNz91p{jZ2ufQ3GlSorYWHsNhfOm-3l1V6nU%Cali@%8P6G2i zfmS@2_arnk(kb;jfiu-xOJ1Or9AOC0QE=gufiweeSyZxM4fm8B5oYZ4&&I zjJ(YB$npaNZWSj;3^Qmi9A7$Ic_#U&vNdD#N=hWx%;Q|W(cTU5`?q9zEh_kHUqh&D zO%wFs;ul^yn*&o=dzpEYxsxJGZ)GL$UAVZV;Nr&aWBY>4Nj$9)h=@eV2F-;zw3erw z8_`1-_kVR64Ry>aGj+RGc2{#d?d2;xc+PBBP;rBN_kqCQbx z@eVGnFR-F#p`Q#2{f~$~BnGw4`K%$BD{Z?SE=Zc>9TH$kXWxx-%?&5Z|2#w1|F@9% zJqJM@@TqB=@8GQrJQxF-7wk3-TWmD`oIINT%ROiIvh8I^d2bC7$IhkSgdjK00;}Xm zhjz&O_Eo2T=Nwo3AyZwviAGPAE4~LeQ`YbIb&+Uj>P3 zEQDF|2EKy0=G_9q#}XAPUA%S55&JgyTz2+j$<4k!f~RGK$oK3qw>`IYjpL<(ji=eq0(?k1=z&IYcu-47r!=Y(&J9+=teB1d7h|!6R6Tq z$*=rY{+;l442j?qn$%Mb9p+tIUKmoN&C;lMoJqQ&%7IDglCoSW6b`y;=zkS^Trnhv zdO_Cqmp-ehz(Zj^QZTDju_LBB1$id)QmD-Ts1^QtXd|pTUPL3nON*y3uh(;P^^v1o zezX)SLUVG5?`6H-)di)itg2T23IQwi?|;Qfw4!1^ytfxCSKr9LIsYJfiKiklNOv#6 z3AFk>LjwFPne8-a7vU^litzWHS8Cus@sRI(!jZ|mzRuM{S*BH{IF?_Q;l&!B$a=z6 z-HY=)Q~Ty{+UBza^W^*~023)tZsJvwp*iu&Gj{VMt7IoM$SRZ=AjM^;@l2e-eMQLg zWU|l;*!>aPl%e^Qi03oq#A@OiRA~&+MG(`N6z!Kk@f;9(13o~ceL!j+PVSFMfM|U?EvgN1^#+l|WW% z&MwdUi0=KkT7j2W0K0@Iho=V0agHFY^Kor!O-Aw7VN!WPa#w-MCBMqm=F%|#p-Ern zdE2V`>E#!Kc&(dfRzG$$1gGkZl5fCl5kk^D`_33SxuFS+fn%@E?q12cYthC zJK6kW1a@<4B1FBmgp&)%@SaxcJofTgX%_qaTLrh+2S=4(T8En@{f{fn@b)-mj}U^L z6IX~OIJ^Z3=N89eZc`LC+Uq0=b7uvk|#}k6k$P2(BCj!&WTNCZqe8ZUN&Bx*er?Y)FzNmpxRjEL69A<1l2VZE>aRVv^|hwbfsCULXMK8L@UK z;lkr7iaokqb(U@Ka9)nV1%eToA3ye9J^ojzfilKDALD!(vXGqE9y(!O4fnt%>g<08 z5`XD|JYX$n8X?>z$#V^&6@#U7D|isB*I)_MtwO7b*zl*g0ap{{`hCUh z@F0~&b5??mpqB;VKwM~4ckd#g?<}Nwd9=BL{PL{EJ!`&XzG%@9!Y&j5Un?=MS%aQg z+B%PF9OPPv;Us9vvP{R-o)vuivV#VM2aepGh!sqhksl-99{b6g|Bl*GA~B1E7b`|uX@Iw5}M z*R4Q?$%b993lZZN)NxdTE4%YGAgx5*;&IV^)hWPbt7}&gXGRBHlizub@zsNDt#v+M zT|EmOzKnREl*aW|L&tOPMIb65zMCNg7Z@NZ0qU*!b{0CMTv%;O&^)eQzO*xA1MZiU z%=mz|WemW%F;>9fsMgH}0;~67wT0b#o8^hLYf7x}JHZsSJFa z?YJp`sg?Y8*|@fT zT;F|Wlp^OAD9A;3J(B1ZlqBS)>HiHBR4%^LB(mb(I_balk8ja)SlvF~twlSZnj!h& zW0>jXXE7}p9iQA6%WmM!wIqJAE?0$T#pVsYC9R6Wsxmsdvsq6H&4F6%B#w#`O8ItM zKfpJRaJp-Tq*PWgMp5x_#kp(ZMN|1%YN-v4Lgf>gbTH`^^AMWx*spXh>hAB~BY-IL zk6fEQ3r9lS9Cep_KQW62Qg5Oy;^+MiU1ledo#!%V)1<$H>a|MSz)E{vjLy*`Adj!2 zqj^y{KkJqD2-$I>3GDri^e!EY@bITt-gro~H+w+10?AjJgj84qlgsqi%9NeS9WHQyKC&dt_5ULk0Hj zbWjHStzD&hs$3@PQCj4k%7>TA&bnKj>#hspa#tEkZWQ_$@KP%QC95F5^4dhPHGQh{ zMCixwXKu^Imk((Ar18BQLGf4Iu7w}IhZ2PFkPWU$Aq0r?*RNj})tVid_0o*a4|U!h zV1Si#zXq`<)|r47g{XkV7k097qn!PAA&ano7rVO5Ajtc86okw5dI5n(B>xIqm-S@}MyCO8M zf;T*XQmXsCce;dXbd(8-Rj(FL{KuGu8K|$fw*fi-ZWi$4;fp!3ir372m#j6NF4EG1 zGa6-9wd%cGrbA{Mgk&uSdX(QrdHSI_osw`!pOCz+=s6SHT-j;KM|;i9B*{A{4KZ|o z_xqB<5pqf0YxpB<2>xjh&*8MQ2TO(eSNTX*$#&Eoh?z~E`^+!I!Q%Q<=-&M>4lYj& zxN%Vkyd!NtF{?;ewEFE&mv=qWRWz2EU`&NU}rd@y>>r>hxGE1k>57JzpzRIO(jn;QXgd=~@YNZf!q zT|ckr$pT-Y!>T)Em*HTRvtP49R7)tha{_nyvLtyYOY;@q^!rX&fB2j}F5Eh7GCmfkkN(-Z)jT(G5aQEF2d$oD01t7Z)d{`G}KA0|#^UbM=&h)4;&Zq2(Iq zc&&=q>GpDa8KG5BBk>pFKabq@y}AR}t-nB1q~ouwY}J|-lik>rw$a_fwh1zbm3f<9 z8gVD2Ph#)9VRWu6>q`pv)EUNA7T&5VwsBj^zm8yYB3kw>YEko#St%#GSbX?V?1wAE zYE=AB2(@q{x#0mY*(?VsauGJQi(DBkY}9%I)WS_)(@}0&s-e6Y5R#0FSPSjKA7HUv zDLQ*m>KwDzATd=P=7BKqU{ps+)xSkHYD2*PMEe0FR&ih{DYNxrZk-o>dv_3~^}}R# zXE|ef>%oHWM>QRaS{K?^`?91)PwU!X01e+J&MA<9NI}~Df1ck&=qTsHCenTgtLa<= zulEYgH19>iJ(!GDsVIonfW4#fVh8|Q2Ohf5v~I?<)Bk|^lE!AD9Q_xPqA>0Kqy8*I z8icdNQ$|p8v`!s?o+X1v@ljm`W;;om#WKd{)U7`~Ax|<{H;gR%KK(9~L{~iM8L~;nW8wOsRMPn9>8;d8;t>29G9tl*7?3qBe8NwbPimn|vwe>t!H#^@zH&3&6RuqM8HRKnj5)vX~4Pe)yNjfaWm7f4Bq8z+A7!PHV$k+(Cm{ zoRrJiD98ZO8H9?UVY~2%7N>2VE^mM6ezh!`BNWDDs6kf{=Ja z%7Emv^97{N5?Y*PwzrFB@8i9MztRsRfXq9w({r=y12`v9$OF1Gp2HcPTfxJ% z2^za9dqeX-{^+PRYR6f#KcEu9?_~v{TSXW{Z}>W~G~6xIv0j|RRU%2{n^h~d;HoA? z&)sqCNoF-Fu&v7_$zrD5|DMd+!6M>K8efA+=!7sReA^B~+<&-Bh@*geIQ?|jwf7A1Q^+_2-@ZTd7tXx3_d6~Qevs9O5`?82=}0V{(2B$GTD^=Y><_fgr!EZ8AG#gk;u`zye$0{=n&@r?`ovs=i*cqD z2c05=)K~0X&JN1$>oVeiKyyw^=SqNw`Z``szz;{E!9&=?4G$q33+w9z=LoCH2xL;} z)5HGwauH%YF5+leBJ}Vj8E2@{HZWIs&C7BhTPo83nZNL*q`A0;F&({O*r5wgSM5bg zU{boAmVF8?;*;*RE-Z}B#Wr)uOVv>LU)djL0WBBz$cb0^V2cNcBDCEdX+D<~B; zJ$M$T4tnYTEf3(1*+y8H^l={Gm0wKC-^&0agY-UoX9|_gfeNBm>*7Mui4I zqu~I~#*zuNODO+F;~$#@vmp2I$#3SdtdDBh%7?%nGQv)5$6&*IA{MTtxRW$M-pIKR z7X_g=OJCZ2y)uV}xXE4L&Q0a!s`%l4^O=1g_?Z~2h3sHuK=&y&XK?0ne&nE-!Mm&# z17~D2>1Q0|Lheo-(9)oHP!+c& zN=1S@LDAc>Y$1)~8djgHexf@rzuj8+o@8R4W#w^?oBXsLNElR0nek-q>6&OtPnZH-YsGTSr{MWFWP5fVU~T{FlRkEXw|kc|5H3I6beNo>v> zN9aExNkT61Fna=OoNl|hH(wK*qfOdK<2XT7zf8|ZcSj+k$K)*0>MqIv-Au_u&5n>^ z*w3f%##S4@P(i40Sz+Mj(sbcOx64XZ^rtKyE^?>1HKMIQBsdS2jUSJX_?_%rbNJ%8 zDbrCDau8~8U^c@Cp&HF)!adiG%puUoU2NyTsc5C#DDq!&OMcYmp~vLSq5K8>c3xx6 zSt0Pl-~nb_C705X&NQVm>Nmm{Zb@%;Ar5-UAg^Z=eT3N~-GfBw4r!ojn*|H3ceJqKwQ;2M1UxvtIow1c| zB#fOHWGutTI>s=z->2{I?|IEV_nvdl`J8+1dB1OHi|K6fiT$N(>LHlO)Xv08^6=WT zdWFDE3<2dnqpHlaMLhO7cIGz8F;07AUB{jq8@mTRq^tpy`#_P!Q5id@m-Z z;`rg=BoZM>Qx%AD-8rMgL^b(y5lUN8x4JA9lRw*6L1i!w3{jRR^xxhMHoo7&SQV;0 zO((dU9d=j@k%4I^?D>M1vNyj10bad<{td7sYyCk8%_6v}r5w$;eDH)?=AWiJEpO^KaFg21Fh-9eEG-<~CkZMx@UCAt@m>A>+Rgg}I=9ryN93ThL95o9Ji5wH zjyFJAm#qEAZpOECZqFVOHn&b74OWVsLVg#U7!?BRhP@hO3t^5Q&)2RiynL2PUPb{2 zWjt9@0+*oJmIv0d>Hsd~`Hj^dtP3n^nR?rMI zy%Z0gs(|K4w{6BQz4?@s1kq(}d4>uddtt?%UF!-1r>%I1YXn~{P% zfh~tmf{zD5l2A&ZXH3A@OKFZbSMysoj&Ak3zW{%%4p|qU#Y)|q#mmB*E-E;FBuPlR z0yUji&d-ED>`6V6e$E-ABI>0#wqUEA7%k6gm5kbRGAO0>9OggY!PjM8vSy6=pz2%J z3+MI;z9thYD?(H}nkQ)gl{yKz{n4jfAH#?7(65#-=M26Zm1;w+Y>r13J$~6&>Rqu8oCN!n=^gi<{Jb6SWYgLB^O4fk~0cXL>6Y+7(dTVquds56_{n;oc%nHB_{ zt!)+Z)xQz*zeC8rVbH{2y{;;kW43w*XFO17S9#BQrgajLRt1_ay`K>lm~w+eYNalNs;X1cD;+c zSQ#vt#!h<*B^Qcpb5{1chAO}RSfgOHEL2@~d(WKi%)%rsBALc*uS3;Y%~(j^O`J+F z4@TYzm(Dz1_i6QL6;xEp+`d^{{s{$KUbFNbtY4@d)zq2Py|1 z?cS^$w1T%Dpm_xL2Gmp!yMN&M7iIzufY>m5vJ?*T^va#E=Z`gR;!Ri~CM@gHKGzXC zR9g9*Q$^&z8DI6Z3odOo4;*XrV>6lOL6mYaP)O6#nASKX(h^i!3my z)L2dWvG>Q!MnEXkM7)JoSN!cxvY=nU`fl=nKgwY0y>Ih3SkI&rN^?|VDn6ty(N3>Q z>*eje31V)s6Iym0H!EKO(T%_U2 zRoVOHa}rxpJmc>6u5Jzf&;)&&Ip&7KOKWRACUddzM0eaU9VfcmlkDF}*{|YIzoPV} z#YYW^f>yY775L64pmAD|Z{;fFZrhpfX$o0Wru!2b^un3CZ@1#-H0(aN6VpqWGhxrZ z$~$C#?+;UYjbAubX!$RbMypH()Bbfb%bKx`J%7aWue&Or7>Np%#;x$JqD+mf;?T?x zKi^|DXn)d_lq699%TJ5{c}KC=Dp3L!6|PS7?qyJ5qCreNsHV8*et)zAbe4-d^pv{~ z9#TgL%Pwi*9BxPC_J31zQ%I|1-Zx!0vw3I%OO2}9zw)0*c*IWvXFP&#*u(Iy7tv*jKB0p|XvD#J6!uC_WHm{4#O2aUWuip$u!*GrrQ(2iQHi2S7db z>l;=CG~-@BwqLcs(1`xfV8n(5&@i0FDc%PDH+dlKU5Pmi-#glzs z1X;r=4W;pq*_FhMFT%3U28Y5>(B2Vhxqxmv}G15RoKV5OX3n32CQoz z1nYTGSbN2lMB=cVN^brapc2n=-6(~mVb6|Bv2PW2+isg+>g}4piDWG?Kt==&Lv}xG zx2Z{{ldx<`IS_c3N&Un7ioN`Kw>Sk!AKwmLISJ2ZJ{4))5*9L>=^Bdd3ujpo@+nMUv6Ahia&K=P!cakHBsB zUaRDrE%^7os}kYgv8u^^ub5w%<5b=`P_PGT(7m`}lZc*D0PEJUFkM$5NLJjZa5#cc z*q_NBfY#Bh{|MsBmLZcDzNvKcr-kE%UOw&6pYcSy+#Ac)UKi}(O*iYYtzbkgo$h7B zapFHtv8>!)OHfWMQq;O%$*WJxBdPjPZX3F3EtHM}j2?>gnE4LwY81VjPTn^yjGP!>B~ypI zv{c+^bN&Z9t~!lNU-p3I3m#h$y_IBqFM4df{9Wf!ni1^7nZTZNVS%;xkv-2)ihr=k zY;w$m`m9({Q#K1OvE7#A=$31ZZZ<$TF-{^{_kbiKW|b~q3w+-s^XcWKXu;&Wi!$NFaGZEix685#rLx~taLfAK z&|I4Fl(hU(42#vY1a&2<6igJGrm^L!me$G1MB>Cg@o;{4X9jvZqE(~tXhuK5E~5E5 z6JjgV@k3x`)5xyx5}AKv{{CxbCnFoPD8kgCTRS}XE=Agcd-46_dzb{u5Mq@ifkcTsa;8zb8>xE8tjOE5BVs$ zw6niT+GOLwd*zRK1s|$dy%n4{KN(nG;ax{Vnnqob;L+C_;3c5p&8MTa3e)Mt06e?WLV=MIkZ{4K+~^t z{-Lu{7vc8Iuqf!%bo4=C|GlH#A8^5}F~e#|?`Y@#yE51vO|Neyl2(B>+K4ijO&Zg3 zrHSXY^kNy7G;Xi>V;$Sf>${BHIPbBImnx5=agYi4?7;DPB?Z@oubv(`FZ4<0-#m(2MU53=mgDy<7AAJ_z+hRkn_-vPeJw zvCmH1_6=<+7-{_>w|wvHPGgkX9UYmDXOU)zeF}`u&d~B#ImRN*ctFgucl%Xc$>5V2 z-vo3M>)ZAt_~fstrvD!FB3|v0WPW)tVb@{che(X>c+@{3$1A2S?S~9``8?|mj`Ff+ zLT9VQIuplZ9%68cz2@l6mVa=$@*eRf#sQAiZ%4|k9gF{ayRQX)cm?j3E{nq4j8_%F zDk_|6kBnO?u^ycrW!37_pi~^Z0odiXAU{O*y7)MRSmSl4nMZ248itP^F*3ZnKEa2m*Li_BF35<+rGIu-K{n+31BeWN>SYynKHMUYT0zb@uSG=HX zxid+^wfX9$8AlI!-Js<14Ep|a=N&A}*0t;O7D~f6?({-l91X*Gzl2&C2ioY&Gu@kt z7m;6l-G6pM@571)2^2W((!PE0KUkxnXzKWl!)I_e*p3XdS$@k^f~iWe2lTCz`Vb1c zbvphu;teT&wW#d3c=&3HKMNzYCEiI^M9AHW?qzpwUi$2HM0s2yAO9a&zlQvlZ!IH# z%q%1^53Y>nE2tH(IkBf|tjHW5too`jl|0%P>4#Sj5tM8&%QD@z537mps_x6%o8Hep zqOceq3llV_8CX%013a#u`rY*MxE$hqavUUHLRNr@YUdW=lpcSHR4JJ5=%6a%a$}*S zl*NjEp3&)uNot61a=#)tW-y5dkfl2TJK)2^#Nwip5EjRG)CB79Tkr}D<37_;@o^zZ zDVBU5exh3l5<#T#iDDok;;fM@4#WcPKBH+|1#>bA94*1a+M^b%MM;k~?t0Lx3vcI% zgpDE_=8p%+kh!f}6)|&h1{;>02Nqj|&O)|)(j$TfVfY}Sn+-5yidOsHNtR0Is#nPRSNWuIBVFWpWXK;fQf6D3EEs?wzM zPw%+s<;ySu%@XgQ%gRW~jM)nGSS?5`=&g>*xln$QOay2%dMj_gNc1yr38c6;N*)eE zIa7(tN(bq0zbIL&qpP6dF!6CQGSQ2msLNM~RCB*BrkmyQZMTkVADCtBB>H{#g7gE3lXz54x-x!U=Lb);Hvo7XMUS>b0p ziCXgwyDmB_Ao$5x?LMRF1Mh}m=YiQ40h|0}yl|CPB*`SJhSgMh%324h8P(z^Dbu_5 zy&cqSSf0WhRwv65?+AXTmjXSap_yepeBN*I6W$T#lqI zQpnN0&D(akt5!)YT|XuY-@jbBS%2G=bs-@r)+u=-R3p*hYl((^Bu_^<*ZtUFvA%MY z3Q*y1*Op75_+eWy9T_PAWKM8)m(X!$zBI_py~2WW+X}pJ1JNVc)7g${D4IG}X#qGu z`b$Vv_OL;Ej*8of3BZv>ADrOFzl|E7odoRQ=KJXLZB_c*!>zTCVTF~%83|;kjp_}b zg@4U*;owE5>J7SIMF>OMI`^(MnMwFFfbhM%{5i*OE^Yrv{E7b zgUD`4;*CYn;xZi7aCNqLD!--J?N~KG+H<-fZ-W`P^vt|9nydxS{3KBJ1-yhYv8qyf z>IfFws@)McG8ui^jF)+6$>Nu{VRw1am+47(SGix;7r$T*zZV5xXw}v~PZbVcC#1^_ z*EbSDlj*D!dS|QY0ozP$tir8%r09trY=C35b}G`JRXU2=S)&f)MYOK3DiijUVkHFX zyRINXMhbW|p5$Ax(BQQaqY03Nm0}i%%C!JDQ8kM&$7LH`^t;nqO7f1uLQ)H^dihlX zi_T>y_q85Qzm5|nfy~7Wn(EHz$giXX0ESpCH6^y1HB~M&3!fMSkI+Hf1?p?L-kt~7 z`Kw$05p;a#`QB4KMI8q4Sm3A8|3F)fJMCv005xDtdVSXmF5^Gw+Q@mPt^PyEt)}cN z2_<`|s!@@r&qpY|jy%sK7DiS6dTuGkv8Noa0k*r=rMmOIAWWb$IE9^VymNnDJt)(+ zeeggVppZEJ+>oP+0PmIdjeMF}eM|>(pwwi}MDda znwfSzu4>&dJ|?pwpS@OK31f%4{Xov&fa4-}utDNNahbO#_>$;D$Z{nQYGRpnl2^&} z@M)AS2|O&OSrgC9xB=NTKEww==Nr%s%MPUWN$rCtl25d(P(jWX^^O0m5mkXiRGt<< zJJH~Piy~WFo;tg2)y7E(xZ?o}^yKcE%|?OT&52_*bl+P3B@PRJi5=KZ=HcNX*y`NH z-k(*4L#%oqKiu9{DHlI`lsulnl z9kr~Xqu3bQt{Z8_Z}NI=!s&E*$^J;F9%(CH z281kV_#4#3Cq=gbjx_w{+$p_09^*r??8sENJ&=4zQ3G1aKhlNqO9E;`J79Dm?qPi6 zA5`QZF+K?&B-~;erllLPz_#0WimhVX*D?VwxmQAq&CeT%-P%mM#Gu}{=}ozF-&8~HRJ z-C}*s#wP5!RvD#&caK7U5jRx%VPy`HbzZ@(ZLOQM~x3I&T9@K;OBuwH}YAO^|DFPc6qBX2^p z*@HPo^tTpyZjFUBITAOY0Z@!}hzfy6mOyyvT|qYP^!fuTESrht5Ubu#qfpQ%b z)~%q3#VmoJH5{TWmVP|_&$+!FthIeDUdKXR!SV4i9v!TVhls7tS5kG)J63|*mjHLyZ&& zS(#xX(*h2YG4?Jq|3pNxF z`1x$H4t)HKwR55gzJ!jmN6g?K-PZ(ef(BIvzl4Q-@1!$RO%4l!(r)W?3tzxx|7KD$ z&i*ZxClhUV10{314`cskH}JjR-SpoLL-;wKVY0ydA#HBs0~}s)U=;zSBcG&B`VSpy z+BkUenJWc%Y+c4%q+s9nR27knjxP!>ixal+caH`~Z7Y;!6ce2yJk3&6&P3XE24uR% zS;cgfkjcQe&f@_nxZKVcq7X+incdiXQ)c)Qg6CgS{&08FBPe#S>MBxCsOZ)(?R}Gk z@HA0$Eqj>>YZUK6Tq4p3E?8@yFTJVY81&OtlJXld>~SY9`fdWe-S5o^!9oTjwG2s} zBOnEF`Q8Ew@%t{ZUPp^6(wUs3w6v>&TZBb}@w`l>rr;b{SEw7b;6I;&wBfS1QH}mG zOS%7aM$#iE1?DMxS+UQhD?1~g5?w`|pBbU8gxLpc4vFzMfzz)9RX&?V?cC{_?<^h$ zvdc@#o0tT$r*Hi6)?T3^V(Tb<#Mh1`lJv;E>Oyzk{&(u7rRI_z`!SDRv$*SV@Mxt3 zM3r%ZCCd2dmVga%3SB)oqEdU(Q0E<+b7y@P-iY^mx#yCvci><8cACPOKUUpixlq1c zSd%)p^|9W%B7w120Kas!j>6so8Ia7yw8s_y4j-aHen-dTXZfvi!~L|AGZ#c50FZM9k6X}{XX*3`o{?|UH{ zFU)(~Byp5!=QP~N%I)k= zF-G#Wtudqgoc=0(?IanG((XgIPLC3=j*J8;J;NL<~)t~?ys$; zC3r3uK$lGW;RcWVO#0)ZRcHMD;IYBdouTwtQy$aRc>Sdw9*wH?G>bRV=sUyR?J&8z zq*%Ueriacd(qx?|xndS8!-(!P0QysJtEgdk%@2PA+AmFS&148sa?^g_{Uq~dMkU9W zH2ZT6R9hWWJGjf>Hzzl@6Qo4*8M*6TyvIa3ErtA~XbMMI^&Jsiw>ah*r`9MZOr4)L z=E&OZzteLYT#_PAJ6xWyM=H0DO!4%Y9t8Af4oysTP;Hyqq&r(@!{5ORU;w48^Bdt5 z#j3BrA5v5vl6%A4Ikd-;Zg{e!=j=tt+`Z<`*w^-JLndl?1&ayz9%#qjGvwHWy|1de z<7~*iiix8I@H?1afNp$@rR3uX^Z<32J*tUQ3s-$Dr1F|5lI$M?#dV+!@2#yqNnqe> z+F`~V;;O+rgPY3t&7+~#g%1Q57w4)j9sO2H)Nx+hNP9!_t4at@v+JXRJI_=Z7ja5r z7d|cqwmn20I^Kt%e)wLw7GjDnzisGfXQq>t{~)_t;uEZVeXAS(AWp$G?LuloeMhGv zb?3-Tf!!!>vab_e{CIv|#jA2Jo#EIZ6%haB;7AUshg?^UBi)FfZXxG2NES^Cyc!xe zI!pVE*(fr86#uPiWZir$ywvD$#mL83ul?WNp9h^@i^)?~1o#*>&^&wUqv&s${&_Im zxPsIAcsuoe&vjj4{-tQp2NV4|0UjNUSB-kr{P}Vnl^<^YZEFo*bdC&>gGZNM8LMnw z{h9XfSWuayDg$y8b0?mC+PhURH<*FF`v^Jc4)1&{=HAqK z4^uKpxS|VQ@>WNzlL)#wtD9#>Z;)_mM-g6+RiK+|4YJ=|%dx4)My0y(wTkOq|35Kh zpj8c*Z4OXFJ^N_7un|XXDY;vz_DeRs+`eB$g?vi^084Z<$lZb) z3jnyCFCP_*QXEY)3IaSF?QguR@q2X5P|tKNCVon}!REh^{vKfc@RHu?`?5 zgJJ_01JhihH2`PerBXe`Y!sAconB-RGT@k2l~&#>E-~c_i6Vbz137F&U5hlm7ONWd zDA@5{PE=^L`@u1I*>8-$I{Q|cw0IBDl*!-vP1c+tFJmsa=*%5FBN}}(&K%KY3PV33 zc*GBq+l5=8MT%PyeRo{{Y|sg@jr@EF!NlA2EI+R=j2nE5ez)hO$GKvH=wbl;x~X63 z%4G2__1M0`>yoOwl~x7;t%?aU$<+6sYb&9h-tM%O{BIQ14%^C;3GZ0_!PQe3RV3P* z9mqHauk0UOqb#-jc&`Kkaz6p$siLx>Vx``!Ed133aculugvkXb;+F@XNdB7HB$a}x zW0>F-DQ6pGtUbP7v=#~vZ87^a{u0ziR|>wWi}8ZFIJJ178L8(iw$4P4Cmh*ihJqXEQUkTb?D8 zo+R1pf86-XK%5b>)g}0P{&*#B)QMBP#&C;$Br2#yhn7Q%>rez?#Gv;oVvCebbAzOB zcg8Y4FS)~QSOz#~3bY48R|L3$>fzOseD)fxtrwK*ZWiNtv$_Jy+>?zqioIv<>TOzZ3F@~_&nU@-Lq9jl4nE# zhxed`tr~T9L)7Y)`G*RwJ-L(j2V>ZDGC6&wSwC~{w%_r(WS0j9FWt~Z>OaJ}xfa}0 z!i&X&PF~p`*8Kp_)ala7HMC*$<+F$cKmBO_xOU;LPZhf1>Qk>vj?K^*o0kI7*J+)` zJ8}#$Y3phCX5~`oDXT457*tX-nhPx~Nb171$R8blT;=XnXE?L-^K~bDlw*Btbl`Fd zEJ$RmIYlPOmaqqkJ<50+rp`H{f22rnDffF%zT9Id*@A|dLq|*T@8n02j-j$*@grLJ zt?`xihYyNq+BvtQ_4||s}n2l=TUl*5GW&L9r>zSBww(}(#kXPt3;gL1cfPBy)XXTm!7f0p?R zS#{S_DYZ z6$+g$MXjk(-fP7G-K+5E0?SJkc~5Gd_s|U;PODbe{~(^eQ&4A@yKfy2{6By`-0!U1 z4vhxAF$a%#cr%EvYpzgo6irUh+#Q zdhx{EMY@<(Fb44r{1xo1wZwZQw$(nDomSReu4O_82+N=7KDc zBA|jIM0)uw7)mq;x-0i|CBy(K6*f7D>K>_VB^H;Wu$n9^`$oaEvoe#pjIpJ)%~l`F?Y47$CMR*Apk>17 zhZ7^wgi;EMl9Xik(_W3}V-8O0c!dSuWSkrMvfkineN&XV4-RE9DSk%FtgV5op|IfP zF?<#2NOI|tR;i>(Wdb<+rikf*O#O0w4+{GT#k!q)jOqLLW8jgBuk&R-!5PYKOLK%<~SHX4ixOHKW=eHa+jo?t8^bh|oT?Ai0oS?ITbwZi-aTYI|j!@M~!) z{KWw-a%IszT^h}lKKRt8>#eKc5?M#4%r9PN-JXRNM>U@EinNTQh!!jNtnJ&SOqQ=> zPgfDkVn6FVLV)eXXN>S=-c?D^{&j|sy~-0g^MNhhR60Rwn@23n?jiL|=TphZsl$@K%wbJ91XJxA#hKiXd<|=L zW(jbd#yoKU)KBYFu7=h`3<Kt+-!|i(>g(11s;rNin{Cu6CHZd5+p-+_K``|V1&;}MnKgAwL8AX1-8H3rSbS&8 z;?uYJKQsT#>IaLo=0c;+jqSgoxl^8n$nmTV>Al^4z1&dnw|#VD%(GMHOcGE;za7fleG~|8)1&2@$S|`0@L}0?`*$_q5{_j-a3|9 z5WCzz6KOa2r|nggC$$0MfMQmOG9OmaH(Lw0gk z4ObUC07fKN#4u9GOUHo?9kZZ<$1j-EyA{=ql$EFIr(lZ!&Ct4L|#>N z7(aTDu|SSJHVSy)=7q=Ik?Kbezx|LDDV&_6bK*RF=O`M|z%y#&yoSCXr!EjhiDToO6mE7BR^ZJi8Tev&ck!0a! z`_#45*^O9lhS@m)iz&R6rH9QOOCMrmafWYC3i2|`^A7)HuED04+VZsvVXPQq%iHmz z>%ty38VqoN`DEFeH*Le2>T?QVdgvVgQ3t&0S8{=X7wseHrZxJMCReEn!-I8XAhb-A z6{@RglUL+a=0}pw(fci7)#$1^hLlWV3#aw&f2p+}5$8^iXmehYwFhcvw_kzTh4k5P zT+5Lid^<=+W_j4dT@8Famwrsvw4m=TvK>{i#$O>5=3o?p*5ZUQ{d0>vCfQ(o8Ge4z z)Y9c}0B^EWSo!JOmW9T+Uz8lgvjCDrnu_s9s`eTUA~ci6AmrlWi-m4rCuDE1rK; z&t(H%>eoaD0d(!ZTsij5a}=F@!|ol!>MM`9xj_)%Rk4SX*?Xg@7u>4ml%+VlGRQ2` z$zv%q!Pl%sQ#8lBue&|aA>wy}q=#|>&B>6!E4_Dz#+*0Im_9)qPYF9Ze_U02!uhjt zqa~nl`DIH%z07IPA_(TV1cGTv|Cy$LtT^V;*oh_&6#=i0rNv|UO$unA$5Q^#YP4v9 zdz*79kFpdDvGpB?mK4OIj_aUzu*lh=u^;Fc7cV|Ly*11M;-QY!2V1i~QvS*hX)5Fo zeOnrg*}zm51(h^D$(9%_zzvLNrZO`zC8B*R$Wy)HA0#SOO`e&4V(8o-l|ePEnX06w z2mG?vW^)aF=1`d-dNFjT6#bOHdS`i7GI-5y#ln=+^Fswe571!qxV!kCWDjAJ-+*^U~~KE1&3ZaXGX42gRks z3TmR#Av>iB9EP}QALNtY=L>Y)+zHX1m%?c9;PLA@Iy#6cdU)C7BgF6BD3BWpG>3u$ zz>geo?-piGx}NVv_1orbvnle-F-D66-dMONJe%hfEyGZ>i$?u#2MT{crs?HM2;X-# z$>&S=UCjxJVlydLi;pt&l69-JYLqX3K0G}eUWz=pC(yyBX-Jt@Q4tqCa5z$BG}zFkbbmKYEdmZ+>1kJU=s#ba4)sA&U?WYlCM_>LFwn}8w^!g%LtJ*~HmEKCkL1600 zZcVT<7iU(>J%ysv6R2C~7WA~kET&IgTx4#&TvOJRGi!Ncw2=B`^;u`|4+v~_n9>qc z2k7kKk&0pFd+hALZ}fZ&Whk|MHNF+5@vfDOxs(Pc145TajSjuzZ_n1 zrzGiGN zy|@qYuOurD!^Z(1&R1NsJbu;Wgr=y32hHMr4Xr!@zes#}Swv>d6upysiYb<)GB}p& z=C=QYmP;>ar^|5 z>7vOoghDjL6T}F;)zTL6FK&TW9IP@oc2r2}QzG&gC{JnF&e_y$8Zh0QYXp0Myzs%2 zpIC~WrOW*k7)Xf-Tsdl-S2@n%EnQ-*Ra%>A{sSbBzgH9{Ta>Ozi}1fRqBBtnGD+=b zDH2MrKSg~JFw}s~AIb-MWKfH~i7hw*<_p?{rS1zd9=g;$AB#(>pSZG^n_?jS%Ru&_L#S~w7#Z)_16I~`|$W9$M%lx^ch;5#% z)80bRYdL@k>yY-{VVb-?!Dz&hdy!p`wSpwB&IRcGY1%n_8(Ee|zL5OyP+Hi23B;6e zr6z#>AEfunsdLXVLC|GGCfvf0GHx<%t*Jo$`Q7(4Y^&jH{=GntRrJ~ePi4UK_En&- z*Dd%_SU=P9fV+wtI71mDAMlDtY#X&IP%yNux-^8mwt3EDPJ=fhncYm2T zmZJR-?q3E?OOT|;&)v#Vrg7^_J1CvYO<;D+*p3Ie?z1uW6B~gI&?Bu<83P@6{j&A> z0C;ey4|qBTc35v)K&mhYp(qy>U+y%6YZnr$w1J|yt5`XBCHOl_|H?}Mpmeh}ruu&t!) zOcn_kEaX&|>1-NVC>3%h$F=9dF`G-Uq>{d;>0<~mlvwJLzhu`T2$@@JH>z&Mztr!U zQ-%kqRTKs6d+p4EN3Lt~#>dJUhg1g6;7P8Z4%A#UnsqE*nL*R8vNCu%;A$LSBDP)! z{c*{~kbo)u`wn7yI1W$Lg`OIaUHlAZ#a6NTFo~D#Yy%E2q&Ql2 zEb0-0s0JQQaIXQPi}@7-JDxI`5i}HQOq*;3lEZEz<<16?oC`TjCgd};J0eF1ntCF@ z#tO0bi|=$Qq^G{-KhX>4U?NKT{Z*6>#Q?{CU3@(iMqke1E&|o7t5Zn zNc&8NRtRJe|33d(K17@-+z|O9Yy_b(^OFQ1foa@ozZDm{JB?9Er9nDBRB=})8-wyG zH9)WJqp!KL(PZ3T9i68NEWAiz=jrkT2Kg;UNH~CKElJm-x#-p?|Jm5%5aY`E1cz?AtFz4qjUf}=F3iqqn2Dq)mFp9e?EIi?d z&p;G-(-0-1&W#m?z4T5J`KBwOc*2z=#LYx`idU=X+vcV*n*X=`z748MFX6?q=syAO zC)=GfIlO;N1r4zg{@+!A=I7Awd|2aNd0_diOhzbWkY^#K%qvd&J|Og~j+cFE%be?{ zpT!Mhlcp!~>kV=*!6(QyHpQ#Jvx>Vf<1Os627D;@D+H8!`NO`cOLCRDf)|EF6FEt8 z`aPxyfrUvGJ{f<>4xp);iP67`T)ghZe^zJ-|)^KIdSH%0TkKHl9sZqX~~NH4=5kJ;CTBB z7=!5{+R5P0se&GtdW~JYNT(t)2kl5*qG8=vaKF6TZYcIy#2;Pl zGP@JqPCPTnJb1Q~x3c>T#@2Hri_6p83Wfbd)%?CmEwTaroLpM!mn|@UW;q&Qf9aR0 zvwV{fuA2#3%|a$hc4qFjHHnUyU-)$GL@|1IO>>q*;lR83(Q!F<^{4cUX=}@t{P?7? zii=ZBMaJ<@=7cQL6??B(S*G%x`>Rt6Sypf6^rhO=u{8aP`%w-ZktnyF#SqgijaXZN zPjoESAPQIDk;uk0>`2sI6dDKqEGP2&|K||)nJr&?lEq6~d@S;4d$47CS$%ehM)M19 z1-ZgfooF4lZY<{v?&zF{)V5z@;`!uU;Y=CD7Om>LdI8&#$uWJYRZ`f|voGYASkd9T z2>G!WRFxp@ss#JNifKywadgF{XIv;OyKM-*DVg|pZ{q5%{-Qe1&$il?{|%J0z8t+O zJP0GOpI~_(O<3l_&8tI3o_rVWN7T%RDUt2Oh)V@&8quuS4(SlvQo#kC;mUrwQ8fzU zuk;aZFB|Tc0@hkipgYCfvKQ&E^7I?YnMUa*m2A@h-tNqW9hz7(hia7migJ`CQ+slm znP)f1wZ%1^5|#;gV@Qjb?eWj4J3j3$J+QHq_Gbqv;dOdirAS>Y$3nj{064wz?#jGa zDS0O~l8GT+f5yl1uXNoCzRQ4g0NHbL24mFZxN*B4A>5;Jp{Teyj`(Z zdg3cDD38{`l{(FUeCBso^LRG@m0$D~dde(jQTX3-wz&lrJeu-15jVQm=lAPtmoz?n zx7lR!0JG}13^&1w^rGbTOtshACL)#LX;atF#vGeW-TpiaJX@`eSJMs?4cQm7C|yWr z!}%jB6j2|wLS@z;@azU{Q#@8;`q>;*S86;aoyrzV3CdEL^yr`MwP+&e?ySt-j6L{* zLet^SX8B2-`=;OPPrDIiXoP>mPBrSR4{*AK0<)=!@ZZN65~&$sl3cA^s4Yq%Xs;UH!h!H-^3bUyHo4Z&PGtaof$lueNi6G zX?-xY@y`a%xwdJ4f2w^fi6bJ*qFGvHwO6;jV!mGm^d6}o8Gd9l!_C35{-cM#{yp*_ zwT<0o8rqQ0!s>pG+oslM^L&W$ZVQ?8m0I^*lu2SMNXx+YgKjeyOVEQwv+<9J3IZkY zPEA6cuBF?&wq8{Vm8zBQ`^xPU&t94Mb!O!cUWsh7F_}0XvP8;d%6~sC$my%e6Q@5N zEgrO2qrF}=9L3&lqmA2e&TPJ0vt6C9e}7lfA(K;bkEVcHb!!k0T$<+&7cCb&Bwpfc zD;gdTk4u>5GPp)eN@2~qChrR4?msMz3wxmKv3l2*@LMFrm?MHESgGOsOOb5)(mUj! zf5S8~ajF=RP?3VL4sxvDS)9>SiVJtmKj{MyRPQf-du4jyZ^y<|8trASJ#QjGl%LBW`D8kyb2)Cum|YI^7aA(;Ho;>aEtL;^x_Fqo;Z9Sj+58WU_+{x<;JBR>Ja=Yz)I{>!$ zEa&bTbX{;-wQFn{3qD-voGT}&-i4iv-EY^X^Ir&n(mrf{;PXbQ2GGO9d{!Qeq2dx| zuhl^h@;uh($;jh?_LSl*K{sA=RvYZSOz%OQM;}@8T*k%&uHB86>wybN58AV(HrNg} z1{BKKM2{9Y+lI4`h?~UXH~*|UC|!ish{BF2KilJ_)f*CE2;_|H;l<$sW|T#xoL^tG9{Lyc_?Hg&H$$|_N7Y#Y#nrp<7N z;5#rX8{b(vzubve#=up4>4clDIJjYJ(ql0Ia=B$QmDR$Uxq1CMfqmn6d3(IbX4%;1 z52z8^c>i#VybBf#ZuM33U0UHQ8lURsc@dNxm(lhK?+Tg`)XYhIN8Hj2JV3GWoyMZy5_IDgavJ+%ekCI7iv-e9ZRU*nrvH*C6+X2 z_|HVsD;U=>`LkqETGg$hJsj}(`+vO&t~VVjOv=roQd8Pt?`~V2rW#-S*Ne|_v{Lqa zAN<{K@_Jve5O=hd$YS-1Zm^-8yvmpbFBQR_-$6g{J~ZxJD@y=qx*wFGJU0S*aVbK^&;No}=Key{fC5rA>CkKTW!;RD}#N&h(^_IuE@=03U<7CyUigx_|4ID@Dbyy+uqjtq@Z`x)}aU1+W3f#`~8~X zq@rTCG6S}Iw7I((QQs_*xu1XAretBjL5kfFInUUvFtoW`r&rcd*$h>gS5iQcgGkX| zkFJLu{5wZ}I?PPcX$<%1)8~HgF~OFF^g09v)@}g*E3soF__f{b=zh;+GDML4E4o9RZ3;; z$@CrQvFkw_w;Pf7)2D+umwq1qr+||-R^k+!NFcZKtA?`z**;x$U$@l4D)}K7caK)q zzfw2rJo?--{r=D%Lw$g(I>M`e;A`72{}bM zC3ngBFpFVUIjnNCN+_q1^Km4HF%!dt$Z@hUa~g(WW^6X!x6l3i{jtCHcwg7`zOL8x zdcUsc^?W^FG!*x)czuP+TxeHpDRU8Uh@0$pi!|eyg11RSPZldkHum7k&3=`}b@m8Y zK`7BB=_;a{7^ijhc!e~AodUh88FqG!9-_xOIi?TmP|XhL#yeVnLf}EO?L72d=*pDu zGZ4&!4IaQ@>nJ11T7gRquGvcI@+C6M>&ud!Cd;Z#O{s@9@tYe5&r~Ki|^+U%7X8Dmm^4u zFzv#4cK|oKk0-xd&uOX1_m6@7A?WG|tZ^~02sA}pG90W1ev1;|y*}&BF{h>50|r;; zWJAw*;>XGvAB)Q!N#Bhc9NOzQSNAJyCM+)aZI&z+>yeu410HGzFyM@&Nv3x4UYw^U zg;G_CRvAIw9@L%v*F?Oaere8kJdZOIVF)?+S9(UYqTT(2@q9Q*cq9 zLr^UnC8UX(p;J{~cQidpvojHY6HcO02%-evNmuOt62!QU^Z1TkPRV4XIO!F204yz$ESY5TQ#hnfw9~GXli_(sefCe}OEtp9y7<|pCJR0gnX^CO1mYyX%wfFoR zKU%}PK32>mNW5-^VO#LhZD@9Xe_@B!)2Z-;uB?7sY=<#ES z+i=iZ<;tr$mrAURJBz|T*B%t^yEM~|{APttnN9!HWJ25a)DrCDqMrQmlak0?S~mTk zA0oSQ9(j8M{ob?=8qeUi{n!Mlb_}pUpK!i&k2PN z&h*g|MbJjyB;%W0RRo3L((&pun@P35m8A0=AzS< z41c`I_wBY*Y>M)4z&Y&KyvTg*KtDJ$Q|gOse!fL0c~NGkzo2$Vnr@+o(!7 ziR7?gkKI}e5(05vpBuHj6C#R#ZKNscOW5ySr!!}uU7h(tKq`^1CDk}Vv>+G5QRBK$9Jd)zS3BAetO;QTC+gW)&u_c#{?g8{~BFuY@33em-{4p3_xP^SPki zwX2#-uKSI>g6DGfZr)tF?L0o7V6dnfWLQWzaxIAl9icwafBkWP*V9`XTI$4KW^f8c zq|*-1txtaYfq$H)Y?%z4!B4>3tlKP+o!0sFx|F^Ls)l6)CDL+c21@qJ11wUERu~Yr zE$2oq&a{(&0+;$Jyx3vJ=)dR-N?wDY#t|XoM;2BvASzYz+=~fYtIkXlpt;tj$DATdeKud+q_6U`WK=e;HTgSHP+~(&jXgaK&2A!a-{SFJ6L+`1urIjd zn3qMA74<`zq{$edH{@dRUaDe;IR1aAHRMJ~o5#ZVQkpur*{B&4#?$ zKF1AB37Xe^e-jCV+7$n=sW(D(Szw)bZ-;)l91hK>1}+a1yxDm zIlYLeqeBl#4VOI%xU?!tgq$WkVdELYK9DOZSJw^%%w4l1RRRXet_|xd!}Sq-oCdi9 z!2^+Sv;en$p}9e=&VaC3)JwYJxJ)c%{ScC-V5+;-h>IT=rwXA*p)W|Tjjjpp;!ZhQ ze|EhjxOpcx^0ROuUkgyU1J-w(JW3O`w|%r2x$_ia^hdkn;$Jc!z4J!?2jvhibh>6B z%wl2Sij(tih_<}XFklNx0K$?BlH%e#>oSHi5Va#WK9(}Z6VV(LBcGA)T99(MbF2&Y%kkbzYvx!56DKCqtjuRO>*038Up2 z1q<3rDV(fvFs_a{K+MM3A5$ePBAtgh21lVVA)MiWL-}d*m{n01G4yZtnvs&ykH7hi)K zI1R`;6ld4)>$H!|-_Q9p^qo~!^w&x+Agp_Fcf*J(z_#+=0U)h;(2Kua%bxxE;CBB3 zWTZFe96hR(!Dt6BBrn;zyP*b`DhrL)Vla`(-ZgIbz4uX2fJ$GpLA_4ORTi~%wIAcX z*N(JM%EqaP+H=GKSR*j9blun$B|l$7_LiWMVoNR1bx*3s|`HrySuYK<(P+`&lDKj}GC?JPoZ@bQ&mzZHLZ{IPROV?7Lcc)mz!h{V4r z`TZIqg;H}9Oa@f=zd!=j)epSQL=?D4`2!%e&Yeg<=kNATsVeT4vg!8Xjjwzzpw?b- zugLS~Hi1Ki9(Z|ZF$&A3CUXYnvVJl4VD>sQu_K{#R4~SG`fhFGLg_^aKX*#|t6ddv zc3h1r9gnMhuqof44Y+x;6i`~=Kti{d(>TnI_j1xH&?hpp!Dr4c?B5*ued3~15f=?A z-0pOM_X&s){ybR=^1^QL(2FRwP(+K-A4>)KO8sxasR|X!o(O(TDLYEPUBB`*Zhnsz zt>UC7HFSf8=yjJ6^Xere=qF4CdA0KQBX7_W3t4psT5!Se;WXv(czon}^-)W_qCN%+ zn)rD2!|CRWWwno_FZ31ud|}MnN=GHvf3I(Jw#B9% zG8Mj^ly<6p+Qy(p`A(@}k2RukQhK>{)5|6L3?X~u@PKek$C(2#2-ga{GN<4y$Fx{k>@ULX~b%Es%0 zg8J}`j`1PQvP$iz<86iYJe0?x&dUcu^1YQGd4F5yj*y-p2QLnI4QDL0Q{aLZ>Mu^B z%3Cf1x|}L*>31e|S0H@<_jY&Y#E|2n_Um;?DNd;#-moFLht;h6+Extu1Z1tbkQ6EF zASVS`_~_eU`D{H=!wmRv(OOCcE_$Sq@GHd2WyYE*H5w6W^LsW#yRkz4T(Y|ueKiltX;+lP?9FeJOcoI6A3! zecTa2gnHI4ek|qcQKBSJF2;ifq*n{>sS3L(jw|m<$K|f9V6hM_!m5pCgglOTiLj~G z0%{%!yfha^Zf1NNmLu)NX)A#?=VUyh<4h%Up(i37YI&V&cb$ngsK4BF-F)nn?_E10b#%oXC4E(6wGMbZV+zswzxixYn6^m+?DL zDq_dx-KVI*a+Wknpcdj#JtytGH&EDdma!u-RYp@G&>dzo7)YvMw21piZ!UcY@&*F? z!bQJi8cD=}8`W!)Hc=iW_^E3DVOQ^cPQuy>1{zQR3tMyA7xsL#q@HlnUSOaAs@x>^ zHZEZx6M9;a9?$~?NVdASgqB137247jW>l_l;%&HK*8>Gk>>@jC-3@?rV0xVf^AcJc z4I*Fnc(%O%7)JjR&2LzP5x7bAVl+r2eYKac?A<6~qJZ?O-fk~T3v!Nz0zCXLe(B7L z5?Y*HciDb*N;*nylk}DmMh|qYCe3r{n;z90a33kK9Us3q<>4q>Df~Ukocadc7~DZT zFycE5Mzc3&>i2XJR*o^8kej1-Gy7I(1ESW=!y;U*!4cKkxg_7-%|~(zsIi_=b*Ts; z3edl#R1tu_@?}Vn3F6+H9Wnn8oGMr z!#26~B1$|)6y6lnskKlUQ=TkQKzc(dyS%osM2)?twm$d-jfis6 zK3eDRD{L`wZXd5i&({Y%8?5o8srXArrOILts|wzFG@7UlL8^U5D*>-tk91pWHSpYH zMy)*Sx&Bj_(+97;YNcYGmN1l zHYNLV>rPk+MqK73ZPH$ZRZnV_NZV{|-2Ttf6Bd)q>l zJY^sn>t@2r@#9g8ZCBJJYr`1te8+J<#T&Ejx@pt~HAlIT^^8%d= z+QPpOEd!-~!UkVbd)HpnM%GSh@jD|yqa-*8RlVBlv|He9=a7k`SD*ECAf_>eA^M4v zdZJ|^<5)e+qI&Axyz}%QPz8;?8a8{HaawCmDrB_=SG=QFyKtI)7Cl3O>Ri?GolU(yF`FFWM=RzSy~<@)TA zJAZZdx|e!BO5Rl?aW1&6n(eSxV1R^I^Xv3TCBk6EngnAsvrgo|NI~Pm#D7d53s2wR@kmPmQ6s@=xQu$sM5mg<7-_#g+qYs(0i?9`jJk@jo3aX%SY)IHz-t! z2QJ#*Q3|fLpwq%5S7}VKV23d-{8nexcLA(U-z7B%Ia4H6gVBshULNS+SN(^aRjKZ# zI0P;NB_!p42Fl&EW>1RmyUyCFMAc9MSAn6npuGqHjCN|E>GJ z;xW-SR|CVJ$5rxWT`W0w=E)p;S)h-^yROd#h+vC**LS@?KY3&F+_Dw&j;KoekeaGt z{(%082>mM1(NN7{q8fWI98(gKu zIL~CVCG_g`t36)tz!ERm^8vh&Mu%v59;czDhO5-<1$LAuDr)Iuanvt1^j>d)s2etUj zOPE!U4Fl%Ipg)^$c~#2m4QWi9)cgY*@ARF-rGiUDodb(Qu0CJZy}oS|6OM834_i2h zuLUFDx7&xk$ftZs1J4ibn>}o@sq4I7ie+TtZYO^@2Vh{A-9?OI+6t8Qra;&b@Wz#GTLge3sba9n5fa^QDxFwgu=9 zVV8$6$bvBQklrb7hU$UBT2z?n40i8E=LRW#IR7 zP6BP5Ksu@c+}+V|`_(-DT`x0%TC8rih0&0|LM1!i0=)vy39qshL+oHEedEn;RS)9S zw>H1}c*Hp!_-rYdzUR8SH2r!bxCX85l2q&N$!Pc46rq(EYC`*c$mQ1U z1}1=t2+((H9Oa=`FS{Rl2+$!7A44B4h^lEUDu_Msu28i_=H5V+s1vAR8~23CI3a7; zM)>{s6}D2tW6eexc=ja-QD@!!RgeLQskc6jp#XFZL&`OXwUNH_18ee|0y=tiVt_7- zB+i+BeV}Zj3LvWQFEj5RS)Up2#{B6g3V-iowWEaIGZPP1t| z`JLiPi^=aSWOz)x&x@*`ls}7nWSl} z;CoX3tZsCcctAs(!Lrpz5PZvU?(f2N7c4$9jYP_18T#G2pb*VBbck|!TStIorR|sv z3IpzQ;pMv)ve*=gc55+u_FHV$_JFhfM+acbjo@{=@+d8ht(|{ov?5889XZPyfmz)4 ztK0MVuuum6mb`0Nv2xiw*bb`{e@6O;D$$*}QDvZ+a0Z&L5;oY)3@B9*s3k%<4_ z2wUB)cLZI19_~r_D(7Ac{qE#c0y{V>2DiB22KpW3+ojJd%}vbs$k~R*Pt%IzJ7hdQ zD!;TsEE}htmjQ~5123_hqmfMUg0=!IS6Tc?$NU`^Ow|uzb}C5Q57OI>f3CkwOgOP; z_8)8ABx&PY>0Fnw9eqZ~w-9Tn)c?E(A*lF>&u_9EH&c`SN9CFnAC$Xd4rDxM+8czv zlw&iSU80Dc)$h@LLwO}kk_zm@r`xZJ|CxCmtiF32_rB99Gwu$~8DJPEyd1HJ(@<5% zDuh83Q2Z5BPv@1PKB9>gaV1rlvOg47%aas3TG~&k`6E#iq6(|ygqY#`>l8-_(Xo#Z_r!B7Axz0Y|!Sp5#PXW;Zm5T=b8rzqcN+lq_6P1lGt(z zxgU@O`&7kck3P`>no5_sbMmPP^TUe#E&-j%n-6v#>0YvJAr1B)X zCQSkd2-K&nrEGk%71~_p-#X=Kd}ohT>syX2G7t6NV*XZTpKMNMs&Yzxtz0SZVZXt) z=P|E#!5YT+_RQFJXu6Lxs5#2tH}oZtJJB)iH?D42AGd*x>KS@Tvj2YG)O#so-q&xr zm-lfaDVLue`|8h!%pd=G_^BqrEmC$Y_cPeVe8gr6#wF`wRSNv;xD>2=x00$7PWwa6J|&HK^M+!<*mg1H&!4J(ga7k` zc^F<80ejVc)-il$De3;C?kw@h5B`3e1(#{9=9m8Np;Py5yd5Ugf#P){90%d7dA45% zjkmQ;N%{1-fH3sHz%u)EGkqMJ&o37Pn8x5qbw%e(Q+I)R{t-$bk0Y}gJrgzUtQyS# zMCvq{EO-A@bLDbQr(Bd%Wb#*Yyg@(n(btduCxJS99dF4$l}taYl5XG5UXaQpM@xu( zZ${+4rA37<&Dw7*oGvbZOg}4!_wi;on{|g!xl%z6@hH+^8rKz{$1BiKzt!5JmvkcT znBpzEVA{+$7Pb4SJY~H$S7hYlX}W5eV*kl@Hnd{?f}(yJ%4xV>#*moQA>OHV@B5{H z@mtn*DUD)2;ylkr(hGab`U#)p-PnZGj>uh_qq~dEm^n6nh zg;vn(VGR zFVN3)WRUO>TNz%4yBeEzx9w)XGr^2J6mWHR!ZtRu=XWQ-1v^hxrc2hx_`7+rJz_YJ z^}1tc`;_%C`UjQJ+Q(w`2=KAilfQ)!7=kFaoRRW1wDq68af=Vyw;I2KOD5zVO6(i3 z&?%W;2}QHCN60R9HSct_9o^t##Fxu?4uTYFK&oFXkDICB&}2SbA7?Xlp+btX6#Z#mrJm41-D&P7O4DXg@t z@46W=?F>i`&6;26Tj-zKgs6UeyhN22^x1-DntSg>3TSmG^XjVhcCWU=WR8W}v)w7P44tMh8hO~S-Z?_qdaE;CXl+~2HhC#6p|)-NCaXOj~bMlj1nOXUzVYo4w0wOH8UdaSPI`uNLvpnd@3=bL|Tu?!35G|!`oh%Oxgnelp-gi(n9sE(<>J3b#PuR8m5h} zO|oa@_0)f9&zTq->&%YTnC-7z2s*zIgj@(Uaj0cgu(=YSo^^|gur>?U+m194wrK15 z%QZ?P(aXBGvipz+9c=O`55y^$CqF{sNa`Phh26ydiAQGNefTLxDSG~GU_5MC4^=y& z{zz_Vu!#*2aku#~&3lfAHP8Fzp2~)q$*Fb4o%o9#Y@4| zAJKIB)I*=kfoZz0W&||9X^5L&@=BQ(Kj_zwOWbYD=jo~*1DBeCOhQAgvAO~VQu**I z^pXlC!^OiY)SSHDT4A=|WyTkJUuyB;Zv2Uh-lv(KRniY8kLD6CSAEr9OU(i@su-r% z#va*Ixw&*%S+Pk=r@+o#vrUDtS4V~`uh@qU#XGY{Edh%EP1bR?O>>CVNb)R40nOUQ z^|wdp>w{3S`dKPft0&WX(qBv)q10xA11@&c$ME* z|8J+(+8L{JcWV#U0%;^fj`kMo(yrA1O`zW(f;!4MDjvGiZm$4}@ESz2w)zcj@i?}c zmjg>p*NN3ROwQn0kFR;w$UkTPnY3_?RSPhJw# z#u&A}49Fxt!p}c`(armiK9m`}P*WlVJ%^=3I)%uz(sTr{?Vh*2DrFkkpdAEKl0a5a zI+y@xs{Z&EsGc?(q2VML`)nl)5$d0R(S5PXQtD0OYIk6J&I_yLniy^w#*5mdp=FJ! zTNfXWij&4w-ms31JUISJ+Zf!8P}rgq7+PvZ!Em+egsIysaqJGU-_lDrRajqUY#doiW6qri@Y^PgPPabimRkjOXSGRUs_%RwJ_;Y!XojfPyNqMf2R7 zSU+0i8@!^ACf4cMuP-+sgB{5mv~S8?f}onH|K0v0C-Etw6%J_z*t6UBOSQS3S^;ujFw1WWfk2Sv9(>LHHzDI2X@|?}7#o zGdEXDrfaO6f@8zYfH*b^;GkE4d&ar7)LYGhilwyq3m%CNiL&Ioc+qp}6ke@Hx|1sX z!JwjQXhi2BSg?Nw-ri->W-2G>Giw|D_DyspVW@Iner24?8{6&6GMJr)c0(x!2v7f_ z+MrVkiO?Y)Bbp?j=&RZD{v^2oT5B2oRcxV-vv&R6_}S zDG{!!bypxP`H)zh3BtOAEV^Af<=Du^QddM5f#Jr;Y7l}E+^3AGUe!HdiVJX$D28i7O-z=;D`nIt?3B-des*ge&S?1hbA=uF^GG&c>f8 zq9ekBnw6yY5ncMLJz{3cIyY(gjE~a8)yuZvko8QGtccU>Os*2ApKz)HVEsv@2(8e7 z^$;Lco4}eQG1{0A4G0UP86mODfVU)DEN!zn1Q3Exn*}@A);oJtkIEOq{d#lh@@X$v zD!_UlM`rB=P#P|jWoEXH= z*g&d=r4U!cvq@EIo2cPgrFH|FL{0%oZdCHuW{04ufmeznn=s zc448$6P%98|4dqm^zJ>otz7#kY=^aChqu0QP`_DtQL~p4Df8 z5vJO_xjF!AU$ColX&&%hD6fi=41QC=BIV?I+7VqXtIzTAaR6im;gkS;1NlO1`)v&E zpk~_DwK|rjDupsoDoAjVP60N`%_Z6~#5>AG$M&FK{6PUVUQmvAWknI;$1xDfta?>-j+_M;MgImLF3Etb2mRFYO? zap3Sl@3)-^WCzv(6-)&{7%rL)R7;c+_v8+NFijRxZ->^R*lpLHUvr zww#Y-B5@j^nq1)ybTA{MQGs2f9zgIA=eE!RsRlXHn^<66Ji&1}X?OJPVkx&?exB-# zmTkn7vz_&^85UVISsKbl3O2mo3+lXSsuk96L#BmPp zKSX~Dk~+=LTaRIC6N?X`fIMOS5{U%)z}-jjX2!2ShG-sI|6j9qC%~2^yQvtxH!1x9wIa5hl&$5pS9YUQoW#Y}s@rd7NJmjb8>8*f z?sEv6G7Z9%45>Z@Pk7E5WdW@8Zh#sHEj^UB&i819YtartVZ-92!<%mHqlLiRjw2Le z{1N(xaLHC<6^Ezd#vaA3reFncyX*+k83GFr*NGcT<0-7_^Cxp=tD|aI4e(-&@d(ch zn|B&>_kA?sG6ho@WzFcXJQwehxVE!K7Ngv1oMJ4i?7ivN48!<6?d$4zG{#il_)O~3 zQvKX;TaJ`z_D5z_$X(jJK9^BfOG-2L(q5nkJ5+64vBRQnREz4mB*jO*U72$r`iz^U z9&1eWmJ-OVGb4DB!(hj~)J~l%o-5P~XrVJbahI0tB@QR7H7A}wgkp`t1TD+3&>#7X zKJ(2>3)+A&=*}}{V&-1s_bX0o5FiCPy1j#1x@ubaO$B>M0aH=r(ZUz zus-MnsK!J2g1qh_Dd6YvF?3UU6cX8f|$o&PFPPf)#Zv(rQbj z5*;h_Kt~DsOFi=9jU&T?##U7D3q`rcmg18%f~${qmJwwuZ3Rr!wMVXi`%4#dBIB`u0RpNmJ7oQ*wJe)U3nHXa%3m(Bgjs;Lpk&6(ztx!XBB=F!$$$y!R6&STLo2I z^u0ialu3U#M*ea!GZm_K9_AduRE@tQPi|SxRr8zrJjFYES0JIo&pY|Kgp;8gUev}{ z9-U6>yys@9*(;6BV28b3pW#>DZvN?KBievEb0xw;T}ODZ#h{4gBbEHZ36xd?UoY#b(Vl}Wy|3mC zfI--CVXNod@q_i<(_T@$@?n6j&8J>fA% zW0lbF%?Ke_HMy%^(SETmFshvU*-S^zUX(~ppw4~?#{o0=ZwsLot602AP?U2N-k4X1EEQzNwCJ}~ z(=(}=ZMjfxeglvPCw4*>gPe1*Sv@o+jAZCX`GrW0FQ`RMRqJ*bZtla?<{Vov@EG_v zv{)tqA6t{I`IPQ|wLfNTq>TNV-|?;L%}mPO6j*JWiuF3a)1`axtzfk@KQlhgDD<6z z!HJ*S;VK$wW1{QWZByf-aldm4i5oU=L^LO?)fn5Wph-yl`8uGrw(z0_} zkGC`C3iO{C@jw#`hYfuF6uTE$Gk>k??1G2M;S)#53PAfWr_?tWa5pHEA_Q)n(3MWL zC4@2io7upuUss>0yF^xkN7yUBI7}Mp?I#}^N2D>ox59%!Nh?QXq+wiA!Tp1O4fQ43 z_QGq#&idJh?C(jR+cwmUF85m!TNuM~$E%x=#?5pr-!33MG}avGP;9T7zRRz46zkpRYVTeqNa?&=e$<)ZW=t2>HyqbLN`ZFAFei zo5kc&?&w$bQwpBeV@3~AR!h7V0~YnXANZ(h?>>WFzYmj7ZN1iNkp7!6_k#I4GN8=M zyZWZ$#Y#mQeE6LP8+RaZIGsq%)eR)V=W>5b1)G+CX6mp4t>&440QM}Ju%323avL(8 zcqB2Wf*bN)v-zd?zR6HoaAWXt-dLAV1Ld>9Ar_Avm9w7xN?vAPc1(?~R2G3Yw_a{2 z8?XKQ3|l`4+{CKaudd&B7D^1i7v+HMIvmoR|wGDVtA>gOLtETc{OPq@ojBDiA z_{JJ(2-HFXNJ2@tdN%jvy0$lD|G7kRIQE?qdg)9z0#&`{XFoOwQU&fVR$$v}u7iM` zA~x)-I^yFlsHD<84C8~?S<-%k50JI7cXL^NVYHr}o)1VJ|Kq-&V6XU5tEJqsXi>Kn zv}e3?i22`siDwT;pZEJ$z$iH{Asmx>XB`&rJdD${a>_AdUh|rG@s8@zgCw;KV^th5 z;sn1twa>E1e%g17`VS>JENfQFXo3@VCF^cj=1A`ehQzP z+sc1SU*5L8M@D*XrR#F_#nkWcyppe=xy$TA*KymocijR^Y8=y5{IEt<0q+In27+=1 zpM?X^eZXU9AYM(0Cn-G#5VA{P+5Gb>3h`CQYuF>}5YXL+?F)x3hHLtMw)^!pPO)Dd z84OYC^8-Jn%@0-!)Ugl6A+umOY+q+#?B}A7K2biH^Vy)OH2*eb6&zu`u$~XpYSl}fCCssj)?Y2JD)nZug?fjyD(e0Z}lqQ#3Sj(z%wtHQ_S7Yq?%n79t%jSVApv^ z)M+)H$s?f2lq@5gct!udtR2H{elpBRL_A07+PUpJ>@^B`;#X`~yUs2`%ZlSCUZ#JoqCQ<0 z3me8zc2y+v6zV9S$Khhx=HPz?Oo*T@b6VXs8=J2}w$bf4yKS4BB^drQwWQ&8XWS$3 z58Z8Q7cUlnT6;M_*Rvms&?!0L;Et`?1$q1c-U3z!4vk_LS~#%uL$Pl0LEu81zpWNa z#~s`w_~?CQV8bxDPtCf|3>o$NZzp-)=T0_UXbR{Z?;G<}FQ~8n7tmaX_p<%RmYc4c zrl0SXdOnVYZwJ}jKT?rD6zT{7Kpg*(Q-FnuiMc%vlT!BEBvU5fdAz0oy{GWX8*N?% z%$(Il(d44&3?T4@)2-)kIH!s1G}Ksv6s6flXVs4x+NTGOFoQk6LAlkYx1j%Uw-w2Z zWdSfu@EDcU6;hp!0-ZLbrqEmUfj$h6U)7?3?i=s!)%*Lj>-iYHo6V6#rJSz932EeTJ*nQf8Qm&^h?43PZKh5gYkCB; zsxsX>yQVuh<|~oEWO!56F!_xh(EbUBq(Tpa9hU~Y$;(Lt$Y!}s{BMp=t%kU^A4p*>_Ys(9ALVkK%$3<&cNmKxfESuTzH%q8h`79%i-sDA{mNH|qSoPU1;! zUP<7mRZoYccto`q1wB>$Xqcj5#GO5J`5qeYF|f!3-3k|PQd|<>_Xcsjd2MTZW&M;( z7kicoFL@_;FRe!p9#kAA$Qb6`xv5seJNWnY9N>=^Q3|*a@+=K)KTYwfEiB zYTJ{d$s?J3%kG-N?6>;IHq*|}@`s5fYu43X3tHQz#U~Hfzcjs3MZLUqDe)h4<$e$D zef{9e58|b&v`4SYf^aLS@2`TkUUj+Qnrc*8LSf>prLaTr<~&>>Y}PMF|ABn{T}%e) zko?$eCPfH`Xo@wZTp8c!c}8T!;|))4*qr2C2-5z2Lw45wOvh_mHn{oE;y)5wqf7e! zAjQ>Z$B)qO4<2AS86|gYLNu*|V%Ro}98oB+F8H$|mk%Y2ZT2T%X+JJ}ycba2Oud+C za-p;P2=f-ufEePjDAsw-yvi7^A6lyCBV;jKghi;X3oAmxURlHBPfi=#Yi_R>Ndgvf z`|TSfUp-pGa#GZ$9oZ>@!Z<+!bM20yj_g2bObw|hEOPE*?{HvohJIY(PXb!(G4n!Y~ ztZ?Ap9uB>Z(b0)dVBp@nt`p`X|pBG z_GwVKKTtQ=>{C*~75Rzf7wvh;E?U_{(|;3{nzgrpHA*^r>asutJgxXH`$osJf16cYZjR+Z&NH|Ie7s^!DhU z$9W%5iJoWdYl~@%0|p|tObS&v7tLQ;Y$#c<>~5F`jyo7Y3P^8p=gZ0_g!=&#=4Hn( z5@+rSfB($#3WKYn9c&|%*oKyG)PaXj0J=Jl4?a2V<8Hw9tGm_glW9-R*dun~4x*JE z@yN#1{c_dPH@$$^hLEdf0X2}U#X^|Q?`B9}6-@h|(?m}8nnlUh^1N3nmiyA{0$SbI zp24l9n?8JQC+1)wRUiN)Z92RFBf0fnQS*+X@`@1<8zTUf2cR|<0AY4m1JAxB^w+(8 zx4a*W;E3*rzF{@iC>Y9aoT{NM1BDk1uR}g8{iSp`EK>FUjaV6f(c_a~ot7=$&dYH( z)2>4QSN{1ZGb(dJT377*Po4aqgx)?Em~ObKx-B@nW}5F6PhJ9sym7Ih@!OKL(@vOb#h1u$yO&cD5?^(R`>I4+sWfaC zpoVv3GKxVb!r%y>A! zCW+VZ|InoE#j;2t@4PTdCL2&-{Q~|;+he--YQq@4tNBthOcnL%C86~FmL;}*<(`Ix zreEMJz+!{DZ`q*L#M;JE`fjMYjRpFj+7VzFcd)M5KQ{#kdZ_~ZEXX5L3=f^2N0@g#A9rWx}j4tBUE})TgND{j| z>Thf0kXA>`P|jP~qI)5-hLf02Qto0|M)-`_z&*GA_~l+YW0dZAR_UNgsr_%YcT528 ze>1ZhuK--N0lGzgyTc3K#0AV4R{R7Wr@F3;Y(pJ=4XDN}XIFZRVeZaaxOy&q)D5`# z%0Bq3)j?&U?{%3AA|XxGePT~vw)Fql1JhUJ3BGIFCrntYIZmY(aFqG_-(9&Ybx*~{ zm8Gw)lh4ARuUty}>rLe+kVj1=5bWn_p=EkS?ov-@+OMgq4@(`{5~MO*2R4ayk#uiX zMTngs#oFoWS6g%Mlh1(KrsLoMz;~xVyK_djb)Ne7b(xF62$ua8qjV3L+4k{Jn><`7 zVe7O21wPiFnc`_`>3Ty-K%J2C$ElyCDsIU7I6vY>o(>KR_MTG{6K04;R%-w1%P(R6 zRDr!ZuJd8Vy8rEw<*c;@>h_c%@2IKcIwm#mOOy=Of2x3;Hu)4-I`EZ={Y^0B>{trj zHViQ1{?{;WxOSRUzCfPF&ms;Q7~)gnz8j~;)hze?@0g*E>0^eU`(Bt86RLDjao@eP zJK37QywZy#%IwwpUFlEqJC7dc*)9o5RmSmV$XUy9b}Kcpeq++N<%^jF?}EGn4X}3K zK3;JxYHdXl1yT?Uk^zyRi-_zi^WFH&=VI2Oct!sZjpy zTFAgd*QF!x0CBtBza*|2{DxfP>jl1*RnCQ|6=_xhv^2PAy&$h z@msM3@*`CR_UB4N(f0>4tQz&51t{*HzM;n-^lwf=9kZj|TJ_xSXej;i=(b@lx7i0= zm-idFrhQm<^ojZ9<1*R)K=IT(quVlSKuco%rMrF<`O{T8zRWs?7%Hz)Z>%1LJJcvX zk!Zc!rURTkKvN(4ekY{3m~v+vAyjqsOO`N=RfvruqmK@+sHcx=1C2id;i| z%c_x1b7%O86`&pGEg=RD{B zC{4VnNHw{HPI{^f%rL9@koL9#c(PD;8DQZf)&c34Pbo@5;m5fQ0A2`be`xt z{|$g6UxI6=Mzt8Lu?){0b@w^M0DYhj>3(5|77+}~S{;POrt zGl=zP__vuD^$8d|1p(%w+Sl)B6#i*XA2UpvBqVS%dm z&2P?W4>-jQpu2H-7n(9_yrh+;ORgZY{!;ksee32i8P<^pS%nRnixwxs8QM|2&WW8p z#vA(UpZ)_%^m>g5&L5XcM9$Lc6t3j{RhV;Rl_0%VhTYFMCm-}pfAusLVy6gT=LRaW zL^z0Hiq~uxyUtXb6-Ie!N}Oru+&qrZ4UPp){Jz`ANALGv-W{y_s-fhVOJ*9-?{h2p zkY=cT*Bs)~sPMc3JI$(hd6gcV&rrqPFD?Tpl(GKv1`;%1XnJ!BlF{j%*VqX_6`hQ* z4lwBPlM=)RDadlTB6#4z8?oKVhxGhE`hH7Y<&2pEtC=fiBDc-W;Zts9#eRRXk~ROb zN$L)CwUhu@GK}yM$>JTs+g-IxCV|R&nLb z^<&cLCpyP(eLU0tMA@paz2esTF~{Xs>X`vL$G%;xv$IjHy&>!0-YPz^-2L*R^o=`_ zB12JELWj`bkgIT1Y@Q+Nmpri^VRq9y95?>OhiKS_iU1j8dNQB0CjYGgPTp4Hs*vrjH4L!r^_^~xq0d3-=U8?$lcug8 z1EOxrYkEGu&7oQPCQbEsD{42V3o@q|oRaEzCDV6#DyMuzrDp^16a z7xHsWbzLQPs>gL<4K1Y{j{SgDrHTAv=Ol0Lmtu4h-iO+{tG*OdhR6M5zmG4#wD&1p zzo69AC?8+1p-2HZBu>e781y1z&#@-K+V`X44fDatH=2zXB{GlFDi$FV?^1%Qsx?S< zij@VgWK*@Ve={lky)_uL_G{KDXFmPz~Ai?#F)$WUmiUW@#XeHlK zUz-&Intzs7dp-kpe<5xmt^#orU&$cZ{8~hi`22 zJQpA%Ivxo3ykM$JC|}V@(g|le0UQZ3g!1B?o)q>Em^DIGQ|-Iu-k9m;wVL`}w7D95 zCFoBs=EGaLbMCwQ^a8(*RqcgsvrPHSuv}mM zuK3|6rM{+&0n1jqpT7&dCTKe5njKf#4ePY*I|-g%gsde?u=Ld<_aTgKx6~B+zv;?o zY>3LOpQX@(7ttfx6RRcU)22YNuNljS-)X^llE!{Q4i+rpOt`~oJb4|!$loVT+V|wC zQ&vf2Tgocs#9YoLZ@NFC?O^fITWR5ysLj*AJ|yewDg|u-5!{|P*I*YU3=#~=lG>iu z2EDU1o|47`t(Jl)b}!KJNakP}oJ1dE%0av%V$e|n4TQ?kK|)bA8P3?|I|uS$J=3o& zau~_Ba2=R=wo`QvY=6R7==Dwu-J1HB=37Nwa*Uo_ny6eRMV@@*y`+M6o1aOAG?JSp zSSD)=W^l$a+;$|FdDLv>=)ysOKu3Be(h&!|4!>QRriXWj_x0;~KNWR*Zo=ADtfDp( zejI!qAktT@t2Qc)Mis#mA#ZBtjsqcZSfR11yHY^ccZ0Vi<2L`ZUATzox(LPCjR<5! zy@1cr-eL*c^h{Z&&0uU8a*62H2-`sM`;kVCGn&De`X;R4b4F7D`>`$iaf;a>R|mq< z!A}Y}NF=*ylGBs|?KvB3w%BjFI2FD1n`S21#3T7c!RC~}krN?UnmjbYrRsZ(r3G=O zz&Q5QM&t7H;6`><46ywM^C7tL&(y~3GWQp9Q(HSWX~}k@9H@}wBxuKw38<(12?lQ> zWpq>URFVIQpR<|~JC`Ae+swvAt_kgY-}_SATie#URo%+z*OI_2<-&o}7F}Wl5HxPA zOL)HmBzChHd&BPiJU3%hYpG&>3CSy@`xp`)QgT{%OJhrY&^tt zES%(q7p5@C{14IgG=yeWV1R2Y>0qDHsiMo;LB>+f)Njn zKmI6Wv*Ygzq0EZOtqOcb%#RFLS+|>ac%O({pUC5ryz!(Bc-n@1tY8C)g!AYgNT?Z- zorHu#J&y0kZ4IKa?2*OMx+KS@`I~>UDk(_hXdPmd`3uMW1-AGtU_$tKW`YMh0gq#Y z1zzlBh+sK|k)7Pq;4yAfx9N>sNRyacJ~RnkK0UdjIr%S_DJ5Vsb7;ms>^#P%@{k3f z_GC#i<_cO_r*Nq^=YJPWnd^Li*9@Jdos~w;6lSJe2)MHCs*2GL)p(U639uL`!|Bei zw`XnMTo`=v(&&CpWof#N`{f~yj_|?ERTfbP0_-T z45lRG6!#5o#W4}ZpF?5gf9W^PS%VpQgTxPUpCZQQbH7EMG`a`}n%)eIS?`ES{6!qE z4$Q#T3bRjmHROt#$Cyo;WrEj%Pyuz4n~g7o@McrmSJ*&%>QsdEX+Y;4SbP~b95spC z8nGoE>^Qm+*`<*z)g2mAbV^M+;$EhrSTe@o@wO1(e|O33Iz`>S_DbK~vPa1?o}jb` z6TaNg4iAJ)B7m14c|eXNW!s`9a@A7GjQz;WAco)=L$DBW9H@)3T%sZQG!O1mukm#Y z?WkVD#zoPa2V!rk^Rm#JS!Bo98AmN@+U%hwBqf;poScGVr)cvVKl5uoFWKH0=EX^| z<5D6hehaZnwAi3}U?yUs6#tJD7Or2prwX^`g41oJoW)WsdN=BjoVq07zW+0I2=~6- zWC@B_oM0xNO~yc0&q2cMPU#^$%*wZgUS^mAe)Z*Z9K}kFeJ+gUA{v^$+rvR6t&eyB zZ*W-bsA{PFJ1W(L;3}K2B}{>S8J)R zJi{3^WAbjt$wP_4Q&hmR&f-{8g5Ywq(odtYZ9Xw=gAqw75r013DMt%_n{j-Sv;`~L zIQ98?H*6MuOE5iet7JyMO>AJxv>)F?7qp)^zC$pN=Fbzp1>NktdDv0(5AYldXDYYh z_$pQa;9a%(C`E8p^12fG zPy8K;!1}0@vwpEmFR^QOc{c-IT%dnXxE&Q$M<;SSfmw{vBmEP6+EZQIRYAp}e$?fm zvthWoZ0y_=@n}+A@3rk|HBNUJ~U5MP2nqjZnG5-M>!0fU~2OC*vCw+ zP(>=llEJZ_@V?i1VNe&I*@Lwpm+^?p79LHMTa4A*LI!<#PSC5kCDfDUL_lLrd7}2T z7H_tqPHEao(2|o6y5U!jgtShx?s2ZoKk(Rmzc%6T0OQBgd2YLIEeByz&a5o4J#lxhZDjTpPx!jiX0XNyIb&Gsjky zF2Hfr1k)%bEG-(CwR@<3OE8+e2WPf=!7OY!)$IUsMyQ#zvHY${ZWnl?aB@wk_rQ!@ z{1oJ}cHT+qe5~05-ZX%%56Dv^&j(4-kM)MnS$T}ihy&I5=FSUtFRuoZK1E?oSr;S2 zG;jV|OZR#TgDf1N{^L~^;6MQoO3Jj7v{8}$P?ezXW}?7gPEdEo|v}Bx)lP-;d(2rnG#VwLJsGIc%|P!NSMu{>T4(l;;9! zFfUk}JO356qJav9MvvoSNkUnaL~Xu98O8w0m`w zI%EDoaeutF@Byy(ih3+)s>gV$^Gl3wlikJ0+shYI+vHLqq4rJ6D~&Xhw0CLKCGLx4 zYl#%8b^DWLwLeodVa4ucZ8jUfj$vJ4l&Q7g6bJ7^u|yP|!iMqq!0_jdDPb+%ha|p$ zd)%m=xi2;dX7Ln*PJ{NO+=$Wa+wQ^Ibl!WfTu1Lse>5j0p?d9A+T)xXYF&(wR93g^ zKl(QNx9VPr1=B1~Qd)-;H0wJLJgb&2f88#0Wz?TnYDO82?X>Sv0$|qC%{y@%8}_yN z-QjLBx5}NOBh>wo@5w5PI==Y9`SRYHKcPBqxZ&z6t^+?5?*j|uUmQV)4yW93PSZq1 zt_a#I9G(OI%jQ0eqPM5b5z`TK9qk92|u?7-+p zz#8UHhtbl@7I0O&e-wy{iW7_Gb68^>pk6u*hOo2P^S3@#{cr0=s^t1YsEG)I(dG<(@pYr=d{$8Jl4BBQ4N{26^8gR^LzAL01b)s^qX=5SvtfUx)PBAx)K=XGUsYrX`oZO~zCxb#DWO6y*)|yv-|5#*Da30JaiX zFhrv?QO71=OLQYNxnaA;rcolu=;l*#cjaA9cw5=bw-c1GTS}S5 zck^5SOy`@S7R=r&`Qy#_z)&Nq7jlu zeTr7?Eqz6lt+QW}B3fLR3bmh9r#`s$W8}xESf}Y;63$zdRVdfU+SVcB#!Bw1;Da3b_ZQ6!&NGrUwl$Hf_cL3R_kuPbh zv3X7E_T`3cXDnk5CCAp@>d-}R|0KG`gui^fWua4d`f9h$kmSjxu9OTc)$b zrrRFT`EEznf`{Avwp=w`7l1vcQ!U!}jOcc6@0JPb?xj5Z#JZa4(Y8^XxNc~pbo$v@ zVDXYq<7)Hk3);~1tf`ZYJGWD7xU{#{EIs4b=auJ?`pxRpTiuFK)!$VH*GG014JO#| z7&=UYdIp|4iaCsS1zgCcsYmi3JPc6dErtx&eR96|n0>LSUl)Jqrm9W}lUuN%1?k$- z9jQ0Abe}1s(7!PgE&DOuvT1FG7nMD2yt>-t31fSF?fw5PzkEvT&#ODX@}W$FvV z)vQX~O%)xQegDEg3rscy_l4TnqxvT^&+F9f&+GIQArT%a9E-3OAJxZ=-u1eE$ zw+z4vysfOV4JJHDu@bFcggKfSG@&K{SU1B6!vC@_rhC^q-F`A+QgAO{5 zF_OJ4&h~v2lD8eIL8SD0r{)tiwA6k4wxGqQpX)@mw;S_Q`MO#hCdclCq-NHo%VRY8wN5#v;7!E{(5qA@6~UnyV0on2QBVpL>a3Cd4-;k zwf9?nK1R)kvar+QY86?N38UvlBAz`AGEPo`F3iH(pP8j92HCroY_ZhmVb4XU4z|}& zOar=$VHTq~T!WsB0Xk~R=-JwsFdrI6=~@&)jJGOFo3M=UXsMJ;@W(#upw=C5n@UNh zt@cup6RbST8l`J80~MvMw3a=oGu8xl;adG%<`hOgg?dJOMb802MJGV~=`Mtfl{q=S2e4AKoUD4QbettXKDB7|O58oc#rrBE{88r_v>5@5+0$b|{AC01aW z$lzc|t_Y~S@JX|l(L5Ihy z%EC%3-BOF%r*^hd{TJMQyUHp)1cA>{Ph{f4zLo5(CP-W*;A!bv9^YO?{<1hXsc zRg>_^QY7rq!@SLabC7u1uqF?O!>9Gor$6b^5)c+PElPwd!!4QbGqYcu9YrpE+1M7u zNOAFP+kN46~@?k4e{P|{)d5F+j0TbX-_tehVp-tmz@{< zizr<><1SEolo!!@1aMW!x`L%myjtukD~V*nBjD4JqiPaq+&7-^HgPPJJ*CF&WO4;F z)p(BavLQaDGANqtsB9S1SI1*Br%G`_aK0sSipfPr@JchQt?P;Xv;|(z(RS12w4>0a zuCeSwKJ(pPULWK+CYzR&O*s<4&qE%&s1s2dvacm#(!SZkD#uufL7ASCo3N?4G!hdy z9*2QApHUtS85>sud$KmTFq0LQSg3&yaFeFOQ>(xKStn^F+d^>Um)n~#o}W;UT#e&fx!PdR98 zQbo+-_wZezKMqDDN24tF2@Lx3SgmjGPxvZ--su+V@!`E&@>*2_rIH%15wO(|jFTmd zNf@gvv6+YJm3NG_J{(e3%URCpp?Qi2m)>g7WORo^2AEvxWAAA_WvevkFxNz|w=w~- zJN+RXP=|I+vJcPe9diR{yVpD6uhT_R3n!_OK94SGBYeYq(G`l z@cty1m+@_mj^(+_!oVwk?t^aB6vv5o!X7H9{VN#ls)L>Qk@c`r`CFccFVWLxnC3@; z+Oaa9w|AR8x;OT>@~hlku#&MCNR9dI^jDw`AR(4jm&n?#^l_Vvfom&XgZ+{xM8QOI= zIn>0f2v< zTW%=Irvp<7pxwJU#5CyGn81PZ2ZevI6tN}Uq5zC!abEjS$}c8+CxImde+2B`} z6j4A&)h|;hJ0}B6olk)n#4MR{63Mq=;lC|S{Mm`fb&S-+e4oGjmLVXazx@+^5ERF~ z#Hh|eF!TcaISp1`MwjG`)-5lN*DGJVYT0(f0P^Hs`rRLqUcrr8))luam|GtcL)9l* z1W0!OrsQp=B_h|}*ebX$|Aw44<|rZ`)Z2Q*EPP1} zW|K1{kPI2rzs5^bw^r)O2T}Z5{I6KHVxo`9Ede%|{W~~jovDN3C6ljsY@!p9tDSV0 zsS>79u!e`sJT0u^ay(cwr1PUl@%zlPMEXloj@)DalZG1F3~wcGPelg8*q#5*ey)11 zdY*D2Z=;bGUT4MnGg~Ou33>TeTOn?^#ky~x#Fu!?@3`gcqzevzDTlQBEg<~mbbL@@D=WhU$zHHU_A;}~ z1Q@(y%nVJ67*&95=SlIq>m;R+%!n;PdGsU^L1Rkc7Jen61uxqrP|FpQ1~H56MHJBl-@`8*+|yU$vO^yr}8vER$;A%E`Ew9GStY!<+{y=?+HwH}9rv1Jk-$zd&9*37s*%ePHV3fca3 zu&jO$4jjAGl=gpU9I8&75V)9~9phY>G#umf3C=W5CB??nb8&N~LGYiJv8_x`VoV!w z0|0;G)0R15{Qw6c5Z~S~tRUkjxyoCGnd0aRUZK~Lpb`TrGmZD3PQK5M;xXTKxK9_s zTbAXKOUQQlFC(*t<*9Ohm6`N&w^)zop;cDJ%lVlpudLl-wqOJ_A2mWrFnZ>LH03`r zRoA;wrP#hJ-_=}4-!vI0O$q4lSGcOP(M=zfjS=wWO)Hl-db9|DQ?x&YV))EA|5zFI zl7EfOhvJxwO5(+@D@4|@)bJK;)>aI+I$}PlO#UpDM}InZMMGnL_s8oWyiycie>4u5 zurr$3OOw@~*^dZw-;G;BCZWnVV|&2ulBW`M_W^dcB{QCF*GB3!%4X@Vu$^x|r_Zbx z$=ijXM|p_y=9l2nU{Bpbkmo zy~GjGv8bw$_qTp({?v89+meu&vmNRRa&Qv%=Jd#ToZuKe-4@L8O7)OG+bZhU9@%W9 z+Kn(#M!QWH(RJOsCCeXh;n{iIz_jH*N4>-{wRX>n<b6Th|2dOr?g1z%!?nyjz?+gdceXozBm!PFx@4P?%BL~-U)1X~Z?T*Hf znGkp-Q~W@9E>ULQIzZ?*Ck`8%RYPH*epy?*<(LkSj*f>oM5RDP5Vi5PCF zwG`4jUqYEwTObQN6eIcXo_d1>i#@6^<)gu5+2DdFGM@-STO{si6=ST86lr>Y?cn$N zO^z#A3%ss|*!iN=dk<^9k2^J5PM8k=uE{kCB1aWa(b|ZG4;kKGDP06tfxTGHo;vRC zdmvqysmp8JFnsMt_DLZ*%tym6{ekr`PlksEe=OA4Gtcx*_G;6q z;NW7;?rdb8OTFo1oUL`8CGyNt@}mk0?qeoBfA3@@K#T2G)tBF&u_>AU7pPBwZXfdc z%h&TX|MQT}q@*>#+>UNa9Dqr3wl!Pl$h01yQcp3Ar0DdYSI8SS%fwBe_AW!M&TxRK zo0Y&Wxd3}yZYQ{i9TRz~=~Q%G!9D$9v8-CFu)r0hGW{sp<8-PNdt39xntrI^iBAra8%!f>VBOeXJjGe{S-2&Xhz+!JVfh8kgb}HKM04*56Q&|3ica=1 z->sAuy`q%z0CJ{VmS3IZb=lCT9GFJWb!THJH$7m{o4-6_mup9O%~JdxrVN@}R*n<_ z#TA=Q|A35jDSV`D)d<=x-Ff9f8)GoyA?;KMgr79ouiV2icfal-muAU^&ifblhZDwX zt0}=t98geS%x?5dHHv7S?l6w?gru2m;PB|}(HiUPIie$@DVRMyr}BBhDx#ujg{RUO z4dNzRV&UA$jrg&IrbgU|!iCaUEg^6lu&peY69k~eDlYGOXJAJA{do%8zc}+-C3L}% z4?0=6+1mINkC;pAMs3w)3nYq)>$4MD}B@?Q=CLbp^ z*BE#DQFsp0m1chwd|01=8lq)F;VJo-Bu`%L=t?m*+-Ie3GrS9M%0Qq{)>_#}{Rc(8 z$xC&%k(%^&@}%e;NOxC;BJCVcQT<%9?#qqEqvCR^(?u6Qikdz+uUa`;ESf2C*z2&c z9tHH|3Qf_E($ZGHIWkl?`D=s5*-?e+-fN(rS?XFCL&fRQ#~w%`k_+K(&z^f}#Vx_# z)6Q?VDsqkkLIZ#kOAvMO=-)bdS122?yT`S-kszpDPm@OH*=b1nPk+BXvapvD;`>9H zUbxk5qSrrF849CQ*JbvIWERj}JSZO%EM8UtIu~(yk|wyayU0QkS7Ji|boSZNaXc`nMJ@z_x0PoO42J1Yev zjEZnsL7=a5%UpBAe>zWZ>0dWOBQ)$fEp93OM^T>ug-FL2%bp03f4N6!j)UTy9}^BB zmQKH|wKh8&q{R+(-##{Ar9<)wk%ihFMf;QiU+O8{rKpeWQ^M?4`AVl*{{wyvdSLQGsqp_N=!ce zm17Yo`^7mT^*oSwWnPt6ikA=>S~-8MQ$_V}(g~!>iv0OfY_NpB424zS>Pic=7Du`V z#t6)RIBQV-mdfJjRLrh{OVIM#nGSYwW=eoT$0ffBmFZ#GeUoeUjp`4CfPiLSis$Rf z-d>f*m(U~i&C-OB)G_(-u6_U}$_b2?K^%dmRkgzU#T ziub3!nPNfPQ_WKW2+Xf8=vUv`?W2Lg$Sdlh4t&6*4b?DdgDsq$L)YE4P3lfm9@yYJ z{LI^KE}qj411!r=^;PD3u6`I%uhM8!aJ@#p{0S*UkYuO9I0GagYRuQk)%LQe$Js3Mf4bp1M_4Dkt z`5!)mHWnsh6egj@_qp*yhNL%f!ozX9@}zj$dI!{9&m-pV5KcXCR<=@3(o zf$I;pOik4HfWI=a(rMjF4nVN&c}ClyH@$jCRKAmAXU0QdnSzc4`9{yXr{ilI)n$YU z08re}Cby^v?>k^YQ=^o?Lt#1*V=X`}X(T`wtjEbh*4nVof`Zud*X=(keS7@&8(1z^ z4r^;HX;8O)$kLN3R=qV)SlgvOj~5k+PTbLYc$@C2)O-U){oL>MhRU|JRkP*5NoO&@ z%iVGVXkd(UkK)V$0@8O=c*+zN#pr?0)hgY;WPcmv2@*~4;MZl|0S-6}t{4@L6TYc}#me77YRaUq} zk2cuH;Ox0BSsbP0^r5<{U30|JtnU4YJb6B#3nq1)IS-*G#4=NnC~D00BY-+g_0sx! z-G1;`VTpuXwR`F-@PEQ(o_H>PHytU2y&mbdi8FD1CXr2yYoTIvNG;n+o!MW=h>ZWP zbdxB`X1M(*@sKmbWqUw7N!QmmD~#N!>TOm|&V2>;S$(ty1W7>V0jB!og&mot7->Cl zXiJIVbXt(7bWKeGx?7$K1jv;g*l?b_h%4$qhOwHukbgf{ztz7SU{IAH_a8yH0ti&m zdwVzSn7MJ5C8gv`ag{H2vvBlAul~uRM9oGQtN@*YAtQ1*2lE~C zT#AA0?}9q;yeuGycjGi=FSJTs#Tx-8A?S{_8-1(uae>5jy{_IW--*<0DyvLR&Tp_} z>B94vQ)w)D_|kxoZ;$$Vm1Vs;@srY}lkFtj)#OiOF{EKA{9Ka1d;Xy;qG!J=L?4y$ zu_~IgzDVYC7!aT+Nn}MNB#~-u4SNh+j>l`l>{>*_l_yrWsoI&Us0mjYK7Nu4ntk2f zm@d}F7zms>dEiMGtyQ;6DjB1`P3*S;L2qq`acl*zMY86!iA?%fz7+{XE-Ajbq1A0(9t+ z7iV-zT0dIvwlG*A12x@$Ezl3+ueM3X>1{sqr$=fKTvxAE+X4ZR{j=n431FR~Qj09` z-`fl1CnpD0Zv*jqe-C9Tor+N0(=hvz)HC9Z^3qB+w-Z0Cb$uT&=K8#rU%u{(aG|^1 zEDJdgv)Q()mLt&Vu8%=Z?_Vt_&MXDM2zep_d$?G<%W|Q#&Ek7_4iV!{wox+WjF+gk>Orsuv)dK)8^dlZc-ka;LCaO- zJ|qFKrb8q-q5}`lYxO|7qH|LkGP57WMlgJQxr40_rgN->29HkqnJYQG<&xr!6cH~o zNxgg_+9A)syfvCNdJD#E=k>Ufa%{toHBe2%N8gIynN9ML?>!D&J)e7zyWiX86}AfGrxN}iU|iO$ z!dn0^F_c@eDQ+aoHcFdnpZy_Y>aCYnh|2!|JksxIOiw&DtjYxk=KnV>geqUEA@Qbk z#@~+~y^WO{i9QEjvuj+p_XZfdAmqh(Qr@eReGW?1zyGr9K(o&g*Y<6Q5b3%^{lf-k zFSDBc+j*5tAgn$!HTF z@1{?-n%b|P0Jlo=`Mv;vtgX`$$Cm$Yp?F%{NVY{ z9UN3+1w(BLm2!;*sUjx{wAgPPJZGU8B^hOElKTyM%mJ%R=~Jf`s4LyAv$}E%eT}Zu zdqje;AB+d$<>5X6 za%e8_lL7Dp!v{rTTYx9geWF8DR@?n+z#3oFOG4o+qSr39K8ALD$!b^qhcoV z>kgofb7n~M{AY`+HOHx5hI@=kF+!pDV^)zFG2dkp(b4l~fmm@r0$(SXRn!`>Lh|Ct z6$~bm+$$w`^edY;i~r7h7YW2U;y*Y# z6NmgRgAV3MK#UvL#Uc8}9J`E&+OcR!Tt0_?m*+bxB|pIq$Kuqag1N~+F(G54u>tUY zjyBvXej#3Sh2>1kY03+?zkWf|RP5L~zy;G3WWd0MRzf;X!9$`E zoefb>0b#k&67Wdh!2FtXW38|jLN{`eS&W9Wm?aT0rR4HF!FRlN%=c(XBn<(1u-4=- z5zc0|k151*ZsLFmnS$s^=1+1LkT_xLC;IR@d3dH4<4jDS13Kuz3^{o75t)UZ1}E8W zElnQ8@+>{h#!v<8R(Pve7mI1jy-3=;p1(1-vQAQ)n}q_BpJ&}Ue|WrZX7MDOg?Hrj zJ>raRupx;)9^*hY5JZpFeK_CRlrn9cJf)CIXov#(Zqy|SV_T80FMJ+P+YISayp(@0 zi`5wo(%gy{ux{c}d@4yoJDPWDjD=-9Sf;(0Tp48O$BbL%Y0qP4))&i(Hk?Jlq+(() zW{ca$!TR)HEHpTEX6E^&UHrvGHZIUEo?b$Ct#I~sP8-XI= zwghcmR}kks70V(63A%tV7py$A`D_u;3IunQSA5r!S?=>;2{OTT#H2a6}Q7OZ2r*9035j_*W7i1hP0C?Y~zJ9@4HNriF(q079P> zp*q-=eMse)$3NRm?nvzDX`Ez_ldW*eH}Qpn--?Njg1T>srHBDk&L*;l|DAbdlIw#1 z#b>_9pGK`cCX;Y;7ZOq2bOE%UwlR4sW`e|> zTe~#a3ENtStO0#`k#b(^ho07+vjO`=K==EIjZth7-a$%4y+3?q#xV$vmWrNc)(FV! z%*9DA41a+?WV=^tGsjVqv2p;d?9Ntn)CX?oI}Li_)nevn!%A*PAKvI_ub8w@zIZKJ zLx1cdaI0a$Q>s3_eDz7sWM$6zREwxv+{bfe&#F?(4mSPI?9{V73=S->YI z3F-t!jq7V09tcrTl_=+zK^PUvSr6z;yecDy5Zh`HTS z|4{UITkdz}s1%|d(5*j`_6m5}m7^~1OcA`5Y3P!mRvfeos(vV`+xP~Pyd`@-iB@Ym zWLgI^iS1t8_lT-eo6ryFmCLU82P{(bz-N5djMQWuP69XNjU|16f40`g@g@vj2l=-x zg7j;BIzmC2$3dQIWR8018uKP?arE^j(=DWOEKf$+(3o4tPz2;|a$gN6(GhqAo4H^M zXONM&22Bu11M>%u5$oC6buZV){>igPv8~FQjhR!s{@PVm+V2gxKeD3O4=<(Y_00#` ziR%xU2dBG~4t;lsR1wAu8J7P)pgAW%?asf+Fm9X{upX0tM>P4uw=%dRT@g#MEhcy* zvJIaIVVfcS;9E_O9^2y%Mp+`o|Hs;zJ7rooIq&18C-Y5}$A76q9uVnE6H zysvvzW?{sqMCb>~naPmO9|(V*zn5UQJzH25OhK)*d2P=gFdG5z+9~B;)`7 zmw!g0_o7yn1qe3IV>yfLEBF(RFGmN7gEHI2MM*4yP4a1}{8&?bz@}TF>dePmp=$m< z&RJ=i#2>P3BtU|!j>fHOR|PQc{DJm)Pn%i8s6vU=pR79zHzaonQ<7cPSZbT#G+=|Q z7HtT8D(~CMFG=eV6I{op>AUlHCg1FuQQmVYFT1$Yw!$`IJe)L$o4;X?{CWxY3h^Tf zXt!+klO0)^Bj5CN?s%#l=NK=HBwF^>ssne4#Bo_)(~avLnlDqrn=^-;_h3c=|LJ8L zTFb)FwL_JBL{xiLXfuM85&(N~C-GkGM7NezG`5!J;C=^!@=9-Ld2pi>bdvhms#+8M zR$nGnII{%ErsUJFPka{}u!Ut}T;-mNsW|)V>T65~0R$yX4QkKWy?lON(f<7lao2u@ z4xz^y=QQkM)Bk-12uf=3K?hjk|3<~=SH9V5T&wRu?<0s*R{=dBpp*|CZRKSz_A43- zH)*yD>Cmps^t}tMhxDqWspGp)#Po2eS+yUTx5-m6U=pKRyEgBJ2YPA{~V<#0R=y znO}Z3oO0(aM{3gpl>o(nr zth`Ha$#mcSTKGb7@5^{MK?}>N>#qj{vgi#wKW_78m`RN*<`Gg6Rn32|&mj@Pop8BVSUrX|HL655C@V zu%UMSM-LgwmK^*Sq<{b1%=uDD-C*^aDjA<<Js$ z5rKX6|9)NUZLreOKLlL+3Q5E5u=wYq2g<7Jx6`U60p3)3o45W}YdZ9+$bbbbBZ9IX z4<4xj{`)dfqfXsc|47bWuD@Xber~DDPzaeyld?EQNqu{`-QmkV7LB{SbF*M>5iX-tuVD2cLIzFPKRq$ z4VJ(4N|THD-{oZh@iH}nOpVv?Bb@sIf5|(8`;uiCvsVbr(-rv%V-dh_6jtDZT7i52 zLkjIA?ZPf;sqp24+6iNn>z$%Tw20|f@RwO$*OqtQF>Lzq6s!lhe0R{dHqrqHvEhFA zO3)bGdESz+la?6HJgCiLI|1R68kf2t=#$(RGTP`EzYB9Pi{(q7{(6dD*UvpUuXSAv z4Bh+{XHYz#uVja+f9=1=K#t&=@9nIDVSbl(nvP$rzb}Mosp#Q8ZMmKEf6i;s&ikf2 zamOA#ME*XLb{ok8yu>MBheUn*W@)&imhjgqI{_*l3X?0^{JD8_sDSBl?76u2Yd~W2 zFKB(LUH_?>zBvUb=jPbPD&eCRP5rgS{04bahWX|VW^YU}^O0sc%_=2#f_SfHr~kDN zYSVy1Cs06VO*Nl19+$LS_WB!K>nNqN4uC^3Uw8a0!TkINP3sT!d=6ep$NPNKY6k$N6N;NmL6+{(^tC3Tqpj-hs>XzdgC8NSz(^Pf8n&_=UQ zv|?&@g^D~bR3CC$_)934*{D|lp-cq_%&Et{j?cMPlk{`!IyA)qJ1i}N+E)1d0OM7w zT@CrjL>#Y1vdu~Sws5pRkln$UZyMVg3eFu*)*OmAR-b+=bauh?ecvLS+3bEU4vH;)NXxT6WI z{X2|WIHf={ja+-s?Q*_x&A#+{005Sd%1|3@Kvl>;a(^Sw&CUROe2z?=KN|86K?xeM zcdOwVz!;(vx!-b=>s@!PX^w`|3ZD!vM{DB zZP{1w!bK|?V}7*eh2d{M&wlDv@Hr`<5ob^{&Rc!w@4tQGptl8=ccfdBs7X7rXhO8jU=r&9HM(Ws&zl5HjI=vTkulHaY zRgIQ%Z+`8$tmz3$*CmoW<>O8O;DlQ#7@Jpq6H5P&qbm<&`hVj?QYkuQa!ZO_tsEOh zkyOgr7cpe(Vy;HZJ@Sj?({;9#m5)F^G?ZQxR8{+g|_$1Deu?` z0mXO`^MBz6rN3vJWSCkg@^<8YmdZHAtI&Bex3r;eT$68(?_WLb`NY>}GU!9~L`!Q+ zEtMg&ldgnY(ZT5#X?~4y(rMC#(wE4N^Eo3t31(>Uzs+W(jMN+FpCGy$s|Gtf5US6Yx<$wWiK2HnJl=Bc>!k3iGOb z!=mK>-d!+Z2?C$^@9ZrTR%qAlq5JGpP&JZhs19&~om>;iO&=O&0&&+AaZQe1t;y&c zKIgJG%hp^I9I#NS_`}y$v?(P97@AG%IS!mt50>kv5rt~g{b>CbgPY2%i>X^~MZjFY zgGx_a^*Sd7cCFeJ1G~2P4W1|IeygsXB{^ID!4qQYOw?2D)Mu_4p?VAcr3FD9NgUAV zql2K1N!<5$(r#_sPw~AQ@3wq_41imaortI#Fd5F|RFdhCJ+;*a$`zC$rdr*EA`uGp z_frSZ_YAk6ZNF1rJv(M0)NR~--CjSFx-f_8 zfYCvtooBnN3=*=KIX#S_P#cUHF17c!C14Snc;cE}iEmi1u|D3h+Hx?<`s_jV!d=y! z)88S#h%ECds&Ee?260k?v8hpHW7s!c@j_}jv= z2HnQd4zp406H3EthPd^Ej~0A^S^A&ea@Dav5AUIgYa)k8?Ba5V>+LSFN(CExip@`d;RZaThwzVFK>eBr{f>KQ*S$n-0d;g8yrgI=133@yp^;uo=}jO#Pb zRyk}e$#;8b#0N`iT22)8_IUK!|28^#n!d6}$h$!78He`u*3}68vg=vLa-iGX4Gt+J z!g;-(3gkQv8hC|mWmmEIOL9ny6hx?!==N#HwIA2ReK+i(y+Ij)02u3tf4~j*uN9Kk z)pTxIf-SW%>93|5U&(N)q{Yv5w_qQ=D3aJ(e<026i*Uk=Iv-(YaCp#I37|@flBRxc z>ksF6dH~t(2H~^D&Gy>IIy95gwH$T-Va3JFYHcAAuhfsA_`=P)$`s|vrk3t4I?Z^! zT&wy=*4EFeevUU^z;ViUF)2P+=^CQzZVEJ*Ma2V?HvS0*!*c8cMh`PtV#d zn!!ol-gzJF@H!>%w~;eFUZTt+j(;bed7g8u-3V)*wrnl%U~*eBBzP`xSFB8F(xV`K zEBO1$i215~AJG2}yNUW}<-Cqhl_P8buf@$bPwlE52{a9H7$&S=I(2i~21~ zZHw5SwAbL|Tu*UlN{xGF%;PMUJl5ybNo-Xn#fB^9-*C=s^a`ZK?FSTsKGuhngCavAfCBL8v##q&} z81YKQSl8|cJ6m^3E(ss?0g~d95-vghGNpXP@%4eoHVCcO8v76!PO5%w5xUUR;M{g2 zQ2ez2r*Jr3KbE#Hu?3g7{5ygrk7}g<1jAo^s7mC(l0n!x8;W zQdOG1*|}2@!S!^-#Oc=;@YB1&6e4(apfpb4XQtl_?`DSXiezv9p9w~9OGpHJc|-sH z99mPtASC;m%i%3=CyyKMfkGFA@7ePWQHYTESKh)4yy_Kir#eX=jnS;Op@mh=rby)C z7VAZI)bK>D@FCL90UCc|3+E_)c{Iw`YI_fBDk(sYSYLT8NTxr3@x}z;%TBTy`Z+c( zk6j1YRas`1SsQ&1l(?8w_1NJ6rNy#1e)1{s!OOv^bu1s9yE zGtTStqxisykxuAjDkUA$+llj85|865?N1?$k+-p(3NzQrms+pY0ZjGBlD{U;NQSiP z&$X$BBU}zI=IPV_y4i6d($0DxeM_LSNm=3K-!8mg%db8VJ+ap z7>mo;3O-Wv^@^(q!7Y>Eu-1Xz^n33d53A}!#M6(fPdbsPI~U_~?etFXNj>l?$>QR= z&+UagF@MKxWd2QRNa&FnFICaJ@2EF@{+>`WkntXL&h@ z7ErR4QkSK$nPY>PmIb$E=zqZNdi<1G`ldIV#_*C1Vp#*}AI@synyjz~X_FJ^##d)3TjD;lInlM1U1|kYw59411RH*ty=|Xy&VP zacN+fCRlEz|Mni$BYk5iA&EPZ7BbI*PD~AjORpW|5S(hVnf2CgjWDoqKz)Gzzk5TS zR#rr{U!&C^t#Gl^Ig2YD`k;O-FeDouwmTZ0>O5VvU-J7_T`sD(i57T&Cm4U^!kQFo z3xKhp$%Ra-*v6rqi_T$s8cP~`&^J6&gZ0tGvYGMfSy;uj^<1DXEdIIW-WrV}V<{bX zJGNT@6?FTCeT1w-fAZ$W6r#Hvr0g=8)e_DJNL})oYR@yqW+zfF}VmVm-8f=r!ttJhGOw_DZ#=U7r~R=N^v!2B+2Kj~%C(24AaQ&T`cE z4J^M~NCn{uhH8e(Dc1obk{QC%(bb$OlvetnndlOuAA2UPCza~NwFt{4i?=O zA4~~H$e97o@qdBiuNWkCg2#a>Z|l_PgL|7Mpqc*kRc@_DA^U0SpmoHC=_2a)l2QgY z`z`AkBb=CP=krmuV8ws6rXL))N#aAct-y*=PJzx~U&5$xu4J_O-=Ta>O!?SL?4$Ut zr=HTfwtagCa89R>te2M!hgwT2ceVMi?e1Z*u@Tf+Ycy27F1et9P{tqOOp7!h;IMCDHj=th05SJRf z|0wx6YTq(sLbj(N_0jp-mn2x%jKk(GPvwqa%b(o*U?AVJ^;0|{n99_VQqz?WQ zsd@h!i!UYDxTvidp-SOX1MJV5M9j+QFVY9nZ@72Op0R_7bMU0w$7X!en0;X|1wHn9 zbCN_x@W$tm3N&wVgn(o6jlE#?$fsbh$+ntR%==*B%@y;#6#+(QjLbZ%JEY^q05*M& zR1S-TMZhM?{>a|jzBz9#ak!knm<0*l(Q|IY`kt>2#AkBHhiLW%jk60dhCOtRi&*|e zL0pcJWSN%B=*dtO<>D)wq?-7ahcdywKaM9i*om`hGj>BlCl_`M4_NM5wUc4d!pQpu z>+;43_x$v3#H~l{J%jbghUj3El3LK*N`m>$koki(l(yHd^|`W4u<|;lME~C8QjGR# zR&-rJGM@xrwvauzfco=76C2z8TY*y>;d^C=%%u^Q5r5L`ozjf!GE^xKIYl^ zSZdQb@#}R(F;mJadQ$_VHPnTcXJuP=u$hKxNfxn3&uta$X{>)KsR|_$%+d8uYHtIa z*t@3!0YNa&n`cZ!eDY~8W{ym}ZrRAczKb6$XzdPnBDXq>|4oXyEg1S2cget*gX^kuWu;v-nG3#KE+>K|#%Rl%INGhIR<6{q#(y8_ z%`ygwI`u^`g#?+6jjfqk{NA@=L1h-~CGz+mTBGOeGHqAVTUF8&U*_8thsk6$8rEr0 zocNM_5bhbe3cauexZ}`&9GZo2+mr8@B>S$EVf?0KAxodE6Mb^(0etlxb2L@+6f~TU zkF5&vg#8!)M97j)k%_#d@Je2gG{8pY-*%3+{X^Vn5fS_cSCCD}qokH+#Yej7y|e7e zb*8>>Hy$4aHxL}U%JE&a_=>LdG%9PFZp=2AI~kv$ziwPA&Zte_67m?>aPzPWd_12u z_8|#Ygnz$AoXqM)E!hdol)@qQxgx|Qs@=lGu4^rzad$3}`UV7Knj= zX8k=t^SlsE8o7F7de*RPrN-_z49!WNYOZSAZPg$rPwYrh?8^kV63J7ft-HwHUS1*& zWzaKY&ECJc>$7BNFhpj|5X6nNDL%TZ8Qh}_{Uh<5J*!NIz#%R5s`A_l2VquO632FK z!+PSkqzTNBxP-{*U9F1>Nq-NsbI9x^Z@P5`98RCYwIlRiQpw&~{$}&=L%4k?;H#yo zgOKNn6ao+>^a-U*-57(b81KEEb>|&)O=LAONo}4bbe`EL8jN4$5UnTDKF>Vr)9!XG zJ?5fDV~x)DdTa#tY%v-QaeDf@MNld$))BGtC{52+&x<1${ zL0cQ@6)&w!{q)XcV|&NEg*GNGUng3jGYwvIMDXDvK+wt=j~(w^@r&|~`)Rsf=1WO;ZCL0(MvXxWj-5i2^q#*YAj`1(mO(c#EhC4Pia3;nwK;HENvOCZqya$oZid zb4)jOYv^5bF=+{Qw6TU~$11&xd~->IKo3n!r(x>DJ0dE4N5E-HJKK!&F zaLkzAzd2s4e&?yom&Tlr8|NYm1!{<1XqdK|kbsB*D5J1`pCY{R`92MLty0uZ3jiI;CGPTw>aOv+>* z+Zngcnlg(nU9R&nh7i{-6Jl^Gn7KcX=Fq|5uPL5&XPHU#r`xhFP4`=a)r@Tc>;5S-Nd0sPcKKZKh*c^kY*ZiR*X77XTlfDF7l0=vMi_XxV%hJ z6$S4dSl-aczLgt{GQ&ms2727<8(GgMb?i(|}DPthx$NY6c@ z_S|i&V@x<3)rrW%r`ND_VKh_hXlGJTTusl(C)JC$>x20KH3_ncLc(ic8FW6IiJLrj zBmMT}ERAaOlkU}`*f>F4ESt2rv=?@SXWpZ%Y**LH^P=G z0FGERoZ3)dNeSO-AgXR&F=!b<9t5;^^15%h0xLkF_&09Okz@jQ7L93qT;F>#1Su8k zEhnr}U0_#IUhG=NEr(v1U}9V<kF8npVdR*~~_ESMO&JjuswT^wysP@0!+!SW>I zbKp7pW%;DJFA-DpW%K#!bJt>rI(p&MQ9<{&ZoMykE5CH_>|tqTEz_bUkiAUrC#DDU zS`9tT?b2TjjQjm8%YmLv3VV>aRhUYh!3^qA!!q<~k{pkBSnYn9PFS#{dHkgvC9j49 z*Y}=w@wB&K6LEHGadAHRe+y}D6qO@jp}@k8QTz6{cKo)ia|_@h$#p>ORFtAgj7^Vh z@`0+~y8F3+8!YCaLM{XQ{o#S!IFn^9$Xk(&H05lkk3^h~M*lsOkVF&KX8u&*x@2xq zAh~c^vO_i^wNULaCDAQ@eK%f@Wy`WTRJW`|0WN{$MCw8VPVT9}dCKZYeX=+G#8y!h zwgxE%GVBlzq&h8~Sf>kc0o>Dz6{nTPuD?Eg{RTED>Q2OI#8 z_eWRb?;+TtJwH>d+KiXNwKyB3qK`rB<@=tCxnk_)pQPxtkw;J^=0}t>VGvVZer#Rw z9SgjL1YzqNJ-UzW;_e-ZCe>V)t3EupCyDwhXDU;9L-9dwf-*Hs+O-U~`w_Coog}V} zpvz5`MT-c`BH_1|282SN<&B@U(~Q*s73O)f`U2&rNa)n9uf(Mt0Sw_duD3)?LCaDc z`AJ2bu&h&mA3ogMYTwikjwbnUJxt}7YbrJdMP4E1$LweV&G^o(gW8sL7!*nOm^Nz^ zdq;}w@Iq{h`?yQPYZ!^`xgH0O@3G#~wIvAF*%c-~E1QxZ4hSAX3^Ud^7AW)R<50C9 z%6xW4I3o`wmiXVpU$RriU>;VLxU*r?CKpX^=C>tDOAv)6JK6CLF`SCk`YFiZ2F{!{ zRcimC#R=5*XWPbTOpn^b5P3?oJZ43vQ=Or|#BNl5`M4LqXapBta%oOEw}?4I&R`^r z7!^l$`>6gb|E)E@Fj_#2>lZm^y&(5bRPN@=lMj@*o3{zRs&H+`N>)I;>bl30#uuF- zXI)Bd!{4hyr82D`qJJi(YjX06(*o8q?Pm)9OF=&GXN;P`8}6nn?AhePy3THJ>WC3W`?QK z{Nh8&^PUt+FQ8}q{c{D|$El!f+HLWd%hdhz%v+A28ktu6xZX-;W46(Hd{1n-nm}~{ zKSevGSzE>C)4?;@toH@%i}329?X8=$M&xR7NS3n_G((*DR!wiC(_}vC2e`KozDl=R!ZpllADZHS<)&EZ z9*5Lq(NIlT;+HB|RZ{e&aXv}BP4>ipqlhD@@jVJgM7VU?%K$tRZIgL|Yk~BnWYpXI zMnP@F>ogf)bUJFh_w|;2K$_k9uzWNrqnMO{RyBL5uyULde)Wg+NuQI>4sV}^wHWJq zpX)Yv7L&Yz?dK4uaU|w5B>@91{EFR6nJ_y^RO^468rMcciu0%ap#eLx`x$=&Bt@T^ zIwcc+!R`c>Y~qTf;O3^|5icN1c1v(3A=|$QZx)sLd@8L$%k3(i`VF19{fZCmpV?8A4Flk@#}iu;0y{J zCq33r@=qyf#3+Z$#Kr5J$TSK!|8Eu z5+_@9N3N%XiO6}Hh=5%Arf?*#kakM5R9&I8)5Pah`8Dy+^sVRi%pz{v*2heSR3XgF zr$-6oAxM*7YS~`J@T~zWo#)(%K=l9Fpt+PceF1bs#mL~km&>E51KJbuELfmIc<@(kE!}znpDiWxX&C3 z#u3@GGa@rd-s-;Rdxsj6-s_2AC1zTiDftL-3AM9F)70%yA26I89GPw??3R(GZ^6+K z3v8s+8W?E7d;YwSn^FxGOVmv?8j80u9G?nRmWgYkX_P;htfe0!+kM9rG}>fsU9Qn6 z?drck)1j_bB_X9~obRZ^l`n$cnx{C_`wg&6D`>_*&QoG~+VH))jKrhJhg`0T4 zGHfUpfsb1mV#WKd2P$L6>%8?LnIPn!)JgiM)o@#pC&x|z->m{yEC4O{r-vq5H-cOG}H1oTrtsl zH|v2q?9cM5=}>B~K(pPtegze}6i11~T7V$o>@eC3F(}$Z1&H5KPyHWXhrXfqw@$UZ zy<cZJ%C zSl5o+DjpW}UzH-AD2kw2R4+?XS(C;osX|$fUx%A^upn=Z8ENnVpVIk%}`ja%O;=Jkp@f-d4p&K@H@G+-TPVerBCn?Cja|DW=% zGH##wUazm|u7CI5T#jDoMxw*_^2?6(20%)LmLk0AdN}C7k;5tl6>Rmu&onU|t}&e4+aZ<|8l$i^_^=0E7n5&=p^|vl+{LNJ}-SRd1S5 zxAR{$3$@bn65>}4YI#t4+D&o3DIVBk>5U8j$v9?zKSoev7Sw)O#(FH!ukDcKR`lYk zVhAolZ?H7$36jij0}wi#U9m2CSsAcyC?R%EUh9%CQl5|!6y|?MZTwxEqV*DXFyaBo z;<(H;nFePxPhihe*M>FHwVr0r56yX54j+vbnM|BZ?8o1nTt=PEqAt}8B-;REi3U=2Y2|CL2EX2fWN1I#2Yavb|K61wG)dq#OqJ9h z5jwS^h<&=}7)E^SCn>Hc`mhKsyNnX*!IK5*JVjS?1AZ-Nx!<)p~8S!ZqiYShpq^U+S@m*2I$3U?&i z#qRl)vFc^~*tld8DHGWYDJ$sx(ch!G4Ht`k#B6Z-MGyADN9|rsC9N8(*>xwPmJE1xm*Sq>l ze^Tcd~<&}sZ z)XuUp8?+4F^@BAF+uXe92TDIt zR$VHB34;S-juZ)rL!^a!&!g=U!9I-39#S(HAJ|dC`i+v(uNOP;X| zKJ~?aW{S5pHNAvo9iqK(Rm_xhj{jYXaXbwN_u5kB?~$ZgF`1uz!f9Kgoc(Ae;0fVy zR6)UuJ~C4I4P~z^n&h)#DCBFUCR@(81xW@aUV}wF|6N&g_M2o@R*i?Mh!Q2KUYFKX zz78wjMLHGa+hKuZ;RH}9%rGOsf}}x7Y>(1|G+!{rfnpzB1vqc`{l~$N)mMLB^r{Ji zix_nr$-noRm_d1+4sy>WwbUNUJ~N&>>dvC07nL2^j-TADex0tiJy%T2CFsvv~Zli*L(_ps#B_sWlR_$1;sG$-a!GlzojDPZ z)w@;y-Es=~d{A25LiOI2?`>ei*$5v2G_QB}R(?L`*(M(Xsg{@9I3q4pl*}yaMbew6 z-s}ZcG!>Sk#2@j`9AJzt&!^}=3r-F$7iY_dCipz_c~1L}YI6^e=s)!$O+^dlfwVL{ z+;J>_su`|YdZa{nHe=ls;Ctp<=zmxiFU!~KkQRZsdd`Oa2zhz8n_mgvx8v+`Q0E@JZG#ets;h#to>8+IBK;XnZYSKukg^MUw^A4L}s+dL z)A&*){Wn{(<3xVjv9wsdM3kLTpH3T$DCFL@9o0$0RJlQNQ|Vky zBpVzFx*mh{MBc1-f6C1XKRl9KfcRz{7#w|)DtcX+W4YXAe<)i-Kkvic&aHiG?<0*l zS7|QTz@uyQLI{}6+^LR%a1q^@rAyt`*nO7`($(qhg3A?|Q}zT%D8H=Ow8QA8|XUjOO$^%C``2mKx2tlC#0jw3`X5~ z9fpG*x9`stvVTJleXV#Fe~(XAh&lMQ!(=qM>X{vgi4*?B(z&(%O|OoUW$*cXoyi!X zR_$f7Lnc@?IO&(&k3Q-vp9=BXuBy1bBb2RW(pDOr#S}HB`vATx%~zhr49NdjHDQz< zk*^4!GLgu)Cz6T?$avpF3V*ma^mrA+{=O=kvF~^Ad|)13RWBSB*3hNNME-0>&Wgk> z^`qw7P5{p%F^{>%;ZP^VaiuBV)$A0BuoE%|%gx6@ybeQ|+BJ6N$y4$4aD+&p{#Bk( zdg7ZWp~IuKBV#(fjUuM5o~?~SY>&on7ip@pif88Q-0ZrSSws(D}>(PY3`5Il|8~74w(BaDo6qqxR$ZS zZwdS$zA~xNFZs`|Xg(^71L#oH{omr7sn@4H;da)LYY;yH1>NJ$69Hqf#K>0iH@TYw z4*Ev=(U)XAL6HPfRXX?P7Gx$*bX80cQT|JE$;e7h;F2)VfY>^;XR)xNcn=AD zKO3VgB%uM>#ZOOKZ!C3zlL6)ExWqdd+jfX8@>E2rRfD*mfEL(e@;%Y4s>_Hh8h8$* zU?J`1YOw!TeeRlE!x9#7G=kNVlrjvxL@gwFwG`+R`U@5%#H>p!T1zExqH@tBiN|4i z34(D=LZP9m_5mga5;0nsD|T7p%=gG>!RsJ}$9VM#j(E?w2v%c>FdA_|z*46>ynz-Z zj;81e5y&+#uLTdrmT{d%<0!+b)q@ZADJoK<^x#ZlzPq(h`;%6pIK|ERjag%P>1 zZ{W1EdM*NB=+DM5cludSu46-wN!hVZCh2Q{r8>cRB%PI{vGBa0u}sT%LNSXHb=ot{ z&e}x;YinTzINHDQSr#eiRc7BI=YF1>o$_Fz#l}fHN)AL)68@c9wi+}P*!UnMI)VAz zz6`w~4G{Gz5aVy!qD|v88IJk{+=z%ELu-9ilk5y+Or=FJ4!YQV0I-vaTr`|hIYg?+ zWQ5-4>W_o?s;m}KQmx|AVCUJwYeBqFz%KnYSWI+g=rk>X#v3 zLZ42OwFyOC=ryz6+ej6{-wQd^PgkD_t*h4SmQ;zEQlB9eP|_evgelh#O4Nc;AomsB z#MpX*{z+mLEm^lN2ya$-^+btado9jcwi~yn9lEDF^V)`UAT2srso<^*#Dw@w`VdqI z>ygSO3xvaEh02H~3u)_e3f()IOjfCbBrK^J8@9?rQrcgbid}vErC?+1INSv6tu(b3 z0rzNX4x;qT?ejezj)+x~4z02`xP0F_%p1!SIR#v=LXRtgUDc_4K5E{#IXSJQUOn=w zc={VQBJ?v)>-&@pbo6fpkFq}>wS1fM56HwwD;pyYY*rbhvO9Qy74lLi+E9%`IdQ-) zx?42hO1e?K)2D~L?YD77$%bV_(TS+%<@z{vtGS@r2bmZ5{&qlw6=zR_$(wgLzQ12< z*=}dlI#-DVHE|nUj@j<*?*p@Ba#M7_efOc?1wk-Tahp1D5ud1oFGQB6I~tGifo}d{ z*N*=^wh69D-*Z!7yEL_C+4qWRO&;NuE$x`8--T-iS{-t>!6P zzV_g}U&Tjp%V$qcJEcCx)FZyf@Qa|82rCv{C$&zBrH%T_W>_(^Dd~6-Z#^bGV@Rf9 z{+qY-)==YP8LL63yj4B&wr(aedIx%xz#KquQa@L@Hi?URuX@qWhC--A`q1iF%dR8P zu(@2F!v~bqfX;n3<`I$ZiWl0zu*X^2>9N|O>50z+@aOn8!3~3we}ePQs`fgTogmC? z^h#Na`%$DD{@ROZb(?B}(K|g3)fH!R_TQ2#Uvu%4DohC^e}7Vz3nK5Yc&UwUm=@6z zftp~$G`~3Z;7XFeF1MG`hQN(w>?0U&@xWnysK8LsFszHN8;>l?yL2E9&LE7t>IZlR z5X8TbHs`YVDD59TbT!wNnEHyh3eMcPWrHJ$;hU+=n7F51goyv zW`G7InAGei_53PWT6mYXy9r+pTdOGh@*RdUqmk(szP&z*xw#Z!XlK6Ep->L$^meh* zj>}NL!y^lxkzHsC#X`5;-mJ;1I#ySI(SA6d&uH-f4#{0Ux4$p-kIo3TPsX~-WWp#F)OWSI^iB$6b1ts=?Cv>ejHFTU1SFE>FoK^0Ve+Se)!h@s$}uA2y5ZK?;m zdI-&KR<5Mi*u<6>j1*?ajN%%LNd>>2-f3K0f=&75xK9s$QOTe=ieg*xO#imPR2yo+ zZGb%2{O2bpo})?3Ov;TdB@k{k{n9EOAgD_5IaECIh!Gxi81C49I8M&5DOx~SLoQ2Z zi>5kcK5~)zCWGyP@9m}&cs5^|k7eWPpTL&@8Pt7rERnxc$!RDwA9`!wR6hc#uj;pQ z%?b7SNy|ZylH%UuC35i2@l7%K+yjGwW)7ndmYK@Pe5Q7jNz(M>);cIPx7`_FG-KNH zJ?t(;)SYLZ->gj#RLM#CrY9PwtF#>OhNi66mC&3TcO-r?s7>eKGz}d*#96C56RJA$ znOa`Gb6s#V69@D#Xr!&mMBd=EV>`AwyyJ&2^ln4Z{w0wF-zrZu%Tt?-IQQTX$?oQf z8yG$nvaV5RWzA(J0TfSSe%t0OTNfd(o~s?bIsW(Z0%x0Asbxdq znSer2dEIc)S{uQmJ%4oo;k$VELyTjh4p3=Hwby;u2QZAjUgQ0Z342XTI&u!wI{nY$ zIj@$+DyL}NOqevPX^quYKX#2VJ|K<2Tvqv|sQ-Deb`m#D$nP$ObDDbr<^J#|?fJf= z7tPbundc$wpFW6rlqy-M;>B^Va)E=^BUgVZI%w&SnCvXXIDy))Y?{#grgP9M`~i%e z>%Fx3x##vQeOe3~#&qahkLI7^QS$GZE$LzTW*T{_vS)C-RiiovX==>#H#m>XiQ&kX zHQ%gS1rxwvr8WzhH%p-DJiV)Oe&YB~QsFPSisQI%yZJ!<64p~Hj<_~4jr*nH{Lu~n zhn1@B37^~9Tz}?UrIt!?pshXxR@c!(q><>FyJhSAMp4OrGvhZP->&fj*wRJtU`|Nb z#np@It9qnHqx18Q>>NbJDyZZ?%{6|k=R4`C3=W_B%qC=g(E;HT(x>hrPoScD5$>N- zJ_6h*{VxOePd}|l)Q$#q5FeplxGq|APhJ-4fCne@7re^q7o6dl;iDISk^Gv&!HEw# z^++hrA`kW+Ea%%rIQzBeaf>~s`*h|ro_C+bzHJ347s6iqLa`#}f>&i0ThH<;jMUv| zR#?qZPvnsmn30Lrz8<%O-mE|Otul43p{sfjfQ=nH70*Tr#^Tg!{3UwgGMOf~7InGh z@aeu!u00EmV`=A^A1*0QBh{w_OfB0p+V=A*Od39r@q(JRiRGHWr?nTV6{j<=?HUQ! z%S;CBRHpvrp~V7rr=PAUcCD)Y3ec}{X{s>zJ@~YuEJ>9Tgf0NaZ6*f}#JvHfGwfUj z`G#^=1>cHD_^pE3r$Z5m&;6I_t}C|@lF#0DZh~0DufZu^+OG2f`j0Gb9R=@T=yiaf z&!t(-uQ*@vbd*7Lw4{B39j7D;S$13xP;t3@*kf?aFlU;5`)q*}X>%XdZ4;>g5PM}d zPm6=%3+TCMJ)b_@$}#&wF;=(~yQuu;l6o0cG8*z=4v-d?3;uvVKYDm|Q1ch^^E&V|`>4j0nggA1FWM{PM^?x17zc^u`l- z-k}^a?gMN3xjx9-?CVp7@{@>5PVvGl%g1pH`^~XOkK?h(2KPz39J7+rnaB*z2UX_z zVvBa;TL@X?K`o6=BJQ#W((993zP>Dtr=1)TZ1)n8v43miV#T?r!Xf>6eAzJuM?_+J zDgc@^TuI;n6>t)B%_GAx^t=1JrDndRd{AM!S=QjUp04y}Yi0S8epP!V;{uT$0bWz^dM0E19;mVQ1`eWI~>rSdSEE0YCDhK;)I5C zm8I5*IGppdnwwpx;60jc+OTasvcP7|;dqCoAKRqH#g|&R`BSKS@9w~eACQ0mN#3t+ z0q;W+$*VQL43(`snr{wva`xE|bfgb+vJ>i#;FCnRe(0s2s4+9oZLRMgL|E@(zl7RD zoig6EY$&|kVqhN4ceY7u$#fI$1dg~xlYpY!LurpyzU}1(N@xi`zR?L*9e4jE%?nNa zE3~Bol3OxOi09Vi;hoiKaq$bUxsCgQwvM9llVbm2d1w&!%f@4ZtFm6qS3Vi#K%Zqf zur>0`8FJ!TG4Dg=hbH3V`0R&9!((WMYj=U!Sl^UsKwlx9C|r ze`bxFK@9cHj4;Ja_+7D&t;)=V!O%1-R`*oQKL@Sm4!-0n=|gXUF66gr-tXjz$b7EW z3>wN`YlxC=TC;PrD_>g{DDXFLZk)EupMH}h=o|0hv#u}lgyF3hAR|gCl&BEFSgZLk zi5db{OD-{LOt&jJ2{DOKz37i*{%3+^J0s9+Urpzlf3i!VN*(a&Ec{5Wbi~d)L}U<= z%d#}oclFK0HQnxsH^La2IrVO-%>dM$lqY;^vPq#Rw*zERtkU#pO)sZVScgG}@pR5Y zO}n9aqOw~DIH1JDU5n@5tu5s>yRH6^$5B)7>Jw}i8@-lCE%6<}5-{jmGdvmf%Kz$l zm-L*&^&qC0$qe;$49WgJAf2J9s`gb$@@(t30-gq#+llH3=`89Ms$sU7=92l!$PZM` zwRzV;q_fpaI*F8zWA13N9fL&9dHU2ByJpSwuKH>Z<*teO=^gi*4P)#aAfE)>oH`J# zP8Poq5oe-@xSwO&A(PKM%7TJcKVS&&+q$ZpBv<6@n;Y{~V4TiU2jjhoU!vGsZ$1v@ zWCuz;QX7AXF`3WV*Lpg@dpf{*NG-}xE&lzD{ps%!SJOd}IhBH9aM8aKp}9)y6;094 z*)u`@uaH5}kHDubgyIBA4<%O9rrzzEmRCP3W93ho;x4I7)$-(Hx{haU{+UXC5+A>S zj3xz4iTGedJp2=`3C2AC`$~MuWe}8zQ7o9~4Hp3{vn)!YV)QbFw?=E~wXeMMnNCfe z$YA@QHIWx>OI){f;Q<##p-w#xM{;Koh*qH+CpOm>##F9C_oYdvzaQyirievF@TvbY z>rhwniDix!Zx&1xYbFRPW(QX-ShvGL1&Ya-h5s6J+X|^{lclOC7Am7||A)9KliQ^J zZj7;e4*&FbJ^RkLB&CCC?KK4;yMl}#S0GTjCM7W69- z^r#3Apq%c0cHq}n!IZ-EH#$qurmFeK;C&VG%roKijal=`XJ}5X}PPlr0`@4^y7veQ6flvQf>9bJAg80x1E9&Q zXqpNc0e3k>YQK`EkY~&I_VVvBu!}3^7r#obo`^E|cW~vB6<=Tcz`Alk(D|W+z$sg&#?h|2Ap)4;OzS(?8YP+ar-7< zKa8KJ(EHf_Yz?ATl>Hv)mtu#5e#KSs`MaIpVouVq@t1!h7p%>d@WGgu76m}Vt=@wR zAtDmvf>IFM&?J9pxi|#u6TiYV$0&xB8VT$qf`U9uMXmbp*TmgLLl?eyimhHM!2?ax z@h1mddZX=?o+^b_Da_a<1?^myOkODB2#`b9^wj7t`4OP43&|G8SzB}n&JJR04yeBQ zEEgOSvo`ztQoWWJ6%St(R&GJ8)ZwOs` ztI^hw1+*iV^wD$6O?eP90KlDH%ZXeID^aP*{NLZh#sJ?xb;{d}t)vscZPzbvbbUFQ5sQ6?h++KL#F}suU4!Outb6 zY62wrjU><}SDmXBeRt;2in7gk$MPbAtcI&TGWkOUb*R#Wlgd8cdS{MgKlJlxI3n>X zrafG~zni#wG?NgaY}KxX)yl?CehqJEgyY7_OgERjgqYWgVSK3ZR$%5NRwG)aoU>;+ z#r2fT!;j4ma_k9VMvHp0*r8SuZ-Uq+yQt+MwI<+k`p^^AyaFQUo%zP5zuwNJUH#Cf z{=ozmyy69;@Q!6P$$ndL`n^W9sch@BOqucxUaDnJs`6CyF8+MstEJGVi5Id~#nK7h zdOiX0fQcm?TTo5|Y(5f~k3Hk#fzvqaHX8CcmcH$UU#WUMmRKw{;DMLH8VF?Tr}n1O zzKZ9U^Vb1$_0PZmaBsd~jQM7mDMLp5(wq5UZA|YYt;Vk&y?nSsL4ST?#A|*`w+bqp;mDeIZ+_i^ZvI^sxzS5PIuw3$YcH1fqRCO8kN1 z1BgYYRnKW>9>sUm@_b{2TpO{O^#G1PX3tLw*O;I4Gn3REt=p1> zZDWSO4nIWr==KQYs4HGItr^dp#Q7oUf0Z`YV@RkKutRal0VJT()jmsr#=lWj?FAYu zmvohd$k$RV@Yfqog)_Jym3Stu1)A6bG0!QW z0htD;SN|P#Pwyg*BNKWrHf^x(0nQyV)X=@g!8+^hlCGUxR@r;68>op3C#(-IAOd|7NjN__FE&bEjl z4a3q|eTU}Jk~TIqVdXfEd@@Sk`&r3d@3*^$N=BTbut(TTT0#dc5UG%;T^!%ZAkNZWqrj&aIh}}(2O%zH_`68@oZMQz__J(g!|ZH zHrAo@;*8B22H(XMuC$&r*3Ab>Gp{uNar)sEs@Cm)qbwOXSkN* zw~be>Rt9|K%JnLxpN%B@))ecT2itFD1Y@EDYxiXpYab!d@r_f8CKdWJ{S`r_kb`d^ zxpZI8FaEOPxJ!i=gF~UGyPYu?iYuk8Dm|FTtziQZ!2Iy1xWw(V_Kq?!FPF#@2!C$4 zp9Qdx0s5dpuD4#g1^w2>XHkV1@%xriVTl?d(@a3eq$ky^{pv0qn7M;oyiXa)( zoN*;fH3y1K(ns#|uX%d7@(Wfbsw$fDpNFlS1l1z{=4;V1(6*aj%aE`=otxWEB;6jz zE0c_k@bf5pqar)|kJ&JN$YXMHM-N`+^KZgxXBm&hnWcAR;CD&s{z&XD)Sbqx*6KX? z*-cn4a}!@9v!vct`b`%Dz^&=uL9N*fle9-C&~15ls*sK5g+5(vY2nS1G0D3lFo~{;aKGhPdqiX7))p_4HmxPt7MpG zyQtW7MXD>8_^LKZM$F+IAVKbNn8BC9;GB3?U3yWZwC^?JbslPDJl_GK#8}@u$BR=rdGdXL=q2qu}?p%oS zS|sjYd~$GNm9kOLZnd|@#rVv7Ovn9@g^T~o2WVzyssfSpT?Xp|A@uK;MGiD?vdtcd9Om(cRo`+?nm~3Hp&c@I_%$EC2z43anh03GS_Ek0lx#4QEOC~B=w z56#)INi;D%(6k0sza^!P#5Gzk1a=6YUc89l4RqoLAwD#|xEoT7J-~G7+lQPbI@DL9 z)@*95iHg#Ew5v!?wIrHj1>F?&HH}=V?Wx?R{Iq{JyuwWyeIBF2fD#Parn4|DV4;{k zct=3(8-LnW$)(u$@r{UefX|6L&KQ-`B@uCKd6 zHw43-zE;MPn)gYorpkxKLT>-4L*E|kiOh-SFSd=p9fO*Oy$}VB^x|H7KJndHyYiw! zfvVm;q4EpjA&@54gz!zfuT)7`+TsP>CK79ogXq)vdR&Nq=Su^AG&ZW%yC~WvXugLY}{cYwteAn00LrO+SFqilk!j2gWm7b*!h8o z%H(c1X&~M*wCRAKaxa3aXj4w{r_-MPrW+lOjX3gK8O?Q>@BFrHdJkX>{~R!9PYs#Mdj3nM}J1py=B1 z4dpHF6SbKo)esqnsxvji#Q>uF!|iRme;iV3AI$DlZ~erFaO8URW+{Vx^oe;BM@|cr zN}SFcsJ+Y7A%c3ZrTfJ@n4<6FwXI4r(+v_r{RCDinUt z;9AySNCP@nh7X!DCYy#D?mQxhh#!AzxK^8b7{lDs>JQt5S%lxG0?kb&%hqD= zpx9$+^R$~byP4_XlXuV=Myk6RaA2_fnYJ~&8G#=^1!5^Y=3ZRAWN?diSguVbUH+m^ zAq~cRnP&-*F7j~B4j0{ZF`%7G)uYUR4F}c~)WZ4WaQT2M2TJWQDw!RKpkhmE^0w=c-h|A5v`np~)*My!0tek)#lcVbml`JG8W&)*@5M;}%$<4qHKq?UFeGADvXe-;>;a#GYPEZ98|f^C#BV;6%i$Y!sJ*>QPr1tMTqHF8>Q`F5`MVC16K zGmU|4GF^)F4H+~j3bg$8`UeHW9i{7n2U%lMD=!+(zegF%ES!GcTL&n|^gfjb`xMrZ z&tBFM{jW6H9`tfaOK8Ee&E0IZef{xp8kr~8-?{RY=P3X_Ha9~SGc*DDxM9>4QzhK1 zxeVI14JGfpib})sGE)az1>yq8!~BDpz;ia3Ec*wQ91H5I#Tc86AYF0G_2eFjL#TL; zEcvP^6KwCZ2fV8E_Zn3)rm;^jl!FxbEaXxFH0Om3;CUfza?PnW_pGTeP^2f%WriNj zQUiGmA8q8tAnF!pS^`m6UC&I!6!NQq`vshUfseuu-<8{7k8x=-)gXs$eYn}$RI-Y7 z)wQ)&^F=q80P0|%4F|ujXs7qieIR~y@+n3S)XAN=3y zaV8V^`6$!uLvnCjwb6Gy9ok{*#pij`ERR`5G z4Sw+QaBa7Z8!yCBpofwR=!C1DhZ}k0VR_+`WGWkL?x}96CHnyhAGKc}(9iP|IaUy=kxt0MLMy1Ua{633! zt5h)?UDM2RF!{09;4pmSxn~fj9r1Sy3D`(H5zq}?l4bt7zwpm{^#cuOmJ;;#y-naZ zF}vo_TgSQ_i#&t;9Fm}9X_fFhuvKy}xity6=O9%M=JYFqTx}W!tGzgi#_PpDuWwZr z(gZi0(-#5ZK->Nw9}wq%GbGw>4y*Na#&OMvQ_jxM;QWT03uA)hN$Om=JkGqsv{0!_ zpvj4rFMICFR;G`&ck)QEdBKopGF1KkujEwpZLp5iCcHsY2WY)h zFAc$3cgM$m;o9Q;TB)8DTCg~1CHKJa9K*EtdHGY)GB*%yz}EiwveVT%42h2T?IX)5 z{q6J3)o5N2R2@Z1$(;Dk@AXPo7AsOi(=X2$r+oGqj3N^T^^}-dE()fW?>>0PJU(1p zk4$--kvo`}ozm=?qcLdC(RE5>;)`3QWoI@%&<{u?l^3HZ#{x{<%1%4PUSFJ|11bF> zdVus_Z;j6JW<~?JOZO3W?=^`i{;nsh^PtjD}gR5IM7Ms*W1Kv_kd7IB)H>SiW6KXZEVLj+iYy7(MtO@fOYDz(6~Qaj@^2rWI_R7SCx8>F1sKW zz8zo!lmOagjCx-PVUr`YmY6L*dRenrEoWnDVSLCW>f4`b0ENGQi@3OYK9F`$?Ju?_ zPfgS0n=zOriX8{YP#1W4@gvtwdQyZ|pd7dZh}zN*v#Bjkua`8+9dWJrfLZ15eG zDFqaTD!GZLzxTBc@Sq(Ra5uD0NC0Z~hSc2zI^T{0zSX1eqi4dLNR}9yez&n|0Fca_ z9n^a|^=bH;Ue=xZ`N&qCG{Fd6vpavK7b*+1^K;Vja>7?Jc~tIuv>8BqB)r8dx;t@_ zGUoiz*QkHrclHc2y=s1J$8X`1!R0}IHpR;XNENaivHXD%Y|!<0xXmj`+@Lhb9+;Zb zh7RGs;jxC9H)9O8sBeXmYP4;>yh?7U{S*sd&X40RgS%nf1}!=r42~bKFu5)(E^(?Z zaV=ScwPB6Bp#*STYc@j%SXd|tEk%0+aW|GyD%!~xsfvH6QD?f}OtN{u^_Kr<<{ny; za{_-db=zSkEa_m0X49ux4A7~Zh#tMTJ++O06rSGry}CO8gQaE)fMW?mn31FWm~TAC zb&hM=@U!o-T!u`7K6r25vZ>X&*g)AlXdS+e7c7F+(JynQJBscNNrvL6Y%ahhr z06p#gVUHNfcQnN!j3q<6DqYkxgG-?2;9_9wEjO&|ta;~*!EwDx4ogV{LtvgghXGNF zt4AIMrQ0IyLC4;nf5eC+CucFFWBdm|k#YG0$!_Aw&V8TOI}^n0)k<7d;j1ugy1PuM zfdasi=I8Q6G;(AHxJKZ8HL+GsS-!Gc8hVG%?uzejTED-;A5VQt<#n-&-sa zdOX_tBj_L6Bh};SpoH@ba42sHm=Z07>DzHhQEfXI@L#O7q=TzDx6bC?ag2ZJKg>or z#Hs1{7m35M`!ze&n}r$EvEE9hkIF7osm6V4scBdg&2&74Y4!^r_GR_T#s~K_0);|t zR91a*00vPlejFnaFc_$_rqvD`Rv|#<4mFUP|91Xpbmk@=+^m9z9USWR#rS|Exk;{r zlEb$M%u=Bo^=XG~B=YF%?BBgR1YkmSSsW1Nj9cgIsrw?Mla-=#%8^=gZSR}-T!RcZ zDsnTvWxLFD#r^T-J1h||_7$#|P&pT|00@?ifnN_s6bg9IIs@feb1bo7Q#htNYN3l{ zJ?O<;MqsuKK%jR{jiFz)3!cQSD{r+>_nNY)=&G$CtPy~o73K2smAQ|tcD{^Mye z-8b!DY}&sz9YT^g)c%aS6Fyata6+#z8=`Zz`mKMqN+KCXSCraXd`8rF(R@dC-N%K# zSY11Nqyj46)QVDsqEeeDnCuQow62q)vlaL|X~?rB(7B3O?!U$loirj3&{Gv3CBDn_ zM$>$+d!M4+2|G)2r)h4Bx!=C{b>6SVZr=;TcxSf%)-1PJIPVwZlq*YQtU8p}%pw5~ znG;ajOdJJ_i~P1M)b_jKkBoPvF$OOKM+$P#UsXu%Frl0;iG&A##Z<#u44@?Fo(gIS z0=NfLzg2tWOQ9w*R`tYvA~hHc$66=@ESe3%AV%Zi<{kg zfDw&98H@;3jKE)cIcPBWNWf$ILXs*l+0%J75L&kY)PhlXnEj2Y)n=q4La$*hwA)6Rs5Fc0+oE zjn`O@^D^wYq!KRGfz>IhHG9tnQ_C(6o6@FxsmvC6uT_KUq`=R{&fN@W&8$jPYI8z~g^{z6YEp**#D{e;E$DhJEh;9&wTxc+&|_<@wZ zLv9Fwr}-=VXn08c$PS4+8abGenCg1~OJ2}pvffu1&UKfB-C+=-4JCIRJnOvfD+B%{Vso>E+WY-=U+V6t zBq^)Xf@v|hd=I0Lq1))7_#<-6_~>#DMNKS3o}#(hY$vNTA$*hObIpZE*QEKc?fY+* z<;4PiZ|VW`G3NYU<~2S@mk-V$&ZI}M?xhQcFL?43Ra-7k99iPSCY)3dcU#OLHMT~^ z$prq1Agr>)N<%8s*yHMteT-`>(`h*N;!()spwX=PP(8(c<6=NGK7BUmUwNIUH)z78w=LqDbRDFr|1NM3Su0M~FWjv~rLChh|db|6g^d&p%6cGq$!uNdCe z50r1d6kA$5(1S@+l@}vzy|I;tTbU3Rv`%74Gut!S5=Zt%kzXtyx_y zO_DvPL5p@3UFz$b(GWB+x)E*bzNSMs1zNnnb%yr#FkQ&q_HPD|{gI|#FX}9hw^CNH zH2*xw$(1LpA`RE_u)edQ{SXNmQ~Ot@gpVwxaP~KH3@ucJrWI^|h_A(>=V4Fa!4_8+ zd^MPrj)15(&DBYS5gJlXt2+5EN#OE6qs02lbzbbcHScHnbc-?eUOgq%D^BIU$@OPN z=$g$kkM!VntBre&7CwWrxay$J>y|_k(JADdVB%1e9o-Ur$9mAn9U1)>2FrgHXYWhY zmfvyaQ~Kqz?br(?le)Baen2<4$&33epv%SHIv0W*KKoTrGDW)4E}pEWd$98SS4mdJ ztEhtf#y|5}I*h2>{*Fe<3eFp^=VKtV*z+zz#i#^n5Wt;6Ea0ZDN@$c^bF`(^>~()L zWZS19ODB!WaDFA0U#A@-EXzrCRbJ|7AY>QwFhCsLk_vM8G>*Zb@sTH6V>B6+>v#z8VW1#dKfAF3T2!; zLQQ*^%x)wea`r(dKvx7op9D5MEEluVCho*FeXqd)+tddOZ;9+vDiw17)_JpjzxC3* z5=x4Ubf_y(EmXpH61#}eS3M7f=5C=BWQ)}rUW(q>RyO<;aQ*KmeevR@ligOCeiBnP zBn*4VJAD&iRZHIw>k|TFG1F|va9@l_j!=hOLtYYlWcY(wmA4x zNard>OLuGk_0Xzf^Om9&`)mM5l4Olk?&;&PupQ^XBvL`GdgV*wG>dXzxL z6Z&F5V9YMTq#xc)&&rH8sC=ZW5EtTW?pTRA^W`6e+D#?;DGy- zjH6W2?B-6ZiqGpaxt1F>8-Z?)yz@dm?k6Pc1FTJzQ{~z;v??k(&Yj6jYyNe} z&HZpOz11U8^5t!81eT;*)vfoOz7J7;U~nR)yjhkSKhxdw8@GuT_A;hxf&jW=+Rdy{ zytn3hwct!_zQRr7!3yku9fhmEkDt3^J2tWv#s0hI(obT1nr}s%Zjw_-h^*P$tnXXI z6$u5N7 zD5f$d1)C1q7^8=lu#2_X!W$W(N4BY69guQ#IqD!19`OaG!17%vval%<;j^JhwEN17 zCRw?MnA=CT3;GifVF;RHb_%B#!yYV3cKN7^mmY& zg^;T^iv%u&W4iUWN)+oVU7Z%Mddh%%bbBWG>fDHp3J1`+HpWh?!fuZtJ_PPlnpwgL1dKgi|!oPh|TC1D^yU4dWqF;t-tEa{TDAYWw z?ub?zGfR7}>Jv`_?Sewh!9(;(WKGdp@d-C~BNL;|9`5GoKe*KM=diVfvDy1oVfIUO zWjuk;1yf{&SX1?KHfh()&){DPi|}36+9s;Z zJ4y$GJqL~-4eFa_YAhC<^e296r5-nNH+a_3rm!euBRxo$s%mjEC;W|sH;;t^ZSg(B zG&JF1M81MMZ8f?DmH$5`iU=O=j?niMmwIDa?E_6T;e2PBz+>Sx<}}L<)Y4hMLnd<{ z=CvjgoO00d4V?xvcS6@Rm_IP=%pbe=K4PMcTCJZ~sPXDMj6FQKVa>Z*nNha5!tH)u z-u>cjuFiJqlBNnoH+T{2H)i9^l77q&>MU;l+@gL^C+~Rg66wUX{}Lm3IVe{rlc9Ym zr^Q+Q0D=aFckWx%=o0`~D2}hn5RLJ$U96AKKIP&}|8h2q=d!}~AZkTo^G&<|eEpRF z;?u=;$I}a#Rn4H)iHi8BCO0`F`NjACfL?D=8yZNo9D8FcmI6NheYirT~8r^)`z(g*nTi3M;iipk5{o2NviBK>Tlt^a$V~D;vr{hOZWV& z(K$ztRpOe|-XrZ+nuo|wKB*6EKG6GU`zNi;8A$eT5IERuO%I}!Prit^vnnV)`*s0( z@w?dUT%h8H;0>bX5TKQ|_uXy~NKkbAG!B$6uUR~30!lVB=~L%Wc^_{)^h=9xyf*el zNxN_C3vM{zR*_FN4m7w5om<8s9K6q^hY;NsA44Kr%tbVlW+T283Oijy_EP8GTGs2`zjq5t;%zb0N&Q^o zVC1-S=!-Ke-}C+LOhh2~TRbWkznjcn+wCNxj!a<~K%~h#j*ghzsViXA_dXGL)prih z%5R?p8D(XjElH!B{#|its^f#J2)dZPx@RXBA^6AqG1={?zU*e&i61GyH1Sh8zRE0BLXVbnA<6@6y z#Maw>M!@B1jgW)fULeZj{foz9BfYSy>dHRbcZFX{n-+vIhdZX`gIBHg_4DuxMBOY6?2dqT)xrN2+!;Z6H znY_3QGIePM?u*UB^;3kdXoJP7T8Ku!b868ZMDW5fD7A0Zbrm6lD)CzDxgxpL1XQQ2 zTow)3_WYnCz3ej(n`@n!(%%QKd86xP*P|3D*2_>>*k)A*O%6hpUskLe9dE$)Lfzgf zol5;&*UXVCI%uY~DDA8CRtwc;`0Zcm`iwHuh3csv6BtDB zFpX6q%Q-v`&#Q%$^?7B0NgJiEheeq$MlaOIG3JdRVPPYd*$|{|EIoyscxg>JBwwxM&UCVQcP#x2U<#06{Kz$Y*ET&9Y zwOI`%-bg65eizNmtNFM2&5kY7>kNtLxXlj*BPX*O6#G$yGM_W1DGNgv@U_`@EAj8Q z`q2Yyc2D4;!*J_R|8pcoz+_gArd7n~_te_da2V>+c80MiBe83GM4Y&^UgPUM74e|n zy2+?~&#d-l8$h!Fm_}ah=`Pku(AFcH8k{1-^l{o$?_aoR_h7zE66{(X$fYh8yV8 z%bo<`#I$5pKut0D{6=5kJySp=%5RlQwqYI-1C>j7NAyaxSu3`$mt1`LvbQseMP6E~ zVR`F--PQRVcvIdS-Py^+mL*?-S0rxAS=UQAf$w6y;^iL~E!PYz8ng$)l>3k6 zZ2nsj0{c9A7qaY!X*uT}i+_)@zplbv^0X(2RZ9Wv?a(jDHxWUO$(ZDsYvwWiB8`!fwk zGE2;4zBiP8mjH5Lv!EI)`wYslFIMZ9ul7wa=xyqS$>NzZx6zLNn^&-^yn=Uh>1m;&=nyEV_=+PqyLqtc|j+BlE;dp z6In&_0%eL9`)@F3W{VqR%ED4sLB>7VUk&F&|Fn`4TYDn@+fXJvSFGvAbO^?YsDf1M z0$X#To67GG!lam|3|8mM>mNHSlv{i$)Al>bKbh z34nc$i&J}iKsN^tbvONIj{Fw&^%%Dvh^B+mWT4Ss>p?zmS0(5xMepgCr)c>KFX{>2 z+U2N0Dck~*P;H(IPGY3FDcsIk#Zy6&J;_!(hrpKSb24elVB_9dsIN8G4yJ|Zw_2xY zNTTbR3l)PVZYWiK9RwY|MM%)y#6lu0y*-oDkS^;;?LZ})?EDT3g-@5YI^SU7d_=3B zBoou)Nl5Og+54hD+HS}#tjsNbZGCrGZDV$LnKn?pyK{sn)GYR=?WJwD2dwiT&(|cc zzEP?6w~x}k>js!Ku3gn0K+?LV0Mg;}?SORdqFM-F3j}hrc)A@A!igqZwTHwChZ$b_ zZrv+VLF3iZ*+g_a7%VqJvpW!E!vg|s8R1s$4hAhbaNZmP@w|U}^)NH|;VD0lRA9Zj z&shk&?_9nVIoy*A?%%AhmeExxRm^-f=X@^xn5)}=@`m4RZx^vI$gV*!2Vs^<50qIx zU!`jY97^%c923JBXYmHp$|H{Qykkw;rRlm1u>VEm_&M!sk}NKUWj^!&3~>W5t6A&i zY46&{xciJ!Ot}`o3e9GNmku&U7B1&rDbLHsAFw?M{LraRd2frASn+s4rDFGp&j?(5LBV&WT_swghRyXopKEZOfG zt;a{gto>+%oQce%U>Z4k^P!i59B&cdXhb3|)8QISKKaifXz_a)688T8TLypq60om5 zuNW6nC#FO@yg$sQB!hn0Bgwq9t|Ps0RnS*tVk)yODVI=)Stc((Nb1C7ayKRUE5lqW z3+}}A*!nyQW=n71MWbrW`XTJ8C4kPm<6ufl|7J=T%%3BkW5Qk15%O1S72xgT@;P0e zeid7;cXwv7Nz^(Gg3%ssnvEYRKZ_LxUQ|DuwD{_IJM(t+OB=h@d?+rhQje;(XsVwV z$`=@D(w`eGZ|dx9rCWSfo^n%S)&rj&B@d36eDI`%aBjBipIN+J{-jr|8{Khesk$vu z@2l6q;k?FH5>KkCvz;^l53_nLsAa#NDv|qdFI+w+!qt?Kal=ahInL62fg@;KOamee zyULln6WO*q@Ms_vFvj2ynG52LYXlj7xfWfxFt>hOVn0ZDTVIk}X8pyR_t$k_7WW@h z>~a)8H1q=aICi!!z*CsoH%s4*ed*Ns>-;iMKkqHwTfb-I0gZq}-0|DiN>+u|p%j14!Q3e+o#DE0``) zr?znRZHQCgj=XnqCedFxCrHPjdC7FSMS>r_P*QKZt@(@>R^|gqw!TrdaMzAP&Lckg zlp7OI?sl?u#}HgbLvHX{e%I$Rys;dGWTh{Qk9m5|NYoFrbwLl?YM1SwIVRG+InS>B zlo!7WYPoueeBbGpz?rLRT?hBX9XiJilzq8x8k7flel9FoCHG)j179fcTbU^7-^wTsWucn$>pg^yvD+)pMsnv`_uAC> zrfnENZ@yI86pxYd*HgtvfSCEHO~mO5!`iq>ZQkRvv7hnRjHq?|*jR3#=uxSaM;`lM^JpttYxfukt?y`l;me*W1C4O=^M(Q{;A3Zix zzO2&qM93dx9)CWrX_4sGK$baq$mxt0c9Bl-CqM2G%9q1|_s^?bYOykXeik(5xi0pw z;mHXl@Jt2tbFRps2vB>B;p48br?!Ru`}y|?-UBwt^LM=}o7prqw&}}O^tL8~QqnfQ z30mm(n>FOk_V3O0PBno83~>?x#xgRZ ztha)6qFMBRv*=fr(o?)I_ps!WQuEp4h!#u5H8rd+Z9m*uAt#DrrmYv-ZIMAC|2wM@ z1q59~o>cG08X)Y*tV7p{^gqJ+4ZEX3QKeLfn&-w1#`Fj^Cx_|q&?p45r?dS>4fN2A z#9l*u(hiFoRXFM2#<7@3H=*8GvfVAj-xq37LwCluSjw%brEM?mdp~<5CW_WTfhDi% zToIsZglG?h|f@eQ)NcoVTju((fC+F8PoRf z=|eu0636$gR0+6)c!^B$LUVL5nGizO$J>7cp{iYYAS<*1_#@2OiO$!=F&nR->FLT7 z_BH=b^5~{H`4*Ak)4D^mXVS-Pt8H|-Ak+2>BI{eT$_eqvts0f|b{6od2um?D zo-vyy@2jy_BU6#dlMaM~;T(dPNCkT_{=Z`uUwGJ%YGNDr6^hyr!*r=iVtwEPA`DAT zD7@n}LA4;t`+7m95G+s>&u()Pv_Xbi|9eau-oq&JM0U=0(J-^(_yoT-a1u}W7vm+P z5c!w=bGx1b$md=LN#JP-LEFVbuH}dtGUlvdfSj^L&WBr3u2!EXM~*G~wFXebImH;7 za6B^l<{J0A3qfzSBN1KX{nb@@0s%|@w)CQBcYRy)=`EXA_S>E?ph`QQcAN>Rp1`f1 z-dP%RTp%;3t!=Nu^7r?gvJKCzP8z`TVW)Co6!LFW-_eXGAT+}(>c400c+E`yQ%TPC zXIxnuH)Wn>OR@_+s}ew3F@CcJ!mQd7rqAsJr5zP=?49b447nTDY^IgYeH=28vb49j zEw9rzWx-1uu|gU)T%q9sqjCdofYYFdDh^)b?1`abkMxaWLI^DS0=-qzKg=jI8<6@&k*4WjbJgO`B{m!Q+pc<^p zn|Wa|UfUHjlSaKeCw8#*RHXhyZgp4%Yi~t2a-vjU=K&0k<7kXhoS4Xq^W8m%ESsF7 zj1%?4$XjZPEZu#F|7{s?>8MgSLIFI_g44|J$Z`H^_ua`TawPB(2y9KU?M}bCH&0qBSK*3?;MhB22nGW*f!v@Qd^{u>JDMHTst*s*h`w*fPY-=g5%Vl*eD%Wt?xHa@Qsc+9 ztwp)UL8KpbI^xKg-6QzPr@|w=pNI>+^&yg!L;D2~Z}J$n`hOGxM8^pk2-%`!iSQ*% z8(#dmY=cRN{PmeO#-#@vu+2pcBvOczm(5N)@#zYe&U0C=XIjj2&@Nb`eS))=6w!h> zDvT}0zgmSqpD}PxGON9JFs%Pc2>wkuj0FdM-SN72Y@Oi2Qzb1m#BWhM+akVNVVOdo{xPqP0WDz>O0-0JP~qdRZ?XL`)_OB zg!m?i-^90v3>=t5#{Lmis2dosfE#MFR;O-9o}3A{>kpY9CTZ&$&g#7M0L(EwR#fI& z*>!&wQ7c+GcJN4N_jNlBsbHshLLK7`YDX$?A;3S>lAc*nwCYqfcj6de|F_v*rbsNl zl}bpU3tmJ@67r(hJRxtT`-b7?@u&9Sj(Gwt;uv6u2UnR5A9p3TzQLUO1zGBz)F+#7 zBF=lqF{C^*qo>;5I}gi_^mFtkoJCL!KHFhb8P6Dx@||UzM}zJPwiw99eUp_P(zahIjf40ukdQ{teA2k z>xQ!4)JIuDQvha`W8mJpb31Ob*RkmS&W(C=azJGi38Gu2DP>7yn`z4mb6T1Ed6jv# zZVTg2$K}{JilMXUosGM>#k8jJm6Qo`w20Va&IX6|3B972^3fqEQlHv7*|H z>Aj@qWyk*=Nl%Qwz-U;}I9yJtnbEyBn8r>PoxD3qj|SkXPQ_7OQ-2QKPjICZ5rssn24vWLkx3WXl2;Y-Xa4f-A%gnnwhpBS zn*Eo68@_w525x(8v`3^)(45MBu9;n7kMr9#AJqIDBXadYI4UzfGs|5Co5NH^r~ztt zubES9%h{v~4E+b9K%A3~#2#|0S*jU~2dB}B!h$?_vcfz+?|K@E5BZO(9P`{4eVO{I zasJ0{=a#`ITB}(sP}v?+!?ss)%}DRCRX!CjJC08(|7i(AE=>H&ivP@{z%Sh>lpDGMexEYpj=N>+Gx1ww9(^<{pD8@QKW#YSmE@Th3+=xQrq+tNnW7|w#Bz7kNiJw^D0fY2 zV{}(`s!q1i$3q~+p+kZd>^6g0lg?LWA*fPAY{Xbe`c(pX3r?r}!|Svc%Ve?bK=y1E zP_I@@H=36To{$@_DB>4Pv*K}<+j<$CP)tV5jooY8`$|to|3Fv_Z32h8aPGkY?MF@b z^}yeSGbyb@gDrfIPxAlpksr~0`{LzZ1y!zx?-y0x1HtIcCC@$gYgT+ndz0{$EhwdV z>u6|-hA^m#^rS%Vkjy#pt0R>zm1ExD=YQ}@DeW2kM2jinW#yURI_Y)Y8K^8-ZUxa_ znq`?Fa(uS72UYh8Ft&pI%4FySQHw*<{DMW8Jb8cYK7H~-^0`22P@ZGL_JQP3-a4Ih zWdH|i?15JW*o+F(?s^2AP&cFLE|pi>Y$>^iTNw;lL#2kad%R`~TW<-kWtc>G=Om!H zT^MFjfLTpMS~b4;M;18T$d{vIE;SAfIG9M;L`9tM;iJOklAlzApPpcB{l z9p&g$KbSH?OUrTEhZu$RBWibGffw+FnG!=z{@EFz1K(B9)Jm*LP3CYkpV@tZZ92%Hx0#F&+B$IOxiZ zIAY&-=Sj{ThV%k!Ux33f%*|mR)`51f`+U6B&<`(ALyk7x0rb)s?HL%v^1aVB6UXX< zf#)hRZq$jtQcG5o*%dgA=-LorXoO(@ze{eHO6Z{8JarTrd+;R(FS{%D#)lQKqA24& zvD*t3Kn~yDM4JwbYaJG9>2TK?BhgnCsxhPs1L+m+*)Qgi44Sfby0AF%2IO|!6;-FN ziQIK3SZyW^&!c8(<^!(FxKROlEe*otVldwF|AsYI{iaZcNUr*g)N+R~Ob|ZHG9(*% zKK-N(XYh<1{zZl`0c@`TYC{8>37lAnoth>{z<1u*OY$C%pYo9{tst z(g++r?#g%B)#j$}8(a2!{2uDi`@aBK7^mmpWY&5>EEQ{VxNqs#qyr;q-*sRqPyWIXi{!%5yM)9QhT0>O#TNv~Hi zp1b?A=YGtEK1Yk@;@Y`J8`f|GtFJQ`j&tO`fUyP2p?q6w5jR9J7rpU*=}4^Kr_ncU z@;VtFt^-&`^CjlIX?gy+uiRfHJ=d1|J(h6%v|fx0wc%M;xSmWk;3&D`t>sux_ID3k zE$E5^!bwuCCov|2`>)lBRVv3W&=Tj9F@0^ksbvo2lVe}NSOfWJ{`r8R_B|hkT=XW~ zHyusCll2=t&>Zt2eC_KbkVDS3s%Gjh_nrGMXCLPN{UsQWiPi;QN4bUPT59gMsRooH zXFTe6d#Hoy8hl39%$}pMYH2Nwp^*vB4=UZ=X_5WVfN9UCAd-~j8C*S0E)c-ek zjIjrfr#xKS{~Pxl3cBcp_fk3ME_=6W^hp~u$HIeo#uZpE#dUsbt<9U{C#$_2d^j+ieAQaDX9BoyTAD;Pahw7*aJ+h> z>%y)6J+;A|`Z~&zYfnHdV2)yvB3(S1YpoS=L&OSNr+Hh-wVED7i+Ke7(%cFU?TPQ3 z=o2i#^?n-aPxUSRyH40|YRd60(z-eC`}_LnJ{~s!@wGI+4k_mLcJSc5c z?hoX#b=-iXC_a@V#+%=T|5q`(}#NqrLbd(1v6rN8|g-ITLks10+tzo(C3e~cS| zYbDN!+UM$F{{y>T3%ce&seL2A<#Bt_Ltc(SAP48aaAO>9iXESOV$?r7{)lpvun!SQef?(tQV-3g@LGql1NPAz@?2s*<>4`K+dCFV zjpg`phv!jl&ei%D=IyBlV7Zd#OwDupuwt%o_;E?W;)OyVYqB=b_55mkjxDP-QK2qj zj#KlyZo|B%+qmuJ-xu=z#<+jPRZ2mZ*Z{WC+)*y~;YV+CiR&4(=KtT`z3fI(G+`JX zVKfrr29Q|Kh6OCR1g>W8e}z~7|6u~B+uhZ5$U_|7M=H%Q%-G$Tk&#guF5Bue?`xU8 z8{TOxwT%Jd6}ZlF|L8Tvdfm_F!>*%aXaBy3+t*_ED0W#s)~{`DzIOrW%lo?0>$98? z$<$`9Z~*d=0w!9qzxQ?OJ?X-FnzLxh32|5+({-ki z|IK(U*k|?6&Amlz0Q+gZSe^$Eo2_SEk?3_-%t7Q`f3$XJ;sRq>u8+1yRb_K!m(Aa; z+dpsrjdE$*sBQDBe!X|zbo=oD;0)yv%P-zdZ{`XO-E9^?-hxQ4WzXxe*A74S&K+<| zabtzEHE!*{by;k!iZ6ZMXZgln+p5=yk38=G#0IdB@_u#P#~=&UPf^#j_HFiVtfIBk zHW`RTpf9Z{t*vMG`8~0Y`)TLTa-@FMdD83a>xX8o{@l)%?C;*Y0K^kh!wl2w#)4_Zjf6heqtB<;a&KeCdRy~`IurwzJ9HRfmo;xKPNKxhz1O;DKe2xk z<$Y%5@yT3sFSdZ{v?i$Y-f6$#9tIIwTNvAA2`?&>EqM3(RBt6KgG}qxW7tX9lS`6}z)O-(YM)(A~pU@ogOS#LSn{GOqIOI!f(z|&sk=KCDd(Cx#5%NjT% z>GPc3lrax;luNtDb=gz5w+9a%HkeUt46d><$~;z{McMO-4^*eU1wd@7o2uLsXy0b< z#t~W@G;x9XwAMVVIoA9bHosTt<1j}+ELqpAhkWGsht}aTZJNDqNN)eVK4y8AHKk&7iY^)&{9QmM-|# z&KY9ReA!ynRq?6YXKaifIkSh@cvc?QRU+;A#7Az_p!aF-!DGY>ywl!gHDqu4*q--B z@2~HOEbqe$tp}R8z&cuYti9Ycw;6N&m7DX>02$gh!IpkBlkJ(SKyiUD%SDaIIwTmru&Ds zi3?y2tv}Xae$V#Z5%n{BJ%Ck|d$hOB%0X^_W-blgc@%KE(SHel$ zqqW7iOYUQD4!W{;*qksob41?fiIH5WIX_Z-(*)Xw*nvk@gW`>HTI7A3n&TX;1Dd#i z4_bpB*CF|}FOBEQd5*r{1Bh!@{&CyP#eBBuTC>U6e{)zB2L;Sr?b@*e1H1HR%*S;$ z#xvMlF=uno&;|UV3AB&$7xgi`v6_iJ>LZN@V^V|S-|od`-9G@hPkHzDjL{4BguZO9 zJ+M8WIR@sdyzXY?9oNlV4oKEf;As=SExK$@m>d7NaUDZzLu0E;>w~9m=hz$1z4DUH zAM-d~^u2@_K{kqMF9$IIjd(z>5hKWiM(#1xzwknP zk!n_&SlcvC(e`cXjBSc}yFVlT0UvBnB7fBoq5g=t{{zvm#@>y}IU&ByGKVDVoC!Lc zulB+`qmo4h8aEZ7*0_E2)Gg*(Iqvp(nfGzB>=DEWvhaQo;}NwkJkUNg>x(h;xgzg- z?AbYJzoLno2kSBq%_V0ib=Z7Iq1Q`n0^_j0-i^pN{LEZz>J@NpW0wQ3@kpHeXq;4Z zTJ!c^(XE-`!zbuB#5x}DX?&4NZlT$($YxPVW} ztK`>Oj^<%6wXJ{0y&kGc^Hl4eMu{<;^SO6z)+N zC43G`=J2opZNA$Jk7>>-CQeI+I?U2d{%!NN;+SOMF`n)95L4KLIEkftjiLP#=TW0# zHtjL0f6pGI;+@8lJ=-6}Hcec>KiiMUqqStt%hUzHanx%2UCA*azpo)pz1nR4iG%yH zCr?XwdY?LY=BeA9u54_h+3O8OMYp6%Dg4Qfwgwc=2lRW5y?&oOY z0x@Wfat2dRl{qJ_fn!)R`)RDsj91Q+Q*;q!bG~ivRz6TWn+QD9`%x_Fu*z=gdFnPl zoA$M)MK`OHPCvy!1V2vZW zCG?ZIRho1wWZaxAUfL_0h{d#Cvx-5xf#<1PXx^{H^31huF-ojrFJi^Fto6Z`ss}Q? zRf`*}p*=)vmIL(h7~}CY#x!w(c(h(4uUYM-+>@QdxV<5UfX`SH*X+$J;lIst#X~pr zWAQ^A&7q`ZjaxNsUteGUYuxH)fW(izo0li{dWqlbvi{uMTf_>y;0vdKIJ8!yAD~C$ zVXQOeXpJjPTp%9hBfg-hE~`WEPGgdBp9YR%9rR&&c56ISoSM>z>+f0MWYsoyqs5ix z%iEkOj@ss}E*iJkqPU27gJAJYTwhbAnJdH!JkXwuexlWmh(-GbYj(bfb*WbxOPaWN zgxc6Q%@5}|b@i@6venBPAJzscV-57RHJ)`&O>qbd@SPpZwU;*@lBPa?+qmVaTO8#f zj<2xSPOP8jHOG!ZtY9VfW*`o&RT{bL(0IH?<3|%0h)a7Abz^Ph?tQdI>;ix*9_5oX z&D?4Sz$3BgJZJIdDeh(#SBepRJ{>AqyqJntGanz%r0%0Zm*)HZ7Vv)9ZTGu91&D=d$+xg^z-xg4Ni6^p(0 znrU>AppUIXB;APHw@cRVIaoq3y<>Rx8f^7`FV(D^yH$u6%*LVII4kNvr>-C`DtyDWOI%StN!+}sv1gPC-|4!}37jXc#y>{as{x{=0PuhqWzH&a~?RAhTl z^_*WFxx62(CDs!%BDUwy7%L~IJTV>FIIDnyZJf5T+cQqD6j=JVJavnevTpoY-`8k8 zb7Mrr3`V2Q8>@2uLSI^^s>k8am3yy@6st6GfjqRPsTV;EjG-}QTmhU_^YItJ5o=t` zXkb`T-ad6}jav#etTf`_$HRd-h59)j=58foW~~|f@k-kFF;?{)hU>Hs(8%>|MC}@l z;*=&Xkc-weXG5?!z&ILXyMV}u_Aq#VcQ;giL3dr7({n%%Tu?AKyf+Z5Xjbu7wuZbb1yG1?&fd>Vg|jbE&$+{ z^1jvXh+*Vhd8-5TdT8PTIcZJn%6$K!_m=tn^+JAMhZqI$O!{xL+%~@O92-X*ifhf) z-+%x8-&40VZV^qT8wK(!&LC#y%UU;5AI!u32hP$u~p5QgC;JJ7kdwk^8Kt> zpjLiN^T2%@fO|^(%v=ss_G7b%hfN+)DQ>IXG_qdz`{4(EtiK^{&;w890=}sx;@cX= zm9eH(?LiY4$W3dT^$jz-4&khRo1Fu2767k^&-pkh#eZ0QvDke5_~VcN{0c-<^`?Y6yne6$y{>VXT%N8;HljC$Y0n?d0lIi{GLPP z8qZ>pCN7Yh)_U(RK0$26LmZkX<_caAkMos!GM9$#Ha2hnG(UEOZF8lVetCKM=l4Jq zGxCl1e6ROU&czwT&3KvWMa2t;@@sJ4foHTn^&|{=Jr~Vqq&d}VrHKpFp!Hty>@Qkg zo{iie4>1kYRPNg>>rjP*mHXHP{Lmv8@|y z-Dp3WC&e>Q=OPMjAU~q`evG|(8*zhY6eAqauR{*Q7OhPVP;>KI@)R4qo4wgbIY^&9E>ZAvbDtx2#>o(S zJe9j1ISltGZ_~)FL38b;VXD_c6Bnq*@(}k7XnES7(3j?x^$z4zw)3Nd6%JS4k>vf* zT%5VdRy@@* zQ@K8Hzk!zW^w~OpCF+wtW*?ku&S>HSbtwnX$Yl?^$4gvLBhSGa0P-l`_2Gc!4M}}1 z6;is%zWP=Aie;L)@QMO*AI9k;a@sM(4n%Rl!MzXMXP~8Z$=a-K#{6p!pot6AX8R5I z2Ds(zK7m?!9?d;D0f>zg(*LX8&?S+tqp`Oe?OyXhLl+)VG#Llfj2Vy7k!Y5XCF)uvoL zvhGJ*R~s&hDVn$dMEQV5F19E(s73IIVuSbqeEa(KE6v6S`N`%)6DgWnye;UlN_$&kw>wywRh|P(ZmH{loON- z$OoTkY_{@gCBz5zV9j6;;$)3qfBlta?kyd(R61;7@r|ePU3Iff0|cv)WBRB*j@p;W zXV-F`OCN6-xw7)1fu+QL`2zvwJAIDUEjRCX#@y8!uzJLGz<(FT6`SL#- W!3-u#bK1WE0000^Z0Tl%m0m%xIlSs}gNwP@JO3pb)6&0Zgk|j&dv}EWesN^g;rzUqp zH>pXT?m>LNnP1gZ-MUjV^Us~GvOK`)eb(7~?X{lutY?S4R8zQhgZjpW3m0xFzL0%& z;R2D(g$tMLul)o3=BB8rJn-K|_g4zfFO(0^ZUR4CwtlAi?81eLXkzS}E5Og!U0&$B zU${WhdiL*Pr*omjg$sl{McHRsJ|--k+npn{D>m+uPd+Z7^{> z^NxG1=GjZW3zrg*pDtdit*Ee=qgyAmq0-X%h3?-lc{k{9-Likc+XA`e_{{=Ia0x_JNZ<>K2Pe19*0TzqH#_wwzf ze>(qOULd+0_3ywW|E~kT25h>o`1h*{>EtDG!p`&Qu_;MOrmyt%?JH=hcAr*FZ6Od; zRP^zal5UGX%FX2ug*bNV{$m~OM>{)2OL`Nw-~<8jjHDGS^dHO^8q#9?>8I(pCB#)YPPBlURIy>qURu>NcOk0C2O1C2C(tIpN@G{g6_ z3!VZIwD)pU9_Slj=KvSpslf-C@C`i-^zV$kKa^u_7J=L&WhKFPHk2flPkQwyu&PSE z`K}S(`sv?Ea?wgY#5dAG-JBr!_!Ri5bF-m|fsUY;77C9egDpS5gl&=wsoaB0CVx~^ z-0an5Cc1i@7CbQdMuyCDA-H~9{K*1lC&@%I+quCtT;oG)$bSYt@NtFLQGiz8`49SI zntT-v`FWaLetp=*MM4g_OkxEB$6*+r3lz{O895wWOKEb_F*p(D+Zj6e zE;E&B8biRzHAejP5toA$LT3l?qV)AgjRl#hQw6$PbafdO&Z9o+R_}bMs5pmI1SpJU z6>>Hh)YI}s^j&-8=|iWp(p)80(^w-$f2JPIWuj)v^Yhn|Ow*e@+J$21h4WD@NYRP* zc75Hy9;J|+GJT403c^){@|b+L0p+#3b(UG*Cy&bTv-;HSa5~tUbl+FOxtYIn%R=ha zc@^s1JChB?d^F8hr4Xhrt?Q35Ht*dFn2mZ3fbota#;iPQl^1T7CoZspC>d2 z2W;%@gp{=J8OCpL40W(=Uk0^TT1<`8IQ#EMxMxZ%Hx@WG>^sJgf0P$IciV3P;{GS~ ze1Z1Gh`3s-Suc0QKO}~AD85%pNypzm9J?^(WUC+El2sTAoIAb86#RLTsD~s=stMM{ z4k8oY3su!{ZNEfH&~=E!RxJG{idqjmYQvi*84G9#kQt_rHIZcPg~Krnr);){pJH@n zb?$|8Fa>|j%Uz?ONT8vLQ_PhMi`f*|br;{C$>UYU39;5qc210pjBxXpytI&eSn+p@ zPGW5F5Po%rlYZ}B-X@p#jvvDto0thf2XVFx*xagL2}zkQ?Ur#75k_PutV0i4zG+#@ zDGV9k%&rQRwY43)L>ioy*gVmN$|>=?uIqxItC@>ead7~z>*;{z38r$lRojLWZIQA!u8?~wVUq|n?HJ#)!1d0)W zl~roQV>X>@*{0I#(y8bv3P;{=@LZirj&)oim3MT+fiznj`T2z(|F(t$AyE1AXxTVo`7V6KiI;q41>pPr@SrwnU`t-qwr zVxyEM3^t3D6hn|lS7=Oww#A2(b1_GVC)P+f29Jxe@tvJ)rl)s0eQXs}m20|i{QYIH zr`q2YJy^q6=PMj-92{ULzkYdl2|}HxWOh`zBtu5YHI3bf%e1y4M|N{{^>b2$O-YwW zgkOU!HZBA4Tp-0DAyI2>E%7Gpm)9%eWkp54{Sf02BG3IjvCnd$_I3zir+G;?A5vXi zs@O_)j&dKwT!YM2PkYUId0$^u0|VqvmShC>VWn*^vLGX!Z$FipIEm%TF(!9=fJQt& zS_GV!n0N(LD}lrIp@NJW999qKo6K;yMmY?)*(5eL1uEz}Xzz@Fyq}s!BUEsU`nM-A z*;Ty#DJSS*)Oz_1V&czXBz&p;*{*NioY0`K$3q4CEtypuz6v^-^R9l$Yvd)d)_n#~ z0Kf3P%yF9lPnAB{y2Er>!t_qllz@aX=nUX|%QC^%0Rdm>Rf%@<2aT}Hje-+(#~wvhwS9Dk`#S z$2bne$g^eR5m)D+a)57zGbt*@A#}G?x_LM_NJ$RK29up0j7|vWTd#m*wJg3sp(Q*w zcaDON`e)XF=o8jSdRICW)hLXL8w>`Q*k8N8OExpud@K|H+4_Yru+K4zEiK_6j)!^% z*iR>97y^X?-$9|EDo~XVtu*#ncLw%^om~`^=tQn== z&R&+Eua@SMRR4JH3^4(pP#GmV6Clyg#PVZ~oLQ%#;^ruXGr>kEm4nkhHPx`Kq_TM2 zp;jeu-=D6-R_3M|q4OX(1}Cu6k-ru#l^%?a1kbx5QcVZ+j@QK9OGo0kIdxI>xC~p} zg&p{^da%B+aZ*YmW~s9UIhl+b_urQ_sIkrb6FJsyD-L!M+&Z!q=o>exqLKca$@W#1 z#KfQo+tG!f7Bl5nr`5tvxRnt9@)o~6duN=DVTIQ`uRZ1<0=Jkh-h7M-#9=z5Pqq#O z5nf@)?A3jOH+l=DyPC)zgzzP{VhHa`Z+0vU{3;HMokBJ%s*U5EQ|U))t#{;_e;N_!Pw&&^6lxuMchgl z*to6)*lr_hbKDfl3(dQJQsD97;o)y;tRj=@N!2mQ#%w`p5)!i+ep{95()C9T1?78t zdwR8QnDThqxgT?L=&(@UJKChuE?FQ@6%;zduWrO%S+~F_O~Eh74bHBVue*6|$9Fk_ zrak&+pmzqhLAhZjBmDvl7XC)&E^m_$tV-R4-Q?0KtCr5VgVJ;v^corK&D+LpWTGA~ zvPJMKboxUvKLH;P?}fT*rcA;=jw#$iZEkO8LC<|;(WR@GH!SK#_W*l%G_hd#Rv*T; ztf0WqJg1d)R8Xk49@@}{@hyv~W4d}rhALSGo@6@V>kA3S&d)J4x_7?4cwO9!ir6gI zdL=1dr%4pOrY==)eb8k>OzFHi&kaAdS3{2RuN|i5f39{K=W&I>4kG&=o}q<`9DfCc zE1+s96cMi(N<@SS_fWL8+>0tLDHnOBey}yhU#pIq9JBZ8kzyIy&}ce645PeWH6^iB zA5_l6vz{R;Ul-4Lt1T2!0tsk8yoiI`q#HJ_qZN8o;XU|um9q}C6||+)PsdjpS^}zi zfjRX{=d-kMR|d74odo{O2l3nola9^IEdSc?;MS{_3sr1iqLX(0=J*p4f|e$x&Gf*2 zThDAZXpF#`K1L=v+-<*mt=b+YnW8W^Qzt@7>bGVycrWp!N0(AU==VU}w2_dbcsk-E)aT3-GJL$W;a zY+zu(gu{$x5w*Rx247yjQ#=m(y+7Y>&P>leHDKZ9?!LR@LKfB>xP0kS007e6+?7Aw zQf*uZ0&IiJd!PFD-UU;&24^Qb4awZejoZ7q;Ys+B5O|8;ki+Os24j;WCIg5glKwZ^ z!bqt`RRxLuEc}lppm;#6BlJx)$iA70{7NjNIzu|7Qi;LQ85OK8`T6P586_poFBX^x zE4ZfUpgWO{!8yEu6Kozl)G}T8S}E=fJI0G$8*j3=Xhfq%nV8L0GF?P>h% zjsEi_mpS>*;WvxR%S+0O$ZUCez3FW5?oppeJ5$|yc6=8kADYNFlX>_L4RtZtRq#E$ zzWau~r~#-4+H?SHs8MjRafgn9K?eY19#gexX|ON12^nF0^69XZm6iM;I*qORl=?^? zuC{S~=_;1Ef&%D$*+*OEP$FfCd|2qWqN0Z8tctum%iY*qLu3FZVm~9rZGa4v#6lH$ zXut6V`RrXYOu=SpIJdI0I8dGTeB%Z4uao42%1a!ehK7e>o5(eDTuy*LfDL#C2=Pzz zLtC*(p0`$4$LPlsYz1Su*-MJc99ip~ z`8{475uqf5w@>2@kv^DaBI((*c&7?IID&@1>W197m&B3O&a*cf4UWGyOn0TB3@zNV z2Pg&UJG@N69=nHb3{UF)6>V1|z)7FWUV!fAsO_S6X(y$#fB<($%GtL3#KT2ca&E3; zZcdv}{y-QkD{&F>@}}opKUiIKJ#2x}X-}gnEY*IhoV#d(c*4{d*$Y+|1o1&ro zV=5w>S&_Fz2nvB9$5ZpMM@>-q$c@p{sjP?iu(_Nb&f@hxLv9kszQXwoyZ8L(lSIN` zYC0I+V-PG2u5??z^yBIQVh=l_yWrB_%?RYkp4Oc7+mWHEhJ*A&jIJY|1)n==XuM(Id;p3sWyKFbpnt9G)CEL8W~O^thDW%}b=S{uvr`*MVur zlBAFn2Tr z_5SGb{doJ?N#>O(;u}4&wU)Hwq(vhm;pkqrQ<_^b3=EqU=GHn2y@CPf>d0DqyDe;c6=oO!mdZ*@Q6Js*Q(}OUwu)fk?lKv~BxCqHBoBlUs zF+eTkaWr6WV^dsWe>==^<}f}{`^wd0S-C4^GhaA@Bu)>a#8-14K6@6_-=BWkA10Et z+;QOgq}R3=wsVyh8|r+z6$KxSkK!b zh_3e}NUDkZ>cNo`49=uLA(2}a%G`E(7I`1r{&pvL*Z5GK5ke%~X;JZn#~y`FM%dO*^G(kT&5q13e{~ zn4bkWB?S_S-`~_0Rv|Zxk#h3Lqz~JhkR{41ErkzY=3Dk4x+cEM7@!&fLds_u_#A&n zw}VOZlamZ0=|+6w#6|@z)@=m9_KM64cN8XpcX=y=1=j}c53`a)6 ztvLK{Xl~QLs%qxC`;3Taw{PNhAI9^Mno(MFjHqk}!-Vrm&q~^?SxhVrTW&rYf*`31Sf-Ys6$8HHpjHp>oicL#YF z58iaJwN1v1r1Ww5hRx0zRl0-L2^AXm!b>Mn#Wmus&vE@$`}zgZr>^sMO|q5uRc~TW z4z8r9U4jG?s(!f2+WY{@E&xq4c($qk+Q|xId|1m^M!X%CIXEx5N<9N(ynIEhR5L4# zCU~i#6Nf;$17t}FhrPW$&0WX`Y3!mLWxBAMRztnWg5OAd30P#PwY99U@VNuH5qnu< zk5#9UE6 z(?4-|0sH($Qccu$1LM3P<)pG;iy}OtzOP!=21E}g_b*CH9H_v>OEa<1vwE)CWFUF0 zgKh$xUyDykHGwXT3sdsWQPb1gXjQX5{=v%DwVo)xkiqXf;3aug()m-_vi(4|SQJGH(-X+;2VtH!qC=`J!`S(0^kQ2`P?yE`wzVTKsj=;yjx4 z;t_o#DuC`M>5YRXZ0z!ak9E`}3SHN@xwbaUq%oi(nA$&KI+rk^PHx;5A zE@IMwxC>R73&iN7f_C<`g}aJZIb#Q<%;Wd7^d3(eY54vq4764iRVcsa`or^KesIl3 zZ!(AnY6HuoRKGW+b_l;I86S!JiYYoZEh;SZ-74aJa=1cR&r<$GB3j>xc&T5(p^v@r z;p3IYgRPoSi%qhJtaZm(ol>@TcD_hLxt(|MU&e=|LAl&-H_sXzXg@ux$x533?Rog~ z`T1BHr$F}}_EzVHT><0aj_RZJevIXu0&1R$-m1-ol2`H67k|2*DYb>TJUTiK%4x!< zbZ@H_ZRKvIWn&ods0ek2$9p0kB!P>^gQDaAbh@vV;R8B;!Qqg$whe3gmS2W}!*dI$ zFGNuVfjcA4!4Ab>XAvirObkkNaCNaj`kcdER6oY{UP;idVfutVUR*XUXmTxyi{o4O zKpaZqPTLUGJ5!XwKs4jzNzJXI0Lck_59Bfd=ss@mX7^S>R#MGi#o#VSMI~={@9i-r z`P?L~8Hlg)DYtOOp)TVKpeh`k=p6A96ZwF*R@SCnhEr3QlptWszmN^MQiAsAu}fiD znX`ipkXn~I5NgbJ=ltMKohWLyLRr^gf6oiG06rrZ`IS^zFohLgDheJ1syD}I*gu%e z?s&h!24ToAtoY5u=eIkY3(V*~oW|6+!LM^nH*E(nV8+`bT$6&;X~p#gT@Tg2q%&T3 zjZon_KWK02zxgSY9#gFjp5)|}{#p3FinZ#g!;G=%K@~3^U;`1(dbzMK-}Sh>7YIKA zXs&+7*M5)*{|~MDKcYlyt=faCtE(Gv$i}o;m;wW&t8-?A4QK7Yl;DgFkUXPiV>+`s zUXh2BYWKLdWaL_t7fxi#`XuT`B4u(Q$97{}SK&DI%G zm5_X={uE;%M_0Lr_i)l=h@&S>B z;5)oJ?B+SyoooNtFHVXL>FLb$3+U+Uzvle6bwm4R%Zkx3q)9%kuehjl{GS*$uF3%s zubY%5FDe`#gs?dnUjA#waY3x>{P>rO$aXQbo?RrRVQ=5ZcJ5l2@3>N!*FT+6qH7QS zc9(ugYtFoOov|suL2I~~8*!~S-YD()fQXLZ-V6otxa8-X|K2y$Nx?quuxpl_xbz0p z@Pa5x)e1q~Ddxb{a+I!FD*yMk3$%QP=?@*!og5g*6L-xLUR{J`!`8;%y4dGVve|A= z+_BgFYvK>W{5x| z-GXW4C-L83xp>%+;XQql9XUAUn&~K%F{^+7@RliEUyU94GW0+F$sZMAq@Djx(f^Ug z=KtDg@Sn(g;eTH%_WxS^uk-%jIsQM;`TxJ}_Wv(;(^PYE4SH4-a|SS?eAmL2Krv?s zB1$qZPkXRQz~0a;{{`tr=1x}#<*AQ9oCEmV;@9?wvy@3YlHunhuVjD>^iFr5aI|(( zR0=-)s4suk339o~bmpvY%_j!;Cs0b=4d{IKI2Mw$0N9sQu(YT9tJC*#sgZVPqv^^0 zQL%KECogbqF4XlZ#$82hQEAGvu*j=tHt1Ocmc2En_>(heb9BHn`g(dn<5W2jjcx-} zIs1o+4r)rmd%!?H_`?3+>L?8m1?vgMH=1^6q>IyB;pp)2P_NRXB<8GAk5c>tN?jrh zs+=Z(26lR%6%)9=UL;z&d;#t$9w~8Vy9(pE?L)QO{%|<;r<-uQm2IHU`O?6khPCQP z*ICBur2nH%5upH7DEDT7=FLWF(>vVVHX+*?`t-9Ih zzGpnxWU}STpVuNie=X4P(aI5=%HHB|2&^7pXOMBe9FpfF^w~Pt4a^wcrKGf4Ig0sm zJ0s3;c5>3WN@{_DIT{etWOxYbE=-(+wllP@x_V`Wg2q=| z+{-EjP7ZGQyJwff0aAfK0RocmiPGzD>MB|< z7NlH5u6j8hRiQq71l2WSr?h{g2TNjxYGC<&f z-7S9ksnECJMq~mkR*5O+=0@giI&xa7J8T_C2OiFa&PLyT_F;L3rvAI1+S+V#?f}ns zxqQCPOk=^)ILDz_?#w`s%$Pb&6OAUbv8XG=!p;jZ?3I#a<}8^4$H%*uX6KCMyx^$| zs42~z(_Z1?+HEMp6vf&Wx)9i@&uGlc^viHQMMy!{wr;`gv?wl=ic0*fX?dND$i#K( z5fdr!NZNOL%V#)FfrC`N?o)>q({k6sAZD~%#?%ivO7tZ$1 z%>8jt1(tIMeHBSNol{w9b*6Gz$msg~t(R96zkGxW+MTi|LaTq}v)=_M%&!pf!Pb#} zo1u&9>UG9NqS?EB&PgP6!`lG!OaPjrp|@1;X*)UbOqd3`X<2-CvPDIIOl|W5nr>oe zxQ{kVulS7aRrt=DncOTMh@#PS-aFbC3O_6Xgee$N&KAs@ycdAdLj;vpamWx{z-^Lp z(7&|``-Lc6O5)$B<@EzD+6BGPw-)q|Pv$NL#f(r@I5-kMJcN%A5i8lGG z>seS~nl!FUx2@32@H^yW3V!hLXHb&S<7bc5#Pxa9v9M8RaLZ~WP$3s7Q9Ys1*VtIu z@_?^oWv{@9J7*LkKOWbA_sZ$`r3~(`)l(5R@eV%^4SIcNBD)_kj)0Irk~Cm(d3k8q zOblRhXv&kfR#)GQ*02hLk3ShM1R#q_t{$lCL4zhDl9j#kEsnP7CT3?V&2_ypOS_7q%fn}8ZkekrE#l(FsG=r7=7SD*$=4qvfhnWOaj(YW}HRM zai0V21q5bAI|g8Q$W|JJ?1Iy zZ3*&t`OR5IW~7pQCiEt94Z$>#GC7go51nvUQJqe7ofkD{XePYRkTi?9!CYZD3b07R zLIVBAeqmjQ+hhw&d8N3Zwwxq+`O8#!!1VnXdVij$gam8QgUyfK zm)GVf)BI-vCasWoWca8Ve@F_j&ex59x$i4k2cy69Wa4n)fHnd=^6S<_TEJm)j;G(5 zDz0Ob>O}Hx4yqYfdR+h57{A2Y5_Hts^DqP|?LoL=V#f~XRWB^Ewf-T%M5gN@5S0{> z@3rOl8I&%NG*Lj0d}NT|V?UktG&qx$;NAeV#iP>o0b9~+k`tScrYNo9Cexo(ZO!G; zBsX{NYy!%u^x(tE5+3O{Q{mf;#u^%Acj$LU`T1oJ-@8Xaj|QsRqda)e9~!z0%3O5@j05N$6v{r4Drcd|>s0xVC?a<2mOxqI8`8*r(qJ&~Us9d!^&O;3*` z;8G&%D~cK#+FwlB+SxpLr319S%Z0hU z5WQ5ysQUG}IVyioHhr4k(m!8JQAyONssVx=h=^!j{_4Engt%#7l|^6Iycrwc;y!O6 zuG_i=A#}E+8s~NFkD+{^(+JF)<8&ovwyM*}d(6W481qXN6?m+ys%o5cyz~BjCAdI3 zx3>lFlpJ{Pc)CPQ47F7uCJCr5AzopV=@k=zKp@{kk}q**gE z0HvxYL2^BcdZ?F88|YyIij^ZEu-w}`nukcTh{+~_cxZ(3MWG_MwlZIHswgk`uQ#E> z+lqjm2E0-c==ed53@gM=R&}jIKOGYmmXkt1UcLWcJd-}Pb}MM@BsnV!A1&$OY9aeY z1HJ($q5=THP)t2+SkXEY=!3SZCd~kh`5->1JwhKOcbZ6}E{+?$18Ix|>@3L4)PH4g za@?A9uubM1|0g+I8UGVEG|T{MQGuRN3TV-ac#Re`M)j`U*dv<(D0^JM>3g8(?6_8^ zjDS;nXaico1AP#P~ z@IDR~TU*{{uLZU=5U`^07#Kk!AZ*IP@AL$0669D50*%B)n;ZftT2B75w(dljRdew! zUJ}?DaV$4|V4J+&TYXQ$0atpq>P|9s^}!iKvwOgP zyrA$ziuMeLD11LtIiixs3%qB8>6_cw#J&Li3}W73e05yt_H06WVzV%y>n!F}yDyv% zE;MKq*xcVF2Eew5^5+*@^tfJU#93qll%*8S-;2P`0gExw?TebG_04fhR>1g+450HE z_gY<&pUKl32?($D4-X&z!2@OkjbjS|bw;^R&qxW>79Ri`C$xnC=|Z5SzrLS*^9xfK zq^q?G6&3C1lETUqCwCbHH}8!(jPgHzM;ys`HvE5(Bd}f1b}gXzvH_a-@*17MtPS97 z`(rH)$8MVSx|(C={X3`Rjr~o0anLh`j%;AyGJrD&Bm%X-^n4II=|rA|Lu{{U3(%tj zR_;76Up9;UQ{WWol&c)>9?k}jia0xWQ}R=oxG&q2N?;d&*%Nmbckd`TI#P)!FL8Wq z;PI`wxk5Mk>t^OGFXSGD&g{`*=)}Ta2jIR(Yf04H)BH{jrlh2G+V)=5zW?PFic|bd zP1Tu}Z2)~*XC}@I5ThCe_tNlNaU&OagQjWfnhs`bSTjZ1fIhec*Y|IQvo_NghaNCW z{04TQ#~r$bpzTDdCi9lGiXBL*DP?QW-U&)^=1D|;RAbXD0#0%};fx~0Fa1Sm{~g$7 zRlUCmfNcQpy6X-Mq)!z=-D#*(WJ7?y)|(J0u-(23f$jyP(Xpb^WhZ;f!Bi)QMqd5B zz~+a)caP@ZQ_|3AA8aW%gz_lm$Wi z=p@47o*jV+4OBQh^;;*Q$d(;I)*Zp906^o^+Fa+k#0q{vVP@t|Htj5U2~WC!&r9KR zu$}ye4PE>UC;+}>#Gv5t;WGPNjcQXsG>mFInsYK{>WF~5BlXRJ#&pDulCqg2iQ}%$ zk@j$NZ)BwEbz?>V`JemUiw^3u-j)aq$dza~)l7F`#ZG@+Z<~tgskStD{GyW{LTc7M)r{HVyQEcWW&E0gcAFsQNW9Ef*d zGEb;rl?HC_b`Ux*WY5njL~&z2g-FiMMZ}LC(&>lIop^`?lZ->&zw|q@lbETi;woHV=xCrwXH@qHa*s$kU&_z~T7|@WFxUr{tM7tI&&R93CBQ zbWt4ss?qdcOXtzH<b0+677^5yy3#r=ItPke)U9jXiKi}y>%olJN#`U9ncC&igPR_8FZ0@1cigx)42 zj8}^iQ#j%se|FT(r_Z!FC&jVc5-R>vXD2jd4==So1-|vxT*+4s%|AFeo0!HvdKN`yZau5pr zaN2~O^?deDiqX)-1h=t#CQ{cc5>Yq-9*wfPv zZxaGHx1cHEd6qiiE5bQr1rEP0n~K4GI+5-zP?j)VW<^U8vhQ#>+Bi7ik8yG{ac&+$ zwaQ&(-WeNPTL(X9h+k>$X(#(07k*F%Qm%op@Y%5zYk0NuTg=qN!T#R1!(x4Nt?k5G_9(Yp-p3jkeRyzO6V_XZnGj8c^P^}?|tzvF*uM7uH;6#e$Wi=P&)+@~iF|&yM9_dxp zr6MhN^uSu4nibm@n-b-t-c3_8hepqbOwTPXOqu>3oow{?uh<^m>M!EzDG`E;DWEmi zC%egNzP_rvry3l%pCVnUbOWKaVj47|BZQoNDT2XmE3aD#2-e<@1dONsv$?jvUt>98 zHYNJ4#uOaPD=e&QegVYJ$oQkbOtT73qEkR}oABcL^{l=5B8;wvh9--3L2YqqVSg{D zV8(Nht+SJF>Qzfi!Mt`sh{5OWyAE1i56jfSr&21w>(BcK{tWT%8wDqumI`r1$-~|k zgM4pKXwF}n!#oj^_DVMmZ5)PRfKFnpZ5XLAKOU%03za|RHrTfa`Quolp{ zSf$#n6xvU8*@MM~=H}$IZqiL}W8Fz7+%9%B&xl^ej(q%xfkH)lr=qRgHD%lt6%#bF z?vd+g>x>pDom?9q9Zk9?D!|5BRPJmuJO)r{cQh`_fApd7U^vmDJ?wlg?PnLP!0-7G z-Qbnj$O1W8Y7u}(m6TQV26I%|w&fld`UJbCA?bOR)i$Z`Z`o>fD|uq~R7NMHMwzu8 zE#%3!bsasIKgmr!$@2@ZTfBxc33QWPiWvT6cZQm6iIEW z{hp9>jErsV6nWClc3Q9poTS2}1l37MtwD$s4({K#V<3!Csu(XGs>|xYIi@<;W}{=@ zPY=Vy48d7s*#nT;qe=E%R^xb)-L%UfeTs0%DP#@H6}r#^ghZP&UiGQ?ftCQ;>us20 zahQ|)+r-e2G{K{mNnX5|v-44X{p)3Xa=*T4USwoHq&TmEnLlUJr+!5zAhnW?TF>n; z{(jwpLsZ0#dpVmN&jfXi$0kETlc7OzQ1Md#(}g(eNk2t#&+-n*m%_`aEUzQ)?XAbZ z2g@Ko>}KefX)S4TETon8?EChrb}V>>z1Jt(E>y)0aWf9+@}xZEO`-*t7OEuy)y5>h zt`>eIm>YoXcq>4LycIVX1PIc*w~)xwU;GmuD2k$zX&-by3P{I{>&?mi53}&R(%z0Q zzoi`m)t4thhJlhivG?1@c8@XgxB*Fj;9%tX==eB6#Jc}iyCE@gZ@-nMmc{Rr^{CAe z@xvk3d`fcd4ZW@p*KtlQp5aQh9NcB6p7;(x&_%r0D>uGnflR#ZI&CWxN~&IM>eW!* zyxUG`#fs`mj63aHQ|6&M3&g0U5= zbqm6jw0Zo(h7i<|af z=PU_=cY~F~Ikg7@e#)8Wt59VR19I|yf+SkCs9Z3$BVyYZcZ;={I>hGtPIT^Ai6-a< zhsC_ZjT?tlPjV5tWSEa1PfA!EYpV5X9s5t0kIIUmd(<>3ZT$!PN7NGayAW+C3rr)NrW9N7jh0Angr^we zlf`n3I(m2a_GVA`bP+FB%jl7srqolhaEjX-o`WHpfaKfWo_anASGOhEURf~ZG2D$S zNR!liL<3Ki^6`IW7oL{N<#&rF!DW}++{W{sjqGof%XHeD4qm9Ve|^(`LhBwQTxR< zGXJ6#{Ac^G>H3uc8cKF)uBM+t=as3*>Eg<4C-m@~Vrr!_s2ELH zy!5{D>a9pRA+ev*-#yzeJ*&npqT5&V+;A6NZ|E)v39(4oU=nAUTei6-4cW^hN>bek zKl#X5j&_J$HYQ^jny2HdO}PDDKRM5gdJHY&FL2Gp9B^r0e@i*rvSuYRb%dyc19pJh zKZ$qN*no|6ex}p$$L|e3Ru6Y~=U}uu->(jB{qEF5cuiTqRl#Q)Q@$5R&2P%fN!(4x zxw`fCl#A6cSAC4UdR-VyeI0DY!UXe3Z29oRv zwOxNyM8rRI;`@7tUjtyT>8_TQ*&jRp%uh-2(|E{1M6xjrXoumu*1$0t>BF`p#CYEL z=y-{7GG~e1M5*dj1AoEy!tA^TxvNTj`8>OC0EPH(;}3}xy}T_B0mzTewXD|Kx?>0- zSV?ZRTYpMCIj8pllAP@J>$ZrLRKrB@3m%T*-|Khp(0{kpJY{9zW#i#{UJV>b!p~P; zA+Bv}`|x?oeJ~j6);?emC}HIe5Vz&=vo-dbpGY?0tE;zPk}(BK+MlF4k1ND{+ zG7Irobp0-eD5aqoT3A&BeVuyBC0tkKY66n`fLOB$C8oeO*Hly#S%cYF5%Dr*K!oX^ z2*RV+RpmY=m|d>Xbe9Pn$&i!-Q8-YpkF}O72L+u#1a0B>EM&)|e_%q6@N67~FVp*E z6g+N`I!g=9#e9Nvc-oJk)o5r8uaa)V)>)Uoit00iD47l0BFS0VTUHwY!Vrz5p}Wh$ z&>jmbmTPf#c8KMcMSmdk4^`+g29-3uarCpbjf6<#FWz2A@Ah?XnR%(9!>RBjc~xt5 zD>gw{GsisSc`I!O{MY*)LUWbPE`xYDaY;%_%2*dnO<(CoiEvr3%JkQ&>1*%{s~_)x+cK7nA)g9iBw?82?E_Eg{&}M>xJp=_{=oCvAC+ zXO>4MOE3j>VTv~2GQG6D)zFgRksAm*YPqm^^FZU}jB1#+@^G7E`1V~3s3wfW$*8HI z*(AcD_N&USaY!(M-M9UHd`hvr1|#)n#CPGkfaR3Z^02IC{1d&FU})`j|KONwKpeCH zv3SRo?n*$-r_;55L?zA2C0_9>p_p>hX6x$o5%PN`AMV}-4?B#%f2}R;=VbpKo!wv${`SFS&s)t`pImhFRH0)9 zxiswmqP_~GY4^(2(l>-7&a^l*CdTnBJS^6e5(mEKa;25^>FS358F_?S>+ zegUe-QW4eZ5?_O!nP;sLDojjUXDVnqK9U&SyH@bN{7N zM66Dw3PUt)VNK93Y@5H?$f}~cD=3zBVcKXd=)`tpf?v1zxs0O5>S)qBQY~)ZJyI>4 zRvUeaUhiKBXzFPO6~{XkmmsWy8cMU&243oV?w%=6x`S5msW5;FnsyH~p;*lRgi*-)7g+v9ZhQ19(_wqk^6|VIvm}+d*vPL<0 z&eHIm?Co~@BugxQnPj&r-P@hd`*pNLSC7=nw3E^waz2%E27$h3G%NE(zLXbePq!| z%*DzGrsC*l{7P*}JVLQ$R3}!Jjuu7bHhRzpRr=VOd}S?}bR~lt;XyIq2Bur+{*pE8 zu?gW#lZ^TD7-MXN7yy&S&tdW?m%z!`?@57u1hcbR>i&3jgQJPFdTO1cVZHqUteJs4ZN7uJpwyoM2=0 zaU7)=g1+2~xrKsvw${IH_l`TPtsuCe@$teb(Vms2hsWaa^(KYr?M=jbR!Z+K1+F=; z^N@B<{`aMB$<#gyke~1k%jFRA`zv%*eCaeCL%Hb<*>Q zlNnw^5b^4kn+A7Ex{qB8QKrapMyUGs7_Sm3v)zq7&N|j^<(Nr+*pT&r-{S7b^4)_z zGkxjTFSl9;)6hF3){#`1g*U{jo#g!B<eIaskdq@a@*SBBmJEXHQ{Hm*jH`#hHtkm7HraD8t{Gn0GDD8>nl0{pt-m~^9CY1NP*oW~tPT#iTao22q3$9= zq7ld(uZ_*+Y3mm&ZqY}U(B&0^#s)VQD2L``wgi$lm-L*0glCXdU{v z?)HA$p4BFBqxGb(@WIi6Q~InUg89|MJ0?v;q3HYf;hU>=beiK^(?*X7e%~&sMsnK+ z_4f3>qCl>qu z$&gOdVODsV=eFR+hhM)c1?|1VkT9DzAw~%oxbnojDJcQhZE*v-XZ(Za1r<$u`K{pm>#(JMnr%Jty6 z;6w9hV-Fmfb?yjUh4)<0x6(JK{gjk6L#A%zLBLs?de4PrPjL%pmU4b5hKm70_1fAX zJXWft6`SebG1voVpz z>nB%MuUuIbL#(fRZdxvzEx*6?Ph;C*PYJ7^Uqg2cSAKqe;#`q@wSc9y$#9}%?VSM$ z|6_A?6PFY1WpINNj3DXlikcsS{4%rEZ*~a9ZRs}fiRt?thBdE7bq_ZBbmypNP||P` z?h?M$L!mthN$oa!TB{$-DsrZ$KmF72w2JH2joq+l(x}fb9aR#yN@L-0u^}N%b;(3k zm4{2s^ic@e-inou6^0E@LXKuR)E9OoDe~ToAxd7^j((y6^I6Z^*qg!DZ{au_8INXp#B7PK`~iy(w6Neg(jH<)HbCEQL3UD~^St%J^5BJ>5a<9OHyFqRvdusc)JC2>;DU zrh$5!x8)RQ;ArT_@gEf;3uDUs25r(}#o*vC>orFalKYhxSuLnSM0cBd)6t`* zYp~6}&_2D*5uDZR+a0|rE=&__`_SNshJ4&w?`sSoDRKGJ-l%3~&0^U5ZLecXeq3&9^Es1t8bZS@4t){Sm(CT3 z8~FM};0fbP-RmJl-gJ+@fvDB5mX&gsF?E?~nweQFNR@$}cyCkRpUy3qIZC zA76g=F60yD_&&dhTws(@`*S7b-i7oG-sq=jF%))aX{jtzP}t(d#C5XMLR|N$YU*%r zk3(=E7+fNSs2zP>oEfAE&=iIS5zO!G?chBt3OiKKTd_`!n{9?p;wNh}EFj&Mi+hb+ z6eH7uwj2)3p<$nI-WSfQbNpxoXu0Cl=ofR+9DLDV_EIF!!EOO?6S%s6G}RL_k4Ax`KdG6{HI&Qj{tsASIym8hT3zs7R42 zHPWR+fFK%W*naB8FGk+YfvbRK4u)cWX>%NyN zG@I9*bGxmD?0S{@&>BwoVZG8fWc12QE311C3|_|OnGzw{T2Q`(EXHsqx>QF{tVB?}$w^938TbYAX2Dyg#wp39Tq~b*}f7 zpVxaG8=1<4%4g|hwH;JW`^>CJ6jEMmS8i$Rav_m{0@!wp)&y`mhNUQIT z4Wv#O7!m?(-_-5v;6uLBun!gC7~!x12@TQT*saBF{mb(nuV z?`?8Q%JrM8rfU|D`SW@B%GFNpC?JjOFCvCDMP0*{rr)HKD|JL`AgwBh*=*VsM9iBb zg3HAxeXq;}Qmr6OqN0QXjSUUcQndLD3;NL>l>0>YcWW=r!Q;v9?iLmf3N^RIbzyIn zEKA+iSRtVzXEsrqmwVJLC4RJM85!%^Kb@e76?VFcA-21k|=G=%>)j=S1#gGBYM)+hHF`V&jWnQi z3!VT@xyN#^$mA=g2@E!T^(_&HF`uJb(d-aBwC%DMnCR>ZOR8lUUveqxsi0f)jgbP@HB~aD1u!zDwbNd3J^nvR(P~K9X?@S!7pO1X)B} z&Q_>+oJ29d>B1fVYnDAoJ&fy|LArOLduJVVb2U#qsWxcLP7p7?U)#3W6JIRRx+i-i zvV3s4H2b!q`^^_iqs~VdHBfF`tPbHr%j=iFd}StB(c_8{4ZTyG*|sGHSYY`F; zSeiiyptFb-ZXF(Y75mT-9s+?WJd8d1_-4Lsiy{Qu8nv2jyhkTd!--aWMtx(CxNQsD zeDJFt!fNZR6$4Mf2n&vZ5S0yN13a!yi0s-iXz{zFfXEJYcWC2^*M=?5>+{ z-Dj&i3*Be{YqN7hs%-78QOH6p8Gk8n{6^g&dLM$`!z7_#CJm{F4Wr>iHK+y|6vSzPVffBPK{r&bM(g0FELpR*7pBMS@bJTD=Uk?*huWSSQe z4Xsfs>%b3++;88qGGUGV^++=;6NH&7kS@aDo;_(Tr|geN#?w&}`CaVG9_J*Pob}(9 z2P%Y(r~g$5`&>tM$E&U^|A^v=XVM=v_E*nC<&VHy?gKRao*sv@l?;!8c<|T$k!d3x z#rg2Ul9J&{4eIyhc4O_5WN#Z7hR}`3c2gHm*OH>3l^3kR>vMg2^Sjd4D)H^g95${q zbDzZULZj!Pnix`;XwFPVXN~KKtkdM;24*Me^qp)sx?xx>Avy*0)qR9;5GMK=IizMl zadrcMa&Nx&tDu!2tPh>6s$zzNIQa$ypS)IYClYsV#tXa7f0|o}w_JU!MRuR!_iqxW zj^(cS-7quA#(f71m#ej%fq^+2^~U?VnUlR|j~{c_>YQdbOaw8uzaI5;DsPZf+Rp!` zHlKG?b|lFmU9m*8@;jdKj~f$R)B$0aIZD?w@#P+S#Suon6+|7 zyd!lB9A@l*%QLoppJEeqG9`o6ubY8g#ob*87N@0u&(4uQYu{W)hK4GrtcokN!uKrJ zcmr)3UUFBrzb;{HI_J!n!{w90abMTE->Za>x)9HA!XFix9I1&3i4GU~I;!jo;VK+5 zcz2VE)B|f2zOGs#9RW#5Ppl@W2-;B;*ROVwmy-AFbJWe)3XZ~0dL84WHe`w%&&2KC zYWa0V4Hv1vHc}2NDqKd5^sQI>?!8>^{+rJeg|SfH2dO;-<&Tx$J*5M5`bu1)Oe^eS zYz70Ry(Mfb^vfi8g!;7MgcJnAP;TT2Ts{ECJ5r2uSRJ>gioEf6ziDY`D?d{=$WCJc zlwfaG=?w+Ce`19kB^-Rd|uY$q}LOwc(2@;1zf@yiBPzZ?Z5Erzbp2YmkcKp{1 zmTy;97S=qq$Q~t0=yaLIOBcc2rQ%|)5xT9-lomnGb~VZ!^=L%TSOGE*VSz*>)$Ux* zog`R95ML`Cij3BF4Nc8F*d=Z|hpYF6QYBHi6zo}ohKHXmrCbk!jR`vO<*_i5+2475 z^v6w*I2>Q7qoYVSx@1hK&`4nc?rojV*eM#=Sid*}+}$1M*JItGUbWI*-uZ`cmolYAgbFwe zm?%_7|Fm@AyIUTKB><(v!}TDs`u(V;6?`PbYvk|5llSkF87J=L;lXD%TjUQ2I`cmc zVO@51EAxGKReC3cc#!VPG#UFwdXqmr9TQYTv_i90e11aSYp|r*J_vIA0nPuyuI(a1 zn5p0$oLfSke2F=hIr=k7Z}OB-r=k?BCuf>xo6qA;CZ!kvbq_RJf5DdQlV!JSRk)_4 z5^6E}8SF0N(hccvk!@VrBh#qf+jF)ue)g`8D|x7^1*@MDVh*ITsLZ2IqKhlT7SJ7+ z^IL7}sDP~m^E={O_)j_S=8jVR;2g*8Vw%Vjo{{Z*b|B75Q%*EBnAfg~C&~Z&%uHti143L{z_h z`f)}$}{(J=aN^)2slWKLb3C_n#X-rME}4r7TnYZg@hZj)0wkW@wSYW95m$Lgi= zCIpMsqLPwBM4FiI(N>0rtTA7uA;|ij&h@KMjqiUKr`vkM!~Pw@H0!BX8vXlwa1aPn z?KzeHR`M6*5i<`Bu*1*F6XuH~+pi4P$~*)jvpS#WyLqK!X+%GcQ1z#StCg`>%C zu`pT3n|0y!;zr`{NEAw^Ahb`1{AHg*_p4@zb5~^NEaQM$!NQ_$`$7iJp7B}Xn${V3$%U9xR-^TGc<|6BS9d!fx)lM#5?~3Fc0l?D^VKz)a zMRV%b1#=pgzKH7hYPZ%4E*p8t0kSW$D}Ko>uS7=H1%eP&CA;*>;^X2$D@dRy`Mc$f zf&!h3b=!1pa}aT@z^c8ID|d1Awp`6=5{TH|bkeTK(GBHm%aZZefOV%)%Axz4_zI$4d;pF7EDIJ3Fxo z8RMn~4Zc-IgSxjz>3BWv(CZm^n$^{yB{#Zx4NJX_qg%$BJw^vu_WF&fsm0h#sND|~ zzfP^LK7*=K8#*ED3KwF|1bC`^|4F^S7gxuBToTlfC;<;3S#LM)-rjh12QryR!XkJr zyWb@s3gVNNm}UKnzrAIXMmkJQz2Erp-jTzM&y}wX8SX6b>67v0%f>?UuZ^|wIixEf zChY41?JmzHBQO@6 z07(&|r-XDSyW;+WsxYZ)@{MlS?Qlh{cUg}1BQM~8GQ8$9b{&{p*9dCB1KH3su{Yh- zwQnhPlKRTy?W@tq94+=@UbXzOkVM9CrlA4*(Q2OB0nypN=C_ZrpySMViM!y{y$|G6 zWda}UMO!>5-p1L=>)YKR-`U%mw9@=n-vM970zyI!bbRX4F{4Yv^`!~YSQUu5car2Q zu-ag2c1_p9TE|~a9&ULc%gX%kIjFcVJ{6r~S)3oHIWB;e>v0(iswhU<7Maw_%qLT% zN-Tc1YOw=E<-!N3z64$mW5lXN2nGq|0?ZEY{bN9!dIP`jcewv5?a%iT`SPe&E3Ya5 z9YhJUPAB+3$lpQ^xL!~E&ac`H()KU19TVtbtz9w9bvb&CE>6U;PDG=(9OR$ZQ?wB= zbUAP5&ZI-q(v5_l1v|TLY0tgC$^5ICoMy5&<)79-8t!E~^Ze!7>vKGyGAY*C_^ogc zkinBpk7RA?>XPQ-k|#!IT4vEdKTXp=BRTzQV-q;ozhdGeY?sZbN*r|T48DyA!A2eM z=yDrJQevFGk*==xHxrqa0y+Sn;_j+BnW>bu9{pFi^z5Tof|gmZDD}ktyp-eVQA@6h z%(2&&88w`EG?Z4rvl7pzd^%h8(D0)QOBSwQW*DUoUm=mcaWD?`Sx67HhP#*%oBe^6}-3WvcKsT9(;$s z?QeH{xWuGyiGYpSUOZ7h4O4ZpA~^ijkORGBT=}Ey{iSzRlX{KDx+9>;{!8 z6_8oD(yu^eUcp#WF@VK-&s7Tmf_+FWpoVn>T?rBtJf2Tl1111cZLcV1Ybe8kX~))% zaj|>cKoiF}N$;OGJyaW~+~JZSlvL@^e!Mw9-{6yUa=b6q;00R?oYzOb6D23#*L*s8 zh2qA(hjtfp!KdtYalbL0`M%d|&J8*Nh4h(Z3gzIbcW+6%_gw5atPEGOJLc0Ezx$@t z*iBR0boq7X@rj*^%7y0##XB(P8KZsEB=dpn=INhUN);DR2OgtM2iyW(>&72oDgB=) zTt(eRd-rN3sYi8?(w(U-u(Xy>ujwzS!!$EVbKq&&s9S67bkyxn$chtGe!fZFqvicc zv9+G|kym-s^R32br+~V(TL$WFHy^OkxhtT0M2hSN*4fG>q7pyX7&51{idjW$*jowd zkL#6@(kAJYtlF7~x#$1_XU7Z}zMR0oR&0SMzfrY_w^HT$gZgf+L6H%)kVtAQxcPA; z+vFIaOXt?-pd7**&o^3czP$JOvygs9eb{XaWx}Ww^mnri+W#k@?;mrP;68~@lR4Q~ zR=Mkd$VTcF%k<-6@=F2${S;v=Dk>!THu3?qqP*N5_r1j2d3!rsih_b?m$exI_fkQ$ z-@tdPZ|^aKIgA0ZEd`Ikf_;sfll)JO*3|Z}Nf3O~ss}G;2!~kUh)GWM!IXz=pDJsB z`AsVg%3>NtihLEh*Zan|B?U$4<||}& zD#6jAJ_s4eA#9Wf1>5|hP2(QG_*=(7tIPtvw;(e5xZ_$YHL7J`p}yedoMOFU{uR)x zdyiGrK(l+4-iE^qcj$Gx>TEf}5{Fv4YPH$!0$UB%TRaGfVHmC0qk5$k9Sb(U{V69+ z-XPt{oWF1&G}X}qc5+t(ysusL{u@!5jF+9oy z%MgStp@jo@=u9n&)s{3bD0 zp+&g3)dHnEj+sjPjFQz!O;frV9m~1Y4aX>9X=ywbrNe7yvc+lK6vQoa)E@A_*5ZRm zYGIs1cpV463petpT#F7p@u{qA5TwWEcX}-o`!}QU2(mW4Jn!4(kb9G97#y$9xfd+C zf1+6_`We?*Kifu(AN*pWh3LHTa&>8-t1Sh-{(4mXwg|ddwLQ!GpdC^*?okRzZu7)_ zmh;&ljV${IJq#{)f1O!Ou-M*otDVlF)kuEccu!gMn+T5`f9VbKEi86s-duESW9cJ% z=0C~vGnFove&M?%L{V$G6AJQVXjtBIvh9evWzA*@%Jx;2%{~zCBLh_b1tvavV<90S zErERdu;PMlE=QC74;-{QDq9Yy0-HRfEtnD3_w(T3s`JfKW0C$1p&B+;RusZm%(Agh z9IHc&nH0)(-(c|gMc1Stj2#~;bDVo@wI__r_m82pAamU~jr#O!0*!d9Wz9F2u?!%% zq%&%WMWpLgI%YK#61G;7c><;WlEHg@-K71_4JS`PB-D#D?()PyZ<8rtJ~4V4o2Jv9)0PBni@?pI!Z zVEpMpQD}BGTB3~`>AmGrY$<3`HTBaYUQ3hA0@w!%vW+}wYiZ~FX@S8ZJrpZ4B=c#4 zOvkhV8_t)#N_JXp79D%N$aeTc|~2E$gKdR zyn_^Hy2?R;po!=7q1h|B6Zgry_8+hfnU&Pq9zwq`I`hLH%favcmyWCt{2Q#6OFk*$BVni&h%G%e}{9G#Ur6@p&Gc?ApvKYtBr8o}Xh%G=# zPmJ^qLjP?|;_`57O#tZq^PP`#spI;c>@42?>^=C3N%L9AV1h{6Oa`!=kT8&XhizI7 z6LE+so1e4DTsT5IEHl%;r`BnRqS#2%US99GX;7~bil*X98FD-bMzK#X5PYVyGii(L zOx*&-Uz?bCt~>}WEJo{6{o`NP#C|d~%VBtU1PxprR20VLy~1)*=_J^H&||o_3SYdE zYveM&wE4P*VvDoKboHPa#wJOuCYLsvv%Qj0k&Qw<7RIzMnF)D&*MdD)zL0b8ZO0e9 z?s^HvCpY~b^Yy~lKYwl{h<2GRw`Ynsjr_4LDfscu;#byo+*Hanj=uZ2ss@jD~mfLI$gv>5%-Yo0`SqUMH?04U+wS~ zPwqs6j!*78dr}>?5*ht@apIE`SJ)vi^WV$#dy!#8&uCuhcE$Bn6y`|D$af`JSdeLI zZDsS}it9JM^fhaC$Jj9O`mSs-YLz91tTLcJBOv`*u)*x0QL}&Tnt{}vm|O41l)Pdi zb90*nU$f7iG)ERr*uDRmo9hV>L!+?UFZLx2v?DL4TN#gvvA626Mi-V}4TPe-ar_=1 zq}oKm^G>#z&}E_Xw0m31-HqvGKEiJ^c%Vjzv&%(HO9fDGMtl7DfR&jlhEt`g{-~9j z=dLaEq+jJa)we%SV*-EAw;uQA*RfuFB@V4FsZJE1=L@ z5gKw65J(s1xis}H`s`0Tc{P+BQak7bkS2c0o=>!mliVB}e%(iRYIZ-3KDQZoF{XU` zl9P3ZpXD5yewfow|2uH%)cuR}sb37xtYO2?2xKy1UGn|;L&2 zc=`Wp9@YQu%5&-ejlN3%-!i|#TYmdVFn{m12l2-vL!pt1!^tz8t z0q?Z9NhwkHA)Wot-}t2SOxBM($?;mj3pV)cgZB6Q*qBRZgw5v+))Sm=z|y5D`EyVU6D>hv^Wc5QuQ zgN}J_c4INW%YhR2@QW<{rP78vhxGt{O?{A|fi6g2-%wlIL~ru%0DDMeO_IwO8jXOM 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 LpX7dX;g|mbdP|A| diff --git a/ProductivitySuite/assets/img/chatqna_with_conversation.png b/ProductivitySuite/assets/img/chatqna_with_conversation.png index 1dad3a099e21db5a9aaaab4dc49dfb479b69c635..0fcd4c79210d91c86492c6c3627f3565bfe66f86 100644 GIT binary patch literal 41293 zcmd42XIxWj_bnP<1ylsKx&i4nKx!1EmuxEn0s_*jq9DBqp(Y9n8&Htm%a-1I4G=?> zF1;q9M`|d61k%oe{r=CnAMWRS?gxG$D{DP{jydL>V}-rYR%5xyeGvo#v8X?LtOo)y zIeKa>O3V#-&jMoseb{sOL}xnvPpYH)E!!g=XOu#1Oi?D|KJ8a!!l7;rZYfqANVXL$kll|bf@iRLCu7~YKQTZ#l_60%1JRX zBNeZx90S~To9OSFi7irWn}4XHCT^=To<4?Mm%$=;7CY|QVGF z&-P;x5s?Mn+4{xB#rWb0ahgYGex@YNdZzg(Q$nFmhZw89S*uTNTHtkJShP8r^AzeU zbtp6nvfK4fGWk%2_M>_HC{}3T$Y-MMNrX{Ay@%J%rlb;ntmtiQpi<5DbTwL)t272Y zJ;)$N?=8mb{5&RY!qg6qI%x|pi&9C~PTKT-!$$QYY$`+y@woM`H{Et(uZ3|J&6Rj3~ z%rL0Ae3*mae`i0zM{Is!ZXU2ApzY^I`kgEg2s`cx6@VG%?=;?_^Fj8Lar9YxqzYJ( zPI4PLl$dI==F!*F3v#|BtQ+|623Oel{VvZoDl_$5IO;~f-zZ2x;JGi273kgyD0{sz zQR=_5FdTuT95)r~s5`%aq%{R1sN3+(xr$cVpX1v&b^-c91u0l zt5vreH;LPA5kD6e9*mgDpplNVI|?9BU1KHv$c=y$W^44EABS^KR|fharQw%Vb-Os3 zkr!#`>;spc;i?Rubx3CaVCz;MHe~5^`!vh1xzEuFzt}tuX2N%O-G%4=V0CUC20I@) z-eTwAKzrdMu2!kChOiCH5%;i}#>IvM%laS?<*&}pN=~Z`5{6t&#KQ4}1g-Un(iVr6 z^&{p4N%I;C{FwLG#(d;L0OYc-?~&K~MA_E+%b)_oo|2Lo{qpb<%YAAij*U7xo*(J& z|8%!$F@lLI8t}atf~7c#3m(EJ(>Nj%q4WxP?%1=VLc;6ap3Tqj#)C#R0siKblXV+b zp(SUCJrh8u&TP2&NG0pOnOl_RAoXN%NjJd?-f=cFfEXZG~atN=Y#RqDjJO zrVO2(olDrG-%w5rz4)ptWn3NJIv>LnJZ$}%bRYC1>XjA@^^3_$Qrwh?qbuzbV%Z=y zldURLe+XytL$?HUeD^B*Tv~TaIBCi3 zX@j4K&VXLl1As*U5C-0Se;3$3@D|>uXT-IvY1@_U>$O;37J||~r(OE65^oqWURfyV z)wGd9&+zO9eVa;kpdK{7Oh1WGFG#IFBmxmK&Cu%3hFFo}##=36!jkPdb&-3^TY6ym#=q%Re39Q$ZRwyEH%Kupx>&35H+bv8<1mXtVJbLXP4}}w`S_x zO&#P5O#=x%oYJPwGd)kP((SVZs-wGNioq)3nwhFDK`| z%iIoCJ(KbCgk<)LrE^NTgt*^srU~i{odjToV}H(fuMMf0ZT@}*yY0n&FxMfzQa>o7 zKGjv=;OA0#6dacwC}pahMA~JMgDCCw$mMINBH@#DEZ#+l2bhw5FwAXltP%Bjx)e&K zHX@^}>csO$Tm2^r^~H=o4k3-bN4K)K;lIc2)LQtOW#zepWiI70W&WprZa2Wil9sxp z+U)pK6IC3vpiSO7DmTI+H;dGQ71-8lU0eLTVv6sr3oH?5p;73R?U*Sc(7do~|3<7o z@3-hLkHtpr*3tljl@vAQOoM!iExO(?McQdUViK5ARiLbzjUH2~X1_$KvJDCb=|@;E zk}e1^;1N0q!|4b^@qU`9Ji2LR5SK~r{v=1+e?<;7Ww6sgDFYVDLp=O4yM0V%2HR2h zt?;E5W`Cy1vzJL+(zXuT&joWxvJFN%OcY!ezfDUJ46+OMEF~CfMMOlGR@}yi6eP_XhpFMV-YqLbbDql^}*bz$31W_?EjlJnX_Cm~gI3m<$;DtBz#9C9Siq zyw!Zq>+a5?7=9bmyh~SF`&Q>)d)`hWdVin@jHKjg;$#F9V#d`8kg-wO z(Q{6In0B1iVef6=1TKxDOS{aB!;j5&&UeErM7?z` zPuD&_Q0Alx9&nQ+xQX#mv;yVQ=iFywdSaa&Ze0qjJyHsdvn`4{6Dj z#;rmnt>DuApSzW%Ic+K*V`J_5&E4oKIQmvOQUFGOk_o1W%4-&y)ep)TWd!UpAQcO6 zswjdLAJp381`qj-_aTp~4w4x8u_uu!|F7~EeyZ6|^;pPOD;puzST`Tgc4bK-_u8jTD<^H7JuJB5=Nv> zb5d#lU|E}q$Eg{EeSMj7^gcCyc;I1v1phTv#cSIAS0$!)toPfa9j>IEW6TeVQoS!P zFTuMrn~jwmm7Zm$_g~bO7ie<*g?)NX=YVVPhgfdlR3yyVqdRa!?Gl1i*e$tHgXfpS z?Dgk}cy2czrCATo()MOK>B;e%y4REFbqM+}juRd98KO!Vu{zxLBctg*dwR4ab8e#S zohz#OVe{Xu?TMIs^8@vHfp@(u?*;;VCipdl+KIf7hlLOMy0)sQY_wEJcvocDBkubg zhKWhGkS2RX3@TeXx)ECw1pquVM!8W!r%O_o7^>r2DlKarlT6|CLI3#wTEUg)I)lID zOJCt0E5-Hbul~uwp_NLTZdzOnB%*Ik*U8zVo4gpp2BrZNi`AE{a2wv6&nhx1AIzk` z@A`Qe-f%EPh0YXWl<+V;zs!XB*Q+6p+RPajB@-ORi@3~X&;gH-)`aiOi}izPa`2vB zgW_0ES%)}3EE?&*INT?RSe8Sj>8mF3yj(0tT28l^b*<&|yZ3#i2C3n+odI900x*G| z#B-7I&7M0kS(g02ByJhgO{%NS>ZZK#brL~~RJR$*JoZif2GhY*KI(9nSs#>T8nD;H zS?d@IpDlY#_4C@3+wbbsO5N7W2k1YzXLXP+)$%rWJ|NGAOfbo`WzrAQOqV%g$i-=L zIYaUOb02%OsfW|~24A^FdRp5KT@YlGe4;k(K!sF4`G7BPz!?6YYISB#SS?<4t*1J1 zeg&ymW;b9e6RQ({um$zqhnU4sX5l-ocg+v;;5=fIlCU)^e4dO3I{#vi5@;v(uwEEL zS@MGO&-EAe$IO|1_$`6bx)P6={Dxg@FF`90CH=K+7Oa@4mKuD5Os6ZjfpY~ zqk8SqVR{B{Wa4G=uX%5S7QJ$tWS{Cdg;1bd<6$Pd0>ym4obk(PXvEw1Q~Bc^P{@U+V)yJYi9je)oG!2AJmr>u0uIAX zUMSzy)TO-iJvyr#n9!;78*)zW#6|1RaMu2mer#Pv-6iD z>7Z<@)PUJ^IM`X!j2+dF(hTAZSsHif496=%9jZsQ52`Tf?3+dNSZn#DE6>?*e|NI3 zPpc01btE!#O3>e97P&=4l9}ps>SW8m>!_MEIE=5W5Z@&@1;;knuetzup4rbzzyGq@ zb|C$Vk?L1(`xp7zTVrE>4=mW8#!4&%_p-mNAO%z!rz_URK+dC~Se2mSl=xyp_|b|S zn(ZfvDu`6rT5b;(KE=EqvuPYX}oHQEqFQJGWXC zZAY4YtujXG1@o8grkw+AX04AEvZwXW`3^DT6Dg`9*Umo;4(pkB6}vF_+1tgKj)*Vj z5tK^%0gy7}dK2=ik1}nR0C2=QKd+9jYkNqr@y-(p4&N>iD3R1iAReP020alBE!K4l zmmyXQs_{;Ua0P9(7)7XPz^XCdeV4MM))UfNCo={h*fgc5=Xf%d*-IqFS}jeAZNFBr zs5nksk{*8&aT3u%B!<15^+E$jaQ)0W3_P1Ptt@Z1W@=LaG<*n@|Xoy4DQ)pWz>(~`lrG>FeDc}p}vM0iV_@EBJQLoFZNQfCCxW#mm_pj5Bd4tmu}@8IuIB5y1DZuSYvK?jtsLKMi&H+rfEmM`FJYmI&mfl1ql zWM4ZkfCDx zG?`n8NIu?(A4rk8$k-(C?cS?JA;mMPr0wp;#v}3;4}Ae+YoCrG z0QQLMw@6D!NZBNb$%{BNlFI-$mD2L=$%YpC#SQsH-_0<&i2$pe9V#acAa!i~oK`!< zJB^}_RU3o(H2kaf5Y{GYUNttAvepH`QI0nZ1hi8jo8>kdL&Kq}q~5qf&)~HM-W7&? zx34^M&oR?%Ad-Uo1_2{X6Y|`eXeaC9&qyBG5~Rm?iiJ0(utukJki6wPtA*tA zIUGj0A-T-gl5T`1PT<$p9K z>C~_xY9NJ4AIDJ4o%RqLNd7Q#;0v%3{y-l$H*KC)+kL>YcTYI{{?btWy2NIT)|c2Q zw-MPf30OprUo~W)tl(^DuwNZpk><_?Js_!=p>jCgAfn|F5@jb5Kx{GDHJ8KilCrbr zxMk<;%Vh_Yyq)+iiJ!!AoV#6=O!)425V-Z?Dt@ZfYj4HC=*5eqOshXG1yFW56|k!( zOd*iirJpxwW@J8B`Dnu?a($v@zt4f{bWrsH zdqy67Gx_x{`^|5}S7Xqz5br#rWo1(buy^hV`UXO)G$W zfR2i{$(n-SNuDS#)H7}pNH)9;*7@bk0HTzn%_4`wkUh^?na<8;q1_{FzjDGGzZ>)k zS&4sXV8^(^yxd;BdR4mjmDO>gsIso$j*loW_?GdriUPNs<8#9Hj;-LIT63a}+zdSY zPB3{rzLd=-&sW1uxqTjOyHa-X2szj0YXcA9!TV~#-bra!7k`Zd~e zamk9X?YChC<56zgrK4GY^+6D5_N?OOLg7Fr+-OXLrMBzUaw8~_J< zW7V#LnHO_pG$cqc=QVuOO$O;^(oo6rNvb4u4>cFEg1s+qk|O1WL8v!FzAQQ%t;nrxh?vWCz+^lKDVh8BA}QDZTzZqirjFNdKd8VvLTA zeU;}B|5k>N-`x6RTpQ|=PL!Wga;kwvd4Hs|>antq!3)-pBKo+&SG{bFPgYV9|Wppod0 zr}K(S7;nZ7eJOse`Rm!NX24vteKr7cTqg%h+fA7ufBn|A^E8%_*sFaPMPG*oE)F;Z zJ$&Z9UjNaWm>IBmBhkw5wOefh!T|tu2IoU3?*RcFg_WE~!TCTurSQ9X3Fbcm-WV^g ze%;wSkA>OMZYEVRP+!S8#LZOucl8=L1`S0n(et~fsgV~G;QhmB9o4m8eqN44naJDO zTic-mGa^ZzfC1bDhxa-F>_dh4Hx%K%^Kt8z9509@vOe>+oGl-o&~m5w3=u!5U|Wyo zMtgMcw+m2-#q^B(s|O-cUjvpR5%gUmC$@2S)sDj!F5`S`*P|e31mx8^5q@_(y=(dg zmA2|;C7oyMrrw;zSciBHZA-7T``TrALg^og6h}giC(Qq)uCDH0GdyYnF3cFy{3+wK*B(otN-*E_9X ze36Ow4%&Txog_3Th)jqEHX05yM)Ao2Z)d1e$ z@z`F@3dOZV#CFdP3Gw;;gcVN)zz=;NF|sz%kylk63|9}|^JqH8%`~{LGbAb-_Z*pB z|KAw|jyi|& z!_1pR$1-K#%~S!Qh&$IvOK<6^{ky@V^U^v>d#$hN>i~e9m25z2r<-m`EpF)p^}9jU zjl^Oj9FfOOXD4PpP-!z3*70h$S<(iN2Dkj4WQ!s}-TuR?EOXCs0zl#y0|LLI-}m+! zq<-0~f3XJ^PTdq)OvYhgeq*z_fvqoh4Gbz#nJ&GO)iL=naWSJZ+Gu9xF(u+H9eQBT z^nSKk!_cA%lj^mAo=uB<`$RW zUt#nfJ1kI)82b6ncmKeSYFxiic1R-qbJ+$%8mhq~!Sc7Om)MaIbpbf2;+8K^S$)K| z-O$aCkT9=lCe(>;ghvSLBzsy%1;%89KoFf1*4&o}=Ztjfb99*{oQQ^|K0i^7aC0Z9Sc6(XrN_u=_ns$#>K@|51vnb!pX_WBwYeQnAL9wX@;;U zlYeiAS&bVZxTHD93e6CK2t(8k396c+YJ*}xDjkO2e%2lm<&tEIeD6tGs7o9agRSl{ zPpq!2;D`O{u~vi)0Wl>EH&FY4IiqGI(`P8#bM$Dwvp-l@tA`S_Q>1VqshPfkn`1n* zJp!88@*ek%v%KNBay|!=b`~^`Tc@0%>v#GO)J|7VpOjl7Uls$Ua+w<&OX=KWTQ%4W zHdSTCH13G_fylG}a-0O9s%Lpwqk8GDowoTEGZ7`$n!a~O*bCB3fX&n+5kxf6j(%8T zMfrAaEq0nYSc_FwnKxh2sdEBQA#DCoO-H_2OSBRg^UQ4Wa)iqV!j`&N9CLCuC*CJE zd9}ODgFqzrlhS-PkR|?^ezu%8`ZIECl$?GPu@ffMYJ3eT;PECZ`(#OVZ0%fwUBrr> zxV!J>8hw%9hWimt>hZUWg8y5Oe|}Pr2M|4I)z65wwk z^_7<+j^oA{584Z7>u2$_?m?Cfs~tq?NE{jW9LIiA)vvH=num7h=Hw`oc7B`DMRtnRTA#_zwM48Hq63Deyd1j$SR;eYgf232X5#vXV;+ zF8%9YX$j<(2~crRrB*lYCy1LI4ip(UhDX4;cda!vG}=QB%P(Uj8S}e8uQ7hKa}Q}KTD0da(N^nJ$rLsWcRTg?aiV= zr-)VQop3tjp8rib$)3O4>G7*SKaw2fF8+NwSCV>ocgJpr-1ETLLU)flw4purCkxVo zm2Of3lJ@U;GYfBPu-<;UbX6n&qz|AVpr2>pp+3c<9Tp{&a-&-hs4a5pglls1F^y`( zE>!*FeiJNdVSXp6Vd3`a19e8bY0yA7^P+|vE)VmyeGwq*lK3<1Y9McSewTmoGgXAD zs`l+pl>Wjqy`y_u(Wir|)8TpA#go?6ocm3M)`upP&$+bDRB76eUcrSK% zF2@K5Ep)s%QufJa{F$mpTRFKCMm&m^_@Zfhr~1#eQ(e>#9o@!1Y(10+FVRqpw88EkzlN3u2f( znsePr&uR=Nwok=O^L95gE+jtfFj#NC`G-z?-^jn6&F4D?chrm451wxJhrhn=&`;ZX z5%NEFDRV`|v;*--a{u)DJWlfMN)gNcA`3pI{swg5^s%XXFB2HmI=Z7}<3&y{?C8hG z{LX)U*5K>E)=n~U-%vh%{{N@;-)qpha2*&R<=I8%h=}mlPXL}UncG3XAZY*{D;|$C z{z|$fnETXyfLlbyvCCmx<3i?tK5TtCS)&gE12eUqj+0#z9PIdtSMCNm9S)Pv3oVok z5p}#=AGRV+Z*q1ixj*? zxM7|pI!@6`Pp{?)<9xT!307M3m>^{NdCSc>BlW_#WfpH#ZHoiG^+@I9AkMa>$ZQyv zNAnpOym;}zo#8V_d!D4kqhc`(@Bn%IPd#rh0AMSHW-uJxmxrTfuVbWC~=PR?xP8%7A7+oDRWZ zzeSt9j{OPC57|@aljT=pv60|1tNmh(`}*06+OU(eTEOo(8FJQ%=OXWiQmxa092lDs zV(l*>yuG$(zPpj~H-ul#1AO`4yBR-!?yMZRD7`O?^+!c`wnu;Z9>p(j*D;F?vANLK zZBG7`RQ|e>Ekl9&PgI-z_;u(>(JnQfC(-~dceM-;S^VnSR(S=bfq~en%UAggnh`C% zyFXyD?x^|DjN?0iW-tCv;cz}s9rvlWb3E&vC(r)GtY@ZB1TG<`%-wS}ps}xr%`PF# zd>=x8e~`fkW$u=p+)KnG0ZzH_OrcQC+-o2{G%v))pe~@T#x=FX&+*~1)YXJ$uhC#l z)}zt*s5$?YNA>*2TYua28;yFR8)aPrH7_uEaUAIV-|?aSL%Q5_C6j)PmaKySQu9_Q)k^PgT*$ z)}~`;SmoItwx_by7cAkExt|^x)Zs7#`2(U_uM^=?**&lp;&#(JZTrRJ6}!HfEsGTX za;nST{v@52feLoza+|*D3ci@%_4;!kR`WTXs=|4x6^BWLSn*}blMAufeYlN>s=&U_ zU25T47*}7?;jc^q(sf=|PP6S5T@Kj&%D18XUzPYq956Yb7iw7Us~iR)w4E+TcD(j- zn6ykqdXdYgf?hLyDEjwovP`hM!lb9_oM#41|5)wD4wBvSzXWdN;;}Bfq0BL{9=QJS zt=WHaBEq7u*D?Zkyoj_{zkfOMD}uLjyM+Q0lPGAOC^|Nj3*NlJ_6SdHe?+8gf7`@` z>hwo-&Sd)H1!w_IGa20(e9s}(ny)9GG1IAV`g5gn!itqD9M7Y$puZAG+b&UI+kB~H zSnfDvA=H}6r(ODduv?(ixlygf&1qvQ1{kmCf5%&wbM^C6|7|nqFfI)9adI#%wH}K> zbiC#wZz(!I{qDK&eF$PY;(;~XMKz#VRq-8!nK0DMR+B)ZAF8{@yT#v&z9d4%zm&db zE?wJ=Diwm8>te55HiXyJ9G)R>Ssw2#u{xVd?=Nq;SE*=>*%nP})9R`WVX&axyptgrfF@5D=B$fS6CSw#tVh#E9}s4L7qH~eDzN71Q5PcpiTx?jkaP-2;S z%{6cb@0Twe(o25Vl@o|Kcvg42tezfC9`wg$cepXM`rC9^*?Lh&8@FP8iH3mU*xKqTsqz74@6DIyk5R%yv-LRG!ZY!SgI_KAT9Td-NR~eX z3Cn#fg9yTWg|0M+^5$QtU^Vk*uKyzIy!sYwbra|%C`!(*@j$=nnEzr(KdOD zPdltL#T&EV7bPTa{Hw?!)lH)_VJLl+^2zFR;LYw*X1ah8!chK29z(*Tu>DPNhed_E-52FPq_QmrpK5Ge9Cb`D;VD} zPb8Y(CAD_jsGwj9&ES(NzCa3FIX6@3hpmQoi>)Ykd4a?yI)gtyrlj`aew8j{l;9io>L~`Y^Az z*@bY$J3DSbErRu5Uy|p-_iA0#(#Y%&(^DYuK(j6XT}OH7aJLsG>$WT<^|lS zlXI&xFth?~uk~lL^<`N;!4FvhNA9>6&wApoHPnYez8e?ACnYYPnUejt#p;<_{q-@{ z&_c@xsP%(uADo~5>r#uYkWWif^adR`{8rF545PBH1-D%azt79`!TI4yTR$fBstq-Qk40v#)BidlDcAnA zm1hObhU49U_UgX-1U2i2!@kuUzj*)POmE~FlI|%tm}+tuduIRZdam}?e@T&Ipdo0- z=JF}Kkr*qtvJvJpd1>6GdyQ20#66Avm_=iE-4z$UMePOnRtaR-0%{uTW+ZTT4pgSE{?nNqzF{P zRcxT?aOsD)#!1g7Z-AghPGg1tE3br{Zu$S^*HZpp#_+>CCo9YC_gOHOI4|Zn$q^C@ ztkeeqbs(#H!ucsvmc9qnVAeUit(otDG+qfvST4K-Zkg}SI=Ba#jdpD{sWlsYDgniM z9T{Oi$4(8hFXL81gHuZj?t)zrF1D8663t%x$%^;6Xt>JxDHwQk7#M~Vc%szIsMvd8 z*$pTZ1Pw2{)uyU$=Ea5%u&8OY&;8sJhD#;ef$tT!d>%@I!m%-TT_2`JQ2dgv%SZmOZx>J*P_CE<(7*$-2#GeWNoZ z6Tp@3EF}SIJi82k|GC*w&VW`Y3-@N>TySDQET%|(ZyI=w$D&C*zoOzd9^AaYoipwF zg?u;3mqronv4em6o?MQ!0v}M-^IBNfQr2(w>~kg!p~BWynZ#;h#w zv_i^kSIZo_4>rLdG#=pb#qY+zT*tX3E8P+Ga-Y+{IDzk`2)^1q_ z#T9gM_eI`y9m28!oq-N5|1L5p7U15+1I0jo zU*mk>eFj&Zq(&!`L0=qg2+$w7jOO`nnaT)jC0BbpzXD2WLO876k%=7SEM5FXnUgr%#||IwFkvZQU|)L49Nd>@olWEH$BKa+3uExFE#kZnZw^c@Uu zo6%a&t?O+*IPSNtG{*G1KMK)Frw5i~6;w>q0?T;DBqT8G-Fu0QkgG~a*UisHw1du> zxjD)zQhsIP4A-jF1G3nh*ypiLcTz^pI7fe6yGH&rU^NPd#~^Dv)M^epkPecG568SGtKQ zc-QOq&e#J_S3hN?{5z0(!{ZMd$3%O+h&ipwv_`NBX^%Oxlk+lF@~uN#oWIMp$&C;( zwl71MvA5*D209v)j-~8YZS7&M_Gw?3EV5o3Q*-50a`!4V)}_8-QE$H98WKvWZ6}am z;{5}q<178rWh!O2p?A>8O5=(RO$W^igr^;Hr|sKh!k-!7a#nL4|=A?(b1o;+TyhY76~+~RDIGrchRI8N+$gj~_SW_1~T zlw`7C`AlgSjN`{D--CwzPT?weM{lJQdPeRB|G zK5<#N+TT-XrL@fjg#=1&L$drACmG+Wp1TrslP^`3@P#lydUkSDl(@X+`JUg?hJ;M@-khN7!!?fc`o7t|aObWVTf_MOFuKBzf;`^ZB#44X} z-=~DT>}s|JZQ{!O6mgryl7A1eBP%W~^^vBS?Nl*46SK#+CFvKdGyQgsr^0soXr%b9 z9nNqmM(RqOPn~|8(%}TtssMbP!D0!VqC%;ArIhJDX}`rSH-#ZjH zN4A=<0<*C8C%0GV#5^XB4EG}w=hyq0O&g79a8n)BSn|ZB@BSXMvVirPq-z|zO=V^E zMgk{B(28(j3BN2DD5Yekyd8t^WTFa9caRRtoJkb+q#T$h%?bvc-spx4t+I^j#5~fd80n)w?aY6h^oKp#ph8>9x;7& zJj~zMcGefWmh3U~P54kzu2twQHn*RnG%BjErNV96FGt6g3C*d>u ztth_rbH(@H|GbL$Y;Y4#%^%_!U)=VOF1MZe|TN1vOqGt6IZzAPcp#YX` zSZG$Y53>-kpcYjGi;7Jh$d=q@=hzF07q+y4D9O*QF?U;dwC};%wJ&J6v@=Lv^BnwU zDu)>rRxyzaQQcWr?FqLqJo1Y%4(&2Z^EbTd)0?WWy6!)DiQ8R|Y<*!R4sIYgYqnr1 znf-42(b?|2((>CnR);_9g;})3n}ei)C2@|8(tu@jbUvc1NQN7c!!c$3H}uzbY4caT zr0@s@likHkQ)Zn;LhspFK=w5hsc^V`CQNDwpi^1yzW%x1zb7G;uPZn0LM_uLiG^pJ zgBCQ1+9i{|IM%^0`1EGErx|i``-KmiNLFo}nh+pGs<$ zes33t-ZL!s4-6ydIX+rK^r$K;}(ToJu>p-oc}BxVO({sZwe=YfH9Dp4(|I zgkCzX*!bp2KBqYsWK$Z$)^ricAyzDkGMsDvK2&OFciX#nPK_qzJ=rID2~#|R|NA2H z%_K8scW_e`-f*X+{=q%Q%(9-Lp@FHemHI&ag9;rwjgxo$KJe!B_ag7#XMT7;1FEo; zcdP@O#>OuxGdu$4+Ocq}yKq_zTi&433Y<*^P-W+7WkPVHov4oa!h7X9$qJsRMrxEs z^KYh}qoL4!wvD*oPI4;y6)WX*yHV&9vJ)m|u;t3MdzSX`a6VL%th#8xfOy}$I5Lv= zsCFc36G)`Htnroku{<-MV06ekTuWE=_45vphp#i6aN#m|TMM-J`(fR2=DFql8Akb! z%42M!SftoCCT|{U$s2zB-Ux1uQ~X`^IN{HN(VC&$79M4Yi}!1Bj$&wsJ^S14-MQt1 z&wSEXCrh3Ez0&BbV~_p2UabGqGHKUs_U5=xUx}c3?yrw2g-!v_4++MnE`3A)??U5MLs`5kJ;T@MXoVvl}ntoRl@R$-wPo$(}Bxj z)UM!@m&rjT>Q@m&5#Lv(w%r6()ytubi)K*uo2$%YPVQ}4gQHgB5poR43tElUc5f7N{9uWTHR z#m7lQO=B@s?xFPNoA*+X^RdQH6JyYP7S!GXCnkeZ>psJnA`XuiHr@A;H@O%YOo{vf zK8F#4p>L)cRtL=Va9P^B%3^GY z2kCZ5^W#0j=y774Z?LxTfo1CGKdwFDog-0e!+xtlBqpO=e_`+W%AQM-zp|kDg93x- zF_yc*5-DRPSdp+z`4`30y7`yp>?xk9>y*0hDUD&&Sz3jsrV;)}d!%Lhtk+-a_P|2E z&#d8+*2KR^xp#-_AI6a;iy7o_b-BxXqj3!b(^<1LdF!Q3`HJOOg|*O*QA&fNvlRKj zB?%#Q&B?C=yiVOHjcNDn?5}@K78tJTwPK1Fc+sNiXe-|08pZ0lPAz)h&hvgFwegMV zqGXDhTZ!Of_%8!m?KO!?cAO9(#V~z}T++7^$ZXhpkc+*XN{Ne5su()-LC33;4ZpA|=a)>@2y--e`<)4;-QbNxB z>Y5RlazDgoz`V4zA1oUB+oQ>8rhB)rRqHj|zjD2NSh!5#j;$dBn%}z`QYznC3B!;o zP!xeW^IqNZxzLyhAExn9d6#~uvXrz^`Q3XN7~EpN*4%5C-JmrtzTVmpr(Z|kzC5XJ z{6F&&F=wZxRh@=&ovt>ujLr`ANUD$Or6x`nSkooVDn+j)L0kjqnYAU^PS5hH6f*K0=K`{*YCCP9&e6r4i3lXEK03mswZo> zMq@MC_ibCpTg|>daA3!{TN9YVZE+CKp&2Ki|($ZENtdK323OIduxDG!BlP9@j({s{2i8 z%Sx82H?q|nWHzC8RM!R|J(#rf<$E)h<+~w#cW&1zEdLUWnp1$$_LkMm9f;E8+y1)G zlxp<%cco+f9i|)DY+4jMg^hMMvi8mv!IIm`jga1b9Iu|HeM^|Qt5CtvZTgVFWRYtX z!ET(QQtagyTBVc=rHAT7KtJoQK|6#XD_4S=nk*MbWh~FuI|+9=f9IDiv7+S~D4ozz zAiF=WW{5Bx0D@pS*Mzz<9}9UA4o!7+llroTC)G6;+}ke^+EdE7P}6(+r4;StT!n{y zRC0%H{D6A4*E)G8)4xlo#pB?|>|pcanvtF1*q_C2)1QpW8h@90G79m-duOhjhF2&; z%IC(NOzZ>8{ug`i8P{aiy^Y3UkQp6dEPzsH1_1>D1*xHo4Wui*2Sj@BJy8)EsY>q= z5$U~`fPmBhkxmE@dJ7OrLI`Q^&CK(h|L^?H`SN}_?}sz@7e0jCx%a-;+Iz2ct?ODH zPTy6KkT!CsG^!bwss2Sm%X-M<`M}|hPoBm{>xdkmb%_h=qN&o}&*>i!nw550{0A{J z7G_yPlcf@>fjZ5|b*IP8wUFS`nipHl3AS0|gr*YX@LHvf9v;nwKj=XObWdcK?!D*L zb8TIw8IST~J=4le@2pa5ki4`#;n(=CHko<@T$G^wTG@##CFO%Xr~kCQ9SRjK7UEZ`xtU~G&u3_4B(YlQo2ql&!lB`tZo=&r z;S4#pEzCj8fgEG0L0a+}z5mUl!lD$jcDGSAAwQXO^50ttBo+O;ka zmdP5VEXA~RZXG7hxw_$DTCHVB3Vc+noajv8gh{&9hx`P>2%KeT0Nt784&?&}pac!( zKliF*EA;y`q%s5`lAcjC_b{lObRtlsu}=Gf@9Y!6)Y`hx3UkB7!iL$a+~%Tc({x)} zhJ=={z$LGPD-PE^z5O#Cd0`HWR)N;-YSrVRVCt)=Pf)KM>C;i9aAQlr=2}AB6D4|0 zac|eFoNbw#(O6Fr^WlkxsAK*x|~ zgDAU=vXF+Mo+Eq7+i)73y%hgLleG)2tF4HieK3>O&(wX$)+%Eb(rNd7YV(I0+m$cQ zA`4FsIS=}bP>lRK7S!Np*&?I+ncs^ZC&{L%SbAhgrX0s`mm5c%y82GP5wtImaZX-n zgk?OoqEFPyB@=}B3hY{s1%`4U_eiwYy2@j(rvv)|Wel~^!|UT&gqhe-ZDVH^BQs!~ znyzyIGF2J7hka_+T=VW8zlkd!tr~a)FP0SU?P5Zx`Es!pR41p|vPm_eHeuDkgfBwk zHF75Z*hh`jmXA}`fSIpdb+esF!{9HC?H4>7gZn6B%@@1#N@mLtwaz-`jdNA;9IG4+ z?nZRkV4jj92V)9dygG>dg)wJ5!U_94;W9<6s;y|<2ROPNdqs1$X^1=EG6kX(EMpV( z;$WyT0O$S4IcBCLjL&dd0@G$!E@g38Z(3-*{gwl4xQo4nY&ZRI!r;VzD>r68XG8fr zW(8y?=1nok&IWH*E}vJ&+8Cp8)M@51SUn+zwFfOoyI!bgCC1iRV=#+YdJuol?K=|e6|Ex3|j%BitOh1^-_9STq1b>*ycimfM zjAYKq=ll9e&pa_g-#0Q@d*G3@0394E6HT6@PFs^bHQ>KghlrnMPwr;vq7E|h47HZN=HJ7@T92d@@Nf6>dj+w8iLn9EYKACRTEptYcA zYkj=K<}RBvmtwSrFwl(@U=vsLvpgILwdYD>cuXa-@rlyMpIAo9_(~t+zmzd1Sl_A+ zThHEA&ZX^UPL<7Jj}LuKq8?7}e@K+ZHFK?}hTWgg#D(k>^Kq8r=L;!{LnK z5dU9P*~Q3;H!T(|8jyn+Al$i}5-x6RXp~tPXqv8Ex}$qt?vU!3W{3)WL=IOB9VvOl zI(LYVbSaAh%GUvGZGYt&zz(JaE|h8&?mrL%=wJtF5C))8k>kC6sW2yOMoY4z6<}lA zJU>Jq@0#xd1-^k;NuC>SUznw_E@Q>h=aofdw*vf<^lC&YKfAdARSC9|_EB7j$IWI} zY5_@=9pM@cTxzpcQhD0*>bm*ob_``XNrgmd(f~!o{q%XAbz_p$hRSJJ)Bfv%q}-tL z8~Se7C_C?}3s{FPaE7HDJ#EmMx+x>AtMq%|%zRQ8R)*`g0QiOF!Tc9b=*m<# z=+mo#N;Sc9RVAj)^AlyBaETS`;F`}Yi6=bsO6{T;{f+NK)&{*QjlYq#_PgvoW5erj zyx4+juGfgD#aVIFpD1~*r)Nc_IXoO4JLR1^#iBY4YwC6!A;IAt9`mlf&&8!FyI{M` z{^sC;7dK|!HO7V2*Bl=Z74Z-pgkd?Fr+%$l2KOPCHuo7%a=k*s;V&54vbetmLXu%! znx2?}9gtH=;3fCh{e_*ClQ5ThJ~2_H{d$>OwbZ6DuJvd4%mtUpvBa7SnoT>3KZ5Ny zVHg6~Va2))i72^jghr+qCTb#YDA!_MgYj11SH2Tz!k(wQvfgbQZKv8>251y(*67+d zkE|0A`p*=St^x;4-jD2$lCrpZbp(J+*}?t>I(A|u8Ab~oS#^t%j#_Mu*~JfY2bFhE zzF9jZjjrSeLM~*v^(B1gn)aMzr$0eA8;@*OOTH!Eptl2R5k=^VCDSTL3c>ntE?rn% zzFxO>#JYy3*m)7+S`Nq=TeyyUKS zgFU|0W9uGcuQd_bc3Q7S8yT5-6v9*13lF``#|hKezgDxnNRixrAEbfU4W;Nf zvW3})+__xVP3udo=(d-f=J8`_?B-``r-m8{mDHrkmEAzF*uO;?S_`|g<4g;6`&8^} zCq&z<3i?8457Z|^4rXm+_7sB`i^v_Ds!elN$0eVmLkqJtRd~&h+wsR_dV5RS8{p-o)5&p^j=neu~XvWOz zoODBX;;*2FK%fkRBPs$^#X1aV3ISoRsgY^Gpv257L_K!*luMC-5GCir?Tzr+aaMoi$FG;q#9QHuvxs8TF{B= zt7zYUGuRp(+4QkN=}K#jW=;sBZMY4<2M}_j2IK@AdVii>>o4seUF9{2L5!^x;Q;zM zS|HO`R3=abLY0>~UZ4>S5>D1WSdnIHgW~{TFTeSygO@SVm!z7`^^4??^+K6h8&PlH z5Q8x1oeX8zIH2#UX1>mNSb1F=A4dCzI+2;~w;_KcfQ;oOv|Xg9oS_?)uzm52WT={@f{1uRBjaFwHDjo_sj2a99scdc9q zf4mzEx;W)-GpH;#cL06vbkL-AKEWdOTG>M5Os;!OxYZY%#**E@%5p~XOn-xDwx~Hw z-tfgp`jG^`v??z;*HFLTp8Ea*B=SNk<#_j@2i?;{zCpRD$g}}N`)@GAW7Jx=pjjgL zspN(q{Z+7E);YmS#ZoKz8oMXp?YXoHJo-0Y%&4I|4*E2+!;Wh)e$X1jsYnRlu5Nel z{s2!CHLRLYfwk}TE)*}#9Pc=`37oU>{ks$mU|+ni@iFq2{|N*xTdQ1+|8C+ueUKX9z)xBtSieeiUk+(0^{ z!%vO$?RGFQg$qTTjSFZn!r}2zS|+jo>!|0(`uewR8Lje^VEP&p+h4#M*b$J<4>Pj$ z@F)NnWsQjhFZLK;X#|#fRUl_$qfHwN#_dc14YibnB5;C+3uv=--%){%<~i2oZ5Yt5wF@muW+!PiDD&N~*RE;1F9 zRY*_09jSv1`$Cba0GfpeGm(|sdwVX;sfoIx@hd9Le6$#$H8lyr2Xs*xK z`5Z?SP8Vd&0^_piI!kiQ^(`b-(qOlpS$A&mi{4Dr`?j|Qk9x(}wNiu1Y=WouH&({& zBAM&Wv;78ciTD+zSlLcS^{l8Bi-=T z_0_%rU7d2Y$NpdKRYB+sozr)JzNIHL4g2MHD30rU}uVcvt~Oj2Fle^l3f zYv_9(H^!1|{8@A-P3q85RaLY-@bwS3T};g_E`#?7Uh~Ti3wMKp8LOP-FpYok&R>vi z%i&hmk6UlcOVz0LkfwX#Hwp$h-R@X06O|5U66EzcjVv`}&F&^@vK38a5<|1YL()jO zrU9B6qKH=~Qqp@KGGf*$k0YB|!PdbKv3u`~;<>Dz!3|7e5l1;je7azKD)ycgfOgo+7U~%lLDz#DNTLtDQ64U{&Jh$w1{U!UMpUd&ifQmFxU5h z84`w5)%zi3GD@uR?Nca{%Z^`5wfb~Se@F|j?-9paaD>p75PschLMe-M!g zC8wB}+z>{EEw%Msq|7IomI6`#J@+nqlmkmr79UsJaZ`kyd&Msc1=<0;GyBD|%Fqe?#Ln2sdTbM6FgC+P z^^REXZ&!!IH*2b~aBo{5X#t*z{bpCOJ((Ko#{AZy5QMfT_jv7k0NozFBkw#}Dk-Ua zC^?NFxG90zB-SN69E{U=Dndlt)pgzI2}=(PZx~CO7O1vo1#GRMR0GJ}FlExWw(4$C ze8#=5*Ia#H*g{TPHdfHyZfMmgmR9=IB@^aI#)Q2NoU&51N^!H<+BC8D^dIZ)JdSVM zJ6Q4E<5iFg`*bj zmQy+%IY+w^88&Iq=$9FaDJmQDPge=(=gMg8MUq0m7oOdq=wK)m%Pmo-AnuY zx>0?e@VKxwiTT6}TL=3E=47Beew(t9-)-!$kR!h;K+#&C7UUP-Mdx3jv@BaS*bLd{ zk4cErZkXNMULQ@_tB&3dX6}PNAPWjTEzs2OjMC0v+OEE|k<;We^o6~s%-fc%6fn6` zSjO$seVSQIs4pX{XH&+CaLZ`#s#Rp~dTw&jerMD|JS5v23t5R8o2Q63ZLO>0uVFUF^4^v61nkR^61aJu{YW-@s5ZQtV+ubhG@kW^ z-8O@tSf`^822VnIRX1l*Z6|s>VII>+s{QG=GAS9`g`vjd%?V{{(*0u1?cm4iI?02_ z&`6@RBcVTw)4xS^rf%_R%boDUj(pX82UUF!9qaINzlUN; z!#r-y7k%O*O}N#>j{Gtc9pLB^@DwQeg;q#~%*|9xmTD$XUafBiY8oYhpWJkfSPm&66 z56_&|jGc4|(8gN}=;U0s+^^IbZrlHM1#_d2rF3qk|Ma56ZJqeXn+vVov2umIz8imz z&XqY|R~N~0Pcy*(H6HH{8S4rp)L_I zk*5xCV}4ii?A>NdT^>hLE=}sFH&ICLzd)&`<04tw8lLUFHz0)nu5?tF&nTjX5io-(+^>TBIk`B@cynfo_V+A=OPmi05vuYuiRk9jC`&N3`9(`5ZQim^y?@~1J zQz@qOW=F?2NIm3cVAwWpCGCbV!g(!Lp>rJH5m+D7CgmrnoBCBw!~E ztiN1hs3Cgt9=-Td@eAo7%S|KL22NZ{IztF?Bp(2NMr~hJ;Rp-S#?O<=64lVGihSUc zeP+EjV|{L`P{`Ak_e^@+b(qhrrH}&u-|7Rm6#K>~$D4Nw7b+!0m8V*W!q@K$ZKDoP_m0iV1_j=R#$%d>cd@l#=IGk>MIdBAi zqJgpI>!ul~`6*Yf7QL%^r$^sB&7f@~s|~a|dd8$iPO-7yo(7W*ApN3^!nF8X#Tp!Z z9Vr60HH=P{F^|HFwppzF!-{&>^sb+N6=cB2Ig3EqtevnND6OV=-`HqHad7U#n)0N zfo&_VD>qIl;F~QbpJWVBUH^fqQr30-lem^NLJJ$=^)?adZuB-ID{yLD@feERTg_p= zBt*Q0_xmTRQJ}3oZmQn5QbD>qHNpTe*V*83bxzzFmg#kq6PbHp8zW&4^XDsD$lkFb zs$^x&BV5s@pN*T#ixNZPv`Evho0FtxldUoub}h8wjqQ1m;&mPF$cL{o>+QsRKJoOW z7?j@6K%|*>1e7Wd-tcv1)k;mDI{q$eucfdb?rbZoC3a+3RgHxn`OE9S0*v+5>+2T} zTO5+jd=SUG+#{KgNQ}bBaPC5ZR5wR><1ZdvNd=O=S|5c{>YLLg_3Z}K3I+ailb&3||y1RHLxk#?1*Bo~O(z@lfc zlgWS3ysun80Rkv9WT095=QaD zKhOXiantk#GAyUoZE!{kpEyGt=-_qJQt*W!jylKuo9t>^S7zK4#M+0U_Aj=;=M#|D zgYS$ADk?@$Vrl#pjm*f~rUs@GEVt{MDFp`DD8`($>{d!C%R<09hhB$bZO!=(Z)S4y z+A?z3WK_a6F?i*DJ732&*pYw-_~`Xgg7yPsnslefc2 z(Nvb)(-=(r{VLvHWG-UBO*0{aJKQS{E)TNOTgs|K|K!8WD~ zwg>TCNeTDeyF`AFF~IQ8hVF|;z`4D*m_vu!cHWLj@L5=TQ6d8&)9#1jdU^vFMS6_n z84g;6{<-bhps3t;eUOr|_rZ4Wtid8fapJk;DG%lNqMOR`;yJB%ctxL;-lx?!zq816 zcX~XnyzCv5uP=6 z-}esyG|+JC{8R9x>(i?pN0Yq`HW~ig(}Px5h&;q$tmOX_^wc4QTLQq^wv3SmGT*2j zIW{J(r?QsHQW3Jf&|coB8uHLST)@N>Rk}5UtrLL$DNcF*Sl&=~+@W0dlwg_!Z&e?! z39nC!Htjc7kad;8h0K^uTb)eUr9lD>_o|SI;doi+`Inay(3;b0OJovgyeL;f!v+uC^ zmO4=ZYVXX>UVMOUY}gCOy_|U;DiUdumof}d%c;Rz=aJzRiu5;$P=2Phu~(WdR))CJ!2fwB+G z8aey95iaGMZy{=A)!nOu#*uyYv9M zS>600+YE)c)A;$CYk|M=@dR6pLyyI^#?9~E17Lhgcp){gHuaIap&Hyerp93;92X&* zk(FX+5;pN@HW2{_rpu<2Q1g4(s)ZY11St^(7XTwDVxKHMWS?|!c9yZ*5`lw@oCxo| zvkbareN}(>8V?YpzM|A(zPP8Q1US#0;aCN7A09Wug2Q~PDRxZ!@=P<_{g-R9aThw>n_m6$M9sCrkG3QG&r#7ml7*Kiv^HSwj zEj)aUNNeeV)d0%gohKUONv_7p;Lz2We9?AK>vwf3>T)4_aG)WHnTAOf&Rluf0Jsl~q`9a%X~3 zH)k7|mi#cxLQO@geEX6YVk8HLI88_tc2h7A2yr>`{MO-`?;tIlz*?IIz;#N>Zl!+K zqxTS#B?Ur1>y_C%bc8$p!lxi7c^!83wm>MR-$V;u{s`eAVm}g2An#Ny-_9XC8hBMJ zgmfD_s+$*?C!-Pz#IJz~9b1T2_dTeF&T!VfodU1lJBR)THaYRM2Hg!=R%;$Ey8LhH zDq)t!&+o|pp{o?I^|0G9vNTiLzuy2DxAA{WkDE*U`dt^7rkRhIbT`NM2(fEuH%+L6>DZaP5@9NFFPvtwtp+&lCL`Sx=$$|?+_Am`vd z5%}VpfqQG6bHK^@9RDwTFvD`LN(3(ZRbY;i*8~+p5SRW$d7oObYfVqJPmjp?)x>ka`yDxMs z*RT>(U{dI4#Zz(IKVvJGn|!<*twUUBCASD*eNT7gauoJcwhpR8fTDe;r?fKU`Go-8 zsw*rVO*?5Kd=N9$E4X?AuZ3bUYX#|<)mMR5v==-5cA9pd#7!Oc6MYj%kG7N?+Et=Tz*_fuYp7QC$G>@(xPF&Xmd^QRHjHqz2N zG82H_?G@+R55)iLL3uEnh7))qrI2h zDm4y33WQde&?-`Lj|EqX^X+553sXrN+^N4X%Z8XXnfqdpAKmx4kx<#}go5CWB<f1XQOP%yE09;$Z z$%c4Qzxd*quZRRJOwl6nUW2?c()bgsUI=3)d2dOYn(VfsrwW?UbqfCl1pbt*fkLE> zI)(>O?QWXxf5X~|5Q`Uf(%mb)29>+DV6Sp_JeD`BST`EpBb;=i8fsRy4et1E%GfzX z=~yK3O%Rmit5ws&t3M$ZjJ93g>J*<8nYD#IYbA*Kv7n9@)#(JLm%DEOpsy+-1Heeq z`o7%b^O|oC*MueUH;VJ@O2CM{AN0bETTyrv&-eP-%DQ@$h4n+uHbu9g7~iRH_|1CP ztotUpiOs{ybFYg7=aNz74=D7}^d&s?A?? z3U9L)m3OIu^U=4V8&)6XVWQA)XJhyHuRzzwqch|V^nX^d>pvjv*9PLkXEe~=Z5 z>^g{!gKoX``U!Zr29ENCbBpRn-ywa5LSR58=cPa-Fr&Z99n9+iYND2t-E%-Y7#1qf zG7dly4#a)tem;=xG3PvEm4}a=UIQ)j^B>@cU4F_&IFTO;_P!AWZdxVy_b0NAzkAi+ zwpN~EMo|ALqympG%Tza9T-k= z_jrCNe9trWc(XgA`-6B&7*3P=RR{P@8<||<=Q{D*TV73WKH{tdIuHQ5 z;Xuc#B!dzwDKI~6j5S5|b#ST#QlsrmU#md^80T*lb-(Y=)<r_1 zF~Y8LaiQq= z5+(w4839BM&t#0&<^c9K&}}D|m!G_v#o(sVV;Do+Ku?B5gI@YZw{5q&NED0>pj^wj z1_Y4yt^*ME>jyW1IaUFF@hj>~0ca3iKQID}?HFhP!LE9US67d>s(0}}s}%XEc5YL`h3=tWW@M#lohIl8(#fa+ul>;!AGoYRaNTHV&6_w;m~Yt?HPu|UTuV^0(Z zPgDcuU6fjE@NOJ?Vt1543l@;abna^n{tXyS)~f!mAW;Ga+MzAnMjN3%mfvz*94PDq z+6n0U$Y<~se*Szz9eCaoGYzxm5_#SqU&5>DOnYW$O}Re11h~#_9&}i9$5U+vz|-zE zcYQbQdvoQ6NkHfjc5=!_cuNUe!&V2Sy zKv{7{f(o>Nk$}*x_`KLD@f+9dXmH~euvUI#s zuQ^8WE&CTF>pagEcaJV<68#)tfZmz%XprUcj5Z{*i|UE!PFZJt`_?Oa` zC|#(;NVN_0(%`;C8d4OL{$U4@zYQpo9bh{L8uBsoHAv(8;bq3RJv)#?-N5aF+l`=? z=;uMw zfri4a^n8m83H!h;&HU0CNP#Wh;7MY{qhiKC1-nUb_X?Z?r7QGCb=W;$UcYPpxmWw# z#{yvM$kratz^6L}eY$JT`+LZ*pvBLB6(FwIf4dSl{P?>i)1O+vW5_#ac4P0p^Sai@ z6?ZqRIBv=Hq*5b*6J+!D`jwOQE|{5-SZ31lop{Nv8OtAsWk7ZDz@sJQD{S*!`Bl$w zqO!E;)@} zGdR1;U%*|qQtdnQ$DGA~_Yi&E&7#f_;MUa?)M!pbZX88ExHcwakRETP1I+!sdJka@ z(UiJNC2v1jR{R(lRzH*KR~O|VjQn7*^r_6HWc<_dkNLo$ZCuXg)p)Dx)@0Gc4=xoE zryP?@A6~q;aVy28*tIaZ6kQ%;~h7=SOBwN-a1o{6c z?CKe|^F0SLID6xSV*4(g$9BAeyd{REOiUWZ*^-G&Fyy}V=KQTXjrzB@>a^7_q!kGM^XgJv%Url)vhQ}~`P9#OrRP=99V5UT>!#A}wcS&s)xxpfFjyjz1FSep z8xsQk`Oqm&QE~P`*44}cKX#v~`!WL(!Q-%B{=6t-Eam*nVl&ogOF(-tB`h@bF5)ui<-sflGnn$g zDfx&E0>7xUJPCFturfY^CQCo}C{@l#e-k%A9^Di#RT)YMhUtbSlX-cw>d}-kCD6pzzs@&&>Rs(eREX$;R#MRF#|q>7I*-=&p1N3CA?Z z)sU;3RuhjTApy3Ij-j&fH>c-UJ4Z%b{Fr>+TTk5tEjFFa?K>A`6_42anS72G36!J< z?FiG`6P3)M^d4&r-2oM2p;h1`s~V7Zt7Uz=fJ;(AE=%u$JCl$9=T_YQ`Bk;oyd$y+ zAg@2d{P;lzm5MDy`6Bf`8D}ejB%fO*H&3qr2pS4OA*$BU8?x{x0laTi`Eze583E7o zy!uz}lDZ9-d*;Qnc`fVQp!kFWFlhXS#aF}9hus=2;4jc?Ae#pBMtZ?YtLJMYV-`{&552>m6jF*vZf4+{L?T8VSHct&f}PsG|&rqhCb75y=jF z&HK++N=BUu`XYdz(gjZHFP#%5>_k&OTY7I?0NDhD?nR0lop zhhX5%Jtwk#y~zuKFc`34H;M)TWj?B{J&(~fW zpY2^b+hE(V`92`-u!)XTTX_XD4=2G+lJ-yfSYX+F?ypQ_5!NNUC+_9{^X&z#mE%6p zowYO1wmb?EPA0bjC$IG9FcOI!c7#z?JhAo+3R_{QaBlB>OWxk)aoTbh%Z%i@Aep8k z{OfGV`kd)szkE#wJn{SGE9KUr9KfP;hX`$J5Gmc}r;PfV$rLnn1Q0APCy??Aj=BZ2 zcw+|I<{k~F+`Rts)(3D(RQWbCurf zY^PF7Tk)2ulc29G{gu>h0f)(=N(K?{I5`o#Nx@NA-qsAPhB<9fwInmRqQx<6h!&zv zh*x6Ey5HQfubg92`gaH`D=P|aGQ9R6)QIA@?DtC-di@e$GxKNezP(9L+xOp|x>N9~ zy>qWXpo3@^*GJrVQTQo9nZChT%i^j18RT`r^|3=sAokVDNPGmqNakPN_gQ*etD$`& z%aaw$v&#w6{{3vjDQLLV+)$D+yJksZmV@{jt$1&}o~<5xihrdqbPIvVbL@WGcwUou zF-aeSe=2i}m3I@zqn&VLEgURciAT4DZ|-kkKf@Xb3nLq$0ei^!$&^zzf((ov+}v2% zC>Of@Gh8HVLP8f(CuK@8Na<{BsK64AH!)9G1vW2w*0(w0fRhv$^FnP}l*9<|&hY03jE{szVXcQZ$KT@bhKsOvw?3a{`pPmwr{V1(00 z3g=n~S^MOsvW;fhqZG!4!h=^ctnlrVwGPBtM2trZH8va-M#<9KmE;S_-{`SQ(W-1| zsv>4VXjypAkjk+}_g#{SDx`f?P;1=*cAUZII!$!Ln5mEi({fW(?Dp3)D;F56i^OTm zIcvBFt&?$zG+BqPM)$0p9<|jm7F#Xg&J zBf`ni?Ebs36BHwixXz~?mFDOEMAg`(y-kf>5xIjh^r2xN}2zaFTGz!<9@_iLpT$XQ-X{TN{Z^TI-u8_FfO zu%`r)0LHTUa61OP!V(IhkHG0`g36w(sSBIIt4oD}@ZjOen64vZz`*24%KKe=5iAf` z$gn}{u@Z&m&L?02wGQfR%x!1TJP8dHvyfqy-$B z*BAiBCGgLM9J`n9(Z_P&RzxtoqoR)9>0eK(T|%=CM5D@EaL1Bm)ZrAklE_v$P5c`h z8y+`ob$SufMv_yZM5Y8*wiVbRYk6ET+1SwSPX7X&F`W`>424cAcR;lc)o48~BK(wv zD-mKUaBCQob(Fe7XJJ?25SG@<9zD#ac@7~X)#{BT7*x6D( zA3|zxAl8reRfOl0EH|wi!o1CMI)a`_$p@{5|B?8jPb@1*X!^DUk;wm3!d?ugWKbw& z%FVlRKU%CtHS`Vhw4|ylw%24kur6q~XV@L-X=)D3{U9`L-C6~GEJd2drNz5pLy}QX zAYp4pQF43&OW84!C5#t)o15B+BO?mLh>N;7T}`HXPn&Kni)gLNraD6yD%?uIyu}84 zyu0*>G#9^+HdTo}7J3$Ik`Jf~ABgf~3~}rt!V#eXZVPnlL|*x;?KwfciDjlcJ08<^P%fPYnKXhmFN}@Fplv4Q)6+cq9Gtsz&?Ge|BQ@ZZ=0?`1y@*JaQ%`*iHe_pyrg3-}W1%R~N~e0=Rzgu9o9%P2q7+=|i=k09 zXhR-eZvHuH|7Iv1!y=cWsMXDq_<~$$ybx@+*6hic4~J0;88o_pTT!Ky9gA3N?rATB zxd{p~oQI#>>aau1)e`XH<=tJIwGkx!m2L|n^9gsbHbZmoq z8~E_mRFk{3YbfJoEFdWX&3<8^ zPhUx>F|80wu1}DhqkbjHPD={F_Sd2W!W{=3jptjp_lyGPp_s8*;We9s496QllSK^? z4XGx(z~i6s^GAwF!P7L&ab$T5WyF3<0hE4jM43Y1tHc)@x~O`?PFJSCuoyJbC;V-B z`T5b+zNp}hoDBZ#^W?Ddqb>CQUhZA^2h0mn?kg@xiBNy}X5!q|wU@;}Zx5T6HDfbpv%ft@bMeT(WhHs!r`!v!#!z~==S8ZCh+vbtAXj9&wybyLGl8@czn3j-4 zoGdaaV<;i)ZNxdODmfs)tnUz)cC5;9(hJdgzfg{)4Vtvq(r;SSowMOCZ=%<{dX*bu)=^oZvt7Y?KP7m15w9o%Cv3Tj^h_A-Ht$+mmWwRnbRh|~gF!g{ zmZfJiy+`*#uZy$PlD{o59*;MaOg-0#JLeSFh3Fu$nEebY{~+PEZRZ~(Z*rTn&Nofg}ksFuW$$GfdC>I}O8gmJnh zKt9nya<$c;TCkT{x6%g$l!*bP^1wO&;N3LK1ZwR{wn`v2lZY8jPU{@p&+$v?M{2 zyji~@cb~Nl&|#x-g}IS~>otNVxHhV5M6-GCV+Ihuwy3(T6do>ZfcY?0P zxZr;VIlPXMP^278O1AAUPw^OA%EA`r){qjX)9}+x6gEKXW*2%Fyg;q3gi`7vkD$1i zz^fM{2?^PMO$WBiC@CfC2+Q6v9VvOXr6bzl241EcuSmvZf&)j!v|Iv*GM_YC?rjzc z^^?Qek3EU`UBzc7Prbdxyrg>OUtSs*7?@h}L}(UBDH^l!57sv}>Ny;Z5N@*aUMuk% z$-!g{Cu|S1;3-i|jOE4-ubvOs`@6x3d(FOVo_O~>A5ZL`#rdwb)nsME^ORE-5#Kv> zaT7L%<`_=`6;(-O4B_byb_1aX1?@}^$y=v;phZ)+xw;h?^VX|Bzh(#qvEjaPO0a z2cUHpd!_wgX=#akR6-;)aSF&iSoLZM{_*7su%OvQ8{s;=%|Blw?oZ^ECBYQs_WzrvV+Modi7YIP=Ku25qhFqE}6Ue)3^!99m<;6VD3t zn=SeGaY+Qa^M>=yu6t^mR}=t7gI2wu~~5teXXcfV4dwwWu)n zp0}5SokWL0MPUy3`9K?D0;FHKZ~4*k3jFk>{w&7V>AjUQI63HLV!|oF;_Q{JS?PQg zO7UUF;-y(e{O_SIsRPT~Zc>}}d zWC~Xr;H?T--+p0FxO%Z*B;GtE8|;Jges4Vv1m*JCF0F;2^b9shn?sF)Wr)PNmu6e9 zdmQa2>*TkQkqx5vOm5x13n~W^kT%gWl2#9LT!vyIt44}rJ)WKirR$_xhIttC#YFK# zS5EdU59pFy{|T7uOt(Ii9VpgZ2lA@&5+2s)zD|@*tt|Ck`z%-a#1l4$$-0V}y%`a9b3<*B4eotO%mSra5()4`01&DM0AzY+Z4W z^G@>(6Ss?{IhrB7KsenThK}r+jmJ)1ki2AlGfVrodxm-C7lw`UM>P{zfZSg88OR0% z`@O3^e7hRWmK80pm_c_g`Uf;Xe2HUjV^T{(T^H?>(g`CRe}6B1Fy@@oCEz;-oIUoTBn-KM~S5{fg`csqFHMt`Y_=- zPgQ;jnq!kU8j6uPh{bSQ2OoVh%gGYqsK<=4gvCJA(HewfsxYV?wNHnprYU?3#s}Xo z1A1)lk5eQC22Upyg@cj#R~dBrMZ_c^#d4pWLI!US%mXA^ZY4s;Jn|ndT@uAoo5jZOi?@`N~=7u{QN?nVsv@wYre zwvNuJ*$4pY2gqX+^Qj4QS1Ej4o&N)fVw{^M5@JXs-J2%K$$EmoBQEvRk+TsD$VCyj zag1lx)-lVfj_MdG#x)66S6A&@;)KxAOR;##l>@0joycIn< zcQ_ilc0pWoa}z2yhvOPI35bvy;`dVf`mE-(f%y5)aJ9a%K9T zRDC&V=1kArqV2-H#RGl*@iXPr*|vQ3(aM$!lVR!HntBbL%k9xUWhSkb|6oQ%c;k4Ic0kGpPjkdTYz5bh>u$LO2I)RgX};;4cAnnrdd)&_1Lb@>qm z@5~m9!7k!+H5dt{U7~mlme8F)Ha2E@1!Sm};JLOK zpK3yvj?NHsRo8kgAhowO;$Mmmy9QEp&wX|(myL%Y`Sme=lig;2)*lKnyX4raT03?a z6`Qo#NA#8I?jqh2DKOOdu{*D$0gDLvRi&Sq&S_(<>Fq0O2>d^5$Ri{{okYWhI2 zyy>Py)h+&xMm4XkYF`=TIUTGd(RmO%5*=WZy5?63c}`^-4b5i*2eu1~N4Gz^^r_@z z6beMLEWG22G+$H;+414p!58ZUn~|z@kg5k+%_$V0!vik^|J9ImX^u_d_LH4-s=CU3IGS*Q~!d0v^c^1BaWCR@@Xmv=4$L?qDlmjfY z@_{93R(ReNEMzG_7m>8L0r6Ojiawsf?F7v|SnuUA3Z>i@o=p&Q5I$M&uvcucsqG2u zfKYcs?cOW$P~LJtEcdKuqcT*PS7pLl;MsLuj6#S)S5z=6Bod9TzBIoDG@BM%S|^X}1}s-7_#x`~*R4?FL!SS;{i4~%b@>yj We?O^rYx3|r#M0H#(}8avlKD6LHDjd! literal 138453 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%0D#KcV$5RsS6Q4WIYzFeX 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 diff --git a/ProductivitySuite/assets/img/codegen.png b/ProductivitySuite/assets/img/codegen.png index a4d38f6f429bab36238e85e7e2dd1805e694861f..70620a448be38b147b7955e39feb3182aebc9fd3 100644 GIT binary patch literal 50679 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 literal 98394 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� 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

R_Vbl6>+#l)3x9=~gyTJP(d9*}&)oT4&9R+|5+& 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 R`>V0!_tK6Jy!*$G{x4oOuz&yn diff --git a/ProductivitySuite/assets/img/doc_summary.png b/ProductivitySuite/assets/img/doc_summary.png new file mode 100644 index 0000000000000000000000000000000000000000..f279606f38bdc3863d6f11172e5817a4e555d561 GIT binary patch literal 96936 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 l9sOK~|6pB06ezCb%+}+dU)!m`{w3HoHDxWON` - - + - - - - Conversations UI + + + + + + + + + + + ProductivitySuite UI +

- + diff --git a/ProductivitySuite/ui/react/package.json b/ProductivitySuite/ui/react/package.json index 57e384bfad..324deaf9aa 100644 --- a/ProductivitySuite/ui/react/package.json +++ b/ProductivitySuite/ui/react/package.json @@ -1,56 +1,89 @@ { - "name": "ui", + "name": "ProductivitySuite", + "version": "0.0.1", + "description": "ProductivitySuite UI - OPEA", + "homepage": ".", "private": true, - "version": "0.0.0", "type": "module", + "engines": { + "node": "20.x" + }, "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview", - "test": "vitest run" + "dev": "vite --port 5173", + "build": "vite build", + "preview": "vite preview --port 5173" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] }, "dependencies": { - "@mantine/core": "^7.11.1", - "@mantine/dropzone": "^7.11.1", - "@mantine/hooks": "^7.11.1", - "@mantine/notifications": "^7.10.2", "@microsoft/fetch-event-source": "^2.0.1", + "@mui/base": "^5.0.0-beta.69", + "@mui/icons-material": "^6.4.1", + "@mui/material": "^6.4.1", + "@mui/styled-engine-sc": "^6.4.0", "@react-keycloak/web": "^3.4.0", - "@reduxjs/toolkit": "^2.2.5", - "@tabler/icons-react": "3.27.1", - "axios": "^1.7.2", + "@reduxjs/toolkit": "^2.5.0", + "axios": "^1.7.9", "keycloak-js": "^25.0.2", - "luxon": "^3.4.4", + "notistack": "^3.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-markdown": "^9.0.1", - "react-redux": "^9.1.2", - "react-router-dom": "^6.25.1", - "react-syntax-highlighter": "^15.5.0", + "react-markdown": "^8.0.7", + "react-redux": "^9.2.0", + "react-router-dom": "^7.1.1", + "react-syntax-highlighter": "^15.6.1", + "remark-breaks": "^4.0.0", "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0" + "remark-gfm": "^3.0.1", + "styled-components": "^6.1.14" }, "devDependencies": { - "@testing-library/react": "^16.0.0", - "@types/luxon": "^3.4.2", - "@types/node": "^20.12.12", - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", + "@auth/express": "^0.8.4", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@electron-toolkit/preload": "^3.0.1", + "@mui/types": "^7.2.21", + "@rollup/plugin-terser": "^0.4.4", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^14.4.3", + "@types/electron-devtools-installer": "^2.2.2", + "@types/jest": "^29.4.0", + "@types/node": "^18.13.0", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "@types/react-syntax-highlighter": "^15.5.13", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.57.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "jsdom": "^24.1.0", - "postcss": "^8.4.38", - "postcss-preset-mantine": "^1.15.0", - "postcss-simple-vars": "^7.0.1", - "sass": "1.64.2", - "typescript": "^5.2.2", - "vite": "^5.2.13", - "vitest": "^1.6.0" + "@vitejs/plugin-react": "^4.3.4", + "concurrently": "^7.6.0", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "dotenv": "^16.4.7", + "express": "^4.21.2", + "nodemon": "^3.1.9", + "rollup-plugin-visualizer": "^5.14.0", + "sass": "^1.83.1", + "typescript": "^5.7.3", + "vite": "^5.3.1", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-mkcert": "^1.17.6", + "vite-plugin-sass-dts": "^1.3.30", + "vite-plugin-svgr": "^4.3.0", + "wait-on": "^7.0.1", + "webpack-bundle-analyzer": "^4.10.2" } } diff --git a/ProductivitySuite/ui/react/postcss.config.cjs b/ProductivitySuite/ui/react/postcss.config.cjs deleted file mode 100644 index e817f567be..0000000000 --- a/ProductivitySuite/ui/react/postcss.config.cjs +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - plugins: { - "postcss-preset-mantine": {}, - "postcss-simple-vars": { - variables: { - "mantine-breakpoint-xs": "36em", - "mantine-breakpoint-sm": "48em", - "mantine-breakpoint-md": "62em", - "mantine-breakpoint-lg": "75em", - "mantine-breakpoint-xl": "88em", - }, - }, - }, -}; diff --git a/ProductivitySuite/ui/react/public/favicon.ico b/ProductivitySuite/ui/react/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c2c86b859eaa20639adf92ff979c2be8d580433e GIT binary patch literal 22382 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 QPNaAH_W=L@JAozeZ|l@fegFUf literal 0 HcmV?d00001 diff --git a/ProductivitySuite/ui/react/public/logo192.png b/ProductivitySuite/ui/react/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fa313abf53936aefc517dbd583b724a57199d415 GIT binary patch literal 8581 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�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 b!B~?t+WWKS5u5)CcMJGaRz{_UZlwPKNp@r} literal 0 HcmV?d00001 diff --git a/ProductivitySuite/ui/react/public/manifest.json b/ProductivitySuite/ui/react/public/manifest.json new file mode 100644 index 0000000000..a3295c9a2a --- /dev/null +++ b/ProductivitySuite/ui/react/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "ProductivitySuite", + "name": "ProductivitySuite UI", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/ProductivitySuite/ui/react/public/model_configs.json b/ProductivitySuite/ui/react/public/model_configs.json new file mode 100644 index 0000000000..eade24a547 --- /dev/null +++ b/ProductivitySuite/ui/react/public/model_configs.json @@ -0,0 +1,15 @@ +[ + + { + "model_name": "Intel/neural-chat-7b-v3-3", + "displayName": "Intel Neural Chat", + "minToken": 100, + "maxToken": 2000, + "types": [ + "chat", + "summary", + "code" + ] + } + +] \ No newline at end of file diff --git a/ProductivitySuite/ui/react/public/robots.txt b/ProductivitySuite/ui/react/public/robots.txt new file mode 100644 index 0000000000..01b0f9a107 --- /dev/null +++ b/ProductivitySuite/ui/react/public/robots.txt @@ -0,0 +1,2 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * diff --git a/ProductivitySuite/ui/react/src/App.scss b/ProductivitySuite/ui/react/src/App.scss index 187764a179..2fcd0a87b1 100644 --- a/ProductivitySuite/ui/react/src/App.scss +++ b/ProductivitySuite/ui/react/src/App.scss @@ -1,42 +1 @@ -// Copyright (C) 2024 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 - -@import "./styles/styles"; - -.root { - @include flex(row, nowrap, flex-start, flex-start); -} - -.layout-wrapper { - @include absolutes; - - display: grid; - - width: 100%; - height: 100%; - - grid-template-columns: 80px auto; - grid-template-rows: 1fr; -} - -/* ===== Scrollbar CSS ===== */ -/* Firefox */ -* { - scrollbar-width: thin; - scrollbar-color: #d6d6d6 #ffffff; -} - -/* Chrome, Edge, and Safari */ -*::-webkit-scrollbar { - width: 8px; -} - -*::-webkit-scrollbar-track { - background: #ffffff; -} - -*::-webkit-scrollbar-thumb { - background-color: #d6d6d6; - border-radius: 16px; - border: 4px double #dedede; -} +// Post javscript styles \ No newline at end of file diff --git a/ProductivitySuite/ui/react/src/App.tsx b/ProductivitySuite/ui/react/src/App.tsx index c12ee1d8fa..6ba7947f0f 100644 --- a/ProductivitySuite/ui/react/src/App.tsx +++ b/ProductivitySuite/ui/react/src/App.tsx @@ -1,68 +1,124 @@ -// Copyright (C) 2024 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 - -import "./App.scss" -import {MantineProvider } from "@mantine/core" -import '@mantine/notifications/styles.css'; -import { SideNavbar, SidebarNavList } from "./components/sidebar/sidebar" -import { IconMessages, IconFileTextAi, IconCode, IconFileInfo, IconDatabaseCog } from "@tabler/icons-react" -import Conversation from "./components/Conversation/Conversation" -import { Notifications } from '@mantine/notifications'; -import { BrowserRouter, Route, Routes } from "react-router-dom"; -import CodeGen from "./components/CodeGen/CodeGen"; -import DocSum from "./components/DocSum/DocSum"; -import FaqGen from "./components/FaqGen/FaqGen"; + +import './App.scss'; + +import React, { Suspense, useEffect } from 'react'; +import { BrowserRouter, Routes, Route } from "react-router-dom"; +import ProtectedRoute from "@layouts/ProtectedRoute/ProtectedRoute"; + import { useKeycloak } from "@react-keycloak/web"; -import DataSource from "./components/Conversation/DataSource"; -import { useAppDispatch } from "./redux/store"; -import { setUser } from "./redux/User/userSlice"; -import { useEffect } from "react"; - -const title = "Chat QnA" -const navList: SidebarNavList = [ - { icon: IconMessages, label: "Chat Qna", path: "/", children: }, - { icon: IconCode, label: "CodeGen", path: "/codegen", children: }, - { icon: IconFileTextAi, label: "DocSum", path: "/docsum", children: }, - { icon: IconFileInfo, label: "FaqGen", path: "/faqgen", children: }, - { icon: IconDatabaseCog, label: "Data Management", path: "/data-management", children: } -] - -function App() { - const { keycloak } = useKeycloak(); - const dispatch = useAppDispatch() - useEffect(()=>{ - dispatch(setUser(keycloak?.idTokenParsed?.preferred_username)) - },[keycloak.idTokenParsed]) - - return ( - <> - - {!keycloak.authenticated ? ( - "redirecting to sso ..." - ) : ( +import { setUser, userSelector } from "@redux/User/userSlice"; + +import MainLayout from "@layouts/Main/MainLayout"; +import MinimalLayout from "@layouts/Minimal/MinimalLayout"; +import Notification from '@components/Notification/Notification'; +import { Box, styled, Typography } from '@mui/material'; +import {AtomAnimation, AtomIcon} from '@icons/Atom'; + +import { useAppDispatch, useAppSelector } from '@redux/store'; +import { conversationSelector, getAllConversations, /*getStoredPromptSettings,*/ getSupportedModels, getSupportedUseCases } from '@redux/Conversation/ConversationSlice'; +import { getPrompts } from '@redux/Prompt/PromptSlice'; + +import Home from '@pages/Home/Home'; +import ChatView from '@pages/Chat/ChatView'; + +const HistoryView = React.lazy(() => import('@pages/History/HistoryView')); +const DataSourceManagement = React.lazy(() => import('@pages/DataSource/DataSourceManagement')); + + +const LoadingBox = styled(Box)({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + height: '100vh', + width: '100vw', +}); + +const App = () => { + + const { keycloak } = useKeycloak(); + const dispatch = useAppDispatch() + + const { name } = useAppSelector(userSelector); + const { useCase } = useAppSelector(conversationSelector); + + useEffect(() => { + + if(keycloak?.idTokenParsed) console.log(keycloak?.idTokenParsed) + + //TODO: get role from keyCloack scope, defaulting to Admin + dispatch(setUser({ + name: keycloak?.idTokenParsed?.preferred_username, + isAuthenticated:true, + role:'Admin'})) + + }, [keycloak.idTokenParsed]) + + const initSettings = () => { + if (keycloak.authenticated) { + dispatch(getSupportedUseCases()); + dispatch(getSupportedModels()); + dispatch(getPrompts()) + } + } + + useEffect(() => { + if(keycloak.authenticated) initSettings() + }, [keycloak.authenticated]); + + //TODO: on potential useCase change get different conversation data + useEffect(() => { + if (keycloak.authenticated && useCase) { + dispatch(getAllConversations({user: name, useCase: useCase})); + // dispatch(getSharedConversations({ usecase: selectedUseCase.use_case })); + } + }, [useCase, name]); + + return !keycloak.authenticated ? ( + + + redirecting to sso ... + + + ) : ( + - - -

- -
+ }> - {navList.map(tab => { - return () - })} - + {/* Routes wrapped in MainLayout */} + }> + } /> + + + }> + } /> + + + }> + } />} /> + } />} /> + - -
-
+ }> + } /> + } /> + } /> + } /> + + + {/* Routes not wrapped in MainLayout */} + }> + {/* } /> */} + + + + + - )} - - - ) + ); } -export default App +export default App; diff --git a/ProductivitySuite/ui/react/src/__tests__/util.test.ts b/ProductivitySuite/ui/react/src/__tests__/util.test.ts deleted file mode 100644 index e67ba2c86a..0000000000 --- a/ProductivitySuite/ui/react/src/__tests__/util.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (C) 2024 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 - -import { describe, expect, test } from "vitest"; -import { getCurrentTimeStamp, uuidv4 } from "../common/util"; - -describe("unit tests", () => { - test("check UUID is of length 36", () => { - expect(uuidv4()).toHaveLength(36); - }); - test("check TimeStamp generated is of unix", () => { - expect(getCurrentTimeStamp()).toBe(Math.floor(Date.now() / 1000)); - }); -}); diff --git a/ProductivitySuite/ui/react/src/assets/icons/moon.svg b/ProductivitySuite/ui/react/src/assets/icons/moon.svg new file mode 100644 index 0000000000..a9f36a8321 --- /dev/null +++ b/ProductivitySuite/ui/react/src/assets/icons/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ProductivitySuite/ui/react/src/assets/icons/sun.svg b/ProductivitySuite/ui/react/src/assets/icons/sun.svg new file mode 100644 index 0000000000..510dad63bf --- /dev/null +++ b/ProductivitySuite/ui/react/src/assets/icons/sun.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ProductivitySuite/ui/react/src/assets/opea-icon-black.svg b/ProductivitySuite/ui/react/src/assets/opea-icon-black.svg deleted file mode 100644 index 5c96dc7622..0000000000 --- a/ProductivitySuite/ui/react/src/assets/opea-icon-black.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProductivitySuite/ui/react/src/assets/opea-icon-color.svg b/ProductivitySuite/ui/react/src/assets/opea-icon-color.svg deleted file mode 100644 index 790151171e..0000000000 --- a/ProductivitySuite/ui/react/src/assets/opea-icon-color.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProductivitySuite/ui/react/src/assets/react.svg b/ProductivitySuite/ui/react/src/assets/react.svg deleted file mode 100644 index 8e0e0f15c0..0000000000 --- a/ProductivitySuite/ui/react/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/ProductivitySuite/ui/react/src/common/client.ts b/ProductivitySuite/ui/react/src/common/client.ts deleted file mode 100644 index 7512f73e33..0000000000 --- a/ProductivitySuite/ui/react/src/common/client.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (C) 2024 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 - -import axios from "axios"; - -//add iterceptors to add any request headers - -export default axios; diff --git a/ProductivitySuite/ui/react/src/common/util.ts b/ProductivitySuite/ui/react/src/common/util.ts deleted file mode 100644 index df65b2d8e0..0000000000 --- a/ProductivitySuite/ui/react/src/common/util.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (C) 2024 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 - -export const getCurrentTimeStamp = () => { - return Math.floor(Date.now() / 1000); -}; - -export const uuidv4 = () => { - return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => - (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16), - ); -}; diff --git a/ProductivitySuite/ui/react/src/components/Chat_Assistant/ChatAssistant.module.scss b/ProductivitySuite/ui/react/src/components/Chat_Assistant/ChatAssistant.module.scss new file mode 100644 index 0000000000..7ede9ad1d3 --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_Assistant/ChatAssistant.module.scss @@ -0,0 +1,70 @@ +.chatReply{ + display: flex; + flex-direction: row; + + .icon { + + padding-right: 1rem; + + svg{ + width: 24px; + height: 24px; + } + } +} + +.ellipsis{ + + position: relative; + + span{ + position: relative; + animation: dance 1.5s infinite ease-in-out; + } + + span:nth-child(1) { + margin-left: 2px; + animation-delay: 0s; + } + + span:nth-child(2) { + animation-delay: 0.3s; + } + + span:nth-child(3) { + animation-delay: 0.6s; + } + +} + +@keyframes dance { + 0%, 100% { + bottom: 0; + opacity: 1; + } + 20% { + bottom: 5px; + opacity: 0.7; + } + 40% { + bottom: 0; + opacity: 1; + } +} + +.textedit{ + width: 100%; + min-height: 50px; + padding: 1rem; +} + +.chatPrompt{ + width: 100%; + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-word; + + p:first-of-type{ + margin-top: 0; + } +} \ No newline at end of file diff --git a/ProductivitySuite/ui/react/src/components/Chat_Assistant/ChatAssistant.tsx b/ProductivitySuite/ui/react/src/components/Chat_Assistant/ChatAssistant.tsx new file mode 100644 index 0000000000..1dde5e4adb --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_Assistant/ChatAssistant.tsx @@ -0,0 +1,213 @@ +import React, { useEffect, useRef, useState } from "react"; + +import styles from "./ChatAssistant.module.scss"; +import { Button, Typography, IconButton, Box, styled, Tooltip } from "@mui/material"; +import {AtomIcon} from "@icons/Atom"; +import ThumbUpIcon from '@mui/icons-material/ThumbUp'; +import ThumbUpOutlinedIcon from '@mui/icons-material/ThumbUpOutlined'; +import ThumbDownIcon from '@mui/icons-material/ThumbDown'; +import ThumbDownOutlinedIcon from '@mui/icons-material/ThumbDownOutlined'; +import ContentCopyIcon from '@mui/icons-material/ContentCopy'; +import EditNoteIcon from '@mui/icons-material/EditNote'; +import ChatSettingsModal from "@components/Chat_SettingsModal/ChatSettingsModal"; + +import { NotificationSeverity, notify } from '@components/Notification/Notification'; +import { ChatMessageProps, Message } from "@redux/Conversation/Conversation"; +import ChatMarkdown from "@components/Chat_Markdown/ChatMarkdown"; +import { useAppDispatch, useAppSelector } from "@redux/store"; +import { conversationSelector, saveConversationtoDatabase, setSelectedConversationHistory } from "@redux/Conversation/ConversationSlice"; +import WaitingIcon from "@icons/Waiting"; + + +const CancelStyle = styled(Button)(({ theme }) => ({ + ...theme.customStyles.actionButtons.delete +})); + +const SaveStyle = styled(Button)(({ theme }) => ({ + ...theme.customStyles.actionButtons.solid +})); + +const ChatAssistant: React.FC = ({ message, pending = false }) => { + + const dispatch = useAppDispatch(); + const { onGoingResult, selectedConversationHistory, selectedConversationId, type } = useAppSelector(conversationSelector) + + const [currentMessage, setCurrentMessage] = useState(message); + const [editResponse, setEditResponse] = useState(false); + const responseRef = useRef(currentMessage.content); + const [disabledSave, setDisabledSave] = useState(false); + const [inputHeight, setInputHeight] = useState(0) + const heightCheck = useRef(null) + const isClipboardAvailable = navigator.clipboard && window.isSecureContext; + + useEffect(() => { + setCurrentMessage(message); + }, [message]); + + const assistantMessage = currentMessage.content ?? ''; + + // const [feedback, setFeedback] = useState( + // currentMessage.feedback?.is_thumbs_up === true ? true : currentMessage.feedback?.is_thumbs_up === false ? false : null + // ); + + // const submitFeedback = (thumbsUp: boolean) => { + // setFeedback(thumbsUp); + // notify('Feedback Submitted', NotificationSeverity.SUCCESS); + // // MessageService.submitFeedback({ id: currentMessage.message_id, feedback: {is_thumbs_up: thumbsUp}, useCase: selectedUseCase.use_case }); + // }; + + const copyText = (text: string) => { + navigator.clipboard.writeText(text); + notify('Copied to clipboard', NotificationSeverity.SUCCESS); + } + + const modifyResponse = () => { + if (heightCheck.current) { + let updateHeight = heightCheck.current.offsetHeight; + setInputHeight(updateHeight); + setEditResponse(true) + } + } + + const updateResponse = (response: string) => { + responseRef.current = response; + setDisabledSave(response === '') + } + + const saveResponse = () => { + + const convoClone: Message[] = selectedConversationHistory.map((messageItem) => { + if (messageItem.time === currentMessage.time) { + return { + ...messageItem, + content: responseRef.current, + }; + } + return messageItem; + }); + + dispatch(setSelectedConversationHistory(convoClone)); + dispatch(saveConversationtoDatabase({ conversation: { id: selectedConversationId } })) + + setInputHeight(0); + setEditResponse(false); + setDisabledSave(false); + } + + const cancelResponse = () => { + setEditResponse(false) + } + + const displayCurrentMessage = () => { + + if (currentMessage.content) { + + if (editResponse) { + return ( +
+ + + + Save + + + Cancel + +
+ ) + } + else { + return ( + + + + ) + } + } else { + return ( + + Generating response + + . + . + . + + + ) + } + + } + + const displayMessageActions = () => { + + if (onGoingResult) return; + + return ( + + + {/*TODO: feedback support */} + {/* submitFeedback(true)}> + {feedback === null || feedback === false ? ( + + ) : ( + + )} + + + submitFeedback(false)}> + {feedback === null || feedback === true ? ( + + ) : ( + + )} + */} + + + + {isClipboardAvailable && ( + + copyText(assistantMessage)}> + + + + )} + + {type === 'chat' && ( + + + + + + )} + + ) + + } + + return ( +
+ +
+ +
+ +
+ + {displayCurrentMessage()} + + {!pending && displayMessageActions()} + +
+ + +
+ ); +}; + + +export default ChatAssistant; \ No newline at end of file diff --git a/ProductivitySuite/ui/react/src/components/Chat_Markdown/ChatMarkdown.tsx b/ProductivitySuite/ui/react/src/components/Chat_Markdown/ChatMarkdown.tsx new file mode 100644 index 0000000000..2ab28dbb5c --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_Markdown/ChatMarkdown.tsx @@ -0,0 +1,75 @@ +import React, { lazy,Suspense, useEffect } from 'react'; +import markdownStyles from './markdown.module.scss' +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import remarkFrontmatter from 'remark-frontmatter'; +import remarkBreaks from 'remark-breaks'; + +const CodeRender = lazy(()=> import('./CodeRender/CodeRender')); + +type MarkdownProps = { + content: string +} + +const ChatMarkdown = ({ content }: MarkdownProps) => { + + useEffect(()=>{ + // preload in background + import("./CodeRender/CodeRender") + },[]) + + return ( + { + + // check for nested block elements attempting to inject into a p tag + const hasBlockElement = React.Children.toArray(children).some(child => + React.isValidElement(child) && typeof child.type === "string" && ["div", "h1", "h2", "h3", "ul", "ol", "table"].includes(child.type) + ); + + // If block-level elements are found, avoid wrapping in

+ return hasBlockElement ? <>{children} :

{children}

; + }, + a: ({ children, ...props }) => { + return ( + //@ts-ignore +
+ {children} + + ); + }, + table: ({ children, ...props }) => { + return ( +
+ {children}
+
+ ); + }, + code({ inline, className, children, }) { + const lang = /language-(\w+)/.exec(className || '') + return ( + Loading Code Block...}> + {/*@ts-ignore*/} + + + ) + } + }} + />) +} + +export default ChatMarkdown; diff --git a/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/CodeRender.tsx b/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/CodeRender.tsx new file mode 100644 index 0000000000..5d20d16983 --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/CodeRender.tsx @@ -0,0 +1,72 @@ +import styles from './codeRender.module.scss' +import { Light as SyntaxHighlighter } from "react-syntax-highlighter"; +import { atomOneDark, atomOneLight } from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import ContentCopyIcon from '@mui/icons-material/ContentCopy'; +import { IconButton, styled, Tooltip, useTheme } from '@mui/material'; +import { NotificationSeverity, notify } from '@components/Notification/Notification'; + +const TitleBox = styled('div')(({ theme }) => ({ + background: theme.customStyles.code?.primary, + color: theme.customStyles.code?.title +})); + +const StyledCode = styled(SyntaxHighlighter)(({ theme }) => ({ + background: theme.customStyles.code?.secondary + ' !important', +})); + +type CodeRenderProps = { + cleanCode: React.ReactNode, + language: string, + inline: boolean +} +const CodeRender = ({ cleanCode, language, inline }:CodeRenderProps) => { + + const theme = useTheme(); + + const isClipboardAvailable = navigator.clipboard && window.isSecureContext; + + cleanCode = String(cleanCode).replace(/\n$/, '').replace(/^\s*[\r\n]/gm, '') //right trim and remove empty lines from the input + + const copyText = (text: string) => { + navigator.clipboard.writeText(text); + notify('Copied to clipboard', NotificationSeverity.SUCCESS); + } + + try { + return inline ? ({cleanCode}) : ( +
+ +
+ {language || "language not detected"} +
+
+ {isClipboardAvailable && ( + + copyText(cleanCode.toString())}> + + + + )} +
+
+ +
) + } catch (err) { + return ( +
+                {cleanCode}
+            
+ ) + } + +} + + +export default CodeRender; diff --git a/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/codeRender.module.scss b/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/codeRender.module.scss new file mode 100644 index 0000000000..f3aae8c5f2 --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/codeRender.module.scss @@ -0,0 +1,36 @@ +.code { + margin: 7px 0px; + + .codeHead { + + padding: 0px 10px !important; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + justify-content: space-between; + + .codeTitle {} + + .codeActionGroup { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + justify-content: flex-start; + } + } + + .codeHighlighterDiv { + margin: 0px !important; + white-space: pre-wrap !important; + + code{ + white-space: pre-wrap !important; + } + } +} + +.inlineCode { + background: #fff; +} \ No newline at end of file diff --git a/ProductivitySuite/ui/react/src/components/Chat_Markdown/markdown.module.scss b/ProductivitySuite/ui/react/src/components/Chat_Markdown/markdown.module.scss new file mode 100644 index 0000000000..a8e6918b67 --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_Markdown/markdown.module.scss @@ -0,0 +1,30 @@ +.tableDiv { + + &:first-of-type{ + padding-top: 0px !important; + } + + table, + th, + td { + border: 1px solid black; + border-collapse: collapse; + padding: 5px; + } +} + +.md { + li { + margin-left: 35px; /* Adjust the value based on your preference */ + } +} + +.markdownWrapper{ + > p:first-of-type{ + margin-top: .25rem; + } + + > p:last-of-type{ + margin-bottom: .25rem; + } +} diff --git a/ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.module.scss b/ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.module.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.tsx b/ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.tsx new file mode 100644 index 0000000000..8526c81a37 --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.tsx @@ -0,0 +1,38 @@ +import * as React from 'react'; +import { Box, Typography, Modal, IconButton, styled, Tooltip } from '@mui/material'; +import SettingsApplicationsOutlinedIcon from '@mui/icons-material/SettingsApplicationsOutlined'; +import PromptSettings from '@components/PromptSettings/PromptSettings'; +import { Close } from '@mui/icons-material'; +import ModalBox from '@root/shared/ModalBox/ModalBox'; + +const ChatSettingsModal = () => { + const [open, setOpen] = React.useState(false); + const handleOpen = () => setOpen(true); + const handleClose = () => setOpen(false); + + return ( +
+ + + + + + + + + + Response Settings + setOpen(false)}> + + + + + + + + +
+ ); +} + +export default ChatSettingsModal; diff --git a/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.module.scss b/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.module.scss new file mode 100644 index 0000000000..de7245feba --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.module.scss @@ -0,0 +1,47 @@ +.sourceWrapper{ + display: flex; + flex-direction: row; + justify-content: flex-end; + flex-wrap: wrap; + width: var(--content-width); + margin: 0 auto var(--vertical-spacer); + max-width: 100%; +} + +.iconWrap{ + border: none; + border-radius: 6px; + margin-right: .5rem; + width: 30px; + height: 30px; + display: flex; + align-items: center; + justify-content: center; +} + +.sourceBox{ + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + margin-left: 1rem; + padding: 5px; + border-radius: 6px; + margin-bottom: 1rem; +} + +.title{ + margin: 0 .5rem 0 0; + white-space: nowrap; + display: inline-block; + max-width: 150px; + overflow: hidden; + text-overflow: ellipsis; + font-weight: 400; +} + +.chip{ + border-radius: 8px; + padding: 3px; + font-size: 12px; +} \ No newline at end of file diff --git a/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.tsx b/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.tsx new file mode 100644 index 0000000000..999e939540 --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.tsx @@ -0,0 +1,31 @@ +import { Box } from "@mui/material"; +import { conversationSelector } from "@redux/Conversation/ConversationSlice"; +import { useAppSelector } from "@redux/store"; +import styles from './ChatSources.module.scss' +import FileDispaly from "@components/File_Display/FileDisplay"; + +const ChatSources: React.FC = () => { + + const { sourceLinks, sourceFiles, sourceType } = useAppSelector(conversationSelector); + const isWeb = sourceType === 'web'; + const sourceElements = isWeb ? sourceLinks : sourceFiles; + + if(sourceLinks.length === 0 && sourceFiles.length === 0) return; + + const renderElements = () => { + return ( + sourceElements.map((element: any, elementIndex)=>{ + return + }) + ) + } + + + return ( + + {renderElements()} + + ); +}; + +export default ChatSources; \ No newline at end of file diff --git a/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.module.scss b/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.module.scss new file mode 100644 index 0000000000..276abef4ae --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.module.scss @@ -0,0 +1,27 @@ +.userWrapper{ + display: flex; + justify-content: flex-end; + margin-bottom: 2rem; + position: relative; + + .userPrompt{ + max-width: 80%; + border-radius: var(--input-radius); + padding: .75rem 2rem .75rem 1rem; + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-word; + } + + .addIcon{ + position: absolute; + right: -16px; + top: 3px; + opacity: 0; + transition: opacity 0.3s; + } + + &:hover .addIcon{ + opacity: 1; + } +} \ No newline at end of file diff --git a/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.tsx b/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.tsx new file mode 100644 index 0000000000..51b1e6cbf9 --- /dev/null +++ b/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.tsx @@ -0,0 +1,45 @@ + +import { IconButton, styled, Tooltip } from "@mui/material"; +import React from "react"; +import styles from "./ChatUser.module.scss"; +import AddCircle from '@mui/icons-material/AddCircle'; +import { useAppDispatch } from "@redux/store"; +import { addPrompt } from "@redux/Prompt/PromptSlice"; +import ChatMarkdown from "@components/Chat_Markdown/ChatMarkdown"; + +interface ChatUserProps { + content: string; +} + +const UserInput = styled('div')(({ theme }) => ({ + background: theme.customStyles.user?.main, +})); + +const AddIcon = styled(AddCircle)(({ theme }) => ({ + 'path': { + fill: theme.customStyles.icon?.main, + } +})); + +const ChatUser: React.FC = ({ content }) => { + + const dispatch = useAppDispatch(); + + const sharePrompt = () => { + dispatch(addPrompt({ promptText: content })) + }; + + return ( +
+ + + + + + + +
+ ); +}; + +export default ChatUser; \ No newline at end of file diff --git a/ProductivitySuite/ui/react/src/components/CodeGen/CodeGen.tsx b/ProductivitySuite/ui/react/src/components/CodeGen/CodeGen.tsx deleted file mode 100644 index 29c96f61cb..0000000000 --- a/ProductivitySuite/ui/react/src/components/CodeGen/CodeGen.tsx +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (C) 2024 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 - -import { KeyboardEventHandler, SyntheticEvent, useEffect, useRef, useState } from 'react' -import styleClasses from "./codeGen.module.scss" -import { ActionIcon, Textarea, Title, rem } from '@mantine/core' -import { IconArrowRight } from '@tabler/icons-react' -import { ConversationMessage } from '../Message/conversationMessage' -import { fetchEventSource } from '@microsoft/fetch-event-source' -import { CODE_GEN_URL } from '../../config' - - - -const CodeGen = () => { - const [prompt, setPrompt] = useState("") - const [submittedPrompt, setSubmittedPrompt] = useState("") - const [response,setResponse] = useState(""); - const promptInputRef = useRef(null) - const scrollViewport = useRef(null) - - const toSend = "Enter" - - const handleSubmit = async () => { - setResponse("") - setSubmittedPrompt(prompt) - const body = { - messages:prompt - } - fetchEventSource(CODE_GEN_URL, { - method: "POST", - headers: { - "Content-Type": "application/json", - "Accept":"*/*" - }, - body: JSON.stringify(body), - openWhenHidden: true, - async onopen(response) { - if (response.ok) { - return; - } else if (response.status >= 400 && response.status < 500 && response.status !== 429) { - const e = await response.json(); - console.log(e); - throw Error(e.error.message); - } else { - console.log("error", response); - } - }, - onmessage(msg) { - if (msg?.data != "[DONE]") { - try { - const match = msg.data.match(/b'([^']*)'/); - if (match && match[1] != "
") { - const extractedText = match[1].replace(/\\n/g, "\n"); - setResponse(prev=>prev+extractedText); - } - } catch (e) { - console.log("something wrong in msg", e); - throw e; - } - } - }, - onerror(err) { - console.log("error", err); - setResponse("") - throw err; - }, - onclose() { - setPrompt("") - }, - }); - - } - - const scrollToBottom = () => { - scrollViewport.current!.scrollTo({ top: scrollViewport.current!.scrollHeight }) - } - - useEffect(() => { - scrollToBottom() - }, [response]) - - const handleKeyDown: KeyboardEventHandler = (event) => { - if (!event.shiftKey && event.key === toSend) { - handleSubmit() - setTimeout(() => { - setPrompt("") - }, 1) - } - } - - const handleChange = (event: SyntheticEvent) => { - event.preventDefault() - setPrompt((event.target as HTMLTextAreaElement).value) - } - return ( -
-
-
-
- CodeGen -
- -
- {!submittedPrompt && !response && - (<> -
Start by asking a question
- ) - } - {submittedPrompt && ( - - )} - {response && ( - - )} -
- -
- - - - Save - - - Cancel - -
- ) - } - else { - return ( - - - - ) - } - } else { - return ( - - Generating response - - . - . - . - - - ) - } + const cancelResponse = () => { + setEditResponse(false); + }; + const displayCurrentMessage = () => { + if (currentMessage.content) { + if (editResponse) { + return ( +
+ + + + Save + + Cancel +
+ ); + } else { + return ( + + + + ); + } + } else { + return ( + + Generating response + + . + . + . + + + ); } + }; - const displayMessageActions = () => { + const displayMessageActions = () => { + if (onGoingResult) return; - if (onGoingResult) return; - - return ( - - - {/*TODO: feedback support */} - {/* submitFeedback(true)}> + return ( + + {/*TODO: feedback support */} + {/* submitFeedback(true)}> {feedback === null || feedback === false ? ( ) : ( @@ -167,47 +188,40 @@ const ChatAssistant: React.FC = ({ message, pending = false }) )} */} - - - {isClipboardAvailable && ( - - copyText(assistantMessage)}> - - - - )} - - {type === 'chat' && ( - - - - - - )} - - ) - - } - - return ( -
- -
- -
- -
- - {displayCurrentMessage()} - - {!pending && displayMessageActions()} + + + {isClipboardAvailable && ( + + copyText(assistantMessage)}> + + + + )} + + {type === "chat" && ( + + + + + + )} + + ); + }; -
+ return ( +
+
+ +
+
+ {displayCurrentMessage()} -
- ); + {!pending && displayMessageActions()} +
+
+ ); }; - -export default ChatAssistant; \ No newline at end of file +export default ChatAssistant; diff --git a/ProductivitySuite/ui/react/src/components/Chat_Markdown/ChatMarkdown.tsx b/ProductivitySuite/ui/react/src/components/Chat_Markdown/ChatMarkdown.tsx index 2ab28dbb5c..2d8c0658d9 100644 --- a/ProductivitySuite/ui/react/src/components/Chat_Markdown/ChatMarkdown.tsx +++ b/ProductivitySuite/ui/react/src/components/Chat_Markdown/ChatMarkdown.tsx @@ -1,75 +1,90 @@ -import React, { lazy,Suspense, useEffect } from 'react'; -import markdownStyles from './markdown.module.scss' -import ReactMarkdown from 'react-markdown'; -import remarkGfm from 'remark-gfm'; -import remarkFrontmatter from 'remark-frontmatter'; -import remarkBreaks from 'remark-breaks'; +import React, { lazy, Suspense, useEffect } from "react"; +import markdownStyles from "./markdown.module.scss"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import remarkFrontmatter from "remark-frontmatter"; +import remarkBreaks from "remark-breaks"; -const CodeRender = lazy(()=> import('./CodeRender/CodeRender')); +const CodeRender = lazy(() => import("./CodeRender/CodeRender")); type MarkdownProps = { - content: string -} + content: string; +}; const ChatMarkdown = ({ content }: MarkdownProps) => { + useEffect(() => { + // preload in background + import("./CodeRender/CodeRender"); + }, []); - useEffect(()=>{ - // preload in background - import("./CodeRender/CodeRender") - },[]) - - return ( - { - - // check for nested block elements attempting to inject into a p tag - const hasBlockElement = React.Children.toArray(children).some(child => - React.isValidElement(child) && typeof child.type === "string" && ["div", "h1", "h2", "h3", "ul", "ol", "table"].includes(child.type) - ); + return ( + { + // check for nested block elements attempting to inject into a p tag + const hasBlockElement = React.Children.toArray(children).some( + (child) => + React.isValidElement(child) && + typeof child.type === "string" && + ["div", "h1", "h2", "h3", "ul", "ol", "table"].includes( + child.type, + ), + ); - // If block-level elements are found, avoid wrapping in

- return hasBlockElement ? <>{children} :

{children}

; - }, - a: ({ children, ...props }) => { - return ( - //@ts-ignore - - {children} - - ); - }, - table: ({ children, ...props }) => { - return ( -
- {children}
-
- ); - }, - code({ inline, className, children, }) { - const lang = /language-(\w+)/.exec(className || '') - return ( - Loading Code Block...}> - {/*@ts-ignore*/} - - - ) - } - }} - />) -} + // If block-level elements are found, avoid wrapping in

+ return hasBlockElement ? ( + <>{children} + ) : ( +

+ {children} +

+ ); + }, + a: ({ children, ...props }) => { + return ( + //@ts-ignore + + {children} + + ); + }, + table: ({ children, ...props }) => { + return ( +
+ {children}
+
+ ); + }, + code({ inline, className, children }) { + const lang = /language-(\w+)/.exec(className || ""); + return ( + Loading Code Block...}> + {/*@ts-ignore*/} + + + ); + }, + }} + /> + ); +}; export default ChatMarkdown; diff --git a/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/CodeRender.tsx b/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/CodeRender.tsx index 5d20d16983..3fb833c90f 100644 --- a/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/CodeRender.tsx +++ b/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/CodeRender.tsx @@ -1,72 +1,78 @@ -import styles from './codeRender.module.scss' +import styles from "./codeRender.module.scss"; import { Light as SyntaxHighlighter } from "react-syntax-highlighter"; -import { atomOneDark, atomOneLight } from 'react-syntax-highlighter/dist/esm/styles/hljs'; -import ContentCopyIcon from '@mui/icons-material/ContentCopy'; -import { IconButton, styled, Tooltip, useTheme } from '@mui/material'; -import { NotificationSeverity, notify } from '@components/Notification/Notification'; +import { + atomOneDark, + atomOneLight, +} from "react-syntax-highlighter/dist/esm/styles/hljs"; +import ContentCopyIcon from "@mui/icons-material/ContentCopy"; +import { IconButton, styled, Tooltip, useTheme } from "@mui/material"; +import { + NotificationSeverity, + notify, +} from "@components/Notification/Notification"; -const TitleBox = styled('div')(({ theme }) => ({ - background: theme.customStyles.code?.primary, - color: theme.customStyles.code?.title +const TitleBox = styled("div")(({ theme }) => ({ + background: theme.customStyles.code?.primary, + color: theme.customStyles.code?.title, })); const StyledCode = styled(SyntaxHighlighter)(({ theme }) => ({ - background: theme.customStyles.code?.secondary + ' !important', + background: theme.customStyles.code?.secondary + " !important", })); type CodeRenderProps = { - cleanCode: React.ReactNode, - language: string, - inline: boolean -} -const CodeRender = ({ cleanCode, language, inline }:CodeRenderProps) => { + cleanCode: React.ReactNode; + language: string; + inline: boolean; +}; +const CodeRender = ({ cleanCode, language, inline }: CodeRenderProps) => { + const theme = useTheme(); - const theme = useTheme(); + const isClipboardAvailable = navigator.clipboard && window.isSecureContext; - const isClipboardAvailable = navigator.clipboard && window.isSecureContext; + cleanCode = String(cleanCode) + .replace(/\n$/, "") + .replace(/^\s*[\r\n]/gm, ""); //right trim and remove empty lines from the input - cleanCode = String(cleanCode).replace(/\n$/, '').replace(/^\s*[\r\n]/gm, '') //right trim and remove empty lines from the input - - const copyText = (text: string) => { - navigator.clipboard.writeText(text); - notify('Copied to clipboard', NotificationSeverity.SUCCESS); - } - - try { - return inline ? ({cleanCode}) : ( -
- -
- {language || "language not detected"} -
-
- {isClipboardAvailable && ( - - copyText(cleanCode.toString())}> - - - - )} -
-
- -
) - } catch (err) { - return ( -
-                {cleanCode}
-            
- ) - } - -} + const copyText = (text: string) => { + navigator.clipboard.writeText(text); + notify("Copied to clipboard", NotificationSeverity.SUCCESS); + }; + try { + return inline ? ( + + {cleanCode} + + ) : ( +
+ +
+ {language || "language not detected"} +
+
+ {isClipboardAvailable && ( + + copyText(cleanCode.toString())}> + + + + )} +
+
+ +
+ ); + } catch (err) { + return
{cleanCode}
; + } +}; export default CodeRender; diff --git a/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/codeRender.module.scss b/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/codeRender.module.scss index f3aae8c5f2..596004846e 100644 --- a/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/codeRender.module.scss +++ b/ProductivitySuite/ui/react/src/components/Chat_Markdown/CodeRender/codeRender.module.scss @@ -2,7 +2,6 @@ margin: 7px 0px; .codeHead { - padding: 0px 10px !important; display: flex; flex-direction: row; @@ -10,7 +9,8 @@ align-items: center; justify-content: space-between; - .codeTitle {} + .codeTitle { + } .codeActionGroup { display: flex; @@ -25,7 +25,7 @@ margin: 0px !important; white-space: pre-wrap !important; - code{ + code { white-space: pre-wrap !important; } } @@ -33,4 +33,4 @@ .inlineCode { background: #fff; -} \ No newline at end of file +} diff --git a/ProductivitySuite/ui/react/src/components/Chat_Markdown/markdown.module.scss b/ProductivitySuite/ui/react/src/components/Chat_Markdown/markdown.module.scss index a8e6918b67..e86902eed3 100644 --- a/ProductivitySuite/ui/react/src/components/Chat_Markdown/markdown.module.scss +++ b/ProductivitySuite/ui/react/src/components/Chat_Markdown/markdown.module.scss @@ -1,6 +1,5 @@ .tableDiv { - - &:first-of-type{ + &:first-of-type { padding-top: 0px !important; } @@ -19,12 +18,12 @@ } } -.markdownWrapper{ - > p:first-of-type{ - margin-top: .25rem; +.markdownWrapper { + > p:first-of-type { + margin-top: 0.25rem; } - > p:last-of-type{ - margin-bottom: .25rem; + > p:last-of-type { + margin-bottom: 0.25rem; } } diff --git a/ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.tsx b/ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.tsx index 8526c81a37..732e5a2123 100644 --- a/ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.tsx +++ b/ProductivitySuite/ui/react/src/components/Chat_SettingsModal/ChatSettingsModal.tsx @@ -1,38 +1,43 @@ -import * as React from 'react'; -import { Box, Typography, Modal, IconButton, styled, Tooltip } from '@mui/material'; -import SettingsApplicationsOutlinedIcon from '@mui/icons-material/SettingsApplicationsOutlined'; -import PromptSettings from '@components/PromptSettings/PromptSettings'; -import { Close } from '@mui/icons-material'; -import ModalBox from '@root/shared/ModalBox/ModalBox'; +import * as React from "react"; +import { + Box, + Typography, + Modal, + IconButton, + styled, + Tooltip, +} from "@mui/material"; +import SettingsApplicationsOutlinedIcon from "@mui/icons-material/SettingsApplicationsOutlined"; +import PromptSettings from "@components/PromptSettings/PromptSettings"; +import { Close } from "@mui/icons-material"; +import ModalBox from "@root/shared/ModalBox/ModalBox"; const ChatSettingsModal = () => { - const [open, setOpen] = React.useState(false); - const handleOpen = () => setOpen(true); - const handleClose = () => setOpen(false); + const [open, setOpen] = React.useState(false); + const handleOpen = () => setOpen(true); + const handleClose = () => setOpen(false); - return ( -
+ return ( +
+ + + + + - - - - - - - - - Response Settings - setOpen(false)}> - - - - - - - - -
- ); -} + + + Response Settings + setOpen(false)}> + + + + + + + +
+ ); +}; export default ChatSettingsModal; diff --git a/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.module.scss b/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.module.scss index de7245feba..1a6a0d76e6 100644 --- a/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.module.scss +++ b/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.module.scss @@ -1,47 +1,47 @@ -.sourceWrapper{ - display: flex; - flex-direction: row; - justify-content: flex-end; - flex-wrap: wrap; - width: var(--content-width); - margin: 0 auto var(--vertical-spacer); - max-width: 100%; +.sourceWrapper { + display: flex; + flex-direction: row; + justify-content: flex-end; + flex-wrap: wrap; + width: var(--content-width); + margin: 0 auto var(--vertical-spacer); + max-width: 100%; } -.iconWrap{ - border: none; - border-radius: 6px; - margin-right: .5rem; - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; +.iconWrap { + border: none; + border-radius: 6px; + margin-right: 0.5rem; + width: 30px; + height: 30px; + display: flex; + align-items: center; + justify-content: center; } -.sourceBox{ - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; - margin-left: 1rem; - padding: 5px; - border-radius: 6px; - margin-bottom: 1rem; +.sourceBox { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + margin-left: 1rem; + padding: 5px; + border-radius: 6px; + margin-bottom: 1rem; } -.title{ - margin: 0 .5rem 0 0; - white-space: nowrap; - display: inline-block; - max-width: 150px; - overflow: hidden; - text-overflow: ellipsis; - font-weight: 400; +.title { + margin: 0 0.5rem 0 0; + white-space: nowrap; + display: inline-block; + max-width: 150px; + overflow: hidden; + text-overflow: ellipsis; + font-weight: 400; } -.chip{ - border-radius: 8px; - padding: 3px; - font-size: 12px; -} \ No newline at end of file +.chip { + border-radius: 8px; + padding: 3px; + font-size: 12px; +} diff --git a/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.tsx b/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.tsx index 999e939540..2bf0858254 100644 --- a/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.tsx +++ b/ProductivitySuite/ui/react/src/components/Chat_Sources/ChatSources.tsx @@ -1,31 +1,28 @@ import { Box } from "@mui/material"; import { conversationSelector } from "@redux/Conversation/ConversationSlice"; import { useAppSelector } from "@redux/store"; -import styles from './ChatSources.module.scss' +import styles from "./ChatSources.module.scss"; import FileDispaly from "@components/File_Display/FileDisplay"; const ChatSources: React.FC = () => { + const { sourceLinks, sourceFiles, sourceType } = + useAppSelector(conversationSelector); + const isWeb = sourceType === "web"; + const sourceElements = isWeb ? sourceLinks : sourceFiles; - const { sourceLinks, sourceFiles, sourceType } = useAppSelector(conversationSelector); - const isWeb = sourceType === 'web'; - const sourceElements = isWeb ? sourceLinks : sourceFiles; + if (sourceLinks.length === 0 && sourceFiles.length === 0) return; - if(sourceLinks.length === 0 && sourceFiles.length === 0) return; - - const renderElements = () => { + const renderElements = () => { + return sourceElements.map((element: any, elementIndex) => { return ( - sourceElements.map((element: any, elementIndex)=>{ - return - }) - ) - } + + + + ); + }); + }; - - return ( - - {renderElements()} - - ); + return {renderElements()}; }; -export default ChatSources; \ No newline at end of file +export default ChatSources; diff --git a/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.module.scss b/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.module.scss index 276abef4ae..3a5b5079ee 100644 --- a/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.module.scss +++ b/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.module.scss @@ -1,27 +1,27 @@ -.userWrapper{ - display: flex; - justify-content: flex-end; - margin-bottom: 2rem; - position: relative; +.userWrapper { + display: flex; + justify-content: flex-end; + margin-bottom: 2rem; + position: relative; - .userPrompt{ - max-width: 80%; - border-radius: var(--input-radius); - padding: .75rem 2rem .75rem 1rem; - overflow-wrap: break-word; - word-wrap: break-word; - word-break: break-word; - } + .userPrompt { + max-width: 80%; + border-radius: var(--input-radius); + padding: 0.75rem 2rem 0.75rem 1rem; + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-word; + } - .addIcon{ - position: absolute; - right: -16px; - top: 3px; - opacity: 0; - transition: opacity 0.3s; - } + .addIcon { + position: absolute; + right: -16px; + top: 3px; + opacity: 0; + transition: opacity 0.3s; + } - &:hover .addIcon{ - opacity: 1; - } -} \ No newline at end of file + &:hover .addIcon { + opacity: 1; + } +} diff --git a/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.tsx b/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.tsx index 51b1e6cbf9..37971f87cb 100644 --- a/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.tsx +++ b/ProductivitySuite/ui/react/src/components/Chat_User/ChatUser.tsx @@ -1,45 +1,44 @@ - import { IconButton, styled, Tooltip } from "@mui/material"; import React from "react"; import styles from "./ChatUser.module.scss"; -import AddCircle from '@mui/icons-material/AddCircle'; +import AddCircle from "@mui/icons-material/AddCircle"; import { useAppDispatch } from "@redux/store"; import { addPrompt } from "@redux/Prompt/PromptSlice"; import ChatMarkdown from "@components/Chat_Markdown/ChatMarkdown"; interface ChatUserProps { - content: string; + content: string; } -const UserInput = styled('div')(({ theme }) => ({ - background: theme.customStyles.user?.main, +const UserInput = styled("div")(({ theme }) => ({ + background: theme.customStyles.user?.main, })); const AddIcon = styled(AddCircle)(({ theme }) => ({ - 'path': { - fill: theme.customStyles.icon?.main, - } + path: { + fill: theme.customStyles.icon?.main, + }, })); const ChatUser: React.FC = ({ content }) => { - - const dispatch = useAppDispatch(); - - const sharePrompt = () => { - dispatch(addPrompt({ promptText: content })) - }; - - return ( -
- - - - - - - -
- ); + const dispatch = useAppDispatch(); + + const sharePrompt = () => { + dispatch(addPrompt({ promptText: content })); + }; + + return ( +
+ + + + + + + + +
+ ); }; -export default ChatUser; \ No newline at end of file +export default ChatUser; diff --git a/ProductivitySuite/ui/react/src/components/Data_Web/DataWebInput.tsx b/ProductivitySuite/ui/react/src/components/Data_Web/DataWebInput.tsx index f045ff2e59..ae54cfc92a 100644 --- a/ProductivitySuite/ui/react/src/components/Data_Web/DataWebInput.tsx +++ b/ProductivitySuite/ui/react/src/components/Data_Web/DataWebInput.tsx @@ -1,66 +1,71 @@ -import ProgressIcon from "@components/ProgressIcon/ProgressIcon" -import { CustomTextInput, AddIcon } from "@components/Summary_WebInput/WebInput" -import styles from '@components/Summary_WebInput/WebInput.module.scss' -import { Box, InputAdornment } from "@mui/material" -import { conversationSelector, submitDataSourceURL } from "@redux/Conversation/ConversationSlice" -import { useAppDispatch, useAppSelector } from "@redux/store" -import { useEffect, useState } from "react" +import ProgressIcon from "@components/ProgressIcon/ProgressIcon"; +import { + CustomTextInput, + AddIcon, +} from "@components/Summary_WebInput/WebInput"; +import styles from "@components/Summary_WebInput/WebInput.module.scss"; +import { Box, InputAdornment } from "@mui/material"; +import { + conversationSelector, + submitDataSourceURL, +} from "@redux/Conversation/ConversationSlice"; +import { useAppDispatch, useAppSelector } from "@redux/store"; +import { useEffect, useState } from "react"; const DataWebInput = () => { + const { dataSourceUrlStatus } = useAppSelector(conversationSelector); + const [inputValue, setInputValue] = useState(""); + const [uploading, setUploading] = useState(false); + const dispatch = useAppDispatch(); - const {dataSourceUrlStatus} = useAppSelector(conversationSelector) - const [inputValue, setInputValue] = useState(''); - const [uploading, setUploading] = useState(false) - const dispatch = useAppDispatch(); - - const handleKeyPress = (e: React.KeyboardEvent) => { - if (e.key === 'Enter' && inputValue) { - handleAdd(inputValue); - } - }; - - const handleAdd = (newSource: string) => { - dispatch(submitDataSourceURL({link_list: [newSource]})) - setInputValue(''); + const handleKeyPress = (e: React.KeyboardEvent) => { + if (e.key === "Enter" && inputValue) { + handleAdd(inputValue); } + }; - const handleIconClick = () => { - if (inputValue) { - handleAdd(inputValue); - } - }; + const handleAdd = (newSource: string) => { + dispatch(submitDataSourceURL({ link_list: [newSource] })); + setInputValue(""); + }; - useEffect(()=>{ - setUploading(dataSourceUrlStatus === 'pending') - }, [dataSourceUrlStatus]) + const handleIconClick = () => { + if (inputValue) { + handleAdd(inputValue); + } + }; - return ( - + useEffect(() => { + setUploading(dataSourceUrlStatus === "pending"); + }, [dataSourceUrlStatus]); - ) => setInputValue(e.target.value)} - InputProps={{ - endAdornment: !uploading ? ( - - - - ) : ( - - - - ), - }} - fullWidth - /> - - - ) -} + return ( + + ) => + setInputValue(e.target.value) + } + InputProps={{ + endAdornment: !uploading ? ( + + + + ) : ( + + + + ), + }} + fullWidth + /> + + ); +}; -export default DataWebInput \ No newline at end of file +export default DataWebInput; diff --git a/ProductivitySuite/ui/react/src/components/DropDown/DropDown.module.scss b/ProductivitySuite/ui/react/src/components/DropDown/DropDown.module.scss index b2db82c5f9..a8f0561b62 100644 --- a/ProductivitySuite/ui/react/src/components/DropDown/DropDown.module.scss +++ b/ProductivitySuite/ui/react/src/components/DropDown/DropDown.module.scss @@ -1,69 +1,63 @@ -.dropDown{ - - .noWrap{ - white-space: nowrap; - display: flex; - - &.ellipsis span{ - white-space: nowrap; - display: inline-block; - width: 150px; - overflow: hidden; - text-overflow: ellipsis; - margin: 0; - } - } - - .unsetMin{ - min-width: unset; +.dropDown { + .noWrap { + white-space: nowrap; + display: flex; + + &.ellipsis span { + white-space: nowrap; + display: inline-block; + width: 150px; + overflow: hidden; + text-overflow: ellipsis; + margin: 0; } - - .chevron{ - transform: rotate(0deg); - transition: transform .5s; - - &.open{ - transform: rotate(180deg); - } + } + + .unsetMin { + min-width: unset; + } + + .chevron { + transform: rotate(0deg); + transition: transform 0.5s; + + &.open { + transform: rotate(180deg); } - - &.border{ - border-radius: 8px; - margin-left: 0.5rem; - - :global { - .MuiList-padding{ - margin-left: 0 !important; - } - - .MuiListItemIcon-root{ - min-width: unset; - } - } + } - :global { + &.border { + border-radius: 8px; + margin-left: 0.5rem; - .MuiListItemText-root{ - margin-top: 3px; - margin-bottom: 3px; - } + :global { + .MuiList-padding { + margin-left: 0 !important; + } - .MuiList-root{ - padding: 0; - margin-left: .5rem; + .MuiListItemIcon-root { + min-width: unset; + } + } - .MuiButtonBase-root{ - padding: 0 .5rem; - } + :global { + .MuiListItemText-root { + margin-top: 3px; + margin-bottom: 3px; + } - } + .MuiList-root { + padding: 0; + margin-left: 0.5rem; + .MuiButtonBase-root { + padding: 0 0.5rem; } + } } - + } } -.leftGap{ - margin-left: 0.5rem !important; +.leftGap { + margin-left: 0.5rem !important; } - diff --git a/ProductivitySuite/ui/react/src/components/DropDown/DropDown.tsx b/ProductivitySuite/ui/react/src/components/DropDown/DropDown.tsx index f5cc38ddc7..dc839f917f 100644 --- a/ProductivitySuite/ui/react/src/components/DropDown/DropDown.tsx +++ b/ProductivitySuite/ui/react/src/components/DropDown/DropDown.tsx @@ -1,94 +1,118 @@ -import React, { useState } from 'react'; -import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; -import { List, ListItemButton, ListItemText, MenuItem, Menu, Typography, ListItemIcon, styled, Box } from '@mui/material'; -import styles from './DropDown.module.scss' +import React, { useState } from "react"; +import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; +import { + List, + ListItemButton, + ListItemText, + MenuItem, + Menu, + Typography, + ListItemIcon, + styled, + Box, +} from "@mui/material"; +import styles from "./DropDown.module.scss"; interface DropDownProps { - options: { name: string, value: string }[]; - value?: string; - handleChange: (value: string) => void; - readOnly?: boolean; - border?: boolean; - ellipsis?: true; + options: { name: string; value: string }[]; + value?: string; + handleChange: (value: string) => void; + readOnly?: boolean; + border?: boolean; + ellipsis?: true; } const CustomMenuItem = styled(MenuItem)(({ theme }) => ({ - ...theme.customStyles.dropDown + ...theme.customStyles.dropDown, })); const DropDownWrapper = styled(Box)(({ theme }) => ({ - ...theme.customStyles.dropDown.wrapper + ...theme.customStyles.dropDown.wrapper, })); -const DropDown: React.FC = ({ options, value, handleChange, readOnly, border, ellipsis }) => { - - const [anchorEl, setAnchorEl] = useState(null); - - const foundIndex = options.findIndex(option => option.value === value); - - const [selectedIndex, setSelectedIndex] = useState(foundIndex !== -1 ? foundIndex : 0); - - const open = Boolean(anchorEl); - const handleClickListItem = (event: React.MouseEvent) => { - setAnchorEl(event.currentTarget); - }; - - const handleMenuItemClick = ( - index: number, - ) => { - setSelectedIndex(index); - setAnchorEl(null); - handleChange(options[index].value); - }; - - const handleClose = () => { - setAnchorEl(null); - }; - - if (readOnly) { - let name = foundIndex === -1 ? 'Unknown' : options[selectedIndex].name - return {name}; - } - - const Wrapper = border ? DropDownWrapper : Box; - - return options.length === 0 ? <> : ( - - - - - - - - - - - - - {options.map((option, index) => ( - handleMenuItemClick(index)}> - {option.name} - - ))} - - - ); -} +const DropDown: React.FC = ({ + options, + value, + handleChange, + readOnly, + border, + ellipsis, +}) => { + const [anchorEl, setAnchorEl] = useState(null); + + const foundIndex = options.findIndex((option) => option.value === value); + + const [selectedIndex, setSelectedIndex] = useState( + foundIndex !== -1 ? foundIndex : 0, + ); + + const open = Boolean(anchorEl); + const handleClickListItem = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleMenuItemClick = (index: number) => { + setSelectedIndex(index); + setAnchorEl(null); + handleChange(options[index].value); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + if (readOnly) { + let name = foundIndex === -1 ? "Unknown" : options[selectedIndex].name; + return {name}; + } + + const Wrapper = border ? DropDownWrapper : Box; + + return options.length === 0 ? ( + <> + ) : ( + + + + + + + + + + + + {options.map((option, index) => ( + handleMenuItemClick(index)} + > + {option.name} + + ))} + + + ); +}; export default DropDown; diff --git a/ProductivitySuite/ui/react/src/components/File_Display/FileDisplay.module.scss b/ProductivitySuite/ui/react/src/components/File_Display/FileDisplay.module.scss index c999df5e28..46cb667e6e 100644 --- a/ProductivitySuite/ui/react/src/components/File_Display/FileDisplay.module.scss +++ b/ProductivitySuite/ui/react/src/components/File_Display/FileDisplay.module.scss @@ -1,44 +1,44 @@ -.file{ - display: flex; - flex-direction: row; - align-items: center; - justify-content: flex-start; - padding: 5px 10px; - border-radius: 5px; - margin-right: .5rem; - margin-bottom: .5rem; +.file { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + padding: 5px 10px; + border-radius: 5px; + margin-right: 0.5rem; + margin-bottom: 0.5rem; - button{ - margin-left: 0.5rem - } + button { + margin-left: 0.5rem; + } - .iconWrap{ - border: none; - border-radius: 6px; - margin-right: .5rem; - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; - } + .iconWrap { + border: none; + border-radius: 6px; + margin-right: 0.5rem; + width: 30px; + height: 30px; + display: flex; + align-items: center; + justify-content: center; + } - .fileName{ - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 1; // Limits to 2 lines - overflow: hidden; - text-overflow: ellipsis; - text-align: left; - max-width: 200px; - width: 100%; - font-size: 12px; - font-weight: 500; - } + .fileName { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; // Limits to 2 lines + overflow: hidden; + text-overflow: ellipsis; + text-align: left; + max-width: 200px; + width: 100%; + font-size: 12px; + font-weight: 500; + } - .fileExt{ - font-size: 11px; - text-align: left; - margin-top: -2px; - } -} \ No newline at end of file + .fileExt { + font-size: 11px; + text-align: left; + margin-top: -2px; + } +} diff --git a/ProductivitySuite/ui/react/src/components/File_Display/FileDisplay.tsx b/ProductivitySuite/ui/react/src/components/File_Display/FileDisplay.tsx index 8167c96dbe..7aaed02320 100644 --- a/ProductivitySuite/ui/react/src/components/File_Display/FileDisplay.tsx +++ b/ProductivitySuite/ui/react/src/components/File_Display/FileDisplay.tsx @@ -1,55 +1,51 @@ import { IconButton } from "@mui/material"; import { Close, TaskOutlined, Language } from "@mui/icons-material"; import styled from "styled-components"; -import styles from './FileDisplay.module.scss' +import styles from "./FileDisplay.module.scss"; -const FileWrap = styled('div')(({ theme }) => ({ - ...theme.customStyles.fileInput.file, - ...theme.customStyles.gradientShadow, +const FileWrap = styled("div")(({ theme }) => ({ + ...theme.customStyles.fileInput.file, + ...theme.customStyles.gradientShadow, })); -const IconWrap = styled('div')(({ theme }) => ({ - ...theme.customStyles.sources.iconWrap, +const IconWrap = styled("div")(({ theme }) => ({ + ...theme.customStyles.sources.iconWrap, })); interface FileProps { - file: File; - index: number; - remove?: (value: number)=>void; - isWeb?: boolean; + file: File; + index: number; + remove?: (value: number) => void; + isWeb?: boolean; } - -const FileDispaly: React.FC = ({file, index, remove, isWeb}) => { - - if(!file) return; - - let fileExtension = file.name.split('.').pop()?.toLowerCase(); - let fileName = isWeb ? file.name : file.name.split('.').shift(); - - return ( - - - - - - -
-
- {fileName} -
- {!isWeb && ( -
- .{fileExtension} -
- )} -
- - {remove && remove(index)}>} - {isWeb && } - -
- ) -} - -export default FileDispaly \ No newline at end of file +const FileDispaly: React.FC = ({ file, index, remove, isWeb }) => { + if (!file) return; + + let fileExtension = file.name.split(".").pop()?.toLowerCase(); + let fileName = isWeb ? file.name : file.name.split(".").shift(); + + return ( + + + + + +
+
+ {fileName} +
+ {!isWeb &&
.{fileExtension}
} +
+ + {remove && ( + remove(index)}> + + + )} + {isWeb && } +
+ ); +}; + +export default FileDispaly; diff --git a/ProductivitySuite/ui/react/src/components/File_Input/FileInput.module.scss b/ProductivitySuite/ui/react/src/components/File_Input/FileInput.module.scss index 270cc3ffca..273afe7e5d 100644 --- a/ProductivitySuite/ui/react/src/components/File_Input/FileInput.module.scss +++ b/ProductivitySuite/ui/react/src/components/File_Input/FileInput.module.scss @@ -1,75 +1,69 @@ .fileInputWrapper { + width: 100%; + display: flex; + align-items: center; + justify-content: center; - width: 100%; - display: flex; - align-items: center; - justify-content: center; + .upload { + margin-left: 0.5rem; + } - .upload{ - margin-left: .5rem; - } + .inputWrapper { + padding: 1rem; + text-align: center; + box-shadow: none; + border-radius: 8px; + width: 100%; + position: relative; + } - .inputWrapper { - padding: 1rem; - text-align: center; - box-shadow: none; - border-radius: 8px; - width: 100%; - position: relative; - } + .expand { + width: 25px; + height: 25px; + border-radius: 25px; + min-width: unset; + border-width: 1px; + border-style: solid; + transition: transform 0.5s; + transform: rotate(0deg); + transform-origin: center; + margin-left: -12.5px; + margin-top: -20px; + position: absolute; + bottom: -12.5px; + z-index: 8; - .expand{ - width: 25px; - height: 25px; - border-radius: 25px; - min-width: unset; - border-width: 1px; - border-style: solid; - transition: transform 0.5s; - transform:rotate(0deg); - transform-origin: center; - margin-left: -12.5px; - margin-top: -20px; - position: absolute; - bottom: -12.5px; - z-index: 8; - - &.open{ - transform: rotate(180deg); - } + &.open { + transform: rotate(180deg); } - + } } -.previewFiles{ - - margin-bottom: .5rem; +.previewFiles { + margin-bottom: 0.5rem; - .fileList{ - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: center; - } - - - label{ - margin-top: 0.5rem; - } + .fileList { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + } - + label { + margin-top: 0.5rem; + } } -.details{ - max-height: 0px; - transition: max-height .4s; - overflow: hidden; +.details { + max-height: 0px; + transition: max-height 0.4s; + overflow: hidden; - &.detailsOpen{ - max-height: 400px; - } + &.detailsOpen { + max-height: 400px; + } } -.detailGap{ - margin-top: 10px; -} \ No newline at end of file +.detailGap { + margin-top: 10px; +} diff --git a/ProductivitySuite/ui/react/src/components/File_Input/FileInput.tsx b/ProductivitySuite/ui/react/src/components/File_Input/FileInput.tsx index 6681fb6023..a5affc0797 100644 --- a/ProductivitySuite/ui/react/src/components/File_Input/FileInput.tsx +++ b/ProductivitySuite/ui/react/src/components/File_Input/FileInput.tsx @@ -1,17 +1,30 @@ import React, { useEffect, useReducer, useRef, useState } from "react"; import { - Box, - Button, - Typography, - Paper, - IconButton, - styled + Box, + Button, + Typography, + Paper, + IconButton, + styled, } from "@mui/material"; -import { UploadFile, Close, ExpandMore, FileUploadOutlined } from "@mui/icons-material"; +import { + UploadFile, + Close, + ExpandMore, + FileUploadOutlined, +} from "@mui/icons-material"; import styles from "./FileInput.module.scss"; -import { NotificationSeverity, notify } from "@components/Notification/Notification"; +import { + NotificationSeverity, + notify, +} from "@components/Notification/Notification"; import { useAppDispatch, useAppSelector } from "@redux/store"; -import { conversationSelector, setSourceFiles, setUploadInProgress, uploadFile } from "@redux/Conversation/ConversationSlice"; +import { + conversationSelector, + setSourceFiles, + setUploadInProgress, + uploadFile, +} from "@redux/Conversation/ConversationSlice"; import ModalBox from "@shared/ModalBox/ModalBox"; import { OutlineButton, SolidButton } from "@shared/ActionButtons"; import { Link } from "react-router-dom"; @@ -19,314 +32,343 @@ import FileDispaly from "@components/File_Display/FileDisplay"; import ProgressIcon from "@components/ProgressIcon/ProgressIcon"; const ExpandButton = styled(Button)(({ theme }) => ({ - ...theme.customStyles.promptExpandButton + ...theme.customStyles.promptExpandButton, })); interface FileWithPreview { - file: File; - preview: string; + file: File; + preview: string; } interface FileInputProps { - imageInput?: boolean; - maxFileCount?: number; - confirmationModal?: boolean; - dataManagement?: boolean; + imageInput?: boolean; + maxFileCount?: number; + confirmationModal?: boolean; + dataManagement?: boolean; } const imageExtensions = ["jpg", "jpeg", "png", "gif"]; const docExtensions = ["txt"]; -const dataExtensions = ["txt", "pdf", "csv", "xls", "xlsx", "json", /*"doc", "docx", "md", "ppt", "pptx", "html", "xml", "xsl", "xslt", "rtf", "v", "sv"*/]; +const dataExtensions = [ + "txt", + "pdf", + "csv", + "xls", + "xlsx", + "json" /*"doc", "docx", "md", "ppt", "pptx", "html", "xml", "xsl", "xslt", "rtf", "v", "sv"*/, +]; const maxImageSize = 3 * 1024 * 1024; // 3MB const maxDocSize = 200 * 1024 * 1024; // 200MB const FileInputWrapper = styled(Paper)(({ theme }) => ({ - ...theme.customStyles.fileInput.wrapper, + ...theme.customStyles.fileInput.wrapper, })); -const FileInput: React.FC = ({ maxFileCount = 5, imageInput, dataManagement}) => { - - const { model, models, useCase, filesInDataSource, uploadInProgress, type } = useAppSelector(conversationSelector); - // const { filesInDataManagement, uploadInProgress } = useAppSelector(dataManagementSelector); - - const dispatch = useAppDispatch(); - const [confirmUpload, setConfirmUpload] = useState(false); - const [filesToUpload, setFilesToUpload] = useState<(FileWithPreview|File)[]>([]); - const [details, showDetails] = useState(filesToUpload.length === 0) - - const inputRef = useRef(null); - - const extensions = imageInput ? imageExtensions : dataManagement ? dataExtensions : docExtensions; - const maxSize = imageInput ? maxImageSize : maxDocSize; - - const [insightToken, setInsightToken] = useState(0) - - useEffect(() => { - - showDetails(filesToUpload.length === 0); - - // summary / faq - if(!dataManagement && filesToUpload.length > 0){ - dispatch(setSourceFiles(filesToUpload)); - } - - }, [filesToUpload]) - - useEffect(()=>{ - - // model sets insight token in summary/faq - if(!dataManagement){ - let selectedModel = models.find((thisModel)=>thisModel.model_name === model); - if(selectedModel) setInsightToken(selectedModel.maxToken) - } - - }, [model, models]) - - useEffect(()=>{ - setFilesToUpload([]); - dispatch(setSourceFiles([])); - }, [type]) - - const handleDrop = (e: React.DragEvent) => { - e.preventDefault(); - const droppedFiles = Array.from(e.dataTransfer.files); - validateFiles(droppedFiles); - }; - - const handleFileSelect = (e: React.ChangeEvent) => { - - if (e.target.files) { - const selectedFiles = Array.from(e.target.files); - const validated = validateFiles(selectedFiles) - if(validated) e.target.value = ""; // Clear input - } - - }; - - const validateFiles = (newFiles: File[]) => { - - if (newFiles.length + filesToUpload.length > maxFileCount) { - notify(`You can only upload a maximum of ${maxFileCount} file${maxFileCount > 1 ? 's' : ''}.`, NotificationSeverity.ERROR); - return; - } - - const validFiles = newFiles.filter((file) => { - - const fileExtension = file.name.split('.').pop()?.toLowerCase(); - const isSupportedExtension = extensions.includes(fileExtension || ''); - const isWithinSizeLimit = file.size <= maxSize; - - const compareTo = dataManagement ? filesInDataSource : filesToUpload - - let duplicate = compareTo.some((f: any) => { - return f.name === file.name - }) - - // duplicate file check, currently data management only (summary/faq single file) - if (duplicate) { - notify(`File "${file.name}" is already added.`, NotificationSeverity.ERROR); - return false; - } - - if (!isSupportedExtension) { - notify(`File "${file.name}" has an unsupported file type.`, NotificationSeverity.ERROR); - return false; - } - - if (!isWithinSizeLimit) { - notify(`File "${file.name}" exceeds the maximum size limit of ${imageInput ? '3MB' : '200MB'}.`, NotificationSeverity.ERROR); - return false; - } - - return isSupportedExtension && isWithinSizeLimit; - - }) - - - if (validFiles.length > 0) { - addToQueue(validFiles); - } - - return true; +const FileInput: React.FC = ({ + maxFileCount = 5, + imageInput, + dataManagement, +}) => { + const { model, models, useCase, filesInDataSource, uploadInProgress, type } = + useAppSelector(conversationSelector); + // const { filesInDataManagement, uploadInProgress } = useAppSelector(dataManagementSelector); + + const dispatch = useAppDispatch(); + const [confirmUpload, setConfirmUpload] = useState(false); + const [filesToUpload, setFilesToUpload] = useState< + (FileWithPreview | File)[] + >([]); + const [details, showDetails] = useState(filesToUpload.length === 0); + + const inputRef = useRef(null); + + const extensions = imageInput + ? imageExtensions + : dataManagement + ? dataExtensions + : docExtensions; + const maxSize = imageInput ? maxImageSize : maxDocSize; + + const [insightToken, setInsightToken] = useState(0); + + useEffect(() => { + showDetails(filesToUpload.length === 0); + + // summary / faq + if (!dataManagement && filesToUpload.length > 0) { + dispatch(setSourceFiles(filesToUpload)); + } + }, [filesToUpload]); + + useEffect(() => { + // model sets insight token in summary/faq + if (!dataManagement) { + let selectedModel = models.find( + (thisModel) => thisModel.model_name === model, + ); + if (selectedModel) setInsightToken(selectedModel.maxToken); + } + }, [model, models]); + + useEffect(() => { + setFilesToUpload([]); + dispatch(setSourceFiles([])); + }, [type]); + + const handleDrop = (e: React.DragEvent) => { + e.preventDefault(); + const droppedFiles = Array.from(e.dataTransfer.files); + validateFiles(droppedFiles); + }; + + const handleFileSelect = (e: React.ChangeEvent) => { + if (e.target.files) { + const selectedFiles = Array.from(e.target.files); + const validated = validateFiles(selectedFiles); + if (validated) e.target.value = ""; // Clear input + } + }; + + const validateFiles = (newFiles: File[]) => { + if (newFiles.length + filesToUpload.length > maxFileCount) { + notify( + `You can only upload a maximum of ${maxFileCount} file${maxFileCount > 1 ? "s" : ""}.`, + NotificationSeverity.ERROR, + ); + return; } - const addToQueue = async (newFiles: File[]) => { - - const filteredFiles = newFiles.filter( - (file: File|FileWithPreview) => { - let activeFile = "file" in file ? file.file : file; - return !filesToUpload.some((f: File|FileWithPreview) => { - let comparedFile = "file" in f ? f.file : f; - return comparedFile.name === activeFile.name - })} - ); + const validFiles = newFiles.filter((file) => { + const fileExtension = file.name.split(".").pop()?.toLowerCase(); + const isSupportedExtension = extensions.includes(fileExtension || ""); + const isWithinSizeLimit = file.size <= maxSize; - const filesWithPreview = filteredFiles.map((file) => ({ - file, - preview: URL.createObjectURL(file), - })); - - setFilesToUpload([...filesToUpload, ...filesWithPreview]) + const compareTo = dataManagement ? filesInDataSource : filesToUpload; - }; + let duplicate = compareTo.some((f: any) => { + return f.name === file.name; + }); - const removeFile = (index:number) => { - let updatedFiles = filesToUpload.filter((file, fileIndex)=> index !== fileIndex); - setFilesToUpload(updatedFiles) - } + // duplicate file check, currently data management only (summary/faq single file) + if (duplicate) { + notify( + `File "${file.name}" is already added.`, + NotificationSeverity.ERROR, + ); + return false; + } - const uploadFiles = async () => { + if (!isSupportedExtension) { + notify( + `File "${file.name}" has an unsupported file type.`, + NotificationSeverity.ERROR, + ); + return false; + } - dispatch(setUploadInProgress(true)) - - const responses = await Promise.all( - filesToUpload.map((file:any) => { - dispatch(uploadFile({file: file.file})) - }) + if (!isWithinSizeLimit) { + notify( + `File "${file.name}" exceeds the maximum size limit of ${imageInput ? "3MB" : "200MB"}.`, + NotificationSeverity.ERROR, ); + return false; + } - dispatch(setUploadInProgress(false)) + return isSupportedExtension && isWithinSizeLimit; + }); - setConfirmUpload(false); - setFilesToUpload([]) + if (validFiles.length > 0) { + addToQueue(validFiles); } - const showConfirmUpload = () => { - setConfirmUpload(true) - } + return true; + }; + + const addToQueue = async (newFiles: File[]) => { + const filteredFiles = newFiles.filter((file: File | FileWithPreview) => { + let activeFile = "file" in file ? file.file : file; + return !filesToUpload.some((f: File | FileWithPreview) => { + let comparedFile = "file" in f ? f.file : f; + return comparedFile.name === activeFile.name; + }); + }); + + const filesWithPreview = filteredFiles.map((file) => ({ + file, + preview: URL.createObjectURL(file), + })); + + setFilesToUpload([...filesToUpload, ...filesWithPreview]); + }; + + const removeFile = (index: number) => { + let updatedFiles = filesToUpload.filter( + (file, fileIndex) => index !== fileIndex, + ); + setFilesToUpload(updatedFiles); + }; - const filePreview = () => { - - if(filesToUpload.length > 0){ - return ( - - - {filesToUpload.map((file, fileIndex)=>{ - let activeFile = "file" in file ? file.file : file; - return - })} - - - ) - } else { - return ( - - Upload or Drop Files Here - - ) - } + const uploadFiles = async () => { + dispatch(setUploadInProgress(true)); - } + const responses = await Promise.all( + filesToUpload.map((file: any) => { + dispatch(uploadFile({ file: file.file })); + }), + ); - const renderConfirmUpload = () => { - if(confirmUpload) { - return ( - - - Uploading files - setConfirmUpload(false)}> - - - - -

I hereby certify that the content uploaded is free from any personally identifiable information or other private data that would violate applicable privacy laws and regulations.

-
- uploadFiles()}>Agree and Continue - setConfirmUpload(false)}>Cancel -
-
-
- ) - } + dispatch(setUploadInProgress(false)); + + setConfirmUpload(false); + setFilesToUpload([]); + }; + + const showConfirmUpload = () => { + setConfirmUpload(true); + }; + + const filePreview = () => { + if (filesToUpload.length > 0) { + return ( + + + {filesToUpload.map((file, fileIndex) => { + let activeFile = "file" in file ? file.file : file; + return ( + + + + ); + })} + + + ); + } else { + return ( + + Upload or Drop Files Here + + ); } - - if(uploadInProgress){ - return ( - - - - - - ) + }; + + const renderConfirmUpload = () => { + if (confirmUpload) { + return ( + + + Uploading files + setConfirmUpload(false)}> + + + + +

+ I hereby certify that the content uploaded is free from any + personally identifiable information or other private data that + would violate applicable privacy laws and regulations. +

+
+ uploadFiles()}> + Agree and Continue + + setConfirmUpload(false)}> + Cancel + +
+
+
+ ); } + }; + if (uploadInProgress) { return ( - - - e.preventDefault()} - className={styles.inputWrapper}> - - {filePreview()} - -
- - {filesToUpload.length !== maxFileCount && ( - inputRef.current?.click()}> - Browse Files - - - )} - - {dataManagement && ( - - Upload - - )} - -
- - {filesToUpload.length > 0 && ( - showDetails(!details)}> - - - )} - -
- - - Limit {imageInput ? '3MB' : '200MB'} per file. - - - - Valid file formats are {extensions.join(', ').toUpperCase()}. - - - - You can select maximum of {maxFileCount} valid file{maxFileCount > 1 ? 's' : ''}. - - - {!dataManagement && ( - - Max supported input tokens for {imageInput && 'images'} data insight is {insightToken >= 1000 ? ((insightToken / 1000) + "K") : insightToken} - - )} - -
- -
- - {renderConfirmUpload()} - -
+ + + + + ); + } + + return ( + + e.preventDefault()} + className={styles.inputWrapper} + > + {filePreview()} + +
+ {filesToUpload.length !== maxFileCount && ( + inputRef.current?.click()}> + Browse Files + + + )} + + {dataManagement && ( + + Upload + + )} +
+ + {filesToUpload.length > 0 && ( + showDetails(!details)} + > + + + )} + +
+ + Limit {imageInput ? "3MB" : "200MB"} per file. + + + + Valid file formats are {extensions.join(", ").toUpperCase()}. + + + + You can select maximum of {maxFileCount} valid file + {maxFileCount > 1 ? "s" : ""}. + + + {!dataManagement && ( + + Max supported input tokens for {imageInput && "images"} data + insight is{" "} + {insightToken >= 1000 ? insightToken / 1000 + "K" : insightToken} + + )} +
+
+ + {renderConfirmUpload()} +
+ ); }; export default FileInput; diff --git a/ProductivitySuite/ui/react/src/components/Header/Header.module.scss b/ProductivitySuite/ui/react/src/components/Header/Header.module.scss index b847efdc56..ca93268a10 100644 --- a/ProductivitySuite/ui/react/src/components/Header/Header.module.scss +++ b/ProductivitySuite/ui/react/src/components/Header/Header.module.scss @@ -1,142 +1,136 @@ -.header{ - - height: var(--header-height); - backdrop-filter: blur(5px); - display: flex; - flex-direction: row; - align-items: center; - width: 100%; - padding: var(--header-gutter); - position: relative; - z-index: 999; +.header { + height: var(--header-height); + backdrop-filter: blur(5px); + display: flex; + flex-direction: row; + align-items: center; + width: 100%; + padding: var(--header-gutter); + position: relative; + z-index: 999; } -.viewContext{ - display: inline-flex; - max-width:200px; +.viewContext { + display: inline-flex; + max-width: 200px; - &.titleWrap{ - display: flex; - align-items: center; - justify-content: center; + &.titleWrap { + display: flex; + align-items: center; + justify-content: center; - :global { - svg{ - min-width: 30px; - } - } + :global { + svg { + min-width: 30px; + } } + } - &.capitalize{ - text-transform: capitalize; - } - - @media screen and (max-width: 900px){ - display: none; + &.capitalize { + text-transform: capitalize; + } - &.titleWrap{ - display: none; - } + @media screen and (max-width: 900px) { + display: none; + + &.titleWrap { + display: none; } + } } - - -.sideWrapper{ - - position: relative; +.sideWrapper { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + z-index: 999; + width: 50px; + margin-right: calc(var(--header-gutter) * 2); + min-width: 0px; + max-width: var(--sidebar-width); + transition: + width 0.3s, + min-width 0.3s; + + .chatCopy { + opacity: 0; + max-width: 0; + transition: + opacity 0.3s, + max-width 0.3s; + font-size: 0.75rem; + margin-right: 0.5rem; + white-space: nowrap; + } + + .chatWrapper { display: flex; flex-direction: row; align-items: center; - justify-content: space-between; - z-index: 999; - width: 50px; - margin-right: calc(var(--header-gutter) * 2); - min-width: 0px; - max-width: var(--sidebar-width); - transition: width 0.3s, min-width 0.3s; - - .chatCopy{ - opacity: 0; - max-width: 0; - transition: opacity 0.3s, max-width 0.3s; - font-size: .75rem; - margin-right: .5rem; - white-space: nowrap; - } - - .chatWrapper{ - display: flex; - flex-direction: row; - align-items: center; - } + } - &.sideWrapperOpen{ - width: calc(var(--sidebar-width) - (var(--header-gutter) * 2)); - min-width: calc(var(--sidebar-width) - (var(--header-gutter) * 2)); - - .chatCopy{ - max-width: 100px; // enough to show the text - opacity: 1; - } + &.sideWrapperOpen { + width: calc(var(--sidebar-width) - (var(--header-gutter) * 2)); + min-width: calc(var(--sidebar-width) - (var(--header-gutter) * 2)); + .chatCopy { + max-width: 100px; // enough to show the text + opacity: 1; } - + } } -.rightSide{ - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - width: 100%; +.rightSide { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + width: 100%; } -.rightActions{ - display: flex; - flex-direction: row; - align-items: center; +.rightActions { + display: flex; + flex-direction: row; + align-items: center; } -.companyName{ - font-weight: 600; - @media screen and (max-width: 899px){ - position: absolute; - left: 50%; - transform: translate(-50% , -50%); - } +.companyName { + font-weight: 600; + @media screen and (max-width: 899px) { + position: absolute; + left: 50%; + transform: translate(-50%, -50%); + } } -.desktopUser{ - display: none; - @media screen and (min-width: 900px){ - display: inline-block; - - } +.desktopUser { + display: none; + @media screen and (min-width: 900px) { + display: inline-block; + } } -.accessDropDown{ +.accessDropDown { + :global { + .MuiList-root { + padding: 0; - :global { + .MuiButtonBase-root { + padding: 0; + margin-left: -10px; + padding: 0 10px; - .MuiList-root{ - padding: 0; - - .MuiButtonBase-root{ - padding: 0; - margin-left: -10px; - padding: 0 10px; - - .MuiListItemText-root{ - margin: 0px; - } - - .MuiTypography-root{ - font-size: 12px !important; - font-style: italic; - } - } + .MuiListItemText-root { + margin: 0px; } - } + .MuiTypography-root { + font-size: 12px !important; + font-style: italic; + } + } + } + } } diff --git a/ProductivitySuite/ui/react/src/components/Header/Header.tsx b/ProductivitySuite/ui/react/src/components/Header/Header.tsx index f90f2a0608..f3931982cf 100644 --- a/ProductivitySuite/ui/react/src/components/Header/Header.tsx +++ b/ProductivitySuite/ui/react/src/components/Header/Header.tsx @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from "react"; -import { styled } from '@mui/material/styles'; -import { Link, useNavigate } from 'react-router-dom'; +import { styled } from "@mui/material/styles"; +import { Link, useNavigate } from "react-router-dom"; import config from "@root/config"; import styles from "./Header.module.scss"; @@ -8,178 +8,218 @@ import { Box, IconButton, Tooltip, Typography } from "@mui/material"; import { SideBar } from "@components/SideBar/SideBar"; import DropDown from "@components/DropDown/DropDown"; import ThemeToggle from "@components/Header_ThemeToggle/ThemeToggle"; -import ViewSidebarOutlinedIcon from '@mui/icons-material/ViewSidebarOutlined'; -import Create from '@mui/icons-material/Create'; -import Home from '@mui/icons-material/Home' -import ShareOutlinedIcon from '@mui/icons-material/ShareOutlined'; -import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; -import ChatBubbleIcon from '@icons/ChatBubble'; - -import { useAppDispatch, useAppSelector } from '@redux/store'; +import ViewSidebarOutlinedIcon from "@mui/icons-material/ViewSidebarOutlined"; +import Create from "@mui/icons-material/Create"; +import Home from "@mui/icons-material/Home"; +import ShareOutlinedIcon from "@mui/icons-material/ShareOutlined"; +import FileDownloadOutlinedIcon from "@mui/icons-material/FileDownloadOutlined"; +import ChatBubbleIcon from "@icons/ChatBubble"; + +import { useAppDispatch, useAppSelector } from "@redux/store"; import { userSelector } from "@redux/User/userSlice"; -import { Message, MessageRole, UseCase } from "@redux/Conversation/Conversation"; -import { conversationSelector, setUseCase } from "@redux/Conversation/ConversationSlice"; +import { + Message, + MessageRole, + UseCase, +} from "@redux/Conversation/Conversation"; +import { + conversationSelector, + setUseCase, +} from "@redux/Conversation/ConversationSlice"; import DownloadChat from "@components/Header_DownloadChat/DownloadChat"; interface HeaderProps { - asideOpen: boolean; - setAsideOpen: (open: boolean) => void; - chatView?: boolean; - historyView?: boolean; - dataView?: boolean; + asideOpen: boolean; + setAsideOpen: (open: boolean) => void; + chatView?: boolean; + historyView?: boolean; + dataView?: boolean; } interface AvailableUseCase { - name: string; - value: string; + name: string; + value: string; } const HeaderWrapper = styled(Box)(({ theme }) => ({ - ...theme.customStyles.header - })); - -const Header: React.FC = ({ asideOpen, setAsideOpen, chatView, historyView, dataView }) => { - - const { companyName } = config; - - const sideBarRef = useRef(null); - const toggleRef = useRef(null); - - const navigate = useNavigate(); - - const dispatch = useAppDispatch(); - const { role, name } = useAppSelector(userSelector) - const { selectedConversationHistory, type } = useAppSelector(conversationSelector) - - - const [currentTopic, setCurrentTopic] = useState('') - - - - - - useEffect(() => { - if(!selectedConversationHistory || selectedConversationHistory.length === 0) { - setCurrentTopic('') - return; - }; - const firstUserPrompt = selectedConversationHistory.find((message:Message) => message.role === MessageRole.User); - if (firstUserPrompt) setCurrentTopic(firstUserPrompt.content) - }, [selectedConversationHistory]) - - const handleChange = (value: string) => { - dispatch(setUseCase(value)) + ...theme.customStyles.header, +})); + +const Header: React.FC = ({ + asideOpen, + setAsideOpen, + chatView, + historyView, + dataView, +}) => { + const { companyName } = config; + + const sideBarRef = useRef(null); + const toggleRef = useRef(null); + + const navigate = useNavigate(); + + const dispatch = useAppDispatch(); + const { role, name } = useAppSelector(userSelector); + const { selectedConversationHistory, type } = + useAppSelector(conversationSelector); + + const [currentTopic, setCurrentTopic] = useState(""); + + useEffect(() => { + if ( + !selectedConversationHistory || + selectedConversationHistory.length === 0 + ) { + setCurrentTopic(""); + return; } - - const newChat = () => { - navigate('/'); - setAsideOpen(false); - } - - const handleClickOutside = (event: MouseEvent) => { - if (sideBarRef.current && toggleRef.current - && !sideBarRef.current.contains(event.target as Node) - && !toggleRef.current.contains(event.target as Node)) { - setAsideOpen(false); - } - }; - - useEffect(() => { - if (asideOpen) { - document.addEventListener('mousedown', handleClickOutside); - return () => document.removeEventListener('mousedown', handleClickOutside);; - } - }, [asideOpen]) - - const userDetails = () => { - return ( - -
{name}
- -
- ) + const firstUserPrompt = selectedConversationHistory.find( + (message: Message) => message.role === MessageRole.User, + ); + if (firstUserPrompt) setCurrentTopic(firstUserPrompt.content); + }, [selectedConversationHistory]); + + const handleChange = (value: string) => { + dispatch(setUseCase(value)); + }; + + const newChat = () => { + navigate("/"); + setAsideOpen(false); + }; + + const handleClickOutside = (event: MouseEvent) => { + if ( + sideBarRef.current && + toggleRef.current && + !sideBarRef.current.contains(event.target as Node) && + !toggleRef.current.contains(event.target as Node) + ) { + setAsideOpen(false); } + }; - const getTitle = () => { - - if(historyView) return ( -   Your Chat History - ) - - if(dataView) return ( - Data Source Management - ) - - if(chatView){ - if((type !== 'chat') && !currentTopic){ - return ( - {type} - ) - } else { - return ( -   {currentTopic} - ) - } - } + useEffect(() => { + if (asideOpen) { + document.addEventListener("mousedown", handleClickOutside); + return () => + document.removeEventListener("mousedown", handleClickOutside); } + }, [asideOpen]); + const userDetails = () => { return ( - - - - - - setAsideOpen(!asideOpen)}> - - - - - {/* New Chat */} - - - - - - - - - - - - - - -
{companyName}
- - {getTitle()} - - - - {chatView && ( - <> - {/* + +
{name}
+
+ ); + }; + + const getTitle = () => { + if (historyView) + return ( + + +   Your Chat History + + ); + + if (dataView) + return ( + + Data Source Management + + ); + + if (chatView) { + if (type !== "chat" && !currentTopic) { + return ( + + {type} + + ); + } else { + return ( + + + +   {currentTopic} + + + ); + } + } + }; + + return ( + + + + setAsideOpen(!asideOpen)}> + + + + + {/* New Chat */} + + + + + + + + + + + + + +
+ {companyName} +
+ + {getTitle()} + + + {chatView && ( + <> + {/* */} - - - - )} - - {/* {chatView && { }}>} */} - + + + )} - {userDetails()} + {/* {chatView && { }}>} */} - -
+ + + -
- ); + {userDetails()} +
+
+
+ ); }; -export default Header; \ No newline at end of file +export default Header; diff --git a/ProductivitySuite/ui/react/src/components/Header_DownloadChat/DownloadChat.tsx b/ProductivitySuite/ui/react/src/components/Header_DownloadChat/DownloadChat.tsx index 382c959984..0ed8a8c121 100644 --- a/ProductivitySuite/ui/react/src/components/Header_DownloadChat/DownloadChat.tsx +++ b/ProductivitySuite/ui/react/src/components/Header_DownloadChat/DownloadChat.tsx @@ -1,66 +1,74 @@ -import { FileDownloadOutlined } from "@mui/icons-material" -import { IconButton, Tooltip } from "@mui/material" -import { conversationSelector } from "@redux/Conversation/ConversationSlice" -import { useAppSelector } from "@redux/store" -import { useEffect, useState } from "react" -import { Link } from "react-router-dom" +import { FileDownloadOutlined } from "@mui/icons-material"; +import { IconButton, Tooltip } from "@mui/material"; +import { conversationSelector } from "@redux/Conversation/ConversationSlice"; +import { useAppSelector } from "@redux/store"; +import { useEffect, useState } from "react"; +import { Link } from "react-router-dom"; const DownloadChat = () => { + const { selectedConversationHistory, type, model, token, temperature } = + useAppSelector(conversationSelector); + const [url, setUrl] = useState(undefined); + const [fileName, setFileName] = useState(""); - const {selectedConversationHistory, type, model, token, temperature} = useAppSelector(conversationSelector) - const [url, setUrl] = useState(undefined); - const [fileName, setFileName] = useState(''); + const safeBtoa = (str: string) => { + const encoder = new TextEncoder(); + const uint8Array = encoder.encode(str); + let binaryString = ""; + for (let i = 0; i < uint8Array.length; i++) { + binaryString += String.fromCharCode(uint8Array[i]); + } + return btoa(binaryString); + }; - const safeBtoa = (str: string) => { - const encoder = new TextEncoder(); - const uint8Array = encoder.encode(str); - let binaryString = ""; - for (let i = 0; i < uint8Array.length; i++) { - binaryString += String.fromCharCode(uint8Array[i]); - } - return btoa(binaryString); - }; - - useEffect(()=>{ + useEffect(() => { + if (selectedConversationHistory.length === 0) return; - + //TODO: if we end up with a systemPrompt for code change this + const userPromptIndex = type === "code" ? 0 : 1; - if(selectedConversationHistory.length === 0) return; - - //TODO: if we end up with a systemPrompt for code change this - const userPromptIndex = type === 'code' ? 0 : 1; + const conversationObject = { + model, + token, + temperature, + messages: [...selectedConversationHistory], + type, + }; - const conversationObject = { - model, - token, - temperature, - messages: [...selectedConversationHistory], - type - } + const newUrl = `data:application/json;charset=utf-8;base64,${safeBtoa(JSON.stringify(conversationObject))}`; - const newUrl = `data:application/json;charset=utf-8;base64,${safeBtoa(JSON.stringify(conversationObject))}`; + if ( + selectedConversationHistory && + selectedConversationHistory.length > 0 && + selectedConversationHistory[userPromptIndex] + ) { + const firstPrompt = selectedConversationHistory[userPromptIndex].content; // Assuming content is a string + if (firstPrompt) { + const newFileName = firstPrompt.split(" ").slice(0, 4).join("_"); + setUrl(newUrl); + setFileName(newFileName.toLowerCase()); + } + } + }, [selectedConversationHistory]); - if(selectedConversationHistory && selectedConversationHistory.length > 0 && selectedConversationHistory[userPromptIndex]){ - const firstPrompt = selectedConversationHistory[userPromptIndex].content; // Assuming content is a string - if(firstPrompt){ - const newFileName = firstPrompt.split(' ').slice(0, 4).join('_'); - setUrl(newUrl); - setFileName(newFileName.toLowerCase()) - } - } - - },[selectedConversationHistory]) - - //TODO: only support download for chat for now - return url && type === 'chat' && ( - - - - - - - + //TODO: only support download for chat for now + return ( + url && + type === "chat" && ( + + + + + + + ) -} + ); +}; -export default DownloadChat \ No newline at end of file +export default DownloadChat; diff --git a/ProductivitySuite/ui/react/src/components/Header_ThemeToggle/ThemeToggle.module.scss b/ProductivitySuite/ui/react/src/components/Header_ThemeToggle/ThemeToggle.module.scss index 67aa4904a8..1d69292d92 100644 --- a/ProductivitySuite/ui/react/src/components/Header_ThemeToggle/ThemeToggle.module.scss +++ b/ProductivitySuite/ui/react/src/components/Header_ThemeToggle/ThemeToggle.module.scss @@ -1,72 +1,65 @@ -.toggleWrapper{ - position: relative; - margin-right: 10px; - display: flex; - align-items: center; +.toggleWrapper { + position: relative; + margin-right: 10px; + display: flex; + align-items: center; - .toggle{ - width: 100px; - height: 34px; - padding: 7px; - - } - - .copy{ - position: absolute; - z-index: 99; - margin: 0 26px; - font-size: 14px - } + .toggle { + width: 100px; + height: 34px; + padding: 7px; + } - :global { + .copy { + position: absolute; + z-index: 99; + margin: 0 26px; + font-size: 14px; + } - .MuiSwitch-switchBase { - margin: 1px; - padding: 0; - transform: translateX(6px); - transition: transform .3s; + :global { + .MuiSwitch-switchBase { + margin: 1px; + padding: 0; + transform: translateX(6px); + transition: transform 0.3s; - &.Mui-checked { - color: #fff; - transform: translateX(62px); + &.Mui-checked { + color: #fff; + transform: translateX(62px); - .MuiSwitch-track { - opacity: 1; - } - - } - } - - .MuiSwitch-track{ - opacity: 1; - height: 30px; - border-radius: 30px; - margin-top: -5px; - background-color: transparent !important; + .MuiSwitch-track { + opacity: 1; } + } + } - .MuiSwitch-thumb { - // background-color: transparent !important; - width: 26px; - height: 26px; - position: relative; - margin-top: 3px; - margin-left: 2px; - box-shadow: none; - &::before { - content: ""; - position: absolute; - width: 100%; - height: 100%; - left: 0; - top: 0; - background-repeat: no-repeat; - background-position: center; - } + .MuiSwitch-track { + opacity: 1; + height: 30px; + border-radius: 30px; + margin-top: -5px; + background-color: transparent !important; + } - } + .MuiSwitch-thumb { + // background-color: transparent !important; + width: 26px; + height: 26px; + position: relative; + margin-top: 3px; + margin-left: 2px; + box-shadow: none; + &::before { + content: ""; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + background-repeat: no-repeat; + background-position: center; + } } + } } - - - diff --git a/ProductivitySuite/ui/react/src/components/Header_ThemeToggle/ThemeToggle.tsx b/ProductivitySuite/ui/react/src/components/Header_ThemeToggle/ThemeToggle.tsx index faebd24acf..69987702f0 100644 --- a/ProductivitySuite/ui/react/src/components/Header_ThemeToggle/ThemeToggle.tsx +++ b/ProductivitySuite/ui/react/src/components/Header_ThemeToggle/ThemeToggle.tsx @@ -1,36 +1,48 @@ -import React, { useContext } from 'react'; -import { styled } from '@mui/material/styles'; -import { Switch, Typography, Box } from '@mui/material'; -import { ThemeContext } from '@contexts/ThemeContext'; -import styles from './ThemeToggle.module.scss'; - +import React, { useContext } from "react"; +import { styled } from "@mui/material/styles"; +import { Switch, Typography, Box } from "@mui/material"; +import { ThemeContext } from "@contexts/ThemeContext"; +import styles from "./ThemeToggle.module.scss"; const MaterialUISwitch = styled(Switch)(({ theme }) => ({ - ...theme.customStyles.themeToggle + ...theme.customStyles.themeToggle, })); const ThemeToggle: React.FC = () => { - - const { darkMode, toggleTheme } = useContext(ThemeContext); - const [checked, setChecked] = React.useState(darkMode); - - const handleChange = (event: React.ChangeEvent) => { - setChecked(event.target.checked); - toggleTheme(); - }; - - const handleKeyDown = (event: React.KeyboardEvent) => { - if (event.key === 'Enter' || event.key === ' ') { - handleChange({ target: { checked: !checked } } as React.ChangeEvent); - } - }; - - return ( - - {checked ? 'Dark' : 'Light'} - - - ); -} + const { darkMode, toggleTheme } = useContext(ThemeContext); + const [checked, setChecked] = React.useState(darkMode); + + const handleChange = (event: React.ChangeEvent) => { + setChecked(event.target.checked); + toggleTheme(); + }; + + const handleKeyDown = (event: React.KeyboardEvent) => { + if (event.key === "Enter" || event.key === " ") { + handleChange({ + target: { checked: !checked }, + } as React.ChangeEvent); + } + }; + + return ( + + + {checked ? "Dark" : "Light"} + + + + ); +}; export default ThemeToggle; diff --git a/ProductivitySuite/ui/react/src/components/Notification/Notification.tsx b/ProductivitySuite/ui/react/src/components/Notification/Notification.tsx index ffb10fc23d..f3948c52f9 100644 --- a/ProductivitySuite/ui/react/src/components/Notification/Notification.tsx +++ b/ProductivitySuite/ui/react/src/components/Notification/Notification.tsx @@ -1,132 +1,144 @@ - import { AlertColor, IconButton, styled } from "@mui/material"; -import { SnackbarProvider, useSnackbar, MaterialDesignContent, closeSnackbar } from "notistack"; +import { + SnackbarProvider, + useSnackbar, + MaterialDesignContent, + closeSnackbar, +} from "notistack"; import { useEffect } from "react"; import { Subject } from "rxjs"; -import {TaskAlt, WarningAmberOutlined, ErrorOutlineOutlined, InfoOutlined, Close} from '@mui/icons-material'; +import { + TaskAlt, + WarningAmberOutlined, + ErrorOutlineOutlined, + InfoOutlined, + Close, +} from "@mui/icons-material"; interface NotificationDataProps { - message: string; - variant: AlertColor; + message: string; + variant: AlertColor; } type NotificationSeverity = "error" | "info" | "success" | "warning"; export const NotificationSeverity = { - SUCCESS: "success" as NotificationSeverity, - ERROR: "error" as NotificationSeverity, - WARNING: "warning" as NotificationSeverity, - INFO: "info" as NotificationSeverity, + SUCCESS: "success" as NotificationSeverity, + ERROR: "error" as NotificationSeverity, + WARNING: "warning" as NotificationSeverity, + INFO: "info" as NotificationSeverity, }; const severityColor = (variant: string) => { - switch (variant) { - case "success": - return "#388e3c"; - case "error": - return "#d32f2f"; - case "warning": - return "#f57c00"; - case "info": - return "#0288d1"; - default: - return "rgba(0, 0, 0, 0.87)"; - } + switch (variant) { + case "success": + return "#388e3c"; + case "error": + return "#d32f2f"; + case "warning": + return "#f57c00"; + case "info": + return "#0288d1"; + default: + return "rgba(0, 0, 0, 0.87)"; + } }; -const StyledMaterialDesignContent = styled(MaterialDesignContent)<{ severity: AlertColor }>(({ variant }) => ({ - backgroundColor: (() => { - switch (variant) { - case "success": - return "rgb(225,238,226)"; - case "error": - return "rgb(248,224,224)"; - case "warning": - return "rgb(254,235,217)"; - case "info": - return "rgb(217,237,248)"; - default: - return "rgb(225,238,226)"; - } - })(), - border: `1px solid ${severityColor(variant)}`, - color: severityColor(variant), - ".MuiAlert-action": { - paddingTop: 0, - scale: 0.8, - borderLeft: `1px solid ${severityColor(variant)}`, - marginLeft: "1rem", - }, - "svg": { - marginRight: '1rem' - }, - "button svg": { - marginRight: '0', - "path": { - fill: severityColor(variant), - } +const StyledMaterialDesignContent = styled(MaterialDesignContent)<{ + severity: AlertColor; +}>(({ variant }) => ({ + backgroundColor: (() => { + switch (variant) { + case "success": + return "rgb(225,238,226)"; + case "error": + return "rgb(248,224,224)"; + case "warning": + return "rgb(254,235,217)"; + case "info": + return "rgb(217,237,248)"; + default: + return "rgb(225,238,226)"; } + })(), + border: `1px solid ${severityColor(variant)}`, + color: severityColor(variant), + ".MuiAlert-action": { + paddingTop: 0, + scale: 0.8, + borderLeft: `1px solid ${severityColor(variant)}`, + marginLeft: "1rem", + }, + svg: { + marginRight: "1rem", + }, + "button svg": { + marginRight: "0", + path: { + fill: severityColor(variant), + }, + }, })); const CloseIcon = styled(IconButton)(() => ({ - minWidth: 'unset' -})) + minWidth: "unset", +})); const Notify = new Subject(); export const notify = (message: string, variant: AlertColor) => { - if (!variant) variant = NotificationSeverity.SUCCESS; - Notify.next({ message, variant }); + if (!variant) variant = NotificationSeverity.SUCCESS; + Notify.next({ message, variant }); }; const NotificationComponent = () => { - - const { enqueueSnackbar } = useSnackbar(); - - useEffect(() => { - - const subscription = Notify.subscribe({ - next: (notification) => { - enqueueSnackbar(notification.message, { - variant: notification.variant, - action: (key) => ( - closeSnackbar(key)} variant={notification.variant}> - ) - }); - } + const { enqueueSnackbar } = useSnackbar(); + + useEffect(() => { + const subscription = Notify.subscribe({ + next: (notification) => { + enqueueSnackbar(notification.message, { + variant: notification.variant, + action: (key) => ( + closeSnackbar(key)} + variant={notification.variant} + > + + + ), }); + }, + }); - return () => subscription.unsubscribe(); - - }, []); + return () => subscription.unsubscribe(); + }, []); - return <> - -} + return <>; +}; const Notification = () => { - - - return ( - , - warning: , - error: , - info: - }} - Components={{ - success: StyledMaterialDesignContent, - warning: StyledMaterialDesignContent, - error: StyledMaterialDesignContent, - info: StyledMaterialDesignContent - }}> - - - ); + return ( + , + warning: , + error: , + info: , + }} + Components={{ + success: StyledMaterialDesignContent, + warning: StyledMaterialDesignContent, + error: StyledMaterialDesignContent, + info: StyledMaterialDesignContent, + }} + > + + + ); }; export default Notification; diff --git a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss index f47c8410e3..79ef3c3f03 100644 --- a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss +++ b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss @@ -1,46 +1,46 @@ -.inputWrapper{ - position: relative; +.inputWrapper { + position: relative; } -.primaryInput{ +.primaryInput { + border-radius: var(--input-radius); + overflow: hidden; + position: relative; + display: flex; - border-radius: var(--input-radius); - overflow: hidden; - position: relative; + .inputActions { display: flex; - - .inputActions{ - display: flex; - flex-direction: row; - align-items: center; - position: absolute; - right: 10px; - bottom: 10px; + flex-direction: row; + align-items: center; + position: absolute; + right: 10px; + bottom: 10px; + } + + .circleButton { + border-radius: 40px; + width: 40px; + height: 40px; + min-width: 40px; + margin-left: 10px; + } + + .textAreaAuto { + font-family: "Inter", serif; + padding: var(--header-gutter) 100px var(--header-gutter) + var(--header-gutter); + border: 0; + width: 100%; + resize: none; + background-color: transparent; + + &:focus { + outline: none; } - .circleButton{ - border-radius: 40px; - width: 40px; - height: 40px; - min-width: 40px; - margin-left: 10px; + &.summaryInput { + padding: var(--header-gutter) 70px var(--header-gutter) + var(--header-gutter); } - - .textAreaAuto{ - font-family: "Inter", serif; - padding: var(--header-gutter) 100px var(--header-gutter) var(--header-gutter); - border: 0; - width: 100%; - resize: none; - background-color: transparent; - - &:focus{ - outline: none; - } - - &.summaryInput{ - padding: var(--header-gutter) 70px var(--header-gutter) var(--header-gutter); - } - } - -} \ No newline at end of file + } +} diff --git a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.tsx b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.tsx index 3ac0f13854..4e05045edb 100644 --- a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.tsx +++ b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.tsx @@ -1,168 +1,197 @@ -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useRef, useState } from "react"; import { Box, Button, styled, TextareaAutosize } from "@mui/material"; -import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; -import styles from './PrimaryInput.module.scss'; +import ArrowUpwardIcon from "@mui/icons-material/ArrowUpward"; +import styles from "./PrimaryInput.module.scss"; import { Stop } from "@mui/icons-material"; -import { useAppDispatch, useAppSelector } from '@redux/store'; -import { abortStream, conversationSelector, saveConversationtoDatabase, setSourceFiles, setSourceLinks } from '@redux/Conversation/ConversationSlice'; -import AudioInput from '@components/PrimaryInput_AudioInput/AudioInput'; -import PromptSelector from '@components/PrimparyInput_PromptSelector/PromptSelector'; -import { NotificationSeverity, notify } from '@components/Notification/Notification'; +import { useAppDispatch, useAppSelector } from "@redux/store"; +import { + abortStream, + conversationSelector, + saveConversationtoDatabase, + setSourceFiles, + setSourceLinks, +} from "@redux/Conversation/ConversationSlice"; +import AudioInput from "@components/PrimaryInput_AudioInput/AudioInput"; +import PromptSelector from "@components/PrimparyInput_PromptSelector/PromptSelector"; +import { + NotificationSeverity, + notify, +} from "@components/Notification/Notification"; const InputWrapper = styled(Box)(({ theme }) => ({ - ...theme.customStyles.primaryInput.inputWrapper + ...theme.customStyles.primaryInput.inputWrapper, })); const TextInput = styled(TextareaAutosize)(({ theme }) => ({ - ...theme.customStyles.primaryInput.textInput + ...theme.customStyles.primaryInput.textInput, })); const CircleButton = styled(Button)(({ theme }) => ({ - ...theme.customStyles.primaryInput.circleButton + ...theme.customStyles.primaryInput.circleButton, })); interface PrimaryInputProps { - onSend: (messageContent: string) => Promise; - type?: string - home?: boolean + onSend: (messageContent: string) => Promise; + type?: string; + home?: boolean; } -const PrimaryInput: React.FC = ({ onSend, home = false }) => { - - const { onGoingResult, type, selectedConversationId, sourceLinks, sourceFiles } = useAppSelector(conversationSelector); - const dispatch = useAppDispatch(); - - const [promptText, setPromptText] = useState(""); - const clearText = useRef(true) - - const isSummary = type === 'summary'; - const isFaq = type === 'faq'; - - useEffect(() => { - if(clearText.current) setPromptText(''); - clearText.current = true; - }, [type, sourceFiles, sourceLinks]) - - const handleSubmit = () => { - - if ((isSummary || isFaq) - && ((sourceLinks && sourceLinks.length === 0) - && (sourceFiles && sourceFiles.length === 0) - && promptText === '') - ){ - notify('Please provide content process', NotificationSeverity.ERROR) - return; - } else if(!(isSummary || isFaq) && promptText === '') { - notify('Please provide a message', NotificationSeverity.ERROR) - return; - } - - let textToSend = promptText; - onSend(textToSend); - setPromptText(''); - +const PrimaryInput: React.FC = ({ + onSend, + home = false, +}) => { + const { + onGoingResult, + type, + selectedConversationId, + sourceLinks, + sourceFiles, + } = useAppSelector(conversationSelector); + const dispatch = useAppDispatch(); + + const [promptText, setPromptText] = useState(""); + const clearText = useRef(true); + + const isSummary = type === "summary"; + const isFaq = type === "faq"; + + useEffect(() => { + if (clearText.current) setPromptText(""); + clearText.current = true; + }, [type, sourceFiles, sourceLinks]); + + const handleSubmit = () => { + if ( + (isSummary || isFaq) && + sourceLinks && + sourceLinks.length === 0 && + sourceFiles && + sourceFiles.length === 0 && + promptText === "" + ) { + notify("Please provide content process", NotificationSeverity.ERROR); + return; + } else if (!(isSummary || isFaq) && promptText === "") { + notify("Please provide a message", NotificationSeverity.ERROR); + return; } - const handleKeyDown = (event: KeyboardEvent) => { - if (!event.shiftKey && event.key === 'Enter') { - handleSubmit(); - } - } + let textToSend = promptText; + onSend(textToSend); + setPromptText(""); + }; - const updatePromptText = (value:string) => { - - setPromptText(value) - if(sourceFiles.length > 0) { - clearText.current = false; - dispatch(setSourceFiles([])); - } - if(sourceLinks.length > 0) { - clearText.current = false; - dispatch(setSourceLinks([])); - } - - + const handleKeyDown = (event: KeyboardEvent) => { + if (!event.shiftKey && event.key === "Enter") { + handleSubmit(); } + }; - - const cancelStream = () => { - dispatch(abortStream()) - if(type === 'chat'){ - dispatch(saveConversationtoDatabase({conversation: {id:selectedConversationId}})) - } - + const updatePromptText = (value: string) => { + setPromptText(value); + if (sourceFiles.length > 0) { + clearText.current = false; + dispatch(setSourceFiles([])); } - - const isActive = () => { - if((isSummary || isFaq) && sourceFiles.length > 0){ - return true - } else if(promptText !== '') return true; - return false; + if (sourceLinks.length > 0) { + clearText.current = false; + dispatch(setSourceLinks([])); } - - const submitButton = () => { - if(!onGoingResult) { - return ( - - ) - } return; - + }; + + const cancelStream = () => { + dispatch(abortStream()); + if (type === "chat") { + dispatch( + saveConversationtoDatabase({ + conversation: { id: selectedConversationId }, + }), + ); } - - const placeHolderCopy = () => { - if(home && (isSummary || isFaq)) return "Enter text here or sources below" - else return "Enter your message" - } - - const renderInput = () => { - if(!home && onGoingResult && (isSummary || isFaq)){ - return ( - - - - ) - } else if((!home && !isSummary && !isFaq) || home) { - return ( - - - - - ) => updatePromptText(e.target.value)} - onKeyDown={handleKeyDown} - sx={{ - resize: 'none', - backgroundColor: 'transparent', - }} /> - - - - - - {onGoingResult && } - - {submitButton()} - - - - - - {home && !isSummary && !isFaq && ( - - )} - - - ) - } - + }; + + const isActive = () => { + if ((isSummary || isFaq) && sourceFiles.length > 0) { + return true; + } else if (promptText !== "") return true; + return false; + }; + + const submitButton = () => { + if (!onGoingResult) { + return ( + + + + ); + } + return; + }; + + const placeHolderCopy = () => { + if (home && (isSummary || isFaq)) return "Enter text here or sources below"; + else return "Enter your message"; + }; + + const renderInput = () => { + if (!home && onGoingResult && (isSummary || isFaq)) { + return ( + + + + + + ); + } else if ((!home && !isSummary && !isFaq) || home) { + return ( + + + ) => + updatePromptText(e.target.value) + } + onKeyDown={handleKeyDown} + sx={{ + resize: "none", + backgroundColor: "transparent", + }} + /> + + + + + {onGoingResult && ( + + + + )} + + {submitButton()} + + + + {home && !isSummary && !isFaq && ( + + )} + + ); } + }; - return renderInput() + return renderInput(); }; -export default PrimaryInput; \ No newline at end of file +export default PrimaryInput; diff --git a/ProductivitySuite/ui/react/src/components/PrimaryInput_AudioInput/AudioInput.tsx b/ProductivitySuite/ui/react/src/components/PrimaryInput_AudioInput/AudioInput.tsx index a53ca133fe..d304ebd38d 100644 --- a/ProductivitySuite/ui/react/src/components/PrimaryInput_AudioInput/AudioInput.tsx +++ b/ProductivitySuite/ui/react/src/components/PrimaryInput_AudioInput/AudioInput.tsx @@ -1,79 +1,85 @@ import { Mic } from "@mui/icons-material"; import { Button, styled, Tooltip } from "@mui/material"; import { useState } from "react"; -import styles from '@components/PrimaryInput/PrimaryInput.module.scss' -import { NotificationSeverity, notify } from "@components/Notification/Notification"; +import styles from "@components/PrimaryInput/PrimaryInput.module.scss"; +import { + NotificationSeverity, + notify, +} from "@components/Notification/Notification"; import { useAppSelector } from "@redux/store"; import { conversationSelector } from "@redux/Conversation/ConversationSlice"; import ProgressIcon from "@components/ProgressIcon/ProgressIcon"; interface AudioInputProps { - setSearchText: (value: string) => void; + setSearchText: (value: string) => void; } const AudioButton = styled(Button)(({ theme }) => ({ - ...theme.customStyles.audioEditButton + ...theme.customStyles.audioEditButton, })); const AudioInput: React.FC = ({ setSearchText }) => { - - const isSpeechRecognitionSupported = ("webkitSpeechRecognition" in window || "SpeechRecognition" in window) && window.isSecureContext; - - const { type } = useAppSelector(conversationSelector) - const [isListening, setIsListening] = useState(false); - - const handleMicClick = () => { - - const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition; - const recognition = new SpeechRecognition(); - recognition.lang = 'en-US'; // Set language for recognition - recognition.interimResults = false; // Only process final results - - if (!isListening) { - - setIsListening(true); - recognition.start(); - - recognition.onresult = (event: SpeechRecognitionEvent) => { - const transcript = event.results[0][0].transcript; - setSearchText(transcript); // Update search text with recognized speech - setIsListening(false); - }; - - recognition.onerror = (event: SpeechRecognitionErrorEvent) => { - notify(`Speech recognition error:${event.error}`, NotificationSeverity.ERROR); - console.error('Speech recognition error:', event); - setIsListening(false); - }; - - recognition.onend = () => { - setIsListening(false); - }; - } else { - recognition.stop(); - setIsListening(false); - } - }; - - - const renderMic = () => { - - if (type === 'summary' || type === 'faq' || !isSpeechRecognitionSupported) return <>; - - if (isListening) { - return - } else { - return ( - - - - - - ) - } + const isSpeechRecognitionSupported = + ("webkitSpeechRecognition" in window || "SpeechRecognition" in window) && + window.isSecureContext; + + const { type } = useAppSelector(conversationSelector); + const [isListening, setIsListening] = useState(false); + + const handleMicClick = () => { + const SpeechRecognition = + (window as any).SpeechRecognition || + (window as any).webkitSpeechRecognition; + const recognition = new SpeechRecognition(); + recognition.lang = "en-US"; // Set language for recognition + recognition.interimResults = false; // Only process final results + + if (!isListening) { + setIsListening(true); + recognition.start(); + + recognition.onresult = (event: SpeechRecognitionEvent) => { + const transcript = event.results[0][0].transcript; + setSearchText(transcript); // Update search text with recognized speech + setIsListening(false); + }; + + recognition.onerror = (event: SpeechRecognitionErrorEvent) => { + notify( + `Speech recognition error:${event.error}`, + NotificationSeverity.ERROR, + ); + console.error("Speech recognition error:", event); + setIsListening(false); + }; + + recognition.onend = () => { + setIsListening(false); + }; + } else { + recognition.stop(); + setIsListening(false); + } + }; + + const renderMic = () => { + if (type === "summary" || type === "faq" || !isSpeechRecognitionSupported) + return <>; + + if (isListening) { + return ; + } else { + return ( + + + + + + ); } + }; - return renderMic() -} + return renderMic(); +}; -export default AudioInput \ No newline at end of file +export default AudioInput; diff --git a/ProductivitySuite/ui/react/src/components/PrimparyInput_PromptSelector/PromptSelector.module.scss b/ProductivitySuite/ui/react/src/components/PrimparyInput_PromptSelector/PromptSelector.module.scss index 0effcf5369..e90edb4a55 100644 --- a/ProductivitySuite/ui/react/src/components/PrimparyInput_PromptSelector/PromptSelector.module.scss +++ b/ProductivitySuite/ui/react/src/components/PrimparyInput_PromptSelector/PromptSelector.module.scss @@ -1,89 +1,87 @@ -.promptsWrapper{ - position: absolute; +.promptsWrapper { + position: absolute; - z-index: 99; - width: 100%; - padding: 0 40px; + z-index: 99; + width: 100%; + padding: 0 40px; - .expand{ - width: 25px; - height: 25px; - border-radius: 25px; - min-width: unset; - border-width: 1px; - border-style: solid; - transform: rotate(180deg); - transition: transform 0.5s; - margin-top: -20px; - position: relative; - z-index: 9999; - - &.open{ - transform: rotate(0deg); - } + .expand { + width: 25px; + height: 25px; + border-radius: 25px; + min-width: unset; + border-width: 1px; + border-style: solid; + transform: rotate(180deg); + transition: transform 0.5s; + margin-top: -20px; + position: relative; + z-index: 9999; + + &.open { + transform: rotate(0deg); } + } } -.promptText{ - color: var(--copy-color) !important +.promptText { + color: var(--copy-color) !important; } +.promptsListWrapper { + margin-top: -23px; + max-height: 0px; + transition: max-height 0.5s; + overflow: hidden; + // background: #fff; + width: 100%; + z-index: 999; + &.open { + max-height: 250px; + overflow-y: auto; + } -.promptsListWrapper{ - margin-top: -23px; - max-height: 0px; - transition: max-height .5s; - overflow: hidden; - // background: #fff; - width: 100%; - z-index: 999; + ul { + padding: 0; + } - &.open{ - max-height: 250px; - overflow-y: auto; - } + li { + border-bottom: 1px solid; + padding: 0; + justify-content: space-between; - ul{ - padding: 0; + button { + padding: 1rem; + width: 100%; + justify-content: flex-start; + text-align: left; + border-radius: 0px; + box-shadow: none; } - li{ - border-bottom: 1px solid; - padding: 0; - justify-content: space-between; + &:first-of-type button { + padding-top: 1.2rem; - button{ - padding: 1rem; - width: 100%; - justify-content: flex-start; - text-align: left; - border-radius: 0px; - box-shadow: none; - } + span { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; // Limits to 2 lines + overflow: hidden; + text-overflow: ellipsis; + } + } - &:first-of-type button{ - padding-top: 1.2rem; - - span { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; // Limits to 2 lines - overflow: hidden; - text-overflow: ellipsis; - } - } + .delete { + width: 40px; + height: 40px; + border-radius: 40px; + margin: 0 0.5rem; + justify-content: center; - .delete{ - width: 40px; - height: 40px; - border-radius: 40px; - margin: 0 0.5rem; - justify-content: center; - - path{ - fill: #cc0000; - } - } + path { + fill: #cc0000; + } } -} \ No newline at end of file + } +} diff --git a/ProductivitySuite/ui/react/src/components/PrimparyInput_PromptSelector/PromptSelector.tsx b/ProductivitySuite/ui/react/src/components/PrimparyInput_PromptSelector/PromptSelector.tsx index d213a94554..00d58c5b37 100644 --- a/ProductivitySuite/ui/react/src/components/PrimparyInput_PromptSelector/PromptSelector.tsx +++ b/ProductivitySuite/ui/react/src/components/PrimparyInput_PromptSelector/PromptSelector.tsx @@ -1,92 +1,113 @@ -import { Box, Button, IconButton, List, ListItem, styled, Tooltip } from "@mui/material"; -import { deletePrompt, promptSelector } from "@redux/Prompt/PromptSlice" -import { useAppDispatch, useAppSelector } from "@redux/store" +import { + Box, + Button, + IconButton, + List, + ListItem, + styled, + Tooltip, +} from "@mui/material"; +import { deletePrompt, promptSelector } from "@redux/Prompt/PromptSlice"; +import { useAppDispatch, useAppSelector } from "@redux/store"; import { useEffect, useRef, useState } from "react"; -import {Delete, ExpandMore} from '@mui/icons-material'; -import styles from './PromptSelector.module.scss'; +import { Delete, ExpandMore } from "@mui/icons-material"; +import styles from "./PromptSelector.module.scss"; const ExpandButton = styled(Button)(({ theme }) => ({ - ...theme.customStyles.promptExpandButton + ...theme.customStyles.promptExpandButton, })); const PromptButton = styled(Button)(({ theme }) => ({ - ...theme.customStyles.promptButton + ...theme.customStyles.promptButton, })); const PromptListWrapper = styled(Box)(({ theme }) => ({ - ...theme.customStyles.promptListWrapper + ...theme.customStyles.promptListWrapper, })); interface PromptSelectorProps { - setSearchText: (value: string)=>void + setSearchText: (value: string) => void; } -const PromptSelector: React.FC = ({setSearchText}) => { +const PromptSelector: React.FC = ({ setSearchText }) => { + const dispatch = useAppDispatch(); + const { prompts } = useAppSelector(promptSelector); + const [showPrompts, setShowPrompts] = useState(false); + const wrapperRef = useRef(null); - const dispatch = useAppDispatch() - const {prompts} = useAppSelector(promptSelector); - const [showPrompts, setShowPrompts] = useState(false) - const wrapperRef = useRef(null); + useEffect(() => { + if (!showPrompts) return; - useEffect(() => { - if (!showPrompts) return; - - const handleClickOutside = (event: MouseEvent) => { - if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) { - setShowPrompts(false) - } - }; - - document.addEventListener("mousedown", handleClickOutside); - - return () => { - document.removeEventListener("mousedown", handleClickOutside); - }; - }, [showPrompts,]); - - const handleDelete = (id: string, text: string) => { - dispatch(deletePrompt({promptId: id, promptText: text})) - } - - const handleSelect = (promptText: string) => { - setSearchText(promptText); + const handleClickOutside = (event: MouseEvent) => { + if ( + wrapperRef.current && + !wrapperRef.current.contains(event.target as Node) + ) { setShowPrompts(false); - } + } + }; + + document.addEventListener("mousedown", handleClickOutside); - return prompts && prompts.length > 0 && ( - + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, [showPrompts]); - - setShowPrompts(!showPrompts)}> - - - + const handleDelete = (id: string, text: string) => { + dispatch(deletePrompt({ promptId: id, promptText: text })); + }; - - - {prompts?.map((prompt, promptIndex)=>{ - return( - - handleSelect(prompt.prompt_text)}>{prompt.prompt_text} + const handleSelect = (promptText: string) => { + setSearchText(promptText); + setShowPrompts(false); + }; - - handleDelete(prompt.id, prompt.prompt_text)}> - - - + return ( + prompts && + prompts.length > 0 && ( + + + setShowPrompts(!showPrompts)} + > + + + - - ) - })} - - - + + + {prompts?.map((prompt, promptIndex) => { + return ( + + handleSelect(prompt.prompt_text)} + > + {prompt.prompt_text} + + + + + handleDelete(prompt.id, prompt.prompt_text) + } + > + + + + + ); + })} + + +
) -} + ); +}; -export default PromptSelector \ No newline at end of file +export default PromptSelector; diff --git a/ProductivitySuite/ui/react/src/components/ProgressIcon/ProgressIcon.tsx b/ProductivitySuite/ui/react/src/components/ProgressIcon/ProgressIcon.tsx index a24ee5d392..aa8d3ec122 100644 --- a/ProductivitySuite/ui/react/src/components/ProgressIcon/ProgressIcon.tsx +++ b/ProductivitySuite/ui/react/src/components/ProgressIcon/ProgressIcon.tsx @@ -1,13 +1,13 @@ import { CircularProgress, styled } from "@mui/material"; const ProgressIconStyle = styled(CircularProgress)(({ theme }) => ({ - 'svg circle': { - stroke: theme.customStyles.audioProgress?.stroke, - } + "svg circle": { + stroke: theme.customStyles.audioProgress?.stroke, + }, })); const ProgressIcon = () => { - return -} + return ; +}; -export default ProgressIcon; \ No newline at end of file +export default ProgressIcon; diff --git a/ProductivitySuite/ui/react/src/components/PromptSettings/PromptSettings.module.scss b/ProductivitySuite/ui/react/src/components/PromptSettings/PromptSettings.module.scss index d52c4c7642..748c8427ad 100644 --- a/ProductivitySuite/ui/react/src/components/PromptSettings/PromptSettings.module.scss +++ b/ProductivitySuite/ui/react/src/components/PromptSettings/PromptSettings.module.scss @@ -1,92 +1,76 @@ -.promptSettingsWrapper{ +.promptSettingsWrapper { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + max-width: 775px; + + .summarySource { width: 100%; display: flex; flex-direction: column; align-items: center; - max-width: 775px; + } + :global { + .MuiFormGroup-root { + margin-bottom: 0.75rem; - .summarySource { - width: 100%; - display: flex; - flex-direction: column; - align-items: center; - } - - :global { - - .MuiFormGroup-root{ - margin-bottom: .75rem; + label { + margin-left: 0; + } - label{ - margin-left: 0; - } - - &:not(:last-of-type){ - margin-right: 1.5rem; - } - - - } - - + &:not(:last-of-type) { + margin-right: 1.5rem; + } } + } } -.promptSettings{ - - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; - margin-top: calc(var(--vertical-spacer) / 2); - flex-wrap: wrap; - width: 100%; - - @media screen and (max-width: 900px){ - padding: 0 var(--content-gutter); +.promptSettings { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + margin-top: calc(var(--vertical-spacer) / 2); + flex-wrap: wrap; + width: 100%; + + @media screen and (max-width: 900px) { + padding: 0 var(--content-gutter); + } + + :global { + .MuiFormControlLabel-label, + .MuiTypography-root { + font-size: 13px; + font-weight: 400; } + } + + &.readOnly { + flex-direction: column; + align-items: flex-start; + padding: 0; + margin-top: 0; :global { - .MuiFormControlLabel-label, .MuiTypography-root { - font-size: 13px; - font-weight: 400; + .MuiFormGroup-root { + margin-bottom: 0; + margin-right: 0; + + label { + width: 100%; + align-items: flex-start; + margin: 0; } - } - - &.readOnly{ - flex-direction: column; - align-items: flex-start; - padding: 0; - margin-top: 0; - - :global { - - .MuiFormGroup-root{ - margin-bottom: 0; - margin-right: 0; - - label{ - width: 100%; - align-items: flex-start; - margin: 0; - } - } + } - @media screen and (max-width: 900px){ - - - - .MuiFormGroup-root:not(:last-of-type){ - margin-bottom: 0; - - } - } - + @media screen and (max-width: 900px) { + .MuiFormGroup-root:not(:last-of-type) { + margin-bottom: 0; } - + } } - - - -} \ No newline at end of file + } +} diff --git a/ProductivitySuite/ui/react/src/components/PromptSettings/PromptSettings.tsx b/ProductivitySuite/ui/react/src/components/PromptSettings/PromptSettings.tsx index ff1c16fa7e..9a16ecd3b5 100644 --- a/ProductivitySuite/ui/react/src/components/PromptSettings/PromptSettings.tsx +++ b/ProductivitySuite/ui/react/src/components/PromptSettings/PromptSettings.tsx @@ -3,177 +3,213 @@ import { useEffect, useState } from "react"; import DropDown from "@components/DropDown/DropDown"; import CustomSlider from "@components/PromptSettings_Slider/Slider"; import { Box, FormGroup, FormControlLabel } from "@mui/material"; -import styles from './PromptSettings.module.scss'; +import styles from "./PromptSettings.module.scss"; import TokensInput from "@components/PromptSettings_Tokens/TokensInput"; import FileInput from "@components/File_Input/FileInput"; import WebInput from "@components/Summary_WebInput/WebInput"; import { useAppDispatch, useAppSelector } from "@redux/store"; import { Model } from "@redux/Conversation/Conversation"; -import { conversationSelector, setModel, setSourceType, setTemperature, setToken } from "@redux/Conversation/ConversationSlice"; +import { + conversationSelector, + setModel, + setSourceType, + setTemperature, + setToken, +} from "@redux/Conversation/ConversationSlice"; interface AvailableModel { - name: string; - value: string; + name: string; + value: string; } interface PromptSettingsProps { - readOnly?: boolean; + readOnly?: boolean; } -const PromptSettings: React.FC = ({readOnly = false}) => { +const PromptSettings: React.FC = ({ + readOnly = false, +}) => { + const dispatch = useAppDispatch(); - const dispatch = useAppDispatch(); - - const {models, type, sourceType, model, token, maxToken, temperature} = useAppSelector(conversationSelector) + const { models, type, sourceType, model, token, maxToken, temperature } = + useAppSelector(conversationSelector); - const [tokenError, setTokenError] = useState(false); - - const filterAvailableModels = (): AvailableModel[] => { + const [tokenError, setTokenError] = useState(false); - if(!models || !type) return []; + const filterAvailableModels = (): AvailableModel[] => { + if (!models || !type) return []; - let typeModels: AvailableModel[] = []; + let typeModels: AvailableModel[] = []; - models.map((model: Model) => { - if(model.types.includes(type)){ - typeModels.push({ - name: model.displayName, - value: model.model_name - }) - } + models.map((model: Model) => { + if (model.types.includes(type)) { + typeModels.push({ + name: model.displayName, + value: model.model_name, }); + } + }); - return typeModels - } - - const [formattedModels, setFormattedModels] = useState(filterAvailableModels()) - - useEffect(()=>{ - setFormattedModels(filterAvailableModels()) - }, [type,models]) + return typeModels; + }; - useEffect(() => { - - if(!model) return; - setTokenError(token > maxToken); + const [formattedModels, setFormattedModels] = useState( + filterAvailableModels(), + ); - }, [model, token]); + useEffect(() => { + setFormattedModels(filterAvailableModels()); + }, [type, models]); + useEffect(() => { + if (!model) return; + setTokenError(token > maxToken); + }, [model, token]); - const updateTemperature = (value: number) => { - dispatch(setTemperature(Number(value))); - } - - const updateTokens = (value: number) => { - dispatch(setToken(Number(value))); - } + const updateTemperature = (value: number) => { + dispatch(setTemperature(Number(value))); + }; - const updateModel = (value: string) => { + const updateTokens = (value: number) => { + dispatch(setToken(Number(value))); + }; - const selectedModel = models.find((model: Model) => model.model_name === value); - if(selectedModel){ - dispatch(setModel(selectedModel)); - } - } - - const updateSource = (value: string) => { - dispatch(setSourceType(value)); + const updateModel = (value: string) => { + const selectedModel = models.find( + (model: Model) => model.model_name === value, + ); + if (selectedModel) { + dispatch(setModel(selectedModel)); } + }; - const cursorDisable = () => { - return readOnly ? {pointerEvents: 'none'} : {} - } + const updateSource = (value: string) => { + dispatch(setSourceType(value)); + }; - const displaySummarySource = () => { + const cursorDisable = () => { + return readOnly ? { pointerEvents: "none" } : {}; + }; - if((type !== 'summary' && type !== 'faq') || readOnly) return + const displaySummarySource = () => { + if ((type !== "summary" && type !== "faq") || readOnly) return; - let input = null; - if (sourceType === 'documents') input = ; - if (sourceType === 'web') input = ; - if (sourceType === 'images' && type === 'summary') input = ; + let input = null; + if (sourceType === "documents") input = ; + if (sourceType === "web") input = ; + if (sourceType === "images" && type === "summary") + input = ; - return ( -
{input}
- ) - } - - // in the off chance specific types do not use these, - // they have been pulled into their own function - const tokenAndTemp = () => { - return ( - <> - - - - - - } label={`Tokens${readOnly ? ': ' : ''}`} labelPlacement="start"/> - - - - } - label={`Temperature${readOnly ? ': ' : ''}`} - labelPlacement="start"/> - - - - ) - } - - const displaySettings = () => { - if(type === 'summary' || type === 'faq') { - - //TODO: Supporting only documents to start - return ( - <> - - - } label="Summary Source" labelPlacement="start"/> - - - - ) - - } else { - return <>;// tokenAndTemp() // see line 113, conditional option - } - } + return
{input}
; + }; + // in the off chance specific types do not use these, + // they have been pulled into their own function + const tokenAndTemp = () => { return ( - - - - - {formattedModels && formattedModels.length > 0 && ( - - } - label={`Model${readOnly ? ': ' : ''}`} - labelPlacement="start"/> - - )} - - {tokenAndTemp()} - - - - {/* TODO: Expand source options and show label with dropdown after expansion */} - {/* {displaySettings()} */} - - {displaySummarySource()} - - + <> + + + + + } + label={`Tokens${readOnly ? ": " : ""}`} + labelPlacement="start" + /> + + + + + } + label={`Temperature${readOnly ? ": " : ""}`} + labelPlacement="start" + /> + + ); + }; + + const displaySettings = () => { + if (type === "summary" || type === "faq") { + //TODO: Supporting only documents to start + return ( + <> + + + } + label="Summary Source" + labelPlacement="start" + /> + + + ); + } else { + return <>; // tokenAndTemp() // see line 113, conditional option + } + }; + + return ( + + + {formattedModels && formattedModels.length > 0 && ( + + + } + label={`Model${readOnly ? ": " : ""}`} + labelPlacement="start" + /> + + )} + + {tokenAndTemp()} + + + {/* TODO: Expand source options and show label with dropdown after expansion */} + {/* {displaySettings()} */} + + {displaySummarySource()} + + ); }; -export default PromptSettings; \ No newline at end of file +export default PromptSettings; diff --git a/ProductivitySuite/ui/react/src/components/PromptSettings_Slider/Slider.module.scss b/ProductivitySuite/ui/react/src/components/PromptSettings_Slider/Slider.module.scss index fc3185e18f..bdb124598f 100644 --- a/ProductivitySuite/ui/react/src/components/PromptSettings_Slider/Slider.module.scss +++ b/ProductivitySuite/ui/react/src/components/PromptSettings_Slider/Slider.module.scss @@ -1,90 +1,88 @@ -.sliderWrapper{ - flex-direction: row; - align-items: center; - width: 100%; - max-width: 320px; +.sliderWrapper { + flex-direction: row; + align-items: center; + width: 100%; + max-width: 320px; - flex-wrap: nowrap !important; - - font-size: 13px; - font-weight: 400; + flex-wrap: nowrap !important; + font-size: 13px; + font-weight: 400; - .start{ - margin-left: 0.5rem - } - - .trackWrapper{ - margin: 0 .5rem; - width: 100px; - display: flex; - } + .start { + margin-left: 0.5rem; + } - .styledSlider { - height: 2px; - width: 100%; - padding: 16px 0; - display: inline-flex; - align-items: center; - position: relative; - cursor: pointer; - touch-action: none; - -webkit-tap-highlight-color: transparent; - flex-wrap: nowrap; + .trackWrapper { + margin: 0 0.5rem; + width: 100px; + display: flex; + } - &.disabled { - pointer-events: none; - cursor: default; - opacity: 0.4; - } + .styledSlider { + height: 2px; + width: 100%; + padding: 16px 0; + display: inline-flex; + align-items: center; + position: relative; + cursor: pointer; + touch-action: none; + -webkit-tap-highlight-color: transparent; + flex-wrap: nowrap; + &.disabled { + pointer-events: none; + cursor: default; + opacity: 0.4; + } - :global { + :global { + .MuiSlider-rail { + display: block; + position: absolute; + width: 100%; + height: 2px; + border-radius: 2px; + opacity: 0.3; + } - .MuiSlider-rail{ - display: block; - position: absolute; - width: 100%; - height: 2px; - border-radius: 2px; - opacity: 0.3; - } + .MuiSlider-track { + display: block; + position: absolute; + height: 0px; + } - .MuiSlider-track{ - display: block; - position: absolute; - height: 0px; - } + .MuiSlider-thumb { + display: flex; + align-items: center; + justify-content: center; + position: absolute; + margin-left: -2px; + width: 10px; + height: 10px; + box-sizing: border-box; + border-radius: 50%; + outline: 0; + transition-property: box-shadow, transform; + transition-timing-function: ease; + transition-duration: 120ms; + transform-origin: center; - .MuiSlider-thumb{ - display: flex; - align-items: center; - justify-content: center; - position: absolute; - margin-left: -2px; - width: 10px; - height: 10px; - box-sizing: border-box; - border-radius: 50%; - outline: 0; - transition-property: box-shadow, transform; - transition-timing-function: ease; - transition-duration: 120ms; - transform-origin: center; + &:hover { + } - &:hover {} + &.focusVisible { + outline: none; + } - &.focusVisible { - outline: none; - } + &.active { + outline: none; + } - &.active { - outline: none; - } - - &.disabled {} - } + &.disabled { } - + } } -} \ No newline at end of file + } +} diff --git a/ProductivitySuite/ui/react/src/components/PromptSettings_Slider/Slider.tsx b/ProductivitySuite/ui/react/src/components/PromptSettings_Slider/Slider.tsx index 99e6236073..93bbd2442a 100644 --- a/ProductivitySuite/ui/react/src/components/PromptSettings_Slider/Slider.tsx +++ b/ProductivitySuite/ui/react/src/components/PromptSettings_Slider/Slider.tsx @@ -1,46 +1,49 @@ -import * as React from 'react'; -import { styled } from '@mui/material/styles'; -import { Slider, Grid2, Typography } from '@mui/material'; -import styles from './Slider.module.scss' +import * as React from "react"; +import { styled } from "@mui/material/styles"; +import { Slider, Grid2, Typography } from "@mui/material"; +import styles from "./Slider.module.scss"; const StyledSlider = styled(Slider)(({ theme }) => ({ - ...theme.customStyles.styledSlider -})) + ...theme.customStyles.styledSlider, +})); interface CustomSliderProps { - value: number; - handleChange: (value: number) => void; - readOnly?: boolean; + value: number; + handleChange: (value: number) => void; + readOnly?: boolean; } -const CustomSlider: React.FC = ({value, handleChange, readOnly}) => { - - if(readOnly){ - return {value}; - } +const CustomSlider: React.FC = ({ + value, + handleChange, + readOnly, +}) => { + if (readOnly) { + return {value}; + } - const handleSlideUpdate = (event: Event, value: number) => { - handleChange(value) - } + const handleSlideUpdate = (event: Event, value: number) => { + handleChange(value); + }; - return ( - - 0 - - - - 1 + return ( + + 0 + + - ); - } + 1 + + ); +}; - export default CustomSlider; \ No newline at end of file +export default CustomSlider; diff --git a/ProductivitySuite/ui/react/src/components/PromptSettings_Tokens/TokensInput.module.scss b/ProductivitySuite/ui/react/src/components/PromptSettings_Tokens/TokensInput.module.scss index e093860ee3..4d0f13d418 100644 --- a/ProductivitySuite/ui/react/src/components/PromptSettings_Tokens/TokensInput.module.scss +++ b/ProductivitySuite/ui/react/src/components/PromptSettings_Tokens/TokensInput.module.scss @@ -1,49 +1,49 @@ .numberInput { - + font-weight: 400; + display: flex; + flex-flow: row nowrap; + justify-content: center; + align-items: center; + + input { + font-size: 13px; + font-family: inherit; font-weight: 400; - display: flex; - flex-flow: row nowrap; - justify-content: center; - align-items: center; - - input{ - font-size: 13px; - font-family: inherit; - font-weight: 400; - line-height: 1.375; - border-radius: 8px; - margin: 0 8px 0 0; - padding: 3px 5px; - outline: 0; - min-width: 0; - width: 3.5rem; - text-align: center; - background: transparent; - - &:hover {} - - &:focus {} + line-height: 1.375; + border-radius: 8px; + margin: 0 8px 0 0; + padding: 3px 5px; + outline: 0; + min-width: 0; + width: 3.5rem; + text-align: center; + background: transparent; + + &:hover { + } - &:focus-visible { - outline: 0; - } + &:focus { + } - /* Chrome, Safari, Edge, Opera */ - &::-webkit-outer-spin-button, - &::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } + &:focus-visible { + outline: 0; + } - /* Firefox */ - &[type=number] { - -moz-appearance: textfield; - } + /* Chrome, Safari, Edge, Opera */ + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; } - .error, .error:focus{ - border: 1px solid #cc0000; + /* Firefox */ + &[type="number"] { + -moz-appearance: textfield; } - + } -} \ No newline at end of file + .error, + .error:focus { + border: 1px solid #cc0000; + } +} diff --git a/ProductivitySuite/ui/react/src/components/PromptSettings_Tokens/TokensInput.tsx b/ProductivitySuite/ui/react/src/components/PromptSettings_Tokens/TokensInput.tsx index 60eaed6c96..6b4bd216cd 100644 --- a/ProductivitySuite/ui/react/src/components/PromptSettings_Tokens/TokensInput.tsx +++ b/ProductivitySuite/ui/react/src/components/PromptSettings_Tokens/TokensInput.tsx @@ -1,8 +1,8 @@ -import * as React from 'react'; -import { styled } from '@mui/material/styles'; +import * as React from "react"; +import { styled } from "@mui/material/styles"; -import { Typography } from '@mui/material'; -import styles from './TokensInput.module.scss'; +import { Typography } from "@mui/material"; +import styles from "./TokensInput.module.scss"; interface NumberInputProps { value?: number; @@ -11,36 +11,36 @@ interface NumberInputProps { readOnly?: boolean; } -const StyledInput = styled('input')(({ theme }) => ({ +const StyledInput = styled("input")(({ theme }) => ({ ...theme.customStyles.tokensInput, })); -const TokensInput: React.FC = ({ value = 1, handleChange, error, readOnly }) => { - +const TokensInput: React.FC = ({ + value = 1, + handleChange, + error, + readOnly, +}) => { if (readOnly) { return {value}; } return (
- ) => handleChange(parseInt(e.target.value, 10))} + onChange={(e: React.ChangeEvent) => + handleChange(parseInt(e.target.value, 10)) + } aria-label="Quantity Input" /> -
); }; export default TokensInput; - - - - diff --git a/ProductivitySuite/ui/react/src/components/SearchInput/SearchInput.module.scss b/ProductivitySuite/ui/react/src/components/SearchInput/SearchInput.module.scss index be0c425350..33207e8883 100644 --- a/ProductivitySuite/ui/react/src/components/SearchInput/SearchInput.module.scss +++ b/ProductivitySuite/ui/react/src/components/SearchInput/SearchInput.module.scss @@ -1,18 +1,17 @@ -.searchInput{ - width: 100%; - margin-bottom: 1rem; - border-radius: var(--input-radius); - border: 0; - margin-bottom: 2rem; - - &:focus{ - outline: none; - } +.searchInput { + width: 100%; + margin-bottom: 1rem; + border-radius: var(--input-radius); + border: 0; + margin-bottom: 2rem; - :global { - .MuiInputBase-root{ - border-radius: var(--input-radius); - } - } + &:focus { + outline: none; + } -} \ No newline at end of file + :global { + .MuiInputBase-root { + border-radius: var(--input-radius); + } + } +} diff --git a/ProductivitySuite/ui/react/src/components/SearchInput/SearchInput.tsx b/ProductivitySuite/ui/react/src/components/SearchInput/SearchInput.tsx index a8c00d0f1a..49a11f6c40 100644 --- a/ProductivitySuite/ui/react/src/components/SearchInput/SearchInput.tsx +++ b/ProductivitySuite/ui/react/src/components/SearchInput/SearchInput.tsx @@ -1,58 +1,63 @@ import { InputAdornment, styled, TextField } from "@mui/material"; -import styles from './SearchInput.module.scss' +import styles from "./SearchInput.module.scss"; import { Close, Search } from "@mui/icons-material"; import { useRef, useState } from "react"; -const StyledSearchInput = styled(TextField)(({theme})=>({ - ...theme.customStyles.webInput +const StyledSearchInput = styled(TextField)(({ theme }) => ({ + ...theme.customStyles.webInput, })); interface SearchInputProps { - handleSearch: (value:string) => void + handleSearch: (value: string) => void; } -const SearchInput: React.FC = ({handleSearch}) => { +const SearchInput: React.FC = ({ handleSearch }) => { + const [hasValue, setHasValue] = useState(false); - const [hasValue, setHasValue] = useState(false) + const inputRef = useRef(null); - const inputRef = useRef(null); - - const clearSearch = () => { - if(inputRef.current){ - const input = inputRef.current.querySelector('input'); - if(input) input.value = ''; - } - handleSearch(''); - setHasValue(false); - } - - const search = (value: string) => { - handleSearch(value); - setHasValue(value !== '') + const clearSearch = () => { + if (inputRef.current) { + const input = inputRef.current.querySelector("input"); + if (input) input.value = ""; } - - return ( - ) => search(e.target.value)} - InputProps={{ - startAdornment: ( - - - - ), - endAdornment: hasValue && ( - - - - ) - }} - fullWidth - /> - ) -} - -export default SearchInput + handleSearch(""); + setHasValue(false); + }; + + const search = (value: string) => { + handleSearch(value); + setHasValue(value !== ""); + }; + + return ( + ) => + search(e.target.value) + } + InputProps={{ + startAdornment: ( + + + + ), + endAdornment: hasValue && ( + + + + ), + }} + fullWidth + /> + ); +}; + +export default SearchInput; diff --git a/ProductivitySuite/ui/react/src/components/SideBar/SideBar.module.scss b/ProductivitySuite/ui/react/src/components/SideBar/SideBar.module.scss index 8eae514915..67b98b7b0c 100644 --- a/ProductivitySuite/ui/react/src/components/SideBar/SideBar.module.scss +++ b/ProductivitySuite/ui/react/src/components/SideBar/SideBar.module.scss @@ -1,119 +1,117 @@ .aside { + max-width: var(--sidebar-width); + position: fixed; + width: 0; + overflow: hidden; + transition: width 0.3s; + height: 100vh; + top: 0; + left: 0; + z-index: 998; + padding-top: var(--header-height); + display: flex; + flex-direction: column; + justify-content: space-between; + + &.open { max-width: var(--sidebar-width); - position: fixed; - width: 0; - overflow: hidden; - transition: width 0.3s; - height: 100vh; - top: 0; - left: 0; - z-index: 998; - padding-top: var(--header-height); + width: var(--sidebar-width); + } + + .asideContent { + width: var(--sidebar-width); + min-width: var(--sidebar-width); display: flex; flex-direction: column; - justify-content: space-between; + list-style: none; + overflow: auto; + max-height: 100%; + margin-bottom: auto; + + .emptySvg { + width: 24px; + height: 24px; + min-width: 24px; + } + + li, + a { + display: flex; + flex-direction: row; + align-items: center; + } - &.open { - max-width: var(--sidebar-width); - width: var(--sidebar-width); + li { + padding-left: var(--header-gutter); + padding-right: var(--header-gutter); } - .asideContent { - width: var(--sidebar-width); - min-width: var(--sidebar-width); - display: flex; - flex-direction: column; - list-style: none; - overflow: auto; - max-height: 100%; - margin-bottom: auto; - - .emptySvg { - width: 24px; - height: 24px; - min-width: 24px; - } - - li, - a { - display: flex; - flex-direction: row; - align-items: center; - - } - - li { - padding-left: var(--header-gutter); - padding-right: var(--header-gutter); - } - - a { - width: 100%; - max-width: 100%; - text-decoration: none; - } - - :global { - .MuiListItemText-root { - margin-left: 10px; - } - - .MuiTypography-root{ - overflow: hidden; - text-overflow: ellipsis; - } - } - - .viewAll span{ - display: flex; - flex-direction: row; - align-items: center; - justify-content: flex-start; - - svg{ - margin-left: 0.5rem; - transform: rotate(180deg) - } - } - - .divider{ - height: 0; - margin: 10px var(--header-gutter); - } + a { + width: 100%; + max-width: 100%; + text-decoration: none; + } + :global { + .MuiListItemText-root { + margin-left: 10px; + } + + .MuiTypography-root { + overflow: hidden; + text-overflow: ellipsis; + } } -} -.asideSpacer { - width: 0; - transition: width 0.3s; + .viewAll span { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; - &.asideSpacerOpen { - width: var(--sidebar-width); + svg { + margin-left: 0.5rem; + transform: rotate(180deg); + } } -} -@media screen and (max-width: 1200px) { - .asideSpacer{ - display:none; + .divider { + height: 0; + margin: 10px var(--header-gutter); } + } } -.mobileUser{ - display: flex; - flex-direction: column; - align-items: flex-start; +.asideSpacer { + width: 0; + transition: width 0.3s; + + &.asideSpacerOpen { width: var(--sidebar-width); - min-width: var(--sidebar-width); - padding: var(--header-gutter); + } +} - :global { - .themeToggle{ - margin-left: -15px; - margin-bottom: 1rem; - } - } - @media screen and (min-width: 900px){ - display: none; +@media screen and (max-width: 1200px) { + .asideSpacer { + display: none; + } +} + +.mobileUser { + display: flex; + flex-direction: column; + align-items: flex-start; + width: var(--sidebar-width); + min-width: var(--sidebar-width); + padding: var(--header-gutter); + + :global { + .themeToggle { + margin-left: -15px; + margin-bottom: 1rem; } -} \ No newline at end of file + } + @media screen and (min-width: 900px) { + display: none; + } +} diff --git a/ProductivitySuite/ui/react/src/components/SideBar/SideBar.tsx b/ProductivitySuite/ui/react/src/components/SideBar/SideBar.tsx index 3ab645e0fb..c812284388 100644 --- a/ProductivitySuite/ui/react/src/components/SideBar/SideBar.tsx +++ b/ProductivitySuite/ui/react/src/components/SideBar/SideBar.tsx @@ -1,22 +1,25 @@ import { Link } from "react-router-dom"; import { useTheme } from "@mui/material/styles"; -import { SvgIconProps } from '@mui/material/SvgIcon'; -import styles from './SideBar.module.scss'; -import LogoutIcon from '@mui/icons-material/Logout'; -import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; -import AdminPanelSettingsIcon from '@mui/icons-material/AdminPanelSettings'; +import { SvgIconProps } from "@mui/material/SvgIcon"; +import styles from "./SideBar.module.scss"; +import LogoutIcon from "@mui/icons-material/Logout"; +import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined"; +import AdminPanelSettingsIcon from "@mui/icons-material/AdminPanelSettings"; import DatabaseIcon from "@icons/Database"; import RecentIcon from "@icons/Recent"; -import PeopleOutlineOutlinedIcon from '@mui/icons-material/PeopleOutlineOutlined'; -import FileUploadOutlinedIcon from '@mui/icons-material/FileUploadOutlined'; +import PeopleOutlineOutlinedIcon from "@mui/icons-material/PeopleOutlineOutlined"; +import FileUploadOutlinedIcon from "@mui/icons-material/FileUploadOutlined"; import { Box, ListItemText, MenuItem, MenuList } from "@mui/material"; import { JSX, MouseEventHandler } from "react"; import ThemeToggle from "@components/Header_ThemeToggle/ThemeToggle"; -import { useAppSelector } from '@redux/store'; +import { useAppSelector } from "@redux/store"; import { userSelector } from "@redux/User/userSlice"; -import { conversationSelector, newConversation } from "@redux/Conversation/ConversationSlice"; +import { + conversationSelector, + newConversation, +} from "@redux/Conversation/ConversationSlice"; import { Conversation } from "@redux/Conversation/Conversation"; import { useKeycloak } from "@react-keycloak/web"; import UploadChat from "@components/SideBar_UploadChat/UploadChat"; @@ -24,173 +27,200 @@ import { KeyboardBackspace } from "@mui/icons-material"; import { useDispatch } from "react-redux"; interface SideBarProps { - asideOpen: boolean; - setAsideOpen?: (open: boolean) => void; - userDetails?: () => JSX.Element; + asideOpen: boolean; + setAsideOpen?: (open: boolean) => void; + userDetails?: () => JSX.Element; } interface NavIconProps { - component: React.ComponentType; + component: React.ComponentType; } -export const NavIcon: React.FC = ({ component: ListItemIcon }) => { - const theme = useTheme() - return ; +export const NavIcon: React.FC = ({ + component: ListItemIcon, +}) => { + const theme = useTheme(); + return ; }; const EmptySvg: React.FC = () => { - return ; + return ( + + ); }; interface LinkedMenuItemProps { - to: string; - children: React.ReactNode; - onClick?: MouseEventHandler; - sx?: any; - open?: boolean; + to: string; + children: React.ReactNode; + onClick?: MouseEventHandler; + sx?: any; + open?: boolean; } -export const LinkedMenuItem: React.FC = ({ to, children, onClick, sx, open }) => { - - return ( - - - {children} - - - ); - +export const LinkedMenuItem: React.FC = ({ + to, + children, + onClick, + sx, + open, +}) => { + return ( + + + {children} + + + ); }; -const SideBar: React.FC = ({ asideOpen, setAsideOpen = ()=>{} , userDetails}) => { - - const dispatch = useDispatch(); - const theme = useTheme(); - - const { keycloak } = useKeycloak(); - const { role } = useAppSelector(userSelector) - const { conversations } = useAppSelector(conversationSelector) - - const asideBackgroundColor = { - backgroundColor: theme.customStyles.aside?.main, - }; - - const dividerColor = { - borderBottom: `1px solid ${theme.customStyles.customDivider?.main}`, - }; - - const handleLinkedMenuItemClick = (event: React.MouseEvent) => { - event.currentTarget.blur(); // so we can apply the aria hidden attribute while menu closed - dispatch(newConversation(true)) - setAsideOpen(false) - } - - const history = (type: Conversation[]) => { - if (type && type.length > 0) { - return type.map((conversation: Conversation, index: number) => { - if (index > 2) return null; - return ( - - - {conversation.first_query} - - ); - }); - } - }; - - const handleLogout = () => { - keycloak.logout(); - setAsideOpen(false) +const SideBar: React.FC = ({ + asideOpen, + setAsideOpen = () => {}, + userDetails, +}) => { + const dispatch = useDispatch(); + const theme = useTheme(); + + const { keycloak } = useKeycloak(); + const { role } = useAppSelector(userSelector); + const { conversations } = useAppSelector(conversationSelector); + + const asideBackgroundColor = { + backgroundColor: theme.customStyles.aside?.main, + }; + + const dividerColor = { + borderBottom: `1px solid ${theme.customStyles.customDivider?.main}`, + }; + + const handleLinkedMenuItemClick = ( + event: React.MouseEvent, + ) => { + event.currentTarget.blur(); // so we can apply the aria hidden attribute while menu closed + dispatch(newConversation(true)); + setAsideOpen(false); + }; + + const history = (type: Conversation[]) => { + if (type && type.length > 0) { + return type.map((conversation: Conversation, index: number) => { + if (index > 2) return null; + return ( + + + {conversation.first_query} + + ); + }); } - - const viewAll = (path: string) => { - - if(conversations.length > 0) { - return ( - - - View All - - ) - } else { - return ( - - - No recent conversations - - ) - } - + }; + + const handleLogout = () => { + keycloak.logout(); + setAsideOpen(false); + }; + + const viewAll = (path: string) => { + if (conversations.length > 0) { + return ( + + + + View All + + + ); + } else { + return ( + + + No recent conversations + + ); } + }; + + return ( + + ); }; const SideBarSpacer: React.FC = ({ asideOpen }) => { - - return ( -
- ); + return ( +
+ ); }; -export { SideBar, SideBarSpacer }; \ No newline at end of file +export { SideBar, SideBarSpacer }; diff --git a/ProductivitySuite/ui/react/src/components/SideBar_UploadChat/UploadChat.tsx b/ProductivitySuite/ui/react/src/components/SideBar_UploadChat/UploadChat.tsx index 9b5610f01c..17ab636436 100644 --- a/ProductivitySuite/ui/react/src/components/SideBar_UploadChat/UploadChat.tsx +++ b/ProductivitySuite/ui/react/src/components/SideBar_UploadChat/UploadChat.tsx @@ -1,125 +1,141 @@ -import { NotificationSeverity, notify } from "@components/Notification/Notification" -import { LinkedMenuItem, NavIcon } from "@components/SideBar/SideBar" -import { FileUploadOutlined } from "@mui/icons-material" -import { ListItemText } from "@mui/material" -import { conversationSelector, getAllConversations, saveConversationtoDatabase, uploadChat } from "@redux/Conversation/ConversationSlice" -import { useAppDispatch, useAppSelector } from "@redux/store" -import { userSelector } from "@redux/User/userSlice" +import { + NotificationSeverity, + notify, +} from "@components/Notification/Notification"; +import { LinkedMenuItem, NavIcon } from "@components/SideBar/SideBar"; +import { FileUploadOutlined } from "@mui/icons-material"; +import { ListItemText } from "@mui/material"; +import { + conversationSelector, + getAllConversations, + saveConversationtoDatabase, + uploadChat, +} from "@redux/Conversation/ConversationSlice"; +import { useAppDispatch, useAppSelector } from "@redux/store"; +import { userSelector } from "@redux/User/userSlice"; import { useEffect, useRef } from "react"; -import { useNavigate } from "react-router-dom" +import { useNavigate } from "react-router-dom"; interface UploadChatProps { - asideOpen: boolean; - setAsideOpen: (open: boolean) => void; + asideOpen: boolean; + setAsideOpen: (open: boolean) => void; } const UploadChat: React.FC = ({ asideOpen, setAsideOpen }) => { + const dispatch = useAppDispatch(); + const { selectedConversationHistory } = useAppSelector(conversationSelector); - const dispatch = useAppDispatch(); - const {selectedConversationHistory } = useAppSelector(conversationSelector); + const navigate = useNavigate(); - const navigate = useNavigate(); + const fileInputRef = useRef(null); + const newUpload = useRef(false); - const fileInputRef = useRef(null); - const newUpload = useRef(false) + useEffect(() => { + if (newUpload.current && selectedConversationHistory) { + saveConversation(); + } + }, [selectedConversationHistory]); - useEffect(()=>{ - if(newUpload.current && selectedConversationHistory){ - saveConversation(); - } - }, [selectedConversationHistory]) + const handleUploadClick = (event: React.MouseEvent) => { + event.preventDefault(); + event.currentTarget.blur(); // so we can apply the aria hidden attribute while menu closed + if (fileInputRef.current) { + fileInputRef.current.click(); + } + }; + + const saveConversation = async () => { + try { + const resultAction = await dispatch( + saveConversationtoDatabase({ conversation: { id: "" } }), + ); + + if (saveConversationtoDatabase.fulfilled.match(resultAction)) { + const responseData = resultAction.payload; + setAsideOpen(false); + newUpload.current = false; + notify( + "Conversation successfully uploaded", + NotificationSeverity.SUCCESS, + ); + navigate(`/chat/${responseData}`); + } else { + newUpload.current = false; + notify("Error saving conversation", NotificationSeverity.ERROR); + console.error("Error saving conversation:", resultAction.error); + } + } catch (error) { + newUpload.current = false; + notify("Error saving conversation", NotificationSeverity.ERROR); + console.error("An unexpected error occurred:", error); + } + }; - const handleUploadClick = (event: React.MouseEvent) => { - event.preventDefault(); - event.currentTarget.blur(); // so we can apply the aria hidden attribute while menu closed - if (fileInputRef.current) { - fileInputRef.current.click(); - } - }; + const handleFileChange = (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; - const saveConversation = async () => { - try { - const resultAction = await dispatch( - saveConversationtoDatabase({conversation: {id:''}}) - ); - - if (saveConversationtoDatabase.fulfilled.match(resultAction)) { - const responseData = resultAction.payload; - setAsideOpen(false); - newUpload.current = false; - notify("Conversation successfully uploaded", NotificationSeverity.SUCCESS); - navigate(`/chat/${responseData}`); - } else { - newUpload.current = false; - notify("Error saving conversation", NotificationSeverity.ERROR); - console.error("Error saving conversation:", resultAction.error); - } + if (file) { + newUpload.current = true; + const reader = new FileReader(); + reader.onload = () => { + try { + const fileContent = JSON.parse(reader.result as string); + + if ( + !fileContent.messages || + !fileContent.model || + !fileContent.token || + !fileContent.temperature || + fileContent.type + ) { + throw "Incorrect Format"; + } + + dispatch( + uploadChat({ + messages: fileContent.messages, + model: fileContent.model, + token: fileContent.token, + temperature: fileContent.temperature, + type: fileContent.type, + }), + ); } catch (error) { - newUpload.current = false; - notify("Error saving conversation", NotificationSeverity.ERROR); - console.error("An unexpected error occurred:", error); + notify( + `Error parsing JSON file: ${error}`, + NotificationSeverity.ERROR, + ); + console.error("Error parsing JSON file:", error); } - } + }; - const handleFileChange = (event: React.ChangeEvent) => { - - const file = event.target.files?.[0]; - - if (file) { - newUpload.current = true; - const reader = new FileReader(); - - reader.onload = () => { - try { - const fileContent = JSON.parse(reader.result as string); - - if(!fileContent.messages || !fileContent.model || !fileContent.token || !fileContent.temperature || fileContent.type){ - throw('Incorrect Format'); - } - - dispatch(uploadChat({ - messages: fileContent.messages, - model: fileContent.model, - token: fileContent.token, - temperature: fileContent.temperature, - type: fileContent.type - })) - - } catch (error) { - notify(`Error parsing JSON file: ${error}`, NotificationSeverity.ERROR); - console.error('Error parsing JSON file:', error); - } - }; - - reader.readAsText(file); - - } - - }; - - return ( - <> - - - - Upload Chat - - - {/* Hidden file input */} - - - - - ) -} - -export default UploadChat \ No newline at end of file + reader.readAsText(file); + } + }; + + return ( + <> + + + Upload Chat + + + {/* Hidden file input */} + + + ); +}; + +export default UploadChat; diff --git a/ProductivitySuite/ui/react/src/components/Summary_WebInput/WebInput.module.scss b/ProductivitySuite/ui/react/src/components/Summary_WebInput/WebInput.module.scss index 737150f8f6..069a27a330 100644 --- a/ProductivitySuite/ui/react/src/components/Summary_WebInput/WebInput.module.scss +++ b/ProductivitySuite/ui/react/src/components/Summary_WebInput/WebInput.module.scss @@ -1,19 +1,19 @@ -.inputWrapper{ - width: 100%; - max-width: 700px; - margin-top: 1rem; +.inputWrapper { + width: 100%; + max-width: 700px; + margin-top: 1rem; } .dataList { - width: 100%; - margin-top: 2rem; - max-height: 300; - overflow: auto; - border: 1px solid; - border-radius: 8px; - padding: 1rem; + width: 100%; + margin-top: 2rem; + max-height: 300; + overflow: auto; + border: 1px solid; + border-radius: 8px; + padding: 1rem; - li:not(:last-of-type){ - margin-bottom: 1rem; - } -} \ No newline at end of file + li:not(:last-of-type) { + margin-bottom: 1rem; + } +} diff --git a/ProductivitySuite/ui/react/src/components/Summary_WebInput/WebInput.tsx b/ProductivitySuite/ui/react/src/components/Summary_WebInput/WebInput.tsx index fe9b30ddad..693e824423 100644 --- a/ProductivitySuite/ui/react/src/components/Summary_WebInput/WebInput.tsx +++ b/ProductivitySuite/ui/react/src/components/Summary_WebInput/WebInput.tsx @@ -1,108 +1,120 @@ import { AddCircle, Delete } from "@mui/icons-material"; -import { IconButton, InputAdornment, List, ListItem, ListItemText, styled, TextField, useTheme } from "@mui/material"; +import { + IconButton, + InputAdornment, + List, + ListItem, + ListItemText, + styled, + TextField, + useTheme, +} from "@mui/material"; import { useState } from "react"; import styles from "./WebInput.module.scss"; -import {Language} from '@mui/icons-material'; +import { Language } from "@mui/icons-material"; import { useAppDispatch, useAppSelector } from "@redux/store"; -import { conversationSelector, setSourceLinks } from "@redux/Conversation/ConversationSlice"; +import { + conversationSelector, + setSourceLinks, +} from "@redux/Conversation/ConversationSlice"; -export const CustomTextInput = styled(TextField)(({theme})=>({ - ...theme.customStyles.webInput +export const CustomTextInput = styled(TextField)(({ theme }) => ({ + ...theme.customStyles.webInput, })); export const AddIcon = styled(AddCircle)(({ theme }) => ({ - 'path': { - fill: theme.customStyles.icon?.main, - } + path: { + fill: theme.customStyles.icon?.main, + }, })); const WebInput = () => { + const [inputValue, setInputValue] = useState(""); - const [inputValue, setInputValue] = useState(''); + const theme = useTheme(); - const theme = useTheme(); + const { sourceLinks } = useAppSelector(conversationSelector); + const dispatch = useAppDispatch(); - const { sourceLinks } = useAppSelector(conversationSelector) - const dispatch = useAppDispatch() + const handleAdd = (newSource: string) => { + if (!newSource) return; + const prevSource = sourceLinks ?? []; + dispatch(setSourceLinks([...prevSource, newSource])); + setInputValue(""); + }; - const handleAdd = (newSource: string) => { - if(!newSource) return; - const prevSource = sourceLinks ?? []; - dispatch(setSourceLinks([...prevSource, newSource])) - setInputValue(''); - } + const handleDelete = (index: number) => { + const newSource = sourceLinks.filter((s: any, i: number) => i !== index); + dispatch(setSourceLinks([...newSource])); + }; - const handleDelete = (index: number) => { - const newSource = sourceLinks.filter((s:any, i:number) => i !== index); - dispatch(setSourceLinks([...newSource])) + const handleKeyPress = (e: React.KeyboardEvent) => { + if (e.key === "Enter" && inputValue) { + handleAdd(inputValue); } + }; - const handleKeyPress = (e: React.KeyboardEvent) => { - if (e.key === 'Enter' && inputValue) { - handleAdd(inputValue); - } - }; - - const handleIconClick = () => { - if (inputValue) { - handleAdd(inputValue); - } - }; - - const sourcesDisplay = () => { - - if(!sourceLinks || sourceLinks.length === 0) return; - - return ( - - - - {sourceLinks.map((sourceItem: string, index:number) => ( - handleDelete(index)}> - - - } - > - 30 ? `${sourceItem.substring(0, 27)}...` : sourceItem}/> - - - ))} - - - ) - + const handleIconClick = () => { + if (inputValue) { + handleAdd(inputValue); } + }; - return ( -
+ const sourcesDisplay = () => { + if (!sourceLinks || sourceLinks.length === 0) return; - ) => setInputValue(e.target.value)} - InputProps={{ - endAdornment: ( - - - - ), - }} - fullWidth + return ( + + {sourceLinks.map((sourceItem: string, index: number) => ( + handleDelete(index)}> + + + } + > + 30 + ? `${sourceItem.substring(0, 27)}...` + : sourceItem + } /> - - {sourcesDisplay()} - -
+ + + ))} + ); + }; + + return ( +
+ ) => + setInputValue(e.target.value) + } + InputProps={{ + endAdornment: ( + + + + ), + }} + fullWidth + /> + + {sourcesDisplay()} +
+ ); }; -export default WebInput; \ No newline at end of file +export default WebInput; diff --git a/ProductivitySuite/ui/react/src/config.ts b/ProductivitySuite/ui/react/src/config.ts index b37f3a14e3..d07795c04c 100644 --- a/ProductivitySuite/ui/react/src/config.ts +++ b/ProductivitySuite/ui/react/src/config.ts @@ -1,31 +1,41 @@ const config = { - - companyName: "My Company", - logo: "/logo512.png", - tagline: "What can I help with?", - disclaimer: "

Generative AI provides significant benefits for enhancing the productivity of quality engineers, production support teams, software developers, and DevOps professionals. With a secure and scalable toolbox, it offers a flexible architecture capable of connecting to various data sources and models, enabling it to address a wide range of Generative AI use cases.

This platform saves your user ID to retain chat history, which you can choose to delete from the app at any time.

", - // defaultSummaryPrompt: `You are a professional summarizer good at summarizing documents. Provide a detailed summary of all documents while adhering to these guidelines: - // 1. Do not repeat similar information in the summary and use a formal tone - // 2. Format the summary in bullet form for easy understanding.`, - defaultChatPrompt: `You are a helpful assistant` + companyName: "My Company", + logo: "/logo512.png", + tagline: "What can I help with?", + disclaimer: + "

Generative AI provides significant benefits for enhancing the productivity of quality engineers, production support teams, software developers, and DevOps professionals. With a secure and scalable toolbox, it offers a flexible architecture capable of connecting to various data sources and models, enabling it to address a wide range of Generative AI use cases.

This platform saves your user ID to retain chat history, which you can choose to delete from the app at any time.

", + // defaultSummaryPrompt: `You are a professional summarizer good at summarizing documents. Provide a detailed summary of all documents while adhering to these guidelines: + // 1. Do not repeat similar information in the summary and use a formal tone + // 2. Format the summary in bullet form for easy understanding.`, + defaultChatPrompt: `You are a helpful assistant`, }; export default config; -export const CHAT_QNA_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_CHATQNA; -export const CODE_GEN_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_CODEGEN; +export const CHAT_QNA_URL = import.meta.env + .VITE_BACKEND_SERVICE_ENDPOINT_CHATQNA; +export const CODE_GEN_URL = import.meta.env + .VITE_BACKEND_SERVICE_ENDPOINT_CODEGEN; export const DOC_SUM_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_DOCSUM; export const FAQ_GEN_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_FAQGEN; -export const KEYCLOAK_SERVICE_URL = import.meta.env.VITE_KEYCLOAK_SERVICE_ENDPOINT; +export const KEYCLOAK_SERVICE_URL = import.meta.env + .VITE_KEYCLOAK_SERVICE_ENDPOINT; export const DATA_PREP_URL = import.meta.env.VITE_DATAPREP_SERVICE_ENDPOINT; -export const DATA_PREP_GET_URL = import.meta.env.VITE_DATAPREP_GET_FILE_ENDPOINT; -export const DATA_PREP_DELETE_URL = import.meta.env.VITE_DATAPREP_DELETE_FILE_ENDPOINT; +export const DATA_PREP_GET_URL = import.meta.env + .VITE_DATAPREP_GET_FILE_ENDPOINT; +export const DATA_PREP_DELETE_URL = import.meta.env + .VITE_DATAPREP_DELETE_FILE_ENDPOINT; -export const CHAT_HISTORY_CREATE = import.meta.env.VITE_CHAT_HISTORY_CREATE_ENDPOINT; +export const CHAT_HISTORY_CREATE = import.meta.env + .VITE_CHAT_HISTORY_CREATE_ENDPOINT; export const CHAT_HISTORY_GET = import.meta.env.VITE_CHAT_HISTORY_GET_ENDPOINT; -export const CHAT_HISTORY_DELETE = import.meta.env.VITE_CHAT_HISTORY_DELETE_ENDPOINT; +export const CHAT_HISTORY_DELETE = import.meta.env + .VITE_CHAT_HISTORY_DELETE_ENDPOINT; -export const PROMPT_MANAGER_GET = import.meta.env.VITE_PROMPT_SERVICE_GET_ENDPOINT; -export const PROMPT_MANAGER_CREATE = import.meta.env.VITE_PROMPT_SERVICE_CREATE_ENDPOINT; -export const PROMPT_MANAGER_DELETE = import.meta.env.VITE_PROMPT_SERVICE_DELETE_ENDPOINT; \ No newline at end of file +export const PROMPT_MANAGER_GET = import.meta.env + .VITE_PROMPT_SERVICE_GET_ENDPOINT; +export const PROMPT_MANAGER_CREATE = import.meta.env + .VITE_PROMPT_SERVICE_CREATE_ENDPOINT; +export const PROMPT_MANAGER_DELETE = import.meta.env + .VITE_PROMPT_SERVICE_DELETE_ENDPOINT; diff --git a/ProductivitySuite/ui/react/src/contexts/ThemeContext.tsx b/ProductivitySuite/ui/react/src/contexts/ThemeContext.tsx index dd8b0ae76c..94ec15bc29 100644 --- a/ProductivitySuite/ui/react/src/contexts/ThemeContext.tsx +++ b/ProductivitySuite/ui/react/src/contexts/ThemeContext.tsx @@ -1,39 +1,39 @@ -import React, { createContext, useState, useEffect, useCallback } from 'react'; -import { ThemeProvider as MuiThemeProvider, CssBaseline } from '@mui/material'; -import { themeCreator } from '../theme/theme'; +import React, { createContext, useState, useEffect, useCallback } from "react"; +import { ThemeProvider as MuiThemeProvider, CssBaseline } from "@mui/material"; +import { themeCreator } from "../theme/theme"; interface ThemeContextType { - darkMode: boolean; - toggleTheme: () => void; + darkMode: boolean; + toggleTheme: () => void; } export const ThemeContext = createContext({ - darkMode: false, - toggleTheme: () => { }, + darkMode: false, + toggleTheme: () => {}, }); -export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { - - const savedTheme = localStorage.getItem('theme') === 'dark'; - const [darkMode, setDarkMode] = useState(savedTheme); - - const toggleTheme = useCallback(() => { - setDarkMode((prevMode) => !prevMode); - }, []); - - useEffect(() => { - localStorage.setItem('theme', darkMode ? 'dark' : 'light'); - }, [darkMode]); - - - const theme = themeCreator(darkMode ? 'dark' : 'light'); - - return ( - - - - {children} - - - ); +export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ + children, +}) => { + const savedTheme = localStorage.getItem("theme") === "dark"; + const [darkMode, setDarkMode] = useState(savedTheme); + + const toggleTheme = useCallback(() => { + setDarkMode((prevMode) => !prevMode); + }, []); + + useEffect(() => { + localStorage.setItem("theme", darkMode ? "dark" : "light"); + }, [darkMode]); + + const theme = themeCreator(darkMode ? "dark" : "light"); + + return ( + + + + {children} + + + ); }; diff --git a/ProductivitySuite/ui/react/src/icons/Atom.tsx b/ProductivitySuite/ui/react/src/icons/Atom.tsx index 11f6e93054..039b640317 100644 --- a/ProductivitySuite/ui/react/src/icons/Atom.tsx +++ b/ProductivitySuite/ui/react/src/icons/Atom.tsx @@ -1,63 +1,134 @@ import { useTheme } from "@mui/material"; interface AtomIconProps { - className?: string; + className?: string; } -const AtomIcon: React.FC = ({className}) => { +const AtomIcon: React.FC = ({ className }) => { + const theme = useTheme(); - const theme = useTheme(); + const iconColor = theme.customStyles.icon?.main; - const iconColor = theme.customStyles.icon?.main; + return ( + + + + + ); +}; - return ( - - - - +const AtomAnimation: React.FC = ({ className }) => { + const theme = useTheme(); - ); -}; + const iconColor = theme.customStyles.icon?.main; -const AtomAnimation: React.FC = ({className}) => { - - const theme = useTheme(); - - const iconColor = theme.customStyles.icon?.main; - - return ( - - - {/* Grouping each ellipse with a circle */} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); + return ( + + + {/* Grouping each ellipse with a circle */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); }; -export {AtomAnimation, AtomIcon}; \ No newline at end of file +export { AtomAnimation, AtomIcon }; diff --git a/ProductivitySuite/ui/react/src/icons/ChatBubble.tsx b/ProductivitySuite/ui/react/src/icons/ChatBubble.tsx index 75de62bd8a..9ba2c4ac80 100644 --- a/ProductivitySuite/ui/react/src/icons/ChatBubble.tsx +++ b/ProductivitySuite/ui/react/src/icons/ChatBubble.tsx @@ -1,24 +1,38 @@ - - import { useTheme } from "@mui/material"; interface ChatBubbleIconProps { - className?: string; + className?: string; } const ChatBubbleIcon: React.FC = ({ className }) => { - - const theme = useTheme(); - - const iconColor = theme.customStyles.icon?.main; - - return ( - - - - - - ); + const theme = useTheme(); + + const iconColor = theme.customStyles.icon?.main; + + return ( + + + + + ); }; -export default ChatBubbleIcon; \ No newline at end of file +export default ChatBubbleIcon; diff --git a/ProductivitySuite/ui/react/src/icons/Database.tsx b/ProductivitySuite/ui/react/src/icons/Database.tsx index 0daf081190..a74130d499 100644 --- a/ProductivitySuite/ui/react/src/icons/Database.tsx +++ b/ProductivitySuite/ui/react/src/icons/Database.tsx @@ -1,21 +1,29 @@ import { SvgIcon, useTheme } from "@mui/material"; interface DatabaseIconProps { - className?: string; + className?: string; } -const DatabaseIcon: React.FC = ({className}) => { +const DatabaseIcon: React.FC = ({ className }) => { + const theme = useTheme(); + const iconColor = theme.customStyles.icon?.main; - const theme = useTheme(); - const iconColor = theme.customStyles.icon?.main; + return ( + + + + + + ); +}; - return ( - - - - - - ) -} - -export default DatabaseIcon \ No newline at end of file +export default DatabaseIcon; diff --git a/ProductivitySuite/ui/react/src/icons/Recent.tsx b/ProductivitySuite/ui/react/src/icons/Recent.tsx index 38c382c037..6018916654 100644 --- a/ProductivitySuite/ui/react/src/icons/Recent.tsx +++ b/ProductivitySuite/ui/react/src/icons/Recent.tsx @@ -1,21 +1,29 @@ -import { SvgIcon, useTheme } from "@mui/material" +import { SvgIcon, useTheme } from "@mui/material"; interface RecentIconProps { - className?: string; + className?: string; } -const RecentIcon: React.FC = ({className}) => { +const RecentIcon: React.FC = ({ className }) => { + const theme = useTheme(); + const iconColor = theme.customStyles.icon?.main; - const theme = useTheme(); - const iconColor = theme.customStyles.icon?.main; + return ( + + + + + + ); +}; - return ( - - - - - - ) -} - -export default RecentIcon \ No newline at end of file +export default RecentIcon; diff --git a/ProductivitySuite/ui/react/src/icons/Waiting.tsx b/ProductivitySuite/ui/react/src/icons/Waiting.tsx index 8c71b9151e..f2767d6884 100644 --- a/ProductivitySuite/ui/react/src/icons/Waiting.tsx +++ b/ProductivitySuite/ui/react/src/icons/Waiting.tsx @@ -1,23 +1,45 @@ import { useTheme } from "styled-components"; const WaitingIcon = () => { + const theme = useTheme(); + const iconColor = theme.customStyles.icon?.main; - const theme = useTheme(); - const iconColor = theme.customStyles.icon?.main; - - return ( - - - - - - - - - - + return ( + + + + + + + + + + - ) -} + ); +}; -export default WaitingIcon; \ No newline at end of file +export default WaitingIcon; diff --git a/ProductivitySuite/ui/react/src/index.scss b/ProductivitySuite/ui/react/src/index.scss index 19e6253d14..ce899f3a36 100644 --- a/ProductivitySuite/ui/react/src/index.scss +++ b/ProductivitySuite/ui/react/src/index.scss @@ -1,58 +1,57 @@ // Before javascript styles html { - font-size: 16px; + font-size: 16px; } body { - margin: 0; - font-family: "Inter", serif; - font-optical-sizing: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - height: 100vh; - line-height: 1.5; + margin: 0; + font-family: "Inter", serif; + font-optical-sizing: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + height: 100vh; + line-height: 1.5; } #root { - display: flex; - flex-direction: column; - height: 100vh; + display: flex; + flex-direction: column; + height: 100vh; } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; + font-family: + source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } :root { - --header-height: 72px; - --header-gutter: 1.5rem; - --sidebar-width: 260px; - --vertical-spacer: 2rem; - --content-width: 800px; - --content-gutter: 3rem; - --input-radius: 30px; - --copy-color: #3D447F; + --header-height: 72px; + --header-gutter: 1.5rem; + --sidebar-width: 260px; + --vertical-spacer: 2rem; + --content-width: 800px; + --content-gutter: 3rem; + --input-radius: 30px; + --copy-color: #3d447f; } - ::-webkit-scrollbar { - background: transparent; - width: 10px; + background: transparent; + width: 10px; } /* Style the thumb (the draggable part of the scrollbar) */ ::-webkit-scrollbar-thumb { - height: 20px; - background-color: rgba(0, 0, 0, 0.3); - /* Thumb color */ - border-radius: 5px; - /* Optional, for rounded corners */ + height: 20px; + background-color: rgba(0, 0, 0, 0.3); + /* Thumb color */ + border-radius: 5px; + /* Optional, for rounded corners */ } /* Optionally, you can add hover effects for the thumb */ ::-webkit-scrollbar-thumb:hover { - background-color: rgba(0, 0, 0, 0.5); - /* Darker thumb when hovered */ -} \ No newline at end of file + background-color: rgba(0, 0, 0, 0.5); + /* Darker thumb when hovered */ +} diff --git a/ProductivitySuite/ui/react/src/index.tsx b/ProductivitySuite/ui/react/src/index.tsx index f79b4b0f18..04fb23312b 100644 --- a/ProductivitySuite/ui/react/src/index.tsx +++ b/ProductivitySuite/ui/react/src/index.tsx @@ -1,23 +1,24 @@ -import React from 'react'; -import { createRoot } from 'react-dom/client'; -import './index.scss'; -import App from './App'; -import { Provider } from 'react-redux'; -import { store } from '@redux/store'; -import { ThemeProvider } from '@contexts/ThemeContext'; +import React from "react"; +import { createRoot } from "react-dom/client"; +import "./index.scss"; +import App from "./App"; +import { Provider } from "react-redux"; +import { store } from "@redux/store"; +import { ThemeProvider } from "@contexts/ThemeContext"; import keycloak from "@root/keycloak"; import { ReactKeycloakProvider } from "@react-keycloak/web"; -const root = createRoot(document.getElementById('root')!); +const root = createRoot(document.getElementById("root")!); root.render( - - //@ts-ignore - - - - - - - - -); \ No newline at end of file + //@ts-ignore + + + + + + + , +); diff --git a/ProductivitySuite/ui/react/src/keycloak.ts b/ProductivitySuite/ui/react/src/keycloak.ts index eb74795852..e273020080 100644 --- a/ProductivitySuite/ui/react/src/keycloak.ts +++ b/ProductivitySuite/ui/react/src/keycloak.ts @@ -4,10 +4,10 @@ import Keycloak from "keycloak-js"; import { KEYCLOAK_SERVICE_URL } from "@root/config"; const keyCloakConfig = { - url: KEYCLOAK_SERVICE_URL, - realm: "productivitysuite", - clientId: "productivitysuite", -} + url: KEYCLOAK_SERVICE_URL, + realm: "productivitysuite", + clientId: "productivitysuite", +}; const keycloak = new Keycloak(keyCloakConfig); diff --git a/ProductivitySuite/ui/react/src/layouts/Main/MainLayout.module.scss b/ProductivitySuite/ui/react/src/layouts/Main/MainLayout.module.scss index dccb98751b..0736eaa367 100644 --- a/ProductivitySuite/ui/react/src/layouts/Main/MainLayout.module.scss +++ b/ProductivitySuite/ui/react/src/layouts/Main/MainLayout.module.scss @@ -1,21 +1,21 @@ -.mainLayout{ - height: 100%; - display: flex; - flex-direction: column; - max-height: 100%; - overflow: hidden; +.mainLayout { + height: 100%; + display: flex; + flex-direction: column; + max-height: 100%; + overflow: hidden; } -.mainWrapper{ - display: flex; - flex-direction: row; - flex-grow: 1; - max-height: 100%; - overflow: auto; - overflow-x: hidden; +.mainWrapper { + display: flex; + flex-direction: row; + flex-grow: 1; + max-height: 100%; + overflow: auto; + overflow-x: hidden; } -.contentWrapper{ - max-height: 100%; - width: 100%; -} \ No newline at end of file +.contentWrapper { + max-height: 100%; + width: 100%; +} diff --git a/ProductivitySuite/ui/react/src/layouts/Main/MainLayout.tsx b/ProductivitySuite/ui/react/src/layouts/Main/MainLayout.tsx index a5c4b098f9..2965e70555 100644 --- a/ProductivitySuite/ui/react/src/layouts/Main/MainLayout.tsx +++ b/ProductivitySuite/ui/react/src/layouts/Main/MainLayout.tsx @@ -10,13 +10,22 @@ interface MainLayoutProps { dataView?: boolean; } -const MainLayout: React.FC = ({ chatView = false, historyView = false, dataView = false }) => { - +const MainLayout: React.FC = ({ + chatView = false, + historyView = false, + dataView = false, +}) => { const [asideOpen, setAsideOpen] = useState(false); return (
-
+
@@ -27,4 +36,4 @@ const MainLayout: React.FC = ({ chatView = false, historyView = ); }; -export default MainLayout; \ No newline at end of file +export default MainLayout; diff --git a/ProductivitySuite/ui/react/src/layouts/Minimal/MinimalLayout.module.scss b/ProductivitySuite/ui/react/src/layouts/Minimal/MinimalLayout.module.scss index aa2a97ab7e..2a2ff37fee 100644 --- a/ProductivitySuite/ui/react/src/layouts/Minimal/MinimalLayout.module.scss +++ b/ProductivitySuite/ui/react/src/layouts/Minimal/MinimalLayout.module.scss @@ -1,10 +1,10 @@ .minimalLayout { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; - width: 100%; - padding: 2rem; - text-align: center; -} \ No newline at end of file + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; + padding: 2rem; + text-align: center; +} diff --git a/ProductivitySuite/ui/react/src/layouts/Minimal/MinimalLayout.tsx b/ProductivitySuite/ui/react/src/layouts/Minimal/MinimalLayout.tsx index d3d4f171eb..0ccc5aea88 100644 --- a/ProductivitySuite/ui/react/src/layouts/Minimal/MinimalLayout.tsx +++ b/ProductivitySuite/ui/react/src/layouts/Minimal/MinimalLayout.tsx @@ -1,13 +1,13 @@ // About pages or privacy policy are likely minimal layouts import { Outlet } from "react-router-dom"; -import styles from './MinimalLayout.module.scss' +import styles from "./MinimalLayout.module.scss"; const MinimalLayout = () => { - return ( -
- -
- ); - }; - - export default MinimalLayout; \ No newline at end of file + return ( +
+ +
+ ); +}; + +export default MinimalLayout; diff --git a/ProductivitySuite/ui/react/src/layouts/ProtectedRoute/ProtectedRoute.tsx b/ProductivitySuite/ui/react/src/layouts/ProtectedRoute/ProtectedRoute.tsx index 3e1d6271fe..521e766840 100644 --- a/ProductivitySuite/ui/react/src/layouts/ProtectedRoute/ProtectedRoute.tsx +++ b/ProductivitySuite/ui/react/src/layouts/ProtectedRoute/ProtectedRoute.tsx @@ -1,6 +1,6 @@ -import { useAppSelector } from '@redux/store'; -import { userSelector } from '@redux/User/userSlice'; -import React, { useEffect } from 'react'; +import { useAppSelector } from "@redux/store"; +import { userSelector } from "@redux/User/userSlice"; +import React, { useEffect } from "react"; interface ProtectedRouteProps { component: React.ComponentType; @@ -9,21 +9,21 @@ interface ProtectedRouteProps { const ProtectedRoute: React.FC = ({ component: Component, - requiredRoles + requiredRoles, }) => { - const { isAuthenticated, role } = useAppSelector(userSelector); const isAllowed = React.useMemo(() => { return isAuthenticated && requiredRoles.includes(role); - }, [isAuthenticated, role, requiredRoles.join(',')]); + }, [isAuthenticated, role, requiredRoles.join(",")]); if (!isAllowed) { - return

Access Denied: You do not have permission to view this page.

; + return ( +

Access Denied: You do not have permission to view this page.

+ ); } - return ; - + return ; }; export default ProtectedRoute; diff --git a/ProductivitySuite/ui/react/src/pages/Chat/ChatView.module.scss b/ProductivitySuite/ui/react/src/pages/Chat/ChatView.module.scss index 5581244576..023bcd485d 100644 --- a/ProductivitySuite/ui/react/src/pages/Chat/ChatView.module.scss +++ b/ProductivitySuite/ui/react/src/pages/Chat/ChatView.module.scss @@ -1,41 +1,39 @@ -.chatView{ +.chatView { + display: flex; + flex-direction: column; + max-height: 100%; + height: 100%; + + .messagesWrapper { display: flex; flex-direction: column; + flex-grow: 1; + padding: calc(var(--header-gutter) * 2) calc(var(--header-gutter)); max-height: 100%; - height: 100%; - - .messagesWrapper{ - display: flex; - flex-direction: column; - flex-grow: 1; - padding: calc(var(--header-gutter) * 2) calc(var(--header-gutter)); - max-height: 100%; - overflow-x: auto; - - @media screen and (min-width: 1200px) { - padding: calc(var(--header-gutter) * 2); - } + overflow-x: auto; - .messageContent{ - - width: 100%; - max-width: var(--content-width); - margin: 0px auto; - - pre{ - margin: 0; - white-space: pre-wrap; - word-wrap: break-word; - } - } + @media screen and (min-width: 1200px) { + padding: calc(var(--header-gutter) * 2); } - .inputWrapper{ - display: block; - margin: 0px auto; - padding: calc(var(--header-gutter) * 1.5) calc(var(--header-gutter) * 1) ; - max-width: calc((var(--header-gutter) * 2) + 800px); - width: 100%; + .messageContent { + width: 100%; + max-width: var(--content-width); + margin: 0px auto; + pre { + margin: 0; + white-space: pre-wrap; + word-wrap: break-word; + } } -} \ No newline at end of file + } + + .inputWrapper { + display: block; + margin: 0px auto; + padding: calc(var(--header-gutter) * 1.5) calc(var(--header-gutter) * 1); + max-width: calc((var(--header-gutter) * 2) + 800px); + width: 100%; + } +} diff --git a/ProductivitySuite/ui/react/src/pages/Chat/ChatView.tsx b/ProductivitySuite/ui/react/src/pages/Chat/ChatView.tsx index 704a61329e..6bbeaa06a8 100644 --- a/ProductivitySuite/ui/react/src/pages/Chat/ChatView.tsx +++ b/ProductivitySuite/ui/react/src/pages/Chat/ChatView.tsx @@ -1,353 +1,349 @@ -import { useEffect, useRef, JSX } from 'react'; -import styles from './ChatView.module.scss'; -import { useLocation, useNavigate, useParams } from 'react-router-dom'; - -import { Box } from '@mui/material'; -import PrimaryInput from '@components/PrimaryInput/PrimaryInput'; - -import { useAppDispatch, useAppSelector } from '@redux/store'; -import { abortStream, conversationSelector, doCodeGen, doConversation, doSummaryFaq, getConversationHistory, newConversation, setSelectedConversationId } from '@redux/Conversation/ConversationSlice'; -import { userSelector } from '@redux/User/userSlice'; -import ChatUser from '@components/Chat_User/ChatUser'; -import ChatAssistant from '@components/Chat_Assistant/ChatAssistant'; -import { Message, MessageRole } from '@redux/Conversation/Conversation'; -import { getCurrentTimeStamp, readFilesAndSummarize } from '@utils/utils'; -import ChatSources from '@components/Chat_Sources/ChatSources'; - +import { useEffect, useRef, JSX } from "react"; +import styles from "./ChatView.module.scss"; +import { useLocation, useNavigate, useParams } from "react-router-dom"; + +import { Box } from "@mui/material"; +import PrimaryInput from "@components/PrimaryInput/PrimaryInput"; + +import { useAppDispatch, useAppSelector } from "@redux/store"; +import { + abortStream, + conversationSelector, + doCodeGen, + doConversation, + doSummaryFaq, + getConversationHistory, + newConversation, + setSelectedConversationId, +} from "@redux/Conversation/ConversationSlice"; +import { userSelector } from "@redux/User/userSlice"; +import ChatUser from "@components/Chat_User/ChatUser"; +import ChatAssistant from "@components/Chat_Assistant/ChatAssistant"; +import { Message, MessageRole } from "@redux/Conversation/Conversation"; +import { getCurrentTimeStamp, readFilesAndSummarize } from "@utils/utils"; +import ChatSources from "@components/Chat_Sources/ChatSources"; const ChatView = () => { + const { name } = useAppSelector(userSelector); + const { + selectedConversationHistory, + type, + sourceLinks, + sourceFiles, + temperature, + token, + model, + systemPrompt, + selectedConversationId, + onGoingResult, + isPending, + } = useAppSelector(conversationSelector); + + const systemPromptObject: Message = { + role: MessageRole.System, + content: systemPrompt, + }; + + const dispatch = useAppDispatch(); + const navigate = useNavigate(); + + // existing chat + const { conversation_id } = useParams(); + + // new chat + const { state } = useLocation(); + const initialMessage = state?.initialMessage || null; + const isSummary = type === "summary" || false; + const isCodeGen = type === "code" || false; + const isChat = type === "chat" || false; + const isFaq = type === "faq" || false; + + const fromHome = useRef(false); + const newMessage = useRef(false); + + const scrollContainer = useRef(null); + const autoScroll = useRef(true); + const scrollTimeout = useRef(null); + + const messagesBeginRef = useRef(null); + const messagesEndRef = useRef(null); + + // Scroll to top of fetched message + const scrollToTop = () => { + messagesBeginRef.current?.scrollIntoView({ behavior: "smooth" }); + }; + + // Scroll to the latest message + const scrollToBottom = () => { + messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); + }; + + const handleUserScroll = () => { + if (scrollContainer.current) { + const { scrollTop, scrollHeight, clientHeight } = scrollContainer.current; + + // Disable autoscroll if the user scrolls up significantly + if (scrollTop + clientHeight < scrollHeight - 50) { + autoScroll.current = false; + } else { + // Use a timeout to delay re-enabling autoscroll, preventing rapid toggling + if (scrollTimeout.current) clearTimeout(scrollTimeout.current); + scrollTimeout.current = setTimeout(() => { + autoScroll.current = true; + }, 500); // Delay auto-scroll reactivation + } + } + }; - const { name } = useAppSelector(userSelector); - const { selectedConversationHistory, type, sourceLinks, sourceFiles, temperature, - token, model, systemPrompt, selectedConversationId, onGoingResult, isPending } = useAppSelector(conversationSelector); - - const systemPromptObject: Message = { - role: MessageRole.System, - content: systemPrompt, - }; - - const dispatch = useAppDispatch(); - const navigate = useNavigate(); - - // existing chat - const { conversation_id } = useParams(); - - // new chat - const { state } = useLocation(); - const initialMessage = state?.initialMessage || null; - const isSummary = type === 'summary' || false; - const isCodeGen = type === 'code' || false; - const isChat = type === 'chat' || false; - const isFaq = type === 'faq' || false; - - const fromHome = useRef(false); - const newMessage = useRef(false); - - const scrollContainer = useRef(null); - const autoScroll = useRef(true); - const scrollTimeout = useRef(null) - - const messagesBeginRef = useRef(null); - const messagesEndRef = useRef(null); + useEffect(() => { + const container = scrollContainer.current; + if (!container) return; - // Scroll to top of fetched message - const scrollToTop = () => { - messagesBeginRef.current?.scrollIntoView({ behavior: 'smooth' }); - }; + container.addEventListener("scroll", handleUserScroll); - // Scroll to the latest message - const scrollToBottom = () => { - messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + return () => { + container.removeEventListener("scroll", handleUserScroll); + if (scrollTimeout.current) clearTimeout(scrollTimeout.current); + if (onGoingResult) dispatch(abortStream()); + console.log("Reset Convo, preserve settings"); + dispatch(newConversation(false)); }; + }, []); - const handleUserScroll = () => { - - if (scrollContainer.current) { - const { scrollTop, scrollHeight, clientHeight } = scrollContainer.current; - - // Disable autoscroll if the user scrolls up significantly - if (scrollTop + clientHeight < scrollHeight - 50) { - autoScroll.current = false; - } else { - // Use a timeout to delay re-enabling autoscroll, preventing rapid toggling - if (scrollTimeout.current) clearTimeout(scrollTimeout.current); - scrollTimeout.current = setTimeout(() => { - autoScroll.current = true; - }, 500); // Delay auto-scroll reactivation - } - - } - - }; - - useEffect(() => { - - const container = scrollContainer.current; - if (!container) return; - - container.addEventListener("scroll", handleUserScroll); - - return () => { - container.removeEventListener("scroll", handleUserScroll); - if (scrollTimeout.current) clearTimeout(scrollTimeout.current); - if(onGoingResult) dispatch(abortStream()) - console.log('Reset Convo, preserve settings') - dispatch(newConversation(false)) - }; - - }, []); - - useEffect(() => { - - if (onGoingResult && autoScroll.current) { - scrollToBottom(); - } - - }, [onGoingResult]); - - - useEffect(() => { - - if(!name) return; - - // reset view (not full reset) - // dispatch(newConversation(false)) // moved to useEffect unmount - - // convo starting, new conversation id inboud - if (!conversation_id) fromHome.current = true; - - - // existing convo, load and scroll up - if (conversation_id && conversation_id !== 'new') { - dispatch(setSelectedConversationId(conversation_id)) - dispatch(getConversationHistory({ user: name, conversationId: conversation_id })) - scrollToTop(); - return; - } else if (conversation_id === 'new') { - - // new convo - fromHome.current = true; - - if ((isSummary || isFaq) - && ((sourceLinks && sourceLinks.length > 0) - || (sourceFiles && sourceFiles.length > 0) - || initialMessage) - ) { - // console.log('SUMMARY/FAQ') - newSummaryOrFaq(); - return; - } - - if (isCodeGen && initialMessage) { - // console.log('CODE') - newCodeGen(); - return; - } - - if (isChat && initialMessage) { - // console.log('NEW CHAT') - newChat(); - return; - } - - // no match for view, go home - console.log('Go Home') - navigate('/') - - } - - }, [conversation_id, name]); - - const newSummaryOrFaq = async () => { - - const userPrompt: Message = { - role: MessageRole.User, - content: initialMessage, - time: getCurrentTimeStamp().toString() - }; - - let prompt = { - conversationId: selectedConversationId, - userPrompt, - messages: initialMessage, - model, - files: sourceFiles, - temperature, - token, - type // TODO: cannot past type - } - - doSummaryFaq(prompt) - - } - - const newChat = () => { - - const userPrompt: Message = { - role: MessageRole.User, - content: initialMessage, - time: getCurrentTimeStamp().toString() - }; - - let messages: Message[] = []; - messages = [systemPromptObject, ...(selectedConversationHistory)] - - let prompt = { - conversationId: selectedConversationId, - userPrompt, - messages, - model, - temperature, - token, - time: getCurrentTimeStamp().toString(),// TODO: cannot past time - type // TODO: cannot past type - } - - doConversation(prompt) + useEffect(() => { + if (onGoingResult && autoScroll.current) { + scrollToBottom(); } - - const newCodeGen = () => { - - const userPrompt: Message = { - role: MessageRole.User, - content: initialMessage, - time: getCurrentTimeStamp().toString() - }; - - let prompt = { - conversationId: selectedConversationId, - userPrompt: userPrompt, - messages: [], - model, - temperature, - token, - time: getCurrentTimeStamp().toString(), // TODO: cannot past time - type // TODO: cannot past type - } - - doCodeGen(prompt) + }, [onGoingResult]); + + useEffect(() => { + if (!name) return; + + // reset view (not full reset) + // dispatch(newConversation(false)) // moved to useEffect unmount + + // convo starting, new conversation id inboud + if (!conversation_id) fromHome.current = true; + + // existing convo, load and scroll up + if (conversation_id && conversation_id !== "new") { + dispatch(setSelectedConversationId(conversation_id)); + dispatch( + getConversationHistory({ user: name, conversationId: conversation_id }), + ); + scrollToTop(); + return; + } else if (conversation_id === "new") { + // new convo + fromHome.current = true; + + if ( + (isSummary || isFaq) && + ((sourceLinks && sourceLinks.length > 0) || + (sourceFiles && sourceFiles.length > 0) || + initialMessage) + ) { + // console.log('SUMMARY/FAQ') + newSummaryOrFaq(); + return; + } + + if (isCodeGen && initialMessage) { + // console.log('CODE') + newCodeGen(); + return; + } + + if (isChat && initialMessage) { + // console.log('NEW CHAT') + newChat(); + return; + } + + // no match for view, go home + console.log("Go Home"); + navigate("/"); } + }, [conversation_id, name]); - // ADD to existing conversation - const addMessage = (query: string) => { - - const userPrompt: Message = { - role: MessageRole.User, - content: query, - time: getCurrentTimeStamp().toString() - }; - - let messages: Message[] = []; - - messages = [...selectedConversationHistory] - - let prompt = { - conversationId: selectedConversationId, - userPrompt, - messages, - model, - temperature, - token, - type - } - - doConversation(prompt) - - - } - - const handleSendMessage = async (messageContent: string) => { - newMessage.current = true; - addMessage(messageContent); + const newSummaryOrFaq = async () => { + const userPrompt: Message = { + role: MessageRole.User, + content: initialMessage, + time: getCurrentTimeStamp().toString(), }; - const displayChatUser = (message:Message) => { - - // file post will not have message, will display file.extension instead - if ((isSummary || isFaq) && !message.content) return; - - // normal message - if(message.role === MessageRole.User) { - return - } - - } + let prompt = { + conversationId: selectedConversationId, + userPrompt, + messages: initialMessage, + model, + files: sourceFiles, + temperature, + token, + type, // TODO: cannot past type + }; - const displayMessage = () => { + doSummaryFaq(prompt); + }; - let messagesDisplay: JSX.Element[] = []; + const newChat = () => { + const userPrompt: Message = { + role: MessageRole.User, + content: initialMessage, + time: getCurrentTimeStamp().toString(), + }; - selectedConversationHistory.map((message, messageIndex) => { + let messages: Message[] = []; + messages = [systemPromptObject, ...selectedConversationHistory]; + + let prompt = { + conversationId: selectedConversationId, + userPrompt, + messages, + model, + temperature, + token, + time: getCurrentTimeStamp().toString(), // TODO: cannot past time + type, // TODO: cannot past type + }; - const timestamp = message.time || Math.random(); - if (message.role !== MessageRole.System) { + doConversation(prompt); + }; - - messagesDisplay.push( - - {displayChatUser(message)} - {message.role === MessageRole.Assistant && } - - ) - } - }) + const newCodeGen = () => { + const userPrompt: Message = { + role: MessageRole.User, + content: initialMessage, + time: getCurrentTimeStamp().toString(), + }; - if (onGoingResult) { + let prompt = { + conversationId: selectedConversationId, + userPrompt: userPrompt, + messages: [], + model, + temperature, + token, + time: getCurrentTimeStamp().toString(), // TODO: cannot past time + type, // TODO: cannot past type + }; - const continueMessage: Message = { - role: MessageRole.Assistant, - content: onGoingResult, - time: Date.now().toString() - } + doCodeGen(prompt); + }; + // ADD to existing conversation + const addMessage = (query: string) => { + const userPrompt: Message = { + role: MessageRole.User, + content: query, + time: getCurrentTimeStamp().toString(), + }; - messagesDisplay.push( - - - - ) - } else if (isPending) { + let messages: Message[] = []; - const continueMessage: Message = { - role: MessageRole.Assistant, - content: '', - time: Date.now().toString(), - } + messages = [...selectedConversationHistory]; + let prompt = { + conversationId: selectedConversationId, + userPrompt, + messages, + model, + temperature, + token, + type, + }; - messagesDisplay.push( - - - - ) + doConversation(prompt); + }; - } + const handleSendMessage = async (messageContent: string) => { + newMessage.current = true; + addMessage(messageContent); + }; + const displayChatUser = (message: Message) => { + // file post will not have message, will display file.extension instead + if ((isSummary || isFaq) && !message.content) return; - return messagesDisplay + // normal message + if (message.role === MessageRole.User) { + return ; + } + }; + + const displayMessage = () => { + let messagesDisplay: JSX.Element[] = []; + + selectedConversationHistory.map((message, messageIndex) => { + const timestamp = message.time || Math.random(); + if (message.role !== MessageRole.System) { + messagesDisplay.push( + + {displayChatUser(message)} + {message.role === MessageRole.Assistant && ( + + )} + , + ); + } + }); + + if (onGoingResult) { + const continueMessage: Message = { + role: MessageRole.Assistant, + content: onGoingResult, + time: Date.now().toString(), + }; + + messagesDisplay.push( + + + , + ); + } else if (isPending) { + const continueMessage: Message = { + role: MessageRole.Assistant, + content: "", + time: Date.now().toString(), + }; + + messagesDisplay.push( + + + , + ); } - return !selectedConversationHistory ? <> : ( -
-
- -
- - - - {displayMessage()} + return messagesDisplay; + }; -
+ return !selectedConversationHistory ? ( + <> + ) : ( +
+
+
-
+ -
- -
+ {displayMessage()} +
+
-
- ); -} +
+ +
+
+ ); +}; -export default ChatView; \ No newline at end of file +export default ChatView; diff --git a/ProductivitySuite/ui/react/src/pages/DataSource/DataSourceManagement.module.scss b/ProductivitySuite/ui/react/src/pages/DataSource/DataSourceManagement.module.scss index b170232024..28e6863781 100644 --- a/ProductivitySuite/ui/react/src/pages/DataSource/DataSourceManagement.module.scss +++ b/ProductivitySuite/ui/react/src/pages/DataSource/DataSourceManagement.module.scss @@ -1,75 +1,71 @@ -.dataView{ - height: 100%; - width: 100%; - max-width: var(--content-width); - width: 100%; - margin: 0px auto; - padding: calc(var(--header-gutter) * 2); - +.dataView { + height: 100%; + width: 100%; + max-width: var(--content-width); + width: 100%; + margin: 0px auto; + padding: calc(var(--header-gutter) * 2); } -.dataItem{ - - margin-bottom: 1rem; - position: relative; - padding: 0; +.dataItem { + margin-bottom: 1rem; + position: relative; + padding: 0; - :global { - .MuiCheckbox-root{ - position: absolute; - right: 100%; - margin-right: 0.25rem; - top: 50%; - transform: translateY(-50%); - @media screen and (min-width: 901px){ - margin-right: 1rem; - } - - } + :global { + .MuiCheckbox-root { + position: absolute; + right: 100%; + margin-right: 0.25rem; + top: 50%; + transform: translateY(-50%); + @media screen and (min-width: 901px) { + margin-right: 1rem; + } } + } } -.dataName{ - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: flex-start; - width: 100%; - padding: 1rem; - margin: 0; - line-height: 1.5; +.dataName { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: flex-start; + width: 100%; + padding: 1rem; + margin: 0; + line-height: 1.5; } -.searchInput{ - width: 100%; - margin-bottom: 1rem; - background: none; - - // padding: var(--header-gutter); - border: 0; - margin-bottom: 2rem; - // margin-right: 45px; - &:focus{ - outline: none; - } +.searchInput { + width: 100%; + margin-bottom: 1rem; + background: none; - :global { - .MuiInputBase-root{ - border-radius: var(--input-radius); - } - } + // padding: var(--header-gutter); + border: 0; + margin-bottom: 2rem; + // margin-right: 45px; + &:focus { + outline: none; + } + :global { + .MuiInputBase-root { + border-radius: var(--input-radius); + } + } } -.dataInputWrapper{ - width: 100%; - margin-top: 2rem; - margin-bottom :2rem; - display: flex; - flex-direction: column; - align-items: center; +.dataInputWrapper { + width: 100%; + margin-top: 2rem; + margin-bottom: 2rem; + display: flex; + flex-direction: column; + align-items: center; } -.actions button{ - margin-left: 0.5rem; -} \ No newline at end of file +.actions button { + margin-left: 0.5rem; +} diff --git a/ProductivitySuite/ui/react/src/pages/DataSource/DataSourceManagement.tsx b/ProductivitySuite/ui/react/src/pages/DataSource/DataSourceManagement.tsx index 2015359a9a..cb0fe9a31d 100644 --- a/ProductivitySuite/ui/react/src/pages/DataSource/DataSourceManagement.tsx +++ b/ProductivitySuite/ui/react/src/pages/DataSource/DataSourceManagement.tsx @@ -1,202 +1,242 @@ -import { Box, Checkbox, FormControlLabel, List, ListItem, Typography, FormGroup } from "@mui/material"; -import { useTheme } from "@mui/material/styles"; +import { + Box, + Checkbox, + FormControlLabel, + List, + ListItem, + Typography, + FormGroup, +} from "@mui/material"; +import { useTheme } from "@mui/material/styles"; import { useEffect, useState } from "react"; import styles from "./DataSourceManagement.module.scss"; import { useAppDispatch, useAppSelector } from "@redux/store"; -import { conversationSelector, deleteInDataSource, getAllFilesInDataSource, deleteMultipleInDataSource } from "@redux/Conversation/ConversationSlice"; +import { + conversationSelector, + deleteInDataSource, + getAllFilesInDataSource, + deleteMultipleInDataSource, +} from "@redux/Conversation/ConversationSlice"; import { file } from "@redux/Conversation/Conversation"; import DropDown from "@components/DropDown/DropDown"; import DataWebInput from "@components/Data_Web/DataWebInput"; import FileInput from "@components/File_Input/FileInput"; import SearchInput from "@components/SearchInput/SearchInput"; -import { DeleteButton, SolidButton, TextButton} from "@root/shared/ActionButtons"; +import { + DeleteButton, + SolidButton, + TextButton, +} from "@root/shared/ActionButtons"; const DataSourceManagement = () => { - - const dispatch = useAppDispatch(); - - const theme = useTheme(); - - const { filesInDataSource } = useAppSelector(conversationSelector); - - const [dataList, setDataList] = useState([]); - const [activeSourceType, setActiveSourceType] = useState('documents') - const [selectActive, setSelectActive] = useState(false); - const [selectAll, setSelectAll] = useState(false); - const [checkedItems, setCheckedItems] = useState>({}); - - useEffect(() => { - dispatch(getAllFilesInDataSource({ knowledgeBaseId: 'default' })) - }, []) - - const sortFiles = () => { - if(activeSourceType === 'web'){ - let webFiles = filesInDataSource.filter((file)=>file.name.startsWith('http')); - return webFiles - } else { - let otherFiles = filesInDataSource.filter((file)=>!file.name.startsWith('http')); - return otherFiles - }; - } - - useEffect(() => { - setDataList(sortFiles()) - }, [filesInDataSource, activeSourceType]) - - const handleCheckboxChange = (conversationId: string) => { - setCheckedItems((prev) => ({ - ...prev, - [conversationId]: !prev[conversationId], - })); - }; - - const displayFiles = () => { - - return dataList.map((file: file) => { - - const isChecked = !!checkedItems[file.id]; - - const fileText = ( - <> - {file.name} - {/* TODO: timestamp for all conversations? */} - {/* Last message {convertTime(conversation.updated_at)} */} - - ); - - const controlCheckBox = ( - handleCheckboxChange(file.id)} checked={isChecked} /> - ); - - return ( - - {selectActive ? ( - - ) : ( - {fileText} - - )} - - ); - }); - - }; - - const cancelSelect = () => { - setSelectActive(false); - setSelectAll(false); - setCheckedItems({}); - } - - const deleteSelected = () => { - - setSelectActive(false); - - let files = []; - for (const [key, value] of Object.entries(checkedItems)) { - if (value === true) { - files.push(key) - } - } - - if(files.length > 0) { - - //update current state - setDataList((prev) => prev.filter((item) => !checkedItems[item.id])); - dispatch(deleteMultipleInDataSource({files: files})) - - } - - }; - - const handleSelectAll = () => { - - const newSelectAll = !selectAll; - setSelectAll(newSelectAll); - - // Add all items' checked state - const updatedCheckedItems: Record = {}; - dataList.forEach((file) => { - updatedCheckedItems[file.id] = newSelectAll; - }); - - setCheckedItems(updatedCheckedItems); - - }; - - const handleSearch = (value: string) => { - const filteredList = dataList; - const searchResults = filteredList.filter((file: file) => file.name?.toLowerCase().includes(value.toLowerCase())); - setDataList(value ? searchResults : sortFiles()); + const dispatch = useAppDispatch(); + + const theme = useTheme(); + + const { filesInDataSource } = useAppSelector(conversationSelector); + + const [dataList, setDataList] = useState([]); + const [activeSourceType, setActiveSourceType] = useState("documents"); + const [selectActive, setSelectActive] = useState(false); + const [selectAll, setSelectAll] = useState(false); + const [checkedItems, setCheckedItems] = useState>({}); + + useEffect(() => { + dispatch(getAllFilesInDataSource({ knowledgeBaseId: "default" })); + }, []); + + const sortFiles = () => { + if (activeSourceType === "web") { + let webFiles = filesInDataSource.filter((file) => + file.name.startsWith("http"), + ); + return webFiles; + } else { + let otherFiles = filesInDataSource.filter( + (file) => !file.name.startsWith("http"), + ); + return otherFiles; } - - const updateSource = (value: string) => { - setActiveSourceType(value) + }; + + useEffect(() => { + setDataList(sortFiles()); + }, [filesInDataSource, activeSourceType]); + + const handleCheckboxChange = (conversationId: string) => { + setCheckedItems((prev) => ({ + ...prev, + [conversationId]: !prev[conversationId], + })); + }; + + const displayFiles = () => { + return dataList.map((file: file) => { + const isChecked = !!checkedItems[file.id]; + + const fileText = ( + <> + {file.name} + {/* TODO: timestamp for all conversations? */} + {/* Last message {convertTime(conversation.updated_at)} */} + + ); + + const controlCheckBox = ( + handleCheckboxChange(file.id)} + checked={isChecked} + /> + ); + + return ( + + {selectActive ? ( + + ) : ( + + {fileText} + + )} + + ); + }); + }; + + const cancelSelect = () => { + setSelectActive(false); + setSelectAll(false); + setCheckedItems({}); + }; + + const deleteSelected = () => { + setSelectActive(false); + + let files = []; + for (const [key, value] of Object.entries(checkedItems)) { + if (value === true) { + files.push(key); + } } - const displayInput = () => { - let input = null; - if (activeSourceType === 'documents') input = ; - if (activeSourceType === 'web') input = ; - if (activeSourceType === 'images') input = ; - - return ( - - {input} - - ) + if (files.length > 0) { + //update current state + setDataList((prev) => prev.filter((item) => !checkedItems[item.id])); + dispatch(deleteMultipleInDataSource({ files: files })); } - - return ( - - - - - - - } /> - - - - {displayInput()} - - - - - You have {dataList.length} file{dataList.length !== 1 && 's'} - - {dataList.length > 0 && ( - - {selectActive - ? handleSelectAll()}>Select All - : setSelectActive(true)}>Select} - - {selectActive && ( - <> - cancelSelect()}>Cancel - deleteSelected()}>Delete Selected - - )} - - )} - - - - - - - {displayFiles()} - - - ) + }; + + const handleSelectAll = () => { + const newSelectAll = !selectAll; + setSelectAll(newSelectAll); + + // Add all items' checked state + const updatedCheckedItems: Record = {}; + dataList.forEach((file) => { + updatedCheckedItems[file.id] = newSelectAll; + }); + + setCheckedItems(updatedCheckedItems); + }; + + const handleSearch = (value: string) => { + const filteredList = dataList; + const searchResults = filteredList.filter((file: file) => + file.name?.toLowerCase().includes(value.toLowerCase()), + ); + setDataList(value ? searchResults : sortFiles()); + }; + + const updateSource = (value: string) => { + setActiveSourceType(value); + }; + + const displayInput = () => { + let input = null; + if (activeSourceType === "documents") + input = ; + if (activeSourceType === "web") input = ; + if (activeSourceType === "images") + input = ; + + return {input}; + }; + + return ( + + + + + } + /> + + + + {displayInput()} + + + + + + You have {dataList.length} file{dataList.length !== 1 && "s"} + + + {dataList.length > 0 && ( + + {selectActive ? ( + handleSelectAll()}> + Select All + + ) : ( + setSelectActive(true)}> + Select + + )} + + {selectActive && ( + <> + cancelSelect()}>Cancel + deleteSelected()}> + Delete Selected + + + )} + + )} + + + {displayFiles()} + + ); }; -export default DataSourceManagement; \ No newline at end of file +export default DataSourceManagement; diff --git a/ProductivitySuite/ui/react/src/pages/History/HistoryView.module.scss b/ProductivitySuite/ui/react/src/pages/History/HistoryView.module.scss index 17ec344f3d..6c4c6d5b15 100644 --- a/ProductivitySuite/ui/react/src/pages/History/HistoryView.module.scss +++ b/ProductivitySuite/ui/react/src/pages/History/HistoryView.module.scss @@ -1,90 +1,82 @@ -.historyView{ - height: 100%; - width: 100%; - max-width: var(--content-width); - width: 100%; - margin: 0px auto; - padding: calc(var(--header-gutter) * 2); +.historyView { + height: 100%; + width: 100%; + max-width: var(--content-width); + width: 100%; + margin: 0px auto; + padding: calc(var(--header-gutter) * 2); - .historyListWrapper{ - display: flex; - flex-direction: column; - align-items: center; - @media screen and (min-width: 901px){ - flex-direction: row; - justify-content: space-between; - } - + .historyListWrapper { + display: flex; + flex-direction: column; + align-items: center; + @media screen and (min-width: 901px) { + flex-direction: row; + justify-content: space-between; } + } - .actions button{ + .actions button { + margin-left: 0.5rem; + margin-top: 0.5rem; + margin-bottom: 0.5rem; + &:first-of-type { + margin-left: 0; + } + @media screen and (min-width: 901px) { + margin-left: 0.5rem; + margin-bottom: 0; + margin-top: 0; + &:first-of-type { margin-left: 0.5rem; - margin-top: 0.5rem; - margin-bottom: 0.5rem; - &:first-of-type{ - margin-left: 0; - } - @media screen and (min-width: 901px){ - margin-left: 0.5rem; - margin-bottom: 0; - margin-top: 0; - &:first-of-type{ - margin-left: 0.5rem; - } - } + } } + } } -.historyItem{ - - margin-bottom: 1rem; - position: relative; - padding: 0; +.historyItem { + margin-bottom: 1rem; + position: relative; + padding: 0; - :global { - .MuiCheckbox-root{ - position: absolute; - right: 100%; - margin-right: 0.25rem; - top: 50%; - transform: translateY(-50%); - - @media screen and (min-width: 901px){ - margin-right: 1rem; - } - - } - } + :global { + .MuiCheckbox-root { + position: absolute; + right: 100%; + margin-right: 0.25rem; + top: 50%; + transform: translateY(-50%); - a{ - text-decoration: none; + @media screen and (min-width: 901px) { + margin-right: 1rem; + } } + } - .title{ - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; - overflow-wrap: break-word; - word-wrap: break-word; - word-break: break-word; - max-width: 100%; - } -} + a { + text-decoration: none; + } -.historyLink{ - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: flex-start; - width: 100%; - padding: 1rem; - margin: 0; - line-height: 1.5; + .title { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-word; + max-width: 100%; + } } - - - - +.historyLink { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: flex-start; + width: 100%; + padding: 1rem; + margin: 0; + line-height: 1.5; +} diff --git a/ProductivitySuite/ui/react/src/pages/History/HistoryView.tsx b/ProductivitySuite/ui/react/src/pages/History/HistoryView.tsx index e2b0cc9013..3a59e5e68e 100644 --- a/ProductivitySuite/ui/react/src/pages/History/HistoryView.tsx +++ b/ProductivitySuite/ui/react/src/pages/History/HistoryView.tsx @@ -1,181 +1,214 @@ -import { Box, Checkbox, FormControlLabel, List, ListItem, Typography, Link } from "@mui/material"; +import { + Box, + Checkbox, + FormControlLabel, + List, + ListItem, + Typography, + Link, +} from "@mui/material"; import { useTheme } from "@mui/material/styles"; import { useState } from "react"; import styles from "./HistoryView.module.scss"; -import { Link as RouterLink } from 'react-router-dom'; +import { Link as RouterLink } from "react-router-dom"; import { useAppDispatch, useAppSelector } from "@redux/store"; -import { conversationSelector, deleteConversation, deleteConversations } from "@redux/Conversation/ConversationSlice"; +import { + conversationSelector, + deleteConversation, + deleteConversations, +} from "@redux/Conversation/ConversationSlice"; import { Conversation } from "@redux/Conversation/Conversation"; import { userSelector } from "@redux/User/userSlice"; import SearchInput from "@components/SearchInput/SearchInput"; -import { DeleteButton, SolidButton, TextButton} from "@root/shared/ActionButtons"; +import { + DeleteButton, + SolidButton, + TextButton, +} from "@root/shared/ActionButtons"; interface HistoryViewProps { - shared: boolean; + shared: boolean; } const HistoryView: React.FC = ({ shared }) => { - - const dispatch = useAppDispatch(); - const { name } = useAppSelector(userSelector) - - const theme = useTheme(); - - const { conversations, sharedConversations } = useAppSelector(conversationSelector); - - const [historyList, setHistoryList] = useState(shared ? sharedConversations : conversations); - const [selectActive, setSelectActive] = useState(false); - const [selectAll, setSelectAll] = useState(false); - const [checkedItems, setCheckedItems] = useState>({}); - - const convertTime = (timestamp: number) => { - - const now = Math.floor(Date.now() / 1000); - const diffInSeconds = now - timestamp; - - const diffInMinutes = Math.floor(diffInSeconds / 60); - const diffInHours = Math.floor(diffInSeconds / 3600); - const diffInDays = Math.floor(diffInSeconds / 86400); - - if (diffInDays > 0) { - return `${diffInDays} day${diffInDays > 1 ? "s" : ""} ago`; - } else if (diffInHours > 0) { - return `${diffInHours} hour${diffInHours > 1 ? "s" : ""} ago`; - } else { - return `${diffInMinutes} minute${diffInMinutes > 1 ? "s" : ""} ago`; - } - }; - - const handleCheckboxChange = (conversationId: string) => { - setCheckedItems((prev) => ({ - ...prev, - [conversationId]: !prev[conversationId], - })); - }; - - const displayHistory = () => { - - return historyList.map((conversation: Conversation) => { - - const isChecked = !!checkedItems[conversation.id]; - - const itemText = ( - <> - {conversation.first_query} - {/* TODO: timestamp for all conversations? */} - {/* Last message {convertTime(conversation.updated_at)} */} - - ); - - const controlCheckBox = ( - handleCheckboxChange(conversation.id)} - checked={isChecked} /> - ); - - return ( - - {selectActive ? ( - - ) : ( - - {/* body1 Typography is automatically applied in label above, added here to match for spacing */} - {itemText} - - )} - - ); - }); - - }; - - const cancelSelect = () => { - setSelectActive(false); - setSelectAll(false); - setCheckedItems({}); + const dispatch = useAppDispatch(); + const { name } = useAppSelector(userSelector); + + const theme = useTheme(); + + const { conversations, sharedConversations } = + useAppSelector(conversationSelector); + + const [historyList, setHistoryList] = useState( + shared ? sharedConversations : conversations, + ); + const [selectActive, setSelectActive] = useState(false); + const [selectAll, setSelectAll] = useState(false); + const [checkedItems, setCheckedItems] = useState>({}); + + const convertTime = (timestamp: number) => { + const now = Math.floor(Date.now() / 1000); + const diffInSeconds = now - timestamp; + + const diffInMinutes = Math.floor(diffInSeconds / 60); + const diffInHours = Math.floor(diffInSeconds / 3600); + const diffInDays = Math.floor(diffInSeconds / 86400); + + if (diffInDays > 0) { + return `${diffInDays} day${diffInDays > 1 ? "s" : ""} ago`; + } else if (diffInHours > 0) { + return `${diffInHours} hour${diffInHours > 1 ? "s" : ""} ago`; + } else { + return `${diffInMinutes} minute${diffInMinutes > 1 ? "s" : ""} ago`; } - - const deleteSelected = () => { - - setSelectActive(false); - - let ids = []; - for (const [key, value] of Object.entries(checkedItems)) { - if (value === true) { - ids.push(key) - } - } - - if(ids.length > 0) { - - //update current state - setHistoryList((prev) => prev.filter((conversation) => !checkedItems[conversation.id])); - dispatch(deleteConversations({user: name, conversationIds: ids, useCase: ''})) - - } - - - - }; - - const handleSelectAll = () => { - - const newSelectAll = !selectAll; - setSelectAll(newSelectAll); - - // Add all items' checked state - const updatedCheckedItems: Record = {}; - historyList.forEach((conversation) => { - updatedCheckedItems[conversation.id] = newSelectAll; - }); - - setCheckedItems(updatedCheckedItems); - - }; - - const handleSearch = (value:string) => { - const filteredList = shared ? sharedConversations : conversations; - const searchResults = filteredList.filter((conversation: Conversation) => conversation.first_query?.toLowerCase().includes(value.toLowerCase())); - setHistoryList(value ? searchResults : shared ? sharedConversations : conversations); + }; + + const handleCheckboxChange = (conversationId: string) => { + setCheckedItems((prev) => ({ + ...prev, + [conversationId]: !prev[conversationId], + })); + }; + + const displayHistory = () => { + return historyList.map((conversation: Conversation) => { + const isChecked = !!checkedItems[conversation.id]; + + const itemText = ( + <> + + {conversation.first_query} + + {/* TODO: timestamp for all conversations? */} + {/* Last message {convertTime(conversation.updated_at)} */} + + ); + + const controlCheckBox = ( + handleCheckboxChange(conversation.id)} + checked={isChecked} + /> + ); + + return ( + + {selectActive ? ( + + ) : ( + + {/* body1 Typography is automatically applied in label above, added here to match for spacing */} + {itemText} + + )} + + ); + }); + }; + + const cancelSelect = () => { + setSelectActive(false); + setSelectAll(false); + setCheckedItems({}); + }; + + const deleteSelected = () => { + setSelectActive(false); + + let ids = []; + for (const [key, value] of Object.entries(checkedItems)) { + if (value === true) { + ids.push(key); + } } - return ( -
- - - -
- You have {historyList.length} previous chat{historyList.length > 1 && 's'} - - {historyList.length > 0 && ( -
- {selectActive - ? handleSelectAll()}>Select All - : setSelectActive(true)}>Select - } - - {selectActive && ( - <> - cancelSelect()}>Cancel - deleteSelected()}>Delete Selected - - )} -
- )} - -
- - - {displayHistory()} - -
- ) + if (ids.length > 0) { + //update current state + setHistoryList((prev) => + prev.filter((conversation) => !checkedItems[conversation.id]), + ); + dispatch( + deleteConversations({ user: name, conversationIds: ids, useCase: "" }), + ); + } + }; + + const handleSelectAll = () => { + const newSelectAll = !selectAll; + setSelectAll(newSelectAll); + + // Add all items' checked state + const updatedCheckedItems: Record = {}; + historyList.forEach((conversation) => { + updatedCheckedItems[conversation.id] = newSelectAll; + }); + + setCheckedItems(updatedCheckedItems); + }; + + const handleSearch = (value: string) => { + const filteredList = shared ? sharedConversations : conversations; + const searchResults = filteredList.filter((conversation: Conversation) => + conversation.first_query?.toLowerCase().includes(value.toLowerCase()), + ); + setHistoryList( + value ? searchResults : shared ? sharedConversations : conversations, + ); + }; + + return ( +
+ + +
+ + You have {historyList.length} previous chat + {historyList.length > 1 && "s"} + + + {historyList.length > 0 && ( +
+ {selectActive ? ( + handleSelectAll()}> + Select All + + ) : ( + setSelectActive(true)}> + Select + + )} + + {selectActive && ( + <> + cancelSelect()}>Cancel + deleteSelected()}> + Delete Selected + + + )} +
+ )} +
+ + {displayHistory()} +
+ ); }; -export default HistoryView; \ No newline at end of file +export default HistoryView; diff --git a/ProductivitySuite/ui/react/src/pages/Home/Home.module.scss b/ProductivitySuite/ui/react/src/pages/Home/Home.module.scss index 552ef48bef..b4fd3df4cb 100644 --- a/ProductivitySuite/ui/react/src/pages/Home/Home.module.scss +++ b/ProductivitySuite/ui/react/src/pages/Home/Home.module.scss @@ -1,40 +1,39 @@ -.homeView{ - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - min-height: 100%; - padding: calc(var(--header-gutter) * 2); +.homeView { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 100%; + padding: calc(var(--header-gutter) * 2); - .title{ - text-align: center; - - background-clip: text; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - } + .title { + text-align: center; - .buttonRow{ - margin-top: var(--vertical-spacer); - justify-content: center; - } + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } - .promptWrapper{ - width: 100%; - max-width: 775px; - } + .buttonRow { + margin-top: var(--vertical-spacer); + justify-content: center; + } - .inputContainer{ - width: 100%; - max-width: 800px; - margin-top: var(--vertical-spacer); - } - - .disclaimer{ - width: 100%; - max-width: 600px; - margin-top: var(--vertical-spacer); - font-size: 14px; - } -} + .promptWrapper { + width: 100%; + max-width: 775px; + } + .inputContainer { + width: 100%; + max-width: 800px; + margin-top: var(--vertical-spacer); + } + + .disclaimer { + width: 100%; + max-width: 600px; + margin-top: var(--vertical-spacer); + font-size: 14px; + } +} diff --git a/ProductivitySuite/ui/react/src/pages/Home/Home.tsx b/ProductivitySuite/ui/react/src/pages/Home/Home.tsx index 2a9b5fbbbd..4cefc32ea9 100644 --- a/ProductivitySuite/ui/react/src/pages/Home/Home.tsx +++ b/ProductivitySuite/ui/react/src/pages/Home/Home.tsx @@ -1,94 +1,102 @@ - - -import { Button, Typography, Grid2, styled } from '@mui/material'; -import {AtomIcon, AtomAnimation} from "@icons/Atom"; -import PrimaryInput from '@components/PrimaryInput/PrimaryInput'; +import { Button, Typography, Grid2, styled } from "@mui/material"; +import { AtomIcon, AtomAnimation } from "@icons/Atom"; +import PrimaryInput from "@components/PrimaryInput/PrimaryInput"; import config from "@root/config"; -import PromptSettings from '@components/PromptSettings/PromptSettings'; -import styles from './Home.module.scss'; +import PromptSettings from "@components/PromptSettings/PromptSettings"; +import styles from "./Home.module.scss"; -import { useNavigate } from 'react-router-dom'; -import { useAppDispatch, useAppSelector } from '@redux/store'; +import { useNavigate } from "react-router-dom"; +import { useAppDispatch, useAppSelector } from "@redux/store"; import { userSelector } from "@redux/User/userSlice"; -import { conversationSelector, setType, newConversation } from '@redux/Conversation/ConversationSlice'; -import { useEffect } from 'react'; +import { + conversationSelector, + setType, + newConversation, +} from "@redux/Conversation/ConversationSlice"; +import { useEffect } from "react"; interface InitialStateProps { - initialMessage: string; + initialMessage: string; } -const HomeButton = styled(Button)(({theme})=>({ - ...theme.customStyles.homeButtons, - })); - - const HomeTitle = styled(Typography)(({theme})=>({ - ...theme.customStyles.homeTitle, - })); - -const Home = () => { - - const { disclaimer } = config; +const HomeButton = styled(Button)(({ theme }) => ({ + ...theme.customStyles.homeButtons, +})); - const { type, types, token, model, temperature } = useAppSelector(conversationSelector) - const dispatch = useAppDispatch() +const HomeTitle = styled(Typography)(({ theme }) => ({ + ...theme.customStyles.homeTitle, +})); - const { name } = useAppSelector(userSelector) +const Home = () => { + const { disclaimer } = config; - const navigate = useNavigate(); + const { type, types, token, model, temperature } = + useAppSelector(conversationSelector); + const dispatch = useAppDispatch(); - const handleSendMessage = async (messageContent: string) => { + const { name } = useAppSelector(userSelector); - const initialState: InitialStateProps = { - initialMessage: messageContent - } - - navigate(`/${type}/new`, { state: initialState }); + const navigate = useNavigate(); + const handleSendMessage = async (messageContent: string) => { + const initialState: InitialStateProps = { + initialMessage: messageContent, }; - const handleTypeChange = (updateType: string) => { - dispatch(setType(updateType)) - } - - useEffect(()=>{ - // clean up and reset. Can happen on going home from history/updload convo - // if convo is missing one of these - if(!model || !token || !temperature){ - dispatch(newConversation(true)) - } - }, []) - - return ( -
+ navigate(`/${type}/new`, { state: initialState }); + }; - {/* */} - + const handleTypeChange = (updateType: string) => { + dispatch(setType(updateType)); + }; - Hi, {name}. {config.tagline} - - - {types.map((interactionType, index) => ( - handleTypeChange(interactionType.key)} - aria-selected={type === interactionType.key} - startIcon={} - variant="contained">{interactionType.name} - ))} - - -
- -
- - -
- -
- -
- -
- ); -} - -export default Home; \ No newline at end of file + useEffect(() => { + // clean up and reset. Can happen on going home from history/updload convo + // if convo is missing one of these + if (!model || !token || !temperature) { + dispatch(newConversation(true)); + } + }, []); + + return ( +
+ {/* */} + + + + Hi, {name}. {config.tagline} + + + + {types.map((interactionType, index) => ( + handleTypeChange(interactionType.key)} + aria-selected={type === interactionType.key} + startIcon={ + + } + variant="contained" + > + {interactionType.name} + + ))} + + +
+ +
+ +
+ +
+ +
+
+ ); +}; + +export default Home; diff --git a/ProductivitySuite/ui/react/src/redux/Conversation/Conversation.ts b/ProductivitySuite/ui/react/src/redux/Conversation/Conversation.ts index a92f103dcd..c9b26f5a48 100644 --- a/ProductivitySuite/ui/react/src/redux/Conversation/Conversation.ts +++ b/ProductivitySuite/ui/react/src/redux/Conversation/Conversation.ts @@ -33,7 +33,7 @@ export type CodeRequest = { type: string; token?: number; temperature?: number; -} +}; export type SummaryFaqRequest = { conversationId: string; @@ -44,7 +44,7 @@ export type SummaryFaqRequest = { temperature: number; token: number; type: string; -} +}; export enum MessageRole { Assistant = "assistant", @@ -60,8 +60,8 @@ export interface Message { } export interface ChatMessageProps { - message: Message; - pending?: boolean; + message: Message; + pending?: boolean; } export interface Conversation { @@ -73,7 +73,8 @@ export type file = { name: string; id: string; type: string; - parent: string;}; + parent: string; +}; export interface ConversationReducer { selectedConversationId: string; @@ -84,9 +85,9 @@ export interface ConversationReducer { isPending: boolean; filesInDataSource: file[]; dataSourceUrlStatus: string; - + useCase: string; - useCases: UseCase[], + useCases: UseCase[]; model: string; models: Model[]; type: string; @@ -101,8 +102,8 @@ export interface ConversationReducer { sourceType: string; sourceLinks: string[]; sourceFiles: any[]; - + abortController: AbortController | null; - uploadInProgress: boolean + uploadInProgress: boolean; } diff --git a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts index 602cb33931..6aa30f0d2e 100644 --- a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts @@ -1,10 +1,20 @@ import { PayloadAction, createSlice } from "@reduxjs/toolkit"; import { RootState, store } from "@redux/store"; import { fetchEventSource } from "@microsoft/fetch-event-source"; -import { Message, MessageRole, ConversationReducer, ConversationRequest, Conversation, Model, UseCase, CodeRequest, SummaryFaqRequest } from "./Conversation"; +import { + Message, + MessageRole, + ConversationReducer, + ConversationRequest, + Conversation, + Model, + UseCase, + CodeRequest, + SummaryFaqRequest, +} from "./Conversation"; import { getCurrentTimeStamp } from "@utils/utils"; import { createAsyncThunkWrapper } from "@redux/thunkUtil"; -import axios from 'axios'; +import axios from "axios"; import config, { CHAT_QNA_URL, @@ -18,34 +28,42 @@ import config, { DOC_SUM_URL, FAQ_GEN_URL, } from "@root/config"; -import { NotificationSeverity, notify } from "@components/Notification/Notification"; -import { ChatBubbleOutline, CodeOutlined, Description, QuizOutlined } from "@mui/icons-material"; +import { + NotificationSeverity, + notify, +} from "@components/Notification/Notification"; +import { + ChatBubbleOutline, + CodeOutlined, + Description, + QuizOutlined, +} from "@mui/icons-material"; const urlMap: any = { summary: DOC_SUM_URL, faq: FAQ_GEN_URL, chat: CHAT_QNA_URL, - code: CODE_GEN_URL -} + code: CODE_GEN_URL, +}; const interactionTypes = [ { - key: 'chat', - name: 'Chat Q&A', + key: "chat", + name: "Chat Q&A", icon: ChatBubbleOutline, - color: '#0ACA00' + color: "#0ACA00", }, { - key: 'summary', - name: 'Summarize Content', + key: "summary", + name: "Summarize Content", icon: Description, - color: '#FF4FFC' + color: "#FF4FFC", }, { - key: 'code', - name: 'Generate Code', + key: "code", + name: "Generate Code", icon: CodeOutlined, - color: '#489BEA' + color: "#489BEA", }, // TODO: Enable file upload support for faqgen endpoint similar to summary // { @@ -54,8 +72,7 @@ const interactionTypes = [ // icon: QuizOutlined, // color: '#9D00FF' // }, - -] +]; const initialState: ConversationReducer = { conversations: [], @@ -67,11 +84,11 @@ const initialState: ConversationReducer = { filesInDataSource: [], dataSourceUrlStatus: "", - useCase: '', + useCase: "", useCases: [], model: "", models: [], - type: 'chat', + type: "chat", types: interactionTypes, systemPrompt: config.defaultChatPrompt, minToken: 100, @@ -80,13 +97,13 @@ const initialState: ConversationReducer = { minTemperature: 0, maxTemperature: 1, temperature: 0.4, - sourceType: 'documents', + sourceType: "documents", sourceLinks: [], sourceFiles: [], abortController: null, - uploadInProgress: false + uploadInProgress: false, }; export const ConversationSlice = createSlice({ @@ -115,19 +132,20 @@ export const ConversationSlice = createSlice({ state.selectedConversationHistory = []; // full reset if true - if(action.payload){ - state.sourceLinks = [], - state.sourceFiles = []; + if (action.payload) { + (state.sourceLinks = []), (state.sourceFiles = []); - // in case of upload / history conversation that clears model name, we want to reset to defaults - const currentType = state.type + // in case of upload / history conversation that clears model name, we want to reset to defaults + const currentType = state.type; if (currentType) { - const approvedModel = state.models.find((item: Model) => item.types.includes(currentType)); + const approvedModel = state.models.find((item: Model) => + item.types.includes(currentType), + ); if (approvedModel) { state.model = approvedModel.model_name; state.token = approvedModel.minToken; state.temperature = 0.4; - }; + } } } }, @@ -140,7 +158,10 @@ export const ConversationSlice = createSlice({ setSelectedConversationId: (state, action: PayloadAction) => { state.selectedConversationId = action.payload; }, - setSelectedConversationHistory: (state, action: PayloadAction) => { + setSelectedConversationHistory: ( + state, + action: PayloadAction, + ) => { state.selectedConversationHistory = action.payload; }, setTemperature: (state, action: PayloadAction) => { @@ -170,22 +191,23 @@ export const ConversationSlice = createSlice({ state.type = action.payload; switch (action.payload) { - case 'summary': - case 'faq': - state.systemPrompt = ''; - state.sourceType = 'documents'; + case "summary": + case "faq": + state.systemPrompt = ""; + state.sourceType = "documents"; break; - case 'chat': - case 'code': + case "chat": + case "code": state.systemPrompt = config.defaultChatPrompt; state.sourceFiles = []; state.sourceLinks = []; break; } - let firstModel = state.models.find((model: Model) => model.types.includes(action.payload)); - state.model = firstModel?.model_name || state.models[0].model_name - + let firstModel = state.models.find((model: Model) => + model.types.includes(action.payload), + ); + state.model = firstModel?.model_name || state.models[0].model_name; }, setUploadInProgress: (state, action: PayloadAction) => { state.uploadInProgress = action.payload; @@ -202,11 +224,13 @@ export const ConversationSlice = createSlice({ setSystemPrompt: (state, action: PayloadAction) => { state.systemPrompt = action.payload; }, - setAbortController: (state, action: PayloadAction) => { + setAbortController: ( + state, + action: PayloadAction, + ) => { state.abortController = action.payload; }, abortStream: (state) => { - if (state.abortController) state.abortController.abort(); const m: Message = { @@ -217,7 +241,7 @@ export const ConversationSlice = createSlice({ // add last message before ending state.selectedConversationHistory.push(m); - state.onGoingResult = '' + state.onGoingResult = ""; state.abortController = null; }, setDataSourceUrlStatus: (state, action: PayloadAction) => { @@ -235,21 +259,21 @@ export const ConversationSlice = createSlice({ }, extraReducers(builder) { builder.addCase(uploadFile.fulfilled, () => { - notify("File Uploaded Successfully", NotificationSeverity.SUCCESS) + notify("File Uploaded Successfully", NotificationSeverity.SUCCESS); }); builder.addCase(uploadFile.rejected, () => { - notify("Failed to Upload file", NotificationSeverity.ERROR) + notify("Failed to Upload file", NotificationSeverity.ERROR); }); builder.addCase(submitDataSourceURL.fulfilled, (state) => { notify("Submitted Successfully", NotificationSeverity.SUCCESS); - state.dataSourceUrlStatus = ''; // watching for pending only on front + state.dataSourceUrlStatus = ""; // watching for pending only on front }); builder.addCase(submitDataSourceURL.rejected, (state) => { - notify("Submit Failed", NotificationSeverity.ERROR) - state.dataSourceUrlStatus = ''; // watching for pending only on front + notify("Submit Failed", NotificationSeverity.ERROR); + state.dataSourceUrlStatus = ""; // watching for pending only on front }); builder.addCase(deleteConversation.rejected, () => { - notify("Failed to Delete Conversation", NotificationSeverity.ERROR) + notify("Failed to Delete Conversation", NotificationSeverity.ERROR); }); builder.addCase(getAllConversations.fulfilled, (state, action) => { state.conversations = action.payload; @@ -264,22 +288,20 @@ export const ConversationSlice = createSlice({ id: action.payload, first_query: state.selectedConversationHistory[1].content, }); - window.history.pushState({}, '', `/chat/${action.payload}`); + window.history.pushState({}, "", `/chat/${action.payload}`); } }); builder.addCase(getAllFilesInDataSource.fulfilled, (state, action) => { state.filesInDataSource = action.payload; }); - }, }); export const getSupportedUseCases = createAsyncThunkWrapper( "public/usecase_configs.json", async (_: void, { getState }) => { - - const response = await axios.get('/usecase_configs.json'); - store.dispatch(setUseCases(response.data)) + const response = await axios.get("/usecase_configs.json"); + store.dispatch(setUseCases(response.data)); // @ts-ignore const state: RootState = getState(); @@ -288,8 +310,10 @@ export const getSupportedUseCases = createAsyncThunkWrapper( // setDefault use case if not stored / already set by localStorage if (!currentUseCase) { - const approvedAccess = response.data.find((item: UseCase) => item.access_level === userAccess); - if (approvedAccess) store.dispatch(setUseCase(approvedAccess)) + const approvedAccess = response.data.find( + (item: UseCase) => item.access_level === userAccess, + ); + if (approvedAccess) store.dispatch(setUseCase(approvedAccess)); } return response.data; @@ -299,18 +323,20 @@ export const getSupportedUseCases = createAsyncThunkWrapper( export const getSupportedModels = createAsyncThunkWrapper( "public/model_configs.json", async (_: void, { getState }) => { - const response = await axios.get('/model_configs.json'); - store.dispatch(setModels(response.data)) + const response = await axios.get("/model_configs.json"); + store.dispatch(setModels(response.data)); // @ts-ignore const state: RootState = getState(); const currentModel = state.conversationReducer.model; - const currentType = state.conversationReducer.type + const currentType = state.conversationReducer.type; // setDefault use case if not stored / already set by localStorage // TODO: revisit if type also gets stored and not defaulted on state if (!currentModel && currentType) { - const approvedModel = response.data.find((item: Model) => item.types.includes(currentType)); + const approvedModel = response.data.find((item: Model) => + item.types.includes(currentType), + ); if (approvedModel) store.dispatch(setModel(approvedModel)); } @@ -320,32 +346,36 @@ export const getSupportedModels = createAsyncThunkWrapper( export const getAllConversations = createAsyncThunkWrapper( "conversation/getAllConversations", - async ({ user, useCase }: { user: string, useCase: string }, { }) => { - + async ({ user, useCase }: { user: string; useCase: string }, {}) => { //TODO: Add useCase const response = await axios.post(CHAT_HISTORY_GET, { user, }); - + return response.data.reverse(); }, ); export const getConversationHistory = createAsyncThunkWrapper( "conversation/getConversationHistory", - async ({ user, conversationId }: { user: string; conversationId: string }, { }) => { + async ( + { user, conversationId }: { user: string; conversationId: string }, + {}, + ) => { const response = await axios.post(CHAT_HISTORY_GET, { user, id: conversationId, }); // update settings for response settings modal - store.dispatch(updatePromptSettings({ - model: response.data.model, - token: response.data.max_tokens, - temperature: response.data.temperature, - type: response.data.request_type - })) + store.dispatch( + updatePromptSettings({ + model: response.data.model, + token: response.data.max_tokens, + temperature: response.data.temperature, + type: response.data.request_type, + }), + ); return response.data.messages; }, @@ -354,7 +384,7 @@ export const getConversationHistory = createAsyncThunkWrapper( export const submitDataSourceURL = createAsyncThunkWrapper( "conversation/submitDataSourceURL", async ({ link_list }: { link_list: string[] }, { dispatch }) => { - dispatch(setDataSourceUrlStatus('pending')) + dispatch(setDataSourceUrlStatus("pending")); const body = new FormData(); body.append("link_list", JSON.stringify(link_list)); // body.append("parent", "appData"); // TODO: this did not work, in an attempt to sort data types @@ -366,7 +396,7 @@ export const submitDataSourceURL = createAsyncThunkWrapper( export const getAllFilesInDataSource = createAsyncThunkWrapper( "conversation/getAllFilesInDataSource", - async ({ knowledgeBaseId }: { knowledgeBaseId: string }, { }) => { + async ({ knowledgeBaseId }: { knowledgeBaseId: string }, {}) => { const body = { knowledge_base_id: knowledgeBaseId, }; @@ -389,29 +419,32 @@ export const uploadFile = createAsyncThunkWrapper( export const deleteMultipleInDataSource = createAsyncThunkWrapper( "conversation/deleteConversations", async ({ files }: { files: string[] }, { dispatch }) => { - const promises = files.map((file) => axios - .post(DATA_PREP_DELETE_URL, { - file_path: file.split("_")[1], - }) - .then((response) => { + .post(DATA_PREP_DELETE_URL, { + file_path: file.split("_")[1], + }) + .then((response) => { return response.data; - }) - .catch((err) => { - notify('Error deleting file', NotificationSeverity.ERROR); - console.error(`Error deleting file`, file, err) - }) + }) + .catch((err) => { + notify("Error deleting file", NotificationSeverity.ERROR); + console.error(`Error deleting file`, file, err); + }), ); await Promise.all(promises) .then(() => { - notify('Files deleted successfully', NotificationSeverity.SUCCESS); + notify("Files deleted successfully", NotificationSeverity.SUCCESS); }) .catch((err) => { - notify('Error deleting on or more of your files', NotificationSeverity.ERROR); - console.error('Error deleting on or more of your files', err) - }).finally(()=>{ + notify( + "Error deleting on or more of your files", + NotificationSeverity.ERROR, + ); + console.error("Error deleting on or more of your files", err); + }) + .finally(() => { dispatch(getAllFilesInDataSource({ knowledgeBaseId: "default" })); }); }, @@ -430,14 +463,17 @@ export const deleteInDataSource = createAsyncThunkWrapper( export const saveConversationtoDatabase = createAsyncThunkWrapper( "conversation/saveConversationtoDatabase", - async ({ conversation }: { conversation: Conversation }, { dispatch, getState }) => { - + async ( + { conversation }: { conversation: Conversation }, + { dispatch, getState }, + ) => { // @ts-ignore const state: RootState = getState(); - const selectedConversationHistory = state.conversationReducer.selectedConversationHistory; + const selectedConversationHistory = + state.conversationReducer.selectedConversationHistory; //TODO: if we end up with a systemPrompt for code change this - const firstMessageIndex = state.conversationReducer.type === 'code' ? 0 : 1; + const firstMessageIndex = state.conversationReducer.type === "code" ? 0 : 1; const response = await axios.post(CHAT_HISTORY_CREATE, { data: { @@ -447,45 +483,62 @@ export const saveConversationtoDatabase = createAsyncThunkWrapper( model: state.conversationReducer.model, temperature: state.conversationReducer.temperature, max_tokens: state.conversationReducer.token, - request_type: state.conversationReducer.type + request_type: state.conversationReducer.type, }, id: conversation.id == "" ? null : conversation.id, first_query: selectedConversationHistory[firstMessageIndex].content, - }); - dispatch(getAllConversations({ user: state.userReducer.name, useCase: state.conversationReducer.useCase })); + dispatch( + getAllConversations({ + user: state.userReducer.name, + useCase: state.conversationReducer.useCase, + }), + ); return response.data; }, ); export const deleteConversations = createAsyncThunkWrapper( "conversation/deleteConversations", - async ({ user, conversationIds, useCase }: { user: string; conversationIds: string[]; useCase: string }, { dispatch }) => { - + async ( + { + user, + conversationIds, + useCase, + }: { user: string; conversationIds: string[]; useCase: string }, + { dispatch }, + ) => { const promises = conversationIds.map((id) => axios - .post(CHAT_HISTORY_DELETE, { - user, - id: id, - }) - .then((response) => { + .post(CHAT_HISTORY_DELETE, { + user, + id: id, + }) + .then((response) => { return response.data; - }) - .catch((err) => { - notify('Error deleting conversation', NotificationSeverity.ERROR); - console.error(`Error deleting conversation ${id}`, err) - }) + }) + .catch((err) => { + notify("Error deleting conversation", NotificationSeverity.ERROR); + console.error(`Error deleting conversation ${id}`, err); + }), ); await Promise.all(promises) .then(() => { - notify('Conversations deleted successfully', NotificationSeverity.SUCCESS); + notify( + "Conversations deleted successfully", + NotificationSeverity.SUCCESS, + ); }) .catch((err) => { - notify('Error deleting on or more of your conversations', NotificationSeverity.ERROR); - console.error('Error deleting on or more of your conversations', err) - }).finally(()=>{ + notify( + "Error deleting on or more of your conversations", + NotificationSeverity.ERROR, + ); + console.error("Error deleting on or more of your conversations", err); + }) + .finally(() => { dispatch(getAllConversations({ user, useCase })); }); }, @@ -493,7 +546,14 @@ export const deleteConversations = createAsyncThunkWrapper( export const deleteConversation = createAsyncThunkWrapper( "conversation/delete", - async ({ user, conversationId, useCase }: { user: string; conversationId: string; useCase: string }, { dispatch }) => { + async ( + { + user, + conversationId, + useCase, + }: { user: string; conversationId: string; useCase: string }, + { dispatch }, + ) => { const response = await axios.post(CHAT_HISTORY_DELETE, { user, id: conversationId, @@ -506,24 +566,29 @@ export const deleteConversation = createAsyncThunkWrapper( ); export const doConversation = (conversationRequest: ConversationRequest) => { - store.dispatch(setIsPending(true)); - - const { conversationId, userPrompt, messages, model, token, temperature, type } = conversationRequest; - // TODO: MAYBE... check first message if 'system' already exists... on dev during page edits the + const { + conversationId, + userPrompt, + messages, + model, + token, + temperature, + type, + } = conversationRequest; + + // TODO: MAYBE... check first message if 'system' already exists... on dev during page edits the // hot module reloads and instantly adds more system messages to the total messages if (messages.length === 1) store.dispatch(addMessageToMessages(messages[0])); // do not re-add system prompt store.dispatch(addMessageToMessages(userPrompt)); - const userPromptWithTime = { role: userPrompt.role, content: userPrompt.content, time: getCurrentTimeStamp().toString(), }; - const body = { messages: [...messages, userPromptWithTime], model: model, @@ -532,16 +597,21 @@ export const doConversation = (conversationRequest: ConversationRequest) => { }; eventStream(type, body, conversationId); - - - }; export const doSummaryFaq = (summaryFaqRequest: SummaryFaqRequest) => { - store.dispatch(setIsPending(true)); - - const { conversationId, model, token, temperature, type, messages, files, userPrompt } = summaryFaqRequest; + + const { + conversationId, + model, + token, + temperature, + type, + messages, + files, + userPrompt, + } = summaryFaqRequest; const postWithFiles = files && files.length > 0; @@ -551,37 +621,32 @@ export const doSummaryFaq = (summaryFaqRequest: SummaryFaqRequest) => { store.dispatch(addMessageToMessages(userPrompt)); if (postWithFiles) { - - formData.append("messages", '') - formData.append("model", model) - formData.append("max_tokens", token.toString()) - formData.append("type", "text") - formData.append("temperature", temperature.toString()) + formData.append("messages", ""); + formData.append("model", model); + formData.append("max_tokens", token.toString()); + formData.append("type", "text"); + formData.append("temperature", temperature.toString()); files.forEach((file) => { formData.append("files", file.file); }); - formDataEventStream(urlMap[type], formData) - + formDataEventStream(urlMap[type], formData); } else { body.messages = messages; body.model = model; - body.max_tokens = token, - body.temperature = temperature; + (body.max_tokens = token), (body.temperature = temperature); body.type = "text"; eventStream(type, body, conversationId); - } - -} +}; export const doCodeGen = (codeRequest: CodeRequest) => { - store.dispatch(setIsPending(true)); - - const { conversationId, userPrompt, model, token, temperature, type } = codeRequest; + + const { conversationId, userPrompt, model, token, temperature, type } = + codeRequest; store.dispatch(addMessageToMessages(userPrompt)); @@ -589,24 +654,20 @@ export const doCodeGen = (codeRequest: CodeRequest) => { messages: userPrompt.content, model: model, //'meta-llama/Llama-3.3-70B-Instruct', max_tokens: token, - temperature: temperature + temperature: temperature, }; eventStream(type, body, conversationId); - }; - -const eventStream = (type: string, body: any, conversationId: string = '') => { - +const eventStream = (type: string, body: any, conversationId: string = "") => { const abortController = new AbortController(); - store.dispatch(setAbortController(abortController)) + store.dispatch(setAbortController(abortController)); const signal = abortController.signal; let result = ""; try { - fetchEventSource(urlMap[type], { method: "POST", body: JSON.stringify(body), @@ -619,26 +680,28 @@ const eventStream = (type: string, body: any, conversationId: string = '') => { if (response.ok) { store.dispatch(setIsPending(false)); return; - } else if (response.status >= 400 && response.status < 500 && response.status !== 429) { + } else if ( + response.status >= 400 && + response.status < 500 && + response.status !== 429 + ) { const e = await response.json(); console.log(e); throw Error(e.error.message); } else { console.log("error", response); - notify("Error in opening stream", NotificationSeverity.ERROR) + notify("Error in opening stream", NotificationSeverity.ERROR); } }, onmessage(msg) { if (msg?.data != "[DONE]") { - try { - if(type === 'code'){ + if (type === "code") { const parsedData = JSON.parse(msg.data); result += parsedData.choices[0].text; store.dispatch(setOnGoingResult(result)); } - if(type !== 'summary' && type !== 'faq'){ - + if (type !== "summary" && type !== "faq") { //parse content for data: "b" const match = msg.data.match(/b'([^']*)'/); if (match && match[1] != "") { @@ -646,42 +709,39 @@ const eventStream = (type: string, body: any, conversationId: string = '') => { result += extractedText; store.dispatch(setOnGoingResult(result)); } - } else { - //text summary/faq for data: "ops string" const res = JSON.parse(msg.data); // Parse valid JSON const logs = res.ops; - logs.forEach((log: { op: string; path: string; value: string }) => { - if (log.op === "add") { - if ( - log.value !== "
" && log.path.endsWith("/streamed_output/-") && log.path.length > "/streamed_output/-".length - ) { - result += log.value; - if (log.value) store.dispatch(setOnGoingResult(result)); + logs.forEach( + (log: { op: string; path: string; value: string }) => { + if (log.op === "add") { + if ( + log.value !== "" && + log.path.endsWith("/streamed_output/-") && + log.path.length > "/streamed_output/-".length + ) { + result += log.value; + if (log.value) store.dispatch(setOnGoingResult(result)); + } } - } - }) - + }, + ); } - } catch (e) { console.log("something wrong in msg", e); - notify("Error in message response", NotificationSeverity.ERROR) + notify("Error in message response", NotificationSeverity.ERROR); throw e; } - } }, onerror(err) { console.log("error", err); store.dispatch(setOnGoingResult("")); - notify("Error streaming response", NotificationSeverity.ERROR) + notify("Error streaming response", NotificationSeverity.ERROR); throw err; - }, onclose() { - const m: Message = { role: MessageRole.Assistant, content: result, @@ -689,10 +749,10 @@ const eventStream = (type: string, body: any, conversationId: string = '') => { }; store.dispatch(setOnGoingResult("")); - store.dispatch(setAbortController(null)) + store.dispatch(setAbortController(null)); store.dispatch(addMessageToMessages(m)); - if(type === 'chat'){ + if (type === "chat") { store.dispatch( saveConversationtoDatabase({ conversation: { @@ -701,119 +761,109 @@ const eventStream = (type: string, body: any, conversationId: string = '') => { }), ); } - - }, }); } catch (err) { console.log(err); } - -} +}; const formDataEventStream = async (url: string, formData: any) => { - const abortController = new AbortController(); - store.dispatch(setAbortController(abortController)) + store.dispatch(setAbortController(abortController)); const signal = abortController.signal; - let result = ''; + let result = ""; try { + const response = await fetch(url, { + method: "POST", + body: formData, + signal, + }); - const response = await fetch(url, { - method: 'POST', - body: formData, - signal - }); - - if (!response.ok) { - throw new Error('Network response was not ok'); - } - - if (response && response.body) { - store.dispatch(setIsPending(false)); - - const reader = response.body.getReader(); - - // Read the stream in chunks - while (true) { - - const { done, value } = await reader.read(); - if (done) { - break; - } - - // Process the chunk of data (e.g., convert to text) - const textChunk = new TextDecoder().decode(value).trim(); + if (!response.ok) { + throw new Error("Network response was not ok"); + } - // somtimes double lines return - const lines = textChunk.split("\n"); + if (response && response.body) { + store.dispatch(setIsPending(false)); - for (let line of lines) { + const reader = response.body.getReader(); - if (line.startsWith("data:")) { + // Read the stream in chunks + while (true) { + const { done, value } = await reader.read(); + if (done) { + break; + } - const jsonStr = line.replace(/^data:\s*/, ""); // Remove "data: " + // Process the chunk of data (e.g., convert to text) + const textChunk = new TextDecoder().decode(value).trim(); - if (jsonStr !== "[DONE]") { + // somtimes double lines return + const lines = textChunk.split("\n"); - try { + for (let line of lines) { + if (line.startsWith("data:")) { + const jsonStr = line.replace(/^data:\s*/, ""); // Remove "data: " - // API Response for final output regularly returns incomplete JSON, - // due to final response containing source summary content and exceeding - // token limit in the response. We don't use it anyway so don't parse it. - if(!jsonStr.includes('"path":"/streamed_output/-"')){ + if (jsonStr !== "[DONE]") { + try { + // API Response for final output regularly returns incomplete JSON, + // due to final response containing source summary content and exceeding + // token limit in the response. We don't use it anyway so don't parse it. + if (!jsonStr.includes('"path":"/streamed_output/-"')) { + const res = JSON.parse(jsonStr); // Parse valid JSON - const res = JSON.parse(jsonStr); // Parse valid JSON - - const logs = res.ops; - logs.forEach((log: { op: string; path: string; value: string }) => { + const logs = res.ops; + logs.forEach( + (log: { op: string; path: string; value: string }) => { if (log.op === "add") { if ( - log.value !== "
" && log.path.endsWith("/streamed_output/-") && log.path.length > "/streamed_output/-".length + log.value !== "" && + log.path.endsWith("/streamed_output/-") && + log.path.length > "/streamed_output/-".length ) { result += log.value; - if (log.value) store.dispatch(setOnGoingResult(result)); + if (log.value) + store.dispatch(setOnGoingResult(result)); } } - }) - - } - - } catch (error) { - console.warn("Error parsing JSON:", error, "Raw Data:", jsonStr); + }, + ); } - - } else { - - const m: Message = { - role: MessageRole.Assistant, - content: result, - time: getCurrentTimeStamp().toString(), - }; - - store.dispatch(setOnGoingResult("")); - store.dispatch(addMessageToMessages(m)); - store.dispatch(setAbortController(null)) - + } catch (error) { + console.warn( + "Error parsing JSON:", + error, + "Raw Data:", + jsonStr, + ); } + } else { + const m: Message = { + role: MessageRole.Assistant, + content: result, + time: getCurrentTimeStamp().toString(), + }; + + store.dispatch(setOnGoingResult("")); + store.dispatch(addMessageToMessages(m)); + store.dispatch(setAbortController(null)); } } - } - - } - - } catch (error:any) { - if (error.name === "AbortError") { - console.log("Fetch aborted successfully."); - } else { - console.error("Fetch error:", error); } } - -} + } catch (error: any) { + if (error.name === "AbortError") { + console.log("Fetch aborted successfully."); + } else { + console.error("Fetch error:", error); + } + } +}; export const { logout, @@ -840,7 +890,8 @@ export const { setAbortController, abortStream, setDataSourceUrlStatus, - uploadChat + uploadChat, } = ConversationSlice.actions; -export const conversationSelector = (state: RootState) => state.conversationReducer; -export default ConversationSlice.reducer; \ No newline at end of file +export const conversationSelector = (state: RootState) => + state.conversationReducer; +export default ConversationSlice.reducer; diff --git a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts index 0e9e1e6099..0e289903ab 100644 --- a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts @@ -1,9 +1,16 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createAsyncThunkWrapper } from "@redux/thunkUtil"; import { RootState } from "@redux/store"; -import { PROMPT_MANAGER_CREATE, PROMPT_MANAGER_GET, PROMPT_MANAGER_DELETE } from "@root/config"; -import { NotificationSeverity, notify } from "@components/Notification/Notification"; -import axios from 'axios'; +import { + PROMPT_MANAGER_CREATE, + PROMPT_MANAGER_GET, + PROMPT_MANAGER_DELETE, +} from "@root/config"; +import { + NotificationSeverity, + notify, +} from "@components/Notification/Notification"; +import axios from "axios"; type promptReducer = { prompts: Prompt[]; @@ -13,7 +20,7 @@ export type Prompt = { id: string; prompt_text: string; user: string; - type: string + type: string; }; const initialState: promptReducer = { @@ -29,9 +36,12 @@ export const PromptSlice = createSlice({ }, }, extraReducers(builder) { - builder.addCase(getPrompts.fulfilled, (state, action: PayloadAction) => { - state.prompts = action.payload; - }); + builder.addCase( + getPrompts.fulfilled, + (state, action: PayloadAction) => { + state.prompts = action.payload; + }, + ); builder.addCase(addPrompt.fulfilled, () => { notify("Prompt added Successfully", NotificationSeverity.SUCCESS); }); @@ -69,7 +79,7 @@ export const addPrompt = createAsyncThunkWrapper( // type: state.conversationReducer.type // TODO: this might be crashing chatqna endpoint? }); - dispatch(getPrompts()) + dispatch(getPrompts()); return response.data; }, @@ -78,22 +88,22 @@ export const addPrompt = createAsyncThunkWrapper( //TODO delete prompt doesnt actually work, but responds 200 export const deletePrompt = createAsyncThunkWrapper( "prompts/deletePrompt", - async ({ promptId, promptText }: { promptId: string, promptText: string }, { dispatch, getState }) => { - + async ( + { promptId, promptText }: { promptId: string; promptText: string }, + { dispatch, getState }, + ) => { // @ts-ignore const state: RootState = getState(); const user = state.userReducer.name; const response = await axios.post(PROMPT_MANAGER_DELETE, { - user: user, + user: user, prompt_id: promptId, - prompt_text: promptText + prompt_text: promptText, }); - dispatch(getPrompts()) + dispatch(getPrompts()); return response.data; }, ); - - diff --git a/ProductivitySuite/ui/react/src/redux/User/user.d.ts b/ProductivitySuite/ui/react/src/redux/User/user.d.ts index 7386ee2f4f..e3ba51a46b 100644 --- a/ProductivitySuite/ui/react/src/redux/User/user.d.ts +++ b/ProductivitySuite/ui/react/src/redux/User/user.d.ts @@ -1,5 +1,5 @@ export interface User { name: string; isAuthenticated: boolean; - role: 'Admin' | 'User'; + role: "Admin" | "User"; } diff --git a/ProductivitySuite/ui/react/src/redux/User/userSlice.ts b/ProductivitySuite/ui/react/src/redux/User/userSlice.ts index f07cbf1ae9..9e1871ab60 100644 --- a/ProductivitySuite/ui/react/src/redux/User/userSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/User/userSlice.ts @@ -5,7 +5,7 @@ import { User } from "./user"; const initialState: User = { name: "", isAuthenticated: false, - role: 'User' + role: "User", }; export const userSlice = createSlice({ @@ -15,7 +15,7 @@ export const userSlice = createSlice({ setUser: (state, action: PayloadAction) => { state.name = action.payload.name; state.isAuthenticated = action.payload.isAuthenticated; - state.role = action.payload.role + state.role = action.payload.role; }, removeUser: (state) => { state.name = ""; diff --git a/ProductivitySuite/ui/react/src/redux/thunkUtil.ts b/ProductivitySuite/ui/react/src/redux/thunkUtil.ts index fb7cb02651..4aca363faa 100644 --- a/ProductivitySuite/ui/react/src/redux/thunkUtil.ts +++ b/ProductivitySuite/ui/react/src/redux/thunkUtil.ts @@ -1,4 +1,8 @@ -import { createAsyncThunk, AsyncThunkPayloadCreator, AsyncThunk } from "@reduxjs/toolkit"; +import { + createAsyncThunk, + AsyncThunkPayloadCreator, + AsyncThunk, +} from "@reduxjs/toolkit"; interface ThunkAPIConfig {} diff --git a/ProductivitySuite/ui/react/src/shared/ActionButtons.tsx b/ProductivitySuite/ui/react/src/shared/ActionButtons.tsx index ed732035b6..55abeeda92 100644 --- a/ProductivitySuite/ui/react/src/shared/ActionButtons.tsx +++ b/ProductivitySuite/ui/react/src/shared/ActionButtons.tsx @@ -1,45 +1,94 @@ -import { Button, styled } from "@mui/material" +import { Button, styled } from "@mui/material"; const TextOnlyStyle = styled(Button)(({ theme }) => ({ - ...theme.customStyles.actionButtons.text + ...theme.customStyles.actionButtons.text, })); const DeleteStyle = styled(Button)(({ theme }) => ({ - ...theme.customStyles.actionButtons.delete + ...theme.customStyles.actionButtons.delete, })); const SolidStyle = styled(Button)(({ theme }) => ({ - ...theme.customStyles.actionButtons.solid + ...theme.customStyles.actionButtons.solid, })); const OutlineStyle = styled(Button)(({ theme }) => ({ - ...theme.customStyles.actionButtons.outline + ...theme.customStyles.actionButtons.outline, })); - type ButtonProps = { - onClick: (value: boolean) => void; - children: React.ReactNode | React.ReactNode[]; - disabled?: boolean; - className?: string; - }; - -const TextButton: React.FC = ({onClick, children, disabled = false, className}) => { - return onClick(true)} className={className}>{children} -} + onClick: (value: boolean) => void; + children: React.ReactNode | React.ReactNode[]; + disabled?: boolean; + className?: string; +}; -const DeleteButton: React.FC = ({onClick, children, disabled = false, className}) => { - return onClick(true)} className={className}>{children} -} +const TextButton: React.FC = ({ + onClick, + children, + disabled = false, + className, +}) => { + return ( + onClick(true)} + className={className} + > + {children} + + ); +}; -const SolidButton: React.FC = ({onClick, children, disabled = false, className}) => { - return onClick(true)} className={className}>{children} -} +const DeleteButton: React.FC = ({ + onClick, + children, + disabled = false, + className, +}) => { + return ( + onClick(true)} + className={className} + > + {children} + + ); +}; -const OutlineButton: React.FC = ({onClick, children, disabled = false, className}) => { - return onClick(true)} className={className}>{children} -} +const SolidButton: React.FC = ({ + onClick, + children, + disabled = false, + className, +}) => { + return ( + onClick(true)} + className={className} + > + {children} + + ); +}; +const OutlineButton: React.FC = ({ + onClick, + children, + disabled = false, + className, +}) => { + return ( + onClick(true)} + className={className} + > + {children} + + ); +}; -export {TextButton, DeleteButton, SolidButton, OutlineButton} \ No newline at end of file +export { TextButton, DeleteButton, SolidButton, OutlineButton }; diff --git a/ProductivitySuite/ui/react/src/shared/ModalBox/Modal.module.scss b/ProductivitySuite/ui/react/src/shared/ModalBox/Modal.module.scss index 46b9e8b682..ae9b7d00da 100644 --- a/ProductivitySuite/ui/react/src/shared/ModalBox/Modal.module.scss +++ b/ProductivitySuite/ui/react/src/shared/ModalBox/Modal.module.scss @@ -1,50 +1,50 @@ -.modal{ - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - max-width: 400px; - width: 100%; - padding: 0; - min-width: 300px; - z-index: 9999; +.modal { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + max-width: 400px; + width: 100%; + padding: 0; + min-width: 300px; + z-index: 9999; - :global { - #modal-modal-title { - padding: 0.75rem 1rem; - font-weight: 600; - font-size: .8rem; - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - } + :global { + #modal-modal-title { + padding: 0.75rem 1rem; + font-weight: 600; + font-size: 0.8rem; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + } - #modal-modal-description{ - padding: 1.5rem 1rem 1rem; - margin-top: -1rem; - + #modal-modal-description { + padding: 1.5rem 1rem 1rem; + margin-top: -1rem; - .MuiFormControlLabel-label, .MuiTypography-root { - font-weight: 300; - font-size: .8rem; - margin-top: 0.5rem; - } + .MuiFormControlLabel-label, + .MuiTypography-root { + font-weight: 300; + font-size: 0.8rem; + margin-top: 0.5rem; + } - .MuiBox-root{ - align-items: flex-start; - } + .MuiBox-root { + align-items: flex-start; + } - .MuiButton-root{ - padding: 5px 10px; + .MuiButton-root { + padding: 5px 10px; - + .MuiButton-root{ - margin-left: 0.5rem - } - } - } - button{ - padding: 0; + + .MuiButton-root { + margin-left: 0.5rem; } + } + } + button { + padding: 0; } -} \ No newline at end of file + } +} diff --git a/ProductivitySuite/ui/react/src/shared/ModalBox/ModalBox.tsx b/ProductivitySuite/ui/react/src/shared/ModalBox/ModalBox.tsx index 368075dac1..0f3c9b912a 100644 --- a/ProductivitySuite/ui/react/src/shared/ModalBox/ModalBox.tsx +++ b/ProductivitySuite/ui/react/src/shared/ModalBox/ModalBox.tsx @@ -1,24 +1,29 @@ import { Modal, styled } from "@mui/material"; -import styles from './Modal.module.scss'; +import styles from "./Modal.module.scss"; -const StyledModalBox = styled('div')(({ theme }) => ({ - ...theme.customStyles.settingsModal -})) +const StyledModalBox = styled("div")(({ theme }) => ({ + ...theme.customStyles.settingsModal, +})); +const ModalBox: React.FC<{ + children: React.ReactNode; + open?: boolean; + onClose?: () => void; +}> = ({ children, open = true, onClose }) => { + let props: any = {}; + if (onClose) props.onClose = onClose; -const ModalBox: React.FC<{ children: React.ReactNode, open?: boolean, onClose?: () => void }> = ({children, open = true, onClose}) => { + return ( + + {children} + + ); +}; - let props: any = {}; - if(onClose) props.onClose = onClose; - - return ( - - {children} - - ) -} - -export default ModalBox \ No newline at end of file +export default ModalBox; diff --git a/ProductivitySuite/ui/react/src/theme/theme.tsx b/ProductivitySuite/ui/react/src/theme/theme.tsx index d33e1c3952..d65e9609a5 100644 --- a/ProductivitySuite/ui/react/src/theme/theme.tsx +++ b/ProductivitySuite/ui/react/src/theme/theme.tsx @@ -1,457 +1,456 @@ -import { createTheme } from '@mui/material/styles'; -import moonIcon from '@assets/icons/moon.svg'; -import sunIcon from '@assets/icons/sun.svg'; +import { createTheme } from "@mui/material/styles"; +import moonIcon from "@assets/icons/moon.svg"; +import sunIcon from "@assets/icons/sun.svg"; -const lightBg = "#F2F3FF" +const lightBg = "#F2F3FF"; -const lightGrey = '#1f2133'; +const lightGrey = "#1f2133"; -const lightPurple = '#e3e5fd'; -const deepPurple = '#3D447F'; -const darkPurple = '#222647'; -const brightPurple = '#6b77db'; -const white60 = '#ffffff60' +const lightPurple = "#e3e5fd"; +const deepPurple = "#3D447F"; +const darkPurple = "#222647"; +const brightPurple = "#6b77db"; +const white60 = "#ffffff60"; -export const themeCreator = (mode: 'light' | 'dark') => { - - return createTheme({ - palette: { - mode: mode, // Default mode - primary: { - main: mode === 'dark' ? '#ffffff' : '#ffffff', - contrastText: '#000000', - }, - secondary: { - main: deepPurple, - contrastText: '#ffffff', - }, - background: { - default: mode === 'dark' ? '#090B1C' : lightBg, - paper: mode === 'dark' ? '#161b22' : '#ffffff', - }, - text: { - primary: mode === 'dark' ? '#c9d1d9' : '#000000', - secondary: mode === 'dark' ? '#ffffff' : deepPurple, - }, - - }, - typography: { - fontFamily: 'Roboto, Arial, sans-serif', - h1: { - fontWeight: 700, - fontSize: '2rem', - lineHeight: 1.5, - color: mode === 'dark' ? '#ffffff' : deepPurple, - }, - h2: { - fontWeight: 500, - fontSize: '1rem', - lineHeight: 1.4, - color: mode === 'dark' ? '#ffffff' : deepPurple, - }, - body1: { - fontSize: '1rem', - fontWeight: 300, - lineHeight: 1.5, - color: mode === 'dark' ? '#ffffff' : deepPurple, - }, - button: { - textTransform: 'none', - fontWeight: 600, - }, +export const themeCreator = (mode: "light" | "dark") => { + return createTheme({ + palette: { + mode: mode, // Default mode + primary: { + main: mode === "dark" ? "#ffffff" : "#ffffff", + contrastText: "#000000", + }, + secondary: { + main: deepPurple, + contrastText: "#ffffff", + }, + background: { + default: mode === "dark" ? "#090B1C" : lightBg, + paper: mode === "dark" ? "#161b22" : "#ffffff", + }, + text: { + primary: mode === "dark" ? "#c9d1d9" : "#000000", + secondary: mode === "dark" ? "#ffffff" : deepPurple, + }, + }, + typography: { + fontFamily: "Roboto, Arial, sans-serif", + h1: { + fontWeight: 700, + fontSize: "2rem", + lineHeight: 1.5, + color: mode === "dark" ? "#ffffff" : deepPurple, + }, + h2: { + fontWeight: 500, + fontSize: "1rem", + lineHeight: 1.4, + color: mode === "dark" ? "#ffffff" : deepPurple, + }, + body1: { + fontSize: "1rem", + fontWeight: 300, + lineHeight: 1.5, + color: mode === "dark" ? "#ffffff" : deepPurple, + }, + button: { + textTransform: "none", + fontWeight: 600, + }, + }, + components: { + MuiIconButton: { + styleOverrides: { + root: ({ theme }) => ({ + svg: { + fill: theme.customStyles.icon?.main, + }, + }), }, - components: { - MuiIconButton: { - styleOverrides: { - root: ({ theme }) => ({ - 'svg': { - fill: theme.customStyles.icon?.main - } - }), - }, - }, - - MuiCheckbox: { - styleOverrides: { - root: ({ theme }) => ({ + }, - color: theme.customStyles.icon?.main, - "&.Mui-checked": { - color: theme.customStyles.icon?.main - } - }), - }, - }, - MuiTooltip: { - styleOverrides: { - tooltip: { - backgroundColor: mode === 'dark' ? lightGrey : darkPurple, - }, - arrow: { - color: mode === 'dark' ? lightGrey : darkPurple, - } - }, - }, + MuiCheckbox: { + styleOverrides: { + root: ({ theme }) => ({ + color: theme.customStyles.icon?.main, + "&.Mui-checked": { + color: theme.customStyles.icon?.main, + }, + }), + }, + }, + MuiTooltip: { + styleOverrides: { + tooltip: { + backgroundColor: mode === "dark" ? lightGrey : darkPurple, + }, + arrow: { + color: mode === "dark" ? lightGrey : darkPurple, + }, + }, + }, + }, + customStyles: { + header: { + backgroundColor: mode === "dark" ? "#090B1C" : lightBg, + boxShadow: mode === "dark" ? "none" : "0px 1px 24.1px 0px #4953D526", + borderBottom: mode === "dark" ? `1px solid ${deepPurple}7A` : "none", + }, + aside: { + main: mode === "dark" ? lightGrey : "#E5E7FE", + }, + customDivider: { + main: mode === "dark" ? white60 : deepPurple, + }, + user: { + main: mode === "dark" ? "#161b22" : "#E3E5FD", + }, + icon: { + main: mode === "dark" ? "#E5E7FE" : deepPurple, + }, + input: { + main: mode === "dark" ? "#ffffff" : "#ffffff", // background color + primary: mode === "dark" ? "#c9d1d9" : "#000000", + secondary: mode === "dark" ? "#ffffff" : "#6b7280", + }, + code: { + // title: mode === 'dark' ? '#2b2b2b' : '#2b2b2b', + primary: mode === "dark" ? "#5B5D74" : "#B6B9D4", + // text: mode === 'dark' ? '#ffffff' : '#ffffff', + // secondary: mode === 'dark' ? '#141415' : '#141415', + }, + gradientShadow: { + border: `1px solid ${mode === "dark" ? "#ffffff20" : deepPurple + "10"}`, + boxShadow: + mode === "dark" + ? "0px 0px 10px rgba(0, 0, 0, 0.7)" + : "0px 0px 10px rgba(0, 0, 0, 0.1)", + }, + gradientBlock: { + background: + mode === "dark" + ? `linear-gradient(180deg, ${lightGrey} 0%, rgba(61, 68, 127, 0.15)100%)` + : "linear-gradient(180deg, rgba(230, 232, 253, 0.50) 0%, rgba(61, 68, 127, 0.15) 100%)", + "&:hover": { + background: + mode === "dark" + ? `linear-gradient(180deg, rgba(61, 68, 127, 0.15) 0%, ${lightGrey} 100%)` + : "linear-gradient(180deg, rgba(61, 68, 127, 0.15) 0%, rgba(230, 232, 253, 0.50) 100%)", + }, + ".MuiChip-root": { + backgroundColor: "#fff", }, - customStyles: { - header: { - backgroundColor: mode === 'dark' ? '#090B1C' : lightBg, - boxShadow: mode === 'dark' ? 'none' : '0px 1px 24.1px 0px #4953D526', - borderBottom: mode === 'dark' ? `1px solid ${deepPurple}7A` : 'none' - }, - aside: { - main: mode === 'dark' ? lightGrey : '#E5E7FE', - }, - customDivider: { - main: mode === 'dark' ? white60 : deepPurple, - }, - user: { - main: mode === 'dark' ? '#161b22' : '#E3E5FD', - }, - icon: { - main: mode === 'dark' ? '#E5E7FE' : deepPurple, - }, - input: { - main: mode === 'dark' ? '#ffffff' : '#ffffff', // background color - primary: mode === 'dark' ? '#c9d1d9' : '#000000', - secondary: mode === 'dark' ? '#ffffff' : '#6b7280', - }, - code: { - // title: mode === 'dark' ? '#2b2b2b' : '#2b2b2b', - primary: mode === 'dark' ? '#5B5D74' : '#B6B9D4', - // text: mode === 'dark' ? '#ffffff' : '#ffffff', - // secondary: mode === 'dark' ? '#141415' : '#141415', - - }, - gradientShadow: { - border:`1px solid ${mode === 'dark' ? '#ffffff20' : deepPurple+'10'}`, - boxShadow: - mode === 'dark' - ? '0px 0px 10px rgba(0, 0, 0, 0.7)' - : '0px 0px 10px rgba(0, 0, 0, 0.1)', - }, - gradientBlock: { - background: mode === 'dark' - ? `linear-gradient(180deg, ${lightGrey} 0%, rgba(61, 68, 127, 0.15)100%)` - : 'linear-gradient(180deg, rgba(230, 232, 253, 0.50) 0%, rgba(61, 68, 127, 0.15) 100%)', - '&:hover': { - background: mode === 'dark' - ? `linear-gradient(180deg, rgba(61, 68, 127, 0.15) 0%, ${lightGrey} 100%)` - : 'linear-gradient(180deg, rgba(61, 68, 127, 0.15) 0%, rgba(230, 232, 253, 0.50) 100%)', - }, + }, + sources: { + iconWrap: { + background: "linear-gradient(90deg, #C398FA -56.85%, #7E6DBB 21.46%)", + svg: { + fill: "#ffffff !important", + color: "#ffffff", + }, + }, + sourceWrap: { + background: mode === "dark" ? "#1a1b27" : "#ffffff70", + border: `1px solid ${mode === "dark" ? "rgba(230, 232, 253, 0.30)" : lightPurple}`, + color: mode === "dark" ? "#fff" : deepPurple, + }, + sourceChip: { + background: mode === "dark" ? "#1a1b27" : "#ffffff", + border: `1px solid ${mode === "dark" ? "#c398fa" : "rgba(73, 83, 213, 0.40)"}`, + color: mode === "dark" ? "#fff" : "#444", + }, + }, + audioProgress: { + stroke: mode === "dark" ? "#c9d1d9" : "#6b7280", + }, + audioEditButton: { + boxShadow: "none", + border: "none", + backgroundColor: "transparent", + color: mode === "dark" ? "#fff" : deepPurple, + "&:hover": { + backgroundColor: mode === "dark" ? deepPurple : deepPurple + "40", + }, + }, + homeTitle: { + background: + mode === "dark" + ? "#fff" + : `linear-gradient(271deg, #C398FA -56.85%, #7E6DBB 21.46%, ${deepPurple} 99.77%)`, + }, + homeButtons: { + borderRadius: "25px", + border: `1px solid ${mode === "dark" ? white60 : deepPurple + "60"}`, // take purple down some it down some + backgroundColor: mode === "dark" ? "#161b22" : lightBg, + color: mode === "dark" ? "#fff" : deepPurple, - '.MuiChip-root': { - backgroundColor: '#fff' - } - }, - sources: { - iconWrap: { - background:'linear-gradient(90deg, #C398FA -56.85%, #7E6DBB 21.46%)', - 'svg': { - fill: "#ffffff !important", - color: '#ffffff' - } - }, - sourceWrap: { - background: mode === 'dark' ? '#1a1b27' : '#ffffff70', - border: `1px solid ${mode === 'dark' ? 'rgba(230, 232, 253, 0.30)' : lightPurple}`, - color: mode === 'dark' ? '#fff' : deepPurple, - }, - sourceChip: { - background: mode === 'dark' ? '#1a1b27' : '#ffffff', - border: `1px solid ${mode === 'dark' ? '#c398fa' : 'rgba(73, 83, 213, 0.40)'}`, - color: mode === 'dark' ? '#fff' : '#444' - } - }, - audioProgress: { - stroke: mode === 'dark' ? '#c9d1d9' : '#6b7280', - }, - audioEditButton: { - boxShadow: 'none', - border: 'none', - backgroundColor: 'transparent', - color: mode === 'dark' ? '#fff' : deepPurple, - '&:hover':{ - backgroundColor: mode === 'dark' ? deepPurple : deepPurple+'40', - } - }, - homeTitle: { - background: mode === 'dark' ? '#fff' : `linear-gradient(271deg, #C398FA -56.85%, #7E6DBB 21.46%, ${deepPurple} 99.77%)` - }, - homeButtons: { - borderRadius: '25px', - border: `1px solid ${mode === 'dark' ? white60 : deepPurple+'60'}`, // take purple down some it down some - backgroundColor: mode === 'dark' ? '#161b22' : lightBg, - color: mode === 'dark' ? '#fff' : deepPurple, - - boxShadow: - mode === 'dark' - ? '0px 4px 10px rgba(0, 0, 0, 0.7)' - : '0px 4px 10px rgba(0, 0, 0, 0.1)', - '&:hover': { - backgroundColor: mode === 'dark' ? darkPurple : lightPurple, - }, - fontWeight: 300, - '&[aria-selected="true"]' : { - fontWeight: 600, - backgroundColor: mode === 'dark' ? darkPurple : lightPurple, - } - }, - promptExpandButton: { - borderRadius: '25px', - border: `1px solid ${mode === 'dark' ? white60 : deepPurple+'60'}`, // take purple down some it down some - backgroundColor: mode === 'dark' ? '#161b22' : lightBg, - color: mode === 'dark' ? '#fff' : deepPurple, - - boxShadow: - mode === 'dark' - ? '0px 4px 10px rgba(0, 0, 0, 0.7)' - : '0px 4px 10px rgba(0, 0, 0, 0.1)', - '&:hover': { - backgroundColor: mode === 'dark' ? deepPurple : lightPurple, - }, - }, - promptButton: { - backgroundColor: mode === 'dark' ? lightGrey : lightBg, - color: `${mode === 'dark' ? '#fff' : deepPurple} !important`, - '&:hover': { - backgroundColor: mode === 'dark' ? darkPurple : lightPurple, - color: mode === 'dark' ? '#ffffff' : deepPurple, - }, - }, - promptListWrapper: { - backgroundColor: mode === 'dark' ? lightGrey : lightBg, - boxShadow: mode === 'dark' - ? '0px 4px 10px rgba(0, 0, 0, 0.7)' - : '0px 4px 10px rgba(0, 0, 0, 0.1)', - }, - primaryInput: { - inputWrapper:{ - backgroundColor: mode === 'dark' ? lightGrey : lightPurple, - border:`1px solid ${mode === 'dark' ? '#ffffff20' : deepPurple+'10'}`, - boxShadow: - mode === 'dark' - ? '0px 0px 10px rgba(0, 0, 0, 0.3)' - : '0px 0px 10px rgba(0, 0, 0, 0.1)', - '&:hover, &.active, &:focus': { - border:`1px solid ${mode === 'dark' ? '#ffffff20' : deepPurple+'60'}`, - } - }, - textInput: { - color: mode === 'dark' ? '#fff' : '#3D447F', - '&::placeholder': { - color: mode === 'dark' ? '#ffffff90' : '#6b7280', - } - }, - circleButton: { - backgroundColor: mode === 'dark' ? 'transparent' : deepPurple+'80', - border:`1px solid ${mode === 'dark' ? white60 : 'transparent'}`, - 'svg path': { - fill: mode === 'dark' ? '#c9d1d9' : '#D9D9D9', - }, - '&.active':{ - backgroundColor: mode === 'dark' ? deepPurple : lightGrey, - 'svg path': { - fill: mode === 'dark' ? '#c9d1d9' : '#D9D9D9', - }, - }, - '&:hover':{ - backgroundColor: mode === 'dark' ? '#646999' : '#003E71', - 'svg path': { - fill: mode === 'dark' ? '#c9d1d9' : '#D9D9D9', - }, - }, - } - }, - tokensInput: { - color: mode === 'dark' ? '#fff' : deepPurple, - backgroundColor: 'transparent', - border: `1px solid ${mode === 'dark' ? white60 : deepPurple+'70'}`, - boxShadow: 'none', - - '&:hover': { - borderColor: deepPurple - }, - - '&:focus': { - borderColor: deepPurple - }, + boxShadow: + mode === "dark" + ? "0px 4px 10px rgba(0, 0, 0, 0.7)" + : "0px 4px 10px rgba(0, 0, 0, 0.1)", + "&:hover": { + backgroundColor: mode === "dark" ? darkPurple : lightPurple, + }, + fontWeight: 300, + '&[aria-selected="true"]': { + fontWeight: 600, + backgroundColor: mode === "dark" ? darkPurple : lightPurple, + }, + }, + promptExpandButton: { + borderRadius: "25px", + border: `1px solid ${mode === "dark" ? white60 : deepPurple + "60"}`, // take purple down some it down some + backgroundColor: mode === "dark" ? "#161b22" : lightBg, + color: mode === "dark" ? "#fff" : deepPurple, - '&[aria-invalid]': { - borderColor: '#cc0000 !important', - color: '#cc0000' - } + boxShadow: + mode === "dark" + ? "0px 4px 10px rgba(0, 0, 0, 0.7)" + : "0px 4px 10px rgba(0, 0, 0, 0.1)", + "&:hover": { + backgroundColor: mode === "dark" ? deepPurple : lightPurple, + }, + }, + promptButton: { + backgroundColor: mode === "dark" ? lightGrey : lightBg, + color: `${mode === "dark" ? "#fff" : deepPurple} !important`, + "&:hover": { + backgroundColor: mode === "dark" ? darkPurple : lightPurple, + color: mode === "dark" ? "#ffffff" : deepPurple, + }, + }, + promptListWrapper: { + backgroundColor: mode === "dark" ? lightGrey : lightBg, + boxShadow: + mode === "dark" + ? "0px 4px 10px rgba(0, 0, 0, 0.7)" + : "0px 4px 10px rgba(0, 0, 0, 0.1)", + }, + primaryInput: { + inputWrapper: { + backgroundColor: mode === "dark" ? lightGrey : lightPurple, + border: `1px solid ${mode === "dark" ? "#ffffff20" : deepPurple + "10"}`, + boxShadow: + mode === "dark" + ? "0px 0px 10px rgba(0, 0, 0, 0.3)" + : "0px 0px 10px rgba(0, 0, 0, 0.1)", + "&:hover, &.active, &:focus": { + border: `1px solid ${mode === "dark" ? "#ffffff20" : deepPurple + "60"}`, + }, + }, + textInput: { + color: mode === "dark" ? "#fff" : "#3D447F", + "&::placeholder": { + color: mode === "dark" ? "#ffffff90" : "#6b7280", + }, + }, + circleButton: { + backgroundColor: mode === "dark" ? "transparent" : deepPurple + "80", + border: `1px solid ${mode === "dark" ? white60 : "transparent"}`, + "svg path": { + fill: mode === "dark" ? "#c9d1d9" : "#D9D9D9", + }, + "&.active": { + backgroundColor: mode === "dark" ? deepPurple : lightGrey, + "svg path": { + fill: mode === "dark" ? "#c9d1d9" : "#D9D9D9", + }, + }, + "&:hover": { + backgroundColor: mode === "dark" ? "#646999" : "#003E71", + "svg path": { + fill: mode === "dark" ? "#c9d1d9" : "#D9D9D9", + }, + }, + }, + }, + tokensInput: { + color: mode === "dark" ? "#fff" : deepPurple, + backgroundColor: "transparent", + border: `1px solid ${mode === "dark" ? white60 : deepPurple + "70"}`, + boxShadow: "none", - - }, - webInput: { - backgroundColor: mode === 'dark' ? lightGrey : lightPurple, - '.Mui-focused': { - color: mode === 'dark' ? '#ffffff' : deepPurple, - '.MuiOutlinedInput-notchedOutline': { - border: `1px solid ${mode === 'dark' ? white60 : `${deepPurple}22` }` - } + "&:hover": { + borderColor: deepPurple, + }, - } - }, - fileInputWrapper: { - backgroundColor: `${deepPurple}10`, - border: `1px dashed ${mode === 'dark' ? white60 : `${deepPurple}22` }` - }, - fileInput: { - wrapper: { - backgroundColor: `${deepPurple}10`, - border: `1px dashed ${mode === 'dark' ? white60 : `${deepPurple}22` }` - }, - file: { - backgroundColor: mode === 'dark' ? 'rgba(255,255,255,0.1)' : 'rgba(255,255,255,0.7)', - } - }, - actionButtons: { - text: { - boxShadow: 'none', - background: 'none', - fontWeight: '400', - color: mode === 'dark' ? '#ffffff' : '#007ce1', - '&:disabled':{ - opacity: 0.5, - color: mode === 'dark' ? '#ffffff' : '#007ce1', - }, - '&:hover': { - background: mode === 'dark' ? '#007ce1' : '#ffffff', - color: mode === 'dark' ? '#ffffff' : '#007ce1' - } - }, - delete: { - boxShadow: 'none', - background: '#f15346', - fontWeight: '400', - color: '#fff', - '&:hover': { - background: '#cc0000' - }, - '&:disabled':{ - opacity: 0.5, - color: '#fff', - } - }, - solid: { - boxShadow: 'none', - background: deepPurple, - fontWeight: '400', - color: '#fff', - '&:hover': { - background: deepPurple - }, - '&:disabled':{ - opacity: 0.5, - color: '#fff', - } - }, - outline: { - boxShadow: 'none', - background: 'transparent', - fontWeight: '400', - color: mode === 'dark' ? '#ffffff' : '#007ce1', - border:`1px solid ${mode === 'dark' ? '#ffffff' : '#007ce1'}`, - '&:hover': { - background: mode === 'dark' ? '#007ce1' : '#ffffff', - color: mode === 'dark' ? '#ffffff' : '#007ce1' - }, - '&.active': { - background: mode === 'dark' ? '#ffffff' : '#007ce1', - color: mode === 'dark' ? '#007ce1' : '#ffffff' - } - } - }, - themeToggle: { + "&:focus": { + borderColor: deepPurple, + }, - '.MuiSwitch-switchBase.Mui-checked': { - '.MuiSwitch-thumb:before': { - backgroundImage: `url(${moonIcon})`, - }, - }, - '& .MuiSwitch-thumb': { - backgroundColor: mode === 'dark' ? '#fff' : 'transparent', - border: `1px solid ${mode === 'dark' ? '#090B1C' : deepPurple}`, - 'svg path': { - fill: mode === 'dark' ? '#E5E7FE' : deepPurple, - }, - '&::before': { - backgroundImage: `url(${sunIcon})`, - }, - - }, - '& .MuiSwitch-track': { - border: `1px solid ${mode === 'dark' ? '#fff' : deepPurple}`, - backgroundColor: mode === 'dark' ? '#8796A5' : 'transparent', - }, - }, - dropDown: { - '&:hover, &:focus': { - backgroundColor: mode === 'dark' ? 'rgba(0,0,0, 0.5)' : 'rgba(230, 232, 253, 0.50)', - }, - '&.Mui-selected': { - backgroundColor: mode === 'dark' ? 'rgba(0,0,0, 1)' : 'rgba(230, 232, 253, 0.75)', - }, - '&.Mui-selected:hover, &.Mui-selected:focus': { - backgroundColor: mode === 'dark' ? 'rgba(0,0,0, 1)' : 'rgba(230, 232, 253, 0.75)', - }, - wrapper: { - border: `1px solid ${mode === 'dark' ? white60 : deepPurple+'70'}`, - } - }, - settingsModal: { - boxShadow: ' 0px 0px 20px rgba(0,0,0,0.5)', - border: '1px solid #000', - background: mode === 'dark' ? lightGrey : lightBg, - '#modal-modal-title': { - backgroundColor: '#e5e7fe', - color: deepPurple, + "&[aria-invalid]": { + borderColor: "#cc0000 !important", + color: "#cc0000", + }, + }, + webInput: { + backgroundColor: mode === "dark" ? lightGrey : lightPurple, + ".Mui-focused": { + color: mode === "dark" ? "#ffffff" : deepPurple, + ".MuiOutlinedInput-notchedOutline": { + border: `1px solid ${mode === "dark" ? white60 : `${deepPurple}22`}`, + }, + }, + }, + fileInputWrapper: { + backgroundColor: `${deepPurple}10`, + border: `1px dashed ${mode === "dark" ? white60 : `${deepPurple}22`}`, + }, + fileInput: { + wrapper: { + backgroundColor: `${deepPurple}10`, + border: `1px dashed ${mode === "dark" ? white60 : `${deepPurple}22`}`, + }, + file: { + backgroundColor: + mode === "dark" ? "rgba(255,255,255,0.1)" : "rgba(255,255,255,0.7)", + }, + }, + actionButtons: { + text: { + boxShadow: "none", + background: "none", + fontWeight: "400", + color: mode === "dark" ? "#ffffff" : "#007ce1", + "&:disabled": { + opacity: 0.5, + color: mode === "dark" ? "#ffffff" : "#007ce1", + }, + "&:hover": { + background: mode === "dark" ? "#007ce1" : "#ffffff", + color: mode === "dark" ? "#ffffff" : "#007ce1", + }, + }, + delete: { + boxShadow: "none", + background: "#f15346", + fontWeight: "400", + color: "#fff", + "&:hover": { + background: "#cc0000", + }, + "&:disabled": { + opacity: 0.5, + color: "#fff", + }, + }, + solid: { + boxShadow: "none", + background: deepPurple, + fontWeight: "400", + color: "#fff", + "&:hover": { + background: deepPurple, + }, + "&:disabled": { + opacity: 0.5, + color: "#fff", + }, + }, + outline: { + boxShadow: "none", + background: "transparent", + fontWeight: "400", + color: mode === "dark" ? "#ffffff" : "#007ce1", + border: `1px solid ${mode === "dark" ? "#ffffff" : "#007ce1"}`, + "&:hover": { + background: mode === "dark" ? "#007ce1" : "#ffffff", + color: mode === "dark" ? "#ffffff" : "#007ce1", + }, + "&.active": { + background: mode === "dark" ? "#ffffff" : "#007ce1", + color: mode === "dark" ? "#007ce1" : "#ffffff", + }, + }, + }, + themeToggle: { + ".MuiSwitch-switchBase.Mui-checked": { + ".MuiSwitch-thumb:before": { + backgroundImage: `url(${moonIcon})`, + }, + }, + "& .MuiSwitch-thumb": { + backgroundColor: mode === "dark" ? "#fff" : "transparent", + border: `1px solid ${mode === "dark" ? "#090B1C" : deepPurple}`, + "svg path": { + fill: mode === "dark" ? "#E5E7FE" : deepPurple, + }, + "&::before": { + backgroundImage: `url(${sunIcon})`, + }, + }, + "& .MuiSwitch-track": { + border: `1px solid ${mode === "dark" ? "#fff" : deepPurple}`, + backgroundColor: mode === "dark" ? "#8796A5" : "transparent", + }, + }, + dropDown: { + "&:hover, &:focus": { + backgroundColor: + mode === "dark" ? "rgba(0,0,0, 0.5)" : "rgba(230, 232, 253, 0.50)", + }, + "&.Mui-selected": { + backgroundColor: + mode === "dark" ? "rgba(0,0,0, 1)" : "rgba(230, 232, 253, 0.75)", + }, + "&.Mui-selected:hover, &.Mui-selected:focus": { + backgroundColor: + mode === "dark" ? "rgba(0,0,0, 1)" : "rgba(230, 232, 253, 0.75)", + }, + wrapper: { + border: `1px solid ${mode === "dark" ? white60 : deepPurple + "70"}`, + }, + }, + settingsModal: { + boxShadow: " 0px 0px 20px rgba(0,0,0,0.5)", + border: "1px solid #000", + background: mode === "dark" ? lightGrey : lightBg, + "#modal-modal-title": { + backgroundColor: "#e5e7fe", + color: deepPurple, - 'svg': { - fill:deepPurple - } - } - }, - styledSlider:{ - color: mode === 'dark' ? brightPurple : deepPurple, + svg: { + fill: deepPurple, + }, + }, + }, + styledSlider: { + color: mode === "dark" ? brightPurple : deepPurple, - '&.disabled': { - color: mode === 'dark' ? brightPurple : deepPurple - }, + "&.disabled": { + color: mode === "dark" ? brightPurple : deepPurple, + }, - '.MuiSlider-rail': { - backgroundColor: mode === 'dark' ? brightPurple : deepPurple - }, + ".MuiSlider-rail": { + backgroundColor: mode === "dark" ? brightPurple : deepPurple, + }, - '.MuiSlider-track': { - backgroundColor: mode === 'dark' ? brightPurple : deepPurple - }, + ".MuiSlider-track": { + backgroundColor: mode === "dark" ? brightPurple : deepPurple, + }, - '.MuiSlider-thumb': { - backgroundColor: mode === 'dark' ? brightPurple : deepPurple, + ".MuiSlider-thumb": { + backgroundColor: mode === "dark" ? brightPurple : deepPurple, - '&:hover': { - boxShadow: `0 0 0 6px rgba(61,68,127,0.3)` - }, + "&:hover": { + boxShadow: `0 0 0 6px rgba(61,68,127,0.3)`, + }, - '&.focusVisible': { - boxShadow: `0 0 0 8px rgba(61,68,127,0.5)` - }, + "&.focusVisible": { + boxShadow: `0 0 0 8px rgba(61,68,127,0.5)`, + }, - '&.active': { - boxShadow: `0 0 0 8px rgba(61,68,127,0.5)` - }, - - '&.disabled': { - backgroundColor: mode === 'dark' ? brightPurple : deepPurple, - } - } - } - } - }); + "&.active": { + boxShadow: `0 0 0 8px rgba(61,68,127,0.5)`, + }, -} -deepPurple \ No newline at end of file + "&.disabled": { + backgroundColor: mode === "dark" ? brightPurple : deepPurple, + }, + }, + }, + }, + }); +}; +deepPurple; diff --git a/ProductivitySuite/ui/react/src/types/common.ts b/ProductivitySuite/ui/react/src/types/common.ts index 7011df1b15..20eebf5c06 100644 --- a/ProductivitySuite/ui/react/src/types/common.ts +++ b/ProductivitySuite/ui/react/src/types/common.ts @@ -1,11 +1,10 @@ export interface ErrorResponse { - response?: { - data?: { - error?: { - message?: string; - }; - }; + response?: { + data?: { + error?: { + message?: string; + }; }; - message: string; + }; + message: string; } - diff --git a/ProductivitySuite/ui/react/src/types/conversation.ts b/ProductivitySuite/ui/react/src/types/conversation.ts index 9062eba389..476ad47747 100644 --- a/ProductivitySuite/ui/react/src/types/conversation.ts +++ b/ProductivitySuite/ui/react/src/types/conversation.ts @@ -1,5 +1,3 @@ - - // export interface Model { // model_type: string; // token_limit: number; @@ -16,43 +14,41 @@ // data_insights_output_token: number; // } - - export interface InferenceSettings { - model: string; - temperature: number; - token_limit: number; - input_token?: number; - output_token?: number; - tags?: null; - maxTokenLimit?: number; - minTokenLimit?: number; - maxTemperatureLimit?: number; - minTemperatureLimit?: number; + model: string; + temperature: number; + token_limit: number; + input_token?: number; + output_token?: number; + tags?: null; + maxTokenLimit?: number; + minTokenLimit?: number; + maxTemperatureLimit?: number; + minTemperatureLimit?: number; } export interface Feedback { - comment: string; - rating: number; - is_thumbs_up: boolean; + comment: string; + rating: number; + is_thumbs_up: boolean; } export interface SuccessResponse { - message: string; + message: string; } export interface PromptsResponse { - prompt_text: string; - tags: []; - tag_category: string; - author: string; + prompt_text: string; + tags: []; + tag_category: string; + author: string; } export interface StreamChatProps { - user_id: string, - conversation_id: string, - use_case: string, - query: string, - tags: string[], - settings: InferenceSettings -} \ No newline at end of file + user_id: string; + conversation_id: string; + use_case: string; + query: string; + tags: string[]; + settings: InferenceSettings; +} diff --git a/ProductivitySuite/ui/react/src/types/global.d.ts b/ProductivitySuite/ui/react/src/types/global.d.ts index e7566fba41..5e52f805e5 100644 --- a/ProductivitySuite/ui/react/src/types/global.d.ts +++ b/ProductivitySuite/ui/react/src/types/global.d.ts @@ -1,4 +1,4 @@ -declare module '*.svg' { - const content: string; - export default content; - } \ No newline at end of file +declare module "*.svg" { + const content: string; + export default content; +} diff --git a/ProductivitySuite/ui/react/src/types/speech.d.ts b/ProductivitySuite/ui/react/src/types/speech.d.ts index b54671b996..38277eb637 100644 --- a/ProductivitySuite/ui/react/src/types/speech.d.ts +++ b/ProductivitySuite/ui/react/src/types/speech.d.ts @@ -1,16 +1,24 @@ type SpeechRecognitionErrorEvent = Event & { - error: 'no-speech' | 'audio-capture' | 'not-allowed' | 'network' | 'aborted' | 'service-not-allowed' | 'bad-grammar' | 'language-not-supported'; - message?: string; // Some browsers may provide an additional error message - }; + error: + | "no-speech" + | "audio-capture" + | "not-allowed" + | "network" + | "aborted" + | "service-not-allowed" + | "bad-grammar" + | "language-not-supported"; + message?: string; // Some browsers may provide an additional error message +}; type SpeechRecognitionEvent = Event & { - results: { + results: { + [index: number]: { [index: number]: { - [index: number]: { - transcript: string; - confidence: number; - }; - isFinal: boolean; + transcript: string; + confidence: number; }; + isFinal: boolean; }; - }; \ No newline at end of file + }; +}; diff --git a/ProductivitySuite/ui/react/src/types/styles.d.ts b/ProductivitySuite/ui/react/src/types/styles.d.ts index 20cd072601..8bbea8c9d9 100644 --- a/ProductivitySuite/ui/react/src/types/styles.d.ts +++ b/ProductivitySuite/ui/react/src/types/styles.d.ts @@ -1,4 +1,4 @@ -declare module '*.module.scss' { - const classes: { [key: string]: string }; - export default classes; - } \ No newline at end of file +declare module "*.module.scss" { + const classes: { [key: string]: string }; + export default classes; +} diff --git a/ProductivitySuite/ui/react/src/types/theme.d.ts b/ProductivitySuite/ui/react/src/types/theme.d.ts index b729f64ce7..0003e099de 100644 --- a/ProductivitySuite/ui/react/src/types/theme.d.ts +++ b/ProductivitySuite/ui/react/src/types/theme.d.ts @@ -1,8 +1,7 @@ -import '@mui/material/styles'; -import { PaletteChip, PaletteColor } from '@mui/material/styles'; - -declare module '@mui/material/styles' { +import "@mui/material/styles"; +import { PaletteChip, PaletteColor } from "@mui/material/styles"; +declare module "@mui/material/styles" { interface Theme { customStyles: Record>; } @@ -42,4 +41,4 @@ declare module '@mui/material/styles' { themeToggle?: PaletteColorOptions; dropDown?: PaletteColorOptions; } -} \ No newline at end of file +} diff --git a/ProductivitySuite/ui/react/src/utils/utils.js b/ProductivitySuite/ui/react/src/utils/utils.js index cd3759639a..8b184a5d83 100644 --- a/ProductivitySuite/ui/react/src/utils/utils.js +++ b/ProductivitySuite/ui/react/src/utils/utils.js @@ -11,13 +11,17 @@ export const smartTrim = (string, maxLength) => { return string; } if (maxLength === 1) { - return string.substring(0, 1) + '...'; + return string.substring(0, 1) + "..."; } var midpoint = Math.ceil(string.length / 2); var toremove = string.length - maxLength; var lstrip = Math.ceil(toremove / 2); var rstrip = toremove - lstrip; - return string.substring(0, midpoint - lstrip) + '...' + string.substring(midpoint + rstrip); + return ( + string.substring(0, midpoint - lstrip) + + "..." + + string.substring(midpoint + rstrip) + ); }; export const QueryStringFromArr = (paramsArr = []) => { @@ -27,28 +31,37 @@ export const QueryStringFromArr = (paramsArr = []) => { queryString.push(`${param.name}=${param.value}`); } - return queryString.join('&'); + return queryString.join("&"); }; -export const isAuthorized = (allowedRoles=[], userRole,isPreviewOnlyFeature=false,isPreviewUser=false, isNotAllowed=false) => { - return (allowedRoles.length === 0 || allowedRoles.includes(userRole)) - && (!isPreviewOnlyFeature || isPreviewUser) - && !isNotAllowed -} - +export const isAuthorized = ( + allowedRoles = [], + userRole, + isPreviewOnlyFeature = false, + isPreviewUser = false, + isNotAllowed = false, +) => { + return ( + (allowedRoles.length === 0 || allowedRoles.includes(userRole)) && + (!isPreviewOnlyFeature || isPreviewUser) && + !isNotAllowed + ); +}; function addPropsToReactElement(element, props, i) { if (React.isValidElement(element)) { - return React.cloneElement(element, { key: i, ...props }) + return React.cloneElement(element, { key: i, ...props }); } - return element + return element; } export function addPropsToChildren(children, props) { if (!Array.isArray(children)) { - return addPropsToReactElement(children, props) + return addPropsToReactElement(children, props); } - return children.map((childElement, i) => addPropsToReactElement(childElement, props, i)) + return children.map((childElement, i) => + addPropsToReactElement(childElement, props, i), + ); } export const getCurrentTimeStamp = () => { @@ -57,32 +70,33 @@ export const getCurrentTimeStamp = () => { export const uuidv4 = () => { return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => - (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16), + ( + +c ^ + (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4))) + ).toString(16), ); }; export const readFilesAndSummarize = async (sourceFiles) => { + let summaryMessage = ""; + + if (sourceFiles.length) { + const readFilePromises = sourceFiles.map((fileWrapper) => { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => { + const text = reader.result?.toString() || ""; + resolve(text); + }; + reader.onerror = () => reject(new Error("Error reading file")); + reader.readAsText(fileWrapper.file); + }); + }); - let summaryMessage = ''; - - if (sourceFiles.length) { + const fileContents = await Promise.all(readFilePromises); - const readFilePromises = sourceFiles.map((fileWrapper) => { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = () => { - const text = reader.result?.toString() || ''; - resolve(text); - }; - reader.onerror = () => reject(new Error('Error reading file')); - reader.readAsText(fileWrapper.file); - }); - }); - - const fileContents = await Promise.all(readFilePromises); - - summaryMessage = fileContents.join('\n'); - } - - return summaryMessage - } \ No newline at end of file + summaryMessage = fileContents.join("\n"); + } + + return summaryMessage; +}; diff --git a/ProductivitySuite/ui/react/src/vite-env.d.ts b/ProductivitySuite/ui/react/src/vite-env.d.ts index f00e7c7d72..a08026d9c9 100644 --- a/ProductivitySuite/ui/react/src/vite-env.d.ts +++ b/ProductivitySuite/ui/react/src/vite-env.d.ts @@ -1,2 +1,2 @@ /// -/// \ No newline at end of file +/// diff --git a/ProductivitySuite/ui/react/tsconfig.json b/ProductivitySuite/ui/react/tsconfig.json index a469052823..d7149ff020 100644 --- a/ProductivitySuite/ui/react/tsconfig.json +++ b/ProductivitySuite/ui/react/tsconfig.json @@ -1,11 +1,7 @@ { "compilerOptions": { "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, @@ -31,12 +27,8 @@ "@assets/*": ["assets/*"], "@icons/*": ["icons/*"], "@utils/*": ["utils/*"], - "@root/*": ["*"], + "@root/*": ["*"] } }, - "include": [ - "src", - "src/theme/theme.tsx", - "src/**/*.d.ts" - ] + "include": ["src", "src/theme/theme.tsx", "src/**/*.d.ts"] } diff --git a/ProductivitySuite/ui/react/vite.config.js b/ProductivitySuite/ui/react/vite.config.js index b25b3c4c56..8a91efa688 100644 --- a/ProductivitySuite/ui/react/vite.config.js +++ b/ProductivitySuite/ui/react/vite.config.js @@ -1,115 +1,114 @@ -import react from '@vitejs/plugin-react'; -import path from 'path'; +import react from "@vitejs/plugin-react"; +import path from "path"; -import { defineConfig } from 'vite'; -import { visualizer } from 'rollup-plugin-visualizer'; -import compression from 'vite-plugin-compression'; -import terser from '@rollup/plugin-terser'; -import sassDts from 'vite-plugin-sass-dts'; -import svgr from 'vite-plugin-svgr'; +import { defineConfig } from "vite"; +import { visualizer } from "rollup-plugin-visualizer"; +import compression from "vite-plugin-compression"; +import terser from "@rollup/plugin-terser"; +import sassDts from "vite-plugin-sass-dts"; +import svgr from "vite-plugin-svgr"; export default defineConfig({ - base: '/', - optimizeDeps: { - include: ['**/*.scss'], // Include all .scss files + base: "/", + optimizeDeps: { + include: ["**/*.scss"], // Include all .scss files + }, + modulePreload: { + polyfill: true, // Ensures compatibility + }, + css: { + modules: { + // Enable CSS Modules for all .scss files + localsConvention: "camelCaseOnly", }, - modulePreload: { - polyfill: true, // Ensures compatibility - }, - css: { - modules: { - // Enable CSS Modules for all .scss files - localsConvention: 'camelCaseOnly', - }, - }, - commonjsOptions: { - esmExternals: true - }, - server: { - // https: true, - host: '0.0.0.0', - port: 5173, - }, - build: { - sourcemap: false, - rollupOptions: { - // output: { - // manualChunks(id) { - // if (id.includes('node_modules')) { - - // if (id.match(/react-dom|react-router|react-redux/)) { - // return 'react-vendor'; - // } + }, + commonjsOptions: { + esmExternals: true, + }, + server: { + // https: true, + host: "0.0.0.0", + port: 5173, + }, + build: { + sourcemap: false, + rollupOptions: { + // output: { + // manualChunks(id) { + // if (id.includes('node_modules')) { - // // // Code render files - // // if (id.match(/react-syntax-highlighter|react-markdown|gfm|remark|refractor|micromark|highlight|mdast/)) { - // // return 'code-vendor'; - // // } + // if (id.match(/react-dom|react-router|react-redux/)) { + // return 'react-vendor'; + // } - // if (id.match(/emotion|mui|styled-components/)) { - // return 'style-vendor'; - // } + // // // Code render files + // // if (id.match(/react-syntax-highlighter|react-markdown|gfm|remark|refractor|micromark|highlight|mdast/)) { + // // return 'code-vendor'; + // // } - // if (id.match(/keycloak-js|axios|notistack|reduxjs|fetch-event-source|azure/)) { - // return 'utils-vendor'; - // } + // if (id.match(/emotion|mui|styled-components/)) { + // return 'style-vendor'; + // } - // const packages = id.toString().split('node_modules/')[1].split('/')[0]; - // return `vendor-${packages}`; - // } - // } - // }, - plugins: [ - terser({ - format: { comments: false }, - compress: { - drop_console: true, - drop_debugger: true, - }, - }), - - ], - }, - chunkSizeWarningLimit: 500, - assetsInlineLimit: 0, - }, - plugins: [ - svgr(), - react(), - // sassDts({ - // enabledMode: []//['production'], // Generate type declarations on build - // }), - compression({ - algorithm: 'gzip', - ext: '.gz', - deleteOriginFile: false, - threshold: 10240, - }), - visualizer({ - filename: './dist/stats.html', // Output stats file - open: true, // Automatically open in the browser - gzipSize: true, // Show gzipped sizes - brotliSize: true, // Show Brotli sizes + // if (id.match(/keycloak-js|axios|notistack|reduxjs|fetch-event-source|azure/)) { + // return 'utils-vendor'; + // } + + // const packages = id.toString().split('node_modules/')[1].split('/')[0]; + // return `vendor-${packages}`; + // } + // } + // }, + plugins: [ + terser({ + format: { comments: false }, + compress: { + drop_console: true, + drop_debugger: true, + }, }), - ], - resolve: { - alias: { - '@mui/styled-engine': '@mui/styled-engine-sc', - '@components': path.resolve(__dirname, 'src/components/'), - '@shared': path.resolve(__dirname, 'src/shared/'), - '@contexts': path.resolve(__dirname, 'src/contexts/'), - '@redux': path.resolve(__dirname, 'src/redux/'), - '@services': path.resolve(__dirname, 'src/services/'), - '@pages': path.resolve(__dirname, 'src/pages/'), - '@layouts': path.resolve(__dirname, 'src/layouts/'), - '@assets': path.resolve(__dirname, 'src/assets/'), - '@utils': path.resolve(__dirname, 'src/utils/'), - '@icons': path.resolve(__dirname, 'src/icons/'), - '@root': path.resolve(__dirname, 'src/'), - }, + ], + }, + chunkSizeWarningLimit: 500, + assetsInlineLimit: 0, + }, + plugins: [ + svgr(), + react(), + // sassDts({ + // enabledMode: []//['production'], // Generate type declarations on build + // }), + compression({ + algorithm: "gzip", + ext: ".gz", + deleteOriginFile: false, + threshold: 10240, + }), + visualizer({ + filename: "./dist/stats.html", // Output stats file + open: true, // Automatically open in the browser + gzipSize: true, // Show gzipped sizes + brotliSize: true, // Show Brotli sizes + }), + ], + resolve: { + alias: { + "@mui/styled-engine": "@mui/styled-engine-sc", + "@components": path.resolve(__dirname, "src/components/"), + "@shared": path.resolve(__dirname, "src/shared/"), + "@contexts": path.resolve(__dirname, "src/contexts/"), + "@redux": path.resolve(__dirname, "src/redux/"), + "@services": path.resolve(__dirname, "src/services/"), + "@pages": path.resolve(__dirname, "src/pages/"), + "@layouts": path.resolve(__dirname, "src/layouts/"), + "@assets": path.resolve(__dirname, "src/assets/"), + "@utils": path.resolve(__dirname, "src/utils/"), + "@icons": path.resolve(__dirname, "src/icons/"), + "@root": path.resolve(__dirname, "src/"), }, - assetsInclude: ['**/*.svg'], // Ensure Vite processes .svg files - // define: { - // "import.meta.env": process.env, - // }, + }, + assetsInclude: ["**/*.svg"], // Ensure Vite processes .svg files + // define: { + // "import.meta.env": process.env, + // }, }); From 2c8d90fa02307a91ee77df860ce3b6f32d8415ac Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 17 Apr 2025 06:14:32 +0000 Subject: [PATCH 08/25] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- ProductivitySuite/ui/react/.eslintrc.cjs | 11 +----- ProductivitySuite/ui/react/README.md | 2 + ProductivitySuite/ui/react/src/App.scss | 2 +- .../ui/react/src/pages/Home/Home.tsx | 2 +- .../redux/Conversation/ConversationSlice.ts | 39 ++++--------------- .../ui/react/src/redux/Prompt/PromptSlice.ts | 9 ++--- ProductivitySuite/ui/react/src/utils/utils.js | 5 +-- 7 files changed, 18 insertions(+), 52 deletions(-) diff --git a/ProductivitySuite/ui/react/.eslintrc.cjs b/ProductivitySuite/ui/react/.eslintrc.cjs index 6e8698b72d..78174f6836 100644 --- a/ProductivitySuite/ui/react/.eslintrc.cjs +++ b/ProductivitySuite/ui/react/.eslintrc.cjs @@ -1,18 +1,11 @@ module.exports = { root: true, env: { browser: true, es2020: true }, - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:react-hooks/recommended", - ], + extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:react-hooks/recommended"], ignorePatterns: ["dist", ".eslintrc.cjs"], parser: "@typescript-eslint/parser", plugins: ["react-refresh"], rules: { - "react-refresh/only-export-components": [ - "warn", - { allowConstantExport: true }, - ], + "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], }, }; diff --git a/ProductivitySuite/ui/react/README.md b/ProductivitySuite/ui/react/README.md index b23b521c39..469a4c70fe 100644 --- a/ProductivitySuite/ui/react/README.md +++ b/ProductivitySuite/ui/react/README.md @@ -73,6 +73,7 @@ Here're some of the project's features: VITE_PROMPT_COLLECTION_NAME="prompt" ``` 4. There is models_config.json file under public folder. It is in the below format. The types key in the below json array shows that the model is used for following types. + ``` [ @@ -90,6 +91,7 @@ Here're some of the project's features: ] ``` + 5. Execute `npm install` to install the corresponding dependencies. 6. Execute `npm run dev` diff --git a/ProductivitySuite/ui/react/src/App.scss b/ProductivitySuite/ui/react/src/App.scss index 995feab624..cda17338af 100644 --- a/ProductivitySuite/ui/react/src/App.scss +++ b/ProductivitySuite/ui/react/src/App.scss @@ -1,5 +1,5 @@ <<<<<<< HEAD -// Post javscript styles +// Post javascript styles ======= // Post javascript styles >>>>>>> c0c9e16f6c42465d9409bab8b48848105085a8a7 diff --git a/ProductivitySuite/ui/react/src/pages/Home/Home.tsx b/ProductivitySuite/ui/react/src/pages/Home/Home.tsx index 8105135297..d720aa1e39 100644 --- a/ProductivitySuite/ui/react/src/pages/Home/Home.tsx +++ b/ProductivitySuite/ui/react/src/pages/Home/Home.tsx @@ -51,7 +51,7 @@ const Home = () => { }; useEffect(() => { - // clean up and reset. Can happen on going home from history/updload convo + // clean up and reset. Can happen on going home from history/upload convo // if convo is missing one of these if (!model || !token || !temperature) { dispatch(newConversation(true)); diff --git a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts index f22a06a0ff..4e8ab3c4c5 100644 --- a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts @@ -31,16 +31,8 @@ import config, { DOC_SUM_URL, FAQ_GEN_URL, } from "@root/config"; -import { - NotificationSeverity, - notify, -} from "@components/Notification/Notification"; -import { - ChatBubbleOutline, - CodeOutlined, - Description, - QuizOutlined, -} from "@mui/icons-material"; +import { NotificationSeverity, notify } from "@components/Notification/Notification"; +import { ChatBubbleOutline, CodeOutlined, Description, QuizOutlined } from "@mui/icons-material"; const urlMap: any = { summary: DOC_SUM_URL, @@ -141,9 +133,7 @@ export const ConversationSlice = createSlice({ // in case of upload / history conversation that clears model name, we want to reset to defaults const currentType = state.type; if (currentType) { - const approvedModel = state.models.find((item: Model) => - item.types.includes(currentType), - ); + const approvedModel = state.models.find((item: Model) => item.types.includes(currentType)); if (approvedModel) { state.model = approvedModel.model_name; state.token = approvedModel.minToken; @@ -161,10 +151,7 @@ export const ConversationSlice = createSlice({ setSelectedConversationId: (state, action: PayloadAction) => { state.selectedConversationId = action.payload; }, - setSelectedConversationHistory: ( - state, - action: PayloadAction, - ) => { + setSelectedConversationHistory: (state, action: PayloadAction) => { state.selectedConversationHistory = action.payload; }, setTemperature: (state, action: PayloadAction) => { @@ -225,10 +212,7 @@ export const ConversationSlice = createSlice({ setSystemPrompt: (state, action: PayloadAction) => { state.systemPrompt = action.payload; }, - setAbortController: ( - state, - action: PayloadAction, - ) => { + setAbortController: (state, action: PayloadAction) => { state.abortController = action.payload; }, abortStream: (state) => { @@ -333,9 +317,7 @@ export const getSupportedModels = createAsyncThunkWrapper( // setDefault use case if not stored / already set by localStorage // TODO: revisit if type also gets stored and not defaulted on state if (!currentModel && currentType) { - const approvedModel = response.data.find((item: Model) => - item.types.includes(currentType), - ); + const approvedModel = response.data.find((item: Model) => item.types.includes(currentType)); if (approvedModel) store.dispatch(setModel(approvedModel)); } @@ -459,8 +441,7 @@ export const saveConversationtoDatabase = createAsyncThunkWrapper( async ({ conversation }: { conversation: Conversation }, { dispatch, getState }) => { // @ts-ignore const state: RootState = getState(); - const selectedConversationHistory = - state.conversationReducer.selectedConversationHistory; + const selectedConversationHistory = state.conversationReducer.selectedConversationHistory; //TODO: if we end up with a systemPrompt for code change this const firstMessageIndex = state.conversationReducer.type === "code" ? 0 : 1; @@ -633,11 +614,7 @@ const eventStream = (type: string, body: any, conversationId: string = "") => { if (response.ok) { store.dispatch(setIsPending(false)); return; - } else if ( - response.status >= 400 && - response.status < 500 && - response.status !== 429 - ) { + } else if (response.status >= 400 && response.status < 500 && response.status !== 429) { const e = await response.json(); console.log(e); throw Error(e.error.message); diff --git a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts index afcdd4b4c3..28baffb3f7 100644 --- a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts @@ -32,12 +32,9 @@ export const PromptSlice = createSlice({ }, }, extraReducers(builder) { - builder.addCase( - getPrompts.fulfilled, - (state, action: PayloadAction) => { - state.prompts = action.payload; - }, - ); + builder.addCase(getPrompts.fulfilled, (state, action: PayloadAction) => { + state.prompts = action.payload; + }); builder.addCase(addPrompt.fulfilled, () => { notify("Prompt added Successfully", NotificationSeverity.SUCCESS); }); diff --git a/ProductivitySuite/ui/react/src/utils/utils.js b/ProductivitySuite/ui/react/src/utils/utils.js index ce448f2515..59f40b5acf 100644 --- a/ProductivitySuite/ui/react/src/utils/utils.js +++ b/ProductivitySuite/ui/react/src/utils/utils.js @@ -67,10 +67,7 @@ export const getCurrentTimeStamp = () => { export const uuidv4 = () => { return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => - ( - +c ^ - (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4))) - ).toString(16), + (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16), ); }; From 7aa6790540acc3beb4ed95b1e77ffdb3f22515cd Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 06:18:22 +0000 Subject: [PATCH 09/25] fixed prettier issue Signed-off-by: Gurunath S --- ProductivitySuite/ui/react/README.md | 2 + ProductivitySuite/ui/react/index.html | 5 +- ProductivitySuite/ui/react/src/App.scss | 4 - .../PrimaryInput/PrimaryInput.module.scss | 6 +- ProductivitySuite/ui/react/src/config.ts | 9 -- ProductivitySuite/ui/react/src/index.scss | 3 +- .../ui/react/src/pages/Home/Home.tsx | 11 +- .../redux/Conversation/ConversationSlice.ts | 135 +++++++++++++----- .../ui/react/src/redux/Prompt/PromptSlice.ts | 35 +++-- .../ui/react/src/redux/thunkUtil.ts | 6 +- ProductivitySuite/ui/react/src/utils/utils.js | 10 +- 11 files changed, 151 insertions(+), 75 deletions(-) diff --git a/ProductivitySuite/ui/react/README.md b/ProductivitySuite/ui/react/README.md index b23b521c39..469a4c70fe 100644 --- a/ProductivitySuite/ui/react/README.md +++ b/ProductivitySuite/ui/react/README.md @@ -73,6 +73,7 @@ Here're some of the project's features: VITE_PROMPT_COLLECTION_NAME="prompt" ``` 4. There is models_config.json file under public folder. It is in the below format. The types key in the below json array shows that the model is used for following types. + ``` [ @@ -90,6 +91,7 @@ Here're some of the project's features: ] ``` + 5. Execute `npm install` to install the corresponding dependencies. 6. Execute `npm run dev` diff --git a/ProductivitySuite/ui/react/index.html b/ProductivitySuite/ui/react/index.html index b048d29d77..4419cf5114 100644 --- a/ProductivitySuite/ui/react/index.html +++ b/ProductivitySuite/ui/react/index.html @@ -16,7 +16,10 @@ /> - + ProductivitySuite UI diff --git a/ProductivitySuite/ui/react/src/App.scss b/ProductivitySuite/ui/react/src/App.scss index 995feab624..1317587986 100644 --- a/ProductivitySuite/ui/react/src/App.scss +++ b/ProductivitySuite/ui/react/src/App.scss @@ -1,5 +1 @@ -<<<<<<< HEAD -// Post javscript styles -======= // Post javascript styles ->>>>>>> c0c9e16f6c42465d9409bab8b48848105085a8a7 diff --git a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss index 184c4d79c4..79ef3c3f03 100644 --- a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss +++ b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss @@ -27,7 +27,8 @@ .textAreaAuto { font-family: "Inter", serif; - padding: var(--header-gutter) 100px var(--header-gutter) var(--header-gutter); + padding: var(--header-gutter) 100px var(--header-gutter) + var(--header-gutter); border: 0; width: 100%; resize: none; @@ -38,7 +39,8 @@ } &.summaryInput { - padding: var(--header-gutter) 70px var(--header-gutter) var(--header-gutter); + padding: var(--header-gutter) 70px var(--header-gutter) + var(--header-gutter); } } } diff --git a/ProductivitySuite/ui/react/src/config.ts b/ProductivitySuite/ui/react/src/config.ts index beaa62b4d5..393ab681ae 100644 --- a/ProductivitySuite/ui/react/src/config.ts +++ b/ProductivitySuite/ui/react/src/config.ts @@ -1,9 +1,6 @@ -<<<<<<< HEAD -======= // Copyright (C) 2025 Intel Corporation // SPDX-License-Identifier: Apache-2.0 ->>>>>>> c0c9e16f6c42465d9409bab8b48848105085a8a7 const config = { companyName: "My Company", logo: "/logo512.png", @@ -39,15 +36,9 @@ export const CHAT_HISTORY_GET = import.meta.env.VITE_CHAT_HISTORY_GET_ENDPOINT; export const CHAT_HISTORY_DELETE = import.meta.env .VITE_CHAT_HISTORY_DELETE_ENDPOINT; -<<<<<<< HEAD export const PROMPT_MANAGER_GET = import.meta.env .VITE_PROMPT_SERVICE_GET_ENDPOINT; export const PROMPT_MANAGER_CREATE = import.meta.env .VITE_PROMPT_SERVICE_CREATE_ENDPOINT; export const PROMPT_MANAGER_DELETE = import.meta.env .VITE_PROMPT_SERVICE_DELETE_ENDPOINT; -======= -export const PROMPT_MANAGER_GET = import.meta.env.VITE_PROMPT_SERVICE_GET_ENDPOINT; -export const PROMPT_MANAGER_CREATE = import.meta.env.VITE_PROMPT_SERVICE_CREATE_ENDPOINT; -export const PROMPT_MANAGER_DELETE = import.meta.env.VITE_PROMPT_SERVICE_DELETE_ENDPOINT; ->>>>>>> c0c9e16f6c42465d9409bab8b48848105085a8a7 diff --git a/ProductivitySuite/ui/react/src/index.scss b/ProductivitySuite/ui/react/src/index.scss index bf8ec543cb..ce899f3a36 100644 --- a/ProductivitySuite/ui/react/src/index.scss +++ b/ProductivitySuite/ui/react/src/index.scss @@ -21,7 +21,8 @@ body { } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; + font-family: + source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } :root { diff --git a/ProductivitySuite/ui/react/src/pages/Home/Home.tsx b/ProductivitySuite/ui/react/src/pages/Home/Home.tsx index 8105135297..4cefc32ea9 100644 --- a/ProductivitySuite/ui/react/src/pages/Home/Home.tsx +++ b/ProductivitySuite/ui/react/src/pages/Home/Home.tsx @@ -58,13 +58,10 @@ const Home = () => { } }, []); - useEffect(()=>{ - // clean up and reset. Can happen on going home from history/upload convo - // if convo is missing one of these - if(!model || !token || !temperature){ - dispatch(newConversation(true)) - } - }, []) + return ( +
+ {/* */} + Hi, {name}. {config.tagline} diff --git a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts index f22a06a0ff..85186e6e90 100644 --- a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts @@ -207,7 +207,9 @@ export const ConversationSlice = createSlice({ break; } - let firstModel = state.models.find((model: Model) => model.types.includes(action.payload)); + let firstModel = state.models.find((model: Model) => + model.types.includes(action.payload), + ); state.model = firstModel?.model_name || state.models[0].model_name; }, setUploadInProgress: (state, action: PayloadAction) => { @@ -311,7 +313,9 @@ export const getSupportedUseCases = createAsyncThunkWrapper( // setDefault use case if not stored / already set by localStorage if (!currentUseCase) { - const approvedAccess = response.data.find((item: UseCase) => item.access_level === userAccess); + const approvedAccess = response.data.find( + (item: UseCase) => item.access_level === userAccess, + ); if (approvedAccess) store.dispatch(setUseCase(approvedAccess)); } @@ -357,7 +361,10 @@ export const getAllConversations = createAsyncThunkWrapper( export const getConversationHistory = createAsyncThunkWrapper( "conversation/getConversationHistory", - async ({ user, conversationId }: { user: string; conversationId: string }, {}) => { + async ( + { user, conversationId }: { user: string; conversationId: string }, + {}, + ) => { const response = await axios.post(CHAT_HISTORY_GET, { user, id: conversationId, @@ -434,7 +441,10 @@ export const deleteMultipleInDataSource = createAsyncThunkWrapper( notify("Files deleted successfully", NotificationSeverity.SUCCESS); }) .catch((err) => { - notify("Error deleting on or more of your files", NotificationSeverity.ERROR); + notify( + "Error deleting on or more of your files", + NotificationSeverity.ERROR, + ); console.error("Error deleting on or more of your files", err); }) .finally(() => { @@ -456,7 +466,10 @@ export const deleteInDataSource = createAsyncThunkWrapper( export const saveConversationtoDatabase = createAsyncThunkWrapper( "conversation/saveConversationtoDatabase", - async ({ conversation }: { conversation: Conversation }, { dispatch, getState }) => { + async ( + { conversation }: { conversation: Conversation }, + { dispatch, getState }, + ) => { // @ts-ignore const state: RootState = getState(); const selectedConversationHistory = @@ -479,7 +492,12 @@ export const saveConversationtoDatabase = createAsyncThunkWrapper( first_query: selectedConversationHistory[firstMessageIndex].content, }); - dispatch(getAllConversations({ user: state.userReducer.name, useCase: state.conversationReducer.useCase })); + dispatch( + getAllConversations({ + user: state.userReducer.name, + useCase: state.conversationReducer.useCase, + }), + ); return response.data; }, ); @@ -487,7 +505,11 @@ export const saveConversationtoDatabase = createAsyncThunkWrapper( export const deleteConversations = createAsyncThunkWrapper( "conversation/deleteConversations", async ( - { user, conversationIds, useCase }: { user: string; conversationIds: string[]; useCase: string }, + { + user, + conversationIds, + useCase, + }: { user: string; conversationIds: string[]; useCase: string }, { dispatch }, ) => { const promises = conversationIds.map((id) => @@ -507,10 +529,16 @@ export const deleteConversations = createAsyncThunkWrapper( await Promise.all(promises) .then(() => { - notify("Conversations deleted successfully", NotificationSeverity.SUCCESS); + notify( + "Conversations deleted successfully", + NotificationSeverity.SUCCESS, + ); }) .catch((err) => { - notify("Error deleting on or more of your conversations", NotificationSeverity.ERROR); + notify( + "Error deleting on or more of your conversations", + NotificationSeverity.ERROR, + ); console.error("Error deleting on or more of your conversations", err); }) .finally(() => { @@ -522,7 +550,11 @@ export const deleteConversations = createAsyncThunkWrapper( export const deleteConversation = createAsyncThunkWrapper( "conversation/delete", async ( - { user, conversationId, useCase }: { user: string; conversationId: string; useCase: string }, + { + user, + conversationId, + useCase, + }: { user: string; conversationId: string; useCase: string }, { dispatch }, ) => { const response = await axios.post(CHAT_HISTORY_DELETE, { @@ -539,7 +571,15 @@ export const deleteConversation = createAsyncThunkWrapper( export const doConversation = (conversationRequest: ConversationRequest) => { store.dispatch(setIsPending(true)); - const { conversationId, userPrompt, messages, model, token, temperature, type } = conversationRequest; + const { + conversationId, + userPrompt, + messages, + model, + token, + temperature, + type, + } = conversationRequest; // TODO: MAYBE... check first message if 'system' already exists... on dev during page edits the // hot module reloads and instantly adds more system messages to the total messages @@ -565,7 +605,16 @@ export const doConversation = (conversationRequest: ConversationRequest) => { export const doSummaryFaq = (summaryFaqRequest: SummaryFaqRequest) => { store.dispatch(setIsPending(true)); - const { conversationId, model, token, temperature, type, messages, files, userPrompt } = summaryFaqRequest; + const { + conversationId, + model, + token, + temperature, + type, + messages, + files, + userPrompt, + } = summaryFaqRequest; const postWithFiles = files && files.length > 0; @@ -599,7 +648,8 @@ export const doSummaryFaq = (summaryFaqRequest: SummaryFaqRequest) => { export const doCodeGen = (codeRequest: CodeRequest) => { store.dispatch(setIsPending(true)); - const { conversationId, userPrompt, model, token, temperature, type } = codeRequest; + const { conversationId, userPrompt, model, token, temperature, type } = + codeRequest; store.dispatch(addMessageToMessages(userPrompt)); @@ -666,18 +716,20 @@ const eventStream = (type: string, body: any, conversationId: string = "") => { //text summary/faq for data: "ops string" const res = JSON.parse(msg.data); // Parse valid JSON const logs = res.ops; - logs.forEach((log: { op: string; path: string; value: string }) => { - if (log.op === "add") { - if ( - log.value !== "" && - log.path.endsWith("/streamed_output/-") && - log.path.length > "/streamed_output/-".length - ) { - result += log.value; - if (log.value) store.dispatch(setOnGoingResult(result)); + logs.forEach( + (log: { op: string; path: string; value: string }) => { + if (log.op === "add") { + if ( + log.value !== "" && + log.path.endsWith("/streamed_output/-") && + log.path.length > "/streamed_output/-".length + ) { + result += log.value; + if (log.value) store.dispatch(setOnGoingResult(result)); + } } - } - }); + }, + ); } } catch (e) { console.log("something wrong in msg", e); @@ -768,21 +820,29 @@ const formDataEventStream = async (url: string, formData: any) => { const res = JSON.parse(jsonStr); // Parse valid JSON const logs = res.ops; - logs.forEach((log: { op: string; path: string; value: string }) => { - if (log.op === "add") { - if ( - log.value !== "" && - log.path.endsWith("/streamed_output/-") && - log.path.length > "/streamed_output/-".length - ) { - result += log.value; - if (log.value) store.dispatch(setOnGoingResult(result)); + logs.forEach( + (log: { op: string; path: string; value: string }) => { + if (log.op === "add") { + if ( + log.value !== "" && + log.path.endsWith("/streamed_output/-") && + log.path.length > "/streamed_output/-".length + ) { + result += log.value; + if (log.value) + store.dispatch(setOnGoingResult(result)); + } } - } - }); + }, + ); } } catch (error) { - console.warn("Error parsing JSON:", error, "Raw Data:", jsonStr); + console.warn( + "Error parsing JSON:", + error, + "Raw Data:", + jsonStr, + ); } } else { const m: Message = { @@ -835,5 +895,6 @@ export const { setDataSourceUrlStatus, uploadChat, } = ConversationSlice.actions; -export const conversationSelector = (state: RootState) => state.conversationReducer; +export const conversationSelector = (state: RootState) => + state.conversationReducer; export default ConversationSlice.reducer; diff --git a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts index afcdd4b4c3..b81e7b75cd 100644 --- a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts @@ -4,8 +4,15 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createAsyncThunkWrapper } from "@redux/thunkUtil"; import { RootState } from "@redux/store"; -import { PROMPT_MANAGER_CREATE, PROMPT_MANAGER_GET, PROMPT_MANAGER_DELETE } from "@root/config"; -import { NotificationSeverity, notify } from "@components/Notification/Notification"; +import { + PROMPT_MANAGER_CREATE, + PROMPT_MANAGER_GET, + PROMPT_MANAGER_DELETE, +} from "@root/config"; +import { + NotificationSeverity, + notify, +} from "@components/Notification/Notification"; import axios from "axios"; type promptReducer = { @@ -51,14 +58,17 @@ export const { clearPrompts } = PromptSlice.actions; export const promptSelector = (state: RootState) => state.promptReducer; export default PromptSlice.reducer; -export const getPrompts = createAsyncThunkWrapper("prompts/getPrompts", async (_: void, { getState }) => { - // @ts-ignore - const state: RootState = getState(); - const response = await axios.post(PROMPT_MANAGER_GET, { - user: state.userReducer.name, - }); - return response.data; -}); +export const getPrompts = createAsyncThunkWrapper( + "prompts/getPrompts", + async (_: void, { getState }) => { + // @ts-ignore + const state: RootState = getState(); + const response = await axios.post(PROMPT_MANAGER_GET, { + user: state.userReducer.name, + }); + return response.data; + }, +); export const addPrompt = createAsyncThunkWrapper( "prompts/addPrompt", @@ -81,7 +91,10 @@ export const addPrompt = createAsyncThunkWrapper( //TODO delete prompt doesnt actually work, but responds 200 export const deletePrompt = createAsyncThunkWrapper( "prompts/deletePrompt", - async ({ promptId, promptText }: { promptId: string; promptText: string }, { dispatch, getState }) => { + async ( + { promptId, promptText }: { promptId: string; promptText: string }, + { dispatch, getState }, + ) => { // @ts-ignore const state: RootState = getState(); const user = state.userReducer.name; diff --git a/ProductivitySuite/ui/react/src/redux/thunkUtil.ts b/ProductivitySuite/ui/react/src/redux/thunkUtil.ts index 8db3b30330..81405fb81c 100644 --- a/ProductivitySuite/ui/react/src/redux/thunkUtil.ts +++ b/ProductivitySuite/ui/react/src/redux/thunkUtil.ts @@ -1,7 +1,11 @@ // Copyright (C) 2025 Intel Corporation // SPDX-License-Identifier: Apache-2.0 -import { createAsyncThunk, AsyncThunkPayloadCreator, AsyncThunk } from "@reduxjs/toolkit"; +import { + createAsyncThunk, + AsyncThunkPayloadCreator, + AsyncThunk, +} from "@reduxjs/toolkit"; interface ThunkAPIConfig {} diff --git a/ProductivitySuite/ui/react/src/utils/utils.js b/ProductivitySuite/ui/react/src/utils/utils.js index ce448f2515..cfe36f45ad 100644 --- a/ProductivitySuite/ui/react/src/utils/utils.js +++ b/ProductivitySuite/ui/react/src/utils/utils.js @@ -20,7 +20,11 @@ export const smartTrim = (string, maxLength) => { var toremove = string.length - maxLength; var lstrip = Math.ceil(toremove / 2); var rstrip = toremove - lstrip; - return string.substring(0, midpoint - lstrip) + "..." + string.substring(midpoint + rstrip); + return ( + string.substring(0, midpoint - lstrip) + + "..." + + string.substring(midpoint + rstrip) + ); }; export const QueryStringFromArr = (paramsArr = []) => { @@ -58,7 +62,9 @@ export function addPropsToChildren(children, props) { if (!Array.isArray(children)) { return addPropsToReactElement(children, props); } - return children.map((childElement, i) => addPropsToReactElement(childElement, props, i)); + return children.map((childElement, i) => + addPropsToReactElement(childElement, props, i), + ); } export const getCurrentTimeStamp = () => { From 6da18251814e47dc2a39b1fc65b43a960214a5d8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 17 Apr 2025 06:20:17 +0000 Subject: [PATCH 10/25] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- ProductivitySuite/ui/react/index.html | 5 +- ProductivitySuite/ui/react/src/App.scss | 1 - .../PrimaryInput/PrimaryInput.module.scss | 6 +- ProductivitySuite/ui/react/src/config.ts | 30 ++-- ProductivitySuite/ui/react/src/index.scss | 3 +- .../redux/Conversation/ConversationSlice.ts | 128 +++++------------- .../ui/react/src/redux/Prompt/PromptSlice.ts | 35 ++--- .../ui/react/src/redux/thunkUtil.ts | 6 +- ProductivitySuite/ui/react/src/utils/utils.js | 10 +- 9 files changed, 64 insertions(+), 160 deletions(-) diff --git a/ProductivitySuite/ui/react/index.html b/ProductivitySuite/ui/react/index.html index 4419cf5114..b048d29d77 100644 --- a/ProductivitySuite/ui/react/index.html +++ b/ProductivitySuite/ui/react/index.html @@ -16,10 +16,7 @@ /> - + ProductivitySuite UI diff --git a/ProductivitySuite/ui/react/src/App.scss b/ProductivitySuite/ui/react/src/App.scss index e8d30ccbd2..1317587986 100644 --- a/ProductivitySuite/ui/react/src/App.scss +++ b/ProductivitySuite/ui/react/src/App.scss @@ -1,2 +1 @@ // Post javascript styles - diff --git a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss index 79ef3c3f03..184c4d79c4 100644 --- a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss +++ b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss @@ -27,8 +27,7 @@ .textAreaAuto { font-family: "Inter", serif; - padding: var(--header-gutter) 100px var(--header-gutter) - var(--header-gutter); + padding: var(--header-gutter) 100px var(--header-gutter) var(--header-gutter); border: 0; width: 100%; resize: none; @@ -39,8 +38,7 @@ } &.summaryInput { - padding: var(--header-gutter) 70px var(--header-gutter) - var(--header-gutter); + padding: var(--header-gutter) 70px var(--header-gutter) var(--header-gutter); } } } diff --git a/ProductivitySuite/ui/react/src/config.ts b/ProductivitySuite/ui/react/src/config.ts index 393ab681ae..d9ff2db0e5 100644 --- a/ProductivitySuite/ui/react/src/config.ts +++ b/ProductivitySuite/ui/react/src/config.ts @@ -15,30 +15,20 @@ const config = { export default config; -export const CHAT_QNA_URL = import.meta.env - .VITE_BACKEND_SERVICE_ENDPOINT_CHATQNA; -export const CODE_GEN_URL = import.meta.env - .VITE_BACKEND_SERVICE_ENDPOINT_CODEGEN; +export const CHAT_QNA_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_CHATQNA; +export const CODE_GEN_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_CODEGEN; export const DOC_SUM_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_DOCSUM; export const FAQ_GEN_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_FAQGEN; -export const KEYCLOAK_SERVICE_URL = import.meta.env - .VITE_KEYCLOAK_SERVICE_ENDPOINT; +export const KEYCLOAK_SERVICE_URL = import.meta.env.VITE_KEYCLOAK_SERVICE_ENDPOINT; export const DATA_PREP_URL = import.meta.env.VITE_DATAPREP_SERVICE_ENDPOINT; -export const DATA_PREP_GET_URL = import.meta.env - .VITE_DATAPREP_GET_FILE_ENDPOINT; -export const DATA_PREP_DELETE_URL = import.meta.env - .VITE_DATAPREP_DELETE_FILE_ENDPOINT; +export const DATA_PREP_GET_URL = import.meta.env.VITE_DATAPREP_GET_FILE_ENDPOINT; +export const DATA_PREP_DELETE_URL = import.meta.env.VITE_DATAPREP_DELETE_FILE_ENDPOINT; -export const CHAT_HISTORY_CREATE = import.meta.env - .VITE_CHAT_HISTORY_CREATE_ENDPOINT; +export const CHAT_HISTORY_CREATE = import.meta.env.VITE_CHAT_HISTORY_CREATE_ENDPOINT; export const CHAT_HISTORY_GET = import.meta.env.VITE_CHAT_HISTORY_GET_ENDPOINT; -export const CHAT_HISTORY_DELETE = import.meta.env - .VITE_CHAT_HISTORY_DELETE_ENDPOINT; +export const CHAT_HISTORY_DELETE = import.meta.env.VITE_CHAT_HISTORY_DELETE_ENDPOINT; -export const PROMPT_MANAGER_GET = import.meta.env - .VITE_PROMPT_SERVICE_GET_ENDPOINT; -export const PROMPT_MANAGER_CREATE = import.meta.env - .VITE_PROMPT_SERVICE_CREATE_ENDPOINT; -export const PROMPT_MANAGER_DELETE = import.meta.env - .VITE_PROMPT_SERVICE_DELETE_ENDPOINT; +export const PROMPT_MANAGER_GET = import.meta.env.VITE_PROMPT_SERVICE_GET_ENDPOINT; +export const PROMPT_MANAGER_CREATE = import.meta.env.VITE_PROMPT_SERVICE_CREATE_ENDPOINT; +export const PROMPT_MANAGER_DELETE = import.meta.env.VITE_PROMPT_SERVICE_DELETE_ENDPOINT; diff --git a/ProductivitySuite/ui/react/src/index.scss b/ProductivitySuite/ui/react/src/index.scss index ce899f3a36..bf8ec543cb 100644 --- a/ProductivitySuite/ui/react/src/index.scss +++ b/ProductivitySuite/ui/react/src/index.scss @@ -21,8 +21,7 @@ body { } code { - font-family: - source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } :root { diff --git a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts index cfa7501e1c..f5071f0349 100644 --- a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts @@ -194,9 +194,7 @@ export const ConversationSlice = createSlice({ break; } - let firstModel = state.models.find((model: Model) => - model.types.includes(action.payload), - ); + let firstModel = state.models.find((model: Model) => model.types.includes(action.payload)); state.model = firstModel?.model_name || state.models[0].model_name; }, setUploadInProgress: (state, action: PayloadAction) => { @@ -297,9 +295,7 @@ export const getSupportedUseCases = createAsyncThunkWrapper( // setDefault use case if not stored / already set by localStorage if (!currentUseCase) { - const approvedAccess = response.data.find( - (item: UseCase) => item.access_level === userAccess, - ); + const approvedAccess = response.data.find((item: UseCase) => item.access_level === userAccess); if (approvedAccess) store.dispatch(setUseCase(approvedAccess)); } @@ -343,10 +339,7 @@ export const getAllConversations = createAsyncThunkWrapper( export const getConversationHistory = createAsyncThunkWrapper( "conversation/getConversationHistory", - async ( - { user, conversationId }: { user: string; conversationId: string }, - {}, - ) => { + async ({ user, conversationId }: { user: string; conversationId: string }, {}) => { const response = await axios.post(CHAT_HISTORY_GET, { user, id: conversationId, @@ -423,10 +416,7 @@ export const deleteMultipleInDataSource = createAsyncThunkWrapper( notify("Files deleted successfully", NotificationSeverity.SUCCESS); }) .catch((err) => { - notify( - "Error deleting on or more of your files", - NotificationSeverity.ERROR, - ); + notify("Error deleting on or more of your files", NotificationSeverity.ERROR); console.error("Error deleting on or more of your files", err); }) .finally(() => { @@ -448,10 +438,7 @@ export const deleteInDataSource = createAsyncThunkWrapper( export const saveConversationtoDatabase = createAsyncThunkWrapper( "conversation/saveConversationtoDatabase", - async ( - { conversation }: { conversation: Conversation }, - { dispatch, getState }, - ) => { + async ({ conversation }: { conversation: Conversation }, { dispatch, getState }) => { // @ts-ignore const state: RootState = getState(); const selectedConversationHistory = state.conversationReducer.selectedConversationHistory; @@ -486,11 +473,7 @@ export const saveConversationtoDatabase = createAsyncThunkWrapper( export const deleteConversations = createAsyncThunkWrapper( "conversation/deleteConversations", async ( - { - user, - conversationIds, - useCase, - }: { user: string; conversationIds: string[]; useCase: string }, + { user, conversationIds, useCase }: { user: string; conversationIds: string[]; useCase: string }, { dispatch }, ) => { const promises = conversationIds.map((id) => @@ -510,16 +493,10 @@ export const deleteConversations = createAsyncThunkWrapper( await Promise.all(promises) .then(() => { - notify( - "Conversations deleted successfully", - NotificationSeverity.SUCCESS, - ); + notify("Conversations deleted successfully", NotificationSeverity.SUCCESS); }) .catch((err) => { - notify( - "Error deleting on or more of your conversations", - NotificationSeverity.ERROR, - ); + notify("Error deleting on or more of your conversations", NotificationSeverity.ERROR); console.error("Error deleting on or more of your conversations", err); }) .finally(() => { @@ -531,11 +508,7 @@ export const deleteConversations = createAsyncThunkWrapper( export const deleteConversation = createAsyncThunkWrapper( "conversation/delete", async ( - { - user, - conversationId, - useCase, - }: { user: string; conversationId: string; useCase: string }, + { user, conversationId, useCase }: { user: string; conversationId: string; useCase: string }, { dispatch }, ) => { const response = await axios.post(CHAT_HISTORY_DELETE, { @@ -552,15 +525,7 @@ export const deleteConversation = createAsyncThunkWrapper( export const doConversation = (conversationRequest: ConversationRequest) => { store.dispatch(setIsPending(true)); - const { - conversationId, - userPrompt, - messages, - model, - token, - temperature, - type, - } = conversationRequest; + const { conversationId, userPrompt, messages, model, token, temperature, type } = conversationRequest; // TODO: MAYBE... check first message if 'system' already exists... on dev during page edits the // hot module reloads and instantly adds more system messages to the total messages @@ -586,16 +551,7 @@ export const doConversation = (conversationRequest: ConversationRequest) => { export const doSummaryFaq = (summaryFaqRequest: SummaryFaqRequest) => { store.dispatch(setIsPending(true)); - const { - conversationId, - model, - token, - temperature, - type, - messages, - files, - userPrompt, - } = summaryFaqRequest; + const { conversationId, model, token, temperature, type, messages, files, userPrompt } = summaryFaqRequest; const postWithFiles = files && files.length > 0; @@ -629,8 +585,7 @@ export const doSummaryFaq = (summaryFaqRequest: SummaryFaqRequest) => { export const doCodeGen = (codeRequest: CodeRequest) => { store.dispatch(setIsPending(true)); - const { conversationId, userPrompt, model, token, temperature, type } = - codeRequest; + const { conversationId, userPrompt, model, token, temperature, type } = codeRequest; store.dispatch(addMessageToMessages(userPrompt)); @@ -693,20 +648,18 @@ const eventStream = (type: string, body: any, conversationId: string = "") => { //text summary/faq for data: "ops string" const res = JSON.parse(msg.data); // Parse valid JSON const logs = res.ops; - logs.forEach( - (log: { op: string; path: string; value: string }) => { - if (log.op === "add") { - if ( - log.value !== "" && - log.path.endsWith("/streamed_output/-") && - log.path.length > "/streamed_output/-".length - ) { - result += log.value; - if (log.value) store.dispatch(setOnGoingResult(result)); - } + logs.forEach((log: { op: string; path: string; value: string }) => { + if (log.op === "add") { + if ( + log.value !== "" && + log.path.endsWith("/streamed_output/-") && + log.path.length > "/streamed_output/-".length + ) { + result += log.value; + if (log.value) store.dispatch(setOnGoingResult(result)); } - }, - ); + } + }); } } catch (e) { console.log("something wrong in msg", e); @@ -797,29 +750,21 @@ const formDataEventStream = async (url: string, formData: any) => { const res = JSON.parse(jsonStr); // Parse valid JSON const logs = res.ops; - logs.forEach( - (log: { op: string; path: string; value: string }) => { - if (log.op === "add") { - if ( - log.value !== "" && - log.path.endsWith("/streamed_output/-") && - log.path.length > "/streamed_output/-".length - ) { - result += log.value; - if (log.value) - store.dispatch(setOnGoingResult(result)); - } + logs.forEach((log: { op: string; path: string; value: string }) => { + if (log.op === "add") { + if ( + log.value !== "" && + log.path.endsWith("/streamed_output/-") && + log.path.length > "/streamed_output/-".length + ) { + result += log.value; + if (log.value) store.dispatch(setOnGoingResult(result)); } - }, - ); + } + }); } } catch (error) { - console.warn( - "Error parsing JSON:", - error, - "Raw Data:", - jsonStr, - ); + console.warn("Error parsing JSON:", error, "Raw Data:", jsonStr); } } else { const m: Message = { @@ -872,6 +817,5 @@ export const { setDataSourceUrlStatus, uploadChat, } = ConversationSlice.actions; -export const conversationSelector = (state: RootState) => - state.conversationReducer; +export const conversationSelector = (state: RootState) => state.conversationReducer; export default ConversationSlice.reducer; diff --git a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts index 4633272ec7..28baffb3f7 100644 --- a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts @@ -4,15 +4,8 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createAsyncThunkWrapper } from "@redux/thunkUtil"; import { RootState } from "@redux/store"; -import { - PROMPT_MANAGER_CREATE, - PROMPT_MANAGER_GET, - PROMPT_MANAGER_DELETE, -} from "@root/config"; -import { - NotificationSeverity, - notify, -} from "@components/Notification/Notification"; +import { PROMPT_MANAGER_CREATE, PROMPT_MANAGER_GET, PROMPT_MANAGER_DELETE } from "@root/config"; +import { NotificationSeverity, notify } from "@components/Notification/Notification"; import axios from "axios"; type promptReducer = { @@ -55,17 +48,14 @@ export const { clearPrompts } = PromptSlice.actions; export const promptSelector = (state: RootState) => state.promptReducer; export default PromptSlice.reducer; -export const getPrompts = createAsyncThunkWrapper( - "prompts/getPrompts", - async (_: void, { getState }) => { - // @ts-ignore - const state: RootState = getState(); - const response = await axios.post(PROMPT_MANAGER_GET, { - user: state.userReducer.name, - }); - return response.data; - }, -); +export const getPrompts = createAsyncThunkWrapper("prompts/getPrompts", async (_: void, { getState }) => { + // @ts-ignore + const state: RootState = getState(); + const response = await axios.post(PROMPT_MANAGER_GET, { + user: state.userReducer.name, + }); + return response.data; +}); export const addPrompt = createAsyncThunkWrapper( "prompts/addPrompt", @@ -88,10 +78,7 @@ export const addPrompt = createAsyncThunkWrapper( //TODO delete prompt doesnt actually work, but responds 200 export const deletePrompt = createAsyncThunkWrapper( "prompts/deletePrompt", - async ( - { promptId, promptText }: { promptId: string; promptText: string }, - { dispatch, getState }, - ) => { + async ({ promptId, promptText }: { promptId: string; promptText: string }, { dispatch, getState }) => { // @ts-ignore const state: RootState = getState(); const user = state.userReducer.name; diff --git a/ProductivitySuite/ui/react/src/redux/thunkUtil.ts b/ProductivitySuite/ui/react/src/redux/thunkUtil.ts index 81405fb81c..8db3b30330 100644 --- a/ProductivitySuite/ui/react/src/redux/thunkUtil.ts +++ b/ProductivitySuite/ui/react/src/redux/thunkUtil.ts @@ -1,11 +1,7 @@ // Copyright (C) 2025 Intel Corporation // SPDX-License-Identifier: Apache-2.0 -import { - createAsyncThunk, - AsyncThunkPayloadCreator, - AsyncThunk, -} from "@reduxjs/toolkit"; +import { createAsyncThunk, AsyncThunkPayloadCreator, AsyncThunk } from "@reduxjs/toolkit"; interface ThunkAPIConfig {} diff --git a/ProductivitySuite/ui/react/src/utils/utils.js b/ProductivitySuite/ui/react/src/utils/utils.js index 7f783aae7b..59f40b5acf 100644 --- a/ProductivitySuite/ui/react/src/utils/utils.js +++ b/ProductivitySuite/ui/react/src/utils/utils.js @@ -20,11 +20,7 @@ export const smartTrim = (string, maxLength) => { var toremove = string.length - maxLength; var lstrip = Math.ceil(toremove / 2); var rstrip = toremove - lstrip; - return ( - string.substring(0, midpoint - lstrip) + - "..." + - string.substring(midpoint + rstrip) - ); + return string.substring(0, midpoint - lstrip) + "..." + string.substring(midpoint + rstrip); }; export const QueryStringFromArr = (paramsArr = []) => { @@ -62,9 +58,7 @@ export function addPropsToChildren(children, props) { if (!Array.isArray(children)) { return addPropsToReactElement(children, props); } - return children.map((childElement, i) => - addPropsToReactElement(childElement, props, i), - ); + return children.map((childElement, i) => addPropsToReactElement(childElement, props, i)); } export const getCurrentTimeStamp = () => { From abc066c63c633ca7bfc29defce959786433160ef Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 06:29:50 +0000 Subject: [PATCH 11/25] Fixed copilot raised issue and codespell issue Signed-off-by: Gurunath S --- ProductivitySuite/ui/react/src/App.tsx | 1 - ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ProductivitySuite/ui/react/src/App.tsx b/ProductivitySuite/ui/react/src/App.tsx index 41428ad141..3cd40af3b3 100644 --- a/ProductivitySuite/ui/react/src/App.tsx +++ b/ProductivitySuite/ui/react/src/App.tsx @@ -47,7 +47,6 @@ const App = () => { const { useCase } = useAppSelector(conversationSelector); useEffect(() => { - if (keycloak?.idTokenParsed) console.log(keycloak?.idTokenParsed); //TODO: get role from keyCloack scope, defaulting to Admin dispatch( diff --git a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts index 28baffb3f7..e53e3e5190 100644 --- a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts @@ -75,7 +75,7 @@ export const addPrompt = createAsyncThunkWrapper( }, ); -//TODO delete prompt doesnt actually work, but responds 200 +//TODO delete prompt doesn't actually work, but responds 200 export const deletePrompt = createAsyncThunkWrapper( "prompts/deletePrompt", async ({ promptId, promptText }: { promptId: string; promptText: string }, { dispatch, getState }) => { From 0a8296b0c97bf052cc63bf5e73836f093cb3e595 Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 06:57:25 +0000 Subject: [PATCH 12/25] FIxed CI issue related to compose file Signed-off-by: Gurunath S --- ProductivitySuite/docker_compose/intel/cpu/xeon/compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProductivitySuite/docker_compose/intel/cpu/xeon/compose.yaml b/ProductivitySuite/docker_compose/intel/cpu/xeon/compose.yaml index bd337080db..00a16c1670 100644 --- a/ProductivitySuite/docker_compose/intel/cpu/xeon/compose.yaml +++ b/ProductivitySuite/docker_compose/intel/cpu/xeon/compose.yaml @@ -135,7 +135,7 @@ services: condition: service_started tei-reranking-service: condition: service_healthy - tgi_service: + tgi-service: condition: service_healthy ports: - "8888:8888" From 044cb1dda15fa6338800b36387f6243f55f755cf Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 08:14:08 +0000 Subject: [PATCH 13/25] Updated build.yaml in ProductivitySuite to include docsum and whisper images Signed-off-by: Gurunath S --- .../docker_image_build/build.yaml | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/ProductivitySuite/docker_image_build/build.yaml b/ProductivitySuite/docker_image_build/build.yaml index 34a3296c12..6e46d2c1a9 100644 --- a/ProductivitySuite/docker_image_build/build.yaml +++ b/ProductivitySuite/docker_image_build/build.yaml @@ -77,3 +77,29 @@ services: context: GenAIComps dockerfile: comps/llms/src/faq-generation/Dockerfile image: ${REGISTRY:-opea}/llm-faqgen:${TAG:-latest} + docsum: + build: + args: + IMAGE_REPO: ${REGISTRY} + BASE_TAG: ${TAG} + http_proxy: ${http_proxy} + https_proxy: ${https_proxy} + no_proxy: ${no_proxy} + context: ../ + dockerfile: ./Dockerfile + image: ${REGISTRY:-opea}/docsum:${TAG:-latest} + llm-docsum: + build: + context: GenAIComps + dockerfile: comps/llms/src/doc-summarization/Dockerfile + extends: docsum + image: ${REGISTRY:-opea}/llm-docsum:${TAG:-latest} + whisper: + build: + args: + http_proxy: ${http_proxy} + https_proxy: ${https_proxy} + context: GenAIComps + dockerfile: comps/third_parties/whisper/src/Dockerfile + extends: docsum + image: ${REGISTRY:-opea}/whisper:${TAG:-latest} From ade4bf614d53faf98b2dea6dadc1fb0b8f70c740 Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 08:20:21 +0000 Subject: [PATCH 14/25] updated build.yaml in ProductivitySuite Signed-off-by: Gurunath S --- ProductivitySuite/docker_image_build/build.yaml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/ProductivitySuite/docker_image_build/build.yaml b/ProductivitySuite/docker_image_build/build.yaml index 6e46d2c1a9..8b7033c350 100644 --- a/ProductivitySuite/docker_image_build/build.yaml +++ b/ProductivitySuite/docker_image_build/build.yaml @@ -77,17 +77,6 @@ services: context: GenAIComps dockerfile: comps/llms/src/faq-generation/Dockerfile image: ${REGISTRY:-opea}/llm-faqgen:${TAG:-latest} - docsum: - build: - args: - IMAGE_REPO: ${REGISTRY} - BASE_TAG: ${TAG} - http_proxy: ${http_proxy} - https_proxy: ${https_proxy} - no_proxy: ${no_proxy} - context: ../ - dockerfile: ./Dockerfile - image: ${REGISTRY:-opea}/docsum:${TAG:-latest} llm-docsum: build: context: GenAIComps From f2e76960d08f3151790cf5283d3878b4ef96fc37 Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 08:28:44 +0000 Subject: [PATCH 15/25] Removed Whisper section in build.yaml of ProductivitySuite Signed-off-by: Gurunath S --- ProductivitySuite/docker_image_build/build.yaml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/ProductivitySuite/docker_image_build/build.yaml b/ProductivitySuite/docker_image_build/build.yaml index 8b7033c350..0b7f760356 100644 --- a/ProductivitySuite/docker_image_build/build.yaml +++ b/ProductivitySuite/docker_image_build/build.yaml @@ -83,12 +83,4 @@ services: dockerfile: comps/llms/src/doc-summarization/Dockerfile extends: docsum image: ${REGISTRY:-opea}/llm-docsum:${TAG:-latest} - whisper: - build: - args: - http_proxy: ${http_proxy} - https_proxy: ${https_proxy} - context: GenAIComps - dockerfile: comps/third_parties/whisper/src/Dockerfile - extends: docsum - image: ${REGISTRY:-opea}/whisper:${TAG:-latest} + From 0b35f95ac54a94294fcf81e717fabb250670e7d0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 17 Apr 2025 08:31:41 +0000 Subject: [PATCH 16/25] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- ProductivitySuite/docker_image_build/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProductivitySuite/docker_image_build/build.yaml b/ProductivitySuite/docker_image_build/build.yaml index 0b7f760356..2da5ac59af 100644 --- a/ProductivitySuite/docker_image_build/build.yaml +++ b/ProductivitySuite/docker_image_build/build.yaml @@ -83,4 +83,4 @@ services: dockerfile: comps/llms/src/doc-summarization/Dockerfile extends: docsum image: ${REGISTRY:-opea}/llm-docsum:${TAG:-latest} - + From 6ff0d24e575c15856325be8e65c20c5ec8b2a3fb Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 08:36:43 +0000 Subject: [PATCH 17/25] Fixed prettier issue in ProductivitySuite Signed-off-by: Gurunath S --- ProductivitySuite/ui/react/.eslintrc.cjs | 11 +- ProductivitySuite/ui/react/index.html | 5 +- ProductivitySuite/ui/react/src/App.tsx | 1 - .../PrimaryInput/PrimaryInput.module.scss | 6 +- ProductivitySuite/ui/react/src/config.ts | 30 ++-- ProductivitySuite/ui/react/src/index.scss | 3 +- .../redux/Conversation/ConversationSlice.ts | 167 +++++++++++++----- .../ui/react/src/redux/Prompt/PromptSlice.ts | 44 +++-- .../ui/react/src/redux/thunkUtil.ts | 6 +- ProductivitySuite/ui/react/src/utils/utils.js | 15 +- 10 files changed, 209 insertions(+), 79 deletions(-) diff --git a/ProductivitySuite/ui/react/.eslintrc.cjs b/ProductivitySuite/ui/react/.eslintrc.cjs index 78174f6836..6e8698b72d 100644 --- a/ProductivitySuite/ui/react/.eslintrc.cjs +++ b/ProductivitySuite/ui/react/.eslintrc.cjs @@ -1,11 +1,18 @@ module.exports = { root: true, env: { browser: true, es2020: true }, - extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:react-hooks/recommended"], + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", + ], ignorePatterns: ["dist", ".eslintrc.cjs"], parser: "@typescript-eslint/parser", plugins: ["react-refresh"], rules: { - "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], }, }; diff --git a/ProductivitySuite/ui/react/index.html b/ProductivitySuite/ui/react/index.html index b048d29d77..4419cf5114 100644 --- a/ProductivitySuite/ui/react/index.html +++ b/ProductivitySuite/ui/react/index.html @@ -16,7 +16,10 @@ /> - + ProductivitySuite UI diff --git a/ProductivitySuite/ui/react/src/App.tsx b/ProductivitySuite/ui/react/src/App.tsx index 3cd40af3b3..970cbc58c6 100644 --- a/ProductivitySuite/ui/react/src/App.tsx +++ b/ProductivitySuite/ui/react/src/App.tsx @@ -47,7 +47,6 @@ const App = () => { const { useCase } = useAppSelector(conversationSelector); useEffect(() => { - //TODO: get role from keyCloack scope, defaulting to Admin dispatch( setUser({ diff --git a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss index 184c4d79c4..79ef3c3f03 100644 --- a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss +++ b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss @@ -27,7 +27,8 @@ .textAreaAuto { font-family: "Inter", serif; - padding: var(--header-gutter) 100px var(--header-gutter) var(--header-gutter); + padding: var(--header-gutter) 100px var(--header-gutter) + var(--header-gutter); border: 0; width: 100%; resize: none; @@ -38,7 +39,8 @@ } &.summaryInput { - padding: var(--header-gutter) 70px var(--header-gutter) var(--header-gutter); + padding: var(--header-gutter) 70px var(--header-gutter) + var(--header-gutter); } } } diff --git a/ProductivitySuite/ui/react/src/config.ts b/ProductivitySuite/ui/react/src/config.ts index d9ff2db0e5..393ab681ae 100644 --- a/ProductivitySuite/ui/react/src/config.ts +++ b/ProductivitySuite/ui/react/src/config.ts @@ -15,20 +15,30 @@ const config = { export default config; -export const CHAT_QNA_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_CHATQNA; -export const CODE_GEN_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_CODEGEN; +export const CHAT_QNA_URL = import.meta.env + .VITE_BACKEND_SERVICE_ENDPOINT_CHATQNA; +export const CODE_GEN_URL = import.meta.env + .VITE_BACKEND_SERVICE_ENDPOINT_CODEGEN; export const DOC_SUM_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_DOCSUM; export const FAQ_GEN_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_FAQGEN; -export const KEYCLOAK_SERVICE_URL = import.meta.env.VITE_KEYCLOAK_SERVICE_ENDPOINT; +export const KEYCLOAK_SERVICE_URL = import.meta.env + .VITE_KEYCLOAK_SERVICE_ENDPOINT; export const DATA_PREP_URL = import.meta.env.VITE_DATAPREP_SERVICE_ENDPOINT; -export const DATA_PREP_GET_URL = import.meta.env.VITE_DATAPREP_GET_FILE_ENDPOINT; -export const DATA_PREP_DELETE_URL = import.meta.env.VITE_DATAPREP_DELETE_FILE_ENDPOINT; +export const DATA_PREP_GET_URL = import.meta.env + .VITE_DATAPREP_GET_FILE_ENDPOINT; +export const DATA_PREP_DELETE_URL = import.meta.env + .VITE_DATAPREP_DELETE_FILE_ENDPOINT; -export const CHAT_HISTORY_CREATE = import.meta.env.VITE_CHAT_HISTORY_CREATE_ENDPOINT; +export const CHAT_HISTORY_CREATE = import.meta.env + .VITE_CHAT_HISTORY_CREATE_ENDPOINT; export const CHAT_HISTORY_GET = import.meta.env.VITE_CHAT_HISTORY_GET_ENDPOINT; -export const CHAT_HISTORY_DELETE = import.meta.env.VITE_CHAT_HISTORY_DELETE_ENDPOINT; +export const CHAT_HISTORY_DELETE = import.meta.env + .VITE_CHAT_HISTORY_DELETE_ENDPOINT; -export const PROMPT_MANAGER_GET = import.meta.env.VITE_PROMPT_SERVICE_GET_ENDPOINT; -export const PROMPT_MANAGER_CREATE = import.meta.env.VITE_PROMPT_SERVICE_CREATE_ENDPOINT; -export const PROMPT_MANAGER_DELETE = import.meta.env.VITE_PROMPT_SERVICE_DELETE_ENDPOINT; +export const PROMPT_MANAGER_GET = import.meta.env + .VITE_PROMPT_SERVICE_GET_ENDPOINT; +export const PROMPT_MANAGER_CREATE = import.meta.env + .VITE_PROMPT_SERVICE_CREATE_ENDPOINT; +export const PROMPT_MANAGER_DELETE = import.meta.env + .VITE_PROMPT_SERVICE_DELETE_ENDPOINT; diff --git a/ProductivitySuite/ui/react/src/index.scss b/ProductivitySuite/ui/react/src/index.scss index bf8ec543cb..ce899f3a36 100644 --- a/ProductivitySuite/ui/react/src/index.scss +++ b/ProductivitySuite/ui/react/src/index.scss @@ -21,7 +21,8 @@ body { } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; + font-family: + source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } :root { diff --git a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts index f5071f0349..85186e6e90 100644 --- a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts @@ -31,8 +31,16 @@ import config, { DOC_SUM_URL, FAQ_GEN_URL, } from "@root/config"; -import { NotificationSeverity, notify } from "@components/Notification/Notification"; -import { ChatBubbleOutline, CodeOutlined, Description, QuizOutlined } from "@mui/icons-material"; +import { + NotificationSeverity, + notify, +} from "@components/Notification/Notification"; +import { + ChatBubbleOutline, + CodeOutlined, + Description, + QuizOutlined, +} from "@mui/icons-material"; const urlMap: any = { summary: DOC_SUM_URL, @@ -133,7 +141,9 @@ export const ConversationSlice = createSlice({ // in case of upload / history conversation that clears model name, we want to reset to defaults const currentType = state.type; if (currentType) { - const approvedModel = state.models.find((item: Model) => item.types.includes(currentType)); + const approvedModel = state.models.find((item: Model) => + item.types.includes(currentType), + ); if (approvedModel) { state.model = approvedModel.model_name; state.token = approvedModel.minToken; @@ -151,7 +161,10 @@ export const ConversationSlice = createSlice({ setSelectedConversationId: (state, action: PayloadAction) => { state.selectedConversationId = action.payload; }, - setSelectedConversationHistory: (state, action: PayloadAction) => { + setSelectedConversationHistory: ( + state, + action: PayloadAction, + ) => { state.selectedConversationHistory = action.payload; }, setTemperature: (state, action: PayloadAction) => { @@ -194,7 +207,9 @@ export const ConversationSlice = createSlice({ break; } - let firstModel = state.models.find((model: Model) => model.types.includes(action.payload)); + let firstModel = state.models.find((model: Model) => + model.types.includes(action.payload), + ); state.model = firstModel?.model_name || state.models[0].model_name; }, setUploadInProgress: (state, action: PayloadAction) => { @@ -212,7 +227,10 @@ export const ConversationSlice = createSlice({ setSystemPrompt: (state, action: PayloadAction) => { state.systemPrompt = action.payload; }, - setAbortController: (state, action: PayloadAction) => { + setAbortController: ( + state, + action: PayloadAction, + ) => { state.abortController = action.payload; }, abortStream: (state) => { @@ -295,7 +313,9 @@ export const getSupportedUseCases = createAsyncThunkWrapper( // setDefault use case if not stored / already set by localStorage if (!currentUseCase) { - const approvedAccess = response.data.find((item: UseCase) => item.access_level === userAccess); + const approvedAccess = response.data.find( + (item: UseCase) => item.access_level === userAccess, + ); if (approvedAccess) store.dispatch(setUseCase(approvedAccess)); } @@ -317,7 +337,9 @@ export const getSupportedModels = createAsyncThunkWrapper( // setDefault use case if not stored / already set by localStorage // TODO: revisit if type also gets stored and not defaulted on state if (!currentModel && currentType) { - const approvedModel = response.data.find((item: Model) => item.types.includes(currentType)); + const approvedModel = response.data.find((item: Model) => + item.types.includes(currentType), + ); if (approvedModel) store.dispatch(setModel(approvedModel)); } @@ -339,7 +361,10 @@ export const getAllConversations = createAsyncThunkWrapper( export const getConversationHistory = createAsyncThunkWrapper( "conversation/getConversationHistory", - async ({ user, conversationId }: { user: string; conversationId: string }, {}) => { + async ( + { user, conversationId }: { user: string; conversationId: string }, + {}, + ) => { const response = await axios.post(CHAT_HISTORY_GET, { user, id: conversationId, @@ -416,7 +441,10 @@ export const deleteMultipleInDataSource = createAsyncThunkWrapper( notify("Files deleted successfully", NotificationSeverity.SUCCESS); }) .catch((err) => { - notify("Error deleting on or more of your files", NotificationSeverity.ERROR); + notify( + "Error deleting on or more of your files", + NotificationSeverity.ERROR, + ); console.error("Error deleting on or more of your files", err); }) .finally(() => { @@ -438,10 +466,14 @@ export const deleteInDataSource = createAsyncThunkWrapper( export const saveConversationtoDatabase = createAsyncThunkWrapper( "conversation/saveConversationtoDatabase", - async ({ conversation }: { conversation: Conversation }, { dispatch, getState }) => { + async ( + { conversation }: { conversation: Conversation }, + { dispatch, getState }, + ) => { // @ts-ignore const state: RootState = getState(); - const selectedConversationHistory = state.conversationReducer.selectedConversationHistory; + const selectedConversationHistory = + state.conversationReducer.selectedConversationHistory; //TODO: if we end up with a systemPrompt for code change this const firstMessageIndex = state.conversationReducer.type === "code" ? 0 : 1; @@ -473,7 +505,11 @@ export const saveConversationtoDatabase = createAsyncThunkWrapper( export const deleteConversations = createAsyncThunkWrapper( "conversation/deleteConversations", async ( - { user, conversationIds, useCase }: { user: string; conversationIds: string[]; useCase: string }, + { + user, + conversationIds, + useCase, + }: { user: string; conversationIds: string[]; useCase: string }, { dispatch }, ) => { const promises = conversationIds.map((id) => @@ -493,10 +529,16 @@ export const deleteConversations = createAsyncThunkWrapper( await Promise.all(promises) .then(() => { - notify("Conversations deleted successfully", NotificationSeverity.SUCCESS); + notify( + "Conversations deleted successfully", + NotificationSeverity.SUCCESS, + ); }) .catch((err) => { - notify("Error deleting on or more of your conversations", NotificationSeverity.ERROR); + notify( + "Error deleting on or more of your conversations", + NotificationSeverity.ERROR, + ); console.error("Error deleting on or more of your conversations", err); }) .finally(() => { @@ -508,7 +550,11 @@ export const deleteConversations = createAsyncThunkWrapper( export const deleteConversation = createAsyncThunkWrapper( "conversation/delete", async ( - { user, conversationId, useCase }: { user: string; conversationId: string; useCase: string }, + { + user, + conversationId, + useCase, + }: { user: string; conversationId: string; useCase: string }, { dispatch }, ) => { const response = await axios.post(CHAT_HISTORY_DELETE, { @@ -525,7 +571,15 @@ export const deleteConversation = createAsyncThunkWrapper( export const doConversation = (conversationRequest: ConversationRequest) => { store.dispatch(setIsPending(true)); - const { conversationId, userPrompt, messages, model, token, temperature, type } = conversationRequest; + const { + conversationId, + userPrompt, + messages, + model, + token, + temperature, + type, + } = conversationRequest; // TODO: MAYBE... check first message if 'system' already exists... on dev during page edits the // hot module reloads and instantly adds more system messages to the total messages @@ -551,7 +605,16 @@ export const doConversation = (conversationRequest: ConversationRequest) => { export const doSummaryFaq = (summaryFaqRequest: SummaryFaqRequest) => { store.dispatch(setIsPending(true)); - const { conversationId, model, token, temperature, type, messages, files, userPrompt } = summaryFaqRequest; + const { + conversationId, + model, + token, + temperature, + type, + messages, + files, + userPrompt, + } = summaryFaqRequest; const postWithFiles = files && files.length > 0; @@ -585,7 +648,8 @@ export const doSummaryFaq = (summaryFaqRequest: SummaryFaqRequest) => { export const doCodeGen = (codeRequest: CodeRequest) => { store.dispatch(setIsPending(true)); - const { conversationId, userPrompt, model, token, temperature, type } = codeRequest; + const { conversationId, userPrompt, model, token, temperature, type } = + codeRequest; store.dispatch(addMessageToMessages(userPrompt)); @@ -619,7 +683,11 @@ const eventStream = (type: string, body: any, conversationId: string = "") => { if (response.ok) { store.dispatch(setIsPending(false)); return; - } else if (response.status >= 400 && response.status < 500 && response.status !== 429) { + } else if ( + response.status >= 400 && + response.status < 500 && + response.status !== 429 + ) { const e = await response.json(); console.log(e); throw Error(e.error.message); @@ -648,18 +716,20 @@ const eventStream = (type: string, body: any, conversationId: string = "") => { //text summary/faq for data: "ops string" const res = JSON.parse(msg.data); // Parse valid JSON const logs = res.ops; - logs.forEach((log: { op: string; path: string; value: string }) => { - if (log.op === "add") { - if ( - log.value !== "" && - log.path.endsWith("/streamed_output/-") && - log.path.length > "/streamed_output/-".length - ) { - result += log.value; - if (log.value) store.dispatch(setOnGoingResult(result)); + logs.forEach( + (log: { op: string; path: string; value: string }) => { + if (log.op === "add") { + if ( + log.value !== "" && + log.path.endsWith("/streamed_output/-") && + log.path.length > "/streamed_output/-".length + ) { + result += log.value; + if (log.value) store.dispatch(setOnGoingResult(result)); + } } - } - }); + }, + ); } } catch (e) { console.log("something wrong in msg", e); @@ -750,21 +820,29 @@ const formDataEventStream = async (url: string, formData: any) => { const res = JSON.parse(jsonStr); // Parse valid JSON const logs = res.ops; - logs.forEach((log: { op: string; path: string; value: string }) => { - if (log.op === "add") { - if ( - log.value !== "" && - log.path.endsWith("/streamed_output/-") && - log.path.length > "/streamed_output/-".length - ) { - result += log.value; - if (log.value) store.dispatch(setOnGoingResult(result)); + logs.forEach( + (log: { op: string; path: string; value: string }) => { + if (log.op === "add") { + if ( + log.value !== "" && + log.path.endsWith("/streamed_output/-") && + log.path.length > "/streamed_output/-".length + ) { + result += log.value; + if (log.value) + store.dispatch(setOnGoingResult(result)); + } } - } - }); + }, + ); } } catch (error) { - console.warn("Error parsing JSON:", error, "Raw Data:", jsonStr); + console.warn( + "Error parsing JSON:", + error, + "Raw Data:", + jsonStr, + ); } } else { const m: Message = { @@ -817,5 +895,6 @@ export const { setDataSourceUrlStatus, uploadChat, } = ConversationSlice.actions; -export const conversationSelector = (state: RootState) => state.conversationReducer; +export const conversationSelector = (state: RootState) => + state.conversationReducer; export default ConversationSlice.reducer; diff --git a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts index e53e3e5190..0071130930 100644 --- a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts @@ -4,8 +4,15 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createAsyncThunkWrapper } from "@redux/thunkUtil"; import { RootState } from "@redux/store"; -import { PROMPT_MANAGER_CREATE, PROMPT_MANAGER_GET, PROMPT_MANAGER_DELETE } from "@root/config"; -import { NotificationSeverity, notify } from "@components/Notification/Notification"; +import { + PROMPT_MANAGER_CREATE, + PROMPT_MANAGER_GET, + PROMPT_MANAGER_DELETE, +} from "@root/config"; +import { + NotificationSeverity, + notify, +} from "@components/Notification/Notification"; import axios from "axios"; type promptReducer = { @@ -32,9 +39,12 @@ export const PromptSlice = createSlice({ }, }, extraReducers(builder) { - builder.addCase(getPrompts.fulfilled, (state, action: PayloadAction) => { - state.prompts = action.payload; - }); + builder.addCase( + getPrompts.fulfilled, + (state, action: PayloadAction) => { + state.prompts = action.payload; + }, + ); builder.addCase(addPrompt.fulfilled, () => { notify("Prompt added Successfully", NotificationSeverity.SUCCESS); }); @@ -48,14 +58,17 @@ export const { clearPrompts } = PromptSlice.actions; export const promptSelector = (state: RootState) => state.promptReducer; export default PromptSlice.reducer; -export const getPrompts = createAsyncThunkWrapper("prompts/getPrompts", async (_: void, { getState }) => { - // @ts-ignore - const state: RootState = getState(); - const response = await axios.post(PROMPT_MANAGER_GET, { - user: state.userReducer.name, - }); - return response.data; -}); +export const getPrompts = createAsyncThunkWrapper( + "prompts/getPrompts", + async (_: void, { getState }) => { + // @ts-ignore + const state: RootState = getState(); + const response = await axios.post(PROMPT_MANAGER_GET, { + user: state.userReducer.name, + }); + return response.data; + }, +); export const addPrompt = createAsyncThunkWrapper( "prompts/addPrompt", @@ -78,7 +91,10 @@ export const addPrompt = createAsyncThunkWrapper( //TODO delete prompt doesn't actually work, but responds 200 export const deletePrompt = createAsyncThunkWrapper( "prompts/deletePrompt", - async ({ promptId, promptText }: { promptId: string; promptText: string }, { dispatch, getState }) => { + async ( + { promptId, promptText }: { promptId: string; promptText: string }, + { dispatch, getState }, + ) => { // @ts-ignore const state: RootState = getState(); const user = state.userReducer.name; diff --git a/ProductivitySuite/ui/react/src/redux/thunkUtil.ts b/ProductivitySuite/ui/react/src/redux/thunkUtil.ts index 8db3b30330..81405fb81c 100644 --- a/ProductivitySuite/ui/react/src/redux/thunkUtil.ts +++ b/ProductivitySuite/ui/react/src/redux/thunkUtil.ts @@ -1,7 +1,11 @@ // Copyright (C) 2025 Intel Corporation // SPDX-License-Identifier: Apache-2.0 -import { createAsyncThunk, AsyncThunkPayloadCreator, AsyncThunk } from "@reduxjs/toolkit"; +import { + createAsyncThunk, + AsyncThunkPayloadCreator, + AsyncThunk, +} from "@reduxjs/toolkit"; interface ThunkAPIConfig {} diff --git a/ProductivitySuite/ui/react/src/utils/utils.js b/ProductivitySuite/ui/react/src/utils/utils.js index 59f40b5acf..cfe36f45ad 100644 --- a/ProductivitySuite/ui/react/src/utils/utils.js +++ b/ProductivitySuite/ui/react/src/utils/utils.js @@ -20,7 +20,11 @@ export const smartTrim = (string, maxLength) => { var toremove = string.length - maxLength; var lstrip = Math.ceil(toremove / 2); var rstrip = toremove - lstrip; - return string.substring(0, midpoint - lstrip) + "..." + string.substring(midpoint + rstrip); + return ( + string.substring(0, midpoint - lstrip) + + "..." + + string.substring(midpoint + rstrip) + ); }; export const QueryStringFromArr = (paramsArr = []) => { @@ -58,7 +62,9 @@ export function addPropsToChildren(children, props) { if (!Array.isArray(children)) { return addPropsToReactElement(children, props); } - return children.map((childElement, i) => addPropsToReactElement(childElement, props, i)); + return children.map((childElement, i) => + addPropsToReactElement(childElement, props, i), + ); } export const getCurrentTimeStamp = () => { @@ -67,7 +73,10 @@ export const getCurrentTimeStamp = () => { export const uuidv4 = () => { return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => - (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16), + ( + +c ^ + (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4))) + ).toString(16), ); }; From 152b6dc1eaa2fade725d4fb293e3ede94421a914 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 17 Apr 2025 08:37:23 +0000 Subject: [PATCH 18/25] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../docker_image_build/build.yaml | 1 - ProductivitySuite/ui/react/.eslintrc.cjs | 11 +- ProductivitySuite/ui/react/index.html | 5 +- .../PrimaryInput/PrimaryInput.module.scss | 6 +- ProductivitySuite/ui/react/src/config.ts | 30 ++-- ProductivitySuite/ui/react/src/index.scss | 3 +- .../redux/Conversation/ConversationSlice.ts | 167 +++++------------- .../ui/react/src/redux/Prompt/PromptSlice.ts | 44 ++--- .../ui/react/src/redux/thunkUtil.ts | 6 +- ProductivitySuite/ui/react/src/utils/utils.js | 15 +- 10 files changed, 78 insertions(+), 210 deletions(-) diff --git a/ProductivitySuite/docker_image_build/build.yaml b/ProductivitySuite/docker_image_build/build.yaml index 2da5ac59af..2dea30ada7 100644 --- a/ProductivitySuite/docker_image_build/build.yaml +++ b/ProductivitySuite/docker_image_build/build.yaml @@ -83,4 +83,3 @@ services: dockerfile: comps/llms/src/doc-summarization/Dockerfile extends: docsum image: ${REGISTRY:-opea}/llm-docsum:${TAG:-latest} - diff --git a/ProductivitySuite/ui/react/.eslintrc.cjs b/ProductivitySuite/ui/react/.eslintrc.cjs index 6e8698b72d..78174f6836 100644 --- a/ProductivitySuite/ui/react/.eslintrc.cjs +++ b/ProductivitySuite/ui/react/.eslintrc.cjs @@ -1,18 +1,11 @@ module.exports = { root: true, env: { browser: true, es2020: true }, - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:react-hooks/recommended", - ], + extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:react-hooks/recommended"], ignorePatterns: ["dist", ".eslintrc.cjs"], parser: "@typescript-eslint/parser", plugins: ["react-refresh"], rules: { - "react-refresh/only-export-components": [ - "warn", - { allowConstantExport: true }, - ], + "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], }, }; diff --git a/ProductivitySuite/ui/react/index.html b/ProductivitySuite/ui/react/index.html index 4419cf5114..b048d29d77 100644 --- a/ProductivitySuite/ui/react/index.html +++ b/ProductivitySuite/ui/react/index.html @@ -16,10 +16,7 @@ /> - + ProductivitySuite UI diff --git a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss index 79ef3c3f03..184c4d79c4 100644 --- a/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss +++ b/ProductivitySuite/ui/react/src/components/PrimaryInput/PrimaryInput.module.scss @@ -27,8 +27,7 @@ .textAreaAuto { font-family: "Inter", serif; - padding: var(--header-gutter) 100px var(--header-gutter) - var(--header-gutter); + padding: var(--header-gutter) 100px var(--header-gutter) var(--header-gutter); border: 0; width: 100%; resize: none; @@ -39,8 +38,7 @@ } &.summaryInput { - padding: var(--header-gutter) 70px var(--header-gutter) - var(--header-gutter); + padding: var(--header-gutter) 70px var(--header-gutter) var(--header-gutter); } } } diff --git a/ProductivitySuite/ui/react/src/config.ts b/ProductivitySuite/ui/react/src/config.ts index 393ab681ae..d9ff2db0e5 100644 --- a/ProductivitySuite/ui/react/src/config.ts +++ b/ProductivitySuite/ui/react/src/config.ts @@ -15,30 +15,20 @@ const config = { export default config; -export const CHAT_QNA_URL = import.meta.env - .VITE_BACKEND_SERVICE_ENDPOINT_CHATQNA; -export const CODE_GEN_URL = import.meta.env - .VITE_BACKEND_SERVICE_ENDPOINT_CODEGEN; +export const CHAT_QNA_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_CHATQNA; +export const CODE_GEN_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_CODEGEN; export const DOC_SUM_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_DOCSUM; export const FAQ_GEN_URL = import.meta.env.VITE_BACKEND_SERVICE_ENDPOINT_FAQGEN; -export const KEYCLOAK_SERVICE_URL = import.meta.env - .VITE_KEYCLOAK_SERVICE_ENDPOINT; +export const KEYCLOAK_SERVICE_URL = import.meta.env.VITE_KEYCLOAK_SERVICE_ENDPOINT; export const DATA_PREP_URL = import.meta.env.VITE_DATAPREP_SERVICE_ENDPOINT; -export const DATA_PREP_GET_URL = import.meta.env - .VITE_DATAPREP_GET_FILE_ENDPOINT; -export const DATA_PREP_DELETE_URL = import.meta.env - .VITE_DATAPREP_DELETE_FILE_ENDPOINT; +export const DATA_PREP_GET_URL = import.meta.env.VITE_DATAPREP_GET_FILE_ENDPOINT; +export const DATA_PREP_DELETE_URL = import.meta.env.VITE_DATAPREP_DELETE_FILE_ENDPOINT; -export const CHAT_HISTORY_CREATE = import.meta.env - .VITE_CHAT_HISTORY_CREATE_ENDPOINT; +export const CHAT_HISTORY_CREATE = import.meta.env.VITE_CHAT_HISTORY_CREATE_ENDPOINT; export const CHAT_HISTORY_GET = import.meta.env.VITE_CHAT_HISTORY_GET_ENDPOINT; -export const CHAT_HISTORY_DELETE = import.meta.env - .VITE_CHAT_HISTORY_DELETE_ENDPOINT; +export const CHAT_HISTORY_DELETE = import.meta.env.VITE_CHAT_HISTORY_DELETE_ENDPOINT; -export const PROMPT_MANAGER_GET = import.meta.env - .VITE_PROMPT_SERVICE_GET_ENDPOINT; -export const PROMPT_MANAGER_CREATE = import.meta.env - .VITE_PROMPT_SERVICE_CREATE_ENDPOINT; -export const PROMPT_MANAGER_DELETE = import.meta.env - .VITE_PROMPT_SERVICE_DELETE_ENDPOINT; +export const PROMPT_MANAGER_GET = import.meta.env.VITE_PROMPT_SERVICE_GET_ENDPOINT; +export const PROMPT_MANAGER_CREATE = import.meta.env.VITE_PROMPT_SERVICE_CREATE_ENDPOINT; +export const PROMPT_MANAGER_DELETE = import.meta.env.VITE_PROMPT_SERVICE_DELETE_ENDPOINT; diff --git a/ProductivitySuite/ui/react/src/index.scss b/ProductivitySuite/ui/react/src/index.scss index ce899f3a36..bf8ec543cb 100644 --- a/ProductivitySuite/ui/react/src/index.scss +++ b/ProductivitySuite/ui/react/src/index.scss @@ -21,8 +21,7 @@ body { } code { - font-family: - source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } :root { diff --git a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts index 85186e6e90..f5071f0349 100644 --- a/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Conversation/ConversationSlice.ts @@ -31,16 +31,8 @@ import config, { DOC_SUM_URL, FAQ_GEN_URL, } from "@root/config"; -import { - NotificationSeverity, - notify, -} from "@components/Notification/Notification"; -import { - ChatBubbleOutline, - CodeOutlined, - Description, - QuizOutlined, -} from "@mui/icons-material"; +import { NotificationSeverity, notify } from "@components/Notification/Notification"; +import { ChatBubbleOutline, CodeOutlined, Description, QuizOutlined } from "@mui/icons-material"; const urlMap: any = { summary: DOC_SUM_URL, @@ -141,9 +133,7 @@ export const ConversationSlice = createSlice({ // in case of upload / history conversation that clears model name, we want to reset to defaults const currentType = state.type; if (currentType) { - const approvedModel = state.models.find((item: Model) => - item.types.includes(currentType), - ); + const approvedModel = state.models.find((item: Model) => item.types.includes(currentType)); if (approvedModel) { state.model = approvedModel.model_name; state.token = approvedModel.minToken; @@ -161,10 +151,7 @@ export const ConversationSlice = createSlice({ setSelectedConversationId: (state, action: PayloadAction) => { state.selectedConversationId = action.payload; }, - setSelectedConversationHistory: ( - state, - action: PayloadAction, - ) => { + setSelectedConversationHistory: (state, action: PayloadAction) => { state.selectedConversationHistory = action.payload; }, setTemperature: (state, action: PayloadAction) => { @@ -207,9 +194,7 @@ export const ConversationSlice = createSlice({ break; } - let firstModel = state.models.find((model: Model) => - model.types.includes(action.payload), - ); + let firstModel = state.models.find((model: Model) => model.types.includes(action.payload)); state.model = firstModel?.model_name || state.models[0].model_name; }, setUploadInProgress: (state, action: PayloadAction) => { @@ -227,10 +212,7 @@ export const ConversationSlice = createSlice({ setSystemPrompt: (state, action: PayloadAction) => { state.systemPrompt = action.payload; }, - setAbortController: ( - state, - action: PayloadAction, - ) => { + setAbortController: (state, action: PayloadAction) => { state.abortController = action.payload; }, abortStream: (state) => { @@ -313,9 +295,7 @@ export const getSupportedUseCases = createAsyncThunkWrapper( // setDefault use case if not stored / already set by localStorage if (!currentUseCase) { - const approvedAccess = response.data.find( - (item: UseCase) => item.access_level === userAccess, - ); + const approvedAccess = response.data.find((item: UseCase) => item.access_level === userAccess); if (approvedAccess) store.dispatch(setUseCase(approvedAccess)); } @@ -337,9 +317,7 @@ export const getSupportedModels = createAsyncThunkWrapper( // setDefault use case if not stored / already set by localStorage // TODO: revisit if type also gets stored and not defaulted on state if (!currentModel && currentType) { - const approvedModel = response.data.find((item: Model) => - item.types.includes(currentType), - ); + const approvedModel = response.data.find((item: Model) => item.types.includes(currentType)); if (approvedModel) store.dispatch(setModel(approvedModel)); } @@ -361,10 +339,7 @@ export const getAllConversations = createAsyncThunkWrapper( export const getConversationHistory = createAsyncThunkWrapper( "conversation/getConversationHistory", - async ( - { user, conversationId }: { user: string; conversationId: string }, - {}, - ) => { + async ({ user, conversationId }: { user: string; conversationId: string }, {}) => { const response = await axios.post(CHAT_HISTORY_GET, { user, id: conversationId, @@ -441,10 +416,7 @@ export const deleteMultipleInDataSource = createAsyncThunkWrapper( notify("Files deleted successfully", NotificationSeverity.SUCCESS); }) .catch((err) => { - notify( - "Error deleting on or more of your files", - NotificationSeverity.ERROR, - ); + notify("Error deleting on or more of your files", NotificationSeverity.ERROR); console.error("Error deleting on or more of your files", err); }) .finally(() => { @@ -466,14 +438,10 @@ export const deleteInDataSource = createAsyncThunkWrapper( export const saveConversationtoDatabase = createAsyncThunkWrapper( "conversation/saveConversationtoDatabase", - async ( - { conversation }: { conversation: Conversation }, - { dispatch, getState }, - ) => { + async ({ conversation }: { conversation: Conversation }, { dispatch, getState }) => { // @ts-ignore const state: RootState = getState(); - const selectedConversationHistory = - state.conversationReducer.selectedConversationHistory; + const selectedConversationHistory = state.conversationReducer.selectedConversationHistory; //TODO: if we end up with a systemPrompt for code change this const firstMessageIndex = state.conversationReducer.type === "code" ? 0 : 1; @@ -505,11 +473,7 @@ export const saveConversationtoDatabase = createAsyncThunkWrapper( export const deleteConversations = createAsyncThunkWrapper( "conversation/deleteConversations", async ( - { - user, - conversationIds, - useCase, - }: { user: string; conversationIds: string[]; useCase: string }, + { user, conversationIds, useCase }: { user: string; conversationIds: string[]; useCase: string }, { dispatch }, ) => { const promises = conversationIds.map((id) => @@ -529,16 +493,10 @@ export const deleteConversations = createAsyncThunkWrapper( await Promise.all(promises) .then(() => { - notify( - "Conversations deleted successfully", - NotificationSeverity.SUCCESS, - ); + notify("Conversations deleted successfully", NotificationSeverity.SUCCESS); }) .catch((err) => { - notify( - "Error deleting on or more of your conversations", - NotificationSeverity.ERROR, - ); + notify("Error deleting on or more of your conversations", NotificationSeverity.ERROR); console.error("Error deleting on or more of your conversations", err); }) .finally(() => { @@ -550,11 +508,7 @@ export const deleteConversations = createAsyncThunkWrapper( export const deleteConversation = createAsyncThunkWrapper( "conversation/delete", async ( - { - user, - conversationId, - useCase, - }: { user: string; conversationId: string; useCase: string }, + { user, conversationId, useCase }: { user: string; conversationId: string; useCase: string }, { dispatch }, ) => { const response = await axios.post(CHAT_HISTORY_DELETE, { @@ -571,15 +525,7 @@ export const deleteConversation = createAsyncThunkWrapper( export const doConversation = (conversationRequest: ConversationRequest) => { store.dispatch(setIsPending(true)); - const { - conversationId, - userPrompt, - messages, - model, - token, - temperature, - type, - } = conversationRequest; + const { conversationId, userPrompt, messages, model, token, temperature, type } = conversationRequest; // TODO: MAYBE... check first message if 'system' already exists... on dev during page edits the // hot module reloads and instantly adds more system messages to the total messages @@ -605,16 +551,7 @@ export const doConversation = (conversationRequest: ConversationRequest) => { export const doSummaryFaq = (summaryFaqRequest: SummaryFaqRequest) => { store.dispatch(setIsPending(true)); - const { - conversationId, - model, - token, - temperature, - type, - messages, - files, - userPrompt, - } = summaryFaqRequest; + const { conversationId, model, token, temperature, type, messages, files, userPrompt } = summaryFaqRequest; const postWithFiles = files && files.length > 0; @@ -648,8 +585,7 @@ export const doSummaryFaq = (summaryFaqRequest: SummaryFaqRequest) => { export const doCodeGen = (codeRequest: CodeRequest) => { store.dispatch(setIsPending(true)); - const { conversationId, userPrompt, model, token, temperature, type } = - codeRequest; + const { conversationId, userPrompt, model, token, temperature, type } = codeRequest; store.dispatch(addMessageToMessages(userPrompt)); @@ -683,11 +619,7 @@ const eventStream = (type: string, body: any, conversationId: string = "") => { if (response.ok) { store.dispatch(setIsPending(false)); return; - } else if ( - response.status >= 400 && - response.status < 500 && - response.status !== 429 - ) { + } else if (response.status >= 400 && response.status < 500 && response.status !== 429) { const e = await response.json(); console.log(e); throw Error(e.error.message); @@ -716,20 +648,18 @@ const eventStream = (type: string, body: any, conversationId: string = "") => { //text summary/faq for data: "ops string" const res = JSON.parse(msg.data); // Parse valid JSON const logs = res.ops; - logs.forEach( - (log: { op: string; path: string; value: string }) => { - if (log.op === "add") { - if ( - log.value !== "" && - log.path.endsWith("/streamed_output/-") && - log.path.length > "/streamed_output/-".length - ) { - result += log.value; - if (log.value) store.dispatch(setOnGoingResult(result)); - } + logs.forEach((log: { op: string; path: string; value: string }) => { + if (log.op === "add") { + if ( + log.value !== "" && + log.path.endsWith("/streamed_output/-") && + log.path.length > "/streamed_output/-".length + ) { + result += log.value; + if (log.value) store.dispatch(setOnGoingResult(result)); } - }, - ); + } + }); } } catch (e) { console.log("something wrong in msg", e); @@ -820,29 +750,21 @@ const formDataEventStream = async (url: string, formData: any) => { const res = JSON.parse(jsonStr); // Parse valid JSON const logs = res.ops; - logs.forEach( - (log: { op: string; path: string; value: string }) => { - if (log.op === "add") { - if ( - log.value !== "" && - log.path.endsWith("/streamed_output/-") && - log.path.length > "/streamed_output/-".length - ) { - result += log.value; - if (log.value) - store.dispatch(setOnGoingResult(result)); - } + logs.forEach((log: { op: string; path: string; value: string }) => { + if (log.op === "add") { + if ( + log.value !== "" && + log.path.endsWith("/streamed_output/-") && + log.path.length > "/streamed_output/-".length + ) { + result += log.value; + if (log.value) store.dispatch(setOnGoingResult(result)); } - }, - ); + } + }); } } catch (error) { - console.warn( - "Error parsing JSON:", - error, - "Raw Data:", - jsonStr, - ); + console.warn("Error parsing JSON:", error, "Raw Data:", jsonStr); } } else { const m: Message = { @@ -895,6 +817,5 @@ export const { setDataSourceUrlStatus, uploadChat, } = ConversationSlice.actions; -export const conversationSelector = (state: RootState) => - state.conversationReducer; +export const conversationSelector = (state: RootState) => state.conversationReducer; export default ConversationSlice.reducer; diff --git a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts index 0071130930..e53e3e5190 100644 --- a/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts +++ b/ProductivitySuite/ui/react/src/redux/Prompt/PromptSlice.ts @@ -4,15 +4,8 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createAsyncThunkWrapper } from "@redux/thunkUtil"; import { RootState } from "@redux/store"; -import { - PROMPT_MANAGER_CREATE, - PROMPT_MANAGER_GET, - PROMPT_MANAGER_DELETE, -} from "@root/config"; -import { - NotificationSeverity, - notify, -} from "@components/Notification/Notification"; +import { PROMPT_MANAGER_CREATE, PROMPT_MANAGER_GET, PROMPT_MANAGER_DELETE } from "@root/config"; +import { NotificationSeverity, notify } from "@components/Notification/Notification"; import axios from "axios"; type promptReducer = { @@ -39,12 +32,9 @@ export const PromptSlice = createSlice({ }, }, extraReducers(builder) { - builder.addCase( - getPrompts.fulfilled, - (state, action: PayloadAction) => { - state.prompts = action.payload; - }, - ); + builder.addCase(getPrompts.fulfilled, (state, action: PayloadAction) => { + state.prompts = action.payload; + }); builder.addCase(addPrompt.fulfilled, () => { notify("Prompt added Successfully", NotificationSeverity.SUCCESS); }); @@ -58,17 +48,14 @@ export const { clearPrompts } = PromptSlice.actions; export const promptSelector = (state: RootState) => state.promptReducer; export default PromptSlice.reducer; -export const getPrompts = createAsyncThunkWrapper( - "prompts/getPrompts", - async (_: void, { getState }) => { - // @ts-ignore - const state: RootState = getState(); - const response = await axios.post(PROMPT_MANAGER_GET, { - user: state.userReducer.name, - }); - return response.data; - }, -); +export const getPrompts = createAsyncThunkWrapper("prompts/getPrompts", async (_: void, { getState }) => { + // @ts-ignore + const state: RootState = getState(); + const response = await axios.post(PROMPT_MANAGER_GET, { + user: state.userReducer.name, + }); + return response.data; +}); export const addPrompt = createAsyncThunkWrapper( "prompts/addPrompt", @@ -91,10 +78,7 @@ export const addPrompt = createAsyncThunkWrapper( //TODO delete prompt doesn't actually work, but responds 200 export const deletePrompt = createAsyncThunkWrapper( "prompts/deletePrompt", - async ( - { promptId, promptText }: { promptId: string; promptText: string }, - { dispatch, getState }, - ) => { + async ({ promptId, promptText }: { promptId: string; promptText: string }, { dispatch, getState }) => { // @ts-ignore const state: RootState = getState(); const user = state.userReducer.name; diff --git a/ProductivitySuite/ui/react/src/redux/thunkUtil.ts b/ProductivitySuite/ui/react/src/redux/thunkUtil.ts index 81405fb81c..8db3b30330 100644 --- a/ProductivitySuite/ui/react/src/redux/thunkUtil.ts +++ b/ProductivitySuite/ui/react/src/redux/thunkUtil.ts @@ -1,11 +1,7 @@ // Copyright (C) 2025 Intel Corporation // SPDX-License-Identifier: Apache-2.0 -import { - createAsyncThunk, - AsyncThunkPayloadCreator, - AsyncThunk, -} from "@reduxjs/toolkit"; +import { createAsyncThunk, AsyncThunkPayloadCreator, AsyncThunk } from "@reduxjs/toolkit"; interface ThunkAPIConfig {} diff --git a/ProductivitySuite/ui/react/src/utils/utils.js b/ProductivitySuite/ui/react/src/utils/utils.js index cfe36f45ad..59f40b5acf 100644 --- a/ProductivitySuite/ui/react/src/utils/utils.js +++ b/ProductivitySuite/ui/react/src/utils/utils.js @@ -20,11 +20,7 @@ export const smartTrim = (string, maxLength) => { var toremove = string.length - maxLength; var lstrip = Math.ceil(toremove / 2); var rstrip = toremove - lstrip; - return ( - string.substring(0, midpoint - lstrip) + - "..." + - string.substring(midpoint + rstrip) - ); + return string.substring(0, midpoint - lstrip) + "..." + string.substring(midpoint + rstrip); }; export const QueryStringFromArr = (paramsArr = []) => { @@ -62,9 +58,7 @@ export function addPropsToChildren(children, props) { if (!Array.isArray(children)) { return addPropsToReactElement(children, props); } - return children.map((childElement, i) => - addPropsToReactElement(childElement, props, i), - ); + return children.map((childElement, i) => addPropsToReactElement(childElement, props, i)); } export const getCurrentTimeStamp = () => { @@ -73,10 +67,7 @@ export const getCurrentTimeStamp = () => { export const uuidv4 = () => { return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => - ( - +c ^ - (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4))) - ).toString(16), + (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16), ); }; From 5ac0c1d0b81dc0c209fc6a616bce6b8555d1bef2 Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 14:00:06 +0000 Subject: [PATCH 19/25] Fixed CI issue on docker compose file Signed-off-by: Gurunath S --- ProductivitySuite/docker_image_build/build.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/ProductivitySuite/docker_image_build/build.yaml b/ProductivitySuite/docker_image_build/build.yaml index 2dea30ada7..06a07a66ff 100644 --- a/ProductivitySuite/docker_image_build/build.yaml +++ b/ProductivitySuite/docker_image_build/build.yaml @@ -81,5 +81,4 @@ services: build: context: GenAIComps dockerfile: comps/llms/src/doc-summarization/Dockerfile - extends: docsum image: ${REGISTRY:-opea}/llm-docsum:${TAG:-latest} From 21939967573801819abdd8622016780912862c7d Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 14:02:38 +0000 Subject: [PATCH 20/25] added whisper in build.yaml Signed-off-by: Gurunath S --- ProductivitySuite/docker_image_build/build.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ProductivitySuite/docker_image_build/build.yaml b/ProductivitySuite/docker_image_build/build.yaml index 06a07a66ff..3bcc201010 100644 --- a/ProductivitySuite/docker_image_build/build.yaml +++ b/ProductivitySuite/docker_image_build/build.yaml @@ -82,3 +82,11 @@ services: context: GenAIComps dockerfile: comps/llms/src/doc-summarization/Dockerfile image: ${REGISTRY:-opea}/llm-docsum:${TAG:-latest} + whisper: + build: + args: + http_proxy: ${http_proxy} + https_proxy: ${https_proxy} + context: GenAIComps + dockerfile: comps/third_parties/whisper/src/Dockerfile + image: ${REGISTRY:-opea}/whisper:${TAG:-latest} From 31df27a610b6cd1f65a4a89b04023ffe0d128ab8 Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 14:19:09 +0000 Subject: [PATCH 21/25] Added docsum to the build.yaml in ProductivitySuite Signed-off-by: Gurunath S --- ProductivitySuite/docker_image_build/build.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ProductivitySuite/docker_image_build/build.yaml b/ProductivitySuite/docker_image_build/build.yaml index 3bcc201010..0de722a131 100644 --- a/ProductivitySuite/docker_image_build/build.yaml +++ b/ProductivitySuite/docker_image_build/build.yaml @@ -77,10 +77,22 @@ services: context: GenAIComps dockerfile: comps/llms/src/faq-generation/Dockerfile image: ${REGISTRY:-opea}/llm-faqgen:${TAG:-latest} + docsum: + build: + args: + IMAGE_REPO: ${REGISTRY} + BASE_TAG: ${TAG} + http_proxy: ${http_proxy} + https_proxy: ${https_proxy} + no_proxy: ${no_proxy} + context: ../../DocSum/ + dockerfile: ./Dockerfile + image: ${REGISTRY:-opea}/docsum:${TAG:-latest} llm-docsum: build: context: GenAIComps dockerfile: comps/llms/src/doc-summarization/Dockerfile + extends: docsum image: ${REGISTRY:-opea}/llm-docsum:${TAG:-latest} whisper: build: @@ -89,4 +101,5 @@ services: https_proxy: ${https_proxy} context: GenAIComps dockerfile: comps/third_parties/whisper/src/Dockerfile + extends: docsum image: ${REGISTRY:-opea}/whisper:${TAG:-latest} From 998fdd42f0c53058e201282abc31425ea8bfcfc7 Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Thu, 17 Apr 2025 14:25:02 +0000 Subject: [PATCH 22/25] Fixing CI issue Signed-off-by: Gurunath S --- ProductivitySuite/docker_image_build/build.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/ProductivitySuite/docker_image_build/build.yaml b/ProductivitySuite/docker_image_build/build.yaml index 0de722a131..0401d6cfd0 100644 --- a/ProductivitySuite/docker_image_build/build.yaml +++ b/ProductivitySuite/docker_image_build/build.yaml @@ -80,8 +80,6 @@ services: docsum: build: args: - IMAGE_REPO: ${REGISTRY} - BASE_TAG: ${TAG} http_proxy: ${http_proxy} https_proxy: ${https_proxy} no_proxy: ${no_proxy} From d68b441f9fc38c0b1ac2f0f62fcca81d531555c9 Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Mon, 21 Apr 2025 07:42:25 +0000 Subject: [PATCH 23/25] Updated test_compose_on_xeon.sh file in ProductivitySuite Signed-off-by: Gurunath S --- .../docker_compose/intel/cpu/xeon/set_env.sh | 2 +- .../tests/test_compose_on_xeon.sh | 95 ++----------------- 2 files changed, 9 insertions(+), 88 deletions(-) diff --git a/ProductivitySuite/docker_compose/intel/cpu/xeon/set_env.sh b/ProductivitySuite/docker_compose/intel/cpu/xeon/set_env.sh index 21dd081caa..04d53e3639 100755 --- a/ProductivitySuite/docker_compose/intel/cpu/xeon/set_env.sh +++ b/ProductivitySuite/docker_compose/intel/cpu/xeon/set_env.sh @@ -8,7 +8,7 @@ export DB_NAME="opea" export EMBEDDING_MODEL_ID="BAAI/bge-base-en-v1.5" export RERANK_MODEL_ID="BAAI/bge-reranker-base" export LLM_MODEL_ID="Intel/neural-chat-7b-v3-3" -export LLM_MODEL_ID_CODEGEN="meta-llama/CodeLlama-7b-hf" +export LLM_MODEL_ID_CODEGEN="Intel/neural-chat-7b-v3-3" export INDEX_NAME="rag-redis" export HUGGINGFACEHUB_API_TOKEN=${HUGGINGFACEHUB_API_TOKEN} export BACKEND_SERVICE_ENDPOINT_CHATQNA="http://${host_ip}:8888/v1/chatqna" diff --git a/ProductivitySuite/tests/test_compose_on_xeon.sh b/ProductivitySuite/tests/test_compose_on_xeon.sh index 7a5ba4be4f..22c55eff8a 100755 --- a/ProductivitySuite/tests/test_compose_on_xeon.sh +++ b/ProductivitySuite/tests/test_compose_on_xeon.sh @@ -30,58 +30,31 @@ function build_docker_images() { function start_services() { cd $WORKPATH/docker_compose/intel/cpu/xeon/ + export DB_NAME="opea" export EMBEDDING_MODEL_ID="BAAI/bge-base-en-v1.5" - export RERANK_TYPE="tei" export RERANK_MODEL_ID="BAAI/bge-reranker-base" export LLM_MODEL_ID="Intel/neural-chat-7b-v3-3" export LLM_MODEL_ID_CODEGEN="Intel/neural-chat-7b-v3-3" - export DATAPREP_TYPE="redis" - export RETRIEVER_TYPE="redis" - export TEI_EMBEDDING_ENDPOINT="http://${ip_address}:6006" - export TEI_RERANKING_ENDPOINT="http://${ip_address}:8808" - export TGI_LLM_ENDPOINT="http://${ip_address}:9009" - export REDIS_URL="redis://${ip_address}:6379" - export REDIS_HOST=${ip_address} export INDEX_NAME="rag-redis" export HUGGINGFACEHUB_API_TOKEN=${HUGGINGFACEHUB_API_TOKEN} - export MEGA_SERVICE_HOST_IP=${ip_address} - export EMBEDDING_SERVICE_HOST_IP=${ip_address} - export RETRIEVER_SERVICE_HOST_IP=${ip_address} - export RERANK_SERVICE_HOST_IP=${ip_address} - export LLM_SERVICE_HOST_IP=${ip_address} - export LLM_SERVICE_HOST_IP_DOCSUM=${ip_address} - export LLM_SERVICE_HOST_IP_FAQGEN=${ip_address} - export LLM_SERVICE_HOST_IP_CODEGEN=${ip_address} - export LLM_SERVICE_HOST_IP_CHATQNA=${ip_address} - export TGI_LLM_ENDPOINT_CHATQNA="http://${ip_address}:9009" - export TGI_LLM_ENDPOINT_CODEGEN="http://${ip_address}:8028" - export TGI_LLM_ENDPOINT_FAQGEN="http://${ip_address}:9009" - export TGI_LLM_ENDPOINT_DOCSUM="http://${ip_address}:9009" export BACKEND_SERVICE_ENDPOINT_CHATQNA="http://${ip_address}:8888/v1/chatqna" - export DATAPREP_DELETE_FILE_ENDPOINT="http://${ip_address}:5000/v1/dataprep/delete" + export DATAPREP_DELETE_FILE_ENDPOINT="http://${ip_address}:6007/v1/dataprep/delete" export BACKEND_SERVICE_ENDPOINT_CODEGEN="http://${ip_address}:7778/v1/codegen" - export DATAPREP_SERVICE_ENDPOINT="http://${ip_address}:5000/v1/dataprep/ingest" - export DATAPREP_GET_FILE_ENDPOINT="http://${ip_address}:5000/v1/dataprep/get" + export BACKEND_SERVICE_ENDPOINT_DOCSUM="http://${ip_address}:8890/v1/docsum" + export DATAPREP_SERVICE_ENDPOINT="http://${ip_address}:6007/v1/dataprep/ingest" + export DATAPREP_GET_FILE_ENDPOINT="http://${ip_address}:6007/v1/dataprep/get" export CHAT_HISTORY_CREATE_ENDPOINT="http://${ip_address}:6012/v1/chathistory/create" export CHAT_HISTORY_CREATE_ENDPOINT="http://${ip_address}:6012/v1/chathistory/create" export CHAT_HISTORY_DELETE_ENDPOINT="http://${ip_address}:6012/v1/chathistory/delete" export CHAT_HISTORY_GET_ENDPOINT="http://${ip_address}:6012/v1/chathistory/get" export PROMPT_SERVICE_GET_ENDPOINT="http://${ip_address}:6018/v1/prompt/get" export PROMPT_SERVICE_CREATE_ENDPOINT="http://${ip_address}:6018/v1/prompt/create" + export PROMPT_SERVICE_DELETE_ENDPOINT="http://${ip_address}:6018/v1/prompt/delete" export KEYCLOAK_SERVICE_ENDPOINT="http://${ip_address}:8080" - export MONGO_HOST=${ip_address} - export MONGO_PORT=27017 - export DB_NAME="opea" - export COLLECTION_NAME="Conversations" - export LLM_SERVICE_HOST_PORT_FAQGEN=9002 - export LLM_SERVICE_HOST_PORT_CODEGEN=9001 - export RERANK_SERVER_PORT=8808 - export EMBEDDING_SERVER_PORT=6006 - export LLM_SERVER_PORT=9009 - export PROMPT_COLLECTION_NAME="prompt" + export DocSum_COMPONENT_NAME="OpeaDocSumTgi" export host_ip=${ip_address} - export FAQGen_COMPONENT_NAME="OpeaFaqGenTgi" export LOGFLAG=True + export no_proxy="$no_proxy,tgi_service_codegen,llm_codegen,tei-embedding-service,tei-reranking-service,chatqna-xeon-backend-server,retriever,tgi-service,redis-vector-db,whisper,llm-docsum-tgi,docsum-xeon-backend-server,mongo,codegen" # Start Docker Containers docker compose up -d > ${LOG_PATH}/start_services_with_compose.log @@ -141,34 +114,6 @@ function validate_service() { sleep 1s } -function validate_faqgen() { - local URL="$1" - local EXPECTED_RESULT="$2" - local SERVICE_NAME="$3" - local DOCKER_NAME="$4" - local INPUT_DATA="$5" - - local HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST -d "$INPUT_DATA" -H 'Content-Type: application/json' "$URL") - if [ "$HTTP_STATUS" -eq 200 ]; then - echo "[ $SERVICE_NAME ] HTTP status is 200. Checking content..." - - local CONTENT=$(curl -s -X POST -d "$INPUT_DATA" -H 'Content-Type: application/json' "$URL" | tee ${LOG_PATH}/${SERVICE_NAME}.log) - - if echo "$CONTENT" | grep -q "$EXPECTED_RESULT"; then - echo "[ $SERVICE_NAME ] Content is as expected." - else - echo "[ $SERVICE_NAME ] Content does not match the expected result: $CONTENT" - docker logs ${DOCKER_NAME} >> ${LOG_PATH}/${SERVICE_NAME}.log - exit 1 - fi - else - echo "[ $SERVICE_NAME ] HTTP status is not 200. Received status was $HTTP_STATUS" - docker logs ${DOCKER_NAME} >> ${LOG_PATH}/${SERVICE_NAME}.log - exit 1 - fi - sleep 1s -} - function validate_microservices() { # Check if the microservices are running correctly. @@ -180,14 +125,6 @@ function validate_microservices() { "tei-embedding-server" \ '{"inputs":"What is Deep Learning?"}' - # embedding microservice - validate_service \ - "${ip_address}:6000/v1/embeddings" \ - '"embedding":[' \ - "embedding-microservice" \ - "embedding-server" \ - '{"input":"What is Deep Learning?"}' - sleep 1m # retrieval can't curl as expected, try to wait for more time # test /v1/dataprep/delete @@ -236,14 +173,6 @@ function validate_microservices() { "tei-reranking-server" \ '{"query":"What is Deep Learning?", "texts": ["Deep Learning is not...", "Deep learning is..."]}' - # rerank microservice - validate_service \ - "${ip_address}:8000/v1/reranking" \ - "Deep learning is..." \ - "rerank-microservice" \ - "reranking-tei-xeon-server" \ - '{"initial_query":"What is Deep Learning?", "retrieved_docs": [{"text":"Deep Learning is not..."}, {"text":"Deep learning is..."}]}' - # tgi for llm service validate_service \ "${ip_address}:9009/generate" \ @@ -260,14 +189,6 @@ function validate_microservices() { "llm-textgen-server" \ '{"query":"What is Deep Learning?"}' - # FAQGen llm microservice - validate_faqgen \ - "${ip_address}:9002/v1/faqgen" \ - "text" \ - "llm_faqgen" \ - "llm-faqgen-server" \ - '{"messages":"Text Embeddings Inference (TEI) is a toolkit for deploying and serving open source text embeddings and sequence classification models. TEI enables high-performance extraction for the most popular models, including FlagEmbedding, Ember, GTE and E5."}' - # CodeGen llm microservice validate_service \ "${ip_address}:9001/v1/chat/completions" \ From 20abdce99b2ec3f50891981d2ea3b5c8299b7538 Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Mon, 21 Apr 2025 08:43:48 +0000 Subject: [PATCH 24/25] Updated test compose file, README and model_config file in ProductivitySuite Signed-off-by: Gurunath S --- .../docker_compose/intel/cpu/xeon/README.md | 10 +++++----- ProductivitySuite/tests/test_compose_on_xeon.sh | 9 +-------- ProductivitySuite/ui/react/public/model_configs.json | 9 +-------- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/ProductivitySuite/docker_compose/intel/cpu/xeon/README.md b/ProductivitySuite/docker_compose/intel/cpu/xeon/README.md index 7f51d7d4ca..af63141330 100644 --- a/ProductivitySuite/docker_compose/intel/cpu/xeon/README.md +++ b/ProductivitySuite/docker_compose/intel/cpu/xeon/README.md @@ -191,7 +191,7 @@ Please refer to **[keycloak_setup_guide](keycloak_setup_guide.md)** for more det ```bash export your_embedding=$(python3 -c "import random; embedding = [random.uniform(-1, 1) for _ in range(768)]; print(embedding)") - curl http://${host_ip}:7000/v1/retrieval \ + curl http://${host_ip}:7001/v1/retrieval \ -X POST \ -d "{\"text\":\"test\",\"embedding\":${your_embedding}}" \ -H 'Content-Type: application/json' @@ -323,7 +323,7 @@ Please refer to **[keycloak_setup_guide](keycloak_setup_guide.md)** for more det ```bash curl -X 'POST' \ - http://{host_ip}:6018/v1/prompt/create \ + "http://${host_ip}:6018/v1/prompt/create" \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ @@ -335,14 +335,14 @@ Please refer to **[keycloak_setup_guide](keycloak_setup_guide.md)** for more det ```bash curl -X 'POST' \ - http://{host_ip}:6018/v1/prompt/get \ + "http://${host_ip}:6018/v1/prompt/get" \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "user": "test"}' curl -X 'POST' \ - http://{host_ip}:6018/v1/prompt/get \ + "http://${host_ip}:6018/v1/prompt/get" \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ @@ -353,7 +353,7 @@ Please refer to **[keycloak_setup_guide](keycloak_setup_guide.md)** for more det ```bash curl -X 'POST' \ - http://{host_ip}:6018/v1/prompt/delete \ + "http://${host_ip}:6018/v1/prompt/delete" \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ diff --git a/ProductivitySuite/tests/test_compose_on_xeon.sh b/ProductivitySuite/tests/test_compose_on_xeon.sh index 22c55eff8a..34d9a96691 100755 --- a/ProductivitySuite/tests/test_compose_on_xeon.sh +++ b/ProductivitySuite/tests/test_compose_on_xeon.sh @@ -159,7 +159,7 @@ function validate_microservices() { # retrieval microservice test_embedding=$(python3 -c "import random; embedding = [random.uniform(-1, 1) for _ in range(768)]; print(embedding)") validate_service \ - "${ip_address}:7000/v1/retrieval" \ + "${ip_address}:7001/v1/retrieval" \ "retrieved_docs" \ "retrieval-microservice" \ "retriever-redis-server" \ @@ -181,13 +181,6 @@ function validate_microservices() { "tgi-service" \ '{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":17, "do_sample": true}}' - # ChatQnA llm microservice - validate_service \ - "${ip_address}:9000/v1/chat/completions" \ - "data: " \ - "llm-microservice" \ - "llm-textgen-server" \ - '{"query":"What is Deep Learning?"}' # CodeGen llm microservice validate_service \ diff --git a/ProductivitySuite/ui/react/public/model_configs.json b/ProductivitySuite/ui/react/public/model_configs.json index 79d19f902d..cea98dc7d3 100644 --- a/ProductivitySuite/ui/react/public/model_configs.json +++ b/ProductivitySuite/ui/react/public/model_configs.json @@ -4,13 +4,6 @@ "displayName": "Intel Neural Chat", "minToken": 100, "maxToken": 2000, - "types": ["chat", "summary"] - }, - { - "model_name": "meta-llama/CodeLlama-7b-hf", - "displayName": "Code Llama", - "minToken": 100, - "maxToken": 2000, - "types": ["code"] + "types": ["chat", "summary", "code"] } ] From 06a0c840241a62b0813d5e7d3c66fb5b1ceda114 Mon Sep 17 00:00:00 2001 From: Gurunath S Date: Mon, 21 Apr 2025 09:49:12 +0000 Subject: [PATCH 25/25] Added sample test file for ProductivitySuite UI Signed-off-by: Gurunath S --- ProductivitySuite/ui/react/package.json | 4 +++- .../ui/react/src/__tests__/util.test.ts | 14 ++++++++++++++ ProductivitySuite/ui/react/src/common/util.ts | 12 ++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 ProductivitySuite/ui/react/src/__tests__/util.test.ts create mode 100644 ProductivitySuite/ui/react/src/common/util.ts diff --git a/ProductivitySuite/ui/react/package.json b/ProductivitySuite/ui/react/package.json index 6bb7f5f4e6..7b2fc4f007 100644 --- a/ProductivitySuite/ui/react/package.json +++ b/ProductivitySuite/ui/react/package.json @@ -12,7 +12,8 @@ "dev": "vite --port 5173", "build": "vite build", "preview": "vite preview --port 5173", - "prettier:write": "prettier --write ." + "prettier:write": "prettier --write .", + "test": "vitest run" }, "eslintConfig": { "extends": [ @@ -84,6 +85,7 @@ "vite-plugin-mkcert": "^1.17.6", "vite-plugin-sass-dts": "^1.3.30", "vite-plugin-svgr": "^4.3.0", + "vitest": "^3.1.2", "wait-on": "^7.0.1", "webpack-bundle-analyzer": "^4.10.2" } diff --git a/ProductivitySuite/ui/react/src/__tests__/util.test.ts b/ProductivitySuite/ui/react/src/__tests__/util.test.ts new file mode 100644 index 0000000000..e67ba2c86a --- /dev/null +++ b/ProductivitySuite/ui/react/src/__tests__/util.test.ts @@ -0,0 +1,14 @@ +// Copyright (C) 2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +import { describe, expect, test } from "vitest"; +import { getCurrentTimeStamp, uuidv4 } from "../common/util"; + +describe("unit tests", () => { + test("check UUID is of length 36", () => { + expect(uuidv4()).toHaveLength(36); + }); + test("check TimeStamp generated is of unix", () => { + expect(getCurrentTimeStamp()).toBe(Math.floor(Date.now() / 1000)); + }); +}); diff --git a/ProductivitySuite/ui/react/src/common/util.ts b/ProductivitySuite/ui/react/src/common/util.ts new file mode 100644 index 0000000000..df65b2d8e0 --- /dev/null +++ b/ProductivitySuite/ui/react/src/common/util.ts @@ -0,0 +1,12 @@ +// Copyright (C) 2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +export const getCurrentTimeStamp = () => { + return Math.floor(Date.now() / 1000); +}; + +export const uuidv4 = () => { + return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => + (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16), + ); +};