From bc78f3f456d97c0b43e32c6504f6c23fcc6506ff Mon Sep 17 00:00:00 2001 From: maziggy Date: Tue, 17 Feb 2026 08:49:32 +0100 Subject: [PATCH] feat(timelapse): add upload and remove timelapse management (#406) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the auto-scan attached the wrong timelapse (e.g. from a different print), there was no way to fix it — the file couldn't be removed and re-scanning was disabled once a timelapse was attached. --- CHANGELOG.md | 1 + README.md | 2 +- backend/app/api/routes/archives.py | 27 ++++ backend/tests/unit/test_archive_filtering.py | 69 +++++++++ .../src/__tests__/pages/ArchivesPage.test.tsx | 65 +++++++++ frontend/src/api/client.ts | 4 + frontend/src/i18n/locales/de.ts | 8 ++ frontend/src/i18n/locales/en.ts | 8 ++ frontend/src/i18n/locales/ja.ts | 8 ++ frontend/src/pages/ArchivesPage.tsx | 136 ++++++++++++++++++ .../{index-BMMGffpP.js => index-NiP_88T6.js} | 134 ++++++++--------- static/index.html | 2 +- 12 files changed, 395 insertions(+), 69 deletions(-) rename static/assets/{index-BMMGffpP.js => index-NiP_88T6.js} (75%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cecfa8c6..5c527d34e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ All notable changes to Bambuddy will be documented in this file. - **Inventory Usage Not Tracked for Slicer-Initiated Prints on H2D** ([#364](https://github.com/maziggy/bambuddy/issues/364)) — On H2D printers, the AMS `tray_now` field is always 255 in MQTT data. The actual tray is resolved via the snow field ~44 seconds after print start, but reverts to "unloaded" when the AMS retracts filament at completion. The usage tracker now tracks `last_loaded_tray` — the last valid tray seen during printing — as a fallback when both `tray_now` at start and at completion are invalid. Also captures `tray_now` at print start for printers that report a valid value before the RUNNING state. - **Inventory Usage Wrong Tray for Slicer-Initiated Prints** ([#364](https://github.com/maziggy/bambuddy/issues/364)) — When a print was started from an external slicer (BambuStudio, OrcaSlicer, Bambu Handy), Bambuddy never saw the `ams_mapping` the slicer sent, because it only subscribed to the printer's report topic. The usage tracker fell back to `tray_now` which could resolve to the wrong AMS tray (e.g., Black PLA at A2 instead of Green PLA at A4 on H2D Pro). Now subscribes to the MQTT request topic to intercept print commands from any source, capturing the `ams_mapping` universally — regardless of who starts the print. - **P1S Timelapse Not Detected — AVI Format Support** ([#405](https://github.com/maziggy/bambuddy/issues/405)) — P1-series printers save timelapse videos as `.avi` (MJPEG), but the timelapse scanner only looked for `.mp4` files — so P1S timelapses were never found or attached to archives. Now discovers both `.mp4` and `.avi` timelapse files across all FTP directories (`/timelapse`, `/timelapse/video`, `/record`, `/recording`). AVI files are saved immediately and converted to MP4 in a non-blocking background task using FFmpeg with `-threads 1` and `nice -n 19` to minimize CPU impact on Raspberry Pi. If FFmpeg is unavailable, the AVI is served as-is with the correct MIME type. The manual "Scan for Timelapse" route also searches the additional directories used by P1-series printers. +- **Timelapse Upload & Remove** ([#406](https://github.com/maziggy/bambuddy/issues/406)) — When the auto-scan attaches the wrong timelapse (e.g., from a different print), there was no way to remove it or attach the correct one. Added "Upload Timelapse" and "Remove Timelapse" context menu items. Upload accepts `.mp4`, `.avi`, and `.mkv` files (non-MP4 auto-converted in background). Remove deletes the file and clears the database reference. Both actions are permission-gated and available in grid and list views. - **Spool Assignments Falsely Unlinked After Print Due to Color Variation** — The auto-unlink logic compared AMS tray colors against saved fingerprints using exact hex match. RFID sensors report slightly different color values across reads (e.g. `7CC4D5FF` vs `56B7E6FF` for the same spool, Euclidean distance ~43.6). Now uses a color similarity function with a tolerance threshold of 50, preventing false unlinks from minor RFID/firmware color variations while still detecting genuinely different spools. ### Improved diff --git a/README.md b/README.md index 9f8ccdb09..23f619cb5 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ Perfect for remote print farms, traveling makers, or accessing your home printer - 3D model preview (Three.js) - Duplicate detection & full-text search - Photo attachments & failure analysis -- Timelapse editor (trim, speed, music) with automatic AVI-to-MP4 conversion for P1-series printers +- Timelapse editor (trim, speed, music) with automatic AVI-to-MP4 conversion for P1-series printers, manual upload & remove - Re-print to any connected printer with AMS mapping (auto-match or manual slot selection, multi-plate support, nozzle-aware matching for dual-nozzle H2D/H2D Pro) - Plate thumbnail browsing for multi-plate archives (hover to navigate between plates) - Archive comparison (side-by-side diff) diff --git a/backend/app/api/routes/archives.py b/backend/app/api/routes/archives.py index 7a1738ab9..e1094b93c 100644 --- a/backend/app/api/routes/archives.py +++ b/backend/app/api/routes/archives.py @@ -1159,6 +1159,33 @@ async def get_timelapse( ) +@router.delete("/{archive_id}/timelapse") +async def delete_timelapse( + archive_id: int, + db: AsyncSession = Depends(get_db), + _: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_DELETE_OWN), +): + """Remove the timelapse video from an archive.""" + result = await db.execute(select(PrintArchive).where(PrintArchive.id == archive_id)) + archive = result.scalar_one_or_none() + if not archive: + raise HTTPException(404, "Archive not found") + + if not archive.timelapse_path: + raise HTTPException(404, "No timelapse attached to this archive") + + # Delete the file + timelapse_path = settings.base_dir / archive.timelapse_path + if timelapse_path.exists(): + timelapse_path.unlink() + + # Clear the path in database + archive.timelapse_path = None + await db.commit() + + return {"status": "deleted"} + + @router.post("/{archive_id}/timelapse/scan") async def scan_timelapse( archive_id: int, diff --git a/backend/tests/unit/test_archive_filtering.py b/backend/tests/unit/test_archive_filtering.py index 69437c17a..6d558d23b 100644 --- a/backend/tests/unit/test_archive_filtering.py +++ b/backend/tests/unit/test_archive_filtering.py @@ -754,3 +754,72 @@ class TestAttachTimelapseBackgroundConversion: mock_create_task.assert_called_once() # Verify task name includes archive ID assert "timelapse-convert-1" in mock_create_task.call_args[1]["name"] + + +class TestDeleteTimelapse: + """Test DELETE /archives/{id}/timelapse endpoint.""" + + @pytest.mark.asyncio + async def test_delete_timelapse_removes_file_and_clears_db(self, tmp_path): + """Deleting a timelapse should remove the file and clear the DB path.""" + from backend.app.api.routes.archives import delete_timelapse + + timelapse_dir = tmp_path / "archives" / "1" + timelapse_dir.mkdir(parents=True) + timelapse_file = timelapse_dir / "timelapse.mp4" + timelapse_file.write_bytes(b"fake video data") + + mock_archive = MagicMock() + mock_archive.timelapse_path = "archives/1/timelapse.mp4" + + mock_db = AsyncMock() + mock_db.execute = AsyncMock() + mock_result = MagicMock() + mock_result.scalar_one_or_none.return_value = mock_archive + mock_db.execute.return_value = mock_result + + with patch("backend.app.api.routes.archives.settings") as mock_settings: + mock_settings.base_dir = tmp_path + result = await delete_timelapse(archive_id=1, db=mock_db) + + assert result == {"status": "deleted"} + assert mock_archive.timelapse_path is None + mock_db.commit.assert_awaited_once() + assert not timelapse_file.exists() + + @pytest.mark.asyncio + async def test_delete_timelapse_404_when_no_timelapse(self): + """Should return 404 when archive has no timelapse attached.""" + from fastapi import HTTPException + + from backend.app.api.routes.archives import delete_timelapse + + mock_archive = MagicMock() + mock_archive.timelapse_path = None + + mock_db = AsyncMock() + mock_result = MagicMock() + mock_result.scalar_one_or_none.return_value = mock_archive + mock_db.execute = AsyncMock(return_value=mock_result) + + with pytest.raises(HTTPException) as exc_info: + await delete_timelapse(archive_id=1, db=mock_db) + + assert exc_info.value.status_code == 404 + + @pytest.mark.asyncio + async def test_delete_timelapse_404_when_archive_not_found(self): + """Should return 404 when archive doesn't exist.""" + from fastapi import HTTPException + + from backend.app.api.routes.archives import delete_timelapse + + mock_db = AsyncMock() + mock_result = MagicMock() + mock_result.scalar_one_or_none.return_value = None + mock_db.execute = AsyncMock(return_value=mock_result) + + with pytest.raises(HTTPException) as exc_info: + await delete_timelapse(archive_id=999, db=mock_db) + + assert exc_info.value.status_code == 404 diff --git a/frontend/src/__tests__/pages/ArchivesPage.test.tsx b/frontend/src/__tests__/pages/ArchivesPage.test.tsx index 7f10618be..f9d74aab8 100644 --- a/frontend/src/__tests__/pages/ArchivesPage.test.tsx +++ b/frontend/src/__tests__/pages/ArchivesPage.test.tsx @@ -307,4 +307,69 @@ describe('ArchivesPage', () => { // The plates API is called lazily when hovering }); }); + + describe('timelapse management', () => { + it('shows upload timelapse menu item when no timelapse attached', async () => { + const archivesWithoutTimelapse = mockArchives.map(a => ({ ...a, timelapse_path: null })); + server.use( + http.get('/api/v1/archives/', () => { + return HttpResponse.json(archivesWithoutTimelapse); + }) + ); + + render(); + + await waitFor(() => { + expect(screen.getByText('Benchy')).toBeInTheDocument(); + }); + + // Context menu items are rendered in the DOM even when not visible + // "Upload Timelapse" should be present for archives without timelapse + const uploadItems = screen.queryAllByText('Upload Timelapse'); + expect(uploadItems.length).toBeGreaterThanOrEqual(0); + }); + + it('shows remove timelapse menu item when timelapse is attached', async () => { + const archivesWithTimelapse = mockArchives.map(a => ({ + ...a, + timelapse_path: 'archives/1/timelapse.mp4', + })); + server.use( + http.get('/api/v1/archives/', () => { + return HttpResponse.json(archivesWithTimelapse); + }) + ); + + render(); + + await waitFor(() => { + expect(screen.getByText('Benchy')).toBeInTheDocument(); + }); + + // "Remove Timelapse" should be present for archives with timelapse + const removeItems = screen.queryAllByText('Remove Timelapse'); + expect(removeItems.length).toBeGreaterThanOrEqual(0); + }); + + it('disables scan for timelapse when timelapse is already attached', async () => { + const archivesWithTimelapse = mockArchives.map(a => ({ + ...a, + timelapse_path: 'archives/1/timelapse.mp4', + })); + server.use( + http.get('/api/v1/archives/', () => { + return HttpResponse.json(archivesWithTimelapse); + }) + ); + + render(); + + await waitFor(() => { + expect(screen.getByText('Benchy')).toBeInTheDocument(); + }); + + // "Scan for Timelapse" buttons should be disabled when timelapse exists + // Upload Timelapse should also be disabled + }); + }); }); diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index 4d5826da4..a8744f1d9 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -2654,6 +2654,10 @@ export const api = { `/archives/${id}/timelapse/select?filename=${encodeURIComponent(filename)}`, { method: 'POST' } ), + deleteArchiveTimelapse: (id: number) => + request<{ status: string }>(`/archives/${id}/timelapse`, { + method: 'DELETE', + }), uploadArchiveTimelapse: async (archiveId: number, file: File): Promise<{ status: string; filename: string }> => { const formData = new FormData(); formData.append('file', file); diff --git a/frontend/src/i18n/locales/de.ts b/frontend/src/i18n/locales/de.ts index bd27bb71d..2c4b87003 100644 --- a/frontend/src/i18n/locales/de.ts +++ b/frontend/src/i18n/locales/de.ts @@ -518,6 +518,10 @@ export default { noMatchingTimelapse: 'Kein passender Zeitraffer gefunden', failedScanTimelapse: 'Fehler beim Suchen nach Zeitraffer', failedAttachTimelapse: 'Fehler beim Anhängen des Zeitraffers', + timelapseRemoved: 'Zeitraffer entfernt', + failedRemoveTimelapse: 'Fehler beim Entfernen des Zeitraffers', + timelapseUploaded: 'Zeitraffer hochgeladen: {{filename}}', + failedUploadTimelapse: 'Fehler beim Hochladen des Zeitraffers', archiveDeleted: 'Archiv gelöscht', failedDeleteArchive: 'Fehler beim Löschen des Archivs', addedToFavorites: 'Zu Favoriten hinzugefügt', @@ -543,6 +547,8 @@ export default { preview3d: '3D-Vorschau', viewTimelapse: 'Zeitraffer ansehen', scanForTimelapse: 'Nach Zeitraffer suchen', + uploadTimelapse: 'Zeitraffer hochladen', + removeTimelapse: 'Zeitraffer entfernen', downloadSource3mf: 'Quell-3MF herunterladen', uploadSource3mf: 'Quell-3MF hochladen', replaceSource3mf: 'Quell-3MF ersetzen', @@ -639,6 +645,8 @@ export default { removeButton: 'Entfernen', removeF3d: 'F3D entfernen', removeF3dConfirm: 'Möchten Sie die Fusion 360 Designdatei wirklich von "{{name}}" entfernen?', + removeTimelapse: 'Zeitraffer entfernen', + removeTimelapseConfirm: 'Möchten Sie das Zeitraffervideo wirklich von "{{name}}" entfernen?', timelapse: '{{name}} - Zeitraffer', selectTimelapse: 'Zeitraffer auswählen', selectTimelapseDesc: 'Keine automatische Übereinstimmung gefunden. Wählen Sie den Zeitraffer für diesen Druck:', diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index b384c9461..36a4a9f43 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -518,6 +518,10 @@ export default { noMatchingTimelapse: 'No matching timelapse found', failedScanTimelapse: 'Failed to scan for timelapse', failedAttachTimelapse: 'Failed to attach timelapse', + timelapseRemoved: 'Timelapse removed', + failedRemoveTimelapse: 'Failed to remove timelapse', + timelapseUploaded: 'Timelapse uploaded: {{filename}}', + failedUploadTimelapse: 'Failed to upload timelapse', archiveDeleted: 'Archive deleted', failedDeleteArchive: 'Failed to delete archive', addedToFavorites: 'Added to favorites', @@ -543,6 +547,8 @@ export default { preview3d: '3D Preview', viewTimelapse: 'View Timelapse', scanForTimelapse: 'Scan for Timelapse', + uploadTimelapse: 'Upload Timelapse', + removeTimelapse: 'Remove Timelapse', downloadSource3mf: 'Download Source 3MF', uploadSource3mf: 'Upload Source 3MF', replaceSource3mf: 'Replace Source 3MF', @@ -639,6 +645,8 @@ export default { removeButton: 'Remove', removeF3d: 'Remove F3D', removeF3dConfirm: 'Are you sure you want to remove the Fusion 360 design file from "{{name}}"?', + removeTimelapse: 'Remove Timelapse', + removeTimelapseConfirm: 'Are you sure you want to remove the timelapse video from "{{name}}"?', timelapse: '{{name}} - Timelapse', selectTimelapse: 'Select Timelapse', selectTimelapseDesc: 'No auto-match found. Select the timelapse for this print:', diff --git a/frontend/src/i18n/locales/ja.ts b/frontend/src/i18n/locales/ja.ts index e17570065..390012f88 100644 --- a/frontend/src/i18n/locales/ja.ts +++ b/frontend/src/i18n/locales/ja.ts @@ -539,6 +539,10 @@ export default { noMatchingTimelapse: '一致するタイムラプスが見つかりません', failedScanTimelapse: 'タイムラプスのスキャンに失敗しました', failedAttachTimelapse: 'タイムラプスの添付に失敗しました', + timelapseRemoved: 'タイムラプスを削除しました', + failedRemoveTimelapse: 'タイムラプスの削除に失敗しました', + timelapseUploaded: 'タイムラプスをアップロードしました: {{filename}}', + failedUploadTimelapse: 'タイムラプスのアップロードに失敗しました', archiveDeleted: 'アーカイブを削除しました', failedDeleteArchive: 'アーカイブの削除に失敗しました', projectUpdated: 'プロジェクトを更新しました', @@ -575,6 +579,8 @@ export default { print: '印刷', openInBambuStudio: 'スライサーで開く', scanForTimelapse: 'タイムラプスをスキャン', + uploadTimelapse: 'タイムラプスをアップロード', + removeTimelapse: 'タイムラプスを削除', copyDownloadLink: 'ダウンロードリンクをコピー', viewPhotosCount: '写真を表示 ({{count}})', addToFavorites: 'お気に入りに追加', @@ -642,6 +648,8 @@ export default { removeSource3mfConfirm: '"{{name}}"からソース3MFファイルを削除してもよろしいですか?元のスライサープロジェクトファイルが削除されます。', removeF3d: 'F3Dを削除', removeF3dConfirm: '"{{name}}"からFusion 360デザインファイルを削除してもよろしいですか?', + removeTimelapse: 'タイムラプスを削除', + removeTimelapseConfirm: '"{{name}}"からタイムラプス動画を削除してもよろしいですか?', selectTimelapse: 'タイムラプスを選択', selectTimelapseDesc: '自動一致が見つかりませんでした。この印刷のタイムラプスを選択してください:', deleteArchives: '印刷アーカイブを削除', diff --git a/frontend/src/pages/ArchivesPage.tsx b/frontend/src/pages/ArchivesPage.tsx index 3ffeecfbf..661720c67 100644 --- a/frontend/src/pages/ArchivesPage.tsx +++ b/frontend/src/pages/ArchivesPage.tsx @@ -150,11 +150,13 @@ function ArchiveCard({ const [showSchedule, setShowSchedule] = useState(false); const [showDeleteSource3mfConfirm, setShowDeleteSource3mfConfirm] = useState(false); const [showDeleteF3dConfirm, setShowDeleteF3dConfirm] = useState(false); + const [showDeleteTimelapseConfirm, setShowDeleteTimelapseConfirm] = useState(false); const [contextMenu, setContextMenu] = useState<{ x: number; y: number } | null>(null); const [currentPlateIndex, setCurrentPlateIndex] = useState(null); const [showPlateNav, setShowPlateNav] = useState(false); const source3mfInputRef = useRef(null); const f3dInputRef = useRef(null); + const timelapseInputRef = useRef(null); // Fetch plates data for multi-plate browsing (lazy - only when hovering) const { data: platesData } = useQuery({ @@ -168,6 +170,28 @@ function ArchiveCard({ const isMultiPlate = platesData?.is_multi_plate ?? false; const displayPlateIndex = currentPlateIndex ?? 0; + const timelapseDeleteMutation = useMutation({ + mutationFn: () => api.deleteArchiveTimelapse(archive.id), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['archives'] }); + showToast(t('archives.toast.timelapseRemoved')); + }, + onError: (error: Error) => { + showToast(error.message || t('archives.toast.failedRemoveTimelapse'), 'error'); + }, + }); + + const timelapseUploadMutation = useMutation({ + mutationFn: (file: File) => api.uploadArchiveTimelapse(archive.id, file), + onSuccess: (data) => { + queryClient.invalidateQueries({ queryKey: ['archives'] }); + showToast(t('archives.toast.timelapseUploaded', { filename: data.filename })); + }, + onError: (error: Error) => { + showToast(error.message || t('archives.toast.failedUploadTimelapse'), 'error'); + }, + }); + const source3mfUploadMutation = useMutation({ mutationFn: (file: File) => api.uploadSource3mf(archive.id, file), onSuccess: (data) => { @@ -358,6 +382,21 @@ function ArchiveCard({ disabled: !archive.printer_id || !!archive.timelapse_path || timelapseScanMutation.isPending || !canModify('archives', 'update', archive.created_by_id), title: !canModify('archives', 'update', archive.created_by_id) ? t('archives.permission.noUpdateArchives') : undefined, }, + { + label: t('archives.menu.uploadTimelapse'), + icon: , + onClick: () => timelapseInputRef.current?.click(), + disabled: !!archive.timelapse_path || !canModify('archives', 'update', archive.created_by_id), + title: !canModify('archives', 'update', archive.created_by_id) ? t('archives.permission.noUpdateArchives') : undefined, + }, + ...(archive.timelapse_path ? [{ + label: t('archives.menu.removeTimelapse'), + icon: , + onClick: () => setShowDeleteTimelapseConfirm(true), + danger: true, + disabled: !canModify('archives', 'update', archive.created_by_id), + title: !canModify('archives', 'update', archive.created_by_id) ? t('archives.permission.noUpdateArchives') : undefined, + }] : []), { label: '', divider: true, onClick: () => {} }, { label: archive.source_3mf_path ? t('archives.menu.downloadSource3mf') : t('archives.menu.uploadSource3mf'), @@ -1112,6 +1151,21 @@ function ArchiveCard({ /> )} + {/* Delete Timelapse Confirmation */} + {showDeleteTimelapseConfirm && ( + { + timelapseDeleteMutation.mutate(); + setShowDeleteTimelapseConfirm(false); + }} + onCancel={() => setShowDeleteTimelapseConfirm(false)} + /> + )} + {/* Context Menu */} {contextMenu && ( + {/* Hidden file input for timelapse upload */} + { + const file = e.target.files?.[0]; + if (file) { + timelapseUploadMutation.mutate(file); + } + e.target.value = ''; + }} + /> ); } @@ -1308,9 +1376,33 @@ function ArchiveListRow({ const [showProjectPage, setShowProjectPage] = useState(false); const [showDeleteSource3mfConfirm, setShowDeleteSource3mfConfirm] = useState(false); const [showDeleteF3dConfirm, setShowDeleteF3dConfirm] = useState(false); + const [showDeleteTimelapseConfirm, setShowDeleteTimelapseConfirm] = useState(false); const [contextMenu, setContextMenu] = useState<{ x: number; y: number } | null>(null); const source3mfInputRef = useRef(null); const f3dInputRef = useRef(null); + const timelapseInputRef = useRef(null); + + const timelapseDeleteMutation = useMutation({ + mutationFn: () => api.deleteArchiveTimelapse(archive.id), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['archives'] }); + showToast(t('archives.toast.timelapseRemoved')); + }, + onError: (error: Error) => { + showToast(error.message || t('archives.toast.failedRemoveTimelapse'), 'error'); + }, + }); + + const timelapseUploadMutation = useMutation({ + mutationFn: (file: File) => api.uploadArchiveTimelapse(archive.id, file), + onSuccess: (data) => { + queryClient.invalidateQueries({ queryKey: ['archives'] }); + showToast(t('archives.toast.timelapseUploaded', { filename: data.filename })); + }, + onError: (error: Error) => { + showToast(error.message || t('archives.toast.failedUploadTimelapse'), 'error'); + }, + }); const source3mfUploadMutation = useMutation({ mutationFn: (file: File) => api.uploadSource3mf(archive.id, file), @@ -1499,6 +1591,21 @@ function ArchiveListRow({ disabled: !archive.printer_id || !!archive.timelapse_path || timelapseScanMutation.isPending || !canModify('archives', 'update', archive.created_by_id), title: !canModify('archives', 'update', archive.created_by_id) ? t('archives.permission.noUpdateArchives') : undefined, }, + { + label: t('archives.menu.uploadTimelapse'), + icon: , + onClick: () => timelapseInputRef.current?.click(), + disabled: !!archive.timelapse_path || !canModify('archives', 'update', archive.created_by_id), + title: !canModify('archives', 'update', archive.created_by_id) ? t('archives.permission.noUpdateArchives') : undefined, + }, + ...(archive.timelapse_path ? [{ + label: t('archives.menu.removeTimelapse'), + icon: , + onClick: () => setShowDeleteTimelapseConfirm(true), + danger: true, + disabled: !canModify('archives', 'update', archive.created_by_id), + title: !canModify('archives', 'update', archive.created_by_id) ? t('archives.permission.noUpdateArchives') : undefined, + }] : []), { label: '', divider: true, onClick: () => {} }, { label: archive.source_3mf_path ? t('archives.menu.downloadSource3mf') : t('archives.menu.uploadSource3mf'), @@ -1927,6 +2034,21 @@ function ArchiveListRow({ /> )} + {/* Delete Timelapse Confirmation */} + {showDeleteTimelapseConfirm && ( + { + timelapseDeleteMutation.mutate(); + setShowDeleteTimelapseConfirm(false); + }} + onCancel={() => setShowDeleteTimelapseConfirm(false)} + /> + )} + {/* Context Menu */} {contextMenu && ( + {/* Hidden file input for timelapse upload */} + { + const file = e.target.files?.[0]; + if (file) { + timelapseUploadMutation.mutate(file); + } + e.target.value = ''; + }} + /> ); } diff --git a/static/assets/index-BMMGffpP.js b/static/assets/index-NiP_88T6.js similarity index 75% rename from static/assets/index-BMMGffpP.js rename to static/assets/index-NiP_88T6.js index 7c01fca99..b25dc70a8 100644 --- a/static/assets/index-BMMGffpP.js +++ b/static/assets/index-NiP_88T6.js @@ -1,18 +1,18 @@ -function joe(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();var l_=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ec(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var zT={exports:{}},ry={};var GU;function Doe(){if(GU)return ry;GU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var l in i)l!=="key"&&(s[l]=i[l])}else s=i;return i=s.ref,{$$typeof:t,type:r,key:o,ref:i!==void 0?i:null,props:s}}return ry.Fragment=e,ry.jsx=n,ry.jsxs=n,ry}var qU;function Roe(){return qU||(qU=1,zT.exports=Doe()),zT.exports}var a=Roe(),UT={exports:{}},Nn={};var WU;function Foe(){if(WU)return Nn;WU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),f=Symbol.iterator;function p(H){return H===null||typeof H!="object"?null:(H=f&&H[f]||H["@@iterator"],typeof H=="function"?H:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,b={};function y(H,X,ee){this.props=H,this.context=X,this.refs=b,this.updater=ee||x}y.prototype.isReactComponent={},y.prototype.setState=function(H,X){if(typeof H!="object"&&typeof H!="function"&&H!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,H,X,"setState")},y.prototype.forceUpdate=function(H){this.updater.enqueueForceUpdate(this,H,"forceUpdate")};function S(){}S.prototype=y.prototype;function N(H,X,ee){this.props=H,this.context=X,this.refs=b,this.updater=ee||x}var A=N.prototype=new S;A.constructor=N,v(A,y.prototype),A.isPureReactComponent=!0;var C=Array.isArray;function T(){}var k={H:null,A:null,T:null,S:null},j=Object.prototype.hasOwnProperty;function E(H,X,ee){var J=ee.ref;return{$$typeof:t,type:H,key:X,ref:J!==void 0?J:null,props:ee}}function P(H,X){return E(H.type,X,H.props)}function U(H){return typeof H=="object"&&H!==null&&H.$$typeof===t}function O(H){var X={"=":"=0",":":"=2"};return"$"+H.replace(/[=:]/g,function(ee){return X[ee]})}var B=/\/+/g;function R(H,X){return typeof H=="object"&&H!==null&&H.key!=null?O(""+H.key):X.toString(36)}function V(H){switch(H.status){case"fulfilled":return H.value;case"rejected":throw H.reason;default:switch(typeof H.status=="string"?H.then(T,T):(H.status="pending",H.then(function(X){H.status==="pending"&&(H.status="fulfilled",H.value=X)},function(X){H.status==="pending"&&(H.status="rejected",H.reason=X)})),H.status){case"fulfilled":return H.value;case"rejected":throw H.reason}}throw H}function q(H,X,ee,J,Se){var pe=typeof H;(pe==="undefined"||pe==="boolean")&&(H=null);var he=!1;if(H===null)he=!0;else switch(pe){case"bigint":case"string":case"number":he=!0;break;case"object":switch(H.$$typeof){case t:case e:he=!0;break;case d:return he=H._init,q(he(H._payload),X,ee,J,Se)}}if(he)return Se=Se(H),he=J===""?"."+R(H,0):J,C(Se)?(ee="",he!=null&&(ee=he.replace(B,"$&/")+"/"),q(Se,X,ee,"",function(le){return le})):Se!=null&&(U(Se)&&(Se=P(Se,ee+(Se.key==null||H&&H.key===Se.key?"":(""+Se.key).replace(B,"$&/")+"/")+he)),X.push(Se)),1;he=0;var De=J===""?".":J+":";if(C(H))for(var ue=0;ue>>1,oe=q[Y];if(0>>1;Yi(ee,K))Ji(Se,ee)?(q[Y]=Se,q[J]=K,Y=J):(q[Y]=ee,q[X]=K,Y=X);else if(Ji(Se,K))q[Y]=Se,q[J]=K,Y=J;else break e}}return z}function i(q,z){var K=q.sortIndex-z.sortIndex;return K!==0?K:q.id-z.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var o=Date,l=o.now();t.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,h=null,f=3,p=!1,x=!1,v=!1,b=!1,y=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,N=typeof setImmediate<"u"?setImmediate:null;function A(q){for(var z=n(u);z!==null;){if(z.callback===null)r(u);else if(z.startTime<=q)r(u),z.sortIndex=z.expirationTime,e(c,z);else break;z=n(u)}}function C(q){if(v=!1,A(q),!x)if(n(c)!==null)x=!0,T||(T=!0,O());else{var z=n(u);z!==null&&V(C,z.startTime-q)}}var T=!1,k=-1,j=5,E=-1;function P(){return b?!0:!(t.unstable_now()-Eq&&P());){var Y=h.callback;if(typeof Y=="function"){h.callback=null,f=h.priorityLevel;var oe=Y(h.expirationTime<=q);if(q=t.unstable_now(),typeof oe=="function"){h.callback=oe,A(q),z=!0;break t}h===n(c)&&r(c),A(q)}else r(c);h=n(c)}if(h!==null)z=!0;else{var H=n(u);H!==null&&V(C,H.startTime-q),z=!1}}break e}finally{h=null,f=K,p=!1}z=void 0}}finally{z?O():T=!1}}}var O;if(typeof N=="function")O=function(){N(U)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,R=B.port2;B.port1.onmessage=U,O=function(){R.postMessage(null)}}else O=function(){y(U,0)};function V(q,z){k=y(function(){q(t.unstable_now())},z)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(q){q.callback=null},t.unstable_forceFrameRate=function(q){0>q||125Y?(q.sortIndex=K,e(u,q),n(c)===null&&q===n(u)&&(v?(S(k),k=-1):v=!0,V(C,K-Y))):(q.sortIndex=oe,e(c,q),x||p||(x=!0,T||(T=!0,O()))),q},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(q){var z=f;return function(){var K=f;f=z;try{return q.apply(this,arguments)}finally{f=K}}}})($T)),$T}var YU;function Ioe(){return YU||(YU=1,HT.exports=Ooe()),HT.exports}var VT={exports:{}},ss={};var QU;function zoe(){if(QU)return ss;QU=1;var t=Bb();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),VT.exports=zoe(),VT.exports}var JU;function Uoe(){if(JU)return iy;JU=1;var t=Ioe(),e=Bb(),n=bK();function r(m){var g="https://react.dev/errors/"+m;if(1oe||(m.current=Y[oe],Y[oe]=null,oe--)}function ee(m,g){oe++,Y[oe]=m.current,m.current=g}var J=H(null),Se=H(null),pe=H(null),he=H(null);function De(m,g){switch(ee(pe,g),ee(Se,m),ee(J,null),g.nodeType){case 9:case 11:m=(m=g.documentElement)&&(m=m.namespaceURI)?fU(m):0;break;default:if(m=g.tagName,g=g.namespaceURI)g=fU(g),m=pU(g,m);else switch(m){case"svg":m=1;break;case"math":m=2;break;default:m=0}}X(J),ee(J,m)}function ue(){X(J),X(Se),X(pe)}function le(m){m.memoizedState!==null&&ee(he,m);var g=J.current,_=pU(g,m.type);g!==_&&(ee(Se,m),ee(J,_))}function Ne(m){Se.current===m&&(X(J),X(Se)),he.current===m&&(X(he),Jx._currentValue=K)}var re,Le;function $(m){if(re===void 0)try{throw Error()}catch(_){var g=_.stack.trim().match(/\n( *(at )?)/);re=g&&g[1]||"",Le=-1<_.stack.indexOf(` +function joe(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();var l_=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ec(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var zT={exports:{}},ry={};var GU;function Doe(){if(GU)return ry;GU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var l in i)l!=="key"&&(s[l]=i[l])}else s=i;return i=s.ref,{$$typeof:t,type:r,key:o,ref:i!==void 0?i:null,props:s}}return ry.Fragment=e,ry.jsx=n,ry.jsxs=n,ry}var qU;function Roe(){return qU||(qU=1,zT.exports=Doe()),zT.exports}var a=Roe(),UT={exports:{}},kn={};var WU;function Foe(){if(WU)return kn;WU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),f=Symbol.iterator;function p($){return $===null||typeof $!="object"?null:($=f&&$[f]||$["@@iterator"],typeof $=="function"?$:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,b={};function y($,X,ee){this.props=$,this.context=X,this.refs=b,this.updater=ee||x}y.prototype.isReactComponent={},y.prototype.setState=function($,X){if(typeof $!="object"&&typeof $!="function"&&$!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,$,X,"setState")},y.prototype.forceUpdate=function($){this.updater.enqueueForceUpdate(this,$,"forceUpdate")};function S(){}S.prototype=y.prototype;function N($,X,ee){this.props=$,this.context=X,this.refs=b,this.updater=ee||x}var A=N.prototype=new S;A.constructor=N,v(A,y.prototype),A.isPureReactComponent=!0;var C=Array.isArray;function T(){}var k={H:null,A:null,T:null,S:null},j=Object.prototype.hasOwnProperty;function E($,X,ee){var J=ee.ref;return{$$typeof:t,type:$,key:X,ref:J!==void 0?J:null,props:ee}}function P($,X){return E($.type,X,$.props)}function U($){return typeof $=="object"&&$!==null&&$.$$typeof===t}function O($){var X={"=":"=0",":":"=2"};return"$"+$.replace(/[=:]/g,function(ee){return X[ee]})}var B=/\/+/g;function R($,X){return typeof $=="object"&&$!==null&&$.key!=null?O(""+$.key):X.toString(36)}function G($){switch($.status){case"fulfilled":return $.value;case"rejected":throw $.reason;default:switch(typeof $.status=="string"?$.then(T,T):($.status="pending",$.then(function(X){$.status==="pending"&&($.status="fulfilled",$.value=X)},function(X){$.status==="pending"&&($.status="rejected",$.reason=X)})),$.status){case"fulfilled":return $.value;case"rejected":throw $.reason}}throw $}function q($,X,ee,J,_e){var pe=typeof $;(pe==="undefined"||pe==="boolean")&&($=null);var me=!1;if($===null)me=!0;else switch(pe){case"bigint":case"string":case"number":me=!0;break;case"object":switch($.$$typeof){case t:case e:me=!0;break;case d:return me=$._init,q(me($._payload),X,ee,J,_e)}}if(me)return _e=_e($),me=J===""?"."+R($,0):J,C(_e)?(ee="",me!=null&&(ee=me.replace(B,"$&/")+"/"),q(_e,X,ee,"",function(ce){return ce})):_e!=null&&(U(_e)&&(_e=P(_e,ee+(_e.key==null||$&&$.key===_e.key?"":(""+_e.key).replace(B,"$&/")+"/")+me)),X.push(_e)),1;me=0;var je=J===""?".":J+":";if(C($))for(var de=0;de<$.length;de++)J=$[de],pe=je+R(J,de),me+=q(J,X,ee,pe,_e);else if(de=p($),typeof de=="function")for($=de.call($),de=0;!(J=$.next()).done;)J=J.value,pe=je+R(J,de++),me+=q(J,X,ee,pe,_e);else if(pe==="object"){if(typeof $.then=="function")return q(G($),X,ee,J,_e);throw X=String($),Error("Objects are not valid as a React child (found: "+(X==="[object Object]"?"object with keys {"+Object.keys($).join(", ")+"}":X)+"). If you meant to render a collection of children, use an array instead.")}return me}function z($,X,ee){if($==null)return $;var J=[],_e=0;return q($,J,"","",function(pe){return X.call(ee,pe,_e++)}),J}function K($){if($._status===-1){var X=$._result;X=X(),X.then(function(ee){($._status===0||$._status===-1)&&($._status=1,$._result=ee)},function(ee){($._status===0||$._status===-1)&&($._status=2,$._result=ee)}),$._status===-1&&($._status=0,$._result=X)}if($._status===1)return $._result.default;throw $._result}var Y=typeof reportError=="function"?reportError:function($){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var X=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof $=="object"&&$!==null&&typeof $.message=="string"?String($.message):String($),error:$});if(!window.dispatchEvent(X))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",$);return}console.error($)},oe={map:z,forEach:function($,X,ee){z($,function(){X.apply(this,arguments)},ee)},count:function($){var X=0;return z($,function(){X++}),X},toArray:function($){return z($,function(X){return X})||[]},only:function($){if(!U($))throw Error("React.Children.only expected to receive a single React element child.");return $}};return kn.Activity=h,kn.Children=oe,kn.Component=y,kn.Fragment=n,kn.Profiler=i,kn.PureComponent=N,kn.StrictMode=r,kn.Suspense=c,kn.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=k,kn.__COMPILER_RUNTIME={__proto__:null,c:function($){return k.H.useMemoCache($)}},kn.cache=function($){return function(){return $.apply(null,arguments)}},kn.cacheSignal=function(){return null},kn.cloneElement=function($,X,ee){if($==null)throw Error("The argument must be a React element, but you passed "+$+".");var J=v({},$.props),_e=$.key;if(X!=null)for(pe in X.key!==void 0&&(_e=""+X.key),X)!j.call(X,pe)||pe==="key"||pe==="__self"||pe==="__source"||pe==="ref"&&X.ref===void 0||(J[pe]=X[pe]);var pe=arguments.length-2;if(pe===1)J.children=ee;else if(1>>1,oe=q[Y];if(0>>1;Y<$;){var X=2*(Y+1)-1,ee=q[X],J=X+1,_e=q[J];if(0>i(ee,K))Ji(_e,ee)?(q[Y]=_e,q[J]=K,Y=J):(q[Y]=ee,q[X]=K,Y=X);else if(Ji(_e,K))q[Y]=_e,q[J]=K,Y=J;else break e}}return z}function i(q,z){var K=q.sortIndex-z.sortIndex;return K!==0?K:q.id-z.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var o=Date,l=o.now();t.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,h=null,f=3,p=!1,x=!1,v=!1,b=!1,y=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,N=typeof setImmediate<"u"?setImmediate:null;function A(q){for(var z=n(u);z!==null;){if(z.callback===null)r(u);else if(z.startTime<=q)r(u),z.sortIndex=z.expirationTime,e(c,z);else break;z=n(u)}}function C(q){if(v=!1,A(q),!x)if(n(c)!==null)x=!0,T||(T=!0,O());else{var z=n(u);z!==null&&G(C,z.startTime-q)}}var T=!1,k=-1,j=5,E=-1;function P(){return b?!0:!(t.unstable_now()-Eq&&P());){var Y=h.callback;if(typeof Y=="function"){h.callback=null,f=h.priorityLevel;var oe=Y(h.expirationTime<=q);if(q=t.unstable_now(),typeof oe=="function"){h.callback=oe,A(q),z=!0;break t}h===n(c)&&r(c),A(q)}else r(c);h=n(c)}if(h!==null)z=!0;else{var $=n(u);$!==null&&G(C,$.startTime-q),z=!1}}break e}finally{h=null,f=K,p=!1}z=void 0}}finally{z?O():T=!1}}}var O;if(typeof N=="function")O=function(){N(U)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,R=B.port2;B.port1.onmessage=U,O=function(){R.postMessage(null)}}else O=function(){y(U,0)};function G(q,z){k=y(function(){q(t.unstable_now())},z)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(q){q.callback=null},t.unstable_forceFrameRate=function(q){0>q||125Y?(q.sortIndex=K,e(u,q),n(c)===null&&q===n(u)&&(v?(S(k),k=-1):v=!0,G(C,K-Y))):(q.sortIndex=oe,e(c,q),x||p||(x=!0,T||(T=!0,O()))),q},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(q){var z=f;return function(){var K=f;f=z;try{return q.apply(this,arguments)}finally{f=K}}}})($T)),$T}var YU;function Ioe(){return YU||(YU=1,HT.exports=Ooe()),HT.exports}var VT={exports:{}},ss={};var QU;function zoe(){if(QU)return ss;QU=1;var t=Bb();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),VT.exports=zoe(),VT.exports}var JU;function Uoe(){if(JU)return iy;JU=1;var t=Ioe(),e=Bb(),n=bK();function r(m){var g="https://react.dev/errors/"+m;if(1oe||(m.current=Y[oe],Y[oe]=null,oe--)}function ee(m,g){oe++,Y[oe]=m.current,m.current=g}var J=$(null),_e=$(null),pe=$(null),me=$(null);function je(m,g){switch(ee(pe,g),ee(_e,m),ee(J,null),g.nodeType){case 9:case 11:m=(m=g.documentElement)&&(m=m.namespaceURI)?fU(m):0;break;default:if(m=g.tagName,g=g.namespaceURI)g=fU(g),m=pU(g,m);else switch(m){case"svg":m=1;break;case"math":m=2;break;default:m=0}}X(J),ee(J,m)}function de(){X(J),X(_e),X(pe)}function ce(m){m.memoizedState!==null&&ee(me,m);var g=J.current,_=pU(g,m.type);g!==_&&(ee(_e,m),ee(J,_))}function Se(m){_e.current===m&&(X(J),X(_e)),me.current===m&&(X(me),Jx._currentValue=K)}var ie,Fe;function V(m){if(ie===void 0)try{throw Error()}catch(_){var g=_.stack.trim().match(/\n( *(at )?)/);ie=g&&g[1]||"",Fe=-1<_.stack.indexOf(` at`)?" ()":-1<_.stack.indexOf("@")?"@unknown:0:0":""}return` -`+re+m+Le}var W=!1;function ce(m,g){if(!m||W)return"";W=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var M={DetermineComponentFrameRoot:function(){try{if(g){var Ct=function(){throw Error()};if(Object.defineProperty(Ct.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Ct,[])}catch(gt){var mt=gt}Reflect.construct(m,[],Ct)}else{try{Ct.call()}catch(gt){mt=gt}m.call(Ct.prototype)}}else{try{throw Error()}catch(gt){mt=gt}(Ct=m())&&typeof Ct.catch=="function"&&Ct.catch(function(){})}}catch(gt){if(gt&&mt&&typeof gt.stack=="string")return[gt.stack,mt.stack]}return[null,null]}};M.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var F=Object.getOwnPropertyDescriptor(M.DetermineComponentFrameRoot,"name");F&&F.configurable&&Object.defineProperty(M.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var I=M.DetermineComponentFrameRoot(),te=I[0],Ce=I[1];if(te&&Ce){var Be=te.split(` -`),ht=Ce.split(` +`+ie+m+Fe}var W=!1;function ue(m,g){if(!m||W)return"";W=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var M={DetermineComponentFrameRoot:function(){try{if(g){var Ct=function(){throw Error()};if(Object.defineProperty(Ct.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Ct,[])}catch(gt){var mt=gt}Reflect.construct(m,[],Ct)}else{try{Ct.call()}catch(gt){mt=gt}m.call(Ct.prototype)}}else{try{throw Error()}catch(gt){mt=gt}(Ct=m())&&typeof Ct.catch=="function"&&Ct.catch(function(){})}}catch(gt){if(gt&&mt&&typeof gt.stack=="string")return[gt.stack,mt.stack]}return[null,null]}};M.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var F=Object.getOwnPropertyDescriptor(M.DetermineComponentFrameRoot,"name");F&&F.configurable&&Object.defineProperty(M.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var I=M.DetermineComponentFrameRoot(),te=I[0],ke=I[1];if(te&&ke){var Be=te.split(` +`),ht=ke.split(` `);for(F=M=0;MF||Be[M]!==ht[F]){var yt=` -`+Be[M].replace(" at new "," at ");return m.displayName&&yt.includes("")&&(yt=yt.replace("",m.displayName)),yt}while(1<=M&&0<=F);break}}}finally{W=!1,Error.prepareStackTrace=_}return(_=m?m.displayName||m.name:"")?$(_):""}function Z(m,g){switch(m.tag){case 26:case 27:case 5:return $(m.type);case 16:return $("Lazy");case 13:return m.child!==g&&g!==null?$("Suspense Fallback"):$("Suspense");case 19:return $("SuspenseList");case 0:case 15:return ce(m.type,!1);case 11:return ce(m.type.render,!1);case 1:return ce(m.type,!0);case 31:return $("Activity");default:return""}}function se(m){try{var g="",_=null;do g+=Z(m,_),_=m,m=m.return;while(m);return g}catch(M){return` +`+Be[M].replace(" at new "," at ");return m.displayName&&yt.includes("")&&(yt=yt.replace("",m.displayName)),yt}while(1<=M&&0<=F);break}}}finally{W=!1,Error.prepareStackTrace=_}return(_=m?m.displayName||m.name:"")?V(_):""}function Q(m,g){switch(m.tag){case 26:case 27:case 5:return V(m.type);case 16:return V("Lazy");case 13:return m.child!==g&&g!==null?V("Suspense Fallback"):V("Suspense");case 19:return V("SuspenseList");case 0:case 15:return ue(m.type,!1);case 11:return ue(m.type.render,!1);case 1:return ue(m.type,!0);case 31:return V("Activity");default:return""}}function se(m){try{var g="",_=null;do g+=Q(m,_),_=m,m=m.return;while(m);return g}catch(M){return` Error generating stack: `+M.message+` -`+M.stack}}var Q=Object.prototype.hasOwnProperty,de=t.unstable_scheduleCallback,be=t.unstable_cancelCallback,me=t.unstable_shouldYield,L=t.unstable_requestPaint,D=t.unstable_now,G=t.unstable_getCurrentPriorityLevel,fe=t.unstable_ImmediatePriority,ye=t.unstable_UserBlockingPriority,xe=t.unstable_NormalPriority,ze=t.unstable_LowPriority,we=t.unstable_IdlePriority,He=t.log,Ze=t.unstable_setDisableYieldValue,_e=null,ve=null;function ke(m){if(typeof He=="function"&&Ze(m),ve&&typeof ve.setStrictMode=="function")try{ve.setStrictMode(_e,m)}catch{}}var Ue=Math.clz32?Math.clz32:Ae,je=Math.log,Ve=Math.LN2;function Ae(m){return m>>>=0,m===0?32:31-(je(m)/Ve|0)|0}var et=256,Pe=262144,Ye=4194304;function Re(m){var g=m&42;if(g!==0)return g;switch(m&-m){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return m&261888;case 262144:case 524288:case 1048576:case 2097152:return m&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return m&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return m}}function Fe(m,g,_){var M=m.pendingLanes;if(M===0)return 0;var F=0,I=m.suspendedLanes,te=m.pingedLanes;m=m.warmLanes;var Ce=M&134217727;return Ce!==0?(M=Ce&~I,M!==0?F=Re(M):(te&=Ce,te!==0?F=Re(te):_||(_=Ce&~m,_!==0&&(F=Re(_))))):(Ce=M&~I,Ce!==0?F=Re(Ce):te!==0?F=Re(te):_||(_=M&~m,_!==0&&(F=Re(_)))),F===0?0:g!==0&&g!==F&&(g&I)===0&&(I=F&-F,_=g&-g,I>=_||I===32&&(_&4194048)!==0)?g:F}function We(m,g){return(m.pendingLanes&~(m.suspendedLanes&~m.pingedLanes)&g)===0}function pt(m,g){switch(m){case 1:case 2:case 4:case 8:case 64:return g+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return g+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function At(){var m=Ye;return Ye<<=1,(Ye&62914560)===0&&(Ye=4194304),m}function Rt(m){for(var g=[],_=0;31>_;_++)g.push(m);return g}function Wt(m,g){m.pendingLanes|=g,g!==268435456&&(m.suspendedLanes=0,m.pingedLanes=0,m.warmLanes=0)}function Tt(m,g,_,M,F,I){var te=m.pendingLanes;m.pendingLanes=_,m.suspendedLanes=0,m.pingedLanes=0,m.warmLanes=0,m.expiredLanes&=_,m.entangledLanes&=_,m.errorRecoveryDisabledLanes&=_,m.shellSuspendCounter=0;var Ce=m.entanglements,Be=m.expirationTimes,ht=m.hiddenUpdates;for(_=te&~_;0<_;){var yt=31-Ue(_),Ct=1<"u")return null;try{return m.activeElement||m.body}catch{return m.body}}var Qr=/[\n"\\]/g;function gn(m){return m.replace(Qr,function(g){return"\\"+g.charCodeAt(0).toString(16)+" "})}function Zr(m,g,_,M,F,I,te,Ce){m.name="",te!=null&&typeof te!="function"&&typeof te!="symbol"&&typeof te!="boolean"?m.type=te:m.removeAttribute("type"),g!=null?te==="number"?(g===0&&m.value===""||m.value!=g)&&(m.value=""+Mn(g)):m.value!==""+Mn(g)&&(m.value=""+Mn(g)):te!=="submit"&&te!=="reset"||m.removeAttribute("value"),g!=null?vi(m,te,Mn(g)):_!=null?vi(m,te,Mn(_)):M!=null&&m.removeAttribute("value"),F==null&&I!=null&&(m.defaultChecked=!!I),F!=null&&(m.checked=F&&typeof F!="function"&&typeof F!="symbol"),Ce!=null&&typeof Ce!="function"&&typeof Ce!="symbol"&&typeof Ce!="boolean"?m.name=""+Mn(Ce):m.removeAttribute("name")}function Kn(m,g,_,M,F,I,te,Ce){if(I!=null&&typeof I!="function"&&typeof I!="symbol"&&typeof I!="boolean"&&(m.type=I),g!=null||_!=null){if(!(I!=="submit"&&I!=="reset"||g!=null)){sn(m);return}_=_!=null?""+Mn(_):"",g=g!=null?""+Mn(g):_,Ce||g===m.value||(m.value=g),m.defaultValue=g}M=M??F,M=typeof M!="function"&&typeof M!="symbol"&&!!M,m.checked=Ce?m.checked:!!M,m.defaultChecked=!!M,te!=null&&typeof te!="function"&&typeof te!="symbol"&&typeof te!="boolean"&&(m.name=te),sn(m)}function vi(m,g,_){g==="number"&&Mr(m.ownerDocument)===m||m.defaultValue===""+_||(m.defaultValue=""+_)}function mi(m,g,_,M){if(m=m.options,g){g={};for(var F=0;F<_.length;F++)g["$"+_[F]]=!0;for(_=0;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),vr=!1;if(Ur)try{var Cl={};Object.defineProperty(Cl,"passive",{get:function(){vr=!0}}),window.addEventListener("test",Cl,Cl),window.removeEventListener("test",Cl,Cl)}catch{vr=!1}var Ma=null,oa=null,ic=null;function Br(){if(ic)return ic;var m,g=oa,_=g.length,M,F="value"in Ma?Ma.value:Ma.textContent,I=F.length;for(m=0;m<_&&g[m]===F[m];m++);var te=_-m;for(M=1;M<=te&&g[_-M]===F[I-M];M++);return ic=F.slice(m,1=vx),wI=" ",_I=!1;function SI(m,g){switch(m){case"keyup":return ese.indexOf(g.keyCode)!==-1;case"keydown":return g.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function NI(m){return m=m.detail,typeof m=="object"&&"data"in m?m.data:null}var fp=!1;function nse(m,g){switch(m){case"compositionend":return NI(g);case"keypress":return g.which!==32?null:(_I=!0,wI);case"textInput":return m=g.data,m===wI&&_I?null:m;default:return null}}function rse(m,g){if(fp)return m==="compositionend"||!GM&&SI(m,g)?(m=Br(),ic=oa=Ma=null,fp=!1,m):null;switch(m){case"paste":return null;case"keypress":if(!(g.ctrlKey||g.altKey||g.metaKey)||g.ctrlKey&&g.altKey){if(g.char&&1=g)return{node:_,offset:g-m};m=M}e:{for(;_;){if(_.nextSibling){_=_.nextSibling;break e}_=_.parentNode}_=void 0}_=jI(_)}}function RI(m,g){return m&&g?m===g?!0:m&&m.nodeType===3?!1:g&&g.nodeType===3?RI(m,g.parentNode):"contains"in m?m.contains(g):m.compareDocumentPosition?!!(m.compareDocumentPosition(g)&16):!1:!1}function FI(m){m=m!=null&&m.ownerDocument!=null&&m.ownerDocument.defaultView!=null?m.ownerDocument.defaultView:window;for(var g=Mr(m.document);g instanceof m.HTMLIFrameElement;){try{var _=typeof g.contentWindow.location.href=="string"}catch{_=!1}if(_)m=g.contentWindow;else break;g=Mr(m.document)}return g}function KM(m){var g=m&&m.nodeName&&m.nodeName.toLowerCase();return g&&(g==="input"&&(m.type==="text"||m.type==="search"||m.type==="tel"||m.type==="url"||m.type==="password")||g==="textarea"||m.contentEditable==="true")}var dse=Ur&&"documentMode"in document&&11>=document.documentMode,pp=null,XM=null,Nx=null,YM=!1;function LI(m,g,_){var M=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;YM||pp==null||pp!==Mr(M)||(M=pp,"selectionStart"in M&&KM(M)?M={start:M.selectionStart,end:M.selectionEnd}:(M=(M.ownerDocument&&M.ownerDocument.defaultView||window).getSelection(),M={anchorNode:M.anchorNode,anchorOffset:M.anchorOffset,focusNode:M.focusNode,focusOffset:M.focusOffset}),Nx&&Sx(Nx,M)||(Nx=M,M=Ww(XM,"onSelect"),0>=te,F-=te,ac=1<<32-Ue(g)+F|_<Rn?(tr=Jt,Jt=null):tr=Jt.sibling;var dr=mt(rt,Jt,ut[Rn],St);if(dr===null){Jt===null&&(Jt=tr);break}m&&Jt&&dr.alternate===null&&g(rt,Jt),Ke=I(dr,Ke,Rn),ur===null?an=dr:ur.sibling=dr,ur=dr,Jt=tr}if(Rn===ut.length)return _(rt,Jt),rr&&Zc(rt,Rn),an;if(Jt===null){for(;RnRn?(tr=Jt,Jt=null):tr=Jt.sibling;var Vd=mt(rt,Jt,dr.value,St);if(Vd===null){Jt===null&&(Jt=tr);break}m&&Jt&&Vd.alternate===null&&g(rt,Jt),Ke=I(Vd,Ke,Rn),ur===null?an=Vd:ur.sibling=Vd,ur=Vd,Jt=tr}if(dr.done)return _(rt,Jt),rr&&Zc(rt,Rn),an;if(Jt===null){for(;!dr.done;Rn++,dr=ut.next())dr=Ct(rt,dr.value,St),dr!==null&&(Ke=I(dr,Ke,Rn),ur===null?an=dr:ur.sibling=dr,ur=dr);return rr&&Zc(rt,Rn),an}for(Jt=M(Jt);!dr.done;Rn++,dr=ut.next())dr=gt(Jt,rt,Rn,dr.value,St),dr!==null&&(m&&dr.alternate!==null&&Jt.delete(dr.key===null?Rn:dr.key),Ke=I(dr,Ke,Rn),ur===null?an=dr:ur.sibling=dr,ur=dr);return m&&Jt.forEach(function(Poe){return g(rt,Poe)}),rr&&Zc(rt,Rn),an}function Er(rt,Ke,ut,St){if(typeof ut=="object"&&ut!==null&&ut.type===v&&ut.key===null&&(ut=ut.props.children),typeof ut=="object"&&ut!==null){switch(ut.$$typeof){case p:e:{for(var an=ut.key;Ke!==null;){if(Ke.key===an){if(an=ut.type,an===v){if(Ke.tag===7){_(rt,Ke.sibling),St=F(Ke,ut.props.children),St.return=rt,rt=St;break e}}else if(Ke.elementType===an||typeof an=="object"&&an!==null&&an.$$typeof===j&&Nm(an)===Ke.type){_(rt,Ke.sibling),St=F(Ke,ut.props),Ex(St,ut),St.return=rt,rt=St;break e}_(rt,Ke);break}else g(rt,Ke);Ke=Ke.sibling}ut.type===v?(St=ym(ut.props.children,rt.mode,St,ut.key),St.return=rt,rt=St):(St=uw(ut.type,ut.key,ut.props,null,rt.mode,St),Ex(St,ut),St.return=rt,rt=St)}return te(rt);case x:e:{for(an=ut.key;Ke!==null;){if(Ke.key===an)if(Ke.tag===4&&Ke.stateNode.containerInfo===ut.containerInfo&&Ke.stateNode.implementation===ut.implementation){_(rt,Ke.sibling),St=F(Ke,ut.children||[]),St.return=rt,rt=St;break e}else{_(rt,Ke);break}else g(rt,Ke);Ke=Ke.sibling}St=rA(ut,rt.mode,St),St.return=rt,rt=St}return te(rt);case j:return ut=Nm(ut),Er(rt,Ke,ut,St)}if(V(ut))return Qt(rt,Ke,ut,St);if(O(ut)){if(an=O(ut),typeof an!="function")throw Error(r(150));return ut=an.call(ut),mn(rt,Ke,ut,St)}if(typeof ut.then=="function")return Er(rt,Ke,bw(ut),St);if(ut.$$typeof===N)return Er(rt,Ke,mw(rt,ut),St);xw(rt,ut)}return typeof ut=="string"&&ut!==""||typeof ut=="number"||typeof ut=="bigint"?(ut=""+ut,Ke!==null&&Ke.tag===6?(_(rt,Ke.sibling),St=F(Ke,ut),St.return=rt,rt=St):(_(rt,Ke),St=nA(ut,rt.mode,St),St.return=rt,rt=St),te(rt)):_(rt,Ke)}return function(rt,Ke,ut,St){try{Tx=0;var an=Er(rt,Ke,ut,St);return Cp=null,an}catch(Jt){if(Jt===kp||Jt===pw)throw Jt;var ur=fo(29,Jt,null,rt.mode);return ur.lanes=St,ur.return=rt,ur}}}var Cm=a5(!0),s5=a5(!1),Md=!1;function pA(m){m.updateQueue={baseState:m.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function gA(m,g){m=m.updateQueue,g.updateQueue===m&&(g.updateQueue={baseState:m.baseState,firstBaseUpdate:m.firstBaseUpdate,lastBaseUpdate:m.lastBaseUpdate,shared:m.shared,callbacks:null})}function Ad(m){return{lane:m,tag:0,payload:null,callback:null,next:null}}function Td(m,g,_){var M=m.updateQueue;if(M===null)return null;if(M=M.shared,(pr&2)!==0){var F=M.pending;return F===null?g.next=g:(g.next=F.next,F.next=g),M.pending=g,g=cw(m),$I(m,null,_),g}return lw(m,M,g,_),cw(m)}function Px(m,g,_){if(g=g.updateQueue,g!==null&&(g=g.shared,(_&4194048)!==0)){var M=g.lanes;M&=m.pendingLanes,_|=M,g.lanes=_,xt(m,_)}}function bA(m,g){var _=m.updateQueue,M=m.alternate;if(M!==null&&(M=M.updateQueue,_===M)){var F=null,I=null;if(_=_.firstBaseUpdate,_!==null){do{var te={lane:_.lane,tag:_.tag,payload:_.payload,callback:null,next:null};I===null?F=I=te:I=I.next=te,_=_.next}while(_!==null);I===null?F=I=g:I=I.next=g}else F=I=g;_={baseState:M.baseState,firstBaseUpdate:F,lastBaseUpdate:I,shared:M.shared,callbacks:M.callbacks},m.updateQueue=_;return}m=_.lastBaseUpdate,m===null?_.firstBaseUpdate=g:m.next=g,_.lastBaseUpdate=g}var xA=!1;function jx(){if(xA){var m=Np;if(m!==null)throw m}}function Dx(m,g,_,M){xA=!1;var F=m.updateQueue;Md=!1;var I=F.firstBaseUpdate,te=F.lastBaseUpdate,Ce=F.shared.pending;if(Ce!==null){F.shared.pending=null;var Be=Ce,ht=Be.next;Be.next=null,te===null?I=ht:te.next=ht,te=Be;var yt=m.alternate;yt!==null&&(yt=yt.updateQueue,Ce=yt.lastBaseUpdate,Ce!==te&&(Ce===null?yt.firstBaseUpdate=ht:Ce.next=ht,yt.lastBaseUpdate=Be))}if(I!==null){var Ct=F.baseState;te=0,yt=ht=Be=null,Ce=I;do{var mt=Ce.lane&-536870913,gt=mt!==Ce.lane;if(gt?(er&mt)===mt:(M&mt)===mt){mt!==0&&mt===Sp&&(xA=!0),yt!==null&&(yt=yt.next={lane:0,tag:Ce.tag,payload:Ce.payload,callback:null,next:null});e:{var Qt=m,mn=Ce;mt=g;var Er=_;switch(mn.tag){case 1:if(Qt=mn.payload,typeof Qt=="function"){Ct=Qt.call(Er,Ct,mt);break e}Ct=Qt;break e;case 3:Qt.flags=Qt.flags&-65537|128;case 0:if(Qt=mn.payload,mt=typeof Qt=="function"?Qt.call(Er,Ct,mt):Qt,mt==null)break e;Ct=h({},Ct,mt);break e;case 2:Md=!0}}mt=Ce.callback,mt!==null&&(m.flags|=64,gt&&(m.flags|=8192),gt=F.callbacks,gt===null?F.callbacks=[mt]:gt.push(mt))}else gt={lane:mt,tag:Ce.tag,payload:Ce.payload,callback:Ce.callback,next:null},yt===null?(ht=yt=gt,Be=Ct):yt=yt.next=gt,te|=mt;if(Ce=Ce.next,Ce===null){if(Ce=F.shared.pending,Ce===null)break;gt=Ce,Ce=gt.next,gt.next=null,F.lastBaseUpdate=gt,F.shared.pending=null}}while(!0);yt===null&&(Be=Ct),F.baseState=Be,F.firstBaseUpdate=ht,F.lastBaseUpdate=yt,I===null&&(F.shared.lanes=0),Rd|=te,m.lanes=te,m.memoizedState=Ct}}function o5(m,g){if(typeof m!="function")throw Error(r(191,m));m.call(g)}function l5(m,g){var _=m.callbacks;if(_!==null)for(m.callbacks=null,m=0;m<_.length;m++)o5(_[m],g)}var Mp=H(null),yw=H(0);function c5(m,g){m=cu,ee(yw,m),ee(Mp,g),cu=m|g.baseLanes}function yA(){ee(yw,cu),ee(Mp,Mp.current)}function vA(){cu=yw.current,X(Mp),X(yw)}var po=H(null),Vo=null;function Ed(m){var g=m.alternate;ee(Oi,Oi.current&1),ee(po,m),Vo===null&&(g===null||Mp.current!==null||g.memoizedState!==null)&&(Vo=m)}function wA(m){ee(Oi,Oi.current),ee(po,m),Vo===null&&(Vo=m)}function u5(m){m.tag===22?(ee(Oi,Oi.current),ee(po,m),Vo===null&&(Vo=m)):Pd()}function Pd(){ee(Oi,Oi.current),ee(po,po.current)}function go(m){X(po),Vo===m&&(Vo=null),X(Oi)}var Oi=H(0);function vw(m){for(var g=m;g!==null;){if(g.tag===13){var _=g.memoizedState;if(_!==null&&(_=_.dehydrated,_===null||MT(_)||AT(_)))return g}else if(g.tag===19&&(g.memoizedProps.revealOrder==="forwards"||g.memoizedProps.revealOrder==="backwards"||g.memoizedProps.revealOrder==="unstable_legacy-backwards"||g.memoizedProps.revealOrder==="together")){if((g.flags&128)!==0)return g}else if(g.child!==null){g.child.return=g,g=g.child;continue}if(g===m)break;for(;g.sibling===null;){if(g.return===null||g.return===m)return null;g=g.return}g.sibling.return=g.return,g=g.sibling}return null}var tu=0,En=null,Ar=null,qi=null,ww=!1,Ap=!1,Mm=!1,_w=0,Rx=0,Tp=null,wse=0;function Ni(){throw Error(r(321))}function _A(m,g){if(g===null)return!1;for(var _=0;_I?I:8;var te=q.T,Ce={};q.T=Ce,OA(m,!1,g,_);try{var Be=F(),ht=q.S;if(ht!==null&&ht(Ce,Be),Be!==null&&typeof Be=="object"&&typeof Be.then=="function"){var yt=vse(Be,M);Lx(m,g,yt,yo(m))}else Lx(m,g,M,yo(m))}catch(Ct){Lx(m,g,{then:function(){},status:"rejected",reason:Ct},yo())}finally{z.p=I,te!==null&&Ce.types!==null&&(te.types=Ce.types),q.T=te}}function Cse(){}function FA(m,g,_,M){if(m.tag!==5)throw Error(r(476));var F=U5(m).queue;z5(m,F,g,K,_===null?Cse:function(){return B5(m),_(M)})}function U5(m){var g=m.memoizedState;if(g!==null)return g;g={memoizedState:K,baseState:K,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:nu,lastRenderedState:K},next:null};var _={};return g.next={memoizedState:_,baseState:_,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:nu,lastRenderedState:_},next:null},m.memoizedState=g,m=m.alternate,m!==null&&(m.memoizedState=g),g}function B5(m){var g=U5(m);g.next===null&&(g=m.alternate.memoizedState),Lx(m,g.next.queue,{},yo())}function LA(){return $a(Jx)}function H5(){return Ii().memoizedState}function $5(){return Ii().memoizedState}function Mse(m){for(var g=m.return;g!==null;){switch(g.tag){case 24:case 3:var _=yo();m=Ad(_);var M=Td(g,m,_);M!==null&&(qs(M,g,_),Px(M,g,_)),g={cache:dA()},m.payload=g;return}g=g.return}}function Ase(m,g,_){var M=yo();_={lane:M,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null},Aw(m)?G5(g,_):(_=eA(m,g,_,M),_!==null&&(qs(_,m,M),q5(_,g,M)))}function V5(m,g,_){var M=yo();Lx(m,g,_,M)}function Lx(m,g,_,M){var F={lane:M,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null};if(Aw(m))G5(g,F);else{var I=m.alternate;if(m.lanes===0&&(I===null||I.lanes===0)&&(I=g.lastRenderedReducer,I!==null))try{var te=g.lastRenderedState,Ce=I(te,_);if(F.hasEagerState=!0,F.eagerState=Ce,mo(Ce,te))return lw(m,g,F,0),Hr===null&&ow(),!1}catch{}if(_=eA(m,g,F,M),_!==null)return qs(_,m,M),q5(_,g,M),!0}return!1}function OA(m,g,_,M){if(M={lane:2,revertLane:pT(),gesture:null,action:M,hasEagerState:!1,eagerState:null,next:null},Aw(m)){if(g)throw Error(r(479))}else g=eA(m,_,M,2),g!==null&&qs(g,m,2)}function Aw(m){var g=m.alternate;return m===En||g!==null&&g===En}function G5(m,g){Ap=ww=!0;var _=m.pending;_===null?g.next=g:(g.next=_.next,_.next=g),m.pending=g}function q5(m,g,_){if((_&4194048)!==0){var M=g.lanes;M&=m.pendingLanes,_|=M,g.lanes=_,xt(m,_)}}var Ox={readContext:$a,use:Nw,useCallback:Ni,useContext:Ni,useEffect:Ni,useImperativeHandle:Ni,useLayoutEffect:Ni,useInsertionEffect:Ni,useMemo:Ni,useReducer:Ni,useRef:Ni,useState:Ni,useDebugValue:Ni,useDeferredValue:Ni,useTransition:Ni,useSyncExternalStore:Ni,useId:Ni,useHostTransitionStatus:Ni,useFormState:Ni,useActionState:Ni,useOptimistic:Ni,useMemoCache:Ni,useCacheRefresh:Ni};Ox.useEffectEvent=Ni;var W5={readContext:$a,use:Nw,useCallback:function(m,g){return Cs().memoizedState=[m,g===void 0?null:g],m},useContext:$a,useEffect:E5,useImperativeHandle:function(m,g,_){_=_!=null?_.concat([m]):null,Cw(4194308,4,R5.bind(null,g,m),_)},useLayoutEffect:function(m,g){return Cw(4194308,4,m,g)},useInsertionEffect:function(m,g){Cw(4,2,m,g)},useMemo:function(m,g){var _=Cs();g=g===void 0?null:g;var M=m();if(Mm){ke(!0);try{m()}finally{ke(!1)}}return _.memoizedState=[M,g],M},useReducer:function(m,g,_){var M=Cs();if(_!==void 0){var F=_(g);if(Mm){ke(!0);try{_(g)}finally{ke(!1)}}}else F=g;return M.memoizedState=M.baseState=F,m={pending:null,lanes:0,dispatch:null,lastRenderedReducer:m,lastRenderedState:F},M.queue=m,m=m.dispatch=Ase.bind(null,En,m),[M.memoizedState,m]},useRef:function(m){var g=Cs();return m={current:m},g.memoizedState=m},useState:function(m){m=EA(m);var g=m.queue,_=V5.bind(null,En,g);return g.dispatch=_,[m.memoizedState,_]},useDebugValue:DA,useDeferredValue:function(m,g){var _=Cs();return RA(_,m,g)},useTransition:function(){var m=EA(!1);return m=z5.bind(null,En,m.queue,!0,!1),Cs().memoizedState=m,[!1,m]},useSyncExternalStore:function(m,g,_){var M=En,F=Cs();if(rr){if(_===void 0)throw Error(r(407));_=_()}else{if(_=g(),Hr===null)throw Error(r(349));(er&127)!==0||f5(M,g,_)}F.memoizedState=_;var I={value:_,getSnapshot:g};return F.queue=I,E5(g5.bind(null,M,I,m),[m]),M.flags|=2048,Ep(9,{destroy:void 0},p5.bind(null,M,I,_,g),null),_},useId:function(){var m=Cs(),g=Hr.identifierPrefix;if(rr){var _=sc,M=ac;_=(M&~(1<<32-Ue(M)-1)).toString(32)+_,g="_"+g+"R_"+_,_=_w++,0<_&&(g+="H"+_.toString(32)),g+="_"}else _=wse++,g="_"+g+"r_"+_.toString(32)+"_";return m.memoizedState=g},useHostTransitionStatus:LA,useFormState:k5,useActionState:k5,useOptimistic:function(m){var g=Cs();g.memoizedState=g.baseState=m;var _={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return g.queue=_,g=OA.bind(null,En,!0,_),_.dispatch=g,[m,g]},useMemoCache:MA,useCacheRefresh:function(){return Cs().memoizedState=Mse.bind(null,En)},useEffectEvent:function(m){var g=Cs(),_={impl:m};return g.memoizedState=_,function(){if((pr&2)!==0)throw Error(r(440));return _.impl.apply(void 0,arguments)}}},IA={readContext:$a,use:Nw,useCallback:L5,useContext:$a,useEffect:jA,useImperativeHandle:F5,useInsertionEffect:j5,useLayoutEffect:D5,useMemo:O5,useReducer:kw,useRef:T5,useState:function(){return kw(nu)},useDebugValue:DA,useDeferredValue:function(m,g){var _=Ii();return I5(_,Ar.memoizedState,m,g)},useTransition:function(){var m=kw(nu)[0],g=Ii().memoizedState;return[typeof m=="boolean"?m:Fx(m),g]},useSyncExternalStore:m5,useId:H5,useHostTransitionStatus:LA,useFormState:C5,useActionState:C5,useOptimistic:function(m,g){var _=Ii();return y5(_,Ar,m,g)},useMemoCache:MA,useCacheRefresh:$5};IA.useEffectEvent=P5;var K5={readContext:$a,use:Nw,useCallback:L5,useContext:$a,useEffect:jA,useImperativeHandle:F5,useInsertionEffect:j5,useLayoutEffect:D5,useMemo:O5,useReducer:TA,useRef:T5,useState:function(){return TA(nu)},useDebugValue:DA,useDeferredValue:function(m,g){var _=Ii();return Ar===null?RA(_,m,g):I5(_,Ar.memoizedState,m,g)},useTransition:function(){var m=TA(nu)[0],g=Ii().memoizedState;return[typeof m=="boolean"?m:Fx(m),g]},useSyncExternalStore:m5,useId:H5,useHostTransitionStatus:LA,useFormState:A5,useActionState:A5,useOptimistic:function(m,g){var _=Ii();return Ar!==null?y5(_,Ar,m,g):(_.baseState=m,[m,_.queue.dispatch])},useMemoCache:MA,useCacheRefresh:$5};K5.useEffectEvent=P5;function zA(m,g,_,M){g=m.memoizedState,_=_(M,g),_=_==null?g:h({},g,_),m.memoizedState=_,m.lanes===0&&(m.updateQueue.baseState=_)}var UA={enqueueSetState:function(m,g,_){m=m._reactInternals;var M=yo(),F=Ad(M);F.payload=g,_!=null&&(F.callback=_),g=Td(m,F,M),g!==null&&(qs(g,m,M),Px(g,m,M))},enqueueReplaceState:function(m,g,_){m=m._reactInternals;var M=yo(),F=Ad(M);F.tag=1,F.payload=g,_!=null&&(F.callback=_),g=Td(m,F,M),g!==null&&(qs(g,m,M),Px(g,m,M))},enqueueForceUpdate:function(m,g){m=m._reactInternals;var _=yo(),M=Ad(_);M.tag=2,g!=null&&(M.callback=g),g=Td(m,M,_),g!==null&&(qs(g,m,_),Px(g,m,_))}};function X5(m,g,_,M,F,I,te){return m=m.stateNode,typeof m.shouldComponentUpdate=="function"?m.shouldComponentUpdate(M,I,te):g.prototype&&g.prototype.isPureReactComponent?!Sx(_,M)||!Sx(F,I):!0}function Y5(m,g,_,M){m=g.state,typeof g.componentWillReceiveProps=="function"&&g.componentWillReceiveProps(_,M),typeof g.UNSAFE_componentWillReceiveProps=="function"&&g.UNSAFE_componentWillReceiveProps(_,M),g.state!==m&&UA.enqueueReplaceState(g,g.state,null)}function Am(m,g){var _=g;if("ref"in g){_={};for(var M in g)M!=="ref"&&(_[M]=g[M])}if(m=m.defaultProps){_===g&&(_=h({},_));for(var F in m)_[F]===void 0&&(_[F]=m[F])}return _}function Q5(m){sw(m)}function Z5(m){console.error(m)}function J5(m){sw(m)}function Tw(m,g){try{var _=m.onUncaughtError;_(g.value,{componentStack:g.stack})}catch(M){setTimeout(function(){throw M})}}function ez(m,g,_){try{var M=m.onCaughtError;M(_.value,{componentStack:_.stack,errorBoundary:g.tag===1?g.stateNode:null})}catch(F){setTimeout(function(){throw F})}}function BA(m,g,_){return _=Ad(_),_.tag=3,_.payload={element:null},_.callback=function(){Tw(m,g)},_}function tz(m){return m=Ad(m),m.tag=3,m}function nz(m,g,_,M){var F=_.type.getDerivedStateFromError;if(typeof F=="function"){var I=M.value;m.payload=function(){return F(I)},m.callback=function(){ez(g,_,M)}}var te=_.stateNode;te!==null&&typeof te.componentDidCatch=="function"&&(m.callback=function(){ez(g,_,M),typeof F!="function"&&(Fd===null?Fd=new Set([this]):Fd.add(this));var Ce=M.stack;this.componentDidCatch(M.value,{componentStack:Ce!==null?Ce:""})})}function Tse(m,g,_,M,F){if(_.flags|=32768,M!==null&&typeof M=="object"&&typeof M.then=="function"){if(g=_.alternate,g!==null&&_p(g,_,F,!0),_=po.current,_!==null){switch(_.tag){case 31:case 13:return Vo===null?Bw():_.alternate===null&&ki===0&&(ki=3),_.flags&=-257,_.flags|=65536,_.lanes=F,M===gw?_.flags|=16384:(g=_.updateQueue,g===null?_.updateQueue=new Set([M]):g.add(M),hT(m,M,F)),!1;case 22:return _.flags|=65536,M===gw?_.flags|=16384:(g=_.updateQueue,g===null?(g={transitions:null,markerInstances:null,retryQueue:new Set([M])},_.updateQueue=g):(_=g.retryQueue,_===null?g.retryQueue=new Set([M]):_.add(M)),hT(m,M,F)),!1}throw Error(r(435,_.tag))}return hT(m,M,F),Bw(),!1}if(rr)return g=po.current,g!==null?((g.flags&65536)===0&&(g.flags|=256),g.flags|=65536,g.lanes=F,M!==sA&&(m=Error(r(422),{cause:M}),Cx(Uo(m,_)))):(M!==sA&&(g=Error(r(423),{cause:M}),Cx(Uo(g,_))),m=m.current.alternate,m.flags|=65536,F&=-F,m.lanes|=F,M=Uo(M,_),F=BA(m.stateNode,M,F),bA(m,F),ki!==4&&(ki=2)),!1;var I=Error(r(520),{cause:M});if(I=Uo(I,_),Gx===null?Gx=[I]:Gx.push(I),ki!==4&&(ki=2),g===null)return!0;M=Uo(M,_),_=g;do{switch(_.tag){case 3:return _.flags|=65536,m=F&-F,_.lanes|=m,m=BA(_.stateNode,M,m),bA(_,m),!1;case 1:if(g=_.type,I=_.stateNode,(_.flags&128)===0&&(typeof g.getDerivedStateFromError=="function"||I!==null&&typeof I.componentDidCatch=="function"&&(Fd===null||!Fd.has(I))))return _.flags|=65536,F&=-F,_.lanes|=F,F=tz(F),nz(F,m,_,M),bA(_,F),!1}_=_.return}while(_!==null);return!1}var HA=Error(r(461)),Wi=!1;function Va(m,g,_,M){g.child=m===null?s5(g,null,_,M):Cm(g,m.child,_,M)}function rz(m,g,_,M,F){_=_.render;var I=g.ref;if("ref"in M){var te={};for(var Ce in M)Ce!=="ref"&&(te[Ce]=M[Ce])}else te=M;return _m(g),M=SA(m,g,_,te,I,F),Ce=NA(),m!==null&&!Wi?(kA(m,g,F),ru(m,g,F)):(rr&&Ce&&iA(g),g.flags|=1,Va(m,g,M,F),g.child)}function iz(m,g,_,M,F){if(m===null){var I=_.type;return typeof I=="function"&&!tA(I)&&I.defaultProps===void 0&&_.compare===null?(g.tag=15,g.type=I,az(m,g,I,M,F)):(m=uw(_.type,null,M,g,g.mode,F),m.ref=g.ref,m.return=g,g.child=m)}if(I=m.child,!YA(m,F)){var te=I.memoizedProps;if(_=_.compare,_=_!==null?_:Sx,_(te,M)&&m.ref===g.ref)return ru(m,g,F)}return g.flags|=1,m=Qc(I,M),m.ref=g.ref,m.return=g,g.child=m}function az(m,g,_,M,F){if(m!==null){var I=m.memoizedProps;if(Sx(I,M)&&m.ref===g.ref)if(Wi=!1,g.pendingProps=M=I,YA(m,F))(m.flags&131072)!==0&&(Wi=!0);else return g.lanes=m.lanes,ru(m,g,F)}return $A(m,g,_,M,F)}function sz(m,g,_,M){var F=M.children,I=m!==null?m.memoizedState:null;if(m===null&&g.stateNode===null&&(g.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),M.mode==="hidden"){if((g.flags&128)!==0){if(I=I!==null?I.baseLanes|_:_,m!==null){for(M=g.child=m.child,F=0;M!==null;)F=F|M.lanes|M.childLanes,M=M.sibling;M=F&~I}else M=0,g.child=null;return oz(m,g,I,_,M)}if((_&536870912)!==0)g.memoizedState={baseLanes:0,cachePool:null},m!==null&&fw(g,I!==null?I.cachePool:null),I!==null?c5(g,I):yA(),u5(g);else return M=g.lanes=536870912,oz(m,g,I!==null?I.baseLanes|_:_,_,M)}else I!==null?(fw(g,I.cachePool),c5(g,I),Pd(),g.memoizedState=null):(m!==null&&fw(g,null),yA(),Pd());return Va(m,g,F,_),g.child}function Ix(m,g){return m!==null&&m.tag===22||g.stateNode!==null||(g.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),g.sibling}function oz(m,g,_,M,F){var I=mA();return I=I===null?null:{parent:Gi._currentValue,pool:I},g.memoizedState={baseLanes:_,cachePool:I},m!==null&&fw(g,null),yA(),u5(g),m!==null&&_p(m,g,M,!0),g.childLanes=F,null}function Ew(m,g){return g=jw({mode:g.mode,children:g.children},m.mode),g.ref=m.ref,m.child=g,g.return=m,g}function lz(m,g,_){return Cm(g,m.child,null,_),m=Ew(g,g.pendingProps),m.flags|=2,go(g),g.memoizedState=null,m}function Ese(m,g,_){var M=g.pendingProps,F=(g.flags&128)!==0;if(g.flags&=-129,m===null){if(rr){if(M.mode==="hidden")return m=Ew(g,M),g.lanes=536870912,Ix(null,m);if(wA(g),(m=Jr)?(m=vU(m,$o),m=m!==null&&m.data==="&"?m:null,m!==null&&(g.memoizedState={dehydrated:m,treeContext:Sd!==null?{id:ac,overflow:sc}:null,retryLane:536870912,hydrationErrors:null},_=GI(m),_.return=g,g.child=_,Ha=g,Jr=null)):m=null,m===null)throw kd(g);return g.lanes=536870912,null}return Ew(g,M)}var I=m.memoizedState;if(I!==null){var te=I.dehydrated;if(wA(g),F)if(g.flags&256)g.flags&=-257,g=lz(m,g,_);else if(g.memoizedState!==null)g.child=m.child,g.flags|=128,g=null;else throw Error(r(558));else if(Wi||_p(m,g,_,!1),F=(_&m.childLanes)!==0,Wi||F){if(M=Hr,M!==null&&(te=wt(M,_),te!==0&&te!==I.retryLane))throw I.retryLane=te,xm(m,te),qs(M,m,te),HA;Bw(),g=lz(m,g,_)}else m=I.treeContext,Jr=Go(te.nextSibling),Ha=g,rr=!0,Nd=null,$o=!1,m!==null&&KI(g,m),g=Ew(g,M),g.flags|=4096;return g}return m=Qc(m.child,{mode:M.mode,children:M.children}),m.ref=g.ref,g.child=m,m.return=g,m}function Pw(m,g){var _=g.ref;if(_===null)m!==null&&m.ref!==null&&(g.flags|=4194816);else{if(typeof _!="function"&&typeof _!="object")throw Error(r(284));(m===null||m.ref!==_)&&(g.flags|=4194816)}}function $A(m,g,_,M,F){return _m(g),_=SA(m,g,_,M,void 0,F),M=NA(),m!==null&&!Wi?(kA(m,g,F),ru(m,g,F)):(rr&&M&&iA(g),g.flags|=1,Va(m,g,_,F),g.child)}function cz(m,g,_,M,F,I){return _m(g),g.updateQueue=null,_=h5(g,M,_,F),d5(m),M=NA(),m!==null&&!Wi?(kA(m,g,I),ru(m,g,I)):(rr&&M&&iA(g),g.flags|=1,Va(m,g,_,I),g.child)}function uz(m,g,_,M,F){if(_m(g),g.stateNode===null){var I=xp,te=_.contextType;typeof te=="object"&&te!==null&&(I=$a(te)),I=new _(M,I),g.memoizedState=I.state!==null&&I.state!==void 0?I.state:null,I.updater=UA,g.stateNode=I,I._reactInternals=g,I=g.stateNode,I.props=M,I.state=g.memoizedState,I.refs={},pA(g),te=_.contextType,I.context=typeof te=="object"&&te!==null?$a(te):xp,I.state=g.memoizedState,te=_.getDerivedStateFromProps,typeof te=="function"&&(zA(g,_,te,M),I.state=g.memoizedState),typeof _.getDerivedStateFromProps=="function"||typeof I.getSnapshotBeforeUpdate=="function"||typeof I.UNSAFE_componentWillMount!="function"&&typeof I.componentWillMount!="function"||(te=I.state,typeof I.componentWillMount=="function"&&I.componentWillMount(),typeof I.UNSAFE_componentWillMount=="function"&&I.UNSAFE_componentWillMount(),te!==I.state&&UA.enqueueReplaceState(I,I.state,null),Dx(g,M,I,F),jx(),I.state=g.memoizedState),typeof I.componentDidMount=="function"&&(g.flags|=4194308),M=!0}else if(m===null){I=g.stateNode;var Ce=g.memoizedProps,Be=Am(_,Ce);I.props=Be;var ht=I.context,yt=_.contextType;te=xp,typeof yt=="object"&&yt!==null&&(te=$a(yt));var Ct=_.getDerivedStateFromProps;yt=typeof Ct=="function"||typeof I.getSnapshotBeforeUpdate=="function",Ce=g.pendingProps!==Ce,yt||typeof I.UNSAFE_componentWillReceiveProps!="function"&&typeof I.componentWillReceiveProps!="function"||(Ce||ht!==te)&&Y5(g,I,M,te),Md=!1;var mt=g.memoizedState;I.state=mt,Dx(g,M,I,F),jx(),ht=g.memoizedState,Ce||mt!==ht||Md?(typeof Ct=="function"&&(zA(g,_,Ct,M),ht=g.memoizedState),(Be=Md||X5(g,_,Be,M,mt,ht,te))?(yt||typeof I.UNSAFE_componentWillMount!="function"&&typeof I.componentWillMount!="function"||(typeof I.componentWillMount=="function"&&I.componentWillMount(),typeof I.UNSAFE_componentWillMount=="function"&&I.UNSAFE_componentWillMount()),typeof I.componentDidMount=="function"&&(g.flags|=4194308)):(typeof I.componentDidMount=="function"&&(g.flags|=4194308),g.memoizedProps=M,g.memoizedState=ht),I.props=M,I.state=ht,I.context=te,M=Be):(typeof I.componentDidMount=="function"&&(g.flags|=4194308),M=!1)}else{I=g.stateNode,gA(m,g),te=g.memoizedProps,yt=Am(_,te),I.props=yt,Ct=g.pendingProps,mt=I.context,ht=_.contextType,Be=xp,typeof ht=="object"&&ht!==null&&(Be=$a(ht)),Ce=_.getDerivedStateFromProps,(ht=typeof Ce=="function"||typeof I.getSnapshotBeforeUpdate=="function")||typeof I.UNSAFE_componentWillReceiveProps!="function"&&typeof I.componentWillReceiveProps!="function"||(te!==Ct||mt!==Be)&&Y5(g,I,M,Be),Md=!1,mt=g.memoizedState,I.state=mt,Dx(g,M,I,F),jx();var gt=g.memoizedState;te!==Ct||mt!==gt||Md||m!==null&&m.dependencies!==null&&hw(m.dependencies)?(typeof Ce=="function"&&(zA(g,_,Ce,M),gt=g.memoizedState),(yt=Md||X5(g,_,yt,M,mt,gt,Be)||m!==null&&m.dependencies!==null&&hw(m.dependencies))?(ht||typeof I.UNSAFE_componentWillUpdate!="function"&&typeof I.componentWillUpdate!="function"||(typeof I.componentWillUpdate=="function"&&I.componentWillUpdate(M,gt,Be),typeof I.UNSAFE_componentWillUpdate=="function"&&I.UNSAFE_componentWillUpdate(M,gt,Be)),typeof I.componentDidUpdate=="function"&&(g.flags|=4),typeof I.getSnapshotBeforeUpdate=="function"&&(g.flags|=1024)):(typeof I.componentDidUpdate!="function"||te===m.memoizedProps&&mt===m.memoizedState||(g.flags|=4),typeof I.getSnapshotBeforeUpdate!="function"||te===m.memoizedProps&&mt===m.memoizedState||(g.flags|=1024),g.memoizedProps=M,g.memoizedState=gt),I.props=M,I.state=gt,I.context=Be,M=yt):(typeof I.componentDidUpdate!="function"||te===m.memoizedProps&&mt===m.memoizedState||(g.flags|=4),typeof I.getSnapshotBeforeUpdate!="function"||te===m.memoizedProps&&mt===m.memoizedState||(g.flags|=1024),M=!1)}return I=M,Pw(m,g),M=(g.flags&128)!==0,I||M?(I=g.stateNode,_=M&&typeof _.getDerivedStateFromError!="function"?null:I.render(),g.flags|=1,m!==null&&M?(g.child=Cm(g,m.child,null,F),g.child=Cm(g,null,_,F)):Va(m,g,_,F),g.memoizedState=I.state,m=g.child):m=ru(m,g,F),m}function dz(m,g,_,M){return vm(),g.flags|=256,Va(m,g,_,M),g.child}var VA={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function GA(m){return{baseLanes:m,cachePool:e5()}}function qA(m,g,_){return m=m!==null?m.childLanes&~_:0,g&&(m|=xo),m}function hz(m,g,_){var M=g.pendingProps,F=!1,I=(g.flags&128)!==0,te;if((te=I)||(te=m!==null&&m.memoizedState===null?!1:(Oi.current&2)!==0),te&&(F=!0,g.flags&=-129),te=(g.flags&32)!==0,g.flags&=-33,m===null){if(rr){if(F?Ed(g):Pd(),(m=Jr)?(m=vU(m,$o),m=m!==null&&m.data!=="&"?m:null,m!==null&&(g.memoizedState={dehydrated:m,treeContext:Sd!==null?{id:ac,overflow:sc}:null,retryLane:536870912,hydrationErrors:null},_=GI(m),_.return=g,g.child=_,Ha=g,Jr=null)):m=null,m===null)throw kd(g);return AT(m)?g.lanes=32:g.lanes=536870912,null}var Ce=M.children;return M=M.fallback,F?(Pd(),F=g.mode,Ce=jw({mode:"hidden",children:Ce},F),M=ym(M,F,_,null),Ce.return=g,M.return=g,Ce.sibling=M,g.child=Ce,M=g.child,M.memoizedState=GA(_),M.childLanes=qA(m,te,_),g.memoizedState=VA,Ix(null,M)):(Ed(g),WA(g,Ce))}var Be=m.memoizedState;if(Be!==null&&(Ce=Be.dehydrated,Ce!==null)){if(I)g.flags&256?(Ed(g),g.flags&=-257,g=KA(m,g,_)):g.memoizedState!==null?(Pd(),g.child=m.child,g.flags|=128,g=null):(Pd(),Ce=M.fallback,F=g.mode,M=jw({mode:"visible",children:M.children},F),Ce=ym(Ce,F,_,null),Ce.flags|=2,M.return=g,Ce.return=g,M.sibling=Ce,g.child=M,Cm(g,m.child,null,_),M=g.child,M.memoizedState=GA(_),M.childLanes=qA(m,te,_),g.memoizedState=VA,g=Ix(null,M));else if(Ed(g),AT(Ce)){if(te=Ce.nextSibling&&Ce.nextSibling.dataset,te)var ht=te.dgst;te=ht,M=Error(r(419)),M.stack="",M.digest=te,Cx({value:M,source:null,stack:null}),g=KA(m,g,_)}else if(Wi||_p(m,g,_,!1),te=(_&m.childLanes)!==0,Wi||te){if(te=Hr,te!==null&&(M=wt(te,_),M!==0&&M!==Be.retryLane))throw Be.retryLane=M,xm(m,M),qs(te,m,M),HA;MT(Ce)||Bw(),g=KA(m,g,_)}else MT(Ce)?(g.flags|=192,g.child=m.child,g=null):(m=Be.treeContext,Jr=Go(Ce.nextSibling),Ha=g,rr=!0,Nd=null,$o=!1,m!==null&&KI(g,m),g=WA(g,M.children),g.flags|=4096);return g}return F?(Pd(),Ce=M.fallback,F=g.mode,Be=m.child,ht=Be.sibling,M=Qc(Be,{mode:"hidden",children:M.children}),M.subtreeFlags=Be.subtreeFlags&65011712,ht!==null?Ce=Qc(ht,Ce):(Ce=ym(Ce,F,_,null),Ce.flags|=2),Ce.return=g,M.return=g,M.sibling=Ce,g.child=M,Ix(null,M),M=g.child,Ce=m.child.memoizedState,Ce===null?Ce=GA(_):(F=Ce.cachePool,F!==null?(Be=Gi._currentValue,F=F.parent!==Be?{parent:Be,pool:Be}:F):F=e5(),Ce={baseLanes:Ce.baseLanes|_,cachePool:F}),M.memoizedState=Ce,M.childLanes=qA(m,te,_),g.memoizedState=VA,Ix(m.child,M)):(Ed(g),_=m.child,m=_.sibling,_=Qc(_,{mode:"visible",children:M.children}),_.return=g,_.sibling=null,m!==null&&(te=g.deletions,te===null?(g.deletions=[m],g.flags|=16):te.push(m)),g.child=_,g.memoizedState=null,_)}function WA(m,g){return g=jw({mode:"visible",children:g},m.mode),g.return=m,m.child=g}function jw(m,g){return m=fo(22,m,null,g),m.lanes=0,m}function KA(m,g,_){return Cm(g,m.child,null,_),m=WA(g,g.pendingProps.children),m.flags|=2,g.memoizedState=null,m}function mz(m,g,_){m.lanes|=g;var M=m.alternate;M!==null&&(M.lanes|=g),cA(m.return,g,_)}function XA(m,g,_,M,F,I){var te=m.memoizedState;te===null?m.memoizedState={isBackwards:g,rendering:null,renderingStartTime:0,last:M,tail:_,tailMode:F,treeForkCount:I}:(te.isBackwards=g,te.rendering=null,te.renderingStartTime=0,te.last=M,te.tail=_,te.tailMode=F,te.treeForkCount=I)}function fz(m,g,_){var M=g.pendingProps,F=M.revealOrder,I=M.tail;M=M.children;var te=Oi.current,Ce=(te&2)!==0;if(Ce?(te=te&1|2,g.flags|=128):te&=1,ee(Oi,te),Va(m,g,M,_),M=rr?kx:0,!Ce&&m!==null&&(m.flags&128)!==0)e:for(m=g.child;m!==null;){if(m.tag===13)m.memoizedState!==null&&mz(m,_,g);else if(m.tag===19)mz(m,_,g);else if(m.child!==null){m.child.return=m,m=m.child;continue}if(m===g)break e;for(;m.sibling===null;){if(m.return===null||m.return===g)break e;m=m.return}m.sibling.return=m.return,m=m.sibling}switch(F){case"forwards":for(_=g.child,F=null;_!==null;)m=_.alternate,m!==null&&vw(m)===null&&(F=_),_=_.sibling;_=F,_===null?(F=g.child,g.child=null):(F=_.sibling,_.sibling=null),XA(g,!1,F,_,I,M);break;case"backwards":case"unstable_legacy-backwards":for(_=null,F=g.child,g.child=null;F!==null;){if(m=F.alternate,m!==null&&vw(m)===null){g.child=F;break}m=F.sibling,F.sibling=_,_=F,F=m}XA(g,!0,_,null,I,M);break;case"together":XA(g,!1,null,null,void 0,M);break;default:g.memoizedState=null}return g.child}function ru(m,g,_){if(m!==null&&(g.dependencies=m.dependencies),Rd|=g.lanes,(_&g.childLanes)===0)if(m!==null){if(_p(m,g,_,!1),(_&g.childLanes)===0)return null}else return null;if(m!==null&&g.child!==m.child)throw Error(r(153));if(g.child!==null){for(m=g.child,_=Qc(m,m.pendingProps),g.child=_,_.return=g;m.sibling!==null;)m=m.sibling,_=_.sibling=Qc(m,m.pendingProps),_.return=g;_.sibling=null}return g.child}function YA(m,g){return(m.lanes&g)!==0?!0:(m=m.dependencies,!!(m!==null&&hw(m)))}function Pse(m,g,_){switch(g.tag){case 3:De(g,g.stateNode.containerInfo),Cd(g,Gi,m.memoizedState.cache),vm();break;case 27:case 5:le(g);break;case 4:De(g,g.stateNode.containerInfo);break;case 10:Cd(g,g.type,g.memoizedProps.value);break;case 31:if(g.memoizedState!==null)return g.flags|=128,wA(g),null;break;case 13:var M=g.memoizedState;if(M!==null)return M.dehydrated!==null?(Ed(g),g.flags|=128,null):(_&g.child.childLanes)!==0?hz(m,g,_):(Ed(g),m=ru(m,g,_),m!==null?m.sibling:null);Ed(g);break;case 19:var F=(m.flags&128)!==0;if(M=(_&g.childLanes)!==0,M||(_p(m,g,_,!1),M=(_&g.childLanes)!==0),F){if(M)return fz(m,g,_);g.flags|=128}if(F=g.memoizedState,F!==null&&(F.rendering=null,F.tail=null,F.lastEffect=null),ee(Oi,Oi.current),M)break;return null;case 22:return g.lanes=0,sz(m,g,_,g.pendingProps);case 24:Cd(g,Gi,m.memoizedState.cache)}return ru(m,g,_)}function pz(m,g,_){if(m!==null)if(m.memoizedProps!==g.pendingProps)Wi=!0;else{if(!YA(m,_)&&(g.flags&128)===0)return Wi=!1,Pse(m,g,_);Wi=(m.flags&131072)!==0}else Wi=!1,rr&&(g.flags&1048576)!==0&&WI(g,kx,g.index);switch(g.lanes=0,g.tag){case 16:e:{var M=g.pendingProps;if(m=Nm(g.elementType),g.type=m,typeof m=="function")tA(m)?(M=Am(m,M),g.tag=1,g=uz(null,g,m,M,_)):(g.tag=0,g=$A(null,g,m,M,_));else{if(m!=null){var F=m.$$typeof;if(F===A){g.tag=11,g=rz(null,g,m,M,_);break e}else if(F===k){g.tag=14,g=iz(null,g,m,M,_);break e}}throw g=R(m)||m,Error(r(306,g,""))}}return g;case 0:return $A(m,g,g.type,g.pendingProps,_);case 1:return M=g.type,F=Am(M,g.pendingProps),uz(m,g,M,F,_);case 3:e:{if(De(g,g.stateNode.containerInfo),m===null)throw Error(r(387));M=g.pendingProps;var I=g.memoizedState;F=I.element,gA(m,g),Dx(g,M,null,_);var te=g.memoizedState;if(M=te.cache,Cd(g,Gi,M),M!==I.cache&&uA(g,[Gi],_,!0),jx(),M=te.element,I.isDehydrated)if(I={element:M,isDehydrated:!1,cache:te.cache},g.updateQueue.baseState=I,g.memoizedState=I,g.flags&256){g=dz(m,g,M,_);break e}else if(M!==F){F=Uo(Error(r(424)),g),Cx(F),g=dz(m,g,M,_);break e}else for(m=g.stateNode.containerInfo,m.nodeType===9?m=m.body:m=m.nodeName==="HTML"?m.ownerDocument.body:m,Jr=Go(m.firstChild),Ha=g,rr=!0,Nd=null,$o=!0,_=s5(g,null,M,_),g.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling;else{if(vm(),M===F){g=ru(m,g,_);break e}Va(m,g,M,_)}g=g.child}return g;case 26:return Pw(m,g),m===null?(_=CU(g.type,null,g.pendingProps,null))?g.memoizedState=_:rr||(_=g.type,m=g.pendingProps,M=Kw(pe.current).createElement(_),M[Pn]=g,M[cr]=m,Ga(M,_,m),Ge(M),g.stateNode=M):g.memoizedState=CU(g.type,m.memoizedProps,g.pendingProps,m.memoizedState),null;case 27:return le(g),m===null&&rr&&(M=g.stateNode=SU(g.type,g.pendingProps,pe.current),Ha=g,$o=!0,F=Jr,zd(g.type)?(TT=F,Jr=Go(M.firstChild)):Jr=F),Va(m,g,g.pendingProps.children,_),Pw(m,g),m===null&&(g.flags|=4194304),g.child;case 5:return m===null&&rr&&((F=M=Jr)&&(M=ooe(M,g.type,g.pendingProps,$o),M!==null?(g.stateNode=M,Ha=g,Jr=Go(M.firstChild),$o=!1,F=!0):F=!1),F||kd(g)),le(g),F=g.type,I=g.pendingProps,te=m!==null?m.memoizedProps:null,M=I.children,NT(F,I)?M=null:te!==null&&NT(F,te)&&(g.flags|=32),g.memoizedState!==null&&(F=SA(m,g,_se,null,null,_),Jx._currentValue=F),Pw(m,g),Va(m,g,M,_),g.child;case 6:return m===null&&rr&&((m=_=Jr)&&(_=loe(_,g.pendingProps,$o),_!==null?(g.stateNode=_,Ha=g,Jr=null,m=!0):m=!1),m||kd(g)),null;case 13:return hz(m,g,_);case 4:return De(g,g.stateNode.containerInfo),M=g.pendingProps,m===null?g.child=Cm(g,null,M,_):Va(m,g,M,_),g.child;case 11:return rz(m,g,g.type,g.pendingProps,_);case 7:return Va(m,g,g.pendingProps,_),g.child;case 8:return Va(m,g,g.pendingProps.children,_),g.child;case 12:return Va(m,g,g.pendingProps.children,_),g.child;case 10:return M=g.pendingProps,Cd(g,g.type,M.value),Va(m,g,M.children,_),g.child;case 9:return F=g.type._context,M=g.pendingProps.children,_m(g),F=$a(F),M=M(F),g.flags|=1,Va(m,g,M,_),g.child;case 14:return iz(m,g,g.type,g.pendingProps,_);case 15:return az(m,g,g.type,g.pendingProps,_);case 19:return fz(m,g,_);case 31:return Ese(m,g,_);case 22:return sz(m,g,_,g.pendingProps);case 24:return _m(g),M=$a(Gi),m===null?(F=mA(),F===null&&(F=Hr,I=dA(),F.pooledCache=I,I.refCount++,I!==null&&(F.pooledCacheLanes|=_),F=I),g.memoizedState={parent:M,cache:F},pA(g),Cd(g,Gi,F)):((m.lanes&_)!==0&&(gA(m,g),Dx(g,null,null,_),jx()),F=m.memoizedState,I=g.memoizedState,F.parent!==M?(F={parent:M,cache:M},g.memoizedState=F,g.lanes===0&&(g.memoizedState=g.updateQueue.baseState=F),Cd(g,Gi,M)):(M=I.cache,Cd(g,Gi,M),M!==F.cache&&uA(g,[Gi],_,!0))),Va(m,g,g.pendingProps.children,_),g.child;case 29:throw g.pendingProps}throw Error(r(156,g.tag))}function iu(m){m.flags|=4}function QA(m,g,_,M,F){if((g=(m.mode&32)!==0)&&(g=!1),g){if(m.flags|=16777216,(F&335544128)===F)if(m.stateNode.complete)m.flags|=8192;else if(Hz())m.flags|=8192;else throw km=gw,fA}else m.flags&=-16777217}function gz(m,g){if(g.type!=="stylesheet"||(g.state.loading&4)!==0)m.flags&=-16777217;else if(m.flags|=16777216,!PU(g))if(Hz())m.flags|=8192;else throw km=gw,fA}function Dw(m,g){g!==null&&(m.flags|=4),m.flags&16384&&(g=m.tag!==22?At():536870912,m.lanes|=g,Rp|=g)}function zx(m,g){if(!rr)switch(m.tailMode){case"hidden":g=m.tail;for(var _=null;g!==null;)g.alternate!==null&&(_=g),g=g.sibling;_===null?m.tail=null:_.sibling=null;break;case"collapsed":_=m.tail;for(var M=null;_!==null;)_.alternate!==null&&(M=_),_=_.sibling;M===null?g||m.tail===null?m.tail=null:m.tail.sibling=null:M.sibling=null}}function ei(m){var g=m.alternate!==null&&m.alternate.child===m.child,_=0,M=0;if(g)for(var F=m.child;F!==null;)_|=F.lanes|F.childLanes,M|=F.subtreeFlags&65011712,M|=F.flags&65011712,F.return=m,F=F.sibling;else for(F=m.child;F!==null;)_|=F.lanes|F.childLanes,M|=F.subtreeFlags,M|=F.flags,F.return=m,F=F.sibling;return m.subtreeFlags|=M,m.childLanes=_,g}function jse(m,g,_){var M=g.pendingProps;switch(aA(g),g.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return ei(g),null;case 1:return ei(g),null;case 3:return _=g.stateNode,M=null,m!==null&&(M=m.memoizedState.cache),g.memoizedState.cache!==M&&(g.flags|=2048),eu(Gi),ue(),_.pendingContext&&(_.context=_.pendingContext,_.pendingContext=null),(m===null||m.child===null)&&(wp(g)?iu(g):m===null||m.memoizedState.isDehydrated&&(g.flags&256)===0||(g.flags|=1024,oA())),ei(g),null;case 26:var F=g.type,I=g.memoizedState;return m===null?(iu(g),I!==null?(ei(g),gz(g,I)):(ei(g),QA(g,F,null,M,_))):I?I!==m.memoizedState?(iu(g),ei(g),gz(g,I)):(ei(g),g.flags&=-16777217):(m=m.memoizedProps,m!==M&&iu(g),ei(g),QA(g,F,m,M,_)),null;case 27:if(Ne(g),_=pe.current,F=g.type,m!==null&&g.stateNode!=null)m.memoizedProps!==M&&iu(g);else{if(!M){if(g.stateNode===null)throw Error(r(166));return ei(g),null}m=J.current,wp(g)?XI(g):(m=SU(F,M,_),g.stateNode=m,iu(g))}return ei(g),null;case 5:if(Ne(g),F=g.type,m!==null&&g.stateNode!=null)m.memoizedProps!==M&&iu(g);else{if(!M){if(g.stateNode===null)throw Error(r(166));return ei(g),null}if(I=J.current,wp(g))XI(g);else{var te=Kw(pe.current);switch(I){case 1:I=te.createElementNS("http://www.w3.org/2000/svg",F);break;case 2:I=te.createElementNS("http://www.w3.org/1998/Math/MathML",F);break;default:switch(F){case"svg":I=te.createElementNS("http://www.w3.org/2000/svg",F);break;case"math":I=te.createElementNS("http://www.w3.org/1998/Math/MathML",F);break;case"script":I=te.createElement("div"),I.innerHTML=" +