libre-webui 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/README.md +30 -17
  2. package/backend/dist/db.d.ts.map +1 -1
  3. package/backend/dist/db.js +195 -6
  4. package/backend/dist/db.js.map +1 -1
  5. package/backend/dist/index.d.ts.map +1 -1
  6. package/backend/dist/index.js +48 -19
  7. package/backend/dist/index.js.map +1 -1
  8. package/backend/dist/middleware/auth.d.ts.map +1 -1
  9. package/backend/dist/middleware/auth.js +35 -3
  10. package/backend/dist/middleware/auth.js.map +1 -1
  11. package/backend/dist/middleware/index.d.ts.map +1 -1
  12. package/backend/dist/models/personaModel.d.ts.map +1 -1
  13. package/backend/dist/models/personaModel.js.map +1 -1
  14. package/backend/dist/models/userModel.d.ts +24 -0
  15. package/backend/dist/models/userModel.d.ts.map +1 -1
  16. package/backend/dist/models/userModel.js +92 -24
  17. package/backend/dist/models/userModel.js.map +1 -1
  18. package/backend/dist/routes/agentCli.d.ts.map +1 -1
  19. package/backend/dist/routes/agentCli.js +4 -2
  20. package/backend/dist/routes/agentCli.js.map +1 -1
  21. package/backend/dist/routes/auth.d.ts.map +1 -1
  22. package/backend/dist/routes/auth.js +118 -55
  23. package/backend/dist/routes/auth.js.map +1 -1
  24. package/backend/dist/routes/chat.d.ts.map +1 -1
  25. package/backend/dist/routes/chat.js +106 -3
  26. package/backend/dist/routes/chat.js.map +1 -1
  27. package/backend/dist/routes/documents.d.ts.map +1 -1
  28. package/backend/dist/routes/documents.js +179 -41
  29. package/backend/dist/routes/documents.js.map +1 -1
  30. package/backend/dist/routes/embeddings.d.ts.map +1 -1
  31. package/backend/dist/routes/embeddings.js +2 -2
  32. package/backend/dist/routes/embeddings.js.map +1 -1
  33. package/backend/dist/routes/huggingfaceHub.d.ts.map +1 -1
  34. package/backend/dist/routes/huggingfaceHub.js +3 -1
  35. package/backend/dist/routes/huggingfaceHub.js.map +1 -1
  36. package/backend/dist/routes/imageGen.d.ts.map +1 -1
  37. package/backend/dist/routes/imageGen.js +2 -0
  38. package/backend/dist/routes/imageGen.js.map +1 -1
  39. package/backend/dist/routes/libreClaw.d.ts.map +1 -1
  40. package/backend/dist/routes/media.d.ts +3 -0
  41. package/backend/dist/routes/media.d.ts.map +1 -0
  42. package/backend/dist/routes/media.js +429 -0
  43. package/backend/dist/routes/media.js.map +1 -0
  44. package/backend/dist/routes/notes.d.ts +3 -0
  45. package/backend/dist/routes/notes.d.ts.map +1 -0
  46. package/backend/dist/routes/notes.js +121 -0
  47. package/backend/dist/routes/notes.js.map +1 -0
  48. package/backend/dist/routes/ollama.d.ts.map +1 -1
  49. package/backend/dist/routes/ollama.js +17 -85
  50. package/backend/dist/routes/ollama.js.map +1 -1
  51. package/backend/dist/routes/personas.d.ts.map +1 -1
  52. package/backend/dist/routes/personas.js +2 -0
  53. package/backend/dist/routes/personas.js.map +1 -1
  54. package/backend/dist/routes/plugins.d.ts.map +1 -1
  55. package/backend/dist/routes/plugins.js +28 -0
  56. package/backend/dist/routes/plugins.js.map +1 -1
  57. package/backend/dist/routes/preferences.d.ts.map +1 -1
  58. package/backend/dist/routes/systemDiagnostics.d.ts +3 -0
  59. package/backend/dist/routes/systemDiagnostics.d.ts.map +1 -0
  60. package/backend/dist/routes/systemDiagnostics.js +49 -0
  61. package/backend/dist/routes/systemDiagnostics.js.map +1 -0
  62. package/backend/dist/routes/tts.d.ts.map +1 -1
  63. package/backend/dist/routes/tts.js +4 -0
  64. package/backend/dist/routes/tts.js.map +1 -1
  65. package/backend/dist/routes/users.d.ts.map +1 -1
  66. package/backend/dist/routes/users.js +79 -0
  67. package/backend/dist/routes/users.js.map +1 -1
  68. package/backend/dist/routes/work.d.ts.map +1 -1
  69. package/backend/dist/routes/work.js +84 -0
  70. package/backend/dist/routes/work.js.map +1 -1
  71. package/backend/dist/services/agentCliService.d.ts +37 -4
  72. package/backend/dist/services/agentCliService.d.ts.map +1 -1
  73. package/backend/dist/services/agentCliService.js +229 -10
  74. package/backend/dist/services/agentCliService.js.map +1 -1
  75. package/backend/dist/services/assistantCompletionService.d.ts.map +1 -1
  76. package/backend/dist/services/authService.d.ts +15 -9
  77. package/backend/dist/services/authService.d.ts.map +1 -1
  78. package/backend/dist/services/authService.js +39 -29
  79. package/backend/dist/services/authService.js.map +1 -1
  80. package/backend/dist/services/chatGenerationService.d.ts.map +1 -1
  81. package/backend/dist/services/chatGenerationService.js +3 -3
  82. package/backend/dist/services/chatGenerationService.js.map +1 -1
  83. package/backend/dist/services/chatRequestService.d.ts +8 -2
  84. package/backend/dist/services/chatRequestService.d.ts.map +1 -1
  85. package/backend/dist/services/chatRequestService.js +30 -3
  86. package/backend/dist/services/chatRequestService.js.map +1 -1
  87. package/backend/dist/services/chatService.d.ts +6 -1
  88. package/backend/dist/services/chatService.d.ts.map +1 -1
  89. package/backend/dist/services/chatService.js +54 -1
  90. package/backend/dist/services/chatService.js.map +1 -1
  91. package/backend/dist/services/codexOAuthService.d.ts +22 -0
  92. package/backend/dist/services/codexOAuthService.d.ts.map +1 -0
  93. package/backend/dist/services/codexOAuthService.js +176 -0
  94. package/backend/dist/services/codexOAuthService.js.map +1 -0
  95. package/backend/dist/services/documentService.d.ts +17 -10
  96. package/backend/dist/services/documentService.d.ts.map +1 -1
  97. package/backend/dist/services/documentService.js +79 -58
  98. package/backend/dist/services/documentService.js.map +1 -1
  99. package/backend/dist/services/embeddingService.d.ts.map +1 -1
  100. package/backend/dist/services/encryptionService.d.ts.map +1 -1
  101. package/backend/dist/services/encryptionService.js +18 -8
  102. package/backend/dist/services/encryptionService.js.map +1 -1
  103. package/backend/dist/services/followUpService.d.ts +44 -0
  104. package/backend/dist/services/followUpService.d.ts.map +1 -0
  105. package/backend/dist/services/followUpService.js +123 -0
  106. package/backend/dist/services/followUpService.js.map +1 -0
  107. package/backend/dist/services/galleryService.d.ts +23 -1
  108. package/backend/dist/services/galleryService.d.ts.map +1 -1
  109. package/backend/dist/services/galleryService.js +125 -8
  110. package/backend/dist/services/galleryService.js.map +1 -1
  111. package/backend/dist/services/libreClawService.d.ts.map +1 -1
  112. package/backend/dist/services/mediaGenerationJobService.d.ts +25 -0
  113. package/backend/dist/services/mediaGenerationJobService.d.ts.map +1 -0
  114. package/backend/dist/services/mediaGenerationJobService.js +82 -0
  115. package/backend/dist/services/mediaGenerationJobService.js.map +1 -0
  116. package/backend/dist/services/memoryService.d.ts.map +1 -1
  117. package/backend/dist/services/memoryService.js.map +1 -1
  118. package/backend/dist/services/mutationEngineService.d.ts.map +1 -1
  119. package/backend/dist/services/oauthSecurity.d.ts +14 -0
  120. package/backend/dist/services/oauthSecurity.d.ts.map +1 -0
  121. package/backend/dist/services/oauthSecurity.js +101 -0
  122. package/backend/dist/services/oauthSecurity.js.map +1 -0
  123. package/backend/dist/services/ollamaService.d.ts +8 -2
  124. package/backend/dist/services/ollamaService.d.ts.map +1 -1
  125. package/backend/dist/services/ollamaService.js +40 -2
  126. package/backend/dist/services/ollamaService.js.map +1 -1
  127. package/backend/dist/services/personaService.d.ts.map +1 -1
  128. package/backend/dist/services/personaService.js.map +1 -1
  129. package/backend/dist/services/pluginActivationService.d.ts.map +1 -1
  130. package/backend/dist/services/pluginActivationService.js.map +1 -1
  131. package/backend/dist/services/pluginAudioGenerationService.d.ts +34 -0
  132. package/backend/dist/services/pluginAudioGenerationService.d.ts.map +1 -0
  133. package/backend/dist/services/pluginAudioGenerationService.js +211 -0
  134. package/backend/dist/services/pluginAudioGenerationService.js.map +1 -0
  135. package/backend/dist/services/pluginCapabilityRegistryService.d.ts.map +1 -1
  136. package/backend/dist/services/pluginCapabilityRegistryService.js +6 -0
  137. package/backend/dist/services/pluginCapabilityRegistryService.js.map +1 -1
  138. package/backend/dist/services/pluginCredentialsService.d.ts.map +1 -1
  139. package/backend/dist/services/pluginEmbeddingService.d.ts +2 -0
  140. package/backend/dist/services/pluginEmbeddingService.d.ts.map +1 -1
  141. package/backend/dist/services/pluginEmbeddingService.js +66 -35
  142. package/backend/dist/services/pluginEmbeddingService.js.map +1 -1
  143. package/backend/dist/services/pluginImageGenerationService.d.ts +2 -0
  144. package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
  145. package/backend/dist/services/pluginImageGenerationService.js +63 -38
  146. package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
  147. package/backend/dist/services/pluginService.d.ts +43 -1
  148. package/backend/dist/services/pluginService.d.ts.map +1 -1
  149. package/backend/dist/services/pluginService.js +441 -71
  150. package/backend/dist/services/pluginService.js.map +1 -1
  151. package/backend/dist/services/pluginTTSService.d.ts +2 -0
  152. package/backend/dist/services/pluginTTSService.d.ts.map +1 -1
  153. package/backend/dist/services/pluginTTSService.js +27 -2
  154. package/backend/dist/services/pluginTTSService.js.map +1 -1
  155. package/backend/dist/services/pluginUsageService.d.ts +100 -0
  156. package/backend/dist/services/pluginUsageService.d.ts.map +1 -0
  157. package/backend/dist/services/pluginUsageService.js +291 -0
  158. package/backend/dist/services/pluginUsageService.js.map +1 -0
  159. package/backend/dist/services/pluginVariablesService.d.ts.map +1 -1
  160. package/backend/dist/services/pluginVariablesService.js.map +1 -1
  161. package/backend/dist/services/pluginVideoGenerationService.d.ts +45 -0
  162. package/backend/dist/services/pluginVideoGenerationService.d.ts.map +1 -0
  163. package/backend/dist/services/pluginVideoGenerationService.js +198 -0
  164. package/backend/dist/services/pluginVideoGenerationService.js.map +1 -0
  165. package/backend/dist/services/preferencesService.d.ts.map +1 -1
  166. package/backend/dist/services/preferencesService.js +16 -1
  167. package/backend/dist/services/preferencesService.js.map +1 -1
  168. package/backend/dist/services/registrationPolicy.d.ts +5 -0
  169. package/backend/dist/services/registrationPolicy.d.ts.map +1 -0
  170. package/backend/dist/services/registrationPolicy.js +21 -0
  171. package/backend/dist/services/registrationPolicy.js.map +1 -0
  172. package/backend/dist/services/simpleGitHubOAuth.d.ts +1 -1
  173. package/backend/dist/services/simpleGitHubOAuth.d.ts.map +1 -1
  174. package/backend/dist/services/simpleGitHubOAuth.js +13 -13
  175. package/backend/dist/services/simpleGitHubOAuth.js.map +1 -1
  176. package/backend/dist/services/simpleHuggingFaceOAuth.d.ts +1 -1
  177. package/backend/dist/services/simpleHuggingFaceOAuth.d.ts.map +1 -1
  178. package/backend/dist/services/simpleHuggingFaceOAuth.js +12 -17
  179. package/backend/dist/services/simpleHuggingFaceOAuth.js.map +1 -1
  180. package/backend/dist/services/systemDiagnosticsService.d.ts +117 -0
  181. package/backend/dist/services/systemDiagnosticsService.d.ts.map +1 -0
  182. package/backend/dist/services/systemDiagnosticsService.js +326 -0
  183. package/backend/dist/services/systemDiagnosticsService.js.map +1 -0
  184. package/backend/dist/services/titleGenerationService.d.ts.map +1 -1
  185. package/backend/dist/services/turnstileService.d.ts +2 -1
  186. package/backend/dist/services/turnstileService.d.ts.map +1 -1
  187. package/backend/dist/services/turnstileService.js +28 -2
  188. package/backend/dist/services/turnstileService.js.map +1 -1
  189. package/backend/dist/services/userService.d.ts +1 -0
  190. package/backend/dist/services/userService.js +1 -1
  191. package/backend/dist/services/workAgentService.d.ts.map +1 -1
  192. package/backend/dist/services/workAgentService.js.map +1 -1
  193. package/backend/dist/services/workEventService.d.ts.map +1 -1
  194. package/backend/dist/services/workEventService.js.map +1 -1
  195. package/backend/dist/services/workHostWorkspaceService.d.ts.map +1 -1
  196. package/backend/dist/services/workModelProviderService.d.ts +3 -0
  197. package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
  198. package/backend/dist/services/workModelProviderService.js +67 -10
  199. package/backend/dist/services/workModelProviderService.js.map +1 -1
  200. package/backend/dist/services/workPreviewProxyService.d.ts +27 -0
  201. package/backend/dist/services/workPreviewProxyService.d.ts.map +1 -0
  202. package/backend/dist/services/workPreviewProxyService.js +514 -0
  203. package/backend/dist/services/workPreviewProxyService.js.map +1 -0
  204. package/backend/dist/services/workRuntimeService.d.ts +28 -7
  205. package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
  206. package/backend/dist/services/workRuntimeService.js +287 -8
  207. package/backend/dist/services/workRuntimeService.js.map +1 -1
  208. package/backend/dist/services/workTaskService.d.ts.map +1 -1
  209. package/backend/dist/services/workTaskService.js.map +1 -1
  210. package/backend/dist/services/workTerminalService.d.ts +1 -1
  211. package/backend/dist/services/workTerminalService.d.ts.map +1 -1
  212. package/backend/dist/services/workTerminalService.js.map +1 -1
  213. package/backend/dist/storage.d.ts +12 -1
  214. package/backend/dist/storage.d.ts.map +1 -1
  215. package/backend/dist/storage.js +183 -9
  216. package/backend/dist/storage.js.map +1 -1
  217. package/backend/dist/storageMappers.d.ts +13 -0
  218. package/backend/dist/storageMappers.d.ts.map +1 -1
  219. package/backend/dist/storageMappers.js +5 -0
  220. package/backend/dist/storageMappers.js.map +1 -1
  221. package/backend/dist/types/index.d.ts +106 -1
  222. package/backend/dist/types/index.d.ts.map +1 -1
  223. package/backend/dist/types/index.js.map +1 -1
  224. package/backend/dist/types/work.d.ts +31 -0
  225. package/backend/dist/types/work.d.ts.map +1 -1
  226. package/backend/dist/utils/chatContext.js.map +1 -1
  227. package/backend/dist/utils/chatDocumentContext.d.ts +1 -1
  228. package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
  229. package/backend/dist/utils/chatDocumentContext.js +9 -4
  230. package/backend/dist/utils/chatDocumentContext.js.map +1 -1
  231. package/backend/dist/utils/chatProviderSelection.d.ts.map +1 -1
  232. package/backend/dist/utils/generationUtils.d.ts.map +1 -1
  233. package/backend/dist/utils/hash.d.ts.map +1 -1
  234. package/backend/dist/utils/hash.js +13 -2
  235. package/backend/dist/utils/hash.js.map +1 -1
  236. package/backend/dist/utils/logger.d.ts +1 -1
  237. package/backend/dist/utils/logger.d.ts.map +1 -1
  238. package/backend/dist/utils/ollamaStreaming.d.ts +6 -2
  239. package/backend/dist/utils/ollamaStreaming.d.ts.map +1 -1
  240. package/backend/dist/utils/ollamaStreaming.js +12 -2
  241. package/backend/dist/utils/ollamaStreaming.js.map +1 -1
  242. package/backend/dist/utils/openAIResponsesAdapter.js.map +1 -1
  243. package/backend/dist/utils/packagePaths.js.map +1 -1
  244. package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -1
  245. package/backend/dist/utils/pluginChatAdapter.js +11 -4
  246. package/backend/dist/utils/pluginChatAdapter.js.map +1 -1
  247. package/backend/dist/utils/pluginChatContext.js.map +1 -1
  248. package/backend/dist/utils/pluginDefinitionTrust.d.ts.map +1 -1
  249. package/backend/dist/utils/pluginDefinitionTrust.js +2 -1
  250. package/backend/dist/utils/pluginDefinitionTrust.js.map +1 -1
  251. package/backend/dist/utils/pluginStreamAdapter.d.ts +10 -1
  252. package/backend/dist/utils/pluginStreamAdapter.d.ts.map +1 -1
  253. package/backend/dist/utils/pluginStreamAdapter.js +30 -23
  254. package/backend/dist/utils/pluginStreamAdapter.js.map +1 -1
  255. package/backend/dist/utils/pluginValidation.d.ts +4 -3
  256. package/backend/dist/utils/pluginValidation.d.ts.map +1 -1
  257. package/backend/dist/utils/pluginValidation.js +47 -2
  258. package/backend/dist/utils/pluginValidation.js.map +1 -1
  259. package/backend/dist/utils/resourceLimits.d.ts +10 -0
  260. package/backend/dist/utils/resourceLimits.d.ts.map +1 -0
  261. package/backend/dist/utils/resourceLimits.js +29 -0
  262. package/backend/dist/utils/resourceLimits.js.map +1 -0
  263. package/backend/dist/utils/thinkingPhaseTimer.d.ts +21 -0
  264. package/backend/dist/utils/thinkingPhaseTimer.d.ts.map +1 -0
  265. package/backend/dist/utils/thinkingPhaseTimer.js +84 -0
  266. package/backend/dist/utils/thinkingPhaseTimer.js.map +1 -0
  267. package/backend/dist/utils/webpageFetcher.d.ts +25 -0
  268. package/backend/dist/utils/webpageFetcher.d.ts.map +1 -0
  269. package/backend/dist/utils/webpageFetcher.js +231 -0
  270. package/backend/dist/utils/webpageFetcher.js.map +1 -0
  271. package/backend/dist/utils/websocketMessages.js.map +1 -1
  272. package/backend/dist/utils/workGit.d.ts +14 -0
  273. package/backend/dist/utils/workGit.d.ts.map +1 -0
  274. package/backend/dist/utils/workGit.js +207 -0
  275. package/backend/dist/utils/workGit.js.map +1 -0
  276. package/backend/dist/websocketServer.d.ts +1 -0
  277. package/backend/dist/websocketServer.d.ts.map +1 -1
  278. package/backend/dist/websocketServer.js +110 -25
  279. package/backend/dist/websocketServer.js.map +1 -1
  280. package/backend/dist/workTerminalServer.d.ts.map +1 -1
  281. package/backend/dist/workTerminalServer.js +3 -1
  282. package/backend/dist/workTerminalServer.js.map +1 -1
  283. package/backend/package.json +8 -7
  284. package/bin/cli.js +2 -2
  285. package/frontend/dist/assets/index-CFhy8YLA.css +1 -0
  286. package/frontend/dist/assets/index-_lG_lwU-.js +164 -0
  287. package/frontend/dist/assets/markdown-math-ClQbWekD.css +1 -0
  288. package/frontend/dist/assets/xterm-DHcfr8qj.css +1 -0
  289. package/frontend/dist/index.html +41 -16
  290. package/frontend/dist/js/ArtifactContainer-CjpvtR8G.js +1 -0
  291. package/frontend/dist/js/{ArtifactDemoPage-B4qsvUnF.js → ArtifactDemoPage-yrPXLBQo.js} +1 -1
  292. package/frontend/dist/js/ArtifactSlideOutPanel-DdsL2AOQ.js +1 -0
  293. package/frontend/dist/js/{Button-CRwzOaDZ.js → Button-X9TT9gTD.js} +1 -1
  294. package/frontend/dist/js/ChatPage-D9lWGM8g.js +16 -0
  295. package/frontend/dist/js/FirstTimeSetup-CwLPbHkI.js +1 -0
  296. package/frontend/dist/js/GalleryPage-C9DTdo_-.js +1 -0
  297. package/frontend/dist/js/HomePage-iF44c34e.js +1 -0
  298. package/frontend/dist/js/LibreClawPage-B9wWZIz6.js +1 -0
  299. package/frontend/dist/js/{ModelManagerModals-DMoEav1l.js → ModelManagerModals-D9j9RECi.js} +1 -1
  300. package/frontend/dist/js/ModelSelector-B0RKEJwC.js +1 -0
  301. package/frontend/dist/js/ModelsPage-DJXoIOs8.js +2 -0
  302. package/frontend/dist/js/NotesPage-BTNH6JR2.js +1 -0
  303. package/frontend/dist/js/{OptimizedSyntaxHighlighter-Ci9sRc78.js → OptimizedSyntaxHighlighter-CWYUn9Oe.js} +1 -1
  304. package/frontend/dist/js/PersonasPage--nqoJ-wA.js +13 -0
  305. package/frontend/dist/js/PluginUsagePage-BHwm-BBr.js +1 -0
  306. package/frontend/dist/js/{RichMessageContent-BJ49VN9j.js → RichMessageContent-DYRrXJ75.js} +3 -3
  307. package/frontend/dist/js/SettingsModal-y1Nzg55O.js +1 -0
  308. package/frontend/dist/js/SystemPage-CHez8h3p.js +1 -0
  309. package/frontend/dist/js/UserManagementPage-aJhKXQxG.js +1 -0
  310. package/frontend/dist/js/WorkPage-Ccla0MDm.js +5 -0
  311. package/frontend/dist/js/addon-fit-DIOBYJe3.js +1 -0
  312. package/frontend/dist/js/api-DVP8xiYT.js +19 -0
  313. package/frontend/dist/js/appStore-Cw7PmG-J.js +2 -0
  314. package/frontend/dist/js/ar-ONXFvOB1.js +2 -0
  315. package/frontend/dist/js/artifactHtml-C0Hu9I1u.js +41 -0
  316. package/frontend/dist/js/authStore-gv_MgDKr.js +3 -0
  317. package/frontend/dist/js/babel-CmENXdZw.js +16 -0
  318. package/frontend/dist/js/bn-BLhREPm6.js +2 -0
  319. package/frontend/dist/js/chatStore-DmDbolTg.js +2 -0
  320. package/frontend/dist/js/cs-Bg8E9fG5.js +2 -0
  321. package/frontend/dist/js/da-ODCU8w4x.js +2 -0
  322. package/frontend/dist/js/de-nuGHRJ5N.js +2 -0
  323. package/frontend/dist/js/es-DcN_cwum.js +2 -0
  324. package/frontend/dist/js/estree-DJwQLE88.js +44 -0
  325. package/frontend/dist/js/fr-C-L_xGr5.js +2 -0
  326. package/frontend/dist/js/hi-DUEtwA9G.js +2 -0
  327. package/frontend/dist/js/html-DdAOfeK4.js +25 -0
  328. package/frontend/dist/js/i18n-xir4Zz7C.js +2 -0
  329. package/frontend/dist/js/i18next-DgmgtwsV.js +1 -0
  330. package/frontend/dist/js/id-DNTYhti_.js +2 -0
  331. package/frontend/dist/js/imageGenModels-Dx_QMLJQ.js +1 -0
  332. package/frontend/dist/js/is-Bx28ymbQ.js +2 -0
  333. package/frontend/dist/js/it-BjW-JLlS.js +2 -0
  334. package/frontend/dist/js/ja-uThj4Q1w.js +2 -0
  335. package/frontend/dist/js/ko-DqgmMYXK.js +2 -0
  336. package/frontend/dist/js/logger-DSXjF4ye.js +1 -0
  337. package/frontend/dist/js/markdown-RaVsONor.js +70 -0
  338. package/frontend/dist/js/markdown-core-DHnR5Hw8.js +16 -0
  339. package/frontend/dist/js/markdown-math-B7FlYsmr.js +261 -0
  340. package/frontend/dist/js/messageCodeStyles-cTX0rQGK.js +2 -0
  341. package/frontend/dist/js/ms-R9kt_P0T.js +2 -0
  342. package/frontend/dist/js/nl-BjmtEgpK.js +2 -0
  343. package/frontend/dist/js/pl-C8_gU9r1.js +2 -0
  344. package/frontend/dist/js/postcss-B5WIGhAY.js +62 -0
  345. package/frontend/dist/js/pt-7BJForUD.js +2 -0
  346. package/frontend/dist/js/react-vendor-DPNXrO-8.js +9 -0
  347. package/frontend/dist/js/{rolldown-runtime-QTnfLwEv.js → rolldown-runtime-hePW80VL.js} +1 -1
  348. package/frontend/dist/js/router-vendor-Ca9zqOqT.js +1 -0
  349. package/frontend/dist/js/ru-D2HmhY6Y.js +2 -0
  350. package/frontend/dist/js/{standalone-DmLfI4Qj.js → standalone-B_aPlu7o.js} +8 -8
  351. package/frontend/dist/js/sv-zny3sDBM.js +2 -0
  352. package/frontend/dist/js/syntax-highlight-Ca9bHsaz.js +8 -0
  353. package/frontend/dist/js/th-CAzEKRz8.js +2 -0
  354. package/frontend/dist/js/tr-BmYgtmUo.js +2 -0
  355. package/frontend/dist/js/{typescript-Bcq62agC.js → typescript-Dz4OUZSl.js} +10 -10
  356. package/frontend/dist/js/ui-DDlcz2oy.js +2 -0
  357. package/frontend/dist/js/ui-vendor-D_pYT79f.js +177 -0
  358. package/frontend/dist/js/uk-eiYZ0uRq.js +2 -0
  359. package/frontend/dist/js/useTranslation-CdeLZqSW.js +1 -0
  360. package/frontend/dist/js/utils-BhpNrGnR.js +1 -0
  361. package/frontend/dist/js/utils-vendor-1zob7nK9.js +9 -0
  362. package/frontend/dist/js/vi-C7SVAWpO.js +2 -0
  363. package/frontend/dist/js/welcomePrompts-to5mv_gx.js +1 -0
  364. package/frontend/dist/js/xterm-Da5ppSVt.js +18 -0
  365. package/frontend/dist/js/{yaml-mLy9chOK.js → yaml-QD4znPfZ.js} +20 -20
  366. package/frontend/dist/js/zh-2Q3cQv3s.js +2 -0
  367. package/package.json +20 -13
  368. package/plugins/codex-oauth.json +19 -0
  369. package/plugins/openrouter.json +89 -0
  370. package/backend/dist/services/systemSettingsService.d.ts +0 -12
  371. package/backend/dist/services/systemSettingsService.d.ts.map +0 -1
  372. package/backend/dist/services/systemSettingsService.js +0 -70
  373. package/backend/dist/services/systemSettingsService.js.map +0 -1
  374. package/frontend/dist/assets/index-BqI0kezz.css +0 -1
  375. package/frontend/dist/assets/index-CRC6g6bL.js +0 -3
  376. package/frontend/dist/assets/markdown-math-CYlHEDRF.css +0 -1
  377. package/frontend/dist/assets/xterm-CmMoOwwu.css +0 -1
  378. package/frontend/dist/js/ArtifactContainer-Cdy-973y.js +0 -1
  379. package/frontend/dist/js/ArtifactSlideOutPanel-CmKgQ4eD.js +0 -1
  380. package/frontend/dist/js/ChatPage-CYT69oBR.js +0 -16
  381. package/frontend/dist/js/FirstTimeSetup-C8LdLP5J.js +0 -1
  382. package/frontend/dist/js/GalleryPage-Bm89pnS8.js +0 -1
  383. package/frontend/dist/js/HomePage-CeCYnMUG.js +0 -1
  384. package/frontend/dist/js/LibreClawPage-DGMEV6dm.js +0 -1
  385. package/frontend/dist/js/ModelSelector-DXPdGdQ_.js +0 -1
  386. package/frontend/dist/js/ModelsPage-D-FIy2x-.js +0 -2
  387. package/frontend/dist/js/PersonasPage-CIrEVFo5.js +0 -13
  388. package/frontend/dist/js/SettingsModal-CxtOXPY7.js +0 -1
  389. package/frontend/dist/js/UserManagementPage-BfyYGGFQ.js +0 -1
  390. package/frontend/dist/js/WorkPage-C7bW6Hxx.js +0 -4
  391. package/frontend/dist/js/addon-fit-Cj0_dfHF.js +0 -1
  392. package/frontend/dist/js/api-DCD41-l9.js +0 -19
  393. package/frontend/dist/js/appStore-Bw-8Exsx.js +0 -2
  394. package/frontend/dist/js/ar-BAHlIvy0.js +0 -2
  395. package/frontend/dist/js/artifactHtml-B7Oy2e__.js +0 -27
  396. package/frontend/dist/js/authStore-mOYH_AXI.js +0 -4
  397. package/frontend/dist/js/babel-BnLuavNv.js +0 -16
  398. package/frontend/dist/js/bn-BxquDVbd.js +0 -2
  399. package/frontend/dist/js/cs-C4DoKzRm.js +0 -2
  400. package/frontend/dist/js/da-CFslpGTw.js +0 -2
  401. package/frontend/dist/js/de-ChudoRh2.js +0 -2
  402. package/frontend/dist/js/demoMode-BhEpMVh5.js +0 -1
  403. package/frontend/dist/js/es-B36fefE-.js +0 -2
  404. package/frontend/dist/js/estree-0vwU39qX.js +0 -44
  405. package/frontend/dist/js/fr-BSVeTM5W.js +0 -2
  406. package/frontend/dist/js/hi-BGoFbl5V.js +0 -2
  407. package/frontend/dist/js/html-CApr2Bvi.js +0 -25
  408. package/frontend/dist/js/id-BfYs2p_j.js +0 -2
  409. package/frontend/dist/js/is-DZ1MS-5A.js +0 -2
  410. package/frontend/dist/js/it-CXtrPCG1.js +0 -2
  411. package/frontend/dist/js/ja-FPJ_NK_y.js +0 -2
  412. package/frontend/dist/js/ko-DVwD4ZZF.js +0 -2
  413. package/frontend/dist/js/logger-DbNs3-DK.js +0 -1
  414. package/frontend/dist/js/markdown-C78Qc6xu.js +0 -70
  415. package/frontend/dist/js/markdown-core-GI9BPwrB.js +0 -16
  416. package/frontend/dist/js/markdown-math-E4O1gcxj.js +0 -261
  417. package/frontend/dist/js/ms-PKPP0RX3.js +0 -2
  418. package/frontend/dist/js/nl-DWM5HJZ8.js +0 -2
  419. package/frontend/dist/js/pl-B9va8Tuf.js +0 -2
  420. package/frontend/dist/js/postcss-DSDkwgFE.js +0 -62
  421. package/frontend/dist/js/pt-P0IQi-Zr.js +0 -2
  422. package/frontend/dist/js/react-vendor-DyG_ODzn.js +0 -9
  423. package/frontend/dist/js/router-vendor-BjDI9mRe.js +0 -1
  424. package/frontend/dist/js/ru-Ca2bxYnc.js +0 -2
  425. package/frontend/dist/js/sv-DI4RDwyZ.js +0 -2
  426. package/frontend/dist/js/syntax-highlight-pM1xnNpY.js +0 -8
  427. package/frontend/dist/js/th-DN0bDS9d.js +0 -2
  428. package/frontend/dist/js/tr-ChqMv5Q4.js +0 -2
  429. package/frontend/dist/js/ui-vendor-DohPFHDW.js +0 -177
  430. package/frontend/dist/js/uk-Cr51h_XQ.js +0 -2
  431. package/frontend/dist/js/useBaseQuery-BAOlhjar.js +0 -1
  432. package/frontend/dist/js/useQuery-CcRqxveh.js +0 -1
  433. package/frontend/dist/js/useTranslation-Cs6iTP4m.js +0 -1
  434. package/frontend/dist/js/utils-DmZD5uA3.js +0 -1
  435. package/frontend/dist/js/utils-vendor-Cbaj0BC5.js +0 -9
  436. package/frontend/dist/js/vi-D4OhoVMH.js +0 -2
  437. package/frontend/dist/js/xterm-DKl1QLiw.js +0 -7
  438. package/frontend/dist/js/zh-Bvau7hlR.js +0 -2
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{f as t}from"./markdown-core-GI9BPwrB.js";var n=e(t(),1);function r(e,t){if(t.has(e))throw TypeError(`Cannot initialize the same private elements twice on an object`)}function i(e,t,n){r(e,t),t.set(e,n)}function a(e,t,n){if(typeof e==`function`?e===t:e.has(t))return arguments.length<3?t:n;throw TypeError(`Private element is not present on this object`)}function o(e,t){return e.get(a(e,t))}function s(e,t,n){return e.set(a(e,t),n),n}var c=/^(?:[a-z][a-z0-9+.-]*:|[\\/]{2})/i,l=/^[\\/]{2}/;function u(e,t){return t+e.replace(/\\/g,`/`)}var d=`popstate`;function f(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function p(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return y(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:b(t)}return S(t,n,null,e)}function m(e={}){function t(e,t){let{pathname:n=`/`,search:r=``,hash:i=``}=x(e.location.hash.substring(1));return!n.startsWith(`/`)&&!n.startsWith(`.`)&&(n=`/`+n),y(``,{pathname:n,search:r,hash:i},t.state&&t.state.usr||null,t.state&&t.state.key||`default`)}function n(e,t){let n=e.document.querySelector(`base`),r=``;if(n&&n.getAttribute(`href`)){let t=e.location.href,n=t.indexOf(`#`);r=n===-1?t:t.slice(0,n)}return r+`#`+(typeof t==`string`?t:b(t))}function r(e,t){g(e.pathname.charAt(0)===`/`,`relative pathnames are not supported in hash history.push(${JSON.stringify(t)})`)}return S(t,n,r,e)}function h(e,t){if(e===!1||e==null)throw Error(t)}function g(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function _(){return Math.random().toString(36).substring(2,10)}function v(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function y(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?x(t):t,state:n,key:t&&t.key||r||_(),mask:i}}function b({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function x(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function S(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function p(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:_.location,delta:t})}function m(e,t){s=`PUSH`;let r=f(e)?e:y(_.location,e,t);n&&n(r,e),l=u()+1;let d=v(r,l),p=_.createHref(r.mask||r);try{o.pushState(d,``,p)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(p)}a&&c&&c({action:s,location:_.location,delta:1})}function h(e,t){s=`REPLACE`;let r=f(e)?e:y(_.location,e,t);n&&n(r,e),l=u();let i=v(r,l),d=_.createHref(r.mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:_.location,delta:0})}function g(e){return C(i,e)}let _={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(d,p),c=e,()=>{i.removeEventListener(d,p),c=null}},createHref(e){return t(i,e)},createURL:g,encodeLocation(e){let t=g(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:m,replace:h,go(e){return o.go(e)}};return _}function C(e,t,n=!1){let r=`http://localhost`;e&&(r=e.location.origin===`null`?e.location.href:e.location.origin),h(r,`No window.location.(origin|href) available to create URL`);let i=typeof t==`string`?t:b(t);return i=i.replace(/ $/,`%20`),!n&&l.test(i)&&(i=r+i),new URL(i,r)}function w(e){"@babel/helpers - typeof";return w=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},w(e)}function T(e,t){if(w(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(w(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function E(e){var t=T(e,`string`);return w(t)==`symbol`?t:t+``}function D(e,t,n){return(t=E(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var O,k=(O=new WeakMap,class{constructor(e){if(i(this,O,new Map),e)for(let[t,n]of e)this.set(t,n)}get(e){if(o(O,this).has(e))return o(O,this).get(e);if(e.defaultValue!==void 0)return e.defaultValue;throw Error(`No value found for context`)}set(e,t){o(O,this).set(e,t)}}),A=new Set([`lazy`,`caseSensitive`,`path`,`id`,`index`,`children`]);function j(e){return A.has(e)}var M=new Set([`lazy`,`caseSensitive`,`path`,`id`,`index`,`middleware`,`children`]);function ee(e){return M.has(e)}function N(e){return e.index===!0}function P(e){let t={};return e.Component&&Object.assign(t,{element:n.createElement(e.Component),Component:void 0}),e.HydrateFallback&&Object.assign(t,{hydrateFallbackElement:n.createElement(e.HydrateFallback),HydrateFallback:void 0}),e.ErrorBoundary&&Object.assign(t,{errorElement:n.createElement(e.ErrorBoundary),ErrorBoundary:void 0}),t}function te(e,t=P,n=[],r={},i=!1){return e.map((e,a)=>{let o=[...n,String(a)],s=typeof e.id==`string`?e.id:o.join(`-`);if(h(e.index!==!0||!e.children,`Cannot specify children on an index route`),h(i||!r[s],`Found a route id collision on id "${s}". Route id's must be globally unique within Data Router usages`),N(e)){let n={...e,id:s};return r[s]=ne(n,t(n)),n}else{let n={...e,id:s,children:void 0};return r[s]=ne(n,t(n)),e.children&&(n.children=te(e.children,t,o,r,i)),n}})}function ne(e,t){return Object.assign(e,{...t,...typeof t.lazy==`object`&&t.lazy!=null?{lazy:{...e.lazy,...t.lazy}}:{}})}function re(e,t,n=`/`){return ie(e,t,n,!1)}function ie(e,t,n,r,i){let a=V((typeof t==`string`?x(t):t).pathname||`/`,n);if(a==null)return null;let o=i??F(e),s=null,c=ye(a);for(let e=0;s==null&&e<o.length;++e)s=ge(o[e],c,r);return s}function ae(e,t){let{route:n,pathname:r,params:i}=e;return{id:n.id,pathname:r,params:i,loaderData:t[n.id],handle:n.handle}}function F(e){let t=oe(e);return I(t),t}function oe(e,t=[],n=[],r=``,i=!1){let a=(e,a,o=i,s)=>{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;h(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=H([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(h(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),oe(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:me(l,e.index),routesMeta:u.map((e,t)=>{let[n,r]=ve(e.relativePath,e.caseSensitive,t===u.length-1);return{...e,matcher:n,compiledParams:r}})})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of se(e.path))a(e,t,!0,n)}),t}function se(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=se(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function I(e){e.sort((e,t)=>e.score===t.score?he(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var ce=/^:[\w-]+$/,le=/^:[\w-]+/,ue=3.5,de=3,fe=2,L=1,R=10,z=-2,pe=e=>e===`*`;function me(e,t){let n=e.split(`/`),r=n.length;return n.some(pe)&&(r+=z),t&&(r+=fe),n.filter(e=>!pe(e)).reduce((e,t)=>e+(ce.test(t)?de:le.test(t)?ue:t===``?L:R),r)}function he(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function ge(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e<r.length;++e){let s=r[e],c=e===r.length-1,l=a===`/`?t:t.slice(a.length)||`/`,u={path:s.relativePath,caseSensitive:s.caseSensitive,end:c},d=s.matcher&&s.compiledParams?B(u,l,s.matcher,s.compiledParams):_e(u,l),f=s.route;if(!d&&c&&n&&!r[r.length-1].route.index&&(d=_e({path:s.relativePath,caseSensitive:s.caseSensitive,end:!1},l)),!d)return null;Object.assign(i,d.params),o.push({params:i,pathname:H([a,d.pathname]),pathnameBase:Ae(H([a,d.pathnameBase])),route:f}),d.pathnameBase!==`/`&&(a=H([a,d.pathnameBase]))}return o}function _e(e,t){typeof e==`string`&&(e={path:e,caseSensitive:!1,end:!0});let[n,r]=ve(e.path,e.caseSensitive,e.end);return B(e,t,n,r)}function B(e,t,n,r){let i=t.match(n);if(!i)return null;let a=i[0],o=a.replace(/(.)\/+$/,`$1`),s=i.slice(1);return{params:r.reduce((e,{paramName:t,isOptional:n},r)=>{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function ve(e,t=!1,n=!0){g(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(?=\/|$|\()/g,`(?:/$1)?`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function ye(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return g(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function V(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}function be({basename:e,pathname:t}){return t===`/`?e:H([e,t])}var xe=e=>c.test(e);function Se(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?x(e):e,a;return n?(n=Oe(n),a=n.startsWith(`/`)?Ce(n.substring(1),`/`):Ce(n,t)):a=t,{pathname:a,search:je(r),hash:Me(i)}}function Ce(e,t){let n=ke(t).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function we(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.`}function Te(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function Ee(e){let t=Te(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function De(e,t,n,r=!1){let i;typeof e==`string`?i=x(e):(i={...e},h(!i.pathname||!i.pathname.includes(`?`),we(`?`,`pathname`,`search`,i)),h(!i.pathname||!i.pathname.includes(`#`),we(`#`,`pathname`,`hash`,i)),h(!i.search||!i.search.includes(`#`),we(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=Se(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var Oe=e=>e.replace(/[\\/]{2,}/g,`/`),H=e=>Oe(e.join(`/`)),ke=e=>e.replace(/\/+$/,``),Ae=e=>ke(e).replace(/^\/*/,`/`),je=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,Me=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,Ne=[`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`],U=class{constructor(e,t,n,r=!1){D(this,`status`,void 0),D(this,`statusText`,void 0),D(this,`data`,void 0),D(this,`error`,void 0),D(this,`internal`,void 0),this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function Pe(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function Fe(e){return H(e.map(e=>e.route.path).filter(Boolean))||`/`}function Ie(e,t){let n=new URL(typeof e==`string`||e instanceof URL?e:e.url),r=typeof t==`string`?x(t):t;if(n.pathname=r.pathname||`/`,r.search){let e=new URLSearchParams(r.search),t=e.getAll(`index`);e.delete(`index`);for(let n of t.filter(Boolean))e.append(`index`,n);let i=e.toString();n.search=i?`?${i}`:``}else n.search=``;return n.hash=r.hash||``,n}var Le=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function Re(e,t){let n=e;if(typeof n!=`string`||!c.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(Le)try{let e=new URL(window.location.href),r=l.test(n)?new URL(u(n,e.protocol)):new URL(n),a=V(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{g(!1,`<Link to="${n}"> contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}var W=Symbol(`Uninstrumented`),ze=new WeakMap;function Be(e,t){let n={lazy:[],"lazy.loader":[],"lazy.action":[],"lazy.middleware":[],middleware:[],loader:[],action:[]};e.forEach(e=>e({id:t.id,index:t.index,path:t.path,instrument(e){e.lazy!=null&&n.lazy.push(e.lazy),e[`lazy.loader`]!=null&&n[`lazy.loader`].push(e[`lazy.loader`]),e[`lazy.action`]!=null&&n[`lazy.action`].push(e[`lazy.action`]),e[`lazy.middleware`]!=null&&n[`lazy.middleware`].push(e[`lazy.middleware`]),e.middleware!=null&&n.middleware.push(e.middleware),e.loader!=null&&n.loader.push(e.loader),e.action!=null&&n.action.push(e.action)}}));let r={};if(typeof t.lazy==`function`&&n.lazy.length>0){let e=t.lazy;r.lazy=async(...t)=>G(await K(n.lazy,void 0,()=>e(...t),q))}if(typeof t.lazy==`object`){let e=t.lazy;if(typeof e.middleware==`function`&&n[`lazy.middleware`].length>0){let t=e.middleware;r.lazy=Object.assign(r.lazy||{},{middleware:async(...e)=>G(await K(n[`lazy.middleware`],void 0,()=>t(...e),q))})}if(typeof e.loader==`function`&&n[`lazy.loader`].length>0){let t=e.loader;r.lazy=Object.assign(r.lazy||{},{loader:async(...e)=>G(await K(n[`lazy.loader`],void 0,()=>t(...e),q))})}if(typeof e.action==`function`&&n[`lazy.action`].length>0){let t=e.action;r.lazy=Object.assign(r.lazy||{},{action:async(...e)=>G(await K(n[`lazy.action`],void 0,()=>t(...e),q))})}}if(typeof t.loader==`function`&&n.loader.length>0){let e=He(t.loader),i=async(...t)=>G(await K(n.loader,Ke(t[0]),()=>e(...t),q));e.hydrate===!0&&(i.hydrate=!0),Ue(i,e),r.loader=i}if(typeof t.action==`function`&&n.action.length>0){let e=He(t.action),i=async(...t)=>G(await K(n.action,Ke(t[0]),()=>e(...t),q));Ue(i,e),r.action=i}return t.middleware&&t.middleware.length>0&&n.middleware.length>0&&(r.middleware=t.middleware.map(e=>{let t=He(e),r=async(...e)=>G(await K(n.middleware,Ke(e[0]),()=>t(...e),q));return Ue(r,t),r})),r}function Ve(e,t){let n={navigate:[],fetch:[]};if(t.forEach(e=>e({instrument(e){e.navigate!=null&&n.navigate.push(e.navigate),e.fetch!=null&&n.fetch.push(e.fetch)}})),n.navigate.length>0){let t=He(e.navigate),r=async(...r)=>{let[i,a]=r,o,s={to:typeof i==`number`||typeof i==`string`?i:i?b(i):`.`,...qe(e,a??{})};return G(await K(n.navigate,s,async()=>{if(typeof i==`number`)return await t(...r);let n=We(e,e=>{o=e});try{return await t(...r)}finally{n()}},e=>({...q(e),meta:o})))};Ue(r,t),e.navigate=r}if(n.fetch.length>0){let t=He(e.fetch),r=async(...r)=>{let[i,a,o,s]=r,c;return G(await K(n.fetch,{href:o??`.`,fetcherKey:i,...qe(e,s??{})},async()=>{let n=We(e,e=>{c=e});try{return await t(...r)}finally{n()}},e=>({...q(e),meta:c})))};Ue(r,t),e.fetch=r}return e}function He(e){return e[W]??e}function Ue(e,t){e[W]=t}function We(e,t){return ze.set(e,t),()=>{ze.get(e)===t&&ze.delete(e)}}function Ge(e){let t=ze.get(e);return ze.delete(e),t}function G(e){if(e.type===`error`)throw e.value;return e.value}async function K(e,t,n,r,i={result:null,innerResult:null},a=e.length-1){let o=e[a];if(o){let s,c=async()=>(s?console.error(`You cannot call instrumented handlers more than once`):s=K(e,t,n,r,i,a-1),await s,h(i.innerResult,`Expected an inner result`),i.innerResult);try{await o(c,t)}catch(e){console.error(`An instrumentation function threw an error:`,e)}s||await c(),await s}else{try{i.result={type:`success`,value:await n()}}catch(e){i.result={type:`error`,value:e}}i.innerResult=r(i.result,t)}return i.result?i.result:(i.result={type:`error`,value:Error(`No result assigned in instrumentation chain.`)},i.innerResult=r(i.result,t),i.result)}function q(e){return e.type===`error`&&e.value instanceof Error?{status:`error`,error:e.value}:{status:`success`,error:void 0}}function Ke(e){let{request:t,context:n,params:r}=e;return{...e,request:Je(t),params:{...r},context:Ye(n)}}function qe(e,t){return{currentUrl:b(e.state.location),...`formMethod`in t?{formMethod:t.formMethod}:{},...`formEncType`in t?{formEncType:t.formEncType}:{},...`formData`in t?{formData:t.formData}:{},...`body`in t?{body:t.body}:{}}}function Je(e){return{method:e.method,url:e.url,headers:{get:(...t)=>e.headers.get(...t)}}}function Ye(e){return{get:t=>e.get(t)}}var Xe,Ze,J,Qe,$e=[`POST`,`PUT`,`PATCH`,`DELETE`],et=new Set($e),tt=[`GET`,...$e],nt=new Set(tt),rt=new Set([301,302,303,307,308]),it=new Set([307,308]),at={state:`idle`,location:void 0,matches:void 0,historyAction:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},ot={state:`idle`,data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},st={state:`unblocked`,proceed:void 0,reset:void 0,location:void 0},ct=`remix-router-transitions`,lt=Symbol(`ResetLoaderData`),ut=(Xe=new WeakMap,Ze=new WeakMap,J=new WeakMap,Qe=new WeakMap,class{constructor(e){i(this,Xe,void 0),i(this,Ze,void 0),i(this,J,void 0),i(this,Qe,void 0),s(Xe,this,e),s(Ze,this,F(e))}get stableRoutes(){return o(Xe,this)}get activeRoutes(){return o(J,this)??o(Xe,this)}get branches(){return o(Qe,this)??o(Ze,this)}get hasHMRRoutes(){return o(J,this)!=null}setRoutes(e){s(Xe,this,e),s(Ze,this,F(e))}setHmrRoutes(e){s(J,this,e),s(Qe,this,F(e))}commitHmrRoutes(){o(J,this)&&(s(Xe,this,o(J,this)),s(Ze,this,o(Qe,this)),s(J,this,void 0),s(Qe,this,void 0))}});function dt(e){let t=e.window?e.window:typeof window<`u`?window:void 0,n=t!==void 0&&t.document!==void 0&&t.document.createElement!==void 0;h(e.routes.length>0,`You must provide a non-empty routes array to createRouter`);let r=e.hydrationRouteProperties||[],i=e.mapRouteProperties,a=i||(()=>({}));if(e.instrumentations){let t=e.instrumentations;a=e=>({...i?.(e),...Be(t.map(e=>e.route).filter(Boolean),e)})}let o={},s=new ut(te(e.routes,a,void 0,o)),c=e.basename||`/`;c.startsWith(`/`)||(c=`/${c}`);let l=e.dataStrategy||Ot,u={...e.future},d=null,f=new Set,p=null,m=null,_=null,v=null,b=e.hydrationData!=null,S=ie(s.activeRoutes,e.history.location,c,!1,s.branches),w=!1,T=null,E,D;if(S==null&&!e.patchRoutesOnNavigation){let t=Y(404,{pathname:e.history.location.pathname}),{matches:n,route:r}=Zt(s.activeRoutes);E=!0,D=!E,S=n,T={[r.id]:t}}else if(S&&!e.hydrationData&&Ze(S,s.activeRoutes,e.history.location.pathname).active&&(S=null),!S){E=!1,D=!E,S=[];let t=Ze(null,s.activeRoutes,e.history.location.pathname);t.active&&t.matches&&(w=!0,S=t.matches)}else if(S.some(e=>e.route.lazy))E=!1,D=!E;else if(!S.some(e=>gt(e.route)))E=!0,D=!E;else{let t=e.hydrationData?e.hydrationData.loaderData:null,n=e.hydrationData?e.hydrationData.errors:null,r=S;if(n){let e=S.findIndex(e=>n[e.route.id]!==void 0);r=r.slice(0,e+1)}D=!1,E=!0,r.forEach(e=>{let r=_t(e.route,t,n);D=D||r.renderFallback,E=E&&!r.shouldLoad})}let O,A={historyAction:e.history.action,location:e.history.location,matches:S,initialized:E,renderFallback:D,navigation:at,restoreScrollPosition:e.hydrationData==null?null:!1,preventScrollReset:!1,revalidation:`idle`,loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||T,fetchers:new Map,blockers:new Map},j=`POP`,M=null,ee=!1,N,P=!1,ne=new Map,re=null,F=!1,oe=!1,se=new Set,I=new Map,ce=0,le=-1,ue=new Map,de=new Set,fe=new Map,L=new Map,R=new Set,z=new Map,pe,me=null;function he(){if(d=e.history.listen(({action:t,location:n,delta:r})=>{if(pe){pe(),pe=void 0;return}g(z.size===0||r!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let i=q({currentLocation:A.location,nextLocation:n,historyAction:t});if(i&&r!=null){let t=new Promise(e=>{pe=e});e.history.go(r*-1),K(i,{state:`blocked`,location:n,proceed(){K(i,{state:`proceeding`,proceed:void 0,reset:void 0,location:n}),t.then(()=>e.history.go(r))},reset(){let e=new Map(A.blockers);e.set(i,st),B({blockers:e})}}),M?.resolve(),M=null;return}return Se(t,n)}),n){xn(t,ne);let e=()=>Sn(t,ne);t.addEventListener(`pagehide`,e),re=()=>t.removeEventListener(`pagehide`,e)}return A.initialized||Se(`POP`,A.location,{initialHydration:!0}),O}function ge(){d&&d(),re&&re(),f.clear(),N&&N.abort(),A.fetchers.forEach((e,t)=>Le(A.fetchers,t)),A.blockers.forEach((e,t)=>G(t))}function _e(e){if(f.add(e),p){let{newErrors:t}=p;p=null,e(A,{deletedFetchers:[],newErrors:t,viewTransitionOpts:void 0,flushSync:!1})}return()=>f.delete(e)}function B(e,t={}){e.matches&&(e.matches=e.matches.map(e=>{let t=o[e.route.id],n=e.route;return n.element!==t.element||n.errorElement!==t.errorElement||n.hydrateFallbackElement!==t.hydrateFallbackElement?{...e,route:t}:e})),A={...A,...e};let n=[],r=[];A.fetchers.forEach((e,t)=>{e.state===`idle`&&(R.has(t)?n.push(t):r.push(t))}),R.forEach(e=>{!A.fetchers.has(e)&&!I.has(e)&&n.push(e)}),f.size===0&&(p={newErrors:e.errors??null}),[...f].forEach(r=>r(A,{deletedFetchers:n,newErrors:e.errors??null,viewTransitionOpts:t.viewTransitionOpts,flushSync:t.flushSync===!0})),n.forEach(e=>Le(A.fetchers,e)),r.forEach(e=>A.fetchers.delete(e))}function ve(t,n,{flushSync:r}={}){let i=A.actionData!=null&&A.navigation.formMethod!=null&&Z(A.navigation.formMethod)&&A.navigation.state===`loading`&&t.state?._isRedirect!==!0,a;a=n.actionData?Object.keys(n.actionData).length>0?n.actionData:null:i?A.actionData:null;let o=n.loaderData?Jt(A.loaderData,n.loaderData,n.matches||[],n.errors):A.loaderData,c=A.blockers;c.size>0&&!F&&(c=new Map(c),c.forEach((e,t)=>c.set(t,st)));let l=F?!1:Xe(t,n.matches||A.matches),u=ee===!0||A.navigation.formMethod!=null&&Z(A.navigation.formMethod)&&t.state?._isRedirect!==!0;s.commitHmrRoutes(),F||j===`POP`||(j===`PUSH`?e.history.push(t,t.state):j===`REPLACE`&&e.history.replace(t,t.state));let d;if(j===`POP`){let e=ne.get(A.location.pathname);e&&e.has(t.pathname)?d={currentLocation:A.location,nextLocation:t}:ne.has(t.pathname)&&(d={currentLocation:t,nextLocation:A.location})}else if(P){let e=ne.get(A.location.pathname);e?e.add(t.pathname):(e=new Set([t.pathname]),ne.set(A.location.pathname,e)),d={currentLocation:A.location,nextLocation:t}}B({...n,actionData:a,loaderData:o,historyAction:j,location:t,initialized:!0,renderFallback:!1,navigation:at,revalidation:`idle`,restoreScrollPosition:l,preventScrollReset:u,blockers:c},{viewTransitionOpts:d,flushSync:r===!0}),j=`POP`,ee=!1,P=!1,F=!1,oe=!1,M?.resolve(),M=null,me?.resolve(),me=null}async function ye(t,n){if(M?.resolve(),M=null,typeof t==`number`){M||(M=Cn());let n=M.promise;return e.history.go(t),n}let r=Ge(O),{path:i,submission:a,error:o}=mt(!1,pt(A.location,A.matches,c,t,n?.fromRouteId,n?.relative),n),s;n?.mask&&(s={pathname:``,search:``,hash:``,...typeof n.mask==`string`?x(n.mask):{...A.location.mask,...n.mask}});let l=A.location,u=y(l,i,n&&n.state,void 0,s);u={...u,...e.history.encodeLocation(u)};let d=n&&n.replace!=null?n.replace:void 0,f=`PUSH`;d===!0?f=`REPLACE`:d===!1||a!=null&&Z(a.formMethod)&&a.formAction===A.location.pathname+A.location.search&&(f=`REPLACE`);let p=n&&`preventScrollReset`in n?n.preventScrollReset===!0:void 0,m=(n&&n.flushSync)===!0,h=q({currentLocation:l,nextLocation:u,historyAction:f});if(h){K(h,{state:`blocked`,location:u,proceed(){K(h,{state:`proceeding`,proceed:void 0,reset:void 0,location:u}),ye(t,n)},reset(){let e=new Map(A.blockers);e.set(h,st),B({blockers:e})}});return}await Se(f,u,{submission:a,pendingError:o,preventScrollReset:p,replace:n&&n.replace,enableViewTransition:n&&n.viewTransition,flushSync:m,callSiteDefaultShouldRevalidate:n&&n.defaultShouldRevalidate,instrumentationNavigateMetaReceiver:r})}function be(){me||(me=Cn()),Me(),B({revalidation:`loading`});let e=me.promise;return A.navigation.state===`submitting`?e:A.navigation.state===`idle`?(Se(A.historyAction,A.location,{startUninterruptedRevalidation:!0}),e):(Se(j||A.historyAction,A.navigation.location,{overrideNavigation:A.navigation,enableViewTransition:P===!0}),e)}async function Se(t,n,r){N&&N.abort(),N=null,j=t,F=(r&&r.startUninterruptedRevalidation)===!0,Ye(A.location,A.matches),ee=(r&&r.preventScrollReset)===!0,P=(r&&r.enableViewTransition)===!0;let i=s.activeRoutes,a=r?.initialHydration&&A.matches&&A.matches.length>0&&!w?A.matches:ie(i,n,c,!1,s.branches),o=(r&&r.flushSync)===!0;if(a&&A.initialized&&!oe&&en(A.location,n)&&!(r&&r.submission&&Z(r.submission.formMethod))){ve(n,{matches:a},{flushSync:o});return}let l=Ze(a,i,n.pathname);if(l.active&&l.matches&&(a=l.matches),r?.instrumentationNavigateMetaReceiver){let t=mn(e.history,n,a);r.instrumentationNavigateMetaReceiver(t)}if(!a){let{error:e,notFoundMatches:t,route:r}=Ke(n.pathname);ve(n,{matches:t,loaderData:{},errors:{[r.id]:e}},{flushSync:o});return}let u=r&&r.overrideNavigation?{...r.overrideNavigation,matches:a,historyAction:t}:void 0;N=new AbortController;let d=Ut(e.history,n,N.signal,r&&r.submission),f=e.getContext?await e.getContext():new k,p;if(r&&r.pendingError)p=[Xt(a).route.id,{type:`error`,error:r.pendingError}];else if(r&&r.submission&&Z(r.submission.formMethod)){let i=await Ce(d,n,r.submission,a,t,f,l.active,r&&r.initialHydration===!0,{replace:r.replace,flushSync:o});if(i.shortCircuited)return;if(i.pendingActionResult){let[e,t]=i.pendingActionResult;if(X(t)&&Pe(t.error)&&t.error.status===404){N=null,ve(n,{matches:i.matches,loaderData:{},errors:{[e]:t.error}});return}}a=i.matches||a,p=i.pendingActionResult,u=gn(n,a,t,r.submission),o=!1,l.active=!1,d=Ut(e.history,d.url,d.signal)}let{shortCircuited:m,matches:h,loaderData:g,errors:_,workingFetchers:v}=await we(d,n,a,t,f,l.active,u,r&&r.submission,r&&r.fetcherSubmission,r&&r.replace,r&&r.initialHydration===!0,o,p,r&&r.callSiteDefaultShouldRevalidate);m||(N=null,ve(n,{matches:h||a,...Yt(p),loaderData:g,errors:_,...v?{fetchers:v}:{}}))}async function Ce(t,n,i,l,u,d,f,p,m={}){if(Me(),B({navigation:_n(n,l,u,i)},{flushSync:m.flushSync===!0}),f){let e=await J(l,n.pathname,t.signal);if(e.type===`aborted`)return{shortCircuited:!0};if(e.type===`error`){if(e.partialMatches.length===0){let{matches:t,route:n}=Zt(s.activeRoutes);return{matches:t,pendingActionResult:[n.id,{type:`error`,error:e.error}]}}let t=Xt(e.partialMatches).route.id;return{matches:e.partialMatches,pendingActionResult:[t,{type:`error`,error:e.error}]}}else if(e.matches)l=e.matches;else{let{notFoundMatches:e,error:t,route:r}=Ke(n.pathname);return{matches:e,pendingActionResult:[r.id,{type:`error`,error:t}]}}}let h,g=pn(l,n);if(!g.route.action&&!g.route.lazy)h={type:`error`,error:Y(405,{method:t.method,pathname:n.pathname,routeId:g.route.id})};else{let e=await Ae(t,n,Pt(a,o,t,n,l,g,p?[]:r,d),d,null);if(h=e[g.route.id],!h){for(let t of l)if(e[t.route.id]){h=e[t.route.id];break}}if(t.signal.aborted)return{shortCircuited:!0}}if(on(h)){let n;return n=m&&m.replace!=null?m.replace:Ht(h.response.headers.get(`Location`),new URL(t.url),c,e.history)===A.location.pathname+A.location.search,await ke(t,h,!0,{submission:i,replace:n}),{shortCircuited:!0}}if(X(h)){let e=Xt(l,g.route.id);return(m&&m.replace)!==!0&&(j=`PUSH`),{matches:l,pendingActionResult:[e.route.id,h,g.route.id]}}return{matches:l,pendingActionResult:[g.route.id,h]}}async function we(t,n,i,l,u,d,f,p,m,h,g,_,v,y){let b=f||gn(n,i,l,p),x=p||m||hn(b),S=!F&&!g;if(d){if(S){let e=Te(v);B({navigation:b,...e===void 0?{}:{actionData:e}},{flushSync:_})}let e=await J(i,n.pathname,t.signal);if(e.type===`aborted`)return{shortCircuited:!0};if(e.type===`error`){if(e.partialMatches.length===0){let{matches:t,route:n}=Zt(s.activeRoutes);return{matches:t,loaderData:{},errors:{[n.id]:e.error}}}let t=Xt(e.partialMatches).route.id;return{matches:e.partialMatches,loaderData:{},errors:{[t]:e.error}}}else if(e.matches)i=e.matches;else{let{error:e,notFoundMatches:t,route:r}=Ke(n.pathname);return{matches:t,loaderData:{},errors:{[r.id]:e}}}}let C=s.activeRoutes,{dsMatches:w,revalidatingFetchers:T}=ht(t,u,a,o,e.history,A,i,x,n,g?[]:r,g===!0,oe,se,R,fe,de,C,c,e.patchRoutesOnNavigation!=null,s.branches,v,y);if(le=++ce,!e.dataStrategy&&!w.some(e=>e.shouldLoad)&&!w.some(e=>e.route.middleware&&e.route.middleware.length>0)&&T.length===0){let e=new Map(A.fetchers),t=He(e);return ve(n,{matches:i,loaderData:{},errors:v&&X(v[1])?{[v[0]]:v[1].error}:null,...Yt(v),...t?{fetchers:e}:{}},{flushSync:_}),{shortCircuited:!0}}if(S){let e={};if(!d){e.navigation=b;let t=Te(v);t!==void 0&&(e.actionData=t)}T.length>0&&(e.fetchers=Ee(T)),B(e,{flushSync:_})}T.forEach(e=>{W(e.key),e.controller&&I.set(e.key,e.controller)});let E=()=>T.forEach(e=>W(e.key));N&&N.signal.addEventListener(`abort`,E);let{loaderResults:D,fetcherResults:O}=await je(w,T,t,n,u);if(t.signal.aborted)return{shortCircuited:!0};N&&N.signal.removeEventListener(`abort`,E),T.forEach(e=>I.delete(e.key));let k=Qt(D);if(k)return await ke(t,k.result,!0,{replace:h}),{shortCircuited:!0};if(k=Qt(O),k)return de.add(k.key),await ke(t,k.result,!0,{replace:h}),{shortCircuited:!0};let j=new Map(A.fetchers),{loaderData:M,errors:ee}=qt(A,i,D,v,T,O,j);g&&A.errors&&(ee={...A.errors,...ee});let P=He(j),te=Ue(le,j),ne=P||te||T.length>0;return{matches:i,loaderData:M,errors:ee,...ne?{workingFetchers:j}:{}}}function Te(e){if(e&&!X(e[1]))return{[e[0]]:e[1].data};if(A.actionData)return Object.keys(A.actionData).length===0?null:A.actionData}function Ee(e){let t=new Map(A.fetchers);return e.forEach(e=>{let n=t.get(e.key),r=vn(void 0,n?n.data:void 0);t.set(e.key,r)}),t}async function De(t,n,r,i){W(t);let a=(i&&i.flushSync)===!0,o=Ge(O),l=s.activeRoutes,u=pt(A.location,A.matches,c,r,n,i?.relative),d=ie(l,u,c,!1,s.branches),f=Ze(d,l,u);if(f.active&&f.matches&&(d=f.matches),o&&o(mn(e.history,u,d)),!d){U(t,n,Y(404,{pathname:u}),{flushSync:a});return}let{path:p,submission:m,error:h}=mt(!0,u,i);if(h){U(t,n,h,{flushSync:a});return}let g=e.getContext?await e.getContext():new k,_=(i&&i.preventScrollReset)===!0;if(m&&Z(m.formMethod)){await Oe(t,n,p,d,g,f.active,a,_,m,i&&i.defaultShouldRevalidate);return}fe.set(t,{routeId:n,path:p}),await H(t,n,p,d,g,f.active,a,_,m)}async function Oe(t,n,i,l,u,d,f,p,m,g){Me(),fe.delete(t),Ne(t,yn(m,A.fetchers.get(t)),{flushSync:f});let _=new AbortController,v=Ut(e.history,i,_.signal,m);if(d){let e=await J(l,new URL(v.url).pathname,v.signal,t);if(e.type===`aborted`)return;if(e.type===`error`){U(t,n,e.error,{flushSync:f});return}else if(e.matches)l=e.matches;else{U(t,n,Y(404,{pathname:i}),{flushSync:f});return}}let y=pn(l,i);if(!y.route.action&&!y.route.lazy){U(t,n,Y(405,{method:m.formMethod,pathname:i,routeId:n}),{flushSync:f});return}I.set(t,_);let b=ce,x=Pt(a,o,v,i,l,y,r,u),S=await Ae(v,i,x,u,t),C=S[y.route.id];if(!C){for(let e of x)if(S[e.route.id]){C=S[e.route.id];break}}if(v.signal.aborted){I.get(t)===_&&I.delete(t);return}if(R.has(t)){if(on(C)||X(C)){Ne(t,bn(void 0));return}}else{if(on(C))if(I.delete(t),le>b){Ne(t,bn(void 0));return}else return de.add(t),Ne(t,vn(m)),ke(v,C,!1,{fetcherSubmission:m,preventScrollReset:p});if(X(C)){U(t,n,C.error);return}}let w=A.navigation.location||A.location,T=Ut(e.history,w,_.signal),E=s.activeRoutes,D=A.navigation.state===`idle`?A.matches:ie(E,A.navigation.location,c,!1,s.branches);h(D,`Didn't find any matches after fetcher action`);let O=++ce;ue.set(t,O);let{dsMatches:k,revalidatingFetchers:M}=ht(T,u,a,o,e.history,A,D,m,w,r,!1,oe,se,R,fe,de,E,c,e.patchRoutesOnNavigation!=null,s.branches,[y.route.id,C],g),ee=vn(m,C.data),P=new Map(A.fetchers);P.set(t,ee),M.filter(e=>e.key!==t).forEach(e=>{let t=e.key,n=P.get(t),r=vn(void 0,n?n.data:void 0);P.set(t,r),W(t),e.controller&&I.set(t,e.controller)}),B({fetchers:P});let te=()=>M.forEach(e=>W(e.key));_.signal.addEventListener(`abort`,te);let{loaderResults:ne,fetcherResults:re}=await je(k,M,T,w,u);if(_.signal.aborted)return;_.signal.removeEventListener(`abort`,te),ue.delete(t),I.delete(t),M.forEach(e=>I.delete(e.key));let ae=A.fetchers.has(t),F=e=>{if(!ae)return e;let n=new Map(e.fetchers);return n.set(t,bn(C.data)),{...e,fetchers:n}},L=Qt(ne);if(L)return A=F(A),ke(T,L.result,!1,{preventScrollReset:p});if(L=Qt(re),L)return de.add(L.key),A=F(A),ke(T,L.result,!1,{preventScrollReset:p});let z=new Map(A.fetchers);ae&&z.set(t,bn(C.data));let{loaderData:pe,errors:me}=qt(A,D,ne,void 0,M,re,z);Ue(O,z),A.navigation.state===`loading`&&O>le?(h(j,`Expected pending action`),N&&N.abort(),ve(A.navigation.location,{matches:D,loaderData:pe,errors:me,fetchers:z})):(B({errors:me,loaderData:Jt(A.loaderData,pe,D,me),fetchers:z}),oe=!1)}async function H(t,n,i,s,c,l,u,d,f){let p=A.fetchers.get(t);Ne(t,vn(f,p?p.data:void 0),{flushSync:u});let m=new AbortController,h=Ut(e.history,i,m.signal);if(l){let e=await J(s,new URL(h.url).pathname,h.signal,t);if(e.type===`aborted`)return;if(e.type===`error`){U(t,n,e.error,{flushSync:u});return}else if(e.matches)s=e.matches;else{U(t,n,Y(404,{pathname:i}),{flushSync:u});return}}let g=pn(s,i);I.set(t,m);let _=ce,v=await Ae(h,i,Pt(a,o,h,i,s,g,r,c),c,t),y=v[g.route.id];if(!y){for(let e of s)if(v[e.route.id]){y=v[e.route.id];break}}if(I.get(t)===m&&I.delete(t),!h.signal.aborted){if(R.has(t)){Ne(t,bn(void 0));return}if(on(y))if(le>_){Ne(t,bn(void 0));return}else{de.add(t),await ke(h,y,!1,{preventScrollReset:d});return}if(X(y)){U(t,n,y.error);return}Ne(t,bn(y.data))}}async function ke(r,i,a,{submission:o,fetcherSubmission:s,preventScrollReset:l,replace:u}={}){a||(M?.resolve(),M=null),i.response.headers.has(`X-Remix-Revalidate`)&&(oe=!0);let d=i.response.headers.get(`Location`);h(d,`Expected a Location header on the redirect Response`),d=Ht(d,new URL(r.url),c,e.history);let f=y(A.location,d,{_isRedirect:!0});if(n){let e=!1;if(i.response.headers.has(`X-Remix-Reload-Document`))e=!0;else if(xe(d)){let n=C(t,d,!0);e=n.origin!==t.location.origin||V(n.pathname,c)==null}if(e){u?t.location.replace(d):t.location.assign(d);return}}N=null;let p=u===!0||i.response.headers.has(`X-Remix-Replace`)?`REPLACE`:`PUSH`,{formMethod:m,formAction:g,formEncType:_}=A.navigation;!o&&!s&&m&&g&&_&&(o=hn(A.navigation));let v=o||s;it.has(i.response.status)&&v&&Z(v.formMethod)?await Se(p,f,{submission:{...v,formAction:d},preventScrollReset:l||ee,enableViewTransition:a?P:void 0}):await Se(p,f,{overrideNavigation:gn(f,[],p,o),fetcherSubmission:s,preventScrollReset:l||ee,enableViewTransition:a?P:void 0})}async function Ae(e,t,n,r,i){let a,o={};try{a=await Ft(l,e,t,n,i,r,!1)}catch(e){return n.filter(e=>e.shouldLoad).forEach(t=>{o[t.route.id]={type:`error`,error:e}}),o}if(e.signal.aborted)return o;if(!Z(e.method))for(let e of n){if(a[e.route.id]?.type===`error`)break;!a.hasOwnProperty(e.route.id)&&!A.loaderData.hasOwnProperty(e.route.id)&&(!A.errors||!A.errors.hasOwnProperty(e.route.id))&&e.shouldCallHandler()&&(a[e.route.id]={type:`error`,result:Error(`No result returned from dataStrategy for route ${e.route.id}`)})}for(let[t,r]of Object.entries(a))if(an(r)){let i=r.result;o[t]={type:`redirect`,response:zt(i,e,t,n,c)}}else o[t]=await Rt(r);return o}async function je(e,t,n,r,i){let a=Ae(n,r,e,i,null),o=Promise.all(t.map(async e=>{if(e.matches&&e.match&&e.request&&e.controller){let t=(await Ae(e.request,e.path,e.matches,i,e.key))[e.match.route.id];return{[e.key]:t}}else return Promise.resolve({[e.key]:{type:`error`,error:Y(404,{pathname:e.path})}})}));return{loaderResults:await a,fetcherResults:(await o).reduce((e,t)=>Object.assign(e,t),{})}}function Me(){oe=!0,fe.forEach((e,t)=>{I.has(t)&&se.add(t),W(t)})}function Ne(e,t,n={}){let r=new Map(A.fetchers);r.set(e,t),B({fetchers:r},{flushSync:(n&&n.flushSync)===!0})}function U(e,t,n,r={}){let i=Xt(A.matches,t),a=new Map(A.fetchers);Le(a,e),B({errors:{[i.route.id]:n},fetchers:a},{flushSync:(r&&r.flushSync)===!0})}function Fe(e){return L.set(e,(L.get(e)||0)+1),R.has(e)&&R.delete(e),A.fetchers.get(e)||ot}function Ie(e,t){W(e,t?.reason),Ne(e,bn(null))}function Le(e,t){let n=A.fetchers.get(t);I.has(t)&&!(n&&n.state===`loading`&&ue.has(t))&&W(t),fe.delete(t),ue.delete(t),de.delete(t),R.delete(t),se.delete(t),e.delete(t)}function Re(e){let t=(L.get(e)||0)-1;t<=0?(L.delete(e),R.add(e)):L.set(e,t),B({fetchers:new Map(A.fetchers)})}function W(e,t){let n=I.get(e);n&&(n.abort(t),I.delete(e))}function ze(e,t){for(let n of e){let e=t.get(n);h(e,`Expected fetcher: ${n}`);let r=bn(e.data);t.set(n,r)}}function He(e){let t=[],n=!1;for(let r of de){let i=e.get(r);h(i,`Expected fetcher: ${r}`),i.state===`loading`&&(de.delete(r),t.push(r),n=!0)}return ze(t,e),n}function Ue(e,t){let n=[];for(let[r,i]of ue)if(i<e){let e=t.get(r);h(e,`Expected fetcher: ${r}`),e.state===`loading`&&(W(r),ue.delete(r),n.push(r))}return ze(n,t),n.length>0}function We(e,t){let n=A.blockers.get(e)||st;return z.get(e)!==t&&z.set(e,t),n}function G(e){A.blockers.delete(e),z.delete(e)}function K(e,t){let n=A.blockers.get(e)||st;h(n.state===`unblocked`&&t.state===`blocked`||n.state===`blocked`&&t.state===`blocked`||n.state===`blocked`&&t.state===`proceeding`||n.state===`blocked`&&t.state===`unblocked`||n.state===`proceeding`&&t.state===`unblocked`,`Invalid blocker state transition: ${n.state} -> ${t.state}`);let r=new Map(A.blockers);r.set(e,t),B({blockers:r})}function q({currentLocation:e,nextLocation:t,historyAction:n}){if(z.size===0)return;z.size>1&&g(!1,`A router only supports one blocker at a time`);let r=Array.from(z.entries()),[i,a]=r[r.length-1],o=A.blockers.get(i);if(!(o&&o.state===`proceeding`)&&a({currentLocation:e,nextLocation:t,historyAction:n}))return i}function Ke(e){let t=Y(404,{pathname:e}),n=s.activeRoutes,{matches:r,route:i}=Zt(n);return{notFoundMatches:r,route:i,error:t}}function qe(e,t,n){if(m=e,v=t,_=n||null,!b&&A.navigation===at){b=!0;let e=Xe(A.location,A.matches);e!=null&&B({restoreScrollPosition:e})}return()=>{m=null,v=null,_=null}}function Je(e,t){return _&&_(e,t.map(e=>ae(e,A.loaderData)))||e.key}function Ye(e,t){if(m&&v){let n=Je(e,t);m[n]=v()}}function Xe(e,t){if(m){let n=Je(e,t),r=m[n];if(typeof r==`number`)return r}return null}function Ze(t,n,r){if(e.patchRoutesOnNavigation){let e=s.branches;if(!t)return{active:!0,matches:ie(n,r,c,!0,e)||[]};if(Object.keys(t[0].params).length>0)return{active:!0,matches:ie(n,r,c,!0,e)}}return{active:!1,matches:null}}async function J(t,n,r,i){if(!e.patchRoutesOnNavigation)return{type:`success`,matches:t};let l=t;for(;;){let t=o;try{await e.patchRoutesOnNavigation({signal:r,path:n,matches:l,fetcherKey:i,patch:(e,n)=>{r.aborted||xt(e,n,s,t,a,!1)}})}catch(e){return{type:`error`,error:e,partialMatches:l}}if(r.aborted)return{type:`aborted`};let u=s.branches,d=ie(s.activeRoutes,n,c,!1,u),f=null;if(d&&(Object.keys(d[0].params).length===0||(f=ie(s.activeRoutes,n,c,!0,u),!(f&&l.length<f.length&&Qe(l,f.slice(0,l.length))))))return{type:`success`,matches:d};if(f||(f=ie(s.activeRoutes,n,c,!0,u)),!f||Qe(l,f))return{type:`success`,matches:null};l=f}}function Qe(e,t){return e.length===t.length&&e.every((e,n)=>e.route.id===t[n].route.id)}function $e(e){o={},s.setHmrRoutes(te(e,a,void 0,o))}function et(e,t,n=!1){xt(e,t,s,o,a,n),s.hasHMRRoutes||B({})}return O={get basename(){return c},get future(){return u},get state(){return A},get routes(){return s.stableRoutes},get branches(){return s.branches},get manifest(){return o},get window(){return t},initialize:he,subscribe:_e,enableScrollRestoration:qe,navigate:ye,fetch:De,revalidate:be,createHref:t=>e.history.createHref(t),encodeLocation:t=>e.history.encodeLocation(t),getFetcher:Fe,resetFetcher:Ie,deleteFetcher:Re,dispose:ge,getBlocker:We,deleteBlocker:G,patchRoutes:et,_internalFetchControllers:I,_internalSetRoutes:$e,_internalSetStateDoNotUseOrYouWillBreakYourApp(e){B(e)}},e.instrumentations&&(O=Ve(O,e.instrumentations.map(e=>e.router).filter(Boolean))),O}function ft(e){return e!=null&&(`formData`in e&&e.formData!=null||`body`in e&&e.body!==void 0)}function pt(e,t,n,r,i,a){let o,s;if(i){o=[];for(let e of t)if(o.push(e),e.route.id===i){s=e;break}}else o=t,s=t[t.length-1];let c=De(r||`.`,Ee(o),V(e.pathname,n)||e.pathname,a===`path`);if(r??(c.search=e.search,c.hash=e.hash),(r==null||r===``||r===`.`)&&s){let e=fn(c.search);if(s.route.index&&!e)c.search=c.search?c.search.replace(/^\?/,`?index&`):`?index`;else if(!s.route.index&&e){let e=new URLSearchParams(c.search),t=e.getAll(`index`);e.delete(`index`),t.filter(e=>e).forEach(t=>e.append(`index`,t));let n=e.toString();c.search=n?`?${n}`:``}}return n!==`/`&&(c.pathname=be({basename:n,pathname:c.pathname})),b(c)}function mt(e,t,n){if(!n||!ft(n))return{path:t};if(n.formMethod&&!dn(n.formMethod))return{path:t,error:Y(405,{method:n.formMethod})};let r=()=>({path:t,error:Y(400,{type:`invalid-body`})}),i=(n.formMethod||`get`).toUpperCase(),a=$t(t);if(n.body!==void 0){if(n.formEncType===`text/plain`){if(!Z(i))return r();let e=typeof n.body==`string`?n.body:n.body instanceof FormData||n.body instanceof URLSearchParams?Array.from(n.body.entries()).reduce((e,[t,n])=>`${e}${t}=${n}\n`,``):String(n.body);return{path:t,submission:{formMethod:i,formAction:a,formEncType:n.formEncType,formData:void 0,json:void 0,text:e}}}else if(n.formEncType===`application/json`){if(!Z(i))return r();try{let e=typeof n.body==`string`?JSON.parse(n.body):n.body;return{path:t,submission:{formMethod:i,formAction:a,formEncType:n.formEncType,formData:void 0,json:e,text:void 0}}}catch{return r()}}}h(typeof FormData==`function`,`FormData is not available in this environment`);let o,s;if(n.formData)o=Wt(n.formData),s=n.formData;else if(n.body instanceof FormData)o=Wt(n.body),s=n.body;else if(n.body instanceof URLSearchParams)o=n.body,s=Gt(o);else if(n.body==null)o=new URLSearchParams,s=new FormData;else try{o=new URLSearchParams(n.body),s=Gt(o)}catch{return r()}let c={formMethod:i,formAction:a,formEncType:n&&n.formEncType||`application/x-www-form-urlencoded`,formData:s,json:void 0,text:void 0};if(Z(c.formMethod))return{path:t,submission:c};let l=x(t);return e&&l.search&&fn(l.search)&&o.append(`index`,``),l.search=`?${o}`,{path:b(l),submission:c}}function ht(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x){let S=b?X(b[1])?b[1].error:b[1].data:void 0,C=i.createURL(a.location),w=i.createURL(c),T;if(u&&a.errors){let e=Object.keys(a.errors)[0];T=o.findIndex(t=>t.route.id===e)}else if(b&&X(b[1])){let e=b[0];T=o.findIndex(t=>t.route.id===e)-1}let E=b?b[1].statusCode:void 0,D=E&&E>=400,O={currentUrl:C,currentParams:a.matches[0]?.params||{},nextUrl:w,nextParams:o[0].params,...s,actionResult:S,actionStatus:E},k=Fe(o),A=o.map((i,o)=>{let{route:s}=i,f=null;if(T!=null&&o>T)f=!1;else if(s.lazy)f=!0;else if(!gt(s))f=!1;else if(u){let{shouldLoad:e}=_t(s,a.loaderData,a.errors);f=e}else vt(a.loaderData,a.matches[o],i)&&(f=!0);if(f!==null)return Nt(n,r,e,c,k,i,l,t,f);let p=!1;typeof x==`boolean`?p=x:D?p=!1:d||C.pathname+C.search===w.pathname+w.search?p=!0:C.search===w.search?yt(a.matches[o],i)&&(p=!0):p=!0;let m={...O,defaultShouldRevalidate:p};return Nt(n,r,e,c,k,i,l,t,bt(i,m),m,x)}),j=[];return m.forEach((e,s)=>{if(u||!o.some(t=>t.route.id===e.routeId)||p.has(s))return;let c=a.fetchers.get(s),m=c&&c.state!==`idle`&&c.data===void 0,b=ie(g,e.path,_??`/`,!1,y);if(!b){if(v&&m)return;j.push({key:s,routeId:e.routeId,path:e.path,matches:null,match:null,request:null,controller:null});return}if(h.has(s))return;let S=pn(b,e.path),C=new AbortController,w=Ut(i,e.path,C.signal),T=null;if(f.has(s))f.delete(s),T=Pt(n,r,w,e.path,b,S,l,t);else if(m)d&&(T=Pt(n,r,w,e.path,b,S,l,t));else{let i;i=typeof x==`boolean`?x:D?!1:d;let a={...O,defaultShouldRevalidate:i};bt(S,a)&&(T=Pt(n,r,w,e.path,b,S,l,t,a))}T&&j.push({key:s,routeId:e.routeId,path:e.path,matches:T,match:S,request:w,controller:C})}),{dsMatches:A,revalidatingFetchers:j}}function gt(e){return e.loader!=null||e.middleware!=null&&e.middleware.length>0}function _t(e,t,n){if(e.lazy)return{shouldLoad:!0,renderFallback:!0};if(!gt(e))return{shouldLoad:!1,renderFallback:!1};let r=t!=null&&e.id in t,i=n!=null&&n[e.id]!==void 0;if(!r&&i)return{shouldLoad:!1,renderFallback:!1};if(typeof e.loader==`function`&&e.loader.hydrate===!0)return{shouldLoad:!0,renderFallback:!r};let a=!r&&!i;return{shouldLoad:a,renderFallback:a}}function vt(e,t,n){let r=!t||n.route.id!==t.route.id,i=!e.hasOwnProperty(n.route.id);return r||i}function yt(e,t){let n=e.route.path;return e.pathname!==t.pathname||n!=null&&n.endsWith(`*`)&&e.params[`*`]!==t.params[`*`]}function bt(e,t){if(e.route.shouldRevalidate){let n=e.route.shouldRevalidate(t);if(typeof n==`boolean`)return n}return t.defaultShouldRevalidate}function xt(e,t,n,r,i,a){let o;if(e){let t=r[e];h(t,`No route found to patch children into: routeId = ${e}`),t.children||(t.children=[]),o=t.children}else o=n.activeRoutes;let s=[],c=[];if(t.forEach(e=>{let t=o.find(t=>St(e,t));t?c.push({existingRoute:t,newRoute:e}):s.push(e)}),s.length>0){let t=te(s,i,[e||`_`,`patch`,String(o?.length||`0`)],r);o.push(...t)}if(a&&c.length>0)for(let e=0;e<c.length;e++){let{existingRoute:t,newRoute:n}=c[e],r=t,[a]=te([n],i,[],{},!0);Object.assign(r,{element:a.element?a.element:r.element,errorElement:a.errorElement?a.errorElement:r.errorElement,hydrateFallbackElement:a.hydrateFallbackElement?a.hydrateFallbackElement:r.hydrateFallbackElement})}n.hasHMRRoutes||n.setRoutes([...n.activeRoutes])}function St(e,t){return`id`in e&&`id`in t&&e.id===t.id?!0:e.index===t.index&&e.path===t.path&&e.caseSensitive===t.caseSensitive?(!e.children||e.children.length===0)&&(!t.children||t.children.length===0)?!0:e.children?.every((e,n)=>t.children?.some(t=>St(e,t)))??!1:!1}var Ct=new WeakMap,wt=({key:e,route:t,manifest:n,mapRouteProperties:r})=>{let i=n[t.id];if(h(i,`No route found in manifest`),!i.lazy||typeof i.lazy!=`object`)return;let a=i.lazy[e];if(!a)return;let o=Ct.get(i);o||(o={},Ct.set(i,o));let s=o[e];if(s)return s;let c=(async()=>{let t=j(e),n=i[e]!==void 0;if(t)g(!t,`Route property `+e+` is not a supported lazy route property. This property will be ignored.`),o[e]=Promise.resolve();else if(n)g(!1,`Route "${i.id}" has a static property "${e}" defined. The lazy property will be ignored.`);else{let t=await a();t!=null&&(Object.assign(i,{[e]:t}),Object.assign(i,r(i)))}typeof i.lazy==`object`&&(i.lazy[e]=void 0,Object.values(i.lazy).every(e=>e===void 0)&&(i.lazy=void 0))})();return o[e]=c,c},Tt=new WeakMap;function Et(e,t,n,r,i){let a=n[e.id];if(h(a,`No route found in manifest`),!e.lazy)return{lazyRoutePromise:void 0,lazyHandlerPromise:void 0};if(typeof e.lazy==`function`){let t=Tt.get(a);if(t)return{lazyRoutePromise:t,lazyHandlerPromise:t};let n=(async()=>{h(typeof e.lazy==`function`,`No lazy route function found`);let t=await e.lazy(),n={};for(let e in t){let r=t[e];if(r===void 0)continue;let i=ee(e),o=a[e]!==void 0;i?g(!i,`Route property `+e+` is not a supported property to be returned from a lazy route function. This property will be ignored.`):o?g(!o,`Route "${a.id}" has a static property "${e}" defined but its lazy function is also returning a value for this property. The lazy route property "${e}" will be ignored.`):n[e]=r}Object.assign(a,n),Object.assign(a,{...r(a),lazy:void 0})})();return Tt.set(a,n),n.catch(()=>{}),{lazyRoutePromise:n,lazyHandlerPromise:n}}let o=Object.keys(e.lazy),s=[],c;for(let a of o){if(i&&i.includes(a))continue;let o=wt({key:a,route:e,manifest:n,mapRouteProperties:r});o&&(s.push(o),a===t&&(c=o))}let l=s.length>0?Promise.all(s).then(()=>{}):void 0;return l?.catch(()=>{}),c?.catch(()=>{}),{lazyRoutePromise:l,lazyHandlerPromise:c}}async function Dt(e){let t=e.matches.filter(e=>e.shouldLoad),n={};return(await Promise.all(t.map(e=>e.resolve()))).forEach((e,r)=>{n[t[r].route.id]=e}),n}async function Ot(e){return e.matches.some(e=>e.route.middleware)?kt(e,()=>Dt(e)):Dt(e)}function kt(e,t){return At(e,t,e=>{if(un(e))throw e;return e},nn,n);async function n(t,n,r){if(r)return Object.assign(r.value,{[n]:{type:`error`,result:t}});{let{matches:r}=e,i=Math.min(Math.max(r.findIndex(e=>e.route.id===n),0),Math.max(r.findIndex(e=>e.shouldCallHandler()),0)),a=r[i].route.id;for(let e of r.slice(0,i+1))try{await e._lazyPromises?.route}catch{a=e.route.id;break}return{[Xt(r,a).route.id]:{type:`error`,result:t}}}}}async function At(e,t,n,r,i){let{matches:a,...o}=e;return await jt(o,a.flatMap(e=>e.route.middleware?e.route.middleware.map(t=>[e.route.id,t]):[]),t,n,r,i)}async function jt(e,t,n,r,i,a,o=0){let{request:s}=e;if(s.signal.aborted)throw s.signal.reason??Error(`Request aborted: ${s.method} ${s.url}`);let c=t[o];if(!c)return await n();let[l,u]=c,d,f=async()=>{if(d)throw Error("You may only call `next()` once per middleware");try{return d={value:await jt(e,t,n,r,i,a,o+1)},d.value}catch(e){return d={value:await a(e,l,d)},d.value}};try{let t=await u(e,f),n=t==null?void 0:r(t);return i(n)?n:d?n??d.value:(d={value:await f()},d.value)}catch(e){return await a(e,l,d)}}function Mt(e,t,n,r,i){let a=wt({key:`middleware`,route:r.route,manifest:t,mapRouteProperties:e}),o=Et(r.route,Z(n.method)?`action`:`loader`,t,e,i);return{middleware:a,route:o.lazyRoutePromise,handler:o.lazyHandlerPromise}}function Nt(e,t,n,r,i,a,o,s,c,l=null,u){let d=!1,f=Mt(e,t,n,a,o);return{...a,_lazyPromises:f,shouldLoad:c,shouldRevalidateArgs:l,shouldCallHandler(e){return d=!0,l?typeof u==`boolean`?bt(a,{...l,defaultShouldRevalidate:u}):typeof e==`boolean`?bt(a,{...l,defaultShouldRevalidate:e}):bt(a,l):c},resolve(e){let{lazy:t,loader:o,middleware:l}=a.route,u=d||c||e&&!Z(n.method)&&(t||o),p=l&&l.length>0&&!o&&!t;return u&&(Z(n.method)||!p)?It({request:n,path:r,pattern:i,match:a,lazyHandlerPromise:f?.handler,lazyRoutePromise:f?.route,handlerOverride:e,scopedContext:s}):Promise.resolve({type:`data`,result:void 0})}}}function Pt(e,t,n,r,i,a,o,s,c=null){return i.map(l=>l.route.id===a.route.id?Nt(e,t,n,r,Fe(i),l,o,s,!0,c):{...l,shouldLoad:!1,shouldRevalidateArgs:c,shouldCallHandler:()=>!1,_lazyPromises:Mt(e,t,n,l,o),resolve:()=>Promise.resolve({type:`data`,result:void 0})})}async function Ft(e,t,n,r,i,a,o){r.some(e=>e._lazyPromises?.middleware)&&await Promise.all(r.map(e=>e._lazyPromises?.middleware));let s={request:t,url:Ie(t,n),pattern:Fe(r),params:r[0].params,context:a,matches:r},c=o?()=>{throw Error("You cannot call `runClientMiddleware()` from a static handler `dataStrategy`. Middleware is run outside of `dataStrategy` during SSR in order to bubble up the Response. You can enable middleware via the `respond` API in `query`/`queryRoute`")}:e=>{let t=s;return kt(t,()=>e({...t,fetcherKey:i,runClientMiddleware:()=>{throw Error("Cannot call `runClientMiddleware()` from within an `runClientMiddleware` handler")}}))},l=await e({...s,fetcherKey:i,runClientMiddleware:c});try{await Promise.all(r.flatMap(e=>[e._lazyPromises?.handler,e._lazyPromises?.route]))}catch{}return l}async function It({request:e,path:t,pattern:n,match:r,lazyHandlerPromise:i,lazyRoutePromise:a,handlerOverride:o,scopedContext:s}){let c,l,u=Z(e.method),d=u?`action`:`loader`,f=i=>{let a,c=new Promise((e,t)=>a=t);l=()=>a(),e.signal.addEventListener(`abort`,l);let u=a=>typeof i==`function`?i({request:e,url:Ie(e,t),pattern:n,params:r.params,context:s},...a===void 0?[]:[a]):Promise.reject(Error(`You cannot call the handler for a route which defines a boolean "${d}" [routeId: ${r.route.id}]`)),f=(async()=>{try{return{type:`data`,result:await(o?o(e=>u(e)):u())}}catch(e){return{type:`error`,result:e}}})();return Promise.race([f,c])};try{let t=u?r.route.action:r.route.loader;if(i||a)if(t){let e,[n]=await Promise.all([f(t).catch(t=>{e=t}),i,a]);if(e!==void 0)throw e;c=n}else{await i;let t=u?r.route.action:r.route.loader;if(t)[c]=await Promise.all([f(t),a]);else if(d===`action`){let t=new URL(e.url),n=t.pathname+t.search;throw Y(405,{method:e.method,pathname:n,routeId:r.route.id})}else return{type:`data`,result:void 0}}else if(t)c=await f(t);else{let t=new URL(e.url);throw Y(404,{pathname:t.pathname+t.search})}}catch(e){return{type:`error`,result:e}}finally{l&&e.signal.removeEventListener(`abort`,l)}return c}async function Lt(e){let t=e.headers.get(`Content-Type`);return t&&/\bapplication\/json\b/.test(t)?e.body==null?null:e.json():e.text()}async function Rt(e){let{result:t,type:n}=e;if(cn(t)){let e;try{e=await Lt(t)}catch(e){return{type:`error`,error:e}}return n===`error`?{type:`error`,error:new U(t.status,t.statusText,e),statusCode:t.status,headers:t.headers}:{type:`data`,data:e,statusCode:t.status,headers:t.headers}}return n===`error`?sn(t)?t.data instanceof Error?{type:`error`,error:t.data,statusCode:t.init?.status,headers:t.init?.headers?new Headers(t.init.headers):void 0}:{type:`error`,error:tn(t),statusCode:Pe(t)?t.status:void 0,headers:t.init?.headers?new Headers(t.init.headers):void 0}:{type:`error`,error:t,statusCode:Pe(t)?t.status:void 0}:sn(t)?{type:`data`,data:t.data,statusCode:t.init?.status,headers:t.init?.headers?new Headers(t.init.headers):void 0}:{type:`data`,data:t}}function zt(e,t,n,r,i){let a=e.headers.get(`Location`);if(h(a,`Redirects returned/thrown from loaders/actions must have a Location header`),!xe(a)){let o=r.slice(0,r.findIndex(e=>e.route.id===n)+1);a=pt(new URL(t.url),o,i,a),e.headers.set(`Location`,a)}return e}var Bt=[`about:`,`blob:`,`chrome:`,`chrome-untrusted:`,`content:`,`data:`,`devtools:`,`file:`,`filesystem:`,`javascript:`];function Vt(e){try{return Bt.includes(new URL(e).protocol)}catch{return!1}}function Ht(e,t,n,r){if(xe(e)){let r=e,i=l.test(r)?new URL(u(r,t.protocol)):new URL(r);if(Vt(i.toString()))throw Error(`Invalid redirect location`);let a=V(i.pathname,n)!=null;if(i.origin===t.origin&&a)return Oe(i.pathname)+i.search+i.hash}try{if(Vt(r.createURL(e).toString()))throw Error(`Invalid redirect location`)}catch{}return e}function Ut(e,t,n,r){let i=e.createURL($t(t)).toString(),a={signal:n};if(r&&Z(r.formMethod)){let{formMethod:e,formEncType:t}=r;a.method=e.toUpperCase(),t===`application/json`?(a.headers=new Headers({"Content-Type":t}),a.body=JSON.stringify(r.json)):t===`text/plain`?a.body=r.text:t===`application/x-www-form-urlencoded`&&r.formData?a.body=Wt(r.formData):a.body=r.formData}return new Request(i,a)}function Wt(e){let t=new URLSearchParams;for(let[n,r]of e.entries())t.append(n,typeof r==`string`?r:r.name);return t}function Gt(e){let t=new FormData;for(let[n,r]of e.entries())t.append(n,r);return t}function Kt(e,t,n,r=!1,i=!1){let a={},o=null,s,c=!1,l={},u=n&&X(n[1])?n[1].error:void 0;return e.forEach(n=>{if(!(n.route.id in t))return;let d=n.route.id,f=t[d];if(h(!on(f),`Cannot handle redirect results in processLoaderData`),X(f)){let t=f.error;if(u!==void 0&&(t=u,u=void 0),o=o||{},i)o[d]=t;else{let n=Xt(e,d);o[n.route.id]??(o[n.route.id]=t)}r||(a[d]=lt),c||(c=!0,s=Pe(f.error)?f.error.status:500),f.headers&&(l[d]=f.headers)}else a[d]=f.data,f.statusCode&&f.statusCode!==200&&!c&&(s=f.statusCode),f.headers&&(l[d]=f.headers)}),u!==void 0&&n&&(o={[n[0]]:u},n[2]&&(a[n[2]]=void 0)),{loaderData:a,errors:o,statusCode:s||200,loaderHeaders:l}}function qt(e,t,n,r,i,a,o){let{loaderData:s,errors:c}=Kt(t,n,r);return i.filter(e=>!e.matches||e.matches.some(e=>e.shouldLoad)).forEach(t=>{let{key:n,match:r,controller:i}=t;if(i&&i.signal.aborted)return;let s=a[n];if(h(s,`Did not find corresponding fetcher result`),X(s)){let t=Xt(e.matches,r?.route.id);c&&c[t.route.id]||(c={...c,[t.route.id]:s.error}),o.delete(n)}else if(on(s))h(!1,`Unhandled fetcher revalidation redirect`);else{let e=bn(s.data);o.set(n,e)}}),{loaderData:s,errors:c}}function Jt(e,t,n,r){let i=Object.entries(t).filter(([,e])=>e!==lt).reduce((e,[t,n])=>(e[t]=n,e),{});for(let a of n){let n=a.route.id;if(!t.hasOwnProperty(n)&&e.hasOwnProperty(n)&&a.route.loader&&(i[n]=e[n]),r&&r.hasOwnProperty(n))break}return i}function Yt(e){return e?X(e[1])?{actionData:{}}:{actionData:{[e[0]]:e[1].data}}:{}}function Xt(e,t){return(t?e.slice(0,e.findIndex(e=>e.route.id===t)+1):[...e]).reverse().find(e=>e.route.ErrorBoundary!=null||e.route.errorElement!=null)||e[0]}function Zt(e){let t=e.length===1?e[0]:e.find(e=>e.index||!e.path||e.path===`/`)||{id:`__shim-error-route__`};return{matches:[{params:{},pathname:``,pathnameBase:``,route:t}],route:t}}function Y(e,{pathname:t,routeId:n,method:r,type:i,message:a}={}){let o=`Unknown Server Error`,s=`Unknown @remix-run/router error`;return e===400?(o=`Bad Request`,r&&t&&n?s=`You made a ${r} request to "${t}" but did not provide a \`loader\` for route "${n}", so there is no way to handle the request.`:i===`invalid-body`&&(s=`Unable to encode submission body`)):e===403?(o=`Forbidden`,s=`Route "${n}" does not match URL "${t}"`):e===404?(o=`Not Found`,s=`No route matches URL "${t}"`):e===405&&(o=`Method Not Allowed`,r&&t&&n?s=`You made a ${r.toUpperCase()} request to "${t}" but did not provide an \`action\` for route "${n}", so there is no way to handle the request.`:r&&(s=`Invalid request method "${r.toUpperCase()}"`)),new U(e||500,o,Error(s),!0)}function Qt(e){let t=Object.entries(e);for(let e=t.length-1;e>=0;e--){let[n,r]=t[e];if(on(r))return{key:n,result:r}}}function $t(e){return b({...typeof e==`string`?x(e):e,hash:``})}function en(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===``?t.hash!==``:e.hash===t.hash?!0:t.hash!==``}function tn(e){return new U(e.init?.status??500,e.init?.statusText??`Internal Server Error`,e.data)}function nn(e){return typeof e==`object`&&!!e&&Object.entries(e).every(([e,t])=>typeof e==`string`&&rn(t))}function rn(e){return typeof e==`object`&&!!e&&`type`in e&&`result`in e&&(e.type===`data`||e.type===`error`)}function an(e){return cn(e.result)&&rt.has(e.result.status)}function X(e){return e.type===`error`}function on(e){return(e&&e.type)===`redirect`}function sn(e){return typeof e==`object`&&!!e&&`type`in e&&`data`in e&&`init`in e&&e.type===`DataWithResponseInit`}function cn(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.headers==`object`&&e.body!==void 0}function ln(e){return rt.has(e)}function un(e){return cn(e)&&ln(e.status)&&e.headers.has(`Location`)}function dn(e){return nt.has(e.toUpperCase())}function Z(e){return et.has(e.toUpperCase())}function fn(e){return new URLSearchParams(e).getAll(`index`).some(e=>e===``)}function pn(e,t){let n=typeof t==`string`?x(t).search:t.search;if(e[e.length-1].route.index&&fn(n||``))return e[e.length-1];let r=Te(e);return r[r.length-1]}function mn(e,t,n){return{url:Ie(e.createURL(t),t),pattern:n?Fe(n):``,params:n?.[0]?.params?{...n[0].params}:{}}}function hn(e){let{formMethod:t,formAction:n,formEncType:r,text:i,formData:a,json:o}=e;if(!(!t||!n||!r)){if(i!=null)return{formMethod:t,formAction:n,formEncType:r,formData:void 0,json:void 0,text:i};if(a!=null)return{formMethod:t,formAction:n,formEncType:r,formData:a,json:void 0,text:void 0};if(o!==void 0)return{formMethod:t,formAction:n,formEncType:r,formData:void 0,json:o,text:void 0}}}function gn(e,t,n,r){return r?{state:`loading`,location:e,matches:t,historyAction:n,formMethod:r.formMethod,formAction:r.formAction,formEncType:r.formEncType,formData:r.formData,json:r.json,text:r.text}:{state:`loading`,location:e,matches:t,historyAction:n,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function _n(e,t,n,r){return{state:`submitting`,location:e,matches:t,historyAction:n,formMethod:r.formMethod,formAction:r.formAction,formEncType:r.formEncType,formData:r.formData,json:r.json,text:r.text}}function vn(e,t){return e?{state:`loading`,formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t}:{state:`loading`,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:t}}function yn(e,t){return{state:`submitting`,formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t?t.data:void 0}}function bn(e){return{state:`idle`,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:e}}function xn(e,t){try{let n=e.sessionStorage.getItem(ct);if(n){let e=JSON.parse(n);for(let[n,r]of Object.entries(e||{}))r&&Array.isArray(r)&&t.set(n,new Set(r||[]))}}catch{}}function Sn(e,t){if(t.size>0){let n={};for(let[e,r]of t)n[e]=[...r];try{e.sessionStorage.setItem(ct,JSON.stringify(n))}catch(e){g(!1,`Failed to save applied view transitions in sessionStorage (${e}).`)}}}function Cn(){let e,t,n=new Promise((r,i)=>{e=async e=>{r(e);try{await n}catch{}},t=async e=>{i(e);try{await n}catch{}}});return{promise:n,resolve:e,reject:t}}var wn=n.createContext(null);wn.displayName=`DataRouter`;var Tn=n.createContext(null);Tn.displayName=`DataRouterState`;var En=n.createContext(!1);function Dn(){return n.useContext(En)}var On=n.createContext({isTransitioning:!1});On.displayName=`ViewTransition`;var kn=n.createContext(new Map);kn.displayName=`Fetchers`;var An=n.createContext(null);An.displayName=`Await`;var Q=n.createContext(null);Q.displayName=`Navigation`;var jn=n.createContext(null);jn.displayName=`Location`;var Mn=n.createContext({outlet:null,matches:[],isDataRoute:!1});Mn.displayName=`Route`;var Nn=n.createContext(null);Nn.displayName=`RouteError`;var Pn=`REACT_ROUTER_ERROR`,Fn=`REDIRECT`,In=`ROUTE_ERROR_RESPONSE`;function Ln(e){if(e.startsWith(`${Pn}:${Fn}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function Rn(e){if(e.startsWith(`${Pn}:${In}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new U(t.status,t.statusText,t.data)}catch{}}var zn;function Bn(e,{relative:t}={}){h(Vn(),`useHref() may be used only in the context of a <Router> component.`);let{basename:r,navigator:i}=n.useContext(Q),{hash:a,pathname:o,search:s}=Kn(e,{relative:t}),c=o;return r!==`/`&&(c=o===`/`?r:H([r,o])),i.createHref({pathname:c,search:s,hash:a})}function Vn(){return n.useContext(jn)!=null}function $(){return h(Vn(),`useLocation() may be used only in the context of a <Router> component.`),n.useContext(jn).location}var Hn=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function Un(){let{isDataRoute:e}=n.useContext(Mn);return e?pr():Wn()}function Wn(){h(Vn(),`useNavigate() may be used only in the context of a <Router> component.`);let e=n.useContext(wn),{basename:t,navigator:r}=n.useContext(Q),{matches:i}=n.useContext(Mn),{pathname:a}=$(),o=JSON.stringify(Ee(i)),s=n.useRef(!1);return n.useLayoutEffect(()=>{s.current=!0}),n.useCallback((n,i={})=>{if(g(s.current,Hn),!s.current)return;if(typeof n==`number`){r.go(n);return}let c=De(n,JSON.parse(o),a,i.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:H([t,c.pathname])),(i.replace?r.replace:r.push)(c,i.state,i)},[t,r,o,a,e])}n.createContext(null);function Gn(){let{matches:e}=n.useContext(Mn);return e[e.length-1]?.params??{}}function Kn(e,{relative:t}={}){let{matches:r}=n.useContext(Mn),{pathname:i}=$(),a=JSON.stringify(Ee(r));return n.useMemo(()=>De(e,JSON.parse(a),i,t===`path`),[e,a,i,t])}function qn(e,t){return Jn(e,t)}function Jn(e,t,r){h(Vn(),`useRoutes() may be used only in the context of a <Router> component.`);let{navigator:i}=n.useContext(Q),{matches:a}=n.useContext(Mn),o=a[a.length-1],s=o?o.params:{};o&&o.pathname;let c=o?o.pathnameBase:`/`;o&&o.route;let l=$(),u;if(t){let e=typeof t==`string`?x(t):t;h(c===`/`||e.pathname?.startsWith(c),`When overriding the location using \`<Routes location>\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${c}" but pathname "${e.pathname}" was given in the \`location\` prop.`),u=e}else u=l;let d=u.pathname||`/`,f=d;if(c!==`/`){let e=c.replace(/^\//,``).split(`/`);f=`/`+d.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let p=r&&r.state.matches.length?r.state.matches.map(e=>Object.assign(e,{route:r.manifest[e.route.id]||e.route})):re(e,{pathname:f}),m=tr(p&&p.map(e=>Object.assign({},e,{params:Object.assign({},s,e.params),pathname:H([c,i.encodeLocation?i.encodeLocation(e.pathname.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?c:H([c,i.encodeLocation?i.encodeLocation(e.pathnameBase.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),a,r);return t&&m?n.createElement(jn.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,mask:void 0,...u},navigationType:`POP`}},m):m}function Yn(){let e=ur(),t=Pe(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null;return n.createElement(n.Fragment,null,n.createElement(`h2`,null,`Unexpected Application Error!`),n.createElement(`h3`,{style:{fontStyle:`italic`}},t),r?n.createElement(`pre`,{style:{padding:`0.5rem`,backgroundColor:`rgba(200,200,200, 0.5)`}},r):null,null)}var Xn=n.createElement(Yn,null),Zn=(zn=class extends n.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=Rn(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:n.createElement(Mn.Provider,{value:this.props.routeContext},n.createElement(Nn.Provider,{value:e,children:this.props.component}));return this.context?n.createElement($n,{error:e},t):t}},D(zn,`contextType`,En),zn),Qn=new WeakMap;function $n({children:e,error:t}){let{basename:r}=n.useContext(Q);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=Ln(t.digest);if(e){let i=Qn.get(t);if(i)throw i;let a=Re(e.location,r),o=a.absoluteURL||a.to;if(Vt(o))throw Error(`Invalid redirect location`);if(Le&&!Qn.get(t))if(a.isExternal||e.reloadDocument)window.location.href=o;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(a.to,{replace:e.replace}));throw Qn.set(t,n),n}return n.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${o}`})}}return e}function er({routeContext:e,match:t,children:r}){let i=n.useContext(wn);return i&&i.static&&i.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(i.staticContext._deepestRenderedBoundaryId=t.route.id),n.createElement(Mn.Provider,{value:e},r)}function tr(e,t=[],r){let i=r?.state;if(e==null){if(!i)return null;if(i.errors)e=i.matches;else if(t.length===0&&!i.initialized&&i.matches.length>0)e=i.matches;else return null}let a=e,o=i?.errors;if(o!=null){let e=a.findIndex(e=>e.route.id&&o?.[e.route.id]!==void 0);h(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(o).join(`,`)}`),a=a.slice(0,Math.min(a.length,e+1))}let s=!1,c=-1;if(r&&i){s=i.renderFallback;for(let e=0;e<a.length;e++){let t=a[e];if((t.route.HydrateFallback||t.route.hydrateFallbackElement)&&(c=e),t.route.id){let{loaderData:e,errors:n}=i,o=t.route.loader&&!e.hasOwnProperty(t.route.id)&&(!n||n[t.route.id]===void 0);if(t.route.lazy||o){r.isStatic&&(s=!0),a=c>=0?a.slice(0,c+1):[a[0]];break}}}}let l=r?.onError,u=i&&l?(e,t)=>{l(e,{location:i.location,params:i.matches?.[0]?.params??{},pattern:Fe(i.matches),errorInfo:t})}:void 0;return a.reduceRight((e,r,l)=>{let d,f=!1,p=null,m=null;i&&(d=o&&r.route.id?o[r.route.id]:void 0,p=r.route.errorElement||Xn,s&&(c<0&&l===0?(hr(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),f=!0,m=null):c===l&&(f=!0,m=r.route.hydrateFallbackElement||null)));let h=t.concat(a.slice(0,l+1)),g=()=>{let t;return t=d?p:f?m:r.route.Component?n.createElement(r.route.Component,null):r.route.element?r.route.element:e,n.createElement(er,{match:r,routeContext:{outlet:e,matches:h,isDataRoute:i!=null},children:t})};return i&&(r.route.ErrorBoundary||r.route.errorElement||l===0)?n.createElement(Zn,{location:i.location,revalidation:i.revalidation,component:p,error:d,children:g(),routeContext:{outlet:null,matches:h,isDataRoute:!0},onError:u}):g()},null)}function nr(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function rr(e){let t=n.useContext(wn);return h(t,nr(e)),t}function ir(e){let t=n.useContext(Tn);return h(t,nr(e)),t}function ar(e){let t=n.useContext(Mn);return h(t,nr(e)),t}function or(e){let t=ar(e),n=t.matches[t.matches.length-1];return h(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function sr(){return or(`useRouteId`)}function cr(){let e=ir(`useNavigation`);return n.useMemo(()=>{let{matches:t,historyAction:n,...r}=e.navigation;return r},[e.navigation])}function lr(){let{matches:e,loaderData:t}=ir(`useMatches`);return n.useMemo(()=>e.map(e=>ae(e,t)),[e,t])}function ur(){let e=n.useContext(Nn),t=ir(`useRouteError`),r=or(`useRouteError`);return e===void 0?t.errors?.[r]:e}var dr=0;function fr(e){let{router:t,basename:r}=rr(`useBlocker`),i=ir(`useBlocker`),[a,o]=n.useState(``),s=n.useCallback(t=>{if(typeof e!=`function`)return!!e;if(r===`/`)return e(t);let{currentLocation:n,nextLocation:i,historyAction:a}=t;return e({currentLocation:{...n,pathname:V(n.pathname,r)||n.pathname},nextLocation:{...i,pathname:V(i.pathname,r)||i.pathname},historyAction:a})},[r,e]);return n.useEffect(()=>{let e=String(++dr);return o(e),()=>t.deleteBlocker(e)},[t]),n.useEffect(()=>{a!==``&&t.getBlocker(a,s)},[t,a,s]),a&&i.blockers.has(a)?i.blockers.get(a):st}function pr(){let{router:e}=rr(`useNavigate`),t=or(`useNavigate`),r=n.useRef(!1);return n.useLayoutEffect(()=>{r.current=!0}),n.useCallback(async(n,i={})=>{g(r.current,Hn),r.current&&(typeof n==`number`?await e.navigate(n):await e.navigate(n,{fromRouteId:t,...i}))},[e,t])}var mr={};function hr(e,t,n){!t&&!mr[e]&&(mr[e]=!0,g(!1,n))}var gr={};function _r(e,t){!e&&!gr[t]&&(gr[t]=!0,console.warn(t))}var vr=[`HydrateFallback`,`hydrateFallbackElement`],yr=class{constructor(){D(this,`status`,`pending`),D(this,`promise`,void 0),D(this,`resolve`,void 0),D(this,`reject`,void 0),this.promise=new Promise((e,t)=>{this.resolve=t=>{this.status===`pending`&&(this.status=`resolved`,e(t))},this.reject=e=>{this.status===`pending`&&(this.status=`rejected`,t(e))}})}};function br({router:e,flushSync:t,onError:r,useTransitions:i}){i=Dn()||i;let[a,o]=n.useState(e.state),[s,c]=(0,n.useOptimistic)(a),[l,u]=n.useState(),[d,f]=n.useState({isTransitioning:!1}),[p,m]=n.useState(),[h,g]=n.useState(),[_,v]=n.useState(),y=n.useRef(new Map),b=n.useCallback((a,{deletedFetchers:s,newErrors:l,flushSync:d,viewTransitionOpts:_})=>{l&&r&&Object.values(l).forEach(e=>r(e,{location:a.location,params:a.matches[0]?.params??{},pattern:Fe(a.matches)})),a.fetchers.forEach((e,t)=>{e.data!==void 0&&y.current.set(t,e.data)}),s.forEach(e=>y.current.delete(e)),_r(d===!1||t!=null,'You provided the `flushSync` option to a router update, but you are not using the `<RouterProvider>` from `react-router/dom` so `ReactDOM.flushSync()` is unavailable. Please update your app to `import { RouterProvider } from "react-router/dom"` and ensure you have `react-dom` installed as a dependency to use the `flushSync` option.');let b=e.window!=null&&e.window.document!=null&&typeof e.window.document.startViewTransition==`function`;if(_r(_==null||b,"You provided the `viewTransition` option to a router update, but you do not appear to be running in a DOM environment as `window.startViewTransition` is not available."),!_||!b){t&&d?t(()=>o(a)):i===!1?o(a):n.startTransition(()=>{i===!0&&c(e=>xr(e,a)),o(a)});return}if(t&&d){t(()=>{h&&(p?.resolve(),h.skipTransition()),f({isTransitioning:!0,flushSync:!0,currentLocation:_.currentLocation,nextLocation:_.nextLocation})});let n=e.window.document.startViewTransition(()=>{t(()=>o(a))});n.finished.finally(()=>{t(()=>{m(void 0),g(void 0),u(void 0),f({isTransitioning:!1})})}),t(()=>g(n));return}h?(p?.resolve(),h.skipTransition(),v({state:a,currentLocation:_.currentLocation,nextLocation:_.nextLocation})):(u(a),f({isTransitioning:!0,flushSync:!1,currentLocation:_.currentLocation,nextLocation:_.nextLocation}))},[e.window,t,h,p,i,c,r]);n.useLayoutEffect(()=>e.subscribe(b),[e,b]),n.useEffect(()=>{d.isTransitioning&&!d.flushSync&&m(new yr)},[d]),n.useEffect(()=>{if(p&&l&&e.window){let t=l,r=p.promise,a=e.window.document.startViewTransition(async()=>{i===!1?o(t):n.startTransition(()=>{i===!0&&c(e=>xr(e,t)),o(t)}),await r});a.finished.finally(()=>{m(void 0),g(void 0),u(void 0),f({isTransitioning:!1})}),g(a)}},[l,p,e.window,i,c]),n.useEffect(()=>{p&&l&&s.location.key===l.location.key&&p.resolve()},[p,h,s.location,l]),n.useEffect(()=>{!d.isTransitioning&&_&&(u(_.state),f({isTransitioning:!0,flushSync:!1,currentLocation:_.currentLocation,nextLocation:_.nextLocation}),v(void 0))},[d.isTransitioning,_]);let x=n.useMemo(()=>({createHref:e.createHref,encodeLocation:e.encodeLocation,go:t=>e.navigate(t),push:(t,n,r)=>e.navigate(t,{state:n,preventScrollReset:r?.preventScrollReset}),replace:(t,n,r)=>e.navigate(t,{replace:!0,state:n,preventScrollReset:r?.preventScrollReset})}),[e]),S=e.basename||`/`,C=n.useMemo(()=>({router:e,navigator:x,static:!1,basename:S,onError:r}),[e,x,S,r]);return n.createElement(n.Fragment,null,n.createElement(wn.Provider,{value:C},n.createElement(Tn.Provider,{value:s},n.createElement(kn.Provider,{value:y.current},n.createElement(On.Provider,{value:d},n.createElement(Er,{basename:S,location:s.location,navigationType:s.historyAction,navigator:x,useTransitions:i},n.createElement(Sr,{routes:e.routes,manifest:e.manifest,future:e.future,state:s,isStatic:!1,onError:r})))))),null)}function xr(e,t){return{...e,navigation:t.navigation.state===`idle`?e.navigation:t.navigation,revalidation:t.revalidation===`idle`?e.revalidation:t.revalidation,actionData:t.navigation.state===`submitting`?e.actionData:t.actionData,fetchers:t.fetchers}}var Sr=n.memo(Cr);function Cr({routes:e,manifest:t,future:n,state:r,isStatic:i,onError:a}){return Jn(e,void 0,{manifest:t,state:r,isStatic:i,onError:a,future:n})}function wr({to:e,replace:t,state:r,relative:i}){h(Vn(),`<Navigate> may be used only in the context of a <Router> component.`);let{static:a}=n.useContext(Q);g(!a,`<Navigate> must not be used on the initial render in a <StaticRouter>. This is a no-op, but you should modify your code so the <Navigate> is only ever rendered in response to some user interaction or state change.`);let{matches:o}=n.useContext(Mn),{pathname:s}=$(),c=Un(),l=De(e,Ee(o),s,i===`path`),u=JSON.stringify(l);return n.useEffect(()=>{c(JSON.parse(u),{replace:t,state:r,relative:i})},[c,u,i,t,r]),null}function Tr(e){h(!1,`A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>.`)}function Er({basename:e=`/`,children:t=null,location:r,navigationType:i=`POP`,navigator:a,static:o=!1,useTransitions:s}){h(!Vn(),`You cannot render a <Router> inside another <Router>. You should never have more than one in your app.`);let c=e.replace(/^\/*/,`/`),l=n.useMemo(()=>({basename:c,navigator:a,static:o,useTransitions:s,future:{}}),[c,a,o,s]);typeof r==`string`&&(r=x(r));let{pathname:u=`/`,search:d=``,hash:f=``,state:p=null,key:m=`default`,mask:_}=r,v=n.useMemo(()=>{let e=V(u,c);return e==null?null:{location:{pathname:e,search:d,hash:f,state:p,key:m,mask:_},navigationType:i}},[c,u,d,f,p,m,i,_]);return g(v!=null,`<Router basename="${c}"> is not able to match the URL "${u}${d}${f}" because it does not start with the basename, so the <Router> won't render anything.`),v==null?null:n.createElement(Q.Provider,{value:l},n.createElement(jn.Provider,{children:t,value:v}))}function Dr({children:e,location:t}){return qn(Or(e),t)}n.Component;function Or(e,t=[]){let r=[];return n.Children.forEach(e,(e,i)=>{if(!n.isValidElement(e))return;let a=[...t,i];if(e.type===n.Fragment){r.push.apply(r,Or(e.props.children,a));return}h(e.type===Tr,`[${typeof e.type==`string`?e.type:e.type.name}] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`);let o=e.props;h(!o.index||!o.children,`An index route cannot have child routes.`);let s={id:o.id||a.join(`-`),caseSensitive:o.caseSensitive,element:o.element,Component:o.Component,index:o.index,path:o.path,middleware:o.middleware,loader:o.loader,action:o.action,hydrateFallbackElement:o.hydrateFallbackElement,HydrateFallback:o.HydrateFallback,errorElement:o.errorElement,ErrorBoundary:o.ErrorBoundary,shouldRevalidate:o.shouldRevalidate,handle:o.handle,lazy:o.lazy};o.children&&(s.children=Or(o.children,a)),r.push(s)}),r}var kr=`application/x-www-form-urlencoded`;function Ar(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function jr(e){return Ar(e)&&e.tagName.toLowerCase()===`button`}function Mr(e){return Ar(e)&&e.tagName.toLowerCase()===`form`}function Nr(e){return Ar(e)&&e.tagName.toLowerCase()===`input`}function Pr(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Fr(e,t){return e.button===0&&(!t||t===`_self`)&&!Pr(e)}var Ir=null;function Lr(){if(Ir===null)try{new FormData(document.createElement(`form`),0),Ir=!1}catch{Ir=!0}return Ir}var Rr=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]);function zr(e){return e!=null&&!Rr.has(e)?(g(!1,`"${e}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${kr}"`),null):e}function Br(e,t){let n,r,i,a,o;if(Mr(e)){let o=e.getAttribute(`action`);r=o?V(o,t):null,n=e.getAttribute(`method`)||`get`,i=zr(e.getAttribute(`enctype`))||kr,a=new FormData(e)}else if(jr(e)||Nr(e)&&(e.type===`submit`||e.type===`image`)){let o=e.form;if(o==null)throw Error(`Cannot submit a <button> or <input type="submit"> without a <form>`);let s=e.getAttribute(`formaction`)||o.getAttribute(`action`);if(r=s?V(s,t):null,n=e.getAttribute(`formmethod`)||o.getAttribute(`method`)||`get`,i=zr(e.getAttribute(`formenctype`))||zr(o.getAttribute(`enctype`))||kr,a=new FormData(o,e),!Lr()){let{name:t,type:n,value:r}=e;if(n===`image`){let e=t?`${t}.`:``;a.append(`${e}x`,`0`),a.append(`${e}y`,`0`)}else t&&a.append(t,r)}}else if(Ar(e))throw Error(`Cannot submit element that is not <form>, <button>, or <input type="submit|image">`);else n=`get`,r=null,i=kr,o=e;return a&&i===`text/plain`&&(o=a,a=void 0),{action:r,method:n.toLowerCase(),encType:i,formData:a,body:o}}var Vr={"&":`\\u0026`,">":`\\u003e`,"<":`\\u003c`,"\u2028":`\\u2028`,"\u2029":`\\u2029`},Hr=/[&><\u2028\u2029]/g;function Ur(e){return e.replace(Hr,e=>Vr[e])}function Wr(e,t){if(e===!1||e==null)throw Error(t)}var Gr=`modulepreload`,Kr=function(e){return`/`+e},qr={},Jr=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,new URL(`../../../src/node/plugins/importAnalysisBuild.ts`,import.meta.url)).href}r=o(t.map(t=>{if(t=Kr(t,n),t=s(t),t in qr)return;qr[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:Gr,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};async function Yr(e,t){if(e.id in t)return t[e.id];try{let n=await Jr(()=>import(e.module),[]);return t[e.id]=n,n}catch(t){return console.error(`Error loading route module \`${e.module}\`, reloading page...`),console.error(t),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}function Xr(e){return e!=null&&typeof e.page==`string`}function Zr(e){return e==null?!1:e.href==null?e.rel===`preload`&&typeof e.imageSrcSet==`string`&&typeof e.imageSizes==`string`:typeof e.rel==`string`&&typeof e.href==`string`}async function Qr(e,t,n){return ri((await Promise.all(e.map(async e=>{let r=t.routes[e.route.id];if(r){let e=await Yr(r,n);return e.links?e.links():[]}return[]}))).flat(1).filter(Zr).filter(e=>e.rel===`stylesheet`||e.rel===`preload`).map(e=>e.rel===`stylesheet`?{...e,rel:`prefetch`,as:`style`}:{...e,rel:`prefetch`}))}function $r(e,t,n,r,i,a){let o=(e,t)=>n[t]?e.route.id!==n[t].route.id:!0,s=(e,t)=>n[t].pathname!==e.pathname||n[t].route.path?.endsWith(`*`)&&n[t].params[`*`]!==e.params[`*`];return a===`assets`?t.filter((e,t)=>o(e,t)||s(e,t)):a===`data`?t.filter((t,a)=>{let c=r.routes[t.route.id];if(!c||!c.hasLoader)return!1;if(o(t,a)||s(t,a))return!0;if(t.route.shouldRevalidate){let r=t.route.shouldRevalidate({currentUrl:new URL(i.pathname+i.search+i.hash,window.origin),currentParams:n[0]?.params||{},nextUrl:new URL(e,window.origin),nextParams:t.params,defaultShouldRevalidate:!0});if(typeof r==`boolean`)return r}return!0}):[]}function ei(e,t,{includeHydrateFallback:n}={}){return ti(e.map(e=>{let r=t.routes[e.route.id];if(!r)return[];let i=[r.module];return r.clientActionModule&&(i=i.concat(r.clientActionModule)),r.clientLoaderModule&&(i=i.concat(r.clientLoaderModule)),n&&r.hydrateFallbackModule&&(i=i.concat(r.hydrateFallbackModule)),r.imports&&(i=i.concat(r.imports)),i}).flat(1))}function ti(e){return[...new Set(e)]}function ni(e){let t={},n=Object.keys(e).sort();for(let r of n)t[r]=e[r];return t}function ri(e,t){let n=new Set,r=new Set(t);return e.reduce((e,i)=>{if(t&&!Xr(i)&&i.as===`script`&&i.href&&r.has(i.href))return e;let a=JSON.stringify(ni(i));return n.has(a)||(n.add(a),e.push({key:a,link:i})),e},[])}function ii(e,t){let n=typeof e==`string`?new URL(e,typeof window>`u`?`server://singlefetch/`:window.location.origin):e;return n.pathname.endsWith(`/`)?n.pathname=`${n.pathname}_.${t}`:n.pathname=`${n.pathname}.${t}`,n}function ai(){let e=n.useContext(wn);return Wr(e,`You must render this element inside a <DataRouterContext.Provider> element`),e}function oi(){let e=n.useContext(Tn);return Wr(e,`You must render this element inside a <DataRouterStateContext.Provider> element`),e}var si=n.createContext(void 0);si.displayName=`FrameworkContext`;function ci(){let e=n.useContext(si);return Wr(e,`You must render this element inside a <HydratedRouter> element`),e}function li(e,t){let r=n.useContext(si),[i,a]=n.useState(!1),[o,s]=n.useState(!1),{onFocus:c,onBlur:l,onMouseEnter:u,onMouseLeave:d,onTouchStart:f}=t,p=n.useRef(null);n.useEffect(()=>{if(e===`render`&&s(!0),e===`viewport`){let e=new IntersectionObserver(e=>{e.forEach(e=>{s(e.isIntersecting)})},{threshold:.5});return p.current&&e.observe(p.current),()=>{e.disconnect()}}},[e]),n.useEffect(()=>{if(i){let e=setTimeout(()=>{s(!0)},100);return()=>{clearTimeout(e)}}},[i]);let m=()=>{a(!0)},h=()=>{a(!1),s(!1)};return r?e===`intent`?[o,p,{onFocus:ui(c,m),onBlur:ui(l,h),onMouseEnter:ui(u,m),onMouseLeave:ui(d,h),onTouchStart:ui(f,m)}]:[o,p,{}]:[!1,p,{}]}function ui(e,t){return n=>{e&&e(n),n.defaultPrevented||t(n)}}function di({page:e,...t}){let r=Dn(),{nonce:i}=ci(),{router:a}=ai(),o=n.useMemo(()=>re(a.routes,e,a.basename),[a.routes,e,a.basename]);return o?(t.nonce==null&&i&&(t={...t,nonce:i}),r?n.createElement(pi,{page:e,matches:o,...t}):n.createElement(mi,{page:e,matches:o,...t})):null}function fi(e){let{manifest:t,routeModules:r}=ci(),[i,a]=n.useState([]);return n.useEffect(()=>{let n=!1;return Qr(e,t,r).then(e=>{n||a(e)}),()=>{n=!0}},[e,t,r]),i}function pi({page:e,matches:t,...r}){let i=$(),a=n.useMemo(()=>{if(e===i.pathname+i.search+i.hash)return[];let n=ii(e,`rsc`),r=!1,a=[];for(let e of t)typeof e.route.shouldRevalidate==`function`?r=!0:a.push(e.route.id);return r&&a.length>0&&n.searchParams.set(`_routes`,a.join(`,`)),[n.pathname+n.search]},[e,i,t]);return n.createElement(n.Fragment,null,a.map(e=>n.createElement(`link`,{key:e,rel:`prefetch`,as:`fetch`,href:e,...r})))}function mi({page:e,matches:t,...r}){let i=$(),{manifest:a,routeModules:o}=ci(),{loaderData:s,matches:c}=oi(),l=n.useMemo(()=>$r(e,t,c,a,i,`data`),[e,t,c,a,i]),u=n.useMemo(()=>$r(e,t,c,a,i,`assets`),[e,t,c,a,i]),d=n.useMemo(()=>{if(e===i.pathname+i.search+i.hash)return[];let n=new Set,r=!1;if(t.forEach(e=>{let t=a.routes[e.route.id];!t||!t.hasLoader||(!l.some(t=>t.route.id===e.route.id)&&e.route.id in s&&o[e.route.id]?.shouldRevalidate||t.hasClientLoader?r=!0:n.add(e.route.id))}),n.size===0)return[];let c=ii(e,`data`);return r&&n.size>0&&c.searchParams.set(`_routes`,t.filter(e=>n.has(e.route.id)).map(e=>e.route.id).join(`,`)),[c.pathname+c.search]},[s,i,a,l,t,e,o]),f=n.useMemo(()=>ei(u,a),[u,a]),p=fi(u);return n.createElement(n.Fragment,null,d.map(e=>n.createElement(`link`,{key:e,rel:`prefetch`,as:`fetch`,href:e,...r})),f.map(e=>n.createElement(`link`,{key:e,rel:`modulepreload`,href:e,...r})),p.map(({key:e,link:t})=>n.createElement(`link`,{key:e,nonce:r.nonce,...t,crossOrigin:t.crossOrigin??r.crossOrigin})))}function hi(...e){return t=>{e.forEach(e=>{typeof e==`function`?e(t):e!=null&&(e.current=t)})}}var gi=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;try{gi&&(window.__reactRouterVersion=`8.3.0`)}catch{}function _i(e,t){return dt({basename:t?.basename,getContext:t?.getContext,future:t?.future,history:p({window:t?.window}),hydrationData:t?.hydrationData||yi(),routes:e,mapRouteProperties:P,hydrationRouteProperties:vr,dataStrategy:t?.dataStrategy,patchRoutesOnNavigation:t?.patchRoutesOnNavigation,window:t?.window,instrumentations:t?.instrumentations}).initialize()}function vi(e,t){return dt({basename:t?.basename,getContext:t?.getContext,future:t?.future,history:m({window:t?.window}),hydrationData:t?.hydrationData||yi(),routes:e,mapRouteProperties:P,hydrationRouteProperties:vr,dataStrategy:t?.dataStrategy,patchRoutesOnNavigation:t?.patchRoutesOnNavigation,window:t?.window,instrumentations:t?.instrumentations}).initialize()}function yi(){let e=window?.__staticRouterHydrationData;return e&&e.errors&&(e={...e,errors:bi(e.errors)}),e}function bi(e){if(!e)return null;let t=Object.entries(e),n={};for(let[e,r]of t)if(r&&r.__type===`RouteErrorResponse`)n[e]=new U(r.status,r.statusText,r.data,r.internal===!0);else if(r&&r.__type===`Error`){if(typeof r.__subType==`string`&&Ne.includes(r.__subType)){let t=window[r.__subType];if(typeof t==`function`)try{let i=new t(r.message);i.stack=``,n[e]=i}catch{}}if(n[e]==null){let t=Error(r.message);t.stack=``,n[e]=t}}else n[e]=r;return n}function xi({basename:e,children:t,history:r,useTransitions:i}){let[a,o]=n.useState({action:r.action,location:r.location}),s=n.useCallback(e=>{i===!1?o(e):n.startTransition(()=>o(e))},[i]);return n.useLayoutEffect(()=>r.listen(s),[r,s]),n.createElement(Er,{basename:e,children:t,location:a.location,navigationType:a.action,navigator:r,useTransitions:i})}xi.displayName=`unstable_HistoryRouter`;var Si=n.forwardRef(function({onClick:e,discover:t=`render`,prefetch:r=`none`,relative:i,reloadDocument:a,replace:o,mask:s,state:l,target:u,to:d,preventScrollReset:f,viewTransition:p,defaultShouldRevalidate:m,...h},g){let{basename:_,navigator:v,useTransitions:y}=n.useContext(Q),b=typeof d==`string`&&c.test(d),x=Re(d,_);d=x.to;let S=Bn(d,{relative:i}),C=$(),w=null;if(s){let e=De(s,[],C.mask?C.mask.pathname:`/`,!0);_!==`/`&&(e.pathname=e.pathname===`/`?_:H([_,e.pathname])),w=v.createHref(e)}let[T,E,D]=li(r,h),O=ki(d,{replace:o,mask:s,state:l,target:u,preventScrollReset:f,relative:i,viewTransition:p,defaultShouldRevalidate:m,useTransitions:y});function k(t){e&&e(t),t.defaultPrevented||O(t)}let A=!(x.isExternal||a),j=n.createElement(`a`,{...h,...D,href:(A?w:void 0)||x.absoluteURL||S,onClick:A?k:e,ref:hi(g,E),target:u,"data-discover":!b&&t===`render`?`true`:void 0});return T&&!b?n.createElement(n.Fragment,null,j,n.createElement(di,{page:S})):j});Si.displayName=`Link`;var Ci=n.forwardRef(function({"aria-current":e=`page`,caseSensitive:t=!1,className:r=``,end:i=!1,style:a,to:o,viewTransition:s,children:c,...l},u){let d=Kn(o,{relative:l.relative}),f=$(),p=n.useContext(Tn),{navigator:m,basename:h}=n.useContext(Q),g=p!=null&&zi(d)&&s===!0,_=m.encodeLocation?m.encodeLocation(d).pathname:d.pathname,v=f.pathname,y=p&&p.navigation&&p.navigation.location?p.navigation.location.pathname:null;t||(v=v.toLowerCase(),y=y?y.toLowerCase():null,_=_.toLowerCase()),y&&h&&(y=V(y,h)||y);let b=_!==`/`&&_.endsWith(`/`)?_.length-1:_.length,x=v===_||!i&&v.startsWith(_)&&v.charAt(b)===`/`,S=y!=null&&(y===_||!i&&y.startsWith(_)&&y.charAt(b)===`/`),C={isActive:x,isPending:S,isTransitioning:g},w=x?e:void 0,T;T=typeof r==`function`?r(C):[r,x?`active`:null,S?`pending`:null,g?`transitioning`:null].filter(Boolean).join(` `);let E=typeof a==`function`?a(C):a;return n.createElement(Si,{...l,"aria-current":w,className:T,ref:u,style:E,to:o,viewTransition:s},typeof c==`function`?c(C):c)});Ci.displayName=`NavLink`;var wi=n.forwardRef(({discover:e=`render`,fetcherKey:t,navigate:r,reloadDocument:i,replace:a,state:o,method:s=`get`,action:l,onSubmit:u,relative:d,preventScrollReset:f,viewTransition:p,defaultShouldRevalidate:m,...h},g)=>{let{useTransitions:_}=n.useContext(Q),v=Mi(),y=Ni(l,{relative:d}),b=s.toLowerCase()===`get`?`get`:`post`,x=typeof l==`string`&&c.test(l);return n.createElement(`form`,{ref:g,method:b,action:y,onSubmit:i?u:e=>{if(u&&u(e),e.defaultPrevented)return;e.preventDefault();let i=e.nativeEvent.submitter,c=i?.getAttribute(`formmethod`)||s,l=()=>v(i||e.currentTarget,{fetcherKey:t,method:c,navigate:r,replace:a,state:o,relative:d,preventScrollReset:f,viewTransition:p,defaultShouldRevalidate:m});_&&r!==!1?n.startTransition(()=>l()):l()},...h,"data-discover":!x&&e===`render`?`true`:void 0})});wi.displayName=`Form`;function Ti({getKey:e,storageKey:t,...r}){let i=n.useContext(si),{basename:a}=n.useContext(Q),o=$(),s=lr();Li({getKey:e,storageKey:t});let c=n.useMemo(()=>{if(!i||!e)return null;let t=Ii(o,s,a,e);return t===o.key?null:t},[]);if(!i||i.isSpaMode)return null;let l=((e,t)=>{if(!window.history.state||!window.history.state.key){let e=Math.random().toString(32).slice(2);window.history.replaceState({key:e},``)}try{let n=JSON.parse(sessionStorage.getItem(e)||`{}`)[t||window.history.state.key];typeof n==`number`&&window.scrollTo(0,n)}catch(t){console.error(t),sessionStorage.removeItem(e)}}).toString();return r.nonce==null&&i?.nonce&&(r.nonce=i.nonce),n.createElement(`script`,{...r,suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:`(${l})(${Ur(JSON.stringify(t||Pi))}, ${Ur(JSON.stringify(c))})`}})}Ti.displayName=`ScrollRestoration`;function Ei(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Di(e){let t=n.useContext(wn);return h(t,Ei(e)),t}function Oi(e){let t=n.useContext(Tn);return h(t,Ei(e)),t}function ki(e,{target:t,replace:r,mask:i,state:a,preventScrollReset:o,relative:s,viewTransition:c,defaultShouldRevalidate:l,useTransitions:u}={}){let d=Un(),f=$(),p=Kn(e,{relative:s});return n.useCallback(m=>{if(Fr(m,t)){m.preventDefault();let t=r===void 0?b(f)===b(p):r,h=()=>d(e,{replace:t,mask:i,state:a,preventScrollReset:o,relative:s,viewTransition:c,defaultShouldRevalidate:l});u?n.startTransition(()=>h()):h()}},[f,d,p,r,i,a,t,e,o,s,c,l,u])}var Ai=0,ji=()=>`__${String(++Ai)}__`;function Mi(){let{router:e}=Di(`useSubmit`),{basename:t}=n.useContext(Q),r=sr(),i=e.fetch,a=e.navigate;return n.useCallback(async(e,n={})=>{let{action:o,method:s,encType:c,formData:l,body:u}=Br(e,t);n.navigate===!1?await i(n.fetcherKey||ji(),r,n.action||o,{defaultShouldRevalidate:n.defaultShouldRevalidate,preventScrollReset:n.preventScrollReset,formData:l,body:u,formMethod:n.method||s,formEncType:n.encType||c,flushSync:n.flushSync}):await a(n.action||o,{defaultShouldRevalidate:n.defaultShouldRevalidate,preventScrollReset:n.preventScrollReset,formData:l,body:u,formMethod:n.method||s,formEncType:n.encType||c,replace:n.replace,state:n.state,fromRouteId:r,flushSync:n.flushSync,viewTransition:n.viewTransition})},[i,a,t,r])}function Ni(e,{relative:t}={}){let{basename:r}=n.useContext(Q),i=n.useContext(Mn);h(i,`useFormAction must be used inside a RouteContext`);let[a]=i.matches.slice(-1),o={...Kn(e||`.`,{relative:t})},s=$();if(e==null){o.search=s.search;let e=new URLSearchParams(o.search),t=e.getAll(`index`);if(t.some(e=>e===``)){e.delete(`index`),t.filter(e=>e).forEach(t=>e.append(`index`,t));let n=e.toString();o.search=n?`?${n}`:``}}return(!e||e===`.`)&&a.route.index&&(o.search=o.search?o.search.replace(/^\?/,`?index&`):`?index`),r!==`/`&&(o.pathname=o.pathname===`/`?r:H([r,o.pathname])),b(o)}var Pi=`react-router-scroll-positions`,Fi={};function Ii(e,t,n,r){let i=null;return r&&(i=r(n===`/`?e:{...e,pathname:V(e.pathname,n)||e.pathname},t)),i??(i=e.key),i}function Li({getKey:e,storageKey:t}={}){let{router:r}=Di(`useScrollRestoration`),{restoreScrollPosition:i,preventScrollReset:a}=Oi(`useScrollRestoration`),{basename:o}=n.useContext(Q),s=$(),c=lr(),l=cr();n.useEffect(()=>(window.history.scrollRestoration=`manual`,()=>{window.history.scrollRestoration=`auto`}),[]),Ri(n.useCallback(()=>{if(l.state===`idle`){let t=Ii(s,c,o,e);Fi[t]=window.scrollY}try{sessionStorage.setItem(t||Pi,JSON.stringify(Fi))}catch(e){g(!1,`Failed to save scroll positions in sessionStorage, <ScrollRestoration /> will not work properly (${e}).`)}window.history.scrollRestoration=`auto`},[l.state,e,o,s,c,t])),typeof document<`u`&&(n.useLayoutEffect(()=>{try{let e=sessionStorage.getItem(t||Pi);e&&(Fi=JSON.parse(e))}catch{}},[t]),n.useLayoutEffect(()=>{let t=r?.enableScrollRestoration(Fi,()=>window.scrollY,e?(t,n)=>Ii(t,n,o,e):void 0);return()=>t&&t()},[r,o,e]),n.useLayoutEffect(()=>{if(i!==!1){if(typeof i==`number`){window.scrollTo(0,i);return}try{if(s.hash){let e=document.getElementById(decodeURIComponent(s.hash.slice(1)));if(e){e.scrollIntoView();return}}}catch{g(!1,`"${s.hash.slice(1)}" is not a decodable element ID. The view will not scroll to it.`)}a!==!0&&window.scrollTo(0,0)}},[s,i,a]))}function Ri(e,t){let{capture:r}=t||{};n.useEffect(()=>{let t=r==null?void 0:{capture:r};return window.addEventListener(`pagehide`,e,t),()=>{window.removeEventListener(`pagehide`,e,t)}},[e,r])}function zi(e,{relative:t}={}){let r=n.useContext(On);h(r!=null,"`useViewTransitionState` must be used within `react-router/dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:i}=Di(`useViewTransitionState`),a=Kn(e,{relative:t});if(!r.isTransitioning)return!1;let o=V(r.currentLocation.pathname,i)||r.currentLocation.pathname,s=V(r.nextLocation.pathname,i)||r.nextLocation.pathname;return _e(a.pathname,s)!=null||_e(a.pathname,o)!=null}export{i as _,wr as a,Dr as c,Un as d,Gn as f,a as g,o as h,Jr as i,fr as l,s as m,_i as n,Tr as o,D as p,vi as r,br as s,Si as t,$ as u,r as v};
@@ -1,2 +0,0 @@
1
- var e={common:{loading:`Загрузка...`,save:`Сохранить`,saving:`Сохранение...`,cancel:`Отмена`,delete:`Удалить`,edit:`Редактировать`,close:`Закрыть`,back:`Назад`,next:`Далее`,confirm:`Подтвердить`,error:`Ошибка`,success:`Успешно`,warning:`Предупреждение`,or:`или`,optional:`необязательно`,enabled:`Включено`,disabled:`Отключено`,on:`Вкл`,off:`Выкл`,yes:`Да`,no:`Нет`,search:`Поиск`,noResults:`Ничего не найдено`,retry:`Повторить`,refresh:`Обновить`,download:`Скачать`,upload:`Загрузить`,export:`Экспорт`,import:`Импорт`,reset:`Сбросить`,apply:`Применить`,clear:`Очистить`,all:`Все`,none:`Нет`,default:`По умолчанию`,custom:`Пользовательский`,remove:`Удалить`},brand:{name:`Libre WebUI`,shortName:`Libre`},auth:{login:{title:`С возвращением`,subtitle:`Войдите в свой аккаунт, чтобы продолжить`,username:`Имя пользователя`,usernamePlaceholder:`Введите имя пользователя`,password:`Пароль`,passwordPlaceholder:`Введите пароль`,signIn:`Войти`,signingIn:`Вход...`,noAccount:`Нет аккаунта?`,signUpHere:`Зарегистрируйтесь здесь`,loginSuccess:`Вход выполнен успешно!`,loginFailed:`Ошибка входа`,checkCredentials:`Ошибка входа. Проверьте учётные данные.`,enterBoth:`Пожалуйста, введите имя пользователя и пароль`,githubSuccess:`Вход через GitHub выполнен успешно!`,githubFailed:`Ошибка аутентификации GitHub`,githubVerifyFailed:`Не удалось проверить аутентификацию GitHub`},signup:{title:`Создать аккаунт`,subtitle:`Зарегистрируйте новый аккаунт`,username:`Имя пользователя`,usernamePlaceholder:`Выберите имя пользователя`,email:`Эл. почта`,emailPlaceholder:`ваш@email.com`,password:`Пароль`,passwordPlaceholder:`Выберите пароль`,confirmPassword:`Подтвердите пароль`,confirmPasswordPlaceholder:`Подтвердите ваш пароль`,createAccount:`Создать аккаунт`,creatingAccount:`Создание аккаунта...`,hasAccount:`Уже есть аккаунт?`,signInHere:`Войдите здесь`,signupSuccess:`Аккаунт успешно создан!`,signupFailed:`Ошибка регистрации`,tryAgain:`Ошибка регистрации. Попробуйте снова.`,usernameRequired:`Имя пользователя и пароль обязательны`,passwordMismatch:`Пароли не совпадают`,passwordTooShort:`Пароль должен содержать не менее 6 символов`},logout:{button:`Выйти`,success:`Выход выполнен успешно`},oauth:{continueWith:`Продолжить через {{provider}}`,connectingTo:`Подключение к {{provider}}...`,github:`GitHub`,huggingFace:`Hugging Face`},checkingAuth:`Проверка аутентификации...`,welcome:`Добро пожаловать`,noEmail:`Email не указан`,role:`Роль`,id:`ID`,userId:`ID пользователя`,signInDescription:`Войдите с помощью учётной записи GitHub, чтобы продолжить`,signInWithGitHub:`Войти через GitHub`,jwtActive:`JWT-аутентификация активна`,jwtDescription:`JWT-аутентификация с GitHub OAuth`,github:`GitHub`,provider:`Провайдер`},setup:{welcome:{title:`Добро пожаловать в Libre WebUI`,subtitle:`Давайте начнём`,description:`Настройте ваш экземпляр Libre WebUI за несколько шагов`,createAdmin:`Создать аккаунт администратора`,features:{secure:{title:`Безопасность и конфиденциальность`,description:`Ваши разговоры остаются на вашем устройстве`},fast:{title:`Быстрый и отзывчивый`,description:`Оптимизирован для скорости и производительности`},openSource:{title:`Открытый исходный код`,description:`Бесплатное программное обеспечение с открытым исходным кодом`}}},admin:{title:`Создать аккаунт администратора`,subtitle:`Настройка администратора`,description:`Создайте первый аккаунт администратора для вашего экземпляра Libre WebUI`,usernamePlaceholder:`Введите имя администратора`,passwordPlaceholder:`Введите пароль (мин. 6 символов)`,confirmPlaceholder:`Подтвердите пароль`,creating:`Создание...`,createAdmin:`Создать администратора`,success:`Аккаунт администратора успешно создан!`,failed:`Не удалось создать аккаунт администратора`,fillAllFields:`Пожалуйста, заполните все поля`,note:`Это будет основной аккаунт администратора для вашего экземпляра Libre WebUI`},encryptionKey:{title:`Сохраните ваш ключ шифрования`,subtitle:`Важно: Сохраните этот ключ`,description:`Этот ключ шифрования защищает ваши конфиденциальные данные. Храните его надёжно — он понадобится при восстановлении базы данных.`,warning:`Предупреждение`,warningText:`Если вы потеряете этот ключ и вам потребуется восстановить базу данных, ваши зашифрованные данные (API-ключи, настройки) будут утеряны безвозвратно.`,label:`Ваш ключ шифрования`,loading:`Загрузка...`,copyToClipboard:`Копировать в буфер обмена`,copied:`Ключ шифрования скопирован в буфер обмена!`,copyFailed:`Не удалось скопировать ключ в буфер обмена`,envNote:`Этот ключ также сохранён в файле backend/.env как ENCRYPTION_KEY`,acknowledgment:`Я сохранил ключ шифрования в надёжном месте и понимаю, что его потеря может привести к утрате данных.`,confirmRequired:`Пожалуйста, подтвердите, что вы сохранили ключ шифрования`,continue:`Продолжить к Libre WebUI`}},chat:{greeting:{morning:`Доброе утро`,afternoon:`Добрый день`,evening:`Добрый вечер`,night:`Доброй ночи`},welcome:{helpToday:`Чем могу помочь сегодня?`,helpTonight:`Чем могу помочь сегодня вечером?`,variety:{create:{title:`Что будем создавать?`,subtitle:`Начните с мысли, наброска или задачи, которая никак не поддаётся.`},explore:{title:`С чего начнём?`,subtitle:`Расскажите о вопросе, к которому постоянно возвращаетесь.`},imagine:{title:`Что вы представляете?`,subtitle:`Мы можем вместе придать этому форму.`},focus:{title:`Что заслуживает вашего внимания?`,subtitle:`Давайте проясним следующий шаг.`},untangle:{title:`Что нужно распутать?`,subtitle:`Для начала покажите всё как есть, даже если пока хаотично.`},momentum:{title:`Начнём, когда будете готовы.`,subtitle:`Вернитесь к идее, плану или незаконченной теме.`},open:{title:`О чём вы думаете?`,subtitle:`Небольшая мысль или амбициозный проект. Подойдёт и то и другое.`},challenge:{title:`Что мы решаем?`,subtitle:`Расскажите, что пока не работает.`},draft:{title:`Давайте с чего-нибудь начнём.`,subtitle:`Необязательно сразу доводить до блеска.`},possibility:{title:`Во что это может превратиться?`,subtitle:`Покажите мне исходный материал.`},unexpected:{title:`Создадим что-нибудь неожиданное.`,subtitle:`Дайте мне ограничение, настроение или не до конца оформленную идею.`}}},input:{placeholder:`Отправить сообщение`,messagePlaceholder:`Сообщение...`,attachImages:`Прикрепить изображения`,attachments:`Вложения и дополнительные функции`,sendMessage:`Отправить сообщение`,stopGeneration:`Остановить генерацию`},session:{new:`Новый чат`,work:`Работа`,chat:`Чат`,private:`Приватный`,privateMode:`Приватный режим`,privateDescription:`Этот разговор не будет сохранён`,privateTooltip:`Начать приватный разговор, который не будет сохранён`,deleteConfirm:`Вы уверены, что хотите удалить этот чат?`,generatingTitle:`Генерация заголовка`,noChats:`Чатов пока нет`,createFirst:`Создайте свой первый чат выше`,chats:`Чаты`,renameChat:`Переименовать чат`,deleteChat:`Удалить чат`},persona:{applied:`Персона применена`,label:`Персона`},model:{updated:`Модель обновлена`,noModels:`Модели недоступны`,noModelsDescription:`Модели недоступны. Убедитесь, что Ollama запущен и модели установлены.`,pullCommand:`ollama pull llama3.2:3b`,noModelsTooltip:`Модели недоступны. Убедитесь, что Ollama запущен и модели установлены.`},footer:{disclaimer:`ИИ может ошибаться — проверяйте важную информацию`,images:`{{count}} изображение`,images_plural:`{{count}} изображений`,structuredOutput:`Структурированный вывод`},mediaUpload:{dropImagesHere:`Перетащите изображения сюда или`,supportedFormats:`Поддерживаются: JPG, PNG, GIF, WebP (макс. 10 МБ каждый)`,browse:`выберите`},structuredOutput:{title:`Формат ответа`,none:`Нет (естественный язык)`,noneDescription:`Стандартный ответ на естественном языке`,json:`JSON`,jsonDescription:`Структурированный формат JSON`,list:`Список`,listDescription:`Массив элементов`,summary:`Резюме`,summaryDescription:`Краткое изложение документа с ключевыми моментами`,analysis:`Анализ`,analysisDescription:`Структурированный анализ с плюсами/минусами`,custom:`Пользовательская схема`,customDescription:`Определите собственную JSON-схему`,customSchema:`Пользовательская JSON-схема`,schemaPreview:`Предпросмотр схемы`,applySchema:`Применить схему`,cancel:`Отмена`,enabled:`Структурированный вывод включён`}},sidebar:{navigation:{chat:`Чат`,models:`Модели`,personas:`Персоны`,imagine:`Изображения`,settings:`Настройки`,userManagement:`Управление пользователями`,signOut:`Выйти`,agents:`Агенты`,work:`Работа`,exploreLabel:`Обзор`},toggleSize:`Переключить размер боковой панели`,expandSidebar:`Развернуть боковую панель`},user:{menu:{changePicture:`Изменить фото`,settings:`Настройки`,userManagement:`Управление пользователями`,logout:`Выйти`},avatar:{title:`Изменить фото профиля`,updated:`Фото профиля обновлено`,updateFailed:`Не удалось обновить фото профиля`,saving:`Сохранение...`,label:`Аватар`,uploadAvatarImage:`Загрузить изображение аватара`,dragAndDrop:`Перетащите изображение или нажмите для выбора`,chooseImage:`Выбрать изображение`,uploading:`Загрузка...`,enterImageUrl:`Или введите URL изображения`,supportedFormats:`Поддерживаются: JPG, PNG, GIF, WebP (макс. 2 МБ). Квадратные изображения подходят лучше всего.`,customAvatar:`Пользовательское изображение аватара`,clickToChange:`Нажмите, чтобы изменить или удалить`,removed:`Аватар удалён`,uploaded:`Аватар успешно загружен`,invalidFile:`Пожалуйста, выберите корректный файл изображения`,fileTooLarge:`Размер изображения аватара должен быть менее 2 МБ`,readFailed:`Не удалось прочитать файл изображения`,uploadFailed:`Не удалось загрузить изображение аватара`},profile:{noEmail:`Эл. почта не указана`}},settings:JSON.parse(`{"title":"Настройки","tabs":{"appearance":"Внешний вид","model":"Модель","systemMessage":"Системное сообщение","plugins":"Плагины","generation":"Генерация","documents":"Документы","tts":"Синтез речи","imageGen":"Генерация изображений","data":"Данные","about":"О программе"},"appearance":{"title":"Внешний вид","language":{"title":"Язык","description":"Выберите предпочтительный язык"},"theme":{"title":"Тема","light":"Светлая","dark":"Тёмная","amoled":"Глубокий Чёрный","system":"Системная"},"accent":{"title":"Акцентный цвет","custom":"Пользовательский цвет","useColor":"Использовать {{color}} как акцент","behaviorTitle":"Палитра интерфейса","behaviorDescription":"Выберите, останется ли акцент только на элементах управления или изменит весь светлый либо тёмный интерфейс.","defaultStyle":"По умолчанию","defaultStyleDescription":"Сохранить нейтральные поверхности светлой и тёмной темы.","adaptedStyle":"Адаптировать к акценту","adaptedStyleDescription":"Окрасить поверхности, границы и текст в акцентный цвет."},"chatInterface":{"title":"Интерфейс чата","showUsername":"Показывать имя пользователя","showUsernameDescription":"Отображать имя пользователя в сообщениях чата"},"background":{"title":"Фоновое изображение","enable":"Включить фоновое изображение","enableDescription":"Показывать пользовательский фон с эффектом размытия","blur":"Размытие","opacity":"Прозрачность","upload":"Загрузить фоновое изображение","dragDrop":"Перетащите изображение или нажмите для выбора","chooseImage":"Выбрать изображение"}},"saveSettings":"Сохранить настройки","model":{"title":"Настройки модели","defaultModel":"Модель по умолчанию","defaultModelDescription":"Эта модель будет использоваться по умолчанию для новых разговоров","selectModel":"Выберите модель","updateAll":"Обновить все модели","updateAllDescription":"Проверить обновления и загрузить последние версии всех установленных моделей","updateAllButton":"Обновить все","updating":"Обновление моделей...","currentModelInfo":"Информация о текущей модели","name":"Название","size":"Размер","family":"Семейство","format":"Формат","status":"Статус","statusStarting":"Запуск...","statusComplete":"Завершено","statusError":"Ошибка","bulkOperations":"Массовые операции","autoTitle":{"title":"Автогенерация заголовков","enable":"Включить автогенерацию заголовков","enableDescription":"Автоматически генерировать заголовки для новых разговоров","taskModel":"Модель для задач","selectTaskModel":"Выберите модель для задач","taskModelDescription":"Модель для генерации заголовков разговоров"},"persona":"Персона","updatingModel":"Обновление {{name}} ({{current}}/{{total}})","modelsProgress":"{{current}} из {{total}} моделей","modelPullAccess":"Доступ к установке моделей","modelPullAccessDescription":"Разрешить пользователям без прав администратора загружать и устанавливать новые модели.","modelPullAccessSaved":"Права на установку моделей обновлены","modelPullAccessSaveFailed":"Не удалось обновить права на установку моделей"},"systemMessage":{"title":"Системное сообщение","description":"Установите пользовательское системное сообщение, которое будет использоваться для всех новых разговоров.","placeholder":"Введите системное сообщение...","saved":"Системное сообщение сохранено","saveFailed":"Не удалось сохранить системное сообщение"},"plugins":{"title":"Плагины","description":"Управление установленными плагинами","addNew":"Добавить новый плагин","upload":"Загрузить плагин","addJson":"Добавить JSON","uploading":"Загрузка...","jsonPlaceholder":"Вставьте JSON-конфигурацию плагина...","install":"Установить плагин","noPlugins":"Плагины не установлены","noPluginsDescription":"Добавьте плагин для расширения функциональности","loading":"Загрузка плагинов...","installed":"Установленные плагины","active":"Активные плагины","activeLabel":"Активен","inactive":"Неактивен","activate":"Активировать","deactivate":"Деактивировать","models":"моделей","apiKeySet":"API-ключ установлен","apiKeyConfiguration":"Настройка API-ключа","apiKeyEnvAlternative":"Или установите переменную","environmentVariable":"переменную окружения","apiKeyConfigured":"API-ключ настроен","apiKeyPlaceholder":"Введите ваш API-ключ...","saveApiKey":"Сохранить API-ключ","apiKey":{"title":"API-ключ","placeholder":"Введите API-ключ","save":"Сохранить ключ","remove":"Удалить ключ","configured":"API-ключ настроен","notConfigured":"Требуется API-ключ","saved":"API-ключ успешно сохранён","removed":"API-ключ удалён","saveFailed":"Не удалось сохранить API-ключ","removeFailed":"Не удалось удалить API-ключ","enterKey":"Пожалуйста, введите API-ключ"},"variables":"Variables"},"generation":{"title":"Параметры генерации","description":"Настройте, как ИИ генерирует ответы","coreParameters":"Основные параметры","temperature":"Температура","temperatureDescription":"Контролирует случайность. Низкие значения — более точные, высокие — более творческие.","topP":"Top P","topPDescription":"Контролирует разнообразие через nucleus sampling. Низкие значения фокусируются на вероятных токенах.","topK":"Top K","topKDescription":"Ограничивает выбор токенов до K наиболее вероятных. Установите 0 для отключения.","minP":"Min P","minPDescription":"Минимальный порог вероятности для выбора токена.","generationControl":"Управление генерацией","maxTokens":"Макс. токенов","maxTokensDescription":"Максимальное количество токенов для генерации в ответе.","repeatPenalty":"Штраф за повторение","repeatPenaltyDescription":"Штрафует повторяющиеся токены. Высокие значения уменьшают повторения.","contextLength":"Длина контекста","contextLengthDescription":"Максимальный размер окна контекста для разговоров.","seed":"Seed","optional":"необязательно","random":"Случайный","seedDescription":"Установите конкретный seed для воспроизводимых результатов.","advancedOptions":"Расширенные параметры","presencePenalty":"Штраф за присутствие","presencePenaltyDescription":"Штрафует токены, появляющиеся в контексте.","frequencyPenalty":"Штраф за частоту","frequencyPenaltyDescription":"Штрафует часто используемые токены.","stopSequences":"Стоп-последовательности","commaSeparated":"через запятую","stopSequencesDescription":"Пользовательские токены, которые остановят генерацию при обнаружении.","resetDefaults":"Сбросить по умолчанию","saveOptions":"Сохранить параметры","embeddingSettings":"Настройки встраивания","enableEmbeddings":"Включить встраивание документов"},"documents":{"title":"Настройки документов","embeddings":{"title":"Встраивание","enable":"Включить встраивание документов","model":"Модель встраивания","modelDescription":"Выберите модель для встраивания документов","chunkSize":"Размер фрагмента","chunkSizeInTokens":"(в токенах)","chunkSizeDescription":"Размер текстовых фрагментов для встраивания","chunkOverlap":"Перекрытие фрагментов","chunkOverlapInTokens":"(в токенах)","chunkOverlapDescription":"Перекрытие между последовательными фрагментами","similarityThreshold":"Порог сходства","similarityDescription":"Минимальный балл сходства для включения результатов","status":"Статус встраивания","statusLabel":"Статус","available":"Доступно","unavailable":"Недоступно","chunksWithEmbeddings":"Фрагментов со встраиванием","coverage":"Покрытие","regenerate":"Перегенерировать встраивания","regenerating":"Перегенерация..."}},"tts":{"title":"Синтез речи","description":"Настройте параметры синтеза речи для озвучивания сообщений","loadingProviders":"Загрузка провайдеров TTS...","noProviders":"Провайдеры TTS отсутствуют","noProvidersDescription":"Настройте плагин с поддержкой TTS для включения синтеза речи","enable":"Включить TTS","enableDescription":"Разрешить синтез речи для сообщений ассистента","autoPlay":"Автовоспроизведение ответов","autoPlayDescription":"Автоматически озвучивать новые сообщения ассистента","streamSentences":"Потоковое воспроизведение предложений","streamSentencesDescription":"Воспроизводить аудио по предложениям вместо ожидания полного сообщения. Рекомендуется для локального TTS, чтобы избежать таймаутов на длинных сообщениях.","voiceConfiguration":"Настройка голоса","model":"Модель TTS","modelDescription":"Выберите модель для синтеза речи","voice":"Голос","selectVoice":"Выберите голос","voiceDescription":"Выберите голос для синтеза речи","speed":"Скорость","speedSlow":"0.5x","speedNormal":"1.0x","speedFast":"2.0x","availableProviders":"Доступные провайдеры","models":"моделей","test":"Тест","testing":"Тестирование...","stop":"Стоп"},"imageGen":{"title":"Генерация изображений","description":"Настройте параметры и провайдеров генерации изображений","loadingProviders":"Загрузка провайдеров генерации изображений...","noProviders":"Провайдеры генерации изображений отсутствуют","noProvidersDescription":"Настройте плагин с поддержкой генерации изображений","enable":"Включить генерацию изображений","enableDescription":"Разрешить генерацию изображений ИИ в разговорах","configuration":"Конфигурация","model":"Модель","modelDescription":"Выберите модель для генерации изображений","size":"Размер","sizeDescription":"Разрешение генерируемых изображений","quality":"Качество","qualityDescription":"Уровень качества генерируемых изображений","style":"Стиль","styleDescription":"Пресет стиля для генерируемых изображений","availableProviders":"Доступные провайдеры","models":"моделей"},"data":{"title":"Управление данными","export":"Экспорт данных","exportDescription":"Скачайте все ваши данные, включая настройки, сессии и документы.","exportAll":"Экспортировать все данные","import":"Импорт данных","importDescription":"Импортируйте данные из предыдущего экспорта.","importData":"Импортировать данные","importing":"Импорт...","clearSessions":"Очистить сессии","clearSessionsDescription":"Удалить все сессии чата. Это действие нельзя отменить.","clearAll":"Очистить всё","clearing":"Очистка...","importOptions":"Параметры импорта","importOptionsDescription":"Выберите, как обрабатывать существующие данные","skipDuplicates":"Пропускать дубликаты","overwrite":"Перезаписывать существующие","importResults":"Результаты импорта","preferences":"Настройки","imported":"Импортировано","failed":"Ошибка","sessions":"Сессии","importedLabel":"импортировано","skipped":"пропущено","documents":"Документы","errors":"Ошибки"},"about":{"title":"О программе","versionLabel":"Версия","ollama":{"title":"Статус Ollama","version":"Версия","healthy":"Работает","unhealthy":"Не работает"},"stats":{"models":"Модели","sessions":"Сессии"},"features":{"privacy":{"title":"Конфиденциальность прежде всего","description":"Ваши данные остаются на вашем устройстве"},"openSource":{"title":"Открытый исходный код","description":"Бесплатное программное обеспечение с открытым исходным кодом"},"localInference":{"title":"Локальный вывод","description":"Запускайте модели ИИ локально с Ollama"}},"openSourceBy":"Открытый исходный код от {{company}}","links":{"title":"Ссылки","github":"GitHub","githubDescription":"Просмотр исходного кода и участие","website":"Веб-сайт","websiteDescription":"Посетите наш веб-сайт","ollama":"Ollama","ollamaDescription":"Узнайте больше об Ollama","documentation":"Документация","reportIssue":"Сообщить о проблеме","reportIssueDescription":"Отчёты об ошибках и запросы функций","gitlab":"Зеркало GitLab","gitlabDescription":"Самостоятельно размещённый репозиторий GitLab","documentationDescription":"Руководства, учебники и справочник API"},"version":"Версия {{version}}"},"groups":{"general":"Основные","chat":"Чат","media":"Речь и изображения","connections":"Подключения"}}`),models:{title:`Модели`,subtitle:`Загружайте, управляйте и отслеживайте ваши модели Ollama`,installed:`Установленные модели`,available:`Доступные модели`,pull:`Загрузить модель`,pulling:`Загрузка...`,delete:`Удалить модель`,deleting:`Удаление...`,size:`Размер`,modified:`Изменено`,family:`Семейство`,parameters:`Параметры`,quantization:`Квантование`,noModels:`Модели не установлены`,pullFirst:`Загрузите модель, чтобы начать`,noModelsFound:`Модели не найдены`},personas:{title:`Персоны`,create:`Создать персону`,edit:`Редактировать персону`,delete:`Удалить персону`,name:`Имя`,description:`Описание`,systemPrompt:`Системный промпт`,model:`Модель`,avatar:`Аватар`,background:`Фон`,noPersonas:`Персоны не созданы`,createFirst:`Создайте вашу первую персону для настройки опыта общения`},gallery:{title:`Галерея`,subtitle:`Ваша галерея изображений, созданных ИИ`,imageCount:`{{count}} изображений`,generate:`Создать изображение`,generateDescription:`Создавайте изображения с помощью ИИ`,generating:`Создание...`,prompt:`Промпт`,promptPlaceholder:`Опишите изображение, которое хотите создать...`,noImages:`Изображения ещё не созданы`,download:`Скачать`,delete:`Удалить`,regenerate:`Пересоздать`,model:`Модель`,size:`Размер`,quality:`Качество`,created:`Создано`},errors:{generic:`Произошла ошибка`,network:`Сетевая ошибка. Проверьте подключение.`,unauthorized:`У вас нет прав для выполнения этого действия.`,notFound:`Запрошенный ресурс не найден.`,serverError:`Ошибка сервера. Попробуйте позже.`,validation:`Проверьте введённые данные и попробуйте снова.`},keyboard:{title:`Горячие клавиши`,toggleSidebar:`Переключить боковую панель`,openSettings:`Открыть настройки`,toggleDarkMode:`Переключить тёмный режим`,showShortcuts:`Показать горячие клавиши`,closeModals:`Закрыть окна`,groups:{navigation:`Навигация`,settings:`Настройки`,general:`Общие`,chat:`Чат`},actions:{sendMessage:`Отправить сообщение`,newLine:`Новая строка в сообщении`},footer:`Нажмите {{key1}} или {{key2}} для показа справки`,tooltip:`Горячие клавиши`},modelManager:{title:`Модели`,loading:`Загрузка моделей...`,systemStatus:{online:`Ollama онлайн`,offline:`Ollama офлайн`,models:`модель`,models_plural:`моделей`,running:`запущено`,vram:`VRAM`},sections:{pull:`Загрузить новую модель`,library:`Обзор библиотеки`,running:`Запущенные модели`,local:`Локальные модели`,advanced:`Расширенные действия`,huggingface:`HuggingFace Hub`},pull:{placeholder:`Введите название модели (напр., llama3.2:3b, deepseek-r1:14b)`,button:`Загрузить`,cancel:`Отмена`,popular:`Популярные модели:`,browseAll:`Просмотреть все модели на ollama.com`,success:`Модель {{name}} успешно загружена`,cancelled:`Загрузка модели отменена`,failed:`Не удалось загрузить модель`,enterName:`Пожалуйста, введите название модели`,restricted:`Установка моделей в этом экземпляре доступна только администраторам.`},progress:{starting:`Инициализация...`,pulling:`Загрузка модели...`,pullingLayer:`загрузка`,verifying:`Проверка целостности...`,verifyingDigest:`проверка sha256 дайджеста`,writing:`Запись манифеста...`,cleaning:`Очистка...`},library:{available:`доступно`,search:`Поиск моделей...`,noResults:`Модели не найдены по вашим критериям`,installed:`Установлено`,more:`+{{count}} ещё`,refresh:`Обновить библиотеку`},local:{noModels:`Модели ещё не установлены`,pullToStart:`Загрузите модель выше, чтобы начать`,installed:`установлено`,running:`Запущено`,info:`Инфо`,copy:`Копировать`,delete:`Удалить`,deleteConfirm:`Вы уверены, что хотите удалить модель "{{name}}"?`,deleteSuccess:`Модель {{name}} успешно удалена`,deleteFailed:`Не удалось удалить модель`},advanced:{createModel:`Создать модель`,fromModelfile:`Из Modelfile`,copyModel:`Копировать модель`,duplicateExisting:`Дублировать существующую`,testEmbeddings:`Тест встраивания`,generateVectors:`Создать векторы`,healthCheck:`Проверка состояния`,testConnection:`Проверить соединение`,healthy:`Ollama работает нормально!`},modals:{details:{title:`Детали модели`,info:`Информация о модели`,family:`Семейство`,parameters:`Параметры`,quantization:`Квантование`,format:`Формат`,systemPrompt:`Системный промпт`,template:`Шаблон`,license:`Лицензия`,modelfile:`Modelfile`,noDetails:`Детали недоступны`},copy:{title:`Копировать модель`,source:`Исходная модель`,selectModel:`Выберите модель...`,newName:`Новое название модели`,placeholder:`напр., my-custom-model`,copying:`Копирование...`,button:`Копировать модель`,success:`Модель скопирована в {{name}}`,failed:`Не удалось скопировать модель`,enterBoth:`Пожалуйста, введите исходное и целевое названия`},create:{title:`Создать пользовательскую модель`,name:`Название модели`,namePlaceholder:`напр., my-assistant`,modelfile:`Modelfile`,modelfilePlaceholder:`FROM llama3.2
2
- SYSTEM You are a helpful assistant.`,see:`См.`,docs:`Документация Modelfile`,docsLink:`для справки по синтаксису`,creating:`Создание...`,button:`Создать модель`,success:`Модель {{name}} успешно создана`,failed:`Не удалось создать модель`,enterBoth:`Пожалуйста, введите название модели и содержимое Modelfile`},embeddings:{title:`Тест встраивания`,model:`Модель встраивания`,selectModel:`Выберите модель...`,recommended:`Рекомендуется: nomic-embed-text, mxbai-embed-large`,input:`Входной текст`,placeholder:`Введите текст для создания встраивания...`,generating:`Создание...`,button:`Создать встраивание`,result:`Результат ({{count}} измерений)`,success:`Создан {{count}}-мерный вектор встраивания`,failed:`Не удалось создать встраивание`,enterBoth:`Пожалуйста, выберите модель и введите текст`}},huggingface:{browseAll:`Смотреть всё на HuggingFace`,checkingGguf:`Поиск GGUF-файлов...`,noGgufAvailable:`Нет доступных GGUF-файлов для прямой загрузки в Ollama`,ggufFilesCount:`GGUF-файлы ({{count}}) - Загрузить напрямую в Ollama`,noModelsFound:`Модели не найдены`,noResults:`Модели не найдены. Попробуйте изменить поиск или фильтры.`,browseAllLink:`Смотреть всё`,search:`Поиск моделей HuggingFace...`,by:`от`,gated:`Ограниченный доступ`,viewOnHF:`Открыть на HuggingFace`,sortDownloads:`Загрузки`,sortLikes:`Лайки`,sortRecent:`Недавние`,taskTextGeneration:`Генерация текста`,taskTextToSpeech:`Текст в речь`,taskTextToImage:`Текст в изображение`,taskSpeechRecognition:`Распознавание речи`,tasks:{textGen:`Генерация текста`,tts:`Текст в речь`,image:`Текст в изображение`,stt:`Распознавание речи`},sort:{downloads:`Самые загружаемые`,likes:`Самые популярные`,recent:`Недавно обновлённые`}}},personaManager:{title:`Персоны`,subtitle:`Создавайте и управляйте персонами ИИ с пользовательскими личностями, памятью и поведением`,loading:`Загрузка персон...`,createButton:`Создать персону`,importExport:`Импорт/Экспорт`,stats:{title:`Ваши персоны`,count:`Создано {{count}} персона`,count_plural:`Создано {{count}} персон`},empty:{title:`Персон пока нет`,description:`Создайте вашу первую персону для персонализированного взаимодействия с ИИ`,button:`Создать вашу первую персону`},deleteConfirm:`Вы уверены, что хотите удалить "{{name}}"?`,deleteSuccess:`Персона "{{name}}" успешно удалена`,downloadSuccess:`Персона "{{name}}" успешно скачана`,failed:`Не удалось {{action}} персону`},personaForm:{title:{create:`Создать новую персону`,edit:`Редактировать персону`},subtitle:{create:`Создайте новую персону ИИ с пользовательской личностью, системой памяти и адаптивным обучением`,edit:`Настройте вашу персону ИИ с расширенной памятью, адаптивным обучением и интеллектуальными параметрами`},loading:`Загрузка формы...`,saved:`Сохранено`,tabs:{basic:`Основное`,parameters:`Параметры`,memory:`Память и обучение`,advanced:`Расширенное`},basic:{name:`Имя`,namePlaceholder:`Введите имя персоны`,model:`Модель`,selectModel:`Выберите модель`,description:`Описание`,descriptionPlaceholder:`Опишите вашу персону...`,systemPrompt:`Системный промпт`,systemPromptPlaceholder:`Введите системный промпт, определяющий поведение вашей персоны...`,systemPromptHint:`Системный промпт определяет, как ваша персона будет себя вести и отвечать.`},parameters:{temperature:`Температура`,temperatureHint:`Контролирует креативность vs последовательность`,topP:`Top-P`,topPHint:`Контролирует разнообразие ответов`,topK:`Top-K`,topKHint:`Ограничивает словарь до top-k токенов`,contextWindow:`Окно контекста`,contextWindowHint:`Максимальная длина истории разговора`,maxTokens:`Макс. токенов`,maxTokensHint:`Максимальная длина ответа`,repeatPenalty:`Штраф за повторение`,repeatPenaltyHint:`Уменьшает повторяющиеся ответы`},memory:{title:`Система памяти`,subtitle:`Персона запоминает разговоры со временем`,enableHint:`Включите систему памяти, чтобы ваша персона запоминала разговоры и накапливала контекст со временем.`,loading:`Загрузка статуса памяти...`,noData:`Данных памяти пока нет`,memories:`Воспоминания`,mbUsed:`МБ использовано`,lastBackup:`Последний бэкап`,never:`Никогда`,maxMemories:`Максимум воспоминаний`,maxMemoriesHint:`Сколько воспоминаний может хранить эта персона`,retention:`Срок хранения памяти`,retentionHint:`Дней до очистки воспоминаний`,autoCleanup:`Автоочистка старых воспоминаний`,wipeAll:`Очистить всю память`,wipeCannot:`Это нельзя отменить`,wipeButton:`Очистить`,wiping:`Очистка...`,wipeConfirm:`Вы уверены, что хотите очистить всю память? Это нельзя отменить.`,wipeSuccess:`Очищено {{count}} воспоминаний`},learning:{title:`Адаптивное обучение`,subtitle:`Персона развивается на основе взаимодействий`,enableHint:`Включите адаптивное обучение, чтобы ваша персона развивалась и персонализировала ответы на основе ваших взаимодействий.`,speed:`Скорость обучения`,slow:`Медленно`,slowDesc:`Постепенные изменения`,balanced:`Сбалансировано`,balancedDesc:`Умеренный темп`,fast:`Быстро`,fastDesc:`Быстрая адаптация`,autoAdapt:`Автоадаптация к предпочтениям пользователя`,whatLearns:`Что изучает персона:`,conversationTone:`Тон разговора`,responseStyle:`Стиль ответов`,userPreferences:`Предпочтения пользователя`,topicInterests:`Интересующие темы`},advanced:{embeddingModel:`Модель встраивания`,embeddingHint:`Выберите модель для кодирования памяти и семантического поиска. Модели встраивания показаны первыми, затем другие доступные модели.`,noModels:`Модели не найдены`,embeddingModels:`Модели встраивания`,otherModels:`Другие модели`,installHint:`Установите модель встраивания:`,recommended:`Рекомендуется: nomic-embed-text, mxbai-embed-large, bge-m3, snowflake-arctic-embed`,aboutTitle:`О расширенных настройках`,aboutDescription:`Модель встраивания используется системой памяти для понимания семантического значения и поиска релевантных воспоминаний во время разговоров. Выберите модель, соответствующую вашему сценарию использования и доступным ресурсам.`},actions:{cancel:`Отмена`,save:`Сохранить`,saving:`Сохранение...`,saveClose:`Сохранить и закрыть`,create:`Создать`},success:{created:`Персона создана`,updated:`Персона обновлена`},error:{saveFailed:`Не удалось сохранить`}},personaCard:{enhanced:`Улучшенная`,systemPrompt:`Системный промпт`,memories:`воспоминаний`,use:`Использовать`,editTooltip:`Редактировать персону`,downloadTooltip:`Скачать персону`,backup:`Бэкап`,exportDNA:`Экспорт ДНК`,wipeMemories:`Очистить память`,wipeConfirm:`Вы уверены, что хотите очистить всю память этой персоны? Это действие нельзя отменить.`,wipeSuccess:`Очищено {{count}} воспоминаний`,backupSuccess:`Бэкап персоны успешно скачан`,dnaSuccess:`ДНК персоны успешно экспортирована`,failed:`Не удалось {{action}}`},userManager:{title:`Управление пользователями`,subtitle:`Управление аккаунтами и правами пользователей`,pageDescription:`Управляйте учетными записями пользователей, разрешениями и контролем доступа для вашего экземпляра Libre WebUI.`,loading:`Загрузка пользователей...`,createUser:`Создать пользователя`,search:`Поиск пользователей...`,noUsers:`Пользователи не найдены`,noUsersMatching:`Пользователи по вашему запросу не найдены`,columns:{user:`Пользователь`,email:`Эл. почта`,role:`Роль`,created:`Создан`,actions:`Действия`},roles:{admin:`Администратор`,user:`Пользователь`},noEmail:`Нет эл. почты`,deleteConfirm:`Вы уверены, что хотите удалить пользователя "{{name}}"?`,deleteSuccess:`Пользователь успешно удалён`,deleteFailed:`Не удалось удалить пользователя`,cannotDeleteSelf:`Вы не можете удалить свой аккаунт`,form:{title:{create:`Создать пользователя`,edit:`Редактировать пользователя`},username:`Имя пользователя`,usernamePlaceholder:`Введите имя пользователя`,email:`Эл. почта`,emailPlaceholder:`Введите эл. почту (необязательно)`,password:`Пароль`,passwordPlaceholder:`Введите пароль`,passwordHint:`Оставьте пустым, чтобы сохранить текущий пароль`,role:`Роль`,creating:`Создание...`,updating:`Обновление...`,createButton:`Создать пользователя`,updateButton:`Обновить пользователя`,createSuccess:`Пользователь успешно создан`,updateSuccess:`Пользователь успешно обновлён`,createFailed:`Не удалось создать пользователя`,updateFailed:`Не удалось обновить пользователя`}},chatHistory:{label:`История разговора`,jumpToTurn:`Перейти к реплике {{index}} из {{total}}`},chatMessage:{you:`Вы`,assistant:`Ассистент`,system:`Система`,copy:`Копировать`,copyMessage:`Копировать сообщение`,copied:`Скопировано!`,regenerate:`Пересоздать`,regenerateResponse:`Пересоздать ответ`,edit:`Редактировать`,editSystemMessage:`Редактировать системное сообщение`,saveChanges:`Сохранить изменения`,cancelEditing:`Отменить редактирование`,delete:`Удалить`,deleteConfirm:`Удалить это сообщение?`,branch:`Ветка`,speaking:`Озвучивание...`,speakMessage:`Озвучить сообщение`,stopSpeaking:`Остановить озвучивание`,showMore:`Показать больше`,showLess:`Показать меньше`,thinking:`Думает`,systemMessagePlaceholder:`Введите ваше системное сообщение...`,fullSizeImage:`Изображение в полном размере`,startConversation:`Начать разговор`,startConversationDescription:`Отправьте сообщение, чтобы начать общение с вашим ИИ-ассистентом. Задавайте вопросы, получайте помощь с кодом или ведите обычный разговор.`,scrollToBottom:`Прокрутить вниз`,newMessages:`Новые сообщения`},imageGallery:{title:`Галерея изображений`,noImages:`Изображений пока нет`,noImagesHint:`Создайте первое изображение с помощью панели справа`,delete:`Удалить`,download:`Скачать`,deleteConfirm:`Вы уверены, что хотите удалить это изображение?`,deleteSuccess:`Изображение удалено`,deleteFailed:`Не удалось удалить изображение`,downloadFailed:`Не удалось скачать изображение`,loadMore:`Загрузить ещё ({{current}} из {{total}})`,loadFailed:`Не удалось загрузить галерею`},imageGeneration:{title:`Создать изображение`,prompt:`Промпт`,promptPlaceholder:`Опишите изображение, которое хотите создать...`,model:`Модель`,selectModel:`Выберите модель`,noModels:`Модели генерации изображений недоступны`,configurePlugin:`Настройте плагин с поддержкой генерации изображений`,size:`Размер`,quality:`Качество`,style:`Стиль`,generate:`Создать`,generating:`Создание...`,success:`Изображение успешно создано`,failed:`Не удалось создать изображение`,enterPrompt:`Пожалуйста, введите промпт`,promptTooLong:`Промпт превышает максимальную длину в {{max}} символов`},errorBoundary:{title:`Что-то пошло не так`,description:`Произошла непредвиденная ошибка. Попробуйте обновить страницу.`,tryAgain:`Обновить страницу`,goHome:`На главную`,errorDetails:`Детали ошибки (Разработка)`},documents:{title:`Документы`,upload:`Загрузить документ`,uploading:`Загрузка...`,noDocuments:`Документы не загружены`,uploadHint:`Загрузите документы для использования в разговорах`,delete:`Удалить`,deleteConfirm:`Вы уверены, что хотите удалить этот документ?`,deleteSuccess:`Документ удалён`,deleteFailed:`Не удалось удалить документ`,uploadSuccess:`Документ успешно загружен`,uploadFailed:`Не удалось загрузить документ`,types:`Поддерживаются: PDF, TXT, MD, DOCX`,unsupportedFileType:`Поддерживаются только файлы PDF и TXT`,fileSizeTooLarge:`Размер файла должен быть менее 10 МБ`,uploadSuccessWithName:`Документ "{{name}}" успешно загружен`,removeSuccess:`Документ успешно удалён`,removeFailed:`Не удалось удалить документ`,removeError:`Произошла ошибка при удалении документа`,clickToUpload:`Нажмите для загрузки`,orDragAndDrop:`или перетащите`,fileTypesAndSize:`Файлы PDF или TXT до 10 МБ`,uploadedDocuments:`Загруженные документы`,removeDocument:`Удалить документ`},ttsButton:{speak:`Озвучить`,stop:`Стоп`,speaking:`Озвучивание...`,generateFailed:`Не удалось сгенерировать речь`,playbackFailed:`Ошибка воспроизведения аудио`,stopSpeaking:`Остановить озвучивание`,generatingSpeech:`Генерация речи...`,readAloud:`Читать вслух`},artifacts:{title:`Артефакты`,code:`Код`,preview:`Предпросмотр`,copy:`Копировать код`,copied:`Скопировано!`,download:`Скачать`,expand:`Развернуть`,collapse:`Свернуть`,openInNewTab:`Открыть в новой вкладке`,invalidSvg:`Недопустимое содержимое SVG`,invalidJson:`Недопустимое содержимое JSON`,previewMode:`Режим предпросмотра`,codeMode:`Режим кода`,copyContent:`Копировать содержимое`,openInPanel:`Открыть в панели`,openInNewWindow:`Открыть в новом окне`,created:`Создано`,closePanelEsc:`Закрыть панель (Esc)`,copyButton:`Копировать`,open:`Открыть`,dragEdgeToResize:`Перетащите край для изменения размера`,previewUnavailable:`Preview unavailable`,previewUnavailableDescription:`This artifact does not contain renderable preview content. Switch to code view to inspect the source.`},personaImportExport:{title:`Импорт и экспорт персон`,description:`Экспортируйте персоны для обмена или импортируйте персоны от других`,exportPersonas:`Экспорт персон`,importPersonas:`Импорт персон`,noPersonasToExport:`Нет персон для экспорта`,personasAvailable:`Доступно {{count}} персона`,personasAvailable_plural:`Доступно {{count}} персон`,exportAll:`Экспортировать всё`,uploadJsonFile:`Загрузить JSON-файл`,pasteJsonLabel:`Вставить данные JSON`,pasteJsonPlaceholder:`Вставьте данные персоны в формате JSON...`,importing:`Импорт...`,importButton:`Импортировать персону(ы)`,expectedFormat:`Ожидаемый формат JSON:`,exportSuccess:`Персона "{{name}}" успешно экспортирована`,exportFailed:`Не удалось экспортировать персону`,exportAllSuccess:`Все {{count}} персон успешно экспортированы`,exportAllFailed:`Не удалось экспортировать персоны`,pasteJsonData:`Пожалуйста, вставьте данные персоны в формате JSON`,importMultipleSuccess:`Успешно импортировано {{count}} персон`,importMultipleFailed:`Не удалось импортировать {{count}} персон`,importNoneFailed:`Не удалось импортировать ни одну персону`,importSuccess:`Персона успешно импортирована`,importFailed:`Не удалось импортировать персону`},generationStats:{details:`Подробности`,promptTokens:`Токены промпта:`,generatedTokens:`Сгенерированные токены:`,totalTokens:`Всего токенов:`,speed:`Скорость:`,promptEval:`Оценка промпта:`,generation:`Генерация:`,modelLoad:`Загрузка модели:`,totalTime:`Общее время:`,generatedAt:`Сгенерировано в:`},userMenu:{loggedOut:`Вы вышли из системы`,pictureUpdated:`Фото профиля обновлено`,failedUpdateAvatar:`Не удалось обновить аватар`,failedUpdatePicture:`Не удалось обновить фото профиля`,noEmail:`Email не указан`,changePicture:`Изменить фото`,settings:`Настройки`,userManagement:`Управление пользователями`,signOut:`Выйти`,changeProfilePicture:`Изменить фото профиля`},pluginManager:{title:`Менеджер плагинов`,upload:`Загрузить`,addJson:`Добавить JSON`,browseHF:`Обзор HF Hub`,confirmDelete:`Вы уверены, что хотите удалить этот плагин?`,uploading:`Загрузка плагина...`,pasteJson:`Вставьте JSON плагина сюда...`,installPlugin:`Установить плагин`,loading:`Загрузка плагинов...`,noPlugins:`Нет установленных плагинов`,noPluginsDescription:`Загрузите файл плагина или добавьте плагин из JSON.`,active:`Активен`,id:`ID`,endpoint:`Эндпоинт`,activate:`Активировать`,deactivate:`Деактивировать`,activePlugin:`Активный плагин`,activePluginDescription:`Все запросы чата будут направляться через этот плагин`,variables:{title:`Переменные`,save:`Сохранить`,saving:`Сохранение...`,saved:`Переменные сохранены`,saveFailed:`Не удалось сохранить переменные`,resetDefaults:`Сбросить по умолчанию`,reset:`Переменные сброшены`,sensitiveSet:`Значение задано (введите новое для изменения)`}},huggingface:{title:`Браузер моделей HuggingFace`,subtitle:`Просматривайте и выбирайте модели из Hub`,searchPlaceholder:`Поиск моделей...`,filters:`Фильтры`,task:`Задача`,sortBy:`Сортировать по`,noModels:`Модели не найдены`,adjustSearch:`Попробуйте изменить поисковый запрос или фильтры`,gated:`Ограниченный`,selected:`Выбрано`,select:`Выбрать`,refresh:`Обновить`,modelsFound:`моделей найдено`},demoMode:{title:`Демо-режим`,github:`GitHub`},personaBackground:{label:`Фоновое изображение`,uploadBackgroundImage:`Загрузить фоновое изображение`,dragAndDrop:`Перетащите изображение или нажмите для выбора`,chooseImage:`Выбрать изображение`,uploading:`Загрузка...`,enterImageUrl:`Или введите URL изображения`,supportedFormats:`Поддерживает: JPG, PNG, GIF, WebP (макс. 5МБ). Широкие альбомные изображения подходят лучше.`,customBackground:`Пользовательское фоновое изображение`,clickToChange:`Нажмите для изменения или удаления`,removed:`Фон удален`,uploaded:`Фон успешно загружен`,invalidFile:`Пожалуйста, выберите действительный файл изображения`,fileTooLarge:`Размер фонового изображения должен быть менее 5МБ`,readFailed:`Не удалось прочитать файл изображения`,uploadFailed:`Не удалось загрузить фоновое изображение`},modelSelector:{searchInstalled:`Поиск установленных моделей...`,searchOllama:`Поиск в библиотеке Ollama...`,searchHuggingFace:`Поиск на HuggingFace...`,selectModel:`Выбрать модель`,personas:`Персоны`,ollamaModels:`Модели Ollama`,pluginModels:`Модели плагинов`,actions:`Действия`,installed:`Установлено`,use:`Использовать`,pull:`Загрузить`,pullRestricted:`Установка моделей в этом экземпляре доступна только администраторам.`,adminOnlyPull:`Только администраторы`},libreClaw:{title:`Агенты`,subtitle:`Запуск локального агента, утверждения, расписания, память, инструменты и использование.`,dashboard:`Панель управления`,connection:{disconnectedTitle:`Демон Libre Claw не подключен`,disconnectedDescription:`Запустите его локально с <command>libre-claw start</command> или установите <env>LIBRE_CLAW_BASE_URL</env> во внутренней среде.`},status:{connected:`Подключено`,disconnected:`Отключено`,activeRuns:`{{count}} активен`,activeRuns_plural:`{{count}} активен`},states:{queued:`В очереди`,running:`Выполняется`,blocked:`Заблокировано`,done:`Готово`,failed:`Не удалось`,cancelled:`Отменено`},startRun:{title:`Запустить выполнение агента`,placeholder:`Попросите Libre Claw проверить репозиторий, исправить ошибку, выполнить проверку, запланировать отчет...`,chatRun:`Бег в чате`,goalMode:`Режим цели`,providerOverride:`Переопределение поставщика`,modelOverride:`Переопределение модели`,run:`Запустить`},modelRoute:{title:`Модельный маршрут`,providerPlaceholder:`поставщик`,modelPlaceholder:`модель`,persistGlobal:`Сохранять глобальную конфигурацию Libre Claw`,saveModel:`Сохранить модель`,theme:`Тема Libre Claw`,saveTheme:`Сохранить тему`},runs:{title:`Запуски`,empty:`Запусков Libre Claw пока нет.`},timeline:{title:`Хронология выполнения`,empty:`Выберите запуск, чтобы просмотреть его события.`,streaming:`Потоковая передача...`,assistantResponse:`Ответ Ассистента`,resultOk:`ок`,resultError:`ошибка`,labels:{userMessage:`Сообщение пользователя`,toolCall:`Вызов инструмента`,toolResult:`Результат инструмента`,approvalRequest:`Запрос на одобрение`,approvalResponse:`Ответ на одобрение`,runStarted:`Запуск начат`,runFinished:`Запуск завершен`,usage:`Использование`,error:`Ошибка`}},approvals:{needed:`Требуется одобрение`,allowOnce:`Разрешить один раз`,alwaysAllowTool:`Всегда разрешать инструмент`,deny:`Отклонить`,toolApprovalRequested:`Требуется одобрение инструмента`},automations:{title:`Автоматизация`,namePlaceholder:`Имя`,schedulePlaceholder:`daily 09:00`,promptPlaceholder:`Подсказка автоматизации`,create:`Создать`,empty:`Никакой запланированной автоматизации Libre Claw.`,runNow:`Запустить сейчас`,pause:`Пауза`,resume:`Возобновить`,routes:{report:`Отчет`,telegram:`Telegram`},status:{active:`Активный`,paused:`Приостановлено`}},usageFallback:{title:`Использование и резервный вариант`,usage:`Использование`,fallbackRoute:`Резервный маршрут`,noUsage:`Записей об использовании пока нет.`},metrics:{provider:`Поставщик`,model:`Модель`,input:`Ввод`,output:`Выход`,cached:`Кэшированный`,reasoning:`Рассуждение`,cost:`Стоимость`,tool:`Инструмент`,resolution:`Разрешение`,state:`Состояние`,stopReason:`Причина остановки`,tokens:`{{formatted}} жетон`,tokens_plural:`{{formatted}} жетоны`},fallbacks:{tool:`инструмент`,unknown:`неизвестно`,resolved:`решено`,unknownError:`Неизвестная ошибка`},toasts:{loadStatusFailed:`Не удалось загрузить статус Libre Claw.`,enterTask:`Введите задачу на Libre Claw`,runStarted:`Запуск Libre Claw начат`,startRunFailed:`Не удалось запустить Libre Claw`,runCancelled:`Запуск отменен`,cancelRunFailed:`Не удалось отменить запуск`,approved:`Утверждено`,denied:`Отказано`,resolvePermissionFailed:`Не удалось разрешить разрешение`,providerModelRequired:`Требуется поставщик и модель.`,modelUpdated:`Модель Libre Claw обновлена`,updateModelFailed:`Не удалось обновить модель`,themeUpdated:`Тема Libre Claw обновлена`,updateThemeFailed:`Не удалось обновить тему`,automationRequired:`Укажите название автоматизации, расписание и подсказку.`,automationCreated:`Автоматизация создана`,createAutomationFailed:`Не удалось создать автоматизацию`,automationUpdated:`Автоматизация обновлена`,updateAutomationFailed:`Не удалось обновить автоматизацию`}},work:JSON.parse(`{"title":"Работа","subtitle":"Изолированные рабочие пространства моделей","tasks":{"title":"Задачи","subtitle":"Постоянные локальные рабочие пространства","new":"Новая задача","emptyTitle":"Пока нет рабочих задач","empty":"После отправки первого сообщения ваши рабочие задачи появятся здесь.","untitled":"Задача без названия","actions":"Действия с задачей","delete":"Удалить задачу","deleteNamed":"Удалить «{{title}}»","deleteConfirm":"Удалить «{{title}}» и её рабочее пространство навсегда?","close":"Закрыть список задач","open":"Открыть список задач","rename":"Название задачи","loading":"Загрузка задачи…","notFound":"Эта рабочая задача недоступна","back":"Начать новую задачу","status":"Статус: {{status}}"},"landing":{"title":"Начать новую рабочую задачу","description":"Предоставьте локальной модели или модели настроенного провайдера постоянное изолированное рабочее пространство. Она сможет просматривать файлы, запускать инструменты и продолжить с места остановки, когда вы вернётесь.","isolated":"Изоляция","isolatedBody":"У каждой задачи собственный контейнер и собственные файлы.","durable":"Сохранность","durableBody":"Вернитесь к разговору и рабочему пространству позже.","controlled":"Контроль","controlledBody":"Среда выполнения и файлы задачи остаются изолированными от хоста."},"composer":{"placeholder":"Опишите, что вы хотите создать или изменить…","model":"Рабочая модель","noModels":"Нет моделей, совместимых с режимом «Работа»","cancel":"Остановить","send":"Запустить","hint":"Каждая задача хранит собственные файлы и историю. Проверяйте результаты модели перед использованием.","remoteTitle":"Удалённый провайдер","remoteHint":"Разговор и результаты инструментов отправляются в настроенный сервис. Один автономный запуск может несколько раз обратиться к провайдеру, что может повлечь расходы. Файлы рабочего пространства остаются локальными, если только инструмент не возвращает их содержимое.","remoteDismiss":"Скрыть","remoteDismissLabel":"Скрыть уведомление об удалённом провайдере","remoteDismissFailed":"Не удалось сохранить настройку удалённого провайдера.","noModelSelected":"Не выбрана модель, совместимая с режимом «Работа»."},"conversation":{"ready":"Рабочее пространство готово","empty":"Продолжите задачу ниже. Этот разговор и его файлы остаются привязанными к данному рабочему пространству.","loadOlder":"Загрузить предыдущие сообщения"},"status":{"preparing":"Подготовка изолированного рабочего пространства…","running":"Работа в локальном рабочем пространстве…"},"statusLabels":{"idle":"Ожидание","thinking":"Думает","complete":"Завершено","needsInput":"Требуется ввод","error":"Ошибка"},"live":{"connecting":"Подключение к обновлениям в реальном времени…","reconnecting":"Повторное подключение к обновлениям в реальном времени…","unavailable":"Обновления в реальном времени недоступны","newActivity":"Новая активность","skillsLoaded":"Навыки рабочего пространства · {{count}}"},"runtime":{"unavailable":"Среда выполнения недоступна","ready":"Среда выполнения готова","readyOllama":"Docker готов","readyPlugin":"Docker и плагин готовы","readyHybrid":"Docker и модели готовы","reason":"Требуется Docker и доступный провайдер модели Ollama или плагина."},"workspace":{"label":"Режимы рабочего пространства","files":"Файлы","activity":"Активность","preview":"Предпросмотр","resize":"Изменить размеры разговора и рабочего пространства","resizeHint":"Перетащите, чтобы изменить размер. Для точной настройки используйте клавиши со стрелками. Дважды щёлкните или нажмите Enter, чтобы сбросить.","splitSize":"Разговор {{conversation}}%, рабочее пространство {{workspace}}%","terminal":"Терминал"},"files":{"discard":"Отменить несохранённые изменения файла?","leaveWithDraft":"Покинуть этот файл? Несохранённое изменение останется в браузере как черновик.","up":"Родительская папка","back":"Назад к файлам","empty":"В этой папке пока нет файлов.","select":"Выберите файл, чтобы просмотреть и изменить его.","editorLabel":"Редактор файла: {{path}}","format":"Форматировать","formatted":"Код отформатирован.","formatFailed":"Не удалось отформатировать этот файл.","formatShortcut":"Форматировать (Shift+Alt+F)","formatTooLarge":"Форматирование доступно только для файлов до 100 000 символов и 4 000 строк.","formatUnsupported":"Форматирование недоступно для этого типа файлов.","saveShortcut":"Сохранить (⌘/Ctrl+S)","highlightPaused":"Для больших файлов подсветка в реальном времени приостановлена, чтобы редактор работал быстро.","plainTextLarge":"Обычный текст · большой файл","changes":"Изменения","changesSince":"Что изменилось с последнего хода","diffLabel":"Изменения с последнего хода: {{path}}","diffFolded":"{{count}} строк без изменений"},"activity":{"empty":"Здесь появятся команды, операции с файлами и результаты инструментов.","toolActivity":"Активность инструментов","details":"Подробности","kinds":{"message":"Сообщение","toolCall":"Вызов инструмента","toolResult":"Результат инструмента","error":"Ошибка"}},"preview":{"command":"Необязательная команда запуска","start":"Запустить предпросмотр","stop":"Остановить предпросмотр","open":"Открыть","starting":"Запуск предпросмотра…","frameTitle":"Предпросмотр рабочего пространства","failed":"Не удалось запустить предпросмотр. Проверьте Активность и попробуйте другую команду.","empty":"Запустите приложение в этом рабочем пространстве, чтобы просмотреть его здесь."},"mobile":{"surface":"Область задачи","conversation":"Разговор","workspace":"Рабочее пространство"},"toasts":{"runFailed":"Не удалось запустить рабочую задачу.","updateFailed":"Не удалось обновить эту задачу.","renameFailed":"Не удалось переименовать эту задачу.","cancelled":"Запуск рабочей задачи остановлен.","cancelFailed":"Не удалось остановить запуск рабочей задачи.","deleteFailed":"Не удалось удалить эту рабочую задачу.","saveFailed":"Не удалось сохранить этот файл.","saved":"Файл сохранён.","previewFailed":"Не удалось запустить предпросмотр.","previewStopFailed":"Не удалось остановить предпросмотр."},"terminal":{"connecting":"Открывается оболочка в песочнице…","closed":"Сеанс терминала завершён.","failed":"Не удалось запустить сеанс терминала.","reconnect":"Переподключиться","unavailable":"Интерактивный терминал недоступен в этой установке.","blockedByRun":"Модель использует этот контейнер. Терминал откроется после завершения хода.","taskRunning":"Выполняется ход модели"}}`)};export{e as default};
@@ -1,2 +0,0 @@
1
- var e={common:{loading:`Laddar...`,save:`Spara`,saving:`Sparar...`,cancel:`Avbryt`,delete:`Radera`,edit:`Redigera`,close:`Stäng`,back:`Tillbaka`,next:`Nästa`,confirm:`Bekräfta`,error:`Fel`,success:`Lyckades`,warning:`Varning`,or:`eller`,optional:`valfritt`,enabled:`Aktiverad`,disabled:`Inaktiverad`,on:`På`,off:`Av`,yes:`Ja`,no:`Nej`,search:`Sök`,noResults:`Inga resultat hittades`,retry:`Försök igen`,refresh:`Uppdatera`,download:`Ladda ner`,upload:`Ladda upp`,export:`Exportera`,import:`Importera`,reset:`Återställ`,apply:`Tillämpa`,clear:`Rensa`,all:`Alla`,none:`Ingen`,default:`Standard`,custom:`Anpassad`,remove:`Ta bort`},brand:{name:`Libre WebUI`,shortName:`Libre`},auth:{login:{title:`Välkommen tillbaka`,subtitle:`Logga in på ditt konto för att fortsätta`,username:`Användarnamn`,usernamePlaceholder:`Ange ditt användarnamn`,password:`Lösenord`,passwordPlaceholder:`Ange ditt lösenord`,signIn:`Logga in`,signingIn:`Loggar in...`,noAccount:`Har du inget konto?`,signUpHere:`Registrera dig här`,loginSuccess:`Inloggningen lyckades!`,loginFailed:`Inloggningen misslyckades`,checkCredentials:`Inloggningen misslyckades. Kontrollera dina uppgifter.`,enterBoth:`Ange både användarnamn och lösenord`,githubSuccess:`GitHub-inloggningen lyckades!`,githubFailed:`GitHub-autentiseringen misslyckades`,githubVerifyFailed:`Kunde inte verifiera GitHub-autentiseringen`},signup:{title:`Skapa konto`,subtitle:`Registrera ett nytt konto`,username:`Användarnamn`,usernamePlaceholder:`Välj ett användarnamn`,email:`E-post`,emailPlaceholder:`din@epost.se`,password:`Lösenord`,passwordPlaceholder:`Välj ett lösenord`,confirmPassword:`Bekräfta lösenord`,confirmPasswordPlaceholder:`Bekräfta ditt lösenord`,createAccount:`Skapa konto`,creatingAccount:`Skapar konto...`,hasAccount:`Har du redan ett konto?`,signInHere:`Logga in här`,signupSuccess:`Kontot skapades!`,signupFailed:`Registreringen misslyckades`,tryAgain:`Registreringen misslyckades. Försök igen.`,usernameRequired:`Användarnamn och lösenord krävs`,passwordMismatch:`Lösenorden matchar inte`,passwordTooShort:`Lösenordet måste vara minst 6 tecken långt`},logout:{button:`Logga ut`,success:`Utloggningen lyckades`},oauth:{continueWith:`Fortsätt med {{provider}}`,connectingTo:`Ansluter till {{provider}}...`,github:`GitHub`,huggingFace:`Hugging Face`},checkingAuth:`Kontrollerar autentisering...`,welcome:`Välkommen`,noEmail:`Ingen e-post angiven`,role:`Roll`,id:`ID`,userId:`Användar-ID`,signInDescription:`Logga in med ditt GitHub-konto för att fortsätta`,signInWithGitHub:`Logga in med GitHub`,jwtActive:`JWT-autentisering aktiv`,jwtDescription:`JWT-baserad autentisering med GitHub OAuth`,github:`GitHub`,provider:`Leverantör`},setup:{welcome:{title:`Välkommen till Libre WebUI`,subtitle:`Låt oss komma igång`,description:`Konfigurera din Libre WebUI-instans i några enkla steg`,createAdmin:`Skapa administratörskonto`,features:{secure:{title:`Säker och privat`,description:`Dina konversationer stannar på din enhet`},fast:{title:`Snabb och responsiv`,description:`Optimerad för hastighet och prestanda`},openSource:{title:`Öppen källkod`,description:`Fri och öppen mjukvara`}}},admin:{title:`Skapa administratörskonto`,subtitle:`Administratörskonfiguration`,description:`Skapa det första administratörskontot för din Libre WebUI-instans`,usernamePlaceholder:`Ange administratörens användarnamn`,passwordPlaceholder:`Ange lösenord (minst 6 tecken)`,confirmPlaceholder:`Bekräfta ditt lösenord`,creating:`Skapar...`,createAdmin:`Skapa administratör`,success:`Administratörskontot skapades!`,failed:`Kunde inte skapa administratörskonto`,fillAllFields:`Fyll i alla fält`,note:`Detta blir det primära administratörskontot för din Libre WebUI-instans`},encryptionKey:{title:`Spara din krypteringsnyckel`,subtitle:`Viktigt: Spara denna nyckel`,description:`Denna krypteringsnyckel skyddar dina känsliga data. Förvara den säkert - du behöver den om du någonsin behöver återställa din databas.`,warning:`Varning`,warningText:`Om du förlorar denna nyckel och behöver återställa din databas kommer din krypterade data (API-nycklar, inställningar) att vara oåterkalleligt förlorad.`,label:`Din krypteringsnyckel`,loading:`Laddar...`,copyToClipboard:`Kopiera till urklipp`,copied:`Krypteringsnyckeln kopierades till urklipp!`,copyFailed:`Kunde inte kopiera nyckeln till urklipp`,envNote:`Denna nyckel sparas också i din backend/.env-fil som ENCRYPTION_KEY`,acknowledgment:`Jag har sparat min krypteringsnyckel på ett säkert ställe och förstår att förlust av den kan resultera i dataförlust.`,confirmRequired:`Bekräfta att du har sparat krypteringsnyckeln`,continue:`Fortsätt till Libre WebUI`}},chat:{greeting:{morning:`God morgon`,afternoon:`God eftermiddag`,evening:`God kväll`,night:`God natt`},welcome:{helpToday:`Vad kan jag hjälpa till med idag?`,helpTonight:`Vad kan jag hjälpa till med ikväll?`,variety:{create:{title:`Vad ska vi skapa?`,subtitle:`Börja med en tanke, en skiss eller ett envist problem.`},explore:{title:`Var ska vi börja?`,subtitle:`Ta med frågan som du ständigt återkommer till.`},imagine:{title:`Vad föreställer du dig?`,subtitle:`Vi kan forma det tillsammans.`},focus:{title:`Vad förtjänar din uppmärksamhet?`,subtitle:`Låt oss göra nästa steg tydligt.`},untangle:{title:`Var sitter knuten?`,subtitle:`Ge mig den röriga versionen först.`},momentum:{title:`Redo när du är.`,subtitle:`Plocka upp en idé, en plan eller en oavslutad tråd.`},open:{title:`Vad tänker du på?`,subtitle:`En liten tanke eller ett ambitiöst projekt. Båda fungerar.`},challenge:{title:`Vad ska vi lösa?`,subtitle:`Berätta vad som inte fungerar än.`},draft:{title:`Låt oss börja någonstans.`,subtitle:`Det behöver inte vara finslipat.`},possibility:{title:`Vad skulle det här kunna bli?`,subtitle:`Visa mig råmaterialet.`},unexpected:{title:`Skapa något oväntat.`,subtitle:`Ge mig en begränsning, en stämning eller en halvfärdig idé.`}}},input:{placeholder:`Skicka ett meddelande`,messagePlaceholder:`Meddelande...`,attachImages:`Bifoga bilder`,attachments:`Bilagor och avancerade funktioner`,sendMessage:`Skicka meddelande`,stopGeneration:`Stoppa generering`},session:{new:`Ny chatt`,work:`Arbete`,chat:`Chatt`,private:`Privat`,privateMode:`Privat läge`,privateDescription:`Denna konversation sparas inte`,privateTooltip:`Starta en privat konversation som inte sparas`,deleteConfirm:`Är du säker på att du vill radera denna chatt?`,generatingTitle:`Genererar titel`,noChats:`Inga chattar ännu`,createFirst:`Skapa din första chatt ovan`,chats:`Chattar`,renameChat:`Byt namn på chatt`,deleteChat:`Radera chatt`},persona:{applied:`Persona tillämpad`,label:`Persona`},model:{updated:`Modell uppdaterad`,noModels:`Inga modeller tillgängliga`,noModelsDescription:`Inga modeller tillgängliga. Se till att Ollama körs och har modeller installerade.`,pullCommand:`ollama pull llama3.2:3b`,noModelsTooltip:`Inga modeller tillgängliga. Se till att Ollama körs och modeller är installerade.`},footer:{disclaimer:`AI kan göra misstag - verifiera viktig information`,images:`{{count}} bild`,images_plural:`{{count}} bilder`,structuredOutput:`Strukturerad utdata`},mediaUpload:{dropImagesHere:`Släpp bilder här eller`,supportedFormats:`Stöder: JPG, PNG, GIF, WebP (max 10MB vardera)`,browse:`bläddra`},structuredOutput:{title:`Svarsformat`,none:`Inget (naturligt språk)`,noneDescription:`Standardsvar i naturligt språk`,json:`JSON`,jsonDescription:`Strukturerat JSON-format`,list:`Lista`,listDescription:`Array av objekt`,summary:`Sammanfattning`,summaryDescription:`Dokumentsammanfattning med huvudpunkter`,analysis:`Analys`,analysisDescription:`Strukturerad analys med för- och nackdelar`,custom:`Anpassat schema`,customDescription:`Definiera ditt eget JSON-schema`,customSchema:`Anpassat JSON-schema`,schemaPreview:`Schemaförhandsgranskning`,applySchema:`Tillämpa schema`,cancel:`Avbryt`,enabled:`Strukturerad utdata aktiverad`}},sidebar:{navigation:{chat:`Chatt`,models:`Modeller`,personas:`Personas`,imagine:`Skapa bild`,settings:`Inställningar`,userManagement:`Användarhantering`,signOut:`Logga ut`,agents:`Agenter`,work:`Arbete`,exploreLabel:`Utforska`},toggleSize:`Växla sidofältets storlek`,expandSidebar:`Expandera sidofältet`},user:{menu:{changePicture:`Ändra bild`,settings:`Inställningar`,userManagement:`Användarhantering`,logout:`Logga ut`},avatar:{title:`Ändra profilbild`,updated:`Profilbilden uppdaterad`,updateFailed:`Kunde inte uppdatera profilbilden`,saving:`Sparar...`,label:`Avatar`,uploadAvatarImage:`Ladda upp avatarbild`,dragAndDrop:`Dra och släpp en bild eller klicka för att bläddra`,chooseImage:`Välj bild`,uploading:`Laddar upp...`,enterImageUrl:`Eller ange bild-URL`,supportedFormats:`Stöder: JPG, PNG, GIF, WebP (max 2 MB). Fyrkantiga bilder fungerar bäst.`,customAvatar:`Anpassad avatarbild`,clickToChange:`Klicka för att ändra eller ta bort`,removed:`Avatar borttagen`,uploaded:`Avatar uppladdad`,invalidFile:`Vänligen välj en giltig bildfil`,fileTooLarge:`Avatarbildens storlek måste vara mindre än 2 MB`,readFailed:`Kunde inte läsa bildfilen`,uploadFailed:`Kunde inte ladda upp avatarbild`},profile:{noEmail:`Ingen e-post angiven`}},settings:JSON.parse(`{"title":"Inställningar","tabs":{"appearance":"Utseende","model":"Modell","systemMessage":"Systemmeddelande","plugins":"Tillägg","generation":"Generering","documents":"Dokument","tts":"Tal","imageGen":"Bilder","data":"Data","about":"Om"},"appearance":{"title":"Utseende","language":{"title":"Språk","description":"Välj ditt föredragna språk"},"theme":{"title":"Tema","light":"Ljust","dark":"Mörkt","amoled":"Djupsvart","system":"System"},"accent":{"title":"Accentfärg","custom":"Anpassad färg","useColor":"Använd {{color}} som accent","behaviorTitle":"Gränssnittspalett","behaviorDescription":"Välj om accentfärgen bara används på kontroller eller anpassar hela det ljusa eller mörka gränssnittet.","defaultStyle":"Standard","defaultStyleDescription":"Behåll neutrala ytor i ljust och mörkt tema.","adaptedStyle":"Anpassa till accent","adaptedStyleDescription":"Färga ytor, kanter och text med accentfärgen."},"chatInterface":{"title":"Chattgränssnitt","showUsername":"Visa användarnamn","showUsernameDescription":"Visa användarnamn i chattmeddelanden"},"background":{"title":"Bakgrundsbild","enable":"Aktivera bakgrundsbild","enableDescription":"Visa anpassad bakgrund med oskärpa","blur":"Oskärpa","opacity":"Opacitet","upload":"Ladda upp bakgrundsbild","dragDrop":"Dra och släpp en bild eller klicka för att bläddra","chooseImage":"Välj bild"}},"saveSettings":"Spara inställningar","model":{"title":"Modellinställningar","defaultModel":"Standardmodell","defaultModelDescription":"Denna modell används som standard för nya konversationer","selectModel":"Välj en modell","updateAll":"Uppdatera alla modeller","updateAllDescription":"Sök efter uppdateringar och hämta senaste versionerna av alla installerade modeller","updateAllButton":"Uppdatera alla","updating":"Uppdaterar modeller...","currentModelInfo":"Information om nuvarande modell","name":"Namn","size":"Storlek","family":"Familj","format":"Format","status":"Status","statusStarting":"Startar...","statusComplete":"Klar","statusError":"Fel","bulkOperations":"Massoperationer","autoTitle":{"title":"Automatisk titelgenerering","enable":"Aktivera automatisk titel","enableDescription":"Generera automatiskt titlar för nya konversationer","taskModel":"Uppgiftsmodell","selectTaskModel":"Välj uppgiftsmodell","taskModelDescription":"Modell som används för att generera konversationstitlar"},"persona":"Persona","updatingModel":"Uppdaterar {{name}} ({{current}}/{{total}})","modelsProgress":"{{current}} av {{total}} modeller","modelPullAccess":"Åtkomst till modellinstallation","modelPullAccessDescription":"Tillåt icke-administratörer att hämta och installera nya modeller.","modelPullAccessSaved":"Behörigheter för modellinstallation har uppdaterats","modelPullAccessSaveFailed":"Det gick inte att uppdatera behörigheter för modellinstallation"},"systemMessage":{"title":"Systemmeddelande","description":"Ställ in ett anpassat systemmeddelande som används för alla nya konversationer.","placeholder":"Ange ett systemmeddelande...","saved":"Systemmeddelande sparat","saveFailed":"Kunde inte spara systemmeddelande"},"plugins":{"title":"Tillägg","description":"Hantera dina installerade tillägg","addNew":"Lägg till nytt tillägg","upload":"Ladda upp tillägg","addJson":"Lägg till JSON","uploading":"Laddar upp...","jsonPlaceholder":"Klistra in tilläggs-JSON-konfiguration...","install":"Installera tillägg","noPlugins":"Inga tillägg installerade","noPluginsDescription":"Lägg till ett tillägg för att utöka funktionaliteten","loading":"Laddar tillägg...","installed":"Installerade tillägg","active":"Aktiva tillägg","activeLabel":"Aktiv","inactive":"Inaktiv","activate":"Aktivera","deactivate":"Inaktivera","models":"modeller","apiKeySet":"API-nyckel inställd","apiKeyConfiguration":"API-nyckelkonfiguration","apiKeyEnvAlternative":"Alternativt, ställ in","environmentVariable":"miljövariabel","apiKeyConfigured":"API-nyckel konfigurerad","apiKeyPlaceholder":"Ange din API-nyckel...","saveApiKey":"Spara API-nyckel","apiKey":{"title":"API-nyckel","placeholder":"Ange API-nyckel","save":"Spara nyckel","remove":"Ta bort nyckel","configured":"API-nyckel konfigurerad","notConfigured":"API-nyckel krävs","saved":"API-nyckeln sparades","removed":"API-nyckeln togs bort","saveFailed":"Kunde inte spara API-nyckel","removeFailed":"Kunde inte ta bort API-nyckel","enterKey":"Ange en API-nyckel"},"variables":"Variables"},"generation":{"title":"Genereringsalternativ","description":"Konfigurera hur AI:n genererar svar","coreParameters":"Kärnparametrar","temperature":"Temperatur","temperatureDescription":"Styr slumpmässighet. Lägre värden är mer fokuserade, högre värden mer kreativa.","topP":"Top P","topPDescription":"Styr mångfald via kärnsampling. Lägre värden fokuserar på sannolika tokens.","topK":"Top K","topKDescription":"Begränsar tokenval till de K mest sannolika. Sätt till 0 för att inaktivera.","minP":"Min P","minPDescription":"Minsta sannolikhetströskel för tokenval.","generationControl":"Genereringskontroll","maxTokens":"Max tokens","maxTokensDescription":"Maximalt antal tokens att generera i svaret.","repeatPenalty":"Upprepningsstraff","repeatPenaltyDescription":"Bestraffar upprepade tokens. Högre värden minskar upprepning.","contextLength":"Kontextlängd","contextLengthDescription":"Maximal kontextfönsterstorlek för konversationer.","seed":"Seed","optional":"valfritt","random":"Slumpmässig","seedDescription":"Ställ in en specifik seed för reproducerbara resultat.","advancedOptions":"Avancerade alternativ","presencePenalty":"Närvarostraff","presencePenaltyDescription":"Bestraffar tokens som förekommer i kontexten.","frequencyPenalty":"Frekvensstraff","frequencyPenaltyDescription":"Bestraffar ofta använda tokens.","stopSequences":"Stoppsekvenser","commaSeparated":"kommaseparerade","stopSequencesDescription":"Anpassade tokens som stoppar genereringen när de påträffas.","resetDefaults":"Återställ till standardvärden","saveOptions":"Spara alternativ","embeddingSettings":"Inbäddningsinställningar","enableEmbeddings":"Aktivera dokumentinbäddningar"},"documents":{"title":"Dokumentinställningar","embeddings":{"title":"Inbäddningar","enable":"Aktivera dokumentinbäddningar","model":"Inbäddningsmodell","modelDescription":"Välj modell för dokumentinbäddning","chunkSize":"Segmentstorlek","chunkSizeInTokens":"(i tokens)","chunkSizeDescription":"Storlek på textsegment för inbäddning","chunkOverlap":"Segmentöverlappning","chunkOverlapInTokens":"(i tokens)","chunkOverlapDescription":"Överlappning mellan på varandra följande segment","similarityThreshold":"Likhetströskel","similarityDescription":"Minsta likhetspoäng för att inkludera resultat","status":"Inbäddningsstatus","statusLabel":"Status","available":"Tillgänglig","unavailable":"Ej tillgänglig","chunksWithEmbeddings":"Segment med inbäddningar","coverage":"Täckning","regenerate":"Regenerera inbäddningar","regenerating":"Regenererar..."}},"tts":{"title":"Text-till-tal","description":"Konfigurera text-till-tal-inställningar för uppläsning av meddelanden","loadingProviders":"Laddar TTS-leverantörer...","noProviders":"Inga TTS-leverantörer","noProvidersDescription":"Konfigurera ett tillägg med TTS-stöd för att aktivera text-till-tal","enable":"Aktivera TTS","enableDescription":"Tillåt text-till-tal för assistentmeddelanden","autoPlay":"Spela upp svar automatiskt","autoPlayDescription":"Läs automatiskt upp nya assistentmeddelanden","streamSentences":"Strömma meningar","streamSentencesDescription":"Spela upp ljud mening för mening istället för att vänta på hela meddelandet. Rekommenderas för lokal TTS för att undvika timeout vid långa meddelanden.","voiceConfiguration":"Röstkonfiguration","model":"TTS-modell","modelDescription":"Välj modell för text-till-tal-generering","voice":"Röst","selectVoice":"Välj en röst","voiceDescription":"Välj röst för text-till-tal","speed":"Hastighet","speedSlow":"0,5x","speedNormal":"1,0x","speedFast":"2,0x","availableProviders":"Tillgängliga leverantörer","models":"modeller","test":"Testa","testing":"Testar...","stop":"Stoppa"},"imageGen":{"title":"Bildgenerering","description":"Konfigurera bildgenereringsinställningar och leverantörer","loadingProviders":"Laddar bildgenereringsleverantörer...","noProviders":"Inga bildgenereringsleverantörer","noProvidersDescription":"Konfigurera ett tillägg med bildgenereringsstöd","enable":"Aktivera bildgenerering","enableDescription":"Tillåt AI-bildgenerering i konversationer","configuration":"Konfiguration","model":"Modell","modelDescription":"Välj modell för bildgenerering","size":"Storlek","sizeDescription":"Upplösning för genererade bilder","quality":"Kvalitet","qualityDescription":"Kvalitetsnivå för genererade bilder","style":"Stil","styleDescription":"Stilförinställning för genererade bilder","availableProviders":"Tillgängliga leverantörer","models":"modeller"},"data":{"title":"Datahantering","export":"Exportera data","exportDescription":"Ladda ner all din data inklusive inställningar, sessioner och dokument.","exportAll":"Exportera all data","import":"Importera data","importDescription":"Importera data från en tidigare export.","importData":"Importera data","importing":"Importerar...","clearSessions":"Rensa sessioner","clearSessionsDescription":"Radera alla chattsessioner. Denna åtgärd kan inte ångras.","clearAll":"Rensa alla","clearing":"Rensar...","importOptions":"Importalternativ","importOptionsDescription":"Välj hur befintlig data ska hanteras","skipDuplicates":"Hoppa över dubbletter","overwrite":"Skriv över befintliga","importResults":"Importresultat","preferences":"Inställningar","imported":"Importerade","failed":"Misslyckades","sessions":"Sessioner","importedLabel":"importerade","skipped":"hoppades över","documents":"Dokument","errors":"Fel"},"about":{"title":"Om","versionLabel":"Version","ollama":{"title":"Ollama-status","version":"Version","healthy":"Fungerar","unhealthy":"Fungerar inte"},"stats":{"models":"Modeller","sessions":"Sessioner"},"features":{"privacy":{"title":"Integritet först","description":"Din data stannar på din enhet"},"openSource":{"title":"Öppen källkod","description":"Fri och öppen mjukvara"},"localInference":{"title":"Lokal inferens","description":"Kör AI-modeller lokalt med Ollama"}},"openSourceBy":"Öppen källkod av {{company}}","links":{"title":"Länkar","github":"GitHub","githubDescription":"Visa källkod och bidra","website":"Webbplats","websiteDescription":"Besök vår webbplats","ollama":"Ollama","ollamaDescription":"Läs mer om Ollama","documentation":"Dokumentation","reportIssue":"Rapportera problem","reportIssueDescription":"Felrapporter och funktionsförfrågningar","gitlab":"GitLab-spegel","gitlabDescription":"Självhostat GitLab-förråd","documentationDescription":"Guider, handledningar och API-referens"},"version":"Version {{version}}"},"groups":{"general":"Allmänt","chat":"Chatt","media":"Tal och bilder","connections":"Anslutningar"}}`),models:{title:`Modeller`,subtitle:`Hämta, hantera och övervaka dina Ollama-modeller`,installed:`Installerade modeller`,available:`Tillgängliga modeller`,pull:`Hämta modell`,pulling:`Hämtar...`,delete:`Radera modell`,deleting:`Raderar...`,size:`Storlek`,modified:`Ändrad`,family:`Familj`,parameters:`Parametrar`,quantization:`Kvantisering`,noModels:`Inga modeller installerade`,pullFirst:`Hämta en modell för att komma igång`,noModelsFound:`Inga modeller hittades`},personas:{title:`Personas`,create:`Skapa persona`,edit:`Redigera persona`,delete:`Radera persona`,name:`Namn`,description:`Beskrivning`,systemPrompt:`Systemprompt`,model:`Modell`,avatar:`Avatar`,background:`Bakgrund`,noPersonas:`Inga personas skapade`,createFirst:`Skapa din första persona för att anpassa din chattupplevelse`},gallery:{title:`Galleri`,subtitle:`Ditt AI-genererade bildgalleri`,imageCount:`{{count}} bilder`,generate:`Generera bild`,generateDescription:`Skapa bilder med AI`,generating:`Genererar...`,prompt:`Prompt`,promptPlaceholder:`Beskriv bilden du vill generera...`,noImages:`Inga bilder genererade ännu`,download:`Ladda ner`,delete:`Radera`,regenerate:`Generera om`,model:`Modell`,size:`Storlek`,quality:`Kvalitet`,created:`Skapad`},errors:{generic:`Ett fel uppstod`,network:`Nätverksfel. Kontrollera din anslutning.`,unauthorized:`Du har inte behörighet att utföra denna åtgärd.`,notFound:`Den begärda resursen hittades inte.`,serverError:`Serverfel. Försök igen senare.`,validation:`Kontrollera din inmatning och försök igen.`},keyboard:{title:`Tangentbordsgenvägar`,toggleSidebar:`Växla sidofält`,openSettings:`Öppna inställningar`,toggleDarkMode:`Växla mörkt läge`,showShortcuts:`Visa tangentbordsgenvägar`,closeModals:`Stäng dialogrutor`,groups:{navigation:`Navigering`,settings:`Inställningar`,general:`Allmänt`,chat:`Chatt`},actions:{sendMessage:`Skicka meddelande`,newLine:`Ny rad i meddelande`},footer:`Tryck {{key1}} eller {{key2}} för att visa denna hjälp`,tooltip:`Tangentbordsgenvägar`},modelManager:{title:`Modeller`,loading:`Laddar modeller...`,systemStatus:{online:`Ollama online`,offline:`Ollama offline`,models:`modell`,models_plural:`modeller`,running:`körs`,vram:`VRAM`},sections:{pull:`Hämta ny modell`,library:`Bläddra i bibliotek`,running:`Aktiva modeller`,local:`Lokala modeller`,advanced:`Avancerade åtgärder`,huggingface:`HuggingFace Hub`},pull:{placeholder:`Ange modellnamn (t.ex. llama3.2:3b, deepseek-r1:14b)`,button:`Hämta`,cancel:`Avbryt`,popular:`Populära modeller:`,browseAll:`Bläddra bland alla modeller på ollama.com`,success:`Modellen {{name}} hämtades`,cancelled:`Modellhämtning avbruten`,failed:`Kunde inte hämta modell`,enterName:`Ange ett modellnamn`,restricted:`Modellinstallation är begränsad till administratörer på denna instans.`},progress:{starting:`Initierar...`,pulling:`Laddar ner modell...`,pullingLayer:`laddar ner`,verifying:`Verifierar integritet...`,verifyingDigest:`verifierar sha256-digest`,writing:`Skriver manifest...`,cleaning:`Städar upp...`},library:{available:`tillgänglig`,search:`Sök modeller...`,noResults:`Inga modeller hittades som matchar dina kriterier`,installed:`Installerad`,more:`+{{count}} fler`,refresh:`Uppdatera bibliotek`},local:{noModels:`Inga modeller installerade ännu`,pullToStart:`Hämta en modell ovan för att komma igång`,installed:`installerad`,running:`Körs`,info:`Info`,copy:`Kopiera`,delete:`Radera`,deleteConfirm:`Är du säker på att du vill radera modellen "{{name}}"?`,deleteSuccess:`Modellen {{name}} raderades`,deleteFailed:`Kunde inte radera modell`},advanced:{createModel:`Skapa modell`,fromModelfile:`Från Modelfile`,copyModel:`Kopiera modell`,duplicateExisting:`Duplicera befintlig`,testEmbeddings:`Testa inbäddningar`,generateVectors:`Generera vektorer`,healthCheck:`Hälsokontroll`,testConnection:`Testa anslutning`,healthy:`Ollama fungerar!`},modals:{details:{title:`Modelldetaljer`,info:`Modellinformation`,family:`Familj`,parameters:`Parametrar`,quantization:`Kvantisering`,format:`Format`,systemPrompt:`Systemprompt`,template:`Mall`,license:`Licens`,modelfile:`Modelfile`,noDetails:`Inga detaljer tillgängliga`},copy:{title:`Kopiera modell`,source:`Källmodell`,selectModel:`Välj en modell...`,newName:`Nytt modellnamn`,placeholder:`t.ex. min-anpassade-modell`,copying:`Kopierar...`,button:`Kopiera modell`,success:`Modellen kopierades till {{name}}`,failed:`Kunde inte kopiera modell`,enterBoth:`Ange både käll- och målnamn`},create:{title:`Skapa anpassad modell`,name:`Modellnamn`,namePlaceholder:`t.ex. min-assistent`,modelfile:`Modelfile`,modelfilePlaceholder:`FROM llama3.2
2
- SYSTEM Du är en hjälpsam assistent.`,see:`Se`,docs:`Modelfile-dokumentation`,docsLink:`för syntaxreferens`,creating:`Skapar...`,button:`Skapa modell`,success:`Modellen {{name}} skapades`,failed:`Kunde inte skapa modell`,enterBoth:`Ange modellnamn och Modelfile-innehåll`},embeddings:{title:`Testa inbäddningar`,model:`Inbäddningsmodell`,selectModel:`Välj en modell...`,recommended:`Rekommenderade: nomic-embed-text, mxbai-embed-large`,input:`Inmatningstext`,placeholder:`Ange text att generera inbäddningar för...`,generating:`Genererar...`,button:`Generera inbäddningar`,result:`Resultat ({{count}} dimensioner)`,success:`Genererade {{count}}-dimensionell inbäddningsvektor`,failed:`Kunde inte generera inbäddningar`,enterBoth:`Välj en modell och ange text`}},huggingface:{browseAll:`Bläddra bland alla på HuggingFace`,checkingGguf:`Söker efter GGUF-filer...`,noGgufAvailable:`Inga GGUF-filer tillgängliga för direkt Ollama-hämtning`,ggufFilesCount:`GGUF-filer ({{count}}) - Hämta direkt till Ollama`,noModelsFound:`Inga modeller hittades`,noResults:`Inga modeller hittades. Försök justera din sökning eller filter.`,browseAllLink:`Visa alla`,search:`Sök HuggingFace-modeller...`,by:`av`,gated:`Begränsad åtkomst`,viewOnHF:`Visa på HuggingFace`,sortDownloads:`Nedladdningar`,sortLikes:`Gillar`,sortRecent:`Senaste`,taskTextGeneration:`Textgenerering`,taskTextToSpeech:`Text till tal`,taskTextToImage:`Text till bild`,taskSpeechRecognition:`Taligenkänning`,tasks:{textGen:`Textgenerering`,tts:`Text till tal`,image:`Text till bild`,stt:`Taligenkänning`},sort:{downloads:`Mest nedladdade`,likes:`Mest gillade`,recent:`Nyligen uppdaterade`}}},personaManager:{title:`Personas`,subtitle:`Skapa och hantera AI-personas med anpassade personligheter, minnen och beteenden`,loading:`Laddar personas...`,createButton:`Skapa persona`,importExport:`Importera/Exportera`,stats:{title:`Dina personas`,count:`{{count}} persona skapad`,count_plural:`{{count}} personas skapade`},empty:{title:`Inga personas ännu`,description:`Skapa din första persona för att komma igång med personaliserade AI-interaktioner`,button:`Skapa din första persona`},deleteConfirm:`Är du säker på att du vill radera "{{name}}"?`,deleteSuccess:`Persona "{{name}}" raderades`,downloadSuccess:`Persona "{{name}}" laddades ner`,failed:`Kunde inte {{action}} persona`},personaForm:{title:{create:`Skapa ny persona`,edit:`Redigera persona`},subtitle:{create:`Skapa en ny AI-persona med anpassad personlighet, minnessystem och adaptiv inlärning`,edit:`Anpassa din AI-persona med avancerat minne, adaptiv inlärning och intelligenta parametrar`},loading:`Laddar formulär...`,saved:`Sparad`,tabs:{basic:`Grundläggande`,parameters:`Parametrar`,memory:`Minne och inlärning`,advanced:`Avancerat`},basic:{name:`Namn`,namePlaceholder:`Ange personans namn`,model:`Modell`,selectModel:`Välj en modell`,description:`Beskrivning`,descriptionPlaceholder:`Beskriv din persona...`,systemPrompt:`Systemprompt`,systemPromptPlaceholder:`Ange systemprompten som definierar din personas beteende...`,systemPromptHint:`Systemprompten definierar hur din persona kommer att bete sig och svara.`},parameters:{temperature:`Temperatur`,temperatureHint:`Styr kreativitet kontra konsekvens`,topP:`Top-P`,topPHint:`Styr svarsmångfald`,topK:`Top-K`,topKHint:`Begränsar vokabulär till top-k tokens`,contextWindow:`Kontextfönster`,contextWindowHint:`Maximal konversationshistoriklängd`,maxTokens:`Max tokens`,maxTokensHint:`Maximal svarslängd`,repeatPenalty:`Upprepningsstraff`,repeatPenaltyHint:`Minskar upprepande svar`},memory:{title:`Minnessystem`,subtitle:`Persona minns konversationer över tid`,enableHint:`Aktivera minnessystemet för att låta din persona komma ihåg konversationer och bygga upp kontext över tid.`,loading:`Laddar minnesstatus...`,noData:`Ingen minnesdata ännu`,memories:`Minnen`,mbUsed:`MB använt`,lastBackup:`Senaste säkerhetskopiering`,never:`Aldrig`,maxMemories:`Maximala minnen`,maxMemoriesHint:`Hur många minnen denna persona kan lagra`,retention:`Minnesbevarande`,retentionHint:`Dagar att behålla minnen före rensning`,autoCleanup:`Automatisk rensning av gamla minnen`,wipeAll:`Radera alla minnen`,wipeCannot:`Detta kan inte ångras`,wipeButton:`Radera`,wiping:`Raderar...`,wipeConfirm:`Är du säker på att du vill radera alla minnen? Detta kan inte ångras.`,wipeSuccess:`Raderade {{count}} minnen`},learning:{title:`Adaptiv inlärning`,subtitle:`Persona utvecklas baserat på interaktioner`,enableHint:`Aktivera adaptiv inlärning för att låta din persona utvecklas och personalisera svar baserat på dina interaktioner.`,speed:`Inlärningshastighet`,slow:`Långsam`,slowDesc:`Gradvisa förändringar`,balanced:`Balanserad`,balancedDesc:`Måttlig takt`,fast:`Snabb`,fastDesc:`Snabb anpassning`,autoAdapt:`Anpassa automatiskt till användarpreferenser`,whatLearns:`Vad personan lär sig:`,conversationTone:`Konversationston`,responseStyle:`Svarsstil`,userPreferences:`Användarpreferenser`,topicInterests:`Ämnesintressen`},advanced:{embeddingModel:`Inbäddningsmodell`,embeddingHint:`Välj modell för minneskodning och semantisk sökning. Inbäddningsmodeller visas först, följt av andra tillgängliga modeller.`,noModels:`Inga modeller hittades`,embeddingModels:`Inbäddningsmodeller`,otherModels:`Andra modeller`,installHint:`Installera en inbäddningsmodell:`,recommended:`Rekommenderade: nomic-embed-text, mxbai-embed-large, bge-m3, snowflake-arctic-embed`,aboutTitle:`Om avancerade inställningar`,aboutDescription:`Inbäddningsmodellen används av minnessystemet för att förstå semantisk betydelse och hitta relevanta minnen under konversationer. Välj en modell som passar ditt användningsfall och tillgängliga resurser.`},actions:{cancel:`Avbryt`,save:`Spara`,saving:`Sparar...`,saveClose:`Spara och stäng`,create:`Skapa`},success:{created:`Persona skapad`,updated:`Persona uppdaterad`},error:{saveFailed:`Kunde inte spara`}},personaCard:{enhanced:`Förbättrad`,systemPrompt:`Systemprompt`,memories:`minnen`,use:`Använd`,editTooltip:`Redigera persona`,downloadTooltip:`Ladda ner persona`,backup:`Säkerhetskopiera`,exportDNA:`Exportera DNA`,wipeMemories:`Radera minnen`,wipeConfirm:`Är du säker på att du vill radera alla minnen för denna persona? Denna åtgärd kan inte ångras.`,wipeSuccess:`Raderade {{count}} minnen`,backupSuccess:`Personans säkerhetskopia laddades ner`,dnaSuccess:`Personans DNA exporterades`,failed:`Kunde inte {{action}}`},userManager:{title:`Användarhantering`,subtitle:`Hantera användarkonton och behörigheter`,pageDescription:`Hantera användarkonton, behörigheter och åtkomstkontroller för din Libre WebUI-instans.`,loading:`Laddar användare...`,createUser:`Skapa användare`,search:`Sök användare...`,noUsers:`Inga användare hittades`,noUsersMatching:`Inga användare matchar din sökning`,columns:{user:`Användare`,email:`E-post`,role:`Roll`,created:`Skapad`,actions:`Åtgärder`},roles:{admin:`Administratör`,user:`Användare`},noEmail:`Ingen e-post`,deleteConfirm:`Är du säker på att du vill radera användaren "{{name}}"?`,deleteSuccess:`Användaren raderades`,deleteFailed:`Kunde inte radera användare`,cannotDeleteSelf:`Du kan inte radera ditt eget konto`,form:{title:{create:`Skapa användare`,edit:`Redigera användare`},username:`Användarnamn`,usernamePlaceholder:`Ange användarnamn`,email:`E-post`,emailPlaceholder:`Ange e-post (valfritt)`,password:`Lösenord`,passwordPlaceholder:`Ange lösenord`,passwordHint:`Lämna tomt för att behålla nuvarande lösenord`,role:`Roll`,creating:`Skapar...`,updating:`Uppdaterar...`,createButton:`Skapa användare`,updateButton:`Uppdatera användare`,createSuccess:`Användaren skapades`,updateSuccess:`Användaren uppdaterades`,createFailed:`Kunde inte skapa användare`,updateFailed:`Kunde inte uppdatera användare`}},chatHistory:{label:`Konversationshistorik`,jumpToTurn:`Gå till tur {{index}} av {{total}}`},chatMessage:{you:`Du`,assistant:`Assistent`,system:`System`,copy:`Kopiera`,copyMessage:`Kopiera meddelande`,copied:`Kopierat!`,regenerate:`Generera om`,regenerateResponse:`Generera om svar`,edit:`Redigera`,editSystemMessage:`Redigera systemmeddelande`,saveChanges:`Spara ändringar`,cancelEditing:`Avbryt redigering`,delete:`Radera`,deleteConfirm:`Radera detta meddelande?`,branch:`Förgrena`,speaking:`Talar...`,speakMessage:`Läs upp meddelande`,stopSpeaking:`Sluta tala`,showMore:`Visa mer`,showLess:`Visa mindre`,thinking:`Tänker`,systemMessagePlaceholder:`Ange ditt systemmeddelande...`,fullSizeImage:`Fullstor bild`,startConversation:`Starta en konversation`,startConversationDescription:`Skicka ett meddelande för att börja chatta med din AI-assistent. Ställ frågor, få hjälp med kod eller ha en naturlig konversation.`,scrollToBottom:`Scrolla till botten`,newMessages:`Nya meddelanden`},imageGallery:{title:`Bildgalleri`,noImages:`Inga bilder ännu`,noImagesHint:`Generera din första bild med panelen till höger`,delete:`Radera`,download:`Ladda ner`,deleteConfirm:`Är du säker på att du vill radera denna bild?`,deleteSuccess:`Bilden raderades`,deleteFailed:`Kunde inte radera bild`,downloadFailed:`Kunde inte ladda ner bild`,loadMore:`Ladda fler ({{current}} av {{total}})`,loadFailed:`Kunde inte ladda galleri`},imageGeneration:{title:`Generera bild`,prompt:`Prompt`,promptPlaceholder:`Beskriv bilden du vill skapa...`,model:`Modell`,selectModel:`Välj modell`,noModels:`Inga bildgenereringsmodeller tillgängliga`,configurePlugin:`Konfigurera ett tillägg med bildgenereringsstöd`,size:`Storlek`,quality:`Kvalitet`,style:`Stil`,generate:`Generera`,generating:`Genererar...`,success:`Bilden genererades`,failed:`Kunde inte generera bild`,enterPrompt:`Ange en prompt`,promptTooLong:`Prompten överstiger maxlängden på {{max}} tecken`},errorBoundary:{title:`Något gick fel`,description:`Vi stötte på ett oväntat fel. Försök att uppdatera sidan.`,tryAgain:`Uppdatera sidan`,goHome:`Gå till startsidan`,errorDetails:`Feldetaljer (utveckling)`},documents:{title:`Dokument`,upload:`Ladda upp dokument`,uploading:`Laddar upp...`,noDocuments:`Inga dokument uppladdade`,uploadHint:`Ladda upp dokument för att använda i dina konversationer`,delete:`Radera`,deleteConfirm:`Är du säker på att du vill radera detta dokument?`,deleteSuccess:`Dokumentet raderades`,deleteFailed:`Kunde inte radera dokument`,uploadSuccess:`Dokumentet laddades upp`,uploadFailed:`Kunde inte ladda upp dokument`,types:`Stöder: PDF, TXT, MD, DOCX`,unsupportedFileType:`Endast PDF- och TXT-filer stöds`,fileSizeTooLarge:`Filstorleken måste vara mindre än 10MB`,uploadSuccessWithName:`Dokumentet "{{name}}" laddades upp`,removeSuccess:`Dokumentet togs bort`,removeFailed:`Kunde inte ta bort dokument`,removeError:`Ett fel uppstod vid borttagning av dokumentet`,clickToUpload:`Klicka för att ladda upp`,orDragAndDrop:`eller dra och släpp`,fileTypesAndSize:`PDF- eller TXT-filer upp till 10MB`,uploadedDocuments:`Uppladdade dokument`,removeDocument:`Ta bort dokument`},ttsButton:{speak:`Tala`,stop:`Stoppa`,speaking:`Talar...`,generateFailed:`Kunde inte generera tal`,playbackFailed:`Ljuduppspelning misslyckades`,stopSpeaking:`Sluta tala`,generatingSpeech:`Genererar tal...`,readAloud:`Läs högt`},artifacts:{title:`Artefakter`,code:`Kod`,preview:`Förhandsgranskning`,copy:`Kopiera kod`,copied:`Kopierat!`,download:`Ladda ner`,expand:`Expandera`,collapse:`Minimera`,openInNewTab:`Öppna i ny flik`,invalidSvg:`Ogiltigt SVG-innehåll`,invalidJson:`Ogiltigt JSON-innehåll`,previewMode:`Förhandsgranskningsläge`,codeMode:`Kodläge`,copyContent:`Kopiera innehåll`,openInPanel:`Öppna i panel`,openInNewWindow:`Öppna i nytt fönster`,created:`Skapad`,closePanelEsc:`Stäng panel (Esc)`,copyButton:`Kopiera`,open:`Öppna`,dragEdgeToResize:`Dra i kanten för att ändra storlek`,previewUnavailable:`Preview unavailable`,previewUnavailableDescription:`This artifact does not contain renderable preview content. Switch to code view to inspect the source.`},personaImportExport:{title:`Importera och exportera personas`,description:`Exportera dina personas för att dela dem eller importera personas från andra`,exportPersonas:`Exportera personas`,importPersonas:`Importera personas`,noPersonasToExport:`Inga personas att exportera`,personasAvailable:`{{count}} persona tillgänglig`,personasAvailable_plural:`{{count}} personas tillgängliga`,exportAll:`Exportera alla`,uploadJsonFile:`Ladda upp JSON-fil`,pasteJsonLabel:`Klistra in JSON-data`,pasteJsonPlaceholder:`Klistra in persona JSON-data här...`,importing:`Importerar...`,importButton:`Importera persona(s)`,expectedFormat:`Förväntat JSON-format:`,exportSuccess:`Persona "{{name}}" exporterades`,exportFailed:`Kunde inte exportera persona`,exportAllSuccess:`Alla {{count}} personas exporterades`,exportAllFailed:`Kunde inte exportera personas`,pasteJsonData:`Klistra in persona JSON-data`,importMultipleSuccess:`Importerade {{count}} personas`,importMultipleFailed:`Kunde inte importera {{count}} personas`,importNoneFailed:`Kunde inte importera några personas`,importSuccess:`Persona importerades`,importFailed:`Kunde inte importera persona`},generationStats:{details:`Detaljer`,promptTokens:`Prompttokens:`,generatedTokens:`Genererade tokens:`,totalTokens:`Totalt tokens:`,speed:`Hastighet:`,promptEval:`Promptutvärdering:`,generation:`Generering:`,modelLoad:`Modellladdning:`,totalTime:`Total tid:`,generatedAt:`Genererat kl.:`},userMenu:{loggedOut:`Utloggad`,pictureUpdated:`Profilbild uppdaterad`,failedUpdateAvatar:`Det gick inte att uppdatera avatar`,failedUpdatePicture:`Det gick inte att uppdatera profilbild`,noEmail:`Ingen e-post angiven`,changePicture:`Byt bild`,settings:`Inställningar`,userManagement:`Användarhantering`,signOut:`Logga ut`,changeProfilePicture:`Byt profilbild`},pluginManager:{title:`Pluginhanterare`,upload:`Ladda upp`,addJson:`Lägg till JSON`,browseHF:`Bläddra i HF Hub`,confirmDelete:`Är du säker på att du vill ta bort detta plugin?`,uploading:`Laddar upp plugin...`,pasteJson:`Klistra in plugin-JSON här...`,installPlugin:`Installera plugin`,loading:`Laddar plugins...`,noPlugins:`Inga plugins installerade`,noPluginsDescription:`Ladda upp en pluginfil eller lägg till ett plugin från JSON för att komma igång.`,active:`Aktiv`,id:`ID`,endpoint:`Endpoint`,activate:`Aktivera`,deactivate:`Inaktivera`,activePlugin:`Aktivt plugin`,activePluginDescription:`Alla chattförfrågningar dirigeras genom detta plugin`,variables:{title:`Variabler`,save:`Spara`,saving:`Sparar...`,saved:`Variabler sparade`,saveFailed:`Kunde inte spara variabler`,resetDefaults:`Återställ standard`,reset:`Variabler återställda`,sensitiveSet:`Värde är satt (ange nytt för att ändra)`}},huggingface:{title:`HuggingFace modellbläddrare`,subtitle:`Bläddra och välj modeller från Hub`,searchPlaceholder:`Sök modeller...`,filters:`Filter`,task:`Uppgift`,sortBy:`Sortera efter`,noModels:`Inga modeller hittades`,adjustSearch:`Försök justera din sökning eller filter`,gated:`Begränsad`,selected:`Valt`,select:`Välj`,refresh:`Uppdatera`,modelsFound:`modeller hittade`},demoMode:{title:`Demoläge`,github:`GitHub`},personaBackground:{label:`Bakgrundsbild`,uploadBackgroundImage:`Ladda upp bakgrundsbild`,dragAndDrop:`Dra och släpp en bild eller klicka för att bläddra`,chooseImage:`Välj bild`,uploading:`Laddar upp...`,enterImageUrl:`Eller ange bild-URL`,supportedFormats:`Stöder: JPG, PNG, GIF, WebP (max 5MB). Breda landskapsbilder fungerar bäst.`,customBackground:`Anpassad bakgrundsbild`,clickToChange:`Klicka för att ändra eller ta bort`,removed:`Bakgrund borttagen`,uploaded:`Bakgrund uppladdad`,invalidFile:`Välj en giltig bildfil`,fileTooLarge:`Bakgrundsbildens storlek måste vara mindre än 5MB`,readFailed:`Kunde inte läsa bildfil`,uploadFailed:`Kunde inte ladda upp bakgrundsbild`},modelSelector:{searchInstalled:`Sök installerade modeller...`,searchOllama:`Sök i Ollama-biblioteket...`,searchHuggingFace:`Sök på HuggingFace...`,selectModel:`Välj modell`,personas:`Personas`,ollamaModels:`Ollama-modeller`,pluginModels:`Plugin-modeller`,actions:`Åtgärder`,installed:`Installerad`,use:`Använd`,pull:`Ladda ner`,pullRestricted:`Modellinstallation är begränsad till administratörer på denna instans.`,adminOnlyPull:`Endast administratörer`},libreClaw:{title:`Agenter`,subtitle:`Lokala agentkörningar, godkännanden, scheman, minne, verktyg och användning.`,dashboard:`Översikt`,connection:{disconnectedTitle:`Libre Claw-daemonen är inte ansluten`,disconnectedDescription:`Starta den lokalt med <command>libre-claw start</command> eller ställ in <env>LIBRE_CLAW_BASE_URL</env> i backend-miljön.`},status:{connected:`Ansluten`,disconnected:`Frånkopplad`,activeRuns:`{{count}} aktiv`,activeRuns_plural:`{{count}} aktiv`},states:{queued:`I kö`,running:`Körs`,blocked:`Blockerad`,done:`Klart`,failed:`Misslyckades`,cancelled:`Avbruten`},startRun:{title:`Starta agentkörning`,placeholder:`Be Libre Claw att inspektera en repo, fixa en bugg, köra en granskning, schemalägga en rapport...`,chatRun:`Chattkörning`,goalMode:`Målläge`,providerOverride:`Åsidosättande av leverantör`,modelOverride:`Modell åsidosättande`,run:`Kör`},modelRoute:{title:`Modellväg`,providerPlaceholder:`leverantör`,modelPlaceholder:`modell`,persistGlobal:`Fortsätt till Libre Claw global konfiguration`,saveModel:`Spara modell`,theme:`Libre Claw-tema`,saveTheme:`Spara tema`},runs:{title:`Körningar`,empty:`Inga Libre Claw-körningar ännu.`},timeline:{title:`Körningstidslinje`,empty:`Välj en körning för att inspektera dess händelser.`,streaming:`Streamar...`,assistantResponse:`Assistentsvar`,resultOk:`okej`,resultError:`fel`,labels:{userMessage:`Användarmeddelande`,toolCall:`Verktygsanrop`,toolResult:`Verktygsresultat`,approvalRequest:`Begäran om godkännande`,approvalResponse:`Godkännande svar`,runStarted:`Körning startad`,runFinished:`Körning avslutad`,usage:`Användning`,error:`Fel`}},approvals:{needed:`Godkännande behövs`,allowOnce:`Tillåt en gång`,alwaysAllowTool:`Tillåt alltid verktyg`,deny:`Neka`,toolApprovalRequested:`Verktygsgodkännande begärs`},automations:{title:`Automatiseringar`,namePlaceholder:`Namn`,schedulePlaceholder:`daily 09:00`,promptPlaceholder:`Automatiseringsprompt`,create:`Skapa`,empty:`Inga schemalagda Libre Claw-automatiseringar.`,runNow:`Kör nu`,pause:`Pausa`,resume:`Återuppta`,routes:{report:`Rapportera`,telegram:`Telegram`},status:{active:`Aktiv`,paused:`Pausad`}},usageFallback:{title:`Användning och reserv`,usage:`Användning`,fallbackRoute:`Reservrutt`,noUsage:`Inga användningsuppgifter ännu.`},metrics:{provider:`Leverantör`,model:`Modell`,input:`Ingång`,output:`Utgång`,cached:`Cachad`,reasoning:`Resonemang`,cost:`Kostnad`,tool:`Verktyg`,resolution:`Upplösning`,state:`Status`,stopReason:`Stopporsak`,tokens:`{{formatted}} token`,tokens_plural:`{{formatted}} polletter`},fallbacks:{tool:`verktyg`,unknown:`okänt`,resolved:`löst`,unknownError:`Okänt fel`},toasts:{loadStatusFailed:`Kunde inte ladda Libre Claw status`,enterTask:`Ange en uppgift för Libre Claw`,runStarted:`Libre Claw-körning startad`,startRunFailed:`Kunde inte starta Libre Claw-körning`,runCancelled:`Körning avbruten`,cancelRunFailed:`Det gick inte att avbryta körningen`,approved:`Godkänd`,denied:`Nekad`,resolvePermissionFailed:`Det gick inte att lösa behörigheten`,providerModelRequired:`Leverantör och modell krävs`,modelUpdated:`Libre Claw-modellen uppdaterad`,updateModelFailed:`Kunde inte uppdatera modellen`,themeUpdated:`Libre Claw-tema uppdaterat`,updateThemeFailed:`Det gick inte att uppdatera temat`,automationRequired:`Automationsnamn, schema och uppmaning krävs`,automationCreated:`Automatisering skapad`,createAutomationFailed:`Det gick inte att skapa automatisering`,automationUpdated:`Automatisering uppdaterad`,updateAutomationFailed:`Det gick inte att uppdatera automatiseringen`}},work:{title:`Arbete`,subtitle:`Isolerade arbetsytor för modeller`,tasks:{title:`Arbetsuppgifter`,subtitle:`Beständiga lokala arbetsytor`,new:`Ny uppgift`,emptyTitle:`Inga arbetsuppgifter än`,empty:`Dina arbetsuppgifter visas här när du har skickat det första meddelandet.`,untitled:`Namnlös uppgift`,actions:`Uppgiftsåtgärder`,delete:`Ta bort uppgift`,deleteNamed:`Ta bort {{title}}`,deleteConfirm:`Ta bort ”{{title}}” och dess arbetsyta permanent?`,close:`Stäng arbetsuppgifter`,open:`Öppna arbetsuppgifter`,rename:`Uppgiftstitel`,loading:`Läser in uppgift…`,notFound:`Den här arbetsuppgiften är inte tillgänglig`,back:`Starta en ny uppgift`,status:`Status: {{status}}`},landing:{title:`Starta en ny arbetsuppgift`,description:`Ge en lokal modell eller en modell från en konfigurerad leverantör en beständig, isolerad arbetsyta. Den kan granska filer, köra verktyg och fortsätta där den slutade när du återvänder.`,isolated:`Isolerad`,isolatedBody:`Varje uppgift får en egen container och egna filer.`,durable:`Beständig`,durableBody:`Återvänd senare till konversationen och arbetsytan.`,controlled:`Kontrollerad`,controlledBody:`Körmiljön och uppgiftsfilerna förblir isolerade från värdsystemet.`},composer:{placeholder:`Beskriv vad du vill skapa eller ändra…`,model:`Modell för arbete`,noModels:`Inga modeller som är kompatibla med Arbete`,cancel:`Stoppa`,send:`Kör`,hint:`Varje uppgift behåller sina egna filer och sin historik. Granska modellens utdata innan du använder dem.`,remoteTitle:`Fjärrleverantör`,remoteHint:`Konversationen och verktygens utdata skickas till den konfigurerade tjänsten. En autonom körning kan göra flera leverantörsanrop och medföra kostnader. Filerna på arbetsytan stannar lokalt om inte ett verktyg returnerar deras innehåll.`,remoteDismiss:`Dölj`,remoteDismissLabel:`Dölj meddelandet om fjärrleverantören`,remoteDismissFailed:`Det gick inte att spara inställningen för fjärrleverantören.`,noModelSelected:`Ingen modell som är kompatibel med Arbete har valts.`},conversation:{ready:`Arbetsytan är klar`,empty:`Fortsätt med uppgiften nedan. Konversationen och dess filer förblir kopplade till den här arbetsytan.`,loadOlder:`Läs in äldre meddelanden`},status:{preparing:`Förbereder den isolerade arbetsytan…`,running:`Arbetar på den lokala arbetsytan…`},statusLabels:{idle:`Inaktiv`,thinking:`Tänker`,complete:`Klar`,needsInput:`Behöver inmatning`,error:`Fel`},live:{connecting:`Ansluter till liveuppdateringar…`,reconnecting:`Återansluter till liveuppdateringar…`,unavailable:`Liveuppdateringar är inte tillgängliga`,newActivity:`Ny aktivitet`,skillsLoaded:`Arbetsytefärdigheter · {{count}}`},runtime:{unavailable:`Körmiljön är inte tillgänglig`,ready:`Körmiljön är redo`,readyOllama:`Docker redo`,readyPlugin:`Docker + tillägg redo`,readyHybrid:`Docker + modeller redo`,reason:`Docker och en tillgänglig modellleverantör via Ollama eller ett tillägg krävs.`},workspace:{label:`Arbetsytevyer`,files:`Filer`,activity:`Aktivitet`,preview:`Förhandsgranskning`,resize:`Ändra storlek på konversationen och arbetsytan`,resizeHint:`Dra för att ändra storleken. Använd piltangenterna för exakt kontroll. Dubbelklicka eller tryck på Retur för att återställa.`,splitSize:`Konversation {{conversation}} %, arbetsyta {{workspace}} %`,terminal:`Terminal`},files:{discard:`Kassera osparade filändringar?`,leaveWithDraft:`Lämna den här filen? Din osparade redigering sparas som ett utkast i webbläsaren.`,up:`Överordnad mapp`,back:`Tillbaka till filer`,empty:`Det finns inga filer i den här mappen än.`,select:`Välj en fil för att granska och redigera den.`,editorLabel:`Filredigerare: {{path}}`,format:`Formatera`,formatted:`Koden har formaterats.`,formatFailed:`Det gick inte att formatera den här filen.`,formatShortcut:`Formatera (Skift+Alt+F)`,formatTooLarge:`Formatering är begränsad till filer med färre än 100 000 tecken och 4 000 rader.`,formatUnsupported:`Formatering är inte tillgänglig för den här filtypen.`,saveShortcut:`Spara (⌘/Ctrl+S)`,highlightPaused:`Syntaxmarkering i realtid har pausats för stora filer så att redigeringen förblir responsiv.`,plainTextLarge:`Oformaterad text · stor fil`,changes:`Ändringar`,changesSince:`Vad som ändrats sedan senaste turen`,diffLabel:`Ändringar sedan senaste turen: {{path}}`,diffFolded:`{{count}} oförändrade rader`},activity:{empty:`Kommandon, filåtgärder och verktygsresultat visas här.`,toolActivity:`Verktygsaktivitet`,details:`Detaljer`,kinds:{message:`Meddelande`,toolCall:`Verktygsanrop`,toolResult:`Verktygsresultat`,error:`Fel`}},preview:{command:`Valfritt startkommando`,start:`Starta förhandsgranskning`,stop:`Stoppa förhandsgranskning`,open:`Öppna`,starting:`Startar förhandsgranskning…`,frameTitle:`Förhandsgranskning av arbetsyta`,failed:`Det gick inte att starta förhandsgranskningen. Kontrollera Aktivitet och prova sedan ett annat kommando.`,empty:`Starta appen på den här arbetsytan för att granska den här.`},mobile:{surface:`Uppgiftsvy`,conversation:`Konversation`,workspace:`Arbetsyta`},toasts:{runFailed:`Det gick inte att starta arbetsuppgiften.`,updateFailed:`Det gick inte att uppdatera den här uppgiften.`,renameFailed:`Det gick inte att byta namn på den här uppgiften.`,cancelled:`Arbetskörningen stoppades.`,cancelFailed:`Det gick inte att stoppa arbetskörningen.`,deleteFailed:`Det gick inte att ta bort den här arbetsuppgiften.`,saveFailed:`Det gick inte att spara den här filen.`,saved:`Filen har sparats.`,previewFailed:`Det gick inte att starta förhandsgranskningen.`,previewStopFailed:`Det gick inte att stoppa förhandsgranskningen.`},terminal:{connecting:`Öppnar ett skal i sandlådan…`,closed:`Terminalsessionen avslutades.`,failed:`Terminalsessionen kunde inte startas.`,reconnect:`Anslut igen`,unavailable:`Den interaktiva terminalen är inte tillgänglig i den här installationen.`,blockedByRun:`Modellen använder den här containern. Terminalen öppnas när turen är klar.`,taskRunning:`Modelltur pågår`}}};export{e as default};