From 3b0ca08baf09d7e29338227ef51608a6c64e769d Mon Sep 17 00:00:00 2001 From: dx616b Date: Thu, 28 May 2026 15:51:41 +0200 Subject: [PATCH 01/58] core: Honor audio provider settings in backend matching Route video-id resolution through the configured audio_providers order and add robust YouTube/YouTube Music fallback matching so UI provider selection is applied consistently at runtime. Co-authored-by: Cursor --- downtify/api.py | 16 +++++ downtify/downloader.py | 97 +++++++++++++++++++++++++- downtify/providers.py | 112 ++++++++++++++++++++++-------- main.py | 1 + tests/test_api_settings.py | 17 +++++ tests/test_downloader_extended.py | 58 ++++++++++++++++ tests/test_providers.py | 54 ++++++++++++++ 7 files changed, 326 insertions(+), 29 deletions(-) diff --git a/downtify/api.py b/downtify/api.py index d42b186..fcc89a1 100644 --- a/downtify/api.py +++ b/downtify/api.py @@ -53,6 +53,18 @@ } +def _effective_audio_providers(settings: dict[str, Any]) -> list[str]: + allowed = {'youtube-music', 'youtube'} + out: list[str] = [] + seen: set[str] = set() + for raw in (settings.get('audio_providers') or []): + p = str(raw or '').strip() + if p in allowed and p not in seen: + seen.add(p) + out.append(p) + return out or ['youtube-music'] + + def _effective_lyrics_providers(settings: dict[str, Any]) -> list[str]: if not settings.get('download_lyrics', True): return [] @@ -568,6 +580,10 @@ async def update_settings_endpoint( if key in DEFAULT_SETTINGS: state.settings[key] = value if state.downloader is not None: + if 'audio_providers' in payload: + state.downloader.audio_providers = _effective_audio_providers( + state.settings + ) fmt = payload.get('format') if isinstance(fmt, str) and fmt: state.downloader.audio_format = fmt diff --git a/downtify/downloader.py b/downtify/downloader.py index 384b543..dbbcced 100644 --- a/downtify/downloader.py +++ b/downtify/downloader.py @@ -111,6 +111,43 @@ def _yt_po_tokens() -> list[str]: return [t.strip() for t in raw.split(',') if t.strip()] +def _fallback_video_id_via_ytdlp(song: dict[str, Any]) -> Optional[str]: + """Best-effort YouTube fallback when YT Music search yields no match.""" + + title = str(song.get('name') or '').strip() + artists = [a for a in (song.get('artists') or []) if isinstance(a, str) and a] + query = ' '.join([*artists[:2], title]).strip() + if not query: + return None + opts = { + 'quiet': True, + 'no_warnings': True, + 'extract_flat': 'in_playlist', + 'skip_download': True, + } + try: + with yt_dlp.YoutubeDL(opts) as ydl: + info = ydl.extract_info(f'ytsearch1:{query}', download=False) + except Exception: + logger.opt(exception=True).debug( + 'yt-dlp fallback search failed for query={!r}', query + ) + return None + entries = info.get('entries') if isinstance(info, dict) else None + if not isinstance(entries, list) or not entries: + return None + first = entries[0] if isinstance(entries[0], dict) else {} + vid = first.get('id') + if isinstance(vid, str) and vid.strip(): + logger.info( + 'yt-dlp fallback picked videoId={} for title={!r}', + vid.strip(), + title, + ) + return vid.strip() + return None + + class Downloader: """Wraps ``yt-dlp`` plus ``mutagen`` tagging.""" @@ -122,6 +159,7 @@ def __init__( output_template: str = '{artists} - {title}', lyrics_providers: Optional[list[str]] = None, organize_by_artist: bool = False, + audio_providers: Optional[list[str]] = None, ): self.download_dir = Path(download_dir) self.download_dir.mkdir(parents=True, exist_ok=True) @@ -130,6 +168,63 @@ def __init__( self.output_template = output_template self.lyrics_providers = list(lyrics_providers or []) self.organize_by_artist = organize_by_artist + self.audio_providers = self._normalize_audio_providers(audio_providers) + + @staticmethod + def _normalize_audio_providers( + providers: Optional[list[str]], + ) -> list[str]: + allowed = {'youtube-music', 'youtube'} + if not providers: + return ['youtube-music'] + out: list[str] = [] + seen: set[str] = set() + for raw in providers: + p = str(raw or '').strip() + if p in allowed and p not in seen: + seen.add(p) + out.append(p) + return out or ['youtube-music'] + + def _resolve_video_id( + self, song: dict[str, Any] + ) -> tuple[Optional[str], Optional[dict[str, Any]], Optional[str]]: + """Resolve ``(video_id, ytm_match, provider_used)`` by configured order.""" + + for provider in self.audio_providers: + if provider == 'youtube-music': + video_id, match = find_match(song) + if video_id: + logger.info( + 'Match resolver: provider={} succeeded title={!r} ' + 'video_id={}', + provider, + song.get('name'), + video_id, + ) + return video_id, match, provider + logger.info( + 'Match resolver: provider={} no match title={!r}', + provider, + song.get('name'), + ) + elif provider == 'youtube': + video_id = _fallback_video_id_via_ytdlp(song) + if video_id: + logger.info( + 'Match resolver: provider={} succeeded title={!r} ' + 'video_id={}', + provider, + song.get('name'), + video_id, + ) + return video_id, None, provider + logger.info( + 'Match resolver: provider={} no match title={!r}', + provider, + song.get('name'), + ) + return None, None, None @staticmethod def _artist_subdir(song: dict[str, Any]) -> str: @@ -213,7 +308,7 @@ def download( match: Optional[dict[str, Any]] = None if not video_id: - video_id, match = find_match(song) + video_id, match, _provider = self._resolve_video_id(song) elif not song.get('album_name') or not song.get('cover_url'): # We already have a target video, but the metadata is incomplete. # Look up the YT Music entry for THIS specific videoId so we diff --git a/downtify/providers.py b/downtify/providers.py index 91f30ab..3d6e780 100644 --- a/downtify/providers.py +++ b/downtify/providers.py @@ -4,6 +4,7 @@ import json import re +import unicodedata from threading import Lock from typing import Any, Optional @@ -88,6 +89,16 @@ def _parse_duration(value: Any) -> int: return 0 +def _ascii_fold_query(text: str) -> str: + """Drop diacritics and collapse whitespace for fallback queries.""" + + if not text: + return '' + folded = unicodedata.normalize('NFKD', text) + plain = ''.join(ch for ch in folded if not unicodedata.combining(ch)) + return re.sub(r'\s+', ' ', plain).strip() + + def _result_to_song(result: dict[str, Any]) -> Optional[dict[str, Any]]: video_id = result.get('videoId') if not video_id: @@ -170,41 +181,86 @@ def find_match( if not query: return None, None duration = song.get('duration') or 0 - try: - results = _ytm().search(query, filter='songs', limit=10) - except Exception: - logger.exception('YouTube Music match search failed') - results = [] - _log_ytm_summary_search( - phase='match_songs', - query=query, - filt='songs', - results_len=len(results), - first_titles=[ - str(r.get('title') or '')[:60] - for r in results[:8] - if isinstance(r, dict) - ], - ) - _log_ytm_response(f'find_match songs q={query[:80]!r}', results) - if not results: + title_only = title.strip() + + def _search( + phase: str, q: str, filt: Optional[str] + ) -> list[dict[str, Any]]: try: - results = _ytm().search(query, filter='videos', limit=10) + if filt: + rows = _ytm().search(q, filter=filt, limit=10) + else: + rows = _ytm().search(q, limit=10) except Exception: - results = [] + logger.opt(exception=True).debug( + 'YouTube Music match search failed phase={} filter={!r}', + phase, + filt, + ) + rows = [] _log_ytm_summary_search( - phase='match_videos_fallback', - query=query, - filt='videos', - results_len=len(results), + phase=phase, + query=q, + filt=filt, + results_len=len(rows), first_titles=[ str(r.get('title') or '')[:60] - for r in results[:8] + for r in rows[:8] if isinstance(r, dict) ], ) - _log_ytm_response(f'find_match videos q={query[:80]!r}', results) - best = _pick_best(results, duration, title, artists) + _log_ytm_response(f'find_match {phase} q={q[:80]!r}', rows) + return rows + + candidates: list[dict[str, Any]] = [] + # Start strict (artist + title) then progressively relax. + attempts = [ + ('match_songs', query, 'songs'), + ('match_videos_fallback', query, 'videos'), + ('match_all_unfiltered', query, None), + ] + if title_only and title_only.casefold() != query.casefold(): + attempts.extend( + [ + ('match_songs_title_only', title_only, 'songs'), + ('match_videos_title_only', title_only, 'videos'), + ('match_all_title_only', title_only, None), + ] + ) + folded_query = _ascii_fold_query(query) + folded_title = _ascii_fold_query(title_only) + if folded_query and folded_query.casefold() != query.casefold(): + attempts.extend( + [ + ('match_songs_ascii_fold', folded_query, 'songs'), + ('match_videos_ascii_fold', folded_query, 'videos'), + ('match_all_ascii_fold', folded_query, None), + ] + ) + if ( + folded_title + and title_only + and folded_title.casefold() != title_only.casefold() + ): + attempts.extend( + [ + ('match_songs_title_ascii_fold', folded_title, 'songs'), + ('match_videos_title_ascii_fold', folded_title, 'videos'), + ('match_all_title_ascii_fold', folded_title, None), + ] + ) + seen_attempts: set[tuple[str, str]] = set() + for phase, q, filt in attempts: + key = (q.casefold(), filt or '') + if key in seen_attempts: + continue + seen_attempts.add(key) + rows = _search(phase, q, filt) + for row in rows: + if isinstance(row, dict) and row.get('videoId'): + candidates.append(row) + + best = _pick_best(candidates, duration, title, artists) if best is not None: logger.info( 'YouTube Music find_match picked videoId={} title={!r} year={!r}', @@ -214,7 +270,7 @@ def find_match( ) _log_ytm_response('find_match chosen row', best) return best.get('videoId'), best - for result in results: + for result in candidates: if result.get('videoId'): logger.info( 'YouTube Music find_match fallback first videoId={} title={!r}', diff --git a/main.py b/main.py index dcaac46..38daf28 100644 --- a/main.py +++ b/main.py @@ -211,6 +211,7 @@ def build_app() -> FastAPI: output_template=api.state.settings['output'].replace( '.{output-ext}', '' ), + audio_providers=api._effective_audio_providers(api.state.settings), lyrics_providers=api._effective_lyrics_providers(api.state.settings), organize_by_artist=bool( api.state.settings.get('organize_by_artist', False) diff --git a/tests/test_api_settings.py b/tests/test_api_settings.py index ad19d8c..25455ac 100644 --- a/tests/test_api_settings.py +++ b/tests/test_api_settings.py @@ -7,6 +7,7 @@ from downtify.api import ( DEFAULT_SETTINGS, + _effective_audio_providers, _effective_lyrics_providers, _load_settings, ) @@ -42,6 +43,22 @@ def test_default_format_is_mp3(): assert DEFAULT_SETTINGS['format'] == 'mp3' +def test_effective_audio_providers_keeps_allowed_order(): + settings = {'audio_providers': ['youtube', 'youtube-music']} + assert _effective_audio_providers(settings) == ['youtube', 'youtube-music'] + + +def test_effective_audio_providers_filters_invalid_and_dedupes(): + settings = { + 'audio_providers': ['youtube', 'invalid', 'youtube', 'youtube-music'] + } + assert _effective_audio_providers(settings) == ['youtube', 'youtube-music'] + + +def test_effective_audio_providers_defaults_when_missing(): + assert _effective_audio_providers({}) == ['youtube-music'] + + # ── _load_settings ──────────────────────────────────────────────────────────── diff --git a/tests/test_downloader_extended.py b/tests/test_downloader_extended.py index bab4b4b..8066b7f 100644 --- a/tests/test_downloader_extended.py +++ b/tests/test_downloader_extended.py @@ -5,6 +5,7 @@ from pathlib import Path +from downtify import downloader as downloader_mod from downtify.downloader import Downloader @@ -157,3 +158,60 @@ def test_organize_by_artist_default_is_false(tmp_path): def test_organize_by_artist_can_be_set_true(tmp_path): d = Downloader(tmp_path, organize_by_artist=True) assert d.organize_by_artist is True + + +def test_fallback_video_id_via_ytdlp_returns_first_entry(monkeypatch): + class FakeYDL: + def __init__(self, _opts): + pass + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc, tb): + return False + + def extract_info(self, _query, download=False): + assert download is False + return {'entries': [{'id': 'abc123def45'}]} + + monkeypatch.setattr(downloader_mod.yt_dlp, 'YoutubeDL', FakeYDL) + vid = downloader_mod._fallback_video_id_via_ytdlp( + {'name': 'Track', 'artists': ['Artist']} + ) + assert vid == 'abc123def45' + + +def test_resolve_video_id_prefers_provider_order_youtube_first(monkeypatch): + d = Downloader('/tmp', audio_providers=['youtube', 'youtube-music']) + + monkeypatch.setattr( + downloader_mod, + '_fallback_video_id_via_ytdlp', + lambda _song: 'yt123', + ) + + def should_not_run(_song): + raise AssertionError('find_match should not run when youtube succeeds') + + monkeypatch.setattr(downloader_mod, 'find_match', should_not_run) + vid, match, provider = d._resolve_video_id({'name': 'Track', 'artists': []}) + assert vid == 'yt123' + assert match is None + assert provider == 'youtube' + + +def test_resolve_video_id_uses_second_provider_on_first_failure(monkeypatch): + d = Downloader('/tmp', audio_providers=['youtube', 'youtube-music']) + monkeypatch.setattr( + downloader_mod, '_fallback_video_id_via_ytdlp', lambda _song: None + ) + monkeypatch.setattr( + downloader_mod, + 'find_match', + lambda _song: ('ytm456', {'videoId': 'ytm456'}), + ) + vid, match, provider = d._resolve_video_id({'name': 'Track', 'artists': []}) + assert vid == 'ytm456' + assert isinstance(match, dict) + assert provider == 'youtube-music' diff --git a/tests/test_providers.py b/tests/test_providers.py index 807987b..cf18677 100644 --- a/tests/test_providers.py +++ b/tests/test_providers.py @@ -125,3 +125,57 @@ def fake_cached(_browse_id: str): ) assert out['track_number'] == 7 assert out['album_track_total'] == 11 + + +def test_find_match_falls_back_when_song_rows_have_no_video_id(monkeypatch): + class FakeYTM: + def search(self, query, filt, limit=10): + if filt == 'songs': + return [{'title': 'Song but no id'}] + if filt == 'videos': + return [{'title': 'Real Video', 'videoId': 'abc123def45'}] + return [] + + monkeypatch.setattr(providers, '_client', FakeYTM()) + video_id, match = providers.find_match( + {'name': 'Track', 'artists': ['Artist'], 'duration': 180} + ) + assert video_id == 'abc123def45' + assert isinstance(match, dict) + assert match['videoId'] == 'abc123def45' + + +def test_find_match_retries_title_only_query(monkeypatch): + class FakeYTM: + def search(self, query, filt, limit=10): + if query == 'Artist Missing Song' and filt in {'songs', 'videos'}: + return [] + if query == 'Missing Song' and filt == 'videos': + return [{'title': 'Missing Song', 'videoId': 'xyz987uvw65'}] + return [] + + monkeypatch.setattr(providers, '_client', FakeYTM()) + video_id, match = providers.find_match( + {'name': 'Missing Song', 'artists': ['Artist'], 'duration': 200} + ) + assert video_id == 'xyz987uvw65' + assert isinstance(match, dict) + assert match['videoId'] == 'xyz987uvw65' + + +def test_find_match_uses_unfiltered_search_fallback(monkeypatch): + class FakeYTM: + def search(self, query, filter=None, limit=10): + if filter in {'songs', 'videos'}: + return [] + if filter is None and query == 'Artist Track': + return [{'title': 'Track', 'videoId': 'qwe987rty65'}] + return [] + + monkeypatch.setattr(providers, '_client', FakeYTM()) + video_id, match = providers.find_match( + {'name': 'Track', 'artists': ['Artist'], 'duration': 180} + ) + assert video_id == 'qwe987rty65' + assert isinstance(match, dict) + assert match['videoId'] == 'qwe987rty65' From b87e247d58f323ed14f77cbf4f4d4dbe55cf50c7 Mon Sep 17 00:00:00 2001 From: dx616b Date: Thu, 28 May 2026 19:56:58 +0200 Subject: [PATCH 02/58] Release 2.7.7: slskd, library paths, and Navidrome playlist sync Add slskd provider with leave-in-place, track dedupe, and timeouts; fix library/M3U path resolution for /slskd mounts; sync Navidrome playlists in place after incremental scan; improve matching and YouTube fallback. Co-authored-by: Cursor --- Dockerfile | 4 +- docker-compose.yml | 6 +- downtify/__init__.py | 2 +- downtify/api.py | 415 ++++++++- downtify/downloader.py | 227 ++++- downtify/library_catalog.py | 134 +++ downtify/library_metadata.py | 92 ++ downtify/library_paths.py | 140 +++ downtify/m3u.py | 28 +- downtify/monitor.py | 174 +++- downtify/navidrome.py | 534 +++++++++++ downtify/providers.py | 35 + downtify/slskd_provider.py | 1057 ++++++++++++++++++++++ downtify/spotify.py | 95 +- downtify/track_index.py | 195 ++++ frontend/dist/assets/index-BBbJCvCI.css | 1 + frontend/dist/assets/index-Cu3GXk8h.js | 30 - frontend/dist/assets/index-Dr4wjmEm.css | 1 - frontend/dist/assets/index-DuDubY_q.js | 33 + frontend/dist/index.html | 4 +- frontend/package-lock.json | 542 ++++++++++- frontend/package.json | 2 +- frontend/src/components/DownloadList.vue | 4 +- frontend/src/components/Settings.vue | 363 +++++++- frontend/src/i18n/locales/en.js | 50 +- frontend/src/i18n/locales/es.js | 50 +- frontend/src/i18n/locales/pt-BR.js | 50 +- frontend/src/model/api.js | 2 +- frontend/src/model/player.js | 44 +- frontend/src/model/settings.js | 95 +- frontend/src/views/Downloads.vue | 51 +- frontend/src/views/Player.vue | 29 +- main.py | 77 +- pyproject.toml | 2 +- tests/test_api_settings.py | 91 +- tests/test_api_skip_existing.py | 135 +++ tests/test_downloader_extended.py | 82 +- tests/test_library_catalog.py | 82 ++ tests/test_library_metadata.py | 42 + tests/test_library_paths.py | 52 ++ tests/test_m3u.py | 75 +- tests/test_navidrome.py | 222 +++++ tests/test_slskd_leave_in_place.py | 40 + tests/test_slskd_responses.py | 253 ++++++ tests/test_slskd_timeout.py | 72 ++ tests/test_spotify_embed.py | 60 ++ tests/test_text_search_stub.py | 15 + tests/test_track_index.py | 75 ++ 48 files changed, 5561 insertions(+), 303 deletions(-) create mode 100644 downtify/library_catalog.py create mode 100644 downtify/library_metadata.py create mode 100644 downtify/library_paths.py create mode 100644 downtify/navidrome.py create mode 100644 downtify/slskd_provider.py create mode 100644 downtify/track_index.py create mode 100644 frontend/dist/assets/index-BBbJCvCI.css delete mode 100644 frontend/dist/assets/index-Cu3GXk8h.js delete mode 100644 frontend/dist/assets/index-Dr4wjmEm.css create mode 100644 frontend/dist/assets/index-DuDubY_q.js create mode 100644 tests/test_api_skip_existing.py create mode 100644 tests/test_library_catalog.py create mode 100644 tests/test_library_metadata.py create mode 100644 tests/test_library_paths.py create mode 100644 tests/test_navidrome.py create mode 100644 tests/test_slskd_leave_in_place.py create mode 100644 tests/test_slskd_responses.py create mode 100644 tests/test_slskd_timeout.py create mode 100644 tests/test_text_search_stub.py create mode 100644 tests/test_track_index.py diff --git a/Dockerfile b/Dockerfile index 3f21f4c..3be55fd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,12 +10,12 @@ RUN pip install --upgrade pip && \ FROM python:3.13-alpine LABEL maintainer="Henrique Sebastião " -LABEL version="2.7.0" +LABEL version="2.7.7" LABEL description="Self-hosted Spotify downloader" LABEL org.opencontainers.image.title="Downtify" \ org.opencontainers.image.description="Download your Spotify playlists and songs along with album art and metadata in a self-hosted way via Docker." \ - org.opencontainers.image.version="2.7.0" \ + org.opencontainers.image.version="2.7.7" \ org.opencontainers.image.authors="Henrique Sebastião " \ org.opencontainers.image.url="https://github.com/henriquesebastiao/downtify" \ org.opencontainers.image.source="https://github.com/henriquesebastiao/downtify" \ diff --git a/docker-compose.yml b/docker-compose.yml index 0ca2ccb..97b104e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,11 +7,11 @@ services: ports: - '8000:30321' volumes: + # Music library. If slskd is another container, mount the SAME host folder + # there (e.g. ./docker/downloads:/downloads) and set Settings → slskd path + # to /downloads (path inside this container, not the host path). - ./docker/downloads:/downloads - ./docker/data:/data - ./frontend/dist:/downtify/frontend/dist:ro environment: - DOWNTIFY_PORT=30321 - dns: - - 1.1.1.1 - - 1.0.0.1 diff --git a/downtify/__init__.py b/downtify/__init__.py index 766ce2d..cfadc52 100644 --- a/downtify/__init__.py +++ b/downtify/__init__.py @@ -1 +1 @@ -__version__ = '2.7.0' +__version__ = '2.7.7' diff --git a/downtify/api.py b/downtify/api.py index fcc89a1..7b618e7 100644 --- a/downtify/api.py +++ b/downtify/api.py @@ -37,32 +37,185 @@ from loguru import logger from . import m3u, providers, spotify -from .downloader import Downloader +from .downloader import Downloader, NoAudioMatchError from .monitor import PlaylistMonitorDB, check_playlist +from .navidrome import _effective_navidrome_settings, sync_playlist_to_navidrome +from .library_metadata import read_audio_metadata +from .library_paths import locate_library_file, slskd_dir_from_downloader +from .track_index import TrackIndex, resolve_existing_download DEFAULT_SETTINGS: dict[str, Any] = { 'audio_providers': ['youtube-music'], + 'slskd': { + 'enabled': False, + 'base_url': '', + 'api_key': '', + 'download_dir': '/downloads', + 'source_dir': '/slskd', + 'leave_in_place': True, + 'timeout_seconds': 20, + 'search_retries': 5, + 'search_poll_seconds': 15, + 'download_attempts': 3, + 'poll_interval_seconds': 5, + 'poll_max_attempts': 60, + 'download_timeout_seconds': 600, + 'queued_timeout_seconds': 180, + 'extensions': ['mp3', 'flac'], + 'min_bitrate': 256, + }, 'lyrics_providers': ['lrclib'], 'download_lyrics': True, 'format': 'mp3', 'bitrate': '320', 'output': '{artists} - {title}.{output-ext}', 'generate_m3u': True, + 'sync_navidrome': True, + 'navidrome': { + 'enabled': False, + 'url': '', + 'username': '', + 'password': '', + 'admin_username': '', + 'admin_password': '', + 'public_playlist': False, + 'scan_after_download': True, + 'scan_full': False, + 'scan_wait_seconds': 120, + 'scan_poll_seconds': 5, + 'scan_retry_seconds': 15, + 'client_name': 'Downtify', + 'api_version': '1.16.1', + }, 'max_parallel_downloads': 3, 'organize_by_artist': False, } def _effective_audio_providers(settings: dict[str, Any]) -> list[str]: - allowed = {'youtube-music', 'youtube'} + allowed = {'youtube-music', 'youtube', 'slskd'} + slskd_cfg = _effective_slskd_settings(settings) out: list[str] = [] seen: set[str] = set() for raw in (settings.get('audio_providers') or []): p = str(raw or '').strip() + if p == 'slskd' and not bool(slskd_cfg.get('enabled')): + continue if p in allowed and p not in seen: seen.add(p) out.append(p) - return out or ['youtube-music'] + if not out: + return ['youtube-music'] + # UI historically stored a single provider; keep playlist downloads useful + # by falling back to YouTube when slskd is selected without a backup. + if 'slskd' in out and not any(p in out for p in ('youtube', 'youtube-music')): + for fallback in ('youtube-music', 'youtube'): + if fallback not in seen: + seen.add(fallback) + out.append(fallback) + return out + + +def _effective_slskd_settings(settings: dict[str, Any]) -> dict[str, Any]: + raw = settings.get('slskd') + if not isinstance(raw, dict): + raw = {} + base_url = str(raw.get('base_url') or '').strip().rstrip('/') + download_dir = str(raw.get('download_dir') or '/downloads').strip() + leave_in_place = raw.get('leave_in_place') + if leave_in_place is None: + leave_in_place_default = True + else: + leave_in_place_default = bool(leave_in_place) + source_dir = str(raw.get('source_dir') or '').strip() + if not source_dir: + source_dir = '/slskd' if leave_in_place_default else download_dir + api_key = str(raw.get('api_key') or '').strip() + try: + timeout_seconds = int(raw.get('timeout_seconds') or 20) + except (TypeError, ValueError): + timeout_seconds = 20 + timeout_seconds = min(120, max(5, timeout_seconds)) + try: + search_retries = int(raw.get('search_retries') or 5) + except (TypeError, ValueError): + search_retries = 5 + search_retries = min(20, max(1, search_retries)) + try: + search_poll_seconds = int(raw.get('search_poll_seconds') or 15) + except (TypeError, ValueError): + search_poll_seconds = 15 + search_poll_seconds = min(60, max(3, search_poll_seconds)) + try: + download_attempts = int(raw.get('download_attempts') or 3) + except (TypeError, ValueError): + download_attempts = 3 + download_attempts = min(10, max(1, download_attempts)) + try: + poll_interval_seconds = int(raw.get('poll_interval_seconds') or 5) + except (TypeError, ValueError): + poll_interval_seconds = 5 + poll_interval_seconds = min(30, max(1, poll_interval_seconds)) + try: + poll_max_attempts = int(raw.get('poll_max_attempts') or 60) + except (TypeError, ValueError): + poll_max_attempts = 60 + poll_max_attempts = min(300, max(1, poll_max_attempts)) + try: + download_timeout_seconds = int( + raw.get('download_timeout_seconds') or 600 + ) + except (TypeError, ValueError): + download_timeout_seconds = 600 + download_timeout_seconds = min(3600, max(30, download_timeout_seconds)) + try: + queued_timeout_seconds = int(raw.get('queued_timeout_seconds') or 180) + except (TypeError, ValueError): + queued_timeout_seconds = 180 + queued_timeout_seconds = min(3600, max(15, queued_timeout_seconds)) + try: + min_bitrate = int(raw.get('min_bitrate') or 256) + except (TypeError, ValueError): + min_bitrate = 256 + raw_ext = raw.get('extensions') + if isinstance(raw_ext, list): + extensions = [ + str(e).strip().lower().lstrip('.') + for e in raw_ext + if str(e).strip() + ] + elif isinstance(raw_ext, str) and raw_ext.strip(): + extensions = [ + e.strip().lower().lstrip('.') + for e in raw_ext.split(',') + if e.strip() + ] + else: + extensions = ['mp3', 'flac'] + if not extensions: + extensions = ['mp3', 'flac'] + if leave_in_place is None: + leave_in_place = True + else: + leave_in_place = bool(leave_in_place) + return { + 'enabled': bool(raw.get('enabled', False)), + 'base_url': base_url, + 'api_key': api_key, + 'download_dir': download_dir, + 'source_dir': source_dir, + 'leave_in_place': leave_in_place, + 'timeout_seconds': timeout_seconds, + 'search_retries': search_retries, + 'search_poll_seconds': search_poll_seconds, + 'download_attempts': download_attempts, + 'poll_interval_seconds': poll_interval_seconds, + 'poll_max_attempts': poll_max_attempts, + 'download_timeout_seconds': download_timeout_seconds, + 'queued_timeout_seconds': queued_timeout_seconds, + 'extensions': extensions, + 'min_bitrate': min_bitrate, + } def _effective_lyrics_providers(settings: dict[str, Any]) -> list[str]: @@ -116,6 +269,7 @@ class AppState: settings_path: Optional[Path] = None loop: Optional[asyncio.AbstractEventLoop] = None monitor_db: Optional[PlaylistMonitorDB] = None + track_index: Optional[TrackIndex] = None download_jobs: dict[str, dict[str, Any]] = {} download_semaphore: Optional[asyncio.Semaphore] = None @@ -132,7 +286,14 @@ def _load_settings(path: Path) -> dict[str, Any]: merged = dict(DEFAULT_SETTINGS) for k, v in saved.items(): if k in DEFAULT_SETTINGS: - merged[k] = v + if ( + k in ('slskd', 'navidrome') + and isinstance(v, dict) + and isinstance(DEFAULT_SETTINGS.get(k), dict) + ): + merged[k] = {**DEFAULT_SETTINGS[k], **v} + else: + merged[k] = v return merged except Exception: pass @@ -158,7 +319,25 @@ def check_update() -> Optional[dict[str, Any]]: @router.get('/api/songs/search') def search_endpoint(query: str = Query('')) -> list[dict[str, Any]]: - return providers.search_songs(query, limit=20) + results = providers.search_songs(query, limit=20) + if results: + return results + q = query.strip() + if not q: + return [] + slskd_cfg = _effective_slskd_settings(state.settings) + providers_list = _effective_audio_providers(state.settings) + if 'slskd' in providers_list and slskd_cfg.get('enabled'): + stub = providers.song_stub_from_text_query(q) + if stub: + logger.info( + 'Search fallback for slskd: q={!r} title={!r} artists={}', + q, + stub.get('name'), + stub.get('artists'), + ) + return [stub] + return [] @router.get('/api/song/url') @@ -229,6 +408,16 @@ def _merge_client_track_hints( base['year'] = yr.strip() +def _song_from_download_request( + url: str, client_hints: Optional[dict[str, Any]] +) -> dict[str, Any]: + if isinstance(client_hints, dict) and client_hints.get('source') == 'text_search': + return dict(client_hints) + song = _song_for_download(url) + _merge_client_track_hints(song, client_hints) + return song + + def _song_for_download(url: str) -> dict[str, Any]: parsed = spotify.parse_spotify_url(url) if parsed is not None: @@ -270,6 +459,12 @@ async def _run_download( raise RuntimeError('Downloader not ready') loop = state.loop or asyncio.get_running_loop() + logger.info( + 'download start: title={!r} artists={} providers={}', + song.get('name'), + song.get('artists'), + getattr(state.downloader, 'audio_providers', None), + ) job = state.download_jobs.get(song_id) if job is None: song_id = _register_job(song, status='downloading') @@ -284,6 +479,36 @@ async def _run_download( 'status': 'downloading', }) + def _lookup_existing() -> Optional[tuple[str, str]]: + return resolve_existing_download( + state.downloader, + song, + subdir=subdir, + track_index=state.track_index, + ) + + existing_hit = await loop.run_in_executor(None, _lookup_existing) + if existing_hit: + existing, skip_message = existing_hit + logger.info( + 'download skip: {} title={!r} path={}', + skip_message.lower(), + song.get('name'), + existing, + ) + job['status'] = 'done' + job['filename'] = existing + job['progress'] = 100 + job['message'] = skip_message + await state.connections.broadcast({ + 'song': song, + 'progress': 100, + 'message': skip_message, + 'status': 'done', + 'filename': existing, + }) + return existing + def progress(pct: float, message: str) -> None: j = state.download_jobs.get(song_id) if j: @@ -308,6 +533,21 @@ def progress(pct: float, message: str) -> None: song, progress, subdir=subdir ), ) + except NoAudioMatchError as exc: + logger.warning( + 'No audio source for {!r} ({})', + song.get('name'), + song_id, + ) + job['status'] = 'error' + job['message'] = str(exc) + await state.connections.broadcast({ + 'song': song, + 'progress': 0, + 'message': str(exc), + 'status': 'error', + }) + return None except Exception as exc: logger.exception('Download failed for {}', song_id) job['status'] = 'error' @@ -323,6 +563,11 @@ def progress(pct: float, message: str) -> None: job['status'] = 'done' job['filename'] = filename job['progress'] = 100 + if state.track_index is not None and filename: + await loop.run_in_executor( + None, + lambda: state.track_index.register_song(song, filename), + ) await state.connections.broadcast({ 'song': song, 'progress': 100, @@ -342,20 +587,13 @@ async def download_endpoint( if state.downloader is None: raise HTTPException(status_code=500, detail='Downloader not ready') - song = _song_for_download(url) - tn_before = song.get('track_number') - yr_before = song.get('year') or song.get('release_date') - _merge_client_track_hints(song, client_hints) - logger.debug( - 'download/url: url={} body={} tn_before={!r} tn_after={!r} ' - 'date_before={!r} date_after_year={!r} date_after_rd={!r}', - url[:140], - 'json' if isinstance(client_hints, dict) else 'none', - tn_before, - song.get('track_number'), - yr_before, - song.get('year'), - song.get('release_date'), + song = _song_from_download_request(url, client_hints) + logger.info( + 'download/url: title={!r} artists={} source={} url={}', + song.get('name'), + song.get('artists'), + song.get('source'), + str(song.get('url') or url)[:140], ) song_id = _register_job(song, status='downloading') @@ -363,9 +601,64 @@ async def download_endpoint( filename = await _run_download(song, song_id) except Exception as exc: raise HTTPException(status_code=500, detail=str(exc)) from exc + if filename is None: + raise HTTPException( + status_code=404, + detail='Could not find an audio match', + ) return filename +def _songs_for_navidrome_sync( + results: list[dict[str, Any]], +) -> list[dict[str, Any]]: + out: list[dict[str, Any]] = [] + downloader = state.downloader + download_dir = ( + Path(downloader.download_dir) if downloader is not None else None + ) + slskd_dir = ( + slskd_dir_from_downloader(downloader) if downloader is not None else None + ) + for r in results: + if not r or not r.get('filename'): + continue + song = dict(r.get('song') or {}) + song['filename'] = r['filename'] + if download_dir is not None: + path = locate_library_file(r['filename'], download_dir, slskd_dir) + if path is not None: + meta = read_audio_metadata(path) + if meta.get('title'): + song['name'] = meta['title'] + if meta.get('artists'): + song['artists'] = meta['artists'] + out.append(song) + return out + + +async def _sync_playlist_navidrome( + playlist_name: str, + results: list[dict[str, Any]], +) -> None: + if not _effective_navidrome_settings(state.settings).get('enabled'): + return + if state.settings.get('sync_navidrome', True) is False: + return + songs = _songs_for_navidrome_sync(results) + if not songs: + return + try: + await asyncio.to_thread( + sync_playlist_to_navidrome, + playlist_name, + songs, + state.settings, + ) + except Exception: + logger.exception('Navidrome sync failed for playlist {}', playlist_name) + + async def _process_batch( songs: list[dict[str, Any]], job_ids: list[str], @@ -403,7 +696,7 @@ async def _bounded(song: dict[str, Any], song_id: str) -> dict[str, Any]: return_exceptions=False, ) - if not (generate_m3u and playlist_subdir and playlist_name): + if not playlist_name: return entries: list[dict[str, Any]] = [] @@ -417,23 +710,23 @@ async def _bounded(song: dict[str, Any], song_id: str) -> dict[str, Any]: 'artist': ', '.join(s.get('artists') or []), 'duration': s.get('duration') or 0, }) - if not entries: - return - # When organize_by_artist is on, songs land in per-artist folders instead - # of the playlist subfolder, so the M3U must go to the legacy Playlists/ - # directory (playlist_subdir=None) where relative paths still resolve. - organize = bool(state.downloader and state.downloader.organize_by_artist) - try: - await asyncio.to_thread( - m3u.write_m3u, - state.downloader.download_dir, - playlist_name, - entries, - playlist_subdir=None if organize else playlist_subdir, - ) - except Exception: - logger.exception('Failed to write M3U for {}', playlist_url) + if generate_m3u and playlist_subdir and entries: + organize = bool(state.downloader and state.downloader.organize_by_artist) + try: + await asyncio.to_thread( + m3u.write_m3u, + state.downloader.download_dir, + playlist_name, + entries, + playlist_subdir=None if organize else playlist_subdir, + slskd_dir=slskd_dir_from_downloader(state.downloader), + ) + except Exception: + logger.exception('Failed to write M3U for {}', playlist_url) + + if entries: + await _sync_playlist_navidrome(playlist_name, results) @router.post('/api/download/batch') @@ -554,6 +847,7 @@ async def write_playlist_m3u_endpoint(request: Request) -> dict[str, Any]: playlist_name, entries, playlist_subdir=None if organize else playlist_subdir, + slskd_dir=slskd_dir_from_downloader(state.downloader), ) if target is None: raise HTTPException( @@ -579,11 +873,57 @@ async def update_settings_endpoint( for key, value in payload.items(): if key in DEFAULT_SETTINGS: state.settings[key] = value + if 'slskd' in payload: + state.settings['slskd'] = _effective_slskd_settings(state.settings) + slskd_cfg = state.settings['slskd'] + if slskd_cfg.get('enabled'): + if not str(slskd_cfg.get('base_url') or '').strip(): + raise HTTPException( + status_code=400, + detail='slskd base URL is required when enabled', + ) + if not str(slskd_cfg.get('api_key') or '').strip(): + raise HTTPException( + status_code=400, + detail='slskd API key is required when enabled', + ) + if 'navidrome' in payload: + state.settings['navidrome'] = _effective_navidrome_settings( + state.settings + ) + nav_cfg = state.settings['navidrome'] + if nav_cfg.get('enabled'): + if not str(nav_cfg.get('url') or '').strip(): + raise HTTPException( + status_code=400, + detail='Navidrome URL is required when enabled', + ) + if not str(nav_cfg.get('username') or '').strip(): + raise HTTPException( + status_code=400, + detail='Navidrome username is required when enabled', + ) + if not str(nav_cfg.get('password') or ''): + raise HTTPException( + status_code=400, + detail='Navidrome password is required when enabled', + ) + if 'audio_providers' in payload or 'slskd' in payload: + state.settings['audio_providers'] = _effective_audio_providers( + state.settings + ) if state.downloader is not None: if 'audio_providers' in payload: state.downloader.audio_providers = _effective_audio_providers( state.settings ) + if 'slskd' in payload: + state.downloader.slskd_settings = _effective_slskd_settings( + state.settings + ) + state.downloader.audio_providers = _effective_audio_providers( + state.settings + ) fmt = payload.get('format') if isinstance(fmt, str) and fmt: state.downloader.audio_format = fmt @@ -699,6 +1039,7 @@ async def _initial_check(pl=playlist) -> None: state.connections.broadcast, loop, state.settings, + track_index=state.track_index, ) except Exception: logger.exception('Initial check failed for playlist {}', pl.id) @@ -766,6 +1107,8 @@ async def _run() -> None: state.downloader, # type: ignore[arg-type] state.connections.broadcast, loop, + state.settings, + track_index=state.track_index, ) logger.info( 'Manual check: downloaded {} new track(s) from "{}"', diff --git a/downtify/downloader.py b/downtify/downloader.py index dbbcced..798c2ff 100644 --- a/downtify/downloader.py +++ b/downtify/downloader.py @@ -5,6 +5,7 @@ import os import re import re as _re +import shutil from pathlib import Path from typing import Any, Callable, Optional @@ -30,14 +31,21 @@ from mutagen.oggvorbis import OggVorbis from . import lyrics as lyrics_mod +from . import spotify as spotify_mod from .m3u import sanitize_playlist_name from .providers import enrich_from_match, find_match, find_match_for_video +from .library_paths import library_stored_path, slskd_dir_from_downloader +from .slskd_provider import download_from_slskd _INVALID_FS_CHARS = re.compile(r'[\\/:*?"<>|\x00-\x1f]') ProgressCallback = Callable[[float, str], None] +class NoAudioMatchError(RuntimeError): + """No configured provider could source audio for the requested track.""" + + def _sanitize(text: str) -> str: safe = _INVALID_FS_CHARS.sub('', text or '').strip().strip('.') return safe or 'unknown' @@ -160,6 +168,7 @@ def __init__( lyrics_providers: Optional[list[str]] = None, organize_by_artist: bool = False, audio_providers: Optional[list[str]] = None, + slskd_settings: Optional[dict[str, Any]] = None, ): self.download_dir = Path(download_dir) self.download_dir.mkdir(parents=True, exist_ok=True) @@ -169,12 +178,15 @@ def __init__( self.lyrics_providers = list(lyrics_providers or []) self.organize_by_artist = organize_by_artist self.audio_providers = self._normalize_audio_providers(audio_providers) + self.slskd_settings = self._normalize_slskd_settings(slskd_settings) + # Final tagged files land in Downtify's download root. + self.slskd_settings['output_dir'] = str(self.download_dir) @staticmethod def _normalize_audio_providers( providers: Optional[list[str]], ) -> list[str]: - allowed = {'youtube-music', 'youtube'} + allowed = {'youtube-music', 'youtube', 'slskd'} if not providers: return ['youtube-music'] out: list[str] = [] @@ -186,11 +198,58 @@ def _normalize_audio_providers( out.append(p) return out or ['youtube-music'] + @staticmethod + def _normalize_slskd_settings( + settings: Optional[dict[str, Any]], + ) -> dict[str, Any]: + raw = settings if isinstance(settings, dict) else {} + def _int(raw_value: Any, default: int) -> int: + try: + return int(raw_value) + except (TypeError, ValueError): + return default + + download_dir = str(raw.get('download_dir') or '/downloads').strip() + return { + 'enabled': bool(raw.get('enabled', False)), + 'base_url': str(raw.get('base_url') or '').strip().rstrip('/'), + 'api_key': str(raw.get('api_key') or '').strip(), + 'download_dir': download_dir, + 'source_dir': str(raw.get('source_dir') or download_dir).strip(), + 'timeout_seconds': _int(raw.get('timeout_seconds') or 20, 20), + 'search_retries': _int(raw.get('search_retries') or 5, 5), + 'search_poll_seconds': _int(raw.get('search_poll_seconds') or 15, 15), + 'download_attempts': _int(raw.get('download_attempts') or 3, 3), + 'poll_interval_seconds': _int( + raw.get('poll_interval_seconds') or 5, 5 + ), + 'poll_max_attempts': _int(raw.get('poll_max_attempts') or 60, 60), + 'download_timeout_seconds': min( + 3600, + max(30, _int(raw.get('download_timeout_seconds') or 600, 600)), + ), + 'queued_timeout_seconds': min( + 3600, + max(15, _int(raw.get('queued_timeout_seconds') or 180, 180)), + ), + 'extensions': raw.get('extensions') or ['mp3', 'flac'], + 'min_bitrate': _int(raw.get('min_bitrate') or 256, 256), + 'leave_in_place': bool(raw.get('leave_in_place', True)), + } + def _resolve_video_id( - self, song: dict[str, Any] - ) -> tuple[Optional[str], Optional[dict[str, Any]], Optional[str]]: - """Resolve ``(video_id, ytm_match, provider_used)`` by configured order.""" + self, + song: dict[str, Any], + progress_cb: Optional[ProgressCallback] = None, + ) -> tuple[ + Optional[str], Optional[dict[str, Any]], Optional[str], Optional[Path] + ]: + """Resolve source by provider order. + + Returns ``(video_id, ytm_match, provider_used, local_file_path)``. + """ + tried_ytdlp = False for provider in self.audio_providers: if provider == 'youtube-music': video_id, match = find_match(song) @@ -202,13 +261,14 @@ def _resolve_video_id( song.get('name'), video_id, ) - return video_id, match, provider + return video_id, match, provider, None logger.info( 'Match resolver: provider={} no match title={!r}', provider, song.get('name'), ) elif provider == 'youtube': + tried_ytdlp = True video_id = _fallback_video_id_via_ytdlp(song) if video_id: logger.info( @@ -218,13 +278,61 @@ def _resolve_video_id( song.get('name'), video_id, ) - return video_id, None, provider + return video_id, None, provider, None + logger.info( + 'Match resolver: provider={} no match title={!r}', + provider, + song.get('name'), + ) + elif provider == 'slskd': + if not bool(self.slskd_settings.get('enabled')): + logger.info( + 'Match resolver: provider={} disabled title={!r}', + provider, + song.get('name'), + ) + continue + slskd_idx = self.audio_providers.index('slskd') + has_fallback = any( + p in ('youtube-music', 'youtube') + for p in self.audio_providers[slskd_idx + 1 :] + ) + local = download_from_slskd( + song, self.slskd_settings, progress_cb=progress_cb + ) + if local is not None: + logger.info( + 'Match resolver: provider={} succeeded title={!r} path={}', + provider, + song.get('name'), + local, + ) + return None, None, provider, local + if has_fallback and progress_cb is not None: + try: + progress_cb(0.0, 'slskd timed out, trying next provider') + except Exception: + logger.opt(exception=True).debug( + 'progress callback error after slskd timeout' + ) logger.info( 'Match resolver: provider={} no match title={!r}', provider, song.get('name'), ) - return None, None, None + + if not tried_ytdlp and 'youtube-music' in self.audio_providers: + video_id = _fallback_video_id_via_ytdlp(song) + if video_id: + logger.info( + 'Match resolver: yt-dlp search fallback after provider ' + 'miss title={!r} video_id={}', + song.get('name'), + video_id, + ) + return video_id, None, 'youtube', None + + return None, None, None, None @staticmethod def _artist_subdir(song: dict[str, Any]) -> str: @@ -288,6 +396,48 @@ def _resolve_target_dir(self, subdir: Optional[str]) -> tuple[Path, str]: safe = sanitize_playlist_name(subdir) return self.download_dir / safe, f'{safe}/' + def _copy_local_source_into_target( + self, + source_path: Path, + target_dir: Path, + basename: str, + ) -> Path: + if not source_path.exists() or not source_path.is_file(): + raise RuntimeError(f'source file not found: {source_path}') + ext = source_path.suffix or f'.{self.audio_format}' + final_path = target_dir / f'{basename}{ext}' + if source_path.resolve() != final_path.resolve(): + shutil.copy2(source_path, final_path) + return final_path + + def _finalize_downloaded_file( + self, + final_path: Path, + song: dict[str, Any], + progress_cb: Optional[ProgressCallback], + ) -> None: + try: + embed_metadata(final_path, song) + except Exception: + logger.exception('Failed to embed metadata into {}', final_path) + + if self.lyrics_providers: + try: + fetched = lyrics_mod.fetch(song, self.lyrics_providers) + except Exception: + logger.exception('Lyrics fetch crashed for {}', final_path) + fetched = None + if fetched is not None: + try: + embed_lyrics(final_path, fetched) + except Exception: + logger.exception( + 'Failed to embed lyrics into {}', final_path + ) + + if progress_cb: + progress_cb(100.0, 'Done') + def download( self, song: dict[str, Any], @@ -307,8 +457,13 @@ def download( video_id = song.get('song_id') match: Optional[dict[str, Any]] = None + provider: Optional[str] = None + local_source_path: Optional[Path] = None if not video_id: - video_id, match, _provider = self._resolve_video_id(song) + song = spotify_mod.enrich_track_from_spotify_if_sparse(song) + video_id, match, provider, local_source_path = self._resolve_video_id( + song, progress_cb=progress_cb + ) elif not song.get('album_name') or not song.get('cover_url'): # We already have a target video, but the metadata is incomplete. # Look up the YT Music entry for THIS specific videoId so we @@ -320,12 +475,13 @@ def download( logger.opt(exception=True).debug('enrichment match failed') match = None - if not video_id: - raise RuntimeError( - f'Could not find a YouTube match for {song.get("name")!r}' + if not video_id and local_source_path is None: + raise NoAudioMatchError( + f'Could not find an audio match for {song.get("name")!r}' ) song = enrich_from_match(song, match) + song = spotify_mod.enrich_track_from_spotify_if_sparse(song) basename = self._format_basename(song) effective_subdir = ( @@ -335,6 +491,29 @@ def download( target_dir.mkdir(parents=True, exist_ok=True) out_template = str(target_dir / f'{basename}.%(ext)s') + if local_source_path is not None: + if provider == 'slskd' and bool( + self.slskd_settings.get('leave_in_place', True) + ): + final_path = local_source_path + stored_name = library_stored_path( + final_path, + self.download_dir, + slskd_dir_from_downloader(self), + ) + else: + final_path = self._copy_local_source_into_target( + local_source_path, target_dir, basename + ) + stored_name = f'{rel_prefix}{final_path.name}' + if progress_cb: + progress_cb( + 95.0, + f'Downloaded ({provider or "slskd"})', + ) + self._finalize_downloaded_file(final_path, song, progress_cb) + return stored_name + def hook(data: dict[str, Any]) -> None: if progress_cb is None: return @@ -431,27 +610,7 @@ def hook(data: dict[str, Any]) -> None: final_path = candidate break - try: - embed_metadata(final_path, song) - except Exception: - logger.exception('Failed to embed metadata into {}', final_path) - - if self.lyrics_providers: - try: - fetched = lyrics_mod.fetch(song, self.lyrics_providers) - except Exception: - logger.exception('Lyrics fetch crashed for {}', final_path) - fetched = None - if fetched is not None: - try: - embed_lyrics(final_path, fetched) - except Exception: - logger.exception( - 'Failed to embed lyrics into {}', final_path - ) - - if progress_cb: - progress_cb(100.0, 'Done') + self._finalize_downloaded_file(final_path, song, progress_cb) return f'{rel_prefix}{final_path.name}' @@ -512,7 +671,7 @@ def embed_metadata(path: Path, song: dict[str, Any]) -> None: cover_bytes = _download_cover(song.get('cover_url', '')) track_number, album_track_total = _album_track_index_for_tags(song) if track_number is None: - logger.info( + logger.debug( 'Tag embed: no track_number/disc position for file={} ' 'song_id={} title={!r} raw_track_number={!r} raw_total={!r}', path.name, @@ -522,7 +681,7 @@ def embed_metadata(path: Path, song: dict[str, Any]) -> None: song.get('album_track_total'), ) if not recording_date: - logger.info( + logger.debug( 'Tag embed: no recording date (year/release_date) for file={} ' 'song_id={} title={!r} raw_year={!r} raw_release_date={!r}', path.name, diff --git a/downtify/library_catalog.py b/downtify/library_catalog.py new file mode 100644 index 0000000..85230e6 --- /dev/null +++ b/downtify/library_catalog.py @@ -0,0 +1,134 @@ +"""Unified library listing and safe path resolution for player + UI.""" + +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Optional + +from .library_metadata import library_entry_for_file +from .library_paths import library_stored_path, locate_library_file +from .track_index import TrackIndex + +AUDIO_EXTENSIONS = frozenset( + {'.mp3', '.m4a', '.flac', '.ogg', '.wav', '.aac', '.opus'} +) + + +@dataclass(frozen=True) +class LibraryContext: + download_dir: Path + slskd_dir: Optional[Path] = None + track_index: Optional[TrackIndex] = None + + +def library_context_from_state( + download_dir: Path, + settings: dict[str, Any], + track_index: Optional[TrackIndex] = None, +) -> LibraryContext: + slskd_raw = settings.get('slskd') + slskd_dir: Optional[Path] = None + if isinstance(slskd_raw, dict): + source = str(slskd_raw.get('source_dir') or '').strip() + if source: + slskd_dir = Path(source) + return LibraryContext( + download_dir=Path(download_dir), + slskd_dir=slskd_dir, + track_index=track_index, + ) + + +def _is_audio(path: Path) -> bool: + return path.is_file() and path.suffix.lower() in AUDIO_EXTENSIONS + + +def resolve_library_file( + stored: str, ctx: LibraryContext +) -> Optional[Path]: + """Resolve a library-relative path if it points to an allowed audio file.""" + + text = str(stored or '').strip().replace('\\', '/') + if not text or text.startswith('/'): + return None + if '\0' in text: + return None + + candidate = locate_library_file(text, ctx.download_dir, ctx.slskd_dir) + if candidate is None or not _is_audio(candidate): + return None + + allowed_roots = [ctx.download_dir.resolve()] + if ctx.slskd_dir is not None: + slskd_resolved = ctx.slskd_dir.resolve() + if slskd_resolved not in allowed_roots: + allowed_roots.append(slskd_resolved) + + for root in allowed_roots: + try: + candidate.relative_to(root) + return candidate + except ValueError: + continue + return None + + +def _register_path( + file_path: Path, + ctx: LibraryContext, + by_resolved: dict[str, str], +) -> None: + if not _is_audio(file_path): + return + resolved_key = str(file_path.resolve()) + if resolved_key in by_resolved: + return + by_resolved[resolved_key] = library_stored_path( + file_path, ctx.download_dir, ctx.slskd_dir + ) + + +def list_library_paths(ctx: LibraryContext) -> list[str]: + """All playable library entries (download_dir + slskd tree + index).""" + + by_resolved: dict[str, str] = {} + + if ctx.download_dir.is_dir(): + for path in ctx.download_dir.rglob('*'): + if path.is_file(): + _register_path(path, ctx, by_resolved) + + if ctx.slskd_dir is not None and ctx.slskd_dir.is_dir(): + try: + same_tree = ( + ctx.slskd_dir.resolve() == ctx.download_dir.resolve() + ) + except OSError: + same_tree = False + if not same_tree: + for path in ctx.slskd_dir.rglob('*'): + if path.is_file(): + _register_path(path, ctx, by_resolved) + + if ctx.track_index is not None: + for stored in ctx.track_index.list_filenames(): + full = resolve_library_file(stored, ctx) + if full is not None: + by_resolved[str(full.resolve())] = library_stored_path( + full, ctx.download_dir, ctx.slskd_dir + ) + + return sorted(by_resolved.values()) + + +def list_library_entries(ctx: LibraryContext) -> list[dict[str, str]]: + """Playable library rows with title/artist from embedded tags.""" + + entries: list[dict[str, str]] = [] + for stored in list_library_paths(ctx): + full = resolve_library_file(stored, ctx) + if full is None: + continue + entries.append(library_entry_for_file(stored, full)) + return entries diff --git a/downtify/library_metadata.py b/downtify/library_metadata.py new file mode 100644 index 0000000..e14cace --- /dev/null +++ b/downtify/library_metadata.py @@ -0,0 +1,92 @@ +"""Read embedded audio tags for library / player display.""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any + +from mutagen import File as MutagenFile + + +def _tag_text(value: Any) -> str: + if value is None: + return '' + if isinstance(value, list): + parts = [_tag_text(item) for item in value] + return '; '.join(part for part in parts if part) + return str(value).strip() + + +def _split_artists(artist: str) -> list[str]: + text = artist.strip() + if not text: + return [] + for sep in (';', '/', ',', '\\'): + if sep in text: + return [part.strip() for part in text.split(sep) if part.strip()] + return [text] + + +def read_audio_metadata(path: Path) -> dict[str, Any]: + """Return ``title``, ``artist``, ``artists``, and ``album`` from file tags.""" + + empty: dict[str, Any] = { + 'title': '', + 'artist': '', + 'artists': [], + 'album': '', + } + if not path.is_file(): + return dict(empty) + + try: + audio = MutagenFile(str(path), easy=True) + except Exception: + return dict(empty) + if audio is None: + return dict(empty) + + title = _tag_text(audio.get('title')) + artist = _tag_text(audio.get('artist')) + album = _tag_text(audio.get('album')) + + if not title and audio.tags is not None: + title = _tag_text(audio.tags.get('title')) + if not artist and audio.tags is not None: + artist = _tag_text(audio.tags.get('artist')) + if not album and audio.tags is not None: + album = _tag_text(audio.tags.get('album')) + + artists = _split_artists(artist) + return { + 'title': title, + 'artist': artist, + 'artists': artists, + 'album': album, + } + + +def library_entry_for_file(stored_path: str, full_path: Path) -> dict[str, str]: + """Build one ``/list`` row using tags, then filename fallbacks.""" + + fb_title, fb_artist = _fallback_title_from_filename(full_path) + meta = read_audio_metadata(full_path) + title = str(meta.get('title') or '').strip() or fb_title + artist = str(meta.get('artist') or '').strip() or fb_artist + album = str(meta.get('album') or '').strip() + return { + 'file': stored_path, + 'title': title, + 'artist': artist, + 'album': album, + } + + +def _fallback_title_from_filename(path: Path) -> tuple[str, str]: + """Parse ``Artist - Title`` from the basename when tags are missing.""" + + stem = path.stem + dash = stem.find(' - ') + if dash > 0: + return stem[dash + 3 :].strip(), stem[:dash].strip() + return stem, '' diff --git a/downtify/library_paths.py b/downtify/library_paths.py new file mode 100644 index 0000000..247ff9f --- /dev/null +++ b/downtify/library_paths.py @@ -0,0 +1,140 @@ +"""Paths for files stored outside the main download_dir tree.""" + +from __future__ import annotations + +import os +from pathlib import Path +from typing import Any, Optional + +SLSKD_LIBRARY_PREFIX = 'slskd/' + + +def path_relative_to_anchor(file_path: Path, anchor: Path) -> str: + """Return a stable path relative to *anchor* (may use ``..`` segments).""" + + file_resolved = file_path.resolve() + anchor_resolved = anchor.resolve() + try: + return file_resolved.relative_to(anchor_resolved).as_posix() + except ValueError: + return os.path.relpath(file_resolved, anchor_resolved).replace('\\', '/') + + +def resolve_stored_path(stored: str, anchor: Path) -> Path: + """Resolve a stored relative path against *anchor*.""" + + return (anchor / stored).resolve() + + +def library_stored_path( + file_path: Path, + download_dir: Path, + slskd_dir: Optional[Path] = None, +) -> str: + """Stable library key for API/DB/URLs (no ``..`` segments). + + Files under *download_dir* stay relative to it. Files under *slskd_dir* + use the virtual prefix ``slskd/`` so clients request + ``/media/slskd/...`` instead of ``/media/../slskd/...`` (browsers + normalize the latter away from the media route). + """ + + file_resolved = file_path.resolve() + anchor_resolved = download_dir.resolve() + try: + return file_resolved.relative_to(anchor_resolved).as_posix() + except ValueError: + pass + if slskd_dir is not None: + slskd_resolved = slskd_dir.resolve() + try: + rel = file_resolved.relative_to(slskd_resolved).as_posix() + return f'{SLSKD_LIBRARY_PREFIX}{rel}' + except ValueError: + pass + return path_relative_to_anchor(file_path, download_dir) + + +def default_slskd_source_roots(download_dir: Path) -> list[Path]: + """Common slskd mount locations when settings omit ``source_dir``.""" + + roots: list[Path] = [] + env = os.getenv('DOWNTIFY_SLSKD_SOURCE_DIR', '').strip() + if env: + roots.append(Path(env)) + for candidate in (Path('/slskd'), download_dir / 'slskd'): + if candidate not in roots: + roots.append(candidate) + return roots + + +def slskd_dir_from_downloader(downloader: Any) -> Optional[Path]: + settings = getattr(downloader, 'slskd_settings', {}) or {} + raw = str(settings.get('source_dir') or '').strip() + if raw: + return Path(raw) + if bool(settings.get('enabled')): + download_dir = Path(str(settings.get('download_dir') or '/downloads')) + for candidate in default_slskd_source_roots(download_dir): + if candidate.is_dir(): + return candidate + return None + + +def _slskd_relative(stored: str) -> Optional[str]: + text = str(stored or '').strip().replace('\\', '/') + if not text.startswith(SLSKD_LIBRARY_PREFIX): + return None + rel = text[len(SLSKD_LIBRARY_PREFIX) :].lstrip('/') + return rel or None + + +def resolve_library_stored_path( + stored: str, + download_dir: Path, + slskd_dir: Optional[Path] = None, +) -> Path: + """Resolve a library stored path to an absolute filesystem path.""" + + text = str(stored or '').strip().replace('\\', '/') + rel = _slskd_relative(text) + if rel is not None: + if slskd_dir is not None: + return (slskd_dir / rel).resolve() + return (download_dir / 'slskd' / rel).resolve() + return resolve_stored_path(text, download_dir) + + +def locate_library_file( + stored: str, + download_dir: Path, + slskd_dir: Optional[Path] = None, +) -> Optional[Path]: + """Resolve *stored* to an on-disk file, trying external and legacy slskd roots.""" + + text = str(stored or '').strip().replace('\\', '/') + if not text or text.startswith('/'): + return None + + rel = _slskd_relative(text) + candidates: list[Path] = [] + if rel is not None: + if slskd_dir is not None: + candidates.append((slskd_dir / rel).resolve()) + for root in default_slskd_source_roots(download_dir): + candidates.append((root / rel).resolve()) + candidates.append((download_dir / 'slskd' / rel).resolve()) + candidates.append(resolve_library_stored_path(text, download_dir, slskd_dir)) + + seen: set[str] = set() + for path in candidates: + key = str(path) + if key in seen: + continue + seen.add(key) + try: + if path.is_file(): + return path + except OSError: + continue + return None diff --git a/downtify/m3u.py b/downtify/m3u.py index 760a1d8..f2a193e 100644 --- a/downtify/m3u.py +++ b/downtify/m3u.py @@ -9,13 +9,14 @@ from __future__ import annotations -import os import re from pathlib import Path from typing import Iterable, Optional from loguru import logger +from .library_paths import locate_library_file + _PLAYLIST_NAME_ALLOWED = re.compile(r'[^A-Za-z0-9 _-]+') @@ -38,7 +39,7 @@ def build_m3u_content( entries: Iterable[dict], *, download_dir: Path, - m3u_dir: Optional[Path] = None, + slskd_dir: Optional[Path] = None, ) -> tuple[str, int]: """Render the body of a ``.m3u`` file. @@ -46,28 +47,24 @@ def build_m3u_content( ``title``, ``artist`` and ``duration``. Entries whose file does not exist on disk are skipped (and logged). - Track paths are written **relative to the M3U file's directory** so - the same file works whether it's read from inside the Downtify - container (``/downloads/...``) or from another consumer that mounts - the same library at a different root (Jellyfin under - ``/nas/music/...``, etc). ``m3u_dir`` defaults to - ``download_dir/Playlists`` to match :func:`write_m3u`. + Track paths are the **absolute resolved filesystem paths** where + Downtify found each file (e.g. ``/downloads/...`` or ``/slskd/...``), + so media servers that share the same volume mounts can open them + without manual path configuration. Returns ``(content, kept_count)`` so the caller can both write the file and report how many tracks ended up in it. """ - if m3u_dir is None: - m3u_dir = download_dir / 'Playlists' lines: list[str] = ['#EXTM3U'] kept = 0 for entry in entries: filename = (entry or {}).get('filename') if not filename: continue - path = (download_dir / filename).resolve() - if not path.exists(): - logger.warning('Skipping missing track in M3U: {}', path) + path = locate_library_file(filename, download_dir, slskd_dir) + if path is None: + logger.warning('Skipping missing track in M3U: {}', filename) continue title = (entry.get('title') or '').strip() artist = (entry.get('artist') or '').strip() @@ -79,7 +76,7 @@ def build_m3u_content( if title or artist: label = ' - '.join(p for p in (artist, title) if p) lines.append(f'#EXTINF:{duration_int},{label}') - lines.append(os.path.relpath(path, start=m3u_dir)) + lines.append(path.resolve().as_posix()) kept += 1 # Standard M3U uses LF line endings. return '\n'.join(lines) + '\n', kept @@ -91,6 +88,7 @@ def write_m3u( entries: Iterable[dict], *, playlist_subdir: Optional[str] = None, + slskd_dir: Optional[Path] = None, ) -> tuple[Optional[Path], int]: """Write an M3U for ``playlist_name``. @@ -115,7 +113,7 @@ def write_m3u( content, kept = build_m3u_content( list(entries), download_dir=Path(download_dir), - m3u_dir=target_dir, + slskd_dir=slskd_dir, ) if kept == 0: logger.warning( diff --git a/downtify/monitor.py b/downtify/monitor.py index b6bec00..3d9c3af 100644 --- a/downtify/monitor.py +++ b/downtify/monitor.py @@ -13,6 +13,14 @@ from . import m3u, spotify from .downloader import Downloader +from .navidrome import _effective_navidrome_settings, sync_playlist_to_navidrome +from .library_metadata import read_audio_metadata +from .library_paths import locate_library_file, slskd_dir_from_downloader +from .track_index import ( + TrackIndex, + normalize_spotify_track_id, + resolve_existing_download, +) MONITOR_LOOP_INTERVAL = 60 # seconds between loop sweeps @@ -224,6 +232,7 @@ async def check_playlist( broadcast: Callable[[dict[str, Any]], Any], loop: asyncio.AbstractEventLoop, settings: Optional[dict[str, Any]] = None, + track_index: Optional[TrackIndex] = None, ) -> int: """Fetch playlist, detect new tracks, download them. Returns count downloaded.""" logger.info( @@ -246,22 +255,44 @@ async def check_playlist( known_tracks = await asyncio.to_thread(db.get_track_filenames, playlist.id) pl_subdir = m3u.sanitize_playlist_name(playlist.name) + slskd_dir = slskd_dir_from_downloader(downloader) + linked_from_library = 0 new_tracks = [] for t in tracks: if not t.get('song_id'): continue tid = t['song_id'] - if tid not in known_tracks: - new_tracks.append(t) - else: - stored = known_tracks[tid] - if ( - stored is not None - and not (downloader.download_dir / stored).exists() - ): - # File was deleted — re-download - new_tracks.append(t) + stored = known_tracks.get(tid) + if stored and locate_library_file( + stored, downloader.download_dir, slskd_dir + ): + continue + if track_index is not None: + spotify_tid = normalize_spotify_track_id(t) + if spotify_tid: + library_file = track_index.lookup(spotify_tid) + if library_file and locate_library_file( + library_file, downloader.download_dir, slskd_dir + ): + await asyncio.to_thread( + db.mark_track_downloaded, + playlist.id, + tid, + library_file, + ) + linked_from_library += 1 + continue + if library_file: + track_index.forget(spotify_tid) + new_tracks.append(t) + + if linked_from_library: + logger.info( + 'Linked {} track(s) from library into playlist "{}"', + linked_from_library, + playlist.name, + ) if new_tracks: logger.info( @@ -281,16 +312,7 @@ async def check_playlist( # as a fallback if the per-track fetch fails for any reason. try: full = await asyncio.to_thread(spotify.track_from_id, track_id) - for key in ( - 'cover_url', - 'year', - 'release_date', - 'album_name', - 'artists', - ): - value = full.get(key) - if value: - song[key] = value + song.update(spotify._merge_full_track_metadata(song, full)) except Exception: logger.opt(exception=True).warning( 'Per-track Spotify fetch failed for {}; ' @@ -322,6 +344,10 @@ def _cb(pct: float, message: str) -> None: await asyncio.to_thread( db.mark_track_downloaded, playlist.id, track_id, filename ) + if track_index is not None: + await asyncio.to_thread( + track_index.register_song, song, filename + ) downloaded += 1 except Exception: logger.exception('Failed to auto-download track {}', track_id) @@ -333,17 +359,102 @@ def _cb(pct: float, message: str) -> None: last_track_count=len(tracks), ) - if downloaded > 0 and ( - settings is None or settings.get('generate_m3u', True) - ): - await asyncio.to_thread(_regenerate_m3u, playlist, tracks, downloader) + if downloaded > 0 or linked_from_library > 0: + known_tracks = await asyncio.to_thread( + db.get_track_filenames, playlist.id + ) + if settings is None or settings.get('generate_m3u', True): + await asyncio.to_thread( + _regenerate_m3u, + playlist, + tracks, + downloader, + known_tracks, + track_index, + settings, + ) + if settings is None or settings.get('sync_navidrome', True): + await asyncio.to_thread( + _sync_navidrome_playlist, + playlist, + tracks, + downloader, + settings, + known_tracks, + track_index, + ) return downloaded +def _resolve_monitored_track_filename( + song: dict[str, Any], + downloader: Downloader, + pl_subdir: str, + known_tracks: dict[str, Optional[str]], + track_index: Optional[TrackIndex], +) -> Optional[str]: + tid = song.get('song_id') + if tid: + stored = known_tracks.get(tid) + if stored and locate_library_file( + stored, downloader.download_dir, slskd_dir_from_downloader(downloader) + ): + return stored + hit = resolve_existing_download( + downloader, + song, + subdir=pl_subdir, + track_index=track_index, + ) + return hit[0] if hit else None + + +def _sync_navidrome_playlist( + playlist: MonitoredPlaylist, + tracks: list[dict[str, Any]], + downloader: Downloader, + settings: Optional[dict[str, Any]], + known_tracks: dict[str, Optional[str]], + track_index: Optional[TrackIndex] = None, +) -> None: + if not settings or not _effective_navidrome_settings(settings).get('enabled'): + return + pl_subdir = m3u.sanitize_playlist_name(playlist.name) + songs: list[dict[str, Any]] = [] + for song in tracks: + filename = _resolve_monitored_track_filename( + song, downloader, pl_subdir, known_tracks, track_index + ) + if not filename: + continue + row = dict(song) + row['filename'] = filename + path = locate_library_file( + filename, downloader.download_dir, slskd_dir_from_downloader(downloader) + ) + if path is not None: + meta = read_audio_metadata(path) + if meta.get('title'): + row['name'] = meta['title'] + if meta.get('artists'): + row['artists'] = meta['artists'] + songs.append(row) + if not songs: + logger.warning( + 'Navidrome sync skip for "{}": no tracks on disk', + playlist.name, + ) + return + sync_playlist_to_navidrome(playlist.name, songs, settings) + + def _regenerate_m3u( playlist: MonitoredPlaylist, tracks: list[dict[str, Any]], downloader: Downloader, + known_tracks: dict[str, Optional[str]], + track_index: Optional[TrackIndex] = None, + settings: Optional[dict[str, Any]] = None, ) -> None: """Rewrite the playlist's M3U from on-disk state after a sweep. @@ -356,7 +467,9 @@ def _regenerate_m3u( pl_subdir = m3u.sanitize_playlist_name(playlist.name) entries: list[dict[str, Any]] = [] for song in tracks: - filename = downloader.existing_filename_for(song, subdir=pl_subdir) + filename = _resolve_monitored_track_filename( + song, downloader, pl_subdir, known_tracks, track_index + ) if not filename: continue entries.append({ @@ -376,12 +489,14 @@ def _regenerate_m3u( playlist.name, entries, playlist_subdir=pl_subdir, + slskd_dir=slskd_dir_from_downloader(downloader), ) async def monitor_loop( db: PlaylistMonitorDB, get_downloader: Callable[[], Optional[Downloader]], + get_track_index: Callable[[], Optional[TrackIndex]], broadcast: Callable[[dict[str, Any]], Any], loop: asyncio.AbstractEventLoop, settings: Optional[dict[str, Any]] = None, @@ -398,9 +513,16 @@ async def monitor_loop( downloader = get_downloader() if downloader is None: continue + track_index = get_track_index() try: count = await check_playlist( - pl, db, downloader, broadcast, loop, settings + pl, + db, + downloader, + broadcast, + loop, + settings, + track_index=track_index, ) if count > 0: logger.info( diff --git a/downtify/navidrome.py b/downtify/navidrome.py new file mode 100644 index 0000000..98537dc --- /dev/null +++ b/downtify/navidrome.py @@ -0,0 +1,534 @@ +"""Navidrome integration via the Subsonic API (playlist sync).""" + +from __future__ import annotations + +import hashlib +import secrets +import time +from dataclasses import dataclass +from typing import Any, Optional +from urllib.parse import quote, urlencode + +import requests +from loguru import logger + + +@dataclass +class PlaylistSyncResult: + playlist_id: str + playlist_name: str + matched: int + total: int + scanned: bool + scan_complete: bool = False + + +def _search_title(title: str) -> str: + """Title used for Navidrome search (strip feat. suffixes, keep remix names).""" + + text = str(title or '').strip() + lowered = text.casefold() + for marker in (' - feat.', ' (feat.', ' - ft.', ' (ft.', ' - featuring '): + idx = lowered.find(marker) + if idx > 0: + return text[:idx].strip() + return text + + +def _path_match_keys(filename: str) -> list[str]: + """Normalized path fragments to match Navidrome ``path`` fields.""" + + text = str(filename or '').strip().replace('\\', '/').casefold() + if not text: + return [] + keys = [text] + base = text.rsplit('/', 1)[-1] + if base and base not in keys: + keys.append(base) + if text.startswith('slskd/'): + tail = text[len('slskd/') :] + if tail not in keys: + keys.append(tail) + return keys + + +def _effective_navidrome_settings(settings: dict[str, Any]) -> dict[str, Any]: + raw = settings.get('navidrome') + if not isinstance(raw, dict): + raw = {} + url = str(raw.get('url') or '').strip().rstrip('/') + username = str(raw.get('username') or '').strip() + password = str(raw.get('password') or '') + admin_username = str(raw.get('admin_username') or '').strip() + admin_password = str(raw.get('admin_password') or '') + try: + scan_wait_seconds = int(raw.get('scan_wait_seconds') or 120) + except (TypeError, ValueError): + scan_wait_seconds = 120 + scan_wait_seconds = min(600, max(10, scan_wait_seconds)) + try: + scan_poll_seconds = int(raw.get('scan_poll_seconds') or 5) + except (TypeError, ValueError): + scan_poll_seconds = 5 + scan_poll_seconds = min(120, max(2, scan_poll_seconds)) + try: + scan_retry_seconds = int(raw.get('scan_retry_seconds') or 15) + except (TypeError, ValueError): + scan_retry_seconds = 15 + scan_retry_seconds = min(120, max(0, scan_retry_seconds)) + return { + 'enabled': bool(raw.get('enabled', False)), + 'url': url, + 'username': username, + 'password': password, + 'admin_username': admin_username, + 'admin_password': admin_password, + 'public_playlist': bool(raw.get('public_playlist', False)), + 'scan_after_download': bool(raw.get('scan_after_download', True)), + 'scan_full': bool(raw.get('scan_full', False)), + 'scan_wait_seconds': scan_wait_seconds, + 'scan_poll_seconds': scan_poll_seconds, + 'scan_retry_seconds': scan_retry_seconds, + 'client_name': str(raw.get('client_name') or 'Downtify').strip() or 'Downtify', + 'api_version': str(raw.get('api_version') or '1.16.1').strip() or '1.16.1', + } + + +class NavidromeClient: + """Minimal Subsonic client for Navidrome playlist and library operations.""" + + def __init__(self, cfg: dict[str, Any]): + self.base_url = str(cfg.get('url') or '').rstrip('/') + self.username = str(cfg.get('username') or '') + self.password = str(cfg.get('password') or '') + self.admin_username = str(cfg.get('admin_username') or '') + self.admin_password = str(cfg.get('admin_password') or '') + self.client_name = str(cfg.get('client_name') or 'Downtify') + self.api_version = str(cfg.get('api_version') or '1.16.1') + self.scan_poll_seconds = int(cfg.get('scan_poll_seconds') or 5) + self.timeout = 30 + self._token = '' + self._salt = '' + + def configured(self) -> bool: + return bool(self.base_url and self.username and self.password) + + def _refresh_auth(self) -> None: + salt = secrets.token_urlsafe(8)[:12] + token = hashlib.md5(f'{self.password}{salt}'.encode()).hexdigest() + self._salt = salt + self._token = token + + def _auth_query( + self, + *, + username: Optional[str] = None, + password: Optional[str] = None, + ) -> dict[str, str]: + user = username if username is not None else self.username + pwd = password if password is not None else self.password + salt = secrets.token_urlsafe(8)[:12] + token = hashlib.md5(f'{pwd}{salt}'.encode()).hexdigest() + return { + 'u': user, + 't': token, + 's': salt, + 'v': self.api_version, + 'c': self.client_name, + 'f': 'json', + } + + def _request( + self, + endpoint: str, + extra: Optional[dict[str, Any]] = None, + *, + username: Optional[str] = None, + password: Optional[str] = None, + ) -> dict[str, Any]: + params = self._auth_query(username=username, password=password) + if extra: + for key, value in extra.items(): + if value is None: + continue + params[key] = str(value) + url = f'{self.base_url}/rest/{endpoint}?{urlencode(params)}' + resp = requests.get(url, timeout=self.timeout) + resp.raise_for_status() + data = resp.json() + body = data.get('subsonic-response') if isinstance(data, dict) else None + if not isinstance(body, dict): + raise ValueError('Invalid Subsonic response') + if body.get('status') == 'failed': + err = body.get('error') or {} + message = err.get('message') if isinstance(err, dict) else str(err) + raise ValueError(str(message or 'Subsonic request failed')) + return body + + def ping(self) -> bool: + try: + self._request('ping') + return True + except Exception as exc: + logger.info('navidrome: ping failed url={!r} err={}', self.base_url, exc) + return False + + def _scan_credentials(self) -> tuple[str, str]: + if self.admin_username and self.admin_password: + return self.admin_username, self.admin_password + return self.username, self.password + + def start_scan(self, *, full: bool = False) -> None: + """Trigger Navidrome ``startScan`` (incremental by default, like Explo/deemix hooks).""" + + extra: dict[str, Any] = {} + if full: + extra['fullScan'] = 'true' + user, pwd = self._scan_credentials() + self._request('startScan', extra or None, username=user, password=pwd) + + def wait_scan_complete(self, max_wait_seconds: int) -> bool: + deadline = time.monotonic() + max(10, max_wait_seconds) + user, pwd = self._scan_credentials() + while time.monotonic() < deadline: + try: + body = self._request( + 'getScanStatus', username=user, password=pwd + ) + except Exception as exc: + logger.info('navidrome: scan status failed err={}', exc) + return False + status = body.get('scanStatus') if isinstance(body, dict) else None + if isinstance(status, dict) and not status.get('scanning'): + return True + time.sleep(self.scan_poll_seconds) + logger.warning( + 'navidrome: library scan still running after {}s; ' + 'playlist match may be incomplete', + max_wait_seconds, + ) + return False + + def search_song_id(self, song: dict[str, Any]) -> Optional[str]: + title = _search_title(str(song.get('name') or '')) + artists = [str(a) for a in (song.get('artists') or []) if str(a).strip()] + artist = artists[0] if artists else '' + path_keys = _path_match_keys(str(song.get('filename') or '')) + query = f'{title} {artist}'.strip() + if not query and not path_keys: + return None + body = self._request( + 'search3', + {'query': query or path_keys[0], 'songCount': 30}, + ) + results = body.get('searchResult3') if isinstance(body, dict) else None + songs = [] + if isinstance(results, dict): + songs = results.get('song') or [] + if isinstance(songs, dict): + songs = [songs] + if not isinstance(songs, list): + return None + + target_duration = int(song.get('duration') or 0) + if target_duration > 1000: + target_duration = target_duration // 1000 + + for candidate in songs: + if not isinstance(candidate, dict): + continue + cid = str(candidate.get('id') or '').strip() + if not cid: + continue + c_artist = str(candidate.get('artist') or '') + c_title = str(candidate.get('title') or '') + c_duration = int(candidate.get('duration') or 0) + c_path = str(candidate.get('path') or '').replace('\\', '/').casefold() + + artist_match = artist and artist.casefold() in c_artist.casefold() + title_match = ( + title.casefold() == c_title.casefold() + or str(song.get('name') or '').casefold() == c_title.casefold() + ) + duration_match = ( + not target_duration + or not c_duration + or abs(target_duration - c_duration) < 10 + ) + path_match = any(key in c_path for key in path_keys) + + if path_keys and path_keys[0] in c_path: + return cid + if artist_match and title_match and duration_match: + return cid + if title_match and duration_match: + return cid + if path_match and duration_match: + return cid + return None + + def find_playlist_ids_by_name(self, name: str) -> list[str]: + """Return all playlist IDs with an exact *name* match (newest API order).""" + + body = self._request('getPlaylists') + playlists = body.get('playlists') if isinstance(body, dict) else None + items = [] + if isinstance(playlists, dict): + items = playlists.get('playlist') or [] + if isinstance(items, dict): + items = [items] + ids: list[str] = [] + for pl in items: + if not isinstance(pl, dict): + continue + if str(pl.get('name') or '') != name: + continue + pid = str(pl.get('id') or '').strip() + if pid: + ids.append(pid) + return ids + + def delete_playlist(self, playlist_id: str) -> None: + self._request('deletePlaylist', {'id': playlist_id}) + + def _create_or_replace_playlist( + self, + name: str, + song_ids: list[str], + *, + playlist_id: Optional[str] = None, + ) -> str: + """Create a playlist or replace tracks on an existing one (Subsonic semantics).""" + + if not song_ids: + raise ValueError('No songs matched in Navidrome library') + query = self._auth_query() + query['name'] = name + if playlist_id: + query['playlistId'] = playlist_id + url = f'{self.base_url}/rest/createPlaylist?{urlencode(query)}' + for sid in song_ids: + url += f'&songId={quote(sid)}' + resp = requests.get(url, timeout=self.timeout) + resp.raise_for_status() + data = resp.json() + body = data.get('subsonic-response') if isinstance(data, dict) else None + if not isinstance(body, dict) or body.get('status') == 'failed': + err = (body or {}).get('error') if isinstance(body, dict) else {} + message = err.get('message') if isinstance(err, dict) else 'create failed' + raise ValueError(str(message)) + playlist = body.get('playlist') if isinstance(body, dict) else None + if isinstance(playlist, dict): + pid = str(playlist.get('id') or '').strip() + if pid: + return pid + if playlist_id: + return playlist_id + raise ValueError('createPlaylist returned no playlist id') + + def create_playlist(self, name: str, song_ids: list[str]) -> str: + return self._create_or_replace_playlist(name, song_ids) + + def replace_playlist( + self, playlist_id: str, name: str, song_ids: list[str] + ) -> str: + """Replace all tracks on an existing playlist (same ID, no delete).""" + + return self._create_or_replace_playlist( + name, song_ids, playlist_id=playlist_id + ) + + def update_playlist_meta( + self, + playlist_id: str, + *, + comment: str, + public: bool, + ) -> None: + self._request( + 'updatePlaylist', + { + 'playlistId': playlist_id, + 'comment': comment, + 'public': str(public).lower(), + }, + ) + + +def _scan_wait_budget(cfg: dict[str, Any], track_count: int) -> int: + """Seconds to wait for Navidrome scan; scales slightly with playlist size.""" + + base = int(cfg['scan_wait_seconds']) + return min(900, max(base, 30 + track_count * 2)) + + +def _song_label(song: dict[str, Any]) -> str: + label = str(song.get('name') or 'unknown') + artists = song.get('artists') or [] + if artists: + label = f"{', '.join(str(a) for a in artists)} - {label}" + fn = str(song.get('filename') or '').strip() + return f'{label} ({fn})' if fn else label + + +def _match_songs_in_library( + client: NavidromeClient, + songs: list[dict[str, Any]], +) -> tuple[list[str], list[dict[str, Any]]]: + song_ids: list[str] = [] + unmatched: list[dict[str, Any]] = [] + for song in songs: + sid = client.search_song_id(song) + if sid: + song_ids.append(sid) + else: + unmatched.append(song) + return song_ids, unmatched + + +def _trigger_library_scan( + client: NavidromeClient, + cfg: dict[str, Any], + track_count: int, +) -> bool: + """Start Navidrome scan and block until idle or timeout. Returns scan finished.""" + + wait_seconds = _scan_wait_budget(cfg, track_count) + mode = 'full' if cfg.get('scan_full') else 'incremental' + logger.info( + 'navidrome: starting {} library scan before playlist sync ' + '(up to {}s, {} tracks)', + mode, + wait_seconds, + track_count, + ) + client.start_scan(full=bool(cfg.get('scan_full'))) + if client.wait_scan_complete(wait_seconds): + logger.info('navidrome: library scan finished') + return True + return False + + +def sync_playlist_to_navidrome( + playlist_name: str, + songs: list[dict[str, Any]], + settings: dict[str, Any], + *, + comment: str = 'Synced from Spotify via Downtify', +) -> Optional[PlaylistSyncResult]: + """Match *songs* in Navidrome and create/replace a server playlist.""" + cfg = _effective_navidrome_settings(settings) + if not cfg.get('enabled'): + return None + client = NavidromeClient(cfg) + if not client.configured(): + logger.info('navidrome: missing url/username/password') + return None + if not client.ping(): + logger.info('navidrome: server unreachable url={!r}', cfg.get('url')) + return None + if not songs: + return None + + scanned = False + scan_complete = False + if cfg.get('scan_after_download'): + try: + scanned = True + scan_complete = _trigger_library_scan(client, cfg, len(songs)) + except Exception as exc: + logger.info('navidrome: library scan failed err={}', exc) + + song_ids, pending = _match_songs_in_library(client, songs) + retry_seconds = int(cfg.get('scan_retry_seconds') or 0) + if pending and scanned and retry_seconds > 0: + logger.info( + 'navidrome: {} track(s) not indexed yet; retrying match in {}s', + len(pending), + retry_seconds, + ) + time.sleep(retry_seconds) + extra_ids, pending = _match_songs_in_library(client, pending) + song_ids.extend(extra_ids) + + total = len(songs) + matched = len(song_ids) + if pending: + labels = [_song_label(s) for s in pending] + logger.info( + 'navidrome: {} track(s) not in library index for playlist={!r}: {}', + len(pending), + playlist_name, + '; '.join(labels[:12]) + ('; ...' if len(labels) > 12 else ''), + ) + if matched == 0: + logger.info( + 'navidrome: no tracks matched library for playlist={!r} total={}', + playlist_name, + total, + ) + return PlaylistSyncResult( + '', playlist_name, 0, total, scanned, scan_complete + ) + + existing_ids = client.find_playlist_ids_by_name(playlist_name) + try: + if existing_ids: + playlist_id = existing_ids[0] + for duplicate_id in existing_ids[1:]: + try: + client.delete_playlist(duplicate_id) + logger.info( + 'navidrome: removed duplicate playlist id={} name={!r}', + duplicate_id, + playlist_name, + ) + except Exception as exc: + logger.info( + 'navidrome: could not remove duplicate playlist id={} err={}', + duplicate_id, + exc, + ) + playlist_id = client.replace_playlist( + playlist_id, playlist_name, song_ids + ) + logger.info( + 'navidrome: updated existing playlist id={} name={!r}', + playlist_id, + playlist_name, + ) + else: + playlist_id = client.create_playlist(playlist_name, song_ids) + logger.info( + 'navidrome: created playlist id={} name={!r}', + playlist_id, + playlist_name, + ) + client.update_playlist_meta( + playlist_id, + comment=comment, + public=bool(cfg.get('public_playlist')), + ) + except Exception as exc: + logger.info( + 'navidrome: playlist create failed name={!r} matched={}/{} err={}', + playlist_name, + matched, + total, + exc, + ) + return PlaylistSyncResult( + '', playlist_name, matched, total, scanned, scan_complete + ) + + logger.info( + 'navidrome: playlist synced name={!r} id={} matched={}/{} scan_complete={}', + playlist_name, + playlist_id, + matched, + total, + scan_complete, + ) + return PlaylistSyncResult( + playlist_id, playlist_name, matched, total, scanned, scan_complete + ) diff --git a/downtify/providers.py b/downtify/providers.py index 3d6e780..353d013 100644 --- a/downtify/providers.py +++ b/downtify/providers.py @@ -135,6 +135,41 @@ def _result_to_song(result: dict[str, Any]) -> Optional[dict[str, Any]]: } +def _parse_text_search_query(query: str) -> tuple[list[str], str]: + text = query.strip() + if not text: + return [], '' + if ' - ' in text: + left, right = text.split(' - ', 1) + artist = left.strip() + title = right.strip() + if artist and title: + return [artist], title + return [], text + + +def song_stub_from_text_query(query: str) -> Optional[dict[str, Any]]: + """Build a minimal song row for slskd matching when browse search has no hits.""" + artists, title = _parse_text_search_query(query) + text = query.strip() + if not text: + return None + song_id = f'search-{abs(hash(text)) & 0xFFFFFFFF:08x}' + return { + 'song_id': song_id, + 'name': title, + 'artists': artists, + 'album_name': '', + 'cover_url': '', + 'duration': 0, + 'url': f'downtify-search:{song_id}', + 'explicit': False, + 'year': '', + 'release_date': '', + 'source': 'text_search', + } + + def search_songs(query: str, limit: int = 20) -> list[dict[str, Any]]: if not query.strip(): return [] diff --git a/downtify/slskd_provider.py b/downtify/slskd_provider.py new file mode 100644 index 0000000..9590ab4 --- /dev/null +++ b/downtify/slskd_provider.py @@ -0,0 +1,1057 @@ +"""slskd provider integration for track search and download handoff.""" + +from __future__ import annotations + +import re +import shutil +import threading +import time +import unicodedata +from pathlib import Path +from typing import Any, Callable, Optional + +ProgressCallback = Callable[[float, str], None] +from urllib.parse import quote + +import requests +from loguru import logger + +_SLSKD_LOCK = threading.Lock() + +_DEFAULT_DOWNLOAD_TIMEOUT_SECONDS = 600 +_DEFAULT_QUEUED_TIMEOUT_SECONDS = 180 + + +def _int_setting( + settings: dict[str, Any], + key: str, + default: int, + *, + minimum: int, + maximum: int, +) -> int: + try: + value = int(settings.get(key) or default) + except (TypeError, ValueError): + value = default + return min(maximum, max(minimum, value)) + + +def _slskd_deadline(settings: dict[str, Any]) -> float: + seconds = _int_setting( + settings, + 'download_timeout_seconds', + _DEFAULT_DOWNLOAD_TIMEOUT_SECONDS, + minimum=30, + maximum=3600, + ) + return time.monotonic() + seconds + + +def _past_deadline(deadline: float) -> bool: + return time.monotonic() >= deadline + +_AUDIO_EXTENSIONS = frozenset({'mp3', 'flac', 'm4a', 'ogg', 'opus'}) +_FILTER_KEYWORDS = ( + 'live', + 'remix', + 'instrumental', + 'extended', + 'clean', + 'acapella', + 'karaoke', +) + + +class SlskdClient: + def __init__(self, settings: dict[str, Any]): + self.base_url = str(settings.get('base_url') or '').strip().rstrip('/') + self.api_key = str(settings.get('api_key') or '').strip() + self.timeout = int(settings.get('timeout_seconds') or 20) + self.search_retries = int(settings.get('search_retries') or 5) + self.search_poll_seconds = int(settings.get('search_poll_seconds') or 15) + self.download_attempts = int(settings.get('download_attempts') or 3) + self.session = requests.Session() + if self.api_key: + self.session.headers.update({'X-API-Key': self.api_key}) + + def configured(self) -> bool: + return bool(self.base_url and self.api_key) + + def can_connect(self) -> bool: + for ep in ( + '/api/v0/application', + '/api/v0/options', + '/api/v0/transfers/downloads', + ): + try: + self._request('GET', ep) + return True + except Exception: + continue + return False + + def _request( + self, + method: str, + path: str, + *, + json_body: Optional[Any] = None, + ) -> Any: + url = f'{self.base_url}{path}' + kwargs: dict[str, Any] = {'timeout': self.timeout} + if json_body is not None: + kwargs['json'] = json_body + resp = self.session.request(method, url, **kwargs) + resp.raise_for_status() + if not resp.content: + return {} + return resp.json() + + def start_search(self, query: str) -> Optional[str]: + body = { + 'searchText': query, + 'filterResponses': True, + 'minimumResponseFileCount': 1, + 'minimumPeerUploadSpeed': 1, + } + try: + data = self._request('POST', '/api/v0/searches', json_body=body) + except Exception as exc: + logger.info('slskd: search POST failed q={!r} err={}', query[:120], exc) + return None + if isinstance(data, dict): + for key in ('id', 'searchId'): + raw = data.get(key) + if isinstance(raw, (int, str)) and str(raw).strip(): + return str(raw).strip() + return None + + def wait_search_complete( + self, + search_id: str, + label: str, + *, + on_poll: Optional[Callable[[float], None]] = None, + deadline: Optional[float] = None, + ) -> bool: + max_attempts = max(1, self.search_retries) + for attempt in range(max_attempts): + if deadline is not None and _past_deadline(deadline): + return False + if on_poll is not None: + try: + on_poll(5.0 + (attempt / max_attempts) * 30.0) + except Exception: + logger.opt(exception=True).debug( + 'slskd search progress callback error' + ) + try: + status = self._request('GET', f'/api/v0/searches/{search_id}') + except Exception as exc: + logger.info( + 'slskd: search status failed id={} err={}', search_id, exc + ) + return False + if not isinstance(status, dict): + return False + file_count = int(status.get('fileCount') or 0) + locked = int(status.get('lockedFileCount') or 0) + if status.get('isComplete'): + if file_count > 0 and file_count != locked: + return True + logger.info( + 'slskd: search complete but no free files label={!r} ' + 'fileCount={} locked={}', + label[:120], + file_count, + locked, + ) + return False + if attempt + 1 < self.search_retries: + time.sleep(max(1, self.search_poll_seconds)) + logger.info( + 'slskd: search timed out label={!r} retries={}', + label[:120], + self.search_retries, + ) + return False + + def search_responses(self, search_id: str) -> list[dict[str, Any]]: + try: + data = self._request('GET', f'/api/v0/searches/{search_id}/responses') + except Exception: + return [] + if isinstance(data, list): + return [r for r in data if isinstance(r, dict)] + return [] + + def delete_search(self, search_id: str) -> None: + try: + self._request('DELETE', f'/api/v0/searches/{search_id}') + except Exception: + pass + + def enqueue_download(self, row: dict[str, Any]) -> bool: + username = str( + row.get('username') or row.get('userName') or row.get('user') or '' + ).strip() + filename = str( + row.get('filename') + or row.get('fileName') + or row.get('path') + or row.get('fullPath') + or '' + ).strip() + if not username or not filename: + return False + try: + size = int(row.get('size') or 0) + except (TypeError, ValueError): + size = 0 + endpoint = f'/api/v0/transfers/downloads/{quote(username)}' + body = [{'filename': filename, 'size': max(0, size)}] + try: + self._request('POST', endpoint, json_body=body) + return True + except Exception as exc: + logger.info( + 'slskd: enqueue failed user={!r} file={!r} err={}', + username, + filename[:120], + exc, + ) + return False + + def list_download_transfers(self) -> list[dict[str, Any]]: + try: + data = self._request('GET', '/api/v0/transfers/downloads') + except Exception: + return [] + if isinstance(data, list): + return [row for row in data if isinstance(row, dict)] + return [] + + def find_transfer( + self, username: str, filename: str + ) -> Optional[dict[str, Any]]: + for peer_filter in (username, ''): + for peer in self.list_download_transfers(): + if peer_filter and str(peer.get('username') or '') != peer_filter: + continue + for directory in peer.get('directories') or []: + if not isinstance(directory, dict): + continue + for file_row in directory.get('files') or []: + if not isinstance(file_row, dict): + continue + name = str( + file_row.get('filename') + or file_row.get('fileName') + or '' + ) + if _paths_match(name, filename): + return file_row + return None + + def remote_download_directories(self) -> list[str]: + """Best-effort read of slskd's configured download/incomplete dirs.""" + for endpoint in ('/api/v0/options', '/api/v0/application'): + try: + data = self._request('GET', endpoint) + except Exception: + continue + paths = _extract_directory_paths(data) + if paths: + return paths + return [] + + +def _flatten_slskd_responses(data: Any) -> list[dict[str, Any]]: + responses = data if isinstance(data, list) else [] + rows: list[dict[str, Any]] = [] + for resp in responses: + if not isinstance(resp, dict): + continue + username = str( + resp.get('username') or resp.get('userName') or resp.get('user') or '' + ).strip() + for file_row in resp.get('files') or []: + if not isinstance(file_row, dict): + continue + filename = str( + file_row.get('filename') + or file_row.get('fileName') + or file_row.get('path') + or '' + ).strip() + if not filename: + continue + rows.append({**file_row, 'username': username}) + return rows + + +def _normalize_search_text(text: str) -> str: + folded = unicodedata.normalize('NFKC', text) + folded = re.sub(r"[''`\u2019]", '', folded) + return re.sub(r'\s+', ' ', folded).strip() + + +def _alnum_only(text: str) -> str: + return re.sub(r'[^a-z0-9]+', '', _normalize_search_text(text).casefold()) + + +def _primary_title(title: str) -> str: + text = str(title or '').strip() + if ' - ' in text: + return text.split(' - ', 1)[0].strip() + return text + + +def _slskd_search_queries(song: dict[str, Any]) -> list[str]: + artists = [ + str(a).strip() for a in (song.get('artists') or [])[:2] if str(a).strip() + ] + artist = artists[0] if artists else '' + title = str(song.get('name') or '').strip() + short_title = _primary_title(title) + queries: list[str] = [] + seen: set[str] = set() + + def add(q: str) -> None: + normalized = _normalize_search_text(q) + if normalized and normalized not in seen: + seen.add(normalized) + queries.append(normalized) + + # Explo uses "title - artist" + if short_title and artist: + add(f'{short_title} - {artist}') + if title and artist and title != short_title: + add(f'{title} - {artist}') + if short_title: + add(short_title) + if artist and title: + add(f'{artist} {title}') + return queries + + +def _file_extension(filename: str) -> str: + ext = Path(filename.replace('\\', '/')).suffix.lower().lstrip('.') + return re.sub(r'[^a-z0-9]+', '', ext) + + +def _contains_keyword(song: dict[str, Any], filename: str) -> bool: + title = str(song.get('name') or '').casefold() + artist = ' '.join(str(a) for a in (song.get('artists') or [])).casefold() + content = filename.casefold() + for keyword in _FILTER_KEYWORDS: + if keyword in title or keyword in artist: + continue + if keyword in content: + return True + return False + + +def _parse_duration_seconds(value: Any) -> int: + if isinstance(value, int): + return value + text = str(value or '').strip() + if not text: + return 0 + if text.isdigit(): + return int(text) + parts = text.split(':') + try: + nums = [int(p) for p in parts] + except ValueError: + return 0 + if len(nums) == 2: + return nums[0] * 60 + nums[1] + if len(nums) == 3: + return nums[0] * 3600 + nums[1] * 60 + nums[2] + return 0 + + +def _response_has_free_slot(resp: dict[str, Any]) -> bool: + return resp.get('hasFreeUploadSlot') is True + + +def _file_is_locked(file_row: dict[str, Any]) -> bool: + if file_row.get('isLocked') is True: + return True + if file_row.get('IsLocked') is True: + return True + return False + + +def _locked_filenames(resp: dict[str, Any]) -> set[str]: + names: set[str] = set() + for file_row in resp.get('lockedFiles') or []: + if not isinstance(file_row, dict): + continue + filename = str( + file_row.get('filename') + or file_row.get('fileName') + or file_row.get('path') + or '' + ).strip() + if filename: + names.add(filename.casefold()) + return names + + +def _filter_slskd_responses( + responses: list[dict[str, Any]], +) -> list[dict[str, Any]]: + """Drop peers without a free upload slot (slskd UI: hide no free slots).""" + return [r for r in responses if _response_has_free_slot(r)] + + +def _collect_matching_files( + song: dict[str, Any], responses: list[dict[str, Any]] +) -> list[dict[str, Any]]: + artist = _alnum_only( + ' '.join(str(a) for a in (song.get('artists') or [])[:1]) + ) + album = _alnum_only(str(song.get('album_name') or '')) + title = _alnum_only(_primary_title(str(song.get('name') or ''))) + target_duration = int(song.get('duration') or 0) + if target_duration > 1000: + target_duration = target_duration // 1000 + matches: list[dict[str, Any]] = [] + + for resp in _filter_slskd_responses(responses): + if int(resp.get('fileCount') or 0) <= 0: + continue + username = str(resp.get('username') or '').strip() + locked_names = _locked_filenames(resp) + for file_row in resp.get('files') or []: + if not isinstance(file_row, dict): + continue + if _file_is_locked(file_row): + continue + filename = str( + file_row.get('filename') + or file_row.get('fileName') + or file_row.get('path') + or '' + ).strip() + if not filename: + continue + if filename.casefold() in locked_names: + continue + ext = _file_extension(filename) + if ext and ext not in _AUDIO_EXTENSIONS: + continue + if _contains_keyword(song, filename): + continue + length = _parse_duration_seconds( + file_row.get('length') or file_row.get('duration') + ) + if target_duration and length and abs(target_duration - length) > 10: + continue + sanitized_name = _alnum_only(filename) + if not ( + (artist and artist in sanitized_name) + or (album and album in sanitized_name) + ): + continue + if title and title not in sanitized_name: + continue + matches.append({**file_row, 'username': username, 'filename': filename}) + return matches + + +def _filter_by_quality( + files: list[dict[str, Any]], settings: dict[str, Any] +) -> list[dict[str, Any]]: + raw_ext = settings.get('extensions') or ['mp3', 'flac'] + extensions = [ + str(e).strip().lower().lstrip('.') + for e in raw_ext + if str(e).strip() + ] or ['mp3', 'flac'] + min_bitrate = int(settings.get('min_bitrate') or 0) + max_files = int(settings.get('download_attempts') or 3) + filtered: list[dict[str, Any]] = [] + for ext in extensions: + for file_row in files: + if _file_extension(str(file_row.get('filename') or '')) != ext: + continue + try: + bitrate = int(file_row.get('bitRate') or file_row.get('bitrate') or 0) + except (TypeError, ValueError): + bitrate = 0 + if min_bitrate and bitrate and bitrate < min_bitrate: + continue + filtered.append(file_row) + if len(filtered) >= max_files: + return filtered + return filtered + + +def _file_basename(filename: str) -> str: + return Path(str(filename or '').replace('\\', '/')).name + + +def _paths_match(left: str, right: str) -> bool: + if not left or not right: + return False + if left == right: + return True + return _file_basename(left).casefold() == _file_basename(right).casefold() + + +def _extract_directory_paths(data: Any) -> list[str]: + paths: list[str] = [] + + def walk(node: Any) -> None: + if isinstance(node, dict): + directories = node.get('directories') + if isinstance(directories, dict): + for key in ('downloads', 'incomplete', 'download'): + raw = directories.get(key) + if isinstance(raw, str) and raw.strip(): + paths.append(raw.strip()) + for value in node.values(): + walk(value) + elif isinstance(node, list): + for item in node: + walk(item) + + walk(data) + out: list[str] = [] + seen: set[str] = set() + for raw in paths: + if raw not in seen: + seen.add(raw) + out.append(raw) + return out + + +def _search_roots( + settings: dict[str, Any], client: SlskdClient +) -> list[Path]: + roots: list[Path] = [] + seen: set[str] = set() + for raw in ( + settings.get('source_dir'), + settings.get('output_dir'), + settings.get('download_dir'), + *client.remote_download_directories(), + ): + text = str(raw or '').strip() + if not text or text in seen: + continue + seen.add(text) + roots.append(Path(text)) + return roots + + +def _parse_soulseek_path(filename: str) -> tuple[str, str]: + normalized = filename.replace('\\', '/') + parent = Path(normalized).parent + parent_name = '' if str(parent) in ('.', '/') else parent.name + return Path(normalized).name, parent_name + + +def _transfer_failed(status: dict[str, Any]) -> bool: + state = str(status.get('state') or '') + return 'Errored' in state or 'Cancelled' in state or 'Aborted' in state + + +def _transfer_succeeded(status: dict[str, Any]) -> bool: + state = str(status.get('state') or '') + remaining = int(status.get('bytesRemaining') or 0) + percent = float(status.get('percentComplete') or 0) + return ( + remaining == 0 + or percent >= 100 + or 'Succeeded' in state + or 'Completed' in state + ) + + +def _slskd_transfer_progress_pct( + *, + transfer: Optional[dict[str, Any]] = None, + on_disk_bytes: int = 0, + expected_size: int = 0, + poll_attempt: int = 0, +) -> tuple[float, str]: + """Map an active slskd transfer to overall job progress (40–92%).""" + + lo, hi = 40.0, 92.0 + span = hi - lo + if transfer: + try: + pct_complete = float(transfer.get('percentComplete') or 0) + except (TypeError, ValueError): + pct_complete = 0.0 + if 0 < pct_complete <= 100: + return lo + span * (pct_complete / 100.0), 'Downloading' + try: + transferred = int(transfer.get('bytesTransferred') or 0) + size = int(transfer.get('size') or 0) or int(expected_size or 0) + except (TypeError, ValueError): + transferred = 0 + size = 0 + if size > 0 and transferred >= 0: + ratio = min(1.0, transferred / size) + return lo + span * ratio, 'Downloading' + if expected_size > 0 and on_disk_bytes > 0: + ratio = min(1.0, on_disk_bytes / expected_size) + return lo + span * ratio, 'Downloading' + fallback = lo + min(span * 0.12, max(0, poll_attempt) * 0.4) + return min(hi - 4.0, fallback), 'Waiting for slskd' + + +def _normalize_token(text: str) -> str: + folded = unicodedata.normalize('NFKD', text) + stripped = ''.join(ch for ch in folded if not unicodedata.combining(ch)) + return re.sub(r'\s+', ' ', stripped).casefold().strip() + + +def _disk_complete(path: Path, expected_size: int) -> bool: + try: + size = path.stat().st_size + except OSError: + return False + if expected_size > 0: + return size >= int(expected_size * 0.95) + return size > 50_000 + + +def _find_on_disk( + roots: list[Path], + soulseek_filename: str, + *, + username: str = '', + min_size: int = 1, +) -> Optional[Path]: + basename, parent = _parse_soulseek_path(soulseek_filename) + if not basename: + return None + relative_candidates: list[Path] = [Path(basename)] + if parent: + relative_candidates.append(Path(parent) / basename) + if username: + relative_candidates.append(Path(username) / basename) + if parent: + relative_candidates.append(Path(username) / parent / basename) + + for root in roots: + if not root.exists(): + continue + for rel in relative_candidates: + candidate = root / rel + if candidate.is_file() and candidate.stat().st_size >= min_size: + return candidate + + best: Optional[Path] = None + best_mtime = 0.0 + for root in roots: + if not root.exists(): + continue + try: + matches = list(root.rglob(basename)) + except OSError: + continue + for candidate in matches: + if not candidate.is_file(): + continue + try: + size = candidate.stat().st_size + mtime = candidate.stat().st_mtime + except OSError: + continue + if size < min_size: + continue + if mtime >= best_mtime: + best = candidate + best_mtime = mtime + return best + + +def _find_on_disk_for_song( + roots: list[Path], + song: dict[str, Any], + soulseek_filename: str, + *, + username: str = '', + expected_size: int = 0, + extensions: Optional[frozenset[str]] = None, +) -> Optional[Path]: + min_size = max(1, int(expected_size * 0.95) if expected_size else 1) + found = _find_on_disk( + roots, + soulseek_filename, + username=username, + min_size=min_size, + ) + if found is not None: + return found + + title = _normalize_token(str(song.get('name') or '')) + if len(title) < 3: + return None + exts = extensions or _AUDIO_EXTENSIONS + best: Optional[Path] = None + best_mtime = 0.0 + for root in roots: + if not root.exists(): + continue + for ext in exts: + pattern = ext if ext.startswith('.') else f'.{ext}' + try: + matches = list(root.rglob(f'*{pattern}')) + except OSError: + continue + for candidate in matches: + if not candidate.is_file(): + continue + if title not in _normalize_token(candidate.name): + continue + try: + size = candidate.stat().st_size + mtime = candidate.stat().st_mtime + except OSError: + continue + if size < min_size: + continue + if mtime >= best_mtime: + best = candidate + best_mtime = mtime + return best + + +def _copy_to_output(src: Path, output_dir: Path) -> Path: + output_dir.mkdir(parents=True, exist_ok=True) + dest = output_dir / src.name + if dest.resolve() != src.resolve(): + shutil.copy2(src, dest) + return dest + + +def _resolve_downloaded_file( + roots: list[Path], + output_dir: Path, + song: dict[str, Any], + soulseek_filename: str, + *, + username: str, + leave_in_place: bool, + expected_size: int = 0, +) -> Optional[Path]: + found = _find_on_disk_for_song( + roots, + song, + soulseek_filename, + username=username, + expected_size=expected_size, + ) + if found is None: + return None + if leave_in_place: + return found + return _copy_to_output(found, output_dir) + + +def _finalize_slskd_path(found: Path, output_dir: Path, leave_in_place: bool) -> Path: + if leave_in_place: + return found + return _copy_to_output(found, output_dir) + + +def _wait_for_slskd_file( + client: SlskdClient, + song: dict[str, Any], + username: str, + filename: str, + settings: dict[str, Any], + roots: list[Path], + *, + expected_size: int = 0, + progress_cb: Optional[ProgressCallback] = None, + deadline: Optional[float] = None, +) -> Optional[Path]: + """Wait for slskd to finish, then return the file path on disk (if found).""" + interval = _int_setting( + settings, 'poll_interval_seconds', 5, minimum=1, maximum=30 + ) + attempts = _int_setting( + settings, 'poll_max_attempts', 60, minimum=1, maximum=300 + ) + queued_timeout = _int_setting( + settings, + 'queued_timeout_seconds', + _DEFAULT_QUEUED_TIMEOUT_SECONDS, + minimum=15, + maximum=3600, + ) + wait_started = time.monotonic() + last_bytes = -1 + last_progress = wait_started + last_reported_pct = -1.0 + + for attempt in range(max(1, attempts)): + if deadline is not None and _past_deadline(deadline): + logger.info( + 'slskd: download timeout while waiting for file title={!r} ' + 'user={!r} file={!r}', + song.get('name'), + username, + _file_basename(filename)[:120], + ) + return None + found = _find_on_disk_for_song( + roots, + song, + filename, + username=username, + expected_size=expected_size, + ) + on_disk_bytes = 0 + if found is not None: + try: + on_disk_bytes = found.stat().st_size + except OSError: + on_disk_bytes = 0 + if _disk_complete(found, expected_size): + if progress_cb is not None: + progress_cb(92.0, 'Downloading') + return found + + transfer = client.find_transfer(username, filename) + if transfer: + try: + expected_size = max( + expected_size, int(transfer.get('size') or 0) + ) + except (TypeError, ValueError): + pass + if _transfer_failed(transfer): + return None + transferred = int(transfer.get('bytesTransferred') or 0) + if transferred > last_bytes: + last_bytes = transferred + last_progress = time.monotonic() + elif time.monotonic() - last_progress > queued_timeout: + logger.info( + 'slskd: stalled (no progress) title={!r} user={!r} ' + 'bytes={} state={!r}', + song.get('name'), + username, + transferred, + transfer.get('state'), + ) + return None + elif time.monotonic() - wait_started > queued_timeout: + logger.info( + 'slskd: queued timeout (transfer not started) title={!r} ' + 'user={!r} file={!r}', + song.get('name'), + username, + _file_basename(filename)[:120], + ) + return None + + if progress_cb is not None: + pct, message = _slskd_transfer_progress_pct( + transfer=transfer, + on_disk_bytes=on_disk_bytes, + expected_size=expected_size, + poll_attempt=attempt, + ) + if pct > last_reported_pct or attempt == 0: + last_reported_pct = pct + progress_cb(pct, message) + + time.sleep(max(1, interval)) + + return _find_on_disk_for_song( + roots, + song, + filename, + username=username, + expected_size=expected_size, + ) + + +def download_from_slskd( + song: dict[str, Any], + settings: dict[str, Any], + progress_cb: Optional[ProgressCallback] = None, +) -> Optional[Path]: + if not bool(settings.get('enabled')): + return None + client = SlskdClient(settings) + if not client.configured(): + logger.info('slskd: missing configuration title={!r}', song.get('name')) + return None + if not client.can_connect(): + logger.info('slskd: connectivity check failed base_url={!r}', client.base_url) + return None + + output_dir = Path(str(settings.get('output_dir') or settings.get('download_dir') or '/downloads')) + source_dir = Path( + str(settings.get('source_dir') or settings.get('download_dir') or output_dir) + ) + leave_in_place = bool(settings.get('leave_in_place', True)) + queries = _slskd_search_queries(song) + if not queries: + return None + + label = f"{song.get('name')} - {', '.join(song.get('artists') or [])}" + + def report(pct: float, message: str) -> None: + if progress_cb is not None: + try: + progress_cb(pct, message) + except Exception: + logger.opt(exception=True).debug('slskd progress callback error') + + deadline = _slskd_deadline(settings) + report(2.0, 'Searching slskd') + + with _SLSKD_LOCK: + search_id = '' + responses: list[dict[str, Any]] = [] + used_query = '' + for query in queries: + if _past_deadline(deadline): + logger.info( + 'slskd: download timeout during search title={!r}', + song.get('name'), + ) + return None + report(8.0, 'Searching slskd') + search_id = client.start_search(query) or '' + if not search_id: + continue + if not client.wait_search_complete( + search_id, + label, + on_poll=lambda pct: report(pct, 'Searching slskd'), + deadline=deadline, + ): + client.delete_search(search_id) + search_id = '' + continue + raw_responses = client.search_responses(search_id) + responses = _filter_slskd_responses(raw_responses) + if responses: + used_query = query + break + client.delete_search(search_id) + search_id = '' + + if not responses: + logger.info( + 'slskd: no results title={!r} queries={}', + song.get('name'), + queries[:6], + ) + if search_id: + client.delete_search(search_id) + return None + + candidates = _collect_matching_files(song, responses) + if not candidates: + logger.info( + 'slskd: no matching audio files title={!r} q={!r} responses={}', + song.get('name'), + used_query[:120], + len(responses), + ) + client.delete_search(search_id) + return None + + files = _filter_by_quality(candidates, settings) + if not files: + logger.info( + 'slskd: no files passed quality filters title={!r}', + song.get('name'), + ) + client.delete_search(search_id) + return None + + queued: Optional[dict[str, Any]] = None + for file_row in files: + if client.enqueue_download(file_row): + queued = file_row + break + + if queued is None: + logger.info('slskd: failed to enqueue title={!r}', song.get('name')) + client.delete_search(search_id) + return None + + if _past_deadline(deadline): + client.delete_search(search_id) + logger.info( + 'slskd: download timeout before transfer title={!r}', + song.get('name'), + ) + return None + + report(36.0, 'Queued on slskd') + username = str(queued.get('username') or '') + filename = str(queued.get('filename') or '') + try: + queued_size = int(queued.get('size') or 0) + except (TypeError, ValueError): + queued_size = 0 + roots = _search_roots(settings, client) + + def _root_key(path: Path) -> str: + try: + return str(path.resolve()) + except OSError: + return str(path) + + root_keys = {_root_key(r) for r in roots} + if _root_key(source_dir) not in root_keys: + roots.insert(0, source_dir) + if _root_key(output_dir) not in root_keys: + roots.append(output_dir) + + found = _wait_for_slskd_file( + client, + song, + username, + filename, + settings, + roots, + expected_size=queued_size, + progress_cb=progress_cb, + deadline=deadline, + ) + client.delete_search(search_id) + + if found is None: + found = _resolve_downloaded_file( + roots, + output_dir, + song, + filename, + username=username, + leave_in_place=leave_in_place, + expected_size=queued_size, + ) + else: + found = _finalize_slskd_path(found, output_dir, leave_in_place) + + if found is None: + remote_dirs = client.remote_download_directories() + logger.info( + 'slskd: file not found after transfer title={!r} searched={} ' + 'slskd_dirs={} file={!r} user={!r}', + song.get('name'), + [str(p) for p in roots], + remote_dirs, + _file_basename(filename), + username, + ) + return found diff --git a/downtify/spotify.py b/downtify/spotify.py index 4e50278..19d43e0 100644 --- a/downtify/spotify.py +++ b/downtify/spotify.py @@ -422,7 +422,7 @@ def _track_dict( album_name or fallback_album, entity.get('releaseDate'), ) - return { + row: dict[str, Any] = { 'song_id': track_id, 'name': entity.get('name') or entity.get('title') or '', 'artists': names, @@ -438,6 +438,99 @@ def _track_dict( 'year': year, 'source': 'spotify', } + raw_tn = entity.get('trackNumber') + if raw_tn is None: + raw_tn = entity.get('track_number') + if raw_tn is not None: + try: + tn = int(raw_tn) + except (TypeError, ValueError): + tn = 0 + if tn > 0: + row['track_number'] = tn + if isinstance(album, dict): + raw_total = album.get('trackCount') + if raw_total is None and isinstance(album.get('tracks'), dict): + raw_total = album['tracks'].get('total') + if raw_total is not None: + try: + tt = int(raw_total) + except (TypeError, ValueError): + tt = 0 + if tt > 0: + row['album_track_total'] = tt + return row + + +def _merge_full_track_metadata( + song: dict[str, Any], full: dict[str, Any] +) -> dict[str, Any]: + """Apply per-track embed fields onto a sparse playlist/browse row.""" + + merged = dict(song) + for key in ( + 'cover_url', + 'year', + 'release_date', + 'album_name', + 'artists', + 'artist', + 'track_number', + 'album_track_total', + ): + value = full.get(key) + if value is None or value == '' or value == []: + continue + if key in ('track_number', 'album_track_total'): + if merged.get(key) is not None: + continue + try: + iv = int(value) + except (TypeError, ValueError): + continue + if iv <= 0: + continue + merged[key] = iv + continue + if key == 'artists': + if merged.get('artists'): + continue + merged['artists'] = value + merged['artist'] = full.get('artist') or ', '.join(value) + continue + merged[key] = value + return merged + + +def enrich_track_from_spotify_if_sparse(song: dict[str, Any]) -> dict[str, Any]: + """Fill missing Spotify tagging fields from the per-track embed. + + Playlist browse rows often omit ``year``, ``release_date``, and + ``track_number``; monitored playlists re-fetch each track the same way. + """ + + if song.get('source') != 'spotify': + return song + track_id = song.get('song_id') + if not isinstance(track_id, str) or not re.fullmatch( + r'[A-Za-z0-9]{22}', track_id + ): + return song + has_date = bool( + str(song.get('release_date') or '').strip() + or str(song.get('year') or '').strip() + ) + has_track = song.get('track_number') is not None + if has_date and has_track: + return song + try: + full = track_from_id(track_id) + except Exception: + logger.opt(exception=True).debug( + 'Per-track Spotify enrich failed for {}', track_id + ) + return song + return _merge_full_track_metadata(song, full) def track_from_id(track_id: str) -> dict[str, Any]: diff --git a/downtify/track_index.py b/downtify/track_index.py new file mode 100644 index 0000000..5e5f9c5 --- /dev/null +++ b/downtify/track_index.py @@ -0,0 +1,195 @@ +"""Global Spotify track id → library file mapping for cross-playlist deduplication.""" + +from __future__ import annotations + +import re +import sqlite3 +from datetime import datetime, timezone +from pathlib import Path +from typing import Any, Optional + +from .library_paths import ( + library_stored_path, + locate_library_file, + slskd_dir_from_downloader, +) + +_SPOTIFY_TRACK_ID = re.compile(r'^[a-zA-Z0-9]{22}$') +_SPOTIFY_TRACK_URL = re.compile( + r'(?:open\.spotify\.com|spotify\.com)/track/([a-zA-Z0-9]{22})' +) + + +def normalize_spotify_track_id(song: dict[str, Any]) -> Optional[str]: + """Return a 22-char Spotify track id when ``song`` has one, else ``None``.""" + + raw = str(song.get('song_id') or '').strip() + if not raw: + url = str(song.get('url') or '').strip() + if url: + raw = url + else: + return None + if raw.startswith('spotify:track:'): + raw = raw.rsplit(':', 1)[-1] + else: + match = _SPOTIFY_TRACK_URL.search(raw) + if match: + raw = match.group(1) + if _SPOTIFY_TRACK_ID.fullmatch(raw): + return raw + return None + + +def _now_iso() -> str: + return datetime.now(timezone.utc).isoformat() + + +class TrackIndex: + """SQLite index: one canonical relative path per Spotify track id.""" + + def __init__(self, db_path: Path) -> None: + self._path = str(db_path) + self._init_db() + + def _connect(self) -> sqlite3.Connection: + conn = sqlite3.connect(self._path, check_same_thread=False) + conn.row_factory = sqlite3.Row + return conn + + def _init_db(self) -> None: + with self._connect() as conn: + conn.execute(""" + CREATE TABLE IF NOT EXISTS library_tracks ( + spotify_track_id TEXT PRIMARY KEY, + filename TEXT NOT NULL, + registered_at TEXT NOT NULL + ) + """) + + def lookup(self, spotify_track_id: str) -> Optional[str]: + tid = str(spotify_track_id or '').strip() + if not _SPOTIFY_TRACK_ID.fullmatch(tid): + return None + with self._connect() as conn: + row = conn.execute( + 'SELECT filename FROM library_tracks WHERE spotify_track_id = ?', + (tid,), + ).fetchone() + if row is None: + return None + return str(row['filename']) + + def lookup_song(self, song: dict[str, Any]) -> Optional[str]: + tid = normalize_spotify_track_id(song) + if not tid: + return None + return self.lookup(tid) + + def register(self, spotify_track_id: str, filename: str) -> None: + tid = str(spotify_track_id or '').strip() + name = str(filename or '').strip().replace('\\', '/') + if not _SPOTIFY_TRACK_ID.fullmatch(tid) or not name: + return + with self._connect() as conn: + row = conn.execute( + 'SELECT filename FROM library_tracks WHERE spotify_track_id = ?', + (tid,), + ).fetchone() + if row is not None: + existing = str(row['filename']) + if existing == name: + return + # Keep the first canonical path; callers drop stale rows via forget(). + return + conn.execute( + """INSERT INTO library_tracks + (spotify_track_id, filename, registered_at) + VALUES (?, ?, ?) + ON CONFLICT(spotify_track_id) DO UPDATE SET + filename=excluded.filename, + registered_at=excluded.registered_at""", + (tid, name, _now_iso()), + ) + + def register_song(self, song: dict[str, Any], filename: str) -> None: + tid = normalize_spotify_track_id(song) + if tid: + self.register(tid, filename) + + def list_filenames(self) -> list[str]: + with self._connect() as conn: + rows = conn.execute( + 'SELECT filename FROM library_tracks ORDER BY filename' + ).fetchall() + return [ + str(row['filename']).replace('\\', '/') + for row in rows + if row['filename'] + ] + + def forget(self, spotify_track_id: str) -> None: + tid = str(spotify_track_id or '').strip() + if not _SPOTIFY_TRACK_ID.fullmatch(tid): + return + with self._connect() as conn: + conn.execute( + 'DELETE FROM library_tracks WHERE spotify_track_id = ?', + (tid,), + ) + + def backfill_from_monitor_db(self, monitor_db_path: Path) -> int: + """Import rows from monitored-playlist history (best-effort, idempotent).""" + + path = Path(monitor_db_path) + if not path.is_file(): + return 0 + imported = 0 + with sqlite3.connect(str(path)) as src: + try: + rows = src.execute( + """SELECT track_spotify_id, filename + FROM downloaded_tracks + WHERE filename IS NOT NULL AND filename != ''""" + ).fetchall() + except sqlite3.Error: + return 0 + for track_id, filename in rows: + tid = str(track_id or '').strip() + if not _SPOTIFY_TRACK_ID.fullmatch(tid): + continue + before = self.lookup(tid) + self.register(tid, str(filename)) + if before != str(filename): + imported += 1 + return imported + + +def resolve_existing_download( + downloader: Any, + song: dict[str, Any], + *, + subdir: Optional[str] = None, + track_index: Optional[TrackIndex] = None, +) -> Optional[tuple[str, str]]: + """Return ``(relative_filename, skip_message)`` when a file already exists.""" + + download_dir = Path(downloader.download_dir) + slskd_dir = slskd_dir_from_downloader(downloader) + + if track_index is not None: + tid = normalize_spotify_track_id(song) + if tid: + canonical = track_index.lookup(tid) + if canonical: + if locate_library_file(canonical, download_dir, slskd_dir): + return canonical, 'Already in library' + track_index.forget(tid) + + local = downloader.existing_filename_for(song, subdir=subdir) + if local and locate_library_file(local, download_dir, slskd_dir): + if track_index is not None: + track_index.register_song(song, local) + return local, 'Already on disk' + + return None diff --git a/frontend/dist/assets/index-BBbJCvCI.css b/frontend/dist/assets/index-BBbJCvCI.css new file mode 100644 index 0000000..54cddc0 --- /dev/null +++ b/frontend/dist/assets/index-BBbJCvCI.css @@ -0,0 +1 @@ +@import"https://rsms.me/inter/inter.css";.page-enter-active,.page-leave-active{transition:opacity .25s ease,transform .25s ease}.page-enter-from,.page-leave-to{opacity:0;transform:translateY(8px)}.player-range[data-v-98956c70]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#ffffff1a;height:4px;border-radius:9999px;outline:none}[data-theme=downtify-light] .player-range[data-v-98956c70]{background:#0000001a}.player-range[data-v-98956c70]::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;height:14px;width:14px;border-radius:9999px;background:#1ad05c;cursor:pointer;box-shadow:0 0 12px #1ad05c73}.player-range[data-v-98956c70]::-moz-range-thumb{height:14px;width:14px;border-radius:9999px;background:#1ad05c;border:none;cursor:pointer;box-shadow:0 0 12px #1ad05c73}.pulse-glow[data-v-98956c70]{animation:glow-98956c70 2.4s ease-in-out infinite}@keyframes glow-98956c70{0%,to{box-shadow:0 0 36px #1ad05c4d}50%{box-shadow:0 0 60px #1ad05c8c}}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color: oklch(0% 0 0)){:root{color-scheme:light;--fallback-p: #491eff;--fallback-pc: #d4dbff;--fallback-s: #ff41c7;--fallback-sc: #fff9fc;--fallback-a: #00cfbd;--fallback-ac: #00100d;--fallback-n: #2b3440;--fallback-nc: #d7dde4;--fallback-b1: #ffffff;--fallback-b2: #e5e6e6;--fallback-b3: #e5e6e6;--fallback-bc: #1f2937;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--fallback-p: #7582ff;--fallback-pc: #050617;--fallback-s: #ff71cf;--fallback-sc: #190211;--fallback-a: #00c7b5;--fallback-ac: #000e0c;--fallback-n: #2a323c;--fallback-nc: #a6adbb;--fallback-b1: #1d232a;--fallback-b2: #191e24;--fallback-b3: #15191e;--fallback-bc: #a6adbb;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,transparent) transparent}*:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,transparent) transparent}:root{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 19.4918% .049187 153.969854;--s: 71.366% .019176 261.324645;--sc: 14.4788% 0 0;--a: 75.0492% .208056 148.653144;--ac: 19.4918% .049187 153.969854;--n: 18.2204% 0 0;--nc: 92.7582% .005814 264.531291;--b1: 20.9036% 0 0;--b2: 17.7638% 0 0;--b3: 0% 0 0;--bc: 96.7434% .001326 286.375246;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}[data-theme=downtify-dark]{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 19.4918% .049187 153.969854;--s: 71.366% .019176 261.324645;--sc: 14.4788% 0 0;--a: 75.0492% .208056 148.653144;--ac: 19.4918% .049187 153.969854;--n: 18.2204% 0 0;--nc: 92.7582% .005814 264.531291;--b1: 20.9036% 0 0;--b2: 17.7638% 0 0;--b3: 0% 0 0;--bc: 96.7434% .001326 286.375246;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}[data-theme=downtify-light]{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 100% 0 0;--s: 47.8359% 0 0;--sc: 100% 0 0;--a: 74.4235% .210286 148.118822;--ac: 100% 0 0;--n: 23.9292% 0 0;--nc: 96.7434% .001326 286.375246;--b1: 100% 0 0;--b2: 97.2666% .001711 247.839212;--b3: 94.2414% .004574 258.325042;--bc: 20.7682% .039824 265.754874;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}html,body{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"cv02","cv03","cv04","cv11"}body{background-image:radial-gradient(circle at 0% 0%,rgba(26,208,92,.15),transparent 45%),radial-gradient(circle at 100% 0%,rgba(26,208,92,.08),transparent 55%),radial-gradient(circle at 50% 100%,rgba(26,208,92,.07),transparent 60%);background-attachment:fixed;min-height:100dvh}[data-theme=downtify-light] body{background-image:radial-gradient(circle at 0% 0%,rgba(26,208,92,.18),transparent 35%),radial-gradient(circle at 100% 0%,rgba(26,208,92,.12),transparent 45%),radial-gradient(circle at 50% 100%,rgba(26,208,92,.08),transparent 55%)}::selection{background-color:#1ad05c59;color:#fff}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#ffffff14;border-radius:9999px}::-webkit-scrollbar-thumb:hover{background:#1ad05c73}[data-theme=downtify-light] ::-webkit-scrollbar-thumb{background:#0000001f}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.avatar.placeholder>div{display:flex;align-items:center;justify-content:center}@media (hover:hover){.checkbox-primary:hover{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.label a:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-color:transparent;border-color:oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn, 1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));--tw-bg-opacity: 1;--tw-border-opacity: 1}.btn-disabled,.btn[disabled],.btn:disabled{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box, 1rem)}.card:focus{outline:2px solid transparent;outline-offset:2px}.card figure{display:flex;align-items:center;justify-content:center}.card.image-full{display:grid}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;object-fit:cover}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.checkbox{flex-shrink:0;--chkbg: var(--fallback-bc,oklch(var(--bc)/1));--chkfg: var(--fallback-b1,oklch(var(--b1)/1));height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2}.diff{position:relative;display:grid;width:100%;overflow:hidden;direction:ltr;container-type:inline-size;grid-template-columns:auto 1fr}@media (hover: hover){.btm-nav>*.disabled:hover,.btm-nav>*[disabled]:hover{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:hover{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,black)}}@supports not (color: oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn.glass:hover{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost:hover{border-color:transparent}@supports (color: oklch(0% 0 0)){.btn-ghost:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}}.btn-outline.btn-primary:hover{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.btn-outline.btn-secondary:hover{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-secondary:hover{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}}.btn-outline.btn-accent:hover{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-accent:hover{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn-disabled:hover,.btn[disabled]:hover,.btn:disabled:hover{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}@supports (color: color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}}.footer{display:grid;width:100%;grid-auto-flow:row;place-items:start;column-gap:1rem;row-gap:2.5rem;font-size:.875rem;line-height:1.25rem}.footer>*{display:grid;place-items:start;gap:.5rem}@media (min-width: 48rem){.footer{grid-auto-flow:column}.footer-center{grid-auto-flow:row dense}}.label{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.hero{display:grid;width:100%;place-items:center;background-size:cover;background-position:center}.hero>*{grid-column-start:1;grid-row-start:1}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input[type=number]::-webkit-inner-spin-button,.input-md[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.input-sm[type=number]::-webkit-inner-spin-button{margin-top:0;margin-bottom:0;margin-inline-end:-0px}.join{display:inline-flex;align-items:stretch;border-radius:var(--rounded-btn, .5rem)}.join :where(.join-item){border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:not(:first-child):not(:last-child),.join *:not(:first-child):not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0}.join .dropdown .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .dropdown .join-item{border-start-end-radius:inherit;border-end-end-radius:inherit}.join :where(.join-item:first-child:not(:last-child)),.join :where(*:first-child:not(:last-child) .join-item){border-end-start-radius:inherit;border-start-start-radius:inherit}.join .join-item:last-child:not(:first-child),.join *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0}.join :where(.join-item:last-child:not(:first-child)),.join :where(*:last-child:not(:first-child) .join-item){border-start-end-radius:inherit;border-end-end-radius:inherit}@supports not selector(:has(*)){:where(.join *){border-radius:inherit}}@supports selector(:has(*)){:where(.join *:has(.join-item)){border-radius:inherit}}.link{cursor:pointer;text-decoration-line:underline}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}.modal{pointer-events:none;position:fixed;top:0;right:0;bottom:0;left:0;margin:0;display:grid;height:100%;max-height:none;width:100%;max-width:none;justify-items:center;padding:0;opacity:0;overscroll-behavior:contain;z-index:999;background-color:transparent;color:inherit;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity,visibility;overflow-y:hidden}:where(.modal){align-items:center}.modal-box{max-height:calc(100vh - 5em);grid-column-start:1;grid-row-start:1;width:91.666667%;max-width:32rem;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));padding:1.5rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;box-shadow:#00000040 0 25px 50px -12px;overflow-y:auto;overscroll-behavior:contain}.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open]{pointer-events:auto;visibility:visible;opacity:1}.modal-toggle{position:fixed;height:0px;width:0px;-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden;scrollbar-gutter:stable}.progress{position:relative;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:hidden;height:.5rem;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.radial-progress{position:relative;display:inline-grid;height:var(--size);width:var(--size);place-content:center;border-radius:9999px;background-color:transparent;vertical-align:middle;box-sizing:content-box;--value: 0;--size: 5rem;--thickness: calc(var(--size) / 10)}.radial-progress::-moz-progress-bar{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress::-webkit-progress-value{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress::-webkit-progress-bar{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress:before,.radial-progress:after{position:absolute;border-radius:9999px;content:""}.radial-progress:before{top:0;right:0;bottom:0;left:0;background:radial-gradient(farthest-side,currentColor 98%,#0000) top/var(--thickness) var(--thickness) no-repeat,conic-gradient(currentColor calc(var(--value) * 1%),#0000 0);-webkit-mask:radial-gradient(farthest-side,#0000 calc(99% - var(--thickness)),#000 calc(100% - var(--thickness)));mask:radial-gradient(farthest-side,#0000 calc(99% - var(--thickness)),#000 calc(100% - var(--thickness)))}.radial-progress:after{inset:calc(50% - var(--thickness) / 2);transform:rotate(calc(var(--value) * 3.6deg - 90deg)) translate(calc(var(--size) / 2 - 50%));background-color:currentColor}.range{height:1.5rem;width:100%;cursor:pointer;-moz-appearance:none;appearance:none;-webkit-appearance:none;--range-shdw: var(--fallback-bc,oklch(var(--bc)/1));overflow:hidden;border-radius:var(--rounded-box, 1rem);background-color:transparent}.range:focus{outline:none}.select{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;min-height:3rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-size:4px 4px,4px 4px;background-repeat:no-repeat}.select[multiple]{height:auto}.steps .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-columns:auto;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-rows:40px 1fr;place-items:center;text-align:center;min-width:4rem}.toggle{flex-shrink:0;--tglbg: var(--fallback-b1,oklch(var(--b1)/1));--handleoffset: 1.5rem;--handleoffsetcalculator: calc(var(--handleoffset) * -1);--togglehandleborder: 0 0;height:1.5rem;width:3rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;border-color:currentColor;background-color:currentColor;color:var(--fallback-bc,oklch(var(--bc)/.5));transition:background,box-shadow var(--animation-input, .2s) ease-out;box-shadow:var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset,var(--togglehandleborder)}.btm-nav>*:where(.active){border-top-width:2px;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.btm-nav>*.disabled,.btm-nav>*[disabled]{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}@media (prefers-reduced-motion: no-preference){.btn{animation:button-pop var(--animation-btn, .25s) ease-out}}.btn:active:hover,.btn:active:focus{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale, .97))}@supports not (color: oklch(0% 0 0)){.btn{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}.btn-primary{--btn-color: var(--fallback-p)}.btn-secondary{--btn-color: var(--fallback-s)}.btn-accent{--btn-color: var(--fallback-a)}}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}.btn-outline.btn-secondary.btn-active{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}.btn-outline.btn-accent.btn-active{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color: oklch(0% 0 0)){.btn-primary{--btn-color: var(--p)}.btn-secondary{--btn-color: var(--s)}.btn-accent{--btn-color: var(--a)}}.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)));outline-color:var(--fallback-s,oklch(var(--s)/1))}.btn-accent{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)));outline-color:var(--fallback-a,oklch(var(--a)/1))}.btn.glass{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost{border-width:1px;border-color:transparent;background-color:transparent;color:currentColor;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn-ghost.btn-active{border-color:transparent;background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.btn-outline.btn-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.btn-outline.btn-secondary.btn-active{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.btn-outline.btn-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.btn-outline.btn-accent.btn-active{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn[disabled],.btn:disabled{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale, .98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.checkbox:disabled{border-width:0px;cursor:not-allowed;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.2}.checkbox:checked,.checkbox[aria-checked=true]{background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,transparent 65%,var(--chkbg) 65.99%),linear-gradient(45deg,transparent 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,transparent 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,transparent 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%)}.checkbox:indeterminate{--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-image:linear-gradient(90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(-90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%)}.checkbox-primary{--chkbg: var(--fallback-p,oklch(var(--p)/1));--chkfg: var(--fallback-pc,oklch(var(--pc)/1));--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.checkbox-primary:focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}.checkbox-primary:checked,.checkbox-primary[aria-checked=true]{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}.input input{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:transparent}.input input:focus{outline:2px solid transparent;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input:focus,.input:focus-within{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:has(>input[disabled]),.input-disabled,.input:disabled,.input[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input:has(>input[disabled])::placeholder,.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1)}.link:focus{outline:2px solid transparent;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.\!loading{pointer-events:none!important;display:inline-block!important;aspect-ratio:1 / 1!important;width:1.5rem!important;background-color:currentColor!important;-webkit-mask-size:100%!important;mask-size:100%!important;-webkit-mask-repeat:no-repeat!important;mask-repeat:no-repeat!important;-webkit-mask-position:center!important;mask-position:center!important;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important;mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important}.loading{pointer-events:none;display:inline-block;aspect-ratio:1 / 1;width:1.5rem;background-color:currentColor;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-xs{width:1rem}.loading-sm{width:1.25rem}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;left:.5rem;top:50%;aspect-ratio:1 / 1;height:.75rem;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:2px;border-color:currentColor;opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{content:"";position:absolute;left:1.25rem;top:50%;height:.5rem;--tw-translate-y: 25%;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1px;border-color:currentColor;opacity:.6}.modal:not(dialog:not(.modal-open)),.modal::backdrop{background-color:#0006;animation:modal-pop .2s ease-out}.modal-backdrop{z-index:-1;grid-column-start:1;grid-row-start:1;display:grid;align-self:stretch;justify-self:stretch;color:transparent}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y: 0px;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes modal-pop{0%{opacity:0}}.progress::-moz-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate{--progress-color: var(--fallback-bc,oklch(var(--bc)/1));background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}.progress::-webkit-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:transparent}.progress::-webkit-progress-value{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate::-moz-progress-bar{background-color:transparent;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}@keyframes progress-loading{50%{background-position-x:-115%}}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}.range:focus-visible::-webkit-slider-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range:focus-visible::-moz-range-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range::-webkit-slider-runnable-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-moz-range-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-webkit-slider-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));-moz-appearance:none;appearance:none;-webkit-appearance:none;top:50%;color:var(--range-shdw);transform:translateY(-50%);--filler-size: 100rem;--filler-offset: .6rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}.range::-moz-range-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));top:50%;color:var(--range-shdw);--filler-size: 100rem;--filler-offset: .5rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select-disabled,.select:disabled,.select[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:calc(0% + 12px) calc(1px + 50%),calc(0% + 16px) calc(1px + 50%)}.skeleton{border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));will-change:background-position;animation:skeleton 1.8s ease-in-out infinite;background-image:linear-gradient(105deg,transparent 0%,transparent 40%,var(--fallback-b1,oklch(var(--b1)/1)) 50%,transparent 60%,transparent 100%);background-size:200% auto;background-repeat:no-repeat;background-position-x:-50%}@media (prefers-reduced-motion){.skeleton{animation-duration:15s}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}.steps .step:before{top:0;grid-column-start:1;grid-row-start:1;height:.5rem;width:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));content:"";margin-inline-start:-100%}.steps .step:after{content:counter(step);counter-increment:step;z-index:1;position:relative;grid-column-start:1;grid-row-start:1;display:grid;height:2rem;width:2rem;place-items:center;place-self:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.steps .step:first-child:before{content:none}.steps .step[data-content]:after{content:attr(data-content)}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.active,.table-zebra tr.active:nth-child(2n),.table-zebra-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}[dir=rtl] .toggle{--handleoffsetcalculator: calc(var(--handleoffset) * 1)}.toggle:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.toggle:hover{background-color:currentColor}.toggle:checked,.toggle[aria-checked=true]{background-image:none;--handleoffsetcalculator: var(--handleoffset);--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}[dir=rtl] .toggle:checked,[dir=rtl] .toggle[aria-checked=true]{--handleoffsetcalculator: calc(var(--handleoffset) * -1)}.toggle:indeterminate{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}[dir=rtl] .toggle:indeterminate{box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}.toggle:disabled{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));background-color:transparent;opacity:.3;--togglehandleborder: 0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset, var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset}.btm-nav-xs>*:where(.active){border-top-width:1px}.btm-nav-sm>*:where(.active){border-top-width:2px}.btm-nav-md>*:where(.active){border-top-width:2px}.btm-nav-lg>*:where(.active){border-top-width:4px}.btn-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:.5rem;font-size:.75rem}.btn-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem}.btn-square:where(.btn-xs){height:1.5rem;width:1.5rem;padding:0}.btn-square:where(.btn-sm){height:2rem;width:2rem;padding:0}.btn-circle:where(.btn-xs){height:1.5rem;width:1.5rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-sm){height:2rem;width:2rem;border-radius:9999px;padding:0}[type=checkbox].checkbox-sm{height:1.25rem;width:1.25rem}.input-sm{height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem;line-height:2rem}.join.join-vertical{flex-direction:column}.join.join-vertical .join-item:first-child:not(:last-child),.join.join-vertical *:first-child:not(:last-child) .join-item{border-end-start-radius:0;border-end-end-radius:0;border-start-start-radius:inherit;border-start-end-radius:inherit}.join.join-vertical .join-item:last-child:not(:first-child),.join.join-vertical *:last-child:not(:first-child) .join-item{border-start-start-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-end-end-radius:inherit}.join.join-horizontal{flex-direction:row}.join.join-horizontal .join-item:first-child:not(:last-child),.join.join-horizontal *:first-child:not(:last-child) .join-item{border-end-end-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-start-start-radius:inherit}.join.join-horizontal .join-item:last-child:not(:first-child),.join.join-horizontal *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0;border-end-end-radius:inherit;border-start-end-radius:inherit}.modal-bottom{place-items:end}.select-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:2rem;font-size:.875rem;line-height:2rem}[dir=rtl] .select-sm{padding-left:2rem;padding-right:.75rem}.select-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:2rem;font-size:.75rem;line-height:1rem;line-height:1.625}[dir=rtl] .select-xs{padding-left:2rem;padding-right:.5rem}.steps-horizontal .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));place-items:center;text-align:center}.steps-vertical .step{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(1,minmax(0,1fr))}.join.join-vertical>:where(*:not(:first-child)){margin-left:0;margin-right:0;margin-top:-1px}.join.join-vertical>:where(*:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn) * -1)}.join.join-horizontal>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join.join-horizontal>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1);margin-top:0}.modal-top :where(.modal-box){width:100%;max-width:none;--tw-translate-y: -2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:0;border-top-right-radius:0}.modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}.modal-bottom :where(.modal-box){width:100%;max-width:none;--tw-translate-y: 2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:0;border-bottom-left-radius:0}.steps-horizontal .step{grid-template-rows:40px 1fr;grid-template-columns:auto;min-width:4rem}.steps-horizontal .step:before{height:.5rem;width:100%;--tw-translate-x: 0px;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));content:"";margin-inline-start:-100%}.steps-horizontal .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.steps-vertical .step{gap:.5rem;grid-template-columns:40px 1fr;grid-template-rows:auto;min-height:4rem;justify-items:start}.steps-vertical .step:before{height:100%;width:.5rem;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));margin-inline-start:50%}.steps-vertical .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.surface{border-width:1px;border-color:#ffffff0d;background-color:var(--fallback-b1,oklch(var(--b1)/.9));--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}[data-theme=downtify-light] .surface{border-color:#0000000d;background-color:#ffffffd9}.surface-strong{border-width:1px;border-color:#ffffff1a;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}[data-theme=downtify-light] .surface-strong{border-color:#0000001a;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.glass-nav{background:#121212b8;backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);border-bottom:1px solid rgba(255,255,255,.06)}[data-theme=downtify-light] .glass-nav{background:#ffffffc7;border-bottom:1px solid rgba(0,0,0,.06)}.icon-btn{display:inline-flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:9999px;color:var(--fallback-bc,oklch(var(--bc)/.8));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.icon-btn:hover{background-color:#ffffff1a;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}[data-theme=downtify-light] .icon-btn:hover{background-color:#0000000d}.icon-btn-active{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)));--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.icon-btn-active:hover{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)))}.pill{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500}.input-modern{height:3rem;width:100%;border-radius:9999px;border-width:1px;border-color:#ffffff1a;background-color:var(--fallback-b1,oklch(var(--b1)/.85));padding-left:1.25rem;padding-right:3.5rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)));outline:2px solid transparent;outline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input-modern::placeholder{color:var(--fallback-bc,oklch(var(--bc)/.4))}.input-modern:focus{border-color:var(--fallback-p,oklch(var(--p)/.6));--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-theme=downtify-light] .input-modern{border-color:#0000001a;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.track-card{position:relative;display:flex;align-items:center;gap:1rem;border-radius:1rem;padding:.75rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.track-card:hover{background-color:#ffffff0d}@media (min-width: 640px){.track-card{padding:1rem}}[data-theme=downtify-light] .track-card:hover{background-color:#0000000d}.track-cover{position:relative;aspect-ratio:1 / 1;width:4rem;flex-shrink:0;overflow:hidden;border-radius:.75rem;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)));--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (min-width: 640px){.track-cover{width:5rem}}.badge-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:var(--fallback-p,oklch(var(--p)/.2));background-color:var(--fallback-p,oklch(var(--p)/.15));--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.badge-error-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:var(--fallback-er,oklch(var(--er)/.25));background-color:var(--fallback-er,oklch(var(--er)/.15));--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.badge-neutral-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:#ffffff1a;background-color:#ffffff0d;color:var(--fallback-bc,oklch(var(--bc)/.7))}[data-theme=downtify-light] .badge-neutral-soft{border-color:#0000001a;background-color:#0000000d}.equalizer{display:inline-flex;height:1rem;align-items:flex-end;gap:.125rem}.equalizer span{display:block;height:100%;width:.125rem;transform-origin:bottom;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)))}.equalizer span:nth-child(1){animation:eq 1.05s ease-in-out infinite}.equalizer span:nth-child(2){animation:eq .95s ease-in-out infinite -.2s}.equalizer span:nth-child(3){animation:eq .85s ease-in-out infinite -.4s}@keyframes pulse{50%{opacity:.5}}.skeleton{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;border-radius:.75rem;background-color:#ffffff1a}[data-theme=downtify-light] .skeleton{background-color:#0000001a}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.-bottom-0\.5{bottom:-.125rem}.-right-0\.5{right:-.125rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-12{bottom:3rem}.bottom-3{bottom:.75rem}.left-1\/2{left:50%}.right-1{right:.25rem}.right-1\.5{right:.375rem}.right-10{right:2.5rem}.right-3{right:.75rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-1\/4{top:25%}.-z-10{z-index:-10}.z-30{z-index:30}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-auto{margin-left:auto}.mr-0\.5{margin-right:.125rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[420px\]{height:420px}.h-full{height:100%}.min-h-0{min-height:0px}.min-h-\[calc\(100dvh-4rem\)\]{min-height:calc(100dvh - 4rem)}.min-h-dvh{min-height:100dvh}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[420px\]{width:420px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[1\.25rem\]{min-width:1.25rem}.min-w-\[1rem\]{min-width:1rem}.min-w-\[2\.5rem\]{min-width:2.5rem}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-\[-90deg\]{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-scale-x-100{--tw-scale-x: -1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes slideUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.animate-slide-up{animation:slideUp .4s cubic-bezier(.22,1,.36,1)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-4{column-gap:1rem}.gap-y-0\.5{row-gap:.125rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-primary\/50{border-color:var(--fallback-p,oklch(var(--p)/.5))}.border-white\/10{border-color:#ffffff1a}.border-white\/5{border-color:#ffffff0d}.bg-base-100{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.bg-base-100\/50{background-color:var(--fallback-b1,oklch(var(--b1)/.5))}.bg-base-100\/60{background-color:var(--fallback-b1,oklch(var(--b1)/.6))}.bg-base-100\/85{background-color:var(--fallback-b1,oklch(var(--b1)/.85))}.bg-base-300\/30{background-color:var(--fallback-b3,oklch(var(--b3)/.3))}.bg-primary{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)))}.bg-primary\/10{background-color:var(--fallback-p,oklch(var(--p)/.1))}.bg-primary\/15{background-color:var(--fallback-p,oklch(var(--p)/.15))}.bg-primary\/25{background-color:var(--fallback-p,oklch(var(--p)/.25))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/5{background-color:#ffffff0d}.object-cover{object-fit:cover}.p-0{padding:0}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-16{padding-bottom:4rem}.pb-3{padding-bottom:.75rem}.pl-4{padding-left:1rem}.pt-24{padding-top:6rem}.text-left{text-align:left}.text-center{text-align:center}.align-text-top{vertical-align:text-top}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-base-content{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.text-base-content\/20{color:var(--fallback-bc,oklch(var(--bc)/.2))}.text-base-content\/30{color:var(--fallback-bc,oklch(var(--bc)/.3))}.text-base-content\/40{color:var(--fallback-bc,oklch(var(--bc)/.4))}.text-base-content\/50{color:var(--fallback-bc,oklch(var(--bc)/.5))}.text-base-content\/60{color:var(--fallback-bc,oklch(var(--bc)/.6))}.text-base-content\/70{color:var(--fallback-bc,oklch(var(--bc)/.7))}.text-base-content\/90{color:var(--fallback-bc,oklch(var(--bc)/.9))}.text-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.text-error\/70{color:var(--fallback-er,oklch(var(--er)/.7))}.text-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.text-primary-content{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)))}.text-primary\/70{color:var(--fallback-p,oklch(var(--p)/.7))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow-glow{--tw-shadow: 0 0 36px rgba(26, 208, 92, .3);--tw-shadow-colored: 0 0 36px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glow-sm{--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur-3xl{--tw-blur: blur(64px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-\[120px\]{--tw-blur: blur(120px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-\[0_0_8px_rgba\(26\,208\,92\,0\.55\)\]{--tw-drop-shadow: drop-shadow(0 0 8px rgba(26,208,92,.55));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.text-balance{text-wrap:balance}@media (min-width: 640px){.sm\:modal-middle{place-items:center}.sm\:modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-white\/20:hover{border-color:#fff3}.hover\:bg-base-100:hover{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.hover\:bg-error\/10:hover{background-color:var(--fallback-er,oklch(var(--er)/.1))}.hover\:bg-primary\/10:hover{background-color:var(--fallback-p,oklch(var(--p)/.1))}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:text-base-content:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.hover\:text-error:hover{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-primary\/60:focus{border-color:var(--fallback-p,oklch(var(--p)/.6))}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width: 640px){.sm\:inline{display:inline}.sm\:h-20{height:5rem}.sm\:h-64{height:16rem}.sm\:w-20{width:5rem}.sm\:w-64{width:16rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-2{gap:.5rem}.sm\:rounded-3xl{border-radius:1.5rem}.sm\:p-4{padding:1rem}.sm\:p-5{padding:1.25rem}.sm\:p-8{padding:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}}@media (min-width: 768px){.md\:flex{display:flex}.md\:hidden{display:none}}@media (min-width: 1024px){.lg\:max-h-\[640px\]{max-height:640px}.lg\:grid-cols-\[1fr_360px\]{grid-template-columns:1fr 360px}.lg\:overflow-y-auto{overflow-y:auto}} diff --git a/frontend/dist/assets/index-Cu3GXk8h.js b/frontend/dist/assets/index-Cu3GXk8h.js deleted file mode 100644 index cbaee0d..0000000 --- a/frontend/dist/assets/index-Cu3GXk8h.js +++ /dev/null @@ -1,30 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const r of o)if(r.type==="childList")for(const i of r.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function n(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(o){if(o.ep)return;o.ep=!0;const r=n(o);fetch(o.href,r)}})();/** -* @vue/shared v3.5.28 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Ur(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ve={},Cn=[],Nt=()=>{},ca=()=>!1,mo=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Br=e=>e.startsWith("onUpdate:"),Ie=Object.assign,jr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Pu=Object.prototype.hasOwnProperty,he=(e,t)=>Pu.call(e,t),J=Array.isArray,kn=e=>ws(e)==="[object Map]",Bn=e=>ws(e)==="[object Set]",Ei=e=>ws(e)==="[object Date]",se=e=>typeof e=="function",Ce=e=>typeof e=="string",Dt=e=>typeof e=="symbol",pe=e=>e!==null&&typeof e=="object",ua=e=>(pe(e)||se(e))&&se(e.then)&&se(e.catch),fa=Object.prototype.toString,ws=e=>fa.call(e),Iu=e=>ws(e).slice(8,-1),da=e=>ws(e)==="[object Object]",Hr=e=>Ce(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ts=Ur(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),go=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$u=/-\w/g,dt=go(e=>e.replace($u,t=>t.slice(1).toUpperCase())),Nu=/\B([A-Z])/g,an=go(e=>e.replace(Nu,"-$1").toLowerCase()),yo=go(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ho=go(e=>e?`on${yo(e)}`:""),nn=(e,t)=>!Object.is(e,t),Hs=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},vo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Du=e=>{const t=Ce(e)?Number(e):NaN;return isNaN(t)?e:t};let Ai;const bo=()=>Ai||(Ai=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function In(e){if(J(e)){const t={};for(let n=0;n{if(n){const s=n.split(Mu);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Se(e){let t="";if(Ce(e))t=e;else if(J(e))for(let n=0;njn(n,t))}const ma=e=>!!(e&&e.__v_isRef===!0),E=e=>Ce(e)?e:e==null?"":J(e)||pe(e)&&(e.toString===fa||!se(e.toString))?ma(e)?E(e.value):JSON.stringify(e,ga,2):String(e),ga=(e,t)=>ma(t)?ga(e,t.value):kn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o],r)=>(n[Vo(s,r)+" =>"]=o,n),{})}:Bn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Vo(n))}:Dt(t)?Vo(t):pe(t)&&!J(t)&&!da(t)?String(t):t,Vo=(e,t="")=>{var n;return Dt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.5.28 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Ye;class Vu{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=Ye,!t&&Ye&&(this.index=(Ye.scopes||(Ye.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(Ye=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(ss){let t=ss;for(ss=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;ns;){let t=ns;for(ns=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function _a(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function wa(e){let t,n=e.depsTail,s=n;for(;s;){const o=s.prevDep;s.version===-1?(s===n&&(n=o),Kr(s),Wu(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=o}e.deps=t,e.depsTail=n}function hr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(xa(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function xa(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===cs)||(e.globalVersion=cs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!hr(e))))return;e.flags|=2;const t=e.dep,n=we,s=mt;we=e,mt=!0;try{_a(e);const o=e.fn(e._value);(t.version===0||nn(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{we=n,mt=s,wa(e),e.flags&=-3}}function Kr(e,t=!1){const{dep:n,prevSub:s,nextSub:o}=e;if(s&&(s.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let r=n.computed.deps;r;r=r.nextDep)Kr(r,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Wu(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let mt=!0;const Sa=[];function Wt(){Sa.push(mt),mt=!1}function Kt(){const e=Sa.pop();mt=e===void 0?!0:e}function Ri(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=we;we=void 0;try{t()}finally{we=n}}}let cs=0;class Ku{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class zr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!we||!mt||we===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==we)n=this.activeLink=new Ku(we,this),we.deps?(n.prevDep=we.depsTail,we.depsTail.nextDep=n,we.depsTail=n):we.deps=we.depsTail=n,Ea(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=we.depsTail,n.nextDep=void 0,we.depsTail.nextDep=n,we.depsTail=n,we.deps===n&&(we.deps=s)}return n}trigger(t){this.version++,cs++,this.notify(t)}notify(t){qr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Wr()}}}function Ea(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Ea(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const pr=new WeakMap,bn=Symbol(""),mr=Symbol(""),us=Symbol("");function Fe(e,t,n){if(mt&&we){let s=pr.get(e);s||pr.set(e,s=new Map);let o=s.get(n);o||(s.set(n,o=new zr),o.map=s,o.key=n),o.track()}}function Ht(e,t,n,s,o,r){const i=pr.get(e);if(!i){cs++;return}const l=a=>{a&&a.trigger()};if(qr(),t==="clear")i.forEach(l);else{const a=J(e),u=a&&Hr(n);if(a&&n==="length"){const c=Number(s);i.forEach((f,p)=>{(p==="length"||p===us||!Dt(p)&&p>=c)&&l(f)})}else switch((n!==void 0||i.has(void 0))&&l(i.get(n)),u&&l(i.get(us)),t){case"add":a?u&&l(i.get("length")):(l(i.get(bn)),kn(e)&&l(i.get(mr)));break;case"delete":a||(l(i.get(bn)),kn(e)&&l(i.get(mr)));break;case"set":kn(e)&&l(i.get(bn));break}}Wr()}function Sn(e){const t=ue(e);return t===e?t:(Fe(t,"iterate",us),ft(e)?t:t.map(yt))}function _o(e){return Fe(e=ue(e),"iterate",us),e}function Xt(e,t){return zt(e)?$n(_n(e)?yt(t):t):yt(t)}const zu={__proto__:null,[Symbol.iterator](){return Wo(this,Symbol.iterator,e=>Xt(this,e))},concat(...e){return Sn(this).concat(...e.map(t=>J(t)?Sn(t):t))},entries(){return Wo(this,"entries",e=>(e[1]=Xt(this,e[1]),e))},every(e,t){return Lt(this,"every",e,t,void 0,arguments)},filter(e,t){return Lt(this,"filter",e,t,n=>n.map(s=>Xt(this,s)),arguments)},find(e,t){return Lt(this,"find",e,t,n=>Xt(this,n),arguments)},findIndex(e,t){return Lt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Lt(this,"findLast",e,t,n=>Xt(this,n),arguments)},findLastIndex(e,t){return Lt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Lt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Ko(this,"includes",e)},indexOf(...e){return Ko(this,"indexOf",e)},join(e){return Sn(this).join(e)},lastIndexOf(...e){return Ko(this,"lastIndexOf",e)},map(e,t){return Lt(this,"map",e,t,void 0,arguments)},pop(){return Kn(this,"pop")},push(...e){return Kn(this,"push",e)},reduce(e,...t){return Ci(this,"reduce",e,t)},reduceRight(e,...t){return Ci(this,"reduceRight",e,t)},shift(){return Kn(this,"shift")},some(e,t){return Lt(this,"some",e,t,void 0,arguments)},splice(...e){return Kn(this,"splice",e)},toReversed(){return Sn(this).toReversed()},toSorted(e){return Sn(this).toSorted(e)},toSpliced(...e){return Sn(this).toSpliced(...e)},unshift(...e){return Kn(this,"unshift",e)},values(){return Wo(this,"values",e=>Xt(this,e))}};function Wo(e,t,n){const s=_o(e),o=s[t]();return s!==e&&!ft(e)&&(o._next=o.next,o.next=()=>{const r=o._next();return r.done||(r.value=n(r.value)),r}),o}const Gu=Array.prototype;function Lt(e,t,n,s,o,r){const i=_o(e),l=i!==e&&!ft(e),a=i[t];if(a!==Gu[t]){const f=a.apply(e,r);return l?yt(f):f}let u=n;i!==e&&(l?u=function(f,p){return n.call(this,Xt(e,f),p,e)}:n.length>2&&(u=function(f,p){return n.call(this,f,p,e)}));const c=a.call(i,u,s);return l&&o?o(c):c}function Ci(e,t,n,s){const o=_o(e);let r=n;return o!==e&&(ft(e)?n.length>3&&(r=function(i,l,a){return n.call(this,i,l,a,e)}):r=function(i,l,a){return n.call(this,i,Xt(e,l),a,e)}),o[t](r,...s)}function Ko(e,t,n){const s=ue(e);Fe(s,"iterate",us);const o=s[t](...n);return(o===-1||o===!1)&&Jr(n[0])?(n[0]=ue(n[0]),s[t](...n)):o}function Kn(e,t,n=[]){Wt(),qr();const s=ue(e)[t].apply(e,n);return Wr(),Kt(),s}const Qu=Ur("__proto__,__v_isRef,__isVue"),Aa=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Dt));function Ju(e){Dt(e)||(e=String(e));const t=ue(this);return Fe(t,"has",e),t.hasOwnProperty(e)}class Ra{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,r=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return r;if(n==="__v_raw")return s===(o?r?lf:Ta:r?Oa:ka).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const i=J(t);if(!o){let a;if(i&&(a=zu[n]))return a;if(n==="hasOwnProperty")return Ju}const l=Reflect.get(t,n,je(t)?t:s);if((Dt(n)?Aa.has(n):Qu(n))||(o||Fe(t,"get",n),r))return l;if(je(l)){const a=i&&Hr(n)?l:l.value;return o&&pe(a)?yr(a):a}return pe(l)?o?yr(l):wo(l):l}}class Ca extends Ra{constructor(t=!1){super(!1,t)}set(t,n,s,o){let r=t[n];const i=J(t)&&Hr(n);if(!this._isShallow){const u=zt(r);if(!ft(s)&&!zt(s)&&(r=ue(r),s=ue(s)),!i&&je(r)&&!je(s))return u||(r.value=s),!0}const l=i?Number(n)e,Ds=e=>Reflect.getPrototypeOf(e);function tf(e,t,n){return function(...s){const o=this.__v_raw,r=ue(o),i=kn(r),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,u=o[e](...s),c=n?gr:t?$n:yt;return!t&&Fe(r,"iterate",a?mr:bn),Ie(Object.create(u),{next(){const{value:f,done:p}=u.next();return p?{value:f,done:p}:{value:l?[c(f[0]),c(f[1])]:c(f),done:p}}})}}function Ls(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function nf(e,t){const n={get(o){const r=this.__v_raw,i=ue(r),l=ue(o);e||(nn(o,l)&&Fe(i,"get",o),Fe(i,"get",l));const{has:a}=Ds(i),u=t?gr:e?$n:yt;if(a.call(i,o))return u(r.get(o));if(a.call(i,l))return u(r.get(l));r!==i&&r.get(o)},get size(){const o=this.__v_raw;return!e&&Fe(ue(o),"iterate",bn),o.size},has(o){const r=this.__v_raw,i=ue(r),l=ue(o);return e||(nn(o,l)&&Fe(i,"has",o),Fe(i,"has",l)),o===l?r.has(o):r.has(o)||r.has(l)},forEach(o,r){const i=this,l=i.__v_raw,a=ue(l),u=t?gr:e?$n:yt;return!e&&Fe(a,"iterate",bn),l.forEach((c,f)=>o.call(r,u(c),u(f),i))}};return Ie(n,e?{add:Ls("add"),set:Ls("set"),delete:Ls("delete"),clear:Ls("clear")}:{add(o){!t&&!ft(o)&&!zt(o)&&(o=ue(o));const r=ue(this);return Ds(r).has.call(r,o)||(r.add(o),Ht(r,"add",o,o)),this},set(o,r){!t&&!ft(r)&&!zt(r)&&(r=ue(r));const i=ue(this),{has:l,get:a}=Ds(i);let u=l.call(i,o);u||(o=ue(o),u=l.call(i,o));const c=a.call(i,o);return i.set(o,r),u?nn(r,c)&&Ht(i,"set",o,r):Ht(i,"add",o,r),this},delete(o){const r=ue(this),{has:i,get:l}=Ds(r);let a=i.call(r,o);a||(o=ue(o),a=i.call(r,o)),l&&l.call(r,o);const u=r.delete(o);return a&&Ht(r,"delete",o,void 0),u},clear(){const o=ue(this),r=o.size!==0,i=o.clear();return r&&Ht(o,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=tf(o,e,t)}),n}function Gr(e,t){const n=nf(e,t);return(s,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(he(n,o)&&o in s?n:s,o,r)}const sf={get:Gr(!1,!1)},of={get:Gr(!1,!0)},rf={get:Gr(!0,!1)};const ka=new WeakMap,Oa=new WeakMap,Ta=new WeakMap,lf=new WeakMap;function af(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function cf(e){return e.__v_skip||!Object.isExtensible(e)?0:af(Iu(e))}function wo(e){return zt(e)?e:Qr(e,!1,Xu,sf,ka)}function Pa(e){return Qr(e,!1,ef,of,Oa)}function yr(e){return Qr(e,!0,Zu,rf,Ta)}function Qr(e,t,n,s,o){if(!pe(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const r=cf(e);if(r===0)return e;const i=o.get(e);if(i)return i;const l=new Proxy(e,r===2?s:n);return o.set(e,l),l}function _n(e){return zt(e)?_n(e.__v_raw):!!(e&&e.__v_isReactive)}function zt(e){return!!(e&&e.__v_isReadonly)}function ft(e){return!!(e&&e.__v_isShallow)}function Jr(e){return e?!!e.__v_raw:!1}function ue(e){const t=e&&e.__v_raw;return t?ue(t):e}function uf(e){return!he(e,"__v_skip")&&Object.isExtensible(e)&&ha(e,"__v_skip",!0),e}const yt=e=>pe(e)?wo(e):e,$n=e=>pe(e)?yr(e):e;function je(e){return e?e.__v_isRef===!0:!1}function ne(e){return Ia(e,!1)}function ff(e){return Ia(e,!0)}function Ia(e,t){return je(e)?e:new df(e,t)}class df{constructor(t,n){this.dep=new zr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:ue(t),this._value=n?t:yt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||ft(t)||zt(t);t=s?t:ue(t),nn(t,n)&&(this._rawValue=t,this._value=s?t:yt(t),this.dep.trigger())}}function d(e){return je(e)?e.value:e}const hf={get:(e,t,n)=>t==="__v_raw"?e:d(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return je(o)&&!je(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function $a(e){return _n(e)?e:new Proxy(e,hf)}class pf{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new zr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=cs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&we!==this)return ba(this,!0),!0}get value(){const t=this.dep.track();return xa(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function mf(e,t,n=!1){let s,o;return se(e)?s=e:(s=e.get,o=e.set),new pf(s,o,n)}const Ms={},to=new WeakMap;let mn;function gf(e,t=!1,n=mn){if(n){let s=to.get(n);s||to.set(n,s=[]),s.push(e)}}function yf(e,t,n=ve){const{immediate:s,deep:o,once:r,scheduler:i,augmentJob:l,call:a}=n,u=$=>o?$:ft($)||o===!1||o===0?Vt($,1):Vt($);let c,f,p,g,v=!1,w=!1;if(je(e)?(f=()=>e.value,v=ft(e)):_n(e)?(f=()=>u(e),v=!0):J(e)?(w=!0,v=e.some($=>_n($)||ft($)),f=()=>e.map($=>{if(je($))return $.value;if(_n($))return u($);if(se($))return a?a($,2):$()})):se(e)?t?f=a?()=>a(e,2):e:f=()=>{if(p){Wt();try{p()}finally{Kt()}}const $=mn;mn=c;try{return a?a(e,3,[g]):e(g)}finally{mn=$}}:f=Nt,t&&o){const $=f,F=o===!0?1/0:o;f=()=>Vt($(),F)}const b=qu(),A=()=>{c.stop(),b&&b.active&&jr(b.effects,c)};if(r&&t){const $=t;t=(...F)=>{$(...F),A()}}let C=w?new Array(e.length).fill(Ms):Ms;const S=$=>{if(!(!(c.flags&1)||!c.dirty&&!$))if(t){const F=c.run();if(o||v||(w?F.some((P,N)=>nn(P,C[N])):nn(F,C))){p&&p();const P=mn;mn=c;try{const N=[F,C===Ms?void 0:w&&C[0]===Ms?[]:C,g];C=F,a?a(t,3,N):t(...N)}finally{mn=P}}}else c.run()};return l&&l(S),c=new ya(f),c.scheduler=i?()=>i(S,!1):S,g=$=>gf($,!1,c),p=c.onStop=()=>{const $=to.get(c);if($){if(a)a($,4);else for(const F of $)F();to.delete(c)}},t?s?S(!0):C=c.run():i?i(S.bind(null,!0),!0):c.run(),A.pause=c.pause.bind(c),A.resume=c.resume.bind(c),A.stop=A,A}function Vt(e,t=1/0,n){if(t<=0||!pe(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,je(e))Vt(e.value,t,n);else if(J(e))for(let s=0;s{Vt(s,t,n)});else if(da(e)){for(const s in e)Vt(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Vt(e[s],t,n)}return e}/** -* @vue/runtime-core v3.5.28 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function xs(e,t,n,s){try{return s?e(...s):e()}catch(o){xo(o,t,n)}}function vt(e,t,n,s){if(se(e)){const o=xs(e,t,n,s);return o&&ua(o)&&o.catch(r=>{xo(r,t,n)}),o}if(J(e)){const o=[];for(let r=0;r>>1,o=We[s],r=fs(o);r=fs(n)?We.push(e):We.splice(bf(t),0,e),e.flags|=1,Da()}}function Da(){no||(no=Na.then(Ma))}function _f(e){J(e)?On.push(...e):Zt&&e.id===-1?Zt.splice(An+1,0,e):e.flags&1||(On.push(e),e.flags|=1),Da()}function ki(e,t,n=Tt+1){for(;nfs(n)-fs(s));if(On.length=0,Zt){Zt.push(...t);return}for(Zt=t,An=0;Ane.id==null?e.flags&2?-1:1/0:e.id;function Ma(e){try{for(Tt=0;Tt{s._d&&lo(-1);const r=so(t);let i;try{i=e(...o)}finally{so(r),s._d&&lo(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function Bt(e,t){if(ot===null)return e;const n=Co(ot),s=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&se(t)?t.call(s&&s.proxy):t}}const wf=Symbol.for("v-scx"),xf=()=>gt(wf);function sn(e,t,n){return Ua(e,t,n)}function Ua(e,t,n=ve){const{immediate:s,deep:o,flush:r,once:i}=n,l=Ie({},n),a=t&&s||!t&&r!=="post";let u;if(ps){if(r==="sync"){const g=xf();u=g.__watcherHandles||(g.__watcherHandles=[])}else if(!a){const g=()=>{};return g.stop=Nt,g.resume=Nt,g.pause=Nt,g}}const c=Ue;l.call=(g,v,w)=>vt(g,c,v,w);let f=!1;r==="post"?l.scheduler=g=>{Je(g,c&&c.suspense)}:r!=="sync"&&(f=!0,l.scheduler=(g,v)=>{v?g():Xr(g)}),l.augmentJob=g=>{t&&(g.flags|=4),f&&(g.flags|=2,c&&(g.id=c.uid,g.i=c))};const p=yf(e,t,l);return ps&&(u?u.push(p):a&&p()),p}function Sf(e,t,n){const s=this.proxy,o=Ce(e)?e.includes(".")?Ba(s,e):()=>s[e]:e.bind(s,s);let r;se(t)?r=t:(r=t.handler,n=t);const i=Ss(this),l=Ua(o,r.bind(s),n);return i(),l}function Ba(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;oe.__isTeleport,Pt=Symbol("_leaveCb"),zn=Symbol("_enterCb");function Af(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Qt(()=>{e.isMounted=!0}),ei(()=>{e.isUnmounting=!0}),e}const ct=[Function,Array],Ha={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ct,onEnter:ct,onAfterEnter:ct,onEnterCancelled:ct,onBeforeLeave:ct,onLeave:ct,onAfterLeave:ct,onLeaveCancelled:ct,onBeforeAppear:ct,onAppear:ct,onAfterAppear:ct,onAppearCancelled:ct},Va=e=>{const t=e.subTree;return t.component?Va(t.component):t},Rf={name:"BaseTransition",props:Ha,setup(e,{slots:t}){const n=vc(),s=Af();return()=>{const o=t.default&&Ka(t.default(),!0);if(!o||!o.length)return;const r=qa(o),i=ue(e),{mode:l}=i;if(s.isLeaving)return zo(r);const a=Oi(r);if(!a)return zo(r);let u=vr(a,i,s,n,f=>u=f);a.type!==Ke&&ds(a,u);let c=n.subTree&&Oi(n.subTree);if(c&&c.type!==Ke&&!gn(c,a)&&Va(n).type!==Ke){let f=vr(c,i,s,n);if(ds(c,f),l==="out-in"&&a.type!==Ke)return s.isLeaving=!0,f.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,c=void 0},zo(r);l==="in-out"&&a.type!==Ke?f.delayLeave=(p,g,v)=>{const w=Wa(s,c);w[String(c.key)]=c,p[Pt]=()=>{g(),p[Pt]=void 0,delete u.delayedLeave,c=void 0},u.delayedLeave=()=>{v(),delete u.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return r}}};function qa(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Ke){t=n;break}}return t}const Cf=Rf;function Wa(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function vr(e,t,n,s,o){const{appear:r,mode:i,persisted:l=!1,onBeforeEnter:a,onEnter:u,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:p,onLeave:g,onAfterLeave:v,onLeaveCancelled:w,onBeforeAppear:b,onAppear:A,onAfterAppear:C,onAppearCancelled:S}=t,$=String(e.key),F=Wa(n,e),P=(z,te)=>{z&&vt(z,s,9,te)},N=(z,te)=>{const me=te[1];P(z,te),J(z)?z.every(V=>V.length<=1)&&me():z.length<=1&&me()},Y={mode:i,persisted:l,beforeEnter(z){let te=a;if(!n.isMounted)if(r)te=b||a;else return;z[Pt]&&z[Pt](!0);const me=F[$];me&&gn(e,me)&&me.el[Pt]&&me.el[Pt](),P(te,[z])},enter(z){let te=u,me=c,V=f;if(!n.isMounted)if(r)te=A||u,me=C||c,V=S||f;else return;let re=!1;z[zn]=Le=>{re||(re=!0,Le?P(V,[z]):P(me,[z]),Y.delayedLeave&&Y.delayedLeave(),z[zn]=void 0)};const be=z[zn].bind(null,!1);te?N(te,[z,be]):be()},leave(z,te){const me=String(e.key);if(z[zn]&&z[zn](!0),n.isUnmounting)return te();P(p,[z]);let V=!1;z[Pt]=be=>{V||(V=!0,te(),be?P(w,[z]):P(v,[z]),z[Pt]=void 0,F[me]===e&&delete F[me])};const re=z[Pt].bind(null,!1);F[me]=e,g?N(g,[z,re]):re()},clone(z){const te=vr(z,t,n,s,o);return o&&o(te),te}};return Y}function zo(e){if(So(e))return e=on(e),e.children=null,e}function Oi(e){if(!So(e))return ja(e.type)&&e.children?qa(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&se(n.default))return n.default()}}function ds(e,t){e.shapeFlag&6&&e.component?(e.transition=t,ds(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ka(e,t=!1,n){let s=[],o=0;for(let r=0;r1)for(let r=0;ros(w,t&&(J(t)?t[b]:t),n,s,o));return}if(rs(s)&&!o){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&os(e,t,n,s.component.subTree);return}const r=s.shapeFlag&4?Co(s.component):s.el,i=o?null:r,{i:l,r:a}=e,u=t&&t.r,c=l.refs===ve?l.refs={}:l.refs,f=l.setupState,p=ue(f),g=f===ve?ca:w=>Ti(c,w)?!1:he(p,w),v=(w,b)=>!(b&&Ti(c,b));if(u!=null&&u!==a){if(Pi(t),Ce(u))c[u]=null,g(u)&&(f[u]=null);else if(je(u)){const w=t;v(u,w.k)&&(u.value=null),w.k&&(c[w.k]=null)}}if(se(a))xs(a,l,12,[i,c]);else{const w=Ce(a),b=je(a);if(w||b){const A=()=>{if(e.f){const C=w?g(a)?f[a]:c[a]:v()||!e.k?a.value:c[e.k];if(o)J(C)&&jr(C,r);else if(J(C))C.includes(r)||C.push(r);else if(w)c[a]=[r],g(a)&&(f[a]=c[a]);else{const S=[r];v(a,e.k)&&(a.value=S),e.k&&(c[e.k]=S)}}else w?(c[a]=i,g(a)&&(f[a]=i)):b&&(v(a,e.k)&&(a.value=i),e.k&&(c[e.k]=i))};if(i){const C=()=>{A(),ro.delete(e)};C.id=-1,ro.set(e,C),Je(C,n)}else Pi(e),A()}}}function Pi(e){const t=ro.get(e);t&&(t.flags|=8,ro.delete(e))}bo().requestIdleCallback;bo().cancelIdleCallback;const rs=e=>!!e.type.__asyncLoader,So=e=>e.type.__isKeepAlive;function kf(e,t){Ga(e,"a",t)}function Of(e,t){Ga(e,"da",t)}function Ga(e,t,n=Ue){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Eo(t,s,n),n){let o=n.parent;for(;o&&o.parent;)So(o.parent.vnode)&&Tf(s,t,n,o),o=o.parent}}function Tf(e,t,n,s){const o=Eo(t,e,s,!0);ti(()=>{jr(s[t],o)},n)}function Eo(e,t,n=Ue,s=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...i)=>{Wt();const l=Ss(n),a=vt(t,n,e,i);return l(),Kt(),a});return s?o.unshift(r):o.push(r),r}}const Gt=e=>(t,n=Ue)=>{(!ps||e==="sp")&&Eo(e,(...s)=>t(...s),n)},Qa=Gt("bm"),Qt=Gt("m"),Pf=Gt("bu"),If=Gt("u"),ei=Gt("bum"),ti=Gt("um"),$f=Gt("sp"),Nf=Gt("rtg"),Df=Gt("rtc");function Lf(e,t=Ue){Eo("ec",e,t)}const Ja="components";function br(e,t){return Xa(Ja,e,!0,t)||e}const Ya=Symbol.for("v-ndc");function Mf(e){return Ce(e)?Xa(Ja,e,!1)||e:e||Ya}function Xa(e,t,n=!0,s=!1){const o=ot||Ue;if(o){const r=o.type;{const l=xd(r,!1);if(l&&(l===t||l===dt(t)||l===yo(dt(t))))return r}const i=Ii(o[e]||r[e],t)||Ii(o.appContext[e],t);return!i&&s?r:i}}function Ii(e,t){return e&&(e[t]||e[dt(t)]||e[yo(dt(t))])}function De(e,t,n,s){let o;const r=n,i=J(e);if(i||Ce(e)){const l=i&&_n(e);let a=!1,u=!1;l&&(a=!ft(e),u=zt(e),e=_o(e)),o=new Array(e.length);for(let c=0,f=e.length;ct(l,a,void 0,r));else{const l=Object.keys(e);o=new Array(l.length);for(let a=0,u=l.length;ae?bc(e)?Co(e):_r(e.parent):null,is=Ie(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>_r(e.parent),$root:e=>_r(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>ec(e),$forceUpdate:e=>e.f||(e.f=()=>{Xr(e.update)}),$nextTick:e=>e.n||(e.n=Yr.bind(e.proxy)),$watch:e=>Sf.bind(e)}),Go=(e,t)=>e!==ve&&!e.__isScriptSetup&&he(e,t),Ff={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:o,props:r,accessCache:i,type:l,appContext:a}=e;if(t[0]!=="$"){const p=i[t];if(p!==void 0)switch(p){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return r[t]}else{if(Go(s,t))return i[t]=1,s[t];if(o!==ve&&he(o,t))return i[t]=2,o[t];if(he(r,t))return i[t]=3,r[t];if(n!==ve&&he(n,t))return i[t]=4,n[t];wr&&(i[t]=0)}}const u=is[t];let c,f;if(u)return t==="$attrs"&&Fe(e.attrs,"get",""),u(e);if((c=l.__cssModules)&&(c=c[t]))return c;if(n!==ve&&he(n,t))return i[t]=4,n[t];if(f=a.config.globalProperties,he(f,t))return f[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:r}=e;return Go(o,t)?(o[t]=n,!0):s!==ve&&he(s,t)?(s[t]=n,!0):he(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,props:r,type:i}},l){let a;return!!(n[l]||e!==ve&&l[0]!=="$"&&he(e,l)||Go(t,l)||he(r,l)||he(s,l)||he(is,l)||he(o.config.globalProperties,l)||(a=i.__cssModules)&&a[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:he(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function $i(e){return J(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let wr=!0;function Uf(e){const t=ec(e),n=e.proxy,s=e.ctx;wr=!1,t.beforeCreate&&Ni(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:i,watch:l,provide:a,inject:u,created:c,beforeMount:f,mounted:p,beforeUpdate:g,updated:v,activated:w,deactivated:b,beforeDestroy:A,beforeUnmount:C,destroyed:S,unmounted:$,render:F,renderTracked:P,renderTriggered:N,errorCaptured:Y,serverPrefetch:z,expose:te,inheritAttrs:me,components:V,directives:re,filters:be}=t;if(u&&Bf(u,s,null),i)for(const ce in i){const oe=i[ce];se(oe)&&(s[ce]=oe.bind(n))}if(o){const ce=o.call(n,n);pe(ce)&&(e.data=wo(ce))}if(wr=!0,r)for(const ce in r){const oe=r[ce],lt=se(oe)?oe.bind(n,n):se(oe.get)?oe.get.bind(n,n):Nt,xt=!se(oe)&&se(oe.set)?oe.set.bind(n):Nt,Te=Ee({get:lt,set:xt});Object.defineProperty(s,ce,{enumerable:!0,configurable:!0,get:()=>Te.value,set:Oe=>Te.value=Oe})}if(l)for(const ce in l)Za(l[ce],s,n,ce);if(a){const ce=se(a)?a.call(n):a;Reflect.ownKeys(ce).forEach(oe=>{Vs(oe,ce[oe])})}c&&Ni(c,e,"c");function ie(ce,oe){J(oe)?oe.forEach(lt=>ce(lt.bind(n))):oe&&ce(oe.bind(n))}if(ie(Qa,f),ie(Qt,p),ie(Pf,g),ie(If,v),ie(kf,w),ie(Of,b),ie(Lf,Y),ie(Df,P),ie(Nf,N),ie(ei,C),ie(ti,$),ie($f,z),J(te))if(te.length){const ce=e.exposed||(e.exposed={});te.forEach(oe=>{Object.defineProperty(ce,oe,{get:()=>n[oe],set:lt=>n[oe]=lt,enumerable:!0})})}else e.exposed||(e.exposed={});F&&e.render===Nt&&(e.render=F),me!=null&&(e.inheritAttrs=me),V&&(e.components=V),re&&(e.directives=re),z&&za(e)}function Bf(e,t,n=Nt){J(e)&&(e=xr(e));for(const s in e){const o=e[s];let r;pe(o)?"default"in o?r=gt(o.from||s,o.default,!0):r=gt(o.from||s):r=gt(o),je(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:i=>r.value=i}):t[s]=r}}function Ni(e,t,n){vt(J(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Za(e,t,n,s){let o=s.includes(".")?Ba(n,s):()=>n[s];if(Ce(e)){const r=t[e];se(r)&&sn(o,r)}else if(se(e))sn(o,e.bind(n));else if(pe(e))if(J(e))e.forEach(r=>Za(r,t,n,s));else{const r=se(e.handler)?e.handler.bind(n):t[e.handler];se(r)&&sn(o,r,e)}}function ec(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:i}}=e.appContext,l=r.get(t);let a;return l?a=l:!o.length&&!n&&!s?a=t:(a={},o.length&&o.forEach(u=>io(a,u,i,!0)),io(a,t,i)),pe(t)&&r.set(t,a),a}function io(e,t,n,s=!1){const{mixins:o,extends:r}=t;r&&io(e,r,n,!0),o&&o.forEach(i=>io(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=jf[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const jf={data:Di,props:Li,emits:Li,methods:es,computed:es,beforeCreate:Ve,created:Ve,beforeMount:Ve,mounted:Ve,beforeUpdate:Ve,updated:Ve,beforeDestroy:Ve,beforeUnmount:Ve,destroyed:Ve,unmounted:Ve,activated:Ve,deactivated:Ve,errorCaptured:Ve,serverPrefetch:Ve,components:es,directives:es,watch:Vf,provide:Di,inject:Hf};function Di(e,t){return t?e?function(){return Ie(se(e)?e.call(this,this):e,se(t)?t.call(this,this):t)}:t:e}function Hf(e,t){return es(xr(e),xr(t))}function xr(e){if(J(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${dt(t)}Modifiers`]||e[`${an(t)}Modifiers`];function zf(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ve;let o=n;const r=t.startsWith("update:"),i=r&&Kf(s,t.slice(7));i&&(i.trim&&(o=n.map(c=>Ce(c)?c.trim():c)),i.number&&(o=n.map(vo)));let l,a=s[l=Ho(t)]||s[l=Ho(dt(t))];!a&&r&&(a=s[l=Ho(an(t))]),a&&vt(a,e,6,o);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,vt(u,e,6,o)}}const Gf=new WeakMap;function nc(e,t,n=!1){const s=n?Gf:t.emitsCache,o=s.get(e);if(o!==void 0)return o;const r=e.emits;let i={},l=!1;if(!se(e)){const a=u=>{const c=nc(u,t,!0);c&&(l=!0,Ie(i,c))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!l?(pe(e)&&s.set(e,null),null):(J(r)?r.forEach(a=>i[a]=null):Ie(i,r),pe(e)&&s.set(e,i),i)}function Ao(e,t){return!e||!mo(t)?!1:(t=t.slice(2).replace(/Once$/,""),he(e,t[0].toLowerCase()+t.slice(1))||he(e,an(t))||he(e,t))}function Mi(e){const{type:t,vnode:n,proxy:s,withProxy:o,propsOptions:[r],slots:i,attrs:l,emit:a,render:u,renderCache:c,props:f,data:p,setupState:g,ctx:v,inheritAttrs:w}=e,b=so(e);let A,C;try{if(n.shapeFlag&4){const $=o||s,F=$;A=$t(u.call(F,$,c,f,g,p,v)),C=l}else{const $=t;A=$t($.length>1?$(f,{attrs:l,slots:i,emit:a}):$(f,null)),C=t.props?l:Qf(l)}}catch($){ls.length=0,xo($,e,1),A=M(Ke)}let S=A;if(C&&w!==!1){const $=Object.keys(C),{shapeFlag:F}=S;$.length&&F&7&&(r&&$.some(Br)&&(C=Jf(C,r)),S=on(S,C,!1,!0))}return n.dirs&&(S=on(S,null,!1,!0),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&ds(S,n.transition),A=S,so(b),A}const Qf=e=>{let t;for(const n in e)(n==="class"||n==="style"||mo(n))&&((t||(t={}))[n]=e[n]);return t},Jf=(e,t)=>{const n={};for(const s in e)(!Br(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Yf(e,t,n){const{props:s,children:o,component:r}=e,{props:i,children:l,patchFlag:a}=t,u=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return s?Fi(s,i,u):!!i;if(a&8){const c=t.dynamicProps;for(let f=0;fObject.create(oc),ic=e=>Object.getPrototypeOf(e)===oc;function Zf(e,t,n,s=!1){const o={},r=rc();e.propsDefaults=Object.create(null),lc(e,t,o,r);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=s?o:Pa(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function ed(e,t,n,s){const{props:o,attrs:r,vnode:{patchFlag:i}}=e,l=ue(o),[a]=e.propsOptions;let u=!1;if((s||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[p,g]=ac(f,t,!0);Ie(i,p),g&&l.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!r&&!a)return pe(e)&&s.set(e,Cn),Cn;if(J(r))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",si=e=>J(e)?e.map($t):[$t(e)],nd=(e,t,n)=>{if(t._n)return t;const s=oo((...o)=>si(t(...o)),n);return s._c=!1,s},cc=(e,t,n)=>{const s=e._ctx;for(const o in e){if(ni(o))continue;const r=e[o];if(se(r))t[o]=nd(o,r,s);else if(r!=null){const i=si(r);t[o]=()=>i}}},uc=(e,t)=>{const n=si(t);e.slots.default=()=>n},fc=(e,t,n)=>{for(const s in t)(n||!ni(s))&&(e[s]=t[s])},sd=(e,t,n)=>{const s=e.slots=rc();if(e.vnode.shapeFlag&32){const o=t._;o?(fc(s,t,n),n&&ha(s,"_",o,!0)):cc(t,s)}else t&&uc(e,t)},od=(e,t,n)=>{const{vnode:s,slots:o}=e;let r=!0,i=ve;if(s.shapeFlag&32){const l=t._;l?n&&l===1?r=!1:fc(o,t,n):(r=!t.$stable,cc(t,o)),i=t}else t&&(uc(e,t),i={default:1});if(r)for(const l in o)!ni(l)&&i[l]==null&&delete o[l]},Je=cd;function rd(e){return id(e)}function id(e,t){const n=bo();n.__VUE__=!0;const{insert:s,remove:o,patchProp:r,createElement:i,createText:l,createComment:a,setText:u,setElementText:c,parentNode:f,nextSibling:p,setScopeId:g=Nt,insertStaticContent:v}=e,w=(m,y,_,k=null,D=null,O=null,j=void 0,B=null,U=!!y.dynamicChildren)=>{if(m===y)return;m&&!gn(m,y)&&(k=T(m),Oe(m,D,O,!0),m=null),y.patchFlag===-2&&(U=!1,y.dynamicChildren=null);const{type:L,ref:X,shapeFlag:q}=y;switch(L){case Ro:b(m,y,_,k);break;case Ke:A(m,y,_,k);break;case qs:m==null&&C(y,_,k,j);break;case fe:V(m,y,_,k,D,O,j,B,U);break;default:q&1?F(m,y,_,k,D,O,j,B,U):q&6?re(m,y,_,k,D,O,j,B,U):(q&64||q&128)&&L.process(m,y,_,k,D,O,j,B,U,G)}X!=null&&D?os(X,m&&m.ref,O,y||m,!y):X==null&&m&&m.ref!=null&&os(m.ref,null,O,m,!0)},b=(m,y,_,k)=>{if(m==null)s(y.el=l(y.children),_,k);else{const D=y.el=m.el;y.children!==m.children&&u(D,y.children)}},A=(m,y,_,k)=>{m==null?s(y.el=a(y.children||""),_,k):y.el=m.el},C=(m,y,_,k)=>{[m.el,m.anchor]=v(m.children,y,_,k,m.el,m.anchor)},S=({el:m,anchor:y},_,k)=>{let D;for(;m&&m!==y;)D=p(m),s(m,_,k),m=D;s(y,_,k)},$=({el:m,anchor:y})=>{let _;for(;m&&m!==y;)_=p(m),o(m),m=_;o(y)},F=(m,y,_,k,D,O,j,B,U)=>{if(y.type==="svg"?j="svg":y.type==="math"&&(j="mathml"),m==null)P(y,_,k,D,O,j,B,U);else{const L=m.el&&m.el._isVueCE?m.el:null;try{L&&L._beginPatch(),z(m,y,D,O,j,B,U)}finally{L&&L._endPatch()}}},P=(m,y,_,k,D,O,j,B)=>{let U,L;const{props:X,shapeFlag:q,transition:Q,dirs:ee}=m;if(U=m.el=i(m.type,O,X&&X.is,X),q&8?c(U,m.children):q&16&&Y(m.children,U,null,k,D,Qo(m,O),j,B),ee&&cn(m,null,k,"created"),N(U,m,m.scopeId,j,k),X){for(const _e in X)_e!=="value"&&!ts(_e)&&r(U,_e,null,X[_e],O,k);"value"in X&&r(U,"value",null,X.value,O),(L=X.onVnodeBeforeMount)&&kt(L,k,m)}ee&&cn(m,null,k,"beforeMount");const ae=ld(D,Q);ae&&Q.beforeEnter(U),s(U,y,_),((L=X&&X.onVnodeMounted)||ae||ee)&&Je(()=>{L&&kt(L,k,m),ae&&Q.enter(U),ee&&cn(m,null,k,"mounted")},D)},N=(m,y,_,k,D)=>{if(_&&g(m,_),k)for(let O=0;O{for(let L=U;L{const B=y.el=m.el;let{patchFlag:U,dynamicChildren:L,dirs:X}=y;U|=m.patchFlag&16;const q=m.props||ve,Q=y.props||ve;let ee;if(_&&un(_,!1),(ee=Q.onVnodeBeforeUpdate)&&kt(ee,_,y,m),X&&cn(y,m,_,"beforeUpdate"),_&&un(_,!0),(q.innerHTML&&Q.innerHTML==null||q.textContent&&Q.textContent==null)&&c(B,""),L?te(m.dynamicChildren,L,B,_,k,Qo(y,D),O):j||oe(m,y,B,null,_,k,Qo(y,D),O,!1),U>0){if(U&16)me(B,q,Q,_,D);else if(U&2&&q.class!==Q.class&&r(B,"class",null,Q.class,D),U&4&&r(B,"style",q.style,Q.style,D),U&8){const ae=y.dynamicProps;for(let _e=0;_e{ee&&kt(ee,_,y,m),X&&cn(y,m,_,"updated")},k)},te=(m,y,_,k,D,O,j)=>{for(let B=0;B{if(y!==_){if(y!==ve)for(const O in y)!ts(O)&&!(O in _)&&r(m,O,y[O],null,D,k);for(const O in _){if(ts(O))continue;const j=_[O],B=y[O];j!==B&&O!=="value"&&r(m,O,B,j,D,k)}"value"in _&&r(m,"value",y.value,_.value,D)}},V=(m,y,_,k,D,O,j,B,U)=>{const L=y.el=m?m.el:l(""),X=y.anchor=m?m.anchor:l("");let{patchFlag:q,dynamicChildren:Q,slotScopeIds:ee}=y;ee&&(B=B?B.concat(ee):ee),m==null?(s(L,_,k),s(X,_,k),Y(y.children||[],_,X,D,O,j,B,U)):q>0&&q&64&&Q&&m.dynamicChildren&&m.dynamicChildren.length===Q.length?(te(m.dynamicChildren,Q,_,D,O,j,B),(y.key!=null||D&&y===D.subTree)&&dc(m,y,!0)):oe(m,y,_,X,D,O,j,B,U)},re=(m,y,_,k,D,O,j,B,U)=>{y.slotScopeIds=B,m==null?y.shapeFlag&512?D.ctx.activate(y,_,k,j,U):be(y,_,k,D,O,j,U):Le(m,y,U)},be=(m,y,_,k,D,O,j)=>{const B=m.component=yd(m,k,D);if(So(m)&&(B.ctx.renderer=G),vd(B,!1,j),B.asyncDep){if(D&&D.registerDep(B,ie,j),!m.el){const U=B.subTree=M(Ke);A(null,U,y,_),m.placeholder=U.el}}else ie(B,m,y,_,D,O,j)},Le=(m,y,_)=>{const k=y.component=m.component;if(Yf(m,y,_))if(k.asyncDep&&!k.asyncResolved){ce(k,y,_);return}else k.next=y,k.update();else y.el=m.el,k.vnode=y},ie=(m,y,_,k,D,O,j)=>{const B=()=>{if(m.isMounted){let{next:q,bu:Q,u:ee,parent:ae,vnode:_e}=m;{const Rt=hc(m);if(Rt){q&&(q.el=_e.el,ce(m,q,j)),Rt.asyncDep.then(()=>{Je(()=>{m.isUnmounted||L()},D)});return}}let ge=q,Ge;un(m,!1),q?(q.el=_e.el,ce(m,q,j)):q=_e,Q&&Hs(Q),(Ge=q.props&&q.props.onVnodeBeforeUpdate)&&kt(Ge,ae,q,_e),un(m,!0);const Qe=Mi(m),At=m.subTree;m.subTree=Qe,w(At,Qe,f(At.el),T(At),m,D,O),q.el=Qe.el,ge===null&&Xf(m,Qe.el),ee&&Je(ee,D),(Ge=q.props&&q.props.onVnodeUpdated)&&Je(()=>kt(Ge,ae,q,_e),D)}else{let q;const{el:Q,props:ee}=y,{bm:ae,m:_e,parent:ge,root:Ge,type:Qe}=m,At=rs(y);un(m,!1),ae&&Hs(ae),!At&&(q=ee&&ee.onVnodeBeforeMount)&&kt(q,ge,y),un(m,!0);{Ge.ce&&Ge.ce._hasShadowRoot()&&Ge.ce._injectChildStyle(Qe);const Rt=m.subTree=Mi(m);w(null,Rt,_,k,m,D,O),y.el=Rt.el}if(_e&&Je(_e,D),!At&&(q=ee&&ee.onVnodeMounted)){const Rt=y;Je(()=>kt(q,ge,Rt),D)}(y.shapeFlag&256||ge&&rs(ge.vnode)&&ge.vnode.shapeFlag&256)&&m.a&&Je(m.a,D),m.isMounted=!0,y=_=k=null}};m.scope.on();const U=m.effect=new ya(B);m.scope.off();const L=m.update=U.run.bind(U),X=m.job=U.runIfDirty.bind(U);X.i=m,X.id=m.uid,U.scheduler=()=>Xr(X),un(m,!0),L()},ce=(m,y,_)=>{y.component=m;const k=m.vnode.props;m.vnode=y,m.next=null,ed(m,y.props,k,_),od(m,y.children,_),Wt(),ki(m),Kt()},oe=(m,y,_,k,D,O,j,B,U=!1)=>{const L=m&&m.children,X=m?m.shapeFlag:0,q=y.children,{patchFlag:Q,shapeFlag:ee}=y;if(Q>0){if(Q&128){xt(L,q,_,k,D,O,j,B,U);return}else if(Q&256){lt(L,q,_,k,D,O,j,B,U);return}}ee&8?(X&16&&at(L,D,O),q!==L&&c(_,q)):X&16?ee&16?xt(L,q,_,k,D,O,j,B,U):at(L,D,O,!0):(X&8&&c(_,""),ee&16&&Y(q,_,k,D,O,j,B,U))},lt=(m,y,_,k,D,O,j,B,U)=>{m=m||Cn,y=y||Cn;const L=m.length,X=y.length,q=Math.min(L,X);let Q;for(Q=0;QX?at(m,D,O,!0,!1,q):Y(y,_,k,D,O,j,B,U,q)},xt=(m,y,_,k,D,O,j,B,U)=>{let L=0;const X=y.length;let q=m.length-1,Q=X-1;for(;L<=q&&L<=Q;){const ee=m[L],ae=y[L]=U?jt(y[L]):$t(y[L]);if(gn(ee,ae))w(ee,ae,_,null,D,O,j,B,U);else break;L++}for(;L<=q&&L<=Q;){const ee=m[q],ae=y[Q]=U?jt(y[Q]):$t(y[Q]);if(gn(ee,ae))w(ee,ae,_,null,D,O,j,B,U);else break;q--,Q--}if(L>q){if(L<=Q){const ee=Q+1,ae=eeQ)for(;L<=q;)Oe(m[L],D,O,!0),L++;else{const ee=L,ae=L,_e=new Map;for(L=ae;L<=Q;L++){const nt=y[L]=U?jt(y[L]):$t(y[L]);nt.key!=null&&_e.set(nt.key,L)}let ge,Ge=0;const Qe=Q-ae+1;let At=!1,Rt=0;const Wn=new Array(Qe);for(L=0;L=Qe){Oe(nt,D,O,!0);continue}let Ct;if(nt.key!=null)Ct=_e.get(nt.key);else for(ge=ae;ge<=Q;ge++)if(Wn[ge-ae]===0&&gn(nt,y[ge])){Ct=ge;break}Ct===void 0?Oe(nt,D,O,!0):(Wn[Ct-ae]=L+1,Ct>=Rt?Rt=Ct:At=!0,w(nt,y[Ct],_,null,D,O,j,B,U),Ge++)}const wi=At?ad(Wn):Cn;for(ge=wi.length-1,L=Qe-1;L>=0;L--){const nt=ae+L,Ct=y[nt],xi=y[nt+1],Si=nt+1{const{el:O,type:j,transition:B,children:U,shapeFlag:L}=m;if(L&6){Te(m.component.subTree,y,_,k);return}if(L&128){m.suspense.move(y,_,k);return}if(L&64){j.move(m,y,_,G);return}if(j===fe){s(O,y,_);for(let q=0;qB.enter(O),D);else{const{leave:q,delayLeave:Q,afterLeave:ee}=B,ae=()=>{m.ctx.isUnmounted?o(O):s(O,y,_)},_e=()=>{O._isLeaving&&O[Pt](!0),q(O,()=>{ae(),ee&&ee()})};Q?Q(O,ae,_e):_e()}else s(O,y,_)},Oe=(m,y,_,k=!1,D=!1)=>{const{type:O,props:j,ref:B,children:U,dynamicChildren:L,shapeFlag:X,patchFlag:q,dirs:Q,cacheIndex:ee}=m;if(q===-2&&(D=!1),B!=null&&(Wt(),os(B,null,_,m,!0),Kt()),ee!=null&&(y.renderCache[ee]=void 0),X&256){y.ctx.deactivate(m);return}const ae=X&1&&Q,_e=!rs(m);let ge;if(_e&&(ge=j&&j.onVnodeBeforeUnmount)&&kt(ge,y,m),X&6)Et(m.component,_,k);else{if(X&128){m.suspense.unmount(_,k);return}ae&&cn(m,null,y,"beforeUnmount"),X&64?m.type.remove(m,y,_,G,k):L&&!L.hasOnce&&(O!==fe||q>0&&q&64)?at(L,y,_,!1,!0):(O===fe&&q&384||!D&&X&16)&&at(U,y,_),k&&St(m)}(_e&&(ge=j&&j.onVnodeUnmounted)||ae)&&Je(()=>{ge&&kt(ge,y,m),ae&&cn(m,null,y,"unmounted")},_)},St=m=>{const{type:y,el:_,anchor:k,transition:D}=m;if(y===fe){ht(_,k);return}if(y===qs){$(m);return}const O=()=>{o(_),D&&!D.persisted&&D.afterLeave&&D.afterLeave()};if(m.shapeFlag&1&&D&&!D.persisted){const{leave:j,delayLeave:B}=D,U=()=>j(_,O);B?B(m.el,O,U):U()}else O()},ht=(m,y)=>{let _;for(;m!==y;)_=p(m),o(m),m=_;o(y)},Et=(m,y,_)=>{const{bum:k,scope:D,job:O,subTree:j,um:B,m:U,a:L}=m;Bi(U),Bi(L),k&&Hs(k),D.stop(),O&&(O.flags|=8,Oe(j,m,y,_)),B&&Je(B,y),Je(()=>{m.isUnmounted=!0},y)},at=(m,y,_,k=!1,D=!1,O=0)=>{for(let j=O;j{if(m.shapeFlag&6)return T(m.component.subTree);if(m.shapeFlag&128)return m.suspense.next();const y=p(m.anchor||m.el),_=y&&y[Ef];return _?p(_):y};let W=!1;const H=(m,y,_)=>{let k;m==null?y._vnode&&(Oe(y._vnode,null,null,!0),k=y._vnode.component):w(y._vnode||null,m,y,null,null,null,_),y._vnode=m,W||(W=!0,ki(k),La(),W=!1)},G={p:w,um:Oe,m:Te,r:St,mt:be,mc:Y,pc:oe,pbc:te,n:T,o:e};return{render:H,hydrate:void 0,createApp:Wf(H)}}function Qo({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function un({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ld(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function dc(e,t,n=!1){const s=e.children,o=t.children;if(J(s)&&J(o))for(let r=0;r>1,e[n[l]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,i=n[r-1];r-- >0;)n[r]=i,i=t[i];return n}function hc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:hc(t)}function Bi(e){if(e)for(let t=0;te.__isSuspense;function cd(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):_f(e)}const fe=Symbol.for("v-fgt"),Ro=Symbol.for("v-txt"),Ke=Symbol.for("v-cmt"),qs=Symbol.for("v-stc"),ls=[];let rt=null;function R(e=!1){ls.push(rt=e?null:[])}function ud(){ls.pop(),rt=ls[ls.length-1]||null}let hs=1;function lo(e,t=!1){hs+=e,e<0&&rt&&t&&(rt.hasOnce=!0)}function gc(e){return e.dynamicChildren=hs>0?rt||Cn:null,ud(),hs>0&&rt&&rt.push(e),e}function I(e,t,n,s,o,r){return gc(h(e,t,n,s,o,r,!0))}function it(e,t,n,s,o){return gc(M(e,t,n,s,o,!0))}function ao(e){return e?e.__v_isVNode===!0:!1}function gn(e,t){return e.type===t.type&&e.key===t.key}const yc=({key:e})=>e??null,Ws=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Ce(e)||je(e)||se(e)?{i:ot,r:e,k:t,f:!!n}:e:null);function h(e,t=null,n=null,s=0,o=null,r=e===fe?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&yc(t),ref:t&&Ws(t),scopeId:Fa,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:ot};return l?(oi(a,n),r&128&&e.normalize(a)):n&&(a.shapeFlag|=Ce(n)?8:16),hs>0&&!i&&rt&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&rt.push(a),a}const M=fd;function fd(e,t=null,n=null,s=0,o=null,r=!1){if((!e||e===Ya)&&(e=Ke),ao(e)){const l=on(e,t,!0);return n&&oi(l,n),hs>0&&!r&&rt&&(l.shapeFlag&6?rt[rt.indexOf(e)]=l:rt.push(l)),l.patchFlag=-2,l}if(Sd(e)&&(e=e.__vccOpts),t){t=dd(t);let{class:l,style:a}=t;l&&!Ce(l)&&(t.class=Se(l)),pe(a)&&(Jr(a)&&!J(a)&&(a=Ie({},a)),t.style=In(a))}const i=Ce(e)?1:mc(e)?128:ja(e)?64:pe(e)?4:se(e)?2:0;return h(e,t,n,s,o,i,r,!0)}function dd(e){return e?Jr(e)||ic(e)?Ie({},e):e:null}function on(e,t,n=!1,s=!1){const{props:o,ref:r,patchFlag:i,children:l,transition:a}=e,u=t?pd(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&yc(u),ref:t&&t.ref?n&&r?J(r)?r.concat(Ws(t)):[r,Ws(t)]:Ws(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==fe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&on(e.ssContent),ssFallback:e.ssFallback&&on(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&s&&ds(c,a.clone(c)),c}function $e(e=" ",t=0){return M(Ro,null,e,t)}function hd(e,t){const n=M(qs,null,e);return n.staticCount=t,n}function xe(e="",t=!1){return t?(R(),it(Ke,null,e)):M(Ke,null,e)}function $t(e){return e==null||typeof e=="boolean"?M(Ke):J(e)?M(fe,null,e.slice()):ao(e)?jt(e):M(Ro,null,String(e))}function jt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:on(e)}function oi(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(J(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),oi(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!ic(t)?t._ctx=ot:o===3&&ot&&(ot.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else se(t)?(t={default:t,_ctx:ot},n=32):(t=String(t),s&64?(n=16,t=[$e(t)]):n=8);e.children=t,e.shapeFlag|=n}function pd(...e){const t={};for(let n=0;nUe||ot;let co,Er;{const e=bo(),t=(n,s)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),r=>{o.length>1?o.forEach(i=>i(r)):o[0](r)}};co=t("__VUE_INSTANCE_SETTERS__",n=>Ue=n),Er=t("__VUE_SSR_SETTERS__",n=>ps=n)}const Ss=e=>{const t=Ue;return co(e),e.scope.on(),()=>{e.scope.off(),co(t)}},ji=()=>{Ue&&Ue.scope.off(),co(null)};function bc(e){return e.vnode.shapeFlag&4}let ps=!1;function vd(e,t=!1,n=!1){t&&Er(t);const{props:s,children:o}=e.vnode,r=bc(e);Zf(e,s,r,t),sd(e,o,n||t);const i=r?bd(e,t):void 0;return t&&Er(!1),i}function bd(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ff);const{setup:s}=n;if(s){Wt();const o=e.setupContext=s.length>1?wd(e):null,r=Ss(e),i=xs(s,e,0,[e.props,o]),l=ua(i);if(Kt(),r(),(l||e.sp)&&!rs(e)&&za(e),l){if(i.then(ji,ji),t)return i.then(a=>{Hi(e,a)}).catch(a=>{xo(a,e,0)});e.asyncDep=i}else Hi(e,i)}else _c(e)}function Hi(e,t,n){se(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:pe(t)&&(e.setupState=$a(t)),_c(e)}function _c(e,t,n){const s=e.type;e.render||(e.render=s.render||Nt);{const o=Ss(e);Wt();try{Uf(e)}finally{Kt(),o()}}}const _d={get(e,t){return Fe(e,"get",""),e[t]}};function wd(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,_d),slots:e.slots,emit:e.emit,expose:t}}function Co(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy($a(uf(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in is)return is[n](e)},has(t,n){return n in t||n in is}})):e.proxy}function xd(e,t=!0){return se(e)?e.displayName||e.name:e.name||t&&e.__name}function Sd(e){return se(e)&&"__vccOpts"in e}const Ee=(e,t)=>mf(e,t,ps);function ms(e,t,n){try{lo(-1);const s=arguments.length;return s===2?pe(t)&&!J(t)?ao(t)?M(e,null,[t]):M(e,t):M(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&ao(n)&&(n=[n]),M(e,t,n))}finally{lo(1)}}const Ed="3.5.28";/** -* @vue/runtime-dom v3.5.28 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Ar;const Vi=typeof window<"u"&&window.trustedTypes;if(Vi)try{Ar=Vi.createPolicy("vue",{createHTML:e=>e})}catch{}const wc=Ar?e=>Ar.createHTML(e):e=>e,Ad="http://www.w3.org/2000/svg",Rd="http://www.w3.org/1998/Math/MathML",Ut=typeof document<"u"?document:null,qi=Ut&&Ut.createElement("template"),Cd={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?Ut.createElementNS(Ad,e):t==="mathml"?Ut.createElementNS(Rd,e):n?Ut.createElement(e,{is:n}):Ut.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>Ut.createTextNode(e),createComment:e=>Ut.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ut.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,r){const i=n?n.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===r||!(o=o.nextSibling)););else{qi.innerHTML=wc(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=qi.content;if(s==="svg"||s==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Jt="transition",Gn="animation",gs=Symbol("_vtc"),xc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},kd=Ie({},Ha,xc),Od=e=>(e.displayName="Transition",e.props=kd,e),Sc=Od((e,{slots:t})=>ms(Cf,Td(e),t)),fn=(e,t=[])=>{J(e)?e.forEach(n=>n(...t)):e&&e(...t)},Wi=e=>e?J(e)?e.some(t=>t.length>1):e.length>1:!1;function Td(e){const t={};for(const V in e)V in xc||(t[V]=e[V]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=r,appearActiveClass:u=i,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,v=Pd(o),w=v&&v[0],b=v&&v[1],{onBeforeEnter:A,onEnter:C,onEnterCancelled:S,onLeave:$,onLeaveCancelled:F,onBeforeAppear:P=A,onAppear:N=C,onAppearCancelled:Y=S}=t,z=(V,re,be,Le)=>{V._enterCancelled=Le,dn(V,re?c:l),dn(V,re?u:i),be&&be()},te=(V,re)=>{V._isLeaving=!1,dn(V,f),dn(V,g),dn(V,p),re&&re()},me=V=>(re,be)=>{const Le=V?N:C,ie=()=>z(re,V,be);fn(Le,[re,ie]),Ki(()=>{dn(re,V?a:r),Mt(re,V?c:l),Wi(Le)||zi(re,s,w,ie)})};return Ie(t,{onBeforeEnter(V){fn(A,[V]),Mt(V,r),Mt(V,i)},onBeforeAppear(V){fn(P,[V]),Mt(V,a),Mt(V,u)},onEnter:me(!1),onAppear:me(!0),onLeave(V,re){V._isLeaving=!0;const be=()=>te(V,re);Mt(V,f),V._enterCancelled?(Mt(V,p),Ji(V)):(Ji(V),Mt(V,p)),Ki(()=>{V._isLeaving&&(dn(V,f),Mt(V,g),Wi($)||zi(V,s,b,be))}),fn($,[V,be])},onEnterCancelled(V){z(V,!1,void 0,!0),fn(S,[V])},onAppearCancelled(V){z(V,!0,void 0,!0),fn(Y,[V])},onLeaveCancelled(V){te(V),fn(F,[V])}})}function Pd(e){if(e==null)return null;if(pe(e))return[Jo(e.enter),Jo(e.leave)];{const t=Jo(e);return[t,t]}}function Jo(e){return Du(e)}function Mt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[gs]||(e[gs]=new Set)).add(t)}function dn(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[gs];n&&(n.delete(t),n.size||(e[gs]=void 0))}function Ki(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Id=0;function zi(e,t,n,s){const o=e._endId=++Id,r=()=>{o===e._endId&&s()};if(n!=null)return setTimeout(r,n);const{type:i,timeout:l,propCount:a}=$d(e,t);if(!i)return s();const u=i+"end";let c=0;const f=()=>{e.removeEventListener(u,p),r()},p=g=>{g.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[v]||"").split(", "),o=s(`${Jt}Delay`),r=s(`${Jt}Duration`),i=Gi(o,r),l=s(`${Gn}Delay`),a=s(`${Gn}Duration`),u=Gi(l,a);let c=null,f=0,p=0;t===Jt?i>0&&(c=Jt,f=i,p=r.length):t===Gn?u>0&&(c=Gn,f=u,p=a.length):(f=Math.max(i,u),c=f>0?i>u?Jt:Gn:null,p=c?c===Jt?r.length:a.length:0);const g=c===Jt&&/\b(?:transform|all)(?:,|$)/.test(s(`${Jt}Property`).toString());return{type:c,timeout:f,propCount:p,hasTransform:g}}function Gi(e,t){for(;e.lengthQi(n)+Qi(e[s])))}function Qi(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Ji(e){return(e?e.ownerDocument:document).body.offsetHeight}function Nd(e,t,n){const s=e[gs];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Yi=Symbol("_vod"),Dd=Symbol("_vsh"),Ld=Symbol(""),Md=/(?:^|;)\s*display\s*:/;function Fd(e,t,n){const s=e.style,o=Ce(n);let r=!1;if(n&&!o){if(t)if(Ce(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Ks(s,l,"")}else for(const i in t)n[i]==null&&Ks(s,i,"");for(const i in n)i==="display"&&(r=!0),Ks(s,i,n[i])}else if(o){if(t!==n){const i=s[Ld];i&&(n+=";"+i),s.cssText=n,r=Md.test(n)}}else t&&e.removeAttribute("style");Yi in e&&(e[Yi]=r?s.display:"",e[Dd]&&(s.display="none"))}const Xi=/\s*!important$/;function Ks(e,t,n){if(J(n))n.forEach(s=>Ks(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Ud(e,t);Xi.test(n)?e.setProperty(an(s),n.replace(Xi,""),"important"):e[s]=n}}const Zi=["Webkit","Moz","ms"],Yo={};function Ud(e,t){const n=Yo[t];if(n)return n;let s=dt(t);if(s!=="filter"&&s in e)return Yo[t]=s;s=yo(s);for(let o=0;oXo||(Vd.then(()=>Xo=0),Xo=Date.now());function Wd(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;vt(Kd(s,n.value),t,5,[s])};return n.value=e,n.attached=qd(),n}function Kd(e,t){if(J(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const rl=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,zd=(e,t,n,s,o,r)=>{const i=o==="svg";t==="class"?Nd(e,s,i):t==="style"?Fd(e,n,s):mo(t)?Br(t)||jd(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Gd(e,t,s,i))?(nl(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&tl(e,t,s,i,r,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Ce(s))?nl(e,dt(t),s,r,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),tl(e,t,s,i))};function Gd(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&rl(t)&&se(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return rl(t)&&Ce(n)?!1:t in e}const Nn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return J(t)?n=>Hs(t,n):t};function Qd(e){e.target.composing=!0}function il(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const qt=Symbol("_assign");function ll(e,t,n){return t&&(e=e.trim()),n&&(e=vo(e)),e}const Ec={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e[qt]=Nn(o);const r=s||o.props&&o.props.type==="number";tn(e,t?"change":"input",i=>{i.target.composing||e[qt](ll(e.value,n,r))}),(n||r)&&tn(e,"change",()=>{e.value=ll(e.value,n,r)}),t||(tn(e,"compositionstart",Qd),tn(e,"compositionend",il),tn(e,"change",il))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:o,number:r}},i){if(e[qt]=Nn(i),e.composing)return;const l=(r||e.type==="number")&&!/^0\d/.test(e.value)?vo(e.value):e.value,a=t??"";l!==a&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||o&&e.value.trim()===a)||(e.value=a))}},Zo={deep:!0,created(e,t,n){e[qt]=Nn(n),tn(e,"change",()=>{const s=e._modelValue,o=ys(e),r=e.checked,i=e[qt];if(J(s)){const l=Vr(s,o),a=l!==-1;if(r&&!a)i(s.concat(o));else if(!r&&a){const u=[...s];u.splice(l,1),i(u)}}else if(Bn(s)){const l=new Set(s);r?l.add(o):l.delete(o),i(l)}else i(Ac(e,r))})},mounted:al,beforeUpdate(e,t,n){e[qt]=Nn(n),al(e,t,n)}};function al(e,{value:t,oldValue:n},s){e._modelValue=t;let o;if(J(t))o=Vr(t,s.props.value)>-1;else if(Bn(t))o=t.has(s.props.value);else{if(t===n)return;o=jn(t,Ac(e,!0))}e.checked!==o&&(e.checked=o)}const zs={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const o=Bn(t);tn(e,"change",()=>{const r=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?vo(ys(i)):ys(i));e[qt](e.multiple?o?new Set(r):r:r[0]),e._assigning=!0,Yr(()=>{e._assigning=!1})}),e[qt]=Nn(s)},mounted(e,{value:t}){cl(e,t)},beforeUpdate(e,t,n){e[qt]=Nn(n)},updated(e,{value:t}){e._assigning||cl(e,t)}};function cl(e,t){const n=e.multiple,s=J(t);if(!(n&&!s&&!Bn(t))){for(let o=0,r=e.options.length;oString(u)===String(l)):i.selected=Vr(t,l)>-1}else i.selected=t.has(l);else if(jn(ys(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function ys(e){return"_value"in e?e._value:e.value}function Ac(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Jd=["ctrl","shift","alt","meta"],Yd={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Jd.some(n=>e[`${n}Key`]&&!t.includes(n))},Xd=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(o,...r)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=o=>{if(!("key"in o))return;const r=an(o.key);if(t.some(i=>i===r||Zd[i]===r))return e(o)})},th=Ie({patchProp:zd},Cd);let ul;function nh(){return ul||(ul=rd(th))}const sh=(...e)=>{const t=nh().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=rh(s);if(!o)return;const r=t._component;!se(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const i=n(o,!1,oh(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function oh(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function rh(e){return Ce(e)?document.querySelector(e):e}const ih={language:{name:"English"},common:{cancel:"Cancel",save:"Save",close:"Close",delete:"Delete",refresh:"Refresh",download:"Download",unknownArtist:"Unknown artist",unknownTrack:"Unknown track",previousPage:"Previous page",nextPage:"Next page"},nav:{home:"Home",library:"Library",monitor:"Playlist Monitor",queue:"Queue",player:"Player",settings:"Settings",switchToLight:"Switch to light",switchToDark:"Switch to dark"},hero:{noAccount:"no Spotify account needed",tagline:"Your music with full metadata, album art and lyrics — in one click.",songs:"Songs",albums:"Albums",playlists:"Playlists"},search:{placeholder:"Search, paste a Spotify or YouTube Music link…",title:"Search results",matchesFor:"Showing matches for",songsCount:"— {count} song",songsCountPlural:"— {count} songs",typeToBegin:"Type something in the search bar to begin.",error:"Something went wrong.",errorWithDetail:"Something went wrong: {detail}",empty:"No songs found.",emptyHint:"Try another query — artist + title usually works best.",openOnSpotify:"Open on Spotify",inQueue:"In queue",download:"Download",previousPage:"Previous page",nextPage:"Next page"},queue:{title:"Download Queue",subtitle:"Songs you've queued. Progress, status and quick actions live here.",empty:"Nothing queued right now.",emptyHint:"Search for a song and hit download to start.",saveToDevice:"Save to device",removeFromQueue:"Remove from queue",clearAll:"Clear all",clearAllPrompt:"Remove all items from the queue?",forceAudio:"Force audio source",overridePlaceholder:"Paste a YouTube or YouTube Music URL…",applyOverride:"Apply",invalidYouTubeURL:"Invalid YouTube URL"},library:{title:"Library",subtitle:"Music you've already downloaded. Listen, re-download or remove.",empty:"No downloads yet.",emptyHint:"Find a song to start filling your library.",failedLoad:"Failed to load downloads.",failedDelete:"Failed to delete {file}",deletePrompt:'Delete "{file}"?',countOne:"{count} file in your library",countMany:"{count} files in your library",downloadToDevice:"Download to device",deleteFile:"Delete file",play:"Play"},monitor:{title:"Playlist Monitor",subtitle:"Add Spotify playlists to watch. New tracks added to those playlists will be downloaded automatically.",watchNew:"Watch a new playlist",urlPlaceholder:"Paste a Spotify playlist URL…",watch:"Watch",failedAdd:"Failed to add playlist. Check the URL and try again.",empty:"No playlists being monitored yet.",emptyHint:"Paste a Spotify playlist link above to get started.",active:"Active",paused:"Paused",everyInterval:"Every {interval}",tracksOne:"{count} track",tracksMany:"{count} tracks",checked:"Checked {when}",notChecked:"Not checked yet",pause:"Pause monitoring",resume:"Resume monitoring",checkNow:"Check now",stop:"Stop monitoring",deletePrompt:'Stop monitoring "{name}"?',info:"When you add a playlist, Downtify downloads every track it currently contains and then keeps watching it. Any songs added later on Spotify are detected and downloaded automatically on the next scheduled check.",every15:"Every 15 min",every30:"Every 30 min",every1h:"Every hour",every3h:"Every 3 h",every6h:"Every 6 h",every12h:"Every 12 h",every1d:"Every day",every1w:"Every week",every2w:"Every 2 weeks",every1mo:"Every month",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 day",short1w:"1 wk",short2w:"2 wk",short1mo:"1 mo",minSuffix:"min",hourSuffix:"h",daySuffix:"day",daysSuffix:"days",weekSuffix:"week",weeksSuffix:"weeks",monthSuffix:"month",monthsSuffix:"months",timeJustNow:"just now",timeMinAgo:"{n} min ago",timeHourAgo:"{n} h ago",timeDayAgo:"{n} day(s) ago"},settings:{title:"Settings",subtitle:"Tweak how Downtify fetches and tags your music.",audioSource:"Audio source",lyricsSource:"Lyrics source",lyricsHint:"only lrclib is active",downloadLyrics:"Download lyrics",downloadLyricsHint:"Embed lyrics in audio files and write .lrc sidecar files",lyricsProvider:"Provider",format:"Format",quality:"Quality",qualityIgnored:"ignored (lossless)",playlistsSection:"Playlists",generateM3u:"Generate M3U file for playlists",generateM3uHint:"Writes Playlists/.m3u alongside the tracks for both manual playlist downloads and Playlist Monitor sweeps.",organizationSection:"File organization",organizeByArtist:"Organize by artist",organizeByArtistHint:"Save songs in subfolders named after the artist. Playlist tracks are also placed in their artist's folder instead of a playlist folder.",parallelDownloads:"Parallel downloads",parallelDownloadsHint:"Maximum number of songs downloaded simultaneously. Higher values are faster but use more bandwidth.",saved:"Changes saved",saveError:"Couldn't save settings.",language:"Language",languageHint:"Choose the interface language"},player:{title:"Player",subtitle:"Listen to the music you've downloaded.",empty:"Nothing to play yet",emptyHint:"Download some music to start listening.",queue:"Queue",play:"Play",pause:"Pause",previous:"Previous",next:"Next",shuffle:"Shuffle",shuffleOn:"Shuffle on",shuffleOff:"Shuffle off",repeatOff:"Repeat off",repeatAll:"Repeat all",repeatOne:"Repeat one",volume:"Volume",mute:"Mute",unmute:"Unmute",nowPlaying:"Now playing",upNext:"Up next",playFromLibrary:"Open in player",countOne:"{count} track",countMany:"{count} tracks"},footer:{tagline:"Open source music downloader"}},lh={language:{name:"Español"},common:{cancel:"Cancelar",save:"Guardar",close:"Cerrar",delete:"Eliminar",refresh:"Actualizar",download:"Descargar",unknownArtist:"Artista desconocido",unknownTrack:"Pista desconocida",previousPage:"Página anterior",nextPage:"Página siguiente"},nav:{home:"Inicio",library:"Biblioteca",monitor:"Monitor de listas",queue:"Cola",player:"Reproductor",settings:"Ajustes",switchToLight:"Cambiar a claro",switchToDark:"Cambiar a oscuro"},hero:{noAccount:"sin cuenta de Spotify",tagline:"Tu música con metadatos completos, portada y letras — en un clic.",songs:"Canciones",albums:"Álbumes",playlists:"Listas"},search:{placeholder:"Busca o pega un enlace de Spotify o YouTube Music…",title:"Resultados de búsqueda",matchesFor:"Mostrando coincidencias para",songsCount:"— {count} canción",songsCountPlural:"— {count} canciones",typeToBegin:"Escribe algo en la barra de búsqueda para empezar.",error:"Algo salió mal.",errorWithDetail:"Algo salió mal: {detail}",empty:"No se encontraron canciones.",emptyHint:"Prueba con otra búsqueda — artista + título suele funcionar mejor.",openOnSpotify:"Abrir en Spotify",inQueue:"En la cola",download:"Descargar",previousPage:"Página anterior",nextPage:"Página siguiente"},queue:{title:"Cola de descargas",subtitle:"Canciones que has añadido a la cola. Progreso, estado y acciones rápidas aquí.",empty:"No hay nada en la cola ahora mismo.",emptyHint:"Busca una canción y pulsa descargar para empezar.",saveToDevice:"Guardar en el dispositivo",removeFromQueue:"Quitar de la cola",clearAll:"Limpiar todo",clearAllPrompt:"¿Eliminar todos los elementos de la cola?",forceAudio:"Forzar fuente de audio",overridePlaceholder:"Pega una URL de YouTube o YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL de YouTube no válida"},library:{title:"Biblioteca",subtitle:"Música que ya has descargado. Escucha, descarga otra vez o elimina.",empty:"Aún no hay descargas.",emptyHint:"Encuentra una canción para empezar a llenar tu biblioteca.",failedLoad:"No se pudieron cargar las descargas.",failedDelete:"No se pudo eliminar {file}",deletePrompt:'¿Eliminar "{file}"?',countOne:"{count} archivo en tu biblioteca",countMany:"{count} archivos en tu biblioteca",downloadToDevice:"Descargar al dispositivo",deleteFile:"Eliminar archivo",play:"Reproducir"},monitor:{title:"Monitor de listas",subtitle:"Añade listas de Spotify para vigilar. Las nuevas pistas añadidas a esas listas se descargarán automáticamente.",watchNew:"Vigilar una nueva lista",urlPlaceholder:"Pega una URL de lista de Spotify…",watch:"Vigilar",failedAdd:"No se pudo añadir la lista. Comprueba la URL e inténtalo de nuevo.",empty:"Aún no hay listas vigiladas.",emptyHint:"Pega un enlace de lista de Spotify arriba para empezar.",active:"Activa",paused:"Pausada",everyInterval:"Cada {interval}",tracksOne:"{count} pista",tracksMany:"{count} pistas",checked:"Revisada {when}",notChecked:"Aún no revisada",pause:"Pausar vigilancia",resume:"Reanudar vigilancia",checkNow:"Revisar ahora",stop:"Dejar de vigilar",deletePrompt:'¿Dejar de vigilar "{name}"?',info:"Al añadir una lista, Downtify descarga todas las pistas que contenga en ese momento y la sigue vigilando. Cualquier canción añadida después en Spotify se detecta y descarga automáticamente en la siguiente revisión.",every15:"Cada 15 min",every30:"Cada 30 min",every1h:"Cada hora",every3h:"Cada 3 h",every6h:"Cada 6 h",every12h:"Cada 12 h",every1d:"Cada día",every1w:"Cada semana",every2w:"Cada 2 semanas",every1mo:"Cada mes",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 día",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mes",minSuffix:"min",hourSuffix:"h",daySuffix:"día",daysSuffix:"días",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mes",monthsSuffix:"meses",timeJustNow:"justo ahora",timeMinAgo:"hace {n} min",timeHourAgo:"hace {n} h",timeDayAgo:"hace {n} día(s)"},settings:{title:"Ajustes",subtitle:"Ajusta cómo Downtify descarga y etiqueta tu música.",audioSource:"Fuente de audio",lyricsSource:"Fuente de letras",lyricsHint:"solo lrclib está activo",downloadLyrics:"Descargar letras",downloadLyricsHint:"Incrusta letras en los archivos de audio y escribe archivos .lrc",lyricsProvider:"Proveedor",format:"Formato",quality:"Calidad",qualityIgnored:"ignorada (sin pérdidas)",playlistsSection:"Listas",generateM3u:"Generar archivo M3U para las listas",generateM3uHint:"Escribe Playlists/.m3u junto a las pistas, tanto para descargas manuales como para los barridos del Monitor.",organizationSection:"Organización de archivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Guarda las canciones en subcarpetas con el nombre del artista. Las pistas de listas también se guardan en la carpeta del artista en lugar de la carpeta de la lista.",parallelDownloads:"Descargas paralelas",parallelDownloadsHint:"Número máximo de canciones descargadas simultáneamente. Valores más altos son más rápidos pero consumen más ancho de banda.",saved:"Cambios guardados",saveError:"No se pudieron guardar los ajustes.",language:"Idioma",languageHint:"Elige el idioma de la interfaz"},player:{title:"Reproductor",subtitle:"Escucha la música que has descargado.",empty:"Nada que reproducir aún",emptyHint:"Descarga música para empezar a escuchar.",queue:"Cola",play:"Reproducir",pause:"Pausar",previous:"Anterior",next:"Siguiente",shuffle:"Aleatorio",shuffleOn:"Aleatorio activado",shuffleOff:"Aleatorio desactivado",repeatOff:"Repetición desactivada",repeatAll:"Repetir todo",repeatOne:"Repetir una",volume:"Volumen",mute:"Silenciar",unmute:"Activar sonido",nowPlaying:"Sonando ahora",upNext:"A continuación",playFromLibrary:"Abrir en el reproductor",countOne:"{count} pista",countMany:"{count} pistas"},footer:{tagline:"Descargador de música de código abierto"}},ah={language:{name:"Português (BR)"},common:{cancel:"Cancelar",save:"Salvar",close:"Fechar",delete:"Excluir",refresh:"Atualizar",download:"Baixar",unknownArtist:"Artista desconhecido",unknownTrack:"Faixa desconhecida",previousPage:"Página anterior",nextPage:"Próxima página"},nav:{home:"Início",library:"Biblioteca",monitor:"Monitor de playlists",queue:"Fila",player:"Player",settings:"Configurações",switchToLight:"Mudar para claro",switchToDark:"Mudar para escuro"},hero:{noAccount:"sem precisar de conta no Spotify",tagline:"Sua música com metadados completos, capa do álbum e letras — em um clique.",songs:"Músicas",albums:"Álbuns",playlists:"Playlists"},search:{placeholder:"Busque uma música ou cole um link do Spotify ou YouTube Music…",title:"Resultados da busca",matchesFor:"Mostrando resultados para",songsCount:"— {count} música",songsCountPlural:"— {count} músicas",typeToBegin:"Digite algo na barra de busca para começar.",error:"Algo deu errado.",errorWithDetail:"Algo deu errado: {detail}",empty:"Nenhuma música encontrada.",emptyHint:"Tente outra busca — artista + título costuma funcionar melhor.",openOnSpotify:"Abrir no Spotify",inQueue:"Na fila",download:"Baixar",previousPage:"Página anterior",nextPage:"Próxima página"},queue:{title:"Fila de download",subtitle:"Músicas que você adicionou à fila. Progresso, status e ações rápidas ficam aqui.",empty:"Nada na fila no momento.",emptyHint:"Procure uma música e clique em baixar para começar.",saveToDevice:"Salvar no dispositivo",removeFromQueue:"Remover da fila",clearAll:"Limpar tudo",clearAllPrompt:"Remover todos os itens da fila?",forceAudio:"Forçar fonte de áudio",overridePlaceholder:"Cole uma URL do YouTube ou YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL do YouTube inválida"},library:{title:"Biblioteca",subtitle:"Músicas que você já baixou. Escute, baixe novamente ou remova.",empty:"Nenhum download ainda.",emptyHint:"Encontre uma música para começar a montar sua biblioteca.",failedLoad:"Falha ao carregar os downloads.",failedDelete:"Falha ao excluir {file}",deletePrompt:'Excluir "{file}"?',countOne:"{count} arquivo na sua biblioteca",countMany:"{count} arquivos na sua biblioteca",downloadToDevice:"Baixar para o dispositivo",deleteFile:"Excluir arquivo",play:"Reproduzir"},monitor:{title:"Monitor de playlists",subtitle:"Adicione playlists do Spotify para monitorar. Novas faixas adicionadas a essas playlists serão baixadas automaticamente.",watchNew:"Monitorar uma nova playlist",urlPlaceholder:"Cole uma URL de playlist do Spotify…",watch:"Monitorar",failedAdd:"Falha ao adicionar a playlist. Verifique a URL e tente novamente.",empty:"Nenhuma playlist sendo monitorada ainda.",emptyHint:"Cole um link de playlist do Spotify acima para começar.",active:"Ativa",paused:"Pausada",everyInterval:"A cada {interval}",tracksOne:"{count} faixa",tracksMany:"{count} faixas",checked:"Verificada {when}",notChecked:"Ainda não verificada",pause:"Pausar monitoramento",resume:"Retomar monitoramento",checkNow:"Verificar agora",stop:"Parar de monitorar",deletePrompt:'Parar de monitorar "{name}"?',info:"Quando você adiciona uma playlist, o Downtify baixa todas as faixas atuais dela e segue monitorando. Qualquer música adicionada depois no Spotify é detectada e baixada automaticamente na próxima verificação.",every15:"A cada 15 min",every30:"A cada 30 min",every1h:"A cada hora",every3h:"A cada 3 h",every6h:"A cada 6 h",every12h:"A cada 12 h",every1d:"Todo dia",every1w:"Toda semana",every2w:"A cada 2 semanas",every1mo:"Todo mês",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 dia",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mês",minSuffix:"min",hourSuffix:"h",daySuffix:"dia",daysSuffix:"dias",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mês",monthsSuffix:"meses",timeJustNow:"agora mesmo",timeMinAgo:"há {n} min",timeHourAgo:"há {n} h",timeDayAgo:"há {n} dia(s)"},settings:{title:"Configurações",subtitle:"Ajuste como o Downtify baixa e marca suas músicas.",audioSource:"Fonte de áudio",lyricsSource:"Fonte de letras",lyricsHint:"apenas o lrclib está ativo",downloadLyrics:"Baixar letras",downloadLyricsHint:"Incorpora letras nos arquivos de áudio e grava arquivos .lrc",lyricsProvider:"Provedor",format:"Formato",quality:"Qualidade",qualityIgnored:"ignorada (sem perdas)",playlistsSection:"Playlists",generateM3u:"Gerar arquivo M3U para playlists",generateM3uHint:"Grava Playlists/.m3u junto com as faixas, tanto para downloads manuais de playlist quanto para varreduras do Monitor.",organizationSection:"Organização de arquivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Salva as músicas em subpastas com o nome do artista. Músicas de playlists também são salvas na pasta do artista, não na pasta da playlist.",parallelDownloads:"Downloads paralelos",parallelDownloadsHint:"Número máximo de músicas baixadas ao mesmo tempo. Valores maiores são mais rápidos, mas consomem mais banda.",saved:"Alterações salvas",saveError:"Não foi possível salvar as configurações.",language:"Idioma",languageHint:"Escolha o idioma da interface"},player:{title:"Player",subtitle:"Ouça as músicas que você baixou.",empty:"Nada para tocar ainda",emptyHint:"Baixe alguma música para começar a ouvir.",queue:"Fila",play:"Reproduzir",pause:"Pausar",previous:"Anterior",next:"Próxima",shuffle:"Aleatório",shuffleOn:"Aleatório ligado",shuffleOff:"Aleatório desligado",repeatOff:"Repetição desligada",repeatAll:"Repetir tudo",repeatOne:"Repetir uma",volume:"Volume",mute:"Mudo",unmute:"Tirar mudo",nowPlaying:"Tocando agora",upNext:"A seguir",playFromLibrary:"Abrir no player",countOne:"{count} faixa",countMany:"{count} faixas"},footer:{tagline:"Baixador de músicas de código aberto"}},vs=[{code:"en",name:"English",messages:ih},{code:"es",name:"Español",messages:lh},{code:"pt-BR",name:"Português (BR)",messages:ah}],uo="en",Rc="downtify-locale",fl=(()=>{try{return localStorage.getItem(Rc)}catch{return null}})(),ch=vs.find(e=>e.code===fl)?fl:uo,ko=ne(ch);function dl(e){return vs.find(t=>t.code===e)||vs.find(t=>t.code===uo)}function hl(e,t){if(!e)return;const n=t.split(".");let s=e;for(const o of n){if(s==null||typeof s!="object")return;s=s[o]}return typeof s=="string"?s:void 0}function uh(e,t){return t?e.replace(/\{(\w+)\}/g,(n,s)=>t[s]!==void 0&&t[s]!==null?String(t[s]):`{${s}}`):e}function fh(e,t){const n=ko.value;let s=hl(dl(n).messages,e);return s===void 0&&n!==uo&&(s=hl(dl(uo).messages,e)),uh(s!==void 0?s:e,t)}function dh(e){if(vs.find(t=>t.code===e)){ko.value=e;try{localStorage.setItem(Rc,e)}catch{}typeof document<"u"&&document.documentElement.setAttribute("lang",e)}}function _t(){return{t:fh,locale:ko,setLocale:dh,locales:vs}}typeof document<"u"&&document.documentElement.setAttribute("lang",ko.value);const hh={class:"mt-auto px-6 py-6 text-center text-sm text-base-content/60"},ph={__name:"Footer",setup(e){const{t}=_t();return(n,s)=>(R(),I("footer",hh,[s[0]||(s[0]=h("a",{class:"font-semibold text-primary hover:underline",href:"https://github.com/henriquesebastiao/downtify",target:"_blank",rel:"noopener"},"Downtify",-1)),s[1]||(s[1]=h("span",{class:"mx-2 opacity-50"},"·",-1)),h("span",null,E(d(t)("footer.tagline")),1)]))}},Cc=/^[a-z0-9]+(-[a-z0-9]+)*$/,Oo=(e,t,n,s="")=>{const o=e.split(":");if(e.slice(0,1)==="@"){if(o.length<2||o.length>3)return null;s=o.shift().slice(1)}if(o.length>3||!o.length)return null;if(o.length>1){const l=o.pop(),a=o.pop(),u={provider:o.length>0?o[0]:s,prefix:a,name:l};return t&&!Gs(u)?null:u}const r=o[0],i=r.split("-");if(i.length>1){const l={provider:s,prefix:i.shift(),name:i.join("-")};return t&&!Gs(l)?null:l}if(n&&s===""){const l={provider:s,prefix:"",name:r};return t&&!Gs(l,n)?null:l}return null},Gs=(e,t)=>e?!!((t&&e.prefix===""||e.prefix)&&e.name):!1,kc=Object.freeze({left:0,top:0,width:16,height:16}),fo=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),To=Object.freeze({...kc,...fo}),Rr=Object.freeze({...To,body:"",hidden:!1});function mh(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const s=((e.rotate||0)+(t.rotate||0))%4;return s&&(n.rotate=s),n}function pl(e,t){const n=mh(e,t);for(const s in Rr)s in fo?s in e&&!(s in n)&&(n[s]=fo[s]):s in t?n[s]=t[s]:s in e&&(n[s]=e[s]);return n}function gh(e,t){const n=e.icons,s=e.aliases||Object.create(null),o=Object.create(null);function r(i){if(n[i])return o[i]=[];if(!(i in o)){o[i]=null;const l=s[i]&&s[i].parent,a=l&&r(l);a&&(o[i]=[l].concat(a))}return o[i]}return Object.keys(n).concat(Object.keys(s)).forEach(r),o}function yh(e,t,n){const s=e.icons,o=e.aliases||Object.create(null);let r={};function i(l){r=pl(s[l]||o[l],r)}return i(t),n.forEach(i),pl(e,r)}function Oc(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(o=>{t(o,null),n.push(o)});const s=gh(e);for(const o in s){const r=s[o];r&&(t(o,yh(e,o,r)),n.push(o))}return n}const vh={provider:"",aliases:{},not_found:{},...kc};function er(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function Tc(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!er(e,vh))return null;const n=t.icons;for(const o in n){const r=n[o];if(!o||typeof r.body!="string"||!er(r,Rr))return null}const s=t.aliases||Object.create(null);for(const o in s){const r=s[o],i=r.parent;if(!o||typeof i!="string"||!n[i]&&!s[i]||!er(r,Rr))return null}return t}const ml=Object.create(null);function bh(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function Dn(e,t){const n=ml[e]||(ml[e]=Object.create(null));return n[t]||(n[t]=bh(e,t))}function Pc(e,t){return Tc(t)?Oc(t,(n,s)=>{s?e.icons[n]=s:e.missing.add(n)}):[]}function _h(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let bs=!1;function Ic(e){return typeof e=="boolean"&&(bs=e),bs}function wh(e){const t=typeof e=="string"?Oo(e,!0,bs):e;if(t){const n=Dn(t.provider,t.prefix),s=t.name;return n.icons[s]||(n.missing.has(s)?null:void 0)}}function xh(e,t){const n=Oo(e,!0,bs);if(!n)return!1;const s=Dn(n.provider,n.prefix);return t?_h(s,n.name,t):(s.missing.add(n.name),!0)}function Sh(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),bs&&!t&&!e.prefix){let o=!1;return Tc(e)&&(e.prefix="",Oc(e,(r,i)=>{xh(r,i)&&(o=!0)})),o}const n=e.prefix;if(!Gs({prefix:n,name:"a"}))return!1;const s=Dn(t,n);return!!Pc(s,e)}const $c=Object.freeze({width:null,height:null}),Nc=Object.freeze({...$c,...fo}),Eh=/(-?[0-9.]*[0-9]+[0-9.]*)/g,Ah=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function gl(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const s=e.split(Eh);if(s===null||!s.length)return e;const o=[];let r=s.shift(),i=Ah.test(r);for(;;){if(i){const l=parseFloat(r);isNaN(l)?o.push(r):o.push(Math.ceil(l*t*n)/n)}else o.push(r);if(r=s.shift(),r===void 0)return o.join("");i=!i}}function Rh(e,t="defs"){let n="";const s=e.indexOf("<"+t);for(;s>=0;){const o=e.indexOf(">",s),r=e.indexOf("",r);if(i===-1)break;n+=e.slice(o+1,r).trim(),e=e.slice(0,s).trim()+e.slice(i+1)}return{defs:n,content:e}}function Ch(e,t){return e?""+e+""+t:t}function kh(e,t,n){const s=Rh(e);return Ch(s.defs,t+s.content+n)}const Oh=e=>e==="unset"||e==="undefined"||e==="none";function Th(e,t){const n={...To,...e},s={...Nc,...t},o={left:n.left,top:n.top,width:n.width,height:n.height};let r=n.body;[n,s].forEach(w=>{const b=[],A=w.hFlip,C=w.vFlip;let S=w.rotate;A?C?S+=2:(b.push("translate("+(o.width+o.left).toString()+" "+(0-o.top).toString()+")"),b.push("scale(-1 1)"),o.top=o.left=0):C&&(b.push("translate("+(0-o.left).toString()+" "+(o.height+o.top).toString()+")"),b.push("scale(1 -1)"),o.top=o.left=0);let $;switch(S<0&&(S-=Math.floor(S/4)*4),S=S%4,S){case 1:$=o.height/2+o.top,b.unshift("rotate(90 "+$.toString()+" "+$.toString()+")");break;case 2:b.unshift("rotate(180 "+(o.width/2+o.left).toString()+" "+(o.height/2+o.top).toString()+")");break;case 3:$=o.width/2+o.left,b.unshift("rotate(-90 "+$.toString()+" "+$.toString()+")");break}S%2===1&&(o.left!==o.top&&($=o.left,o.left=o.top,o.top=$),o.width!==o.height&&($=o.width,o.width=o.height,o.height=$)),b.length&&(r=kh(r,'',""))});const i=s.width,l=s.height,a=o.width,u=o.height;let c,f;i===null?(f=l===null?"1em":l==="auto"?u:l,c=gl(f,a/u)):(c=i==="auto"?a:i,f=l===null?gl(c,u/a):l==="auto"?u:l);const p={},g=(w,b)=>{Oh(b)||(p[w]=b.toString())};g("width",c),g("height",f);const v=[o.left,o.top,a,u];return p.viewBox=v.join(" "),{attributes:p,viewBox:v,body:r}}const Ph=/\sid="(\S+)"/g,Ih="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let $h=0;function Nh(e,t=Ih){const n=[];let s;for(;s=Ph.exec(e);)n.push(s[1]);if(!n.length)return e;const o="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(r=>{const i=typeof t=="function"?t(r):t+($h++).toString(),l=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+i+o+"$3")}),e=e.replace(new RegExp(o,"g"),""),e}const Cr=Object.create(null);function Dh(e,t){Cr[e]=t}function kr(e){return Cr[e]||Cr[""]}function ri(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const ii=Object.create(null),Qn=["https://api.simplesvg.com","https://api.unisvg.com"],Qs=[];for(;Qn.length>0;)Qn.length===1||Math.random()>.5?Qs.push(Qn.shift()):Qs.push(Qn.pop());ii[""]=ri({resources:["https://api.iconify.design"].concat(Qs)});function Lh(e,t){const n=ri(t);return n===null?!1:(ii[e]=n,!0)}function li(e){return ii[e]}const Mh=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let yl=Mh();function Fh(e,t){const n=li(e);if(!n)return 0;let s;if(!n.maxURL)s=0;else{let o=0;n.resources.forEach(i=>{o=Math.max(o,i.length)});const r=t+".json?icons=";s=n.maxURL-o-n.path.length-r.length}return s}function Uh(e){return e===404}const Bh=(e,t,n)=>{const s=[],o=Fh(e,t),r="icons";let i={type:r,provider:e,prefix:t,icons:[]},l=0;return n.forEach((a,u)=>{l+=a.length+1,l>=o&&u>0&&(s.push(i),i={type:r,provider:e,prefix:t,icons:[]},l=a.length),i.icons.push(a)}),s.push(i),s};function jh(e){if(typeof e=="string"){const t=li(e);if(t)return t.path}return"/"}const Hh=(e,t,n)=>{if(!yl){n("abort",424);return}let s=jh(t.provider);switch(t.type){case"icons":{const r=t.prefix,l=t.icons.join(","),a=new URLSearchParams({icons:l});s+=r+".json?"+a.toString();break}case"custom":{const r=t.uri;s+=r.slice(0,1)==="/"?r.slice(1):r;break}default:n("abort",400);return}let o=503;yl(e+s).then(r=>{const i=r.status;if(i!==200){setTimeout(()=>{n(Uh(i)?"abort":"next",i)});return}return o=501,r.json()}).then(r=>{if(typeof r!="object"||r===null){setTimeout(()=>{r===404?n("abort",r):n("next",o)});return}setTimeout(()=>{n("success",r)})}).catch(()=>{n("next",o)})},Vh={prepare:Bh,send:Hh};function qh(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((o,r)=>o.provider!==r.provider?o.provider.localeCompare(r.provider):o.prefix!==r.prefix?o.prefix.localeCompare(r.prefix):o.name.localeCompare(r.name));let s={provider:"",prefix:"",name:""};return e.forEach(o=>{if(s.name===o.name&&s.prefix===o.prefix&&s.provider===o.provider)return;s=o;const r=o.provider,i=o.prefix,l=o.name,a=n[r]||(n[r]=Object.create(null)),u=a[i]||(a[i]=Dn(r,i));let c;l in u.icons?c=t.loaded:i===""||u.missing.has(l)?c=t.missing:c=t.pending;const f={provider:r,prefix:i,name:l};c.push(f)}),t}function Dc(e,t){e.forEach(n=>{const s=n.loaderCallbacks;s&&(n.loaderCallbacks=s.filter(o=>o.id!==t))})}function Wh(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const s=e.provider,o=e.prefix;t.forEach(r=>{const i=r.icons,l=i.pending.length;i.pending=i.pending.filter(a=>{if(a.prefix!==o)return!0;const u=a.name;if(e.icons[u])i.loaded.push({provider:s,prefix:o,name:u});else if(e.missing.has(u))i.missing.push({provider:s,prefix:o,name:u});else return n=!0,!0;return!1}),i.pending.length!==l&&(n||Dc([e],r.id),r.callback(i.loaded.slice(0),i.missing.slice(0),i.pending.slice(0),r.abort))})}))}let Kh=0;function zh(e,t,n){const s=Kh++,o=Dc.bind(null,n,s);if(!t.pending.length)return o;const r={id:s,icons:t,callback:e,abort:o};return n.forEach(i=>{(i.loaderCallbacks||(i.loaderCallbacks=[])).push(r)}),o}function Gh(e,t=!0,n=!1){const s=[];return e.forEach(o=>{const r=typeof o=="string"?Oo(o,t,n):o;r&&s.push(r)}),s}var Qh={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function Jh(e,t,n,s){const o=e.resources.length,r=e.random?Math.floor(Math.random()*o):e.index;let i;if(e.random){let P=e.resources.slice(0);for(i=[];P.length>1;){const N=Math.floor(Math.random()*P.length);i.push(P[N]),P=P.slice(0,N).concat(P.slice(N+1))}i=i.concat(P)}else i=e.resources.slice(r).concat(e.resources.slice(0,r));const l=Date.now();let a="pending",u=0,c,f=null,p=[],g=[];typeof s=="function"&&g.push(s);function v(){f&&(clearTimeout(f),f=null)}function w(){a==="pending"&&(a="aborted"),v(),p.forEach(P=>{P.status==="pending"&&(P.status="aborted")}),p=[]}function b(P,N){N&&(g=[]),typeof P=="function"&&g.push(P)}function A(){return{startTime:l,payload:t,status:a,queriesSent:u,queriesPending:p.length,subscribe:b,abort:w}}function C(){a="failed",g.forEach(P=>{P(void 0,c)})}function S(){p.forEach(P=>{P.status==="pending"&&(P.status="aborted")}),p=[]}function $(P,N,Y){const z=N!=="success";switch(p=p.filter(te=>te!==P),a){case"pending":break;case"failed":if(z||!e.dataAfterTimeout)return;break;default:return}if(N==="abort"){c=Y,C();return}if(z){c=Y,p.length||(i.length?F():C());return}if(v(),S(),!e.random){const te=e.resources.indexOf(P.resource);te!==-1&&te!==e.index&&(e.index=te)}a="completed",g.forEach(te=>{te(Y)})}function F(){if(a!=="pending")return;v();const P=i.shift();if(P===void 0){if(p.length){f=setTimeout(()=>{v(),a==="pending"&&(S(),C())},e.timeout);return}C();return}const N={status:"pending",resource:P,callback:(Y,z)=>{$(N,Y,z)}};p.push(N),u++,f=setTimeout(F,e.rotate),n(P,t,N.callback)}return setTimeout(F),A}function Lc(e){const t={...Qh,...e};let n=[];function s(){n=n.filter(l=>l().status==="pending")}function o(l,a,u){const c=Jh(t,l,a,(f,p)=>{s(),u&&u(f,p)});return n.push(c),c}function r(l){return n.find(a=>l(a))||null}return{query:o,find:r,setIndex:l=>{t.index=l},getIndex:()=>t.index,cleanup:s}}function vl(){}const tr=Object.create(null);function Yh(e){if(!tr[e]){const t=li(e);if(!t)return;const n=Lc(t),s={config:t,redundancy:n};tr[e]=s}return tr[e]}function Xh(e,t,n){let s,o;if(typeof e=="string"){const r=kr(e);if(!r)return n(void 0,424),vl;o=r.send;const i=Yh(e);i&&(s=i.redundancy)}else{const r=ri(e);if(r){s=Lc(r);const i=e.resources?e.resources[0]:"",l=kr(i);l&&(o=l.send)}}return!s||!o?(n(void 0,424),vl):s.query(t,o,n)().abort}function bl(){}function Zh(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,Wh(e)}))}function ep(e){const t=[],n=[];return e.forEach(s=>{(s.match(Cc)?t:n).push(s)}),{valid:t,invalid:n}}function Jn(e,t,n){function s(){const o=e.pendingIcons;t.forEach(r=>{o&&o.delete(r),e.icons[r]||e.missing.add(r)})}if(n&&typeof n=="object")try{if(!Pc(e,n).length){s();return}}catch(o){console.error(o)}s(),Zh(e)}function _l(e,t){e instanceof Promise?e.then(n=>{t(n)}).catch(()=>{t(null)}):t(e)}function tp(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:s}=e,o=e.iconsToLoad;if(delete e.iconsToLoad,!o||!o.length)return;const r=e.loadIcon;if(e.loadIcons&&(o.length>1||!r)){_l(e.loadIcons(o,s,n),c=>{Jn(e,o,c)});return}if(r){o.forEach(c=>{const f=r(c,s,n);_l(f,p=>{const g=p?{prefix:s,icons:{[c]:p}}:null;Jn(e,[c],g)})});return}const{valid:i,invalid:l}=ep(o);if(l.length&&Jn(e,l,null),!i.length)return;const a=s.match(Cc)?kr(n):null;if(!a){Jn(e,i,null);return}a.prepare(n,s,i).forEach(c=>{Xh(n,c,f=>{Jn(e,c.icons,f)})})}))}const np=(e,t)=>{const n=Gh(e,!0,Ic()),s=qh(n);if(!s.pending.length){let a=!0;return t&&setTimeout(()=>{a&&t(s.loaded,s.missing,s.pending,bl)}),()=>{a=!1}}const o=Object.create(null),r=[];let i,l;return s.pending.forEach(a=>{const{provider:u,prefix:c}=a;if(c===l&&u===i)return;i=u,l=c,r.push(Dn(u,c));const f=o[u]||(o[u]=Object.create(null));f[c]||(f[c]=[])}),s.pending.forEach(a=>{const{provider:u,prefix:c,name:f}=a,p=Dn(u,c),g=p.pendingIcons||(p.pendingIcons=new Set);g.has(f)||(g.add(f),o[u][c].push(f))}),r.forEach(a=>{const u=o[a.provider][a.prefix];u.length&&tp(a,u)}),t?zh(t,s,r):bl};function sp(e,t){const n={...e};for(const s in t){const o=t[s],r=typeof o;s in $c?(o===null||o&&(r==="string"||r==="number"))&&(n[s]=o):r===typeof n[s]&&(n[s]=s==="rotate"?o%4:o)}return n}const op=/[\s,]+/;function rp(e,t){t.split(op).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function ip(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function s(o){for(;o<0;)o+=4;return o%4}if(n===""){const o=parseInt(e);return isNaN(o)?0:s(o)}else if(n!==e){let o=0;switch(n){case"%":o=25;break;case"deg":o=90}if(o){let r=parseFloat(e.slice(0,e.length-n.length));return isNaN(r)?0:(r=r/o,r%1===0?s(r):0)}}return t}function lp(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const s in t)n+=" "+s+'="'+t[s]+'"';return'"+e+""}function ap(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function cp(e){return"data:image/svg+xml,"+ap(e)}function up(e){return'url("'+cp(e)+'")'}const wl={...Nc,inline:!1},fp={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},dp={display:"inline-block"},Or={backgroundColor:"currentColor"},Mc={backgroundColor:"transparent"},xl={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Sl={webkitMask:Or,mask:Or,background:Mc};for(const e in Sl){const t=Sl[e];for(const n in xl)t[e+n]=xl[n]}const Js={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";Js[e+"-flip"]=t,Js[e.slice(0,1)+"-flip"]=t,Js[e+"Flip"]=t});function El(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const Al=(e,t)=>{const n=sp(wl,t),s={...fp},o=t.mode||"svg",r={},i=t.style,l=typeof i=="object"&&!(i instanceof Array)?i:{};for(let w in t){const b=t[w];if(b!==void 0)switch(w){case"icon":case"style":case"onLoad":case"mode":case"ssr":break;case"inline":case"hFlip":case"vFlip":n[w]=b===!0||b==="true"||b===1;break;case"flip":typeof b=="string"&&rp(n,b);break;case"color":r.color=b;break;case"rotate":typeof b=="string"?n[w]=ip(b):typeof b=="number"&&(n[w]=b);break;case"ariaHidden":case"aria-hidden":b!==!0&&b!=="true"&&delete s["aria-hidden"];break;default:{const A=Js[w];A?(b===!0||b==="true"||b===1)&&(n[A]=!0):wl[w]===void 0&&(s[w]=b)}}}const a=Th(e,n),u=a.attributes;if(n.inline&&(r.verticalAlign="-0.125em"),o==="svg"){s.style={...r,...l},Object.assign(s,u);let w=0,b=t.id;return typeof b=="string"&&(b=b.replace(/-/g,"_")),s.innerHTML=Nh(a.body,b?()=>b+"ID"+w++:"iconifyVue"),ms("svg",s)}const{body:c,width:f,height:p}=e,g=o==="mask"||(o==="bg"?!1:c.indexOf("currentColor")!==-1),v=lp(c,{...u,width:f+"",height:p+""});return s.style={...r,"--svg":up(v),width:El(u.width),height:El(u.height),...dp,...g?Or:Mc,...l},ms("span",s)};Ic(!0);Dh("",Vh);if(typeof document<"u"&&typeof window<"u"){const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(s=>{try{(typeof s!="object"||s===null||s instanceof Array||typeof s.icons!="object"||typeof s.prefix!="string"||!Sh(s))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const s="IconifyProviders["+n+"] is invalid.";try{const o=t[n];if(typeof o!="object"||!o||o.resources===void 0)continue;Lh(n,o)||console.error(s)}catch{console.error(s)}}}}const hp={...To,body:""},K=Zr({inheritAttrs:!1,data(){return{_name:"",_loadingIcon:null,iconMounted:!1,counter:0}},mounted(){this.iconMounted=!0},unmounted(){this.abortLoading()},methods:{abortLoading(){this._loadingIcon&&(this._loadingIcon.abort(),this._loadingIcon=null)},getIcon(e,t,n){if(typeof e=="object"&&e!==null&&typeof e.body=="string")return this._name="",this.abortLoading(),{data:e};let s;if(typeof e!="string"||(s=Oo(e,!1,!0))===null)return this.abortLoading(),null;let o=wh(s);if(!o)return(!this._loadingIcon||this._loadingIcon.name!==e)&&(this.abortLoading(),this._name="",o!==null&&(this._loadingIcon={name:e,abort:np([s],()=>{this.counter++})})),null;if(this.abortLoading(),this._name!==e&&(this._name=e,t&&t(e)),n){o=Object.assign({},o);const i=n(o.body,s.name,s.prefix,s.provider);typeof i=="string"&&(o.body=i)}const r=["iconify"];return s.prefix!==""&&r.push("iconify--"+s.prefix),s.provider!==""&&r.push("iconify--"+s.provider),{data:o,classes:r}}},render(){this.counter;const e=this.$attrs,t=this.iconMounted||e.ssr?this.getIcon(e.icon,e.onLoad,e.customise):null;if(!t)return Al(hp,e);let n=e;return t.classes&&(n={...e,class:(typeof e.class=="string"?e.class+" ":"")+t.classes.join(" ")}),Al({...To,...t.data},n)}});function Fc(e,t){return function(){return e.apply(t,arguments)}}const{toString:pp}=Object.prototype,{getPrototypeOf:ai}=Object,{iterator:Po,toStringTag:Uc}=Symbol,Io=(e=>t=>{const n=pp.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),wt=e=>(e=e.toLowerCase(),t=>Io(t)===e),$o=e=>t=>typeof t===e,{isArray:Hn}=Array,Ln=$o("undefined");function Es(e){return e!==null&&!Ln(e)&&e.constructor!==null&&!Ln(e.constructor)&&Xe(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Bc=wt("ArrayBuffer");function mp(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Bc(e.buffer),t}const gp=$o("string"),Xe=$o("function"),jc=$o("number"),As=e=>e!==null&&typeof e=="object",yp=e=>e===!0||e===!1,Ys=e=>{if(Io(e)!=="object")return!1;const t=ai(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Uc in e)&&!(Po in e)},vp=e=>{if(!As(e)||Es(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},bp=wt("Date"),_p=wt("File"),wp=wt("Blob"),xp=wt("FileList"),Sp=e=>As(e)&&Xe(e.pipe),Ep=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Xe(e.append)&&((t=Io(e))==="formdata"||t==="object"&&Xe(e.toString)&&e.toString()==="[object FormData]"))},Ap=wt("URLSearchParams"),[Rp,Cp,kp,Op]=["ReadableStream","Request","Response","Headers"].map(wt),Tp=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Rs(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let s,o;if(typeof e!="object"&&(e=[e]),Hn(e))for(s=0,o=e.length;s0;)if(o=n[s],t===o.toLowerCase())return o;return null}const yn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Vc=e=>!Ln(e)&&e!==yn;function Tr(){const{caseless:e,skipUndefined:t}=Vc(this)&&this||{},n={},s=(o,r)=>{if(r==="__proto__"||r==="constructor"||r==="prototype")return;const i=e&&Hc(n,r)||r;Ys(n[i])&&Ys(o)?n[i]=Tr(n[i],o):Ys(o)?n[i]=Tr({},o):Hn(o)?n[i]=o.slice():(!t||!Ln(o))&&(n[i]=o)};for(let o=0,r=arguments.length;o(Rs(t,(o,r)=>{n&&Xe(o)?Object.defineProperty(e,r,{value:Fc(o,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:s}),e),Ip=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),$p=(e,t,n,s)=>{e.prototype=Object.create(t.prototype,s),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},Np=(e,t,n,s)=>{let o,r,i;const l={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),r=o.length;r-- >0;)i=o[r],(!s||s(i,e,t))&&!l[i]&&(t[i]=e[i],l[i]=!0);e=n!==!1&&ai(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Dp=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const s=e.indexOf(t,n);return s!==-1&&s===n},Lp=e=>{if(!e)return null;if(Hn(e))return e;let t=e.length;if(!jc(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Mp=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&ai(Uint8Array)),Fp=(e,t)=>{const s=(e&&e[Po]).call(e);let o;for(;(o=s.next())&&!o.done;){const r=o.value;t.call(e,r[0],r[1])}},Up=(e,t)=>{let n;const s=[];for(;(n=e.exec(t))!==null;)s.push(n);return s},Bp=wt("HTMLFormElement"),jp=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,s,o){return s.toUpperCase()+o}),Rl=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Hp=wt("RegExp"),qc=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),s={};Rs(n,(o,r)=>{let i;(i=t(o,r,e))!==!1&&(s[r]=i||o)}),Object.defineProperties(e,s)},Vp=e=>{qc(e,(t,n)=>{if(Xe(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const s=e[n];if(Xe(s)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},qp=(e,t)=>{const n={},s=o=>{o.forEach(r=>{n[r]=!0})};return Hn(e)?s(e):s(String(e).split(t)),n},Wp=()=>{},Kp=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function zp(e){return!!(e&&Xe(e.append)&&e[Uc]==="FormData"&&e[Po])}const Gp=e=>{const t=new Array(10),n=(s,o)=>{if(As(s)){if(t.indexOf(s)>=0)return;if(Es(s))return s;if(!("toJSON"in s)){t[o]=s;const r=Hn(s)?[]:{};return Rs(s,(i,l)=>{const a=n(i,o+1);!Ln(a)&&(r[l]=a)}),t[o]=void 0,r}}return s};return n(e,0)},Qp=wt("AsyncFunction"),Jp=e=>e&&(As(e)||Xe(e))&&Xe(e.then)&&Xe(e.catch),Wc=((e,t)=>e?setImmediate:t?((n,s)=>(yn.addEventListener("message",({source:o,data:r})=>{o===yn&&r===n&&s.length&&s.shift()()},!1),o=>{s.push(o),yn.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",Xe(yn.postMessage)),Yp=typeof queueMicrotask<"u"?queueMicrotask.bind(yn):typeof process<"u"&&process.nextTick||Wc,Xp=e=>e!=null&&Xe(e[Po]),x={isArray:Hn,isArrayBuffer:Bc,isBuffer:Es,isFormData:Ep,isArrayBufferView:mp,isString:gp,isNumber:jc,isBoolean:yp,isObject:As,isPlainObject:Ys,isEmptyObject:vp,isReadableStream:Rp,isRequest:Cp,isResponse:kp,isHeaders:Op,isUndefined:Ln,isDate:bp,isFile:_p,isBlob:wp,isRegExp:Hp,isFunction:Xe,isStream:Sp,isURLSearchParams:Ap,isTypedArray:Mp,isFileList:xp,forEach:Rs,merge:Tr,extend:Pp,trim:Tp,stripBOM:Ip,inherits:$p,toFlatObject:Np,kindOf:Io,kindOfTest:wt,endsWith:Dp,toArray:Lp,forEachEntry:Fp,matchAll:Up,isHTMLForm:Bp,hasOwnProperty:Rl,hasOwnProp:Rl,reduceDescriptors:qc,freezeMethods:Vp,toObjectSet:qp,toCamelCase:jp,noop:Wp,toFiniteNumber:Kp,findKey:Hc,global:yn,isContextDefined:Vc,isSpecCompliantForm:zp,toJSONObject:Gp,isAsyncFn:Qp,isThenable:Jp,setImmediate:Wc,asap:Yp,isIterable:Xp};let Z=class Kc extends Error{static from(t,n,s,o,r,i){const l=new Kc(t.message,n||t.code,s,o,r);return l.cause=t,l.name=t.name,i&&Object.assign(l,i),l}constructor(t,n,s,o,r){super(t),this.name="AxiosError",this.isAxiosError=!0,n&&(this.code=n),s&&(this.config=s),o&&(this.request=o),r&&(this.response=r,this.status=r.status)}toJSON(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:x.toJSONObject(this.config),code:this.code,status:this.status}}};Z.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";Z.ERR_BAD_OPTION="ERR_BAD_OPTION";Z.ECONNABORTED="ECONNABORTED";Z.ETIMEDOUT="ETIMEDOUT";Z.ERR_NETWORK="ERR_NETWORK";Z.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";Z.ERR_DEPRECATED="ERR_DEPRECATED";Z.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";Z.ERR_BAD_REQUEST="ERR_BAD_REQUEST";Z.ERR_CANCELED="ERR_CANCELED";Z.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";Z.ERR_INVALID_URL="ERR_INVALID_URL";const Zp=null;function Pr(e){return x.isPlainObject(e)||x.isArray(e)}function zc(e){return x.endsWith(e,"[]")?e.slice(0,-2):e}function Cl(e,t,n){return e?e.concat(t).map(function(o,r){return o=zc(o),!n&&r?"["+o+"]":o}).join(n?".":""):t}function em(e){return x.isArray(e)&&!e.some(Pr)}const tm=x.toFlatObject(x,{},null,function(t){return/^is[A-Z]/.test(t)});function No(e,t,n){if(!x.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=x.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(w,b){return!x.isUndefined(b[w])});const s=n.metaTokens,o=n.visitor||c,r=n.dots,i=n.indexes,a=(n.Blob||typeof Blob<"u"&&Blob)&&x.isSpecCompliantForm(t);if(!x.isFunction(o))throw new TypeError("visitor must be a function");function u(v){if(v===null)return"";if(x.isDate(v))return v.toISOString();if(x.isBoolean(v))return v.toString();if(!a&&x.isBlob(v))throw new Z("Blob is not supported. Use a Buffer instead.");return x.isArrayBuffer(v)||x.isTypedArray(v)?a&&typeof Blob=="function"?new Blob([v]):Buffer.from(v):v}function c(v,w,b){let A=v;if(v&&!b&&typeof v=="object"){if(x.endsWith(w,"{}"))w=s?w:w.slice(0,-2),v=JSON.stringify(v);else if(x.isArray(v)&&em(v)||(x.isFileList(v)||x.endsWith(w,"[]"))&&(A=x.toArray(v)))return w=zc(w),A.forEach(function(S,$){!(x.isUndefined(S)||S===null)&&t.append(i===!0?Cl([w],$,r):i===null?w:w+"[]",u(S))}),!1}return Pr(v)?!0:(t.append(Cl(b,w,r),u(v)),!1)}const f=[],p=Object.assign(tm,{defaultVisitor:c,convertValue:u,isVisitable:Pr});function g(v,w){if(!x.isUndefined(v)){if(f.indexOf(v)!==-1)throw Error("Circular reference detected in "+w.join("."));f.push(v),x.forEach(v,function(A,C){(!(x.isUndefined(A)||A===null)&&o.call(t,A,x.isString(C)?C.trim():C,w,p))===!0&&g(A,w?w.concat(C):[C])}),f.pop()}}if(!x.isObject(e))throw new TypeError("data must be an object");return g(e),t}function kl(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(s){return t[s]})}function ci(e,t){this._pairs=[],e&&No(e,this,t)}const Gc=ci.prototype;Gc.append=function(t,n){this._pairs.push([t,n])};Gc.toString=function(t){const n=t?function(s){return t.call(this,s,kl)}:kl;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function nm(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Qc(e,t,n){if(!t)return e;const s=n&&n.encode||nm,o=x.isFunction(n)?{serialize:n}:n,r=o&&o.serialize;let i;if(r?i=r(t,o):i=x.isURLSearchParams(t)?t.toString():new ci(t,o).toString(s),i){const l=e.indexOf("#");l!==-1&&(e=e.slice(0,l)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class Ol{constructor(){this.handlers=[]}use(t,n,s){return this.handlers.push({fulfilled:t,rejected:n,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){x.forEach(this.handlers,function(s){s!==null&&t(s)})}}const ui={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},sm=typeof URLSearchParams<"u"?URLSearchParams:ci,om=typeof FormData<"u"?FormData:null,rm=typeof Blob<"u"?Blob:null,im={isBrowser:!0,classes:{URLSearchParams:sm,FormData:om,Blob:rm},protocols:["http","https","file","blob","url","data"]},fi=typeof window<"u"&&typeof document<"u",Ir=typeof navigator=="object"&&navigator||void 0,lm=fi&&(!Ir||["ReactNative","NativeScript","NS"].indexOf(Ir.product)<0),am=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",cm=fi&&window.location.href||"http://localhost",um=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:fi,hasStandardBrowserEnv:lm,hasStandardBrowserWebWorkerEnv:am,navigator:Ir,origin:cm},Symbol.toStringTag,{value:"Module"})),Be={...um,...im};function fm(e,t){return No(e,new Be.classes.URLSearchParams,{visitor:function(n,s,o,r){return Be.isNode&&x.isBuffer(n)?(this.append(s,n.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...t})}function dm(e){return x.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function hm(e){const t={},n=Object.keys(e);let s;const o=n.length;let r;for(s=0;s=n.length;return i=!i&&x.isArray(o)?o.length:i,a?(x.hasOwnProp(o,i)?o[i]=[o[i],s]:o[i]=s,!l):((!o[i]||!x.isObject(o[i]))&&(o[i]=[]),t(n,s,o[i],r)&&x.isArray(o[i])&&(o[i]=hm(o[i])),!l)}if(x.isFormData(e)&&x.isFunction(e.entries)){const n={};return x.forEachEntry(e,(s,o)=>{t(dm(s),o,n,0)}),n}return null}function pm(e,t,n){if(x.isString(e))try{return(t||JSON.parse)(e),x.trim(e)}catch(s){if(s.name!=="SyntaxError")throw s}return(n||JSON.stringify)(e)}const Cs={transitional:ui,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const s=n.getContentType()||"",o=s.indexOf("application/json")>-1,r=x.isObject(t);if(r&&x.isHTMLForm(t)&&(t=new FormData(t)),x.isFormData(t))return o?JSON.stringify(Jc(t)):t;if(x.isArrayBuffer(t)||x.isBuffer(t)||x.isStream(t)||x.isFile(t)||x.isBlob(t)||x.isReadableStream(t))return t;if(x.isArrayBufferView(t))return t.buffer;if(x.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(r){if(s.indexOf("application/x-www-form-urlencoded")>-1)return fm(t,this.formSerializer).toString();if((l=x.isFileList(t))||s.indexOf("multipart/form-data")>-1){const a=this.env&&this.env.FormData;return No(l?{"files[]":t}:t,a&&new a,this.formSerializer)}}return r||o?(n.setContentType("application/json",!1),pm(t)):t}],transformResponse:[function(t){const n=this.transitional||Cs.transitional,s=n&&n.forcedJSONParsing,o=this.responseType==="json";if(x.isResponse(t)||x.isReadableStream(t))return t;if(t&&x.isString(t)&&(s&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t,this.parseReviver)}catch(l){if(i)throw l.name==="SyntaxError"?Z.from(l,Z.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Be.classes.FormData,Blob:Be.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};x.forEach(["delete","get","head","post","put","patch"],e=>{Cs.headers[e]={}});const mm=x.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),gm=e=>{const t={};let n,s,o;return e&&e.split(` -`).forEach(function(i){o=i.indexOf(":"),n=i.substring(0,o).trim().toLowerCase(),s=i.substring(o+1).trim(),!(!n||t[n]&&mm[n])&&(n==="set-cookie"?t[n]?t[n].push(s):t[n]=[s]:t[n]=t[n]?t[n]+", "+s:s)}),t},Tl=Symbol("internals");function Yn(e){return e&&String(e).trim().toLowerCase()}function Xs(e){return e===!1||e==null?e:x.isArray(e)?e.map(Xs):String(e)}function ym(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=n.exec(e);)t[s[1]]=s[2];return t}const vm=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function nr(e,t,n,s,o){if(x.isFunction(s))return s.call(this,t,n);if(o&&(t=n),!!x.isString(t)){if(x.isString(s))return t.indexOf(s)!==-1;if(x.isRegExp(s))return s.test(t)}}function bm(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,s)=>n.toUpperCase()+s)}function _m(e,t){const n=x.toCamelCase(" "+t);["get","set","has"].forEach(s=>{Object.defineProperty(e,s+n,{value:function(o,r,i){return this[s].call(this,t,o,r,i)},configurable:!0})})}let Ze=class{constructor(t){t&&this.set(t)}set(t,n,s){const o=this;function r(l,a,u){const c=Yn(a);if(!c)throw new Error("header name must be a non-empty string");const f=x.findKey(o,c);(!f||o[f]===void 0||u===!0||u===void 0&&o[f]!==!1)&&(o[f||a]=Xs(l))}const i=(l,a)=>x.forEach(l,(u,c)=>r(u,c,a));if(x.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(x.isString(t)&&(t=t.trim())&&!vm(t))i(gm(t),n);else if(x.isObject(t)&&x.isIterable(t)){let l={},a,u;for(const c of t){if(!x.isArray(c))throw TypeError("Object iterator must return a key-value pair");l[u=c[0]]=(a=l[u])?x.isArray(a)?[...a,c[1]]:[a,c[1]]:c[1]}i(l,n)}else t!=null&&r(n,t,s);return this}get(t,n){if(t=Yn(t),t){const s=x.findKey(this,t);if(s){const o=this[s];if(!n)return o;if(n===!0)return ym(o);if(x.isFunction(n))return n.call(this,o,s);if(x.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Yn(t),t){const s=x.findKey(this,t);return!!(s&&this[s]!==void 0&&(!n||nr(this,this[s],s,n)))}return!1}delete(t,n){const s=this;let o=!1;function r(i){if(i=Yn(i),i){const l=x.findKey(s,i);l&&(!n||nr(s,s[l],l,n))&&(delete s[l],o=!0)}}return x.isArray(t)?t.forEach(r):r(t),o}clear(t){const n=Object.keys(this);let s=n.length,o=!1;for(;s--;){const r=n[s];(!t||nr(this,this[r],r,t,!0))&&(delete this[r],o=!0)}return o}normalize(t){const n=this,s={};return x.forEach(this,(o,r)=>{const i=x.findKey(s,r);if(i){n[i]=Xs(o),delete n[r];return}const l=t?bm(r):String(r).trim();l!==r&&delete n[r],n[l]=Xs(o),s[l]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return x.forEach(this,(s,o)=>{s!=null&&s!==!1&&(n[o]=t&&x.isArray(s)?s.join(", "):s)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` -`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const s=new this(t);return n.forEach(o=>s.set(o)),s}static accessor(t){const s=(this[Tl]=this[Tl]={accessors:{}}).accessors,o=this.prototype;function r(i){const l=Yn(i);s[l]||(_m(o,i),s[l]=!0)}return x.isArray(t)?t.forEach(r):r(t),this}};Ze.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);x.reduceDescriptors(Ze.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(s){this[n]=s}}});x.freezeMethods(Ze);function sr(e,t){const n=this||Cs,s=t||n,o=Ze.from(s.headers);let r=s.data;return x.forEach(e,function(l){r=l.call(n,r,o.normalize(),t?t.status:void 0)}),o.normalize(),r}function Yc(e){return!!(e&&e.__CANCEL__)}let ks=class extends Z{constructor(t,n,s){super(t??"canceled",Z.ERR_CANCELED,n,s),this.name="CanceledError",this.__CANCEL__=!0}};function Xc(e,t,n){const s=n.config.validateStatus;!n.status||!s||s(n.status)?e(n):t(new Z("Request failed with status code "+n.status,[Z.ERR_BAD_REQUEST,Z.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function wm(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function xm(e,t){e=e||10;const n=new Array(e),s=new Array(e);let o=0,r=0,i;return t=t!==void 0?t:1e3,function(a){const u=Date.now(),c=s[r];i||(i=u),n[o]=a,s[o]=u;let f=r,p=0;for(;f!==o;)p+=n[f++],f=f%e;if(o=(o+1)%e,o===r&&(r=(r+1)%e),u-i{n=c,o=null,r&&(clearTimeout(r),r=null),e(...u)};return[(...u)=>{const c=Date.now(),f=c-n;f>=s?i(u,c):(o=u,r||(r=setTimeout(()=>{r=null,i(o)},s-f)))},()=>o&&i(o)]}const ho=(e,t,n=3)=>{let s=0;const o=xm(50,250);return Sm(r=>{const i=r.loaded,l=r.lengthComputable?r.total:void 0,a=i-s,u=o(a),c=i<=l;s=i;const f={loaded:i,total:l,progress:l?i/l:void 0,bytes:a,rate:u||void 0,estimated:u&&l&&c?(l-i)/u:void 0,event:r,lengthComputable:l!=null,[t?"download":"upload"]:!0};e(f)},n)},Pl=(e,t)=>{const n=e!=null;return[s=>t[0]({lengthComputable:n,total:e,loaded:s}),t[1]]},Il=e=>(...t)=>x.asap(()=>e(...t)),Em=Be.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,Be.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(Be.origin),Be.navigator&&/(msie|trident)/i.test(Be.navigator.userAgent)):()=>!0,Am=Be.hasStandardBrowserEnv?{write(e,t,n,s,o,r,i){if(typeof document>"u")return;const l=[`${e}=${encodeURIComponent(t)}`];x.isNumber(n)&&l.push(`expires=${new Date(n).toUTCString()}`),x.isString(s)&&l.push(`path=${s}`),x.isString(o)&&l.push(`domain=${o}`),r===!0&&l.push("secure"),x.isString(i)&&l.push(`SameSite=${i}`),document.cookie=l.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function Rm(e){return typeof e!="string"?!1:/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Cm(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function Zc(e,t,n){let s=!Rm(t);return e&&(s||n==!1)?Cm(e,t):t}const $l=e=>e instanceof Ze?{...e}:e;function xn(e,t){t=t||{};const n={};function s(u,c,f,p){return x.isPlainObject(u)&&x.isPlainObject(c)?x.merge.call({caseless:p},u,c):x.isPlainObject(c)?x.merge({},c):x.isArray(c)?c.slice():c}function o(u,c,f,p){if(x.isUndefined(c)){if(!x.isUndefined(u))return s(void 0,u,f,p)}else return s(u,c,f,p)}function r(u,c){if(!x.isUndefined(c))return s(void 0,c)}function i(u,c){if(x.isUndefined(c)){if(!x.isUndefined(u))return s(void 0,u)}else return s(void 0,c)}function l(u,c,f){if(f in t)return s(u,c);if(f in e)return s(void 0,u)}const a={url:r,method:r,data:r,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:l,headers:(u,c,f)=>o($l(u),$l(c),f,!0)};return x.forEach(Object.keys({...e,...t}),function(c){if(c==="__proto__"||c==="constructor"||c==="prototype")return;const f=x.hasOwnProp(a,c)?a[c]:o,p=f(e[c],t[c],c);x.isUndefined(p)&&f!==l||(n[c]=p)}),n}const eu=e=>{const t=xn({},e);let{data:n,withXSRFToken:s,xsrfHeaderName:o,xsrfCookieName:r,headers:i,auth:l}=t;if(t.headers=i=Ze.from(i),t.url=Qc(Zc(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&i.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),x.isFormData(n)){if(Be.hasStandardBrowserEnv||Be.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if(x.isFunction(n.getHeaders)){const a=n.getHeaders(),u=["content-type","content-length"];Object.entries(a).forEach(([c,f])=>{u.includes(c.toLowerCase())&&i.set(c,f)})}}if(Be.hasStandardBrowserEnv&&(s&&x.isFunction(s)&&(s=s(t)),s||s!==!1&&Em(t.url))){const a=o&&r&&Am.read(r);a&&i.set(o,a)}return t},km=typeof XMLHttpRequest<"u",Om=km&&function(e){return new Promise(function(n,s){const o=eu(e);let r=o.data;const i=Ze.from(o.headers).normalize();let{responseType:l,onUploadProgress:a,onDownloadProgress:u}=o,c,f,p,g,v;function w(){g&&g(),v&&v(),o.cancelToken&&o.cancelToken.unsubscribe(c),o.signal&&o.signal.removeEventListener("abort",c)}let b=new XMLHttpRequest;b.open(o.method.toUpperCase(),o.url,!0),b.timeout=o.timeout;function A(){if(!b)return;const S=Ze.from("getAllResponseHeaders"in b&&b.getAllResponseHeaders()),F={data:!l||l==="text"||l==="json"?b.responseText:b.response,status:b.status,statusText:b.statusText,headers:S,config:e,request:b};Xc(function(N){n(N),w()},function(N){s(N),w()},F),b=null}"onloadend"in b?b.onloadend=A:b.onreadystatechange=function(){!b||b.readyState!==4||b.status===0&&!(b.responseURL&&b.responseURL.indexOf("file:")===0)||setTimeout(A)},b.onabort=function(){b&&(s(new Z("Request aborted",Z.ECONNABORTED,e,b)),b=null)},b.onerror=function($){const F=$&&$.message?$.message:"Network Error",P=new Z(F,Z.ERR_NETWORK,e,b);P.event=$||null,s(P),b=null},b.ontimeout=function(){let $=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const F=o.transitional||ui;o.timeoutErrorMessage&&($=o.timeoutErrorMessage),s(new Z($,F.clarifyTimeoutError?Z.ETIMEDOUT:Z.ECONNABORTED,e,b)),b=null},r===void 0&&i.setContentType(null),"setRequestHeader"in b&&x.forEach(i.toJSON(),function($,F){b.setRequestHeader(F,$)}),x.isUndefined(o.withCredentials)||(b.withCredentials=!!o.withCredentials),l&&l!=="json"&&(b.responseType=o.responseType),u&&([p,v]=ho(u,!0),b.addEventListener("progress",p)),a&&b.upload&&([f,g]=ho(a),b.upload.addEventListener("progress",f),b.upload.addEventListener("loadend",g)),(o.cancelToken||o.signal)&&(c=S=>{b&&(s(!S||S.type?new ks(null,e,b):S),b.abort(),b=null)},o.cancelToken&&o.cancelToken.subscribe(c),o.signal&&(o.signal.aborted?c():o.signal.addEventListener("abort",c)));const C=wm(o.url);if(C&&Be.protocols.indexOf(C)===-1){s(new Z("Unsupported protocol "+C+":",Z.ERR_BAD_REQUEST,e));return}b.send(r||null)})},Tm=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let s=new AbortController,o;const r=function(u){if(!o){o=!0,l();const c=u instanceof Error?u:this.reason;s.abort(c instanceof Z?c:new ks(c instanceof Error?c.message:c))}};let i=t&&setTimeout(()=>{i=null,r(new Z(`timeout of ${t}ms exceeded`,Z.ETIMEDOUT))},t);const l=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(u=>{u.unsubscribe?u.unsubscribe(r):u.removeEventListener("abort",r)}),e=null)};e.forEach(u=>u.addEventListener("abort",r));const{signal:a}=s;return a.unsubscribe=()=>x.asap(l),a}},Pm=function*(e,t){let n=e.byteLength;if(n{const o=Im(e,t);let r=0,i,l=a=>{i||(i=!0,s&&s(a))};return new ReadableStream({async pull(a){try{const{done:u,value:c}=await o.next();if(u){l(),a.close();return}let f=c.byteLength;if(n){let p=r+=f;n(p)}a.enqueue(new Uint8Array(c))}catch(u){throw l(u),u}},cancel(a){return l(a),o.return()}},{highWaterMark:2})},Dl=64*1024,{isFunction:Fs}=x,Nm=(({Request:e,Response:t})=>({Request:e,Response:t}))(x.global),{ReadableStream:Ll,TextEncoder:Ml}=x.global,Fl=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Dm=e=>{e=x.merge.call({skipUndefined:!0},Nm,e);const{fetch:t,Request:n,Response:s}=e,o=t?Fs(t):typeof fetch=="function",r=Fs(n),i=Fs(s);if(!o)return!1;const l=o&&Fs(Ll),a=o&&(typeof Ml=="function"?(v=>w=>v.encode(w))(new Ml):async v=>new Uint8Array(await new n(v).arrayBuffer())),u=r&&l&&Fl(()=>{let v=!1;const w=new n(Be.origin,{body:new Ll,method:"POST",get duplex(){return v=!0,"half"}}).headers.has("Content-Type");return v&&!w}),c=i&&l&&Fl(()=>x.isReadableStream(new s("").body)),f={stream:c&&(v=>v.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(v=>{!f[v]&&(f[v]=(w,b)=>{let A=w&&w[v];if(A)return A.call(w);throw new Z(`Response type '${v}' is not supported`,Z.ERR_NOT_SUPPORT,b)})});const p=async v=>{if(v==null)return 0;if(x.isBlob(v))return v.size;if(x.isSpecCompliantForm(v))return(await new n(Be.origin,{method:"POST",body:v}).arrayBuffer()).byteLength;if(x.isArrayBufferView(v)||x.isArrayBuffer(v))return v.byteLength;if(x.isURLSearchParams(v)&&(v=v+""),x.isString(v))return(await a(v)).byteLength},g=async(v,w)=>{const b=x.toFiniteNumber(v.getContentLength());return b??p(w)};return async v=>{let{url:w,method:b,data:A,signal:C,cancelToken:S,timeout:$,onDownloadProgress:F,onUploadProgress:P,responseType:N,headers:Y,withCredentials:z="same-origin",fetchOptions:te}=eu(v),me=t||fetch;N=N?(N+"").toLowerCase():"text";let V=Tm([C,S&&S.toAbortSignal()],$),re=null;const be=V&&V.unsubscribe&&(()=>{V.unsubscribe()});let Le;try{if(P&&u&&b!=="get"&&b!=="head"&&(Le=await g(Y,A))!==0){let Te=new n(w,{method:"POST",body:A,duplex:"half"}),Oe;if(x.isFormData(A)&&(Oe=Te.headers.get("content-type"))&&Y.setContentType(Oe),Te.body){const[St,ht]=Pl(Le,ho(Il(P)));A=Nl(Te.body,Dl,St,ht)}}x.isString(z)||(z=z?"include":"omit");const ie=r&&"credentials"in n.prototype,ce={...te,signal:V,method:b.toUpperCase(),headers:Y.normalize().toJSON(),body:A,duplex:"half",credentials:ie?z:void 0};re=r&&new n(w,ce);let oe=await(r?me(re,te):me(w,ce));const lt=c&&(N==="stream"||N==="response");if(c&&(F||lt&&be)){const Te={};["status","statusText","headers"].forEach(Et=>{Te[Et]=oe[Et]});const Oe=x.toFiniteNumber(oe.headers.get("content-length")),[St,ht]=F&&Pl(Oe,ho(Il(F),!0))||[];oe=new s(Nl(oe.body,Dl,St,()=>{ht&&ht(),be&&be()}),Te)}N=N||"text";let xt=await f[x.findKey(f,N)||"text"](oe,v);return!lt&&be&&be(),await new Promise((Te,Oe)=>{Xc(Te,Oe,{data:xt,headers:Ze.from(oe.headers),status:oe.status,statusText:oe.statusText,config:v,request:re})})}catch(ie){throw be&&be(),ie&&ie.name==="TypeError"&&/Load failed|fetch/i.test(ie.message)?Object.assign(new Z("Network Error",Z.ERR_NETWORK,v,re,ie&&ie.response),{cause:ie.cause||ie}):Z.from(ie,ie&&ie.code,v,re,ie&&ie.response)}}},Lm=new Map,tu=e=>{let t=e&&e.env||{};const{fetch:n,Request:s,Response:o}=t,r=[s,o,n];let i=r.length,l=i,a,u,c=Lm;for(;l--;)a=r[l],u=c.get(a),u===void 0&&c.set(a,u=l?new Map:Dm(t)),c=u;return u};tu();const di={http:Zp,xhr:Om,fetch:{get:tu}};x.forEach(di,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Ul=e=>`- ${e}`,Mm=e=>x.isFunction(e)||e===null||e===!1;function Fm(e,t){e=x.isArray(e)?e:[e];const{length:n}=e;let s,o;const r={};for(let i=0;i`adapter ${a} `+(u===!1?"is not supported by the environment":"is not available in the build"));let l=n?i.length>1?`since : -`+i.map(Ul).join(` -`):" "+Ul(i[0]):"as no adapter specified";throw new Z("There is no suitable adapter to dispatch the request "+l,"ERR_NOT_SUPPORT")}return o}const nu={getAdapter:Fm,adapters:di};function or(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new ks(null,e)}function Bl(e){return or(e),e.headers=Ze.from(e.headers),e.data=sr.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),nu.getAdapter(e.adapter||Cs.adapter,e)(e).then(function(s){return or(e),s.data=sr.call(e,e.transformResponse,s),s.headers=Ze.from(s.headers),s},function(s){return Yc(s)||(or(e),s&&s.response&&(s.response.data=sr.call(e,e.transformResponse,s.response),s.response.headers=Ze.from(s.response.headers))),Promise.reject(s)})}const su="1.13.5",Do={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Do[e]=function(s){return typeof s===e||"a"+(t<1?"n ":" ")+e}});const jl={};Do.transitional=function(t,n,s){function o(r,i){return"[Axios v"+su+"] Transitional option '"+r+"'"+i+(s?". "+s:"")}return(r,i,l)=>{if(t===!1)throw new Z(o(i," has been removed"+(n?" in "+n:"")),Z.ERR_DEPRECATED);return n&&!jl[i]&&(jl[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(r,i,l):!0}};Do.spelling=function(t){return(n,s)=>(console.warn(`${s} is likely a misspelling of ${t}`),!0)};function Um(e,t,n){if(typeof e!="object")throw new Z("options must be an object",Z.ERR_BAD_OPTION_VALUE);const s=Object.keys(e);let o=s.length;for(;o-- >0;){const r=s[o],i=t[r];if(i){const l=e[r],a=l===void 0||i(l,r,e);if(a!==!0)throw new Z("option "+r+" must be "+a,Z.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Z("Unknown option "+r,Z.ERR_BAD_OPTION)}}const Zs={assertOptions:Um,validators:Do},ut=Zs.validators;let wn=class{constructor(t){this.defaults=t||{},this.interceptors={request:new Ol,response:new Ol}}async request(t,n){try{return await this._request(t,n)}catch(s){if(s instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;const r=o.stack?o.stack.replace(/^.+\n/,""):"";try{s.stack?r&&!String(s.stack).endsWith(r.replace(/^.+\n.+\n/,""))&&(s.stack+=` -`+r):s.stack=r}catch{}}throw s}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=xn(this.defaults,n);const{transitional:s,paramsSerializer:o,headers:r}=n;s!==void 0&&Zs.assertOptions(s,{silentJSONParsing:ut.transitional(ut.boolean),forcedJSONParsing:ut.transitional(ut.boolean),clarifyTimeoutError:ut.transitional(ut.boolean),legacyInterceptorReqResOrdering:ut.transitional(ut.boolean)},!1),o!=null&&(x.isFunction(o)?n.paramsSerializer={serialize:o}:Zs.assertOptions(o,{encode:ut.function,serialize:ut.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Zs.assertOptions(n,{baseUrl:ut.spelling("baseURL"),withXsrfToken:ut.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=r&&x.merge(r.common,r[n.method]);r&&x.forEach(["delete","get","head","post","put","patch","common"],v=>{delete r[v]}),n.headers=Ze.concat(i,r);const l=[];let a=!0;this.interceptors.request.forEach(function(w){if(typeof w.runWhen=="function"&&w.runWhen(n)===!1)return;a=a&&w.synchronous;const b=n.transitional||ui;b&&b.legacyInterceptorReqResOrdering?l.unshift(w.fulfilled,w.rejected):l.push(w.fulfilled,w.rejected)});const u=[];this.interceptors.response.forEach(function(w){u.push(w.fulfilled,w.rejected)});let c,f=0,p;if(!a){const v=[Bl.bind(this),void 0];for(v.unshift(...l),v.push(...u),p=v.length,c=Promise.resolve(n);f{if(!s._listeners)return;let r=s._listeners.length;for(;r-- >0;)s._listeners[r](o);s._listeners=null}),this.promise.then=o=>{let r;const i=new Promise(l=>{s.subscribe(l),r=l}).then(o);return i.cancel=function(){s.unsubscribe(r)},i},t(function(r,i,l){s.reason||(s.reason=new ks(r,i,l),n(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=s=>{t.abort(s)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new ou(function(o){t=o}),cancel:t}}};function jm(e){return function(n){return e.apply(null,n)}}function Hm(e){return x.isObject(e)&&e.isAxiosError===!0}const $r={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries($r).forEach(([e,t])=>{$r[t]=e});function ru(e){const t=new wn(e),n=Fc(wn.prototype.request,t);return x.extend(n,wn.prototype,t,{allOwnKeys:!0}),x.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return ru(xn(e,o))},n}const ke=ru(Cs);ke.Axios=wn;ke.CanceledError=ks;ke.CancelToken=Bm;ke.isCancel=Yc;ke.VERSION=su;ke.toFormData=No;ke.AxiosError=Z;ke.Cancel=ke.CanceledError;ke.all=function(t){return Promise.all(t)};ke.spread=jm;ke.isAxiosError=Hm;ke.mergeConfig=xn;ke.AxiosHeaders=Ze;ke.formToJSON=e=>Jc(x.isHTMLForm(e)?new FormData(e):e);ke.getAdapter=nu.getAdapter;ke.HttpStatusCode=$r;ke.default=ke;const{Axios:lx,AxiosError:ax,CanceledError:cx,isCancel:ux,CancelToken:fx,VERSION:dx,all:hx,Cancel:px,isAxiosError:mx,spread:gx,toFormData:yx,AxiosHeaders:vx,HttpStatusCode:bx,formToJSON:_x,getAdapter:wx,mergeConfig:xx}=ke;var En={};const ze={PROTOCOL:En.PROTOCOL||window.location.protocol,WS_PROTOCOL:En.WS_PROTOCOL||window.location.protocol==="https:"?"wss:":"ws:",BACKEND:En.BACKEND||window.location.hostname,PORT:En.PORT||window.location.port,WS_PORT:En.WS_PORT||window.location.port,BASEURL:En.BASEURL||""};let Us;const Vm=new Uint8Array(16);function qm(){if(!Us&&(Us=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Us))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Us(Vm)}const Ne=[];for(let e=0;e<256;++e)Ne.push((e+256).toString(16).slice(1));function Wm(e,t=0){return Ne[e[t+0]]+Ne[e[t+1]]+Ne[e[t+2]]+Ne[e[t+3]]+"-"+Ne[e[t+4]]+Ne[e[t+5]]+"-"+Ne[e[t+6]]+Ne[e[t+7]]+"-"+Ne[e[t+8]]+Ne[e[t+9]]+"-"+Ne[e[t+10]]+Ne[e[t+11]]+Ne[e[t+12]]+Ne[e[t+13]]+Ne[e[t+14]]+Ne[e[t+15]]}const Km=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),Hl={randomUUID:Km};function zm(e,t,n){if(Hl.randomUUID&&!e)return Hl.randomUUID();e=e||{};const s=e.random||(e.rng||qm)();return s[6]=s[6]&15|64,s[8]=s[8]&63|128,Wm(s)}var Gm={};console.log("using env:",Gm);console.log("using config: ",ze);const tt=ke.create({baseURL:`${ze.PROTOCOL}//${ze.BACKEND}:${ze.PORT}${ze.BASEURL}`}),Os=zm();console.log("session ID: ",Os);iu();const hi=new WebSocket(`${ze.WS_PROTOCOL}//${ze.BACKEND}${ze.PORT!==""?":"+ze.PORT:""}${ze.BASEURL}/api/ws?client_id=${Os}`);hi.onopen=e=>{console.log("websocket connection opened",e)};function iu(){tt.get("/api/version").then(e=>{const t=localStorage.getItem("version");console.log("Backend version: ",e.data),localStorage.setItem("version",e.data),t!=e.data&&location.reload()}).catch(e=>{console.error(e),console.log("Error getting version, using 0"),localStorage.setItem("version","0.0.0")})}function Qm(e){return tt.get("/api/songs/search",{params:{query:e}})}function Jm(e){return tt.get("/api/song/url",{params:{url:e}})}function Ym(e){const t=typeof e=="string"?e:e.url,n=typeof e=="string"?void 0:e;return tt.post("/api/download/url",n,{params:{url:t,client_id:Os}})}function Xm(e){return tt.post("/api/download/batch",e)}function Zm(){return tt.get("/api/check_update")}function eg(e){return String(e||"").split("/").map(encodeURIComponent).join("/")}function tg(e){return`/downloads/${eg(e)}`}function ng(e){return`/cover?file=${encodeURIComponent(e)}`}function sg(){return tt.get("/list")}function og(e){return tt.delete("/delete",{params:{file:e}})}function rg(e){return tt.post("/api/playlist/m3u",e)}function ig(){return tt.get("/api/queue")}function lg(e){return tt.delete("/api/queue/item",{params:{song_id:e}})}function ag(){return tt.delete("/api/queue")}function cg(){return tt.get("/api/settings",{params:{client_id:Os}})}function ug(e){return tt.post("/api/settings/update",e,{params:{client_id:Os}})}function fg(e){return hi.onmessage=e}function dg(e){return hi.onerror=e}const Re={search:Qm,open:Jm,download:Ym,downloadBatch:Xm,downloadFileURL:tg,coverFileURL:ng,listDownloads:sg,deleteDownload:og,writePlaylistM3u:rg,getQueue:ig,removeQueueItem:lg,clearQueue:ag,getSettings:cg,setSettings:ug,check_for_update:Zm,ws_onmessage:fg,ws_onerror:dg,getVersion:iu},eo=ne({audio_providers:[""],lyrics_providers:[""],download_lyrics:!0,format:"",bitrate:"320",output:"",generate_m3u:!0,organize_by_artist:!1,max_parallel_downloads:3}),hg={audio_providers:["youtube","youtube-music"],lyrics_providers:["lrclib","genius","musixmatch","azlyrics"],format:["mp3","flac","ogg","opus","m4a"],bitrate:["128","192","256","320"],max_parallel_downloads:[1,2,3,5,8],output:"{artists} - {title}.{output-ext}"};Re.getSettings().then(e=>{e.status===200?(console.log("Received settings:",e.data),eo.value=e.data):console.log("Error loading settings")});function lu(){const e=ne();function t(){console.log("Saving settings:",eo.value),Re.setSettings(eo.value).then(n=>{n.status===200?(console.log("Saved!"),e.value=!0,setTimeout(()=>{e.value=null},2e3)):(console.error("Error saving settings.",n),e.value=!1,setTimeout(()=>{e.value=null},2e3))})}return{saveSettings:t,settings:eo,settingsOptions:hg,isSaved:e}}const pg={class:"modal modal-bottom sm:modal-middle"},mg={class:"modal-box surface-strong rounded-t-3xl sm:rounded-3xl p-0 max-w-lg"},gg={class:"flex items-center justify-between px-6 py-4 border-b border-white/5"},yg={class:"text-lg font-bold tracking-tight"},vg={class:"text-xs text-base-content/50 mt-0.5"},bg=["title"],_g={class:"px-6 py-5 space-y-6"},wg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},xg=["value"],Sg=["value"],Eg={class:"text-[11px] text-base-content/40 mt-1.5"},Ag={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Rg={class:"grid grid-cols-2 gap-2"},Cg=["onClick"],kg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Og={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Tg={class:"flex-1 text-sm"},Pg={class:"block"},Ig={class:"block text-[11px] text-base-content/50"},$g={class:"flex items-baseline justify-between mb-1.5"},Ng={class:"text-xs text-base-content/50"},Dg={class:"text-[10px] text-base-content/40"},Lg=["disabled"],Mg=["value"],Fg={class:"grid grid-cols-2 gap-3"},Ug={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Bg=["value"],jg={class:"flex items-baseline justify-between mb-2"},Hg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50"},Vg={key:0,class:"text-[10px] text-base-content/40"},qg=["disabled"],Wg=["value"],Kg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},zg={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Gg={class:"flex-1 text-sm"},Qg={class:"block"},Jg={class:"block text-[11px] text-base-content/50"},Yg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Xg={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Zg={class:"flex-1 text-sm"},ey={class:"block"},ty={class:"block text-[11px] text-base-content/50"},ny={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},sy={class:"grid grid-cols-5 gap-1.5"},oy=["onClick"],ry={class:"text-[11px] text-base-content/40 mt-1.5"},iy={key:0,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-primary"},ly={key:1,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-error"},ay={class:"flex items-center justify-end gap-2 px-6 py-4 border-t border-white/5"},cy={for:"settings-modal",class:"btn btn-sm h-10 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 cursor-pointer"},uy={class:"modal-backdrop",for:"settings-modal"},Vn={__name:"Settings",setup(e){const t=lu(),{t:n,locale:s,setLocale:o,locales:r}=_t();function i(l){return l==="youtube-music"?"YouTube Music":l==="youtube"?"YouTube":l}return(l,a)=>(R(),I(fe,null,[a[8]||(a[8]=h("input",{type:"checkbox",id:"settings-modal",class:"modal-toggle"},null,-1)),h("div",pg,[h("div",mg,[h("div",gg,[h("div",null,[h("h3",yg,E(d(n)("settings.title")),1),h("p",vg,E(d(n)("settings.subtitle")),1)]),h("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:d(n)("common.close")},[M(d(K),{icon:"clarity:close-line",class:"h-5 w-5"})],8,bg)]),h("div",_g,[h("div",null,[h("label",wg,E(d(n)("settings.language")),1),h("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",value:d(s),onChange:a[0]||(a[0]=u=>d(o)(u.target.value))},[(R(!0),I(fe,null,De(d(r),u=>(R(),I("option",{key:u.code,value:u.code},E(u.name),9,Sg))),128))],40,xg),h("p",Eg,E(d(n)("settings.languageHint")),1)]),h("div",null,[h("label",Ag,E(d(n)("settings.audioSource")),1),h("div",Rg,[(R(!0),I(fe,null,De(d(t).settingsOptions.audio_providers,u=>(R(),I("button",{key:u,type:"button",class:Se(["rounded-xl border px-3 py-2 text-sm transition-colors text-left",[d(t).settings.value.audio_providers[0]===u?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:c=>d(t).settings.value.audio_providers=[u]},E(i(u)),11,Cg))),128))])]),h("div",null,[h("label",kg,E(d(n)("settings.lyricsSource")),1),h("label",Og,[Bt(h("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":a[1]||(a[1]=u=>d(t).settings.value.download_lyrics=u)},null,512),[[Zo,d(t).settings.value.download_lyrics]]),h("span",Tg,[h("span",Pg,E(d(n)("settings.downloadLyrics")),1),h("span",Ig,E(d(n)("settings.downloadLyricsHint")),1)])]),h("div",$g,[h("span",Ng,E(d(n)("settings.lyricsProvider")),1),h("span",Dg,E(d(n)("settings.lyricsHint")),1)]),Bt(h("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 disabled:opacity-40","onUpdate:modelValue":a[2]||(a[2]=u=>d(t).settings.value.lyrics_providers[0]=u),disabled:!d(t).settings.value.download_lyrics},[(R(!0),I(fe,null,De(d(t).settingsOptions.lyrics_providers,u=>(R(),I("option",{key:u,value:u},E(u),9,Mg))),128))],8,Lg),[[zs,d(t).settings.value.lyrics_providers[0]]])]),h("div",Fg,[h("div",null,[h("label",Ug,E(d(n)("settings.format")),1),Bt(h("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":a[3]||(a[3]=u=>d(t).settings.value.format=u)},[(R(!0),I(fe,null,De(d(t).settingsOptions.format,u=>(R(),I("option",{key:u,value:u},E(u.toUpperCase()),9,Bg))),128))],512),[[zs,d(t).settings.value.format]])]),h("div",null,[h("div",jg,[h("label",Hg,E(d(n)("settings.quality")),1),d(t).settings.value.format==="flac"?(R(),I("span",Vg,E(d(n)("settings.qualityIgnored")),1)):xe("",!0)]),Bt(h("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":a[4]||(a[4]=u=>d(t).settings.value.bitrate=u),disabled:d(t).settings.value.format==="flac"},[(R(!0),I(fe,null,De(d(t).settingsOptions.bitrate,u=>(R(),I("option",{key:u,value:u},E(u)+" kbps ",9,Wg))),128))],8,qg),[[zs,d(t).settings.value.bitrate]])])]),h("div",null,[h("label",Kg,E(d(n)("settings.playlistsSection")),1),h("label",zg,[Bt(h("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":a[5]||(a[5]=u=>d(t).settings.value.generate_m3u=u)},null,512),[[Zo,d(t).settings.value.generate_m3u]]),h("span",Gg,[h("span",Qg,E(d(n)("settings.generateM3u")),1),h("span",Jg,E(d(n)("settings.generateM3uHint")),1)])])]),h("div",null,[h("label",Yg,E(d(n)("settings.organizationSection")),1),h("label",Xg,[Bt(h("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":a[6]||(a[6]=u=>d(t).settings.value.organize_by_artist=u)},null,512),[[Zo,d(t).settings.value.organize_by_artist]]),h("span",Zg,[h("span",ey,E(d(n)("settings.organizeByArtist")),1),h("span",ty,E(d(n)("settings.organizeByArtistHint")),1)])])]),h("div",null,[h("label",ny,E(d(n)("settings.parallelDownloads")),1),h("div",sy,[(R(!0),I(fe,null,De(d(t).settingsOptions.max_parallel_downloads,u=>(R(),I("button",{key:u,type:"button",class:Se(["rounded-xl border px-2 py-2 text-sm font-medium transition-colors text-center",[d(t).settings.value.max_parallel_downloads===u?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:c=>d(t).settings.value.max_parallel_downloads=u},E(u),11,oy))),128))]),h("p",ry,E(d(n)("settings.parallelDownloadsHint")),1)]),M(Sc,{"enter-active-class":"transition duration-200","enter-from-class":"opacity-0 -translate-y-1","enter-to-class":"opacity-100 translate-y-0","leave-active-class":"transition duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:oo(()=>[d(t).isSaved.value===!0?(R(),I("div",iy,[M(d(K),{icon:"clarity:check-line",class:"h-4 w-4 shrink-0"}),$e(" "+E(d(n)("settings.saved")),1)])):d(t).isSaved.value===!1?(R(),I("div",ly,[M(d(K),{icon:"clarity:exclamation-circle-line",class:"h-4 w-4 shrink-0"}),$e(" "+E(d(n)("settings.saveError")),1)])):xe("",!0)]),_:1})]),h("div",ay,[h("label",cy,E(d(n)("common.cancel")),1),h("button",{class:"btn btn-primary btn-sm h-10 px-6 rounded-full",onClick:a[7]||(a[7]=u=>d(t).saveSettings())},E(d(n)("common.save")),1)])]),h("label",uy,E(d(n)("common.close")),1)])],64))}},Ot=ne(""),Vl=ne("light"),ql=ne("dark");function pi({useSystem:e=!0,initialTheme:t="",newLightAlias:n="",newDarkAlias:s=""}={}){function o(c){Vl.value=c,u()}function r(c){ql.value=c,u()}function i(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function l(c){Ot.value=c,u()}function a(){Ot==="dark"?Ot.value="light":Ot==="light"&&(Ot.value="dark"),u()}function u(){document.documentElement.setAttribute("data-theme",Ot.value==="dark"?ql.value:Vl.value)}return Ot.value!=="light"&&Ot.value!=="dark"&&(e&&l(i()),(t==="light"||t==="dark")&&(Ot.value=t)),n&&o(n),s&&r(s),u(),{currentTheme:Ot,setLightAlias:o,setDarkAlias:r,getSystemTheme:i,setTheme:l,switchTheme:a}}const fy={class:"min-h-dvh flex flex-col text-base-content"},dy={__name:"App",setup(e){const t=pi();return Qa(()=>{t.setLightAlias("downtify-light"),t.setDarkAlias("downtify-dark")}),(n,s)=>{const o=br("router-view");return R(),I("div",fy,[M(o,null,{default:oo(({Component:r,route:i})=>[M(Sc,{name:"page",mode:"out-in"},{default:oo(()=>[(R(),it(Mf(r),{key:i.fullPath}))]),_:2},1024)]),_:1}),M(ph),M(Vn)])}}};/*! - * vue-router v4.6.4 - * (c) 2025 Eduardo San Martin Morote - * @license MIT - */const Rn=typeof document<"u";function au(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function hy(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&au(e.default)}const de=Object.assign;function rr(e,t){const n={};for(const s in t){const o=t[s];n[s]=bt(o)?o.map(e):e(o)}return n}const as=()=>{},bt=Array.isArray;function Wl(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}const cu=/#/g,py=/&/g,my=/\//g,gy=/=/g,yy=/\?/g,uu=/\+/g,vy=/%5B/g,by=/%5D/g,fu=/%5E/g,_y=/%60/g,du=/%7B/g,wy=/%7C/g,hu=/%7D/g,xy=/%20/g;function mi(e){return e==null?"":encodeURI(""+e).replace(wy,"|").replace(vy,"[").replace(by,"]")}function Sy(e){return mi(e).replace(du,"{").replace(hu,"}").replace(fu,"^")}function Nr(e){return mi(e).replace(uu,"%2B").replace(xy,"+").replace(cu,"%23").replace(py,"%26").replace(_y,"`").replace(du,"{").replace(hu,"}").replace(fu,"^")}function Ey(e){return Nr(e).replace(gy,"%3D")}function Ay(e){return mi(e).replace(cu,"%23").replace(yy,"%3F")}function Ry(e){return Ay(e).replace(my,"%2F")}function _s(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const Cy=/\/$/,ky=e=>e.replace(Cy,"");function ir(e,t,n="/"){let s,o={},r="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return a=l>=0&&a>l?-1:a,a>=0&&(s=t.slice(0,a),r=t.slice(a,l>0?l:t.length),o=e(r.slice(1))),l>=0&&(s=s||t.slice(0,l),i=t.slice(l,t.length)),s=Iy(s??t,n),{fullPath:s+r+i,path:s,query:o,hash:_s(i)}}function Oy(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Kl(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Ty(e,t,n){const s=t.matched.length-1,o=n.matched.length-1;return s>-1&&s===o&&Mn(t.matched[s],n.matched[o])&&pu(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Mn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function pu(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Py(e[n],t[n]))return!1;return!0}function Py(e,t){return bt(e)?zl(e,t):bt(t)?zl(t,e):(e==null?void 0:e.valueOf())===(t==null?void 0:t.valueOf())}function zl(e,t){return bt(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function Iy(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),o=s[s.length-1];(o===".."||o===".")&&s.push("");let r=n.length-1,i,l;for(i=0;i1&&r--;else break;return n.slice(0,r).join("/")+"/"+s.slice(i).join("/")}const Yt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Dr=function(e){return e.pop="pop",e.push="push",e}({}),lr=function(e){return e.back="back",e.forward="forward",e.unknown="",e}({});function $y(e){if(!e)if(Rn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),ky(e)}const Ny=/^[^#]+#/;function Dy(e,t){return e.replace(Ny,"#")+t}function Ly(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Lo=()=>({left:window.scrollX,top:window.scrollY});function My(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Ly(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Gl(e,t){return(history.state?history.state.position-t:-1)+e}const Lr=new Map;function Fy(e,t){Lr.set(e,t)}function Uy(e){const t=Lr.get(e);return Lr.delete(e),t}function By(e){return typeof e=="string"||e&&typeof e=="object"}function mu(e){return typeof e=="string"||typeof e=="symbol"}let Ae=function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e}({});const gu=Symbol("");Ae.MATCHER_NOT_FOUND+"",Ae.NAVIGATION_GUARD_REDIRECT+"",Ae.NAVIGATION_ABORTED+"",Ae.NAVIGATION_CANCELLED+"",Ae.NAVIGATION_DUPLICATED+"";function Fn(e,t){return de(new Error,{type:e,[gu]:!0},t)}function Ft(e,t){return e instanceof Error&&gu in e&&(t==null||!!(e.type&t))}const jy=["params","query","hash"];function Hy(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of jy)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function Vy(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;so&&Nr(o)):[s&&Nr(s)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function qy(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=bt(s)?s.map(o=>o==null?null:""+o):s==null?s:""+s)}return t}const Wy=Symbol(""),Jl=Symbol(""),Mo=Symbol(""),gi=Symbol(""),Mr=Symbol("");function Xn(){let e=[];function t(s){return e.push(s),()=>{const o=e.indexOf(s);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function en(e,t,n,s,o,r=i=>i()){const i=s&&(s.enterCallbacks[o]=s.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const u=p=>{p===!1?a(Fn(Ae.NAVIGATION_ABORTED,{from:n,to:t})):p instanceof Error?a(p):By(p)?a(Fn(Ae.NAVIGATION_GUARD_REDIRECT,{from:t,to:p})):(i&&s.enterCallbacks[o]===i&&typeof p=="function"&&i.push(p),l())},c=r(()=>e.call(s&&s.instances[o],t,n,u));let f=Promise.resolve(c);e.length<3&&(f=f.then(u)),f.catch(p=>a(p))})}function ar(e,t,n,s,o=r=>r()){const r=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(au(a)){const u=(a.__vccOpts||a)[t];u&&r.push(en(u,n,s,i,l,o))}else{let u=a();r.push(()=>u.then(c=>{if(!c)throw new Error(`Couldn't resolve component "${l}" at "${i.path}"`);const f=hy(c)?c.default:c;i.mods[l]=c,i.components[l]=f;const p=(f.__vccOpts||f)[t];return p&&en(p,n,s,i,l,o)()}))}}return r}function Ky(e,t){const n=[],s=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let i=0;iMn(u,l))?s.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(u=>Mn(u,a))||o.push(a))}return[n,s,o]}/*! - * vue-router v4.6.4 - * (c) 2025 Eduardo San Martin Morote - * @license MIT - */let zy=()=>location.protocol+"//"+location.host;function yu(e,t){const{pathname:n,search:s,hash:o}=t,r=e.indexOf("#");if(r>-1){let i=o.includes(e.slice(r))?e.slice(r).length:1,l=o.slice(i);return l[0]!=="/"&&(l="/"+l),Kl(l,"")}return Kl(n,e)+s+o}function Gy(e,t,n,s){let o=[],r=[],i=null;const l=({state:p})=>{const g=yu(e,location),v=n.value,w=t.value;let b=0;if(p){if(n.value=g,t.value=p,i&&i===v){i=null;return}b=w?p.position-w.position:0}else s(g);o.forEach(A=>{A(n.value,v,{delta:b,type:Dr.pop,direction:b?b>0?lr.forward:lr.back:lr.unknown})})};function a(){i=n.value}function u(p){o.push(p);const g=()=>{const v=o.indexOf(p);v>-1&&o.splice(v,1)};return r.push(g),g}function c(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(de({},p.state,{scroll:Lo()}),"")}}function f(){for(const p of r)p();r=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:a,listen:u,destroy:f}}function Yl(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Lo():null}}function Qy(e){const{history:t,location:n}=window,s={value:yu(e,n)},o={value:t.state};o.value||r(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(a,u,c){const f=e.indexOf("#"),p=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:zy()+e+a;try{t[c?"replaceState":"pushState"](u,"",p),o.value=u}catch(g){console.error(g),n[c?"replace":"assign"](p)}}function i(a,u){r(a,de({},t.state,Yl(o.value.back,a,o.value.forward,!0),u,{position:o.value.position}),!0),s.value=a}function l(a,u){const c=de({},o.value,t.state,{forward:a,scroll:Lo()});r(c.current,c,!0),r(a,de({},Yl(s.value,a,null),{position:c.position+1},u),!1),s.value=a}return{location:s,state:o,push:l,replace:i}}function Jy(e){e=$y(e);const t=Qy(e),n=Gy(e,t.state,t.location,t.replace);function s(r,i=!0){i||n.pauseListeners(),history.go(r)}const o=de({location:"",base:e,go:s,createHref:Dy.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let vn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Pe=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Pe||{});const Yy={type:vn.Static,value:""},Xy=/[a-zA-Z0-9_]/;function Zy(e){if(!e)return[[]];if(e==="/")return[[Yy]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${u}": ${g}`)}let n=Pe.Static,s=n;const o=[];let r;function i(){r&&o.push(r),r=[]}let l=0,a,u="",c="";function f(){u&&(n===Pe.Static?r.push({type:vn.Static,value:u}):n===Pe.Param||n===Pe.ParamRegExp||n===Pe.ParamRegExpEnd?(r.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),r.push({type:vn.Param,value:u,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),u="")}function p(){u+=a}for(;lt.length?t.length===1&&t[0]===qe.Static+qe.Segment?1:-1:0}function vu(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const ov={strict:!1,end:!0,sensitive:!1};function rv(e,t,n){const s=nv(Zy(e.path),n),o=de(s,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function iv(e,t){const n=[],s=new Map;t=Wl(ov,t);function o(f){return s.get(f)}function r(f,p,g){const v=!g,w=ta(f);w.aliasOf=g&&g.record;const b=Wl(t,f),A=[w];if("alias"in f){const $=typeof f.alias=="string"?[f.alias]:f.alias;for(const F of $)A.push(ta(de({},w,{components:g?g.record.components:w.components,path:F,aliasOf:g?g.record:w})))}let C,S;for(const $ of A){const{path:F}=$;if(p&&F[0]!=="/"){const P=p.record.path,N=P[P.length-1]==="/"?"":"/";$.path=p.record.path+(F&&N+F)}if(C=rv($,p,b),g?g.alias.push(C):(S=S||C,S!==C&&S.alias.push(C),v&&f.name&&!na(C)&&i(f.name)),bu(C)&&a(C),w.children){const P=w.children;for(let N=0;N{i(S)}:as}function i(f){if(mu(f)){const p=s.get(f);p&&(s.delete(f),n.splice(n.indexOf(p),1),p.children.forEach(i),p.alias.forEach(i))}else{const p=n.indexOf(f);p>-1&&(n.splice(p,1),f.record.name&&s.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function l(){return n}function a(f){const p=cv(f,n);n.splice(p,0,f),f.record.name&&!na(f)&&s.set(f.record.name,f)}function u(f,p){let g,v={},w,b;if("name"in f&&f.name){if(g=s.get(f.name),!g)throw Fn(Ae.MATCHER_NOT_FOUND,{location:f});b=g.record.name,v=de(ea(p.params,g.keys.filter(S=>!S.optional).concat(g.parent?g.parent.keys.filter(S=>S.optional):[]).map(S=>S.name)),f.params&&ea(f.params,g.keys.map(S=>S.name))),w=g.stringify(v)}else if(f.path!=null)w=f.path,g=n.find(S=>S.re.test(w)),g&&(v=g.parse(w),b=g.record.name);else{if(g=p.name?s.get(p.name):n.find(S=>S.re.test(p.path)),!g)throw Fn(Ae.MATCHER_NOT_FOUND,{location:f,currentLocation:p});b=g.record.name,v=de({},p.params,f.params),w=g.stringify(v)}const A=[];let C=g;for(;C;)A.unshift(C.record),C=C.parent;return{name:b,path:w,params:v,matched:A,meta:av(A)}}e.forEach(f=>r(f));function c(){n.length=0,s.clear()}return{addRoute:r,resolve:u,removeRoute:i,clearRoutes:c,getRoutes:l,getRecordMatcher:o}}function ea(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function ta(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:lv(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function lv(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function na(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function av(e){return e.reduce((t,n)=>de(t,n.meta),{})}function cv(e,t){let n=0,s=t.length;for(;n!==s;){const r=n+s>>1;vu(e,t[r])<0?s=r:n=r+1}const o=uv(e);return o&&(s=t.lastIndexOf(o,s-1)),s}function uv(e){let t=e;for(;t=t.parent;)if(bu(t)&&vu(e,t)===0)return t}function bu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function sa(e){const t=gt(Mo),n=gt(gi),s=Ee(()=>{const a=d(e.to);return t.resolve(a)}),o=Ee(()=>{const{matched:a}=s.value,{length:u}=a,c=a[u-1],f=n.matched;if(!c||!f.length)return-1;const p=f.findIndex(Mn.bind(null,c));if(p>-1)return p;const g=oa(a[u-2]);return u>1&&oa(c)===g&&f[f.length-1].path!==g?f.findIndex(Mn.bind(null,a[u-2])):p}),r=Ee(()=>o.value>-1&&mv(n.params,s.value.params)),i=Ee(()=>o.value>-1&&o.value===n.matched.length-1&&pu(n.params,s.value.params));function l(a={}){if(pv(a)){const u=t[d(e.replace)?"replace":"push"](d(e.to)).catch(as);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>u),u}return Promise.resolve()}return{route:s,href:Ee(()=>s.value.href),isActive:r,isExactActive:i,navigate:l}}function fv(e){return e.length===1?e[0]:e}const dv=Zr({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:sa,setup(e,{slots:t}){const n=wo(sa(e)),{options:s}=gt(Mo),o=Ee(()=>({[ra(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ra(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const r=t.default&&fv(t.default(n));return e.custom?r:ms("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}}),hv=dv;function pv(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function mv(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!bt(o)||o.length!==s.length||s.some((r,i)=>r.valueOf()!==o[i].valueOf()))return!1}return!0}function oa(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ra=(e,t,n)=>e??t??n,gv=Zr({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=gt(Mr),o=Ee(()=>e.route||s.value),r=gt(Jl,0),i=Ee(()=>{let u=d(r);const{matched:c}=o.value;let f;for(;(f=c[u])&&!f.components;)u++;return u}),l=Ee(()=>o.value.matched[i.value]);Vs(Jl,Ee(()=>i.value+1)),Vs(Wy,l),Vs(Mr,o);const a=ne();return sn(()=>[a.value,l.value,e.name],([u,c,f],[p,g,v])=>{c&&(c.instances[f]=u,g&&g!==c&&u&&u===p&&(c.leaveGuards.size||(c.leaveGuards=g.leaveGuards),c.updateGuards.size||(c.updateGuards=g.updateGuards))),u&&c&&(!g||!Mn(c,g)||!p)&&(c.enterCallbacks[f]||[]).forEach(w=>w(u))},{flush:"post"}),()=>{const u=o.value,c=e.name,f=l.value,p=f&&f.components[c];if(!p)return ia(n.default,{Component:p,route:u});const g=f.props[c],v=g?g===!0?u.params:typeof g=="function"?g(u):g:null,b=ms(p,de({},v,t,{onVnodeUnmounted:A=>{A.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return ia(n.default,{Component:b,route:u})||b}}});function ia(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const yv=gv;function vv(e){const t=iv(e.routes,e),n=e.parseQuery||Vy,s=e.stringifyQuery||Ql,o=e.history,r=Xn(),i=Xn(),l=Xn(),a=ff(Yt);let u=Yt;Rn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=rr.bind(null,T=>""+T),f=rr.bind(null,Ry),p=rr.bind(null,_s);function g(T,W){let H,G;return mu(T)?(H=t.getRecordMatcher(T),G=W):G=T,t.addRoute(G,H)}function v(T){const W=t.getRecordMatcher(T);W&&t.removeRoute(W)}function w(){return t.getRoutes().map(T=>T.record)}function b(T){return!!t.getRecordMatcher(T)}function A(T,W){if(W=de({},W||a.value),typeof T=="string"){const _=ir(n,T,W.path),k=t.resolve({path:_.path},W),D=o.createHref(_.fullPath);return de(_,k,{params:p(k.params),hash:_s(_.hash),redirectedFrom:void 0,href:D})}let H;if(T.path!=null)H=de({},T,{path:ir(n,T.path,W.path).path});else{const _=de({},T.params);for(const k in _)_[k]==null&&delete _[k];H=de({},T,{params:f(_)}),W.params=f(W.params)}const G=t.resolve(H,W),le=T.hash||"";G.params=c(p(G.params));const m=Oy(s,de({},T,{hash:Sy(le),path:G.path})),y=o.createHref(m);return de({fullPath:m,hash:le,query:s===Ql?qy(T.query):T.query||{}},G,{redirectedFrom:void 0,href:y})}function C(T){return typeof T=="string"?ir(n,T,a.value.path):de({},T)}function S(T,W){if(u!==T)return Fn(Ae.NAVIGATION_CANCELLED,{from:W,to:T})}function $(T){return N(T)}function F(T){return $(de(C(T),{replace:!0}))}function P(T,W){const H=T.matched[T.matched.length-1];if(H&&H.redirect){const{redirect:G}=H;let le=typeof G=="function"?G(T,W):G;return typeof le=="string"&&(le=le.includes("?")||le.includes("#")?le=C(le):{path:le},le.params={}),de({query:T.query,hash:T.hash,params:le.path!=null?{}:T.params},le)}}function N(T,W){const H=u=A(T),G=a.value,le=T.state,m=T.force,y=T.replace===!0,_=P(H,G);if(_)return N(de(C(_),{state:typeof _=="object"?de({},le,_.state):le,force:m,replace:y}),W||H);const k=H;k.redirectedFrom=W;let D;return!m&&Ty(s,G,H)&&(D=Fn(Ae.NAVIGATION_DUPLICATED,{to:k,from:G}),Te(G,G,!0,!1)),(D?Promise.resolve(D):te(k,G)).catch(O=>Ft(O)?Ft(O,Ae.NAVIGATION_GUARD_REDIRECT)?O:xt(O):oe(O,k,G)).then(O=>{if(O){if(Ft(O,Ae.NAVIGATION_GUARD_REDIRECT))return N(de({replace:y},C(O.to),{state:typeof O.to=="object"?de({},le,O.to.state):le,force:m}),W||k)}else O=V(k,G,!0,y,le);return me(k,G,O),O})}function Y(T,W){const H=S(T,W);return H?Promise.reject(H):Promise.resolve()}function z(T){const W=ht.values().next().value;return W&&typeof W.runWithContext=="function"?W.runWithContext(T):T()}function te(T,W){let H;const[G,le,m]=Ky(T,W);H=ar(G.reverse(),"beforeRouteLeave",T,W);for(const _ of G)_.leaveGuards.forEach(k=>{H.push(en(k,T,W))});const y=Y.bind(null,T,W);return H.push(y),at(H).then(()=>{H=[];for(const _ of r.list())H.push(en(_,T,W));return H.push(y),at(H)}).then(()=>{H=ar(le,"beforeRouteUpdate",T,W);for(const _ of le)_.updateGuards.forEach(k=>{H.push(en(k,T,W))});return H.push(y),at(H)}).then(()=>{H=[];for(const _ of m)if(_.beforeEnter)if(bt(_.beforeEnter))for(const k of _.beforeEnter)H.push(en(k,T,W));else H.push(en(_.beforeEnter,T,W));return H.push(y),at(H)}).then(()=>(T.matched.forEach(_=>_.enterCallbacks={}),H=ar(m,"beforeRouteEnter",T,W,z),H.push(y),at(H))).then(()=>{H=[];for(const _ of i.list())H.push(en(_,T,W));return H.push(y),at(H)}).catch(_=>Ft(_,Ae.NAVIGATION_CANCELLED)?_:Promise.reject(_))}function me(T,W,H){l.list().forEach(G=>z(()=>G(T,W,H)))}function V(T,W,H,G,le){const m=S(T,W);if(m)return m;const y=W===Yt,_=Rn?history.state:{};H&&(G||y?o.replace(T.fullPath,de({scroll:y&&_&&_.scroll},le)):o.push(T.fullPath,le)),a.value=T,Te(T,W,H,y),xt()}let re;function be(){re||(re=o.listen((T,W,H)=>{if(!Et.listening)return;const G=A(T),le=P(G,Et.currentRoute.value);if(le){N(de(le,{replace:!0,force:!0}),G).catch(as);return}u=G;const m=a.value;Rn&&Fy(Gl(m.fullPath,H.delta),Lo()),te(G,m).catch(y=>Ft(y,Ae.NAVIGATION_ABORTED|Ae.NAVIGATION_CANCELLED)?y:Ft(y,Ae.NAVIGATION_GUARD_REDIRECT)?(N(de(C(y.to),{force:!0}),G).then(_=>{Ft(_,Ae.NAVIGATION_ABORTED|Ae.NAVIGATION_DUPLICATED)&&!H.delta&&H.type===Dr.pop&&o.go(-1,!1)}).catch(as),Promise.reject()):(H.delta&&o.go(-H.delta,!1),oe(y,G,m))).then(y=>{y=y||V(G,m,!1),y&&(H.delta&&!Ft(y,Ae.NAVIGATION_CANCELLED)?o.go(-H.delta,!1):H.type===Dr.pop&&Ft(y,Ae.NAVIGATION_ABORTED|Ae.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),me(G,m,y)}).catch(as)}))}let Le=Xn(),ie=Xn(),ce;function oe(T,W,H){xt(T);const G=ie.list();return G.length?G.forEach(le=>le(T,W,H)):console.error(T),Promise.reject(T)}function lt(){return ce&&a.value!==Yt?Promise.resolve():new Promise((T,W)=>{Le.add([T,W])})}function xt(T){return ce||(ce=!T,be(),Le.list().forEach(([W,H])=>T?H(T):W()),Le.reset()),T}function Te(T,W,H,G){const{scrollBehavior:le}=e;if(!Rn||!le)return Promise.resolve();const m=!H&&Uy(Gl(T.fullPath,0))||(G||!H)&&history.state&&history.state.scroll||null;return Yr().then(()=>le(T,W,m)).then(y=>y&&My(y)).catch(y=>oe(y,T,W))}const Oe=T=>o.go(T);let St;const ht=new Set,Et={currentRoute:a,listening:!0,addRoute:g,removeRoute:v,clearRoutes:t.clearRoutes,hasRoute:b,getRoutes:w,resolve:A,options:e,push:$,replace:F,go:Oe,back:()=>Oe(-1),forward:()=>Oe(1),beforeEach:r.add,beforeResolve:i.add,afterEach:l.add,onError:ie.add,isReady:lt,install(T){T.component("RouterLink",hv),T.component("RouterView",yv),T.config.globalProperties.$router=Et,Object.defineProperty(T.config.globalProperties,"$route",{enumerable:!0,get:()=>d(a)}),Rn&&!St&&a.value===Yt&&(St=!0,$(o.location).catch(G=>{}));const W={};for(const G in Yt)Object.defineProperty(W,G,{get:()=>a.value[G],enumerable:!0});T.provide(Mo,Et),T.provide(gi,Pa(W)),T.provide(Mr,a);const H=T.unmount;ht.add(T),T.unmount=function(){ht.delete(T),ht.size<1&&(u=Yt,re&&re(),re=null,a.value=Yt,St=!1,ce=!1),H()}}};function at(T){return T.reduce((W,H)=>W.then(()=>z(H)),Promise.resolve())}return Et}function bv(){return gt(Mo)}function _u(e){return gt(gi)}const yi="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='256'%20height='256'%20viewBox='0%200%2067.733332%2067.733333'%20version='1.1'%20id='svg1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3cdefs%20id='defs1'%20/%3e%3cg%20id='layer1'%3e%3cg%20style='fill:%23040000;fill-opacity:1'%20id='g1'%20transform='matrix(0.06566918,0,0,0.06566918,17.061212,17.059932)'%3e%3cg%20id='g2'%3e%3ccircle%20style='fill:%231ad35d;fill-opacity:1;stroke-width:0.472667'%20id='path2'%20cx='33.866665'%20cy='33.866665'%20r='21.644735'%20transform='matrix(23.824636,0,0,23.824636,-550.95013,-550.93064)'%20/%3e%3cpath%20d='M%20480.6,111.5%20H%20406.5%20V%2035.6%20c%200,-10.7%20-8.3,-19.6%20-19,-20.4%20-104,-7.5%20-200.4,-3.7%20-263,0.8%20-10.7,0.8%20-19,9.8%20-19,20.5%20v%2074.9%20H%2031.4%20c%20-10.9,0%20-20.9,8.8%20-20.6,22%2040.6,166%20230.9,361.7%20230.9,361.7%209.8,10.8%2025.6,4%2028.6,0%200,0%20177.1,-165.8%20230.3,-359.4%201.6,-5.8%20-0.5,-24.3%20-20,-24.2%20z'%20id='path1'%20style='fill:%23040000;fill-opacity:1'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",la=ne(""),cr=ne(),Zn=ne(!1),Bs=ne(!1),js=ne("");function Fo(){function e(o){return t(o)||n(o)}function t(o){return!(o===""||o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")||o.includes("://open.spotify.com/show/")||o.includes("://open.spotify.com/artist/"))}function n(o){return o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")}function s(o){console.log("Searching for:",o),cr.value=[],Zn.value=!0,la.value=o,Bs.value=!1,js.value="",Re.search(o).then(r=>{console.log("Received Search Data:",r.data),r.status===200?(cr.value=r.data,Zn.value=!1):(console.error("Error Searching:",r),Zn.value=!1,Bs.value=!0,js.value=r.toString())}).catch(r=>{console.error("Other Error Searching:",r.message),Zn.value=!1,Bs.value=!0,js.value=r.message})}return{searchTerm:la,isSearching:Zn,results:cr,error:Bs,errorValue:js,searchFor:s,isValid:e,isValidSearch:t,isValidURL:n}}const hn={QUEUED:"In Queue",DOWNLOADING:"Downloading...",DOWNLOADED:"Done",ERROR:"Error"},It=ne([]);class wu{constructor(t){this.song=t,this.web_status=hn.QUEUED,this.progress=0,this.message="",this.web_download_url=null,this.filename=null}setDownloading(){this.web_status=hn.DOWNLOADING}setDownloaded(){this.web_status=hn.DOWNLOADED}setError(){this.web_status=hn.ERROR}setWebURL(t){this.web_download_url=t}setFilename(t){this.filename=t}isQueued(){return this.song.song_id!==void 0}isDownloading(){return this.web_status===hn.DOWNLOADING}isDownloaded(){return this.web_status===hn.DOWNLOADED}isErrored(){return this.web_status===hn.ERROR}wsUpdate(t){this.progress=t.progress,this.message=t.message}}function Ts(){function e(o){return It.value.findIndex(r=>r.song.song_id===o.song_id)}function t(o){let r=new wu(o);It.value.push(r)}function n(o){console.log("removing",o,o.song_id),It.value=It.value.filter(r=>r.song.song_id!==o.song_id),console.log(It.value)}function s(o){return e(o)===-1?null:It.value[e(o)]}return{appendSong:t,removeSong:n,getBySong:s,downloadQueue:It}}const Me=Ts();Re.ws_onmessage(e=>{let t=JSON.parse(e.data),n=Me.getBySong(t.song);!n&&(Me.appendSong(t.song),n=Me.getBySong(t.song),!n)||(t.status==="done"?(n.progress=100,t.filename&&(n.setWebURL(Re.downloadFileURL(t.filename)),n.setFilename(t.filename)),n.setDownloaded()):t.status==="error"?(n.wsUpdate(t),n.setError()):t.status==="queued"?n.message=t.message||"":(n.wsUpdate(t),n.isDownloading()||n.setDownloading()))});Re.ws_onerror(e=>{console.log("websocket error:",e)});async function _v(){try{const t=(await Re.getQueue()).data||[];for(const n of t){if(It.value.some(o=>o.song.song_id===n.song.song_id))continue;const s=new wu(n.song);n.status==="done"?(s.setDownloaded(),n.filename&&(s.setWebURL(Re.downloadFileURL(n.filename)),s.setFilename(n.filename)),s.progress=100):n.status==="error"?(s.setError(),s.message=n.message||""):(n.status==="downloading"&&(s.setDownloading(),s.progress=n.progress||0),s.message=n.message||""),It.value.push(s)}}catch(e){console.log("Failed to load queue from server:",e)}}_v();function vi(){const e=ne(!1),t=lu();function n(a){const u=(a||"").includes("://open.spotify.com/playlist/"),c=t.settings.value.generate_m3u!==!1;return e.value=!0,Re.open(a).then(f=>{if(console.log("Received Response:",f),f.status!==200){console.log("Error:",f);return}const p=f.data;if(Array.isArray(p)){for(const g of p)Me.getBySong(g)||Me.appendSong(g);return Re.downloadBatch({songs:p,playlist_url:u?a:"",generate_m3u:c}).catch(g=>{console.log("Batch submit failed:",g.message)})}else console.log("Opened Song:",p),o(p)}).catch(f=>{console.log("Other Error:",f.message)}).finally(()=>{e.value=!1})}function s(a){return console.log("Downloading",a),Me.getBySong(a).setDownloading(),Re.download(a).then(u=>{if(console.log("Received Response:",u),u.status===200){let c=u.data;return console.log("Download Complete:",c),Me.getBySong(a).setWebURL(Re.downloadFileURL(c)),Me.getBySong(a).setFilename(c),Me.getBySong(a).setDownloaded(),{song:a,filename:c}}else return console.log("Error:",u),Me.getBySong(a).setError(),{song:a,filename:null}}).catch(u=>(console.log("Other Error:",u.message),Me.getBySong(a).setError(),{song:a,filename:null}))}function o(a,u=!0){return Me.appendSong(a),u?s(a):Promise.resolve({song:a,filename:null})}function r(a,u){const c={...a,youtube_id:u},f=Me.getBySong(a);return f&&(f.song.youtube_id=u,f.setDownloading(),f.progress=0,f.message=""),Re.download(c).then(p=>{const g=Me.getBySong(c);if(p.status===200){const v=p.data;return g&&(g.setWebURL(Re.downloadFileURL(v)),g.setFilename(v),g.setDownloaded()),{song:c,filename:v}}return g&&g.setError(),{song:c,filename:null}}).catch(p=>{console.error("retryWithAudio error:",p.message);const g=Me.getBySong(c);return g&&g.setError(),{song:c,filename:null}})}function i(a){const u=String(a.song_id||a.url||"");Me.removeSong(a),u&&Re.removeQueueItem(u).catch(()=>{})}async function l(){await Re.clearQueue(),It.value=[]}return{fromURL:n,download:s,queue:o,retryWithAudio:r,remove:i,clearAll:l,loading:e}}const wv={class:"relative w-full"},xv=["placeholder"],Sv=["disabled"],Fr={__name:"SearchInput",props:{compact:{type:Boolean,default:!1}},setup(e){const t=Fo(),n=vi(),{t:s,locale:o}=_t(),r=["https://open.spotify.com/track/4vfN00PlILRXy5dcXHQE9M","drugs - EDEN","Não Gosto Eu Amo - Henrique e Juliano","Perfect - Ed Sheeran","Lightning Crashes - Live"],i=ne(0),l=Ee(()=>(o.value,i.value===0?s("search.placeholder"):r[i.value-1])),a=setInterval(()=>{i.value=(i.value+1)%(r.length+1)},5e3);ei(()=>clearInterval(a));function u(c){!c||!c.trim()||(t.isValidURL(c)?(n.fromURL(c),st.push({name:"Download"})):t.isValidSearch(c)&&st.push({name:"Search",params:{query:c}}))}return(c,f)=>(R(),I("div",wv,[Bt(h("input",{type:"text",placeholder:l.value,class:Se(["input-modern",e.compact?"h-11 text-sm":"h-14 text-base"]),"onUpdate:modelValue":f[0]||(f[0]=p=>d(t).searchTerm.value=p),onKeyup:f[1]||(f[1]=eh(p=>u(d(t).searchTerm.value),["enter"]))},null,42,xv),[[Ec,d(t).searchTerm.value]]),h("button",{class:Se(["absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm transition hover:scale-105 active:scale-95 disabled:opacity-60",e.compact?"h-9 w-9":"h-11 w-11"]),disabled:d(n).loading.value,onClick:f[2]||(f[2]=p=>u(d(t).searchTerm.value))},[d(n).loading.value?(R(),I("span",{key:0,class:Se(["loading loading-spinner",e.compact?"loading-xs":"loading-sm"])},null,2)):d(t).isValidURL(d(t).searchTerm.value)?(R(),it(d(K),{key:1,icon:"clarity:download-line",class:Se(e.compact?"h-4 w-4":"h-5 w-5")},null,8,["class"])):(R(),I("svg",{key:2,xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"2",stroke:"currentColor",class:Se(e.compact?"h-4 w-4":"h-5 w-5")},[...f[3]||(f[3]=[h("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"},null,-1)])],2))],10,Sv)]))}},Ev={class:"relative flex min-h-[calc(100dvh-4rem)] items-center justify-center px-6 pt-24 pb-16 overflow-hidden"},Av={class:"relative w-full max-w-2xl text-center animate-slide-up"},Rv={class:"mt-3 flex items-center justify-center gap-2"},Cv={class:"badge-soft"},kv={class:"badge-neutral-soft"},Ov={class:"mx-auto mt-5 max-w-md text-balance text-base sm:text-lg text-base-content/70"},Tv={class:"mt-10"},Pv={class:"mt-4 flex flex-wrap items-center justify-center gap-2 text-xs text-base-content/60"},Iv={class:"pill bg-white/5 border border-white/10"},$v={class:"pill bg-white/5 border border-white/10"},Nv={class:"pill bg-white/5 border border-white/10"},Dv={__name:"Hero",setup(e){const{t}=_t(),n=ne(localStorage.getItem("version")||"2.7.0");return Qt(()=>{const s=localStorage.getItem("version");s&&(n.value=s)}),(s,o)=>(R(),I("section",Ev,[o[4]||(o[4]=h("div",{"aria-hidden":"true",class:"pointer-events-none absolute inset-0 -z-10"},[h("div",{class:"absolute left-1/2 top-1/4 -translate-x-1/2 h-[420px] w-[420px] rounded-full bg-primary/25 blur-[120px]"}),h("div",{class:"absolute right-10 bottom-12 h-64 w-64 rounded-full bg-primary/10 blur-3xl"})],-1)),h("div",Av,[o[3]||(o[3]=hd('

Downtify

',2)),h("div",Rv,[h("span",Cv,"v"+E(n.value),1),h("span",kv,E(d(t)("hero.noAccount")),1)]),h("p",Ov,E(d(t)("hero.tagline")),1),h("div",Tv,[M(Fr,{class:"w-full"}),h("div",Pv,[h("span",Iv,[o[0]||(o[0]=h("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),$e(" "+E(d(t)("hero.songs")),1)]),h("span",$v,[o[1]||(o[1]=h("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),$e(" "+E(d(t)("hero.albums")),1)]),h("span",Nv,[o[2]||(o[2]=h("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),$e(" "+E(d(t)("hero.playlists")),1)])])])])]))}},Lv={class:"absolute top-0 inset-x-0 z-30"},Mv={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Fv={class:"ml-auto flex items-center gap-1 sm:gap-2"},Uv=["title"],Bv=["title"],jv=["title"],Hv=["title"],Vv={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},qv=["title"],Wv=["title"],Kv={__name:"NavbarFront",setup(e){const t=pi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),n=Ts(),{t:s}=_t();return(o,r)=>(R(),I("header",Lv,[h("div",Mv,[r[5]||(r[5]=h("div",{class:"flex items-center gap-2"},[h("img",{src:yi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"}),h("span",{class:"text-lg font-bold tracking-tight"},"Downtify")],-1)),h("div",Fv,[h("button",{class:"icon-btn",onClick:r[0]||(r[0]=i=>d(st).push({name:"List"})),title:d(s)("nav.library")},[M(d(K),{icon:"clarity:library-line",class:"h-5 w-5"})],8,Uv),h("button",{class:"icon-btn",onClick:r[1]||(r[1]=i=>d(st).push({name:"Player"})),title:d(s)("nav.player")},[M(d(K),{icon:"clarity:headphones-line",class:"h-5 w-5"})],8,Bv),h("button",{class:"icon-btn",onClick:r[2]||(r[2]=i=>d(st).push({name:"Monitor"})),title:d(s)("nav.monitor")},[M(d(K),{icon:"clarity:eye-line",class:"h-5 w-5"})],8,jv),h("button",{class:"icon-btn relative",onClick:r[3]||(r[3]=i=>d(st).push({name:"Download"})),title:d(s)("nav.queue")},[M(d(K),{icon:"clarity:download-line",class:"h-5 w-5"}),d(n).downloadQueue.value.length>0?(R(),I("span",Vv,E(d(n).downloadQueue.value.length),1)):xe("",!0)],8,Hv),h("button",{class:"icon-btn",onClick:r[4]||(r[4]=i=>d(t).setTheme(d(t).currentTheme.value==="dark"?"light":"dark")),title:d(t).currentTheme.value==="dark"?d(s)("nav.switchToLight"):d(s)("nav.switchToDark")},[d(t).currentTheme.value==="dark"?(R(),it(d(K),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(R(),it(d(K),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,qv),h("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:d(s)("nav.settings")},[M(d(K),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,Wv)])])]))}},xu=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},zv={components:{NavbarFront:Kv,Hero:Dv},setup(){return Qt(()=>{window.scroll(0,0)}),{}}};function Gv(e,t,n,s,o,r){const i=br("NavbarFront"),l=br("Hero");return R(),I("div",null,[M(i),M(l)])}const Qv=xu(zv,[["render",Gv]]),Jv={class:"sticky top-0 z-30 glass-nav"},Yv={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Xv=["title"],Zv={class:"hidden md:flex flex-1 justify-center"},eb={class:"ml-auto flex items-center gap-1 sm:gap-2"},tb=["title"],nb=["title"],sb=["title"],ob=["title"],rb={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},ib=["title"],lb=["title"],ab={class:"md:hidden px-4 pb-3"},Ps={__name:"Navbar",setup(e){const t=_u(),n=pi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),s=Ts(),o=Fo(),{t:r}=_t();return(i,l)=>(R(),I("header",Jv,[h("div",Yv,[h("button",{class:"flex items-center gap-2 shrink-0",onClick:l[0]||(l[0]=a=>d(st).push({name:"Home"})),title:d(r)("nav.home")},[...l[6]||(l[6]=[h("img",{src:yi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"},null,-1),h("span",{class:"hidden sm:inline text-lg font-bold tracking-tight"}," Downtify ",-1)])],8,Xv),h("div",Zv,[M(Fr,{class:"w-full max-w-md",compact:!0})]),h("div",eb,[h("button",{class:Se(["icon-btn",{"icon-btn-active":d(t).name==="List"}]),onClick:l[1]||(l[1]=a=>d(st).push({name:"List"})),title:d(r)("nav.library")},[M(d(K),{icon:"clarity:library-line",class:"h-5 w-5"})],10,tb),h("button",{class:Se(["icon-btn",{"icon-btn-active":d(t).name==="Player"}]),onClick:l[2]||(l[2]=a=>d(st).push({name:"Player"})),title:d(r)("nav.player")},[M(d(K),{icon:"clarity:headphones-line",class:"h-5 w-5"})],10,nb),h("button",{class:Se(["icon-btn",{"icon-btn-active":d(t).name==="Monitor"}]),onClick:l[3]||(l[3]=a=>d(st).push({name:"Monitor"})),title:d(r)("nav.monitor")},[M(d(K),{icon:"clarity:eye-line",class:"h-5 w-5"})],10,sb),h("button",{class:Se(["icon-btn relative",{"icon-btn-active":d(t).name==="Download"}]),onClick:l[4]||(l[4]=a=>d(t).name==="Download"?d(st).push({name:"Search",params:{query:d(o).searchTerm.value||" "}}):d(st).push({name:"Download"})),title:d(r)("nav.queue")},[M(d(K),{icon:"clarity:download-line",class:"h-5 w-5"}),d(s).downloadQueue.value.length>0?(R(),I("span",rb,E(d(s).downloadQueue.value.length),1)):xe("",!0)],10,ob),h("button",{class:"icon-btn",onClick:l[5]||(l[5]=a=>d(n).setTheme(d(n).currentTheme.value==="dark"?"light":"dark")),title:d(n).currentTheme.value==="dark"?d(r)("nav.switchToLight"):d(r)("nav.switchToDark")},[d(n).currentTheme.value==="dark"?(R(),it(d(K),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(R(),it(d(K),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,ib),h("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:d(r)("nav.settings")},[M(d(K),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,lb)])]),h("div",ab,[M(Fr,{compact:!0})])]))}},cb={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},ub={class:"mb-8"},fb={class:"text-2xl font-bold tracking-tight"},db={class:"mt-1 text-sm text-base-content/60"},hb={class:"text-base-content/90 font-medium"},pb={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},mb={key:1,class:"space-y-3"},gb={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},yb={class:"text-base-content/50 text-sm"},vb={class:"text-base-content/40 text-xs mt-1"},bb={key:3,class:"space-y-2"},_b={class:"track-cover"},wb=["src","alt"],xb={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},Sb={class:"flex-1 min-w-0"},Eb={class:"flex items-center gap-2 mb-0.5"},Ab={class:"font-semibold truncate"},Rb={key:0,class:"badge-error-soft shrink-0"},Cb={class:"text-xs text-base-content/70 truncate"},kb={key:0,class:"text-xs text-base-content/40 truncate"},Ob={key:0,class:"text-base-content/30"},Tb={class:"flex items-center gap-1 shrink-0"},Pb=["href","title"],Ib=["title"],$b=["onClick","title"],Nb={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},Db=["disabled","title"],Lb=["onClick"],Mb=["disabled","title"],ur=5,Fb={__name:"SearchList",props:["data","error"],emits:["download"],setup(e,{emit:t}){const n=e,s=t,o=Fo(),r=Ts(),{t:i}=_t(),l=ne(1),a=Ee(()=>{var g;return Math.ceil((((g=n.data)==null?void 0:g.length)||0)/ur)}),u=Ee(()=>{if(!n.data)return[];const g=(l.value-1)*ur;return n.data.slice(g,g+ur)});sn(()=>n.data,()=>{l.value=1});function c(g){return Array.isArray(g.artists)&&g.artists.length?g.artists.join(", "):g.artist||i("common.unknownArtist")}function f(g){const v=r.getBySong(g);return v?v.isErrored()?"error":(v.isDownloaded(),"queued"):"idle"}function p(g){s("download",g)}return(g,v)=>{var w;return R(),I("div",cb,[h("div",ub,[h("h1",fb,E(d(i)("search.title")),1),h("p",db,[d(o).searchTerm.value?(R(),I(fe,{key:0},[$e(E(d(i)("search.matchesFor"))+" ",1),h("span",hb,' "'+E(d(o).searchTerm.value)+'" ',1),!d(o).isSearching.value&&(((w=n.data)==null?void 0:w.length)||0)>0?(R(),I(fe,{key:0},[$e(E(n.data.length===1?d(i)("search.songsCount",{count:n.data.length}):d(i)("search.songsCountPlural",{count:n.data.length})),1)],64)):xe("",!0)],64)):(R(),I(fe,{key:1},[$e(E(d(i)("search.typeToBegin")),1)],64))])]),n.error?(R(),I("div",pb,[M(d(K),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),h("span",null,E(d(o).errorValue.value?d(i)("search.errorWithDetail",{detail:d(o).errorValue.value}):d(i)("search.error")),1)])):xe("",!0),d(o).isSearching.value?(R(),I("div",mb,[(R(),I(fe,null,De(5,b=>h("div",{key:b,class:"skeleton h-24 rounded-2xl"})),64))])):!n.data||n.data.length===0?(R(),I("div",gb,[M(d(K),{icon:"clarity:search-line",class:"h-12 w-12 text-base-content/20 mb-4"}),h("p",yb,E(d(i)("search.empty")),1),h("p",vb,E(d(i)("search.emptyHint")),1)])):(R(),I("ul",bb,[(R(!0),I(fe,null,De(u.value,(b,A)=>(R(),I("li",{key:b.song_id||A,class:"surface rounded-2xl track-card"},[h("div",_b,[b.cover_url?(R(),I("img",{key:0,src:b.cover_url,alt:b.name,class:"h-full w-full object-cover",loading:"lazy"},null,8,wb)):(R(),I("div",xb,[M(d(K),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),h("div",Sb,[h("div",Eb,[h("span",Ab,E(b.name),1),b.explicit?(R(),I("span",Rb,"E")):xe("",!0)]),h("p",Cb,E(c(b)),1),b.album_name?(R(),I("p",kb,[$e(E(b.album_name)+" ",1),b.year?(R(),I("span",Ob," · "+E(b.year),1)):xe("",!0)])):xe("",!0)]),h("div",Tb,[b.url?(R(),I("a",{key:0,class:"icon-btn",href:b.url,target:"_blank",rel:"noopener",title:d(i)("search.openOnSpotify")},[M(d(K),{icon:"clarity:pop-out-line",class:"h-4 w-4"})],8,Pb)):xe("",!0),f(b)==="queued"?(R(),I("button",{key:1,class:"icon-btn text-primary cursor-default",title:d(i)("search.inQueue"),disabled:""},[M(d(K),{icon:"clarity:check-circle-line",class:"h-5 w-5"})],8,Ib)):(R(),I("button",{key:2,class:"icon-btn text-primary hover:bg-primary/10",onClick:C=>p(b),title:d(i)("search.download")},[M(d(K),{icon:"clarity:download-line",class:"h-5 w-5"})],8,$b))])]))),128))])),a.value>1?(R(),I("nav",Nb,[h("button",{class:"icon-btn",disabled:l.value===1,onClick:v[0]||(v[0]=b=>l.value--),title:d(i)("search.previousPage")},[M(d(K),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,Db),(R(!0),I(fe,null,De(a.value,b=>(R(),I("button",{key:b,class:Se(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",b===l.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:A=>l.value=b},E(b),11,Lb))),128)),h("button",{class:"icon-btn",disabled:l.value===a.value,onClick:v[1]||(v[1]=b=>l.value++),title:d(i)("search.nextPage")},[M(d(K),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,Mb)])):xe("",!0)])}}},Ub={class:"min-h-screen"},Bb={__name:"Search",setup(e){Qt(()=>window.scroll(0,0));const t=_u(),n=Fo(),s=vi();return sn(()=>t.params.query,()=>{t.params.query&&n.searchFor(t.params.query)},{deep:!0}),n.searchFor(t.params.query),(o,r)=>(R(),I("div",Ub,[M(Ps),M(Vn),M(Fb,{data:d(n).results.value,error:d(n).error.value,onDownload:r[0]||(r[0]=i=>d(s).queue(i))},null,8,["data","error"])]))}},jb={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},Hb={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},Vb={class:"text-2xl font-bold tracking-tight"},qb={class:"mt-1 text-sm text-base-content/60"},Wb=["title"],Kb={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},zb={class:"text-base-content/50 text-sm"},Gb={class:"text-base-content/40 text-xs mt-1"},Qb={key:1,class:"space-y-3"},Jb={class:"track-cover h-16 w-16 sm:h-20 sm:w-20"},Yb=["src","alt"],Xb={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},Zb={class:"flex-1 min-w-0"},e0={class:"flex items-center gap-2 mb-0.5"},t0={class:"font-semibold truncate"},n0={class:"text-xs text-base-content/60 truncate"},s0={key:0,class:"text-xs text-base-content/40 truncate"},o0={class:"flex items-center gap-2 shrink-0"},r0=["onClick","title"],i0={class:"text-[10px] font-semibold"},l0={key:2,class:"loading loading-spinner loading-sm text-primary"},a0=["onClick","title"],c0={key:2,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},u0=["disabled","title"],f0=["onClick"],d0=["disabled","title"],fr=10,h0={__name:"DownloadList",setup(e){const t=Ts(),n=vi(),{t:s}=_t();async function o(){confirm(s("queue.clearAllPrompt"))&&await n.clearAll()}const r=ne(1),i=Ee(()=>Math.ceil(t.downloadQueue.value.length/fr)),l=Ee(()=>{const f=(r.value-1)*fr;return t.downloadQueue.value.slice(f,f+fr)});sn(()=>t.downloadQueue.value.length,()=>{r.value>i.value&&i.value>0&&(r.value=i.value)});function a(f){return Array.isArray(f.artists)&&f.artists.length?f.artists.join(", "):f.artist||s("common.unknownArtist")}function u(f){return f.isErrored()?"badge-error-soft":f.isDownloaded()?"badge-soft":"badge-neutral-soft"}function c(f){const p=document.createElement("a");p.href=f,p.download=f.split("/").pop(),document.body.appendChild(p),p.click(),document.body.removeChild(p)}return(f,p)=>(R(),I("div",jb,[h("div",Hb,[h("div",null,[h("h1",Vb,E(d(s)("queue.title")),1),h("p",qb,E(d(s)("queue.subtitle")),1)]),d(t).downloadQueue.value.length>0?(R(),I("button",{key:0,class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 text-error/70 hover:text-error",onClick:o,title:d(s)("queue.clearAll")},[M(d(K),{icon:"clarity:trash-line",class:"h-4 w-4 mr-1.5"}),$e(" "+E(d(s)("queue.clearAll")),1)],8,Wb)):xe("",!0)]),d(t).downloadQueue.value.length===0?(R(),I("div",Kb,[M(d(K),{icon:"clarity:download-line",class:"h-12 w-12 text-base-content/20 mb-4"}),h("p",zb,E(d(s)("queue.empty")),1),h("p",Gb,E(d(s)("queue.emptyHint")),1)])):(R(),I("ul",Qb,[(R(!0),I(fe,null,De(l.value,(g,v)=>(R(),I("li",{key:v,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-4"},[h("div",Jb,[g.song.cover_url?(R(),I("img",{key:0,src:g.song.cover_url,alt:g.song.name,class:"h-full w-full object-cover"},null,8,Yb)):(R(),I("div",Xb,[M(d(K),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),h("div",Zb,[h("div",e0,[h("span",t0,E(g.song.name),1),h("span",{class:Se([u(g),"shrink-0"])},E(g.message||g.web_status),3)]),h("p",n0,E(a(g.song)),1),g.song.album_name?(R(),I("p",s0,E(g.song.album_name),1)):xe("",!0)]),h("div",o0,[g.isDownloaded()?(R(),I("a",{key:0,class:"icon-btn text-primary hover:bg-primary/10",href:"javascript:;",onClick:w=>c(g.web_download_url),title:d(s)("queue.saveToDevice")},[M(d(K),{icon:"clarity:download-line",class:"h-4 w-4"})],8,r0)):g.progress>0&&!g.isErrored()?(R(),I("div",{key:1,class:"radial-progress text-primary",style:In(`--value:${g.progress}; --size:2.75rem; --thickness:3px`)},[h("span",i0,E(Math.round(g.progress))+"% ",1)],4)):g.isErrored()?xe("",!0):(R(),I("span",l0)),h("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",onClick:w=>d(n).remove(g.song),title:d(s)("queue.removeFromQueue")},[M(d(K),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,a0)])]))),128))])),i.value>1?(R(),I("nav",c0,[h("button",{class:"icon-btn",disabled:r.value===1,onClick:p[0]||(p[0]=g=>r.value--),title:d(s)("common.previousPage")},[M(d(K),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,u0),(R(!0),I(fe,null,De(i.value,g=>(R(),I("button",{key:g,class:Se(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",g===r.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:v=>r.value=g},E(g),11,f0))),128)),h("button",{class:"icon-btn",disabled:r.value===i.value,onClick:p[1]||(p[1]=g=>r.value++),title:d(s)("common.nextPage")},[M(d(K),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,d0)])):xe("",!0)]))}},p0={class:"min-h-screen"},m0={__name:"Download",setup(e){return Qt(()=>window.scroll(0,0)),(t,n)=>(R(),I("div",p0,[M(Ps),M(Vn),M(h0)]))}},Su="downtify-player-volume",He=ne([]),et=ne(-1),po=ne(!1),Is=ne(0),rn=ne(0),bi=ne(parseFloat(localStorage.getItem(Su)||"0.85")),Pn=ne(!1),qn=ne("off"),ln=ne(!1);let ye=null,pt=[],Uo=0;function Bo(){return ye||(ye=new Audio,ye.preload="metadata",ye.volume=bi.value,ye.addEventListener("timeupdate",()=>{Is.value=ye.currentTime}),ye.addEventListener("loadedmetadata",()=>{rn.value=isFinite(ye.duration)?ye.duration:0}),ye.addEventListener("durationchange",()=>{rn.value=isFinite(ye.duration)?ye.duration:0}),ye.addEventListener("ended",R0),ye.addEventListener("play",()=>{po.value=!0}),ye.addEventListener("pause",()=>{po.value=!1}),ye)}function g0(e){return`/downloads/${encodeURIComponent(e)}`}function y0(e){return`/cover?file=${encodeURIComponent(e)}`}function Eu(e){const t=e.replace(/\.[^.]+$/,"");let n="",s=t;const o=t.indexOf(" - ");return o>0&&(n=t.slice(0,o).trim(),s=t.slice(o+3).trim()),{file:e,url:g0(e),cover:y0(e),title:s,artist:n}}function $s(){const e=He.value.map((t,n)=>n);for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}pt=e,Uo=et.value>=0?Math.max(0,pt.indexOf(et.value)):0}function v0(e,t={}){const n=(e||[]).map(s=>typeof s=="string"?Eu(s):s);He.value=n,et.value>=n.length&&(et.value=-1),ln.value&&$s(),typeof t.startIndex=="number"?Un(t.startIndex):t.autoplay&&n.length>0&&et.value<0&&Un(0)}function Un(e){if(e<0||e>=He.value.length)return;const t=Bo();if(et.value=e,ln.value){pt.length!==He.value.length&&$s();const n=pt.indexOf(e);n>=0&&(Uo=n)}t.src=He.value[e].url,t.currentTime=0,Is.value=0,t.play().catch(()=>{})}function Au(){if(He.value.length===0)return;const e=Bo();if(et.value<0){Un(0);return}e.src||(e.src=He.value[et.value].url),e.play().catch(()=>{})}function _i(){ye&&ye.pause()}function b0(){po.value?_i():Au()}function jo(e){const t=Bo(),n=rn.value||0,s=Math.max(0,Math.min(n,e));t.currentTime=s,Is.value=s}function _0(e){rn.value&&jo(rn.value*Math.max(0,Math.min(1,e)))}function w0(e){const t=Math.max(0,Math.min(1,e));bi.value=t,ye&&(ye.volume=t);try{localStorage.setItem(Su,String(t))}catch{}t>0&&Pn.value&&(Pn.value=!1,ye&&(ye.muted=!1))}function x0(){Pn.value=!Pn.value,ye&&(ye.muted=Pn.value)}function S0(){if(He.value.length===0)return-1;if(ln.value){pt.length!==He.value.length&&$s();const t=(Uo+1)%pt.length;return pt[t]}const e=et.value+1;return e>=He.value.length?qn.value==="all"?0:-1:e}function E0(){if(He.value.length===0)return-1;if(ln.value){pt.length!==He.value.length&&$s();const t=(Uo-1+pt.length)%pt.length;return pt[t]}const e=et.value-1;return e<0?qn.value==="all"?He.value.length-1:0:e}function Ru(){const e=S0();if(e<0){_i();return}Un(e)}function A0(){if(Bo().currentTime>3){jo(0);return}const t=E0();t<0||Un(t)}function R0(){if(qn.value==="one"){jo(0),ye&&ye.play().catch(()=>{});return}Ru()}function Cu(e){["off","all","one"].includes(e)&&(qn.value=e)}function C0(){const e=["off","all","one"],t=e.indexOf(qn.value);Cu(e[(t+1)%e.length])}function ku(e){ln.value=!!e,ln.value&&$s()}function k0(){ku(!ln.value)}const O0=Ee(()=>et.value>=0&&et.valuern.value>0?Is.value/rn.value*100:0);function aa(e){if(!isFinite(e)||e<0)return"0:00";const t=Math.floor(e),n=Math.floor(t/60),s=t%60;return`${n}:${s.toString().padStart(2,"0")}`}function P0(e){return Eu(e)}function Ou(){return{playlist:He,currentIndex:et,currentTrack:O0,isPlaying:po,currentTime:Is,duration:rn,progressPct:T0,volume:bi,isMuted:Pn,repeatMode:qn,shuffle:ln,setPlaylist:v0,playAt:Un,play:Au,pause:_i,toggle:b0,seek:jo,seekRatio:_0,setVolume:w0,toggleMute:x0,next:Ru,prev:A0,setRepeat:Cu,cycleRepeat:C0,setShuffle:ku,toggleShuffle:k0}}const I0={class:"min-h-screen"},$0={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},N0={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},D0={class:"text-2xl font-bold tracking-tight"},L0={class:"mt-1 text-sm text-base-content/60"},M0={class:"flex items-center gap-2"},F0=["title"],U0=["disabled"],B0={key:0,class:"loading loading-spinner loading-xs mr-2"},j0={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},H0={key:1,class:"space-y-3"},V0={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},q0={class:"text-base-content/50 text-sm"},W0={class:"text-base-content/40 text-xs mt-1"},K0={key:3,class:"space-y-2"},z0={class:"relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden"},G0=["src","alt","onError"],Q0={class:"flex-1 min-w-0"},J0={class:"text-sm font-medium truncate block"},Y0={class:"text-xs text-base-content/40"},X0={key:0,class:"mr-2 text-primary/70"},Z0={class:"flex items-center gap-1 shrink-0"},e_=["onClick","title"],t_=["href","title"],n_=["disabled","onClick","title"],s_={key:0,class:"loading loading-spinner loading-xs"},o_={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},r_=["disabled","title"],i_=["onClick"],l_=["disabled","title"],a_={key:5,class:"mt-6 text-xs text-base-content/40 text-center"},dr=10,c_={__name:"Downloads",setup(e){const{t}=_t(),n=Ou(),s=bv(),o=ne([]),r=ne(!1),i=ne(""),l=ne({}),a=ne({}),u=ne(1),c=Ee(()=>Math.ceil(o.value.length/dr)),f=Ee(()=>{const F=(u.value-1)*dr;return o.value.slice(F,F+dr)});sn(o,()=>{u.value=1});function p(F){return Re.coverFileURL(F)}function g(F){a.value={...a.value,[F]:!0}}async function v(){r.value=!0,i.value="";try{const F=await Re.listDownloads();o.value=F.data||[]}catch{i.value=t("library.failedLoad")}finally{r.value=!1}}async function w(F){if(confirm(t("library.deletePrompt",{file:F}))){l.value={...l.value,[F]:!0};try{await Re.deleteDownload(F),o.value=o.value.filter(P=>P!==F)}catch{i.value=t("library.failedDelete",{file:F})}finally{l.value={...l.value,[F]:!1}}}}function b(F){const P=F.lastIndexOf(".");return P>0?F.slice(P+1).toUpperCase():""}function A(F){const P=F.lastIndexOf("/");return P>=0?F.slice(P+1):F}function C(F){const P=F.lastIndexOf("/");return P>=0?F.slice(0,P):""}function S(F){n.setPlaylist(o.value,{startIndex:F}),s.push({name:"Player"})}function $(){o.value.length&&(n.setPlaylist(o.value,{startIndex:0}),s.push({name:"Player"}))}return Qt(v),(F,P)=>(R(),I("div",I0,[M(Ps),M(Vn),h("div",$0,[h("div",N0,[h("div",null,[h("h1",D0,E(d(t)("library.title")),1),h("p",L0,E(d(t)("library.subtitle")),1)]),h("div",M0,[o.value.length>0?(R(),I("button",{key:0,class:"btn btn-primary btn-sm h-11 px-5 rounded-full",onClick:$,title:d(t)("library.play")},[M(d(K),{icon:"clarity:play-line",class:"h-4 w-4 mr-1.5"}),$e(" "+E(d(t)("library.play")),1)],8,F0)):xe("",!0),h("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:v,disabled:r.value},[r.value?(R(),I("span",B0)):(R(),it(d(K),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4 mr-2"})),$e(" "+E(d(t)("common.refresh")),1)],8,U0)])]),i.value?(R(),I("div",j0,[M(d(K),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),h("span",null,E(i.value),1)])):xe("",!0),r.value&&o.value.length===0?(R(),I("div",H0,[(R(),I(fe,null,De(4,N=>h("div",{key:N,class:"skeleton h-16 rounded-2xl"})),64))])):o.value.length===0?(R(),I("div",V0,[M(d(K),{icon:"clarity:library-line",class:"h-12 w-12 text-base-content/20 mb-4"}),h("p",q0,E(d(t)("library.empty")),1),h("p",W0,E(d(t)("library.emptyHint")),1)])):(R(),I("ul",K0,[(R(!0),I(fe,null,De(f.value,N=>(R(),I("li",{key:N,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-3"},[h("div",z0,[a.value[N]?(R(),it(d(K),{key:1,icon:"clarity:music-note-line",class:"h-5 w-5"})):(R(),I("img",{key:0,src:p(N),alt:N,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:Y=>g(N)},null,40,G0))]),h("div",Q0,[h("span",J0,E(A(N)),1),h("span",Y0,[C(N)?(R(),I("span",X0,[M(d(K),{icon:"clarity:folder-line",class:"inline h-3 w-3 mr-0.5 align-text-top"}),$e(E(C(N)),1)])):xe("",!0),$e(" "+E(b(N)),1)])]),h("div",Z0,[h("button",{class:"icon-btn text-primary hover:bg-primary/10",onClick:Y=>S(o.value.indexOf(N)),title:d(t)("library.play")},[M(d(K),{icon:"clarity:play-line",class:"h-4 w-4"})],8,e_),h("a",{class:"icon-btn",href:d(Re).downloadFileURL(N),download:"",title:d(t)("library.downloadToDevice")},[M(d(K),{icon:"clarity:download-line",class:"h-4 w-4"})],8,t_),h("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",disabled:l.value[N]===!0,onClick:Y=>w(N),title:d(t)("library.deleteFile")},[l.value[N]===!0?(R(),I("span",s_)):(R(),it(d(K),{key:1,icon:"clarity:trash-line",class:"h-4 w-4"}))],8,n_)])]))),128))])),c.value>1?(R(),I("nav",o_,[h("button",{class:"icon-btn",disabled:u.value===1,onClick:P[0]||(P[0]=N=>u.value--),title:d(t)("common.previousPage")},[M(d(K),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,r_),(R(!0),I(fe,null,De(c.value,N=>(R(),I("button",{key:N,class:Se(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",N===u.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:Y=>u.value=N},E(N),11,i_))),128)),h("button",{class:"icon-btn",disabled:u.value===c.value,onClick:P[1]||(P[1]=N=>u.value++),title:d(t)("common.nextPage")},[M(d(K),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,l_)])):xe("",!0),o.value.length>0?(R(),I("p",a_,E(o.value.length===1?d(t)("library.countOne",{count:o.value.length}):d(t)("library.countMany",{count:o.value.length})),1)):xe("",!0)])]))}},Ns=ke.create({baseURL:`${ze.PROTOCOL}//${ze.BACKEND}:${ze.PORT}${ze.BASEURL}`});function u_(){return Ns.get("/api/monitor/playlists")}function f_(e,t=60){return Ns.post("/api/monitor/playlists",{url:e,interval_minutes:t})}function d_(e,t){return Ns.patch(`/api/monitor/playlists/${e}`,t)}function h_(e){return Ns.delete(`/api/monitor/playlists/${e}`)}function p_(e){return Ns.post(`/api/monitor/playlists/${e}/check`)}const pn={listMonitoredPlaylists:u_,addMonitoredPlaylist:f_,updateMonitoredPlaylist:d_,deleteMonitoredPlaylist:h_,checkMonitoredPlaylist:p_},m_={class:"min-h-screen"},g_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},y_={class:"mb-8"},v_={class:"text-2xl font-bold tracking-tight"},b_={class:"mt-1 text-sm text-base-content/60"},__={class:"surface rounded-2xl p-5 mb-8"},w_={class:"text-sm font-semibold uppercase tracking-wider text-base-content/50 mb-4"},x_=["placeholder","disabled"],S_={class:"flex items-center gap-2 shrink-0"},E_=["disabled"],A_={value:15},R_={value:30},C_={value:60},k_={value:180},O_={value:360},T_={value:720},P_={value:1440},I_={value:10080},$_={value:20160},N_={value:43200},D_=["disabled"],L_={key:0,class:"loading loading-spinner loading-xs"},M_={key:1},F_={key:0,class:"mt-2 text-xs text-error"},U_={key:0,class:"space-y-3"},B_={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},j_={class:"text-base-content/50 text-sm"},H_={class:"text-base-content/40 text-xs mt-1"},V_={key:2,class:"space-y-3"},q_={class:"flex-1 min-w-0"},W_={class:"flex items-center gap-2 mb-1"},K_={class:"font-semibold truncate"},z_={class:"flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-base-content/50"},G_={key:0},Q_={key:1,class:"italic"},J_={class:"flex items-center gap-2 shrink-0"},Y_=["value","onChange"],X_={value:15},Z_={value:30},ew={value:60},tw={value:180},nw={value:360},sw={value:720},ow={value:1440},rw={value:10080},iw={value:20160},lw={value:43200},aw=["title","onClick"],cw=["title","disabled","onClick"],uw={key:0,class:"loading loading-spinner loading-xs"},fw=["title","onClick"],dw={class:"mt-8 surface rounded-2xl p-4 flex gap-3 text-sm text-base-content/60"},hw={__name:"Monitor",setup(e){const{t}=_t(),n=ne([]),s=ne(!1),o=ne(!1),r=ne(""),i=ne(""),l=ne(60),a=ne({});async function u(){s.value=!0;try{const A=await pn.listMonitoredPlaylists();n.value=A.data||[]}finally{s.value=!1}}async function c(){var A,C;r.value="",o.value=!0;try{const S=await pn.addMonitoredPlaylist(i.value.trim(),l.value);n.value.unshift(S.data),i.value=""}catch(S){r.value=((C=(A=S==null?void 0:S.response)==null?void 0:A.data)==null?void 0:C.detail)||t("monitor.failedAdd")}finally{o.value=!1}}async function f(A){try{const C=await pn.updateMonitoredPlaylist(A.id,{enabled:!A.enabled});Object.assign(A,C.data)}catch{}}async function p(A,C){const S=parseInt(C.target.value,10);try{const $=await pn.updateMonitoredPlaylist(A.id,{interval_minutes:S});Object.assign(A,$.data)}catch{}}async function g(A){a.value={...a.value,[A.id]:!0};try{await pn.checkMonitoredPlaylist(A.id),setTimeout(async()=>{try{const C=await pn.listMonitoredPlaylists();n.value=C.data||[]}finally{a.value={...a.value,[A.id]:!1}}},3e3)}catch{a.value={...a.value,[A.id]:!1}}}async function v(A){if(confirm(t("monitor.deletePrompt",{name:A.name})))try{await pn.deleteMonitoredPlaylist(A.id),n.value=n.value.filter(C=>C.id!==A.id)}catch{}}function w(A){if(A<60)return`${A} ${t("monitor.minSuffix")}`;if(A<1440)return`${A/60} ${t("monitor.hourSuffix")}`;if(A<10080){const S=A/1440;return`${S} ${t(S===1?"monitor.daySuffix":"monitor.daysSuffix")}`}if(A<43200){const S=A/10080;return`${S} ${t(S===1?"monitor.weekSuffix":"monitor.weeksSuffix")}`}const C=Math.round(A/43200);return`${C} ${t(C===1?"monitor.monthSuffix":"monitor.monthsSuffix")}`}function b(A){try{const C=Date.now()-new Date(A).getTime(),S=Math.floor(C/6e4);if(S<1)return t("monitor.timeJustNow");if(S<60)return t("monitor.timeMinAgo",{n:S});const $=Math.floor(S/60);return $<24?t("monitor.timeHourAgo",{n:$}):t("monitor.timeDayAgo",{n:Math.floor($/24)})}catch{return""}}return Qt(u),(A,C)=>(R(),I("div",m_,[M(Ps),M(Vn),h("div",g_,[h("div",y_,[h("h1",v_,E(d(t)("monitor.title")),1),h("p",b_,E(d(t)("monitor.subtitle")),1)]),h("div",__,[h("h2",w_,E(d(t)("monitor.watchNew")),1),h("form",{onSubmit:Xd(c,["prevent"]),class:"flex flex-col sm:flex-row gap-3"},[Bt(h("input",{"onUpdate:modelValue":C[0]||(C[0]=S=>i.value=S),type:"text",placeholder:d(t)("monitor.urlPlaceholder"),class:"input-modern flex-1 h-11 text-sm",disabled:o.value},null,8,x_),[[Ec,i.value]]),h("div",S_,[Bt(h("select",{"onUpdate:modelValue":C[1]||(C[1]=S=>l.value=S),class:"select select-sm rounded-full border border-white/10 bg-base-100/85 focus:border-primary/60 h-11 px-3 text-sm",disabled:o.value},[h("option",A_,E(d(t)("monitor.every15")),1),h("option",R_,E(d(t)("monitor.every30")),1),h("option",C_,E(d(t)("monitor.every1h")),1),h("option",k_,E(d(t)("monitor.every3h")),1),h("option",O_,E(d(t)("monitor.every6h")),1),h("option",T_,E(d(t)("monitor.every12h")),1),h("option",P_,E(d(t)("monitor.every1d")),1),h("option",I_,E(d(t)("monitor.every1w")),1),h("option",$_,E(d(t)("monitor.every2w")),1),h("option",N_,E(d(t)("monitor.every1mo")),1)],8,E_),[[zs,l.value]]),h("button",{type:"submit",class:"btn btn-primary btn-sm h-11 px-5 rounded-full",disabled:o.value||!i.value.trim()},[o.value?(R(),I("span",L_)):(R(),I("span",M_,E(d(t)("monitor.watch")),1))],8,D_)])],32),r.value?(R(),I("p",F_,E(r.value),1)):xe("",!0)]),s.value?(R(),I("div",U_,[(R(),I(fe,null,De(3,S=>h("div",{key:S,class:"skeleton h-24 rounded-2xl"})),64))])):n.value.length===0?(R(),I("div",B_,[M(d(K),{icon:"clarity:music-note-line",class:"h-12 w-12 text-base-content/20 mb-4"}),h("p",j_,E(d(t)("monitor.empty")),1),h("p",H_,E(d(t)("monitor.emptyHint")),1)])):(R(),I("ul",V_,[(R(!0),I(fe,null,De(n.value,S=>(R(),I("li",{key:S.id,class:"surface rounded-2xl p-4 sm:p-5 flex flex-col sm:flex-row sm:items-center gap-4"},[h("div",q_,[h("div",W_,[h("span",K_,E(S.name),1),h("span",{class:Se(["pill shrink-0",S.enabled?"badge-soft":"badge-neutral-soft"])},E(S.enabled?d(t)("monitor.active"):d(t)("monitor.paused")),3)]),h("div",z_,[h("span",null,[M(d(K),{icon:"clarity:refresh-line",class:"inline h-3 w-3 mr-0.5"}),$e(" "+E(d(t)("monitor.everyInterval",{interval:w(S.interval_minutes)})),1)]),h("span",null,[M(d(K),{icon:"clarity:music-note-line",class:"inline h-3 w-3 mr-0.5"}),$e(" "+E(S.last_track_count===1?d(t)("monitor.tracksOne",{count:S.last_track_count}):d(t)("monitor.tracksMany",{count:S.last_track_count})),1)]),S.last_checked?(R(),I("span",G_,[M(d(K),{icon:"clarity:clock-line",class:"inline h-3 w-3 mr-0.5"}),$e(" "+E(d(t)("monitor.checked",{when:b(S.last_checked)})),1)])):(R(),I("span",Q_,E(d(t)("monitor.notChecked")),1))])]),h("div",J_,[h("select",{value:S.interval_minutes,onChange:$=>p(S,$),class:"select select-xs rounded-full border border-white/10 bg-base-100/60 text-xs focus:border-primary/60"},[h("option",X_,E(d(t)("monitor.short15")),1),h("option",Z_,E(d(t)("monitor.short30")),1),h("option",ew,E(d(t)("monitor.short1h")),1),h("option",tw,E(d(t)("monitor.short3h")),1),h("option",nw,E(d(t)("monitor.short6h")),1),h("option",sw,E(d(t)("monitor.short12h")),1),h("option",ow,E(d(t)("monitor.short1d")),1),h("option",rw,E(d(t)("monitor.short1w")),1),h("option",iw,E(d(t)("monitor.short2w")),1),h("option",lw,E(d(t)("monitor.short1mo")),1)],40,Y_),h("button",{class:"icon-btn",title:S.enabled?d(t)("monitor.pause"):d(t)("monitor.resume"),onClick:$=>f(S)},[M(d(K),{icon:S.enabled?"clarity:pause-line":"clarity:play-line",class:"h-4 w-4"},null,8,["icon"])],8,aw),h("button",{class:"icon-btn",title:d(t)("monitor.checkNow"),disabled:a.value[S.id],onClick:$=>g(S)},[a.value[S.id]?(R(),I("span",uw)):(R(),it(d(K),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4"}))],8,cw),h("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",title:d(t)("monitor.stop"),onClick:$=>v(S)},[M(d(K),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,fw)])]))),128))])),h("div",dw,[M(d(K),{icon:"clarity:info-standard-line",class:"h-5 w-5 shrink-0 mt-0.5 text-primary/70"}),h("p",null,E(d(t)("monitor.info")),1)])])]))}},pw={class:"min-h-screen"},mw={class:"mx-auto max-w-5xl px-4 py-8 sm:px-6"},gw={class:"mb-8"},yw={class:"text-2xl font-bold tracking-tight"},vw={class:"mt-1 text-sm text-base-content/60"},bw={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},_w={class:"text-base-content/50 text-sm"},ww={class:"text-base-content/40 text-xs mt-1"},xw={key:1,class:"space-y-3"},Sw={key:2,class:"grid gap-6 lg:grid-cols-[1fr_360px]"},Ew={class:"surface rounded-3xl p-6 sm:p-8 flex flex-col items-center text-center"},Aw=["src","alt"],Rw={key:2,class:"absolute bottom-3 right-3 equalizer h-5","aria-hidden":"true"},Cw={class:"mt-6 w-full"},kw={class:"text-xl font-bold tracking-tight truncate"},Ow={class:"text-sm text-base-content/60 truncate mt-0.5"},Tw={class:"mt-6 w-full"},Pw={class:"mt-2 flex items-center justify-between text-xs text-base-content/50 tabular-nums"},Iw={class:"mt-5 flex items-center justify-center gap-3"},$w=["title"],Nw=["title","disabled"],Dw=["disabled","title"],Lw=["title","disabled"],Mw=["title"],Fw={key:0,class:"absolute -bottom-0.5 -right-0.5 h-4 min-w-[1rem] px-1 rounded-full bg-primary text-primary-content text-[9px] font-bold flex items-center justify-center"},Uw={class:"mt-6 w-full max-w-xs flex items-center gap-3"},Bw=["title"],jw=["value","title"],Hw={class:"surface rounded-3xl p-4 sm:p-5 lg:max-h-[640px] lg:overflow-y-auto"},Vw={class:"flex items-center justify-between mb-3 px-1"},qw={class:"text-xs font-semibold uppercase tracking-wider text-base-content/50"},Ww={class:"text-[11px] text-base-content/40"},Kw={key:0,class:"space-y-1"},zw=["onClick"],Gw=["src","alt","onError"],Qw={key:1,class:"relative equalizer h-3","aria-hidden":"true"},Jw={class:"flex-1 min-w-0"},Yw={class:"text-sm truncate font-medium"},Xw={class:"text-[11px] truncate text-base-content/50"},Zw={key:1,class:"text-center py-10"},ex={class:"text-base-content/50 text-sm"},tx={__name:"Player",setup(e){const{t}=_t(),n=Ou(),s=ne([]),o=ne(!1),r=ne(null),i=ne({});let l=!1;function a(P){return Re.coverFileURL(P)}function u(P){i.value={...i.value,[P]:!0}}async function c(){o.value=!0;try{const P=await Re.listDownloads();s.value=P.data||[],n.playlist.value.length===0&&s.value.length>0&&n.setPlaylist(s.value)}finally{o.value=!1}}function f(P){var N;n.playlist.value.length!==s.value.length||((N=n.playlist.value[P])==null?void 0:N.file)!==s.value[P]?n.setPlaylist(s.value,{startIndex:P}):n.playAt(P)}function p(P){return P0(P)}const g=Ee(()=>{const P=n.currentTrack.value;return P&&P.title?P.title:t("player.empty")}),v=Ee(()=>{const P=n.currentTrack.value;return P&&P.artist?P.artist:P?t("common.unknownArtist"):""}),w=Ee(()=>n.repeatMode.value==="one"?t("player.repeatOne"):n.repeatMode.value==="all"?t("player.repeatAll"):t("player.repeatOff"));function b(P){n.setVolume(parseFloat(P.target.value))}function A(P){const N=r.value;if(!N)return 0;const Y=N.getBoundingClientRect(),z=(P.clientX||0)-Y.left;return Math.max(0,Math.min(1,z/Y.width))}function C(P){n.seekRatio(A(P))}function S(P){l=!0,n.seekRatio(A(P)),window.addEventListener("pointermove",$),window.addEventListener("pointerup",F,{once:!0})}function $(P){l&&n.seekRatio(A(P))}function F(){l=!1,window.removeEventListener("pointermove",$)}return Qt(()=>{window.scroll(0,0),c()}),ti(()=>{window.removeEventListener("pointermove",$)}),(P,N)=>(R(),I("div",pw,[M(Ps),M(Vn),h("div",mw,[h("div",gw,[h("h1",yw,E(d(t)("player.title")),1),h("p",vw,E(d(t)("player.subtitle")),1)]),s.value.length===0&&!o.value?(R(),I("div",bw,[M(d(K),{icon:"clarity:headphones-line",class:"h-12 w-12 text-base-content/20 mb-4"}),h("p",_w,E(d(t)("player.empty")),1),h("p",ww,E(d(t)("player.emptyHint")),1)])):o.value&&!d(n).currentTrack.value?(R(),I("div",xw,[...N[8]||(N[8]=[h("div",{class:"skeleton h-72 rounded-3xl"},null,-1),h("div",{class:"skeleton h-16 rounded-2xl"},null,-1),h("div",{class:"skeleton h-16 rounded-2xl"},null,-1)])])):(R(),I("div",Sw,[h("section",Ew,[h("div",{class:Se(["relative h-56 w-56 sm:h-64 sm:w-64 rounded-3xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden shadow-glow",{"pulse-glow":d(n).isPlaying.value}])},[d(n).currentTrack.value&&d(n).currentTrack.value.cover&&!i.value[d(n).currentTrack.value.file]?(R(),I("img",{key:0,src:d(n).currentTrack.value.cover,alt:d(n).currentTrack.value.title,class:"absolute inset-0 h-full w-full object-cover",onError:N[0]||(N[0]=Y=>u(d(n).currentTrack.value.file))},null,40,Aw)):(R(),it(d(K),{key:1,icon:"clarity:music-note-line",class:"h-24 w-24"})),d(n).isPlaying.value?(R(),I("div",Rw,[...N[9]||(N[9]=[h("span",null,null,-1),h("span",null,null,-1),h("span",null,null,-1)])])):xe("",!0)],2),h("div",Cw,[h("p",kw,E(g.value),1),h("p",Ow,E(v.value),1)]),h("div",Tw,[h("div",{class:"relative h-2 rounded-full bg-white/10 overflow-hidden cursor-pointer group",ref_key:"progressBar",ref:r,onClick:C,onPointerdown:S},[h("div",{class:"h-full bg-primary transition-[width] duration-150",style:In(`width: ${d(n).progressPct.value}%`)},null,4),h("div",{class:"absolute top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded-full bg-primary shadow-glow-sm transition-all duration-150 opacity-0 group-hover:opacity-100",style:In(`left: calc(${d(n).progressPct.value}% - 7px)`)},null,4)],544),h("div",Pw,[h("span",null,E(d(aa)(d(n).currentTime.value)),1),h("span",null,E(d(aa)(d(n).duration.value)),1)])]),h("div",Iw,[h("button",{class:Se(["icon-btn",{"icon-btn-active":d(n).shuffle.value}]),onClick:N[1]||(N[1]=Y=>d(n).toggleShuffle()),title:d(n).shuffle.value?d(t)("player.shuffleOn"):d(t)("player.shuffleOff")},[M(d(K),{icon:"clarity:shuffle-line",class:"h-5 w-5"})],10,$w),h("button",{class:"icon-btn",onClick:N[2]||(N[2]=Y=>d(n).prev()),title:d(t)("player.previous"),disabled:s.value.length===0},[M(d(K),{icon:"clarity:step-forward-2-line",class:"h-5 w-5 -scale-x-100"})],8,Nw),h("button",{class:"inline-flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm hover:scale-105 active:scale-95 transition disabled:opacity-50",onClick:N[3]||(N[3]=Y=>d(n).toggle()),disabled:s.value.length===0,title:d(n).isPlaying.value?d(t)("player.pause"):d(t)("player.play")},[M(d(K),{icon:d(n).isPlaying.value?"clarity:pause-solid":"clarity:play-solid",class:"h-6 w-6"},null,8,["icon"])],8,Dw),h("button",{class:"icon-btn",onClick:N[4]||(N[4]=Y=>d(n).next()),title:d(t)("player.next"),disabled:s.value.length===0},[M(d(K),{icon:"clarity:step-forward-2-line",class:"h-5 w-5"})],8,Lw),h("button",{class:Se(["icon-btn relative",{"icon-btn-active":d(n).repeatMode.value!=="off"}]),onClick:N[5]||(N[5]=Y=>d(n).cycleRepeat()),title:w.value},[M(d(K),{icon:"clarity:refresh-line",class:"h-5 w-5"}),d(n).repeatMode.value==="one"?(R(),I("span",Fw," 1 ")):xe("",!0)],10,Mw)]),h("div",Uw,[h("button",{class:"icon-btn",onClick:N[6]||(N[6]=Y=>d(n).toggleMute()),title:d(n).isMuted.value?d(t)("player.unmute"):d(t)("player.mute")},[M(d(K),{icon:d(n).isMuted.value||d(n).volume.value===0?"clarity:volume-mute-line":d(n).volume.value<.5?"clarity:volume-down-line":"clarity:volume-up-line",class:"h-5 w-5"},null,8,["icon"])],8,Bw),h("input",{type:"range",min:"0",max:"1",step:"0.01",value:d(n).isMuted.value?0:d(n).volume.value,onInput:N[7]||(N[7]=Y=>b(Y)),class:"player-range flex-1",title:d(t)("player.volume")},null,40,jw)])]),h("aside",Hw,[h("div",Vw,[h("h2",qw,E(d(t)("player.queue")),1),h("span",Ww,E(s.value.length===1?d(t)("player.countOne",{count:s.value.length}):d(t)("player.countMany",{count:s.value.length})),1)]),s.value.length>0?(R(),I("ul",Kw,[(R(!0),I(fe,null,De(s.value,(Y,z)=>(R(),I("li",{key:Y,class:Se(["rounded-xl px-2 py-2 flex items-center gap-3 cursor-pointer transition-colors",z===d(n).currentIndex.value?"bg-primary/10 text-primary":"hover:bg-white/5"]),onClick:te=>f(z)},[h("div",{class:Se(["relative h-9 w-9 shrink-0 rounded-lg overflow-hidden flex items-center justify-center",z===d(n).currentIndex.value?"bg-primary/15":"bg-base-100/60"])},[i.value[Y]?xe("",!0):(R(),I("img",{key:0,src:a(Y),alt:p(Y).title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:te=>u(Y)},null,40,Gw)),z===d(n).currentIndex.value&&d(n).isPlaying.value?(R(),I("span",Qw,[...N[10]||(N[10]=[h("span",null,null,-1),h("span",null,null,-1),h("span",null,null,-1)])])):i.value[Y]?(R(),it(d(K),{key:2,icon:"clarity:music-note-line",class:"h-4 w-4 text-base-content/50"})):xe("",!0)],2),h("div",Jw,[h("p",Yw,E(p(Y).title),1),h("p",Xw,E(p(Y).artist||d(t)("common.unknownArtist")),1)])],10,zw))),128))])):(R(),I("div",Zw,[h("p",ex,E(d(t)("player.empty")),1)]))])]))])]))}},nx=xu(tx,[["__scopeId","data-v-1d17ab81"]]),sx=[{path:"/",name:"Home",component:Qv},{path:"/search/:query",name:"Search",component:Bb},{path:"/download",name:"Download",component:m0},{path:"/list",name:"List",component:c_},{path:"/monitor",name:"Monitor",component:hw},{path:"/player",name:"Player",component:nx}],st=vv({history:Jy(ze.BASEURL),routes:sx}),Tu=sh(dy);Tu.use(st);Tu.mount("#app"); diff --git a/frontend/dist/assets/index-Dr4wjmEm.css b/frontend/dist/assets/index-Dr4wjmEm.css deleted file mode 100644 index d456d8b..0000000 --- a/frontend/dist/assets/index-Dr4wjmEm.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://rsms.me/inter/inter.css";.page-enter-active,.page-leave-active{transition:opacity .25s ease,transform .25s ease}.page-enter-from,.page-leave-to{opacity:0;transform:translateY(8px)}.player-range[data-v-1d17ab81]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#ffffff1a;height:4px;border-radius:9999px;outline:none}[data-theme=downtify-light] .player-range[data-v-1d17ab81]{background:#0000001a}.player-range[data-v-1d17ab81]::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;height:14px;width:14px;border-radius:9999px;background:#1ad05c;cursor:pointer;box-shadow:0 0 12px #1ad05c73}.player-range[data-v-1d17ab81]::-moz-range-thumb{height:14px;width:14px;border-radius:9999px;background:#1ad05c;border:none;cursor:pointer;box-shadow:0 0 12px #1ad05c73}.pulse-glow[data-v-1d17ab81]{animation:glow-1d17ab81 2.4s ease-in-out infinite}@keyframes glow-1d17ab81{0%,to{box-shadow:0 0 36px #1ad05c4d}50%{box-shadow:0 0 60px #1ad05c8c}}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color: oklch(0% 0 0)){:root{color-scheme:light;--fallback-p: #491eff;--fallback-pc: #d4dbff;--fallback-s: #ff41c7;--fallback-sc: #fff9fc;--fallback-a: #00cfbd;--fallback-ac: #00100d;--fallback-n: #2b3440;--fallback-nc: #d7dde4;--fallback-b1: #ffffff;--fallback-b2: #e5e6e6;--fallback-b3: #e5e6e6;--fallback-bc: #1f2937;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--fallback-p: #7582ff;--fallback-pc: #050617;--fallback-s: #ff71cf;--fallback-sc: #190211;--fallback-a: #00c7b5;--fallback-ac: #000e0c;--fallback-n: #2a323c;--fallback-nc: #a6adbb;--fallback-b1: #1d232a;--fallback-b2: #191e24;--fallback-b3: #15191e;--fallback-bc: #a6adbb;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,transparent) transparent}*:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,transparent) transparent}:root{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 19.4918% .049187 153.969854;--s: 71.366% .019176 261.324645;--sc: 14.4788% 0 0;--a: 75.0492% .208056 148.653144;--ac: 19.4918% .049187 153.969854;--n: 18.2204% 0 0;--nc: 92.7582% .005814 264.531291;--b1: 20.9036% 0 0;--b2: 17.7638% 0 0;--b3: 0% 0 0;--bc: 96.7434% .001326 286.375246;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}[data-theme=downtify-dark]{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 19.4918% .049187 153.969854;--s: 71.366% .019176 261.324645;--sc: 14.4788% 0 0;--a: 75.0492% .208056 148.653144;--ac: 19.4918% .049187 153.969854;--n: 18.2204% 0 0;--nc: 92.7582% .005814 264.531291;--b1: 20.9036% 0 0;--b2: 17.7638% 0 0;--b3: 0% 0 0;--bc: 96.7434% .001326 286.375246;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}[data-theme=downtify-light]{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 100% 0 0;--s: 47.8359% 0 0;--sc: 100% 0 0;--a: 74.4235% .210286 148.118822;--ac: 100% 0 0;--n: 23.9292% 0 0;--nc: 96.7434% .001326 286.375246;--b1: 100% 0 0;--b2: 97.2666% .001711 247.839212;--b3: 94.2414% .004574 258.325042;--bc: 20.7682% .039824 265.754874;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}html,body{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"cv02","cv03","cv04","cv11"}body{background-image:radial-gradient(circle at 0% 0%,rgba(26,208,92,.15),transparent 45%),radial-gradient(circle at 100% 0%,rgba(26,208,92,.08),transparent 55%),radial-gradient(circle at 50% 100%,rgba(26,208,92,.07),transparent 60%);background-attachment:fixed;min-height:100dvh}[data-theme=downtify-light] body{background-image:radial-gradient(circle at 0% 0%,rgba(26,208,92,.18),transparent 35%),radial-gradient(circle at 100% 0%,rgba(26,208,92,.12),transparent 45%),radial-gradient(circle at 50% 100%,rgba(26,208,92,.08),transparent 55%)}::selection{background-color:#1ad05c59;color:#fff}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#ffffff14;border-radius:9999px}::-webkit-scrollbar-thumb:hover{background:#1ad05c73}[data-theme=downtify-light] ::-webkit-scrollbar-thumb{background:#0000001f}.avatar.placeholder>div{display:flex;align-items:center;justify-content:center}@media (hover:hover){.checkbox-primary:hover{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.label a:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-color:transparent;border-color:oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn, 1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));--tw-bg-opacity: 1;--tw-border-opacity: 1}.btn-disabled,.btn[disabled],.btn:disabled{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box, 1rem)}.card:focus{outline:2px solid transparent;outline-offset:2px}.card figure{display:flex;align-items:center;justify-content:center}.card.image-full{display:grid}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;object-fit:cover}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.checkbox{flex-shrink:0;--chkbg: var(--fallback-bc,oklch(var(--bc)/1));--chkfg: var(--fallback-b1,oklch(var(--b1)/1));height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2}.diff{position:relative;display:grid;width:100%;overflow:hidden;direction:ltr;container-type:inline-size;grid-template-columns:auto 1fr}@media (hover: hover){.btm-nav>*.disabled:hover,.btm-nav>*[disabled]:hover{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:hover{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,black)}}@supports not (color: oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn.glass:hover{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-outline.btn-primary:hover{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.btn-outline.btn-secondary:hover{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-secondary:hover{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}}.btn-outline.btn-accent:hover{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-accent:hover{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn-disabled:hover,.btn[disabled]:hover,.btn:disabled:hover{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}@supports (color: color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}}.footer{display:grid;width:100%;grid-auto-flow:row;place-items:start;column-gap:1rem;row-gap:2.5rem;font-size:.875rem;line-height:1.25rem}.footer>*{display:grid;place-items:start;gap:.5rem}@media (min-width: 48rem){.footer{grid-auto-flow:column}.footer-center{grid-auto-flow:row dense}}.label{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.hero{display:grid;width:100%;place-items:center;background-size:cover;background-position:center}.hero>*{grid-column-start:1;grid-row-start:1}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input[type=number]::-webkit-inner-spin-button,.input-md[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.join{display:inline-flex;align-items:stretch;border-radius:var(--rounded-btn, .5rem)}.join :where(.join-item){border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:not(:first-child):not(:last-child),.join *:not(:first-child):not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0}.join .dropdown .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .dropdown .join-item{border-start-end-radius:inherit;border-end-end-radius:inherit}.join :where(.join-item:first-child:not(:last-child)),.join :where(*:first-child:not(:last-child) .join-item){border-end-start-radius:inherit;border-start-start-radius:inherit}.join .join-item:last-child:not(:first-child),.join *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0}.join :where(.join-item:last-child:not(:first-child)),.join :where(*:last-child:not(:first-child) .join-item){border-start-end-radius:inherit;border-end-end-radius:inherit}@supports not selector(:has(*)){:where(.join *){border-radius:inherit}}@supports selector(:has(*)){:where(.join *:has(.join-item)){border-radius:inherit}}.link{cursor:pointer;text-decoration-line:underline}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}.modal{pointer-events:none;position:fixed;top:0;right:0;bottom:0;left:0;margin:0;display:grid;height:100%;max-height:none;width:100%;max-width:none;justify-items:center;padding:0;opacity:0;overscroll-behavior:contain;z-index:999;background-color:transparent;color:inherit;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity,visibility;overflow-y:hidden}:where(.modal){align-items:center}.modal-box{max-height:calc(100vh - 5em);grid-column-start:1;grid-row-start:1;width:91.666667%;max-width:32rem;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));padding:1.5rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;box-shadow:#00000040 0 25px 50px -12px;overflow-y:auto;overscroll-behavior:contain}.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open]{pointer-events:auto;visibility:visible;opacity:1}.modal-toggle{position:fixed;height:0px;width:0px;-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden;scrollbar-gutter:stable}.progress{position:relative;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:hidden;height:.5rem;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.radial-progress{position:relative;display:inline-grid;height:var(--size);width:var(--size);place-content:center;border-radius:9999px;background-color:transparent;vertical-align:middle;box-sizing:content-box;--value: 0;--size: 5rem;--thickness: calc(var(--size) / 10)}.radial-progress::-moz-progress-bar{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress::-webkit-progress-value{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress::-webkit-progress-bar{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress:before,.radial-progress:after{position:absolute;border-radius:9999px;content:""}.radial-progress:before{top:0;right:0;bottom:0;left:0;background:radial-gradient(farthest-side,currentColor 98%,#0000) top/var(--thickness) var(--thickness) no-repeat,conic-gradient(currentColor calc(var(--value) * 1%),#0000 0);-webkit-mask:radial-gradient(farthest-side,#0000 calc(99% - var(--thickness)),#000 calc(100% - var(--thickness)));mask:radial-gradient(farthest-side,#0000 calc(99% - var(--thickness)),#000 calc(100% - var(--thickness)))}.radial-progress:after{inset:calc(50% - var(--thickness) / 2);transform:rotate(calc(var(--value) * 3.6deg - 90deg)) translate(calc(var(--size) / 2 - 50%));background-color:currentColor}.range{height:1.5rem;width:100%;cursor:pointer;-moz-appearance:none;appearance:none;-webkit-appearance:none;--range-shdw: var(--fallback-bc,oklch(var(--bc)/1));overflow:hidden;border-radius:var(--rounded-box, 1rem);background-color:transparent}.range:focus{outline:none}.select{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;min-height:3rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-size:4px 4px,4px 4px;background-repeat:no-repeat}.select[multiple]{height:auto}.steps .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-columns:auto;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-rows:40px 1fr;place-items:center;text-align:center;min-width:4rem}.toggle{flex-shrink:0;--tglbg: var(--fallback-b1,oklch(var(--b1)/1));--handleoffset: 1.5rem;--handleoffsetcalculator: calc(var(--handleoffset) * -1);--togglehandleborder: 0 0;height:1.5rem;width:3rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;border-color:currentColor;background-color:currentColor;color:var(--fallback-bc,oklch(var(--bc)/.5));transition:background,box-shadow var(--animation-input, .2s) ease-out;box-shadow:var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset,var(--togglehandleborder)}.btm-nav>*:where(.active){border-top-width:2px;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.btm-nav>*.disabled,.btm-nav>*[disabled]{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}@media (prefers-reduced-motion: no-preference){.btn{animation:button-pop var(--animation-btn, .25s) ease-out}}.btn:active:hover,.btn:active:focus{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale, .97))}@supports not (color: oklch(0% 0 0)){.btn{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}.btn-primary{--btn-color: var(--fallback-p)}.btn-secondary{--btn-color: var(--fallback-s)}.btn-accent{--btn-color: var(--fallback-a)}}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}.btn-outline.btn-secondary.btn-active{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}.btn-outline.btn-accent.btn-active{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color: oklch(0% 0 0)){.btn-primary{--btn-color: var(--p)}.btn-secondary{--btn-color: var(--s)}.btn-accent{--btn-color: var(--a)}}.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)));outline-color:var(--fallback-s,oklch(var(--s)/1))}.btn-accent{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)));outline-color:var(--fallback-a,oklch(var(--a)/1))}.btn.glass{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-outline.btn-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.btn-outline.btn-secondary.btn-active{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.btn-outline.btn-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.btn-outline.btn-accent.btn-active{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn[disabled],.btn:disabled{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale, .98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.checkbox:disabled{border-width:0px;cursor:not-allowed;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.2}.checkbox:checked,.checkbox[aria-checked=true]{background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,transparent 65%,var(--chkbg) 65.99%),linear-gradient(45deg,transparent 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,transparent 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,transparent 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%)}.checkbox:indeterminate{--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-image:linear-gradient(90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(-90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%)}.checkbox-primary{--chkbg: var(--fallback-p,oklch(var(--p)/1));--chkfg: var(--fallback-pc,oklch(var(--pc)/1));--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.checkbox-primary:focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}.checkbox-primary:checked,.checkbox-primary[aria-checked=true]{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}.input input{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:transparent}.input input:focus{outline:2px solid transparent;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input:focus,.input:focus-within{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:has(>input[disabled]),.input-disabled,.input:disabled,.input[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input:has(>input[disabled])::placeholder,.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1)}.link:focus{outline:2px solid transparent;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.\!loading{pointer-events:none!important;display:inline-block!important;aspect-ratio:1 / 1!important;width:1.5rem!important;background-color:currentColor!important;-webkit-mask-size:100%!important;mask-size:100%!important;-webkit-mask-repeat:no-repeat!important;mask-repeat:no-repeat!important;-webkit-mask-position:center!important;mask-position:center!important;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important;mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important}.loading{pointer-events:none;display:inline-block;aspect-ratio:1 / 1;width:1.5rem;background-color:currentColor;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-xs{width:1rem}.loading-sm{width:1.25rem}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;left:.5rem;top:50%;aspect-ratio:1 / 1;height:.75rem;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:2px;border-color:currentColor;opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{content:"";position:absolute;left:1.25rem;top:50%;height:.5rem;--tw-translate-y: 25%;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1px;border-color:currentColor;opacity:.6}.modal:not(dialog:not(.modal-open)),.modal::backdrop{background-color:#0006;animation:modal-pop .2s ease-out}.modal-backdrop{z-index:-1;grid-column-start:1;grid-row-start:1;display:grid;align-self:stretch;justify-self:stretch;color:transparent}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y: 0px;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes modal-pop{0%{opacity:0}}.progress::-moz-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate{--progress-color: var(--fallback-bc,oklch(var(--bc)/1));background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}.progress::-webkit-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:transparent}.progress::-webkit-progress-value{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate::-moz-progress-bar{background-color:transparent;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}@keyframes progress-loading{50%{background-position-x:-115%}}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}.range:focus-visible::-webkit-slider-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range:focus-visible::-moz-range-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range::-webkit-slider-runnable-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-moz-range-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-webkit-slider-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));-moz-appearance:none;appearance:none;-webkit-appearance:none;top:50%;color:var(--range-shdw);transform:translateY(-50%);--filler-size: 100rem;--filler-offset: .6rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}.range::-moz-range-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));top:50%;color:var(--range-shdw);--filler-size: 100rem;--filler-offset: .5rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select-disabled,.select:disabled,.select[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:calc(0% + 12px) calc(1px + 50%),calc(0% + 16px) calc(1px + 50%)}.skeleton{border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));will-change:background-position;animation:skeleton 1.8s ease-in-out infinite;background-image:linear-gradient(105deg,transparent 0%,transparent 40%,var(--fallback-b1,oklch(var(--b1)/1)) 50%,transparent 60%,transparent 100%);background-size:200% auto;background-repeat:no-repeat;background-position-x:-50%}@media (prefers-reduced-motion){.skeleton{animation-duration:15s}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}.steps .step:before{top:0;grid-column-start:1;grid-row-start:1;height:.5rem;width:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));content:"";margin-inline-start:-100%}.steps .step:after{content:counter(step);counter-increment:step;z-index:1;position:relative;grid-column-start:1;grid-row-start:1;display:grid;height:2rem;width:2rem;place-items:center;place-self:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.steps .step:first-child:before{content:none}.steps .step[data-content]:after{content:attr(data-content)}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.active,.table-zebra tr.active:nth-child(2n),.table-zebra-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}[dir=rtl] .toggle{--handleoffsetcalculator: calc(var(--handleoffset) * 1)}.toggle:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.toggle:hover{background-color:currentColor}.toggle:checked,.toggle[aria-checked=true]{background-image:none;--handleoffsetcalculator: var(--handleoffset);--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}[dir=rtl] .toggle:checked,[dir=rtl] .toggle[aria-checked=true]{--handleoffsetcalculator: calc(var(--handleoffset) * -1)}.toggle:indeterminate{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}[dir=rtl] .toggle:indeterminate{box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}.toggle:disabled{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));background-color:transparent;opacity:.3;--togglehandleborder: 0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset, var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset}.btm-nav-xs>*:where(.active){border-top-width:1px}.btm-nav-sm>*:where(.active){border-top-width:2px}.btm-nav-md>*:where(.active){border-top-width:2px}.btm-nav-lg>*:where(.active){border-top-width:4px}.btn-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem}.btn-square:where(.btn-sm){height:2rem;width:2rem;padding:0}.btn-circle:where(.btn-sm){height:2rem;width:2rem;border-radius:9999px;padding:0}[type=checkbox].checkbox-sm{height:1.25rem;width:1.25rem}.join.join-vertical{flex-direction:column}.join.join-vertical .join-item:first-child:not(:last-child),.join.join-vertical *:first-child:not(:last-child) .join-item{border-end-start-radius:0;border-end-end-radius:0;border-start-start-radius:inherit;border-start-end-radius:inherit}.join.join-vertical .join-item:last-child:not(:first-child),.join.join-vertical *:last-child:not(:first-child) .join-item{border-start-start-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-end-end-radius:inherit}.join.join-horizontal{flex-direction:row}.join.join-horizontal .join-item:first-child:not(:last-child),.join.join-horizontal *:first-child:not(:last-child) .join-item{border-end-end-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-start-start-radius:inherit}.join.join-horizontal .join-item:last-child:not(:first-child),.join.join-horizontal *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0;border-end-end-radius:inherit;border-start-end-radius:inherit}.modal-bottom{place-items:end}.select-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:2rem;font-size:.875rem;line-height:2rem}[dir=rtl] .select-sm{padding-left:2rem;padding-right:.75rem}.select-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:2rem;font-size:.75rem;line-height:1rem;line-height:1.625}[dir=rtl] .select-xs{padding-left:2rem;padding-right:.5rem}.steps-horizontal .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));place-items:center;text-align:center}.steps-vertical .step{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(1,minmax(0,1fr))}.join.join-vertical>:where(*:not(:first-child)){margin-left:0;margin-right:0;margin-top:-1px}.join.join-vertical>:where(*:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn) * -1)}.join.join-horizontal>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join.join-horizontal>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1);margin-top:0}.modal-top :where(.modal-box){width:100%;max-width:none;--tw-translate-y: -2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:0;border-top-right-radius:0}.modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}.modal-bottom :where(.modal-box){width:100%;max-width:none;--tw-translate-y: 2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:0;border-bottom-left-radius:0}.steps-horizontal .step{grid-template-rows:40px 1fr;grid-template-columns:auto;min-width:4rem}.steps-horizontal .step:before{height:.5rem;width:100%;--tw-translate-x: 0px;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));content:"";margin-inline-start:-100%}.steps-horizontal .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.steps-vertical .step{gap:.5rem;grid-template-columns:40px 1fr;grid-template-rows:auto;min-height:4rem;justify-items:start}.steps-vertical .step:before{height:100%;width:.5rem;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));margin-inline-start:50%}.steps-vertical .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.surface{border-width:1px;border-color:#ffffff0d;background-color:var(--fallback-b1,oklch(var(--b1)/.9));--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}[data-theme=downtify-light] .surface{border-color:#0000000d;background-color:#ffffffd9}.surface-strong{border-width:1px;border-color:#ffffff1a;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}[data-theme=downtify-light] .surface-strong{border-color:#0000001a;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.glass-nav{background:#121212b8;backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);border-bottom:1px solid rgba(255,255,255,.06)}[data-theme=downtify-light] .glass-nav{background:#ffffffc7;border-bottom:1px solid rgba(0,0,0,.06)}.icon-btn{display:inline-flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:9999px;color:var(--fallback-bc,oklch(var(--bc)/.8));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.icon-btn:hover{background-color:#ffffff1a;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}[data-theme=downtify-light] .icon-btn:hover{background-color:#0000000d}.icon-btn-active{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)));--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.icon-btn-active:hover{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)))}.pill{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500}.input-modern{height:3rem;width:100%;border-radius:9999px;border-width:1px;border-color:#ffffff1a;background-color:var(--fallback-b1,oklch(var(--b1)/.85));padding-left:1.25rem;padding-right:3.5rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)));outline:2px solid transparent;outline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input-modern::placeholder{color:var(--fallback-bc,oklch(var(--bc)/.4))}.input-modern:focus{border-color:var(--fallback-p,oklch(var(--p)/.6));--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-theme=downtify-light] .input-modern{border-color:#0000001a;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.track-card{position:relative;display:flex;align-items:center;gap:1rem;border-radius:1rem;padding:.75rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.track-card:hover{background-color:#ffffff0d}@media (min-width: 640px){.track-card{padding:1rem}}[data-theme=downtify-light] .track-card:hover{background-color:#0000000d}.track-cover{position:relative;aspect-ratio:1 / 1;width:4rem;flex-shrink:0;overflow:hidden;border-radius:.75rem;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)));--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (min-width: 640px){.track-cover{width:5rem}}.badge-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:var(--fallback-p,oklch(var(--p)/.2));background-color:var(--fallback-p,oklch(var(--p)/.15));--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.badge-error-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:var(--fallback-er,oklch(var(--er)/.25));background-color:var(--fallback-er,oklch(var(--er)/.15));--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.badge-neutral-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:#ffffff1a;background-color:#ffffff0d;color:var(--fallback-bc,oklch(var(--bc)/.7))}[data-theme=downtify-light] .badge-neutral-soft{border-color:#0000001a;background-color:#0000000d}.equalizer{display:inline-flex;height:1rem;align-items:flex-end;gap:.125rem}.equalizer span{display:block;height:100%;width:.125rem;transform-origin:bottom;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)))}.equalizer span:nth-child(1){animation:eq 1.05s ease-in-out infinite}.equalizer span:nth-child(2){animation:eq .95s ease-in-out infinite -.2s}.equalizer span:nth-child(3){animation:eq .85s ease-in-out infinite -.4s}@keyframes pulse{50%{opacity:.5}}.skeleton{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;border-radius:.75rem;background-color:#ffffff1a}[data-theme=downtify-light] .skeleton{background-color:#0000001a}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.-bottom-0\.5{bottom:-.125rem}.-right-0\.5{right:-.125rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-12{bottom:3rem}.bottom-3{bottom:.75rem}.left-1\/2{left:50%}.right-1\.5{right:.375rem}.right-10{right:2.5rem}.right-3{right:.75rem}.top-0{top:0}.top-1\/2{top:50%}.top-1\/4{top:25%}.-z-10{z-index:-10}.z-30{z-index:30}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-auto{margin-left:auto}.mr-0\.5{margin-right:.125rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-72{height:18rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[420px\]{height:420px}.h-full{height:100%}.min-h-\[calc\(100dvh-4rem\)\]{min-height:calc(100dvh - 4rem)}.min-h-dvh{min-height:100dvh}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[420px\]{width:420px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[1\.25rem\]{min-width:1.25rem}.min-w-\[1rem\]{min-width:1rem}.min-w-\[2\.5rem\]{min-width:2.5rem}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-\[-90deg\]{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-scale-x-100{--tw-scale-x: -1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes slideUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.animate-slide-up{animation:slideUp .4s cubic-bezier(.22,1,.36,1)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-4{column-gap:1rem}.gap-y-0\.5{row-gap:.125rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-primary\/50{border-color:var(--fallback-p,oklch(var(--p)/.5))}.border-white\/10{border-color:#ffffff1a}.border-white\/5{border-color:#ffffff0d}.bg-base-100{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.bg-base-100\/60{background-color:var(--fallback-b1,oklch(var(--b1)/.6))}.bg-base-100\/85{background-color:var(--fallback-b1,oklch(var(--b1)/.85))}.bg-primary{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)))}.bg-primary\/10{background-color:var(--fallback-p,oklch(var(--p)/.1))}.bg-primary\/15{background-color:var(--fallback-p,oklch(var(--p)/.15))}.bg-primary\/25{background-color:var(--fallback-p,oklch(var(--p)/.25))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/5{background-color:#ffffff0d}.object-cover{object-fit:cover}.p-0{padding:0}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-16{padding-bottom:4rem}.pb-3{padding-bottom:.75rem}.pt-24{padding-top:6rem}.text-left{text-align:left}.text-center{text-align:center}.align-text-top{vertical-align:text-top}.text-2xl{font-size:1.5rem;line-height:2rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-base-content{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.text-base-content\/20{color:var(--fallback-bc,oklch(var(--bc)/.2))}.text-base-content\/30{color:var(--fallback-bc,oklch(var(--bc)/.3))}.text-base-content\/40{color:var(--fallback-bc,oklch(var(--bc)/.4))}.text-base-content\/50{color:var(--fallback-bc,oklch(var(--bc)/.5))}.text-base-content\/60{color:var(--fallback-bc,oklch(var(--bc)/.6))}.text-base-content\/70{color:var(--fallback-bc,oklch(var(--bc)/.7))}.text-base-content\/90{color:var(--fallback-bc,oklch(var(--bc)/.9))}.text-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.text-error\/70{color:var(--fallback-er,oklch(var(--er)/.7))}.text-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.text-primary-content{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)))}.text-primary\/70{color:var(--fallback-p,oklch(var(--p)/.7))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.shadow-glow{--tw-shadow: 0 0 36px rgba(26, 208, 92, .3);--tw-shadow-colored: 0 0 36px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glow-sm{--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur-3xl{--tw-blur: blur(64px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-\[120px\]{--tw-blur: blur(120px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-\[0_0_8px_rgba\(26\,208\,92\,0\.55\)\]{--tw-drop-shadow: drop-shadow(0 0 8px rgba(26,208,92,.55));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.text-balance{text-wrap:balance}@media (min-width: 640px){.sm\:modal-middle{place-items:center}.sm\:modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-white\/20:hover{border-color:#fff3}.hover\:bg-base-100:hover{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.hover\:bg-error\/10:hover{background-color:var(--fallback-er,oklch(var(--er)/.1))}.hover\:bg-primary\/10:hover{background-color:var(--fallback-p,oklch(var(--p)/.1))}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:text-base-content:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.hover\:text-error:hover{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-primary\/60:focus{border-color:var(--fallback-p,oklch(var(--p)/.6))}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width: 640px){.sm\:inline{display:inline}.sm\:h-20{height:5rem}.sm\:h-64{height:16rem}.sm\:w-20{width:5rem}.sm\:w-64{width:16rem}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-2{gap:.5rem}.sm\:rounded-3xl{border-radius:1.5rem}.sm\:p-4{padding:1rem}.sm\:p-5{padding:1.25rem}.sm\:p-8{padding:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}}@media (min-width: 768px){.md\:flex{display:flex}.md\:hidden{display:none}}@media (min-width: 1024px){.lg\:max-h-\[640px\]{max-height:640px}.lg\:grid-cols-\[1fr_360px\]{grid-template-columns:1fr 360px}.lg\:overflow-y-auto{overflow-y:auto}} diff --git a/frontend/dist/assets/index-DuDubY_q.js b/frontend/dist/assets/index-DuDubY_q.js new file mode 100644 index 0000000..95757a7 --- /dev/null +++ b/frontend/dist/assets/index-DuDubY_q.js @@ -0,0 +1,33 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const r of o)if(r.type==="childList")for(const i of r.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function n(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(o){if(o.ep)return;o.ep=!0;const r=n(o);fetch(o.href,r)}})();/** +* @vue/shared v3.5.28 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function jr(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const be={},Pn=[],Lt=()=>{},ha=()=>!1,vo=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),qr=e=>e.startsWith("onUpdate:"),Ie=Object.assign,Vr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Nu=Object.prototype.hasOwnProperty,pe=(e,t)=>Nu.call(e,t),J=Array.isArray,On=e=>Ss(e)==="[object Map]",qn=e=>Ss(e)==="[object Set]",Ti=e=>Ss(e)==="[object Date]",te=e=>typeof e=="function",Ce=e=>typeof e=="string",Mt=e=>typeof e=="symbol",me=e=>e!==null&&typeof e=="object",ma=e=>(me(e)||te(e))&&te(e.then)&&te(e.catch),ga=Object.prototype.toString,Ss=e=>ga.call(e),Iu=e=>Ss(e).slice(8,-1),ya=e=>Ss(e)==="[object Object]",Kr=e=>Ce(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,os=jr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),bo=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$u=/-\w/g,ht=bo(e=>e.replace($u,t=>t.slice(1).toUpperCase())),Lu=/\B([A-Z])/g,dn=bo(e=>e.replace(Lu,"-$1").toLowerCase()),_o=bo(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ko=bo(e=>e?`on${_o(e)}`:""),rn=(e,t)=>!Object.is(e,t),Ws=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},xo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Mu=e=>{const t=Ce(e)?Number(e):NaN;return isNaN(t)?e:t};let Pi;const wo=()=>Pi||(Pi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function $n(e){if(J(e)){const t={};for(let n=0;n{if(n){const s=n.split(Fu);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ee(e){let t="";if(Ce(e))t=e;else if(J(e))for(let n=0;nVn(n,t))}const _a=e=>!!(e&&e.__v_isRef===!0),w=e=>Ce(e)?e:e==null?"":J(e)||me(e)&&(e.toString===ga||!te(e.toString))?_a(e)?w(e.value):JSON.stringify(e,xa,2):String(e),xa=(e,t)=>_a(t)?xa(e,t.value):On(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o],r)=>(n[Wo(s,r)+" =>"]=o,n),{})}:qn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Wo(n))}:Mt(t)?Wo(t):me(t)&&!J(t)&&!ya(t)?String(t):t,Wo=(e,t="")=>{var n;return Mt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.28 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Xe;class Ku{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=Xe,!t&&Xe&&(this.index=(Xe.scopes||(Xe.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(Xe=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(is){let t=is;for(is=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;rs;){let t=rs;for(rs=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Ea(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Aa(e){let t,n=e.depsTail,s=n;for(;s;){const o=s.prevDep;s.version===-1?(s===n&&(n=o),Qr(s),zu(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=o}e.deps=t,e.depsTail=n}function mr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ra(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ra(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===fs)||(e.globalVersion=fs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!mr(e))))return;e.flags|=2;const t=e.dep,n=we,s=yt;we=e,yt=!0;try{Ea(e);const o=e.fn(e._value);(t.version===0||rn(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{we=n,yt=s,Aa(e),e.flags&=-3}}function Qr(e,t=!1){const{dep:n,prevSub:s,nextSub:o}=e;if(s&&(s.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let r=n.computed.deps;r;r=r.nextDep)Qr(r,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function zu(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let yt=!0;const Ca=[];function zt(){Ca.push(yt),yt=!1}function Gt(){const e=Ca.pop();yt=e===void 0?!0:e}function Oi(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=we;we=void 0;try{t()}finally{we=n}}}let fs=0;class Gu{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Jr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!we||!yt||we===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==we)n=this.activeLink=new Gu(we,this),we.deps?(n.prevDep=we.depsTail,we.depsTail.nextDep=n,we.depsTail=n):we.deps=we.depsTail=n,Ta(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=we.depsTail,n.nextDep=void 0,we.depsTail.nextDep=n,we.depsTail=n,we.deps===n&&(we.deps=s)}return n}trigger(t){this.version++,fs++,this.notify(t)}notify(t){zr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Gr()}}}function Ta(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Ta(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const gr=new WeakMap,wn=Symbol(""),yr=Symbol(""),ps=Symbol("");function Fe(e,t,n){if(yt&&we){let s=gr.get(e);s||gr.set(e,s=new Map);let o=s.get(n);o||(s.set(n,o=new Jr),o.map=s,o.key=n),o.track()}}function qt(e,t,n,s,o,r){const i=gr.get(e);if(!i){fs++;return}const l=a=>{a&&a.trigger()};if(zr(),t==="clear")i.forEach(l);else{const a=J(e),d=a&&Kr(n);if(a&&n==="length"){const c=Number(s);i.forEach((f,m)=>{(m==="length"||m===ps||!Mt(m)&&m>=c)&&l(f)})}else switch((n!==void 0||i.has(void 0))&&l(i.get(n)),d&&l(i.get(ps)),t){case"add":a?d&&l(i.get("length")):(l(i.get(wn)),On(e)&&l(i.get(yr)));break;case"delete":a||(l(i.get(wn)),On(e)&&l(i.get(yr)));break;case"set":On(e)&&l(i.get(wn));break}}Gr()}function An(e){const t=de(e);return t===e?t:(Fe(t,"iterate",ps),pt(e)?t:t.map(bt))}function ko(e){return Fe(e=de(e),"iterate",ps),e}function tn(e,t){return Qt(e)?Ln(kn(e)?bt(t):t):bt(t)}const Qu={__proto__:null,[Symbol.iterator](){return Go(this,Symbol.iterator,e=>tn(this,e))},concat(...e){return An(this).concat(...e.map(t=>J(t)?An(t):t))},entries(){return Go(this,"entries",e=>(e[1]=tn(this,e[1]),e))},every(e,t){return Ut(this,"every",e,t,void 0,arguments)},filter(e,t){return Ut(this,"filter",e,t,n=>n.map(s=>tn(this,s)),arguments)},find(e,t){return Ut(this,"find",e,t,n=>tn(this,n),arguments)},findIndex(e,t){return Ut(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ut(this,"findLast",e,t,n=>tn(this,n),arguments)},findLastIndex(e,t){return Ut(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ut(this,"forEach",e,t,void 0,arguments)},includes(...e){return Qo(this,"includes",e)},indexOf(...e){return Qo(this,"indexOf",e)},join(e){return An(this).join(e)},lastIndexOf(...e){return Qo(this,"lastIndexOf",e)},map(e,t){return Ut(this,"map",e,t,void 0,arguments)},pop(){return Qn(this,"pop")},push(...e){return Qn(this,"push",e)},reduce(e,...t){return Di(this,"reduce",e,t)},reduceRight(e,...t){return Di(this,"reduceRight",e,t)},shift(){return Qn(this,"shift")},some(e,t){return Ut(this,"some",e,t,void 0,arguments)},splice(...e){return Qn(this,"splice",e)},toReversed(){return An(this).toReversed()},toSorted(e){return An(this).toSorted(e)},toSpliced(...e){return An(this).toSpliced(...e)},unshift(...e){return Qn(this,"unshift",e)},values(){return Go(this,"values",e=>tn(this,e))}};function Go(e,t,n){const s=ko(e),o=s[t]();return s!==e&&!pt(e)&&(o._next=o.next,o.next=()=>{const r=o._next();return r.done||(r.value=n(r.value)),r}),o}const Ju=Array.prototype;function Ut(e,t,n,s,o,r){const i=ko(e),l=i!==e&&!pt(e),a=i[t];if(a!==Ju[t]){const f=a.apply(e,r);return l?bt(f):f}let d=n;i!==e&&(l?d=function(f,m){return n.call(this,tn(e,f),m,e)}:n.length>2&&(d=function(f,m){return n.call(this,f,m,e)}));const c=a.call(i,d,s);return l&&o?o(c):c}function Di(e,t,n,s){const o=ko(e);let r=n;return o!==e&&(pt(e)?n.length>3&&(r=function(i,l,a){return n.call(this,i,l,a,e)}):r=function(i,l,a){return n.call(this,i,tn(e,l),a,e)}),o[t](r,...s)}function Qo(e,t,n){const s=de(e);Fe(s,"iterate",ps);const o=s[t](...n);return(o===-1||o===!1)&&Zr(n[0])?(n[0]=de(n[0]),s[t](...n)):o}function Qn(e,t,n=[]){zt(),zr();const s=de(e)[t].apply(e,n);return Gr(),Gt(),s}const Yu=jr("__proto__,__v_isRef,__isVue"),Pa=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Mt));function Xu(e){Mt(e)||(e=String(e));const t=de(this);return Fe(t,"has",e),t.hasOwnProperty(e)}class Oa{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,r=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return r;if(n==="__v_raw")return s===(o?r?ad:$a:r?Ia:Na).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const i=J(t);if(!o){let a;if(i&&(a=Qu[n]))return a;if(n==="hasOwnProperty")return Xu}const l=Reflect.get(t,n,je(t)?t:s);if((Mt(n)?Pa.has(n):Yu(n))||(o||Fe(t,"get",n),r))return l;if(je(l)){const a=i&&Kr(n)?l:l.value;return o&&me(a)?br(a):a}return me(l)?o?br(l):So(l):l}}class Da extends Oa{constructor(t=!1){super(!1,t)}set(t,n,s,o){let r=t[n];const i=J(t)&&Kr(n);if(!this._isShallow){const d=Qt(r);if(!pt(s)&&!Qt(s)&&(r=de(r),s=de(s)),!i&&je(r)&&!je(s))return d||(r.value=s),!0}const l=i?Number(n)e,Us=e=>Reflect.getPrototypeOf(e);function sd(e,t,n){return function(...s){const o=this.__v_raw,r=de(o),i=On(r),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,d=o[e](...s),c=n?vr:t?Ln:bt;return!t&&Fe(r,"iterate",a?yr:wn),Ie(Object.create(d),{next(){const{value:f,done:m}=d.next();return m?{value:f,done:m}:{value:l?[c(f[0]),c(f[1])]:c(f),done:m}}})}}function Fs(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function od(e,t){const n={get(o){const r=this.__v_raw,i=de(r),l=de(o);e||(rn(o,l)&&Fe(i,"get",o),Fe(i,"get",l));const{has:a}=Us(i),d=t?vr:e?Ln:bt;if(a.call(i,o))return d(r.get(o));if(a.call(i,l))return d(r.get(l));r!==i&&r.get(o)},get size(){const o=this.__v_raw;return!e&&Fe(de(o),"iterate",wn),o.size},has(o){const r=this.__v_raw,i=de(r),l=de(o);return e||(rn(o,l)&&Fe(i,"has",o),Fe(i,"has",l)),o===l?r.has(o):r.has(o)||r.has(l)},forEach(o,r){const i=this,l=i.__v_raw,a=de(l),d=t?vr:e?Ln:bt;return!e&&Fe(a,"iterate",wn),l.forEach((c,f)=>o.call(r,d(c),d(f),i))}};return Ie(n,e?{add:Fs("add"),set:Fs("set"),delete:Fs("delete"),clear:Fs("clear")}:{add(o){!t&&!pt(o)&&!Qt(o)&&(o=de(o));const r=de(this);return Us(r).has.call(r,o)||(r.add(o),qt(r,"add",o,o)),this},set(o,r){!t&&!pt(r)&&!Qt(r)&&(r=de(r));const i=de(this),{has:l,get:a}=Us(i);let d=l.call(i,o);d||(o=de(o),d=l.call(i,o));const c=a.call(i,o);return i.set(o,r),d?rn(r,c)&&qt(i,"set",o,r):qt(i,"add",o,r),this},delete(o){const r=de(this),{has:i,get:l}=Us(r);let a=i.call(r,o);a||(o=de(o),a=i.call(r,o)),l&&l.call(r,o);const d=r.delete(o);return a&&qt(r,"delete",o,void 0),d},clear(){const o=de(this),r=o.size!==0,i=o.clear();return r&&qt(o,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=sd(o,e,t)}),n}function Yr(e,t){const n=od(e,t);return(s,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(pe(n,o)&&o in s?n:s,o,r)}const rd={get:Yr(!1,!1)},id={get:Yr(!1,!0)},ld={get:Yr(!0,!1)};const Na=new WeakMap,Ia=new WeakMap,$a=new WeakMap,ad=new WeakMap;function cd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ud(e){return e.__v_skip||!Object.isExtensible(e)?0:cd(Iu(e))}function So(e){return Qt(e)?e:Xr(e,!1,ed,rd,Na)}function La(e){return Xr(e,!1,nd,id,Ia)}function br(e){return Xr(e,!0,td,ld,$a)}function Xr(e,t,n,s,o){if(!me(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const r=ud(e);if(r===0)return e;const i=o.get(e);if(i)return i;const l=new Proxy(e,r===2?s:n);return o.set(e,l),l}function kn(e){return Qt(e)?kn(e.__v_raw):!!(e&&e.__v_isReactive)}function Qt(e){return!!(e&&e.__v_isReadonly)}function pt(e){return!!(e&&e.__v_isShallow)}function Zr(e){return e?!!e.__v_raw:!1}function de(e){const t=e&&e.__v_raw;return t?de(t):e}function dd(e){return!pe(e,"__v_skip")&&Object.isExtensible(e)&&va(e,"__v_skip",!0),e}const bt=e=>me(e)?So(e):e,Ln=e=>me(e)?br(e):e;function je(e){return e?e.__v_isRef===!0:!1}function ee(e){return Ma(e,!1)}function fd(e){return Ma(e,!0)}function Ma(e,t){return je(e)?e:new pd(e,t)}class pd{constructor(t,n){this.dep=new Jr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:de(t),this._value=n?t:bt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||pt(t)||Qt(t);t=s?t:de(t),rn(t,n)&&(this._rawValue=t,this._value=s?t:bt(t),this.dep.trigger())}}function u(e){return je(e)?e.value:e}const hd={get:(e,t,n)=>t==="__v_raw"?e:u(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return je(o)&&!je(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function Ua(e){return kn(e)?e:new Proxy(e,hd)}class md{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Jr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=fs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&we!==this)return Sa(this,!0),!0}get value(){const t=this.dep.track();return Ra(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function gd(e,t,n=!1){let s,o;return te(e)?s=e:(s=e.get,o=e.set),new md(s,o,n)}const Bs={},oo=new WeakMap;let vn;function yd(e,t=!1,n=vn){if(n){let s=oo.get(n);s||oo.set(n,s=[]),s.push(e)}}function vd(e,t,n=be){const{immediate:s,deep:o,once:r,scheduler:i,augmentJob:l,call:a}=n,d=R=>o?R:pt(R)||o===!1||o===0?Vt(R,1):Vt(R);let c,f,m,y,b=!1,v=!1;if(je(e)?(f=()=>e.value,b=pt(e)):kn(e)?(f=()=>d(e),b=!0):J(e)?(v=!0,b=e.some(R=>kn(R)||pt(R)),f=()=>e.map(R=>{if(je(R))return R.value;if(kn(R))return d(R);if(te(R))return a?a(R,2):R()})):te(e)?t?f=a?()=>a(e,2):e:f=()=>{if(m){zt();try{m()}finally{Gt()}}const R=vn;vn=c;try{return a?a(e,3,[y]):e(y)}finally{vn=R}}:f=Lt,t&&o){const R=f,L=o===!0?1/0:o;f=()=>Vt(R(),L)}const h=Wu(),E=()=>{c.stop(),h&&h.active&&Vr(h.effects,c)};if(r&&t){const R=t;t=(...L)=>{R(...L),E()}}let C=v?new Array(e.length).fill(Bs):Bs;const S=R=>{if(!(!(c.flags&1)||!c.dirty&&!R))if(t){const L=c.run();if(o||b||(v?L.some((T,U)=>rn(T,C[U])):rn(L,C))){m&&m();const T=vn;vn=c;try{const U=[L,C===Bs?void 0:v&&C[0]===Bs?[]:C,y];C=L,a?a(t,3,U):t(...U)}finally{vn=T}}}else c.run()};return l&&l(S),c=new wa(f),c.scheduler=i?()=>i(S,!1):S,y=R=>yd(R,!1,c),m=c.onStop=()=>{const R=oo.get(c);if(R){if(a)a(R,4);else for(const L of R)L();oo.delete(c)}},t?s?S(!0):C=c.run():i?i(S.bind(null,!0),!0):c.run(),E.pause=c.pause.bind(c),E.resume=c.resume.bind(c),E.stop=E,E}function Vt(e,t=1/0,n){if(t<=0||!me(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,je(e))Vt(e.value,t,n);else if(J(e))for(let s=0;s{Vt(s,t,n)});else if(ya(e)){for(const s in e)Vt(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Vt(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.28 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Es(e,t,n,s){try{return s?e(...s):e()}catch(o){Eo(o,t,n)}}function _t(e,t,n,s){if(te(e)){const o=Es(e,t,n,s);return o&&ma(o)&&o.catch(r=>{Eo(r,t,n)}),o}if(J(e)){const o=[];for(let r=0;r>>1,o=We[s],r=hs(o);r=hs(n)?We.push(e):We.splice(_d(t),0,e),e.flags|=1,Ba()}}function Ba(){ro||(ro=Fa.then(ja))}function xd(e){J(e)?Dn.push(...e):nn&&e.id===-1?nn.splice(Cn+1,0,e):e.flags&1||(Dn.push(e),e.flags|=1),Ba()}function Ni(e,t,n=Dt+1){for(;nhs(n)-hs(s));if(Dn.length=0,nn){nn.push(...t);return}for(nn=t,Cn=0;Cne.id==null?e.flags&2?-1:1/0:e.id;function ja(e){try{for(Dt=0;Dt{s._d&&uo(-1);const r=io(t);let i;try{i=e(...o)}finally{io(r),s._d&&uo(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function ke(e,t){if(rt===null)return e;const n=Po(rt),s=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&te(t)?t.call(s&&s.proxy):t}}const wd=Symbol.for("v-scx"),kd=()=>vt(wd);function Hs(e,t){return ni(e,null,t)}function ln(e,t,n){return ni(e,t,n)}function ni(e,t,n=be){const{immediate:s,deep:o,flush:r,once:i}=n,l=Ie({},n),a=t&&s||!t&&r!=="post";let d;if(ys){if(r==="sync"){const y=kd();d=y.__watcherHandles||(y.__watcherHandles=[])}else if(!a){const y=()=>{};return y.stop=Lt,y.resume=Lt,y.pause=Lt,y}}const c=Be;l.call=(y,b,v)=>_t(y,c,b,v);let f=!1;r==="post"?l.scheduler=y=>{Ye(y,c&&c.suspense)}:r!=="sync"&&(f=!0,l.scheduler=(y,b)=>{b?y():ti(y)}),l.augmentJob=y=>{t&&(y.flags|=4),f&&(y.flags|=2,c&&(y.id=c.uid,y.i=c))};const m=vd(e,t,l);return ys&&(d?d.push(m):a&&m()),m}function Sd(e,t,n){const s=this.proxy,o=Ce(e)?e.includes(".")?Va(s,e):()=>s[e]:e.bind(s,s);let r;te(t)?r=t:(r=t.handler,n=t);const i=As(this),l=ni(o,r.bind(s),n);return i(),l}function Va(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;oe.__isTeleport,Nt=Symbol("_leaveCb"),Jn=Symbol("_enterCb");function Ad(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Yt(()=>{e.isMounted=!0}),oi(()=>{e.isUnmounting=!0}),e}const ut=[Function,Array],Wa={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ut,onEnter:ut,onAfterEnter:ut,onEnterCancelled:ut,onBeforeLeave:ut,onLeave:ut,onAfterLeave:ut,onLeaveCancelled:ut,onBeforeAppear:ut,onAppear:ut,onAfterAppear:ut,onAppearCancelled:ut},za=e=>{const t=e.subTree;return t.component?za(t.component):t},Rd={name:"BaseTransition",props:Wa,setup(e,{slots:t}){const n=wc(),s=Ad();return()=>{const o=t.default&&Ja(t.default(),!0);if(!o||!o.length)return;const r=Ga(o),i=de(e),{mode:l}=i;if(s.isLeaving)return Jo(r);const a=Ii(r);if(!a)return Jo(r);let d=_r(a,i,s,n,f=>d=f);a.type!==ze&&ms(a,d);let c=n.subTree&&Ii(n.subTree);if(c&&c.type!==ze&&!bn(c,a)&&za(n).type!==ze){let f=_r(c,i,s,n);if(ms(c,f),l==="out-in"&&a.type!==ze)return s.isLeaving=!0,f.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,c=void 0},Jo(r);l==="in-out"&&a.type!==ze?f.delayLeave=(m,y,b)=>{const v=Qa(s,c);v[String(c.key)]=c,m[Nt]=()=>{y(),m[Nt]=void 0,delete d.delayedLeave,c=void 0},d.delayedLeave=()=>{b(),delete d.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return r}}};function Ga(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ze){t=n;break}}return t}const Cd=Rd;function Qa(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function _r(e,t,n,s,o){const{appear:r,mode:i,persisted:l=!1,onBeforeEnter:a,onEnter:d,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:m,onLeave:y,onAfterLeave:b,onLeaveCancelled:v,onBeforeAppear:h,onAppear:E,onAfterAppear:C,onAppearCancelled:S}=t,R=String(e.key),L=Qa(n,e),T=(z,ne)=>{z&&_t(z,s,9,ne)},U=(z,ne)=>{const ge=ne[1];T(z,ne),J(z)?z.every(q=>q.length<=1)&&ge():z.length<=1&&ge()},ae={mode:i,persisted:l,beforeEnter(z){let ne=a;if(!n.isMounted)if(r)ne=h||a;else return;z[Nt]&&z[Nt](!0);const ge=L[R];ge&&bn(e,ge)&&ge.el[Nt]&&ge.el[Nt](),T(ne,[z])},enter(z){let ne=d,ge=c,q=f;if(!n.isMounted)if(r)ne=E||d,ge=C||c,q=S||f;else return;let oe=!1;z[Jn]=Me=>{oe||(oe=!0,Me?T(q,[z]):T(ge,[z]),ae.delayedLeave&&ae.delayedLeave(),z[Jn]=void 0)};const _e=z[Jn].bind(null,!1);ne?U(ne,[z,_e]):_e()},leave(z,ne){const ge=String(e.key);if(z[Jn]&&z[Jn](!0),n.isUnmounting)return ne();T(m,[z]);let q=!1;z[Nt]=_e=>{q||(q=!0,ne(),_e?T(v,[z]):T(b,[z]),z[Nt]=void 0,L[ge]===e&&delete L[ge])};const oe=z[Nt].bind(null,!1);L[ge]=e,y?U(y,[z,oe]):oe()},clone(z){const ne=_r(z,t,n,s,o);return o&&o(ne),ne}};return ae}function Jo(e){if(Ao(e))return e=an(e),e.children=null,e}function Ii(e){if(!Ao(e))return Ka(e.type)&&e.children?Ga(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&te(n.default))return n.default()}}function ms(e,t){e.shapeFlag&6&&e.component?(e.transition=t,ms(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ja(e,t=!1,n){let s=[],o=0;for(let r=0;r1)for(let r=0;rls(v,t&&(J(t)?t[h]:t),n,s,o));return}if(as(s)&&!o){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&ls(e,t,n,s.component.subTree);return}const r=s.shapeFlag&4?Po(s.component):s.el,i=o?null:r,{i:l,r:a}=e,d=t&&t.r,c=l.refs===be?l.refs={}:l.refs,f=l.setupState,m=de(f),y=f===be?ha:v=>$i(c,v)?!1:pe(m,v),b=(v,h)=>!(h&&$i(c,h));if(d!=null&&d!==a){if(Li(t),Ce(d))c[d]=null,y(d)&&(f[d]=null);else if(je(d)){const v=t;b(d,v.k)&&(d.value=null),v.k&&(c[v.k]=null)}}if(te(a))Es(a,l,12,[i,c]);else{const v=Ce(a),h=je(a);if(v||h){const E=()=>{if(e.f){const C=v?y(a)?f[a]:c[a]:b()||!e.k?a.value:c[e.k];if(o)J(C)&&Vr(C,r);else if(J(C))C.includes(r)||C.push(r);else if(v)c[a]=[r],y(a)&&(f[a]=c[a]);else{const S=[r];b(a,e.k)&&(a.value=S),e.k&&(c[e.k]=S)}}else v?(c[a]=i,y(a)&&(f[a]=i)):h&&(b(a,e.k)&&(a.value=i),e.k&&(c[e.k]=i))};if(i){const C=()=>{E(),ao.delete(e)};C.id=-1,ao.set(e,C),Ye(C,n)}else Li(e),E()}}}function Li(e){const t=ao.get(e);t&&(t.flags|=8,ao.delete(e))}wo().requestIdleCallback;wo().cancelIdleCallback;const as=e=>!!e.type.__asyncLoader,Ao=e=>e.type.__isKeepAlive;function Td(e,t){Xa(e,"a",t)}function Pd(e,t){Xa(e,"da",t)}function Xa(e,t,n=Be){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ro(t,s,n),n){let o=n.parent;for(;o&&o.parent;)Ao(o.parent.vnode)&&Od(s,t,n,o),o=o.parent}}function Od(e,t,n,s){const o=Ro(t,e,s,!0);ri(()=>{Vr(s[t],o)},n)}function Ro(e,t,n=Be,s=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...i)=>{zt();const l=As(n),a=_t(t,n,e,i);return l(),Gt(),a});return s?o.unshift(r):o.push(r),r}}const Jt=e=>(t,n=Be)=>{(!ys||e==="sp")&&Ro(e,(...s)=>t(...s),n)},Za=Jt("bm"),Yt=Jt("m"),Dd=Jt("bu"),Nd=Jt("u"),oi=Jt("bum"),ri=Jt("um"),Id=Jt("sp"),$d=Jt("rtg"),Ld=Jt("rtc");function Md(e,t=Be){Ro("ec",e,t)}const ec="components";function xr(e,t){return nc(ec,e,!0,t)||e}const tc=Symbol.for("v-ndc");function Ud(e){return Ce(e)?nc(ec,e,!1)||e:e||tc}function nc(e,t,n=!0,s=!1){const o=rt||Be;if(o){const r=o.type;{const l=Sf(r,!1);if(l&&(l===t||l===ht(t)||l===_o(ht(t))))return r}const i=Mi(o[e]||r[e],t)||Mi(o.appContext[e],t);return!i&&s?r:i}}function Mi(e,t){return e&&(e[t]||e[ht(t)]||e[_o(ht(t))])}function $e(e,t,n,s){let o;const r=n,i=J(e);if(i||Ce(e)){const l=i&&kn(e);let a=!1,d=!1;l&&(a=!pt(e),d=Qt(e),e=ko(e)),o=new Array(e.length);for(let c=0,f=e.length;ct(l,a,void 0,r));else{const l=Object.keys(e);o=new Array(l.length);for(let a=0,d=l.length;ae?kc(e)?Po(e):wr(e.parent):null,cs=Ie(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>wr(e.parent),$root:e=>wr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>oc(e),$forceUpdate:e=>e.f||(e.f=()=>{ti(e.update)}),$nextTick:e=>e.n||(e.n=ei.bind(e.proxy)),$watch:e=>Sd.bind(e)}),Yo=(e,t)=>e!==be&&!e.__isScriptSetup&&pe(e,t),Fd={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:o,props:r,accessCache:i,type:l,appContext:a}=e;if(t[0]!=="$"){const m=i[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return r[t]}else{if(Yo(s,t))return i[t]=1,s[t];if(o!==be&&pe(o,t))return i[t]=2,o[t];if(pe(r,t))return i[t]=3,r[t];if(n!==be&&pe(n,t))return i[t]=4,n[t];kr&&(i[t]=0)}}const d=cs[t];let c,f;if(d)return t==="$attrs"&&Fe(e.attrs,"get",""),d(e);if((c=l.__cssModules)&&(c=c[t]))return c;if(n!==be&&pe(n,t))return i[t]=4,n[t];if(f=a.config.globalProperties,pe(f,t))return f[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:r}=e;return Yo(o,t)?(o[t]=n,!0):s!==be&&pe(s,t)?(s[t]=n,!0):pe(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,props:r,type:i}},l){let a;return!!(n[l]||e!==be&&l[0]!=="$"&&pe(e,l)||Yo(t,l)||pe(r,l)||pe(s,l)||pe(cs,l)||pe(o.config.globalProperties,l)||(a=i.__cssModules)&&a[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:pe(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Ui(e){return J(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let kr=!0;function Bd(e){const t=oc(e),n=e.proxy,s=e.ctx;kr=!1,t.beforeCreate&&Fi(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:i,watch:l,provide:a,inject:d,created:c,beforeMount:f,mounted:m,beforeUpdate:y,updated:b,activated:v,deactivated:h,beforeDestroy:E,beforeUnmount:C,destroyed:S,unmounted:R,render:L,renderTracked:T,renderTriggered:U,errorCaptured:ae,serverPrefetch:z,expose:ne,inheritAttrs:ge,components:q,directives:oe,filters:_e}=t;if(d&&Hd(d,s,null),i)for(const ue in i){const se=i[ue];te(se)&&(s[ue]=se.bind(n))}if(o){const ue=o.call(n,n);me(ue)&&(e.data=So(ue))}if(kr=!0,r)for(const ue in r){const se=r[ue],at=te(se)?se.bind(n,n):te(se.get)?se.get.bind(n,n):Lt,St=!te(se)&&te(se.set)?se.set.bind(n):Lt,De=Ae({get:at,set:St});Object.defineProperty(s,ue,{enumerable:!0,configurable:!0,get:()=>De.value,set:Pe=>De.value=Pe})}if(l)for(const ue in l)sc(l[ue],s,n,ue);if(a){const ue=te(a)?a.call(n):a;Reflect.ownKeys(ue).forEach(se=>{zs(se,ue[se])})}c&&Fi(c,e,"c");function re(ue,se){J(se)?se.forEach(at=>ue(at.bind(n))):se&&ue(se.bind(n))}if(re(Za,f),re(Yt,m),re(Dd,y),re(Nd,b),re(Td,v),re(Pd,h),re(Md,ae),re(Ld,T),re($d,U),re(oi,C),re(ri,R),re(Id,z),J(ne))if(ne.length){const ue=e.exposed||(e.exposed={});ne.forEach(se=>{Object.defineProperty(ue,se,{get:()=>n[se],set:at=>n[se]=at,enumerable:!0})})}else e.exposed||(e.exposed={});L&&e.render===Lt&&(e.render=L),ge!=null&&(e.inheritAttrs=ge),q&&(e.components=q),oe&&(e.directives=oe),z&&Ya(e)}function Hd(e,t,n=Lt){J(e)&&(e=Sr(e));for(const s in e){const o=e[s];let r;me(o)?"default"in o?r=vt(o.from||s,o.default,!0):r=vt(o.from||s):r=vt(o),je(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:i=>r.value=i}):t[s]=r}}function Fi(e,t,n){_t(J(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function sc(e,t,n,s){let o=s.includes(".")?Va(n,s):()=>n[s];if(Ce(e)){const r=t[e];te(r)&&ln(o,r)}else if(te(e))ln(o,e.bind(n));else if(me(e))if(J(e))e.forEach(r=>sc(r,t,n,s));else{const r=te(e.handler)?e.handler.bind(n):t[e.handler];te(r)&&ln(o,r,e)}}function oc(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:i}}=e.appContext,l=r.get(t);let a;return l?a=l:!o.length&&!n&&!s?a=t:(a={},o.length&&o.forEach(d=>co(a,d,i,!0)),co(a,t,i)),me(t)&&r.set(t,a),a}function co(e,t,n,s=!1){const{mixins:o,extends:r}=t;r&&co(e,r,n,!0),o&&o.forEach(i=>co(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=jd[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const jd={data:Bi,props:Hi,emits:Hi,methods:ss,computed:ss,beforeCreate:Ve,created:Ve,beforeMount:Ve,mounted:Ve,beforeUpdate:Ve,updated:Ve,beforeDestroy:Ve,beforeUnmount:Ve,destroyed:Ve,unmounted:Ve,activated:Ve,deactivated:Ve,errorCaptured:Ve,serverPrefetch:Ve,components:ss,directives:ss,watch:Vd,provide:Bi,inject:qd};function Bi(e,t){return t?e?function(){return Ie(te(e)?e.call(this,this):e,te(t)?t.call(this,this):t)}:t:e}function qd(e,t){return ss(Sr(e),Sr(t))}function Sr(e){if(J(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${ht(t)}Modifiers`]||e[`${dn(t)}Modifiers`];function Gd(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||be;let o=n;const r=t.startsWith("update:"),i=r&&zd(s,t.slice(7));i&&(i.trim&&(o=n.map(c=>Ce(c)?c.trim():c)),i.number&&(o=n.map(xo)));let l,a=s[l=Ko(t)]||s[l=Ko(ht(t))];!a&&r&&(a=s[l=Ko(dn(t))]),a&&_t(a,e,6,o);const d=s[l+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,_t(d,e,6,o)}}const Qd=new WeakMap;function ic(e,t,n=!1){const s=n?Qd:t.emitsCache,o=s.get(e);if(o!==void 0)return o;const r=e.emits;let i={},l=!1;if(!te(e)){const a=d=>{const c=ic(d,t,!0);c&&(l=!0,Ie(i,c))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!l?(me(e)&&s.set(e,null),null):(J(r)?r.forEach(a=>i[a]=null):Ie(i,r),me(e)&&s.set(e,i),i)}function Co(e,t){return!e||!vo(t)?!1:(t=t.slice(2).replace(/Once$/,""),pe(e,t[0].toLowerCase()+t.slice(1))||pe(e,dn(t))||pe(e,t))}function ji(e){const{type:t,vnode:n,proxy:s,withProxy:o,propsOptions:[r],slots:i,attrs:l,emit:a,render:d,renderCache:c,props:f,data:m,setupState:y,ctx:b,inheritAttrs:v}=e,h=io(e);let E,C;try{if(n.shapeFlag&4){const R=o||s,L=R;E=$t(d.call(L,R,c,f,y,m,b)),C=l}else{const R=t;E=$t(R.length>1?R(f,{attrs:l,slots:i,emit:a}):R(f,null)),C=t.props?l:Jd(l)}}catch(R){us.length=0,Eo(R,e,1),E=M(ze)}let S=E;if(C&&v!==!1){const R=Object.keys(C),{shapeFlag:L}=S;R.length&&L&7&&(r&&R.some(qr)&&(C=Yd(C,r)),S=an(S,C,!1,!0))}return n.dirs&&(S=an(S,null,!1,!0),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&ms(S,n.transition),E=S,io(h),E}const Jd=e=>{let t;for(const n in e)(n==="class"||n==="style"||vo(n))&&((t||(t={}))[n]=e[n]);return t},Yd=(e,t)=>{const n={};for(const s in e)(!qr(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Xd(e,t,n){const{props:s,children:o,component:r}=e,{props:i,children:l,patchFlag:a}=t,d=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return s?qi(s,i,d):!!i;if(a&8){const c=t.dynamicProps;for(let f=0;fObject.create(ac),uc=e=>Object.getPrototypeOf(e)===ac;function ef(e,t,n,s=!1){const o={},r=cc();e.propsDefaults=Object.create(null),dc(e,t,o,r);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=s?o:La(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function tf(e,t,n,s){const{props:o,attrs:r,vnode:{patchFlag:i}}=e,l=de(o),[a]=e.propsOptions;let d=!1;if((s||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[m,y]=fc(f,t,!0);Ie(i,m),y&&l.push(...y)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!r&&!a)return me(e)&&s.set(e,Pn),Pn;if(J(r))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",li=e=>J(e)?e.map($t):[$t(e)],sf=(e,t,n)=>{if(t._n)return t;const s=lo((...o)=>li(t(...o)),n);return s._c=!1,s},pc=(e,t,n)=>{const s=e._ctx;for(const o in e){if(ii(o))continue;const r=e[o];if(te(r))t[o]=sf(o,r,s);else if(r!=null){const i=li(r);t[o]=()=>i}}},hc=(e,t)=>{const n=li(t);e.slots.default=()=>n},mc=(e,t,n)=>{for(const s in t)(n||!ii(s))&&(e[s]=t[s])},of=(e,t,n)=>{const s=e.slots=cc();if(e.vnode.shapeFlag&32){const o=t._;o?(mc(s,t,n),n&&va(s,"_",o,!0)):pc(t,s)}else t&&hc(e,t)},rf=(e,t,n)=>{const{vnode:s,slots:o}=e;let r=!0,i=be;if(s.shapeFlag&32){const l=t._;l?n&&l===1?r=!1:mc(o,t,n):(r=!t.$stable,pc(t,o)),i=t}else t&&(hc(e,t),i={default:1});if(r)for(const l in o)!ii(l)&&i[l]==null&&delete o[l]},Ye=df;function lf(e){return af(e)}function af(e,t){const n=wo();n.__VUE__=!0;const{insert:s,remove:o,patchProp:r,createElement:i,createText:l,createComment:a,setText:d,setElementText:c,parentNode:f,nextSibling:m,setScopeId:y=Lt,insertStaticContent:b}=e,v=(g,_,x,O=null,I=null,D=null,H=void 0,B=null,F=!!_.dynamicChildren)=>{if(g===_)return;g&&!bn(g,_)&&(O=N(g),Pe(g,I,D,!0),g=null),_.patchFlag===-2&&(F=!1,_.dynamicChildren=null);const{type:$,ref:Y,shapeFlag:V}=_;switch($){case To:h(g,_,x,O);break;case ze:E(g,_,x,O);break;case Gs:g==null&&C(_,x,O,H);break;case ce:q(g,_,x,O,I,D,H,B,F);break;default:V&1?L(g,_,x,O,I,D,H,B,F):V&6?oe(g,_,x,O,I,D,H,B,F):(V&64||V&128)&&$.process(g,_,x,O,I,D,H,B,F,G)}Y!=null&&I?ls(Y,g&&g.ref,D,_||g,!_):Y==null&&g&&g.ref!=null&&ls(g.ref,null,D,g,!0)},h=(g,_,x,O)=>{if(g==null)s(_.el=l(_.children),x,O);else{const I=_.el=g.el;_.children!==g.children&&d(I,_.children)}},E=(g,_,x,O)=>{g==null?s(_.el=a(_.children||""),x,O):_.el=g.el},C=(g,_,x,O)=>{[g.el,g.anchor]=b(g.children,_,x,O,g.el,g.anchor)},S=({el:g,anchor:_},x,O)=>{let I;for(;g&&g!==_;)I=m(g),s(g,x,O),g=I;s(_,x,O)},R=({el:g,anchor:_})=>{let x;for(;g&&g!==_;)x=m(g),o(g),g=x;o(_)},L=(g,_,x,O,I,D,H,B,F)=>{if(_.type==="svg"?H="svg":_.type==="math"&&(H="mathml"),g==null)T(_,x,O,I,D,H,B,F);else{const $=g.el&&g.el._isVueCE?g.el:null;try{$&&$._beginPatch(),z(g,_,I,D,H,B,F)}finally{$&&$._endPatch()}}},T=(g,_,x,O,I,D,H,B)=>{let F,$;const{props:Y,shapeFlag:V,transition:Q,dirs:Z}=g;if(F=g.el=i(g.type,D,Y&&Y.is,Y),V&8?c(F,g.children):V&16&&ae(g.children,F,null,O,I,Xo(g,D),H,B),Z&&fn(g,null,O,"created"),U(F,g,g.scopeId,H,O),Y){for(const xe in Y)xe!=="value"&&!os(xe)&&r(F,xe,null,Y[xe],D,O);"value"in Y&&r(F,"value",null,Y.value,D),($=Y.onVnodeBeforeMount)&&Pt($,O,g)}Z&&fn(g,null,O,"beforeMount");const le=cf(I,Q);le&&Q.beforeEnter(F),s(F,_,x),(($=Y&&Y.onVnodeMounted)||le||Z)&&Ye(()=>{$&&Pt($,O,g),le&&Q.enter(F),Z&&fn(g,null,O,"mounted")},I)},U=(g,_,x,O,I)=>{if(x&&y(g,x),O)for(let D=0;D{for(let $=F;${const B=_.el=g.el;let{patchFlag:F,dynamicChildren:$,dirs:Y}=_;F|=g.patchFlag&16;const V=g.props||be,Q=_.props||be;let Z;if(x&&pn(x,!1),(Z=Q.onVnodeBeforeUpdate)&&Pt(Z,x,_,g),Y&&fn(_,g,x,"beforeUpdate"),x&&pn(x,!0),(V.innerHTML&&Q.innerHTML==null||V.textContent&&Q.textContent==null)&&c(B,""),$?ne(g.dynamicChildren,$,B,x,O,Xo(_,I),D):H||se(g,_,B,null,x,O,Xo(_,I),D,!1),F>0){if(F&16)ge(B,V,Q,x,I);else if(F&2&&V.class!==Q.class&&r(B,"class",null,Q.class,I),F&4&&r(B,"style",V.style,Q.style,I),F&8){const le=_.dynamicProps;for(let xe=0;xe{Z&&Pt(Z,x,_,g),Y&&fn(_,g,x,"updated")},O)},ne=(g,_,x,O,I,D,H)=>{for(let B=0;B<_.length;B++){const F=g[B],$=_[B],Y=F.el&&(F.type===ce||!bn(F,$)||F.shapeFlag&198)?f(F.el):x;v(F,$,Y,null,O,I,D,H,!0)}},ge=(g,_,x,O,I)=>{if(_!==x){if(_!==be)for(const D in _)!os(D)&&!(D in x)&&r(g,D,_[D],null,I,O);for(const D in x){if(os(D))continue;const H=x[D],B=_[D];H!==B&&D!=="value"&&r(g,D,B,H,I,O)}"value"in x&&r(g,"value",_.value,x.value,I)}},q=(g,_,x,O,I,D,H,B,F)=>{const $=_.el=g?g.el:l(""),Y=_.anchor=g?g.anchor:l("");let{patchFlag:V,dynamicChildren:Q,slotScopeIds:Z}=_;Z&&(B=B?B.concat(Z):Z),g==null?(s($,x,O),s(Y,x,O),ae(_.children||[],x,Y,I,D,H,B,F)):V>0&&V&64&&Q&&g.dynamicChildren&&g.dynamicChildren.length===Q.length?(ne(g.dynamicChildren,Q,x,I,D,H,B),(_.key!=null||I&&_===I.subTree)&&gc(g,_,!0)):se(g,_,x,Y,I,D,H,B,F)},oe=(g,_,x,O,I,D,H,B,F)=>{_.slotScopeIds=B,g==null?_.shapeFlag&512?I.ctx.activate(_,x,O,H,F):_e(_,x,O,I,D,H,F):Me(g,_,F)},_e=(g,_,x,O,I,D,H)=>{const B=g.component=bf(g,O,I);if(Ao(g)&&(B.ctx.renderer=G),_f(B,!1,H),B.asyncDep){if(I&&I.registerDep(B,re,H),!g.el){const F=B.subTree=M(ze);E(null,F,_,x),g.placeholder=F.el}}else re(B,g,_,x,I,D,H)},Me=(g,_,x)=>{const O=_.component=g.component;if(Xd(g,_,x))if(O.asyncDep&&!O.asyncResolved){ue(O,_,x);return}else O.next=_,O.update();else _.el=g.el,O.vnode=_},re=(g,_,x,O,I,D,H)=>{const B=()=>{if(g.isMounted){let{next:V,bu:Q,u:Z,parent:le,vnode:xe}=g;{const Ct=yc(g);if(Ct){V&&(V.el=xe.el,ue(g,V,H)),Ct.asyncDep.then(()=>{Ye(()=>{g.isUnmounted||$()},I)});return}}let ye=V,Qe;pn(g,!1),V?(V.el=xe.el,ue(g,V,H)):V=xe,Q&&Ws(Q),(Qe=V.props&&V.props.onVnodeBeforeUpdate)&&Pt(Qe,le,V,xe),pn(g,!0);const Je=ji(g),Rt=g.subTree;g.subTree=Je,v(Rt,Je,f(Rt.el),N(Rt),g,I,D),V.el=Je.el,ye===null&&Zd(g,Je.el),Z&&Ye(Z,I),(Qe=V.props&&V.props.onVnodeUpdated)&&Ye(()=>Pt(Qe,le,V,xe),I)}else{let V;const{el:Q,props:Z}=_,{bm:le,m:xe,parent:ye,root:Qe,type:Je}=g,Rt=as(_);pn(g,!1),le&&Ws(le),!Rt&&(V=Z&&Z.onVnodeBeforeMount)&&Pt(V,ye,_),pn(g,!0);{Qe.ce&&Qe.ce._hasShadowRoot()&&Qe.ce._injectChildStyle(Je);const Ct=g.subTree=ji(g);v(null,Ct,x,O,g,I,D),_.el=Ct.el}if(xe&&Ye(xe,I),!Rt&&(V=Z&&Z.onVnodeMounted)){const Ct=_;Ye(()=>Pt(V,ye,Ct),I)}(_.shapeFlag&256||ye&&as(ye.vnode)&&ye.vnode.shapeFlag&256)&&g.a&&Ye(g.a,I),g.isMounted=!0,_=x=O=null}};g.scope.on();const F=g.effect=new wa(B);g.scope.off();const $=g.update=F.run.bind(F),Y=g.job=F.runIfDirty.bind(F);Y.i=g,Y.id=g.uid,F.scheduler=()=>ti(Y),pn(g,!0),$()},ue=(g,_,x)=>{_.component=g;const O=g.vnode.props;g.vnode=_,g.next=null,tf(g,_.props,O,x),rf(g,_.children,x),zt(),Ni(g),Gt()},se=(g,_,x,O,I,D,H,B,F=!1)=>{const $=g&&g.children,Y=g?g.shapeFlag:0,V=_.children,{patchFlag:Q,shapeFlag:Z}=_;if(Q>0){if(Q&128){St($,V,x,O,I,D,H,B,F);return}else if(Q&256){at($,V,x,O,I,D,H,B,F);return}}Z&8?(Y&16&&ct($,I,D),V!==$&&c(x,V)):Y&16?Z&16?St($,V,x,O,I,D,H,B,F):ct($,I,D,!0):(Y&8&&c(x,""),Z&16&&ae(V,x,O,I,D,H,B,F))},at=(g,_,x,O,I,D,H,B,F)=>{g=g||Pn,_=_||Pn;const $=g.length,Y=_.length,V=Math.min($,Y);let Q;for(Q=0;QY?ct(g,I,D,!0,!1,V):ae(_,x,O,I,D,H,B,F,V)},St=(g,_,x,O,I,D,H,B,F)=>{let $=0;const Y=_.length;let V=g.length-1,Q=Y-1;for(;$<=V&&$<=Q;){const Z=g[$],le=_[$]=F?jt(_[$]):$t(_[$]);if(bn(Z,le))v(Z,le,x,null,I,D,H,B,F);else break;$++}for(;$<=V&&$<=Q;){const Z=g[V],le=_[Q]=F?jt(_[Q]):$t(_[Q]);if(bn(Z,le))v(Z,le,x,null,I,D,H,B,F);else break;V--,Q--}if($>V){if($<=Q){const Z=Q+1,le=ZQ)for(;$<=V;)Pe(g[$],I,D,!0),$++;else{const Z=$,le=$,xe=new Map;for($=le;$<=Q;$++){const st=_[$]=F?jt(_[$]):$t(_[$]);st.key!=null&&xe.set(st.key,$)}let ye,Qe=0;const Je=Q-le+1;let Rt=!1,Ct=0;const Gn=new Array(Je);for($=0;$=Je){Pe(st,I,D,!0);continue}let Tt;if(st.key!=null)Tt=xe.get(st.key);else for(ye=le;ye<=Q;ye++)if(Gn[ye-le]===0&&bn(st,_[ye])){Tt=ye;break}Tt===void 0?Pe(st,I,D,!0):(Gn[Tt-le]=$+1,Tt>=Ct?Ct=Tt:Rt=!0,v(st,_[Tt],x,null,I,D,H,B,F),Qe++)}const Ai=Rt?uf(Gn):Pn;for(ye=Ai.length-1,$=Je-1;$>=0;$--){const st=le+$,Tt=_[st],Ri=_[st+1],Ci=st+1{const{el:D,type:H,transition:B,children:F,shapeFlag:$}=g;if($&6){De(g.component.subTree,_,x,O);return}if($&128){g.suspense.move(_,x,O);return}if($&64){H.move(g,_,x,G);return}if(H===ce){s(D,_,x);for(let V=0;VB.enter(D),I);else{const{leave:V,delayLeave:Q,afterLeave:Z}=B,le=()=>{g.ctx.isUnmounted?o(D):s(D,_,x)},xe=()=>{D._isLeaving&&D[Nt](!0),V(D,()=>{le(),Z&&Z()})};Q?Q(D,le,xe):xe()}else s(D,_,x)},Pe=(g,_,x,O=!1,I=!1)=>{const{type:D,props:H,ref:B,children:F,dynamicChildren:$,shapeFlag:Y,patchFlag:V,dirs:Q,cacheIndex:Z}=g;if(V===-2&&(I=!1),B!=null&&(zt(),ls(B,null,x,g,!0),Gt()),Z!=null&&(_.renderCache[Z]=void 0),Y&256){_.ctx.deactivate(g);return}const le=Y&1&&Q,xe=!as(g);let ye;if(xe&&(ye=H&&H.onVnodeBeforeUnmount)&&Pt(ye,_,g),Y&6)At(g.component,x,O);else{if(Y&128){g.suspense.unmount(x,O);return}le&&fn(g,null,_,"beforeUnmount"),Y&64?g.type.remove(g,_,x,G,O):$&&!$.hasOnce&&(D!==ce||V>0&&V&64)?ct($,_,x,!1,!0):(D===ce&&V&384||!I&&Y&16)&&ct(F,_,x),O&&Et(g)}(xe&&(ye=H&&H.onVnodeUnmounted)||le)&&Ye(()=>{ye&&Pt(ye,_,g),le&&fn(g,null,_,"unmounted")},x)},Et=g=>{const{type:_,el:x,anchor:O,transition:I}=g;if(_===ce){mt(x,O);return}if(_===Gs){R(g);return}const D=()=>{o(x),I&&!I.persisted&&I.afterLeave&&I.afterLeave()};if(g.shapeFlag&1&&I&&!I.persisted){const{leave:H,delayLeave:B}=I,F=()=>H(x,D);B?B(g.el,D,F):F()}else D()},mt=(g,_)=>{let x;for(;g!==_;)x=m(g),o(g),g=x;o(_)},At=(g,_,x)=>{const{bum:O,scope:I,job:D,subTree:H,um:B,m:F,a:$}=g;Ki(F),Ki($),O&&Ws(O),I.stop(),D&&(D.flags|=8,Pe(H,g,_,x)),B&&Ye(B,_),Ye(()=>{g.isUnmounted=!0},_)},ct=(g,_,x,O=!1,I=!1,D=0)=>{for(let H=D;H{if(g.shapeFlag&6)return N(g.component.subTree);if(g.shapeFlag&128)return g.suspense.next();const _=m(g.anchor||g.el),x=_&&_[Ed];return x?m(x):_};let K=!1;const j=(g,_,x)=>{let O;g==null?_._vnode&&(Pe(_._vnode,null,null,!0),O=_._vnode.component):v(_._vnode||null,g,_,null,null,null,x),_._vnode=g,K||(K=!0,Ni(O),Ha(),K=!1)},G={p:v,um:Pe,m:De,r:Et,mt:_e,mc:ae,pc:se,pbc:ne,n:N,o:e};return{render:j,hydrate:void 0,createApp:Wd(j)}}function Xo({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function pn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function cf(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function gc(e,t,n=!1){const s=e.children,o=t.children;if(J(s)&&J(o))for(let r=0;r>1,e[n[l]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,i=n[r-1];r-- >0;)n[r]=i,i=t[i];return n}function yc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:yc(t)}function Ki(e){if(e)for(let t=0;te.__isSuspense;function df(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):xd(e)}const ce=Symbol.for("v-fgt"),To=Symbol.for("v-txt"),ze=Symbol.for("v-cmt"),Gs=Symbol.for("v-stc"),us=[];let it=null;function A(e=!1){us.push(it=e?null:[])}function ff(){us.pop(),it=us[us.length-1]||null}let gs=1;function uo(e,t=!1){gs+=e,e<0&&it&&t&&(it.hasOnce=!0)}function _c(e){return e.dynamicChildren=gs>0?it||Pn:null,ff(),gs>0&&it&&it.push(e),e}function P(e,t,n,s,o,r){return _c(p(e,t,n,s,o,r,!0))}function lt(e,t,n,s,o){return _c(M(e,t,n,s,o,!0))}function fo(e){return e?e.__v_isVNode===!0:!1}function bn(e,t){return e.type===t.type&&e.key===t.key}const xc=({key:e})=>e??null,Qs=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Ce(e)||je(e)||te(e)?{i:rt,r:e,k:t,f:!!n}:e:null);function p(e,t=null,n=null,s=0,o=null,r=e===ce?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&xc(t),ref:t&&Qs(t),scopeId:qa,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:rt};return l?(ai(a,n),r&128&&e.normalize(a)):n&&(a.shapeFlag|=Ce(n)?8:16),gs>0&&!i&&it&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&it.push(a),a}const M=pf;function pf(e,t=null,n=null,s=0,o=null,r=!1){if((!e||e===tc)&&(e=ze),fo(e)){const l=an(e,t,!0);return n&&ai(l,n),gs>0&&!r&&it&&(l.shapeFlag&6?it[it.indexOf(e)]=l:it.push(l)),l.patchFlag=-2,l}if(Ef(e)&&(e=e.__vccOpts),t){t=hf(t);let{class:l,style:a}=t;l&&!Ce(l)&&(t.class=Ee(l)),me(a)&&(Zr(a)&&!J(a)&&(a=Ie({},a)),t.style=$n(a))}const i=Ce(e)?1:bc(e)?128:Ka(e)?64:me(e)?4:te(e)?2:0;return p(e,t,n,s,o,i,r,!0)}function hf(e){return e?Zr(e)||uc(e)?Ie({},e):e:null}function an(e,t,n=!1,s=!1){const{props:o,ref:r,patchFlag:i,children:l,transition:a}=e,d=t?gf(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&xc(d),ref:t&&t.ref?n&&r?J(r)?r.concat(Qs(t)):[r,Qs(t)]:Qs(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ce?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&an(e.ssContent),ssFallback:e.ssFallback&&an(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&s&&ms(c,a.clone(c)),c}function Oe(e=" ",t=0){return M(To,null,e,t)}function mf(e,t){const n=M(Gs,null,e);return n.staticCount=t,n}function he(e="",t=!1){return t?(A(),lt(ze,null,e)):M(ze,null,e)}function $t(e){return e==null||typeof e=="boolean"?M(ze):J(e)?M(ce,null,e.slice()):fo(e)?jt(e):M(To,null,String(e))}function jt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:an(e)}function ai(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(J(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),ai(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!uc(t)?t._ctx=rt:o===3&&rt&&(rt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else te(t)?(t={default:t,_ctx:rt},n=32):(t=String(t),s&64?(n=16,t=[Oe(t)]):n=8);e.children=t,e.shapeFlag|=n}function gf(...e){const t={};for(let n=0;nBe||rt;let po,Ar;{const e=wo(),t=(n,s)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),r=>{o.length>1?o.forEach(i=>i(r)):o[0](r)}};po=t("__VUE_INSTANCE_SETTERS__",n=>Be=n),Ar=t("__VUE_SSR_SETTERS__",n=>ys=n)}const As=e=>{const t=Be;return po(e),e.scope.on(),()=>{e.scope.off(),po(t)}},Wi=()=>{Be&&Be.scope.off(),po(null)};function kc(e){return e.vnode.shapeFlag&4}let ys=!1;function _f(e,t=!1,n=!1){t&&Ar(t);const{props:s,children:o}=e.vnode,r=kc(e);ef(e,s,r,t),of(e,o,n||t);const i=r?xf(e,t):void 0;return t&&Ar(!1),i}function xf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Fd);const{setup:s}=n;if(s){zt();const o=e.setupContext=s.length>1?kf(e):null,r=As(e),i=Es(s,e,0,[e.props,o]),l=ma(i);if(Gt(),r(),(l||e.sp)&&!as(e)&&Ya(e),l){if(i.then(Wi,Wi),t)return i.then(a=>{zi(e,a)}).catch(a=>{Eo(a,e,0)});e.asyncDep=i}else zi(e,i)}else Sc(e)}function zi(e,t,n){te(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:me(t)&&(e.setupState=Ua(t)),Sc(e)}function Sc(e,t,n){const s=e.type;e.render||(e.render=s.render||Lt);{const o=As(e);zt();try{Bd(e)}finally{Gt(),o()}}}const wf={get(e,t){return Fe(e,"get",""),e[t]}};function kf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,wf),slots:e.slots,emit:e.emit,expose:t}}function Po(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ua(dd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in cs)return cs[n](e)},has(t,n){return n in t||n in cs}})):e.proxy}function Sf(e,t=!0){return te(e)?e.displayName||e.name:e.name||t&&e.__name}function Ef(e){return te(e)&&"__vccOpts"in e}const Ae=(e,t)=>gd(e,t,ys);function vs(e,t,n){try{uo(-1);const s=arguments.length;return s===2?me(t)&&!J(t)?fo(t)?M(e,null,[t]):M(e,t):M(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&fo(n)&&(n=[n]),M(e,t,n))}finally{uo(1)}}const Af="3.5.28";/** +* @vue/runtime-dom v3.5.28 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Rr;const Gi=typeof window<"u"&&window.trustedTypes;if(Gi)try{Rr=Gi.createPolicy("vue",{createHTML:e=>e})}catch{}const Ec=Rr?e=>Rr.createHTML(e):e=>e,Rf="http://www.w3.org/2000/svg",Cf="http://www.w3.org/1998/Math/MathML",Ht=typeof document<"u"?document:null,Qi=Ht&&Ht.createElement("template"),Tf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?Ht.createElementNS(Rf,e):t==="mathml"?Ht.createElementNS(Cf,e):n?Ht.createElement(e,{is:n}):Ht.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>Ht.createTextNode(e),createComment:e=>Ht.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ht.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,r){const i=n?n.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===r||!(o=o.nextSibling)););else{Qi.innerHTML=Ec(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Qi.content;if(s==="svg"||s==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Xt="transition",Yn="animation",bs=Symbol("_vtc"),Ac={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Pf=Ie({},Wa,Ac),Of=e=>(e.displayName="Transition",e.props=Pf,e),Rc=Of((e,{slots:t})=>vs(Cd,Df(e),t)),hn=(e,t=[])=>{J(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ji=e=>e?J(e)?e.some(t=>t.length>1):e.length>1:!1;function Df(e){const t={};for(const q in e)q in Ac||(t[q]=e[q]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=r,appearActiveClass:d=i,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:y=`${n}-leave-to`}=e,b=Nf(o),v=b&&b[0],h=b&&b[1],{onBeforeEnter:E,onEnter:C,onEnterCancelled:S,onLeave:R,onLeaveCancelled:L,onBeforeAppear:T=E,onAppear:U=C,onAppearCancelled:ae=S}=t,z=(q,oe,_e,Me)=>{q._enterCancelled=Me,mn(q,oe?c:l),mn(q,oe?d:i),_e&&_e()},ne=(q,oe)=>{q._isLeaving=!1,mn(q,f),mn(q,y),mn(q,m),oe&&oe()},ge=q=>(oe,_e)=>{const Me=q?U:C,re=()=>z(oe,q,_e);hn(Me,[oe,re]),Yi(()=>{mn(oe,q?a:r),Ft(oe,q?c:l),Ji(Me)||Xi(oe,s,v,re)})};return Ie(t,{onBeforeEnter(q){hn(E,[q]),Ft(q,r),Ft(q,i)},onBeforeAppear(q){hn(T,[q]),Ft(q,a),Ft(q,d)},onEnter:ge(!1),onAppear:ge(!0),onLeave(q,oe){q._isLeaving=!0;const _e=()=>ne(q,oe);Ft(q,f),q._enterCancelled?(Ft(q,m),tl(q)):(tl(q),Ft(q,m)),Yi(()=>{q._isLeaving&&(mn(q,f),Ft(q,y),Ji(R)||Xi(q,s,h,_e))}),hn(R,[q,_e])},onEnterCancelled(q){z(q,!1,void 0,!0),hn(S,[q])},onAppearCancelled(q){z(q,!0,void 0,!0),hn(ae,[q])},onLeaveCancelled(q){ne(q),hn(L,[q])}})}function Nf(e){if(e==null)return null;if(me(e))return[Zo(e.enter),Zo(e.leave)];{const t=Zo(e);return[t,t]}}function Zo(e){return Mu(e)}function Ft(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[bs]||(e[bs]=new Set)).add(t)}function mn(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[bs];n&&(n.delete(t),n.size||(e[bs]=void 0))}function Yi(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let If=0;function Xi(e,t,n,s){const o=e._endId=++If,r=()=>{o===e._endId&&s()};if(n!=null)return setTimeout(r,n);const{type:i,timeout:l,propCount:a}=$f(e,t);if(!i)return s();const d=i+"end";let c=0;const f=()=>{e.removeEventListener(d,m),r()},m=y=>{y.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[b]||"").split(", "),o=s(`${Xt}Delay`),r=s(`${Xt}Duration`),i=Zi(o,r),l=s(`${Yn}Delay`),a=s(`${Yn}Duration`),d=Zi(l,a);let c=null,f=0,m=0;t===Xt?i>0&&(c=Xt,f=i,m=r.length):t===Yn?d>0&&(c=Yn,f=d,m=a.length):(f=Math.max(i,d),c=f>0?i>d?Xt:Yn:null,m=c?c===Xt?r.length:a.length:0);const y=c===Xt&&/\b(?:transform|all)(?:,|$)/.test(s(`${Xt}Property`).toString());return{type:c,timeout:f,propCount:m,hasTransform:y}}function Zi(e,t){for(;e.lengthel(n)+el(e[s])))}function el(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function tl(e){return(e?e.ownerDocument:document).body.offsetHeight}function Lf(e,t,n){const s=e[bs];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const nl=Symbol("_vod"),Mf=Symbol("_vsh"),Uf=Symbol(""),Ff=/(?:^|;)\s*display\s*:/;function Bf(e,t,n){const s=e.style,o=Ce(n);let r=!1;if(n&&!o){if(t)if(Ce(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Js(s,l,"")}else for(const i in t)n[i]==null&&Js(s,i,"");for(const i in n)i==="display"&&(r=!0),Js(s,i,n[i])}else if(o){if(t!==n){const i=s[Uf];i&&(n+=";"+i),s.cssText=n,r=Ff.test(n)}}else t&&e.removeAttribute("style");nl in e&&(e[nl]=r?s.display:"",e[Mf]&&(s.display="none"))}const sl=/\s*!important$/;function Js(e,t,n){if(J(n))n.forEach(s=>Js(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Hf(e,t);sl.test(n)?e.setProperty(dn(s),n.replace(sl,""),"important"):e[s]=n}}const ol=["Webkit","Moz","ms"],er={};function Hf(e,t){const n=er[t];if(n)return n;let s=ht(t);if(s!=="filter"&&s in e)return er[t]=s;s=_o(s);for(let o=0;otr||(Kf.then(()=>tr=0),tr=Date.now());function zf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;_t(Gf(s,n.value),t,5,[s])};return n.value=e,n.attached=Wf(),n}function Gf(e,t){if(J(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const ul=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Qf=(e,t,n,s,o,r)=>{const i=o==="svg";t==="class"?Lf(e,s,i):t==="style"?Bf(e,n,s):vo(t)?qr(t)||qf(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Jf(e,t,s,i))?(ll(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&il(e,t,s,i,r,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Ce(s))?ll(e,ht(t),s,r,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),il(e,t,s,i))};function Jf(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ul(t)&&te(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ul(t)&&Ce(n)?!1:t in e}const Mn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return J(t)?n=>Ws(t,n):t};function Yf(e){e.target.composing=!0}function dl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Wt=Symbol("_assign");function fl(e,t,n){return t&&(e=e.trim()),n&&(e=xo(e)),e}const ft={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e[Wt]=Mn(o);const r=s||o.props&&o.props.type==="number";on(e,t?"change":"input",i=>{i.target.composing||e[Wt](fl(e.value,n,r))}),(n||r)&&on(e,"change",()=>{e.value=fl(e.value,n,r)}),t||(on(e,"compositionstart",Yf),on(e,"compositionend",dl),on(e,"change",dl))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:o,number:r}},i){if(e[Wt]=Mn(i),e.composing)return;const l=(r||e.type==="number")&&!/^0\d/.test(e.value)?xo(e.value):e.value,a=t??"";l!==a&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||o&&e.value.trim()===a)||(e.value=a))}},Zt={deep:!0,created(e,t,n){e[Wt]=Mn(n),on(e,"change",()=>{const s=e._modelValue,o=_s(e),r=e.checked,i=e[Wt];if(J(s)){const l=Wr(s,o),a=l!==-1;if(r&&!a)i(s.concat(o));else if(!r&&a){const d=[...s];d.splice(l,1),i(d)}}else if(qn(s)){const l=new Set(s);r?l.add(o):l.delete(o),i(l)}else i(Cc(e,r))})},mounted:pl,beforeUpdate(e,t,n){e[Wt]=Mn(n),pl(e,t,n)}};function pl(e,{value:t,oldValue:n},s){e._modelValue=t;let o;if(J(t))o=Wr(t,s.props.value)>-1;else if(qn(t))o=t.has(s.props.value);else{if(t===n)return;o=Vn(t,Cc(e,!0))}e.checked!==o&&(e.checked=o)}const Ys={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const o=qn(t);on(e,"change",()=>{const r=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?xo(_s(i)):_s(i));e[Wt](e.multiple?o?new Set(r):r:r[0]),e._assigning=!0,ei(()=>{e._assigning=!1})}),e[Wt]=Mn(s)},mounted(e,{value:t}){hl(e,t)},beforeUpdate(e,t,n){e[Wt]=Mn(n)},updated(e,{value:t}){e._assigning||hl(e,t)}};function hl(e,t){const n=e.multiple,s=J(t);if(!(n&&!s&&!qn(t))){for(let o=0,r=e.options.length;oString(d)===String(l)):i.selected=Wr(t,l)>-1}else i.selected=t.has(l);else if(Vn(_s(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function _s(e){return"_value"in e?e._value:e.value}function Cc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Xf=["ctrl","shift","alt","meta"],Zf={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Xf.some(n=>e[`${n}Key`]&&!t.includes(n))},ep=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(o,...r)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=o=>{if(!("key"in o))return;const r=dn(o.key);if(t.some(i=>i===r||tp[i]===r))return e(o)})},sp=Ie({patchProp:Qf},Tf);let ml;function op(){return ml||(ml=lf(sp))}const rp=(...e)=>{const t=op().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=lp(s);if(!o)return;const r=t._component;!te(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const i=n(o,!1,ip(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function ip(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function lp(e){return Ce(e)?document.querySelector(e):e}const ap={language:{name:"English"},common:{cancel:"Cancel",save:"Save",close:"Close",delete:"Delete",refresh:"Refresh",download:"Download",unknownArtist:"Unknown artist",unknownTrack:"Unknown track",previousPage:"Previous page",nextPage:"Next page"},nav:{home:"Home",library:"Library",monitor:"Playlist Monitor",queue:"Queue",player:"Player",settings:"Settings",switchToLight:"Switch to light",switchToDark:"Switch to dark"},hero:{noAccount:"no Spotify account needed",tagline:"Your music with full metadata, album art and lyrics — in one click.",songs:"Songs",albums:"Albums",playlists:"Playlists"},search:{placeholder:"Search, paste a Spotify or YouTube Music link…",title:"Search results",matchesFor:"Showing matches for",songsCount:"— {count} song",songsCountPlural:"— {count} songs",typeToBegin:"Type something in the search bar to begin.",error:"Something went wrong.",errorWithDetail:"Something went wrong: {detail}",empty:"No songs found.",emptyHint:"Try another query — artist + title usually works best.",openOnSpotify:"Open on Spotify",inQueue:"In queue",download:"Download",previousPage:"Previous page",nextPage:"Next page"},queue:{title:"Download Queue",subtitle:"Songs you've queued. Progress, status and quick actions live here.",empty:"Nothing queued right now.",emptyHint:"Search for a song and hit download to start.",saveToDevice:"Save to device",removeFromQueue:"Remove from queue",clearAll:"Clear all",clearAllPrompt:"Remove all items from the queue?",forceAudio:"Force audio source",overridePlaceholder:"Paste a YouTube or YouTube Music URL…",applyOverride:"Apply",invalidYouTubeURL:"Invalid YouTube URL"},library:{title:"Library",subtitle:"Music you've already downloaded. Listen, re-download or remove.",empty:"No downloads yet.",emptyHint:"Find a song to start filling your library.",failedLoad:"Failed to load downloads.",failedDelete:"Failed to delete {file}",deletePrompt:'Delete "{file}"?',countOne:"{count} file in your library",countMany:"{count} files in your library",downloadToDevice:"Download to device",deleteFile:"Delete file",play:"Play"},monitor:{title:"Playlist Monitor",subtitle:"Add Spotify playlists to watch. New tracks added to those playlists will be downloaded automatically.",watchNew:"Watch a new playlist",urlPlaceholder:"Paste a Spotify playlist URL…",watch:"Watch",failedAdd:"Failed to add playlist. Check the URL and try again.",empty:"No playlists being monitored yet.",emptyHint:"Paste a Spotify playlist link above to get started.",active:"Active",paused:"Paused",everyInterval:"Every {interval}",tracksOne:"{count} track",tracksMany:"{count} tracks",checked:"Checked {when}",notChecked:"Not checked yet",pause:"Pause monitoring",resume:"Resume monitoring",checkNow:"Check now",stop:"Stop monitoring",deletePrompt:'Stop monitoring "{name}"?',info:"When you add a playlist, Downtify downloads every track it currently contains and then keeps watching it. Any songs added later on Spotify are detected and downloaded automatically on the next scheduled check.",every15:"Every 15 min",every30:"Every 30 min",every1h:"Every hour",every3h:"Every 3 h",every6h:"Every 6 h",every12h:"Every 12 h",every1d:"Every day",every1w:"Every week",every2w:"Every 2 weeks",every1mo:"Every month",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 day",short1w:"1 wk",short2w:"2 wk",short1mo:"1 mo",minSuffix:"min",hourSuffix:"h",daySuffix:"day",daysSuffix:"days",weekSuffix:"week",weeksSuffix:"weeks",monthSuffix:"month",monthsSuffix:"months",timeJustNow:"just now",timeMinAgo:"{n} min ago",timeHourAgo:"{n} h ago",timeDayAgo:"{n} day(s) ago"},settings:{title:"Settings",subtitle:"Tweak how Downtify fetches and tags your music.",audioSource:"Audio sources (fallback order)",audioSourceHint:"Enable one or more. Downtify tries them in order (1, 2, 3) per track. Use slskd then YouTube for playlists.",audioSourceReset:"Use recommended order",lyricsSource:"Lyrics source",lyricsHint:"only lrclib is active",downloadLyrics:"Download lyrics",downloadLyricsHint:"Embed lyrics in audio files and write .lrc sidecar files",lyricsProvider:"Provider",format:"Format",quality:"Quality",qualityIgnored:"ignored (lossless)",playlistsSection:"Playlists",generateM3u:"Generate M3U file for playlists",generateM3uHint:"Writes Playlists/.m3u with absolute file paths (/downloads/... and /slskd/...) for manual downloads and Playlist Monitor sweeps.",syncNavidrome:"Create playlist in Navidrome",syncNavidromeHint:"After a Spotify playlist download finishes, scan the library and create/update a Navidrome playlist with the same name.",navidromeSection:"Navidrome",navidromeHint:"Uses the Subsonic API (same as Explo). Point your music folder in Navidrome at Downtify downloads.",navidromeEnabled:"Enable Navidrome sync",navidromeEnabledHint:"Requires URL, username, and password. Admin account recommended: triggers Subsonic startScan (incremental) before matching tracks, same as Explo.",navidromeUrl:"Navidrome URL (example: https://music.example.com)",navidromeUsername:"Navidrome username",navidromePassword:"Navidrome password",navidromeAdminUser:"Admin username (optional, for library scan)",navidromeAdminPassword:"Admin password (optional)",navidromePublic:"Public playlist in Navidrome",organizationSection:"File organization",organizeByArtist:"Organize by artist",organizeByArtistHint:"Save songs in subfolders named after the artist. Playlist tracks are also placed in their artist's folder instead of a playlist folder.",parallelDownloads:"Parallel downloads",parallelDownloadsHint:"Maximum number of songs downloaded simultaneously. Higher values are faster but use more bandwidth.",saved:"Changes saved",saveError:"Couldn't save settings.",language:"Language",languageHint:"Choose the interface language",slskdSection:"slskd",slskdHint:"Soulseek via slskd. With Navidrome enabled, playlists are built in Navidrome after a library scan — files can stay in the slskd folder.",slskdEnabled:"Enable slskd provider",slskdEnabledHint:"When off, slskd is never attempted in provider fallback.",slskdBaseUrl:"slskd base URL (example: https://slskd.example.com)",slskdApiKey:"slskd API key",slskdSourceDirTitle:"slskd download folder (inside this container)",slskdSourceDirBullet1:"slskd writes completed transfers here (e.g. /slskd → host music/slskd).",slskdSourceDirBullet2:"Navidrome must scan the parent music library that includes this folder.",slskdSourceDirBullet3:"Use the path Downtify sees — not the host path, not the slskd web URL.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads +Downtify: /mnt/storage/music/slskd:/slskd → set /slskd`,slskdSourceDirLabel:"slskd folder path in Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify watches this folder for finished slskd files. No copy into /downloads when leave-in-place is on.",slskdLeaveInPlace:"Leave slskd files in place",slskdLeaveInPlaceHint:"Do not copy into /downloads. Tag in place, register for dedupe, and add tracks to Navidrome playlists via library search (recommended with Navidrome sync).",slskdDownloadTimeout:"Total slskd timeout (seconds)",slskdQueuedTimeout:"Queued / no-progress timeout (seconds)",slskdTimeoutHint:'If slskd does not finish in time, Downtify tries the next audio provider (YouTube). Lower the queued timeout when tracks sit on "Queued on slskd" too long.'},player:{title:"Player",subtitle:"Listen to the music you've downloaded.",empty:"Nothing to play yet",emptyHint:"Download some music to start listening.",queue:"Queue",play:"Play",pause:"Pause",previous:"Previous",next:"Next",shuffle:"Shuffle",shuffleOn:"Shuffle on",shuffleOff:"Shuffle off",repeatOff:"Repeat off",repeatAll:"Repeat all",repeatOne:"Repeat one",volume:"Volume",mute:"Mute",unmute:"Unmute",nowPlaying:"Now playing",upNext:"Up next",playFromLibrary:"Open in player",countOne:"{count} track",countMany:"{count} tracks"},footer:{tagline:"Open source music downloader"}},cp={language:{name:"Español"},common:{cancel:"Cancelar",save:"Guardar",close:"Cerrar",delete:"Eliminar",refresh:"Actualizar",download:"Descargar",unknownArtist:"Artista desconocido",unknownTrack:"Pista desconocida",previousPage:"Página anterior",nextPage:"Página siguiente"},nav:{home:"Inicio",library:"Biblioteca",monitor:"Monitor de listas",queue:"Cola",player:"Reproductor",settings:"Ajustes",switchToLight:"Cambiar a claro",switchToDark:"Cambiar a oscuro"},hero:{noAccount:"sin cuenta de Spotify",tagline:"Tu música con metadatos completos, portada y letras — en un clic.",songs:"Canciones",albums:"Álbumes",playlists:"Listas"},search:{placeholder:"Busca o pega un enlace de Spotify o YouTube Music…",title:"Resultados de búsqueda",matchesFor:"Mostrando coincidencias para",songsCount:"— {count} canción",songsCountPlural:"— {count} canciones",typeToBegin:"Escribe algo en la barra de búsqueda para empezar.",error:"Algo salió mal.",errorWithDetail:"Algo salió mal: {detail}",empty:"No se encontraron canciones.",emptyHint:"Prueba con otra búsqueda — artista + título suele funcionar mejor.",openOnSpotify:"Abrir en Spotify",inQueue:"En la cola",download:"Descargar",previousPage:"Página anterior",nextPage:"Página siguiente"},queue:{title:"Cola de descargas",subtitle:"Canciones que has añadido a la cola. Progreso, estado y acciones rápidas aquí.",empty:"No hay nada en la cola ahora mismo.",emptyHint:"Busca una canción y pulsa descargar para empezar.",saveToDevice:"Guardar en el dispositivo",removeFromQueue:"Quitar de la cola",clearAll:"Limpiar todo",clearAllPrompt:"¿Eliminar todos los elementos de la cola?",forceAudio:"Forzar fuente de audio",overridePlaceholder:"Pega una URL de YouTube o YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL de YouTube no válida"},library:{title:"Biblioteca",subtitle:"Música que ya has descargado. Escucha, descarga otra vez o elimina.",empty:"Aún no hay descargas.",emptyHint:"Encuentra una canción para empezar a llenar tu biblioteca.",failedLoad:"No se pudieron cargar las descargas.",failedDelete:"No se pudo eliminar {file}",deletePrompt:'¿Eliminar "{file}"?',countOne:"{count} archivo en tu biblioteca",countMany:"{count} archivos en tu biblioteca",downloadToDevice:"Descargar al dispositivo",deleteFile:"Eliminar archivo",play:"Reproducir"},monitor:{title:"Monitor de listas",subtitle:"Añade listas de Spotify para vigilar. Las nuevas pistas añadidas a esas listas se descargarán automáticamente.",watchNew:"Vigilar una nueva lista",urlPlaceholder:"Pega una URL de lista de Spotify…",watch:"Vigilar",failedAdd:"No se pudo añadir la lista. Comprueba la URL e inténtalo de nuevo.",empty:"Aún no hay listas vigiladas.",emptyHint:"Pega un enlace de lista de Spotify arriba para empezar.",active:"Activa",paused:"Pausada",everyInterval:"Cada {interval}",tracksOne:"{count} pista",tracksMany:"{count} pistas",checked:"Revisada {when}",notChecked:"Aún no revisada",pause:"Pausar vigilancia",resume:"Reanudar vigilancia",checkNow:"Revisar ahora",stop:"Dejar de vigilar",deletePrompt:'¿Dejar de vigilar "{name}"?',info:"Al añadir una lista, Downtify descarga todas las pistas que contenga en ese momento y la sigue vigilando. Cualquier canción añadida después en Spotify se detecta y descarga automáticamente en la siguiente revisión.",every15:"Cada 15 min",every30:"Cada 30 min",every1h:"Cada hora",every3h:"Cada 3 h",every6h:"Cada 6 h",every12h:"Cada 12 h",every1d:"Cada día",every1w:"Cada semana",every2w:"Cada 2 semanas",every1mo:"Cada mes",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 día",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mes",minSuffix:"min",hourSuffix:"h",daySuffix:"día",daysSuffix:"días",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mes",monthsSuffix:"meses",timeJustNow:"justo ahora",timeMinAgo:"hace {n} min",timeHourAgo:"hace {n} h",timeDayAgo:"hace {n} día(s)"},settings:{title:"Ajustes",subtitle:"Ajusta cómo Downtify descarga y etiqueta tu música.",audioSource:"Fuentes de audio (orden de respaldo)",audioSourceHint:"Activa una o más. Downtify las prueba en orden (1, 2, 3) por pista. Para listas: slskd y luego YouTube.",audioSourceReset:"Usar orden recomendado",lyricsSource:"Fuente de letras",lyricsHint:"solo lrclib está activo",downloadLyrics:"Descargar letras",downloadLyricsHint:"Incrusta letras en los archivos de audio y escribe archivos .lrc",lyricsProvider:"Proveedor",format:"Formato",quality:"Calidad",qualityIgnored:"ignorada (sin pérdidas)",playlistsSection:"Listas",generateM3u:"Generar archivo M3U para las listas",generateM3uHint:"Escribe Playlists/.m3u con rutas absolutas (/downloads/... y /slskd/...) para descargas y el Monitor.",syncNavidrome:"Crear lista en Navidrome",syncNavidromeHint:"Tras descargar una lista de Spotify, escanea la biblioteca y crea/actualiza una lista en Navidrome con el mismo nombre.",navidromeSection:"Navidrome",navidromeHint:"Usa la API Subsonic (como Explo). La carpeta de música en Navidrome debe apuntar a las descargas de Downtify.",navidromeEnabled:"Activar sincronización con Navidrome",navidromeEnabledHint:"Requiere URL, usuario y contraseña. La cuenta admin opcional inicia el escaneo de la biblioteca.",navidromeUrl:"URL de Navidrome (ejemplo: https://musica.ejemplo.com)",navidromeUsername:"Usuario de Navidrome",navidromePassword:"Contraseña de Navidrome",navidromeAdminUser:"Usuario admin (opcional, para escaneo)",navidromeAdminPassword:"Contraseña admin (opcional)",navidromePublic:"Lista pública en Navidrome",organizationSection:"Organización de archivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Guarda las canciones en subcarpetas con el nombre del artista. Las pistas de listas también se guardan en la carpeta del artista en lugar de la carpeta de la lista.",parallelDownloads:"Descargas paralelas",parallelDownloadsHint:"Número máximo de canciones descargadas simultáneamente. Valores más altos son más rápidos pero consumen más ancho de banda.",saved:"Cambios guardados",saveError:"No se pudieron guardar los ajustes.",language:"Idioma",languageHint:"Elige el idioma de la interfaz",slskdSection:"slskd",slskdHint:"Soulseek vía slskd. Con Navidrome activo, las listas se crean allí tras escanear la biblioteca; los archivos pueden quedarse en la carpeta slskd.",slskdEnabled:"Activar proveedor slskd",slskdEnabledHint:"Si está desactivado, slskd nunca se intentará en la cadena de fallback.",slskdBaseUrl:"URL base de slskd (ejemplo: https://slskd.ejemplo.com)",slskdApiKey:"API key de slskd",slskdSourceDirTitle:"Carpeta de descargas de slskd (en este contenedor)",slskdSourceDirBullet1:"slskd escribe aquí las transferencias completadas (ej. /slskd → music/slskd en el host).",slskdSourceDirBullet2:"Navidrome debe escanear la biblioteca que incluye esta carpeta.",slskdSourceDirBullet3:"Ruta que ve Downtify — no la ruta del host ni la URL web de slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads +Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Carpeta slskd en Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify detecta archivos slskd aquí. Sin copia a /downloads si “dejar en sitio” está activo.",slskdLeaveInPlace:"Dejar archivos slskd en su sitio",slskdLeaveInPlaceHint:"No copiar a /downloads. Etiquetar en sitio y añadir a listas de Navidrome tras el escaneo.",slskdDownloadTimeout:"Tiempo máximo slskd (segundos)",slskdQueuedTimeout:"Tiempo en cola sin progreso (segundos)",slskdTimeoutHint:'Si slskd no termina a tiempo, Downtify prueba el siguiente proveedor (YouTube). Baja el tiempo en cola si se queda en "Queued on slskd".'},player:{title:"Reproductor",subtitle:"Escucha la música que has descargado.",empty:"Nada que reproducir aún",emptyHint:"Descarga música para empezar a escuchar.",queue:"Cola",play:"Reproducir",pause:"Pausar",previous:"Anterior",next:"Siguiente",shuffle:"Aleatorio",shuffleOn:"Aleatorio activado",shuffleOff:"Aleatorio desactivado",repeatOff:"Repetición desactivada",repeatAll:"Repetir todo",repeatOne:"Repetir una",volume:"Volumen",mute:"Silenciar",unmute:"Activar sonido",nowPlaying:"Sonando ahora",upNext:"A continuación",playFromLibrary:"Abrir en el reproductor",countOne:"{count} pista",countMany:"{count} pistas"},footer:{tagline:"Descargador de música de código abierto"}},up={language:{name:"Português (BR)"},common:{cancel:"Cancelar",save:"Salvar",close:"Fechar",delete:"Excluir",refresh:"Atualizar",download:"Baixar",unknownArtist:"Artista desconhecido",unknownTrack:"Faixa desconhecida",previousPage:"Página anterior",nextPage:"Próxima página"},nav:{home:"Início",library:"Biblioteca",monitor:"Monitor de playlists",queue:"Fila",player:"Player",settings:"Configurações",switchToLight:"Mudar para claro",switchToDark:"Mudar para escuro"},hero:{noAccount:"sem precisar de conta no Spotify",tagline:"Sua música com metadados completos, capa do álbum e letras — em um clique.",songs:"Músicas",albums:"Álbuns",playlists:"Playlists"},search:{placeholder:"Busque uma música ou cole um link do Spotify ou YouTube Music…",title:"Resultados da busca",matchesFor:"Mostrando resultados para",songsCount:"— {count} música",songsCountPlural:"— {count} músicas",typeToBegin:"Digite algo na barra de busca para começar.",error:"Algo deu errado.",errorWithDetail:"Algo deu errado: {detail}",empty:"Nenhuma música encontrada.",emptyHint:"Tente outra busca — artista + título costuma funcionar melhor.",openOnSpotify:"Abrir no Spotify",inQueue:"Na fila",download:"Baixar",previousPage:"Página anterior",nextPage:"Próxima página"},queue:{title:"Fila de download",subtitle:"Músicas que você adicionou à fila. Progresso, status e ações rápidas ficam aqui.",empty:"Nada na fila no momento.",emptyHint:"Procure uma música e clique em baixar para começar.",saveToDevice:"Salvar no dispositivo",removeFromQueue:"Remover da fila",clearAll:"Limpar tudo",clearAllPrompt:"Remover todos os itens da fila?",forceAudio:"Forçar fonte de áudio",overridePlaceholder:"Cole uma URL do YouTube ou YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL do YouTube inválida"},library:{title:"Biblioteca",subtitle:"Músicas que você já baixou. Escute, baixe novamente ou remova.",empty:"Nenhum download ainda.",emptyHint:"Encontre uma música para começar a montar sua biblioteca.",failedLoad:"Falha ao carregar os downloads.",failedDelete:"Falha ao excluir {file}",deletePrompt:'Excluir "{file}"?',countOne:"{count} arquivo na sua biblioteca",countMany:"{count} arquivos na sua biblioteca",downloadToDevice:"Baixar para o dispositivo",deleteFile:"Excluir arquivo",play:"Reproduzir"},monitor:{title:"Monitor de playlists",subtitle:"Adicione playlists do Spotify para monitorar. Novas faixas adicionadas a essas playlists serão baixadas automaticamente.",watchNew:"Monitorar uma nova playlist",urlPlaceholder:"Cole uma URL de playlist do Spotify…",watch:"Monitorar",failedAdd:"Falha ao adicionar a playlist. Verifique a URL e tente novamente.",empty:"Nenhuma playlist sendo monitorada ainda.",emptyHint:"Cole um link de playlist do Spotify acima para começar.",active:"Ativa",paused:"Pausada",everyInterval:"A cada {interval}",tracksOne:"{count} faixa",tracksMany:"{count} faixas",checked:"Verificada {when}",notChecked:"Ainda não verificada",pause:"Pausar monitoramento",resume:"Retomar monitoramento",checkNow:"Verificar agora",stop:"Parar de monitorar",deletePrompt:'Parar de monitorar "{name}"?',info:"Quando você adiciona uma playlist, o Downtify baixa todas as faixas atuais dela e segue monitorando. Qualquer música adicionada depois no Spotify é detectada e baixada automaticamente na próxima verificação.",every15:"A cada 15 min",every30:"A cada 30 min",every1h:"A cada hora",every3h:"A cada 3 h",every6h:"A cada 6 h",every12h:"A cada 12 h",every1d:"Todo dia",every1w:"Toda semana",every2w:"A cada 2 semanas",every1mo:"Todo mês",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 dia",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mês",minSuffix:"min",hourSuffix:"h",daySuffix:"dia",daysSuffix:"dias",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mês",monthsSuffix:"meses",timeJustNow:"agora mesmo",timeMinAgo:"há {n} min",timeHourAgo:"há {n} h",timeDayAgo:"há {n} dia(s)"},settings:{title:"Configurações",subtitle:"Ajuste como o Downtify baixa e marca suas músicas.",audioSource:"Fontes de áudio (ordem de fallback)",audioSourceHint:"Ative uma ou mais. O Downtify tenta na ordem (1, 2, 3) por faixa. Para playlists: slskd e depois YouTube.",audioSourceReset:"Usar ordem recomendada",lyricsSource:"Fonte de letras",lyricsHint:"apenas o lrclib está ativo",downloadLyrics:"Baixar letras",downloadLyricsHint:"Incorpora letras nos arquivos de áudio e grava arquivos .lrc",lyricsProvider:"Provedor",format:"Formato",quality:"Qualidade",qualityIgnored:"ignorada (sem perdas)",playlistsSection:"Playlists",generateM3u:"Gerar arquivo M3U para playlists",generateM3uHint:"Grava Playlists/.m3u com caminhos absolutos (/downloads/... e /slskd/...) para downloads e o Monitor.",syncNavidrome:"Criar playlist no Navidrome",syncNavidromeHint:"Depois de baixar uma playlist do Spotify, escaneia a biblioteca e cria/atualiza uma playlist no Navidrome com o mesmo nome.",navidromeSection:"Navidrome",navidromeHint:"Usa a API Subsonic (como o Explo). A pasta de música no Navidrome deve apontar para os downloads do Downtify.",navidromeEnabled:"Ativar sincronização com Navidrome",navidromeEnabledHint:"Exige URL, usuário e senha. Conta admin opcional dispara varredura da biblioteca.",navidromeUrl:"URL do Navidrome (exemplo: https://musica.exemplo.com)",navidromeUsername:"Usuário do Navidrome",navidromePassword:"Senha do Navidrome",navidromeAdminUser:"Usuário admin (opcional, para varredura)",navidromeAdminPassword:"Senha admin (opcional)",navidromePublic:"Playlist pública no Navidrome",organizationSection:"Organização de arquivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Salva as músicas em subpastas com o nome do artista. Músicas de playlists também são salvas na pasta do artista, não na pasta da playlist.",parallelDownloads:"Downloads paralelos",parallelDownloadsHint:"Número máximo de músicas baixadas ao mesmo tempo. Valores maiores são mais rápidos, mas consomem mais banda.",saved:"Alterações salvas",saveError:"Não foi possível salvar as configurações.",language:"Idioma",languageHint:"Escolha o idioma da interface",slskdSection:"slskd",slskdHint:"Soulseek via slskd. Com Navidrome ativo, playlists são criadas lá após varrer a biblioteca; arquivos podem ficar na pasta do slskd.",slskdEnabled:"Ativar provedor slskd",slskdEnabledHint:"Quando desativado, o slskd nunca é tentado na cadeia de fallback.",slskdBaseUrl:"URL base do slskd (exemplo: https://slskd.exemplo.com)",slskdApiKey:"API key do slskd",slskdSourceDirTitle:"Pasta de download do slskd (neste container)",slskdSourceDirBullet1:"O slskd grava transferências concluídas aqui (ex.: /slskd → music/slskd no host).",slskdSourceDirBullet2:"O Navidrome deve varrer a biblioteca que inclui esta pasta.",slskdSourceDirBullet3:"Caminho visto pelo Downtify — não o caminho do host nem a URL do slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads +Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Pasta slskd no Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"O Downtify observa esta pasta. Sem cópia para /downloads com “deixar no lugar” ativo.",slskdLeaveInPlace:"Deixar arquivos do slskd no lugar",slskdLeaveInPlaceHint:"Não copiar para /downloads. Taguear no lugar e montar playlists no Navidrome após o scan.",slskdDownloadTimeout:"Tempo máximo slskd (segundos)",slskdQueuedTimeout:"Tempo na fila sem progresso (segundos)",slskdTimeoutHint:'Se o slskd não terminar a tempo, o Downtify tenta o próximo provedor (YouTube). Reduza o tempo na fila se ficar em "Queued on slskd".'},player:{title:"Player",subtitle:"Ouça as músicas que você baixou.",empty:"Nada para tocar ainda",emptyHint:"Baixe alguma música para começar a ouvir.",queue:"Fila",play:"Reproduzir",pause:"Pausar",previous:"Anterior",next:"Próxima",shuffle:"Aleatório",shuffleOn:"Aleatório ligado",shuffleOff:"Aleatório desligado",repeatOff:"Repetição desligada",repeatAll:"Repetir tudo",repeatOne:"Repetir uma",volume:"Volume",mute:"Mudo",unmute:"Tirar mudo",nowPlaying:"Tocando agora",upNext:"A seguir",playFromLibrary:"Abrir no player",countOne:"{count} faixa",countMany:"{count} faixas"},footer:{tagline:"Baixador de músicas de código aberto"}},xs=[{code:"en",name:"English",messages:ap},{code:"es",name:"Español",messages:cp},{code:"pt-BR",name:"Português (BR)",messages:up}],ho="en",Tc="downtify-locale",gl=(()=>{try{return localStorage.getItem(Tc)}catch{return null}})(),dp=xs.find(e=>e.code===gl)?gl:ho,Oo=ee(dp);function yl(e){return xs.find(t=>t.code===e)||xs.find(t=>t.code===ho)}function vl(e,t){if(!e)return;const n=t.split(".");let s=e;for(const o of n){if(s==null||typeof s!="object")return;s=s[o]}return typeof s=="string"?s:void 0}function fp(e,t){return t?e.replace(/\{(\w+)\}/g,(n,s)=>t[s]!==void 0&&t[s]!==null?String(t[s]):`{${s}}`):e}function pp(e,t){const n=Oo.value;let s=vl(yl(n).messages,e);return s===void 0&&n!==ho&&(s=vl(yl(ho).messages,e)),fp(s!==void 0?s:e,t)}function hp(e){if(xs.find(t=>t.code===e)){Oo.value=e;try{localStorage.setItem(Tc,e)}catch{}typeof document<"u"&&document.documentElement.setAttribute("lang",e)}}function wt(){return{t:pp,locale:Oo,setLocale:hp,locales:xs}}typeof document<"u"&&document.documentElement.setAttribute("lang",Oo.value);const mp={class:"mt-auto px-6 py-6 text-center text-sm text-base-content/60"},gp={__name:"Footer",setup(e){const{t}=wt();return(n,s)=>(A(),P("footer",mp,[s[0]||(s[0]=p("a",{class:"font-semibold text-primary hover:underline",href:"https://github.com/henriquesebastiao/downtify",target:"_blank",rel:"noopener"},"Downtify",-1)),s[1]||(s[1]=p("span",{class:"mx-2 opacity-50"},"·",-1)),p("span",null,w(u(t)("footer.tagline")),1)]))}},Pc=/^[a-z0-9]+(-[a-z0-9]+)*$/,Do=(e,t,n,s="")=>{const o=e.split(":");if(e.slice(0,1)==="@"){if(o.length<2||o.length>3)return null;s=o.shift().slice(1)}if(o.length>3||!o.length)return null;if(o.length>1){const l=o.pop(),a=o.pop(),d={provider:o.length>0?o[0]:s,prefix:a,name:l};return t&&!Xs(d)?null:d}const r=o[0],i=r.split("-");if(i.length>1){const l={provider:s,prefix:i.shift(),name:i.join("-")};return t&&!Xs(l)?null:l}if(n&&s===""){const l={provider:s,prefix:"",name:r};return t&&!Xs(l,n)?null:l}return null},Xs=(e,t)=>e?!!((t&&e.prefix===""||e.prefix)&&e.name):!1,Oc=Object.freeze({left:0,top:0,width:16,height:16}),mo=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),No=Object.freeze({...Oc,...mo}),Cr=Object.freeze({...No,body:"",hidden:!1});function yp(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const s=((e.rotate||0)+(t.rotate||0))%4;return s&&(n.rotate=s),n}function bl(e,t){const n=yp(e,t);for(const s in Cr)s in mo?s in e&&!(s in n)&&(n[s]=mo[s]):s in t?n[s]=t[s]:s in e&&(n[s]=e[s]);return n}function vp(e,t){const n=e.icons,s=e.aliases||Object.create(null),o=Object.create(null);function r(i){if(n[i])return o[i]=[];if(!(i in o)){o[i]=null;const l=s[i]&&s[i].parent,a=l&&r(l);a&&(o[i]=[l].concat(a))}return o[i]}return Object.keys(n).concat(Object.keys(s)).forEach(r),o}function bp(e,t,n){const s=e.icons,o=e.aliases||Object.create(null);let r={};function i(l){r=bl(s[l]||o[l],r)}return i(t),n.forEach(i),bl(e,r)}function Dc(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(o=>{t(o,null),n.push(o)});const s=vp(e);for(const o in s){const r=s[o];r&&(t(o,bp(e,o,r)),n.push(o))}return n}const _p={provider:"",aliases:{},not_found:{},...Oc};function nr(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function Nc(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!nr(e,_p))return null;const n=t.icons;for(const o in n){const r=n[o];if(!o||typeof r.body!="string"||!nr(r,Cr))return null}const s=t.aliases||Object.create(null);for(const o in s){const r=s[o],i=r.parent;if(!o||typeof i!="string"||!n[i]&&!s[i]||!nr(r,Cr))return null}return t}const _l=Object.create(null);function xp(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function Un(e,t){const n=_l[e]||(_l[e]=Object.create(null));return n[t]||(n[t]=xp(e,t))}function Ic(e,t){return Nc(t)?Dc(t,(n,s)=>{s?e.icons[n]=s:e.missing.add(n)}):[]}function wp(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let ws=!1;function $c(e){return typeof e=="boolean"&&(ws=e),ws}function kp(e){const t=typeof e=="string"?Do(e,!0,ws):e;if(t){const n=Un(t.provider,t.prefix),s=t.name;return n.icons[s]||(n.missing.has(s)?null:void 0)}}function Sp(e,t){const n=Do(e,!0,ws);if(!n)return!1;const s=Un(n.provider,n.prefix);return t?wp(s,n.name,t):(s.missing.add(n.name),!0)}function Ep(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),ws&&!t&&!e.prefix){let o=!1;return Nc(e)&&(e.prefix="",Dc(e,(r,i)=>{Sp(r,i)&&(o=!0)})),o}const n=e.prefix;if(!Xs({prefix:n,name:"a"}))return!1;const s=Un(t,n);return!!Ic(s,e)}const Lc=Object.freeze({width:null,height:null}),Mc=Object.freeze({...Lc,...mo}),Ap=/(-?[0-9.]*[0-9]+[0-9.]*)/g,Rp=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function xl(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const s=e.split(Ap);if(s===null||!s.length)return e;const o=[];let r=s.shift(),i=Rp.test(r);for(;;){if(i){const l=parseFloat(r);isNaN(l)?o.push(r):o.push(Math.ceil(l*t*n)/n)}else o.push(r);if(r=s.shift(),r===void 0)return o.join("");i=!i}}function Cp(e,t="defs"){let n="";const s=e.indexOf("<"+t);for(;s>=0;){const o=e.indexOf(">",s),r=e.indexOf("",r);if(i===-1)break;n+=e.slice(o+1,r).trim(),e=e.slice(0,s).trim()+e.slice(i+1)}return{defs:n,content:e}}function Tp(e,t){return e?""+e+""+t:t}function Pp(e,t,n){const s=Cp(e);return Tp(s.defs,t+s.content+n)}const Op=e=>e==="unset"||e==="undefined"||e==="none";function Dp(e,t){const n={...No,...e},s={...Mc,...t},o={left:n.left,top:n.top,width:n.width,height:n.height};let r=n.body;[n,s].forEach(v=>{const h=[],E=v.hFlip,C=v.vFlip;let S=v.rotate;E?C?S+=2:(h.push("translate("+(o.width+o.left).toString()+" "+(0-o.top).toString()+")"),h.push("scale(-1 1)"),o.top=o.left=0):C&&(h.push("translate("+(0-o.left).toString()+" "+(o.height+o.top).toString()+")"),h.push("scale(1 -1)"),o.top=o.left=0);let R;switch(S<0&&(S-=Math.floor(S/4)*4),S=S%4,S){case 1:R=o.height/2+o.top,h.unshift("rotate(90 "+R.toString()+" "+R.toString()+")");break;case 2:h.unshift("rotate(180 "+(o.width/2+o.left).toString()+" "+(o.height/2+o.top).toString()+")");break;case 3:R=o.width/2+o.left,h.unshift("rotate(-90 "+R.toString()+" "+R.toString()+")");break}S%2===1&&(o.left!==o.top&&(R=o.left,o.left=o.top,o.top=R),o.width!==o.height&&(R=o.width,o.width=o.height,o.height=R)),h.length&&(r=Pp(r,'',""))});const i=s.width,l=s.height,a=o.width,d=o.height;let c,f;i===null?(f=l===null?"1em":l==="auto"?d:l,c=xl(f,a/d)):(c=i==="auto"?a:i,f=l===null?xl(c,d/a):l==="auto"?d:l);const m={},y=(v,h)=>{Op(h)||(m[v]=h.toString())};y("width",c),y("height",f);const b=[o.left,o.top,a,d];return m.viewBox=b.join(" "),{attributes:m,viewBox:b,body:r}}const Np=/\sid="(\S+)"/g,Ip="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let $p=0;function Lp(e,t=Ip){const n=[];let s;for(;s=Np.exec(e);)n.push(s[1]);if(!n.length)return e;const o="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(r=>{const i=typeof t=="function"?t(r):t+($p++).toString(),l=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+i+o+"$3")}),e=e.replace(new RegExp(o,"g"),""),e}const Tr=Object.create(null);function Mp(e,t){Tr[e]=t}function Pr(e){return Tr[e]||Tr[""]}function ci(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const ui=Object.create(null),Xn=["https://api.simplesvg.com","https://api.unisvg.com"],Zs=[];for(;Xn.length>0;)Xn.length===1||Math.random()>.5?Zs.push(Xn.shift()):Zs.push(Xn.pop());ui[""]=ci({resources:["https://api.iconify.design"].concat(Zs)});function Up(e,t){const n=ci(t);return n===null?!1:(ui[e]=n,!0)}function di(e){return ui[e]}const Fp=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let wl=Fp();function Bp(e,t){const n=di(e);if(!n)return 0;let s;if(!n.maxURL)s=0;else{let o=0;n.resources.forEach(i=>{o=Math.max(o,i.length)});const r=t+".json?icons=";s=n.maxURL-o-n.path.length-r.length}return s}function Hp(e){return e===404}const jp=(e,t,n)=>{const s=[],o=Bp(e,t),r="icons";let i={type:r,provider:e,prefix:t,icons:[]},l=0;return n.forEach((a,d)=>{l+=a.length+1,l>=o&&d>0&&(s.push(i),i={type:r,provider:e,prefix:t,icons:[]},l=a.length),i.icons.push(a)}),s.push(i),s};function qp(e){if(typeof e=="string"){const t=di(e);if(t)return t.path}return"/"}const Vp=(e,t,n)=>{if(!wl){n("abort",424);return}let s=qp(t.provider);switch(t.type){case"icons":{const r=t.prefix,l=t.icons.join(","),a=new URLSearchParams({icons:l});s+=r+".json?"+a.toString();break}case"custom":{const r=t.uri;s+=r.slice(0,1)==="/"?r.slice(1):r;break}default:n("abort",400);return}let o=503;wl(e+s).then(r=>{const i=r.status;if(i!==200){setTimeout(()=>{n(Hp(i)?"abort":"next",i)});return}return o=501,r.json()}).then(r=>{if(typeof r!="object"||r===null){setTimeout(()=>{r===404?n("abort",r):n("next",o)});return}setTimeout(()=>{n("success",r)})}).catch(()=>{n("next",o)})},Kp={prepare:jp,send:Vp};function Wp(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((o,r)=>o.provider!==r.provider?o.provider.localeCompare(r.provider):o.prefix!==r.prefix?o.prefix.localeCompare(r.prefix):o.name.localeCompare(r.name));let s={provider:"",prefix:"",name:""};return e.forEach(o=>{if(s.name===o.name&&s.prefix===o.prefix&&s.provider===o.provider)return;s=o;const r=o.provider,i=o.prefix,l=o.name,a=n[r]||(n[r]=Object.create(null)),d=a[i]||(a[i]=Un(r,i));let c;l in d.icons?c=t.loaded:i===""||d.missing.has(l)?c=t.missing:c=t.pending;const f={provider:r,prefix:i,name:l};c.push(f)}),t}function Uc(e,t){e.forEach(n=>{const s=n.loaderCallbacks;s&&(n.loaderCallbacks=s.filter(o=>o.id!==t))})}function zp(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const s=e.provider,o=e.prefix;t.forEach(r=>{const i=r.icons,l=i.pending.length;i.pending=i.pending.filter(a=>{if(a.prefix!==o)return!0;const d=a.name;if(e.icons[d])i.loaded.push({provider:s,prefix:o,name:d});else if(e.missing.has(d))i.missing.push({provider:s,prefix:o,name:d});else return n=!0,!0;return!1}),i.pending.length!==l&&(n||Uc([e],r.id),r.callback(i.loaded.slice(0),i.missing.slice(0),i.pending.slice(0),r.abort))})}))}let Gp=0;function Qp(e,t,n){const s=Gp++,o=Uc.bind(null,n,s);if(!t.pending.length)return o;const r={id:s,icons:t,callback:e,abort:o};return n.forEach(i=>{(i.loaderCallbacks||(i.loaderCallbacks=[])).push(r)}),o}function Jp(e,t=!0,n=!1){const s=[];return e.forEach(o=>{const r=typeof o=="string"?Do(o,t,n):o;r&&s.push(r)}),s}var Yp={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function Xp(e,t,n,s){const o=e.resources.length,r=e.random?Math.floor(Math.random()*o):e.index;let i;if(e.random){let T=e.resources.slice(0);for(i=[];T.length>1;){const U=Math.floor(Math.random()*T.length);i.push(T[U]),T=T.slice(0,U).concat(T.slice(U+1))}i=i.concat(T)}else i=e.resources.slice(r).concat(e.resources.slice(0,r));const l=Date.now();let a="pending",d=0,c,f=null,m=[],y=[];typeof s=="function"&&y.push(s);function b(){f&&(clearTimeout(f),f=null)}function v(){a==="pending"&&(a="aborted"),b(),m.forEach(T=>{T.status==="pending"&&(T.status="aborted")}),m=[]}function h(T,U){U&&(y=[]),typeof T=="function"&&y.push(T)}function E(){return{startTime:l,payload:t,status:a,queriesSent:d,queriesPending:m.length,subscribe:h,abort:v}}function C(){a="failed",y.forEach(T=>{T(void 0,c)})}function S(){m.forEach(T=>{T.status==="pending"&&(T.status="aborted")}),m=[]}function R(T,U,ae){const z=U!=="success";switch(m=m.filter(ne=>ne!==T),a){case"pending":break;case"failed":if(z||!e.dataAfterTimeout)return;break;default:return}if(U==="abort"){c=ae,C();return}if(z){c=ae,m.length||(i.length?L():C());return}if(b(),S(),!e.random){const ne=e.resources.indexOf(T.resource);ne!==-1&&ne!==e.index&&(e.index=ne)}a="completed",y.forEach(ne=>{ne(ae)})}function L(){if(a!=="pending")return;b();const T=i.shift();if(T===void 0){if(m.length){f=setTimeout(()=>{b(),a==="pending"&&(S(),C())},e.timeout);return}C();return}const U={status:"pending",resource:T,callback:(ae,z)=>{R(U,ae,z)}};m.push(U),d++,f=setTimeout(L,e.rotate),n(T,t,U.callback)}return setTimeout(L),E}function Fc(e){const t={...Yp,...e};let n=[];function s(){n=n.filter(l=>l().status==="pending")}function o(l,a,d){const c=Xp(t,l,a,(f,m)=>{s(),d&&d(f,m)});return n.push(c),c}function r(l){return n.find(a=>l(a))||null}return{query:o,find:r,setIndex:l=>{t.index=l},getIndex:()=>t.index,cleanup:s}}function kl(){}const sr=Object.create(null);function Zp(e){if(!sr[e]){const t=di(e);if(!t)return;const n=Fc(t),s={config:t,redundancy:n};sr[e]=s}return sr[e]}function eh(e,t,n){let s,o;if(typeof e=="string"){const r=Pr(e);if(!r)return n(void 0,424),kl;o=r.send;const i=Zp(e);i&&(s=i.redundancy)}else{const r=ci(e);if(r){s=Fc(r);const i=e.resources?e.resources[0]:"",l=Pr(i);l&&(o=l.send)}}return!s||!o?(n(void 0,424),kl):s.query(t,o,n)().abort}function Sl(){}function th(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,zp(e)}))}function nh(e){const t=[],n=[];return e.forEach(s=>{(s.match(Pc)?t:n).push(s)}),{valid:t,invalid:n}}function Zn(e,t,n){function s(){const o=e.pendingIcons;t.forEach(r=>{o&&o.delete(r),e.icons[r]||e.missing.add(r)})}if(n&&typeof n=="object")try{if(!Ic(e,n).length){s();return}}catch(o){console.error(o)}s(),th(e)}function El(e,t){e instanceof Promise?e.then(n=>{t(n)}).catch(()=>{t(null)}):t(e)}function sh(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:s}=e,o=e.iconsToLoad;if(delete e.iconsToLoad,!o||!o.length)return;const r=e.loadIcon;if(e.loadIcons&&(o.length>1||!r)){El(e.loadIcons(o,s,n),c=>{Zn(e,o,c)});return}if(r){o.forEach(c=>{const f=r(c,s,n);El(f,m=>{const y=m?{prefix:s,icons:{[c]:m}}:null;Zn(e,[c],y)})});return}const{valid:i,invalid:l}=nh(o);if(l.length&&Zn(e,l,null),!i.length)return;const a=s.match(Pc)?Pr(n):null;if(!a){Zn(e,i,null);return}a.prepare(n,s,i).forEach(c=>{eh(n,c,f=>{Zn(e,c.icons,f)})})}))}const oh=(e,t)=>{const n=Jp(e,!0,$c()),s=Wp(n);if(!s.pending.length){let a=!0;return t&&setTimeout(()=>{a&&t(s.loaded,s.missing,s.pending,Sl)}),()=>{a=!1}}const o=Object.create(null),r=[];let i,l;return s.pending.forEach(a=>{const{provider:d,prefix:c}=a;if(c===l&&d===i)return;i=d,l=c,r.push(Un(d,c));const f=o[d]||(o[d]=Object.create(null));f[c]||(f[c]=[])}),s.pending.forEach(a=>{const{provider:d,prefix:c,name:f}=a,m=Un(d,c),y=m.pendingIcons||(m.pendingIcons=new Set);y.has(f)||(y.add(f),o[d][c].push(f))}),r.forEach(a=>{const d=o[a.provider][a.prefix];d.length&&sh(a,d)}),t?Qp(t,s,r):Sl};function rh(e,t){const n={...e};for(const s in t){const o=t[s],r=typeof o;s in Lc?(o===null||o&&(r==="string"||r==="number"))&&(n[s]=o):r===typeof n[s]&&(n[s]=s==="rotate"?o%4:o)}return n}const ih=/[\s,]+/;function lh(e,t){t.split(ih).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function ah(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function s(o){for(;o<0;)o+=4;return o%4}if(n===""){const o=parseInt(e);return isNaN(o)?0:s(o)}else if(n!==e){let o=0;switch(n){case"%":o=25;break;case"deg":o=90}if(o){let r=parseFloat(e.slice(0,e.length-n.length));return isNaN(r)?0:(r=r/o,r%1===0?s(r):0)}}return t}function ch(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const s in t)n+=" "+s+'="'+t[s]+'"';return'"+e+""}function uh(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function dh(e){return"data:image/svg+xml,"+uh(e)}function fh(e){return'url("'+dh(e)+'")'}const Al={...Mc,inline:!1},ph={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},hh={display:"inline-block"},Or={backgroundColor:"currentColor"},Bc={backgroundColor:"transparent"},Rl={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Cl={webkitMask:Or,mask:Or,background:Bc};for(const e in Cl){const t=Cl[e];for(const n in Rl)t[e+n]=Rl[n]}const eo={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";eo[e+"-flip"]=t,eo[e.slice(0,1)+"-flip"]=t,eo[e+"Flip"]=t});function Tl(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const Pl=(e,t)=>{const n=rh(Al,t),s={...ph},o=t.mode||"svg",r={},i=t.style,l=typeof i=="object"&&!(i instanceof Array)?i:{};for(let v in t){const h=t[v];if(h!==void 0)switch(v){case"icon":case"style":case"onLoad":case"mode":case"ssr":break;case"inline":case"hFlip":case"vFlip":n[v]=h===!0||h==="true"||h===1;break;case"flip":typeof h=="string"&&lh(n,h);break;case"color":r.color=h;break;case"rotate":typeof h=="string"?n[v]=ah(h):typeof h=="number"&&(n[v]=h);break;case"ariaHidden":case"aria-hidden":h!==!0&&h!=="true"&&delete s["aria-hidden"];break;default:{const E=eo[v];E?(h===!0||h==="true"||h===1)&&(n[E]=!0):Al[v]===void 0&&(s[v]=h)}}}const a=Dp(e,n),d=a.attributes;if(n.inline&&(r.verticalAlign="-0.125em"),o==="svg"){s.style={...r,...l},Object.assign(s,d);let v=0,h=t.id;return typeof h=="string"&&(h=h.replace(/-/g,"_")),s.innerHTML=Lp(a.body,h?()=>h+"ID"+v++:"iconifyVue"),vs("svg",s)}const{body:c,width:f,height:m}=e,y=o==="mask"||(o==="bg"?!1:c.indexOf("currentColor")!==-1),b=ch(c,{...d,width:f+"",height:m+""});return s.style={...r,"--svg":fh(b),width:Tl(d.width),height:Tl(d.height),...hh,...y?Or:Bc,...l},vs("span",s)};$c(!0);Mp("",Kp);if(typeof document<"u"&&typeof window<"u"){const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(s=>{try{(typeof s!="object"||s===null||s instanceof Array||typeof s.icons!="object"||typeof s.prefix!="string"||!Ep(s))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const s="IconifyProviders["+n+"] is invalid.";try{const o=t[n];if(typeof o!="object"||!o||o.resources===void 0)continue;Up(n,o)||console.error(s)}catch{console.error(s)}}}}const mh={...No,body:""},W=si({inheritAttrs:!1,data(){return{_name:"",_loadingIcon:null,iconMounted:!1,counter:0}},mounted(){this.iconMounted=!0},unmounted(){this.abortLoading()},methods:{abortLoading(){this._loadingIcon&&(this._loadingIcon.abort(),this._loadingIcon=null)},getIcon(e,t,n){if(typeof e=="object"&&e!==null&&typeof e.body=="string")return this._name="",this.abortLoading(),{data:e};let s;if(typeof e!="string"||(s=Do(e,!1,!0))===null)return this.abortLoading(),null;let o=kp(s);if(!o)return(!this._loadingIcon||this._loadingIcon.name!==e)&&(this.abortLoading(),this._name="",o!==null&&(this._loadingIcon={name:e,abort:oh([s],()=>{this.counter++})})),null;if(this.abortLoading(),this._name!==e&&(this._name=e,t&&t(e)),n){o=Object.assign({},o);const i=n(o.body,s.name,s.prefix,s.provider);typeof i=="string"&&(o.body=i)}const r=["iconify"];return s.prefix!==""&&r.push("iconify--"+s.prefix),s.provider!==""&&r.push("iconify--"+s.provider),{data:o,classes:r}}},render(){this.counter;const e=this.$attrs,t=this.iconMounted||e.ssr?this.getIcon(e.icon,e.onLoad,e.customise):null;if(!t)return Pl(mh,e);let n=e;return t.classes&&(n={...e,class:(typeof e.class=="string"?e.class+" ":"")+t.classes.join(" ")}),Pl({...No,...t.data},n)}});function Hc(e,t){return function(){return e.apply(t,arguments)}}const{toString:gh}=Object.prototype,{getPrototypeOf:fi}=Object,{iterator:Io,toStringTag:jc}=Symbol,$o=(e=>t=>{const n=gh.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),kt=e=>(e=e.toLowerCase(),t=>$o(t)===e),Lo=e=>t=>typeof t===e,{isArray:Kn}=Array,Fn=Lo("undefined");function Rs(e){return e!==null&&!Fn(e)&&e.constructor!==null&&!Fn(e.constructor)&&Ze(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const qc=kt("ArrayBuffer");function yh(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&qc(e.buffer),t}const vh=Lo("string"),Ze=Lo("function"),Vc=Lo("number"),Cs=e=>e!==null&&typeof e=="object",bh=e=>e===!0||e===!1,to=e=>{if($o(e)!=="object")return!1;const t=fi(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(jc in e)&&!(Io in e)},_h=e=>{if(!Cs(e)||Rs(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},xh=kt("Date"),wh=kt("File"),kh=kt("Blob"),Sh=kt("FileList"),Eh=e=>Cs(e)&&Ze(e.pipe),Ah=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Ze(e.append)&&((t=$o(e))==="formdata"||t==="object"&&Ze(e.toString)&&e.toString()==="[object FormData]"))},Rh=kt("URLSearchParams"),[Ch,Th,Ph,Oh]=["ReadableStream","Request","Response","Headers"].map(kt),Dh=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ts(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let s,o;if(typeof e!="object"&&(e=[e]),Kn(e))for(s=0,o=e.length;s0;)if(o=n[s],t===o.toLowerCase())return o;return null}const _n=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Wc=e=>!Fn(e)&&e!==_n;function Dr(){const{caseless:e,skipUndefined:t}=Wc(this)&&this||{},n={},s=(o,r)=>{if(r==="__proto__"||r==="constructor"||r==="prototype")return;const i=e&&Kc(n,r)||r;to(n[i])&&to(o)?n[i]=Dr(n[i],o):to(o)?n[i]=Dr({},o):Kn(o)?n[i]=o.slice():(!t||!Fn(o))&&(n[i]=o)};for(let o=0,r=arguments.length;o(Ts(t,(o,r)=>{n&&Ze(o)?Object.defineProperty(e,r,{value:Hc(o,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:s}),e),Ih=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),$h=(e,t,n,s)=>{e.prototype=Object.create(t.prototype,s),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},Lh=(e,t,n,s)=>{let o,r,i;const l={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),r=o.length;r-- >0;)i=o[r],(!s||s(i,e,t))&&!l[i]&&(t[i]=e[i],l[i]=!0);e=n!==!1&&fi(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Mh=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const s=e.indexOf(t,n);return s!==-1&&s===n},Uh=e=>{if(!e)return null;if(Kn(e))return e;let t=e.length;if(!Vc(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Fh=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&fi(Uint8Array)),Bh=(e,t)=>{const s=(e&&e[Io]).call(e);let o;for(;(o=s.next())&&!o.done;){const r=o.value;t.call(e,r[0],r[1])}},Hh=(e,t)=>{let n;const s=[];for(;(n=e.exec(t))!==null;)s.push(n);return s},jh=kt("HTMLFormElement"),qh=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,s,o){return s.toUpperCase()+o}),Ol=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Vh=kt("RegExp"),zc=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),s={};Ts(n,(o,r)=>{let i;(i=t(o,r,e))!==!1&&(s[r]=i||o)}),Object.defineProperties(e,s)},Kh=e=>{zc(e,(t,n)=>{if(Ze(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const s=e[n];if(Ze(s)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},Wh=(e,t)=>{const n={},s=o=>{o.forEach(r=>{n[r]=!0})};return Kn(e)?s(e):s(String(e).split(t)),n},zh=()=>{},Gh=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Qh(e){return!!(e&&Ze(e.append)&&e[jc]==="FormData"&&e[Io])}const Jh=e=>{const t=new Array(10),n=(s,o)=>{if(Cs(s)){if(t.indexOf(s)>=0)return;if(Rs(s))return s;if(!("toJSON"in s)){t[o]=s;const r=Kn(s)?[]:{};return Ts(s,(i,l)=>{const a=n(i,o+1);!Fn(a)&&(r[l]=a)}),t[o]=void 0,r}}return s};return n(e,0)},Yh=kt("AsyncFunction"),Xh=e=>e&&(Cs(e)||Ze(e))&&Ze(e.then)&&Ze(e.catch),Gc=((e,t)=>e?setImmediate:t?((n,s)=>(_n.addEventListener("message",({source:o,data:r})=>{o===_n&&r===n&&s.length&&s.shift()()},!1),o=>{s.push(o),_n.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",Ze(_n.postMessage)),Zh=typeof queueMicrotask<"u"?queueMicrotask.bind(_n):typeof process<"u"&&process.nextTick||Gc,em=e=>e!=null&&Ze(e[Io]),k={isArray:Kn,isArrayBuffer:qc,isBuffer:Rs,isFormData:Ah,isArrayBufferView:yh,isString:vh,isNumber:Vc,isBoolean:bh,isObject:Cs,isPlainObject:to,isEmptyObject:_h,isReadableStream:Ch,isRequest:Th,isResponse:Ph,isHeaders:Oh,isUndefined:Fn,isDate:xh,isFile:wh,isBlob:kh,isRegExp:Vh,isFunction:Ze,isStream:Eh,isURLSearchParams:Rh,isTypedArray:Fh,isFileList:Sh,forEach:Ts,merge:Dr,extend:Nh,trim:Dh,stripBOM:Ih,inherits:$h,toFlatObject:Lh,kindOf:$o,kindOfTest:kt,endsWith:Mh,toArray:Uh,forEachEntry:Bh,matchAll:Hh,isHTMLForm:jh,hasOwnProperty:Ol,hasOwnProp:Ol,reduceDescriptors:zc,freezeMethods:Kh,toObjectSet:Wh,toCamelCase:qh,noop:zh,toFiniteNumber:Gh,findKey:Kc,global:_n,isContextDefined:Wc,isSpecCompliantForm:Qh,toJSONObject:Jh,isAsyncFn:Yh,isThenable:Xh,setImmediate:Gc,asap:Zh,isIterable:em};let X=class Qc extends Error{static from(t,n,s,o,r,i){const l=new Qc(t.message,n||t.code,s,o,r);return l.cause=t,l.name=t.name,i&&Object.assign(l,i),l}constructor(t,n,s,o,r){super(t),this.name="AxiosError",this.isAxiosError=!0,n&&(this.code=n),s&&(this.config=s),o&&(this.request=o),r&&(this.response=r,this.status=r.status)}toJSON(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:k.toJSONObject(this.config),code:this.code,status:this.status}}};X.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";X.ERR_BAD_OPTION="ERR_BAD_OPTION";X.ECONNABORTED="ECONNABORTED";X.ETIMEDOUT="ETIMEDOUT";X.ERR_NETWORK="ERR_NETWORK";X.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";X.ERR_DEPRECATED="ERR_DEPRECATED";X.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";X.ERR_BAD_REQUEST="ERR_BAD_REQUEST";X.ERR_CANCELED="ERR_CANCELED";X.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";X.ERR_INVALID_URL="ERR_INVALID_URL";const tm=null;function Nr(e){return k.isPlainObject(e)||k.isArray(e)}function Jc(e){return k.endsWith(e,"[]")?e.slice(0,-2):e}function Dl(e,t,n){return e?e.concat(t).map(function(o,r){return o=Jc(o),!n&&r?"["+o+"]":o}).join(n?".":""):t}function nm(e){return k.isArray(e)&&!e.some(Nr)}const sm=k.toFlatObject(k,{},null,function(t){return/^is[A-Z]/.test(t)});function Mo(e,t,n){if(!k.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=k.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(v,h){return!k.isUndefined(h[v])});const s=n.metaTokens,o=n.visitor||c,r=n.dots,i=n.indexes,a=(n.Blob||typeof Blob<"u"&&Blob)&&k.isSpecCompliantForm(t);if(!k.isFunction(o))throw new TypeError("visitor must be a function");function d(b){if(b===null)return"";if(k.isDate(b))return b.toISOString();if(k.isBoolean(b))return b.toString();if(!a&&k.isBlob(b))throw new X("Blob is not supported. Use a Buffer instead.");return k.isArrayBuffer(b)||k.isTypedArray(b)?a&&typeof Blob=="function"?new Blob([b]):Buffer.from(b):b}function c(b,v,h){let E=b;if(b&&!h&&typeof b=="object"){if(k.endsWith(v,"{}"))v=s?v:v.slice(0,-2),b=JSON.stringify(b);else if(k.isArray(b)&&nm(b)||(k.isFileList(b)||k.endsWith(v,"[]"))&&(E=k.toArray(b)))return v=Jc(v),E.forEach(function(S,R){!(k.isUndefined(S)||S===null)&&t.append(i===!0?Dl([v],R,r):i===null?v:v+"[]",d(S))}),!1}return Nr(b)?!0:(t.append(Dl(h,v,r),d(b)),!1)}const f=[],m=Object.assign(sm,{defaultVisitor:c,convertValue:d,isVisitable:Nr});function y(b,v){if(!k.isUndefined(b)){if(f.indexOf(b)!==-1)throw Error("Circular reference detected in "+v.join("."));f.push(b),k.forEach(b,function(E,C){(!(k.isUndefined(E)||E===null)&&o.call(t,E,k.isString(C)?C.trim():C,v,m))===!0&&y(E,v?v.concat(C):[C])}),f.pop()}}if(!k.isObject(e))throw new TypeError("data must be an object");return y(e),t}function Nl(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(s){return t[s]})}function pi(e,t){this._pairs=[],e&&Mo(e,this,t)}const Yc=pi.prototype;Yc.append=function(t,n){this._pairs.push([t,n])};Yc.toString=function(t){const n=t?function(s){return t.call(this,s,Nl)}:Nl;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function om(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Xc(e,t,n){if(!t)return e;const s=n&&n.encode||om,o=k.isFunction(n)?{serialize:n}:n,r=o&&o.serialize;let i;if(r?i=r(t,o):i=k.isURLSearchParams(t)?t.toString():new pi(t,o).toString(s),i){const l=e.indexOf("#");l!==-1&&(e=e.slice(0,l)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class Il{constructor(){this.handlers=[]}use(t,n,s){return this.handlers.push({fulfilled:t,rejected:n,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){k.forEach(this.handlers,function(s){s!==null&&t(s)})}}const hi={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},rm=typeof URLSearchParams<"u"?URLSearchParams:pi,im=typeof FormData<"u"?FormData:null,lm=typeof Blob<"u"?Blob:null,am={isBrowser:!0,classes:{URLSearchParams:rm,FormData:im,Blob:lm},protocols:["http","https","file","blob","url","data"]},mi=typeof window<"u"&&typeof document<"u",Ir=typeof navigator=="object"&&navigator||void 0,cm=mi&&(!Ir||["ReactNative","NativeScript","NS"].indexOf(Ir.product)<0),um=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",dm=mi&&window.location.href||"http://localhost",fm=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:mi,hasStandardBrowserEnv:cm,hasStandardBrowserWebWorkerEnv:um,navigator:Ir,origin:dm},Symbol.toStringTag,{value:"Module"})),He={...fm,...am};function pm(e,t){return Mo(e,new He.classes.URLSearchParams,{visitor:function(n,s,o,r){return He.isNode&&k.isBuffer(n)?(this.append(s,n.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...t})}function hm(e){return k.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function mm(e){const t={},n=Object.keys(e);let s;const o=n.length;let r;for(s=0;s=n.length;return i=!i&&k.isArray(o)?o.length:i,a?(k.hasOwnProp(o,i)?o[i]=[o[i],s]:o[i]=s,!l):((!o[i]||!k.isObject(o[i]))&&(o[i]=[]),t(n,s,o[i],r)&&k.isArray(o[i])&&(o[i]=mm(o[i])),!l)}if(k.isFormData(e)&&k.isFunction(e.entries)){const n={};return k.forEachEntry(e,(s,o)=>{t(hm(s),o,n,0)}),n}return null}function gm(e,t,n){if(k.isString(e))try{return(t||JSON.parse)(e),k.trim(e)}catch(s){if(s.name!=="SyntaxError")throw s}return(n||JSON.stringify)(e)}const Ps={transitional:hi,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const s=n.getContentType()||"",o=s.indexOf("application/json")>-1,r=k.isObject(t);if(r&&k.isHTMLForm(t)&&(t=new FormData(t)),k.isFormData(t))return o?JSON.stringify(Zc(t)):t;if(k.isArrayBuffer(t)||k.isBuffer(t)||k.isStream(t)||k.isFile(t)||k.isBlob(t)||k.isReadableStream(t))return t;if(k.isArrayBufferView(t))return t.buffer;if(k.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(r){if(s.indexOf("application/x-www-form-urlencoded")>-1)return pm(t,this.formSerializer).toString();if((l=k.isFileList(t))||s.indexOf("multipart/form-data")>-1){const a=this.env&&this.env.FormData;return Mo(l?{"files[]":t}:t,a&&new a,this.formSerializer)}}return r||o?(n.setContentType("application/json",!1),gm(t)):t}],transformResponse:[function(t){const n=this.transitional||Ps.transitional,s=n&&n.forcedJSONParsing,o=this.responseType==="json";if(k.isResponse(t)||k.isReadableStream(t))return t;if(t&&k.isString(t)&&(s&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t,this.parseReviver)}catch(l){if(i)throw l.name==="SyntaxError"?X.from(l,X.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:He.classes.FormData,Blob:He.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};k.forEach(["delete","get","head","post","put","patch"],e=>{Ps.headers[e]={}});const ym=k.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),vm=e=>{const t={};let n,s,o;return e&&e.split(` +`).forEach(function(i){o=i.indexOf(":"),n=i.substring(0,o).trim().toLowerCase(),s=i.substring(o+1).trim(),!(!n||t[n]&&ym[n])&&(n==="set-cookie"?t[n]?t[n].push(s):t[n]=[s]:t[n]=t[n]?t[n]+", "+s:s)}),t},$l=Symbol("internals");function es(e){return e&&String(e).trim().toLowerCase()}function no(e){return e===!1||e==null?e:k.isArray(e)?e.map(no):String(e)}function bm(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=n.exec(e);)t[s[1]]=s[2];return t}const _m=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function or(e,t,n,s,o){if(k.isFunction(s))return s.call(this,t,n);if(o&&(t=n),!!k.isString(t)){if(k.isString(s))return t.indexOf(s)!==-1;if(k.isRegExp(s))return s.test(t)}}function xm(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,s)=>n.toUpperCase()+s)}function wm(e,t){const n=k.toCamelCase(" "+t);["get","set","has"].forEach(s=>{Object.defineProperty(e,s+n,{value:function(o,r,i){return this[s].call(this,t,o,r,i)},configurable:!0})})}let et=class{constructor(t){t&&this.set(t)}set(t,n,s){const o=this;function r(l,a,d){const c=es(a);if(!c)throw new Error("header name must be a non-empty string");const f=k.findKey(o,c);(!f||o[f]===void 0||d===!0||d===void 0&&o[f]!==!1)&&(o[f||a]=no(l))}const i=(l,a)=>k.forEach(l,(d,c)=>r(d,c,a));if(k.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(k.isString(t)&&(t=t.trim())&&!_m(t))i(vm(t),n);else if(k.isObject(t)&&k.isIterable(t)){let l={},a,d;for(const c of t){if(!k.isArray(c))throw TypeError("Object iterator must return a key-value pair");l[d=c[0]]=(a=l[d])?k.isArray(a)?[...a,c[1]]:[a,c[1]]:c[1]}i(l,n)}else t!=null&&r(n,t,s);return this}get(t,n){if(t=es(t),t){const s=k.findKey(this,t);if(s){const o=this[s];if(!n)return o;if(n===!0)return bm(o);if(k.isFunction(n))return n.call(this,o,s);if(k.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=es(t),t){const s=k.findKey(this,t);return!!(s&&this[s]!==void 0&&(!n||or(this,this[s],s,n)))}return!1}delete(t,n){const s=this;let o=!1;function r(i){if(i=es(i),i){const l=k.findKey(s,i);l&&(!n||or(s,s[l],l,n))&&(delete s[l],o=!0)}}return k.isArray(t)?t.forEach(r):r(t),o}clear(t){const n=Object.keys(this);let s=n.length,o=!1;for(;s--;){const r=n[s];(!t||or(this,this[r],r,t,!0))&&(delete this[r],o=!0)}return o}normalize(t){const n=this,s={};return k.forEach(this,(o,r)=>{const i=k.findKey(s,r);if(i){n[i]=no(o),delete n[r];return}const l=t?xm(r):String(r).trim();l!==r&&delete n[r],n[l]=no(o),s[l]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return k.forEach(this,(s,o)=>{s!=null&&s!==!1&&(n[o]=t&&k.isArray(s)?s.join(", "):s)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const s=new this(t);return n.forEach(o=>s.set(o)),s}static accessor(t){const s=(this[$l]=this[$l]={accessors:{}}).accessors,o=this.prototype;function r(i){const l=es(i);s[l]||(wm(o,i),s[l]=!0)}return k.isArray(t)?t.forEach(r):r(t),this}};et.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);k.reduceDescriptors(et.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(s){this[n]=s}}});k.freezeMethods(et);function rr(e,t){const n=this||Ps,s=t||n,o=et.from(s.headers);let r=s.data;return k.forEach(e,function(l){r=l.call(n,r,o.normalize(),t?t.status:void 0)}),o.normalize(),r}function eu(e){return!!(e&&e.__CANCEL__)}let Os=class extends X{constructor(t,n,s){super(t??"canceled",X.ERR_CANCELED,n,s),this.name="CanceledError",this.__CANCEL__=!0}};function tu(e,t,n){const s=n.config.validateStatus;!n.status||!s||s(n.status)?e(n):t(new X("Request failed with status code "+n.status,[X.ERR_BAD_REQUEST,X.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function km(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Sm(e,t){e=e||10;const n=new Array(e),s=new Array(e);let o=0,r=0,i;return t=t!==void 0?t:1e3,function(a){const d=Date.now(),c=s[r];i||(i=d),n[o]=a,s[o]=d;let f=r,m=0;for(;f!==o;)m+=n[f++],f=f%e;if(o=(o+1)%e,o===r&&(r=(r+1)%e),d-i{n=c,o=null,r&&(clearTimeout(r),r=null),e(...d)};return[(...d)=>{const c=Date.now(),f=c-n;f>=s?i(d,c):(o=d,r||(r=setTimeout(()=>{r=null,i(o)},s-f)))},()=>o&&i(o)]}const go=(e,t,n=3)=>{let s=0;const o=Sm(50,250);return Em(r=>{const i=r.loaded,l=r.lengthComputable?r.total:void 0,a=i-s,d=o(a),c=i<=l;s=i;const f={loaded:i,total:l,progress:l?i/l:void 0,bytes:a,rate:d||void 0,estimated:d&&l&&c?(l-i)/d:void 0,event:r,lengthComputable:l!=null,[t?"download":"upload"]:!0};e(f)},n)},Ll=(e,t)=>{const n=e!=null;return[s=>t[0]({lengthComputable:n,total:e,loaded:s}),t[1]]},Ml=e=>(...t)=>k.asap(()=>e(...t)),Am=He.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,He.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(He.origin),He.navigator&&/(msie|trident)/i.test(He.navigator.userAgent)):()=>!0,Rm=He.hasStandardBrowserEnv?{write(e,t,n,s,o,r,i){if(typeof document>"u")return;const l=[`${e}=${encodeURIComponent(t)}`];k.isNumber(n)&&l.push(`expires=${new Date(n).toUTCString()}`),k.isString(s)&&l.push(`path=${s}`),k.isString(o)&&l.push(`domain=${o}`),r===!0&&l.push("secure"),k.isString(i)&&l.push(`SameSite=${i}`),document.cookie=l.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function Cm(e){return typeof e!="string"?!1:/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Tm(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function nu(e,t,n){let s=!Cm(t);return e&&(s||n==!1)?Tm(e,t):t}const Ul=e=>e instanceof et?{...e}:e;function En(e,t){t=t||{};const n={};function s(d,c,f,m){return k.isPlainObject(d)&&k.isPlainObject(c)?k.merge.call({caseless:m},d,c):k.isPlainObject(c)?k.merge({},c):k.isArray(c)?c.slice():c}function o(d,c,f,m){if(k.isUndefined(c)){if(!k.isUndefined(d))return s(void 0,d,f,m)}else return s(d,c,f,m)}function r(d,c){if(!k.isUndefined(c))return s(void 0,c)}function i(d,c){if(k.isUndefined(c)){if(!k.isUndefined(d))return s(void 0,d)}else return s(void 0,c)}function l(d,c,f){if(f in t)return s(d,c);if(f in e)return s(void 0,d)}const a={url:r,method:r,data:r,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:l,headers:(d,c,f)=>o(Ul(d),Ul(c),f,!0)};return k.forEach(Object.keys({...e,...t}),function(c){if(c==="__proto__"||c==="constructor"||c==="prototype")return;const f=k.hasOwnProp(a,c)?a[c]:o,m=f(e[c],t[c],c);k.isUndefined(m)&&f!==l||(n[c]=m)}),n}const su=e=>{const t=En({},e);let{data:n,withXSRFToken:s,xsrfHeaderName:o,xsrfCookieName:r,headers:i,auth:l}=t;if(t.headers=i=et.from(i),t.url=Xc(nu(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&i.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),k.isFormData(n)){if(He.hasStandardBrowserEnv||He.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if(k.isFunction(n.getHeaders)){const a=n.getHeaders(),d=["content-type","content-length"];Object.entries(a).forEach(([c,f])=>{d.includes(c.toLowerCase())&&i.set(c,f)})}}if(He.hasStandardBrowserEnv&&(s&&k.isFunction(s)&&(s=s(t)),s||s!==!1&&Am(t.url))){const a=o&&r&&Rm.read(r);a&&i.set(o,a)}return t},Pm=typeof XMLHttpRequest<"u",Om=Pm&&function(e){return new Promise(function(n,s){const o=su(e);let r=o.data;const i=et.from(o.headers).normalize();let{responseType:l,onUploadProgress:a,onDownloadProgress:d}=o,c,f,m,y,b;function v(){y&&y(),b&&b(),o.cancelToken&&o.cancelToken.unsubscribe(c),o.signal&&o.signal.removeEventListener("abort",c)}let h=new XMLHttpRequest;h.open(o.method.toUpperCase(),o.url,!0),h.timeout=o.timeout;function E(){if(!h)return;const S=et.from("getAllResponseHeaders"in h&&h.getAllResponseHeaders()),L={data:!l||l==="text"||l==="json"?h.responseText:h.response,status:h.status,statusText:h.statusText,headers:S,config:e,request:h};tu(function(U){n(U),v()},function(U){s(U),v()},L),h=null}"onloadend"in h?h.onloadend=E:h.onreadystatechange=function(){!h||h.readyState!==4||h.status===0&&!(h.responseURL&&h.responseURL.indexOf("file:")===0)||setTimeout(E)},h.onabort=function(){h&&(s(new X("Request aborted",X.ECONNABORTED,e,h)),h=null)},h.onerror=function(R){const L=R&&R.message?R.message:"Network Error",T=new X(L,X.ERR_NETWORK,e,h);T.event=R||null,s(T),h=null},h.ontimeout=function(){let R=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const L=o.transitional||hi;o.timeoutErrorMessage&&(R=o.timeoutErrorMessage),s(new X(R,L.clarifyTimeoutError?X.ETIMEDOUT:X.ECONNABORTED,e,h)),h=null},r===void 0&&i.setContentType(null),"setRequestHeader"in h&&k.forEach(i.toJSON(),function(R,L){h.setRequestHeader(L,R)}),k.isUndefined(o.withCredentials)||(h.withCredentials=!!o.withCredentials),l&&l!=="json"&&(h.responseType=o.responseType),d&&([m,b]=go(d,!0),h.addEventListener("progress",m)),a&&h.upload&&([f,y]=go(a),h.upload.addEventListener("progress",f),h.upload.addEventListener("loadend",y)),(o.cancelToken||o.signal)&&(c=S=>{h&&(s(!S||S.type?new Os(null,e,h):S),h.abort(),h=null)},o.cancelToken&&o.cancelToken.subscribe(c),o.signal&&(o.signal.aborted?c():o.signal.addEventListener("abort",c)));const C=km(o.url);if(C&&He.protocols.indexOf(C)===-1){s(new X("Unsupported protocol "+C+":",X.ERR_BAD_REQUEST,e));return}h.send(r||null)})},Dm=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let s=new AbortController,o;const r=function(d){if(!o){o=!0,l();const c=d instanceof Error?d:this.reason;s.abort(c instanceof X?c:new Os(c instanceof Error?c.message:c))}};let i=t&&setTimeout(()=>{i=null,r(new X(`timeout of ${t}ms exceeded`,X.ETIMEDOUT))},t);const l=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(d=>{d.unsubscribe?d.unsubscribe(r):d.removeEventListener("abort",r)}),e=null)};e.forEach(d=>d.addEventListener("abort",r));const{signal:a}=s;return a.unsubscribe=()=>k.asap(l),a}},Nm=function*(e,t){let n=e.byteLength;if(n{const o=Im(e,t);let r=0,i,l=a=>{i||(i=!0,s&&s(a))};return new ReadableStream({async pull(a){try{const{done:d,value:c}=await o.next();if(d){l(),a.close();return}let f=c.byteLength;if(n){let m=r+=f;n(m)}a.enqueue(new Uint8Array(c))}catch(d){throw l(d),d}},cancel(a){return l(a),o.return()}},{highWaterMark:2})},Bl=64*1024,{isFunction:js}=k,Lm=(({Request:e,Response:t})=>({Request:e,Response:t}))(k.global),{ReadableStream:Hl,TextEncoder:jl}=k.global,ql=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Mm=e=>{e=k.merge.call({skipUndefined:!0},Lm,e);const{fetch:t,Request:n,Response:s}=e,o=t?js(t):typeof fetch=="function",r=js(n),i=js(s);if(!o)return!1;const l=o&&js(Hl),a=o&&(typeof jl=="function"?(b=>v=>b.encode(v))(new jl):async b=>new Uint8Array(await new n(b).arrayBuffer())),d=r&&l&&ql(()=>{let b=!1;const v=new n(He.origin,{body:new Hl,method:"POST",get duplex(){return b=!0,"half"}}).headers.has("Content-Type");return b&&!v}),c=i&&l&&ql(()=>k.isReadableStream(new s("").body)),f={stream:c&&(b=>b.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(b=>{!f[b]&&(f[b]=(v,h)=>{let E=v&&v[b];if(E)return E.call(v);throw new X(`Response type '${b}' is not supported`,X.ERR_NOT_SUPPORT,h)})});const m=async b=>{if(b==null)return 0;if(k.isBlob(b))return b.size;if(k.isSpecCompliantForm(b))return(await new n(He.origin,{method:"POST",body:b}).arrayBuffer()).byteLength;if(k.isArrayBufferView(b)||k.isArrayBuffer(b))return b.byteLength;if(k.isURLSearchParams(b)&&(b=b+""),k.isString(b))return(await a(b)).byteLength},y=async(b,v)=>{const h=k.toFiniteNumber(b.getContentLength());return h??m(v)};return async b=>{let{url:v,method:h,data:E,signal:C,cancelToken:S,timeout:R,onDownloadProgress:L,onUploadProgress:T,responseType:U,headers:ae,withCredentials:z="same-origin",fetchOptions:ne}=su(b),ge=t||fetch;U=U?(U+"").toLowerCase():"text";let q=Dm([C,S&&S.toAbortSignal()],R),oe=null;const _e=q&&q.unsubscribe&&(()=>{q.unsubscribe()});let Me;try{if(T&&d&&h!=="get"&&h!=="head"&&(Me=await y(ae,E))!==0){let De=new n(v,{method:"POST",body:E,duplex:"half"}),Pe;if(k.isFormData(E)&&(Pe=De.headers.get("content-type"))&&ae.setContentType(Pe),De.body){const[Et,mt]=Ll(Me,go(Ml(T)));E=Fl(De.body,Bl,Et,mt)}}k.isString(z)||(z=z?"include":"omit");const re=r&&"credentials"in n.prototype,ue={...ne,signal:q,method:h.toUpperCase(),headers:ae.normalize().toJSON(),body:E,duplex:"half",credentials:re?z:void 0};oe=r&&new n(v,ue);let se=await(r?ge(oe,ne):ge(v,ue));const at=c&&(U==="stream"||U==="response");if(c&&(L||at&&_e)){const De={};["status","statusText","headers"].forEach(At=>{De[At]=se[At]});const Pe=k.toFiniteNumber(se.headers.get("content-length")),[Et,mt]=L&&Ll(Pe,go(Ml(L),!0))||[];se=new s(Fl(se.body,Bl,Et,()=>{mt&&mt(),_e&&_e()}),De)}U=U||"text";let St=await f[k.findKey(f,U)||"text"](se,b);return!at&&_e&&_e(),await new Promise((De,Pe)=>{tu(De,Pe,{data:St,headers:et.from(se.headers),status:se.status,statusText:se.statusText,config:b,request:oe})})}catch(re){throw _e&&_e(),re&&re.name==="TypeError"&&/Load failed|fetch/i.test(re.message)?Object.assign(new X("Network Error",X.ERR_NETWORK,b,oe,re&&re.response),{cause:re.cause||re}):X.from(re,re&&re.code,b,oe,re&&re.response)}}},Um=new Map,ou=e=>{let t=e&&e.env||{};const{fetch:n,Request:s,Response:o}=t,r=[s,o,n];let i=r.length,l=i,a,d,c=Um;for(;l--;)a=r[l],d=c.get(a),d===void 0&&c.set(a,d=l?new Map:Mm(t)),c=d;return d};ou();const gi={http:tm,xhr:Om,fetch:{get:ou}};k.forEach(gi,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Vl=e=>`- ${e}`,Fm=e=>k.isFunction(e)||e===null||e===!1;function Bm(e,t){e=k.isArray(e)?e:[e];const{length:n}=e;let s,o;const r={};for(let i=0;i`adapter ${a} `+(d===!1?"is not supported by the environment":"is not available in the build"));let l=n?i.length>1?`since : +`+i.map(Vl).join(` +`):" "+Vl(i[0]):"as no adapter specified";throw new X("There is no suitable adapter to dispatch the request "+l,"ERR_NOT_SUPPORT")}return o}const ru={getAdapter:Bm,adapters:gi};function ir(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Os(null,e)}function Kl(e){return ir(e),e.headers=et.from(e.headers),e.data=rr.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),ru.getAdapter(e.adapter||Ps.adapter,e)(e).then(function(s){return ir(e),s.data=rr.call(e,e.transformResponse,s),s.headers=et.from(s.headers),s},function(s){return eu(s)||(ir(e),s&&s.response&&(s.response.data=rr.call(e,e.transformResponse,s.response),s.response.headers=et.from(s.response.headers))),Promise.reject(s)})}const iu="1.13.5",Uo={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Uo[e]=function(s){return typeof s===e||"a"+(t<1?"n ":" ")+e}});const Wl={};Uo.transitional=function(t,n,s){function o(r,i){return"[Axios v"+iu+"] Transitional option '"+r+"'"+i+(s?". "+s:"")}return(r,i,l)=>{if(t===!1)throw new X(o(i," has been removed"+(n?" in "+n:"")),X.ERR_DEPRECATED);return n&&!Wl[i]&&(Wl[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(r,i,l):!0}};Uo.spelling=function(t){return(n,s)=>(console.warn(`${s} is likely a misspelling of ${t}`),!0)};function Hm(e,t,n){if(typeof e!="object")throw new X("options must be an object",X.ERR_BAD_OPTION_VALUE);const s=Object.keys(e);let o=s.length;for(;o-- >0;){const r=s[o],i=t[r];if(i){const l=e[r],a=l===void 0||i(l,r,e);if(a!==!0)throw new X("option "+r+" must be "+a,X.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new X("Unknown option "+r,X.ERR_BAD_OPTION)}}const so={assertOptions:Hm,validators:Uo},dt=so.validators;let Sn=class{constructor(t){this.defaults=t||{},this.interceptors={request:new Il,response:new Il}}async request(t,n){try{return await this._request(t,n)}catch(s){if(s instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;const r=o.stack?o.stack.replace(/^.+\n/,""):"";try{s.stack?r&&!String(s.stack).endsWith(r.replace(/^.+\n.+\n/,""))&&(s.stack+=` +`+r):s.stack=r}catch{}}throw s}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=En(this.defaults,n);const{transitional:s,paramsSerializer:o,headers:r}=n;s!==void 0&&so.assertOptions(s,{silentJSONParsing:dt.transitional(dt.boolean),forcedJSONParsing:dt.transitional(dt.boolean),clarifyTimeoutError:dt.transitional(dt.boolean),legacyInterceptorReqResOrdering:dt.transitional(dt.boolean)},!1),o!=null&&(k.isFunction(o)?n.paramsSerializer={serialize:o}:so.assertOptions(o,{encode:dt.function,serialize:dt.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),so.assertOptions(n,{baseUrl:dt.spelling("baseURL"),withXsrfToken:dt.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=r&&k.merge(r.common,r[n.method]);r&&k.forEach(["delete","get","head","post","put","patch","common"],b=>{delete r[b]}),n.headers=et.concat(i,r);const l=[];let a=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;a=a&&v.synchronous;const h=n.transitional||hi;h&&h.legacyInterceptorReqResOrdering?l.unshift(v.fulfilled,v.rejected):l.push(v.fulfilled,v.rejected)});const d=[];this.interceptors.response.forEach(function(v){d.push(v.fulfilled,v.rejected)});let c,f=0,m;if(!a){const b=[Kl.bind(this),void 0];for(b.unshift(...l),b.push(...d),m=b.length,c=Promise.resolve(n);f{if(!s._listeners)return;let r=s._listeners.length;for(;r-- >0;)s._listeners[r](o);s._listeners=null}),this.promise.then=o=>{let r;const i=new Promise(l=>{s.subscribe(l),r=l}).then(o);return i.cancel=function(){s.unsubscribe(r)},i},t(function(r,i,l){s.reason||(s.reason=new Os(r,i,l),n(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=s=>{t.abort(s)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new lu(function(o){t=o}),cancel:t}}};function qm(e){return function(n){return e.apply(null,n)}}function Vm(e){return k.isObject(e)&&e.isAxiosError===!0}const $r={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries($r).forEach(([e,t])=>{$r[t]=e});function au(e){const t=new Sn(e),n=Hc(Sn.prototype.request,t);return k.extend(n,Sn.prototype,t,{allOwnKeys:!0}),k.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return au(En(e,o))},n}const Te=au(Ps);Te.Axios=Sn;Te.CanceledError=Os;Te.CancelToken=jm;Te.isCancel=eu;Te.VERSION=iu;Te.toFormData=Mo;Te.AxiosError=X;Te.Cancel=Te.CanceledError;Te.all=function(t){return Promise.all(t)};Te.spread=qm;Te.isAxiosError=Vm;Te.mergeConfig=En;Te.AxiosHeaders=et;Te.formToJSON=e=>Zc(k.isHTMLForm(e)?new FormData(e):e);Te.getAdapter=ru.getAdapter;Te.HttpStatusCode=$r;Te.default=Te;const{Axios:n1,AxiosError:s1,CanceledError:o1,isCancel:r1,CancelToken:i1,VERSION:l1,all:a1,Cancel:c1,isAxiosError:u1,spread:d1,toFormData:f1,AxiosHeaders:p1,HttpStatusCode:h1,formToJSON:m1,getAdapter:g1,mergeConfig:y1}=Te;var Rn={};const Ge={PROTOCOL:Rn.PROTOCOL||window.location.protocol,WS_PROTOCOL:Rn.WS_PROTOCOL||window.location.protocol==="https:"?"wss:":"ws:",BACKEND:Rn.BACKEND||window.location.hostname,PORT:Rn.PORT||window.location.port,WS_PORT:Rn.WS_PORT||window.location.port,BASEURL:Rn.BASEURL||""};let qs;const Km=new Uint8Array(16);function Wm(){if(!qs&&(qs=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!qs))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return qs(Km)}const Le=[];for(let e=0;e<256;++e)Le.push((e+256).toString(16).slice(1));function zm(e,t=0){return Le[e[t+0]]+Le[e[t+1]]+Le[e[t+2]]+Le[e[t+3]]+"-"+Le[e[t+4]]+Le[e[t+5]]+"-"+Le[e[t+6]]+Le[e[t+7]]+"-"+Le[e[t+8]]+Le[e[t+9]]+"-"+Le[e[t+10]]+Le[e[t+11]]+Le[e[t+12]]+Le[e[t+13]]+Le[e[t+14]]+Le[e[t+15]]}const Gm=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),zl={randomUUID:Gm};function Qm(e,t,n){if(zl.randomUUID&&!e)return zl.randomUUID();e=e||{};const s=e.random||(e.rng||Wm)();return s[6]=s[6]&15|64,s[8]=s[8]&63|128,zm(s)}var Jm={};console.log("using env:",Jm);console.log("using config: ",Ge);const nt=Te.create({baseURL:`${Ge.PROTOCOL}//${Ge.BACKEND}:${Ge.PORT}${Ge.BASEURL}`}),Ds=Qm();console.log("session ID: ",Ds);cu();const yi=new WebSocket(`${Ge.WS_PROTOCOL}//${Ge.BACKEND}${Ge.PORT!==""?":"+Ge.PORT:""}${Ge.BASEURL}/api/ws?client_id=${Ds}`);yi.onopen=e=>{console.log("websocket connection opened",e)};function cu(){nt.get("/api/version").then(e=>{const t=localStorage.getItem("version");console.log("Backend version: ",e.data),localStorage.setItem("version",e.data),t!=e.data&&location.reload()}).catch(e=>{console.error(e),console.log("Error getting version, using 0"),localStorage.setItem("version","0.0.0")})}function Ym(e){return nt.get("/api/songs/search",{params:{query:e}})}function Xm(e){return nt.get("/api/song/url",{params:{url:e}})}function Zm(e){const t=typeof e=="string"?e:e.url,n=typeof e=="string"?void 0:e;return nt.post("/api/download/url",n,{params:{url:t,client_id:Ds}})}function eg(e){return nt.post("/api/download/batch",e)}function tg(){return nt.get("/api/check_update")}function ng(e){return String(e||"").split("/").map(encodeURIComponent).join("/")}function sg(e){return`/media/${ng(e)}`}function og(e){return`/cover?file=${encodeURIComponent(e)}`}function rg(){return nt.get("/list")}function ig(e){return nt.delete("/delete",{params:{file:e}})}function lg(e){return nt.post("/api/playlist/m3u",e)}function ag(){return nt.get("/api/queue")}function cg(e){return nt.delete("/api/queue/item",{params:{song_id:e}})}function ug(){return nt.delete("/api/queue")}function dg(){return nt.get("/api/settings",{params:{client_id:Ds}})}function fg(e){return nt.post("/api/settings/update",e,{params:{client_id:Ds}})}function pg(e){return yi.onmessage=e}function hg(e){return yi.onerror=e}const Se={search:Ym,open:Xm,download:Zm,downloadBatch:eg,downloadFileURL:sg,coverFileURL:og,listDownloads:rg,deleteDownload:ig,writePlaylistM3u:lg,getQueue:ag,removeQueueItem:cg,clearQueue:ug,getSettings:dg,setSettings:fg,check_for_update:tg,ws_onmessage:pg,ws_onerror:hg,getVersion:cu},Kt=ee({audio_providers:[""],slskd:{enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256},lyrics_providers:[""],download_lyrics:!0,format:"",bitrate:"320",output:"",generate_m3u:!0,sync_navidrome:!0,navidrome:{enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},organize_by_artist:!1,max_parallel_downloads:3}),mg={audio_providers:["youtube","youtube-music","slskd"],lyrics_providers:["lrclib","genius","musixmatch","azlyrics"],format:["mp3","flac","ogg","opus","m4a"],bitrate:["128","192","256","320"],max_parallel_downloads:[1,2,3,5,8],output:"{artists} - {title}.{output-ext}"};Se.getSettings().then(e=>{e.status===200?(console.log("Received settings:",e.data),Kt.value={...Kt.value,...e.data,slskd:{...Kt.value.slskd,...e.data.slskd||{}},navidrome:{...Kt.value.navidrome,...e.data.navidrome||{}}}):console.log("Error loading settings")});function uu(){const e=ee(),t=ee("");function n(){var i,l;const o=((i=Kt.value)==null?void 0:i.slskd)||{};if(o.enabled){if(!String(o.base_url||"").trim())return"slskd base URL is required when enabled";if(!String(o.api_key||"").trim())return"slskd API key is required when enabled"}const r=((l=Kt.value)==null?void 0:l.navidrome)||{};if(r.enabled){if(!String(r.url||"").trim())return"Navidrome URL is required when enabled";if(!String(r.username||"").trim())return"Navidrome username is required when enabled";if(!String(r.password||""))return"Navidrome password is required when enabled"}return""}function s(){console.log("Saving settings:",Kt.value);const o=n();if(o){t.value=o,e.value=!1,setTimeout(()=>{e.value=null},2500);return}t.value="",Se.setSettings(Kt.value).then(r=>{if(r.status===200){console.log("Saved!"),e.value=!0;const i=document.getElementById("settings-modal");i&&"checked"in i&&(i.checked=!1),setTimeout(()=>{e.value=null},2e3)}else console.error("Error saving settings.",r),t.value="Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2e3)}).catch(r=>{var l,a;const i=(a=(l=r==null?void 0:r.response)==null?void 0:l.data)==null?void 0:a.detail;t.value=typeof i=="string"&&i.trim()?i:"Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2500)})}return{saveSettings:s,settings:Kt,settingsOptions:mg,isSaved:e,saveErrorText:t}}const gg={class:"modal modal-bottom sm:modal-middle"},yg={class:"modal-box surface-strong rounded-t-3xl sm:rounded-3xl p-0 max-w-lg"},vg={class:"flex items-center justify-between px-6 py-4 border-b border-white/5"},bg={class:"text-lg font-bold tracking-tight"},_g={class:"text-xs text-base-content/50 mt-0.5"},xg=["title"],wg={class:"px-6 py-5 space-y-6"},kg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Sg=["value"],Eg=["value"],Ag={class:"text-[11px] text-base-content/40 mt-1.5"},Rg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Cg={class:"text-[11px] text-base-content/40 mb-2"},Tg={class:"grid grid-cols-2 gap-2"},Pg=["onClick"],Og={key:0,class:"absolute top-1 right-1 text-[10px] font-bold opacity-80"},Dg={key:0,class:"mt-2 space-y-1 text-sm"},Ng={class:"text-xs opacity-50 w-4"},Ig={class:"flex-1"},$g=["disabled","onClick"],Lg=["disabled","onClick"],Mg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ug={class:"text-[11px] text-base-content/40 mb-2"},Fg={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Bg={class:"flex-1 text-sm"},Hg={class:"block"},jg={class:"block text-[11px] text-base-content/50"},qg={key:0,class:"grid grid-cols-1 gap-2"},Vg=["placeholder"],Kg=["placeholder"],Wg={class:"rounded-xl border border-white/10 bg-base-100/50 px-3 py-2.5 space-y-2"},zg={class:"text-[11px] font-semibold text-base-content/70"},Gg={class:"text-[11px] text-base-content/50 space-y-1 list-disc pl-4"},Qg={class:"text-[10px] leading-relaxed text-base-content/60 whitespace-pre-wrap font-mono bg-base-300/30 rounded-lg px-2 py-1.5"},Jg={class:"text-[11px] text-base-content/50"},Yg=["placeholder"],Xg={class:"text-[11px] text-base-content/40"},Zg={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mt-2"},ey={class:"block text-sm font-medium"},ty={class:"block text-[11px] text-base-content/50 mt-0.5"},ny={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 mt-2"},sy={class:"text-[11px] text-base-content/50"},oy={class:"text-[11px] text-base-content/50"},ry={class:"text-[11px] text-base-content/40"},iy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},ly={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},ay={class:"flex-1 text-sm"},cy={class:"block"},uy={class:"block text-[11px] text-base-content/50"},dy={class:"flex items-baseline justify-between mb-1.5"},fy={class:"text-xs text-base-content/50"},py={class:"text-[10px] text-base-content/40"},hy=["disabled"],my=["value"],gy={class:"grid grid-cols-2 gap-3"},yy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},vy=["value"],by={class:"flex items-baseline justify-between mb-2"},_y={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50"},xy={key:0,class:"text-[10px] text-base-content/40"},wy=["disabled"],ky=["value"],Sy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ey={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Ay={class:"flex-1 text-sm"},Ry={class:"block"},Cy={class:"block text-[11px] text-base-content/50"},Ty={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Py={class:"flex-1 text-sm"},Oy={class:"block"},Dy={class:"block text-[11px] text-base-content/50"},Ny={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Iy={class:"text-[11px] text-base-content/40 mb-2"},$y={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Ly={class:"flex-1 text-sm"},My={class:"block"},Uy={class:"block text-[11px] text-base-content/50"},Fy={key:0,class:"grid grid-cols-1 gap-2"},By=["placeholder"],Hy=["placeholder"],jy=["placeholder"],qy=["placeholder"],Vy=["placeholder"],Ky={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Wy={class:"flex-1 text-sm"},zy={class:"block"},Gy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Qy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Jy={class:"flex-1 text-sm"},Yy={class:"block"},Xy={class:"block text-[11px] text-base-content/50"},Zy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},ev={class:"grid grid-cols-5 gap-1.5"},tv=["onClick"],nv={class:"text-[11px] text-base-content/40 mt-1.5"},sv={key:0,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-primary"},ov={key:1,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-error"},rv={class:"flex items-center justify-end gap-2 px-6 py-4 border-t border-white/5"},iv={for:"settings-modal",class:"btn btn-sm h-10 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 cursor-pointer"},lv={class:"modal-backdrop",for:"settings-modal"},Wn={__name:"Settings",setup(e){const t=uu(),{t:n,locale:s,setLocale:o,locales:r}=wt(),i={enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},l={enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256};Hs(()=>{var v;const b=(v=t.settings.value)==null?void 0:v.slskd;if(!b||typeof b!="object"){t.settings.value.slskd={...l};return}for(const[h,E]of Object.entries(l))(b[h]===void 0||b[h]===null)&&(b[h]=E)}),Hs(()=>{var v;const b=(v=t.settings.value)==null?void 0:v.navidrome;if(!b||typeof b!="object"){t.settings.value.navidrome={...i};return}for(const[h,E]of Object.entries(i))(b[h]===void 0||b[h]===null)&&(b[h]=E)}),Hs(()=>{var b;((b=t.settings.value)==null?void 0:b.sync_navidrome)===void 0&&(t.settings.value.sync_navidrome=!0)}),Hs(()=>{var v;const b=(v=t.settings.value)==null?void 0:v.audio_providers;(!Array.isArray(b)||b.length===0)&&(t.settings.value.audio_providers=["youtube-music"])});function a(b){return b==="youtube-music"?"YouTube Music":b==="youtube"?"YouTube":b==="slskd"?"slskd":b}const d=["slskd","youtube-music","youtube"];function c(b){var h;return(((h=t.settings.value)==null?void 0:h.audio_providers)||[]).indexOf(b)}function f(b){const v=[...t.settings.value.audio_providers||[]],h=v.indexOf(b);h>=0?v.splice(h,1):v.push(b),t.settings.value.audio_providers=v.length>0?v:["youtube-music"]}function m(b,v){const h=[...t.settings.value.audio_providers||[]],E=b+v;E<0||E>=h.length||([h[b],h[E]]=[h[E],h[b]],t.settings.value.audio_providers=h)}function y(){var v,h;const b=!!((h=(v=t.settings.value)==null?void 0:v.slskd)!=null&&h.enabled);t.settings.value.audio_providers=b?[...d]:["youtube-music","youtube"]}return(b,v)=>(A(),P(ce,null,[v[23]||(v[23]=p("input",{type:"checkbox",id:"settings-modal",class:"modal-toggle"},null,-1)),p("div",gg,[p("div",yg,[p("div",vg,[p("div",null,[p("h3",bg,w(u(n)("settings.title")),1),p("p",_g,w(u(n)("settings.subtitle")),1)]),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(n)("common.close")},[M(u(W),{icon:"clarity:close-line",class:"h-5 w-5"})],8,xg)]),p("div",wg,[p("div",null,[p("label",kg,w(u(n)("settings.language")),1),p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",value:u(s),onChange:v[0]||(v[0]=h=>u(o)(h.target.value))},[(A(!0),P(ce,null,$e(u(r),h=>(A(),P("option",{key:h.code,value:h.code},w(h.name),9,Eg))),128))],40,Sg),p("p",Ag,w(u(n)("settings.languageHint")),1)]),p("div",null,[p("label",Rg,w(u(n)("settings.audioSource")),1),p("p",Cg,w(u(n)("settings.audioSourceHint")),1),p("div",Tg,[(A(!0),P(ce,null,$e(u(t).settingsOptions.audio_providers,h=>(A(),P("button",{key:h,type:"button",class:Ee(["rounded-xl border px-3 py-2 text-sm transition-colors text-left relative",[c(h)>=0?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:E=>f(h)},[c(h)>=0?(A(),P("span",Og,w(c(h)+1),1)):he("",!0),Oe(" "+w(a(h)),1)],10,Pg))),128))]),u(t).settings.value.audio_providers.length?(A(),P("ul",Dg,[(A(!0),P(ce,null,$e(u(t).settings.value.audio_providers,(h,E)=>(A(),P("li",{key:h,class:"flex items-center gap-2 rounded-lg border border-white/10 px-2 py-1"},[p("span",Ng,w(E+1),1),p("span",Ig,w(a(h)),1),p("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:E===0,onClick:C=>m(E,-1)}," ↑ ",8,$g),p("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:E===u(t).settings.value.audio_providers.length-1,onClick:C=>m(E,1)}," ↓ ",8,Lg)]))),128))])):he("",!0),p("button",{type:"button",class:"btn btn-xs btn-ghost rounded-lg mt-2",onClick:y},w(u(n)("settings.audioSourceReset")),1)]),p("div",null,[p("label",Mg,w(u(n)("settings.slskdSection")),1),p("p",Ug,w(u(n)("settings.slskdHint")),1),p("label",Fg,[ke(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[1]||(v[1]=h=>u(t).settings.value.slskd.enabled=h)},null,512),[[Zt,u(t).settings.value.slskd.enabled]]),p("span",Bg,[p("span",Hg,w(u(n)("settings.slskdEnabled")),1),p("span",jg,w(u(n)("settings.slskdEnabledHint")),1)])]),u(t).settings.value.slskd.enabled?(A(),P("div",qg,[ke(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.slskdBaseUrl"),"onUpdate:modelValue":v[2]||(v[2]=h=>u(t).settings.value.slskd.base_url=h)},null,8,Vg),[[ft,u(t).settings.value.slskd.base_url]]),ke(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.slskdApiKey"),"onUpdate:modelValue":v[3]||(v[3]=h=>u(t).settings.value.slskd.api_key=h)},null,8,Kg),[[ft,u(t).settings.value.slskd.api_key]]),p("div",Wg,[p("p",zg,w(u(n)("settings.slskdSourceDirTitle")),1),p("ul",Gg,[p("li",null,w(u(n)("settings.slskdSourceDirBullet1")),1),p("li",null,w(u(n)("settings.slskdSourceDirBullet2")),1),p("li",null,w(u(n)("settings.slskdSourceDirBullet3")),1)]),p("pre",Qg,w(u(n)("settings.slskdSourceDirExample")),1)]),p("label",Jg,w(u(n)("settings.slskdSourceDirLabel")),1),ke(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 font-mono text-sm",type:"text",placeholder:u(n)("settings.slskdSourceDirPlaceholder"),"onUpdate:modelValue":v[4]||(v[4]=h=>u(t).settings.value.slskd.source_dir=h)},null,8,Yg),[[ft,u(t).settings.value.slskd.source_dir]]),p("p",Xg,w(u(n)("settings.slskdSourceDirHint")),1),p("label",Zg,[ke(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[5]||(v[5]=h=>u(t).settings.value.slskd.leave_in_place=h)},null,512),[[Zt,u(t).settings.value.slskd.leave_in_place]]),p("span",null,[p("span",ey,w(u(n)("settings.slskdLeaveInPlace")),1),p("span",ty,w(u(n)("settings.slskdLeaveInPlaceHint")),1)])]),p("div",ny,[p("label",sy,[Oe(w(u(n)("settings.slskdDownloadTimeout"))+" ",1),ke(p("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"30",max:"3600","onUpdate:modelValue":v[6]||(v[6]=h=>u(t).settings.value.slskd.download_timeout_seconds=h)},null,512),[[ft,u(t).settings.value.slskd.download_timeout_seconds,void 0,{number:!0}]])]),p("label",oy,[Oe(w(u(n)("settings.slskdQueuedTimeout"))+" ",1),ke(p("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"15",max:"3600","onUpdate:modelValue":v[7]||(v[7]=h=>u(t).settings.value.slskd.queued_timeout_seconds=h)},null,512),[[ft,u(t).settings.value.slskd.queued_timeout_seconds,void 0,{number:!0}]])])]),p("p",ry,w(u(n)("settings.slskdTimeoutHint")),1)])):he("",!0)]),p("div",null,[p("label",iy,w(u(n)("settings.lyricsSource")),1),p("label",ly,[ke(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[8]||(v[8]=h=>u(t).settings.value.download_lyrics=h)},null,512),[[Zt,u(t).settings.value.download_lyrics]]),p("span",ay,[p("span",cy,w(u(n)("settings.downloadLyrics")),1),p("span",uy,w(u(n)("settings.downloadLyricsHint")),1)])]),p("div",dy,[p("span",fy,w(u(n)("settings.lyricsProvider")),1),p("span",py,w(u(n)("settings.lyricsHint")),1)]),ke(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 disabled:opacity-40","onUpdate:modelValue":v[9]||(v[9]=h=>u(t).settings.value.lyrics_providers[0]=h),disabled:!u(t).settings.value.download_lyrics},[(A(!0),P(ce,null,$e(u(t).settingsOptions.lyrics_providers,h=>(A(),P("option",{key:h,value:h},w(h),9,my))),128))],8,hy),[[Ys,u(t).settings.value.lyrics_providers[0]]])]),p("div",gy,[p("div",null,[p("label",yy,w(u(n)("settings.format")),1),ke(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":v[10]||(v[10]=h=>u(t).settings.value.format=h)},[(A(!0),P(ce,null,$e(u(t).settingsOptions.format,h=>(A(),P("option",{key:h,value:h},w(h.toUpperCase()),9,vy))),128))],512),[[Ys,u(t).settings.value.format]])]),p("div",null,[p("div",by,[p("label",_y,w(u(n)("settings.quality")),1),u(t).settings.value.format==="flac"?(A(),P("span",xy,w(u(n)("settings.qualityIgnored")),1)):he("",!0)]),ke(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":v[11]||(v[11]=h=>u(t).settings.value.bitrate=h),disabled:u(t).settings.value.format==="flac"},[(A(!0),P(ce,null,$e(u(t).settingsOptions.bitrate,h=>(A(),P("option",{key:h,value:h},w(h)+" kbps ",9,ky))),128))],8,wy),[[Ys,u(t).settings.value.bitrate]])])]),p("div",null,[p("label",Sy,w(u(n)("settings.playlistsSection")),1),p("label",Ey,[ke(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[12]||(v[12]=h=>u(t).settings.value.generate_m3u=h)},null,512),[[Zt,u(t).settings.value.generate_m3u]]),p("span",Ay,[p("span",Ry,w(u(n)("settings.generateM3u")),1),p("span",Cy,w(u(n)("settings.generateM3uHint")),1)])]),p("label",Ty,[ke(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[13]||(v[13]=h=>u(t).settings.value.sync_navidrome=h)},null,512),[[Zt,u(t).settings.value.sync_navidrome]]),p("span",Py,[p("span",Oy,w(u(n)("settings.syncNavidrome")),1),p("span",Dy,w(u(n)("settings.syncNavidromeHint")),1)])])]),p("div",null,[p("label",Ny,w(u(n)("settings.navidromeSection")),1),p("p",Iy,w(u(n)("settings.navidromeHint")),1),p("label",$y,[ke(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[14]||(v[14]=h=>u(t).settings.value.navidrome.enabled=h)},null,512),[[Zt,u(t).settings.value.navidrome.enabled]]),p("span",Ly,[p("span",My,w(u(n)("settings.navidromeEnabled")),1),p("span",Uy,w(u(n)("settings.navidromeEnabledHint")),1)])]),u(t).settings.value.navidrome.enabled?(A(),P("div",Fy,[ke(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeUrl"),"onUpdate:modelValue":v[15]||(v[15]=h=>u(t).settings.value.navidrome.url=h)},null,8,By),[[ft,u(t).settings.value.navidrome.url]]),ke(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeUsername"),"onUpdate:modelValue":v[16]||(v[16]=h=>u(t).settings.value.navidrome.username=h)},null,8,Hy),[[ft,u(t).settings.value.navidrome.username]]),ke(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.navidromePassword"),"onUpdate:modelValue":v[17]||(v[17]=h=>u(t).settings.value.navidrome.password=h)},null,8,jy),[[ft,u(t).settings.value.navidrome.password]]),ke(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeAdminUser"),"onUpdate:modelValue":v[18]||(v[18]=h=>u(t).settings.value.navidrome.admin_username=h)},null,8,qy),[[ft,u(t).settings.value.navidrome.admin_username]]),ke(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.navidromeAdminPassword"),"onUpdate:modelValue":v[19]||(v[19]=h=>u(t).settings.value.navidrome.admin_password=h)},null,8,Vy),[[ft,u(t).settings.value.navidrome.admin_password]]),p("label",Ky,[ke(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[20]||(v[20]=h=>u(t).settings.value.navidrome.public_playlist=h)},null,512),[[Zt,u(t).settings.value.navidrome.public_playlist]]),p("span",Wy,[p("span",zy,w(u(n)("settings.navidromePublic")),1)])])])):he("",!0)]),p("div",null,[p("label",Gy,w(u(n)("settings.organizationSection")),1),p("label",Qy,[ke(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[21]||(v[21]=h=>u(t).settings.value.organize_by_artist=h)},null,512),[[Zt,u(t).settings.value.organize_by_artist]]),p("span",Jy,[p("span",Yy,w(u(n)("settings.organizeByArtist")),1),p("span",Xy,w(u(n)("settings.organizeByArtistHint")),1)])])]),p("div",null,[p("label",Zy,w(u(n)("settings.parallelDownloads")),1),p("div",ev,[(A(!0),P(ce,null,$e(u(t).settingsOptions.max_parallel_downloads,h=>(A(),P("button",{key:h,type:"button",class:Ee(["rounded-xl border px-2 py-2 text-sm font-medium transition-colors text-center",[u(t).settings.value.max_parallel_downloads===h?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:E=>u(t).settings.value.max_parallel_downloads=h},w(h),11,tv))),128))]),p("p",nv,w(u(n)("settings.parallelDownloadsHint")),1)]),M(Rc,{"enter-active-class":"transition duration-200","enter-from-class":"opacity-0 -translate-y-1","enter-to-class":"opacity-100 translate-y-0","leave-active-class":"transition duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:lo(()=>[u(t).isSaved.value===!0?(A(),P("div",sv,[M(u(W),{icon:"clarity:check-line",class:"h-4 w-4 shrink-0"}),Oe(" "+w(u(n)("settings.saved")),1)])):u(t).isSaved.value===!1?(A(),P("div",ov,[M(u(W),{icon:"clarity:exclamation-circle-line",class:"h-4 w-4 shrink-0"}),Oe(" "+w(u(t).saveErrorText.value||u(n)("settings.saveError")),1)])):he("",!0)]),_:1})]),p("div",rv,[p("label",iv,w(u(n)("common.cancel")),1),p("button",{class:"btn btn-primary btn-sm h-10 px-6 rounded-full",onClick:v[22]||(v[22]=h=>u(t).saveSettings())},w(u(n)("common.save")),1)])]),p("label",lv,w(u(n)("common.close")),1)])],64))}},Ot=ee(""),Gl=ee("light"),Ql=ee("dark");function vi({useSystem:e=!0,initialTheme:t="",newLightAlias:n="",newDarkAlias:s=""}={}){function o(c){Gl.value=c,d()}function r(c){Ql.value=c,d()}function i(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function l(c){Ot.value=c,d()}function a(){Ot==="dark"?Ot.value="light":Ot==="light"&&(Ot.value="dark"),d()}function d(){document.documentElement.setAttribute("data-theme",Ot.value==="dark"?Ql.value:Gl.value)}return Ot.value!=="light"&&Ot.value!=="dark"&&(e&&l(i()),(t==="light"||t==="dark")&&(Ot.value=t)),n&&o(n),s&&r(s),d(),{currentTheme:Ot,setLightAlias:o,setDarkAlias:r,getSystemTheme:i,setTheme:l,switchTheme:a}}const av={class:"min-h-dvh flex flex-col text-base-content"},cv={__name:"App",setup(e){const t=vi();return Za(()=>{t.setLightAlias("downtify-light"),t.setDarkAlias("downtify-dark")}),(n,s)=>{const o=xr("router-view");return A(),P("div",av,[M(o,null,{default:lo(({Component:r,route:i})=>[M(Rc,{name:"page",mode:"out-in"},{default:lo(()=>[(A(),lt(Ud(r),{key:i.fullPath}))]),_:2},1024)]),_:1}),M(gp),M(Wn)])}}};/*! + * vue-router v4.6.4 + * (c) 2025 Eduardo San Martin Morote + * @license MIT + */const Tn=typeof document<"u";function du(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function uv(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&du(e.default)}const fe=Object.assign;function lr(e,t){const n={};for(const s in t){const o=t[s];n[s]=xt(o)?o.map(e):e(o)}return n}const ds=()=>{},xt=Array.isArray;function Jl(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}const fu=/#/g,dv=/&/g,fv=/\//g,pv=/=/g,hv=/\?/g,pu=/\+/g,mv=/%5B/g,gv=/%5D/g,hu=/%5E/g,yv=/%60/g,mu=/%7B/g,vv=/%7C/g,gu=/%7D/g,bv=/%20/g;function bi(e){return e==null?"":encodeURI(""+e).replace(vv,"|").replace(mv,"[").replace(gv,"]")}function _v(e){return bi(e).replace(mu,"{").replace(gu,"}").replace(hu,"^")}function Lr(e){return bi(e).replace(pu,"%2B").replace(bv,"+").replace(fu,"%23").replace(dv,"%26").replace(yv,"`").replace(mu,"{").replace(gu,"}").replace(hu,"^")}function xv(e){return Lr(e).replace(pv,"%3D")}function wv(e){return bi(e).replace(fu,"%23").replace(hv,"%3F")}function kv(e){return wv(e).replace(fv,"%2F")}function ks(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const Sv=/\/$/,Ev=e=>e.replace(Sv,"");function ar(e,t,n="/"){let s,o={},r="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return a=l>=0&&a>l?-1:a,a>=0&&(s=t.slice(0,a),r=t.slice(a,l>0?l:t.length),o=e(r.slice(1))),l>=0&&(s=s||t.slice(0,l),i=t.slice(l,t.length)),s=Tv(s??t,n),{fullPath:s+r+i,path:s,query:o,hash:ks(i)}}function Av(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Yl(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Rv(e,t,n){const s=t.matched.length-1,o=n.matched.length-1;return s>-1&&s===o&&Bn(t.matched[s],n.matched[o])&&yu(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Bn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function yu(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Cv(e[n],t[n]))return!1;return!0}function Cv(e,t){return xt(e)?Xl(e,t):xt(t)?Xl(t,e):(e==null?void 0:e.valueOf())===(t==null?void 0:t.valueOf())}function Xl(e,t){return xt(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function Tv(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),o=s[s.length-1];(o===".."||o===".")&&s.push("");let r=n.length-1,i,l;for(i=0;i1&&r--;else break;return n.slice(0,r).join("/")+"/"+s.slice(i).join("/")}const en={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Mr=function(e){return e.pop="pop",e.push="push",e}({}),cr=function(e){return e.back="back",e.forward="forward",e.unknown="",e}({});function Pv(e){if(!e)if(Tn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Ev(e)}const Ov=/^[^#]+#/;function Dv(e,t){return e.replace(Ov,"#")+t}function Nv(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Fo=()=>({left:window.scrollX,top:window.scrollY});function Iv(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Nv(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Zl(e,t){return(history.state?history.state.position-t:-1)+e}const Ur=new Map;function $v(e,t){Ur.set(e,t)}function Lv(e){const t=Ur.get(e);return Ur.delete(e),t}function Mv(e){return typeof e=="string"||e&&typeof e=="object"}function vu(e){return typeof e=="string"||typeof e=="symbol"}let Re=function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e}({});const bu=Symbol("");Re.MATCHER_NOT_FOUND+"",Re.NAVIGATION_GUARD_REDIRECT+"",Re.NAVIGATION_ABORTED+"",Re.NAVIGATION_CANCELLED+"",Re.NAVIGATION_DUPLICATED+"";function Hn(e,t){return fe(new Error,{type:e,[bu]:!0},t)}function Bt(e,t){return e instanceof Error&&bu in e&&(t==null||!!(e.type&t))}const Uv=["params","query","hash"];function Fv(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of Uv)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function Bv(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;so&&Lr(o)):[s&&Lr(s)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function Hv(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=xt(s)?s.map(o=>o==null?null:""+o):s==null?s:""+s)}return t}const jv=Symbol(""),ta=Symbol(""),Bo=Symbol(""),_i=Symbol(""),Fr=Symbol("");function ts(){let e=[];function t(s){return e.push(s),()=>{const o=e.indexOf(s);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function sn(e,t,n,s,o,r=i=>i()){const i=s&&(s.enterCallbacks[o]=s.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const d=m=>{m===!1?a(Hn(Re.NAVIGATION_ABORTED,{from:n,to:t})):m instanceof Error?a(m):Mv(m)?a(Hn(Re.NAVIGATION_GUARD_REDIRECT,{from:t,to:m})):(i&&s.enterCallbacks[o]===i&&typeof m=="function"&&i.push(m),l())},c=r(()=>e.call(s&&s.instances[o],t,n,d));let f=Promise.resolve(c);e.length<3&&(f=f.then(d)),f.catch(m=>a(m))})}function ur(e,t,n,s,o=r=>r()){const r=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(du(a)){const d=(a.__vccOpts||a)[t];d&&r.push(sn(d,n,s,i,l,o))}else{let d=a();r.push(()=>d.then(c=>{if(!c)throw new Error(`Couldn't resolve component "${l}" at "${i.path}"`);const f=uv(c)?c.default:c;i.mods[l]=c,i.components[l]=f;const m=(f.__vccOpts||f)[t];return m&&sn(m,n,s,i,l,o)()}))}}return r}function qv(e,t){const n=[],s=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let i=0;iBn(d,l))?s.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(d=>Bn(d,a))||o.push(a))}return[n,s,o]}/*! + * vue-router v4.6.4 + * (c) 2025 Eduardo San Martin Morote + * @license MIT + */let Vv=()=>location.protocol+"//"+location.host;function _u(e,t){const{pathname:n,search:s,hash:o}=t,r=e.indexOf("#");if(r>-1){let i=o.includes(e.slice(r))?e.slice(r).length:1,l=o.slice(i);return l[0]!=="/"&&(l="/"+l),Yl(l,"")}return Yl(n,e)+s+o}function Kv(e,t,n,s){let o=[],r=[],i=null;const l=({state:m})=>{const y=_u(e,location),b=n.value,v=t.value;let h=0;if(m){if(n.value=y,t.value=m,i&&i===b){i=null;return}h=v?m.position-v.position:0}else s(y);o.forEach(E=>{E(n.value,b,{delta:h,type:Mr.pop,direction:h?h>0?cr.forward:cr.back:cr.unknown})})};function a(){i=n.value}function d(m){o.push(m);const y=()=>{const b=o.indexOf(m);b>-1&&o.splice(b,1)};return r.push(y),y}function c(){if(document.visibilityState==="hidden"){const{history:m}=window;if(!m.state)return;m.replaceState(fe({},m.state,{scroll:Fo()}),"")}}function f(){for(const m of r)m();r=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:a,listen:d,destroy:f}}function na(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Fo():null}}function Wv(e){const{history:t,location:n}=window,s={value:_u(e,n)},o={value:t.state};o.value||r(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(a,d,c){const f=e.indexOf("#"),m=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:Vv()+e+a;try{t[c?"replaceState":"pushState"](d,"",m),o.value=d}catch(y){console.error(y),n[c?"replace":"assign"](m)}}function i(a,d){r(a,fe({},t.state,na(o.value.back,a,o.value.forward,!0),d,{position:o.value.position}),!0),s.value=a}function l(a,d){const c=fe({},o.value,t.state,{forward:a,scroll:Fo()});r(c.current,c,!0),r(a,fe({},na(s.value,a,null),{position:c.position+1},d),!1),s.value=a}return{location:s,state:o,push:l,replace:i}}function zv(e){e=Pv(e);const t=Wv(e),n=Kv(e,t.state,t.location,t.replace);function s(r,i=!0){i||n.pauseListeners(),history.go(r)}const o=fe({location:"",base:e,go:s,createHref:Dv.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let xn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Ne=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Ne||{});const Gv={type:xn.Static,value:""},Qv=/[a-zA-Z0-9_]/;function Jv(e){if(!e)return[[]];if(e==="/")return[[Gv]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(y){throw new Error(`ERR (${n})/"${d}": ${y}`)}let n=Ne.Static,s=n;const o=[];let r;function i(){r&&o.push(r),r=[]}let l=0,a,d="",c="";function f(){d&&(n===Ne.Static?r.push({type:xn.Static,value:d}):n===Ne.Param||n===Ne.ParamRegExp||n===Ne.ParamRegExpEnd?(r.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),r.push({type:xn.Param,value:d,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),d="")}function m(){d+=a}for(;lt.length?t.length===1&&t[0]===Ke.Static+Ke.Segment?1:-1:0}function xu(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const tb={strict:!1,end:!0,sensitive:!1};function nb(e,t,n){const s=Zv(Jv(e.path),n),o=fe(s,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function sb(e,t){const n=[],s=new Map;t=Jl(tb,t);function o(f){return s.get(f)}function r(f,m,y){const b=!y,v=ia(f);v.aliasOf=y&&y.record;const h=Jl(t,f),E=[v];if("alias"in f){const R=typeof f.alias=="string"?[f.alias]:f.alias;for(const L of R)E.push(ia(fe({},v,{components:y?y.record.components:v.components,path:L,aliasOf:y?y.record:v})))}let C,S;for(const R of E){const{path:L}=R;if(m&&L[0]!=="/"){const T=m.record.path,U=T[T.length-1]==="/"?"":"/";R.path=m.record.path+(L&&U+L)}if(C=nb(R,m,h),y?y.alias.push(C):(S=S||C,S!==C&&S.alias.push(C),b&&f.name&&!la(C)&&i(f.name)),wu(C)&&a(C),v.children){const T=v.children;for(let U=0;U{i(S)}:ds}function i(f){if(vu(f)){const m=s.get(f);m&&(s.delete(f),n.splice(n.indexOf(m),1),m.children.forEach(i),m.alias.forEach(i))}else{const m=n.indexOf(f);m>-1&&(n.splice(m,1),f.record.name&&s.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function l(){return n}function a(f){const m=ib(f,n);n.splice(m,0,f),f.record.name&&!la(f)&&s.set(f.record.name,f)}function d(f,m){let y,b={},v,h;if("name"in f&&f.name){if(y=s.get(f.name),!y)throw Hn(Re.MATCHER_NOT_FOUND,{location:f});h=y.record.name,b=fe(ra(m.params,y.keys.filter(S=>!S.optional).concat(y.parent?y.parent.keys.filter(S=>S.optional):[]).map(S=>S.name)),f.params&&ra(f.params,y.keys.map(S=>S.name))),v=y.stringify(b)}else if(f.path!=null)v=f.path,y=n.find(S=>S.re.test(v)),y&&(b=y.parse(v),h=y.record.name);else{if(y=m.name?s.get(m.name):n.find(S=>S.re.test(m.path)),!y)throw Hn(Re.MATCHER_NOT_FOUND,{location:f,currentLocation:m});h=y.record.name,b=fe({},m.params,f.params),v=y.stringify(b)}const E=[];let C=y;for(;C;)E.unshift(C.record),C=C.parent;return{name:h,path:v,params:b,matched:E,meta:rb(E)}}e.forEach(f=>r(f));function c(){n.length=0,s.clear()}return{addRoute:r,resolve:d,removeRoute:i,clearRoutes:c,getRoutes:l,getRecordMatcher:o}}function ra(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function ia(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:ob(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function ob(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function la(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function rb(e){return e.reduce((t,n)=>fe(t,n.meta),{})}function ib(e,t){let n=0,s=t.length;for(;n!==s;){const r=n+s>>1;xu(e,t[r])<0?s=r:n=r+1}const o=lb(e);return o&&(s=t.lastIndexOf(o,s-1)),s}function lb(e){let t=e;for(;t=t.parent;)if(wu(t)&&xu(e,t)===0)return t}function wu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function aa(e){const t=vt(Bo),n=vt(_i),s=Ae(()=>{const a=u(e.to);return t.resolve(a)}),o=Ae(()=>{const{matched:a}=s.value,{length:d}=a,c=a[d-1],f=n.matched;if(!c||!f.length)return-1;const m=f.findIndex(Bn.bind(null,c));if(m>-1)return m;const y=ca(a[d-2]);return d>1&&ca(c)===y&&f[f.length-1].path!==y?f.findIndex(Bn.bind(null,a[d-2])):m}),r=Ae(()=>o.value>-1&&fb(n.params,s.value.params)),i=Ae(()=>o.value>-1&&o.value===n.matched.length-1&&yu(n.params,s.value.params));function l(a={}){if(db(a)){const d=t[u(e.replace)?"replace":"push"](u(e.to)).catch(ds);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:Ae(()=>s.value.href),isActive:r,isExactActive:i,navigate:l}}function ab(e){return e.length===1?e[0]:e}const cb=si({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:aa,setup(e,{slots:t}){const n=So(aa(e)),{options:s}=vt(Bo),o=Ae(()=>({[ua(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ua(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const r=t.default&&ab(t.default(n));return e.custom?r:vs("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}}),ub=cb;function db(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function fb(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!xt(o)||o.length!==s.length||s.some((r,i)=>r.valueOf()!==o[i].valueOf()))return!1}return!0}function ca(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ua=(e,t,n)=>e??t??n,pb=si({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=vt(Fr),o=Ae(()=>e.route||s.value),r=vt(ta,0),i=Ae(()=>{let d=u(r);const{matched:c}=o.value;let f;for(;(f=c[d])&&!f.components;)d++;return d}),l=Ae(()=>o.value.matched[i.value]);zs(ta,Ae(()=>i.value+1)),zs(jv,l),zs(Fr,o);const a=ee();return ln(()=>[a.value,l.value,e.name],([d,c,f],[m,y,b])=>{c&&(c.instances[f]=d,y&&y!==c&&d&&d===m&&(c.leaveGuards.size||(c.leaveGuards=y.leaveGuards),c.updateGuards.size||(c.updateGuards=y.updateGuards))),d&&c&&(!y||!Bn(c,y)||!m)&&(c.enterCallbacks[f]||[]).forEach(v=>v(d))},{flush:"post"}),()=>{const d=o.value,c=e.name,f=l.value,m=f&&f.components[c];if(!m)return da(n.default,{Component:m,route:d});const y=f.props[c],b=y?y===!0?d.params:typeof y=="function"?y(d):y:null,h=vs(m,fe({},b,t,{onVnodeUnmounted:E=>{E.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return da(n.default,{Component:h,route:d})||h}}});function da(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const hb=pb;function mb(e){const t=sb(e.routes,e),n=e.parseQuery||Bv,s=e.stringifyQuery||ea,o=e.history,r=ts(),i=ts(),l=ts(),a=fd(en);let d=en;Tn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=lr.bind(null,N=>""+N),f=lr.bind(null,kv),m=lr.bind(null,ks);function y(N,K){let j,G;return vu(N)?(j=t.getRecordMatcher(N),G=K):G=N,t.addRoute(G,j)}function b(N){const K=t.getRecordMatcher(N);K&&t.removeRoute(K)}function v(){return t.getRoutes().map(N=>N.record)}function h(N){return!!t.getRecordMatcher(N)}function E(N,K){if(K=fe({},K||a.value),typeof N=="string"){const x=ar(n,N,K.path),O=t.resolve({path:x.path},K),I=o.createHref(x.fullPath);return fe(x,O,{params:m(O.params),hash:ks(x.hash),redirectedFrom:void 0,href:I})}let j;if(N.path!=null)j=fe({},N,{path:ar(n,N.path,K.path).path});else{const x=fe({},N.params);for(const O in x)x[O]==null&&delete x[O];j=fe({},N,{params:f(x)}),K.params=f(K.params)}const G=t.resolve(j,K),ie=N.hash||"";G.params=c(m(G.params));const g=Av(s,fe({},N,{hash:_v(ie),path:G.path})),_=o.createHref(g);return fe({fullPath:g,hash:ie,query:s===ea?Hv(N.query):N.query||{}},G,{redirectedFrom:void 0,href:_})}function C(N){return typeof N=="string"?ar(n,N,a.value.path):fe({},N)}function S(N,K){if(d!==N)return Hn(Re.NAVIGATION_CANCELLED,{from:K,to:N})}function R(N){return U(N)}function L(N){return R(fe(C(N),{replace:!0}))}function T(N,K){const j=N.matched[N.matched.length-1];if(j&&j.redirect){const{redirect:G}=j;let ie=typeof G=="function"?G(N,K):G;return typeof ie=="string"&&(ie=ie.includes("?")||ie.includes("#")?ie=C(ie):{path:ie},ie.params={}),fe({query:N.query,hash:N.hash,params:ie.path!=null?{}:N.params},ie)}}function U(N,K){const j=d=E(N),G=a.value,ie=N.state,g=N.force,_=N.replace===!0,x=T(j,G);if(x)return U(fe(C(x),{state:typeof x=="object"?fe({},ie,x.state):ie,force:g,replace:_}),K||j);const O=j;O.redirectedFrom=K;let I;return!g&&Rv(s,G,j)&&(I=Hn(Re.NAVIGATION_DUPLICATED,{to:O,from:G}),De(G,G,!0,!1)),(I?Promise.resolve(I):ne(O,G)).catch(D=>Bt(D)?Bt(D,Re.NAVIGATION_GUARD_REDIRECT)?D:St(D):se(D,O,G)).then(D=>{if(D){if(Bt(D,Re.NAVIGATION_GUARD_REDIRECT))return U(fe({replace:_},C(D.to),{state:typeof D.to=="object"?fe({},ie,D.to.state):ie,force:g}),K||O)}else D=q(O,G,!0,_,ie);return ge(O,G,D),D})}function ae(N,K){const j=S(N,K);return j?Promise.reject(j):Promise.resolve()}function z(N){const K=mt.values().next().value;return K&&typeof K.runWithContext=="function"?K.runWithContext(N):N()}function ne(N,K){let j;const[G,ie,g]=qv(N,K);j=ur(G.reverse(),"beforeRouteLeave",N,K);for(const x of G)x.leaveGuards.forEach(O=>{j.push(sn(O,N,K))});const _=ae.bind(null,N,K);return j.push(_),ct(j).then(()=>{j=[];for(const x of r.list())j.push(sn(x,N,K));return j.push(_),ct(j)}).then(()=>{j=ur(ie,"beforeRouteUpdate",N,K);for(const x of ie)x.updateGuards.forEach(O=>{j.push(sn(O,N,K))});return j.push(_),ct(j)}).then(()=>{j=[];for(const x of g)if(x.beforeEnter)if(xt(x.beforeEnter))for(const O of x.beforeEnter)j.push(sn(O,N,K));else j.push(sn(x.beforeEnter,N,K));return j.push(_),ct(j)}).then(()=>(N.matched.forEach(x=>x.enterCallbacks={}),j=ur(g,"beforeRouteEnter",N,K,z),j.push(_),ct(j))).then(()=>{j=[];for(const x of i.list())j.push(sn(x,N,K));return j.push(_),ct(j)}).catch(x=>Bt(x,Re.NAVIGATION_CANCELLED)?x:Promise.reject(x))}function ge(N,K,j){l.list().forEach(G=>z(()=>G(N,K,j)))}function q(N,K,j,G,ie){const g=S(N,K);if(g)return g;const _=K===en,x=Tn?history.state:{};j&&(G||_?o.replace(N.fullPath,fe({scroll:_&&x&&x.scroll},ie)):o.push(N.fullPath,ie)),a.value=N,De(N,K,j,_),St()}let oe;function _e(){oe||(oe=o.listen((N,K,j)=>{if(!At.listening)return;const G=E(N),ie=T(G,At.currentRoute.value);if(ie){U(fe(ie,{replace:!0,force:!0}),G).catch(ds);return}d=G;const g=a.value;Tn&&$v(Zl(g.fullPath,j.delta),Fo()),ne(G,g).catch(_=>Bt(_,Re.NAVIGATION_ABORTED|Re.NAVIGATION_CANCELLED)?_:Bt(_,Re.NAVIGATION_GUARD_REDIRECT)?(U(fe(C(_.to),{force:!0}),G).then(x=>{Bt(x,Re.NAVIGATION_ABORTED|Re.NAVIGATION_DUPLICATED)&&!j.delta&&j.type===Mr.pop&&o.go(-1,!1)}).catch(ds),Promise.reject()):(j.delta&&o.go(-j.delta,!1),se(_,G,g))).then(_=>{_=_||q(G,g,!1),_&&(j.delta&&!Bt(_,Re.NAVIGATION_CANCELLED)?o.go(-j.delta,!1):j.type===Mr.pop&&Bt(_,Re.NAVIGATION_ABORTED|Re.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),ge(G,g,_)}).catch(ds)}))}let Me=ts(),re=ts(),ue;function se(N,K,j){St(N);const G=re.list();return G.length?G.forEach(ie=>ie(N,K,j)):console.error(N),Promise.reject(N)}function at(){return ue&&a.value!==en?Promise.resolve():new Promise((N,K)=>{Me.add([N,K])})}function St(N){return ue||(ue=!N,_e(),Me.list().forEach(([K,j])=>N?j(N):K()),Me.reset()),N}function De(N,K,j,G){const{scrollBehavior:ie}=e;if(!Tn||!ie)return Promise.resolve();const g=!j&&Lv(Zl(N.fullPath,0))||(G||!j)&&history.state&&history.state.scroll||null;return ei().then(()=>ie(N,K,g)).then(_=>_&&Iv(_)).catch(_=>se(_,N,K))}const Pe=N=>o.go(N);let Et;const mt=new Set,At={currentRoute:a,listening:!0,addRoute:y,removeRoute:b,clearRoutes:t.clearRoutes,hasRoute:h,getRoutes:v,resolve:E,options:e,push:R,replace:L,go:Pe,back:()=>Pe(-1),forward:()=>Pe(1),beforeEach:r.add,beforeResolve:i.add,afterEach:l.add,onError:re.add,isReady:at,install(N){N.component("RouterLink",ub),N.component("RouterView",hb),N.config.globalProperties.$router=At,Object.defineProperty(N.config.globalProperties,"$route",{enumerable:!0,get:()=>u(a)}),Tn&&!Et&&a.value===en&&(Et=!0,R(o.location).catch(G=>{}));const K={};for(const G in en)Object.defineProperty(K,G,{get:()=>a.value[G],enumerable:!0});N.provide(Bo,At),N.provide(_i,La(K)),N.provide(Fr,a);const j=N.unmount;mt.add(N),N.unmount=function(){mt.delete(N),mt.size<1&&(d=en,oe&&oe(),oe=null,a.value=en,Et=!1,ue=!1),j()}}};function ct(N){return N.reduce((K,j)=>K.then(()=>z(j)),Promise.resolve())}return At}function gb(){return vt(Bo)}function ku(e){return vt(_i)}const xi="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='256'%20height='256'%20viewBox='0%200%2067.733332%2067.733333'%20version='1.1'%20id='svg1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3cdefs%20id='defs1'%20/%3e%3cg%20id='layer1'%3e%3cg%20style='fill:%23040000;fill-opacity:1'%20id='g1'%20transform='matrix(0.06566918,0,0,0.06566918,17.061212,17.059932)'%3e%3cg%20id='g2'%3e%3ccircle%20style='fill:%231ad35d;fill-opacity:1;stroke-width:0.472667'%20id='path2'%20cx='33.866665'%20cy='33.866665'%20r='21.644735'%20transform='matrix(23.824636,0,0,23.824636,-550.95013,-550.93064)'%20/%3e%3cpath%20d='M%20480.6,111.5%20H%20406.5%20V%2035.6%20c%200,-10.7%20-8.3,-19.6%20-19,-20.4%20-104,-7.5%20-200.4,-3.7%20-263,0.8%20-10.7,0.8%20-19,9.8%20-19,20.5%20v%2074.9%20H%2031.4%20c%20-10.9,0%20-20.9,8.8%20-20.6,22%2040.6,166%20230.9,361.7%20230.9,361.7%209.8,10.8%2025.6,4%2028.6,0%200,0%20177.1,-165.8%20230.3,-359.4%201.6,-5.8%20-0.5,-24.3%20-20,-24.2%20z'%20id='path1'%20style='fill:%23040000;fill-opacity:1'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",fa=ee(""),dr=ee(),ns=ee(!1),Vs=ee(!1),Ks=ee("");function Ho(){function e(o){return t(o)||n(o)}function t(o){return!(o===""||o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")||o.includes("://open.spotify.com/show/")||o.includes("://open.spotify.com/artist/"))}function n(o){return o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")}function s(o){console.log("Searching for:",o),dr.value=[],ns.value=!0,fa.value=o,Vs.value=!1,Ks.value="",Se.search(o).then(r=>{console.log("Received Search Data:",r.data),r.status===200?(dr.value=r.data,ns.value=!1):(console.error("Error Searching:",r),ns.value=!1,Vs.value=!0,Ks.value=r.toString())}).catch(r=>{console.error("Other Error Searching:",r.message),ns.value=!1,Vs.value=!0,Ks.value=r.message})}return{searchTerm:fa,isSearching:ns,results:dr,error:Vs,errorValue:Ks,searchFor:s,isValid:e,isValidSearch:t,isValidURL:n}}const gn={QUEUED:"In Queue",DOWNLOADING:"Downloading...",DOWNLOADED:"Done",ERROR:"Error"},It=ee([]);class Su{constructor(t){this.song=t,this.web_status=gn.QUEUED,this.progress=0,this.message="",this.web_download_url=null,this.filename=null}setDownloading(){this.web_status=gn.DOWNLOADING}setDownloaded(){this.web_status=gn.DOWNLOADED}setError(){this.web_status=gn.ERROR}setWebURL(t){this.web_download_url=t}setFilename(t){this.filename=t}isQueued(){return this.song.song_id!==void 0}isDownloading(){return this.web_status===gn.DOWNLOADING}isDownloaded(){return this.web_status===gn.DOWNLOADED}isErrored(){return this.web_status===gn.ERROR}wsUpdate(t){this.progress=t.progress,this.message=t.message}}function Ns(){function e(o){return It.value.findIndex(r=>r.song.song_id===o.song_id)}function t(o){let r=new Su(o);It.value.push(r)}function n(o){console.log("removing",o,o.song_id),It.value=It.value.filter(r=>r.song.song_id!==o.song_id),console.log(It.value)}function s(o){return e(o)===-1?null:It.value[e(o)]}return{appendSong:t,removeSong:n,getBySong:s,downloadQueue:It}}const Ue=Ns();Se.ws_onmessage(e=>{let t=JSON.parse(e.data),n=Ue.getBySong(t.song);!n&&(Ue.appendSong(t.song),n=Ue.getBySong(t.song),!n)||(t.status==="done"?(n.progress=100,t.filename&&(n.setWebURL(Se.downloadFileURL(t.filename)),n.setFilename(t.filename)),n.setDownloaded()):t.status==="error"?(n.wsUpdate(t),n.setError()):t.status==="queued"?n.message=t.message||"":(n.wsUpdate(t),n.isDownloading()||n.setDownloading()))});Se.ws_onerror(e=>{console.log("websocket error:",e)});async function yb(){try{const t=(await Se.getQueue()).data||[];for(const n of t){if(It.value.some(o=>o.song.song_id===n.song.song_id))continue;const s=new Su(n.song);n.status==="done"?(s.setDownloaded(),n.filename&&(s.setWebURL(Se.downloadFileURL(n.filename)),s.setFilename(n.filename)),s.progress=100):n.status==="error"?(s.setError(),s.message=n.message||""):(n.status==="downloading"&&(s.setDownloading(),s.progress=n.progress||0),s.message=n.message||""),It.value.push(s)}}catch(e){console.log("Failed to load queue from server:",e)}}yb();function wi(){const e=ee(!1),t=uu();function n(a){const d=(a||"").includes("://open.spotify.com/playlist/"),c=t.settings.value.generate_m3u!==!1;return e.value=!0,Se.open(a).then(f=>{if(console.log("Received Response:",f),f.status!==200){console.log("Error:",f);return}const m=f.data;if(Array.isArray(m)){for(const y of m)Ue.getBySong(y)||Ue.appendSong(y);return Se.downloadBatch({songs:m,playlist_url:d?a:"",generate_m3u:c}).catch(y=>{console.log("Batch submit failed:",y.message)})}else console.log("Opened Song:",m),o(m)}).catch(f=>{console.log("Other Error:",f.message)}).finally(()=>{e.value=!1})}function s(a){return console.log("Downloading",a),Ue.getBySong(a).setDownloading(),Se.download(a).then(d=>{if(console.log("Received Response:",d),d.status===200){let c=d.data;return console.log("Download Complete:",c),Ue.getBySong(a).setWebURL(Se.downloadFileURL(c)),Ue.getBySong(a).setFilename(c),Ue.getBySong(a).setDownloaded(),{song:a,filename:c}}else return console.log("Error:",d),Ue.getBySong(a).setError(),{song:a,filename:null}}).catch(d=>(console.log("Other Error:",d.message),Ue.getBySong(a).setError(),{song:a,filename:null}))}function o(a,d=!0){return Ue.appendSong(a),d?s(a):Promise.resolve({song:a,filename:null})}function r(a,d){const c={...a,youtube_id:d},f=Ue.getBySong(a);return f&&(f.song.youtube_id=d,f.setDownloading(),f.progress=0,f.message=""),Se.download(c).then(m=>{const y=Ue.getBySong(c);if(m.status===200){const b=m.data;return y&&(y.setWebURL(Se.downloadFileURL(b)),y.setFilename(b),y.setDownloaded()),{song:c,filename:b}}return y&&y.setError(),{song:c,filename:null}}).catch(m=>{console.error("retryWithAudio error:",m.message);const y=Ue.getBySong(c);return y&&y.setError(),{song:c,filename:null}})}function i(a){const d=String(a.song_id||a.url||"");Ue.removeSong(a),d&&Se.removeQueueItem(d).catch(()=>{})}async function l(){await Se.clearQueue(),It.value=[]}return{fromURL:n,download:s,queue:o,retryWithAudio:r,remove:i,clearAll:l,loading:e}}const vb={class:"relative w-full"},bb=["placeholder"],_b=["disabled"],Br={__name:"SearchInput",props:{compact:{type:Boolean,default:!1}},setup(e){const t=Ho(),n=wi(),{t:s,locale:o}=wt(),r=["https://open.spotify.com/track/4vfN00PlILRXy5dcXHQE9M","drugs - EDEN","Não Gosto Eu Amo - Henrique e Juliano","Perfect - Ed Sheeran","Lightning Crashes - Live"],i=ee(0),l=Ae(()=>(o.value,i.value===0?s("search.placeholder"):r[i.value-1])),a=setInterval(()=>{i.value=(i.value+1)%(r.length+1)},5e3);oi(()=>clearInterval(a));function d(c){!c||!c.trim()||(t.isValidURL(c)?(n.fromURL(c),ot.push({name:"Download"})):t.isValidSearch(c)&&ot.push({name:"Search",params:{query:c}}))}return(c,f)=>(A(),P("div",vb,[ke(p("input",{type:"text",placeholder:l.value,class:Ee(["input-modern",e.compact?"h-11 text-sm":"h-14 text-base"]),"onUpdate:modelValue":f[0]||(f[0]=m=>u(t).searchTerm.value=m),onKeyup:f[1]||(f[1]=np(m=>d(u(t).searchTerm.value),["enter"]))},null,42,bb),[[ft,u(t).searchTerm.value]]),p("button",{class:Ee(["absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm transition hover:scale-105 active:scale-95 disabled:opacity-60",e.compact?"h-9 w-9":"h-11 w-11"]),disabled:u(n).loading.value,onClick:f[2]||(f[2]=m=>d(u(t).searchTerm.value))},[u(n).loading.value?(A(),P("span",{key:0,class:Ee(["loading loading-spinner",e.compact?"loading-xs":"loading-sm"])},null,2)):u(t).isValidURL(u(t).searchTerm.value)?(A(),lt(u(W),{key:1,icon:"clarity:download-line",class:Ee(e.compact?"h-4 w-4":"h-5 w-5")},null,8,["class"])):(A(),P("svg",{key:2,xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"2",stroke:"currentColor",class:Ee(e.compact?"h-4 w-4":"h-5 w-5")},[...f[3]||(f[3]=[p("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"},null,-1)])],2))],10,_b)]))}},xb={class:"relative flex min-h-[calc(100dvh-4rem)] items-center justify-center px-6 pt-24 pb-16 overflow-hidden"},wb={class:"relative w-full max-w-2xl text-center animate-slide-up"},kb={class:"mt-3 flex items-center justify-center gap-2"},Sb={class:"badge-soft"},Eb={class:"badge-neutral-soft"},Ab={class:"mx-auto mt-5 max-w-md text-balance text-base sm:text-lg text-base-content/70"},Rb={class:"mt-10"},Cb={class:"mt-4 flex flex-wrap items-center justify-center gap-2 text-xs text-base-content/60"},Tb={class:"pill bg-white/5 border border-white/10"},Pb={class:"pill bg-white/5 border border-white/10"},Ob={class:"pill bg-white/5 border border-white/10"},Db={__name:"Hero",setup(e){const{t}=wt(),n=ee(localStorage.getItem("version")||"2.7.0");return Yt(()=>{const s=localStorage.getItem("version");s&&(n.value=s)}),(s,o)=>(A(),P("section",xb,[o[4]||(o[4]=p("div",{"aria-hidden":"true",class:"pointer-events-none absolute inset-0 -z-10"},[p("div",{class:"absolute left-1/2 top-1/4 -translate-x-1/2 h-[420px] w-[420px] rounded-full bg-primary/25 blur-[120px]"}),p("div",{class:"absolute right-10 bottom-12 h-64 w-64 rounded-full bg-primary/10 blur-3xl"})],-1)),p("div",wb,[o[3]||(o[3]=mf('

Downtify

',2)),p("div",kb,[p("span",Sb,"v"+w(n.value),1),p("span",Eb,w(u(t)("hero.noAccount")),1)]),p("p",Ab,w(u(t)("hero.tagline")),1),p("div",Rb,[M(Br,{class:"w-full"}),p("div",Cb,[p("span",Tb,[o[0]||(o[0]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Oe(" "+w(u(t)("hero.songs")),1)]),p("span",Pb,[o[1]||(o[1]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Oe(" "+w(u(t)("hero.albums")),1)]),p("span",Ob,[o[2]||(o[2]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Oe(" "+w(u(t)("hero.playlists")),1)])])])])]))}},Nb={class:"absolute top-0 inset-x-0 z-30"},Ib={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},$b={class:"ml-auto flex items-center gap-1 sm:gap-2"},Lb=["title"],Mb=["title"],Ub=["title"],Fb=["title"],Bb={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},Hb=["title"],jb=["title"],qb={__name:"NavbarFront",setup(e){const t=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),n=Ns(),{t:s}=wt();return(o,r)=>(A(),P("header",Nb,[p("div",Ib,[r[5]||(r[5]=p("div",{class:"flex items-center gap-2"},[p("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"}),p("span",{class:"text-lg font-bold tracking-tight"},"Downtify")],-1)),p("div",$b,[p("button",{class:"icon-btn",onClick:r[0]||(r[0]=i=>u(ot).push({name:"List"})),title:u(s)("nav.library")},[M(u(W),{icon:"clarity:library-line",class:"h-5 w-5"})],8,Lb),p("button",{class:"icon-btn",onClick:r[1]||(r[1]=i=>u(ot).push({name:"Player"})),title:u(s)("nav.player")},[M(u(W),{icon:"clarity:headphones-line",class:"h-5 w-5"})],8,Mb),p("button",{class:"icon-btn",onClick:r[2]||(r[2]=i=>u(ot).push({name:"Monitor"})),title:u(s)("nav.monitor")},[M(u(W),{icon:"clarity:eye-line",class:"h-5 w-5"})],8,Ub),p("button",{class:"icon-btn relative",onClick:r[3]||(r[3]=i=>u(ot).push({name:"Download"})),title:u(s)("nav.queue")},[M(u(W),{icon:"clarity:download-line",class:"h-5 w-5"}),u(n).downloadQueue.value.length>0?(A(),P("span",Bb,w(u(n).downloadQueue.value.length),1)):he("",!0)],8,Fb),p("button",{class:"icon-btn",onClick:r[4]||(r[4]=i=>u(t).setTheme(u(t).currentTheme.value==="dark"?"light":"dark")),title:u(t).currentTheme.value==="dark"?u(s)("nav.switchToLight"):u(s)("nav.switchToDark")},[u(t).currentTheme.value==="dark"?(A(),lt(u(W),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),lt(u(W),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,Hb),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(s)("nav.settings")},[M(u(W),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,jb)])])]))}},Eu=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Vb={components:{NavbarFront:qb,Hero:Db},setup(){return Yt(()=>{window.scroll(0,0)}),{}}};function Kb(e,t,n,s,o,r){const i=xr("NavbarFront"),l=xr("Hero");return A(),P("div",null,[M(i),M(l)])}const Wb=Eu(Vb,[["render",Kb]]),zb={class:"sticky top-0 z-30 glass-nav"},Gb={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Qb=["title"],Jb={class:"hidden md:flex flex-1 justify-center"},Yb={class:"ml-auto flex items-center gap-1 sm:gap-2"},Xb=["title"],Zb=["title"],e_=["title"],t_=["title"],n_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},s_=["title"],o_=["title"],r_={class:"md:hidden px-4 pb-3"},Is={__name:"Navbar",setup(e){const t=ku(),n=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),s=Ns(),o=Ho(),{t:r}=wt();return(i,l)=>(A(),P("header",zb,[p("div",Gb,[p("button",{class:"flex items-center gap-2 shrink-0",onClick:l[0]||(l[0]=a=>u(ot).push({name:"Home"})),title:u(r)("nav.home")},[...l[6]||(l[6]=[p("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"},null,-1),p("span",{class:"hidden sm:inline text-lg font-bold tracking-tight"}," Downtify ",-1)])],8,Qb),p("div",Jb,[M(Br,{class:"w-full max-w-md",compact:!0})]),p("div",Yb,[p("button",{class:Ee(["icon-btn",{"icon-btn-active":u(t).name==="List"}]),onClick:l[1]||(l[1]=a=>u(ot).push({name:"List"})),title:u(r)("nav.library")},[M(u(W),{icon:"clarity:library-line",class:"h-5 w-5"})],10,Xb),p("button",{class:Ee(["icon-btn",{"icon-btn-active":u(t).name==="Player"}]),onClick:l[2]||(l[2]=a=>u(ot).push({name:"Player"})),title:u(r)("nav.player")},[M(u(W),{icon:"clarity:headphones-line",class:"h-5 w-5"})],10,Zb),p("button",{class:Ee(["icon-btn",{"icon-btn-active":u(t).name==="Monitor"}]),onClick:l[3]||(l[3]=a=>u(ot).push({name:"Monitor"})),title:u(r)("nav.monitor")},[M(u(W),{icon:"clarity:eye-line",class:"h-5 w-5"})],10,e_),p("button",{class:Ee(["icon-btn relative",{"icon-btn-active":u(t).name==="Download"}]),onClick:l[4]||(l[4]=a=>u(t).name==="Download"?u(ot).push({name:"Search",params:{query:u(o).searchTerm.value||" "}}):u(ot).push({name:"Download"})),title:u(r)("nav.queue")},[M(u(W),{icon:"clarity:download-line",class:"h-5 w-5"}),u(s).downloadQueue.value.length>0?(A(),P("span",n_,w(u(s).downloadQueue.value.length),1)):he("",!0)],10,t_),p("button",{class:"icon-btn",onClick:l[5]||(l[5]=a=>u(n).setTheme(u(n).currentTheme.value==="dark"?"light":"dark")),title:u(n).currentTheme.value==="dark"?u(r)("nav.switchToLight"):u(r)("nav.switchToDark")},[u(n).currentTheme.value==="dark"?(A(),lt(u(W),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),lt(u(W),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,s_),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(r)("nav.settings")},[M(u(W),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,o_)])]),p("div",r_,[M(Br,{compact:!0})])]))}},i_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},l_={class:"mb-8"},a_={class:"text-2xl font-bold tracking-tight"},c_={class:"mt-1 text-sm text-base-content/60"},u_={class:"text-base-content/90 font-medium"},d_={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},f_={key:1,class:"space-y-3"},p_={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},h_={class:"text-base-content/50 text-sm"},m_={class:"text-base-content/40 text-xs mt-1"},g_={key:3,class:"space-y-2"},y_={class:"track-cover"},v_=["src","alt"],b_={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},__={class:"flex-1 min-w-0"},x_={class:"flex items-center gap-2 mb-0.5"},w_={class:"font-semibold truncate"},k_={key:0,class:"badge-error-soft shrink-0"},S_={class:"text-xs text-base-content/70 truncate"},E_={key:0,class:"text-xs text-base-content/40 truncate"},A_={key:0,class:"text-base-content/30"},R_={class:"flex items-center gap-1 shrink-0"},C_=["href","title"],T_=["title"],P_=["onClick","title"],O_={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},D_=["disabled","title"],N_=["onClick"],I_=["disabled","title"],fr=5,$_={__name:"SearchList",props:["data","error"],emits:["download"],setup(e,{emit:t}){const n=e,s=t,o=Ho(),r=Ns(),{t:i}=wt(),l=ee(1),a=Ae(()=>{var y;return Math.ceil((((y=n.data)==null?void 0:y.length)||0)/fr)}),d=Ae(()=>{if(!n.data)return[];const y=(l.value-1)*fr;return n.data.slice(y,y+fr)});ln(()=>n.data,()=>{l.value=1});function c(y){return Array.isArray(y.artists)&&y.artists.length?y.artists.join(", "):y.artist||i("common.unknownArtist")}function f(y){const b=r.getBySong(y);return b?b.isErrored()?"error":(b.isDownloaded(),"queued"):"idle"}function m(y){s("download",y)}return(y,b)=>{var v;return A(),P("div",i_,[p("div",l_,[p("h1",a_,w(u(i)("search.title")),1),p("p",c_,[u(o).searchTerm.value?(A(),P(ce,{key:0},[Oe(w(u(i)("search.matchesFor"))+" ",1),p("span",u_,' "'+w(u(o).searchTerm.value)+'" ',1),!u(o).isSearching.value&&(((v=n.data)==null?void 0:v.length)||0)>0?(A(),P(ce,{key:0},[Oe(w(n.data.length===1?u(i)("search.songsCount",{count:n.data.length}):u(i)("search.songsCountPlural",{count:n.data.length})),1)],64)):he("",!0)],64)):(A(),P(ce,{key:1},[Oe(w(u(i)("search.typeToBegin")),1)],64))])]),n.error?(A(),P("div",d_,[M(u(W),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),p("span",null,w(u(o).errorValue.value?u(i)("search.errorWithDetail",{detail:u(o).errorValue.value}):u(i)("search.error")),1)])):he("",!0),u(o).isSearching.value?(A(),P("div",f_,[(A(),P(ce,null,$e(5,h=>p("div",{key:h,class:"skeleton h-24 rounded-2xl"})),64))])):!n.data||n.data.length===0?(A(),P("div",p_,[M(u(W),{icon:"clarity:search-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",h_,w(u(i)("search.empty")),1),p("p",m_,w(u(i)("search.emptyHint")),1)])):(A(),P("ul",g_,[(A(!0),P(ce,null,$e(d.value,(h,E)=>(A(),P("li",{key:h.song_id||E,class:"surface rounded-2xl track-card"},[p("div",y_,[h.cover_url?(A(),P("img",{key:0,src:h.cover_url,alt:h.name,class:"h-full w-full object-cover",loading:"lazy"},null,8,v_)):(A(),P("div",b_,[M(u(W),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),p("div",__,[p("div",x_,[p("span",w_,w(h.name),1),h.explicit?(A(),P("span",k_,"E")):he("",!0)]),p("p",S_,w(c(h)),1),h.album_name?(A(),P("p",E_,[Oe(w(h.album_name)+" ",1),h.year?(A(),P("span",A_," · "+w(h.year),1)):he("",!0)])):he("",!0)]),p("div",R_,[h.url?(A(),P("a",{key:0,class:"icon-btn",href:h.url,target:"_blank",rel:"noopener",title:u(i)("search.openOnSpotify")},[M(u(W),{icon:"clarity:pop-out-line",class:"h-4 w-4"})],8,C_)):he("",!0),f(h)==="queued"?(A(),P("button",{key:1,class:"icon-btn text-primary cursor-default",title:u(i)("search.inQueue"),disabled:""},[M(u(W),{icon:"clarity:check-circle-line",class:"h-5 w-5"})],8,T_)):(A(),P("button",{key:2,class:"icon-btn text-primary hover:bg-primary/10",onClick:C=>m(h),title:u(i)("search.download")},[M(u(W),{icon:"clarity:download-line",class:"h-5 w-5"})],8,P_))])]))),128))])),a.value>1?(A(),P("nav",O_,[p("button",{class:"icon-btn",disabled:l.value===1,onClick:b[0]||(b[0]=h=>l.value--),title:u(i)("search.previousPage")},[M(u(W),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,D_),(A(!0),P(ce,null,$e(a.value,h=>(A(),P("button",{key:h,class:Ee(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",h===l.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:E=>l.value=h},w(h),11,N_))),128)),p("button",{class:"icon-btn",disabled:l.value===a.value,onClick:b[1]||(b[1]=h=>l.value++),title:u(i)("search.nextPage")},[M(u(W),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,I_)])):he("",!0)])}}},L_={class:"min-h-screen"},M_={__name:"Search",setup(e){Yt(()=>window.scroll(0,0));const t=ku(),n=Ho(),s=wi();return ln(()=>t.params.query,()=>{t.params.query&&n.searchFor(t.params.query)},{deep:!0}),n.searchFor(t.params.query),(o,r)=>(A(),P("div",L_,[M(Is),M(Wn),M($_,{data:u(n).results.value,error:u(n).error.value,onDownload:r[0]||(r[0]=i=>u(s).queue(i))},null,8,["data","error"])]))}},U_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},F_={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},B_={class:"text-2xl font-bold tracking-tight"},H_={class:"mt-1 text-sm text-base-content/60"},j_=["title"],q_={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},V_={class:"text-base-content/50 text-sm"},K_={class:"text-base-content/40 text-xs mt-1"},W_={key:1,class:"space-y-3"},z_={class:"track-cover h-16 w-16 sm:h-20 sm:w-20"},G_=["src","alt"],Q_={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},J_={class:"flex-1 min-w-0"},Y_={class:"flex items-center gap-2 mb-0.5"},X_={class:"font-semibold truncate"},Z_={class:"text-xs text-base-content/60 truncate"},e0={key:0,class:"text-xs text-base-content/40 truncate"},t0={class:"flex items-center gap-2 shrink-0"},n0=["onClick","title"],s0={class:"text-[10px] font-semibold"},o0={key:2,class:"loading loading-spinner loading-sm text-primary"},r0=["onClick","title"],i0={key:2,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},l0=["disabled","title"],a0=["onClick"],c0=["disabled","title"],pr=10,u0={__name:"DownloadList",setup(e){const t=Ns(),n=wi(),{t:s}=wt();async function o(){confirm(s("queue.clearAllPrompt"))&&await n.clearAll()}const r=ee(1),i=Ae(()=>Math.ceil(t.downloadQueue.value.length/pr)),l=Ae(()=>{const f=(r.value-1)*pr;return t.downloadQueue.value.slice(f,f+pr)});ln(()=>t.downloadQueue.value.length,()=>{r.value>i.value&&i.value>0&&(r.value=i.value)});function a(f){return Array.isArray(f.artists)&&f.artists.length?f.artists.join(", "):f.artist||s("common.unknownArtist")}function d(f){return f.isErrored()?"badge-error-soft":f.isDownloaded()?"badge-soft":"badge-neutral-soft"}function c(f){const m=document.createElement("a");m.href=f,m.download=f.split("/").pop(),document.body.appendChild(m),m.click(),document.body.removeChild(m)}return(f,m)=>(A(),P("div",U_,[p("div",F_,[p("div",null,[p("h1",B_,w(u(s)("queue.title")),1),p("p",H_,w(u(s)("queue.subtitle")),1)]),u(t).downloadQueue.value.length>0?(A(),P("button",{key:0,class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 text-error/70 hover:text-error",onClick:o,title:u(s)("queue.clearAll")},[M(u(W),{icon:"clarity:trash-line",class:"h-4 w-4 mr-1.5"}),Oe(" "+w(u(s)("queue.clearAll")),1)],8,j_)):he("",!0)]),u(t).downloadQueue.value.length===0?(A(),P("div",q_,[M(u(W),{icon:"clarity:download-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",V_,w(u(s)("queue.empty")),1),p("p",K_,w(u(s)("queue.emptyHint")),1)])):(A(),P("ul",W_,[(A(!0),P(ce,null,$e(l.value,(y,b)=>(A(),P("li",{key:b,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-4"},[p("div",z_,[y.song.cover_url?(A(),P("img",{key:0,src:y.song.cover_url,alt:y.song.name,class:"h-full w-full object-cover"},null,8,G_)):(A(),P("div",Q_,[M(u(W),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),p("div",J_,[p("div",Y_,[p("span",X_,w(y.song.name),1),p("span",{class:Ee([d(y),"shrink-0"])},w(y.message||y.web_status),3)]),p("p",Z_,w(a(y.song)),1),y.song.album_name?(A(),P("p",e0,w(y.song.album_name),1)):he("",!0)]),p("div",t0,[y.isDownloaded()?(A(),P("a",{key:0,class:"icon-btn text-primary hover:bg-primary/10",href:"javascript:;",onClick:v=>c(y.web_download_url),title:u(s)("queue.saveToDevice")},[M(u(W),{icon:"clarity:download-line",class:"h-4 w-4"})],8,n0)):y.isDownloading()&&!y.isErrored()?(A(),P("div",{key:1,class:"radial-progress text-primary",style:$n(`--value:${Math.max(0,y.progress)}; --size:2.75rem; --thickness:3px`)},[p("span",s0,w(Math.round(y.progress))+"% ",1)],4)):y.isErrored()?he("",!0):(A(),P("span",o0)),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",onClick:v=>u(n).remove(y.song),title:u(s)("queue.removeFromQueue")},[M(u(W),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,r0)])]))),128))])),i.value>1?(A(),P("nav",i0,[p("button",{class:"icon-btn",disabled:r.value===1,onClick:m[0]||(m[0]=y=>r.value--),title:u(s)("common.previousPage")},[M(u(W),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,l0),(A(!0),P(ce,null,$e(i.value,y=>(A(),P("button",{key:y,class:Ee(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",y===r.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:b=>r.value=y},w(y),11,a0))),128)),p("button",{class:"icon-btn",disabled:r.value===i.value,onClick:m[1]||(m[1]=y=>r.value++),title:u(s)("common.nextPage")},[M(u(W),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,c0)])):he("",!0)]))}},d0={class:"min-h-screen"},f0={__name:"Download",setup(e){return Yt(()=>window.scroll(0,0)),(t,n)=>(A(),P("div",d0,[M(Is),M(Wn),M(u0)]))}},Au="downtify-player-volume",qe=ee([]),tt=ee(-1),yo=ee(!1),$s=ee(0),cn=ee(0),ki=ee(parseFloat(localStorage.getItem(Au)||"0.85")),In=ee(!1),zn=ee("off"),un=ee(!1);let ve=null,gt=[],jo=0;function qo(){return ve||(ve=new Audio,ve.preload="metadata",ve.volume=ki.value,ve.addEventListener("timeupdate",()=>{$s.value=ve.currentTime}),ve.addEventListener("loadedmetadata",()=>{cn.value=isFinite(ve.duration)?ve.duration:0}),ve.addEventListener("durationchange",()=>{cn.value=isFinite(ve.duration)?ve.duration:0}),ve.addEventListener("ended",x0),ve.addEventListener("play",()=>{yo.value=!0}),ve.addEventListener("pause",()=>{yo.value=!1}),ve)}function Hr(e){const t=e.replace(/\.[^.]+$/,"");let n="",s=t;const o=t.indexOf(" - ");return o>0&&(n=t.slice(0,o).trim(),s=t.slice(o+3).trim()),{file:e,url:Se.downloadFileURL(e),cover:Se.coverFileURL(e),title:s,artist:n,album:""}}function Si(e){if(typeof e=="string")return Hr(e);const t=String((e==null?void 0:e.file)||""),n=Hr(t),s=String((e==null?void 0:e.title)||"").trim(),o=String((e==null?void 0:e.artist)||"").trim(),r=String((e==null?void 0:e.album)||"").trim();return{file:t,url:n.url,cover:n.cover,title:s||n.title,artist:o||n.artist,album:r||n.album}}function Ls(){const e=qe.value.map((t,n)=>n);for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}gt=e,jo=tt.value>=0?Math.max(0,gt.indexOf(tt.value)):0}function p0(e,t={}){const n=(e||[]).map(s=>typeof s=="string"?Hr(s):Si(s));qe.value=n,tt.value>=n.length&&(tt.value=-1),un.value&&Ls(),typeof t.startIndex=="number"?jn(t.startIndex):t.autoplay&&n.length>0&&tt.value<0&&jn(0)}function jn(e){if(e<0||e>=qe.value.length)return;const t=qo();if(tt.value=e,un.value){gt.length!==qe.value.length&&Ls();const n=gt.indexOf(e);n>=0&&(jo=n)}t.src=qe.value[e].url,t.currentTime=0,$s.value=0,t.play().catch(()=>{})}function Ru(){if(qe.value.length===0)return;const e=qo();if(tt.value<0){jn(0);return}e.src||(e.src=qe.value[tt.value].url),e.play().catch(()=>{})}function Ei(){ve&&ve.pause()}function h0(){yo.value?Ei():Ru()}function Vo(e){const t=qo(),n=cn.value||0,s=Math.max(0,Math.min(n,e));t.currentTime=s,$s.value=s}function m0(e){cn.value&&Vo(cn.value*Math.max(0,Math.min(1,e)))}function g0(e){const t=Math.max(0,Math.min(1,e));ki.value=t,ve&&(ve.volume=t);try{localStorage.setItem(Au,String(t))}catch{}t>0&&In.value&&(In.value=!1,ve&&(ve.muted=!1))}function y0(){In.value=!In.value,ve&&(ve.muted=In.value)}function v0(){if(qe.value.length===0)return-1;if(un.value){gt.length!==qe.value.length&&Ls();const t=(jo+1)%gt.length;return gt[t]}const e=tt.value+1;return e>=qe.value.length?zn.value==="all"?0:-1:e}function b0(){if(qe.value.length===0)return-1;if(un.value){gt.length!==qe.value.length&&Ls();const t=(jo-1+gt.length)%gt.length;return gt[t]}const e=tt.value-1;return e<0?zn.value==="all"?qe.value.length-1:0:e}function Cu(){const e=v0();if(e<0){Ei();return}jn(e)}function _0(){if(qo().currentTime>3){Vo(0);return}const t=b0();t<0||jn(t)}function x0(){if(zn.value==="one"){Vo(0),ve&&ve.play().catch(()=>{});return}Cu()}function Tu(e){["off","all","one"].includes(e)&&(zn.value=e)}function w0(){const e=["off","all","one"],t=e.indexOf(zn.value);Tu(e[(t+1)%e.length])}function Pu(e){un.value=!!e,un.value&&Ls()}function k0(){Pu(!un.value)}const S0=Ae(()=>tt.value>=0&&tt.valuecn.value>0?$s.value/cn.value*100:0);function pa(e){if(!isFinite(e)||e<0)return"0:00";const t=Math.floor(e),n=Math.floor(t/60),s=t%60;return`${n}:${s.toString().padStart(2,"0")}`}function Ou(){return{playlist:qe,currentIndex:tt,currentTrack:S0,isPlaying:yo,currentTime:$s,duration:cn,progressPct:E0,volume:ki,isMuted:In,repeatMode:zn,shuffle:un,setPlaylist:p0,playAt:jn,play:Ru,pause:Ei,toggle:h0,seek:Vo,seekRatio:m0,setVolume:g0,toggleMute:y0,next:Cu,prev:_0,setRepeat:Tu,cycleRepeat:w0,setShuffle:Pu,toggleShuffle:k0}}const A0={class:"min-h-screen"},R0={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},C0={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},T0={class:"text-2xl font-bold tracking-tight"},P0={class:"mt-1 text-sm text-base-content/60"},O0={class:"flex items-center gap-2"},D0=["title"],N0=["disabled"],I0={key:0,class:"loading loading-spinner loading-xs mr-2"},$0={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},L0={key:1,class:"space-y-3"},M0={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},U0={class:"text-base-content/50 text-sm"},F0={class:"text-base-content/40 text-xs mt-1"},B0={key:3,class:"space-y-2"},H0={class:"relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden"},j0=["src","alt","onError"],q0={class:"flex-1 min-w-0"},V0={class:"text-sm font-medium truncate block"},K0={key:0,class:"text-xs text-base-content/60 truncate"},W0={class:"text-xs text-base-content/40"},z0={key:0,class:"mr-2 text-primary/70"},G0={class:"flex items-center gap-1 shrink-0"},Q0=["onClick","title"],J0=["href","title"],Y0=["disabled","onClick","title"],X0={key:0,class:"loading loading-spinner loading-xs"},Z0={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},ex=["disabled","title"],tx=["onClick"],nx=["disabled","title"],sx={key:5,class:"mt-6 text-xs text-base-content/40 text-center"},hr=10,ox={__name:"Downloads",setup(e){const{t}=wt(),n=Ou(),s=gb(),o=ee([]),r=ee(!1),i=ee(""),l=ee({}),a=ee({}),d=ee(1),c=Ae(()=>Math.ceil(o.value.length/hr)),f=Ae(()=>{const R=(d.value-1)*hr;return o.value.slice(R,R+hr)});ln(o,()=>{d.value=1});function m(R){return Se.coverFileURL(R)}function y(R){a.value={...a.value,[R]:!0}}async function b(){r.value=!0,i.value="";try{const R=await Se.listDownloads();o.value=(R.data||[]).map(Si)}catch{i.value=t("library.failedLoad")}finally{r.value=!1}}async function v(R){if(confirm(t("library.deletePrompt",{file:R}))){l.value={...l.value,[R]:!0};try{await Se.deleteDownload(R),o.value=o.value.filter(L=>L!==R)}catch{i.value=t("library.failedDelete",{file:R})}finally{l.value={...l.value,[R]:!1}}}}function h(R){const L=R.lastIndexOf(".");return L>0?R.slice(L+1).toUpperCase():""}function E(R){const L=R.lastIndexOf("/");return L>=0?R.slice(0,L):""}function C(R){const L=o.value.findIndex(T=>T.file===R.file);L<0||(n.setPlaylist(o.value,{startIndex:L}),s.push({name:"Player"}))}function S(){o.value.length&&(n.setPlaylist(o.value,{startIndex:0}),s.push({name:"Player"}))}return Yt(b),(R,L)=>(A(),P("div",A0,[M(Is),M(Wn),p("div",R0,[p("div",C0,[p("div",null,[p("h1",T0,w(u(t)("library.title")),1),p("p",P0,w(u(t)("library.subtitle")),1)]),p("div",O0,[o.value.length>0?(A(),P("button",{key:0,class:"btn btn-primary btn-sm h-11 px-5 rounded-full",onClick:S,title:u(t)("library.play")},[M(u(W),{icon:"clarity:play-line",class:"h-4 w-4 mr-1.5"}),Oe(" "+w(u(t)("library.play")),1)],8,D0)):he("",!0),p("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:b,disabled:r.value},[r.value?(A(),P("span",I0)):(A(),lt(u(W),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4 mr-2"})),Oe(" "+w(u(t)("common.refresh")),1)],8,N0)])]),i.value?(A(),P("div",$0,[M(u(W),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),p("span",null,w(i.value),1)])):he("",!0),r.value&&o.value.length===0?(A(),P("div",L0,[(A(),P(ce,null,$e(4,T=>p("div",{key:T,class:"skeleton h-16 rounded-2xl"})),64))])):o.value.length===0?(A(),P("div",M0,[M(u(W),{icon:"clarity:library-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",U0,w(u(t)("library.empty")),1),p("p",F0,w(u(t)("library.emptyHint")),1)])):(A(),P("ul",B0,[(A(!0),P(ce,null,$e(f.value,T=>(A(),P("li",{key:T.file,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-3"},[p("div",H0,[a.value[T.file]?(A(),lt(u(W),{key:1,icon:"clarity:music-note-line",class:"h-5 w-5"})):(A(),P("img",{key:0,src:m(T.file),alt:T.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:U=>y(T.file)},null,40,j0))]),p("div",q0,[p("span",V0,w(T.title),1),T.artist?(A(),P("p",K0,w(T.artist),1)):he("",!0),p("span",W0,[E(T.file)?(A(),P("span",z0,[M(u(W),{icon:"clarity:folder-line",class:"inline h-3 w-3 mr-0.5 align-text-top"}),Oe(w(E(T.file)),1)])):he("",!0),Oe(" "+w(h(T.file)),1)])]),p("div",G0,[p("button",{class:"icon-btn text-primary hover:bg-primary/10",onClick:U=>C(T),title:u(t)("library.play")},[M(u(W),{icon:"clarity:play-line",class:"h-4 w-4"})],8,Q0),p("a",{class:"icon-btn",href:u(Se).downloadFileURL(T.file),download:"",title:u(t)("library.downloadToDevice")},[M(u(W),{icon:"clarity:download-line",class:"h-4 w-4"})],8,J0),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",disabled:l.value[T.file]===!0,onClick:U=>v(T.file),title:u(t)("library.deleteFile")},[l.value[T.file]===!0?(A(),P("span",X0)):(A(),lt(u(W),{key:1,icon:"clarity:trash-line",class:"h-4 w-4"}))],8,Y0)])]))),128))])),c.value>1?(A(),P("nav",Z0,[p("button",{class:"icon-btn",disabled:d.value===1,onClick:L[0]||(L[0]=T=>d.value--),title:u(t)("common.previousPage")},[M(u(W),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,ex),(A(!0),P(ce,null,$e(c.value,T=>(A(),P("button",{key:T,class:Ee(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",T===d.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:U=>d.value=T},w(T),11,tx))),128)),p("button",{class:"icon-btn",disabled:d.value===c.value,onClick:L[1]||(L[1]=T=>d.value++),title:u(t)("common.nextPage")},[M(u(W),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,nx)])):he("",!0),o.value.length>0?(A(),P("p",sx,w(o.value.length===1?u(t)("library.countOne",{count:o.value.length}):u(t)("library.countMany",{count:o.value.length})),1)):he("",!0)])]))}},Ms=Te.create({baseURL:`${Ge.PROTOCOL}//${Ge.BACKEND}:${Ge.PORT}${Ge.BASEURL}`});function rx(){return Ms.get("/api/monitor/playlists")}function ix(e,t=60){return Ms.post("/api/monitor/playlists",{url:e,interval_minutes:t})}function lx(e,t){return Ms.patch(`/api/monitor/playlists/${e}`,t)}function ax(e){return Ms.delete(`/api/monitor/playlists/${e}`)}function cx(e){return Ms.post(`/api/monitor/playlists/${e}/check`)}const yn={listMonitoredPlaylists:rx,addMonitoredPlaylist:ix,updateMonitoredPlaylist:lx,deleteMonitoredPlaylist:ax,checkMonitoredPlaylist:cx},ux={class:"min-h-screen"},dx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},fx={class:"mb-8"},px={class:"text-2xl font-bold tracking-tight"},hx={class:"mt-1 text-sm text-base-content/60"},mx={class:"surface rounded-2xl p-5 mb-8"},gx={class:"text-sm font-semibold uppercase tracking-wider text-base-content/50 mb-4"},yx=["placeholder","disabled"],vx={class:"flex items-center gap-2 shrink-0"},bx=["disabled"],_x={value:15},xx={value:30},wx={value:60},kx={value:180},Sx={value:360},Ex={value:720},Ax={value:1440},Rx={value:10080},Cx={value:20160},Tx={value:43200},Px=["disabled"],Ox={key:0,class:"loading loading-spinner loading-xs"},Dx={key:1},Nx={key:0,class:"mt-2 text-xs text-error"},Ix={key:0,class:"space-y-3"},$x={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},Lx={class:"text-base-content/50 text-sm"},Mx={class:"text-base-content/40 text-xs mt-1"},Ux={key:2,class:"space-y-3"},Fx={class:"flex-1 min-w-0"},Bx={class:"flex items-center gap-2 mb-1"},Hx={class:"font-semibold truncate"},jx={class:"flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-base-content/50"},qx={key:0},Vx={key:1,class:"italic"},Kx={class:"flex items-center gap-2 shrink-0"},Wx=["value","onChange"],zx={value:15},Gx={value:30},Qx={value:60},Jx={value:180},Yx={value:360},Xx={value:720},Zx={value:1440},ew={value:10080},tw={value:20160},nw={value:43200},sw=["title","onClick"],ow=["title","disabled","onClick"],rw={key:0,class:"loading loading-spinner loading-xs"},iw=["title","onClick"],lw={class:"mt-8 surface rounded-2xl p-4 flex gap-3 text-sm text-base-content/60"},aw={__name:"Monitor",setup(e){const{t}=wt(),n=ee([]),s=ee(!1),o=ee(!1),r=ee(""),i=ee(""),l=ee(60),a=ee({});async function d(){s.value=!0;try{const E=await yn.listMonitoredPlaylists();n.value=E.data||[]}finally{s.value=!1}}async function c(){var E,C;r.value="",o.value=!0;try{const S=await yn.addMonitoredPlaylist(i.value.trim(),l.value);n.value.unshift(S.data),i.value=""}catch(S){r.value=((C=(E=S==null?void 0:S.response)==null?void 0:E.data)==null?void 0:C.detail)||t("monitor.failedAdd")}finally{o.value=!1}}async function f(E){try{const C=await yn.updateMonitoredPlaylist(E.id,{enabled:!E.enabled});Object.assign(E,C.data)}catch{}}async function m(E,C){const S=parseInt(C.target.value,10);try{const R=await yn.updateMonitoredPlaylist(E.id,{interval_minutes:S});Object.assign(E,R.data)}catch{}}async function y(E){a.value={...a.value,[E.id]:!0};try{await yn.checkMonitoredPlaylist(E.id),setTimeout(async()=>{try{const C=await yn.listMonitoredPlaylists();n.value=C.data||[]}finally{a.value={...a.value,[E.id]:!1}}},3e3)}catch{a.value={...a.value,[E.id]:!1}}}async function b(E){if(confirm(t("monitor.deletePrompt",{name:E.name})))try{await yn.deleteMonitoredPlaylist(E.id),n.value=n.value.filter(C=>C.id!==E.id)}catch{}}function v(E){if(E<60)return`${E} ${t("monitor.minSuffix")}`;if(E<1440)return`${E/60} ${t("monitor.hourSuffix")}`;if(E<10080){const S=E/1440;return`${S} ${t(S===1?"monitor.daySuffix":"monitor.daysSuffix")}`}if(E<43200){const S=E/10080;return`${S} ${t(S===1?"monitor.weekSuffix":"monitor.weeksSuffix")}`}const C=Math.round(E/43200);return`${C} ${t(C===1?"monitor.monthSuffix":"monitor.monthsSuffix")}`}function h(E){try{const C=Date.now()-new Date(E).getTime(),S=Math.floor(C/6e4);if(S<1)return t("monitor.timeJustNow");if(S<60)return t("monitor.timeMinAgo",{n:S});const R=Math.floor(S/60);return R<24?t("monitor.timeHourAgo",{n:R}):t("monitor.timeDayAgo",{n:Math.floor(R/24)})}catch{return""}}return Yt(d),(E,C)=>(A(),P("div",ux,[M(Is),M(Wn),p("div",dx,[p("div",fx,[p("h1",px,w(u(t)("monitor.title")),1),p("p",hx,w(u(t)("monitor.subtitle")),1)]),p("div",mx,[p("h2",gx,w(u(t)("monitor.watchNew")),1),p("form",{onSubmit:ep(c,["prevent"]),class:"flex flex-col sm:flex-row gap-3"},[ke(p("input",{"onUpdate:modelValue":C[0]||(C[0]=S=>i.value=S),type:"text",placeholder:u(t)("monitor.urlPlaceholder"),class:"input-modern flex-1 h-11 text-sm",disabled:o.value},null,8,yx),[[ft,i.value]]),p("div",vx,[ke(p("select",{"onUpdate:modelValue":C[1]||(C[1]=S=>l.value=S),class:"select select-sm rounded-full border border-white/10 bg-base-100/85 focus:border-primary/60 h-11 px-3 text-sm",disabled:o.value},[p("option",_x,w(u(t)("monitor.every15")),1),p("option",xx,w(u(t)("monitor.every30")),1),p("option",wx,w(u(t)("monitor.every1h")),1),p("option",kx,w(u(t)("monitor.every3h")),1),p("option",Sx,w(u(t)("monitor.every6h")),1),p("option",Ex,w(u(t)("monitor.every12h")),1),p("option",Ax,w(u(t)("monitor.every1d")),1),p("option",Rx,w(u(t)("monitor.every1w")),1),p("option",Cx,w(u(t)("monitor.every2w")),1),p("option",Tx,w(u(t)("monitor.every1mo")),1)],8,bx),[[Ys,l.value]]),p("button",{type:"submit",class:"btn btn-primary btn-sm h-11 px-5 rounded-full",disabled:o.value||!i.value.trim()},[o.value?(A(),P("span",Ox)):(A(),P("span",Dx,w(u(t)("monitor.watch")),1))],8,Px)])],32),r.value?(A(),P("p",Nx,w(r.value),1)):he("",!0)]),s.value?(A(),P("div",Ix,[(A(),P(ce,null,$e(3,S=>p("div",{key:S,class:"skeleton h-24 rounded-2xl"})),64))])):n.value.length===0?(A(),P("div",$x,[M(u(W),{icon:"clarity:music-note-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",Lx,w(u(t)("monitor.empty")),1),p("p",Mx,w(u(t)("monitor.emptyHint")),1)])):(A(),P("ul",Ux,[(A(!0),P(ce,null,$e(n.value,S=>(A(),P("li",{key:S.id,class:"surface rounded-2xl p-4 sm:p-5 flex flex-col sm:flex-row sm:items-center gap-4"},[p("div",Fx,[p("div",Bx,[p("span",Hx,w(S.name),1),p("span",{class:Ee(["pill shrink-0",S.enabled?"badge-soft":"badge-neutral-soft"])},w(S.enabled?u(t)("monitor.active"):u(t)("monitor.paused")),3)]),p("div",jx,[p("span",null,[M(u(W),{icon:"clarity:refresh-line",class:"inline h-3 w-3 mr-0.5"}),Oe(" "+w(u(t)("monitor.everyInterval",{interval:v(S.interval_minutes)})),1)]),p("span",null,[M(u(W),{icon:"clarity:music-note-line",class:"inline h-3 w-3 mr-0.5"}),Oe(" "+w(S.last_track_count===1?u(t)("monitor.tracksOne",{count:S.last_track_count}):u(t)("monitor.tracksMany",{count:S.last_track_count})),1)]),S.last_checked?(A(),P("span",qx,[M(u(W),{icon:"clarity:clock-line",class:"inline h-3 w-3 mr-0.5"}),Oe(" "+w(u(t)("monitor.checked",{when:h(S.last_checked)})),1)])):(A(),P("span",Vx,w(u(t)("monitor.notChecked")),1))])]),p("div",Kx,[p("select",{value:S.interval_minutes,onChange:R=>m(S,R),class:"select select-xs rounded-full border border-white/10 bg-base-100/60 text-xs focus:border-primary/60"},[p("option",zx,w(u(t)("monitor.short15")),1),p("option",Gx,w(u(t)("monitor.short30")),1),p("option",Qx,w(u(t)("monitor.short1h")),1),p("option",Jx,w(u(t)("monitor.short3h")),1),p("option",Yx,w(u(t)("monitor.short6h")),1),p("option",Xx,w(u(t)("monitor.short12h")),1),p("option",Zx,w(u(t)("monitor.short1d")),1),p("option",ew,w(u(t)("monitor.short1w")),1),p("option",tw,w(u(t)("monitor.short2w")),1),p("option",nw,w(u(t)("monitor.short1mo")),1)],40,Wx),p("button",{class:"icon-btn",title:S.enabled?u(t)("monitor.pause"):u(t)("monitor.resume"),onClick:R=>f(S)},[M(u(W),{icon:S.enabled?"clarity:pause-line":"clarity:play-line",class:"h-4 w-4"},null,8,["icon"])],8,sw),p("button",{class:"icon-btn",title:u(t)("monitor.checkNow"),disabled:a.value[S.id],onClick:R=>y(S)},[a.value[S.id]?(A(),P("span",rw)):(A(),lt(u(W),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4"}))],8,ow),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",title:u(t)("monitor.stop"),onClick:R=>b(S)},[M(u(W),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,iw)])]))),128))])),p("div",lw,[M(u(W),{icon:"clarity:info-standard-line",class:"h-5 w-5 shrink-0 mt-0.5 text-primary/70"}),p("p",null,w(u(t)("monitor.info")),1)])])]))}},cw={class:"min-h-screen"},uw={class:"mx-auto max-w-5xl px-4 py-8 sm:px-6"},dw={class:"mb-8"},fw={class:"text-2xl font-bold tracking-tight"},pw={class:"mt-1 text-sm text-base-content/60"},hw={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},mw={class:"text-base-content/50 text-sm"},gw={class:"text-base-content/40 text-xs mt-1"},yw={key:1,class:"space-y-3"},vw={key:2,class:"grid gap-6 lg:grid-cols-[1fr_360px]"},bw={class:"surface rounded-3xl p-6 sm:p-8 flex flex-col items-center text-center"},_w=["src","alt"],xw={key:2,class:"absolute bottom-3 right-3 equalizer h-5","aria-hidden":"true"},ww={class:"mt-6 w-full"},kw={class:"text-xl font-bold tracking-tight truncate"},Sw={class:"text-sm text-base-content/60 truncate mt-0.5"},Ew={class:"mt-6 w-full"},Aw={class:"mt-2 flex items-center justify-between text-xs text-base-content/50 tabular-nums"},Rw={class:"mt-5 flex items-center justify-center gap-3"},Cw=["title"],Tw=["title","disabled"],Pw=["disabled","title"],Ow=["title","disabled"],Dw=["title"],Nw={key:0,class:"absolute -bottom-0.5 -right-0.5 h-4 min-w-[1rem] px-1 rounded-full bg-primary text-primary-content text-[9px] font-bold flex items-center justify-center"},Iw={class:"mt-6 w-full max-w-xs flex items-center gap-3"},$w=["title"],Lw=["value","title"],Mw={class:"surface rounded-3xl p-4 sm:p-5 lg:max-h-[640px] lg:overflow-y-auto"},Uw={class:"flex items-center justify-between mb-3 px-1"},Fw={class:"text-xs font-semibold uppercase tracking-wider text-base-content/50"},Bw={class:"text-[11px] text-base-content/40"},Hw={key:0,class:"space-y-1"},jw=["onClick"],qw=["src","alt","onError"],Vw={key:1,class:"relative equalizer h-3","aria-hidden":"true"},Kw={class:"flex-1 min-w-0"},Ww={class:"text-sm truncate font-medium"},zw={class:"text-[11px] truncate text-base-content/50"},Gw={key:1,class:"text-center py-10"},Qw={class:"text-base-content/50 text-sm"},Jw={__name:"Player",setup(e){const{t}=wt(),n=Ou(),s=ee([]),o=ee(!1),r=ee(null),i=ee({});let l=!1;function a(L){return Se.coverFileURL(L)}function d(L){i.value={...i.value,[L]:!0}}async function c(){o.value=!0;try{const L=await Se.listDownloads();s.value=(L.data||[]).map(Si),n.playlist.value.length===0&&s.value.length>0&&n.setPlaylist(s.value)}finally{o.value=!1}}function f(L){var T,U;n.playlist.value.length!==s.value.length||((T=n.playlist.value[L])==null?void 0:T.file)!==((U=s.value[L])==null?void 0:U.file)?n.setPlaylist(s.value,{startIndex:L}):n.playAt(L)}const m=Ae(()=>{const L=n.currentTrack.value;return L&&L.title?L.title:t("player.empty")}),y=Ae(()=>{const L=n.currentTrack.value;return L&&L.artist?L.artist:L?t("common.unknownArtist"):""}),b=Ae(()=>n.repeatMode.value==="one"?t("player.repeatOne"):n.repeatMode.value==="all"?t("player.repeatAll"):t("player.repeatOff"));function v(L){n.setVolume(parseFloat(L.target.value))}function h(L){const T=r.value;if(!T)return 0;const U=T.getBoundingClientRect(),ae=(L.clientX||0)-U.left;return Math.max(0,Math.min(1,ae/U.width))}function E(L){n.seekRatio(h(L))}function C(L){l=!0,n.seekRatio(h(L)),window.addEventListener("pointermove",S),window.addEventListener("pointerup",R,{once:!0})}function S(L){l&&n.seekRatio(h(L))}function R(){l=!1,window.removeEventListener("pointermove",S)}return Yt(()=>{window.scroll(0,0),c()}),ri(()=>{window.removeEventListener("pointermove",S)}),(L,T)=>(A(),P("div",cw,[M(Is),M(Wn),p("div",uw,[p("div",dw,[p("h1",fw,w(u(t)("player.title")),1),p("p",pw,w(u(t)("player.subtitle")),1)]),s.value.length===0&&!o.value?(A(),P("div",hw,[M(u(W),{icon:"clarity:headphones-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",mw,w(u(t)("player.empty")),1),p("p",gw,w(u(t)("player.emptyHint")),1)])):o.value&&!u(n).currentTrack.value?(A(),P("div",yw,[...T[8]||(T[8]=[p("div",{class:"skeleton h-72 rounded-3xl"},null,-1),p("div",{class:"skeleton h-16 rounded-2xl"},null,-1),p("div",{class:"skeleton h-16 rounded-2xl"},null,-1)])])):(A(),P("div",vw,[p("section",bw,[p("div",{class:Ee(["relative h-56 w-56 sm:h-64 sm:w-64 rounded-3xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden shadow-glow",{"pulse-glow":u(n).isPlaying.value}])},[u(n).currentTrack.value&&u(n).currentTrack.value.cover&&!i.value[u(n).currentTrack.value.file]?(A(),P("img",{key:0,src:u(n).currentTrack.value.cover,alt:u(n).currentTrack.value.title,class:"absolute inset-0 h-full w-full object-cover",onError:T[0]||(T[0]=U=>d(u(n).currentTrack.value.file))},null,40,_w)):(A(),lt(u(W),{key:1,icon:"clarity:music-note-line",class:"h-24 w-24"})),u(n).isPlaying.value?(A(),P("div",xw,[...T[9]||(T[9]=[p("span",null,null,-1),p("span",null,null,-1),p("span",null,null,-1)])])):he("",!0)],2),p("div",ww,[p("p",kw,w(m.value),1),p("p",Sw,w(y.value),1)]),p("div",Ew,[p("div",{class:"relative h-2 rounded-full bg-white/10 overflow-hidden cursor-pointer group",ref_key:"progressBar",ref:r,onClick:E,onPointerdown:C},[p("div",{class:"h-full bg-primary transition-[width] duration-150",style:$n(`width: ${u(n).progressPct.value}%`)},null,4),p("div",{class:"absolute top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded-full bg-primary shadow-glow-sm transition-all duration-150 opacity-0 group-hover:opacity-100",style:$n(`left: calc(${u(n).progressPct.value}% - 7px)`)},null,4)],544),p("div",Aw,[p("span",null,w(u(pa)(u(n).currentTime.value)),1),p("span",null,w(u(pa)(u(n).duration.value)),1)])]),p("div",Rw,[p("button",{class:Ee(["icon-btn",{"icon-btn-active":u(n).shuffle.value}]),onClick:T[1]||(T[1]=U=>u(n).toggleShuffle()),title:u(n).shuffle.value?u(t)("player.shuffleOn"):u(t)("player.shuffleOff")},[M(u(W),{icon:"clarity:shuffle-line",class:"h-5 w-5"})],10,Cw),p("button",{class:"icon-btn",onClick:T[2]||(T[2]=U=>u(n).prev()),title:u(t)("player.previous"),disabled:s.value.length===0},[M(u(W),{icon:"clarity:step-forward-2-line",class:"h-5 w-5 -scale-x-100"})],8,Tw),p("button",{class:"inline-flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm hover:scale-105 active:scale-95 transition disabled:opacity-50",onClick:T[3]||(T[3]=U=>u(n).toggle()),disabled:s.value.length===0,title:u(n).isPlaying.value?u(t)("player.pause"):u(t)("player.play")},[M(u(W),{icon:u(n).isPlaying.value?"clarity:pause-solid":"clarity:play-solid",class:"h-6 w-6"},null,8,["icon"])],8,Pw),p("button",{class:"icon-btn",onClick:T[4]||(T[4]=U=>u(n).next()),title:u(t)("player.next"),disabled:s.value.length===0},[M(u(W),{icon:"clarity:step-forward-2-line",class:"h-5 w-5"})],8,Ow),p("button",{class:Ee(["icon-btn relative",{"icon-btn-active":u(n).repeatMode.value!=="off"}]),onClick:T[5]||(T[5]=U=>u(n).cycleRepeat()),title:b.value},[M(u(W),{icon:"clarity:refresh-line",class:"h-5 w-5"}),u(n).repeatMode.value==="one"?(A(),P("span",Nw," 1 ")):he("",!0)],10,Dw)]),p("div",Iw,[p("button",{class:"icon-btn",onClick:T[6]||(T[6]=U=>u(n).toggleMute()),title:u(n).isMuted.value?u(t)("player.unmute"):u(t)("player.mute")},[M(u(W),{icon:u(n).isMuted.value||u(n).volume.value===0?"clarity:volume-mute-line":u(n).volume.value<.5?"clarity:volume-down-line":"clarity:volume-up-line",class:"h-5 w-5"},null,8,["icon"])],8,$w),p("input",{type:"range",min:"0",max:"1",step:"0.01",value:u(n).isMuted.value?0:u(n).volume.value,onInput:T[7]||(T[7]=U=>v(U)),class:"player-range flex-1",title:u(t)("player.volume")},null,40,Lw)])]),p("aside",Mw,[p("div",Uw,[p("h2",Fw,w(u(t)("player.queue")),1),p("span",Bw,w(s.value.length===1?u(t)("player.countOne",{count:s.value.length}):u(t)("player.countMany",{count:s.value.length})),1)]),s.value.length>0?(A(),P("ul",Hw,[(A(!0),P(ce,null,$e(s.value,(U,ae)=>(A(),P("li",{key:U.file,class:Ee(["rounded-xl px-2 py-2 flex items-center gap-3 cursor-pointer transition-colors",ae===u(n).currentIndex.value?"bg-primary/10 text-primary":"hover:bg-white/5"]),onClick:z=>f(ae)},[p("div",{class:Ee(["relative h-9 w-9 shrink-0 rounded-lg overflow-hidden flex items-center justify-center",ae===u(n).currentIndex.value?"bg-primary/15":"bg-base-100/60"])},[i.value[U.file]?he("",!0):(A(),P("img",{key:0,src:a(U.file),alt:U.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:z=>d(U.file)},null,40,qw)),ae===u(n).currentIndex.value&&u(n).isPlaying.value?(A(),P("span",Vw,[...T[10]||(T[10]=[p("span",null,null,-1),p("span",null,null,-1),p("span",null,null,-1)])])):i.value[U.file]?(A(),lt(u(W),{key:2,icon:"clarity:music-note-line",class:"h-4 w-4 text-base-content/50"})):he("",!0)],2),p("div",Kw,[p("p",Ww,w(U.title),1),p("p",zw,w(U.artist||u(t)("common.unknownArtist")),1)])],10,jw))),128))])):(A(),P("div",Gw,[p("p",Qw,w(u(t)("player.empty")),1)]))])]))])]))}},Yw=Eu(Jw,[["__scopeId","data-v-98956c70"]]),Xw=[{path:"/",name:"Home",component:Wb},{path:"/search/:query",name:"Search",component:M_},{path:"/download",name:"Download",component:f0},{path:"/list",name:"List",component:ox},{path:"/monitor",name:"Monitor",component:aw},{path:"/player",name:"Player",component:Yw}],ot=mb({history:zv(Ge.BASEURL),routes:Xw}),Du=rp(cv);Du.use(ot);Du.mount("#app"); diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 6035a41..9f88881 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -5,8 +5,8 @@ Downtify - - + +
diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a6c4105..ed07b6a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -404,6 +404,24 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", @@ -421,6 +439,24 @@ "node": ">=12" } }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", @@ -438,6 +474,24 @@ "node": ">=12" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", @@ -727,9 +781,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -747,9 +798,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -767,9 +815,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -787,9 +832,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -807,9 +849,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -827,9 +866,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2352,9 +2388,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -2376,9 +2409,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -2400,9 +2430,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -2424,9 +2451,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -3435,6 +3459,420 @@ } } }, + "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, "node_modules/vitest/node_modules/@vitest/mocker": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz", @@ -3462,6 +3900,50 @@ } } }, + "node_modules/vitest/node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, "node_modules/vitest/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", diff --git a/frontend/package.json b/frontend/package.json index 9fda6d6..bebd620 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "downtify-web", - "version": "2.7.0", + "version": "2.7.7", "scripts": { "dev": "vite", "build": "vite build", diff --git a/frontend/src/components/DownloadList.vue b/frontend/src/components/DownloadList.vue index 58c5e8d..7965e32 100644 --- a/frontend/src/components/DownloadList.vue +++ b/frontend/src/components/DownloadList.vue @@ -90,9 +90,9 @@
{{ Math.round(item.progress) }}% diff --git a/frontend/src/components/Settings.vue b/frontend/src/components/Settings.vue index 13711a1..2d417e8 100644 --- a/frontend/src/components/Settings.vue +++ b/frontend/src/components/Settings.vue @@ -55,22 +55,178 @@ > {{ t('settings.audioSource') }} +

+ {{ t('settings.audioSourceHint') }} +

+
    +
  • + {{ index + 1 }} + {{ providerLabel(provider) }} + + +
  • +
+ +
+ + +
+ +

+ {{ t('settings.slskdHint') }} +

+ +
+ + +
+

+ {{ t('settings.slskdSourceDirTitle') }} +

+
    +
  • {{ t('settings.slskdSourceDirBullet1') }}
  • +
  • {{ t('settings.slskdSourceDirBullet2') }}
  • +
  • {{ t('settings.slskdSourceDirBullet3') }}
  • +
+
{{ t('settings.slskdSourceDirExample') }}
+
+ + +

+ {{ t('settings.slskdSourceDirHint') }} +

+ +
+ + +
+

+ {{ t('settings.slskdTimeoutHint') }} +

+
@@ -177,7 +333,7 @@ {{ t('settings.playlistsSection') }} + + + + +
+ +

+ {{ t('settings.navidromeHint') }} +

+ +
+ + + + + + +
@@ -269,7 +514,7 @@ icon="clarity:exclamation-circle-line" class="h-4 w-4 shrink-0" /> - {{ t('settings.saveError') }} + {{ sm.saveErrorText.value || t('settings.saveError') }} @@ -300,15 +545,123 @@ diff --git a/frontend/src/i18n/locales/en.js b/frontend/src/i18n/locales/en.js index fbb02bd..ba423ab 100644 --- a/frontend/src/i18n/locales/en.js +++ b/frontend/src/i18n/locales/en.js @@ -137,7 +137,10 @@ export default { settings: { title: 'Settings', subtitle: 'Tweak how Downtify fetches and tags your music.', - audioSource: 'Audio source', + audioSource: 'Audio sources (fallback order)', + audioSourceHint: + 'Enable one or more. Downtify tries them in order (1, 2, 3) per track. Use slskd then YouTube for playlists.', + audioSourceReset: 'Use recommended order', lyricsSource: 'Lyrics source', lyricsHint: 'only lrclib is active', downloadLyrics: 'Download lyrics', @@ -150,7 +153,22 @@ export default { playlistsSection: 'Playlists', generateM3u: 'Generate M3U file for playlists', generateM3uHint: - 'Writes Playlists/.m3u alongside the tracks for both manual playlist downloads and Playlist Monitor sweeps.', + 'Writes Playlists/.m3u with absolute file paths (/downloads/... and /slskd/...) for manual downloads and Playlist Monitor sweeps.', + syncNavidrome: 'Create playlist in Navidrome', + syncNavidromeHint: + 'After a Spotify playlist download finishes, scan the library and create/update a Navidrome playlist with the same name.', + navidromeSection: 'Navidrome', + navidromeHint: + 'Uses the Subsonic API (same as Explo). Point your music folder in Navidrome at Downtify downloads.', + navidromeEnabled: 'Enable Navidrome sync', + navidromeEnabledHint: + 'Requires URL, username, and password. Admin account recommended: triggers Subsonic startScan (incremental) before matching tracks, same as Explo.', + navidromeUrl: 'Navidrome URL (example: https://music.example.com)', + navidromeUsername: 'Navidrome username', + navidromePassword: 'Navidrome password', + navidromeAdminUser: 'Admin username (optional, for library scan)', + navidromeAdminPassword: 'Admin password (optional)', + navidromePublic: 'Public playlist in Navidrome', organizationSection: 'File organization', organizeByArtist: 'Organize by artist', organizeByArtistHint: @@ -162,6 +180,34 @@ export default { saveError: "Couldn't save settings.", language: 'Language', languageHint: 'Choose the interface language', + slskdSection: 'slskd', + slskdHint: + 'Soulseek via slskd. With Navidrome enabled, playlists are built in Navidrome after a library scan — files can stay in the slskd folder.', + slskdEnabled: 'Enable slskd provider', + slskdEnabledHint: + 'When off, slskd is never attempted in provider fallback.', + slskdBaseUrl: 'slskd base URL (example: https://slskd.example.com)', + slskdApiKey: 'slskd API key', + slskdSourceDirTitle: 'slskd download folder (inside this container)', + slskdSourceDirBullet1: + 'slskd writes completed transfers here (e.g. /slskd → host music/slskd).', + slskdSourceDirBullet2: + 'Navidrome must scan the parent music library that includes this folder.', + slskdSourceDirBullet3: + 'Use the path Downtify sees — not the host path, not the slskd web URL.', + slskdSourceDirExample: + 'slskd: /mnt/storage/music/slskd:/downloads\nDowntify: /mnt/storage/music/slskd:/slskd → set /slskd', + slskdSourceDirLabel: 'slskd folder path in Downtify', + slskdSourceDirPlaceholder: '/slskd', + slskdSourceDirHint: + 'Downtify watches this folder for finished slskd files. No copy into /downloads when leave-in-place is on.', + slskdLeaveInPlace: 'Leave slskd files in place', + slskdLeaveInPlaceHint: + 'Do not copy into /downloads. Tag in place, register for dedupe, and add tracks to Navidrome playlists via library search (recommended with Navidrome sync).', + slskdDownloadTimeout: 'Total slskd timeout (seconds)', + slskdQueuedTimeout: 'Queued / no-progress timeout (seconds)', + slskdTimeoutHint: + 'If slskd does not finish in time, Downtify tries the next audio provider (YouTube). Lower the queued timeout when tracks sit on "Queued on slskd" too long.', }, player: { title: 'Player', diff --git a/frontend/src/i18n/locales/es.js b/frontend/src/i18n/locales/es.js index c4b59c7..394ee8d 100644 --- a/frontend/src/i18n/locales/es.js +++ b/frontend/src/i18n/locales/es.js @@ -140,7 +140,10 @@ export default { settings: { title: 'Ajustes', subtitle: 'Ajusta cómo Downtify descarga y etiqueta tu música.', - audioSource: 'Fuente de audio', + audioSource: 'Fuentes de audio (orden de respaldo)', + audioSourceHint: + 'Activa una o más. Downtify las prueba en orden (1, 2, 3) por pista. Para listas: slskd y luego YouTube.', + audioSourceReset: 'Usar orden recomendado', lyricsSource: 'Fuente de letras', lyricsHint: 'solo lrclib está activo', downloadLyrics: 'Descargar letras', @@ -153,7 +156,22 @@ export default { playlistsSection: 'Listas', generateM3u: 'Generar archivo M3U para las listas', generateM3uHint: - 'Escribe Playlists/.m3u junto a las pistas, tanto para descargas manuales como para los barridos del Monitor.', + 'Escribe Playlists/.m3u con rutas absolutas (/downloads/... y /slskd/...) para descargas y el Monitor.', + syncNavidrome: 'Crear lista en Navidrome', + syncNavidromeHint: + 'Tras descargar una lista de Spotify, escanea la biblioteca y crea/actualiza una lista en Navidrome con el mismo nombre.', + navidromeSection: 'Navidrome', + navidromeHint: + 'Usa la API Subsonic (como Explo). La carpeta de música en Navidrome debe apuntar a las descargas de Downtify.', + navidromeEnabled: 'Activar sincronización con Navidrome', + navidromeEnabledHint: + 'Requiere URL, usuario y contraseña. La cuenta admin opcional inicia el escaneo de la biblioteca.', + navidromeUrl: 'URL de Navidrome (ejemplo: https://musica.ejemplo.com)', + navidromeUsername: 'Usuario de Navidrome', + navidromePassword: 'Contraseña de Navidrome', + navidromeAdminUser: 'Usuario admin (opcional, para escaneo)', + navidromeAdminPassword: 'Contraseña admin (opcional)', + navidromePublic: 'Lista pública en Navidrome', organizationSection: 'Organización de archivos', organizeByArtist: 'Organizar por artista', organizeByArtistHint: @@ -165,6 +183,34 @@ export default { saveError: 'No se pudieron guardar los ajustes.', language: 'Idioma', languageHint: 'Elige el idioma de la interfaz', + slskdSection: 'slskd', + slskdHint: + 'Soulseek vía slskd. Con Navidrome activo, las listas se crean allí tras escanear la biblioteca; los archivos pueden quedarse en la carpeta slskd.', + slskdEnabled: 'Activar proveedor slskd', + slskdEnabledHint: + 'Si está desactivado, slskd nunca se intentará en la cadena de fallback.', + slskdBaseUrl: 'URL base de slskd (ejemplo: https://slskd.ejemplo.com)', + slskdApiKey: 'API key de slskd', + slskdSourceDirTitle: 'Carpeta de descargas de slskd (en este contenedor)', + slskdSourceDirBullet1: + 'slskd escribe aquí las transferencias completadas (ej. /slskd → music/slskd en el host).', + slskdSourceDirBullet2: + 'Navidrome debe escanear la biblioteca que incluye esta carpeta.', + slskdSourceDirBullet3: + 'Ruta que ve Downtify — no la ruta del host ni la URL web de slskd.', + slskdSourceDirExample: + 'slskd: /mnt/storage/music/slskd:/downloads\nDowntify: /mnt/storage/music/slskd:/slskd → /slskd', + slskdSourceDirLabel: 'Carpeta slskd en Downtify', + slskdSourceDirPlaceholder: '/slskd', + slskdSourceDirHint: + 'Downtify detecta archivos slskd aquí. Sin copia a /downloads si “dejar en sitio” está activo.', + slskdLeaveInPlace: 'Dejar archivos slskd en su sitio', + slskdLeaveInPlaceHint: + 'No copiar a /downloads. Etiquetar en sitio y añadir a listas de Navidrome tras el escaneo.', + slskdDownloadTimeout: 'Tiempo máximo slskd (segundos)', + slskdQueuedTimeout: 'Tiempo en cola sin progreso (segundos)', + slskdTimeoutHint: + 'Si slskd no termina a tiempo, Downtify prueba el siguiente proveedor (YouTube). Baja el tiempo en cola si se queda en "Queued on slskd".', }, player: { title: 'Reproductor', diff --git a/frontend/src/i18n/locales/pt-BR.js b/frontend/src/i18n/locales/pt-BR.js index 4315904..52a6d6b 100644 --- a/frontend/src/i18n/locales/pt-BR.js +++ b/frontend/src/i18n/locales/pt-BR.js @@ -139,7 +139,10 @@ export default { settings: { title: 'Configurações', subtitle: 'Ajuste como o Downtify baixa e marca suas músicas.', - audioSource: 'Fonte de áudio', + audioSource: 'Fontes de áudio (ordem de fallback)', + audioSourceHint: + 'Ative uma ou mais. O Downtify tenta na ordem (1, 2, 3) por faixa. Para playlists: slskd e depois YouTube.', + audioSourceReset: 'Usar ordem recomendada', lyricsSource: 'Fonte de letras', lyricsHint: 'apenas o lrclib está ativo', downloadLyrics: 'Baixar letras', @@ -152,7 +155,22 @@ export default { playlistsSection: 'Playlists', generateM3u: 'Gerar arquivo M3U para playlists', generateM3uHint: - 'Grava Playlists/.m3u junto com as faixas, tanto para downloads manuais de playlist quanto para varreduras do Monitor.', + 'Grava Playlists/.m3u com caminhos absolutos (/downloads/... e /slskd/...) para downloads e o Monitor.', + syncNavidrome: 'Criar playlist no Navidrome', + syncNavidromeHint: + 'Depois de baixar uma playlist do Spotify, escaneia a biblioteca e cria/atualiza uma playlist no Navidrome com o mesmo nome.', + navidromeSection: 'Navidrome', + navidromeHint: + 'Usa a API Subsonic (como o Explo). A pasta de música no Navidrome deve apontar para os downloads do Downtify.', + navidromeEnabled: 'Ativar sincronização com Navidrome', + navidromeEnabledHint: + 'Exige URL, usuário e senha. Conta admin opcional dispara varredura da biblioteca.', + navidromeUrl: 'URL do Navidrome (exemplo: https://musica.exemplo.com)', + navidromeUsername: 'Usuário do Navidrome', + navidromePassword: 'Senha do Navidrome', + navidromeAdminUser: 'Usuário admin (opcional, para varredura)', + navidromeAdminPassword: 'Senha admin (opcional)', + navidromePublic: 'Playlist pública no Navidrome', organizationSection: 'Organização de arquivos', organizeByArtist: 'Organizar por artista', organizeByArtistHint: @@ -164,6 +182,34 @@ export default { saveError: 'Não foi possível salvar as configurações.', language: 'Idioma', languageHint: 'Escolha o idioma da interface', + slskdSection: 'slskd', + slskdHint: + 'Soulseek via slskd. Com Navidrome ativo, playlists são criadas lá após varrer a biblioteca; arquivos podem ficar na pasta do slskd.', + slskdEnabled: 'Ativar provedor slskd', + slskdEnabledHint: + 'Quando desativado, o slskd nunca é tentado na cadeia de fallback.', + slskdBaseUrl: 'URL base do slskd (exemplo: https://slskd.exemplo.com)', + slskdApiKey: 'API key do slskd', + slskdSourceDirTitle: 'Pasta de download do slskd (neste container)', + slskdSourceDirBullet1: + 'O slskd grava transferências concluídas aqui (ex.: /slskd → music/slskd no host).', + slskdSourceDirBullet2: + 'O Navidrome deve varrer a biblioteca que inclui esta pasta.', + slskdSourceDirBullet3: + 'Caminho visto pelo Downtify — não o caminho do host nem a URL do slskd.', + slskdSourceDirExample: + 'slskd: /mnt/storage/music/slskd:/downloads\nDowntify: /mnt/storage/music/slskd:/slskd → /slskd', + slskdSourceDirLabel: 'Pasta slskd no Downtify', + slskdSourceDirPlaceholder: '/slskd', + slskdSourceDirHint: + 'O Downtify observa esta pasta. Sem cópia para /downloads com “deixar no lugar” ativo.', + slskdLeaveInPlace: 'Deixar arquivos do slskd no lugar', + slskdLeaveInPlaceHint: + 'Não copiar para /downloads. Taguear no lugar e montar playlists no Navidrome após o scan.', + slskdDownloadTimeout: 'Tempo máximo slskd (segundos)', + slskdQueuedTimeout: 'Tempo na fila sem progresso (segundos)', + slskdTimeoutHint: + 'Se o slskd não terminar a tempo, o Downtify tenta o próximo provedor (YouTube). Reduza o tempo na fila se ficar em "Queued on slskd".', }, player: { title: 'Player', diff --git a/frontend/src/model/api.js b/frontend/src/model/api.js index e865a1d..0c37b18 100644 --- a/frontend/src/model/api.js +++ b/frontend/src/model/api.js @@ -78,7 +78,7 @@ function encodePath(fileName) { } function downloadFileURL(fileName) { - return `/downloads/${encodePath(fileName)}` + return `/media/${encodePath(fileName)}` } function coverFileURL(fileName) { diff --git a/frontend/src/model/player.js b/frontend/src/model/player.js index 2fc565f..8ff5dbc 100644 --- a/frontend/src/model/player.js +++ b/frontend/src/model/player.js @@ -1,5 +1,7 @@ import { ref, computed } from 'vue' +import API from '/src/model/api' + const VOLUME_KEY = 'downtify-player-volume' const playlist = ref([]) @@ -40,14 +42,6 @@ function ensureAudio() { return audio } -function fileUrl(file) { - return `/downloads/${encodeURIComponent(file)}` -} - -function coverUrl(file) { - return `/cover?file=${encodeURIComponent(file)}` -} - function trackFromFile(file) { const noExt = file.replace(/\.[^.]+$/, '') let artist = '' @@ -59,10 +53,31 @@ function trackFromFile(file) { } return { file, - url: fileUrl(file), - cover: coverUrl(file), + url: API.downloadFileURL(file), + cover: API.coverFileURL(file), title, artist, + album: '', + } +} + +/** Normalize ``/list`` rows (string legacy paths or tag-enriched objects). */ +export function normalizeLibraryEntry(raw) { + if (typeof raw === 'string') { + return trackFromFile(raw) + } + const file = String(raw?.file || '') + const base = trackFromFile(file) + const title = String(raw?.title || '').trim() + const artist = String(raw?.artist || '').trim() + const album = String(raw?.album || '').trim() + return { + file, + url: base.url, + cover: base.cover, + title: title || base.title, + artist: artist || base.artist, + album: album || base.album, } } @@ -81,7 +96,7 @@ function buildShuffleOrder() { function setPlaylist(files, options = {}) { const tracks = (files || []).map((f) => - typeof f === 'string' ? trackFromFile(f) : f + typeof f === 'string' ? trackFromFile(f) : normalizeLibraryEntry(f) ) playlist.value = tracks if (currentIndex.value >= tracks.length) currentIndex.value = -1 @@ -257,8 +272,11 @@ export function formatTime(seconds) { return `${m}:${s.toString().padStart(2, '0')}` } -export function trackInfoFromFile(file) { - return trackFromFile(file) +export function trackInfoFromFile(fileOrEntry) { + if (typeof fileOrEntry === 'string') { + return trackFromFile(fileOrEntry) + } + return normalizeLibraryEntry(fileOrEntry) } export function usePlayer() { diff --git a/frontend/src/model/settings.js b/frontend/src/model/settings.js index b467d5c..05cc78a 100644 --- a/frontend/src/model/settings.js +++ b/frontend/src/model/settings.js @@ -4,18 +4,50 @@ import API from '/src/model/api' const settings = ref({ audio_providers: [''], + slskd: { + enabled: false, + base_url: '', + api_key: '', + source_dir: '/slskd', + leave_in_place: true, + timeout_seconds: 20, + search_retries: 5, + search_poll_seconds: 15, + download_attempts: 3, + poll_interval_seconds: 5, + poll_max_attempts: 60, + download_timeout_seconds: 600, + queued_timeout_seconds: 180, + extensions: ['mp3', 'flac'], + min_bitrate: 256, + }, lyrics_providers: [''], download_lyrics: true, format: '', bitrate: '320', output: '', generate_m3u: true, + sync_navidrome: true, + navidrome: { + enabled: false, + url: '', + username: '', + password: '', + admin_username: '', + admin_password: '', + public_playlist: false, + scan_after_download: true, + scan_wait_seconds: 120, + scan_poll_seconds: 30, + client_name: 'Downtify', + api_version: '1.16.1', + }, organize_by_artist: false, max_parallel_downloads: 3, }) const settingsOptions = { - audio_providers: ['youtube', 'youtube-music'], + audio_providers: ['youtube', 'youtube-music', 'slskd'], lyrics_providers: ['lrclib', 'genius', 'musixmatch', 'azlyrics'], format: ['mp3', 'flac', 'ogg', 'opus', 'm4a'], bitrate: ['128', '192', '256', '320'], @@ -26,7 +58,12 @@ const settingsOptions = { API.getSettings().then((res) => { if (res.status === 200) { console.log('Received settings:', res.data) - settings.value = res.data + settings.value = { + ...settings.value, + ...res.data, + slskd: { ...settings.value.slskd, ...(res.data.slskd || {}) }, + navidrome: { ...settings.value.navidrome, ...(res.data.navidrome || {}) }, + } } else { console.log('Error loading settings') } @@ -34,23 +71,75 @@ API.getSettings().then((res) => { export function useSettingsManager() { const isSaved = ref() + const saveErrorText = ref('') + + function validateSettings() { + const slskd = settings.value?.slskd || {} + if (slskd.enabled) { + if (!String(slskd.base_url || '').trim()) { + return 'slskd base URL is required when enabled' + } + if (!String(slskd.api_key || '').trim()) { + return 'slskd API key is required when enabled' + } + } + const nav = settings.value?.navidrome || {} + if (nav.enabled) { + if (!String(nav.url || '').trim()) { + return 'Navidrome URL is required when enabled' + } + if (!String(nav.username || '').trim()) { + return 'Navidrome username is required when enabled' + } + if (!String(nav.password || '')) { + return 'Navidrome password is required when enabled' + } + } + return '' + } + function saveSettings() { console.log('Saving settings:', settings.value) + const err = validateSettings() + if (err) { + saveErrorText.value = err + isSaved.value = false + setTimeout(() => { + isSaved.value = null + }, 2500) + return + } + saveErrorText.value = '' API.setSettings(settings.value).then((res) => { if (res.status === 200) { console.log('Saved!') isSaved.value = true + const modal = document.getElementById('settings-modal') + if (modal && 'checked' in modal) { + modal.checked = false + } setTimeout(() => { isSaved.value = null }, 2000) } else { console.error('Error saving settings.', res) + saveErrorText.value = 'Could not save settings' isSaved.value = false setTimeout(() => { isSaved.value = null }, 2000) } + }).catch((error) => { + const detail = error?.response?.data?.detail + saveErrorText.value = + typeof detail === 'string' && detail.trim() + ? detail + : 'Could not save settings' + isSaved.value = false + setTimeout(() => { + isSaved.value = null + }, 2500) }) } - return { saveSettings, settings, settingsOptions, isSaved } + return { saveSettings, settings, settingsOptions, isSaved, saveErrorText } } diff --git a/frontend/src/views/Downloads.vue b/frontend/src/views/Downloads.vue index fe82082..14d16a8 100644 --- a/frontend/src/views/Downloads.vue +++ b/frontend/src/views/Downloads.vue @@ -71,8 +71,8 @@
  • @@ -80,29 +80,35 @@ class="relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden" > - +
    {{ - displayName(file) + entry.title }} +

    + {{ entry.artist }} +

    - + {{ folderOf(file) }} + />{{ folderOf(entry.file) }} - {{ formatExt(file) }} + {{ formatExt(entry.file) }}
    @@ -110,14 +116,14 @@
    @@ -125,12 +131,12 @@

    - {{ trackInfo(file).title }} + {{ entry.title }}

    - {{ trackInfo(file).artist || t('common.unknownArtist') }} + {{ entry.artist || t('common.unknownArtist') }}

  • @@ -290,7 +290,12 @@ import { Icon } from '@iconify/vue' import Navbar from '/src/components/Navbar.vue' import Settings from '/src/components/Settings.vue' import API from '/src/model/api' -import { usePlayer, formatTime, trackInfoFromFile } from '/src/model/player' +import { + usePlayer, + formatTime, + trackInfoFromFile, + normalizeLibraryEntry, +} from '/src/model/player' import { useI18n } from '/src/i18n' const { t } = useI18n() @@ -314,7 +319,7 @@ async function load() { loading.value = true try { const res = await API.listDownloads() - files.value = res.data || [] + files.value = (res.data || []).map(normalizeLibraryEntry) // If the player was empty (direct nav to /player), seed the queue // with the library so the user has something to play. if (player.playlist.value.length === 0 && files.value.length > 0) { @@ -328,7 +333,7 @@ async function load() { function onPick(idx) { if ( player.playlist.value.length !== files.value.length || - player.playlist.value[idx]?.file !== files.value[idx] + player.playlist.value[idx]?.file !== files.value[idx]?.file ) { player.setPlaylist(files.value, { startIndex: idx }) } else { diff --git a/main.py b/main.py index 38daf28..341d084 100644 --- a/main.py +++ b/main.py @@ -20,7 +20,7 @@ from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import Response +from fastapi.responses import FileResponse, Response from fastapi.staticfiles import StaticFiles from load_dotenv import load_dotenv from loguru import logger @@ -35,6 +35,13 @@ from downtify import __version__, api from downtify.downloader import Downloader from downtify.monitor import PlaylistMonitorDB, monitor_loop +from downtify.library_catalog import ( + LibraryContext, + library_context_from_state, + list_library_entries, + resolve_library_file, +) +from downtify.track_index import TrackIndex load_dotenv() @@ -212,6 +219,7 @@ def build_app() -> FastAPI: '.{output-ext}', '' ), audio_providers=api._effective_audio_providers(api.state.settings), + slskd_settings=api._effective_slskd_settings(api.state.settings), lyrics_providers=api._effective_lyrics_providers(api.state.settings), organize_by_artist=bool( api.state.settings.get('organize_by_artist', False) @@ -228,44 +236,53 @@ async def _startup() -> None: ) db_path = DATABASE_DIR / 'downtify_monitor.db' api.state.monitor_db = PlaylistMonitorDB(db_path) + library_db = DATABASE_DIR / 'downtify_library.db' + api.state.track_index = TrackIndex(library_db) + try: + imported = api.state.track_index.backfill_from_monitor_db(db_path) + if imported: + logger.info( + 'Track library index: imported {} path(s) from monitor history', + imported, + ) + except Exception: + logger.exception('Track library backfill from monitor db failed') asyncio.create_task( monitor_loop( db=api.state.monitor_db, get_downloader=lambda: api.state.downloader, + get_track_index=lambda: api.state.track_index, broadcast=api.state.connections.broadcast, loop=loop, settings=api.state.settings, ) ) + def _library_ctx() -> LibraryContext: + return library_context_from_state( + DOWNLOAD_DIR, + api.state.settings, + api.state.track_index, + ) + @app.get('/list') - def list_downloads() -> list[str]: - audio_exts = {'.mp3', '.m4a', '.flac', '.ogg', '.wav', '.aac', '.opus'} - base = DOWNLOAD_DIR.resolve() - if not base.exists(): - return [] - files: list[str] = [] - # Walk recursively so per-playlist sub-folders show up alongside - # loose downloads in the library view. - for path in base.rglob('*'): - if not path.is_file(): - continue - if path.suffix.lower() not in audio_exts: - continue - files.append(path.relative_to(base).as_posix()) - files.sort() - return files + def list_downloads() -> list[dict[str, str]]: + return list_library_entries(_library_ctx()) + + @app.get('/media/{file_path:path}') + def serve_media(file_path: str) -> FileResponse: + full = resolve_library_file(file_path, _library_ctx()) + if full is None: + raise HTTPException(status_code=404, detail='File not found') + return FileResponse( + full, + media_type=mimetypes.guess_type(str(full))[0] or 'application/octet-stream', + ) @app.delete('/delete') def delete_download(file: str) -> dict: - # Resolve and confine to DOWNLOAD_DIR to prevent path traversal. - base = DOWNLOAD_DIR.resolve() - try: - full = (base / file).resolve() - full.relative_to(base) - except (ValueError, RuntimeError): - return {'deleted': False, 'error': 'Invalid path'} - if not full.is_file(): + full = resolve_library_file(file, _library_ctx()) + if full is None: return {'deleted': False, 'error': 'File not found'} try: full.unlink() @@ -275,14 +292,8 @@ def delete_download(file: str) -> dict: @app.get('/cover') def get_cover(file: str): - # Resolve and confine to DOWNLOAD_DIR to prevent path traversal. - base = DOWNLOAD_DIR.resolve() - try: - full = (base / file).resolve() - full.relative_to(base) - except (ValueError, RuntimeError): - raise HTTPException(status_code=400, detail='Invalid path') - if not full.is_file(): + full = resolve_library_file(file, _library_ctx()) + if full is None: raise HTTPException(status_code=404, detail='File not found') data, mime = _extract_cover(full) diff --git a/pyproject.toml b/pyproject.toml index 2954871..fc37057 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "downtify" -version = "2.7.0" +version = "2.7.7" description = "Download your Spotify playlists and songs along with album art and metadata in a self-hosted way via Docker" readme = "README.md" requires-python = ">=3.10,<3.14" diff --git a/tests/test_api_settings.py b/tests/test_api_settings.py index 25455ac..5a54d01 100644 --- a/tests/test_api_settings.py +++ b/tests/test_api_settings.py @@ -9,6 +9,7 @@ DEFAULT_SETTINGS, _effective_audio_providers, _effective_lyrics_providers, + _effective_slskd_settings, _load_settings, ) @@ -16,12 +17,15 @@ def test_default_settings_has_required_keys(): required = { 'audio_providers', + 'slskd', 'lyrics_providers', 'download_lyrics', 'format', 'bitrate', 'output', 'generate_m3u', + 'sync_navidrome', + 'navidrome', 'organize_by_artist', } assert required <= set(DEFAULT_SETTINGS) @@ -44,13 +48,50 @@ def test_default_format_is_mp3(): def test_effective_audio_providers_keeps_allowed_order(): - settings = {'audio_providers': ['youtube', 'youtube-music']} - assert _effective_audio_providers(settings) == ['youtube', 'youtube-music'] + settings = { + 'audio_providers': ['youtube', 'slskd', 'youtube-music'], + 'slskd': {'enabled': True}, + } + assert _effective_audio_providers(settings) == [ + 'youtube', + 'slskd', + 'youtube-music', + ] def test_effective_audio_providers_filters_invalid_and_dedupes(): settings = { - 'audio_providers': ['youtube', 'invalid', 'youtube', 'youtube-music'] + 'audio_providers': [ + 'youtube', + 'invalid', + 'youtube', + 'slskd', + 'youtube-music', + ] + } + assert _effective_audio_providers(settings) == [ + 'youtube', + 'slskd', + 'youtube-music', + ] + + +def test_effective_audio_providers_adds_youtube_fallback_when_only_slskd(): + settings = { + 'audio_providers': ['slskd'], + 'slskd': {'enabled': True}, + } + assert _effective_audio_providers(settings) == [ + 'slskd', + 'youtube-music', + 'youtube', + ] + + +def test_effective_audio_providers_skips_slskd_when_disabled(): + settings = { + 'audio_providers': ['youtube', 'slskd', 'youtube-music'], + 'slskd': {'enabled': False}, } assert _effective_audio_providers(settings) == ['youtube', 'youtube-music'] @@ -59,6 +100,50 @@ def test_effective_audio_providers_defaults_when_missing(): assert _effective_audio_providers({}) == ['youtube-music'] +def test_effective_slskd_settings_defaults_when_missing(): + out = _effective_slskd_settings({}) + assert out['enabled'] is False + assert out['base_url'] == '' + assert out['download_dir'] == '/downloads' + assert out['timeout_seconds'] == 20 + + +def test_effective_slskd_settings_normalizes_values(): + out = _effective_slskd_settings( + { + 'slskd': { + 'enabled': True, + 'base_url': 'http://slskd.local:5030/', + 'api_key': ' key ', + 'download_dir': '/data/slskd', + 'timeout_seconds': '90', + 'poll_interval_seconds': '2', + 'poll_max_attempts': '99', + } + } + ) + assert out['base_url'] == 'http://slskd.local:5030' + assert out['enabled'] is True + assert out['api_key'] == 'key' + assert out['download_dir'] == '/data/slskd' + assert out['source_dir'] == '/data/slskd' + assert out['timeout_seconds'] == 90 + assert out['poll_interval_seconds'] == 2 + assert out['poll_max_attempts'] == 99 + assert out['search_retries'] == 5 + + +def test_load_settings_deep_merges_slskd_dict(tmp_path): + path = tmp_path / 'settings.json' + path.write_text( + json.dumps({'slskd': {'base_url': 'http://slskd:5030'}}), + encoding='utf-8', + ) + out = _load_settings(path) + assert out['slskd']['base_url'] == 'http://slskd:5030' + assert out['slskd']['download_dir'] == '/downloads' + + # ── _load_settings ──────────────────────────────────────────────────────────── diff --git a/tests/test_api_skip_existing.py b/tests/test_api_skip_existing.py new file mode 100644 index 0000000..84865fe --- /dev/null +++ b/tests/test_api_skip_existing.py @@ -0,0 +1,135 @@ +"""Batch/URL downloads skip tracks that already exist on disk.""" + +from __future__ import annotations + +import asyncio +from unittest.mock import AsyncMock, MagicMock + +import downtify.api as api +from downtify.downloader import Downloader +from downtify.track_index import TrackIndex + +SPOTIFY_ID = '4uLU6hMCjMI75M1A2tKUQC' + + +def test_run_download_skips_when_matching_file_exists(tmp_path): + download_dir = tmp_path / 'music' + d = Downloader( + download_dir, + audio_format='mp3', + audio_providers=['youtube'], + ) + song = {'name': 'Track', 'artists': ['Artist']} + target = download_dir / 'Artist - Track.mp3' + target.parent.mkdir(parents=True, exist_ok=True) + target.write_bytes(b'fake') + + d.download = MagicMock(side_effect=AssertionError('must not download')) + + prev_downloader = api.state.downloader + prev_loop = api.state.loop + prev_connections = api.state.connections + try: + api.state.downloader = d + api.state.loop = asyncio.new_event_loop() + api.state.connections = MagicMock() + api.state.connections.broadcast = AsyncMock() + song_id = api._register_job(song, status='queued') + + filename = asyncio.run(api._run_download(song, song_id)) + + assert filename == 'Artist - Track.mp3' + assert api.state.download_jobs[song_id]['status'] == 'done' + assert api.state.download_jobs[song_id]['message'] == 'Already on disk' + d.download.assert_not_called() + finally: + api.state.download_jobs.clear() + api.state.downloader = prev_downloader + api.state.loop = prev_loop + api.state.connections = prev_connections + + +def test_run_download_skips_via_global_library(tmp_path): + download_dir = tmp_path / 'music' + d = Downloader( + download_dir, + audio_format='mp3', + audio_providers=['youtube'], + ) + other = download_dir / 'Other Playlist' / 'Artist - Track.mp3' + other.parent.mkdir(parents=True) + other.write_bytes(b'x' * 100) + + library = TrackIndex(tmp_path / 'library.db') + library.register(SPOTIFY_ID, 'Other Playlist/Artist - Track.mp3') + + d.download = MagicMock(side_effect=AssertionError('must not download')) + + prev_downloader = api.state.downloader + prev_loop = api.state.loop + prev_connections = api.state.connections + prev_index = api.state.track_index + try: + api.state.downloader = d + api.state.track_index = library + api.state.loop = asyncio.new_event_loop() + api.state.connections = MagicMock() + api.state.connections.broadcast = AsyncMock() + song = { + 'song_id': SPOTIFY_ID, + 'name': 'Track', + 'artists': ['Artist'], + } + song_id = api._register_job(song, status='queued') + + filename = asyncio.run( + api._run_download(song, song_id, subdir='New Playlist') + ) + + assert filename == 'Other Playlist/Artist - Track.mp3' + assert api.state.download_jobs[song_id]['message'] == 'Already in library' + d.download.assert_not_called() + finally: + api.state.download_jobs.clear() + api.state.downloader = prev_downloader + api.state.loop = prev_loop + api.state.connections = prev_connections + api.state.track_index = prev_index + + +def test_run_download_skips_in_playlist_subdir(tmp_path): + download_dir = tmp_path / 'music' + d = Downloader( + download_dir, + audio_format='mp3', + audio_providers=['youtube'], + ) + song = {'name': 'Track', 'artists': ['Artist']} + pl_dir = download_dir / 'My Playlist' + target = pl_dir / 'Artist - Track.mp3' + pl_dir.mkdir(parents=True) + target.write_bytes(b'fake') + + d.download = MagicMock(side_effect=AssertionError('must not download')) + + prev_downloader = api.state.downloader + prev_loop = api.state.loop + prev_connections = api.state.connections + try: + api.state.downloader = d + api.state.loop = asyncio.new_event_loop() + api.state.connections = MagicMock() + api.state.connections.broadcast = AsyncMock() + song_id = api._register_job(song, status='queued') + + filename = asyncio.run( + api._run_download(song, song_id, subdir='My Playlist') + ) + + assert filename == 'My Playlist/Artist - Track.mp3' + d.download.assert_not_called() + finally: + api.state.downloader = prev_downloader + api.state.loop = prev_loop + api.state.connections = prev_connections + api.state.download_jobs.clear() diff --git a/tests/test_downloader_extended.py b/tests/test_downloader_extended.py index 8066b7f..17f202a 100644 --- a/tests/test_downloader_extended.py +++ b/tests/test_downloader_extended.py @@ -195,10 +195,13 @@ def should_not_run(_song): raise AssertionError('find_match should not run when youtube succeeds') monkeypatch.setattr(downloader_mod, 'find_match', should_not_run) - vid, match, provider = d._resolve_video_id({'name': 'Track', 'artists': []}) + vid, match, provider, local_path = d._resolve_video_id( + {'name': 'Track', 'artists': []} + ) assert vid == 'yt123' assert match is None assert provider == 'youtube' + assert local_path is None def test_resolve_video_id_uses_second_provider_on_first_failure(monkeypatch): @@ -211,7 +214,82 @@ def test_resolve_video_id_uses_second_provider_on_first_failure(monkeypatch): 'find_match', lambda _song: ('ytm456', {'videoId': 'ytm456'}), ) - vid, match, provider = d._resolve_video_id({'name': 'Track', 'artists': []}) + vid, match, provider, local_path = d._resolve_video_id( + {'name': 'Track', 'artists': []} + ) assert vid == 'ytm456' assert isinstance(match, dict) assert provider == 'youtube-music' + assert local_path is None + + +def test_resolve_video_id_ytdlp_fallback_when_only_youtube_music(monkeypatch): + """Configs like slskd + youtube-music omit 'youtube' as a provider.""" + d = Downloader( + '/tmp', + audio_providers=['slskd', 'youtube-music'], + slskd_settings={'enabled': True}, + ) + ytdlp_calls: list[str] = [] + + monkeypatch.setattr(downloader_mod, 'download_from_slskd', lambda *_a, **_k: None) + monkeypatch.setattr(downloader_mod, 'find_match', lambda _song: (None, None)) + monkeypatch.setattr( + downloader_mod, + '_fallback_video_id_via_ytdlp', + lambda _song: ytdlp_calls.append('ok') or 'yt-fallback', + ) + + vid, match, provider, local_path = d._resolve_video_id( + {'name': 'Seamans Underwear', 'artists': ['Artist']} + ) + assert vid == 'yt-fallback' + assert match is None + assert provider == 'youtube' + assert local_path is None + assert ytdlp_calls == ['ok'] + + +def test_resolve_video_id_supports_slskd_provider(monkeypatch, tmp_path): + d = Downloader( + '/tmp', + audio_providers=['slskd'], + slskd_settings={'enabled': True}, + ) + source = tmp_path / 'slskd-file.flac' + source.write_bytes(b'\x00') + monkeypatch.setattr( + downloader_mod, 'download_from_slskd', lambda *_args, **_kw: source + ) + vid, match, provider, local_path = d._resolve_video_id( + {'name': 'Track', 'artists': []} + ) + assert vid is None + assert match is None + assert provider == 'slskd' + assert local_path == source + + +def test_resolve_video_id_skips_slskd_when_disabled(monkeypatch): + d = Downloader( + '/tmp', + audio_providers=['slskd', 'youtube'], + slskd_settings={'enabled': False}, + ) + monkeypatch.setattr( + downloader_mod, + 'download_from_slskd', + lambda *_args, **_kw: (_ for _ in ()).throw( + AssertionError('slskd should not be called when disabled') + ), + ) + monkeypatch.setattr( + downloader_mod, '_fallback_video_id_via_ytdlp', lambda _song: 'yt123' + ) + vid, match, provider, local_path = d._resolve_video_id( + {'name': 'Track', 'artists': []} + ) + assert vid == 'yt123' + assert match is None + assert provider == 'youtube' + assert local_path is None diff --git a/tests/test_library_catalog.py b/tests/test_library_catalog.py new file mode 100644 index 0000000..396d039 --- /dev/null +++ b/tests/test_library_catalog.py @@ -0,0 +1,82 @@ +"""Library listing includes slskd tree; media paths resolve outside download_dir.""" + +from __future__ import annotations + +from downtify.library_catalog import ( + LibraryContext, + list_library_entries, + list_library_paths, + resolve_library_file, +) +from mutagen.easyid3 import EasyID3 +from mutagen.mp3 import MP3 +from downtify.library_paths import library_stored_path + + +def test_list_library_includes_slskd_tree(tmp_path): + download_dir = tmp_path / 'downloads' + slskd_dir = tmp_path / 'slskd' + download_dir.mkdir() + slskd_dir.mkdir() + (download_dir / 'YouTube - Song.mp3').write_bytes(b'y') + slskd_track = slskd_dir / 'peer' / 'Artist - Slskd.mp3' + slskd_track.parent.mkdir(parents=True) + slskd_track.write_bytes(b's') + + ctx = LibraryContext(download_dir=download_dir, slskd_dir=slskd_dir) + paths = list_library_paths(ctx) + + assert 'YouTube - Song.mp3' in paths + rel = library_stored_path(slskd_track, download_dir, slskd_dir) + assert rel == 'slskd/peer/Artist - Slskd.mp3' + assert rel in paths + + +def test_resolve_library_file_allows_slskd_relative_path(tmp_path): + download_dir = tmp_path / 'downloads' + slskd_dir = tmp_path / 'slskd' + download_dir.mkdir() + track = slskd_dir / 'Artist - Track.mp3' + slskd_dir.mkdir() + track.write_bytes(b'x') + + ctx = LibraryContext(download_dir=download_dir, slskd_dir=slskd_dir) + stored = library_stored_path(track, download_dir, slskd_dir) + assert stored == 'slskd/Artist - Track.mp3' + resolved = resolve_library_file(stored, ctx) + assert resolved == track.resolve() + + +def test_list_library_entries_reads_embedded_tags(tmp_path): + download_dir = tmp_path / 'downloads' + slskd_dir = tmp_path / 'slskd' + download_dir.mkdir() + track = slskd_dir / 'peer' / 'scene-name.mp3' + track.parent.mkdir(parents=True) + audio = MP3() + audio.save(str(track)) + tags = EasyID3(str(track)) + tags['title'] = 'Real Title' + tags['artist'] = 'Real Artist' + tags.save() + + ctx = LibraryContext(download_dir=download_dir, slskd_dir=slskd_dir) + entries = list_library_entries(ctx) + assert len(entries) == 1 + assert entries[0]['title'] == 'Real Title' + assert entries[0]['artist'] == 'Real Artist' + assert entries[0]['file'].startswith('slskd/') + + +def test_resolve_library_file_legacy_dotdot_slskd_path(tmp_path): + download_dir = tmp_path / 'downloads' + slskd_dir = tmp_path / 'slskd' + download_dir.mkdir() + track = slskd_dir / 'Legacy.mp3' + slskd_dir.mkdir() + track.write_bytes(b'x') + + ctx = LibraryContext(download_dir=download_dir, slskd_dir=slskd_dir) + legacy = '../slskd/Legacy.mp3' + resolved = resolve_library_file(legacy, ctx) + assert resolved == track.resolve() diff --git a/tests/test_library_metadata.py b/tests/test_library_metadata.py new file mode 100644 index 0000000..010ba4a --- /dev/null +++ b/tests/test_library_metadata.py @@ -0,0 +1,42 @@ +"""Read embedded tags for library display.""" + +from __future__ import annotations + +from pathlib import Path + +from mutagen.easyid3 import EasyID3 +from mutagen.id3 import ID3 +from mutagen.mp3 import MP3 + +from downtify.library_metadata import library_entry_for_file, read_audio_metadata + + +def test_read_audio_metadata_from_mp3_tags(tmp_path): + track = tmp_path / 'peer' / '02-weval_-_the_most.mp3' + track.parent.mkdir(parents=True) + audio = MP3() + audio.save(str(track)) + tags = EasyID3(str(track)) + tags['title'] = 'The Most' + tags['artist'] = 'Weval' + tags['album'] = 'Half Age' + tags.save() + + meta = read_audio_metadata(track) + assert meta['title'] == 'The Most' + assert meta['artist'] == 'Weval' + assert meta['album'] == 'Half Age' + + entry = library_entry_for_file('slskd/peer/02-weval.mp3', track) + assert entry['title'] == 'The Most' + assert entry['artist'] == 'Weval' + assert entry['album'] == 'Half Age' + + +def test_library_entry_falls_back_to_filename(tmp_path): + track = tmp_path / 'Artist - Song Title.mp3' + track.write_bytes(b'\x00' * 128) + + entry = library_entry_for_file('Artist - Song Title.mp3', track) + assert entry['title'] == 'Song Title' + assert entry['artist'] == 'Artist' diff --git a/tests/test_library_paths.py b/tests/test_library_paths.py new file mode 100644 index 0000000..e4c366a --- /dev/null +++ b/tests/test_library_paths.py @@ -0,0 +1,52 @@ +"""Tests for ``downtify.library_paths``.""" + +from __future__ import annotations + +import os +from pathlib import Path + +from downtify import library_paths as lp + + +def test_locate_library_file_external_slskd_mount(tmp_path, monkeypatch): + download_dir = tmp_path / 'downloads' + slskd_mount = tmp_path / 'slskd_vol' + download_dir.mkdir() + track = slskd_mount / 'Album' / 'song.mp3' + track.parent.mkdir(parents=True) + track.write_bytes(b'\x00') + + monkeypatch.setenv('DOWNTIFY_SLSKD_SOURCE_DIR', str(slskd_mount)) + found = lp.locate_library_file('slskd/Album/song.mp3', download_dir, None) + assert found == track.resolve() + + +def test_locate_prefers_configured_slskd_dir_over_legacy_copy(tmp_path): + download_dir = tmp_path / 'downloads' + slskd_dir = tmp_path / 'slskd' + download_dir.mkdir() + slskd_dir.mkdir() + legacy = download_dir / 'slskd' / 'song.mp3' + external = slskd_dir / 'song.mp3' + legacy.parent.mkdir(parents=True) + legacy.write_bytes(b'legacy') + external.write_bytes(b'external') + + found = lp.locate_library_file('slskd/song.mp3', download_dir, slskd_dir) + assert found == external.resolve() + + +def test_slskd_dir_from_downloader_falls_back_to_env_mount(tmp_path, monkeypatch): + slskd_mount = tmp_path / 'slskd_vol' + slskd_mount.mkdir() + + class _Downloader: + slskd_settings = { + 'enabled': True, + 'source_dir': '', + 'download_dir': str(tmp_path / 'downloads'), + 'leave_in_place': True, + } + + monkeypatch.setenv('DOWNTIFY_SLSKD_SOURCE_DIR', str(slskd_mount)) + assert lp.slskd_dir_from_downloader(_Downloader()) == slskd_mount diff --git a/tests/test_m3u.py b/tests/test_m3u.py index d1ceb5d..0022f9d 100644 --- a/tests/test_m3u.py +++ b/tests/test_m3u.py @@ -45,6 +45,40 @@ def _touch(tmp_path: Path, name: str) -> Path: return path +def test_build_m3u_finds_slskd_track_when_only_on_external_mount(tmp_path): + download_dir = tmp_path / 'downloads' + slskd_dir = tmp_path / 'slskd' + download_dir.mkdir() + track = slskd_dir / 'peer' / 'song.mp3' + track.parent.mkdir(parents=True) + track.write_bytes(b'\x00') + + content, kept = m3u.build_m3u_content( + [{'filename': 'slskd/peer/song.mp3', 'title': 'T', 'artist': 'A'}], + download_dir=download_dir, + slskd_dir=slskd_dir, + ) + assert kept == 1 + assert 'peer/song.mp3' in content or 'song.mp3' in content + + +def test_build_m3u_resolves_slskd_prefixed_paths(tmp_path): + download_dir = tmp_path / 'downloads' + slskd_dir = tmp_path / 'slskd' + download_dir.mkdir() + track = slskd_dir / 'peer' / 'song.mp3' + track.parent.mkdir(parents=True) + track.write_bytes(b'\x00') + + content, kept = m3u.build_m3u_content( + [{'filename': 'slskd/peer/song.mp3', 'title': 'T', 'artist': 'A'}], + download_dir=download_dir, + slskd_dir=slskd_dir, + ) + assert kept == 1 + assert 'song.mp3' in content + + def test_build_starts_with_extm3u_header(tmp_path): _touch(tmp_path, 'a.mp3') content, _ = m3u.build_m3u_content( @@ -101,31 +135,24 @@ def test_build_skips_entries_without_filename(tmp_path): assert content == '#EXTM3U\n' -def test_build_uses_paths_relative_to_m3u_dir(tmp_path): - # Track is flat under download_dir; M3U lives in download_dir/Playlists. - # Relative path back to the track is therefore '../song.mp3'. - _touch(tmp_path, 'song.mp3') +def test_build_uses_absolute_paths(tmp_path): + track = _touch(tmp_path, 'song.mp3') content, _ = m3u.build_m3u_content( [{'filename': 'song.mp3'}], download_dir=tmp_path ) - assert '../song.mp3' in content - # Absolute path must NOT leak into the M3U. - assert str(tmp_path) not in content + assert track.resolve().as_posix() in content -def test_build_relative_paths_with_explicit_m3u_dir(tmp_path): - # Track nested under an artist subdir, M3U sibling at Playlists/. +def test_build_absolute_path_for_nested_track(tmp_path): artist_dir = tmp_path / 'Artist' / 'Album' artist_dir.mkdir(parents=True) - (artist_dir / 'Track.mp3').write_bytes(b'\x00') - m3u_dir = tmp_path / 'Playlists' - m3u_dir.mkdir() + track = artist_dir / 'Track.mp3' + track.write_bytes(b'\x00') content, _ = m3u.build_m3u_content( [{'filename': 'Artist/Album/Track.mp3'}], download_dir=tmp_path, - m3u_dir=m3u_dir, ) - assert '../Artist/Album/Track.mp3' in content + assert track.resolve().as_posix() in content def test_build_extinf_format_with_artist_and_title(tmp_path): @@ -191,6 +218,23 @@ def test_write_returns_none_when_no_files_resolve(tmp_path): assert not (tmp_path / 'Playlists' / 'Empty.m3u').exists() +def test_build_m3u_writes_absolute_slskd_path(tmp_path): + download_dir = tmp_path / 'downloads' + slskd_dir = tmp_path / 'slskd' + download_dir.mkdir() + track = slskd_dir / 'Album' / 'song.mp3' + track.parent.mkdir(parents=True) + track.write_bytes(b'\x00') + + content, kept = m3u.build_m3u_content( + [{'filename': 'slskd/Album/song.mp3'}], + download_dir=download_dir, + slskd_dir=slskd_dir, + ) + assert kept == 1 + assert track.resolve().as_posix() in content + + def test_write_with_playlist_subdir_places_m3u_inside_playlist_folder( tmp_path, ): @@ -209,8 +253,7 @@ def test_write_with_playlist_subdir_places_m3u_inside_playlist_folder( assert target == pl_dir / 'My Mix.m3u' assert kept == 1 body = target.read_text(encoding='utf-8') - assert 'Artist - Song.mp3' in body - assert '../' not in body + assert (pl_dir / 'Artist - Song.mp3').resolve().as_posix() in body def test_write_utf8_no_bom_lf_line_endings(tmp_path): diff --git a/tests/test_navidrome.py b/tests/test_navidrome.py new file mode 100644 index 0000000..c8fc290 --- /dev/null +++ b/tests/test_navidrome.py @@ -0,0 +1,222 @@ +from unittest.mock import MagicMock, patch + +from downtify.navidrome import ( + NavidromeClient, + _effective_navidrome_settings, + sync_playlist_to_navidrome, +) + + +def test_effective_navidrome_settings_defaults(): + out = _effective_navidrome_settings({}) + assert out['enabled'] is False + assert out['scan_wait_seconds'] == 120 + + +def test_search_song_id_matches_title_and_artist(): + client = NavidromeClient( + { + 'url': 'https://navidrome.test', + 'username': 'u', + 'password': 'p', + } + ) + + def fake_request(endpoint, extra=None, **kwargs): + assert endpoint == 'search3' + return { + 'searchResult3': { + 'song': [ + { + 'id': 'song-1', + 'title': 'DRAMA KING', + 'artist': 'Melxdie', + 'duration': 152, + 'path': 'Melxdie/DRAMA KING.mp3', + } + ] + } + } + + client._request = fake_request # type: ignore[method-assign] + sid = client.search_song_id( + {'name': 'DRAMA KING', 'artists': ['Melxdie'], 'duration': 152} + ) + assert sid == 'song-1' + + +@patch('downtify.navidrome.requests.get') +def test_sync_playlist_creates_playlist(mock_get): + ping_resp = MagicMock() + ping_resp.json.return_value = {'subsonic-response': {'status': 'ok'}} + ping_resp.raise_for_status = MagicMock() + + scan_resp = MagicMock() + scan_resp.json.return_value = { + 'subsonic-response': {'status': 'ok', 'scanStatus': {'scanning': False}} + } + scan_resp.raise_for_status = MagicMock() + + search_resp = MagicMock() + search_resp.json.return_value = { + 'subsonic-response': { + 'status': 'ok', + 'searchResult3': { + 'song': [ + { + 'id': 'abc', + 'title': 'Track', + 'artist': 'Artist', + 'duration': 200, + 'path': 'Artist/Track.mp3', + } + ] + }, + } + } + search_resp.raise_for_status = MagicMock() + + playlists_resp = MagicMock() + playlists_resp.json.return_value = { + 'subsonic-response': {'status': 'ok', 'playlists': {}} + } + playlists_resp.raise_for_status = MagicMock() + + create_resp = MagicMock() + create_resp.json.return_value = { + 'subsonic-response': { + 'status': 'ok', + 'playlist': {'id': 'pl-1'}, + } + } + create_resp.raise_for_status = MagicMock() + + update_resp = MagicMock() + update_resp.json.return_value = {'subsonic-response': {'status': 'ok'}} + update_resp.raise_for_status = MagicMock() + + start_scan_resp = MagicMock() + start_scan_resp.json.return_value = {'subsonic-response': {'status': 'ok'}} + start_scan_resp.raise_for_status = MagicMock() + + mock_get.side_effect = [ + ping_resp, + start_scan_resp, + scan_resp, + search_resp, + playlists_resp, + create_resp, + update_resp, + ] + + settings = { + 'navidrome': { + 'enabled': True, + 'url': 'https://navidrome.test', + 'username': 'user', + 'password': 'pass', + 'scan_after_download': True, + 'scan_wait_seconds': 10, + 'scan_poll_seconds': 1, + } + } + result = sync_playlist_to_navidrome( + 'My Spotify List', + [ + { + 'name': 'Track', + 'artists': ['Artist'], + 'duration': 200, + 'filename': 'Artist/Track.mp3', + } + ], + settings, + ) + assert result is not None + assert result.playlist_id == 'pl-1' + assert result.matched == 1 + + +@patch('downtify.navidrome.requests.get') +def test_sync_playlist_updates_existing_by_id(mock_get): + """Existing playlists are replaced in place (createPlaylist + playlistId).""" + + ping_resp = MagicMock() + ping_resp.json.return_value = {'subsonic-response': {'status': 'ok'}} + ping_resp.raise_for_status = MagicMock() + + search_resp = MagicMock() + search_resp.json.return_value = { + 'subsonic-response': { + 'status': 'ok', + 'searchResult3': { + 'song': [ + { + 'id': 'abc', + 'title': 'Track', + 'artist': 'Artist', + 'duration': 200, + 'path': 'Artist/Track.mp3', + } + ] + }, + } + } + search_resp.raise_for_status = MagicMock() + + playlists_resp = MagicMock() + playlists_resp.json.return_value = { + 'subsonic-response': { + 'status': 'ok', + 'playlists': {'playlist': {'id': 'pl-existing', 'name': 'My List'}}, + } + } + playlists_resp.raise_for_status = MagicMock() + + replace_resp = MagicMock() + replace_resp.json.return_value = { + 'subsonic-response': { + 'status': 'ok', + 'playlist': {'id': 'pl-existing'}, + } + } + replace_resp.raise_for_status = MagicMock() + + update_resp = MagicMock() + update_resp.json.return_value = {'subsonic-response': {'status': 'ok'}} + update_resp.raise_for_status = MagicMock() + + mock_get.side_effect = [ + ping_resp, + search_resp, + playlists_resp, + replace_resp, + update_resp, + ] + + settings = { + 'navidrome': { + 'enabled': True, + 'url': 'https://navidrome.test', + 'username': 'user', + 'password': 'pass', + 'scan_after_download': False, + } + } + result = sync_playlist_to_navidrome( + 'My List', + [ + { + 'name': 'Track', + 'artists': ['Artist'], + 'duration': 200, + 'filename': 'Artist/Track.mp3', + } + ], + settings, + ) + assert result is not None + assert result.playlist_id == 'pl-existing' + all_urls = [call[0][0] for call in mock_get.call_args_list] + assert any('playlistId=pl-existing' in url for url in all_urls) + assert not any('deletePlaylist' in url for url in all_urls) diff --git a/tests/test_slskd_leave_in_place.py b/tests/test_slskd_leave_in_place.py new file mode 100644 index 0000000..162977e --- /dev/null +++ b/tests/test_slskd_leave_in_place.py @@ -0,0 +1,40 @@ +"""slskd leave-in-place avoids copying into download_dir.""" + +from __future__ import annotations + +from pathlib import Path +from unittest.mock import patch + +from downtify.library_paths import library_stored_path +from downtify.slskd_provider import _finalize_slskd_path + + +def test_finalize_slskd_path_leave_in_place_skips_copy(tmp_path): + download_dir = tmp_path / 'downloads' + slskd_dir = tmp_path / 'slskd' + download_dir.mkdir() + slskd_dir.mkdir() + src = slskd_dir / 'Artist - Track.mp3' + src.write_bytes(b'audio') + + with patch('downtify.slskd_provider.shutil.copy2') as copy_mock: + result = _finalize_slskd_path(src, download_dir, leave_in_place=True) + copy_mock.assert_not_called() + + assert result == src + rel = library_stored_path(src, download_dir, slskd_dir) + assert rel == 'slskd/Artist - Track.mp3' + + +def test_finalize_slskd_path_migrate_copies(tmp_path): + download_dir = tmp_path / 'downloads' + slskd_dir = tmp_path / 'slskd' + download_dir.mkdir() + slskd_dir.mkdir() + src = slskd_dir / 'Artist - Track.mp3' + src.write_bytes(b'audio') + + result = _finalize_slskd_path(src, download_dir, leave_in_place=False) + assert result.parent == download_dir + assert result.name == 'Artist - Track.mp3' + assert result.is_file() diff --git a/tests/test_slskd_responses.py b/tests/test_slskd_responses.py new file mode 100644 index 0000000..a0bac29 --- /dev/null +++ b/tests/test_slskd_responses.py @@ -0,0 +1,253 @@ +from typing import Any +from unittest.mock import MagicMock + +from downtify.slskd_provider import ( + _slskd_transfer_progress_pct, + SlskdClient, + _collect_matching_files, + _filter_slskd_responses, + _find_on_disk, + _flatten_slskd_responses, + _paths_match, + _slskd_search_queries, +) + + +def test_flatten_slskd_responses_attaches_username_to_files(): + rows = _flatten_slskd_responses( + [ + { + 'username': 'peer1', + 'files': [ + {'filename': 'Artist - Track.mp3', 'size': 1}, + ], + } + ] + ) + assert len(rows) == 1 + assert rows[0]['username'] == 'peer1' + assert rows[0]['filename'] == 'Artist - Track.mp3' + + +def test_slskd_search_queries_prefers_title_dash_artist(): + queries = _slskd_search_queries( + { + 'artists': ['4D4M'], + 'name': "YOU KNOW WHERE WE'RE GOING - Hardstyle Bass Bounce Edition", + 'album_name': "YOU KNOW WHERE WE'RE GOING", + } + ) + assert queries[0] == "YOU KNOW WHERE WE'RE GOING - 4D4M" + assert 'YOU KNOW WHERE WERE GOING' in queries + + +def test_collect_matching_files_skips_wrong_extension_and_keywords(): + song = { + 'artists': ['Melxdie'], + 'name': 'DRAMA KING', + 'album_name': 'FAILED ROCKSTAR', + 'duration': 152, + } + responses = [ + { + 'username': 'peer1', + 'fileCount': 2, + 'hasFreeUploadSlot': True, + 'files': [ + { + 'filename': '@@x\\Artist - DRAMA KING (live).mp3', + 'size': 1, + 'length': 152, + }, + { + 'filename': '@@x\\Melxdie - DRAMA KING.mp3', + 'size': 2, + 'length': 152, + 'bitRate': 320, + }, + ], + } + ] + matches = _collect_matching_files(song, responses) + assert len(matches) == 1 + assert 'DRAMA KING.mp3' in matches[0]['filename'] + + +def test_filter_slskd_responses_hides_no_free_slot_and_locked_files(): + song = { + 'artists': ['Melxdie'], + 'name': 'DRAMA KING', + 'album_name': 'FAILED ROCKSTAR', + 'duration': 152, + } + responses = [ + { + 'username': 'no_slot', + 'fileCount': 1, + 'hasFreeUploadSlot': False, + 'files': [ + { + 'filename': '@@x\\Melxdie - DRAMA KING.mp3', + 'size': 1, + 'length': 152, + }, + ], + }, + { + 'username': 'locked_peer', + 'fileCount': 1, + 'hasFreeUploadSlot': True, + 'lockedFiles': [ + {'filename': '@@x\\Melxdie - DRAMA KING.mp3'}, + ], + 'files': [ + { + 'filename': '@@x\\Melxdie - DRAMA KING.mp3', + 'size': 1, + 'length': 152, + 'isLocked': True, + }, + ], + }, + { + 'username': 'good_peer', + 'fileCount': 1, + 'hasFreeUploadSlot': True, + 'files': [ + { + 'filename': '@@x\\Melxdie - DRAMA KING.mp3', + 'size': 2, + 'length': 152, + 'bitRate': 320, + }, + ], + }, + ] + filtered = _filter_slskd_responses(responses) + assert [r['username'] for r in filtered] == ['locked_peer', 'good_peer'] + matches = _collect_matching_files(song, responses) + assert len(matches) == 1 + assert matches[0]['username'] == 'good_peer' + + +def test_start_search_requests_filtered_responses(): + client = SlskdClient( + {'base_url': 'https://slskd.example', 'api_key': 'key', 'timeout_seconds': 5} + ) + captured: dict[str, Any] = {} + + def fake_request(method, path, **kwargs): + captured['method'] = method + captured['path'] = path + captured['json'] = kwargs.get('json') + resp = MagicMock() + resp.content = b'{"id":"search-1"}' + resp.raise_for_status = lambda: None + resp.json = lambda: {'id': 'search-1'} + return resp + + client._request = fake_request # type: ignore[method-assign] + search_id = client.start_search('Artist - Track') + assert search_id == 'search-1' + assert captured['json']['filterResponses'] is True + assert captured['json']['minimumResponseFileCount'] == 1 + + +def test_paths_match_compares_basenames(): + assert _paths_match( + '@@music\\Artist - Track.mp3', + 'Artist - Track.mp3', + ) + assert not _paths_match('a.mp3', 'b.mp3') + + +def test_find_on_disk_searches_username_nested_layout(tmp_path): + root = tmp_path / 'downloads' + track = root / 'peer1' / 'My Share' / 'Artist - Track.mp3' + track.parent.mkdir(parents=True) + track.write_bytes(b'x' * 4096) + found = _find_on_disk( + [root], + '@@My Share\\Artist - Track.mp3', + username='peer1', + ) + assert found == track + + +def test_slskd_transfer_progress_uses_percent_complete(): + pct, msg = _slskd_transfer_progress_pct( + transfer={'percentComplete': 50.0, 'size': 1000}, + expected_size=1000, + ) + assert msg == 'Downloading' + assert 65.0 < pct < 67.0 + + +def test_slskd_transfer_progress_uses_bytes_transferred(): + pct, _msg = _slskd_transfer_progress_pct( + transfer={'bytesTransferred': 250, 'size': 1000}, + expected_size=1000, + ) + assert 52.0 < pct < 54.0 + + +def test_slskd_transfer_progress_falls_back_when_no_stats(): + pct, msg = _slskd_transfer_progress_pct(poll_attempt=3) + assert msg == 'Waiting for slskd' + assert 40.0 < pct < 45.0 + + +def test_find_transfer_matches_basename_not_full_path(): + client = SlskdClient( + {'base_url': 'https://slskd.example', 'api_key': 'key', 'timeout_seconds': 5} + ) + client.list_download_transfers = lambda: [ # type: ignore[method-assign] + { + 'username': 'peer1', + 'directories': [ + { + 'files': [ + { + 'filename': 'Artist - Track.mp3', + 'state': 'Completed, Succeeded', + 'bytesRemaining': 0, + } + ] + } + ], + } + ] + row = client.find_transfer('peer1', '@@music\\Artist - Track.mp3') + assert row is not None + assert row['state'] == 'Completed, Succeeded' + + +def test_enqueue_download_uses_username_endpoint(): + client = SlskdClient( + {'base_url': 'https://slskd.example', 'api_key': 'key', 'timeout_seconds': 5} + ) + captured: dict[str, Any] = {} + + def fake_request(method, path, **kwargs): + captured['method'] = method + captured['path'] = path + captured['json'] = kwargs.get('json') + resp = MagicMock() + resp.content = b'{}' + resp.raise_for_status = lambda: None + resp.json = lambda: {} + return resp + + client._request = fake_request # type: ignore[method-assign] + ok = client.enqueue_download( + { + 'username': 'peer1', + 'filename': 'music\\Artist - Track.mp3', + 'size': 1234, + } + ) + assert ok is True + assert captured['path'] == '/api/v0/transfers/downloads/peer1' + assert captured['json'] == [ + {'filename': 'music\\Artist - Track.mp3', 'size': 1234} + ] diff --git a/tests/test_slskd_timeout.py b/tests/test_slskd_timeout.py new file mode 100644 index 0000000..b44f4bc --- /dev/null +++ b/tests/test_slskd_timeout.py @@ -0,0 +1,72 @@ +"""slskd per-track timeout and provider fallback.""" + +from __future__ import annotations + +from pathlib import Path +from unittest.mock import MagicMock, patch + +from downtify.downloader import Downloader +from downtify.slskd_provider import _wait_for_slskd_file + + +def test_wait_for_slskd_file_queued_timeout_without_transfer(monkeypatch): + client = MagicMock() + client.find_transfer.return_value = None + + sleeps: list[float] = [] + + def fake_sleep(seconds: float) -> None: + sleeps.append(seconds) + + monkeypatch.setattr('downtify.slskd_provider.time.sleep', fake_sleep) + monkeypatch.setattr( + 'downtify.slskd_provider._find_on_disk_for_song', lambda *a, **k: None + ) + + settings = { + 'poll_interval_seconds': 1, + 'poll_max_attempts': 10, + 'queued_timeout_seconds': 2, + } + clock = {'t': 1000.0} + + def tick() -> float: + clock['t'] += 1.0 + return clock['t'] + + monkeypatch.setattr('downtify.slskd_provider.time.monotonic', tick) + + result = _wait_for_slskd_file( + client, + {'name': 'Song'}, + 'peer', + 'file.mp3', + settings, + [Path('/slskd')], + deadline=t0 + 600, + ) + assert result is None + assert client.find_transfer.called + + +def test_resolve_video_id_falls_back_after_slskd_timeout(monkeypatch, tmp_path): + d = Downloader( + tmp_path, + audio_format='mp3', + audio_providers=['slskd', 'youtube-music'], + slskd_settings={'enabled': True, 'queued_timeout_seconds': 1}, + ) + monkeypatch.setattr( + 'downtify.downloader.download_from_slskd', lambda *a, **k: None + ) + monkeypatch.setattr( + 'downtify.downloader.find_match', + lambda song: ('yt123', {'name': song.get('name')}), + ) + + video_id, match, provider, local = d._resolve_video_id( + {'name': 'Track', 'artists': ['Artist']} + ) + assert provider == 'youtube-music' + assert video_id == 'yt123' + assert local is None diff --git a/tests/test_spotify_embed.py b/tests/test_spotify_embed.py index f29060a..a3e08ee 100644 --- a/tests/test_spotify_embed.py +++ b/tests/test_spotify_embed.py @@ -14,6 +14,7 @@ _normalize_release_date_text, _track_dict, album_tracks_from_id, + enrich_track_from_spotify_if_sparse, ) # Aliases only — no real artist / track titles @@ -132,6 +133,65 @@ def test_track_dict_year_only_release_date_object(): assert td['year'] == '1994' +def test_track_dict_reads_track_number_from_embed(): + entity = { + 'id': 'tid', + 'uri': 'spotify:track:tid', + 'title': 'TestSong', + 'trackNumber': 4, + 'album': {'name': 'TestAlbum', 'trackCount': 12}, + 'artists': [{'name': _AL1}], + } + td = _track_dict(entity, track_id='tid') + assert td['track_number'] == 4 + assert td['album_track_total'] == 12 + + +@patch('downtify.spotify.track_from_id') +def test_enrich_track_from_spotify_if_sparse_fetches_missing_fields( + mock_track_from_id, +): + mock_track_from_id.return_value = { + 'song_id': 'a' * 22, + 'source': 'spotify', + 'year': '2016', + 'release_date': '2016-07-01', + 'track_number': 24, + 'album_track_total': 100, + 'cover_url': 'https://example.com/cover.jpg', + 'album_name': 'TestAlbum', + 'artists': [_AL1], + 'artist': _AL1, + } + sparse = { + 'song_id': 'a' * 22, + 'source': 'spotify', + 'name': 'TestSong', + 'artists': [_AL1], + 'cover_url': 'https://example.com/playlist.jpg', + } + out = enrich_track_from_spotify_if_sparse(sparse) + mock_track_from_id.assert_called_once_with('a' * 22) + assert out['year'] == '2016' + assert out['track_number'] == 24 + assert out['cover_url'] == 'https://example.com/cover.jpg' + + +@patch('downtify.spotify.track_from_id') +def test_enrich_track_from_spotify_if_sparse_skips_when_complete( + mock_track_from_id, +): + complete = { + 'song_id': 'b' * 22, + 'source': 'spotify', + 'year': '2020', + 'release_date': '2020-01-01', + 'track_number': 1, + } + assert enrich_track_from_spotify_if_sparse(complete) is complete + mock_track_from_id.assert_not_called() + + def test_normalize_month_precision_middle_string(): assert _normalize_release_date_text('2024-06') == '2024-06-01' diff --git a/tests/test_text_search_stub.py b/tests/test_text_search_stub.py new file mode 100644 index 0000000..44f16b8 --- /dev/null +++ b/tests/test_text_search_stub.py @@ -0,0 +1,15 @@ +from downtify.providers import _parse_text_search_query, song_stub_from_text_query + + +def test_parse_artist_dash_title(): + artists, title = _parse_text_search_query('Daft Punk - One More Time') + assert artists == ['Daft Punk'] + assert title == 'One More Time' + + +def test_song_stub_from_text_query(): + stub = song_stub_from_text_query('Daft Punk - One More Time') + assert stub is not None + assert stub['name'] == 'One More Time' + assert stub['artists'] == ['Daft Punk'] + assert stub['source'] == 'text_search' diff --git a/tests/test_track_index.py b/tests/test_track_index.py new file mode 100644 index 0000000..21217b9 --- /dev/null +++ b/tests/test_track_index.py @@ -0,0 +1,75 @@ +"""Global Spotify track deduplication index.""" + +from __future__ import annotations + +from downtify.downloader import Downloader +from downtify.track_index import ( + TrackIndex, + normalize_spotify_track_id, + resolve_existing_download, +) + +SPOTIFY_ID = '4uLU6hMCjMI75M1A2tKUQC' + + +def test_normalize_spotify_track_id_from_song_id(): + assert ( + normalize_spotify_track_id({'song_id': SPOTIFY_ID}) + == SPOTIFY_ID + ) + + +def test_normalize_spotify_track_id_from_uri(): + assert ( + normalize_spotify_track_id( + {'song_id': f'spotify:track:{SPOTIFY_ID}'} + ) + == SPOTIFY_ID + ) + + +def test_normalize_ignores_youtube_ids(): + assert normalize_spotify_track_id({'song_id': 'dQw4w9WgXcQ'}) is None + + +def test_resolve_existing_prefers_global_library(tmp_path): + download_dir = tmp_path / 'music' + download_dir.mkdir() + slskd_dir = tmp_path / 'slskd' + target = slskd_dir / 'Artist - Track.mp3' + slskd_dir.mkdir(parents=True) + target.write_bytes(b'x' * 100) + + from downtify.library_paths import library_stored_path + + stored = library_stored_path(target, download_dir, slskd_dir) + index = TrackIndex(tmp_path / 'library.db') + index.register(SPOTIFY_ID, stored) + + d = Downloader( + download_dir, + audio_format='mp3', + audio_providers=['youtube'], + slskd_settings={'source_dir': str(slskd_dir)}, + ) + song = { + 'song_id': SPOTIFY_ID, + 'name': 'Track', + 'artists': ['Artist'], + } + hit = resolve_existing_download( + d, + song, + subdir='Playlist B', + track_index=index, + ) + assert hit is not None + assert hit[1] == 'Already in library' + assert hit[0] == stored + + +def test_register_keeps_first_canonical_path(tmp_path): + index = TrackIndex(tmp_path / 'library.db') + index.register(SPOTIFY_ID, 'first/path.mp3') + index.register(SPOTIFY_ID, 'second/path.mp3') + assert index.lookup(SPOTIFY_ID) == 'first/path.mp3' From d2f29ab69e8fd61aa83226161a2c0c42fe9dafa3 Mon Sep 17 00:00:00 2001 From: dx616b Date: Thu, 28 May 2026 20:03:00 +0200 Subject: [PATCH 03/58] Document 2.7.7 setup: README, compose example, and dx616b image. Add slskd/Navidrome configuration guide, docker-compose.example.yml for dx616b/spoti-to-navidrome:2.7.7, and compose quick-start in the README. Co-authored-by: Cursor --- README.md | 221 ++++++++++++++++++++++--- docker-compose.example.yml | 28 ++++ docker-compose.yml | 8 +- docs/getting-started/docker-compose.md | 34 +++- 4 files changed, 262 insertions(+), 29 deletions(-) create mode 100644 docker-compose.example.yml diff --git a/README.md b/README.md index c45a9e0..9b8b26b 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ https://github.com/user-attachments/assets/9711efe8-a960-4e1a-8d55-e0d1c20208f7 Downtify is a **self-hosted web app** that downloads music from Spotify — without touching the Spotify API, without needing an account, and without any Premium subscription. Just drop a link and get a fully-tagged audio file. -It resolves track metadata directly from Spotify's public embed pages, finds the best audio match on YouTube Music, downloads it with `yt-dlp`, converts it with `ffmpeg`, and embeds album art + all metadata with `mutagen`. The entire pipeline runs inside a single Docker container. +It resolves track metadata from Spotify's public embed pages, then tries your configured **audio sources** (Soulseek via **slskd**, YouTube Music, or YouTube). Downloads are tagged with `mutagen`, indexed so playlists are not re-fetched, and can export **M3U** playlists or sync into **Navidrome**. The app runs in a single Docker container. --- @@ -48,25 +48,65 @@ It resolves track metadata directly from Spotify's public embed pages, finds the | 🐳 **One Docker command** | Up and running in under a minute | | 🏠 **Home server platforms** | Available on Umbrel, CasaOS and HomeDock | | 🎧 **Built-in player** | Play your downloaded music straight from the web UI — progress bar, shuffle, repeat, volume | +| 🌐 **slskd (Soulseek)** | Optional first provider via [slskd](https://github.com/slskd/slskd) — leave files in place, real download progress | +| 🎵 **Navidrome playlists** | Sync Spotify playlists into Navidrome after download (Subsonic API, same idea as Explo) | +| 📚 **Library browser** | Lists `/downloads` and `/slskd` with tags from embedded metadata (not just filenames) | +| 🔁 **Skip re-downloads** | Global Spotify track index remembers what you already have on disk | | 🌍 **Multi-language UI** | English (default), Spanish and Brazilian Portuguese — easy to add more | --- +## 📋 Recent changes (2.7.x) + +Summary of the slskd + Navidrome integration work: + +| Area | Change | +|------|--------| +| **slskd provider** | Search Soulseek, poll transfers, optional leave-in-place under `/slskd`, timeouts and YouTube fallback | +| **Provider order** | Settings UI to enable and order slskd / YouTube Music / YouTube | +| **Track index** | Spotify track ID → file path; skips re-downloads for playlists and monitor | +| **Library paths** | Resolves `slskd/…` entries to `/slskd` for M3U, player, and Navidrome matching | +| **M3U** | Absolute paths (`/downloads/…`, `/slskd/…`) for media servers | +| **Navidrome** | Scan → match → **update same playlist** (no duplicate playlists on each sync) | +| **Playlist monitor** | Regenerates M3U and can sync Navidrome after new tracks | +| **Player / library** | Tag-based metadata; plays slskd files via `/media/slskd/` | + +Configure everything under **Settings** (⚙️): Audio sources, slskd block, Playlists (M3U + Navidrome), and File organization. + +--- + ## 🚀 Quick Start +**Published image (this fork, 2.7.7):** `dx616b/spoti-to-navidrome:2.7.7` (also tagged `:latest` on Docker Hub). + ```bash -docker run -d -p 8000:8000 --name downtify \ - -v /path/to/downloads:/downloads \ +docker run -d -p 8000:30321 --name downtify \ + -e DOWNTIFY_PORT=30321 \ + -v /path/to/music/downloads:/downloads \ + -v /path/to/music/slskd:/slskd \ -v downtify_data:/data \ - ghcr.io/henriquesebastiao/downtify + dx616b/spoti-to-navidrome:2.7.7 ``` Open [http://localhost:8000](http://localhost:8000), paste a Spotify link, and hit download. -> Change `/path/to/downloads` to wherever you want your music saved. +> Change host paths to your library folders. Omit the `/slskd` mount if you only use YouTube. ### Docker Compose +Copy the example file and start: + +```bash +cp docker-compose.example.yml docker-compose.yml +# Edit ./docker-compose.yml — set your host paths for downloads and slskd +docker compose pull +docker compose up -d +``` + +See [`docker-compose.example.yml`](docker-compose.example.yml) for a ready-made stack using `dx616b/spoti-to-navidrome:2.7.7`. + +Minimal setup (YouTube / YouTube Music only): + ```yaml services: downtify: @@ -83,6 +123,31 @@ volumes: downtify_data: ``` +With **slskd** and a separate Soulseek library folder (recommended for Navidrome + leave-in-place): + +```yaml +services: + downtify: + container_name: downtify + image: dx616b/spoti-to-navidrome:2.7.7 + ports: + - '8000:30321' + environment: + - DOWNTIFY_PORT=30321 + volumes: + - /path/to/music/downloads:/downloads + - /path/to/music/slskd:/slskd # same folder slskd writes to + - downtify_data:/data + restart: unless-stopped + +volumes: + downtify_data: +``` + +Upstream image (no slskd fork): `ghcr.io/henriquesebastiao/downtify:latest`. + +> **Paths inside the container** are what you configure in the UI (`/downloads`, `/slskd`). Map host folders to those mount points. Navidrome must scan the **same** host folders. + Need a custom port? Use the `DOWNTIFY_PORT` environment variable: ```yaml @@ -106,16 +171,17 @@ environment: ## ⚙️ How It Works -Downtify's download pipeline has three stages: +Downtify resolves **metadata** from Spotify embed pages, then tries **audio providers** in the order you set in Settings until one succeeds: ``` -Spotify embed page → YouTube Music search → yt-dlp + ffmpeg + mutagen - (metadata) (audio match) (download & tag) +Spotify embed → Provider chain (slskd → YouTube Music → …) → Tag & register + (metadata) (find audio on disk or download) (mutagen + index) ``` -1. **Metadata** — Track, album and playlist links are resolved by scraping the public `open.spotify.com/embed` pages. No Spotify credentials of any kind are required. -2. **Audio match** — [`ytmusicapi`](https://ytmusicapi.readthedocs.io/) searches YouTube Music for the track and picks the best result by comparing audio duration. Free-text searches skip the Spotify step entirely. -3. **Download & tag** — [`yt-dlp`](https://github.com/yt-dlp/yt-dlp) downloads the audio and `ffmpeg` converts it to your chosen format. [`mutagen`](https://mutagen.readthedocs.io/) embeds title, artist, album, year and cover art into the file. +1. **Metadata** — Track, album and playlist links use the public `open.spotify.com/embed` pages. No Spotify API key or Premium account is required. Sparse playlist embeds are enriched from per-track Spotify data when needed. +2. **Audio providers** — You choose the order (see [Audio sources](#-audio-sources-slskd--youtube)). **slskd** searches Soulseek and waits for a transfer into your library folder. **YouTube Music** / **YouTube** use [`ytmusicapi`](https://ytmusicapi.readthedocs.io/) and [`yt-dlp`](https://github.com/yt-dlp/yt-dlp) with an optional yt-dlp search fallback when YT Music finds nothing. +3. **Tag & dedupe** — [`mutagen`](https://mutagen.readthedocs.io/) embeds title, artist, album, year and cover art. A local **track index** (`/data`) maps Spotify track IDs to on-disk paths so playlists and the monitor do not re-download songs you already have. +4. **Playlists (optional)** — **M3U** files for media servers and/or a **Navidrome** playlist sync via the Subsonic API (scan library → match tracks → update playlist in place). --- @@ -130,7 +196,9 @@ The **Playlist Monitor** lets Downtify watch your favorite Spotify playlists and 3. Choose how often Downtify should check for new tracks (every 15 min up to once a day) 4. Click **Watch** -From that point on, whenever a new song appears in the playlist on Spotify, Downtify will detect and download it on the next scheduled check. Tracks that were already in the playlist when you added it are skipped — only *new* additions are downloaded. +From that point on, whenever a new song appears in the playlist on Spotify, Downtify will detect and download it on the next scheduled check. Tracks that were already in the playlist when you added it are skipped — only *new* additions are downloaded. Songs already on disk (including under `/slskd` from an earlier slskd download) are linked via the track index instead of being fetched again. + +After a successful sweep, the monitor can **regenerate the M3U** and **sync Navidrome** (when those options are enabled in Settings), same as a manual playlist download. You can pause, resume, force an immediate check, or stop monitoring any playlist at any time from the same page. @@ -138,14 +206,106 @@ You can pause, resume, force an immediate check, or stop monitoring any playlist ## 🎛️ Download Settings -Access the settings panel (⚙️ icon) to configure: +Open the settings panel (⚙️ icon). Settings are stored under `/data` in the container and survive restarts. -| Setting | Options | -|---------|---------| +| Setting | Options / notes | +|---------|-----------------| +| **Audio sources** | Ordered list: **slskd**, **YouTube Music**, **YouTube** (see below) | | **Output format** | MP3 · FLAC · M4A · OGG · OPUS | | **Bitrate** | 128 · 192 · 256 · 320 kbps (ignored for FLAC) | -| **Audio provider** | YouTube Music | | **Organize by artist** | Off (default) · On | +| **Generate M3U** | On by default for playlist downloads / monitor | +| **Sync Navidrome** | Create or update a Navidrome playlist after Spotify playlist jobs | +| **Parallel downloads** | How many tracks download at once (default 3) | +| **Lyrics** | Optional LRCLIB / Genius / etc. | + +--- + +## 🔊 Audio sources (slskd + YouTube) + +In **Settings → Audio sources**, pick one or more providers and drag them into priority order. Downtify tries each provider until audio is found. + +| Provider | Role | +|----------|------| +| **slskd** | Search Soulseek via your [slskd](https://github.com/slskd/slskd) instance; files land in `source_dir` (usually `/slskd`). Best quality when peers have the track. | +| **YouTube Music** | Default fallback; uses YT Music search + yt-dlp download into `/downloads` (or playlist subfolder). | +| **YouTube** | Plain YouTube search via yt-dlp (also used as a last-resort search if YT Music fails). | + +**Recommended order for a Soulseek + Navidrome setup:** `slskd` → `YouTube Music` (and optionally `YouTube`). + +If **slskd** is enabled but nothing is queued within **queued timeout** (default 180s), or the transfer exceeds **download timeout** (default 600s), Downtify automatically tries the next provider. + +--- + +## 🌐 slskd (Soulseek via slskd) + +### Requirements + +- A running **slskd** instance with API access (base URL + API key from slskd’s web UI). +- The same music folder visible to Downtify and (if used) Navidrome. + +### Settings → slskd + +| Field | Typical value | Meaning | +|-------|----------------|---------| +| **Enable slskd** | On | Turns the provider on (must also appear in Audio sources). | +| **Base URL** | `http://slskd:5030` | slskd API URL **as Downtify sees it** (Docker service name or host:port). | +| **API key** | *(from slskd)* | Required when enabled. | +| **slskd folder path in Downtify** | `/slskd` | Where finished Soulseek files appear **inside the Downtify container** — not the host path. | +| **Leave slskd files in place** | On (recommended) | Do not copy into `/downloads`; tag in place and register `slskd/…` paths in the library index. | +| **Download timeout** | `600` | Max seconds to wait for an slskd transfer. | +| **Queued timeout** | `180` | Max seconds stuck in slskd’s queue before falling back to YouTube. | + +### Docker volumes example + +```text +Host Downtify container +/path/to/music/downloads → /downloads +/path/to/music/slskd → /slskd ← slskd must write here too +``` + +If slskd runs in another container, mount the **same host directory** on both containers, e.g. `- /mnt/music/slskd:/slskd` on each. + +### Behaviour + +- Downtify searches slskd, enqueues a download, and polls until the file exists under `source_dir` (or times out). +- With **leave in place**, the stored library path looks like `slskd/Album Name/track.mp3` and the built-in player serves it from `/media/slskd/…`. +- Without leave in place, files are copied into `/downloads` like a normal YouTube download. + +--- + +## 🎵 Navidrome playlist sync + +Downtify can mirror a downloaded Spotify playlist into **Navidrome** using the Subsonic API (same approach as tools like Explo). + +### What it does + +1. After playlist tracks finish downloading, Downtify calls Navidrome **`startScan`** (incremental library scan). +2. Waits for the scan to finish (configurable; scales with playlist size). +3. Searches the Navidrome library for each track (title, artist, tags from files, and path). +4. **Updates the existing Navidrome playlist** with the same name when possible (no duplicate playlists). Old duplicate playlists from earlier versions can be deleted manually once. + +### Settings → Navidrome + +| Field | Notes | +|-------|--------| +| **Enable Navidrome sync** | Master toggle (also enable **Create playlist in Navidrome** under Playlists). | +| **URL** | e.g. `https://music.example.com` | +| **Username / password** | Navidrome user that should **own** the playlists. | +| **Admin username / password** | Optional — only needed if your main user is **not** an admin. If your account is already admin, leave admin fields **empty**; one login is enough. | +| **Public playlist** | Whether the Navidrome playlist is public. | + +Scan timing uses defaults in settings storage: **scan after download** (on), wait up to **120s** base (+ extra time for large playlists), **5s** poll interval, and a **15s** retry pass for tracks that were not indexed yet. + +### Navidrome server setup + +1. In Navidrome **Settings → Music Library**, include every folder Downtify writes to, e.g. both `/downloads` and `/slskd` (or the host paths you mapped to those mounts). +2. Use the **same** Navidrome user in Downtify that should own synced playlists. +3. After upgrading, run one full playlist download or a monitor sweep to refresh the playlist. + +If sync reports `matched=46/55`, the missing tracks are usually **not scanned yet** in Navidrome, live outside configured music folders, or could not be matched by search — check Downtify logs for `not in library index`. + +--- ### 📁 Organize by artist @@ -164,7 +324,7 @@ This applies to **all** downloads — single tracks, albums and playlists alike. When the setting is **off** (default), the existing behaviour is preserved: single tracks go directly into the root of the downloads folder, and playlist tracks go into a per-playlist subfolder. -> **M3U files and playlists** — If you download a Spotify playlist with both *Organize by artist* and *Generate M3U* enabled, the M3U file is placed in `/Playlists/.m3u` (rather than inside the playlist subfolder) because the tracks are now spread across multiple artist folders. The relative paths inside the M3U still resolve correctly regardless of where you mount the library. +> **M3U files and playlists** — If you download a Spotify playlist with both *Organize by artist* and *Generate M3U* enabled, the M3U file is placed in `/Playlists/.m3u` (rather than inside the playlist subfolder) because the tracks are now spread across multiple artist folders. --- @@ -182,17 +342,32 @@ When the setting is **off** (default), the existing behaviour is preserved: sing ## 📃 M3U playlist export -Downtify writes a standard `EXTM3U` file alongside your audio whenever a playlist gets downloaded — both for **manual** playlist paste-downloads and for **Playlist Monitor** sweeps that fetched at least one new track: +Downtify writes a standard `EXTM3U` file whenever a playlist download (or monitor sweep) keeps at least one track on disk. +**Default location** (organize by artist **off**): + +```text +//.m3u ``` + +**With organize by artist on**: + +```text /Playlists/.m3u ``` -The behaviour is governed by a single toggle in **Settings → Playlists → Generate M3U file for playlists** (on by default). Flip it off if you'd rather not produce M3Us at all; the rest of the download flow is unchanged. +Toggle: **Settings → Playlists → Generate M3U file for playlists** (on by default). + +Tracks that are not on disk are skipped and logged. The file is rebuilt on each run so order matches the Spotify playlist. -Tracks that failed to download or had no YouTube Music match are skipped (and logged). The M3U is regenerated fresh on every run, so re-pasting the same playlist URL — or letting the Monitor add new tracks over time — always produces a complete, in-order file. +**Paths inside the M3U** are the **absolute paths where Downtify found each file** on disk, for example: + +```text +/downloads/Robot Heart/Artist - Title.mp3 +/slskd/Some Album/01 - Track.mp3 +``` -Track paths inside the M3U are written **relative to the M3U file itself**, so the same file works whether it's read from inside Downtify (where the library is mounted at `/downloads`) or from another consumer that mounts the same library at a different root — e.g. Jellyfin under `/nas/music`. Just point your media server at the same library mount and the playlist will appear as a single unit instead of a pile of loose files. +Use the same volume mounts in Jellyfin, Navidrome, or other tools (`/downloads` and `/slskd` in the container map to your host library). Entries under `slskd/…` resolve to `/slskd/…` inside the container even when the M3U file lives under `/downloads`. --- @@ -203,7 +378,7 @@ Track paths inside the M3U are written **relative to the M3U file itself**, so t ## 🎧 Built-in Player -Downtify ships with a clean web player so you don't need a separate app to listen to what you've downloaded. Open the headphones icon (🎧) in the navigation bar — or hit the play button next to any file in the **Library** — and Downtify will load every audio file from your downloads folder into a queue. +Downtify ships with a clean web player so you don't need a separate app to listen to what you've downloaded. Open the headphones icon (🎧) in the navigation bar — or hit the play button next to any file in the **Library** — and Downtify will load audio from `/downloads` and `/slskd` into a queue. **What's included:** @@ -214,7 +389,7 @@ Downtify ships with a clean web player so you don't need a separate app to liste - Volume slider with mute toggle (volume is remembered between sessions) - Side queue listing every track in your library, each one with its own thumbnail and the currently playing one highlighted -The player parses `Artist - Title.ext` filenames so the now-playing card shows artist and title nicely, and pulls the cover art directly from the audio file's embedded tags (the same artwork Downtify wrote at download time). Playback uses your browser's native HTML5 audio element — no extra dependencies, no extra processes. +The **Library** and **Player** read **embedded tags** (title, artist, album) via mutagen, with filename parsing as a fallback. slskd tracks under `slskd/…` are played through `/media/slskd/…` URLs. Cover art comes from tags when present. Playback uses the browser’s HTML5 audio element — no extra dependencies. --- diff --git a/docker-compose.example.yml b/docker-compose.example.yml new file mode 100644 index 0000000..b4996a2 --- /dev/null +++ b/docker-compose.example.yml @@ -0,0 +1,28 @@ +# Production-style Compose for Downtify 2.7.x (slskd + Navidrome-friendly). +# +# Usage: +# cp docker-compose.example.yml docker-compose.yml +# # Edit host paths below, then: +# docker compose pull +# docker compose up -d +# +# slskd is not included here — run your existing slskd stack and mount the +# same host folder to /slskd in Downtify. In Settings → slskd set base URL +# (e.g. http://slskd:5030 on a shared Docker network) and source_dir /slskd. + +services: + downtify: + container_name: downtify + image: dx616b/spoti-to-navidrome:2.7.7 + restart: unless-stopped + ports: + - '8000:30321' + environment: + - DOWNTIFY_PORT=30321 + volumes: + - /path/to/music/downloads:/downloads + - /path/to/music/slskd:/slskd + - downtify_data:/data + +volumes: + downtify_data: diff --git a/docker-compose.yml b/docker-compose.yml index 97b104e..e1b3954 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,3 +1,5 @@ +# Local development compose (build from source). +# For production with the published image, use: cp docker-compose.example.yml docker-compose.yml services: downtify: container_name: downtify @@ -7,10 +9,10 @@ services: ports: - '8000:30321' volumes: - # Music library. If slskd is another container, mount the SAME host folder - # there (e.g. ./docker/downloads:/downloads) and set Settings → slskd path - # to /downloads (path inside this container, not the host path). + # If slskd runs elsewhere, mount the SAME host folder as slskd at /slskd + # and set Settings → slskd → folder path to /slskd. - ./docker/downloads:/downloads + # - ./docker/slskd:/slskd - ./docker/data:/data - ./frontend/dist:/downtify/frontend/dist:ro environment: diff --git a/docs/getting-started/docker-compose.md b/docs/getting-started/docker-compose.md index 37bf662..55e19f6 100644 --- a/docs/getting-started/docker-compose.md +++ b/docs/getting-started/docker-compose.md @@ -8,15 +8,28 @@ Docker Compose is the recommended way to run Downtify for persistent home-server ## Minimal setup -Create a `docker-compose.yml` file: +Copy the repository example (recommended for 2.7.x + slskd): + +```bash +cp docker-compose.example.yml docker-compose.yml +# Edit host paths in docker-compose.yml +docker compose pull +docker compose up -d +``` + +[`docker-compose.example.yml`](../../docker-compose.example.yml) uses **`dx616b/spoti-to-navidrome:2.7.7`**, maps `/downloads` and `/slskd`, and listens on port `30321` inside the container (`8000:30321` on the host). + +Or create a minimal `docker-compose.yml` manually: ```yaml services: downtify: container_name: downtify - image: ghcr.io/henriquesebastiao/downtify:latest + image: dx616b/spoti-to-navidrome:2.7.7 ports: - - '8000:8000' + - '8000:30321' + environment: + - DOWNTIFY_PORT=30321 volumes: - ./downloads:/downloads - downtify_data:/data @@ -34,6 +47,21 @@ docker compose up -d Open **[http://localhost:8000](http://localhost:8000)**. +## With slskd (Soulseek) + +Add a second volume so Downtify and slskd share the same Soulseek download folder: + +```yaml + volumes: + - ./downloads:/downloads + - ./slskd:/slskd + - downtify_data:/data +``` + +In Downtify **Settings → slskd**: enable slskd, set **Base URL** to your slskd API (e.g. `http://slskd:5030` on a shared Docker network), **API key**, and **folder path** `/slskd`. Mount that same host directory on your slskd container. + +Upstream image without this fork: `ghcr.io/henriquesebastiao/downtify:latest`. + ## Custom port If port 8000 is already in use, map a different host port and set the `DOWNTIFY_PORT` environment variable so the container listens on the same port internally: From 20b68e9d87d7a9a377ab11581b3092a33fa39eb8 Mon Sep 17 00:00:00 2001 From: dx616b Date: Thu, 28 May 2026 20:10:27 +0200 Subject: [PATCH 04/58] Improve download queue UX with filters, retry, and playlist pruning. Add status filters and per-track or bulk retry on the queue page, clear completed jobs, and drop finished tracks when a new Spotify playlist starts while keeping failures and in-progress work. Co-authored-by: Cursor --- downtify/api.py | 13 + frontend/src/components/DownloadList.vue | 395 ++++++++++++++++++----- frontend/src/i18n/locales/en.js | 18 +- frontend/src/i18n/locales/es.js | 18 +- frontend/src/i18n/locales/pt-BR.js | 18 +- frontend/src/model/api.js | 5 + frontend/src/model/download.js | 44 ++- tests/test_api_queue.py | 22 ++ 8 files changed, 450 insertions(+), 83 deletions(-) create mode 100644 tests/test_api_queue.py diff --git a/downtify/api.py b/downtify/api.py index 7b618e7..441e9b6 100644 --- a/downtify/api.py +++ b/downtify/api.py @@ -791,6 +791,19 @@ def clear_queue() -> dict: return {'cleared': True} +@router.delete('/api/queue/completed') +def clear_completed_queue() -> dict: + """Remove finished jobs so a new playlist queue is easier to read.""" + removed = [ + song_id + for song_id, job in list(state.download_jobs.items()) + if job.get('status') == 'done' + ] + for song_id in removed: + del state.download_jobs[song_id] + return {'removed': len(removed)} + + @router.delete('/api/queue/item') def remove_queue_item(song_id: str = Query(...)) -> dict: if song_id in state.download_jobs: diff --git a/frontend/src/components/DownloadList.vue b/frontend/src/components/DownloadList.vue index 7965e32..675943c 100644 --- a/frontend/src/components/DownloadList.vue +++ b/frontend/src/components/DownloadList.vue @@ -1,7 +1,7 @@ - + +
    diff --git a/frontend/package.json b/frontend/package.json index bebd620..78c4671 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "downtify-web", - "version": "2.7.7", + "version": "2.7.8", "scripts": { "dev": "vite", "build": "vite build", diff --git a/pyproject.toml b/pyproject.toml index fc37057..796dcc8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "downtify" -version = "2.7.7" +version = "2.7.8" description = "Download your Spotify playlists and songs along with album art and metadata in a self-hosted way via Docker" readme = "README.md" requires-python = ">=3.10,<3.14" From d2b1db38256d9705596f955596b67294a4a9d341 Mon Sep 17 00:00:00 2001 From: dx616b Date: Thu, 28 May 2026 20:16:22 +0200 Subject: [PATCH 06/58] Fix download-to-device filenames with decoded save names (2.7.9). Use downloadSaveName() so queue and library saves use real filenames instead of URL-encoded path segments from /media/ URLs. Co-authored-by: Cursor --- Dockerfile | 4 +-- README.md | 8 ++--- docker-compose.example.yml | 2 +- docs/getting-started/docker-compose.md | 4 +-- downtify/__init__.py | 2 +- .../{index-wrKfckLa.js => index-C4Vzmjqg.js} | 16 ++++----- frontend/dist/index.html | 2 +- frontend/package.json | 2 +- frontend/src/components/DownloadList.vue | 3 +- frontend/src/model/api.js | 33 +++++++++++++++++++ frontend/src/views/Downloads.vue | 2 +- pyproject.toml | 2 +- 12 files changed, 57 insertions(+), 23 deletions(-) rename frontend/dist/assets/{index-wrKfckLa.js => index-C4Vzmjqg.js} (71%) diff --git a/Dockerfile b/Dockerfile index dcee14c..d8eb9dc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,12 +10,12 @@ RUN pip install --upgrade pip && \ FROM python:3.13-alpine LABEL maintainer="Henrique Sebastião " -LABEL version="2.7.8" +LABEL version="2.7.9" LABEL description="Self-hosted Spotify downloader" LABEL org.opencontainers.image.title="Downtify" \ org.opencontainers.image.description="Download your Spotify playlists and songs along with album art and metadata in a self-hosted way via Docker." \ - org.opencontainers.image.version="2.7.8" \ + org.opencontainers.image.version="2.7.9" \ org.opencontainers.image.authors="Henrique Sebastião " \ org.opencontainers.image.url="https://github.com/henriquesebastiao/downtify" \ org.opencontainers.image.source="https://github.com/henriquesebastiao/downtify" \ diff --git a/README.md b/README.md index 9fc440c..e431b33 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ Configure everything under **Settings** (⚙️): Audio sources, slskd block, Pl ## 🚀 Quick Start -**Published image (this fork, 2.7.8):** `dx616b/spoti-to-navidrome:2.7.8` (also tagged `:latest` on Docker Hub). +**Published image (this fork, 2.7.9):** `dx616b/spoti-to-navidrome:2.7.9` (also tagged `:latest` on Docker Hub). ```bash docker run -d -p 8000:30321 --name downtify \ @@ -85,7 +85,7 @@ docker run -d -p 8000:30321 --name downtify \ -v /path/to/music/downloads:/downloads \ -v /path/to/music/slskd:/slskd \ -v downtify_data:/data \ - dx616b/spoti-to-navidrome:2.7.8 + dx616b/spoti-to-navidrome:2.7.9 ``` Open [http://localhost:8000](http://localhost:8000), paste a Spotify link, and hit download. @@ -103,7 +103,7 @@ docker compose pull docker compose up -d ``` -See [`docker-compose.example.yml`](docker-compose.example.yml) for a ready-made stack using `dx616b/spoti-to-navidrome:2.7.8`. +See [`docker-compose.example.yml`](docker-compose.example.yml) for a ready-made stack using `dx616b/spoti-to-navidrome:2.7.9`. Minimal setup (YouTube / YouTube Music only): @@ -129,7 +129,7 @@ With **slskd** and a separate Soulseek library folder (recommended for Navidrome services: downtify: container_name: downtify - image: dx616b/spoti-to-navidrome:2.7.8 + image: dx616b/spoti-to-navidrome:2.7.9 ports: - '8000:30321' environment: diff --git a/docker-compose.example.yml b/docker-compose.example.yml index 5f4d03d..a75535b 100644 --- a/docker-compose.example.yml +++ b/docker-compose.example.yml @@ -13,7 +13,7 @@ services: downtify: container_name: downtify - image: dx616b/spoti-to-navidrome:2.7.8 + image: dx616b/spoti-to-navidrome:2.7.9 restart: unless-stopped ports: - '8000:30321' diff --git a/docs/getting-started/docker-compose.md b/docs/getting-started/docker-compose.md index 4b6baa1..fa84adc 100644 --- a/docs/getting-started/docker-compose.md +++ b/docs/getting-started/docker-compose.md @@ -17,7 +17,7 @@ docker compose pull docker compose up -d ``` -[`docker-compose.example.yml`](../../docker-compose.example.yml) uses **`dx616b/spoti-to-navidrome:2.7.8`**, maps `/downloads` and `/slskd`, and listens on port `30321` inside the container (`8000:30321` on the host). +[`docker-compose.example.yml`](../../docker-compose.example.yml) uses **`dx616b/spoti-to-navidrome:2.7.9`**, maps `/downloads` and `/slskd`, and listens on port `30321` inside the container (`8000:30321` on the host). Or create a minimal `docker-compose.yml` manually: @@ -25,7 +25,7 @@ Or create a minimal `docker-compose.yml` manually: services: downtify: container_name: downtify - image: dx616b/spoti-to-navidrome:2.7.8 + image: dx616b/spoti-to-navidrome:2.7.9 ports: - '8000:30321' environment: diff --git a/downtify/__init__.py b/downtify/__init__.py index 1317948..cc59141 100644 --- a/downtify/__init__.py +++ b/downtify/__init__.py @@ -1 +1 @@ -__version__ = '2.7.8' +__version__ = '2.7.9' diff --git a/frontend/dist/assets/index-wrKfckLa.js b/frontend/dist/assets/index-C4Vzmjqg.js similarity index 71% rename from frontend/dist/assets/index-wrKfckLa.js rename to frontend/dist/assets/index-C4Vzmjqg.js index c924b25..90d8ee7 100644 --- a/frontend/dist/assets/index-wrKfckLa.js +++ b/frontend/dist/assets/index-C4Vzmjqg.js @@ -2,32 +2,32 @@ * @vue/shared v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/function jr(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const _e={},Pn=[],Lt=()=>{},ha=()=>!1,bo=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),qr=e=>e.startsWith("onUpdate:"),$e=Object.assign,Vr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Nu=Object.prototype.hasOwnProperty,me=(e,t)=>Nu.call(e,t),X=Array.isArray,On=e=>Es(e)==="[object Map]",Vn=e=>Es(e)==="[object Set]",Ti=e=>Es(e)==="[object Date]",oe=e=>typeof e=="function",Te=e=>typeof e=="string",Mt=e=>typeof e=="symbol",ge=e=>e!==null&&typeof e=="object",ma=e=>(ge(e)||oe(e))&&oe(e.then)&&oe(e.catch),ga=Object.prototype.toString,Es=e=>ga.call(e),Iu=e=>Es(e).slice(8,-1),ya=e=>Es(e)==="[object Object]",Wr=e=>Te(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,rs=jr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),_o=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$u=/-\w/g,mt=_o(e=>e.replace($u,t=>t.slice(1).toUpperCase())),Lu=/\B([A-Z])/g,fn=_o(e=>e.replace(Lu,"-$1").toLowerCase()),xo=_o(e=>e.charAt(0).toUpperCase()+e.slice(1)),Wo=_o(e=>e?`on${xo(e)}`:""),an=(e,t)=>!Object.is(e,t),zs=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},wo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Fu=e=>{const t=Te(e)?Number(e):NaN;return isNaN(t)?e:t};let Pi;const ko=()=>Pi||(Pi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function $n(e){if(X(e)){const t={};for(let n=0;n{if(n){const s=n.split(Uu);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ae(e){let t="";if(Te(e))t=e;else if(X(e))for(let n=0;nWn(n,t))}const _a=e=>!!(e&&e.__v_isRef===!0),w=e=>Te(e)?e:e==null?"":X(e)||ge(e)&&(e.toString===ga||!oe(e.toString))?_a(e)?w(e.value):JSON.stringify(e,xa,2):String(e),xa=(e,t)=>_a(t)?xa(e,t.value):On(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o],r)=>(n[Ko(s,r)+" =>"]=o,n),{})}:Vn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Ko(n))}:Mt(t)?Ko(t):ge(t)&&!X(t)&&!ya(t)?String(t):t,Ko=(e,t="")=>{var n;return Mt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +**/function jr(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const xe={},Pn=[],Lt=()=>{},ha=()=>!1,bo=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),qr=e=>e.startsWith("onUpdate:"),$e=Object.assign,Vr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Nu=Object.prototype.hasOwnProperty,me=(e,t)=>Nu.call(e,t),X=Array.isArray,On=e=>Es(e)==="[object Map]",Vn=e=>Es(e)==="[object Set]",Ti=e=>Es(e)==="[object Date]",oe=e=>typeof e=="function",Te=e=>typeof e=="string",Mt=e=>typeof e=="symbol",ge=e=>e!==null&&typeof e=="object",ma=e=>(ge(e)||oe(e))&&oe(e.then)&&oe(e.catch),ga=Object.prototype.toString,Es=e=>ga.call(e),Iu=e=>Es(e).slice(8,-1),ya=e=>Es(e)==="[object Object]",Wr=e=>Te(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,rs=jr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),_o=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$u=/-\w/g,mt=_o(e=>e.replace($u,t=>t.slice(1).toUpperCase())),Lu=/\B([A-Z])/g,fn=_o(e=>e.replace(Lu,"-$1").toLowerCase()),xo=_o(e=>e.charAt(0).toUpperCase()+e.slice(1)),Wo=_o(e=>e?`on${xo(e)}`:""),an=(e,t)=>!Object.is(e,t),zs=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},wo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Fu=e=>{const t=Te(e)?Number(e):NaN;return isNaN(t)?e:t};let Pi;const ko=()=>Pi||(Pi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function $n(e){if(X(e)){const t={};for(let n=0;n{if(n){const s=n.split(Uu);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ae(e){let t="";if(Te(e))t=e;else if(X(e))for(let n=0;nWn(n,t))}const _a=e=>!!(e&&e.__v_isRef===!0),w=e=>Te(e)?e:e==null?"":X(e)||ge(e)&&(e.toString===ga||!oe(e.toString))?_a(e)?w(e.value):JSON.stringify(e,xa,2):String(e),xa=(e,t)=>_a(t)?xa(e,t.value):On(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o],r)=>(n[Ko(s,r)+" =>"]=o,n),{})}:Vn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Ko(n))}:Mt(t)?Ko(t):ge(t)&&!X(t)&&!ya(t)?String(t):t,Ko=(e,t="")=>{var n;return Mt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** * @vue/reactivity v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let et;class Wu{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=et,!t&&et&&(this.index=(et.scopes||(et.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(et=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(ls){let t=ls;for(ls=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;is;){let t=is;for(is=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Ea(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Aa(e){let t,n=e.depsTail,s=n;for(;s;){const o=s.prevDep;s.version===-1?(s===n&&(n=o),Gr(s),zu(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=o}e.deps=t,e.depsTail=n}function mr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ra(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ra(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===ps)||(e.globalVersion=ps,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!mr(e))))return;e.flags|=2;const t=e.dep,n=ke,s=vt;ke=e,vt=!0;try{Ea(e);const o=e.fn(e._value);(t.version===0||an(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{ke=n,vt=s,Aa(e),e.flags&=-3}}function Gr(e,t=!1){const{dep:n,prevSub:s,nextSub:o}=e;if(s&&(s.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let r=n.computed.deps;r;r=r.nextDep)Gr(r,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function zu(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let vt=!0;const Ca=[];function Qt(){Ca.push(vt),vt=!1}function Gt(){const e=Ca.pop();vt=e===void 0?!0:e}function Oi(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ke;ke=void 0;try{t()}finally{ke=n}}}let ps=0;class Qu{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Jr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!ke||!vt||ke===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ke)n=this.activeLink=new Qu(ke,this),ke.deps?(n.prevDep=ke.depsTail,ke.depsTail.nextDep=n,ke.depsTail=n):ke.deps=ke.depsTail=n,Ta(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=ke.depsTail,n.nextDep=void 0,ke.depsTail.nextDep=n,ke.depsTail=n,ke.deps===n&&(ke.deps=s)}return n}trigger(t){this.version++,ps++,this.notify(t)}notify(t){zr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Qr()}}}function Ta(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Ta(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const gr=new WeakMap,wn=Symbol(""),yr=Symbol(""),hs=Symbol("");function Ue(e,t,n){if(vt&&ke){let s=gr.get(e);s||gr.set(e,s=new Map);let o=s.get(n);o||(s.set(n,o=new Jr),o.map=s,o.key=n),o.track()}}function Vt(e,t,n,s,o,r){const i=gr.get(e);if(!i){ps++;return}const l=a=>{a&&a.trigger()};if(zr(),t==="clear")i.forEach(l);else{const a=X(e),d=a&&Wr(n);if(a&&n==="length"){const c=Number(s);i.forEach((f,m)=>{(m==="length"||m===hs||!Mt(m)&&m>=c)&&l(f)})}else switch((n!==void 0||i.has(void 0))&&l(i.get(n)),d&&l(i.get(hs)),t){case"add":a?d&&l(i.get("length")):(l(i.get(wn)),On(e)&&l(i.get(yr)));break;case"delete":a||(l(i.get(wn)),On(e)&&l(i.get(yr)));break;case"set":On(e)&&l(i.get(wn));break}}Qr()}function An(e){const t=pe(e);return t===e?t:(Ue(t,"iterate",hs),ht(e)?t:t.map(_t))}function So(e){return Ue(e=pe(e),"iterate",hs),e}function sn(e,t){return Jt(e)?Fn(kn(e)?_t(t):t):_t(t)}const Gu={__proto__:null,[Symbol.iterator](){return Qo(this,Symbol.iterator,e=>sn(this,e))},concat(...e){return An(this).concat(...e.map(t=>X(t)?An(t):t))},entries(){return Qo(this,"entries",e=>(e[1]=sn(this,e[1]),e))},every(e,t){return Ut(this,"every",e,t,void 0,arguments)},filter(e,t){return Ut(this,"filter",e,t,n=>n.map(s=>sn(this,s)),arguments)},find(e,t){return Ut(this,"find",e,t,n=>sn(this,n),arguments)},findIndex(e,t){return Ut(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ut(this,"findLast",e,t,n=>sn(this,n),arguments)},findLastIndex(e,t){return Ut(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ut(this,"forEach",e,t,void 0,arguments)},includes(...e){return Go(this,"includes",e)},indexOf(...e){return Go(this,"indexOf",e)},join(e){return An(this).join(e)},lastIndexOf(...e){return Go(this,"lastIndexOf",e)},map(e,t){return Ut(this,"map",e,t,void 0,arguments)},pop(){return Jn(this,"pop")},push(...e){return Jn(this,"push",e)},reduce(e,...t){return Di(this,"reduce",e,t)},reduceRight(e,...t){return Di(this,"reduceRight",e,t)},shift(){return Jn(this,"shift")},some(e,t){return Ut(this,"some",e,t,void 0,arguments)},splice(...e){return Jn(this,"splice",e)},toReversed(){return An(this).toReversed()},toSorted(e){return An(this).toSorted(e)},toSpliced(...e){return An(this).toSpliced(...e)},unshift(...e){return Jn(this,"unshift",e)},values(){return Qo(this,"values",e=>sn(this,e))}};function Qo(e,t,n){const s=So(e),o=s[t]();return s!==e&&!ht(e)&&(o._next=o.next,o.next=()=>{const r=o._next();return r.done||(r.value=n(r.value)),r}),o}const Ju=Array.prototype;function Ut(e,t,n,s,o,r){const i=So(e),l=i!==e&&!ht(e),a=i[t];if(a!==Ju[t]){const f=a.apply(e,r);return l?_t(f):f}let d=n;i!==e&&(l?d=function(f,m){return n.call(this,sn(e,f),m,e)}:n.length>2&&(d=function(f,m){return n.call(this,f,m,e)}));const c=a.call(i,d,s);return l&&o?o(c):c}function Di(e,t,n,s){const o=So(e);let r=n;return o!==e&&(ht(e)?n.length>3&&(r=function(i,l,a){return n.call(this,i,l,a,e)}):r=function(i,l,a){return n.call(this,i,sn(e,l),a,e)}),o[t](r,...s)}function Go(e,t,n){const s=pe(e);Ue(s,"iterate",hs);const o=s[t](...n);return(o===-1||o===!1)&&Zr(n[0])?(n[0]=pe(n[0]),s[t](...n)):o}function Jn(e,t,n=[]){Qt(),zr();const s=pe(e)[t].apply(e,n);return Qr(),Gt(),s}const Yu=jr("__proto__,__v_isRef,__isVue"),Pa=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Mt));function Xu(e){Mt(e)||(e=String(e));const t=pe(this);return Ue(t,"has",e),t.hasOwnProperty(e)}class Oa{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,r=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return r;if(n==="__v_raw")return s===(o?r?ad:$a:r?Ia:Na).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const i=X(t);if(!o){let a;if(i&&(a=Gu[n]))return a;if(n==="hasOwnProperty")return Xu}const l=Reflect.get(t,n,je(t)?t:s);if((Mt(n)?Pa.has(n):Yu(n))||(o||Ue(t,"get",n),r))return l;if(je(l)){const a=i&&Wr(n)?l:l.value;return o&&ge(a)?br(a):a}return ge(l)?o?br(l):Ln(l):l}}class Da extends Oa{constructor(t=!1){super(!1,t)}set(t,n,s,o){let r=t[n];const i=X(t)&&Wr(n);if(!this._isShallow){const d=Jt(r);if(!ht(s)&&!Jt(s)&&(r=pe(r),s=pe(s)),!i&&je(r)&&!je(s))return d||(r.value=s),!0}const l=i?Number(n)e,Us=e=>Reflect.getPrototypeOf(e);function sd(e,t,n){return function(...s){const o=this.__v_raw,r=pe(o),i=On(r),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,d=o[e](...s),c=n?vr:t?Fn:_t;return!t&&Ue(r,"iterate",a?yr:wn),$e(Object.create(d),{next(){const{value:f,done:m}=d.next();return m?{value:f,done:m}:{value:l?[c(f[0]),c(f[1])]:c(f),done:m}}})}}function Bs(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function od(e,t){const n={get(o){const r=this.__v_raw,i=pe(r),l=pe(o);e||(an(o,l)&&Ue(i,"get",o),Ue(i,"get",l));const{has:a}=Us(i),d=t?vr:e?Fn:_t;if(a.call(i,o))return d(r.get(o));if(a.call(i,l))return d(r.get(l));r!==i&&r.get(o)},get size(){const o=this.__v_raw;return!e&&Ue(pe(o),"iterate",wn),o.size},has(o){const r=this.__v_raw,i=pe(r),l=pe(o);return e||(an(o,l)&&Ue(i,"has",o),Ue(i,"has",l)),o===l?r.has(o):r.has(o)||r.has(l)},forEach(o,r){const i=this,l=i.__v_raw,a=pe(l),d=t?vr:e?Fn:_t;return!e&&Ue(a,"iterate",wn),l.forEach((c,f)=>o.call(r,d(c),d(f),i))}};return $e(n,e?{add:Bs("add"),set:Bs("set"),delete:Bs("delete"),clear:Bs("clear")}:{add(o){!t&&!ht(o)&&!Jt(o)&&(o=pe(o));const r=pe(this);return Us(r).has.call(r,o)||(r.add(o),Vt(r,"add",o,o)),this},set(o,r){!t&&!ht(r)&&!Jt(r)&&(r=pe(r));const i=pe(this),{has:l,get:a}=Us(i);let d=l.call(i,o);d||(o=pe(o),d=l.call(i,o));const c=a.call(i,o);return i.set(o,r),d?an(r,c)&&Vt(i,"set",o,r):Vt(i,"add",o,r),this},delete(o){const r=pe(this),{has:i,get:l}=Us(r);let a=i.call(r,o);a||(o=pe(o),a=i.call(r,o)),l&&l.call(r,o);const d=r.delete(o);return a&&Vt(r,"delete",o,void 0),d},clear(){const o=pe(this),r=o.size!==0,i=o.clear();return r&&Vt(o,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=sd(o,e,t)}),n}function Yr(e,t){const n=od(e,t);return(s,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(me(n,o)&&o in s?n:s,o,r)}const rd={get:Yr(!1,!1)},id={get:Yr(!1,!0)},ld={get:Yr(!0,!1)};const Na=new WeakMap,Ia=new WeakMap,$a=new WeakMap,ad=new WeakMap;function cd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ud(e){return e.__v_skip||!Object.isExtensible(e)?0:cd(Iu(e))}function Ln(e){return Jt(e)?e:Xr(e,!1,ed,rd,Na)}function La(e){return Xr(e,!1,nd,id,Ia)}function br(e){return Xr(e,!0,td,ld,$a)}function Xr(e,t,n,s,o){if(!ge(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const r=ud(e);if(r===0)return e;const i=o.get(e);if(i)return i;const l=new Proxy(e,r===2?s:n);return o.set(e,l),l}function kn(e){return Jt(e)?kn(e.__v_raw):!!(e&&e.__v_isReactive)}function Jt(e){return!!(e&&e.__v_isReadonly)}function ht(e){return!!(e&&e.__v_isShallow)}function Zr(e){return e?!!e.__v_raw:!1}function pe(e){const t=e&&e.__v_raw;return t?pe(t):e}function dd(e){return!me(e,"__v_skip")&&Object.isExtensible(e)&&va(e,"__v_skip",!0),e}const _t=e=>ge(e)?Ln(e):e,Fn=e=>ge(e)?br(e):e;function je(e){return e?e.__v_isRef===!0:!1}function te(e){return Fa(e,!1)}function fd(e){return Fa(e,!0)}function Fa(e,t){return je(e)?e:new pd(e,t)}class pd{constructor(t,n){this.dep=new Jr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:pe(t),this._value=n?t:_t(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||ht(t)||Jt(t);t=s?t:pe(t),an(t,n)&&(this._rawValue=t,this._value=s?t:_t(t),this.dep.trigger())}}function u(e){return je(e)?e.value:e}const hd={get:(e,t,n)=>t==="__v_raw"?e:u(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return je(o)&&!je(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function Ma(e){return kn(e)?e:new Proxy(e,hd)}class md{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Jr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ps-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&ke!==this)return Sa(this,!0),!0}get value(){const t=this.dep.track();return Ra(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function gd(e,t,n=!1){let s,o;return oe(e)?s=e:(s=e.get,o=e.set),new md(s,o,n)}const Hs={},ro=new WeakMap;let vn;function yd(e,t=!1,n=vn){if(n){let s=ro.get(n);s||ro.set(n,s=[]),s.push(e)}}function vd(e,t,n=_e){const{immediate:s,deep:o,once:r,scheduler:i,augmentJob:l,call:a}=n,d=C=>o?C:ht(C)||o===!1||o===0?Wt(C,1):Wt(C);let c,f,m,b,y=!1,v=!1;if(je(e)?(f=()=>e.value,y=ht(e)):kn(e)?(f=()=>d(e),y=!0):X(e)?(v=!0,y=e.some(C=>kn(C)||ht(C)),f=()=>e.map(C=>{if(je(C))return C.value;if(kn(C))return d(C);if(oe(C))return a?a(C,2):C()})):oe(e)?t?f=a?()=>a(e,2):e:f=()=>{if(m){Qt();try{m()}finally{Gt()}}const C=vn;vn=c;try{return a?a(e,3,[b]):e(b)}finally{vn=C}}:f=Lt,t&&o){const C=f,L=o===!0?1/0:o;f=()=>Wt(C(),L)}const h=Ku(),k=()=>{c.stop(),h&&h.active&&Vr(h.effects,c)};if(r&&t){const C=t;t=(...L)=>{C(...L),k()}}let R=v?new Array(e.length).fill(Hs):Hs;const S=C=>{if(!(!(c.flags&1)||!c.dirty&&!C))if(t){const L=c.run();if(o||y||(v?L.some((P,U)=>an(P,R[U])):an(L,R))){m&&m();const P=vn;vn=c;try{const U=[L,R===Hs?void 0:v&&R[0]===Hs?[]:R,b];R=L,a?a(t,3,U):t(...U)}finally{vn=P}}}else c.run()};return l&&l(S),c=new wa(f),c.scheduler=i?()=>i(S,!1):S,b=C=>yd(C,!1,c),m=c.onStop=()=>{const C=ro.get(c);if(C){if(a)a(C,4);else for(const L of C)L();ro.delete(c)}},t?s?S(!0):R=c.run():i?i(S.bind(null,!0),!0):c.run(),k.pause=c.pause.bind(c),k.resume=c.resume.bind(c),k.stop=k,k}function Wt(e,t=1/0,n){if(t<=0||!ge(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,je(e))Wt(e.value,t,n);else if(X(e))for(let s=0;s{Wt(s,t,n)});else if(ya(e)){for(const s in e)Wt(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Wt(e[s],t,n)}return e}/** +**/let et;class Wu{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=et,!t&&et&&(this.index=(et.scopes||(et.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(et=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(ls){let t=ls;for(ls=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;is;){let t=is;for(is=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Ea(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Aa(e){let t,n=e.depsTail,s=n;for(;s;){const o=s.prevDep;s.version===-1?(s===n&&(n=o),Gr(s),zu(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=o}e.deps=t,e.depsTail=n}function mr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ra(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ra(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===ps)||(e.globalVersion=ps,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!mr(e))))return;e.flags|=2;const t=e.dep,n=Se,s=vt;Se=e,vt=!0;try{Ea(e);const o=e.fn(e._value);(t.version===0||an(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{Se=n,vt=s,Aa(e),e.flags&=-3}}function Gr(e,t=!1){const{dep:n,prevSub:s,nextSub:o}=e;if(s&&(s.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let r=n.computed.deps;r;r=r.nextDep)Gr(r,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function zu(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let vt=!0;const Ca=[];function Qt(){Ca.push(vt),vt=!1}function Gt(){const e=Ca.pop();vt=e===void 0?!0:e}function Oi(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Se;Se=void 0;try{t()}finally{Se=n}}}let ps=0;class Qu{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Jr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Se||!vt||Se===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Se)n=this.activeLink=new Qu(Se,this),Se.deps?(n.prevDep=Se.depsTail,Se.depsTail.nextDep=n,Se.depsTail=n):Se.deps=Se.depsTail=n,Ta(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=Se.depsTail,n.nextDep=void 0,Se.depsTail.nextDep=n,Se.depsTail=n,Se.deps===n&&(Se.deps=s)}return n}trigger(t){this.version++,ps++,this.notify(t)}notify(t){zr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Qr()}}}function Ta(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Ta(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const gr=new WeakMap,wn=Symbol(""),yr=Symbol(""),hs=Symbol("");function Ue(e,t,n){if(vt&&Se){let s=gr.get(e);s||gr.set(e,s=new Map);let o=s.get(n);o||(s.set(n,o=new Jr),o.map=s,o.key=n),o.track()}}function Vt(e,t,n,s,o,r){const i=gr.get(e);if(!i){ps++;return}const l=a=>{a&&a.trigger()};if(zr(),t==="clear")i.forEach(l);else{const a=X(e),d=a&&Wr(n);if(a&&n==="length"){const c=Number(s);i.forEach((f,m)=>{(m==="length"||m===hs||!Mt(m)&&m>=c)&&l(f)})}else switch((n!==void 0||i.has(void 0))&&l(i.get(n)),d&&l(i.get(hs)),t){case"add":a?d&&l(i.get("length")):(l(i.get(wn)),On(e)&&l(i.get(yr)));break;case"delete":a||(l(i.get(wn)),On(e)&&l(i.get(yr)));break;case"set":On(e)&&l(i.get(wn));break}}Qr()}function An(e){const t=pe(e);return t===e?t:(Ue(t,"iterate",hs),ht(e)?t:t.map(_t))}function So(e){return Ue(e=pe(e),"iterate",hs),e}function sn(e,t){return Jt(e)?Fn(kn(e)?_t(t):t):_t(t)}const Gu={__proto__:null,[Symbol.iterator](){return Qo(this,Symbol.iterator,e=>sn(this,e))},concat(...e){return An(this).concat(...e.map(t=>X(t)?An(t):t))},entries(){return Qo(this,"entries",e=>(e[1]=sn(this,e[1]),e))},every(e,t){return Ut(this,"every",e,t,void 0,arguments)},filter(e,t){return Ut(this,"filter",e,t,n=>n.map(s=>sn(this,s)),arguments)},find(e,t){return Ut(this,"find",e,t,n=>sn(this,n),arguments)},findIndex(e,t){return Ut(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ut(this,"findLast",e,t,n=>sn(this,n),arguments)},findLastIndex(e,t){return Ut(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ut(this,"forEach",e,t,void 0,arguments)},includes(...e){return Go(this,"includes",e)},indexOf(...e){return Go(this,"indexOf",e)},join(e){return An(this).join(e)},lastIndexOf(...e){return Go(this,"lastIndexOf",e)},map(e,t){return Ut(this,"map",e,t,void 0,arguments)},pop(){return Jn(this,"pop")},push(...e){return Jn(this,"push",e)},reduce(e,...t){return Di(this,"reduce",e,t)},reduceRight(e,...t){return Di(this,"reduceRight",e,t)},shift(){return Jn(this,"shift")},some(e,t){return Ut(this,"some",e,t,void 0,arguments)},splice(...e){return Jn(this,"splice",e)},toReversed(){return An(this).toReversed()},toSorted(e){return An(this).toSorted(e)},toSpliced(...e){return An(this).toSpliced(...e)},unshift(...e){return Jn(this,"unshift",e)},values(){return Qo(this,"values",e=>sn(this,e))}};function Qo(e,t,n){const s=So(e),o=s[t]();return s!==e&&!ht(e)&&(o._next=o.next,o.next=()=>{const r=o._next();return r.done||(r.value=n(r.value)),r}),o}const Ju=Array.prototype;function Ut(e,t,n,s,o,r){const i=So(e),l=i!==e&&!ht(e),a=i[t];if(a!==Ju[t]){const f=a.apply(e,r);return l?_t(f):f}let d=n;i!==e&&(l?d=function(f,m){return n.call(this,sn(e,f),m,e)}:n.length>2&&(d=function(f,m){return n.call(this,f,m,e)}));const c=a.call(i,d,s);return l&&o?o(c):c}function Di(e,t,n,s){const o=So(e);let r=n;return o!==e&&(ht(e)?n.length>3&&(r=function(i,l,a){return n.call(this,i,l,a,e)}):r=function(i,l,a){return n.call(this,i,sn(e,l),a,e)}),o[t](r,...s)}function Go(e,t,n){const s=pe(e);Ue(s,"iterate",hs);const o=s[t](...n);return(o===-1||o===!1)&&Zr(n[0])?(n[0]=pe(n[0]),s[t](...n)):o}function Jn(e,t,n=[]){Qt(),zr();const s=pe(e)[t].apply(e,n);return Qr(),Gt(),s}const Yu=jr("__proto__,__v_isRef,__isVue"),Pa=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Mt));function Xu(e){Mt(e)||(e=String(e));const t=pe(this);return Ue(t,"has",e),t.hasOwnProperty(e)}class Oa{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,r=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return r;if(n==="__v_raw")return s===(o?r?ad:$a:r?Ia:Na).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const i=X(t);if(!o){let a;if(i&&(a=Gu[n]))return a;if(n==="hasOwnProperty")return Xu}const l=Reflect.get(t,n,je(t)?t:s);if((Mt(n)?Pa.has(n):Yu(n))||(o||Ue(t,"get",n),r))return l;if(je(l)){const a=i&&Wr(n)?l:l.value;return o&&ge(a)?br(a):a}return ge(l)?o?br(l):Ln(l):l}}class Da extends Oa{constructor(t=!1){super(!1,t)}set(t,n,s,o){let r=t[n];const i=X(t)&&Wr(n);if(!this._isShallow){const d=Jt(r);if(!ht(s)&&!Jt(s)&&(r=pe(r),s=pe(s)),!i&&je(r)&&!je(s))return d||(r.value=s),!0}const l=i?Number(n)e,Us=e=>Reflect.getPrototypeOf(e);function sd(e,t,n){return function(...s){const o=this.__v_raw,r=pe(o),i=On(r),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,d=o[e](...s),c=n?vr:t?Fn:_t;return!t&&Ue(r,"iterate",a?yr:wn),$e(Object.create(d),{next(){const{value:f,done:m}=d.next();return m?{value:f,done:m}:{value:l?[c(f[0]),c(f[1])]:c(f),done:m}}})}}function Bs(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function od(e,t){const n={get(o){const r=this.__v_raw,i=pe(r),l=pe(o);e||(an(o,l)&&Ue(i,"get",o),Ue(i,"get",l));const{has:a}=Us(i),d=t?vr:e?Fn:_t;if(a.call(i,o))return d(r.get(o));if(a.call(i,l))return d(r.get(l));r!==i&&r.get(o)},get size(){const o=this.__v_raw;return!e&&Ue(pe(o),"iterate",wn),o.size},has(o){const r=this.__v_raw,i=pe(r),l=pe(o);return e||(an(o,l)&&Ue(i,"has",o),Ue(i,"has",l)),o===l?r.has(o):r.has(o)||r.has(l)},forEach(o,r){const i=this,l=i.__v_raw,a=pe(l),d=t?vr:e?Fn:_t;return!e&&Ue(a,"iterate",wn),l.forEach((c,f)=>o.call(r,d(c),d(f),i))}};return $e(n,e?{add:Bs("add"),set:Bs("set"),delete:Bs("delete"),clear:Bs("clear")}:{add(o){!t&&!ht(o)&&!Jt(o)&&(o=pe(o));const r=pe(this);return Us(r).has.call(r,o)||(r.add(o),Vt(r,"add",o,o)),this},set(o,r){!t&&!ht(r)&&!Jt(r)&&(r=pe(r));const i=pe(this),{has:l,get:a}=Us(i);let d=l.call(i,o);d||(o=pe(o),d=l.call(i,o));const c=a.call(i,o);return i.set(o,r),d?an(r,c)&&Vt(i,"set",o,r):Vt(i,"add",o,r),this},delete(o){const r=pe(this),{has:i,get:l}=Us(r);let a=i.call(r,o);a||(o=pe(o),a=i.call(r,o)),l&&l.call(r,o);const d=r.delete(o);return a&&Vt(r,"delete",o,void 0),d},clear(){const o=pe(this),r=o.size!==0,i=o.clear();return r&&Vt(o,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=sd(o,e,t)}),n}function Yr(e,t){const n=od(e,t);return(s,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(me(n,o)&&o in s?n:s,o,r)}const rd={get:Yr(!1,!1)},id={get:Yr(!1,!0)},ld={get:Yr(!0,!1)};const Na=new WeakMap,Ia=new WeakMap,$a=new WeakMap,ad=new WeakMap;function cd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ud(e){return e.__v_skip||!Object.isExtensible(e)?0:cd(Iu(e))}function Ln(e){return Jt(e)?e:Xr(e,!1,ed,rd,Na)}function La(e){return Xr(e,!1,nd,id,Ia)}function br(e){return Xr(e,!0,td,ld,$a)}function Xr(e,t,n,s,o){if(!ge(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const r=ud(e);if(r===0)return e;const i=o.get(e);if(i)return i;const l=new Proxy(e,r===2?s:n);return o.set(e,l),l}function kn(e){return Jt(e)?kn(e.__v_raw):!!(e&&e.__v_isReactive)}function Jt(e){return!!(e&&e.__v_isReadonly)}function ht(e){return!!(e&&e.__v_isShallow)}function Zr(e){return e?!!e.__v_raw:!1}function pe(e){const t=e&&e.__v_raw;return t?pe(t):e}function dd(e){return!me(e,"__v_skip")&&Object.isExtensible(e)&&va(e,"__v_skip",!0),e}const _t=e=>ge(e)?Ln(e):e,Fn=e=>ge(e)?br(e):e;function je(e){return e?e.__v_isRef===!0:!1}function te(e){return Fa(e,!1)}function fd(e){return Fa(e,!0)}function Fa(e,t){return je(e)?e:new pd(e,t)}class pd{constructor(t,n){this.dep=new Jr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:pe(t),this._value=n?t:_t(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||ht(t)||Jt(t);t=s?t:pe(t),an(t,n)&&(this._rawValue=t,this._value=s?t:_t(t),this.dep.trigger())}}function u(e){return je(e)?e.value:e}const hd={get:(e,t,n)=>t==="__v_raw"?e:u(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return je(o)&&!je(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function Ma(e){return kn(e)?e:new Proxy(e,hd)}class md{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Jr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ps-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&Se!==this)return Sa(this,!0),!0}get value(){const t=this.dep.track();return Ra(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function gd(e,t,n=!1){let s,o;return oe(e)?s=e:(s=e.get,o=e.set),new md(s,o,n)}const Hs={},ro=new WeakMap;let vn;function yd(e,t=!1,n=vn){if(n){let s=ro.get(n);s||ro.set(n,s=[]),s.push(e)}}function vd(e,t,n=xe){const{immediate:s,deep:o,once:r,scheduler:i,augmentJob:l,call:a}=n,d=C=>o?C:ht(C)||o===!1||o===0?Wt(C,1):Wt(C);let c,f,m,b,y=!1,v=!1;if(je(e)?(f=()=>e.value,y=ht(e)):kn(e)?(f=()=>d(e),y=!0):X(e)?(v=!0,y=e.some(C=>kn(C)||ht(C)),f=()=>e.map(C=>{if(je(C))return C.value;if(kn(C))return d(C);if(oe(C))return a?a(C,2):C()})):oe(e)?t?f=a?()=>a(e,2):e:f=()=>{if(m){Qt();try{m()}finally{Gt()}}const C=vn;vn=c;try{return a?a(e,3,[b]):e(b)}finally{vn=C}}:f=Lt,t&&o){const C=f,L=o===!0?1/0:o;f=()=>Wt(C(),L)}const h=Ku(),k=()=>{c.stop(),h&&h.active&&Vr(h.effects,c)};if(r&&t){const C=t;t=(...L)=>{C(...L),k()}}let R=v?new Array(e.length).fill(Hs):Hs;const S=C=>{if(!(!(c.flags&1)||!c.dirty&&!C))if(t){const L=c.run();if(o||y||(v?L.some((P,U)=>an(P,R[U])):an(L,R))){m&&m();const P=vn;vn=c;try{const U=[L,R===Hs?void 0:v&&R[0]===Hs?[]:R,b];R=L,a?a(t,3,U):t(...U)}finally{vn=P}}}else c.run()};return l&&l(S),c=new wa(f),c.scheduler=i?()=>i(S,!1):S,b=C=>yd(C,!1,c),m=c.onStop=()=>{const C=ro.get(c);if(C){if(a)a(C,4);else for(const L of C)L();ro.delete(c)}},t?s?S(!0):R=c.run():i?i(S.bind(null,!0),!0):c.run(),k.pause=c.pause.bind(c),k.resume=c.resume.bind(c),k.stop=k,k}function Wt(e,t=1/0,n){if(t<=0||!ge(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,je(e))Wt(e.value,t,n);else if(X(e))for(let s=0;s{Wt(s,t,n)});else if(ya(e)){for(const s in e)Wt(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Wt(e[s],t,n)}return e}/** * @vue/runtime-core v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/function As(e,t,n,s){try{return s?e(...s):e()}catch(o){Eo(o,t,n)}}function xt(e,t,n,s){if(oe(e)){const o=As(e,t,n,s);return o&&ma(o)&&o.catch(r=>{Eo(r,t,n)}),o}if(X(e)){const o=[];for(let r=0;r>>1,o=ze[s],r=ms(o);r=ms(n)?ze.push(e):ze.splice(_d(t),0,e),e.flags|=1,Ba()}}function Ba(){io||(io=Ua.then(ja))}function xd(e){X(e)?Dn.push(...e):on&&e.id===-1?on.splice(Cn+1,0,e):e.flags&1||(Dn.push(e),e.flags|=1),Ba()}function Ni(e,t,n=Nt+1){for(;nms(n)-ms(s));if(Dn.length=0,on){on.push(...t);return}for(on=t,Cn=0;Cne.id==null?e.flags&2?-1:1/0:e.id;function ja(e){try{for(Nt=0;Nt{s._d&&fo(-1);const r=lo(t);let i;try{i=e(...o)}finally{lo(r),s._d&&fo(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function Ee(e,t){if(lt===null)return e;const n=Po(lt),s=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&oe(t)?t.call(s&&s.proxy):t}}const wd=Symbol.for("v-scx"),kd=()=>bt(wd);function js(e,t){return ni(e,null,t)}function Ft(e,t,n){return ni(e,t,n)}function ni(e,t,n=_e){const{immediate:s,deep:o,flush:r,once:i}=n,l=$e({},n),a=t&&s||!t&&r!=="post";let d;if(vs){if(r==="sync"){const b=kd();d=b.__watcherHandles||(b.__watcherHandles=[])}else if(!a){const b=()=>{};return b.stop=Lt,b.resume=Lt,b.pause=Lt,b}}const c=Be;l.call=(b,y,v)=>xt(b,c,y,v);let f=!1;r==="post"?l.scheduler=b=>{Ze(b,c&&c.suspense)}:r!=="sync"&&(f=!0,l.scheduler=(b,y)=>{y?b():ti(b)}),l.augmentJob=b=>{t&&(b.flags|=4),f&&(b.flags|=2,c&&(b.id=c.uid,b.i=c))};const m=vd(e,t,l);return vs&&(d?d.push(m):a&&m()),m}function Sd(e,t,n){const s=this.proxy,o=Te(e)?e.includes(".")?Va(s,e):()=>s[e]:e.bind(s,s);let r;oe(t)?r=t:(r=t.handler,n=t);const i=Rs(this),l=ni(o,r.bind(s),n);return i(),l}function Va(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;oe.__isTeleport,It=Symbol("_leaveCb"),Yn=Symbol("_enterCb");function Ad(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Xt(()=>{e.isMounted=!0}),oi(()=>{e.isUnmounting=!0}),e}const ft=[Function,Array],Ka={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ft,onEnter:ft,onAfterEnter:ft,onEnterCancelled:ft,onBeforeLeave:ft,onLeave:ft,onAfterLeave:ft,onLeaveCancelled:ft,onBeforeAppear:ft,onAppear:ft,onAfterAppear:ft,onAppearCancelled:ft},za=e=>{const t=e.subTree;return t.component?za(t.component):t},Rd={name:"BaseTransition",props:Ka,setup(e,{slots:t}){const n=wc(),s=Ad();return()=>{const o=t.default&&Ja(t.default(),!0);if(!o||!o.length)return;const r=Qa(o),i=pe(e),{mode:l}=i;if(s.isLeaving)return Jo(r);const a=Ii(r);if(!a)return Jo(r);let d=_r(a,i,s,n,f=>d=f);a.type!==Qe&&gs(a,d);let c=n.subTree&&Ii(n.subTree);if(c&&c.type!==Qe&&!bn(c,a)&&za(n).type!==Qe){let f=_r(c,i,s,n);if(gs(c,f),l==="out-in"&&a.type!==Qe)return s.isLeaving=!0,f.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,c=void 0},Jo(r);l==="in-out"&&a.type!==Qe?f.delayLeave=(m,b,y)=>{const v=Ga(s,c);v[String(c.key)]=c,m[It]=()=>{b(),m[It]=void 0,delete d.delayedLeave,c=void 0},d.delayedLeave=()=>{y(),delete d.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return r}}};function Qa(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Qe){t=n;break}}return t}const Cd=Rd;function Ga(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function _r(e,t,n,s,o){const{appear:r,mode:i,persisted:l=!1,onBeforeEnter:a,onEnter:d,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:m,onLeave:b,onAfterLeave:y,onLeaveCancelled:v,onBeforeAppear:h,onAppear:k,onAfterAppear:R,onAppearCancelled:S}=t,C=String(e.key),L=Ga(n,e),P=(I,W)=>{I&&xt(I,s,9,W)},U=(I,W)=>{const B=W[1];P(I,W),X(I)?I.every(q=>q.length<=1)&&B():I.length<=1&&B()},ae={mode:i,persisted:l,beforeEnter(I){let W=a;if(!n.isMounted)if(r)W=h||a;else return;I[It]&&I[It](!0);const B=L[C];B&&bn(e,B)&&B.el[It]&&B.el[It](),P(W,[I])},enter(I){let W=d,B=c,q=f;if(!n.isMounted)if(r)W=k||d,B=R||c,q=S||f;else return;let se=!1;I[Yn]=Me=>{se||(se=!0,Me?P(q,[I]):P(B,[I]),ae.delayedLeave&&ae.delayedLeave(),I[Yn]=void 0)};const xe=I[Yn].bind(null,!1);W?U(W,[I,xe]):xe()},leave(I,W){const B=String(e.key);if(I[Yn]&&I[Yn](!0),n.isUnmounting)return W();P(m,[I]);let q=!1;I[It]=xe=>{q||(q=!0,W(),xe?P(v,[I]):P(y,[I]),I[It]=void 0,L[B]===e&&delete L[B])};const se=I[It].bind(null,!1);L[B]=e,b?U(b,[I,se]):se()},clone(I){const W=_r(I,t,n,s,o);return o&&o(W),W}};return ae}function Jo(e){if(Ao(e))return e=cn(e),e.children=null,e}function Ii(e){if(!Ao(e))return Wa(e.type)&&e.children?Qa(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&oe(n.default))return n.default()}}function gs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,gs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ja(e,t=!1,n){let s=[],o=0;for(let r=0;r1)for(let r=0;ras(v,t&&(X(t)?t[h]:t),n,s,o));return}if(cs(s)&&!o){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&as(e,t,n,s.component.subTree);return}const r=s.shapeFlag&4?Po(s.component):s.el,i=o?null:r,{i:l,r:a}=e,d=t&&t.r,c=l.refs===_e?l.refs={}:l.refs,f=l.setupState,m=pe(f),b=f===_e?ha:v=>$i(c,v)?!1:me(m,v),y=(v,h)=>!(h&&$i(c,h));if(d!=null&&d!==a){if(Li(t),Te(d))c[d]=null,b(d)&&(f[d]=null);else if(je(d)){const v=t;y(d,v.k)&&(d.value=null),v.k&&(c[v.k]=null)}}if(oe(a))As(a,l,12,[i,c]);else{const v=Te(a),h=je(a);if(v||h){const k=()=>{if(e.f){const R=v?b(a)?f[a]:c[a]:y()||!e.k?a.value:c[e.k];if(o)X(R)&&Vr(R,r);else if(X(R))R.includes(r)||R.push(r);else if(v)c[a]=[r],b(a)&&(f[a]=c[a]);else{const S=[r];y(a,e.k)&&(a.value=S),e.k&&(c[e.k]=S)}}else v?(c[a]=i,b(a)&&(f[a]=i)):h&&(y(a,e.k)&&(a.value=i),e.k&&(c[e.k]=i))};if(i){const R=()=>{k(),co.delete(e)};R.id=-1,co.set(e,R),Ze(R,n)}else Li(e),k()}}}function Li(e){const t=co.get(e);t&&(t.flags|=8,co.delete(e))}ko().requestIdleCallback;ko().cancelIdleCallback;const cs=e=>!!e.type.__asyncLoader,Ao=e=>e.type.__isKeepAlive;function Td(e,t){Xa(e,"a",t)}function Pd(e,t){Xa(e,"da",t)}function Xa(e,t,n=Be){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ro(t,s,n),n){let o=n.parent;for(;o&&o.parent;)Ao(o.parent.vnode)&&Od(s,t,n,o),o=o.parent}}function Od(e,t,n,s){const o=Ro(t,e,s,!0);ri(()=>{Vr(s[t],o)},n)}function Ro(e,t,n=Be,s=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...i)=>{Qt();const l=Rs(n),a=xt(t,n,e,i);return l(),Gt(),a});return s?o.unshift(r):o.push(r),r}}const Yt=e=>(t,n=Be)=>{(!vs||e==="sp")&&Ro(e,(...s)=>t(...s),n)},Za=Yt("bm"),Xt=Yt("m"),Dd=Yt("bu"),Nd=Yt("u"),oi=Yt("bum"),ri=Yt("um"),Id=Yt("sp"),$d=Yt("rtg"),Ld=Yt("rtc");function Fd(e,t=Be){Ro("ec",e,t)}const ec="components";function xr(e,t){return nc(ec,e,!0,t)||e}const tc=Symbol.for("v-ndc");function Md(e){return Te(e)?nc(ec,e,!1)||e:e||tc}function nc(e,t,n=!0,s=!1){const o=lt||Be;if(o){const r=o.type;{const l=Sf(r,!1);if(l&&(l===t||l===mt(t)||l===xo(mt(t))))return r}const i=Fi(o[e]||r[e],t)||Fi(o.appContext[e],t);return!i&&s?r:i}}function Fi(e,t){return e&&(e[t]||e[mt(t)]||e[xo(mt(t))])}function Ie(e,t,n,s){let o;const r=n,i=X(e);if(i||Te(e)){const l=i&&kn(e);let a=!1,d=!1;l&&(a=!ht(e),d=Jt(e),e=So(e)),o=new Array(e.length);for(let c=0,f=e.length;ct(l,a,void 0,r));else{const l=Object.keys(e);o=new Array(l.length);for(let a=0,d=l.length;ae?kc(e)?Po(e):wr(e.parent):null,us=$e(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>wr(e.parent),$root:e=>wr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>oc(e),$forceUpdate:e=>e.f||(e.f=()=>{ti(e.update)}),$nextTick:e=>e.n||(e.n=ei.bind(e.proxy)),$watch:e=>Sd.bind(e)}),Yo=(e,t)=>e!==_e&&!e.__isScriptSetup&&me(e,t),Ud={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:o,props:r,accessCache:i,type:l,appContext:a}=e;if(t[0]!=="$"){const m=i[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return r[t]}else{if(Yo(s,t))return i[t]=1,s[t];if(o!==_e&&me(o,t))return i[t]=2,o[t];if(me(r,t))return i[t]=3,r[t];if(n!==_e&&me(n,t))return i[t]=4,n[t];kr&&(i[t]=0)}}const d=us[t];let c,f;if(d)return t==="$attrs"&&Ue(e.attrs,"get",""),d(e);if((c=l.__cssModules)&&(c=c[t]))return c;if(n!==_e&&me(n,t))return i[t]=4,n[t];if(f=a.config.globalProperties,me(f,t))return f[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:r}=e;return Yo(o,t)?(o[t]=n,!0):s!==_e&&me(s,t)?(s[t]=n,!0):me(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,props:r,type:i}},l){let a;return!!(n[l]||e!==_e&&l[0]!=="$"&&me(e,l)||Yo(t,l)||me(r,l)||me(s,l)||me(us,l)||me(o.config.globalProperties,l)||(a=i.__cssModules)&&a[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:me(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Mi(e){return X(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let kr=!0;function Bd(e){const t=oc(e),n=e.proxy,s=e.ctx;kr=!1,t.beforeCreate&&Ui(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:i,watch:l,provide:a,inject:d,created:c,beforeMount:f,mounted:m,beforeUpdate:b,updated:y,activated:v,deactivated:h,beforeDestroy:k,beforeUnmount:R,destroyed:S,unmounted:C,render:L,renderTracked:P,renderTriggered:U,errorCaptured:ae,serverPrefetch:I,expose:W,inheritAttrs:B,components:q,directives:se,filters:xe}=t;if(d&&Hd(d,s,null),i)for(const fe in i){const re=i[fe];oe(re)&&(s[fe]=re.bind(n))}if(o){const fe=o.call(n,n);ge(fe)&&(e.data=Ln(fe))}if(kr=!0,r)for(const fe in r){const re=r[fe],ut=oe(re)?re.bind(n,n):oe(re.get)?re.get.bind(n,n):Lt,Et=!oe(re)&&oe(re.set)?re.set.bind(n):Lt,De=ve({get:ut,set:Et});Object.defineProperty(s,fe,{enumerable:!0,configurable:!0,get:()=>De.value,set:Oe=>De.value=Oe})}if(l)for(const fe in l)sc(l[fe],s,n,fe);if(a){const fe=oe(a)?a.call(n):a;Reflect.ownKeys(fe).forEach(re=>{Qs(re,fe[re])})}c&&Ui(c,e,"c");function le(fe,re){X(re)?re.forEach(ut=>fe(ut.bind(n))):re&&fe(re.bind(n))}if(le(Za,f),le(Xt,m),le(Dd,b),le(Nd,y),le(Td,v),le(Pd,h),le(Fd,ae),le(Ld,P),le($d,U),le(oi,R),le(ri,C),le(Id,I),X(W))if(W.length){const fe=e.exposed||(e.exposed={});W.forEach(re=>{Object.defineProperty(fe,re,{get:()=>n[re],set:ut=>n[re]=ut,enumerable:!0})})}else e.exposed||(e.exposed={});L&&e.render===Lt&&(e.render=L),B!=null&&(e.inheritAttrs=B),q&&(e.components=q),se&&(e.directives=se),I&&Ya(e)}function Hd(e,t,n=Lt){X(e)&&(e=Sr(e));for(const s in e){const o=e[s];let r;ge(o)?"default"in o?r=bt(o.from||s,o.default,!0):r=bt(o.from||s):r=bt(o),je(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:i=>r.value=i}):t[s]=r}}function Ui(e,t,n){xt(X(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function sc(e,t,n,s){let o=s.includes(".")?Va(n,s):()=>n[s];if(Te(e)){const r=t[e];oe(r)&&Ft(o,r)}else if(oe(e))Ft(o,e.bind(n));else if(ge(e))if(X(e))e.forEach(r=>sc(r,t,n,s));else{const r=oe(e.handler)?e.handler.bind(n):t[e.handler];oe(r)&&Ft(o,r,e)}}function oc(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:i}}=e.appContext,l=r.get(t);let a;return l?a=l:!o.length&&!n&&!s?a=t:(a={},o.length&&o.forEach(d=>uo(a,d,i,!0)),uo(a,t,i)),ge(t)&&r.set(t,a),a}function uo(e,t,n,s=!1){const{mixins:o,extends:r}=t;r&&uo(e,r,n,!0),o&&o.forEach(i=>uo(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=jd[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const jd={data:Bi,props:Hi,emits:Hi,methods:os,computed:os,beforeCreate:Ve,created:Ve,beforeMount:Ve,mounted:Ve,beforeUpdate:Ve,updated:Ve,beforeDestroy:Ve,beforeUnmount:Ve,destroyed:Ve,unmounted:Ve,activated:Ve,deactivated:Ve,errorCaptured:Ve,serverPrefetch:Ve,components:os,directives:os,watch:Vd,provide:Bi,inject:qd};function Bi(e,t){return t?e?function(){return $e(oe(e)?e.call(this,this):e,oe(t)?t.call(this,this):t)}:t:e}function qd(e,t){return os(Sr(e),Sr(t))}function Sr(e){if(X(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${mt(t)}Modifiers`]||e[`${fn(t)}Modifiers`];function Qd(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||_e;let o=n;const r=t.startsWith("update:"),i=r&&zd(s,t.slice(7));i&&(i.trim&&(o=n.map(c=>Te(c)?c.trim():c)),i.number&&(o=n.map(wo)));let l,a=s[l=Wo(t)]||s[l=Wo(mt(t))];!a&&r&&(a=s[l=Wo(fn(t))]),a&&xt(a,e,6,o);const d=s[l+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xt(d,e,6,o)}}const Gd=new WeakMap;function ic(e,t,n=!1){const s=n?Gd:t.emitsCache,o=s.get(e);if(o!==void 0)return o;const r=e.emits;let i={},l=!1;if(!oe(e)){const a=d=>{const c=ic(d,t,!0);c&&(l=!0,$e(i,c))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!l?(ge(e)&&s.set(e,null),null):(X(r)?r.forEach(a=>i[a]=null):$e(i,r),ge(e)&&s.set(e,i),i)}function Co(e,t){return!e||!bo(t)?!1:(t=t.slice(2).replace(/Once$/,""),me(e,t[0].toLowerCase()+t.slice(1))||me(e,fn(t))||me(e,t))}function ji(e){const{type:t,vnode:n,proxy:s,withProxy:o,propsOptions:[r],slots:i,attrs:l,emit:a,render:d,renderCache:c,props:f,data:m,setupState:b,ctx:y,inheritAttrs:v}=e,h=lo(e);let k,R;try{if(n.shapeFlag&4){const C=o||s,L=C;k=$t(d.call(L,C,c,f,b,m,y)),R=l}else{const C=t;k=$t(C.length>1?C(f,{attrs:l,slots:i,emit:a}):C(f,null)),R=t.props?l:Jd(l)}}catch(C){ds.length=0,Eo(C,e,1),k=M(Qe)}let S=k;if(R&&v!==!1){const C=Object.keys(R),{shapeFlag:L}=S;C.length&&L&7&&(r&&C.some(qr)&&(R=Yd(R,r)),S=cn(S,R,!1,!0))}return n.dirs&&(S=cn(S,null,!1,!0),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&gs(S,n.transition),k=S,lo(h),k}const Jd=e=>{let t;for(const n in e)(n==="class"||n==="style"||bo(n))&&((t||(t={}))[n]=e[n]);return t},Yd=(e,t)=>{const n={};for(const s in e)(!qr(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Xd(e,t,n){const{props:s,children:o,component:r}=e,{props:i,children:l,patchFlag:a}=t,d=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return s?qi(s,i,d):!!i;if(a&8){const c=t.dynamicProps;for(let f=0;fObject.create(ac),uc=e=>Object.getPrototypeOf(e)===ac;function ef(e,t,n,s=!1){const o={},r=cc();e.propsDefaults=Object.create(null),dc(e,t,o,r);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=s?o:La(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function tf(e,t,n,s){const{props:o,attrs:r,vnode:{patchFlag:i}}=e,l=pe(o),[a]=e.propsOptions;let d=!1;if((s||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[m,b]=fc(f,t,!0);$e(i,m),b&&l.push(...b)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!r&&!a)return ge(e)&&s.set(e,Pn),Pn;if(X(r))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",li=e=>X(e)?e.map($t):[$t(e)],sf=(e,t,n)=>{if(t._n)return t;const s=ao((...o)=>li(t(...o)),n);return s._c=!1,s},pc=(e,t,n)=>{const s=e._ctx;for(const o in e){if(ii(o))continue;const r=e[o];if(oe(r))t[o]=sf(o,r,s);else if(r!=null){const i=li(r);t[o]=()=>i}}},hc=(e,t)=>{const n=li(t);e.slots.default=()=>n},mc=(e,t,n)=>{for(const s in t)(n||!ii(s))&&(e[s]=t[s])},of=(e,t,n)=>{const s=e.slots=cc();if(e.vnode.shapeFlag&32){const o=t._;o?(mc(s,t,n),n&&va(s,"_",o,!0)):pc(t,s)}else t&&hc(e,t)},rf=(e,t,n)=>{const{vnode:s,slots:o}=e;let r=!0,i=_e;if(s.shapeFlag&32){const l=t._;l?n&&l===1?r=!1:mc(o,t,n):(r=!t.$stable,pc(t,o)),i=t}else t&&(hc(e,t),i={default:1});if(r)for(const l in o)!ii(l)&&i[l]==null&&delete o[l]},Ze=df;function lf(e){return af(e)}function af(e,t){const n=ko();n.__VUE__=!0;const{insert:s,remove:o,patchProp:r,createElement:i,createText:l,createComment:a,setText:d,setElementText:c,parentNode:f,nextSibling:m,setScopeId:b=Lt,insertStaticContent:y}=e,v=(g,_,x,O=null,$=null,D=null,V=void 0,j=null,H=!!_.dynamicChildren)=>{if(g===_)return;g&&!bn(g,_)&&(O=N(g),Oe(g,$,D,!0),g=null),_.patchFlag===-2&&(H=!1,_.dynamicChildren=null);const{type:F,ref:Z,shapeFlag:z}=_;switch(F){case To:h(g,_,x,O);break;case Qe:k(g,_,x,O);break;case Gs:g==null&&R(_,x,O,V);break;case de:q(g,_,x,O,$,D,V,j,H);break;default:z&1?L(g,_,x,O,$,D,V,j,H):z&6?se(g,_,x,O,$,D,V,j,H):(z&64||z&128)&&F.process(g,_,x,O,$,D,V,j,H,J)}Z!=null&&$?as(Z,g&&g.ref,D,_||g,!_):Z==null&&g&&g.ref!=null&&as(g.ref,null,D,g,!0)},h=(g,_,x,O)=>{if(g==null)s(_.el=l(_.children),x,O);else{const $=_.el=g.el;_.children!==g.children&&d($,_.children)}},k=(g,_,x,O)=>{g==null?s(_.el=a(_.children||""),x,O):_.el=g.el},R=(g,_,x,O)=>{[g.el,g.anchor]=y(g.children,_,x,O,g.el,g.anchor)},S=({el:g,anchor:_},x,O)=>{let $;for(;g&&g!==_;)$=m(g),s(g,x,O),g=$;s(_,x,O)},C=({el:g,anchor:_})=>{let x;for(;g&&g!==_;)x=m(g),o(g),g=x;o(_)},L=(g,_,x,O,$,D,V,j,H)=>{if(_.type==="svg"?V="svg":_.type==="math"&&(V="mathml"),g==null)P(_,x,O,$,D,V,j,H);else{const F=g.el&&g.el._isVueCE?g.el:null;try{F&&F._beginPatch(),I(g,_,$,D,V,j,H)}finally{F&&F._endPatch()}}},P=(g,_,x,O,$,D,V,j)=>{let H,F;const{props:Z,shapeFlag:z,transition:Y,dirs:ne}=g;if(H=g.el=i(g.type,D,Z&&Z.is,Z),z&8?c(H,g.children):z&16&&ae(g.children,H,null,O,$,Xo(g,D),V,j),ne&&pn(g,null,O,"created"),U(H,g,g.scopeId,V,O),Z){for(const we in Z)we!=="value"&&!rs(we)&&r(H,we,null,Z[we],D,O);"value"in Z&&r(H,"value",null,Z.value,D),(F=Z.onVnodeBeforeMount)&&Ot(F,O,g)}ne&&pn(g,null,O,"beforeMount");const ue=cf($,Y);ue&&Y.beforeEnter(H),s(H,_,x),((F=Z&&Z.onVnodeMounted)||ue||ne)&&Ze(()=>{F&&Ot(F,O,g),ue&&Y.enter(H),ne&&pn(g,null,O,"mounted")},$)},U=(g,_,x,O,$)=>{if(x&&b(g,x),O)for(let D=0;D{for(let F=H;F{const j=_.el=g.el;let{patchFlag:H,dynamicChildren:F,dirs:Z}=_;H|=g.patchFlag&16;const z=g.props||_e,Y=_.props||_e;let ne;if(x&&hn(x,!1),(ne=Y.onVnodeBeforeUpdate)&&Ot(ne,x,_,g),Z&&pn(_,g,x,"beforeUpdate"),x&&hn(x,!0),(z.innerHTML&&Y.innerHTML==null||z.textContent&&Y.textContent==null)&&c(j,""),F?W(g.dynamicChildren,F,j,x,O,Xo(_,$),D):V||re(g,_,j,null,x,O,Xo(_,$),D,!1),H>0){if(H&16)B(j,z,Y,x,$);else if(H&2&&z.class!==Y.class&&r(j,"class",null,Y.class,$),H&4&&r(j,"style",z.style,Y.style,$),H&8){const ue=_.dynamicProps;for(let we=0;we{ne&&Ot(ne,x,_,g),Z&&pn(_,g,x,"updated")},O)},W=(g,_,x,O,$,D,V)=>{for(let j=0;j<_.length;j++){const H=g[j],F=_[j],Z=H.el&&(H.type===de||!bn(H,F)||H.shapeFlag&198)?f(H.el):x;v(H,F,Z,null,O,$,D,V,!0)}},B=(g,_,x,O,$)=>{if(_!==x){if(_!==_e)for(const D in _)!rs(D)&&!(D in x)&&r(g,D,_[D],null,$,O);for(const D in x){if(rs(D))continue;const V=x[D],j=_[D];V!==j&&D!=="value"&&r(g,D,j,V,$,O)}"value"in x&&r(g,"value",_.value,x.value,$)}},q=(g,_,x,O,$,D,V,j,H)=>{const F=_.el=g?g.el:l(""),Z=_.anchor=g?g.anchor:l("");let{patchFlag:z,dynamicChildren:Y,slotScopeIds:ne}=_;ne&&(j=j?j.concat(ne):ne),g==null?(s(F,x,O),s(Z,x,O),ae(_.children||[],x,Z,$,D,V,j,H)):z>0&&z&64&&Y&&g.dynamicChildren&&g.dynamicChildren.length===Y.length?(W(g.dynamicChildren,Y,x,$,D,V,j),(_.key!=null||$&&_===$.subTree)&&gc(g,_,!0)):re(g,_,x,Z,$,D,V,j,H)},se=(g,_,x,O,$,D,V,j,H)=>{_.slotScopeIds=j,g==null?_.shapeFlag&512?$.ctx.activate(_,x,O,V,H):xe(_,x,O,$,D,V,H):Me(g,_,H)},xe=(g,_,x,O,$,D,V)=>{const j=g.component=bf(g,O,$);if(Ao(g)&&(j.ctx.renderer=J),_f(j,!1,V),j.asyncDep){if($&&$.registerDep(j,le,V),!g.el){const H=j.subTree=M(Qe);k(null,H,_,x),g.placeholder=H.el}}else le(j,g,_,x,$,D,V)},Me=(g,_,x)=>{const O=_.component=g.component;if(Xd(g,_,x))if(O.asyncDep&&!O.asyncResolved){fe(O,_,x);return}else O.next=_,O.update();else _.el=g.el,O.vnode=_},le=(g,_,x,O,$,D,V)=>{const j=()=>{if(g.isMounted){let{next:z,bu:Y,u:ne,parent:ue,vnode:we}=g;{const Tt=yc(g);if(Tt){z&&(z.el=we.el,fe(g,z,V)),Tt.asyncDep.then(()=>{Ze(()=>{g.isUnmounted||F()},$)});return}}let ye=z,Ye;hn(g,!1),z?(z.el=we.el,fe(g,z,V)):z=we,Y&&zs(Y),(Ye=z.props&&z.props.onVnodeBeforeUpdate)&&Ot(Ye,ue,z,we),hn(g,!0);const Xe=ji(g),Ct=g.subTree;g.subTree=Xe,v(Ct,Xe,f(Ct.el),N(Ct),g,$,D),z.el=Xe.el,ye===null&&Zd(g,Xe.el),ne&&Ze(ne,$),(Ye=z.props&&z.props.onVnodeUpdated)&&Ze(()=>Ot(Ye,ue,z,we),$)}else{let z;const{el:Y,props:ne}=_,{bm:ue,m:we,parent:ye,root:Ye,type:Xe}=g,Ct=cs(_);hn(g,!1),ue&&zs(ue),!Ct&&(z=ne&&ne.onVnodeBeforeMount)&&Ot(z,ye,_),hn(g,!0);{Ye.ce&&Ye.ce._hasShadowRoot()&&Ye.ce._injectChildStyle(Xe);const Tt=g.subTree=ji(g);v(null,Tt,x,O,g,$,D),_.el=Tt.el}if(we&&Ze(we,$),!Ct&&(z=ne&&ne.onVnodeMounted)){const Tt=_;Ze(()=>Ot(z,ye,Tt),$)}(_.shapeFlag&256||ye&&cs(ye.vnode)&&ye.vnode.shapeFlag&256)&&g.a&&Ze(g.a,$),g.isMounted=!0,_=x=O=null}};g.scope.on();const H=g.effect=new wa(j);g.scope.off();const F=g.update=H.run.bind(H),Z=g.job=H.runIfDirty.bind(H);Z.i=g,Z.id=g.uid,H.scheduler=()=>ti(Z),hn(g,!0),F()},fe=(g,_,x)=>{_.component=g;const O=g.vnode.props;g.vnode=_,g.next=null,tf(g,_.props,O,x),rf(g,_.children,x),Qt(),Ni(g),Gt()},re=(g,_,x,O,$,D,V,j,H=!1)=>{const F=g&&g.children,Z=g?g.shapeFlag:0,z=_.children,{patchFlag:Y,shapeFlag:ne}=_;if(Y>0){if(Y&128){Et(F,z,x,O,$,D,V,j,H);return}else if(Y&256){ut(F,z,x,O,$,D,V,j,H);return}}ne&8?(Z&16&&dt(F,$,D),z!==F&&c(x,z)):Z&16?ne&16?Et(F,z,x,O,$,D,V,j,H):dt(F,$,D,!0):(Z&8&&c(x,""),ne&16&&ae(z,x,O,$,D,V,j,H))},ut=(g,_,x,O,$,D,V,j,H)=>{g=g||Pn,_=_||Pn;const F=g.length,Z=_.length,z=Math.min(F,Z);let Y;for(Y=0;YZ?dt(g,$,D,!0,!1,z):ae(_,x,O,$,D,V,j,H,z)},Et=(g,_,x,O,$,D,V,j,H)=>{let F=0;const Z=_.length;let z=g.length-1,Y=Z-1;for(;F<=z&&F<=Y;){const ne=g[F],ue=_[F]=H?qt(_[F]):$t(_[F]);if(bn(ne,ue))v(ne,ue,x,null,$,D,V,j,H);else break;F++}for(;F<=z&&F<=Y;){const ne=g[z],ue=_[Y]=H?qt(_[Y]):$t(_[Y]);if(bn(ne,ue))v(ne,ue,x,null,$,D,V,j,H);else break;z--,Y--}if(F>z){if(F<=Y){const ne=Y+1,ue=neY)for(;F<=z;)Oe(g[F],$,D,!0),F++;else{const ne=F,ue=F,we=new Map;for(F=ue;F<=Y;F++){const ot=_[F]=H?qt(_[F]):$t(_[F]);ot.key!=null&&we.set(ot.key,F)}let ye,Ye=0;const Xe=Y-ue+1;let Ct=!1,Tt=0;const Gn=new Array(Xe);for(F=0;F=Xe){Oe(ot,$,D,!0);continue}let Pt;if(ot.key!=null)Pt=we.get(ot.key);else for(ye=ue;ye<=Y;ye++)if(Gn[ye-ue]===0&&bn(ot,_[ye])){Pt=ye;break}Pt===void 0?Oe(ot,$,D,!0):(Gn[Pt-ue]=F+1,Pt>=Tt?Tt=Pt:Ct=!0,v(ot,_[Pt],x,null,$,D,V,j,H),Ye++)}const Ai=Ct?uf(Gn):Pn;for(ye=Ai.length-1,F=Xe-1;F>=0;F--){const ot=ue+F,Pt=_[ot],Ri=_[ot+1],Ci=ot+1{const{el:D,type:V,transition:j,children:H,shapeFlag:F}=g;if(F&6){De(g.component.subTree,_,x,O);return}if(F&128){g.suspense.move(_,x,O);return}if(F&64){V.move(g,_,x,J);return}if(V===de){s(D,_,x);for(let z=0;zj.enter(D),$);else{const{leave:z,delayLeave:Y,afterLeave:ne}=j,ue=()=>{g.ctx.isUnmounted?o(D):s(D,_,x)},we=()=>{D._isLeaving&&D[It](!0),z(D,()=>{ue(),ne&&ne()})};Y?Y(D,ue,we):we()}else s(D,_,x)},Oe=(g,_,x,O=!1,$=!1)=>{const{type:D,props:V,ref:j,children:H,dynamicChildren:F,shapeFlag:Z,patchFlag:z,dirs:Y,cacheIndex:ne}=g;if(z===-2&&($=!1),j!=null&&(Qt(),as(j,null,x,g,!0),Gt()),ne!=null&&(_.renderCache[ne]=void 0),Z&256){_.ctx.deactivate(g);return}const ue=Z&1&&Y,we=!cs(g);let ye;if(we&&(ye=V&&V.onVnodeBeforeUnmount)&&Ot(ye,_,g),Z&6)Rt(g.component,x,O);else{if(Z&128){g.suspense.unmount(x,O);return}ue&&pn(g,null,_,"beforeUnmount"),Z&64?g.type.remove(g,_,x,J,O):F&&!F.hasOnce&&(D!==de||z>0&&z&64)?dt(F,_,x,!1,!0):(D===de&&z&384||!$&&Z&16)&&dt(H,_,x),O&&At(g)}(we&&(ye=V&&V.onVnodeUnmounted)||ue)&&Ze(()=>{ye&&Ot(ye,_,g),ue&&pn(g,null,_,"unmounted")},x)},At=g=>{const{type:_,el:x,anchor:O,transition:$}=g;if(_===de){gt(x,O);return}if(_===Gs){C(g);return}const D=()=>{o(x),$&&!$.persisted&&$.afterLeave&&$.afterLeave()};if(g.shapeFlag&1&&$&&!$.persisted){const{leave:V,delayLeave:j}=$,H=()=>V(x,D);j?j(g.el,D,H):H()}else D()},gt=(g,_)=>{let x;for(;g!==_;)x=m(g),o(g),g=x;o(_)},Rt=(g,_,x)=>{const{bum:O,scope:$,job:D,subTree:V,um:j,m:H,a:F}=g;Wi(H),Wi(F),O&&zs(O),$.stop(),D&&(D.flags|=8,Oe(V,g,_,x)),j&&Ze(j,_),Ze(()=>{g.isUnmounted=!0},_)},dt=(g,_,x,O=!1,$=!1,D=0)=>{for(let V=D;V{if(g.shapeFlag&6)return N(g.component.subTree);if(g.shapeFlag&128)return g.suspense.next();const _=m(g.anchor||g.el),x=_&&_[Ed];return x?m(x):_};let Q=!1;const K=(g,_,x)=>{let O;g==null?_._vnode&&(Oe(_._vnode,null,null,!0),O=_._vnode.component):v(_._vnode||null,g,_,null,null,null,x),_._vnode=g,Q||(Q=!0,Ni(O),Ha(),Q=!1)},J={p:v,um:Oe,m:De,r:At,mt:xe,mc:ae,pc:re,pbc:W,n:N,o:e};return{render:K,hydrate:void 0,createApp:Kd(K)}}function Xo({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function hn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function cf(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function gc(e,t,n=!1){const s=e.children,o=t.children;if(X(s)&&X(o))for(let r=0;r>1,e[n[l]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,i=n[r-1];r-- >0;)n[r]=i,i=t[i];return n}function yc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:yc(t)}function Wi(e){if(e)for(let t=0;te.__isSuspense;function df(e,t){t&&t.pendingBranch?X(e)?t.effects.push(...e):t.effects.push(e):xd(e)}const de=Symbol.for("v-fgt"),To=Symbol.for("v-txt"),Qe=Symbol.for("v-cmt"),Gs=Symbol.for("v-stc"),ds=[];let at=null;function A(e=!1){ds.push(at=e?null:[])}function ff(){ds.pop(),at=ds[ds.length-1]||null}let ys=1;function fo(e,t=!1){ys+=e,e<0&&at&&t&&(at.hasOnce=!0)}function _c(e){return e.dynamicChildren=ys>0?at||Pn:null,ff(),ys>0&&at&&at.push(e),e}function T(e,t,n,s,o,r){return _c(p(e,t,n,s,o,r,!0))}function ct(e,t,n,s,o){return _c(M(e,t,n,s,o,!0))}function po(e){return e?e.__v_isVNode===!0:!1}function bn(e,t){return e.type===t.type&&e.key===t.key}const xc=({key:e})=>e??null,Js=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Te(e)||je(e)||oe(e)?{i:lt,r:e,k:t,f:!!n}:e:null);function p(e,t=null,n=null,s=0,o=null,r=e===de?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&xc(t),ref:t&&Js(t),scopeId:qa,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:lt};return l?(ai(a,n),r&128&&e.normalize(a)):n&&(a.shapeFlag|=Te(n)?8:16),ys>0&&!i&&at&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&at.push(a),a}const M=pf;function pf(e,t=null,n=null,s=0,o=null,r=!1){if((!e||e===tc)&&(e=Qe),po(e)){const l=cn(e,t,!0);return n&&ai(l,n),ys>0&&!r&&at&&(l.shapeFlag&6?at[at.indexOf(e)]=l:at.push(l)),l.patchFlag=-2,l}if(Ef(e)&&(e=e.__vccOpts),t){t=hf(t);let{class:l,style:a}=t;l&&!Te(l)&&(t.class=Ae(l)),ge(a)&&(Zr(a)&&!X(a)&&(a=$e({},a)),t.style=$n(a))}const i=Te(e)?1:bc(e)?128:Wa(e)?64:ge(e)?4:oe(e)?2:0;return p(e,t,n,s,o,i,r,!0)}function hf(e){return e?Zr(e)||uc(e)?$e({},e):e:null}function cn(e,t,n=!1,s=!1){const{props:o,ref:r,patchFlag:i,children:l,transition:a}=e,d=t?gf(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&xc(d),ref:t&&t.ref?n&&r?X(r)?r.concat(Js(t)):[r,Js(t)]:Js(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==de?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&cn(e.ssContent),ssFallback:e.ssFallback&&cn(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&s&&gs(c,a.clone(c)),c}function Re(e=" ",t=0){return M(To,null,e,t)}function mf(e,t){const n=M(Gs,null,e);return n.staticCount=t,n}function ie(e="",t=!1){return t?(A(),ct(Qe,null,e)):M(Qe,null,e)}function $t(e){return e==null||typeof e=="boolean"?M(Qe):X(e)?M(de,null,e.slice()):po(e)?qt(e):M(To,null,String(e))}function qt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:cn(e)}function ai(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(X(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),ai(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!uc(t)?t._ctx=lt:o===3&<&&(lt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else oe(t)?(t={default:t,_ctx:lt},n=32):(t=String(t),s&64?(n=16,t=[Re(t)]):n=8);e.children=t,e.shapeFlag|=n}function gf(...e){const t={};for(let n=0;nBe||lt;let ho,Ar;{const e=ko(),t=(n,s)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),r=>{o.length>1?o.forEach(i=>i(r)):o[0](r)}};ho=t("__VUE_INSTANCE_SETTERS__",n=>Be=n),Ar=t("__VUE_SSR_SETTERS__",n=>vs=n)}const Rs=e=>{const t=Be;return ho(e),e.scope.on(),()=>{e.scope.off(),ho(t)}},Ki=()=>{Be&&Be.scope.off(),ho(null)};function kc(e){return e.vnode.shapeFlag&4}let vs=!1;function _f(e,t=!1,n=!1){t&&Ar(t);const{props:s,children:o}=e.vnode,r=kc(e);ef(e,s,r,t),of(e,o,n||t);const i=r?xf(e,t):void 0;return t&&Ar(!1),i}function xf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ud);const{setup:s}=n;if(s){Qt();const o=e.setupContext=s.length>1?kf(e):null,r=Rs(e),i=As(s,e,0,[e.props,o]),l=ma(i);if(Gt(),r(),(l||e.sp)&&!cs(e)&&Ya(e),l){if(i.then(Ki,Ki),t)return i.then(a=>{zi(e,a)}).catch(a=>{Eo(a,e,0)});e.asyncDep=i}else zi(e,i)}else Sc(e)}function zi(e,t,n){oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ge(t)&&(e.setupState=Ma(t)),Sc(e)}function Sc(e,t,n){const s=e.type;e.render||(e.render=s.render||Lt);{const o=Rs(e);Qt();try{Bd(e)}finally{Gt(),o()}}}const wf={get(e,t){return Ue(e,"get",""),e[t]}};function kf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,wf),slots:e.slots,emit:e.emit,expose:t}}function Po(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ma(dd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in us)return us[n](e)},has(t,n){return n in t||n in us}})):e.proxy}function Sf(e,t=!0){return oe(e)?e.displayName||e.name:e.name||t&&e.__name}function Ef(e){return oe(e)&&"__vccOpts"in e}const ve=(e,t)=>gd(e,t,vs);function bs(e,t,n){try{fo(-1);const s=arguments.length;return s===2?ge(t)&&!X(t)?po(t)?M(e,null,[t]):M(e,t):M(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&po(n)&&(n=[n]),M(e,t,n))}finally{fo(1)}}const Af="3.5.28";/** +**/function As(e,t,n,s){try{return s?e(...s):e()}catch(o){Eo(o,t,n)}}function xt(e,t,n,s){if(oe(e)){const o=As(e,t,n,s);return o&&ma(o)&&o.catch(r=>{Eo(r,t,n)}),o}if(X(e)){const o=[];for(let r=0;r>>1,o=ze[s],r=ms(o);r=ms(n)?ze.push(e):ze.splice(_d(t),0,e),e.flags|=1,Ba()}}function Ba(){io||(io=Ua.then(ja))}function xd(e){X(e)?Dn.push(...e):on&&e.id===-1?on.splice(Cn+1,0,e):e.flags&1||(Dn.push(e),e.flags|=1),Ba()}function Ni(e,t,n=Nt+1){for(;nms(n)-ms(s));if(Dn.length=0,on){on.push(...t);return}for(on=t,Cn=0;Cne.id==null?e.flags&2?-1:1/0:e.id;function ja(e){try{for(Nt=0;Nt{s._d&&fo(-1);const r=lo(t);let i;try{i=e(...o)}finally{lo(r),s._d&&fo(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function Ee(e,t){if(lt===null)return e;const n=Po(lt),s=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&oe(t)?t.call(s&&s.proxy):t}}const wd=Symbol.for("v-scx"),kd=()=>bt(wd);function js(e,t){return ni(e,null,t)}function Ft(e,t,n){return ni(e,t,n)}function ni(e,t,n=xe){const{immediate:s,deep:o,flush:r,once:i}=n,l=$e({},n),a=t&&s||!t&&r!=="post";let d;if(vs){if(r==="sync"){const b=kd();d=b.__watcherHandles||(b.__watcherHandles=[])}else if(!a){const b=()=>{};return b.stop=Lt,b.resume=Lt,b.pause=Lt,b}}const c=Be;l.call=(b,y,v)=>xt(b,c,y,v);let f=!1;r==="post"?l.scheduler=b=>{Ze(b,c&&c.suspense)}:r!=="sync"&&(f=!0,l.scheduler=(b,y)=>{y?b():ti(b)}),l.augmentJob=b=>{t&&(b.flags|=4),f&&(b.flags|=2,c&&(b.id=c.uid,b.i=c))};const m=vd(e,t,l);return vs&&(d?d.push(m):a&&m()),m}function Sd(e,t,n){const s=this.proxy,o=Te(e)?e.includes(".")?Va(s,e):()=>s[e]:e.bind(s,s);let r;oe(t)?r=t:(r=t.handler,n=t);const i=Rs(this),l=ni(o,r.bind(s),n);return i(),l}function Va(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;oe.__isTeleport,It=Symbol("_leaveCb"),Yn=Symbol("_enterCb");function Ad(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Xt(()=>{e.isMounted=!0}),oi(()=>{e.isUnmounting=!0}),e}const ft=[Function,Array],Ka={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ft,onEnter:ft,onAfterEnter:ft,onEnterCancelled:ft,onBeforeLeave:ft,onLeave:ft,onAfterLeave:ft,onLeaveCancelled:ft,onBeforeAppear:ft,onAppear:ft,onAfterAppear:ft,onAppearCancelled:ft},za=e=>{const t=e.subTree;return t.component?za(t.component):t},Rd={name:"BaseTransition",props:Ka,setup(e,{slots:t}){const n=wc(),s=Ad();return()=>{const o=t.default&&Ja(t.default(),!0);if(!o||!o.length)return;const r=Qa(o),i=pe(e),{mode:l}=i;if(s.isLeaving)return Jo(r);const a=Ii(r);if(!a)return Jo(r);let d=_r(a,i,s,n,f=>d=f);a.type!==Qe&&gs(a,d);let c=n.subTree&&Ii(n.subTree);if(c&&c.type!==Qe&&!bn(c,a)&&za(n).type!==Qe){let f=_r(c,i,s,n);if(gs(c,f),l==="out-in"&&a.type!==Qe)return s.isLeaving=!0,f.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,c=void 0},Jo(r);l==="in-out"&&a.type!==Qe?f.delayLeave=(m,b,y)=>{const v=Ga(s,c);v[String(c.key)]=c,m[It]=()=>{b(),m[It]=void 0,delete d.delayedLeave,c=void 0},d.delayedLeave=()=>{y(),delete d.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return r}}};function Qa(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Qe){t=n;break}}return t}const Cd=Rd;function Ga(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function _r(e,t,n,s,o){const{appear:r,mode:i,persisted:l=!1,onBeforeEnter:a,onEnter:d,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:m,onLeave:b,onAfterLeave:y,onLeaveCancelled:v,onBeforeAppear:h,onAppear:k,onAfterAppear:R,onAppearCancelled:S}=t,C=String(e.key),L=Ga(n,e),P=(I,W)=>{I&&xt(I,s,9,W)},U=(I,W)=>{const B=W[1];P(I,W),X(I)?I.every(q=>q.length<=1)&&B():I.length<=1&&B()},ae={mode:i,persisted:l,beforeEnter(I){let W=a;if(!n.isMounted)if(r)W=h||a;else return;I[It]&&I[It](!0);const B=L[C];B&&bn(e,B)&&B.el[It]&&B.el[It](),P(W,[I])},enter(I){let W=d,B=c,q=f;if(!n.isMounted)if(r)W=k||d,B=R||c,q=S||f;else return;let se=!1;I[Yn]=Me=>{se||(se=!0,Me?P(q,[I]):P(B,[I]),ae.delayedLeave&&ae.delayedLeave(),I[Yn]=void 0)};const we=I[Yn].bind(null,!1);W?U(W,[I,we]):we()},leave(I,W){const B=String(e.key);if(I[Yn]&&I[Yn](!0),n.isUnmounting)return W();P(m,[I]);let q=!1;I[It]=we=>{q||(q=!0,W(),we?P(v,[I]):P(y,[I]),I[It]=void 0,L[B]===e&&delete L[B])};const se=I[It].bind(null,!1);L[B]=e,b?U(b,[I,se]):se()},clone(I){const W=_r(I,t,n,s,o);return o&&o(W),W}};return ae}function Jo(e){if(Ao(e))return e=cn(e),e.children=null,e}function Ii(e){if(!Ao(e))return Wa(e.type)&&e.children?Qa(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&oe(n.default))return n.default()}}function gs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,gs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ja(e,t=!1,n){let s=[],o=0;for(let r=0;r1)for(let r=0;ras(v,t&&(X(t)?t[h]:t),n,s,o));return}if(cs(s)&&!o){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&as(e,t,n,s.component.subTree);return}const r=s.shapeFlag&4?Po(s.component):s.el,i=o?null:r,{i:l,r:a}=e,d=t&&t.r,c=l.refs===xe?l.refs={}:l.refs,f=l.setupState,m=pe(f),b=f===xe?ha:v=>$i(c,v)?!1:me(m,v),y=(v,h)=>!(h&&$i(c,h));if(d!=null&&d!==a){if(Li(t),Te(d))c[d]=null,b(d)&&(f[d]=null);else if(je(d)){const v=t;y(d,v.k)&&(d.value=null),v.k&&(c[v.k]=null)}}if(oe(a))As(a,l,12,[i,c]);else{const v=Te(a),h=je(a);if(v||h){const k=()=>{if(e.f){const R=v?b(a)?f[a]:c[a]:y()||!e.k?a.value:c[e.k];if(o)X(R)&&Vr(R,r);else if(X(R))R.includes(r)||R.push(r);else if(v)c[a]=[r],b(a)&&(f[a]=c[a]);else{const S=[r];y(a,e.k)&&(a.value=S),e.k&&(c[e.k]=S)}}else v?(c[a]=i,b(a)&&(f[a]=i)):h&&(y(a,e.k)&&(a.value=i),e.k&&(c[e.k]=i))};if(i){const R=()=>{k(),co.delete(e)};R.id=-1,co.set(e,R),Ze(R,n)}else Li(e),k()}}}function Li(e){const t=co.get(e);t&&(t.flags|=8,co.delete(e))}ko().requestIdleCallback;ko().cancelIdleCallback;const cs=e=>!!e.type.__asyncLoader,Ao=e=>e.type.__isKeepAlive;function Td(e,t){Xa(e,"a",t)}function Pd(e,t){Xa(e,"da",t)}function Xa(e,t,n=Be){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ro(t,s,n),n){let o=n.parent;for(;o&&o.parent;)Ao(o.parent.vnode)&&Od(s,t,n,o),o=o.parent}}function Od(e,t,n,s){const o=Ro(t,e,s,!0);ri(()=>{Vr(s[t],o)},n)}function Ro(e,t,n=Be,s=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...i)=>{Qt();const l=Rs(n),a=xt(t,n,e,i);return l(),Gt(),a});return s?o.unshift(r):o.push(r),r}}const Yt=e=>(t,n=Be)=>{(!vs||e==="sp")&&Ro(e,(...s)=>t(...s),n)},Za=Yt("bm"),Xt=Yt("m"),Dd=Yt("bu"),Nd=Yt("u"),oi=Yt("bum"),ri=Yt("um"),Id=Yt("sp"),$d=Yt("rtg"),Ld=Yt("rtc");function Fd(e,t=Be){Ro("ec",e,t)}const ec="components";function xr(e,t){return nc(ec,e,!0,t)||e}const tc=Symbol.for("v-ndc");function Md(e){return Te(e)?nc(ec,e,!1)||e:e||tc}function nc(e,t,n=!0,s=!1){const o=lt||Be;if(o){const r=o.type;{const l=Sf(r,!1);if(l&&(l===t||l===mt(t)||l===xo(mt(t))))return r}const i=Fi(o[e]||r[e],t)||Fi(o.appContext[e],t);return!i&&s?r:i}}function Fi(e,t){return e&&(e[t]||e[mt(t)]||e[xo(mt(t))])}function Ie(e,t,n,s){let o;const r=n,i=X(e);if(i||Te(e)){const l=i&&kn(e);let a=!1,d=!1;l&&(a=!ht(e),d=Jt(e),e=So(e)),o=new Array(e.length);for(let c=0,f=e.length;ct(l,a,void 0,r));else{const l=Object.keys(e);o=new Array(l.length);for(let a=0,d=l.length;ae?kc(e)?Po(e):wr(e.parent):null,us=$e(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>wr(e.parent),$root:e=>wr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>oc(e),$forceUpdate:e=>e.f||(e.f=()=>{ti(e.update)}),$nextTick:e=>e.n||(e.n=ei.bind(e.proxy)),$watch:e=>Sd.bind(e)}),Yo=(e,t)=>e!==xe&&!e.__isScriptSetup&&me(e,t),Ud={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:o,props:r,accessCache:i,type:l,appContext:a}=e;if(t[0]!=="$"){const m=i[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return r[t]}else{if(Yo(s,t))return i[t]=1,s[t];if(o!==xe&&me(o,t))return i[t]=2,o[t];if(me(r,t))return i[t]=3,r[t];if(n!==xe&&me(n,t))return i[t]=4,n[t];kr&&(i[t]=0)}}const d=us[t];let c,f;if(d)return t==="$attrs"&&Ue(e.attrs,"get",""),d(e);if((c=l.__cssModules)&&(c=c[t]))return c;if(n!==xe&&me(n,t))return i[t]=4,n[t];if(f=a.config.globalProperties,me(f,t))return f[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:r}=e;return Yo(o,t)?(o[t]=n,!0):s!==xe&&me(s,t)?(s[t]=n,!0):me(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,props:r,type:i}},l){let a;return!!(n[l]||e!==xe&&l[0]!=="$"&&me(e,l)||Yo(t,l)||me(r,l)||me(s,l)||me(us,l)||me(o.config.globalProperties,l)||(a=i.__cssModules)&&a[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:me(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Mi(e){return X(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let kr=!0;function Bd(e){const t=oc(e),n=e.proxy,s=e.ctx;kr=!1,t.beforeCreate&&Ui(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:i,watch:l,provide:a,inject:d,created:c,beforeMount:f,mounted:m,beforeUpdate:b,updated:y,activated:v,deactivated:h,beforeDestroy:k,beforeUnmount:R,destroyed:S,unmounted:C,render:L,renderTracked:P,renderTriggered:U,errorCaptured:ae,serverPrefetch:I,expose:W,inheritAttrs:B,components:q,directives:se,filters:we}=t;if(d&&Hd(d,s,null),i)for(const fe in i){const re=i[fe];oe(re)&&(s[fe]=re.bind(n))}if(o){const fe=o.call(n,n);ge(fe)&&(e.data=Ln(fe))}if(kr=!0,r)for(const fe in r){const re=r[fe],ut=oe(re)?re.bind(n,n):oe(re.get)?re.get.bind(n,n):Lt,Et=!oe(re)&&oe(re.set)?re.set.bind(n):Lt,De=be({get:ut,set:Et});Object.defineProperty(s,fe,{enumerable:!0,configurable:!0,get:()=>De.value,set:Oe=>De.value=Oe})}if(l)for(const fe in l)sc(l[fe],s,n,fe);if(a){const fe=oe(a)?a.call(n):a;Reflect.ownKeys(fe).forEach(re=>{Qs(re,fe[re])})}c&&Ui(c,e,"c");function le(fe,re){X(re)?re.forEach(ut=>fe(ut.bind(n))):re&&fe(re.bind(n))}if(le(Za,f),le(Xt,m),le(Dd,b),le(Nd,y),le(Td,v),le(Pd,h),le(Fd,ae),le(Ld,P),le($d,U),le(oi,R),le(ri,C),le(Id,I),X(W))if(W.length){const fe=e.exposed||(e.exposed={});W.forEach(re=>{Object.defineProperty(fe,re,{get:()=>n[re],set:ut=>n[re]=ut,enumerable:!0})})}else e.exposed||(e.exposed={});L&&e.render===Lt&&(e.render=L),B!=null&&(e.inheritAttrs=B),q&&(e.components=q),se&&(e.directives=se),I&&Ya(e)}function Hd(e,t,n=Lt){X(e)&&(e=Sr(e));for(const s in e){const o=e[s];let r;ge(o)?"default"in o?r=bt(o.from||s,o.default,!0):r=bt(o.from||s):r=bt(o),je(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:i=>r.value=i}):t[s]=r}}function Ui(e,t,n){xt(X(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function sc(e,t,n,s){let o=s.includes(".")?Va(n,s):()=>n[s];if(Te(e)){const r=t[e];oe(r)&&Ft(o,r)}else if(oe(e))Ft(o,e.bind(n));else if(ge(e))if(X(e))e.forEach(r=>sc(r,t,n,s));else{const r=oe(e.handler)?e.handler.bind(n):t[e.handler];oe(r)&&Ft(o,r,e)}}function oc(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:i}}=e.appContext,l=r.get(t);let a;return l?a=l:!o.length&&!n&&!s?a=t:(a={},o.length&&o.forEach(d=>uo(a,d,i,!0)),uo(a,t,i)),ge(t)&&r.set(t,a),a}function uo(e,t,n,s=!1){const{mixins:o,extends:r}=t;r&&uo(e,r,n,!0),o&&o.forEach(i=>uo(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=jd[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const jd={data:Bi,props:Hi,emits:Hi,methods:os,computed:os,beforeCreate:Ve,created:Ve,beforeMount:Ve,mounted:Ve,beforeUpdate:Ve,updated:Ve,beforeDestroy:Ve,beforeUnmount:Ve,destroyed:Ve,unmounted:Ve,activated:Ve,deactivated:Ve,errorCaptured:Ve,serverPrefetch:Ve,components:os,directives:os,watch:Vd,provide:Bi,inject:qd};function Bi(e,t){return t?e?function(){return $e(oe(e)?e.call(this,this):e,oe(t)?t.call(this,this):t)}:t:e}function qd(e,t){return os(Sr(e),Sr(t))}function Sr(e){if(X(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${mt(t)}Modifiers`]||e[`${fn(t)}Modifiers`];function Qd(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||xe;let o=n;const r=t.startsWith("update:"),i=r&&zd(s,t.slice(7));i&&(i.trim&&(o=n.map(c=>Te(c)?c.trim():c)),i.number&&(o=n.map(wo)));let l,a=s[l=Wo(t)]||s[l=Wo(mt(t))];!a&&r&&(a=s[l=Wo(fn(t))]),a&&xt(a,e,6,o);const d=s[l+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xt(d,e,6,o)}}const Gd=new WeakMap;function ic(e,t,n=!1){const s=n?Gd:t.emitsCache,o=s.get(e);if(o!==void 0)return o;const r=e.emits;let i={},l=!1;if(!oe(e)){const a=d=>{const c=ic(d,t,!0);c&&(l=!0,$e(i,c))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!l?(ge(e)&&s.set(e,null),null):(X(r)?r.forEach(a=>i[a]=null):$e(i,r),ge(e)&&s.set(e,i),i)}function Co(e,t){return!e||!bo(t)?!1:(t=t.slice(2).replace(/Once$/,""),me(e,t[0].toLowerCase()+t.slice(1))||me(e,fn(t))||me(e,t))}function ji(e){const{type:t,vnode:n,proxy:s,withProxy:o,propsOptions:[r],slots:i,attrs:l,emit:a,render:d,renderCache:c,props:f,data:m,setupState:b,ctx:y,inheritAttrs:v}=e,h=lo(e);let k,R;try{if(n.shapeFlag&4){const C=o||s,L=C;k=$t(d.call(L,C,c,f,b,m,y)),R=l}else{const C=t;k=$t(C.length>1?C(f,{attrs:l,slots:i,emit:a}):C(f,null)),R=t.props?l:Jd(l)}}catch(C){ds.length=0,Eo(C,e,1),k=M(Qe)}let S=k;if(R&&v!==!1){const C=Object.keys(R),{shapeFlag:L}=S;C.length&&L&7&&(r&&C.some(qr)&&(R=Yd(R,r)),S=cn(S,R,!1,!0))}return n.dirs&&(S=cn(S,null,!1,!0),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&gs(S,n.transition),k=S,lo(h),k}const Jd=e=>{let t;for(const n in e)(n==="class"||n==="style"||bo(n))&&((t||(t={}))[n]=e[n]);return t},Yd=(e,t)=>{const n={};for(const s in e)(!qr(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Xd(e,t,n){const{props:s,children:o,component:r}=e,{props:i,children:l,patchFlag:a}=t,d=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return s?qi(s,i,d):!!i;if(a&8){const c=t.dynamicProps;for(let f=0;fObject.create(ac),uc=e=>Object.getPrototypeOf(e)===ac;function ef(e,t,n,s=!1){const o={},r=cc();e.propsDefaults=Object.create(null),dc(e,t,o,r);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=s?o:La(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function tf(e,t,n,s){const{props:o,attrs:r,vnode:{patchFlag:i}}=e,l=pe(o),[a]=e.propsOptions;let d=!1;if((s||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[m,b]=fc(f,t,!0);$e(i,m),b&&l.push(...b)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!r&&!a)return ge(e)&&s.set(e,Pn),Pn;if(X(r))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",li=e=>X(e)?e.map($t):[$t(e)],sf=(e,t,n)=>{if(t._n)return t;const s=ao((...o)=>li(t(...o)),n);return s._c=!1,s},pc=(e,t,n)=>{const s=e._ctx;for(const o in e){if(ii(o))continue;const r=e[o];if(oe(r))t[o]=sf(o,r,s);else if(r!=null){const i=li(r);t[o]=()=>i}}},hc=(e,t)=>{const n=li(t);e.slots.default=()=>n},mc=(e,t,n)=>{for(const s in t)(n||!ii(s))&&(e[s]=t[s])},of=(e,t,n)=>{const s=e.slots=cc();if(e.vnode.shapeFlag&32){const o=t._;o?(mc(s,t,n),n&&va(s,"_",o,!0)):pc(t,s)}else t&&hc(e,t)},rf=(e,t,n)=>{const{vnode:s,slots:o}=e;let r=!0,i=xe;if(s.shapeFlag&32){const l=t._;l?n&&l===1?r=!1:mc(o,t,n):(r=!t.$stable,pc(t,o)),i=t}else t&&(hc(e,t),i={default:1});if(r)for(const l in o)!ii(l)&&i[l]==null&&delete o[l]},Ze=df;function lf(e){return af(e)}function af(e,t){const n=ko();n.__VUE__=!0;const{insert:s,remove:o,patchProp:r,createElement:i,createText:l,createComment:a,setText:d,setElementText:c,parentNode:f,nextSibling:m,setScopeId:b=Lt,insertStaticContent:y}=e,v=(g,_,x,O=null,$=null,D=null,V=void 0,j=null,H=!!_.dynamicChildren)=>{if(g===_)return;g&&!bn(g,_)&&(O=N(g),Oe(g,$,D,!0),g=null),_.patchFlag===-2&&(H=!1,_.dynamicChildren=null);const{type:F,ref:Z,shapeFlag:z}=_;switch(F){case To:h(g,_,x,O);break;case Qe:k(g,_,x,O);break;case Gs:g==null&&R(_,x,O,V);break;case de:q(g,_,x,O,$,D,V,j,H);break;default:z&1?L(g,_,x,O,$,D,V,j,H):z&6?se(g,_,x,O,$,D,V,j,H):(z&64||z&128)&&F.process(g,_,x,O,$,D,V,j,H,J)}Z!=null&&$?as(Z,g&&g.ref,D,_||g,!_):Z==null&&g&&g.ref!=null&&as(g.ref,null,D,g,!0)},h=(g,_,x,O)=>{if(g==null)s(_.el=l(_.children),x,O);else{const $=_.el=g.el;_.children!==g.children&&d($,_.children)}},k=(g,_,x,O)=>{g==null?s(_.el=a(_.children||""),x,O):_.el=g.el},R=(g,_,x,O)=>{[g.el,g.anchor]=y(g.children,_,x,O,g.el,g.anchor)},S=({el:g,anchor:_},x,O)=>{let $;for(;g&&g!==_;)$=m(g),s(g,x,O),g=$;s(_,x,O)},C=({el:g,anchor:_})=>{let x;for(;g&&g!==_;)x=m(g),o(g),g=x;o(_)},L=(g,_,x,O,$,D,V,j,H)=>{if(_.type==="svg"?V="svg":_.type==="math"&&(V="mathml"),g==null)P(_,x,O,$,D,V,j,H);else{const F=g.el&&g.el._isVueCE?g.el:null;try{F&&F._beginPatch(),I(g,_,$,D,V,j,H)}finally{F&&F._endPatch()}}},P=(g,_,x,O,$,D,V,j)=>{let H,F;const{props:Z,shapeFlag:z,transition:Y,dirs:ne}=g;if(H=g.el=i(g.type,D,Z&&Z.is,Z),z&8?c(H,g.children):z&16&&ae(g.children,H,null,O,$,Xo(g,D),V,j),ne&&pn(g,null,O,"created"),U(H,g,g.scopeId,V,O),Z){for(const ke in Z)ke!=="value"&&!rs(ke)&&r(H,ke,null,Z[ke],D,O);"value"in Z&&r(H,"value",null,Z.value,D),(F=Z.onVnodeBeforeMount)&&Ot(F,O,g)}ne&&pn(g,null,O,"beforeMount");const ue=cf($,Y);ue&&Y.beforeEnter(H),s(H,_,x),((F=Z&&Z.onVnodeMounted)||ue||ne)&&Ze(()=>{F&&Ot(F,O,g),ue&&Y.enter(H),ne&&pn(g,null,O,"mounted")},$)},U=(g,_,x,O,$)=>{if(x&&b(g,x),O)for(let D=0;D{for(let F=H;F{const j=_.el=g.el;let{patchFlag:H,dynamicChildren:F,dirs:Z}=_;H|=g.patchFlag&16;const z=g.props||xe,Y=_.props||xe;let ne;if(x&&hn(x,!1),(ne=Y.onVnodeBeforeUpdate)&&Ot(ne,x,_,g),Z&&pn(_,g,x,"beforeUpdate"),x&&hn(x,!0),(z.innerHTML&&Y.innerHTML==null||z.textContent&&Y.textContent==null)&&c(j,""),F?W(g.dynamicChildren,F,j,x,O,Xo(_,$),D):V||re(g,_,j,null,x,O,Xo(_,$),D,!1),H>0){if(H&16)B(j,z,Y,x,$);else if(H&2&&z.class!==Y.class&&r(j,"class",null,Y.class,$),H&4&&r(j,"style",z.style,Y.style,$),H&8){const ue=_.dynamicProps;for(let ke=0;ke{ne&&Ot(ne,x,_,g),Z&&pn(_,g,x,"updated")},O)},W=(g,_,x,O,$,D,V)=>{for(let j=0;j<_.length;j++){const H=g[j],F=_[j],Z=H.el&&(H.type===de||!bn(H,F)||H.shapeFlag&198)?f(H.el):x;v(H,F,Z,null,O,$,D,V,!0)}},B=(g,_,x,O,$)=>{if(_!==x){if(_!==xe)for(const D in _)!rs(D)&&!(D in x)&&r(g,D,_[D],null,$,O);for(const D in x){if(rs(D))continue;const V=x[D],j=_[D];V!==j&&D!=="value"&&r(g,D,j,V,$,O)}"value"in x&&r(g,"value",_.value,x.value,$)}},q=(g,_,x,O,$,D,V,j,H)=>{const F=_.el=g?g.el:l(""),Z=_.anchor=g?g.anchor:l("");let{patchFlag:z,dynamicChildren:Y,slotScopeIds:ne}=_;ne&&(j=j?j.concat(ne):ne),g==null?(s(F,x,O),s(Z,x,O),ae(_.children||[],x,Z,$,D,V,j,H)):z>0&&z&64&&Y&&g.dynamicChildren&&g.dynamicChildren.length===Y.length?(W(g.dynamicChildren,Y,x,$,D,V,j),(_.key!=null||$&&_===$.subTree)&&gc(g,_,!0)):re(g,_,x,Z,$,D,V,j,H)},se=(g,_,x,O,$,D,V,j,H)=>{_.slotScopeIds=j,g==null?_.shapeFlag&512?$.ctx.activate(_,x,O,V,H):we(_,x,O,$,D,V,H):Me(g,_,H)},we=(g,_,x,O,$,D,V)=>{const j=g.component=bf(g,O,$);if(Ao(g)&&(j.ctx.renderer=J),_f(j,!1,V),j.asyncDep){if($&&$.registerDep(j,le,V),!g.el){const H=j.subTree=M(Qe);k(null,H,_,x),g.placeholder=H.el}}else le(j,g,_,x,$,D,V)},Me=(g,_,x)=>{const O=_.component=g.component;if(Xd(g,_,x))if(O.asyncDep&&!O.asyncResolved){fe(O,_,x);return}else O.next=_,O.update();else _.el=g.el,O.vnode=_},le=(g,_,x,O,$,D,V)=>{const j=()=>{if(g.isMounted){let{next:z,bu:Y,u:ne,parent:ue,vnode:ke}=g;{const Tt=yc(g);if(Tt){z&&(z.el=ke.el,fe(g,z,V)),Tt.asyncDep.then(()=>{Ze(()=>{g.isUnmounted||F()},$)});return}}let ye=z,Ye;hn(g,!1),z?(z.el=ke.el,fe(g,z,V)):z=ke,Y&&zs(Y),(Ye=z.props&&z.props.onVnodeBeforeUpdate)&&Ot(Ye,ue,z,ke),hn(g,!0);const Xe=ji(g),Ct=g.subTree;g.subTree=Xe,v(Ct,Xe,f(Ct.el),N(Ct),g,$,D),z.el=Xe.el,ye===null&&Zd(g,Xe.el),ne&&Ze(ne,$),(Ye=z.props&&z.props.onVnodeUpdated)&&Ze(()=>Ot(Ye,ue,z,ke),$)}else{let z;const{el:Y,props:ne}=_,{bm:ue,m:ke,parent:ye,root:Ye,type:Xe}=g,Ct=cs(_);hn(g,!1),ue&&zs(ue),!Ct&&(z=ne&&ne.onVnodeBeforeMount)&&Ot(z,ye,_),hn(g,!0);{Ye.ce&&Ye.ce._hasShadowRoot()&&Ye.ce._injectChildStyle(Xe);const Tt=g.subTree=ji(g);v(null,Tt,x,O,g,$,D),_.el=Tt.el}if(ke&&Ze(ke,$),!Ct&&(z=ne&&ne.onVnodeMounted)){const Tt=_;Ze(()=>Ot(z,ye,Tt),$)}(_.shapeFlag&256||ye&&cs(ye.vnode)&&ye.vnode.shapeFlag&256)&&g.a&&Ze(g.a,$),g.isMounted=!0,_=x=O=null}};g.scope.on();const H=g.effect=new wa(j);g.scope.off();const F=g.update=H.run.bind(H),Z=g.job=H.runIfDirty.bind(H);Z.i=g,Z.id=g.uid,H.scheduler=()=>ti(Z),hn(g,!0),F()},fe=(g,_,x)=>{_.component=g;const O=g.vnode.props;g.vnode=_,g.next=null,tf(g,_.props,O,x),rf(g,_.children,x),Qt(),Ni(g),Gt()},re=(g,_,x,O,$,D,V,j,H=!1)=>{const F=g&&g.children,Z=g?g.shapeFlag:0,z=_.children,{patchFlag:Y,shapeFlag:ne}=_;if(Y>0){if(Y&128){Et(F,z,x,O,$,D,V,j,H);return}else if(Y&256){ut(F,z,x,O,$,D,V,j,H);return}}ne&8?(Z&16&&dt(F,$,D),z!==F&&c(x,z)):Z&16?ne&16?Et(F,z,x,O,$,D,V,j,H):dt(F,$,D,!0):(Z&8&&c(x,""),ne&16&&ae(z,x,O,$,D,V,j,H))},ut=(g,_,x,O,$,D,V,j,H)=>{g=g||Pn,_=_||Pn;const F=g.length,Z=_.length,z=Math.min(F,Z);let Y;for(Y=0;YZ?dt(g,$,D,!0,!1,z):ae(_,x,O,$,D,V,j,H,z)},Et=(g,_,x,O,$,D,V,j,H)=>{let F=0;const Z=_.length;let z=g.length-1,Y=Z-1;for(;F<=z&&F<=Y;){const ne=g[F],ue=_[F]=H?qt(_[F]):$t(_[F]);if(bn(ne,ue))v(ne,ue,x,null,$,D,V,j,H);else break;F++}for(;F<=z&&F<=Y;){const ne=g[z],ue=_[Y]=H?qt(_[Y]):$t(_[Y]);if(bn(ne,ue))v(ne,ue,x,null,$,D,V,j,H);else break;z--,Y--}if(F>z){if(F<=Y){const ne=Y+1,ue=neY)for(;F<=z;)Oe(g[F],$,D,!0),F++;else{const ne=F,ue=F,ke=new Map;for(F=ue;F<=Y;F++){const ot=_[F]=H?qt(_[F]):$t(_[F]);ot.key!=null&&ke.set(ot.key,F)}let ye,Ye=0;const Xe=Y-ue+1;let Ct=!1,Tt=0;const Gn=new Array(Xe);for(F=0;F=Xe){Oe(ot,$,D,!0);continue}let Pt;if(ot.key!=null)Pt=ke.get(ot.key);else for(ye=ue;ye<=Y;ye++)if(Gn[ye-ue]===0&&bn(ot,_[ye])){Pt=ye;break}Pt===void 0?Oe(ot,$,D,!0):(Gn[Pt-ue]=F+1,Pt>=Tt?Tt=Pt:Ct=!0,v(ot,_[Pt],x,null,$,D,V,j,H),Ye++)}const Ai=Ct?uf(Gn):Pn;for(ye=Ai.length-1,F=Xe-1;F>=0;F--){const ot=ue+F,Pt=_[ot],Ri=_[ot+1],Ci=ot+1{const{el:D,type:V,transition:j,children:H,shapeFlag:F}=g;if(F&6){De(g.component.subTree,_,x,O);return}if(F&128){g.suspense.move(_,x,O);return}if(F&64){V.move(g,_,x,J);return}if(V===de){s(D,_,x);for(let z=0;zj.enter(D),$);else{const{leave:z,delayLeave:Y,afterLeave:ne}=j,ue=()=>{g.ctx.isUnmounted?o(D):s(D,_,x)},ke=()=>{D._isLeaving&&D[It](!0),z(D,()=>{ue(),ne&&ne()})};Y?Y(D,ue,ke):ke()}else s(D,_,x)},Oe=(g,_,x,O=!1,$=!1)=>{const{type:D,props:V,ref:j,children:H,dynamicChildren:F,shapeFlag:Z,patchFlag:z,dirs:Y,cacheIndex:ne}=g;if(z===-2&&($=!1),j!=null&&(Qt(),as(j,null,x,g,!0),Gt()),ne!=null&&(_.renderCache[ne]=void 0),Z&256){_.ctx.deactivate(g);return}const ue=Z&1&&Y,ke=!cs(g);let ye;if(ke&&(ye=V&&V.onVnodeBeforeUnmount)&&Ot(ye,_,g),Z&6)Rt(g.component,x,O);else{if(Z&128){g.suspense.unmount(x,O);return}ue&&pn(g,null,_,"beforeUnmount"),Z&64?g.type.remove(g,_,x,J,O):F&&!F.hasOnce&&(D!==de||z>0&&z&64)?dt(F,_,x,!1,!0):(D===de&&z&384||!$&&Z&16)&&dt(H,_,x),O&&At(g)}(ke&&(ye=V&&V.onVnodeUnmounted)||ue)&&Ze(()=>{ye&&Ot(ye,_,g),ue&&pn(g,null,_,"unmounted")},x)},At=g=>{const{type:_,el:x,anchor:O,transition:$}=g;if(_===de){gt(x,O);return}if(_===Gs){C(g);return}const D=()=>{o(x),$&&!$.persisted&&$.afterLeave&&$.afterLeave()};if(g.shapeFlag&1&&$&&!$.persisted){const{leave:V,delayLeave:j}=$,H=()=>V(x,D);j?j(g.el,D,H):H()}else D()},gt=(g,_)=>{let x;for(;g!==_;)x=m(g),o(g),g=x;o(_)},Rt=(g,_,x)=>{const{bum:O,scope:$,job:D,subTree:V,um:j,m:H,a:F}=g;Wi(H),Wi(F),O&&zs(O),$.stop(),D&&(D.flags|=8,Oe(V,g,_,x)),j&&Ze(j,_),Ze(()=>{g.isUnmounted=!0},_)},dt=(g,_,x,O=!1,$=!1,D=0)=>{for(let V=D;V{if(g.shapeFlag&6)return N(g.component.subTree);if(g.shapeFlag&128)return g.suspense.next();const _=m(g.anchor||g.el),x=_&&_[Ed];return x?m(x):_};let Q=!1;const K=(g,_,x)=>{let O;g==null?_._vnode&&(Oe(_._vnode,null,null,!0),O=_._vnode.component):v(_._vnode||null,g,_,null,null,null,x),_._vnode=g,Q||(Q=!0,Ni(O),Ha(),Q=!1)},J={p:v,um:Oe,m:De,r:At,mt:we,mc:ae,pc:re,pbc:W,n:N,o:e};return{render:K,hydrate:void 0,createApp:Kd(K)}}function Xo({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function hn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function cf(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function gc(e,t,n=!1){const s=e.children,o=t.children;if(X(s)&&X(o))for(let r=0;r>1,e[n[l]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,i=n[r-1];r-- >0;)n[r]=i,i=t[i];return n}function yc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:yc(t)}function Wi(e){if(e)for(let t=0;te.__isSuspense;function df(e,t){t&&t.pendingBranch?X(e)?t.effects.push(...e):t.effects.push(e):xd(e)}const de=Symbol.for("v-fgt"),To=Symbol.for("v-txt"),Qe=Symbol.for("v-cmt"),Gs=Symbol.for("v-stc"),ds=[];let at=null;function A(e=!1){ds.push(at=e?null:[])}function ff(){ds.pop(),at=ds[ds.length-1]||null}let ys=1;function fo(e,t=!1){ys+=e,e<0&&at&&t&&(at.hasOnce=!0)}function _c(e){return e.dynamicChildren=ys>0?at||Pn:null,ff(),ys>0&&at&&at.push(e),e}function T(e,t,n,s,o,r){return _c(p(e,t,n,s,o,r,!0))}function ct(e,t,n,s,o){return _c(M(e,t,n,s,o,!0))}function po(e){return e?e.__v_isVNode===!0:!1}function bn(e,t){return e.type===t.type&&e.key===t.key}const xc=({key:e})=>e??null,Js=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Te(e)||je(e)||oe(e)?{i:lt,r:e,k:t,f:!!n}:e:null);function p(e,t=null,n=null,s=0,o=null,r=e===de?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&xc(t),ref:t&&Js(t),scopeId:qa,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:lt};return l?(ai(a,n),r&128&&e.normalize(a)):n&&(a.shapeFlag|=Te(n)?8:16),ys>0&&!i&&at&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&at.push(a),a}const M=pf;function pf(e,t=null,n=null,s=0,o=null,r=!1){if((!e||e===tc)&&(e=Qe),po(e)){const l=cn(e,t,!0);return n&&ai(l,n),ys>0&&!r&&at&&(l.shapeFlag&6?at[at.indexOf(e)]=l:at.push(l)),l.patchFlag=-2,l}if(Ef(e)&&(e=e.__vccOpts),t){t=hf(t);let{class:l,style:a}=t;l&&!Te(l)&&(t.class=Ae(l)),ge(a)&&(Zr(a)&&!X(a)&&(a=$e({},a)),t.style=$n(a))}const i=Te(e)?1:bc(e)?128:Wa(e)?64:ge(e)?4:oe(e)?2:0;return p(e,t,n,s,o,i,r,!0)}function hf(e){return e?Zr(e)||uc(e)?$e({},e):e:null}function cn(e,t,n=!1,s=!1){const{props:o,ref:r,patchFlag:i,children:l,transition:a}=e,d=t?gf(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&xc(d),ref:t&&t.ref?n&&r?X(r)?r.concat(Js(t)):[r,Js(t)]:Js(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==de?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&cn(e.ssContent),ssFallback:e.ssFallback&&cn(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&s&&gs(c,a.clone(c)),c}function Re(e=" ",t=0){return M(To,null,e,t)}function mf(e,t){const n=M(Gs,null,e);return n.staticCount=t,n}function ie(e="",t=!1){return t?(A(),ct(Qe,null,e)):M(Qe,null,e)}function $t(e){return e==null||typeof e=="boolean"?M(Qe):X(e)?M(de,null,e.slice()):po(e)?qt(e):M(To,null,String(e))}function qt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:cn(e)}function ai(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(X(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),ai(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!uc(t)?t._ctx=lt:o===3&<&&(lt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else oe(t)?(t={default:t,_ctx:lt},n=32):(t=String(t),s&64?(n=16,t=[Re(t)]):n=8);e.children=t,e.shapeFlag|=n}function gf(...e){const t={};for(let n=0;nBe||lt;let ho,Ar;{const e=ko(),t=(n,s)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),r=>{o.length>1?o.forEach(i=>i(r)):o[0](r)}};ho=t("__VUE_INSTANCE_SETTERS__",n=>Be=n),Ar=t("__VUE_SSR_SETTERS__",n=>vs=n)}const Rs=e=>{const t=Be;return ho(e),e.scope.on(),()=>{e.scope.off(),ho(t)}},Ki=()=>{Be&&Be.scope.off(),ho(null)};function kc(e){return e.vnode.shapeFlag&4}let vs=!1;function _f(e,t=!1,n=!1){t&&Ar(t);const{props:s,children:o}=e.vnode,r=kc(e);ef(e,s,r,t),of(e,o,n||t);const i=r?xf(e,t):void 0;return t&&Ar(!1),i}function xf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ud);const{setup:s}=n;if(s){Qt();const o=e.setupContext=s.length>1?kf(e):null,r=Rs(e),i=As(s,e,0,[e.props,o]),l=ma(i);if(Gt(),r(),(l||e.sp)&&!cs(e)&&Ya(e),l){if(i.then(Ki,Ki),t)return i.then(a=>{zi(e,a)}).catch(a=>{Eo(a,e,0)});e.asyncDep=i}else zi(e,i)}else Sc(e)}function zi(e,t,n){oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ge(t)&&(e.setupState=Ma(t)),Sc(e)}function Sc(e,t,n){const s=e.type;e.render||(e.render=s.render||Lt);{const o=Rs(e);Qt();try{Bd(e)}finally{Gt(),o()}}}const wf={get(e,t){return Ue(e,"get",""),e[t]}};function kf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,wf),slots:e.slots,emit:e.emit,expose:t}}function Po(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ma(dd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in us)return us[n](e)},has(t,n){return n in t||n in us}})):e.proxy}function Sf(e,t=!0){return oe(e)?e.displayName||e.name:e.name||t&&e.__name}function Ef(e){return oe(e)&&"__vccOpts"in e}const be=(e,t)=>gd(e,t,vs);function bs(e,t,n){try{fo(-1);const s=arguments.length;return s===2?ge(t)&&!X(t)?po(t)?M(e,null,[t]):M(e,t):M(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&po(n)&&(n=[n]),M(e,t,n))}finally{fo(1)}}const Af="3.5.28";/** * @vue/runtime-dom v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let Rr;const Qi=typeof window<"u"&&window.trustedTypes;if(Qi)try{Rr=Qi.createPolicy("vue",{createHTML:e=>e})}catch{}const Ec=Rr?e=>Rr.createHTML(e):e=>e,Rf="http://www.w3.org/2000/svg",Cf="http://www.w3.org/1998/Math/MathML",jt=typeof document<"u"?document:null,Gi=jt&&jt.createElement("template"),Tf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?jt.createElementNS(Rf,e):t==="mathml"?jt.createElementNS(Cf,e):n?jt.createElement(e,{is:n}):jt.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>jt.createTextNode(e),createComment:e=>jt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>jt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,r){const i=n?n.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===r||!(o=o.nextSibling)););else{Gi.innerHTML=Ec(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Gi.content;if(s==="svg"||s==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Zt="transition",Xn="animation",_s=Symbol("_vtc"),Ac={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Pf=$e({},Ka,Ac),Of=e=>(e.displayName="Transition",e.props=Pf,e),Rc=Of((e,{slots:t})=>bs(Cd,Df(e),t)),mn=(e,t=[])=>{X(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ji=e=>e?X(e)?e.some(t=>t.length>1):e.length>1:!1;function Df(e){const t={};for(const q in e)q in Ac||(t[q]=e[q]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=r,appearActiveClass:d=i,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:b=`${n}-leave-to`}=e,y=Nf(o),v=y&&y[0],h=y&&y[1],{onBeforeEnter:k,onEnter:R,onEnterCancelled:S,onLeave:C,onLeaveCancelled:L,onBeforeAppear:P=k,onAppear:U=R,onAppearCancelled:ae=S}=t,I=(q,se,xe,Me)=>{q._enterCancelled=Me,gn(q,se?c:l),gn(q,se?d:i),xe&&xe()},W=(q,se)=>{q._isLeaving=!1,gn(q,f),gn(q,b),gn(q,m),se&&se()},B=q=>(se,xe)=>{const Me=q?U:R,le=()=>I(se,q,xe);mn(Me,[se,le]),Yi(()=>{gn(se,q?a:r),Bt(se,q?c:l),Ji(Me)||Xi(se,s,v,le)})};return $e(t,{onBeforeEnter(q){mn(k,[q]),Bt(q,r),Bt(q,i)},onBeforeAppear(q){mn(P,[q]),Bt(q,a),Bt(q,d)},onEnter:B(!1),onAppear:B(!0),onLeave(q,se){q._isLeaving=!0;const xe=()=>W(q,se);Bt(q,f),q._enterCancelled?(Bt(q,m),tl(q)):(tl(q),Bt(q,m)),Yi(()=>{q._isLeaving&&(gn(q,f),Bt(q,b),Ji(C)||Xi(q,s,h,xe))}),mn(C,[q,xe])},onEnterCancelled(q){I(q,!1,void 0,!0),mn(S,[q])},onAppearCancelled(q){I(q,!0,void 0,!0),mn(ae,[q])},onLeaveCancelled(q){W(q),mn(L,[q])}})}function Nf(e){if(e==null)return null;if(ge(e))return[Zo(e.enter),Zo(e.leave)];{const t=Zo(e);return[t,t]}}function Zo(e){return Fu(e)}function Bt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[_s]||(e[_s]=new Set)).add(t)}function gn(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[_s];n&&(n.delete(t),n.size||(e[_s]=void 0))}function Yi(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let If=0;function Xi(e,t,n,s){const o=e._endId=++If,r=()=>{o===e._endId&&s()};if(n!=null)return setTimeout(r,n);const{type:i,timeout:l,propCount:a}=$f(e,t);if(!i)return s();const d=i+"end";let c=0;const f=()=>{e.removeEventListener(d,m),r()},m=b=>{b.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[y]||"").split(", "),o=s(`${Zt}Delay`),r=s(`${Zt}Duration`),i=Zi(o,r),l=s(`${Xn}Delay`),a=s(`${Xn}Duration`),d=Zi(l,a);let c=null,f=0,m=0;t===Zt?i>0&&(c=Zt,f=i,m=r.length):t===Xn?d>0&&(c=Xn,f=d,m=a.length):(f=Math.max(i,d),c=f>0?i>d?Zt:Xn:null,m=c?c===Zt?r.length:a.length:0);const b=c===Zt&&/\b(?:transform|all)(?:,|$)/.test(s(`${Zt}Property`).toString());return{type:c,timeout:f,propCount:m,hasTransform:b}}function Zi(e,t){for(;e.lengthel(n)+el(e[s])))}function el(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function tl(e){return(e?e.ownerDocument:document).body.offsetHeight}function Lf(e,t,n){const s=e[_s];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const nl=Symbol("_vod"),Ff=Symbol("_vsh"),Mf=Symbol(""),Uf=/(?:^|;)\s*display\s*:/;function Bf(e,t,n){const s=e.style,o=Te(n);let r=!1;if(n&&!o){if(t)if(Te(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Ys(s,l,"")}else for(const i in t)n[i]==null&&Ys(s,i,"");for(const i in n)i==="display"&&(r=!0),Ys(s,i,n[i])}else if(o){if(t!==n){const i=s[Mf];i&&(n+=";"+i),s.cssText=n,r=Uf.test(n)}}else t&&e.removeAttribute("style");nl in e&&(e[nl]=r?s.display:"",e[Ff]&&(s.display="none"))}const sl=/\s*!important$/;function Ys(e,t,n){if(X(n))n.forEach(s=>Ys(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Hf(e,t);sl.test(n)?e.setProperty(fn(s),n.replace(sl,""),"important"):e[s]=n}}const ol=["Webkit","Moz","ms"],er={};function Hf(e,t){const n=er[t];if(n)return n;let s=mt(t);if(s!=="filter"&&s in e)return er[t]=s;s=xo(s);for(let o=0;otr||(Wf.then(()=>tr=0),tr=Date.now());function zf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;xt(Qf(s,n.value),t,5,[s])};return n.value=e,n.attached=Kf(),n}function Qf(e,t){if(X(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const ul=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Gf=(e,t,n,s,o,r)=>{const i=o==="svg";t==="class"?Lf(e,s,i):t==="style"?Bf(e,n,s):bo(t)?qr(t)||qf(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Jf(e,t,s,i))?(ll(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&il(e,t,s,i,r,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Te(s))?ll(e,mt(t),s,r,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),il(e,t,s,i))};function Jf(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ul(t)&&oe(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ul(t)&&Te(n)?!1:t in e}const Mn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return X(t)?n=>zs(t,n):t};function Yf(e){e.target.composing=!0}function dl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const zt=Symbol("_assign");function fl(e,t,n){return t&&(e=e.trim()),n&&(e=wo(e)),e}const rt={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e[zt]=Mn(o);const r=s||o.props&&o.props.type==="number";ln(e,t?"change":"input",i=>{i.target.composing||e[zt](fl(e.value,n,r))}),(n||r)&&ln(e,"change",()=>{e.value=fl(e.value,n,r)}),t||(ln(e,"compositionstart",Yf),ln(e,"compositionend",dl),ln(e,"change",dl))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:o,number:r}},i){if(e[zt]=Mn(i),e.composing)return;const l=(r||e.type==="number")&&!/^0\d/.test(e.value)?wo(e.value):e.value,a=t??"";l!==a&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||o&&e.value.trim()===a)||(e.value=a))}},en={deep:!0,created(e,t,n){e[zt]=Mn(n),ln(e,"change",()=>{const s=e._modelValue,o=xs(e),r=e.checked,i=e[zt];if(X(s)){const l=Kr(s,o),a=l!==-1;if(r&&!a)i(s.concat(o));else if(!r&&a){const d=[...s];d.splice(l,1),i(d)}}else if(Vn(s)){const l=new Set(s);r?l.add(o):l.delete(o),i(l)}else i(Cc(e,r))})},mounted:pl,beforeUpdate(e,t,n){e[zt]=Mn(n),pl(e,t,n)}};function pl(e,{value:t,oldValue:n},s){e._modelValue=t;let o;if(X(t))o=Kr(t,s.props.value)>-1;else if(Vn(t))o=t.has(s.props.value);else{if(t===n)return;o=Wn(t,Cc(e,!0))}e.checked!==o&&(e.checked=o)}const Xs={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const o=Vn(t);ln(e,"change",()=>{const r=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?wo(xs(i)):xs(i));e[zt](e.multiple?o?new Set(r):r:r[0]),e._assigning=!0,ei(()=>{e._assigning=!1})}),e[zt]=Mn(s)},mounted(e,{value:t}){hl(e,t)},beforeUpdate(e,t,n){e[zt]=Mn(n)},updated(e,{value:t}){e._assigning||hl(e,t)}};function hl(e,t){const n=e.multiple,s=X(t);if(!(n&&!s&&!Vn(t))){for(let o=0,r=e.options.length;oString(d)===String(l)):i.selected=Kr(t,l)>-1}else i.selected=t.has(l);else if(Wn(xs(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function xs(e){return"_value"in e?e._value:e.value}function Cc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Xf=["ctrl","shift","alt","meta"],Zf={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Xf.some(n=>e[`${n}Key`]&&!t.includes(n))},ep=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(o,...r)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=o=>{if(!("key"in o))return;const r=fn(o.key);if(t.some(i=>i===r||tp[i]===r))return e(o)})},sp=$e({patchProp:Gf},Tf);let ml;function op(){return ml||(ml=lf(sp))}const rp=(...e)=>{const t=op().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=lp(s);if(!o)return;const r=t._component;!oe(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const i=n(o,!1,ip(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function ip(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function lp(e){return Te(e)?document.querySelector(e):e}const ap={language:{name:"English"},common:{cancel:"Cancel",save:"Save",close:"Close",delete:"Delete",refresh:"Refresh",download:"Download",unknownArtist:"Unknown artist",unknownTrack:"Unknown track",previousPage:"Previous page",nextPage:"Next page"},nav:{home:"Home",library:"Library",monitor:"Playlist Monitor",queue:"Queue",player:"Player",settings:"Settings",switchToLight:"Switch to light",switchToDark:"Switch to dark"},hero:{noAccount:"no Spotify account needed",tagline:"Your music with full metadata, album art and lyrics — in one click.",songs:"Songs",albums:"Albums",playlists:"Playlists"},search:{placeholder:"Search, paste a Spotify or YouTube Music link…",title:"Search results",matchesFor:"Showing matches for",songsCount:"— {count} song",songsCountPlural:"— {count} songs",typeToBegin:"Type something in the search bar to begin.",error:"Something went wrong.",errorWithDetail:"Something went wrong: {detail}",empty:"No songs found.",emptyHint:"Try another query — artist + title usually works best.",openOnSpotify:"Open on Spotify",inQueue:"In queue",download:"Download",previousPage:"Previous page",nextPage:"Next page"},queue:{title:"Download Queue",subtitle:"Songs you've queued. Use filters for what's active or failed. A new Spotify playlist clears finished tracks and keeps failures.",empty:"Nothing queued right now.",emptyHint:"Search for a song and hit download to start.",emptyFilter:"No tracks match this filter.",filterAll:"All",filterActive:"In progress",filterDownloading:"Downloading",filterQueued:"Waiting",filterDone:"Done",filterFailed:"Failed",statusQueued:"Waiting",statusDownloading:"Downloading",statusDone:"Done",statusFailed:"Failed",retry:"Retry download",retryAllFailed:"Retry failed ({count})",clearCompleted:"Clear done ({count})",saveToDevice:"Save to device",removeFromQueue:"Remove from queue",clearAll:"Clear all",clearAllPrompt:"Remove all items from the queue?",forceAudio:"Use a YouTube URL instead",overridePlaceholder:"Paste a YouTube or YouTube Music URL…",applyOverride:"Apply",invalidYouTubeURL:"Invalid YouTube URL"},library:{title:"Library",subtitle:"Music you've already downloaded. Listen, re-download or remove.",empty:"No downloads yet.",emptyHint:"Find a song to start filling your library.",failedLoad:"Failed to load downloads.",failedDelete:"Failed to delete {file}",deletePrompt:'Delete "{file}"?',countOne:"{count} file in your library",countMany:"{count} files in your library",downloadToDevice:"Download to device",deleteFile:"Delete file",play:"Play"},monitor:{title:"Playlist Monitor",subtitle:"Add Spotify playlists to watch. New tracks added to those playlists will be downloaded automatically.",watchNew:"Watch a new playlist",urlPlaceholder:"Paste a Spotify playlist URL…",watch:"Watch",failedAdd:"Failed to add playlist. Check the URL and try again.",empty:"No playlists being monitored yet.",emptyHint:"Paste a Spotify playlist link above to get started.",active:"Active",paused:"Paused",everyInterval:"Every {interval}",tracksOne:"{count} track",tracksMany:"{count} tracks",checked:"Checked {when}",notChecked:"Not checked yet",pause:"Pause monitoring",resume:"Resume monitoring",checkNow:"Check now",stop:"Stop monitoring",deletePrompt:'Stop monitoring "{name}"?',info:"When you add a playlist, Downtify downloads every track it currently contains and then keeps watching it. Any songs added later on Spotify are detected and downloaded automatically on the next scheduled check.",every15:"Every 15 min",every30:"Every 30 min",every1h:"Every hour",every3h:"Every 3 h",every6h:"Every 6 h",every12h:"Every 12 h",every1d:"Every day",every1w:"Every week",every2w:"Every 2 weeks",every1mo:"Every month",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 day",short1w:"1 wk",short2w:"2 wk",short1mo:"1 mo",minSuffix:"min",hourSuffix:"h",daySuffix:"day",daysSuffix:"days",weekSuffix:"week",weeksSuffix:"weeks",monthSuffix:"month",monthsSuffix:"months",timeJustNow:"just now",timeMinAgo:"{n} min ago",timeHourAgo:"{n} h ago",timeDayAgo:"{n} day(s) ago"},settings:{title:"Settings",subtitle:"Tweak how Downtify fetches and tags your music.",audioSource:"Audio sources (fallback order)",audioSourceHint:"Enable one or more. Downtify tries them in order (1, 2, 3) per track. Use slskd then YouTube for playlists.",audioSourceReset:"Use recommended order",lyricsSource:"Lyrics source",lyricsHint:"only lrclib is active",downloadLyrics:"Download lyrics",downloadLyricsHint:"Embed lyrics in audio files and write .lrc sidecar files",lyricsProvider:"Provider",format:"Format",quality:"Quality",qualityIgnored:"ignored (lossless)",playlistsSection:"Playlists",generateM3u:"Generate M3U file for playlists",generateM3uHint:"Writes Playlists/.m3u with absolute file paths (/downloads/... and /slskd/...) for manual downloads and Playlist Monitor sweeps.",syncNavidrome:"Create playlist in Navidrome",syncNavidromeHint:"After a Spotify playlist download finishes, scan the library and create/update a Navidrome playlist with the same name.",navidromeSection:"Navidrome",navidromeHint:"Uses the Subsonic API (same as Explo). Point your music folder in Navidrome at Downtify downloads.",navidromeEnabled:"Enable Navidrome sync",navidromeEnabledHint:"Requires URL, username, and password. Admin account recommended: triggers Subsonic startScan (incremental) before matching tracks, same as Explo.",navidromeUrl:"Navidrome URL (example: https://music.example.com)",navidromeUsername:"Navidrome username",navidromePassword:"Navidrome password",navidromeAdminUser:"Admin username (optional, for library scan)",navidromeAdminPassword:"Admin password (optional)",navidromePublic:"Public playlist in Navidrome",organizationSection:"File organization",organizeByArtist:"Organize by artist",organizeByArtistHint:"Save songs in subfolders named after the artist. Playlist tracks are also placed in their artist's folder instead of a playlist folder.",parallelDownloads:"Parallel downloads",parallelDownloadsHint:"Maximum number of songs downloaded simultaneously. Higher values are faster but use more bandwidth.",saved:"Changes saved",saveError:"Couldn't save settings.",language:"Language",languageHint:"Choose the interface language",slskdSection:"slskd",slskdHint:"Soulseek via slskd. With Navidrome enabled, playlists are built in Navidrome after a library scan — files can stay in the slskd folder.",slskdEnabled:"Enable slskd provider",slskdEnabledHint:"When off, slskd is never attempted in provider fallback.",slskdBaseUrl:"slskd base URL (example: https://slskd.example.com)",slskdApiKey:"slskd API key",slskdSourceDirTitle:"slskd download folder (inside this container)",slskdSourceDirBullet1:"slskd writes completed transfers here (e.g. /slskd → host music/slskd).",slskdSourceDirBullet2:"Navidrome must scan the parent music library that includes this folder.",slskdSourceDirBullet3:"Use the path Downtify sees — not the host path, not the slskd web URL.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads +**/let Rr;const Qi=typeof window<"u"&&window.trustedTypes;if(Qi)try{Rr=Qi.createPolicy("vue",{createHTML:e=>e})}catch{}const Ec=Rr?e=>Rr.createHTML(e):e=>e,Rf="http://www.w3.org/2000/svg",Cf="http://www.w3.org/1998/Math/MathML",jt=typeof document<"u"?document:null,Gi=jt&&jt.createElement("template"),Tf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?jt.createElementNS(Rf,e):t==="mathml"?jt.createElementNS(Cf,e):n?jt.createElement(e,{is:n}):jt.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>jt.createTextNode(e),createComment:e=>jt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>jt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,r){const i=n?n.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===r||!(o=o.nextSibling)););else{Gi.innerHTML=Ec(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Gi.content;if(s==="svg"||s==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Zt="transition",Xn="animation",_s=Symbol("_vtc"),Ac={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Pf=$e({},Ka,Ac),Of=e=>(e.displayName="Transition",e.props=Pf,e),Rc=Of((e,{slots:t})=>bs(Cd,Df(e),t)),mn=(e,t=[])=>{X(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ji=e=>e?X(e)?e.some(t=>t.length>1):e.length>1:!1;function Df(e){const t={};for(const q in e)q in Ac||(t[q]=e[q]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=r,appearActiveClass:d=i,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:b=`${n}-leave-to`}=e,y=Nf(o),v=y&&y[0],h=y&&y[1],{onBeforeEnter:k,onEnter:R,onEnterCancelled:S,onLeave:C,onLeaveCancelled:L,onBeforeAppear:P=k,onAppear:U=R,onAppearCancelled:ae=S}=t,I=(q,se,we,Me)=>{q._enterCancelled=Me,gn(q,se?c:l),gn(q,se?d:i),we&&we()},W=(q,se)=>{q._isLeaving=!1,gn(q,f),gn(q,b),gn(q,m),se&&se()},B=q=>(se,we)=>{const Me=q?U:R,le=()=>I(se,q,we);mn(Me,[se,le]),Yi(()=>{gn(se,q?a:r),Bt(se,q?c:l),Ji(Me)||Xi(se,s,v,le)})};return $e(t,{onBeforeEnter(q){mn(k,[q]),Bt(q,r),Bt(q,i)},onBeforeAppear(q){mn(P,[q]),Bt(q,a),Bt(q,d)},onEnter:B(!1),onAppear:B(!0),onLeave(q,se){q._isLeaving=!0;const we=()=>W(q,se);Bt(q,f),q._enterCancelled?(Bt(q,m),tl(q)):(tl(q),Bt(q,m)),Yi(()=>{q._isLeaving&&(gn(q,f),Bt(q,b),Ji(C)||Xi(q,s,h,we))}),mn(C,[q,we])},onEnterCancelled(q){I(q,!1,void 0,!0),mn(S,[q])},onAppearCancelled(q){I(q,!0,void 0,!0),mn(ae,[q])},onLeaveCancelled(q){W(q),mn(L,[q])}})}function Nf(e){if(e==null)return null;if(ge(e))return[Zo(e.enter),Zo(e.leave)];{const t=Zo(e);return[t,t]}}function Zo(e){return Fu(e)}function Bt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[_s]||(e[_s]=new Set)).add(t)}function gn(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[_s];n&&(n.delete(t),n.size||(e[_s]=void 0))}function Yi(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let If=0;function Xi(e,t,n,s){const o=e._endId=++If,r=()=>{o===e._endId&&s()};if(n!=null)return setTimeout(r,n);const{type:i,timeout:l,propCount:a}=$f(e,t);if(!i)return s();const d=i+"end";let c=0;const f=()=>{e.removeEventListener(d,m),r()},m=b=>{b.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[y]||"").split(", "),o=s(`${Zt}Delay`),r=s(`${Zt}Duration`),i=Zi(o,r),l=s(`${Xn}Delay`),a=s(`${Xn}Duration`),d=Zi(l,a);let c=null,f=0,m=0;t===Zt?i>0&&(c=Zt,f=i,m=r.length):t===Xn?d>0&&(c=Xn,f=d,m=a.length):(f=Math.max(i,d),c=f>0?i>d?Zt:Xn:null,m=c?c===Zt?r.length:a.length:0);const b=c===Zt&&/\b(?:transform|all)(?:,|$)/.test(s(`${Zt}Property`).toString());return{type:c,timeout:f,propCount:m,hasTransform:b}}function Zi(e,t){for(;e.lengthel(n)+el(e[s])))}function el(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function tl(e){return(e?e.ownerDocument:document).body.offsetHeight}function Lf(e,t,n){const s=e[_s];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const nl=Symbol("_vod"),Ff=Symbol("_vsh"),Mf=Symbol(""),Uf=/(?:^|;)\s*display\s*:/;function Bf(e,t,n){const s=e.style,o=Te(n);let r=!1;if(n&&!o){if(t)if(Te(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Ys(s,l,"")}else for(const i in t)n[i]==null&&Ys(s,i,"");for(const i in n)i==="display"&&(r=!0),Ys(s,i,n[i])}else if(o){if(t!==n){const i=s[Mf];i&&(n+=";"+i),s.cssText=n,r=Uf.test(n)}}else t&&e.removeAttribute("style");nl in e&&(e[nl]=r?s.display:"",e[Ff]&&(s.display="none"))}const sl=/\s*!important$/;function Ys(e,t,n){if(X(n))n.forEach(s=>Ys(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Hf(e,t);sl.test(n)?e.setProperty(fn(s),n.replace(sl,""),"important"):e[s]=n}}const ol=["Webkit","Moz","ms"],er={};function Hf(e,t){const n=er[t];if(n)return n;let s=mt(t);if(s!=="filter"&&s in e)return er[t]=s;s=xo(s);for(let o=0;otr||(Wf.then(()=>tr=0),tr=Date.now());function zf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;xt(Qf(s,n.value),t,5,[s])};return n.value=e,n.attached=Kf(),n}function Qf(e,t){if(X(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const ul=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Gf=(e,t,n,s,o,r)=>{const i=o==="svg";t==="class"?Lf(e,s,i):t==="style"?Bf(e,n,s):bo(t)?qr(t)||qf(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Jf(e,t,s,i))?(ll(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&il(e,t,s,i,r,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Te(s))?ll(e,mt(t),s,r,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),il(e,t,s,i))};function Jf(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ul(t)&&oe(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ul(t)&&Te(n)?!1:t in e}const Mn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return X(t)?n=>zs(t,n):t};function Yf(e){e.target.composing=!0}function dl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const zt=Symbol("_assign");function fl(e,t,n){return t&&(e=e.trim()),n&&(e=wo(e)),e}const rt={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e[zt]=Mn(o);const r=s||o.props&&o.props.type==="number";ln(e,t?"change":"input",i=>{i.target.composing||e[zt](fl(e.value,n,r))}),(n||r)&&ln(e,"change",()=>{e.value=fl(e.value,n,r)}),t||(ln(e,"compositionstart",Yf),ln(e,"compositionend",dl),ln(e,"change",dl))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:o,number:r}},i){if(e[zt]=Mn(i),e.composing)return;const l=(r||e.type==="number")&&!/^0\d/.test(e.value)?wo(e.value):e.value,a=t??"";l!==a&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||o&&e.value.trim()===a)||(e.value=a))}},en={deep:!0,created(e,t,n){e[zt]=Mn(n),ln(e,"change",()=>{const s=e._modelValue,o=xs(e),r=e.checked,i=e[zt];if(X(s)){const l=Kr(s,o),a=l!==-1;if(r&&!a)i(s.concat(o));else if(!r&&a){const d=[...s];d.splice(l,1),i(d)}}else if(Vn(s)){const l=new Set(s);r?l.add(o):l.delete(o),i(l)}else i(Cc(e,r))})},mounted:pl,beforeUpdate(e,t,n){e[zt]=Mn(n),pl(e,t,n)}};function pl(e,{value:t,oldValue:n},s){e._modelValue=t;let o;if(X(t))o=Kr(t,s.props.value)>-1;else if(Vn(t))o=t.has(s.props.value);else{if(t===n)return;o=Wn(t,Cc(e,!0))}e.checked!==o&&(e.checked=o)}const Xs={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const o=Vn(t);ln(e,"change",()=>{const r=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?wo(xs(i)):xs(i));e[zt](e.multiple?o?new Set(r):r:r[0]),e._assigning=!0,ei(()=>{e._assigning=!1})}),e[zt]=Mn(s)},mounted(e,{value:t}){hl(e,t)},beforeUpdate(e,t,n){e[zt]=Mn(n)},updated(e,{value:t}){e._assigning||hl(e,t)}};function hl(e,t){const n=e.multiple,s=X(t);if(!(n&&!s&&!Vn(t))){for(let o=0,r=e.options.length;oString(d)===String(l)):i.selected=Kr(t,l)>-1}else i.selected=t.has(l);else if(Wn(xs(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function xs(e){return"_value"in e?e._value:e.value}function Cc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Xf=["ctrl","shift","alt","meta"],Zf={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Xf.some(n=>e[`${n}Key`]&&!t.includes(n))},ep=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(o,...r)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=o=>{if(!("key"in o))return;const r=fn(o.key);if(t.some(i=>i===r||tp[i]===r))return e(o)})},sp=$e({patchProp:Gf},Tf);let ml;function op(){return ml||(ml=lf(sp))}const rp=(...e)=>{const t=op().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=lp(s);if(!o)return;const r=t._component;!oe(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const i=n(o,!1,ip(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function ip(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function lp(e){return Te(e)?document.querySelector(e):e}const ap={language:{name:"English"},common:{cancel:"Cancel",save:"Save",close:"Close",delete:"Delete",refresh:"Refresh",download:"Download",unknownArtist:"Unknown artist",unknownTrack:"Unknown track",previousPage:"Previous page",nextPage:"Next page"},nav:{home:"Home",library:"Library",monitor:"Playlist Monitor",queue:"Queue",player:"Player",settings:"Settings",switchToLight:"Switch to light",switchToDark:"Switch to dark"},hero:{noAccount:"no Spotify account needed",tagline:"Your music with full metadata, album art and lyrics — in one click.",songs:"Songs",albums:"Albums",playlists:"Playlists"},search:{placeholder:"Search, paste a Spotify or YouTube Music link…",title:"Search results",matchesFor:"Showing matches for",songsCount:"— {count} song",songsCountPlural:"— {count} songs",typeToBegin:"Type something in the search bar to begin.",error:"Something went wrong.",errorWithDetail:"Something went wrong: {detail}",empty:"No songs found.",emptyHint:"Try another query — artist + title usually works best.",openOnSpotify:"Open on Spotify",inQueue:"In queue",download:"Download",previousPage:"Previous page",nextPage:"Next page"},queue:{title:"Download Queue",subtitle:"Songs you've queued. Use filters for what's active or failed. A new Spotify playlist clears finished tracks and keeps failures.",empty:"Nothing queued right now.",emptyHint:"Search for a song and hit download to start.",emptyFilter:"No tracks match this filter.",filterAll:"All",filterActive:"In progress",filterDownloading:"Downloading",filterQueued:"Waiting",filterDone:"Done",filterFailed:"Failed",statusQueued:"Waiting",statusDownloading:"Downloading",statusDone:"Done",statusFailed:"Failed",retry:"Retry download",retryAllFailed:"Retry failed ({count})",clearCompleted:"Clear done ({count})",saveToDevice:"Save to device",removeFromQueue:"Remove from queue",clearAll:"Clear all",clearAllPrompt:"Remove all items from the queue?",forceAudio:"Use a YouTube URL instead",overridePlaceholder:"Paste a YouTube or YouTube Music URL…",applyOverride:"Apply",invalidYouTubeURL:"Invalid YouTube URL"},library:{title:"Library",subtitle:"Music you've already downloaded. Listen, re-download or remove.",empty:"No downloads yet.",emptyHint:"Find a song to start filling your library.",failedLoad:"Failed to load downloads.",failedDelete:"Failed to delete {file}",deletePrompt:'Delete "{file}"?',countOne:"{count} file in your library",countMany:"{count} files in your library",downloadToDevice:"Download to device",deleteFile:"Delete file",play:"Play"},monitor:{title:"Playlist Monitor",subtitle:"Add Spotify playlists to watch. New tracks added to those playlists will be downloaded automatically.",watchNew:"Watch a new playlist",urlPlaceholder:"Paste a Spotify playlist URL…",watch:"Watch",failedAdd:"Failed to add playlist. Check the URL and try again.",empty:"No playlists being monitored yet.",emptyHint:"Paste a Spotify playlist link above to get started.",active:"Active",paused:"Paused",everyInterval:"Every {interval}",tracksOne:"{count} track",tracksMany:"{count} tracks",checked:"Checked {when}",notChecked:"Not checked yet",pause:"Pause monitoring",resume:"Resume monitoring",checkNow:"Check now",stop:"Stop monitoring",deletePrompt:'Stop monitoring "{name}"?',info:"When you add a playlist, Downtify downloads every track it currently contains and then keeps watching it. Any songs added later on Spotify are detected and downloaded automatically on the next scheduled check.",every15:"Every 15 min",every30:"Every 30 min",every1h:"Every hour",every3h:"Every 3 h",every6h:"Every 6 h",every12h:"Every 12 h",every1d:"Every day",every1w:"Every week",every2w:"Every 2 weeks",every1mo:"Every month",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 day",short1w:"1 wk",short2w:"2 wk",short1mo:"1 mo",minSuffix:"min",hourSuffix:"h",daySuffix:"day",daysSuffix:"days",weekSuffix:"week",weeksSuffix:"weeks",monthSuffix:"month",monthsSuffix:"months",timeJustNow:"just now",timeMinAgo:"{n} min ago",timeHourAgo:"{n} h ago",timeDayAgo:"{n} day(s) ago"},settings:{title:"Settings",subtitle:"Tweak how Downtify fetches and tags your music.",audioSource:"Audio sources (fallback order)",audioSourceHint:"Enable one or more. Downtify tries them in order (1, 2, 3) per track. Use slskd then YouTube for playlists.",audioSourceReset:"Use recommended order",lyricsSource:"Lyrics source",lyricsHint:"only lrclib is active",downloadLyrics:"Download lyrics",downloadLyricsHint:"Embed lyrics in audio files and write .lrc sidecar files",lyricsProvider:"Provider",format:"Format",quality:"Quality",qualityIgnored:"ignored (lossless)",playlistsSection:"Playlists",generateM3u:"Generate M3U file for playlists",generateM3uHint:"Writes Playlists/.m3u with absolute file paths (/downloads/... and /slskd/...) for manual downloads and Playlist Monitor sweeps.",syncNavidrome:"Create playlist in Navidrome",syncNavidromeHint:"After a Spotify playlist download finishes, scan the library and create/update a Navidrome playlist with the same name.",navidromeSection:"Navidrome",navidromeHint:"Uses the Subsonic API (same as Explo). Point your music folder in Navidrome at Downtify downloads.",navidromeEnabled:"Enable Navidrome sync",navidromeEnabledHint:"Requires URL, username, and password. Admin account recommended: triggers Subsonic startScan (incremental) before matching tracks, same as Explo.",navidromeUrl:"Navidrome URL (example: https://music.example.com)",navidromeUsername:"Navidrome username",navidromePassword:"Navidrome password",navidromeAdminUser:"Admin username (optional, for library scan)",navidromeAdminPassword:"Admin password (optional)",navidromePublic:"Public playlist in Navidrome",organizationSection:"File organization",organizeByArtist:"Organize by artist",organizeByArtistHint:"Save songs in subfolders named after the artist. Playlist tracks are also placed in their artist's folder instead of a playlist folder.",parallelDownloads:"Parallel downloads",parallelDownloadsHint:"Maximum number of songs downloaded simultaneously. Higher values are faster but use more bandwidth.",saved:"Changes saved",saveError:"Couldn't save settings.",language:"Language",languageHint:"Choose the interface language",slskdSection:"slskd",slskdHint:"Soulseek via slskd. With Navidrome enabled, playlists are built in Navidrome after a library scan — files can stay in the slskd folder.",slskdEnabled:"Enable slskd provider",slskdEnabledHint:"When off, slskd is never attempted in provider fallback.",slskdBaseUrl:"slskd base URL (example: https://slskd.example.com)",slskdApiKey:"slskd API key",slskdSourceDirTitle:"slskd download folder (inside this container)",slskdSourceDirBullet1:"slskd writes completed transfers here (e.g. /slskd → host music/slskd).",slskdSourceDirBullet2:"Navidrome must scan the parent music library that includes this folder.",slskdSourceDirBullet3:"Use the path Downtify sees — not the host path, not the slskd web URL.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads Downtify: /mnt/storage/music/slskd:/slskd → set /slskd`,slskdSourceDirLabel:"slskd folder path in Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify watches this folder for finished slskd files. No copy into /downloads when leave-in-place is on.",slskdLeaveInPlace:"Leave slskd files in place",slskdLeaveInPlaceHint:"Do not copy into /downloads. Tag in place, register for dedupe, and add tracks to Navidrome playlists via library search (recommended with Navidrome sync).",slskdDownloadTimeout:"Total slskd timeout (seconds)",slskdQueuedTimeout:"Queued / no-progress timeout (seconds)",slskdTimeoutHint:'If slskd does not finish in time, Downtify tries the next audio provider (YouTube). Lower the queued timeout when tracks sit on "Queued on slskd" too long.'},player:{title:"Player",subtitle:"Listen to the music you've downloaded.",empty:"Nothing to play yet",emptyHint:"Download some music to start listening.",queue:"Queue",play:"Play",pause:"Pause",previous:"Previous",next:"Next",shuffle:"Shuffle",shuffleOn:"Shuffle on",shuffleOff:"Shuffle off",repeatOff:"Repeat off",repeatAll:"Repeat all",repeatOne:"Repeat one",volume:"Volume",mute:"Mute",unmute:"Unmute",nowPlaying:"Now playing",upNext:"Up next",playFromLibrary:"Open in player",countOne:"{count} track",countMany:"{count} tracks"},footer:{tagline:"Open source music downloader"}},cp={language:{name:"Español"},common:{cancel:"Cancelar",save:"Guardar",close:"Cerrar",delete:"Eliminar",refresh:"Actualizar",download:"Descargar",unknownArtist:"Artista desconocido",unknownTrack:"Pista desconocida",previousPage:"Página anterior",nextPage:"Página siguiente"},nav:{home:"Inicio",library:"Biblioteca",monitor:"Monitor de listas",queue:"Cola",player:"Reproductor",settings:"Ajustes",switchToLight:"Cambiar a claro",switchToDark:"Cambiar a oscuro"},hero:{noAccount:"sin cuenta de Spotify",tagline:"Tu música con metadatos completos, portada y letras — en un clic.",songs:"Canciones",albums:"Álbumes",playlists:"Listas"},search:{placeholder:"Busca o pega un enlace de Spotify o YouTube Music…",title:"Resultados de búsqueda",matchesFor:"Mostrando coincidencias para",songsCount:"— {count} canción",songsCountPlural:"— {count} canciones",typeToBegin:"Escribe algo en la barra de búsqueda para empezar.",error:"Algo salió mal.",errorWithDetail:"Algo salió mal: {detail}",empty:"No se encontraron canciones.",emptyHint:"Prueba con otra búsqueda — artista + título suele funcionar mejor.",openOnSpotify:"Abrir en Spotify",inQueue:"En la cola",download:"Descargar",previousPage:"Página anterior",nextPage:"Página siguiente"},queue:{title:"Cola de descargas",subtitle:"Canciones en cola. Filtra por activas o fallidas. Una playlist nueva de Spotify quita las terminadas y conserva los fallos.",empty:"No hay nada en la cola ahora mismo.",emptyHint:"Busca una canción y pulsa descargar para empezar.",emptyFilter:"Ninguna pista coincide con este filtro.",filterAll:"Todas",filterActive:"En curso",filterDownloading:"Descargando",filterQueued:"En espera",filterDone:"Hechas",filterFailed:"Fallidas",statusQueued:"En espera",statusDownloading:"Descargando",statusDone:"Hecha",statusFailed:"Fallida",retry:"Reintentar descarga",retryAllFailed:"Reintentar fallidas ({count})",clearCompleted:"Quitar hechas ({count})",saveToDevice:"Guardar en el dispositivo",removeFromQueue:"Quitar de la cola",clearAll:"Limpiar todo",clearAllPrompt:"¿Eliminar todos los elementos de la cola?",forceAudio:"Usar una URL de YouTube",overridePlaceholder:"Pega una URL de YouTube o YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL de YouTube no válida"},library:{title:"Biblioteca",subtitle:"Música que ya has descargado. Escucha, descarga otra vez o elimina.",empty:"Aún no hay descargas.",emptyHint:"Encuentra una canción para empezar a llenar tu biblioteca.",failedLoad:"No se pudieron cargar las descargas.",failedDelete:"No se pudo eliminar {file}",deletePrompt:'¿Eliminar "{file}"?',countOne:"{count} archivo en tu biblioteca",countMany:"{count} archivos en tu biblioteca",downloadToDevice:"Descargar al dispositivo",deleteFile:"Eliminar archivo",play:"Reproducir"},monitor:{title:"Monitor de listas",subtitle:"Añade listas de Spotify para vigilar. Las nuevas pistas añadidas a esas listas se descargarán automáticamente.",watchNew:"Vigilar una nueva lista",urlPlaceholder:"Pega una URL de lista de Spotify…",watch:"Vigilar",failedAdd:"No se pudo añadir la lista. Comprueba la URL e inténtalo de nuevo.",empty:"Aún no hay listas vigiladas.",emptyHint:"Pega un enlace de lista de Spotify arriba para empezar.",active:"Activa",paused:"Pausada",everyInterval:"Cada {interval}",tracksOne:"{count} pista",tracksMany:"{count} pistas",checked:"Revisada {when}",notChecked:"Aún no revisada",pause:"Pausar vigilancia",resume:"Reanudar vigilancia",checkNow:"Revisar ahora",stop:"Dejar de vigilar",deletePrompt:'¿Dejar de vigilar "{name}"?',info:"Al añadir una lista, Downtify descarga todas las pistas que contenga en ese momento y la sigue vigilando. Cualquier canción añadida después en Spotify se detecta y descarga automáticamente en la siguiente revisión.",every15:"Cada 15 min",every30:"Cada 30 min",every1h:"Cada hora",every3h:"Cada 3 h",every6h:"Cada 6 h",every12h:"Cada 12 h",every1d:"Cada día",every1w:"Cada semana",every2w:"Cada 2 semanas",every1mo:"Cada mes",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 día",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mes",minSuffix:"min",hourSuffix:"h",daySuffix:"día",daysSuffix:"días",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mes",monthsSuffix:"meses",timeJustNow:"justo ahora",timeMinAgo:"hace {n} min",timeHourAgo:"hace {n} h",timeDayAgo:"hace {n} día(s)"},settings:{title:"Ajustes",subtitle:"Ajusta cómo Downtify descarga y etiqueta tu música.",audioSource:"Fuentes de audio (orden de respaldo)",audioSourceHint:"Activa una o más. Downtify las prueba en orden (1, 2, 3) por pista. Para listas: slskd y luego YouTube.",audioSourceReset:"Usar orden recomendado",lyricsSource:"Fuente de letras",lyricsHint:"solo lrclib está activo",downloadLyrics:"Descargar letras",downloadLyricsHint:"Incrusta letras en los archivos de audio y escribe archivos .lrc",lyricsProvider:"Proveedor",format:"Formato",quality:"Calidad",qualityIgnored:"ignorada (sin pérdidas)",playlistsSection:"Listas",generateM3u:"Generar archivo M3U para las listas",generateM3uHint:"Escribe Playlists/.m3u con rutas absolutas (/downloads/... y /slskd/...) para descargas y el Monitor.",syncNavidrome:"Crear lista en Navidrome",syncNavidromeHint:"Tras descargar una lista de Spotify, escanea la biblioteca y crea/actualiza una lista en Navidrome con el mismo nombre.",navidromeSection:"Navidrome",navidromeHint:"Usa la API Subsonic (como Explo). La carpeta de música en Navidrome debe apuntar a las descargas de Downtify.",navidromeEnabled:"Activar sincronización con Navidrome",navidromeEnabledHint:"Requiere URL, usuario y contraseña. La cuenta admin opcional inicia el escaneo de la biblioteca.",navidromeUrl:"URL de Navidrome (ejemplo: https://musica.ejemplo.com)",navidromeUsername:"Usuario de Navidrome",navidromePassword:"Contraseña de Navidrome",navidromeAdminUser:"Usuario admin (opcional, para escaneo)",navidromeAdminPassword:"Contraseña admin (opcional)",navidromePublic:"Lista pública en Navidrome",organizationSection:"Organización de archivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Guarda las canciones en subcarpetas con el nombre del artista. Las pistas de listas también se guardan en la carpeta del artista en lugar de la carpeta de la lista.",parallelDownloads:"Descargas paralelas",parallelDownloadsHint:"Número máximo de canciones descargadas simultáneamente. Valores más altos son más rápidos pero consumen más ancho de banda.",saved:"Cambios guardados",saveError:"No se pudieron guardar los ajustes.",language:"Idioma",languageHint:"Elige el idioma de la interfaz",slskdSection:"slskd",slskdHint:"Soulseek vía slskd. Con Navidrome activo, las listas se crean allí tras escanear la biblioteca; los archivos pueden quedarse en la carpeta slskd.",slskdEnabled:"Activar proveedor slskd",slskdEnabledHint:"Si está desactivado, slskd nunca se intentará en la cadena de fallback.",slskdBaseUrl:"URL base de slskd (ejemplo: https://slskd.ejemplo.com)",slskdApiKey:"API key de slskd",slskdSourceDirTitle:"Carpeta de descargas de slskd (en este contenedor)",slskdSourceDirBullet1:"slskd escribe aquí las transferencias completadas (ej. /slskd → music/slskd en el host).",slskdSourceDirBullet2:"Navidrome debe escanear la biblioteca que incluye esta carpeta.",slskdSourceDirBullet3:"Ruta que ve Downtify — no la ruta del host ni la URL web de slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Carpeta slskd en Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify detecta archivos slskd aquí. Sin copia a /downloads si “dejar en sitio” está activo.",slskdLeaveInPlace:"Dejar archivos slskd en su sitio",slskdLeaveInPlaceHint:"No copiar a /downloads. Etiquetar en sitio y añadir a listas de Navidrome tras el escaneo.",slskdDownloadTimeout:"Tiempo máximo slskd (segundos)",slskdQueuedTimeout:"Tiempo en cola sin progreso (segundos)",slskdTimeoutHint:'Si slskd no termina a tiempo, Downtify prueba el siguiente proveedor (YouTube). Baja el tiempo en cola si se queda en "Queued on slskd".'},player:{title:"Reproductor",subtitle:"Escucha la música que has descargado.",empty:"Nada que reproducir aún",emptyHint:"Descarga música para empezar a escuchar.",queue:"Cola",play:"Reproducir",pause:"Pausar",previous:"Anterior",next:"Siguiente",shuffle:"Aleatorio",shuffleOn:"Aleatorio activado",shuffleOff:"Aleatorio desactivado",repeatOff:"Repetición desactivada",repeatAll:"Repetir todo",repeatOne:"Repetir una",volume:"Volumen",mute:"Silenciar",unmute:"Activar sonido",nowPlaying:"Sonando ahora",upNext:"A continuación",playFromLibrary:"Abrir en el reproductor",countOne:"{count} pista",countMany:"{count} pistas"},footer:{tagline:"Descargador de música de código abierto"}},up={language:{name:"Português (BR)"},common:{cancel:"Cancelar",save:"Salvar",close:"Fechar",delete:"Excluir",refresh:"Atualizar",download:"Baixar",unknownArtist:"Artista desconhecido",unknownTrack:"Faixa desconhecida",previousPage:"Página anterior",nextPage:"Próxima página"},nav:{home:"Início",library:"Biblioteca",monitor:"Monitor de playlists",queue:"Fila",player:"Player",settings:"Configurações",switchToLight:"Mudar para claro",switchToDark:"Mudar para escuro"},hero:{noAccount:"sem precisar de conta no Spotify",tagline:"Sua música com metadados completos, capa do álbum e letras — em um clique.",songs:"Músicas",albums:"Álbuns",playlists:"Playlists"},search:{placeholder:"Busque uma música ou cole um link do Spotify ou YouTube Music…",title:"Resultados da busca",matchesFor:"Mostrando resultados para",songsCount:"— {count} música",songsCountPlural:"— {count} músicas",typeToBegin:"Digite algo na barra de busca para começar.",error:"Algo deu errado.",errorWithDetail:"Algo deu errado: {detail}",empty:"Nenhuma música encontrada.",emptyHint:"Tente outra busca — artista + título costuma funcionar melhor.",openOnSpotify:"Abrir no Spotify",inQueue:"Na fila",download:"Baixar",previousPage:"Página anterior",nextPage:"Próxima página"},queue:{title:"Fila de download",subtitle:"Músicas na fila. Filtre o que está ativo ou com falha. Uma playlist nova do Spotify remove as concluídas e mantém as com erro.",empty:"Nada na fila no momento.",emptyHint:"Procure uma música e clique em baixar para começar.",emptyFilter:"Nenhuma faixa neste filtro.",filterAll:"Todas",filterActive:"Em andamento",filterDownloading:"Baixando",filterQueued:"Aguardando",filterDone:"Concluídas",filterFailed:"Com falha",statusQueued:"Aguardando",statusDownloading:"Baixando",statusDone:"Concluída",statusFailed:"Falhou",retry:"Tentar de novo",retryAllFailed:"Repetir falhas ({count})",clearCompleted:"Limpar concluídas ({count})",saveToDevice:"Salvar no dispositivo",removeFromQueue:"Remover da fila",clearAll:"Limpar tudo",clearAllPrompt:"Remover todos os itens da fila?",forceAudio:"Usar URL do YouTube",overridePlaceholder:"Cole uma URL do YouTube ou YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL do YouTube inválida"},library:{title:"Biblioteca",subtitle:"Músicas que você já baixou. Escute, baixe novamente ou remova.",empty:"Nenhum download ainda.",emptyHint:"Encontre uma música para começar a montar sua biblioteca.",failedLoad:"Falha ao carregar os downloads.",failedDelete:"Falha ao excluir {file}",deletePrompt:'Excluir "{file}"?',countOne:"{count} arquivo na sua biblioteca",countMany:"{count} arquivos na sua biblioteca",downloadToDevice:"Baixar para o dispositivo",deleteFile:"Excluir arquivo",play:"Reproduzir"},monitor:{title:"Monitor de playlists",subtitle:"Adicione playlists do Spotify para monitorar. Novas faixas adicionadas a essas playlists serão baixadas automaticamente.",watchNew:"Monitorar uma nova playlist",urlPlaceholder:"Cole uma URL de playlist do Spotify…",watch:"Monitorar",failedAdd:"Falha ao adicionar a playlist. Verifique a URL e tente novamente.",empty:"Nenhuma playlist sendo monitorada ainda.",emptyHint:"Cole um link de playlist do Spotify acima para começar.",active:"Ativa",paused:"Pausada",everyInterval:"A cada {interval}",tracksOne:"{count} faixa",tracksMany:"{count} faixas",checked:"Verificada {when}",notChecked:"Ainda não verificada",pause:"Pausar monitoramento",resume:"Retomar monitoramento",checkNow:"Verificar agora",stop:"Parar de monitorar",deletePrompt:'Parar de monitorar "{name}"?',info:"Quando você adiciona uma playlist, o Downtify baixa todas as faixas atuais dela e segue monitorando. Qualquer música adicionada depois no Spotify é detectada e baixada automaticamente na próxima verificação.",every15:"A cada 15 min",every30:"A cada 30 min",every1h:"A cada hora",every3h:"A cada 3 h",every6h:"A cada 6 h",every12h:"A cada 12 h",every1d:"Todo dia",every1w:"Toda semana",every2w:"A cada 2 semanas",every1mo:"Todo mês",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 dia",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mês",minSuffix:"min",hourSuffix:"h",daySuffix:"dia",daysSuffix:"dias",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mês",monthsSuffix:"meses",timeJustNow:"agora mesmo",timeMinAgo:"há {n} min",timeHourAgo:"há {n} h",timeDayAgo:"há {n} dia(s)"},settings:{title:"Configurações",subtitle:"Ajuste como o Downtify baixa e marca suas músicas.",audioSource:"Fontes de áudio (ordem de fallback)",audioSourceHint:"Ative uma ou mais. O Downtify tenta na ordem (1, 2, 3) por faixa. Para playlists: slskd e depois YouTube.",audioSourceReset:"Usar ordem recomendada",lyricsSource:"Fonte de letras",lyricsHint:"apenas o lrclib está ativo",downloadLyrics:"Baixar letras",downloadLyricsHint:"Incorpora letras nos arquivos de áudio e grava arquivos .lrc",lyricsProvider:"Provedor",format:"Formato",quality:"Qualidade",qualityIgnored:"ignorada (sem perdas)",playlistsSection:"Playlists",generateM3u:"Gerar arquivo M3U para playlists",generateM3uHint:"Grava Playlists/.m3u com caminhos absolutos (/downloads/... e /slskd/...) para downloads e o Monitor.",syncNavidrome:"Criar playlist no Navidrome",syncNavidromeHint:"Depois de baixar uma playlist do Spotify, escaneia a biblioteca e cria/atualiza uma playlist no Navidrome com o mesmo nome.",navidromeSection:"Navidrome",navidromeHint:"Usa a API Subsonic (como o Explo). A pasta de música no Navidrome deve apontar para os downloads do Downtify.",navidromeEnabled:"Ativar sincronização com Navidrome",navidromeEnabledHint:"Exige URL, usuário e senha. Conta admin opcional dispara varredura da biblioteca.",navidromeUrl:"URL do Navidrome (exemplo: https://musica.exemplo.com)",navidromeUsername:"Usuário do Navidrome",navidromePassword:"Senha do Navidrome",navidromeAdminUser:"Usuário admin (opcional, para varredura)",navidromeAdminPassword:"Senha admin (opcional)",navidromePublic:"Playlist pública no Navidrome",organizationSection:"Organização de arquivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Salva as músicas em subpastas com o nome do artista. Músicas de playlists também são salvas na pasta do artista, não na pasta da playlist.",parallelDownloads:"Downloads paralelos",parallelDownloadsHint:"Número máximo de músicas baixadas ao mesmo tempo. Valores maiores são mais rápidos, mas consomem mais banda.",saved:"Alterações salvas",saveError:"Não foi possível salvar as configurações.",language:"Idioma",languageHint:"Escolha o idioma da interface",slskdSection:"slskd",slskdHint:"Soulseek via slskd. Com Navidrome ativo, playlists são criadas lá após varrer a biblioteca; arquivos podem ficar na pasta do slskd.",slskdEnabled:"Ativar provedor slskd",slskdEnabledHint:"Quando desativado, o slskd nunca é tentado na cadeia de fallback.",slskdBaseUrl:"URL base do slskd (exemplo: https://slskd.exemplo.com)",slskdApiKey:"API key do slskd",slskdSourceDirTitle:"Pasta de download do slskd (neste container)",slskdSourceDirBullet1:"O slskd grava transferências concluídas aqui (ex.: /slskd → music/slskd no host).",slskdSourceDirBullet2:"O Navidrome deve varrer a biblioteca que inclui esta pasta.",slskdSourceDirBullet3:"Caminho visto pelo Downtify — não o caminho do host nem a URL do slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Pasta slskd no Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"O Downtify observa esta pasta. Sem cópia para /downloads com “deixar no lugar” ativo.",slskdLeaveInPlace:"Deixar arquivos do slskd no lugar",slskdLeaveInPlaceHint:"Não copiar para /downloads. Taguear no lugar e montar playlists no Navidrome após o scan.",slskdDownloadTimeout:"Tempo máximo slskd (segundos)",slskdQueuedTimeout:"Tempo na fila sem progresso (segundos)",slskdTimeoutHint:'Se o slskd não terminar a tempo, o Downtify tenta o próximo provedor (YouTube). Reduza o tempo na fila se ficar em "Queued on slskd".'},player:{title:"Player",subtitle:"Ouça as músicas que você baixou.",empty:"Nada para tocar ainda",emptyHint:"Baixe alguma música para começar a ouvir.",queue:"Fila",play:"Reproduzir",pause:"Pausar",previous:"Anterior",next:"Próxima",shuffle:"Aleatório",shuffleOn:"Aleatório ligado",shuffleOff:"Aleatório desligado",repeatOff:"Repetição desligada",repeatAll:"Repetir tudo",repeatOne:"Repetir uma",volume:"Volume",mute:"Mudo",unmute:"Tirar mudo",nowPlaying:"Tocando agora",upNext:"A seguir",playFromLibrary:"Abrir no player",countOne:"{count} faixa",countMany:"{count} faixas"},footer:{tagline:"Baixador de músicas de código aberto"}},ws=[{code:"en",name:"English",messages:ap},{code:"es",name:"Español",messages:cp},{code:"pt-BR",name:"Português (BR)",messages:up}],mo="en",Tc="downtify-locale",gl=(()=>{try{return localStorage.getItem(Tc)}catch{return null}})(),dp=ws.find(e=>e.code===gl)?gl:mo,Oo=te(dp);function yl(e){return ws.find(t=>t.code===e)||ws.find(t=>t.code===mo)}function vl(e,t){if(!e)return;const n=t.split(".");let s=e;for(const o of n){if(s==null||typeof s!="object")return;s=s[o]}return typeof s=="string"?s:void 0}function fp(e,t){return t?e.replace(/\{(\w+)\}/g,(n,s)=>t[s]!==void 0&&t[s]!==null?String(t[s]):`{${s}}`):e}function pp(e,t){const n=Oo.value;let s=vl(yl(n).messages,e);return s===void 0&&n!==mo&&(s=vl(yl(mo).messages,e)),fp(s!==void 0?s:e,t)}function hp(e){if(ws.find(t=>t.code===e)){Oo.value=e;try{localStorage.setItem(Tc,e)}catch{}typeof document<"u"&&document.documentElement.setAttribute("lang",e)}}function kt(){return{t:pp,locale:Oo,setLocale:hp,locales:ws}}typeof document<"u"&&document.documentElement.setAttribute("lang",Oo.value);const mp={class:"mt-auto px-6 py-6 text-center text-sm text-base-content/60"},gp={__name:"Footer",setup(e){const{t}=kt();return(n,s)=>(A(),T("footer",mp,[s[0]||(s[0]=p("a",{class:"font-semibold text-primary hover:underline",href:"https://github.com/henriquesebastiao/downtify",target:"_blank",rel:"noopener"},"Downtify",-1)),s[1]||(s[1]=p("span",{class:"mx-2 opacity-50"},"·",-1)),p("span",null,w(u(t)("footer.tagline")),1)]))}},Pc=/^[a-z0-9]+(-[a-z0-9]+)*$/,Do=(e,t,n,s="")=>{const o=e.split(":");if(e.slice(0,1)==="@"){if(o.length<2||o.length>3)return null;s=o.shift().slice(1)}if(o.length>3||!o.length)return null;if(o.length>1){const l=o.pop(),a=o.pop(),d={provider:o.length>0?o[0]:s,prefix:a,name:l};return t&&!Zs(d)?null:d}const r=o[0],i=r.split("-");if(i.length>1){const l={provider:s,prefix:i.shift(),name:i.join("-")};return t&&!Zs(l)?null:l}if(n&&s===""){const l={provider:s,prefix:"",name:r};return t&&!Zs(l,n)?null:l}return null},Zs=(e,t)=>e?!!((t&&e.prefix===""||e.prefix)&&e.name):!1,Oc=Object.freeze({left:0,top:0,width:16,height:16}),go=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),No=Object.freeze({...Oc,...go}),Cr=Object.freeze({...No,body:"",hidden:!1});function yp(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const s=((e.rotate||0)+(t.rotate||0))%4;return s&&(n.rotate=s),n}function bl(e,t){const n=yp(e,t);for(const s in Cr)s in go?s in e&&!(s in n)&&(n[s]=go[s]):s in t?n[s]=t[s]:s in e&&(n[s]=e[s]);return n}function vp(e,t){const n=e.icons,s=e.aliases||Object.create(null),o=Object.create(null);function r(i){if(n[i])return o[i]=[];if(!(i in o)){o[i]=null;const l=s[i]&&s[i].parent,a=l&&r(l);a&&(o[i]=[l].concat(a))}return o[i]}return Object.keys(n).concat(Object.keys(s)).forEach(r),o}function bp(e,t,n){const s=e.icons,o=e.aliases||Object.create(null);let r={};function i(l){r=bl(s[l]||o[l],r)}return i(t),n.forEach(i),bl(e,r)}function Dc(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(o=>{t(o,null),n.push(o)});const s=vp(e);for(const o in s){const r=s[o];r&&(t(o,bp(e,o,r)),n.push(o))}return n}const _p={provider:"",aliases:{},not_found:{},...Oc};function nr(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function Nc(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!nr(e,_p))return null;const n=t.icons;for(const o in n){const r=n[o];if(!o||typeof r.body!="string"||!nr(r,Cr))return null}const s=t.aliases||Object.create(null);for(const o in s){const r=s[o],i=r.parent;if(!o||typeof i!="string"||!n[i]&&!s[i]||!nr(r,Cr))return null}return t}const _l=Object.create(null);function xp(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function Un(e,t){const n=_l[e]||(_l[e]=Object.create(null));return n[t]||(n[t]=xp(e,t))}function Ic(e,t){return Nc(t)?Dc(t,(n,s)=>{s?e.icons[n]=s:e.missing.add(n)}):[]}function wp(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let ks=!1;function $c(e){return typeof e=="boolean"&&(ks=e),ks}function kp(e){const t=typeof e=="string"?Do(e,!0,ks):e;if(t){const n=Un(t.provider,t.prefix),s=t.name;return n.icons[s]||(n.missing.has(s)?null:void 0)}}function Sp(e,t){const n=Do(e,!0,ks);if(!n)return!1;const s=Un(n.provider,n.prefix);return t?wp(s,n.name,t):(s.missing.add(n.name),!0)}function Ep(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),ks&&!t&&!e.prefix){let o=!1;return Nc(e)&&(e.prefix="",Dc(e,(r,i)=>{Sp(r,i)&&(o=!0)})),o}const n=e.prefix;if(!Zs({prefix:n,name:"a"}))return!1;const s=Un(t,n);return!!Ic(s,e)}const Lc=Object.freeze({width:null,height:null}),Fc=Object.freeze({...Lc,...go}),Ap=/(-?[0-9.]*[0-9]+[0-9.]*)/g,Rp=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function xl(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const s=e.split(Ap);if(s===null||!s.length)return e;const o=[];let r=s.shift(),i=Rp.test(r);for(;;){if(i){const l=parseFloat(r);isNaN(l)?o.push(r):o.push(Math.ceil(l*t*n)/n)}else o.push(r);if(r=s.shift(),r===void 0)return o.join("");i=!i}}function Cp(e,t="defs"){let n="";const s=e.indexOf("<"+t);for(;s>=0;){const o=e.indexOf(">",s),r=e.indexOf("",r);if(i===-1)break;n+=e.slice(o+1,r).trim(),e=e.slice(0,s).trim()+e.slice(i+1)}return{defs:n,content:e}}function Tp(e,t){return e?""+e+""+t:t}function Pp(e,t,n){const s=Cp(e);return Tp(s.defs,t+s.content+n)}const Op=e=>e==="unset"||e==="undefined"||e==="none";function Dp(e,t){const n={...No,...e},s={...Fc,...t},o={left:n.left,top:n.top,width:n.width,height:n.height};let r=n.body;[n,s].forEach(v=>{const h=[],k=v.hFlip,R=v.vFlip;let S=v.rotate;k?R?S+=2:(h.push("translate("+(o.width+o.left).toString()+" "+(0-o.top).toString()+")"),h.push("scale(-1 1)"),o.top=o.left=0):R&&(h.push("translate("+(0-o.left).toString()+" "+(o.height+o.top).toString()+")"),h.push("scale(1 -1)"),o.top=o.left=0);let C;switch(S<0&&(S-=Math.floor(S/4)*4),S=S%4,S){case 1:C=o.height/2+o.top,h.unshift("rotate(90 "+C.toString()+" "+C.toString()+")");break;case 2:h.unshift("rotate(180 "+(o.width/2+o.left).toString()+" "+(o.height/2+o.top).toString()+")");break;case 3:C=o.width/2+o.left,h.unshift("rotate(-90 "+C.toString()+" "+C.toString()+")");break}S%2===1&&(o.left!==o.top&&(C=o.left,o.left=o.top,o.top=C),o.width!==o.height&&(C=o.width,o.width=o.height,o.height=C)),h.length&&(r=Pp(r,'',""))});const i=s.width,l=s.height,a=o.width,d=o.height;let c,f;i===null?(f=l===null?"1em":l==="auto"?d:l,c=xl(f,a/d)):(c=i==="auto"?a:i,f=l===null?xl(c,d/a):l==="auto"?d:l);const m={},b=(v,h)=>{Op(h)||(m[v]=h.toString())};b("width",c),b("height",f);const y=[o.left,o.top,a,d];return m.viewBox=y.join(" "),{attributes:m,viewBox:y,body:r}}const Np=/\sid="(\S+)"/g,Ip="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let $p=0;function Lp(e,t=Ip){const n=[];let s;for(;s=Np.exec(e);)n.push(s[1]);if(!n.length)return e;const o="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(r=>{const i=typeof t=="function"?t(r):t+($p++).toString(),l=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+i+o+"$3")}),e=e.replace(new RegExp(o,"g"),""),e}const Tr=Object.create(null);function Fp(e,t){Tr[e]=t}function Pr(e){return Tr[e]||Tr[""]}function ci(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const ui=Object.create(null),Zn=["https://api.simplesvg.com","https://api.unisvg.com"],eo=[];for(;Zn.length>0;)Zn.length===1||Math.random()>.5?eo.push(Zn.shift()):eo.push(Zn.pop());ui[""]=ci({resources:["https://api.iconify.design"].concat(eo)});function Mp(e,t){const n=ci(t);return n===null?!1:(ui[e]=n,!0)}function di(e){return ui[e]}const Up=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let wl=Up();function Bp(e,t){const n=di(e);if(!n)return 0;let s;if(!n.maxURL)s=0;else{let o=0;n.resources.forEach(i=>{o=Math.max(o,i.length)});const r=t+".json?icons=";s=n.maxURL-o-n.path.length-r.length}return s}function Hp(e){return e===404}const jp=(e,t,n)=>{const s=[],o=Bp(e,t),r="icons";let i={type:r,provider:e,prefix:t,icons:[]},l=0;return n.forEach((a,d)=>{l+=a.length+1,l>=o&&d>0&&(s.push(i),i={type:r,provider:e,prefix:t,icons:[]},l=a.length),i.icons.push(a)}),s.push(i),s};function qp(e){if(typeof e=="string"){const t=di(e);if(t)return t.path}return"/"}const Vp=(e,t,n)=>{if(!wl){n("abort",424);return}let s=qp(t.provider);switch(t.type){case"icons":{const r=t.prefix,l=t.icons.join(","),a=new URLSearchParams({icons:l});s+=r+".json?"+a.toString();break}case"custom":{const r=t.uri;s+=r.slice(0,1)==="/"?r.slice(1):r;break}default:n("abort",400);return}let o=503;wl(e+s).then(r=>{const i=r.status;if(i!==200){setTimeout(()=>{n(Hp(i)?"abort":"next",i)});return}return o=501,r.json()}).then(r=>{if(typeof r!="object"||r===null){setTimeout(()=>{r===404?n("abort",r):n("next",o)});return}setTimeout(()=>{n("success",r)})}).catch(()=>{n("next",o)})},Wp={prepare:jp,send:Vp};function Kp(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((o,r)=>o.provider!==r.provider?o.provider.localeCompare(r.provider):o.prefix!==r.prefix?o.prefix.localeCompare(r.prefix):o.name.localeCompare(r.name));let s={provider:"",prefix:"",name:""};return e.forEach(o=>{if(s.name===o.name&&s.prefix===o.prefix&&s.provider===o.provider)return;s=o;const r=o.provider,i=o.prefix,l=o.name,a=n[r]||(n[r]=Object.create(null)),d=a[i]||(a[i]=Un(r,i));let c;l in d.icons?c=t.loaded:i===""||d.missing.has(l)?c=t.missing:c=t.pending;const f={provider:r,prefix:i,name:l};c.push(f)}),t}function Mc(e,t){e.forEach(n=>{const s=n.loaderCallbacks;s&&(n.loaderCallbacks=s.filter(o=>o.id!==t))})}function zp(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const s=e.provider,o=e.prefix;t.forEach(r=>{const i=r.icons,l=i.pending.length;i.pending=i.pending.filter(a=>{if(a.prefix!==o)return!0;const d=a.name;if(e.icons[d])i.loaded.push({provider:s,prefix:o,name:d});else if(e.missing.has(d))i.missing.push({provider:s,prefix:o,name:d});else return n=!0,!0;return!1}),i.pending.length!==l&&(n||Mc([e],r.id),r.callback(i.loaded.slice(0),i.missing.slice(0),i.pending.slice(0),r.abort))})}))}let Qp=0;function Gp(e,t,n){const s=Qp++,o=Mc.bind(null,n,s);if(!t.pending.length)return o;const r={id:s,icons:t,callback:e,abort:o};return n.forEach(i=>{(i.loaderCallbacks||(i.loaderCallbacks=[])).push(r)}),o}function Jp(e,t=!0,n=!1){const s=[];return e.forEach(o=>{const r=typeof o=="string"?Do(o,t,n):o;r&&s.push(r)}),s}var Yp={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function Xp(e,t,n,s){const o=e.resources.length,r=e.random?Math.floor(Math.random()*o):e.index;let i;if(e.random){let P=e.resources.slice(0);for(i=[];P.length>1;){const U=Math.floor(Math.random()*P.length);i.push(P[U]),P=P.slice(0,U).concat(P.slice(U+1))}i=i.concat(P)}else i=e.resources.slice(r).concat(e.resources.slice(0,r));const l=Date.now();let a="pending",d=0,c,f=null,m=[],b=[];typeof s=="function"&&b.push(s);function y(){f&&(clearTimeout(f),f=null)}function v(){a==="pending"&&(a="aborted"),y(),m.forEach(P=>{P.status==="pending"&&(P.status="aborted")}),m=[]}function h(P,U){U&&(b=[]),typeof P=="function"&&b.push(P)}function k(){return{startTime:l,payload:t,status:a,queriesSent:d,queriesPending:m.length,subscribe:h,abort:v}}function R(){a="failed",b.forEach(P=>{P(void 0,c)})}function S(){m.forEach(P=>{P.status==="pending"&&(P.status="aborted")}),m=[]}function C(P,U,ae){const I=U!=="success";switch(m=m.filter(W=>W!==P),a){case"pending":break;case"failed":if(I||!e.dataAfterTimeout)return;break;default:return}if(U==="abort"){c=ae,R();return}if(I){c=ae,m.length||(i.length?L():R());return}if(y(),S(),!e.random){const W=e.resources.indexOf(P.resource);W!==-1&&W!==e.index&&(e.index=W)}a="completed",b.forEach(W=>{W(ae)})}function L(){if(a!=="pending")return;y();const P=i.shift();if(P===void 0){if(m.length){f=setTimeout(()=>{y(),a==="pending"&&(S(),R())},e.timeout);return}R();return}const U={status:"pending",resource:P,callback:(ae,I)=>{C(U,ae,I)}};m.push(U),d++,f=setTimeout(L,e.rotate),n(P,t,U.callback)}return setTimeout(L),k}function Uc(e){const t={...Yp,...e};let n=[];function s(){n=n.filter(l=>l().status==="pending")}function o(l,a,d){const c=Xp(t,l,a,(f,m)=>{s(),d&&d(f,m)});return n.push(c),c}function r(l){return n.find(a=>l(a))||null}return{query:o,find:r,setIndex:l=>{t.index=l},getIndex:()=>t.index,cleanup:s}}function kl(){}const sr=Object.create(null);function Zp(e){if(!sr[e]){const t=di(e);if(!t)return;const n=Uc(t),s={config:t,redundancy:n};sr[e]=s}return sr[e]}function eh(e,t,n){let s,o;if(typeof e=="string"){const r=Pr(e);if(!r)return n(void 0,424),kl;o=r.send;const i=Zp(e);i&&(s=i.redundancy)}else{const r=ci(e);if(r){s=Uc(r);const i=e.resources?e.resources[0]:"",l=Pr(i);l&&(o=l.send)}}return!s||!o?(n(void 0,424),kl):s.query(t,o,n)().abort}function Sl(){}function th(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,zp(e)}))}function nh(e){const t=[],n=[];return e.forEach(s=>{(s.match(Pc)?t:n).push(s)}),{valid:t,invalid:n}}function es(e,t,n){function s(){const o=e.pendingIcons;t.forEach(r=>{o&&o.delete(r),e.icons[r]||e.missing.add(r)})}if(n&&typeof n=="object")try{if(!Ic(e,n).length){s();return}}catch(o){console.error(o)}s(),th(e)}function El(e,t){e instanceof Promise?e.then(n=>{t(n)}).catch(()=>{t(null)}):t(e)}function sh(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:s}=e,o=e.iconsToLoad;if(delete e.iconsToLoad,!o||!o.length)return;const r=e.loadIcon;if(e.loadIcons&&(o.length>1||!r)){El(e.loadIcons(o,s,n),c=>{es(e,o,c)});return}if(r){o.forEach(c=>{const f=r(c,s,n);El(f,m=>{const b=m?{prefix:s,icons:{[c]:m}}:null;es(e,[c],b)})});return}const{valid:i,invalid:l}=nh(o);if(l.length&&es(e,l,null),!i.length)return;const a=s.match(Pc)?Pr(n):null;if(!a){es(e,i,null);return}a.prepare(n,s,i).forEach(c=>{eh(n,c,f=>{es(e,c.icons,f)})})}))}const oh=(e,t)=>{const n=Jp(e,!0,$c()),s=Kp(n);if(!s.pending.length){let a=!0;return t&&setTimeout(()=>{a&&t(s.loaded,s.missing,s.pending,Sl)}),()=>{a=!1}}const o=Object.create(null),r=[];let i,l;return s.pending.forEach(a=>{const{provider:d,prefix:c}=a;if(c===l&&d===i)return;i=d,l=c,r.push(Un(d,c));const f=o[d]||(o[d]=Object.create(null));f[c]||(f[c]=[])}),s.pending.forEach(a=>{const{provider:d,prefix:c,name:f}=a,m=Un(d,c),b=m.pendingIcons||(m.pendingIcons=new Set);b.has(f)||(b.add(f),o[d][c].push(f))}),r.forEach(a=>{const d=o[a.provider][a.prefix];d.length&&sh(a,d)}),t?Gp(t,s,r):Sl};function rh(e,t){const n={...e};for(const s in t){const o=t[s],r=typeof o;s in Lc?(o===null||o&&(r==="string"||r==="number"))&&(n[s]=o):r===typeof n[s]&&(n[s]=s==="rotate"?o%4:o)}return n}const ih=/[\s,]+/;function lh(e,t){t.split(ih).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function ah(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function s(o){for(;o<0;)o+=4;return o%4}if(n===""){const o=parseInt(e);return isNaN(o)?0:s(o)}else if(n!==e){let o=0;switch(n){case"%":o=25;break;case"deg":o=90}if(o){let r=parseFloat(e.slice(0,e.length-n.length));return isNaN(r)?0:(r=r/o,r%1===0?s(r):0)}}return t}function ch(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const s in t)n+=" "+s+'="'+t[s]+'"';return'"+e+""}function uh(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function dh(e){return"data:image/svg+xml,"+uh(e)}function fh(e){return'url("'+dh(e)+'")'}const Al={...Fc,inline:!1},ph={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},hh={display:"inline-block"},Or={backgroundColor:"currentColor"},Bc={backgroundColor:"transparent"},Rl={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Cl={webkitMask:Or,mask:Or,background:Bc};for(const e in Cl){const t=Cl[e];for(const n in Rl)t[e+n]=Rl[n]}const to={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";to[e+"-flip"]=t,to[e.slice(0,1)+"-flip"]=t,to[e+"Flip"]=t});function Tl(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const Pl=(e,t)=>{const n=rh(Al,t),s={...ph},o=t.mode||"svg",r={},i=t.style,l=typeof i=="object"&&!(i instanceof Array)?i:{};for(let v in t){const h=t[v];if(h!==void 0)switch(v){case"icon":case"style":case"onLoad":case"mode":case"ssr":break;case"inline":case"hFlip":case"vFlip":n[v]=h===!0||h==="true"||h===1;break;case"flip":typeof h=="string"&&lh(n,h);break;case"color":r.color=h;break;case"rotate":typeof h=="string"?n[v]=ah(h):typeof h=="number"&&(n[v]=h);break;case"ariaHidden":case"aria-hidden":h!==!0&&h!=="true"&&delete s["aria-hidden"];break;default:{const k=to[v];k?(h===!0||h==="true"||h===1)&&(n[k]=!0):Al[v]===void 0&&(s[v]=h)}}}const a=Dp(e,n),d=a.attributes;if(n.inline&&(r.verticalAlign="-0.125em"),o==="svg"){s.style={...r,...l},Object.assign(s,d);let v=0,h=t.id;return typeof h=="string"&&(h=h.replace(/-/g,"_")),s.innerHTML=Lp(a.body,h?()=>h+"ID"+v++:"iconifyVue"),bs("svg",s)}const{body:c,width:f,height:m}=e,b=o==="mask"||(o==="bg"?!1:c.indexOf("currentColor")!==-1),y=ch(c,{...d,width:f+"",height:m+""});return s.style={...r,"--svg":fh(y),width:Tl(d.width),height:Tl(d.height),...hh,...b?Or:Bc,...l},bs("span",s)};$c(!0);Fp("",Wp);if(typeof document<"u"&&typeof window<"u"){const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(s=>{try{(typeof s!="object"||s===null||s instanceof Array||typeof s.icons!="object"||typeof s.prefix!="string"||!Ep(s))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const s="IconifyProviders["+n+"] is invalid.";try{const o=t[n];if(typeof o!="object"||!o||o.resources===void 0)continue;Mp(n,o)||console.error(s)}catch{console.error(s)}}}}const mh={...No,body:""},G=si({inheritAttrs:!1,data(){return{_name:"",_loadingIcon:null,iconMounted:!1,counter:0}},mounted(){this.iconMounted=!0},unmounted(){this.abortLoading()},methods:{abortLoading(){this._loadingIcon&&(this._loadingIcon.abort(),this._loadingIcon=null)},getIcon(e,t,n){if(typeof e=="object"&&e!==null&&typeof e.body=="string")return this._name="",this.abortLoading(),{data:e};let s;if(typeof e!="string"||(s=Do(e,!1,!0))===null)return this.abortLoading(),null;let o=kp(s);if(!o)return(!this._loadingIcon||this._loadingIcon.name!==e)&&(this.abortLoading(),this._name="",o!==null&&(this._loadingIcon={name:e,abort:oh([s],()=>{this.counter++})})),null;if(this.abortLoading(),this._name!==e&&(this._name=e,t&&t(e)),n){o=Object.assign({},o);const i=n(o.body,s.name,s.prefix,s.provider);typeof i=="string"&&(o.body=i)}const r=["iconify"];return s.prefix!==""&&r.push("iconify--"+s.prefix),s.provider!==""&&r.push("iconify--"+s.provider),{data:o,classes:r}}},render(){this.counter;const e=this.$attrs,t=this.iconMounted||e.ssr?this.getIcon(e.icon,e.onLoad,e.customise):null;if(!t)return Pl(mh,e);let n=e;return t.classes&&(n={...e,class:(typeof e.class=="string"?e.class+" ":"")+t.classes.join(" ")}),Pl({...No,...t.data},n)}});function Hc(e,t){return function(){return e.apply(t,arguments)}}const{toString:gh}=Object.prototype,{getPrototypeOf:fi}=Object,{iterator:Io,toStringTag:jc}=Symbol,$o=(e=>t=>{const n=gh.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),St=e=>(e=e.toLowerCase(),t=>$o(t)===e),Lo=e=>t=>typeof t===e,{isArray:Kn}=Array,Bn=Lo("undefined");function Cs(e){return e!==null&&!Bn(e)&&e.constructor!==null&&!Bn(e.constructor)&&tt(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const qc=St("ArrayBuffer");function yh(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&qc(e.buffer),t}const vh=Lo("string"),tt=Lo("function"),Vc=Lo("number"),Ts=e=>e!==null&&typeof e=="object",bh=e=>e===!0||e===!1,no=e=>{if($o(e)!=="object")return!1;const t=fi(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(jc in e)&&!(Io in e)},_h=e=>{if(!Ts(e)||Cs(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},xh=St("Date"),wh=St("File"),kh=St("Blob"),Sh=St("FileList"),Eh=e=>Ts(e)&&tt(e.pipe),Ah=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||tt(e.append)&&((t=$o(e))==="formdata"||t==="object"&&tt(e.toString)&&e.toString()==="[object FormData]"))},Rh=St("URLSearchParams"),[Ch,Th,Ph,Oh]=["ReadableStream","Request","Response","Headers"].map(St),Dh=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ps(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let s,o;if(typeof e!="object"&&(e=[e]),Kn(e))for(s=0,o=e.length;s0;)if(o=n[s],t===o.toLowerCase())return o;return null}const _n=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Kc=e=>!Bn(e)&&e!==_n;function Dr(){const{caseless:e,skipUndefined:t}=Kc(this)&&this||{},n={},s=(o,r)=>{if(r==="__proto__"||r==="constructor"||r==="prototype")return;const i=e&&Wc(n,r)||r;no(n[i])&&no(o)?n[i]=Dr(n[i],o):no(o)?n[i]=Dr({},o):Kn(o)?n[i]=o.slice():(!t||!Bn(o))&&(n[i]=o)};for(let o=0,r=arguments.length;o(Ps(t,(o,r)=>{n&&tt(o)?Object.defineProperty(e,r,{value:Hc(o,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:s}),e),Ih=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),$h=(e,t,n,s)=>{e.prototype=Object.create(t.prototype,s),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},Lh=(e,t,n,s)=>{let o,r,i;const l={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),r=o.length;r-- >0;)i=o[r],(!s||s(i,e,t))&&!l[i]&&(t[i]=e[i],l[i]=!0);e=n!==!1&&fi(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Fh=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const s=e.indexOf(t,n);return s!==-1&&s===n},Mh=e=>{if(!e)return null;if(Kn(e))return e;let t=e.length;if(!Vc(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Uh=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&fi(Uint8Array)),Bh=(e,t)=>{const s=(e&&e[Io]).call(e);let o;for(;(o=s.next())&&!o.done;){const r=o.value;t.call(e,r[0],r[1])}},Hh=(e,t)=>{let n;const s=[];for(;(n=e.exec(t))!==null;)s.push(n);return s},jh=St("HTMLFormElement"),qh=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,s,o){return s.toUpperCase()+o}),Ol=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Vh=St("RegExp"),zc=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),s={};Ps(n,(o,r)=>{let i;(i=t(o,r,e))!==!1&&(s[r]=i||o)}),Object.defineProperties(e,s)},Wh=e=>{zc(e,(t,n)=>{if(tt(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const s=e[n];if(tt(s)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},Kh=(e,t)=>{const n={},s=o=>{o.forEach(r=>{n[r]=!0})};return Kn(e)?s(e):s(String(e).split(t)),n},zh=()=>{},Qh=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Gh(e){return!!(e&&tt(e.append)&&e[jc]==="FormData"&&e[Io])}const Jh=e=>{const t=new Array(10),n=(s,o)=>{if(Ts(s)){if(t.indexOf(s)>=0)return;if(Cs(s))return s;if(!("toJSON"in s)){t[o]=s;const r=Kn(s)?[]:{};return Ps(s,(i,l)=>{const a=n(i,o+1);!Bn(a)&&(r[l]=a)}),t[o]=void 0,r}}return s};return n(e,0)},Yh=St("AsyncFunction"),Xh=e=>e&&(Ts(e)||tt(e))&&tt(e.then)&&tt(e.catch),Qc=((e,t)=>e?setImmediate:t?((n,s)=>(_n.addEventListener("message",({source:o,data:r})=>{o===_n&&r===n&&s.length&&s.shift()()},!1),o=>{s.push(o),_n.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",tt(_n.postMessage)),Zh=typeof queueMicrotask<"u"?queueMicrotask.bind(_n):typeof process<"u"&&process.nextTick||Qc,em=e=>e!=null&&tt(e[Io]),E={isArray:Kn,isArrayBuffer:qc,isBuffer:Cs,isFormData:Ah,isArrayBufferView:yh,isString:vh,isNumber:Vc,isBoolean:bh,isObject:Ts,isPlainObject:no,isEmptyObject:_h,isReadableStream:Ch,isRequest:Th,isResponse:Ph,isHeaders:Oh,isUndefined:Bn,isDate:xh,isFile:wh,isBlob:kh,isRegExp:Vh,isFunction:tt,isStream:Eh,isURLSearchParams:Rh,isTypedArray:Uh,isFileList:Sh,forEach:Ps,merge:Dr,extend:Nh,trim:Dh,stripBOM:Ih,inherits:$h,toFlatObject:Lh,kindOf:$o,kindOfTest:St,endsWith:Fh,toArray:Mh,forEachEntry:Bh,matchAll:Hh,isHTMLForm:jh,hasOwnProperty:Ol,hasOwnProp:Ol,reduceDescriptors:zc,freezeMethods:Wh,toObjectSet:Kh,toCamelCase:qh,noop:zh,toFiniteNumber:Qh,findKey:Wc,global:_n,isContextDefined:Kc,isSpecCompliantForm:Gh,toJSONObject:Jh,isAsyncFn:Yh,isThenable:Xh,setImmediate:Qc,asap:Zh,isIterable:em};let ee=class Gc extends Error{static from(t,n,s,o,r,i){const l=new Gc(t.message,n||t.code,s,o,r);return l.cause=t,l.name=t.name,i&&Object.assign(l,i),l}constructor(t,n,s,o,r){super(t),this.name="AxiosError",this.isAxiosError=!0,n&&(this.code=n),s&&(this.config=s),o&&(this.request=o),r&&(this.response=r,this.status=r.status)}toJSON(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:E.toJSONObject(this.config),code:this.code,status:this.status}}};ee.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";ee.ERR_BAD_OPTION="ERR_BAD_OPTION";ee.ECONNABORTED="ECONNABORTED";ee.ETIMEDOUT="ETIMEDOUT";ee.ERR_NETWORK="ERR_NETWORK";ee.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";ee.ERR_DEPRECATED="ERR_DEPRECATED";ee.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";ee.ERR_BAD_REQUEST="ERR_BAD_REQUEST";ee.ERR_CANCELED="ERR_CANCELED";ee.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";ee.ERR_INVALID_URL="ERR_INVALID_URL";const tm=null;function Nr(e){return E.isPlainObject(e)||E.isArray(e)}function Jc(e){return E.endsWith(e,"[]")?e.slice(0,-2):e}function Dl(e,t,n){return e?e.concat(t).map(function(o,r){return o=Jc(o),!n&&r?"["+o+"]":o}).join(n?".":""):t}function nm(e){return E.isArray(e)&&!e.some(Nr)}const sm=E.toFlatObject(E,{},null,function(t){return/^is[A-Z]/.test(t)});function Fo(e,t,n){if(!E.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=E.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(v,h){return!E.isUndefined(h[v])});const s=n.metaTokens,o=n.visitor||c,r=n.dots,i=n.indexes,a=(n.Blob||typeof Blob<"u"&&Blob)&&E.isSpecCompliantForm(t);if(!E.isFunction(o))throw new TypeError("visitor must be a function");function d(y){if(y===null)return"";if(E.isDate(y))return y.toISOString();if(E.isBoolean(y))return y.toString();if(!a&&E.isBlob(y))throw new ee("Blob is not supported. Use a Buffer instead.");return E.isArrayBuffer(y)||E.isTypedArray(y)?a&&typeof Blob=="function"?new Blob([y]):Buffer.from(y):y}function c(y,v,h){let k=y;if(y&&!h&&typeof y=="object"){if(E.endsWith(v,"{}"))v=s?v:v.slice(0,-2),y=JSON.stringify(y);else if(E.isArray(y)&&nm(y)||(E.isFileList(y)||E.endsWith(v,"[]"))&&(k=E.toArray(y)))return v=Jc(v),k.forEach(function(S,C){!(E.isUndefined(S)||S===null)&&t.append(i===!0?Dl([v],C,r):i===null?v:v+"[]",d(S))}),!1}return Nr(y)?!0:(t.append(Dl(h,v,r),d(y)),!1)}const f=[],m=Object.assign(sm,{defaultVisitor:c,convertValue:d,isVisitable:Nr});function b(y,v){if(!E.isUndefined(y)){if(f.indexOf(y)!==-1)throw Error("Circular reference detected in "+v.join("."));f.push(y),E.forEach(y,function(k,R){(!(E.isUndefined(k)||k===null)&&o.call(t,k,E.isString(R)?R.trim():R,v,m))===!0&&b(k,v?v.concat(R):[R])}),f.pop()}}if(!E.isObject(e))throw new TypeError("data must be an object");return b(e),t}function Nl(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(s){return t[s]})}function pi(e,t){this._pairs=[],e&&Fo(e,this,t)}const Yc=pi.prototype;Yc.append=function(t,n){this._pairs.push([t,n])};Yc.toString=function(t){const n=t?function(s){return t.call(this,s,Nl)}:Nl;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function om(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Xc(e,t,n){if(!t)return e;const s=n&&n.encode||om,o=E.isFunction(n)?{serialize:n}:n,r=o&&o.serialize;let i;if(r?i=r(t,o):i=E.isURLSearchParams(t)?t.toString():new pi(t,o).toString(s),i){const l=e.indexOf("#");l!==-1&&(e=e.slice(0,l)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class Il{constructor(){this.handlers=[]}use(t,n,s){return this.handlers.push({fulfilled:t,rejected:n,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){E.forEach(this.handlers,function(s){s!==null&&t(s)})}}const hi={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},rm=typeof URLSearchParams<"u"?URLSearchParams:pi,im=typeof FormData<"u"?FormData:null,lm=typeof Blob<"u"?Blob:null,am={isBrowser:!0,classes:{URLSearchParams:rm,FormData:im,Blob:lm},protocols:["http","https","file","blob","url","data"]},mi=typeof window<"u"&&typeof document<"u",Ir=typeof navigator=="object"&&navigator||void 0,cm=mi&&(!Ir||["ReactNative","NativeScript","NS"].indexOf(Ir.product)<0),um=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",dm=mi&&window.location.href||"http://localhost",fm=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:mi,hasStandardBrowserEnv:cm,hasStandardBrowserWebWorkerEnv:um,navigator:Ir,origin:dm},Symbol.toStringTag,{value:"Module"})),He={...fm,...am};function pm(e,t){return Fo(e,new He.classes.URLSearchParams,{visitor:function(n,s,o,r){return He.isNode&&E.isBuffer(n)?(this.append(s,n.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...t})}function hm(e){return E.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function mm(e){const t={},n=Object.keys(e);let s;const o=n.length;let r;for(s=0;s=n.length;return i=!i&&E.isArray(o)?o.length:i,a?(E.hasOwnProp(o,i)?o[i]=[o[i],s]:o[i]=s,!l):((!o[i]||!E.isObject(o[i]))&&(o[i]=[]),t(n,s,o[i],r)&&E.isArray(o[i])&&(o[i]=mm(o[i])),!l)}if(E.isFormData(e)&&E.isFunction(e.entries)){const n={};return E.forEachEntry(e,(s,o)=>{t(hm(s),o,n,0)}),n}return null}function gm(e,t,n){if(E.isString(e))try{return(t||JSON.parse)(e),E.trim(e)}catch(s){if(s.name!=="SyntaxError")throw s}return(n||JSON.stringify)(e)}const Os={transitional:hi,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const s=n.getContentType()||"",o=s.indexOf("application/json")>-1,r=E.isObject(t);if(r&&E.isHTMLForm(t)&&(t=new FormData(t)),E.isFormData(t))return o?JSON.stringify(Zc(t)):t;if(E.isArrayBuffer(t)||E.isBuffer(t)||E.isStream(t)||E.isFile(t)||E.isBlob(t)||E.isReadableStream(t))return t;if(E.isArrayBufferView(t))return t.buffer;if(E.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(r){if(s.indexOf("application/x-www-form-urlencoded")>-1)return pm(t,this.formSerializer).toString();if((l=E.isFileList(t))||s.indexOf("multipart/form-data")>-1){const a=this.env&&this.env.FormData;return Fo(l?{"files[]":t}:t,a&&new a,this.formSerializer)}}return r||o?(n.setContentType("application/json",!1),gm(t)):t}],transformResponse:[function(t){const n=this.transitional||Os.transitional,s=n&&n.forcedJSONParsing,o=this.responseType==="json";if(E.isResponse(t)||E.isReadableStream(t))return t;if(t&&E.isString(t)&&(s&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t,this.parseReviver)}catch(l){if(i)throw l.name==="SyntaxError"?ee.from(l,ee.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:He.classes.FormData,Blob:He.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};E.forEach(["delete","get","head","post","put","patch"],e=>{Os.headers[e]={}});const ym=E.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),vm=e=>{const t={};let n,s,o;return e&&e.split(` `).forEach(function(i){o=i.indexOf(":"),n=i.substring(0,o).trim().toLowerCase(),s=i.substring(o+1).trim(),!(!n||t[n]&&ym[n])&&(n==="set-cookie"?t[n]?t[n].push(s):t[n]=[s]:t[n]=t[n]?t[n]+", "+s:s)}),t},$l=Symbol("internals");function ts(e){return e&&String(e).trim().toLowerCase()}function so(e){return e===!1||e==null?e:E.isArray(e)?e.map(so):String(e)}function bm(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=n.exec(e);)t[s[1]]=s[2];return t}const _m=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function or(e,t,n,s,o){if(E.isFunction(s))return s.call(this,t,n);if(o&&(t=n),!!E.isString(t)){if(E.isString(s))return t.indexOf(s)!==-1;if(E.isRegExp(s))return s.test(t)}}function xm(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,s)=>n.toUpperCase()+s)}function wm(e,t){const n=E.toCamelCase(" "+t);["get","set","has"].forEach(s=>{Object.defineProperty(e,s+n,{value:function(o,r,i){return this[s].call(this,t,o,r,i)},configurable:!0})})}let nt=class{constructor(t){t&&this.set(t)}set(t,n,s){const o=this;function r(l,a,d){const c=ts(a);if(!c)throw new Error("header name must be a non-empty string");const f=E.findKey(o,c);(!f||o[f]===void 0||d===!0||d===void 0&&o[f]!==!1)&&(o[f||a]=so(l))}const i=(l,a)=>E.forEach(l,(d,c)=>r(d,c,a));if(E.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(E.isString(t)&&(t=t.trim())&&!_m(t))i(vm(t),n);else if(E.isObject(t)&&E.isIterable(t)){let l={},a,d;for(const c of t){if(!E.isArray(c))throw TypeError("Object iterator must return a key-value pair");l[d=c[0]]=(a=l[d])?E.isArray(a)?[...a,c[1]]:[a,c[1]]:c[1]}i(l,n)}else t!=null&&r(n,t,s);return this}get(t,n){if(t=ts(t),t){const s=E.findKey(this,t);if(s){const o=this[s];if(!n)return o;if(n===!0)return bm(o);if(E.isFunction(n))return n.call(this,o,s);if(E.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=ts(t),t){const s=E.findKey(this,t);return!!(s&&this[s]!==void 0&&(!n||or(this,this[s],s,n)))}return!1}delete(t,n){const s=this;let o=!1;function r(i){if(i=ts(i),i){const l=E.findKey(s,i);l&&(!n||or(s,s[l],l,n))&&(delete s[l],o=!0)}}return E.isArray(t)?t.forEach(r):r(t),o}clear(t){const n=Object.keys(this);let s=n.length,o=!1;for(;s--;){const r=n[s];(!t||or(this,this[r],r,t,!0))&&(delete this[r],o=!0)}return o}normalize(t){const n=this,s={};return E.forEach(this,(o,r)=>{const i=E.findKey(s,r);if(i){n[i]=so(o),delete n[r];return}const l=t?xm(r):String(r).trim();l!==r&&delete n[r],n[l]=so(o),s[l]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return E.forEach(this,(s,o)=>{s!=null&&s!==!1&&(n[o]=t&&E.isArray(s)?s.join(", "):s)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` -`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const s=new this(t);return n.forEach(o=>s.set(o)),s}static accessor(t){const s=(this[$l]=this[$l]={accessors:{}}).accessors,o=this.prototype;function r(i){const l=ts(i);s[l]||(wm(o,i),s[l]=!0)}return E.isArray(t)?t.forEach(r):r(t),this}};nt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);E.reduceDescriptors(nt.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(s){this[n]=s}}});E.freezeMethods(nt);function rr(e,t){const n=this||Os,s=t||n,o=nt.from(s.headers);let r=s.data;return E.forEach(e,function(l){r=l.call(n,r,o.normalize(),t?t.status:void 0)}),o.normalize(),r}function eu(e){return!!(e&&e.__CANCEL__)}let Ds=class extends ee{constructor(t,n,s){super(t??"canceled",ee.ERR_CANCELED,n,s),this.name="CanceledError",this.__CANCEL__=!0}};function tu(e,t,n){const s=n.config.validateStatus;!n.status||!s||s(n.status)?e(n):t(new ee("Request failed with status code "+n.status,[ee.ERR_BAD_REQUEST,ee.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function km(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Sm(e,t){e=e||10;const n=new Array(e),s=new Array(e);let o=0,r=0,i;return t=t!==void 0?t:1e3,function(a){const d=Date.now(),c=s[r];i||(i=d),n[o]=a,s[o]=d;let f=r,m=0;for(;f!==o;)m+=n[f++],f=f%e;if(o=(o+1)%e,o===r&&(r=(r+1)%e),d-i{n=c,o=null,r&&(clearTimeout(r),r=null),e(...d)};return[(...d)=>{const c=Date.now(),f=c-n;f>=s?i(d,c):(o=d,r||(r=setTimeout(()=>{r=null,i(o)},s-f)))},()=>o&&i(o)]}const yo=(e,t,n=3)=>{let s=0;const o=Sm(50,250);return Em(r=>{const i=r.loaded,l=r.lengthComputable?r.total:void 0,a=i-s,d=o(a),c=i<=l;s=i;const f={loaded:i,total:l,progress:l?i/l:void 0,bytes:a,rate:d||void 0,estimated:d&&l&&c?(l-i)/d:void 0,event:r,lengthComputable:l!=null,[t?"download":"upload"]:!0};e(f)},n)},Ll=(e,t)=>{const n=e!=null;return[s=>t[0]({lengthComputable:n,total:e,loaded:s}),t[1]]},Fl=e=>(...t)=>E.asap(()=>e(...t)),Am=He.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,He.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(He.origin),He.navigator&&/(msie|trident)/i.test(He.navigator.userAgent)):()=>!0,Rm=He.hasStandardBrowserEnv?{write(e,t,n,s,o,r,i){if(typeof document>"u")return;const l=[`${e}=${encodeURIComponent(t)}`];E.isNumber(n)&&l.push(`expires=${new Date(n).toUTCString()}`),E.isString(s)&&l.push(`path=${s}`),E.isString(o)&&l.push(`domain=${o}`),r===!0&&l.push("secure"),E.isString(i)&&l.push(`SameSite=${i}`),document.cookie=l.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function Cm(e){return typeof e!="string"?!1:/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Tm(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function nu(e,t,n){let s=!Cm(t);return e&&(s||n==!1)?Tm(e,t):t}const Ml=e=>e instanceof nt?{...e}:e;function En(e,t){t=t||{};const n={};function s(d,c,f,m){return E.isPlainObject(d)&&E.isPlainObject(c)?E.merge.call({caseless:m},d,c):E.isPlainObject(c)?E.merge({},c):E.isArray(c)?c.slice():c}function o(d,c,f,m){if(E.isUndefined(c)){if(!E.isUndefined(d))return s(void 0,d,f,m)}else return s(d,c,f,m)}function r(d,c){if(!E.isUndefined(c))return s(void 0,c)}function i(d,c){if(E.isUndefined(c)){if(!E.isUndefined(d))return s(void 0,d)}else return s(void 0,c)}function l(d,c,f){if(f in t)return s(d,c);if(f in e)return s(void 0,d)}const a={url:r,method:r,data:r,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:l,headers:(d,c,f)=>o(Ml(d),Ml(c),f,!0)};return E.forEach(Object.keys({...e,...t}),function(c){if(c==="__proto__"||c==="constructor"||c==="prototype")return;const f=E.hasOwnProp(a,c)?a[c]:o,m=f(e[c],t[c],c);E.isUndefined(m)&&f!==l||(n[c]=m)}),n}const su=e=>{const t=En({},e);let{data:n,withXSRFToken:s,xsrfHeaderName:o,xsrfCookieName:r,headers:i,auth:l}=t;if(t.headers=i=nt.from(i),t.url=Xc(nu(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&i.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),E.isFormData(n)){if(He.hasStandardBrowserEnv||He.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if(E.isFunction(n.getHeaders)){const a=n.getHeaders(),d=["content-type","content-length"];Object.entries(a).forEach(([c,f])=>{d.includes(c.toLowerCase())&&i.set(c,f)})}}if(He.hasStandardBrowserEnv&&(s&&E.isFunction(s)&&(s=s(t)),s||s!==!1&&Am(t.url))){const a=o&&r&&Rm.read(r);a&&i.set(o,a)}return t},Pm=typeof XMLHttpRequest<"u",Om=Pm&&function(e){return new Promise(function(n,s){const o=su(e);let r=o.data;const i=nt.from(o.headers).normalize();let{responseType:l,onUploadProgress:a,onDownloadProgress:d}=o,c,f,m,b,y;function v(){b&&b(),y&&y(),o.cancelToken&&o.cancelToken.unsubscribe(c),o.signal&&o.signal.removeEventListener("abort",c)}let h=new XMLHttpRequest;h.open(o.method.toUpperCase(),o.url,!0),h.timeout=o.timeout;function k(){if(!h)return;const S=nt.from("getAllResponseHeaders"in h&&h.getAllResponseHeaders()),L={data:!l||l==="text"||l==="json"?h.responseText:h.response,status:h.status,statusText:h.statusText,headers:S,config:e,request:h};tu(function(U){n(U),v()},function(U){s(U),v()},L),h=null}"onloadend"in h?h.onloadend=k:h.onreadystatechange=function(){!h||h.readyState!==4||h.status===0&&!(h.responseURL&&h.responseURL.indexOf("file:")===0)||setTimeout(k)},h.onabort=function(){h&&(s(new ee("Request aborted",ee.ECONNABORTED,e,h)),h=null)},h.onerror=function(C){const L=C&&C.message?C.message:"Network Error",P=new ee(L,ee.ERR_NETWORK,e,h);P.event=C||null,s(P),h=null},h.ontimeout=function(){let C=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const L=o.transitional||hi;o.timeoutErrorMessage&&(C=o.timeoutErrorMessage),s(new ee(C,L.clarifyTimeoutError?ee.ETIMEDOUT:ee.ECONNABORTED,e,h)),h=null},r===void 0&&i.setContentType(null),"setRequestHeader"in h&&E.forEach(i.toJSON(),function(C,L){h.setRequestHeader(L,C)}),E.isUndefined(o.withCredentials)||(h.withCredentials=!!o.withCredentials),l&&l!=="json"&&(h.responseType=o.responseType),d&&([m,y]=yo(d,!0),h.addEventListener("progress",m)),a&&h.upload&&([f,b]=yo(a),h.upload.addEventListener("progress",f),h.upload.addEventListener("loadend",b)),(o.cancelToken||o.signal)&&(c=S=>{h&&(s(!S||S.type?new Ds(null,e,h):S),h.abort(),h=null)},o.cancelToken&&o.cancelToken.subscribe(c),o.signal&&(o.signal.aborted?c():o.signal.addEventListener("abort",c)));const R=km(o.url);if(R&&He.protocols.indexOf(R)===-1){s(new ee("Unsupported protocol "+R+":",ee.ERR_BAD_REQUEST,e));return}h.send(r||null)})},Dm=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let s=new AbortController,o;const r=function(d){if(!o){o=!0,l();const c=d instanceof Error?d:this.reason;s.abort(c instanceof ee?c:new Ds(c instanceof Error?c.message:c))}};let i=t&&setTimeout(()=>{i=null,r(new ee(`timeout of ${t}ms exceeded`,ee.ETIMEDOUT))},t);const l=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(d=>{d.unsubscribe?d.unsubscribe(r):d.removeEventListener("abort",r)}),e=null)};e.forEach(d=>d.addEventListener("abort",r));const{signal:a}=s;return a.unsubscribe=()=>E.asap(l),a}},Nm=function*(e,t){let n=e.byteLength;if(n{const o=Im(e,t);let r=0,i,l=a=>{i||(i=!0,s&&s(a))};return new ReadableStream({async pull(a){try{const{done:d,value:c}=await o.next();if(d){l(),a.close();return}let f=c.byteLength;if(n){let m=r+=f;n(m)}a.enqueue(new Uint8Array(c))}catch(d){throw l(d),d}},cancel(a){return l(a),o.return()}},{highWaterMark:2})},Bl=64*1024,{isFunction:qs}=E,Lm=(({Request:e,Response:t})=>({Request:e,Response:t}))(E.global),{ReadableStream:Hl,TextEncoder:jl}=E.global,ql=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Fm=e=>{e=E.merge.call({skipUndefined:!0},Lm,e);const{fetch:t,Request:n,Response:s}=e,o=t?qs(t):typeof fetch=="function",r=qs(n),i=qs(s);if(!o)return!1;const l=o&&qs(Hl),a=o&&(typeof jl=="function"?(y=>v=>y.encode(v))(new jl):async y=>new Uint8Array(await new n(y).arrayBuffer())),d=r&&l&&ql(()=>{let y=!1;const v=new n(He.origin,{body:new Hl,method:"POST",get duplex(){return y=!0,"half"}}).headers.has("Content-Type");return y&&!v}),c=i&&l&&ql(()=>E.isReadableStream(new s("").body)),f={stream:c&&(y=>y.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(y=>{!f[y]&&(f[y]=(v,h)=>{let k=v&&v[y];if(k)return k.call(v);throw new ee(`Response type '${y}' is not supported`,ee.ERR_NOT_SUPPORT,h)})});const m=async y=>{if(y==null)return 0;if(E.isBlob(y))return y.size;if(E.isSpecCompliantForm(y))return(await new n(He.origin,{method:"POST",body:y}).arrayBuffer()).byteLength;if(E.isArrayBufferView(y)||E.isArrayBuffer(y))return y.byteLength;if(E.isURLSearchParams(y)&&(y=y+""),E.isString(y))return(await a(y)).byteLength},b=async(y,v)=>{const h=E.toFiniteNumber(y.getContentLength());return h??m(v)};return async y=>{let{url:v,method:h,data:k,signal:R,cancelToken:S,timeout:C,onDownloadProgress:L,onUploadProgress:P,responseType:U,headers:ae,withCredentials:I="same-origin",fetchOptions:W}=su(y),B=t||fetch;U=U?(U+"").toLowerCase():"text";let q=Dm([R,S&&S.toAbortSignal()],C),se=null;const xe=q&&q.unsubscribe&&(()=>{q.unsubscribe()});let Me;try{if(P&&d&&h!=="get"&&h!=="head"&&(Me=await b(ae,k))!==0){let De=new n(v,{method:"POST",body:k,duplex:"half"}),Oe;if(E.isFormData(k)&&(Oe=De.headers.get("content-type"))&&ae.setContentType(Oe),De.body){const[At,gt]=Ll(Me,yo(Fl(P)));k=Ul(De.body,Bl,At,gt)}}E.isString(I)||(I=I?"include":"omit");const le=r&&"credentials"in n.prototype,fe={...W,signal:q,method:h.toUpperCase(),headers:ae.normalize().toJSON(),body:k,duplex:"half",credentials:le?I:void 0};se=r&&new n(v,fe);let re=await(r?B(se,W):B(v,fe));const ut=c&&(U==="stream"||U==="response");if(c&&(L||ut&&xe)){const De={};["status","statusText","headers"].forEach(Rt=>{De[Rt]=re[Rt]});const Oe=E.toFiniteNumber(re.headers.get("content-length")),[At,gt]=L&&Ll(Oe,yo(Fl(L),!0))||[];re=new s(Ul(re.body,Bl,At,()=>{gt&>(),xe&&xe()}),De)}U=U||"text";let Et=await f[E.findKey(f,U)||"text"](re,y);return!ut&&xe&&xe(),await new Promise((De,Oe)=>{tu(De,Oe,{data:Et,headers:nt.from(re.headers),status:re.status,statusText:re.statusText,config:y,request:se})})}catch(le){throw xe&&xe(),le&&le.name==="TypeError"&&/Load failed|fetch/i.test(le.message)?Object.assign(new ee("Network Error",ee.ERR_NETWORK,y,se,le&&le.response),{cause:le.cause||le}):ee.from(le,le&&le.code,y,se,le&&le.response)}}},Mm=new Map,ou=e=>{let t=e&&e.env||{};const{fetch:n,Request:s,Response:o}=t,r=[s,o,n];let i=r.length,l=i,a,d,c=Mm;for(;l--;)a=r[l],d=c.get(a),d===void 0&&c.set(a,d=l?new Map:Fm(t)),c=d;return d};ou();const gi={http:tm,xhr:Om,fetch:{get:ou}};E.forEach(gi,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Vl=e=>`- ${e}`,Um=e=>E.isFunction(e)||e===null||e===!1;function Bm(e,t){e=E.isArray(e)?e:[e];const{length:n}=e;let s,o;const r={};for(let i=0;i`adapter ${a} `+(d===!1?"is not supported by the environment":"is not available in the build"));let l=n?i.length>1?`since : +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const s=new this(t);return n.forEach(o=>s.set(o)),s}static accessor(t){const s=(this[$l]=this[$l]={accessors:{}}).accessors,o=this.prototype;function r(i){const l=ts(i);s[l]||(wm(o,i),s[l]=!0)}return E.isArray(t)?t.forEach(r):r(t),this}};nt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);E.reduceDescriptors(nt.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(s){this[n]=s}}});E.freezeMethods(nt);function rr(e,t){const n=this||Os,s=t||n,o=nt.from(s.headers);let r=s.data;return E.forEach(e,function(l){r=l.call(n,r,o.normalize(),t?t.status:void 0)}),o.normalize(),r}function eu(e){return!!(e&&e.__CANCEL__)}let Ds=class extends ee{constructor(t,n,s){super(t??"canceled",ee.ERR_CANCELED,n,s),this.name="CanceledError",this.__CANCEL__=!0}};function tu(e,t,n){const s=n.config.validateStatus;!n.status||!s||s(n.status)?e(n):t(new ee("Request failed with status code "+n.status,[ee.ERR_BAD_REQUEST,ee.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function km(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Sm(e,t){e=e||10;const n=new Array(e),s=new Array(e);let o=0,r=0,i;return t=t!==void 0?t:1e3,function(a){const d=Date.now(),c=s[r];i||(i=d),n[o]=a,s[o]=d;let f=r,m=0;for(;f!==o;)m+=n[f++],f=f%e;if(o=(o+1)%e,o===r&&(r=(r+1)%e),d-i{n=c,o=null,r&&(clearTimeout(r),r=null),e(...d)};return[(...d)=>{const c=Date.now(),f=c-n;f>=s?i(d,c):(o=d,r||(r=setTimeout(()=>{r=null,i(o)},s-f)))},()=>o&&i(o)]}const yo=(e,t,n=3)=>{let s=0;const o=Sm(50,250);return Em(r=>{const i=r.loaded,l=r.lengthComputable?r.total:void 0,a=i-s,d=o(a),c=i<=l;s=i;const f={loaded:i,total:l,progress:l?i/l:void 0,bytes:a,rate:d||void 0,estimated:d&&l&&c?(l-i)/d:void 0,event:r,lengthComputable:l!=null,[t?"download":"upload"]:!0};e(f)},n)},Ll=(e,t)=>{const n=e!=null;return[s=>t[0]({lengthComputable:n,total:e,loaded:s}),t[1]]},Fl=e=>(...t)=>E.asap(()=>e(...t)),Am=He.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,He.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(He.origin),He.navigator&&/(msie|trident)/i.test(He.navigator.userAgent)):()=>!0,Rm=He.hasStandardBrowserEnv?{write(e,t,n,s,o,r,i){if(typeof document>"u")return;const l=[`${e}=${encodeURIComponent(t)}`];E.isNumber(n)&&l.push(`expires=${new Date(n).toUTCString()}`),E.isString(s)&&l.push(`path=${s}`),E.isString(o)&&l.push(`domain=${o}`),r===!0&&l.push("secure"),E.isString(i)&&l.push(`SameSite=${i}`),document.cookie=l.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function Cm(e){return typeof e!="string"?!1:/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Tm(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function nu(e,t,n){let s=!Cm(t);return e&&(s||n==!1)?Tm(e,t):t}const Ml=e=>e instanceof nt?{...e}:e;function En(e,t){t=t||{};const n={};function s(d,c,f,m){return E.isPlainObject(d)&&E.isPlainObject(c)?E.merge.call({caseless:m},d,c):E.isPlainObject(c)?E.merge({},c):E.isArray(c)?c.slice():c}function o(d,c,f,m){if(E.isUndefined(c)){if(!E.isUndefined(d))return s(void 0,d,f,m)}else return s(d,c,f,m)}function r(d,c){if(!E.isUndefined(c))return s(void 0,c)}function i(d,c){if(E.isUndefined(c)){if(!E.isUndefined(d))return s(void 0,d)}else return s(void 0,c)}function l(d,c,f){if(f in t)return s(d,c);if(f in e)return s(void 0,d)}const a={url:r,method:r,data:r,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:l,headers:(d,c,f)=>o(Ml(d),Ml(c),f,!0)};return E.forEach(Object.keys({...e,...t}),function(c){if(c==="__proto__"||c==="constructor"||c==="prototype")return;const f=E.hasOwnProp(a,c)?a[c]:o,m=f(e[c],t[c],c);E.isUndefined(m)&&f!==l||(n[c]=m)}),n}const su=e=>{const t=En({},e);let{data:n,withXSRFToken:s,xsrfHeaderName:o,xsrfCookieName:r,headers:i,auth:l}=t;if(t.headers=i=nt.from(i),t.url=Xc(nu(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&i.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),E.isFormData(n)){if(He.hasStandardBrowserEnv||He.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if(E.isFunction(n.getHeaders)){const a=n.getHeaders(),d=["content-type","content-length"];Object.entries(a).forEach(([c,f])=>{d.includes(c.toLowerCase())&&i.set(c,f)})}}if(He.hasStandardBrowserEnv&&(s&&E.isFunction(s)&&(s=s(t)),s||s!==!1&&Am(t.url))){const a=o&&r&&Rm.read(r);a&&i.set(o,a)}return t},Pm=typeof XMLHttpRequest<"u",Om=Pm&&function(e){return new Promise(function(n,s){const o=su(e);let r=o.data;const i=nt.from(o.headers).normalize();let{responseType:l,onUploadProgress:a,onDownloadProgress:d}=o,c,f,m,b,y;function v(){b&&b(),y&&y(),o.cancelToken&&o.cancelToken.unsubscribe(c),o.signal&&o.signal.removeEventListener("abort",c)}let h=new XMLHttpRequest;h.open(o.method.toUpperCase(),o.url,!0),h.timeout=o.timeout;function k(){if(!h)return;const S=nt.from("getAllResponseHeaders"in h&&h.getAllResponseHeaders()),L={data:!l||l==="text"||l==="json"?h.responseText:h.response,status:h.status,statusText:h.statusText,headers:S,config:e,request:h};tu(function(U){n(U),v()},function(U){s(U),v()},L),h=null}"onloadend"in h?h.onloadend=k:h.onreadystatechange=function(){!h||h.readyState!==4||h.status===0&&!(h.responseURL&&h.responseURL.indexOf("file:")===0)||setTimeout(k)},h.onabort=function(){h&&(s(new ee("Request aborted",ee.ECONNABORTED,e,h)),h=null)},h.onerror=function(C){const L=C&&C.message?C.message:"Network Error",P=new ee(L,ee.ERR_NETWORK,e,h);P.event=C||null,s(P),h=null},h.ontimeout=function(){let C=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const L=o.transitional||hi;o.timeoutErrorMessage&&(C=o.timeoutErrorMessage),s(new ee(C,L.clarifyTimeoutError?ee.ETIMEDOUT:ee.ECONNABORTED,e,h)),h=null},r===void 0&&i.setContentType(null),"setRequestHeader"in h&&E.forEach(i.toJSON(),function(C,L){h.setRequestHeader(L,C)}),E.isUndefined(o.withCredentials)||(h.withCredentials=!!o.withCredentials),l&&l!=="json"&&(h.responseType=o.responseType),d&&([m,y]=yo(d,!0),h.addEventListener("progress",m)),a&&h.upload&&([f,b]=yo(a),h.upload.addEventListener("progress",f),h.upload.addEventListener("loadend",b)),(o.cancelToken||o.signal)&&(c=S=>{h&&(s(!S||S.type?new Ds(null,e,h):S),h.abort(),h=null)},o.cancelToken&&o.cancelToken.subscribe(c),o.signal&&(o.signal.aborted?c():o.signal.addEventListener("abort",c)));const R=km(o.url);if(R&&He.protocols.indexOf(R)===-1){s(new ee("Unsupported protocol "+R+":",ee.ERR_BAD_REQUEST,e));return}h.send(r||null)})},Dm=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let s=new AbortController,o;const r=function(d){if(!o){o=!0,l();const c=d instanceof Error?d:this.reason;s.abort(c instanceof ee?c:new Ds(c instanceof Error?c.message:c))}};let i=t&&setTimeout(()=>{i=null,r(new ee(`timeout of ${t}ms exceeded`,ee.ETIMEDOUT))},t);const l=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(d=>{d.unsubscribe?d.unsubscribe(r):d.removeEventListener("abort",r)}),e=null)};e.forEach(d=>d.addEventListener("abort",r));const{signal:a}=s;return a.unsubscribe=()=>E.asap(l),a}},Nm=function*(e,t){let n=e.byteLength;if(n{const o=Im(e,t);let r=0,i,l=a=>{i||(i=!0,s&&s(a))};return new ReadableStream({async pull(a){try{const{done:d,value:c}=await o.next();if(d){l(),a.close();return}let f=c.byteLength;if(n){let m=r+=f;n(m)}a.enqueue(new Uint8Array(c))}catch(d){throw l(d),d}},cancel(a){return l(a),o.return()}},{highWaterMark:2})},Bl=64*1024,{isFunction:qs}=E,Lm=(({Request:e,Response:t})=>({Request:e,Response:t}))(E.global),{ReadableStream:Hl,TextEncoder:jl}=E.global,ql=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Fm=e=>{e=E.merge.call({skipUndefined:!0},Lm,e);const{fetch:t,Request:n,Response:s}=e,o=t?qs(t):typeof fetch=="function",r=qs(n),i=qs(s);if(!o)return!1;const l=o&&qs(Hl),a=o&&(typeof jl=="function"?(y=>v=>y.encode(v))(new jl):async y=>new Uint8Array(await new n(y).arrayBuffer())),d=r&&l&&ql(()=>{let y=!1;const v=new n(He.origin,{body:new Hl,method:"POST",get duplex(){return y=!0,"half"}}).headers.has("Content-Type");return y&&!v}),c=i&&l&&ql(()=>E.isReadableStream(new s("").body)),f={stream:c&&(y=>y.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(y=>{!f[y]&&(f[y]=(v,h)=>{let k=v&&v[y];if(k)return k.call(v);throw new ee(`Response type '${y}' is not supported`,ee.ERR_NOT_SUPPORT,h)})});const m=async y=>{if(y==null)return 0;if(E.isBlob(y))return y.size;if(E.isSpecCompliantForm(y))return(await new n(He.origin,{method:"POST",body:y}).arrayBuffer()).byteLength;if(E.isArrayBufferView(y)||E.isArrayBuffer(y))return y.byteLength;if(E.isURLSearchParams(y)&&(y=y+""),E.isString(y))return(await a(y)).byteLength},b=async(y,v)=>{const h=E.toFiniteNumber(y.getContentLength());return h??m(v)};return async y=>{let{url:v,method:h,data:k,signal:R,cancelToken:S,timeout:C,onDownloadProgress:L,onUploadProgress:P,responseType:U,headers:ae,withCredentials:I="same-origin",fetchOptions:W}=su(y),B=t||fetch;U=U?(U+"").toLowerCase():"text";let q=Dm([R,S&&S.toAbortSignal()],C),se=null;const we=q&&q.unsubscribe&&(()=>{q.unsubscribe()});let Me;try{if(P&&d&&h!=="get"&&h!=="head"&&(Me=await b(ae,k))!==0){let De=new n(v,{method:"POST",body:k,duplex:"half"}),Oe;if(E.isFormData(k)&&(Oe=De.headers.get("content-type"))&&ae.setContentType(Oe),De.body){const[At,gt]=Ll(Me,yo(Fl(P)));k=Ul(De.body,Bl,At,gt)}}E.isString(I)||(I=I?"include":"omit");const le=r&&"credentials"in n.prototype,fe={...W,signal:q,method:h.toUpperCase(),headers:ae.normalize().toJSON(),body:k,duplex:"half",credentials:le?I:void 0};se=r&&new n(v,fe);let re=await(r?B(se,W):B(v,fe));const ut=c&&(U==="stream"||U==="response");if(c&&(L||ut&&we)){const De={};["status","statusText","headers"].forEach(Rt=>{De[Rt]=re[Rt]});const Oe=E.toFiniteNumber(re.headers.get("content-length")),[At,gt]=L&&Ll(Oe,yo(Fl(L),!0))||[];re=new s(Ul(re.body,Bl,At,()=>{gt&>(),we&&we()}),De)}U=U||"text";let Et=await f[E.findKey(f,U)||"text"](re,y);return!ut&&we&&we(),await new Promise((De,Oe)=>{tu(De,Oe,{data:Et,headers:nt.from(re.headers),status:re.status,statusText:re.statusText,config:y,request:se})})}catch(le){throw we&&we(),le&&le.name==="TypeError"&&/Load failed|fetch/i.test(le.message)?Object.assign(new ee("Network Error",ee.ERR_NETWORK,y,se,le&&le.response),{cause:le.cause||le}):ee.from(le,le&&le.code,y,se,le&&le.response)}}},Mm=new Map,ou=e=>{let t=e&&e.env||{};const{fetch:n,Request:s,Response:o}=t,r=[s,o,n];let i=r.length,l=i,a,d,c=Mm;for(;l--;)a=r[l],d=c.get(a),d===void 0&&c.set(a,d=l?new Map:Fm(t)),c=d;return d};ou();const gi={http:tm,xhr:Om,fetch:{get:ou}};E.forEach(gi,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Vl=e=>`- ${e}`,Um=e=>E.isFunction(e)||e===null||e===!1;function Bm(e,t){e=E.isArray(e)?e:[e];const{length:n}=e;let s,o;const r={};for(let i=0;i`adapter ${a} `+(d===!1?"is not supported by the environment":"is not available in the build"));let l=n?i.length>1?`since : `+i.map(Vl).join(` `):" "+Vl(i[0]):"as no adapter specified";throw new ee("There is no suitable adapter to dispatch the request "+l,"ERR_NOT_SUPPORT")}return o}const ru={getAdapter:Bm,adapters:gi};function ir(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ds(null,e)}function Wl(e){return ir(e),e.headers=nt.from(e.headers),e.data=rr.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),ru.getAdapter(e.adapter||Os.adapter,e)(e).then(function(s){return ir(e),s.data=rr.call(e,e.transformResponse,s),s.headers=nt.from(s.headers),s},function(s){return eu(s)||(ir(e),s&&s.response&&(s.response.data=rr.call(e,e.transformResponse,s.response),s.response.headers=nt.from(s.response.headers))),Promise.reject(s)})}const iu="1.13.5",Mo={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Mo[e]=function(s){return typeof s===e||"a"+(t<1?"n ":" ")+e}});const Kl={};Mo.transitional=function(t,n,s){function o(r,i){return"[Axios v"+iu+"] Transitional option '"+r+"'"+i+(s?". "+s:"")}return(r,i,l)=>{if(t===!1)throw new ee(o(i," has been removed"+(n?" in "+n:"")),ee.ERR_DEPRECATED);return n&&!Kl[i]&&(Kl[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(r,i,l):!0}};Mo.spelling=function(t){return(n,s)=>(console.warn(`${s} is likely a misspelling of ${t}`),!0)};function Hm(e,t,n){if(typeof e!="object")throw new ee("options must be an object",ee.ERR_BAD_OPTION_VALUE);const s=Object.keys(e);let o=s.length;for(;o-- >0;){const r=s[o],i=t[r];if(i){const l=e[r],a=l===void 0||i(l,r,e);if(a!==!0)throw new ee("option "+r+" must be "+a,ee.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new ee("Unknown option "+r,ee.ERR_BAD_OPTION)}}const oo={assertOptions:Hm,validators:Mo},pt=oo.validators;let Sn=class{constructor(t){this.defaults=t||{},this.interceptors={request:new Il,response:new Il}}async request(t,n){try{return await this._request(t,n)}catch(s){if(s instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;const r=o.stack?o.stack.replace(/^.+\n/,""):"";try{s.stack?r&&!String(s.stack).endsWith(r.replace(/^.+\n.+\n/,""))&&(s.stack+=` -`+r):s.stack=r}catch{}}throw s}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=En(this.defaults,n);const{transitional:s,paramsSerializer:o,headers:r}=n;s!==void 0&&oo.assertOptions(s,{silentJSONParsing:pt.transitional(pt.boolean),forcedJSONParsing:pt.transitional(pt.boolean),clarifyTimeoutError:pt.transitional(pt.boolean),legacyInterceptorReqResOrdering:pt.transitional(pt.boolean)},!1),o!=null&&(E.isFunction(o)?n.paramsSerializer={serialize:o}:oo.assertOptions(o,{encode:pt.function,serialize:pt.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),oo.assertOptions(n,{baseUrl:pt.spelling("baseURL"),withXsrfToken:pt.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=r&&E.merge(r.common,r[n.method]);r&&E.forEach(["delete","get","head","post","put","patch","common"],y=>{delete r[y]}),n.headers=nt.concat(i,r);const l=[];let a=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;a=a&&v.synchronous;const h=n.transitional||hi;h&&h.legacyInterceptorReqResOrdering?l.unshift(v.fulfilled,v.rejected):l.push(v.fulfilled,v.rejected)});const d=[];this.interceptors.response.forEach(function(v){d.push(v.fulfilled,v.rejected)});let c,f=0,m;if(!a){const y=[Wl.bind(this),void 0];for(y.unshift(...l),y.push(...d),m=y.length,c=Promise.resolve(n);f{if(!s._listeners)return;let r=s._listeners.length;for(;r-- >0;)s._listeners[r](o);s._listeners=null}),this.promise.then=o=>{let r;const i=new Promise(l=>{s.subscribe(l),r=l}).then(o);return i.cancel=function(){s.unsubscribe(r)},i},t(function(r,i,l){s.reason||(s.reason=new Ds(r,i,l),n(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=s=>{t.abort(s)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new lu(function(o){t=o}),cancel:t}}};function qm(e){return function(n){return e.apply(null,n)}}function Vm(e){return E.isObject(e)&&e.isAxiosError===!0}const $r={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries($r).forEach(([e,t])=>{$r[t]=e});function au(e){const t=new Sn(e),n=Hc(Sn.prototype.request,t);return E.extend(n,Sn.prototype,t,{allOwnKeys:!0}),E.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return au(En(e,o))},n}const Pe=au(Os);Pe.Axios=Sn;Pe.CanceledError=Ds;Pe.CancelToken=jm;Pe.isCancel=eu;Pe.VERSION=iu;Pe.toFormData=Fo;Pe.AxiosError=ee;Pe.Cancel=Pe.CanceledError;Pe.all=function(t){return Promise.all(t)};Pe.spread=qm;Pe.isAxiosError=Vm;Pe.mergeConfig=En;Pe.AxiosHeaders=nt;Pe.formToJSON=e=>Zc(E.isHTMLForm(e)?new FormData(e):e);Pe.getAdapter=ru.getAdapter;Pe.HttpStatusCode=$r;Pe.default=Pe;const{Axios:g1,AxiosError:y1,CanceledError:v1,isCancel:b1,CancelToken:_1,VERSION:x1,all:w1,Cancel:k1,isAxiosError:S1,spread:E1,toFormData:A1,AxiosHeaders:R1,HttpStatusCode:C1,formToJSON:T1,getAdapter:P1,mergeConfig:O1}=Pe;var Rn={};const Ge={PROTOCOL:Rn.PROTOCOL||window.location.protocol,WS_PROTOCOL:Rn.WS_PROTOCOL||window.location.protocol==="https:"?"wss:":"ws:",BACKEND:Rn.BACKEND||window.location.hostname,PORT:Rn.PORT||window.location.port,WS_PORT:Rn.WS_PORT||window.location.port,BASEURL:Rn.BASEURL||""};let Vs;const Wm=new Uint8Array(16);function Km(){if(!Vs&&(Vs=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Vs))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Vs(Wm)}const Le=[];for(let e=0;e<256;++e)Le.push((e+256).toString(16).slice(1));function zm(e,t=0){return Le[e[t+0]]+Le[e[t+1]]+Le[e[t+2]]+Le[e[t+3]]+"-"+Le[e[t+4]]+Le[e[t+5]]+"-"+Le[e[t+6]]+Le[e[t+7]]+"-"+Le[e[t+8]]+Le[e[t+9]]+"-"+Le[e[t+10]]+Le[e[t+11]]+Le[e[t+12]]+Le[e[t+13]]+Le[e[t+14]]+Le[e[t+15]]}const Qm=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),zl={randomUUID:Qm};function Gm(e,t,n){if(zl.randomUUID&&!e)return zl.randomUUID();e=e||{};const s=e.random||(e.rng||Km)();return s[6]=s[6]&15|64,s[8]=s[8]&63|128,zm(s)}var Jm={};console.log("using env:",Jm);console.log("using config: ",Ge);const Je=Pe.create({baseURL:`${Ge.PROTOCOL}//${Ge.BACKEND}:${Ge.PORT}${Ge.BASEURL}`}),Ns=Gm();console.log("session ID: ",Ns);cu();const yi=new WebSocket(`${Ge.WS_PROTOCOL}//${Ge.BACKEND}${Ge.PORT!==""?":"+Ge.PORT:""}${Ge.BASEURL}/api/ws?client_id=${Ns}`);yi.onopen=e=>{console.log("websocket connection opened",e)};function cu(){Je.get("/api/version").then(e=>{const t=localStorage.getItem("version");console.log("Backend version: ",e.data),localStorage.setItem("version",e.data),t!=e.data&&location.reload()}).catch(e=>{console.error(e),console.log("Error getting version, using 0"),localStorage.setItem("version","0.0.0")})}function Ym(e){return Je.get("/api/songs/search",{params:{query:e}})}function Xm(e){return Je.get("/api/song/url",{params:{url:e}})}function Zm(e){const t=typeof e=="string"?e:e.url,n=typeof e=="string"?void 0:e;return Je.post("/api/download/url",n,{params:{url:t,client_id:Ns}})}function eg(e){return Je.post("/api/download/batch",e)}function tg(){return Je.get("/api/check_update")}function ng(e){return String(e||"").split("/").map(encodeURIComponent).join("/")}function sg(e){return`/media/${ng(e)}`}function og(e){return`/cover?file=${encodeURIComponent(e)}`}function rg(){return Je.get("/list")}function ig(e){return Je.delete("/delete",{params:{file:e}})}function lg(e){return Je.post("/api/playlist/m3u",e)}function ag(){return Je.get("/api/queue")}function cg(e){return Je.delete("/api/queue/item",{params:{song_id:e}})}function ug(){return Je.delete("/api/queue")}function dg(){return Je.delete("/api/queue/completed")}function fg(){return Je.get("/api/settings",{params:{client_id:Ns}})}function pg(e){return Je.post("/api/settings/update",e,{params:{client_id:Ns}})}function hg(e){return yi.onmessage=e}function mg(e){return yi.onerror=e}const Se={search:Ym,open:Xm,download:Zm,downloadBatch:eg,downloadFileURL:sg,coverFileURL:og,listDownloads:rg,deleteDownload:ig,writePlaylistM3u:lg,getQueue:ag,removeQueueItem:cg,clearQueue:ug,clearCompletedQueue:dg,getSettings:fg,setSettings:pg,check_for_update:tg,ws_onmessage:hg,ws_onerror:mg,getVersion:cu},Kt=te({audio_providers:[""],slskd:{enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256},lyrics_providers:[""],download_lyrics:!0,format:"",bitrate:"320",output:"",generate_m3u:!0,sync_navidrome:!0,navidrome:{enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},organize_by_artist:!1,max_parallel_downloads:3}),gg={audio_providers:["youtube","youtube-music","slskd"],lyrics_providers:["lrclib","genius","musixmatch","azlyrics"],format:["mp3","flac","ogg","opus","m4a"],bitrate:["128","192","256","320"],max_parallel_downloads:[1,2,3,5,8],output:"{artists} - {title}.{output-ext}"};Se.getSettings().then(e=>{e.status===200?(console.log("Received settings:",e.data),Kt.value={...Kt.value,...e.data,slskd:{...Kt.value.slskd,...e.data.slskd||{}},navidrome:{...Kt.value.navidrome,...e.data.navidrome||{}}}):console.log("Error loading settings")});function uu(){const e=te(),t=te("");function n(){var i,l;const o=((i=Kt.value)==null?void 0:i.slskd)||{};if(o.enabled){if(!String(o.base_url||"").trim())return"slskd base URL is required when enabled";if(!String(o.api_key||"").trim())return"slskd API key is required when enabled"}const r=((l=Kt.value)==null?void 0:l.navidrome)||{};if(r.enabled){if(!String(r.url||"").trim())return"Navidrome URL is required when enabled";if(!String(r.username||"").trim())return"Navidrome username is required when enabled";if(!String(r.password||""))return"Navidrome password is required when enabled"}return""}function s(){console.log("Saving settings:",Kt.value);const o=n();if(o){t.value=o,e.value=!1,setTimeout(()=>{e.value=null},2500);return}t.value="",Se.setSettings(Kt.value).then(r=>{if(r.status===200){console.log("Saved!"),e.value=!0;const i=document.getElementById("settings-modal");i&&"checked"in i&&(i.checked=!1),setTimeout(()=>{e.value=null},2e3)}else console.error("Error saving settings.",r),t.value="Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2e3)}).catch(r=>{var l,a;const i=(a=(l=r==null?void 0:r.response)==null?void 0:l.data)==null?void 0:a.detail;t.value=typeof i=="string"&&i.trim()?i:"Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2500)})}return{saveSettings:s,settings:Kt,settingsOptions:gg,isSaved:e,saveErrorText:t}}const yg={class:"modal modal-bottom sm:modal-middle"},vg={class:"modal-box surface-strong rounded-t-3xl sm:rounded-3xl p-0 max-w-lg"},bg={class:"flex items-center justify-between px-6 py-4 border-b border-white/5"},_g={class:"text-lg font-bold tracking-tight"},xg={class:"text-xs text-base-content/50 mt-0.5"},wg=["title"],kg={class:"px-6 py-5 space-y-6"},Sg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Eg=["value"],Ag=["value"],Rg={class:"text-[11px] text-base-content/40 mt-1.5"},Cg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Tg={class:"text-[11px] text-base-content/40 mb-2"},Pg={class:"grid grid-cols-2 gap-2"},Og=["onClick"],Dg={key:0,class:"absolute top-1 right-1 text-[10px] font-bold opacity-80"},Ng={key:0,class:"mt-2 space-y-1 text-sm"},Ig={class:"text-xs opacity-50 w-4"},$g={class:"flex-1"},Lg=["disabled","onClick"],Fg=["disabled","onClick"],Mg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ug={class:"text-[11px] text-base-content/40 mb-2"},Bg={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Hg={class:"flex-1 text-sm"},jg={class:"block"},qg={class:"block text-[11px] text-base-content/50"},Vg={key:0,class:"grid grid-cols-1 gap-2"},Wg=["placeholder"],Kg=["placeholder"],zg={class:"rounded-xl border border-white/10 bg-base-100/50 px-3 py-2.5 space-y-2"},Qg={class:"text-[11px] font-semibold text-base-content/70"},Gg={class:"text-[11px] text-base-content/50 space-y-1 list-disc pl-4"},Jg={class:"text-[10px] leading-relaxed text-base-content/60 whitespace-pre-wrap font-mono bg-base-300/30 rounded-lg px-2 py-1.5"},Yg={class:"text-[11px] text-base-content/50"},Xg=["placeholder"],Zg={class:"text-[11px] text-base-content/40"},ey={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mt-2"},ty={class:"block text-sm font-medium"},ny={class:"block text-[11px] text-base-content/50 mt-0.5"},sy={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 mt-2"},oy={class:"text-[11px] text-base-content/50"},ry={class:"text-[11px] text-base-content/50"},iy={class:"text-[11px] text-base-content/40"},ly={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},ay={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},cy={class:"flex-1 text-sm"},uy={class:"block"},dy={class:"block text-[11px] text-base-content/50"},fy={class:"flex items-baseline justify-between mb-1.5"},py={class:"text-xs text-base-content/50"},hy={class:"text-[10px] text-base-content/40"},my=["disabled"],gy=["value"],yy={class:"grid grid-cols-2 gap-3"},vy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},by=["value"],_y={class:"flex items-baseline justify-between mb-2"},xy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50"},wy={key:0,class:"text-[10px] text-base-content/40"},ky=["disabled"],Sy=["value"],Ey={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ay={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Ry={class:"flex-1 text-sm"},Cy={class:"block"},Ty={class:"block text-[11px] text-base-content/50"},Py={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Oy={class:"flex-1 text-sm"},Dy={class:"block"},Ny={class:"block text-[11px] text-base-content/50"},Iy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},$y={class:"text-[11px] text-base-content/40 mb-2"},Ly={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Fy={class:"flex-1 text-sm"},My={class:"block"},Uy={class:"block text-[11px] text-base-content/50"},By={key:0,class:"grid grid-cols-1 gap-2"},Hy=["placeholder"],jy=["placeholder"],qy=["placeholder"],Vy=["placeholder"],Wy=["placeholder"],Ky={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},zy={class:"flex-1 text-sm"},Qy={class:"block"},Gy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Jy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Yy={class:"flex-1 text-sm"},Xy={class:"block"},Zy={class:"block text-[11px] text-base-content/50"},ev={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},tv={class:"grid grid-cols-5 gap-1.5"},nv=["onClick"],sv={class:"text-[11px] text-base-content/40 mt-1.5"},ov={key:0,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-primary"},rv={key:1,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-error"},iv={class:"flex items-center justify-end gap-2 px-6 py-4 border-t border-white/5"},lv={for:"settings-modal",class:"btn btn-sm h-10 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 cursor-pointer"},av={class:"modal-backdrop",for:"settings-modal"},zn={__name:"Settings",setup(e){const t=uu(),{t:n,locale:s,setLocale:o,locales:r}=kt(),i={enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},l={enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256};js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.slskd;if(!y||typeof y!="object"){t.settings.value.slskd={...l};return}for(const[h,k]of Object.entries(l))(y[h]===void 0||y[h]===null)&&(y[h]=k)}),js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.navidrome;if(!y||typeof y!="object"){t.settings.value.navidrome={...i};return}for(const[h,k]of Object.entries(i))(y[h]===void 0||y[h]===null)&&(y[h]=k)}),js(()=>{var y;((y=t.settings.value)==null?void 0:y.sync_navidrome)===void 0&&(t.settings.value.sync_navidrome=!0)}),js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.audio_providers;(!Array.isArray(y)||y.length===0)&&(t.settings.value.audio_providers=["youtube-music"])});function a(y){return y==="youtube-music"?"YouTube Music":y==="youtube"?"YouTube":y==="slskd"?"slskd":y}const d=["slskd","youtube-music","youtube"];function c(y){var h;return(((h=t.settings.value)==null?void 0:h.audio_providers)||[]).indexOf(y)}function f(y){const v=[...t.settings.value.audio_providers||[]],h=v.indexOf(y);h>=0?v.splice(h,1):v.push(y),t.settings.value.audio_providers=v.length>0?v:["youtube-music"]}function m(y,v){const h=[...t.settings.value.audio_providers||[]],k=y+v;k<0||k>=h.length||([h[y],h[k]]=[h[k],h[y]],t.settings.value.audio_providers=h)}function b(){var v,h;const y=!!((h=(v=t.settings.value)==null?void 0:v.slskd)!=null&&h.enabled);t.settings.value.audio_providers=y?[...d]:["youtube-music","youtube"]}return(y,v)=>(A(),T(de,null,[v[23]||(v[23]=p("input",{type:"checkbox",id:"settings-modal",class:"modal-toggle"},null,-1)),p("div",yg,[p("div",vg,[p("div",bg,[p("div",null,[p("h3",_g,w(u(n)("settings.title")),1),p("p",xg,w(u(n)("settings.subtitle")),1)]),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(n)("common.close")},[M(u(G),{icon:"clarity:close-line",class:"h-5 w-5"})],8,wg)]),p("div",kg,[p("div",null,[p("label",Sg,w(u(n)("settings.language")),1),p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",value:u(s),onChange:v[0]||(v[0]=h=>u(o)(h.target.value))},[(A(!0),T(de,null,Ie(u(r),h=>(A(),T("option",{key:h.code,value:h.code},w(h.name),9,Ag))),128))],40,Eg),p("p",Rg,w(u(n)("settings.languageHint")),1)]),p("div",null,[p("label",Cg,w(u(n)("settings.audioSource")),1),p("p",Tg,w(u(n)("settings.audioSourceHint")),1),p("div",Pg,[(A(!0),T(de,null,Ie(u(t).settingsOptions.audio_providers,h=>(A(),T("button",{key:h,type:"button",class:Ae(["rounded-xl border px-3 py-2 text-sm transition-colors text-left relative",[c(h)>=0?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:k=>f(h)},[c(h)>=0?(A(),T("span",Dg,w(c(h)+1),1)):ie("",!0),Re(" "+w(a(h)),1)],10,Og))),128))]),u(t).settings.value.audio_providers.length?(A(),T("ul",Ng,[(A(!0),T(de,null,Ie(u(t).settings.value.audio_providers,(h,k)=>(A(),T("li",{key:h,class:"flex items-center gap-2 rounded-lg border border-white/10 px-2 py-1"},[p("span",Ig,w(k+1),1),p("span",$g,w(a(h)),1),p("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:k===0,onClick:R=>m(k,-1)}," ↑ ",8,Lg),p("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:k===u(t).settings.value.audio_providers.length-1,onClick:R=>m(k,1)}," ↓ ",8,Fg)]))),128))])):ie("",!0),p("button",{type:"button",class:"btn btn-xs btn-ghost rounded-lg mt-2",onClick:b},w(u(n)("settings.audioSourceReset")),1)]),p("div",null,[p("label",Mg,w(u(n)("settings.slskdSection")),1),p("p",Ug,w(u(n)("settings.slskdHint")),1),p("label",Bg,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[1]||(v[1]=h=>u(t).settings.value.slskd.enabled=h)},null,512),[[en,u(t).settings.value.slskd.enabled]]),p("span",Hg,[p("span",jg,w(u(n)("settings.slskdEnabled")),1),p("span",qg,w(u(n)("settings.slskdEnabledHint")),1)])]),u(t).settings.value.slskd.enabled?(A(),T("div",Vg,[Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.slskdBaseUrl"),"onUpdate:modelValue":v[2]||(v[2]=h=>u(t).settings.value.slskd.base_url=h)},null,8,Wg),[[rt,u(t).settings.value.slskd.base_url]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.slskdApiKey"),"onUpdate:modelValue":v[3]||(v[3]=h=>u(t).settings.value.slskd.api_key=h)},null,8,Kg),[[rt,u(t).settings.value.slskd.api_key]]),p("div",zg,[p("p",Qg,w(u(n)("settings.slskdSourceDirTitle")),1),p("ul",Gg,[p("li",null,w(u(n)("settings.slskdSourceDirBullet1")),1),p("li",null,w(u(n)("settings.slskdSourceDirBullet2")),1),p("li",null,w(u(n)("settings.slskdSourceDirBullet3")),1)]),p("pre",Jg,w(u(n)("settings.slskdSourceDirExample")),1)]),p("label",Yg,w(u(n)("settings.slskdSourceDirLabel")),1),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 font-mono text-sm",type:"text",placeholder:u(n)("settings.slskdSourceDirPlaceholder"),"onUpdate:modelValue":v[4]||(v[4]=h=>u(t).settings.value.slskd.source_dir=h)},null,8,Xg),[[rt,u(t).settings.value.slskd.source_dir]]),p("p",Zg,w(u(n)("settings.slskdSourceDirHint")),1),p("label",ey,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[5]||(v[5]=h=>u(t).settings.value.slskd.leave_in_place=h)},null,512),[[en,u(t).settings.value.slskd.leave_in_place]]),p("span",null,[p("span",ty,w(u(n)("settings.slskdLeaveInPlace")),1),p("span",ny,w(u(n)("settings.slskdLeaveInPlaceHint")),1)])]),p("div",sy,[p("label",oy,[Re(w(u(n)("settings.slskdDownloadTimeout"))+" ",1),Ee(p("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"30",max:"3600","onUpdate:modelValue":v[6]||(v[6]=h=>u(t).settings.value.slskd.download_timeout_seconds=h)},null,512),[[rt,u(t).settings.value.slskd.download_timeout_seconds,void 0,{number:!0}]])]),p("label",ry,[Re(w(u(n)("settings.slskdQueuedTimeout"))+" ",1),Ee(p("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"15",max:"3600","onUpdate:modelValue":v[7]||(v[7]=h=>u(t).settings.value.slskd.queued_timeout_seconds=h)},null,512),[[rt,u(t).settings.value.slskd.queued_timeout_seconds,void 0,{number:!0}]])])]),p("p",iy,w(u(n)("settings.slskdTimeoutHint")),1)])):ie("",!0)]),p("div",null,[p("label",ly,w(u(n)("settings.lyricsSource")),1),p("label",ay,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[8]||(v[8]=h=>u(t).settings.value.download_lyrics=h)},null,512),[[en,u(t).settings.value.download_lyrics]]),p("span",cy,[p("span",uy,w(u(n)("settings.downloadLyrics")),1),p("span",dy,w(u(n)("settings.downloadLyricsHint")),1)])]),p("div",fy,[p("span",py,w(u(n)("settings.lyricsProvider")),1),p("span",hy,w(u(n)("settings.lyricsHint")),1)]),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 disabled:opacity-40","onUpdate:modelValue":v[9]||(v[9]=h=>u(t).settings.value.lyrics_providers[0]=h),disabled:!u(t).settings.value.download_lyrics},[(A(!0),T(de,null,Ie(u(t).settingsOptions.lyrics_providers,h=>(A(),T("option",{key:h,value:h},w(h),9,gy))),128))],8,my),[[Xs,u(t).settings.value.lyrics_providers[0]]])]),p("div",yy,[p("div",null,[p("label",vy,w(u(n)("settings.format")),1),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":v[10]||(v[10]=h=>u(t).settings.value.format=h)},[(A(!0),T(de,null,Ie(u(t).settingsOptions.format,h=>(A(),T("option",{key:h,value:h},w(h.toUpperCase()),9,by))),128))],512),[[Xs,u(t).settings.value.format]])]),p("div",null,[p("div",_y,[p("label",xy,w(u(n)("settings.quality")),1),u(t).settings.value.format==="flac"?(A(),T("span",wy,w(u(n)("settings.qualityIgnored")),1)):ie("",!0)]),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":v[11]||(v[11]=h=>u(t).settings.value.bitrate=h),disabled:u(t).settings.value.format==="flac"},[(A(!0),T(de,null,Ie(u(t).settingsOptions.bitrate,h=>(A(),T("option",{key:h,value:h},w(h)+" kbps ",9,Sy))),128))],8,ky),[[Xs,u(t).settings.value.bitrate]])])]),p("div",null,[p("label",Ey,w(u(n)("settings.playlistsSection")),1),p("label",Ay,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[12]||(v[12]=h=>u(t).settings.value.generate_m3u=h)},null,512),[[en,u(t).settings.value.generate_m3u]]),p("span",Ry,[p("span",Cy,w(u(n)("settings.generateM3u")),1),p("span",Ty,w(u(n)("settings.generateM3uHint")),1)])]),p("label",Py,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[13]||(v[13]=h=>u(t).settings.value.sync_navidrome=h)},null,512),[[en,u(t).settings.value.sync_navidrome]]),p("span",Oy,[p("span",Dy,w(u(n)("settings.syncNavidrome")),1),p("span",Ny,w(u(n)("settings.syncNavidromeHint")),1)])])]),p("div",null,[p("label",Iy,w(u(n)("settings.navidromeSection")),1),p("p",$y,w(u(n)("settings.navidromeHint")),1),p("label",Ly,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[14]||(v[14]=h=>u(t).settings.value.navidrome.enabled=h)},null,512),[[en,u(t).settings.value.navidrome.enabled]]),p("span",Fy,[p("span",My,w(u(n)("settings.navidromeEnabled")),1),p("span",Uy,w(u(n)("settings.navidromeEnabledHint")),1)])]),u(t).settings.value.navidrome.enabled?(A(),T("div",By,[Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeUrl"),"onUpdate:modelValue":v[15]||(v[15]=h=>u(t).settings.value.navidrome.url=h)},null,8,Hy),[[rt,u(t).settings.value.navidrome.url]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeUsername"),"onUpdate:modelValue":v[16]||(v[16]=h=>u(t).settings.value.navidrome.username=h)},null,8,jy),[[rt,u(t).settings.value.navidrome.username]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.navidromePassword"),"onUpdate:modelValue":v[17]||(v[17]=h=>u(t).settings.value.navidrome.password=h)},null,8,qy),[[rt,u(t).settings.value.navidrome.password]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeAdminUser"),"onUpdate:modelValue":v[18]||(v[18]=h=>u(t).settings.value.navidrome.admin_username=h)},null,8,Vy),[[rt,u(t).settings.value.navidrome.admin_username]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.navidromeAdminPassword"),"onUpdate:modelValue":v[19]||(v[19]=h=>u(t).settings.value.navidrome.admin_password=h)},null,8,Wy),[[rt,u(t).settings.value.navidrome.admin_password]]),p("label",Ky,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[20]||(v[20]=h=>u(t).settings.value.navidrome.public_playlist=h)},null,512),[[en,u(t).settings.value.navidrome.public_playlist]]),p("span",zy,[p("span",Qy,w(u(n)("settings.navidromePublic")),1)])])])):ie("",!0)]),p("div",null,[p("label",Gy,w(u(n)("settings.organizationSection")),1),p("label",Jy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[21]||(v[21]=h=>u(t).settings.value.organize_by_artist=h)},null,512),[[en,u(t).settings.value.organize_by_artist]]),p("span",Yy,[p("span",Xy,w(u(n)("settings.organizeByArtist")),1),p("span",Zy,w(u(n)("settings.organizeByArtistHint")),1)])])]),p("div",null,[p("label",ev,w(u(n)("settings.parallelDownloads")),1),p("div",tv,[(A(!0),T(de,null,Ie(u(t).settingsOptions.max_parallel_downloads,h=>(A(),T("button",{key:h,type:"button",class:Ae(["rounded-xl border px-2 py-2 text-sm font-medium transition-colors text-center",[u(t).settings.value.max_parallel_downloads===h?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:k=>u(t).settings.value.max_parallel_downloads=h},w(h),11,nv))),128))]),p("p",sv,w(u(n)("settings.parallelDownloadsHint")),1)]),M(Rc,{"enter-active-class":"transition duration-200","enter-from-class":"opacity-0 -translate-y-1","enter-to-class":"opacity-100 translate-y-0","leave-active-class":"transition duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:ao(()=>[u(t).isSaved.value===!0?(A(),T("div",ov,[M(u(G),{icon:"clarity:check-line",class:"h-4 w-4 shrink-0"}),Re(" "+w(u(n)("settings.saved")),1)])):u(t).isSaved.value===!1?(A(),T("div",rv,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-4 w-4 shrink-0"}),Re(" "+w(u(t).saveErrorText.value||u(n)("settings.saveError")),1)])):ie("",!0)]),_:1})]),p("div",iv,[p("label",lv,w(u(n)("common.cancel")),1),p("button",{class:"btn btn-primary btn-sm h-10 px-6 rounded-full",onClick:v[22]||(v[22]=h=>u(t).saveSettings())},w(u(n)("common.save")),1)])]),p("label",av,w(u(n)("common.close")),1)])],64))}},Dt=te(""),Ql=te("light"),Gl=te("dark");function vi({useSystem:e=!0,initialTheme:t="",newLightAlias:n="",newDarkAlias:s=""}={}){function o(c){Ql.value=c,d()}function r(c){Gl.value=c,d()}function i(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function l(c){Dt.value=c,d()}function a(){Dt==="dark"?Dt.value="light":Dt==="light"&&(Dt.value="dark"),d()}function d(){document.documentElement.setAttribute("data-theme",Dt.value==="dark"?Gl.value:Ql.value)}return Dt.value!=="light"&&Dt.value!=="dark"&&(e&&l(i()),(t==="light"||t==="dark")&&(Dt.value=t)),n&&o(n),s&&r(s),d(),{currentTheme:Dt,setLightAlias:o,setDarkAlias:r,getSystemTheme:i,setTheme:l,switchTheme:a}}const cv={class:"min-h-dvh flex flex-col text-base-content"},uv={__name:"App",setup(e){const t=vi();return Za(()=>{t.setLightAlias("downtify-light"),t.setDarkAlias("downtify-dark")}),(n,s)=>{const o=xr("router-view");return A(),T("div",cv,[M(o,null,{default:ao(({Component:r,route:i})=>[M(Rc,{name:"page",mode:"out-in"},{default:ao(()=>[(A(),ct(Md(r),{key:i.fullPath}))]),_:2},1024)]),_:1}),M(gp),M(zn)])}}};/*! +`+r):s.stack=r}catch{}}throw s}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=En(this.defaults,n);const{transitional:s,paramsSerializer:o,headers:r}=n;s!==void 0&&oo.assertOptions(s,{silentJSONParsing:pt.transitional(pt.boolean),forcedJSONParsing:pt.transitional(pt.boolean),clarifyTimeoutError:pt.transitional(pt.boolean),legacyInterceptorReqResOrdering:pt.transitional(pt.boolean)},!1),o!=null&&(E.isFunction(o)?n.paramsSerializer={serialize:o}:oo.assertOptions(o,{encode:pt.function,serialize:pt.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),oo.assertOptions(n,{baseUrl:pt.spelling("baseURL"),withXsrfToken:pt.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=r&&E.merge(r.common,r[n.method]);r&&E.forEach(["delete","get","head","post","put","patch","common"],y=>{delete r[y]}),n.headers=nt.concat(i,r);const l=[];let a=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;a=a&&v.synchronous;const h=n.transitional||hi;h&&h.legacyInterceptorReqResOrdering?l.unshift(v.fulfilled,v.rejected):l.push(v.fulfilled,v.rejected)});const d=[];this.interceptors.response.forEach(function(v){d.push(v.fulfilled,v.rejected)});let c,f=0,m;if(!a){const y=[Wl.bind(this),void 0];for(y.unshift(...l),y.push(...d),m=y.length,c=Promise.resolve(n);f{if(!s._listeners)return;let r=s._listeners.length;for(;r-- >0;)s._listeners[r](o);s._listeners=null}),this.promise.then=o=>{let r;const i=new Promise(l=>{s.subscribe(l),r=l}).then(o);return i.cancel=function(){s.unsubscribe(r)},i},t(function(r,i,l){s.reason||(s.reason=new Ds(r,i,l),n(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=s=>{t.abort(s)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new lu(function(o){t=o}),cancel:t}}};function qm(e){return function(n){return e.apply(null,n)}}function Vm(e){return E.isObject(e)&&e.isAxiosError===!0}const $r={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries($r).forEach(([e,t])=>{$r[t]=e});function au(e){const t=new Sn(e),n=Hc(Sn.prototype.request,t);return E.extend(n,Sn.prototype,t,{allOwnKeys:!0}),E.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return au(En(e,o))},n}const Pe=au(Os);Pe.Axios=Sn;Pe.CanceledError=Ds;Pe.CancelToken=jm;Pe.isCancel=eu;Pe.VERSION=iu;Pe.toFormData=Fo;Pe.AxiosError=ee;Pe.Cancel=Pe.CanceledError;Pe.all=function(t){return Promise.all(t)};Pe.spread=qm;Pe.isAxiosError=Vm;Pe.mergeConfig=En;Pe.AxiosHeaders=nt;Pe.formToJSON=e=>Zc(E.isHTMLForm(e)?new FormData(e):e);Pe.getAdapter=ru.getAdapter;Pe.HttpStatusCode=$r;Pe.default=Pe;const{Axios:b1,AxiosError:_1,CanceledError:x1,isCancel:w1,CancelToken:k1,VERSION:S1,all:E1,Cancel:A1,isAxiosError:R1,spread:C1,toFormData:T1,AxiosHeaders:P1,HttpStatusCode:O1,formToJSON:D1,getAdapter:N1,mergeConfig:I1}=Pe;var Rn={};const Ge={PROTOCOL:Rn.PROTOCOL||window.location.protocol,WS_PROTOCOL:Rn.WS_PROTOCOL||window.location.protocol==="https:"?"wss:":"ws:",BACKEND:Rn.BACKEND||window.location.hostname,PORT:Rn.PORT||window.location.port,WS_PORT:Rn.WS_PORT||window.location.port,BASEURL:Rn.BASEURL||""};let Vs;const Wm=new Uint8Array(16);function Km(){if(!Vs&&(Vs=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Vs))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Vs(Wm)}const Le=[];for(let e=0;e<256;++e)Le.push((e+256).toString(16).slice(1));function zm(e,t=0){return Le[e[t+0]]+Le[e[t+1]]+Le[e[t+2]]+Le[e[t+3]]+"-"+Le[e[t+4]]+Le[e[t+5]]+"-"+Le[e[t+6]]+Le[e[t+7]]+"-"+Le[e[t+8]]+Le[e[t+9]]+"-"+Le[e[t+10]]+Le[e[t+11]]+Le[e[t+12]]+Le[e[t+13]]+Le[e[t+14]]+Le[e[t+15]]}const Qm=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),zl={randomUUID:Qm};function Gm(e,t,n){if(zl.randomUUID&&!e)return zl.randomUUID();e=e||{};const s=e.random||(e.rng||Km)();return s[6]=s[6]&15|64,s[8]=s[8]&63|128,zm(s)}var Jm={};console.log("using env:",Jm);console.log("using config: ",Ge);const Je=Pe.create({baseURL:`${Ge.PROTOCOL}//${Ge.BACKEND}:${Ge.PORT}${Ge.BASEURL}`}),Ns=Gm();console.log("session ID: ",Ns);cu();const yi=new WebSocket(`${Ge.WS_PROTOCOL}//${Ge.BACKEND}${Ge.PORT!==""?":"+Ge.PORT:""}${Ge.BASEURL}/api/ws?client_id=${Ns}`);yi.onopen=e=>{console.log("websocket connection opened",e)};function cu(){Je.get("/api/version").then(e=>{const t=localStorage.getItem("version");console.log("Backend version: ",e.data),localStorage.setItem("version",e.data),t!=e.data&&location.reload()}).catch(e=>{console.error(e),console.log("Error getting version, using 0"),localStorage.setItem("version","0.0.0")})}function Ym(e){return Je.get("/api/songs/search",{params:{query:e}})}function Xm(e){return Je.get("/api/song/url",{params:{url:e}})}function Zm(e){const t=typeof e=="string"?e:e.url,n=typeof e=="string"?void 0:e;return Je.post("/api/download/url",n,{params:{url:t,client_id:Ns}})}function eg(e){return Je.post("/api/download/batch",e)}function tg(){return Je.get("/api/check_update")}function ng(e){return String(e||"").split("/").map(encodeURIComponent).join("/")}function sg(e){return`/media/${ng(e)}`}function og(e){try{return decodeURIComponent(e)}catch{return e}}function rg(e){let t=String(e||"");const n=t.indexOf("/media/");return n>=0?t=t.slice(n+7):t=t.replace(/^\//,""),t.split("/").filter(Boolean).map(og).join("/")}function ig(e){const t=rg(e);if(!t)return"download";const n=t.split("/");return n[n.length-1]||"download"}function lg(e){return`/cover?file=${encodeURIComponent(e)}`}function ag(){return Je.get("/list")}function cg(e){return Je.delete("/delete",{params:{file:e}})}function ug(e){return Je.post("/api/playlist/m3u",e)}function dg(){return Je.get("/api/queue")}function fg(e){return Je.delete("/api/queue/item",{params:{song_id:e}})}function pg(){return Je.delete("/api/queue")}function hg(){return Je.delete("/api/queue/completed")}function mg(){return Je.get("/api/settings",{params:{client_id:Ns}})}function gg(e){return Je.post("/api/settings/update",e,{params:{client_id:Ns}})}function yg(e){return yi.onmessage=e}function vg(e){return yi.onerror=e}const ve={search:Ym,open:Xm,download:Zm,downloadBatch:eg,downloadFileURL:sg,downloadSaveName:ig,coverFileURL:lg,listDownloads:ag,deleteDownload:cg,writePlaylistM3u:ug,getQueue:dg,removeQueueItem:fg,clearQueue:pg,clearCompletedQueue:hg,getSettings:mg,setSettings:gg,check_for_update:tg,ws_onmessage:yg,ws_onerror:vg,getVersion:cu},Kt=te({audio_providers:[""],slskd:{enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256},lyrics_providers:[""],download_lyrics:!0,format:"",bitrate:"320",output:"",generate_m3u:!0,sync_navidrome:!0,navidrome:{enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},organize_by_artist:!1,max_parallel_downloads:3}),bg={audio_providers:["youtube","youtube-music","slskd"],lyrics_providers:["lrclib","genius","musixmatch","azlyrics"],format:["mp3","flac","ogg","opus","m4a"],bitrate:["128","192","256","320"],max_parallel_downloads:[1,2,3,5,8],output:"{artists} - {title}.{output-ext}"};ve.getSettings().then(e=>{e.status===200?(console.log("Received settings:",e.data),Kt.value={...Kt.value,...e.data,slskd:{...Kt.value.slskd,...e.data.slskd||{}},navidrome:{...Kt.value.navidrome,...e.data.navidrome||{}}}):console.log("Error loading settings")});function uu(){const e=te(),t=te("");function n(){var i,l;const o=((i=Kt.value)==null?void 0:i.slskd)||{};if(o.enabled){if(!String(o.base_url||"").trim())return"slskd base URL is required when enabled";if(!String(o.api_key||"").trim())return"slskd API key is required when enabled"}const r=((l=Kt.value)==null?void 0:l.navidrome)||{};if(r.enabled){if(!String(r.url||"").trim())return"Navidrome URL is required when enabled";if(!String(r.username||"").trim())return"Navidrome username is required when enabled";if(!String(r.password||""))return"Navidrome password is required when enabled"}return""}function s(){console.log("Saving settings:",Kt.value);const o=n();if(o){t.value=o,e.value=!1,setTimeout(()=>{e.value=null},2500);return}t.value="",ve.setSettings(Kt.value).then(r=>{if(r.status===200){console.log("Saved!"),e.value=!0;const i=document.getElementById("settings-modal");i&&"checked"in i&&(i.checked=!1),setTimeout(()=>{e.value=null},2e3)}else console.error("Error saving settings.",r),t.value="Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2e3)}).catch(r=>{var l,a;const i=(a=(l=r==null?void 0:r.response)==null?void 0:l.data)==null?void 0:a.detail;t.value=typeof i=="string"&&i.trim()?i:"Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2500)})}return{saveSettings:s,settings:Kt,settingsOptions:bg,isSaved:e,saveErrorText:t}}const _g={class:"modal modal-bottom sm:modal-middle"},xg={class:"modal-box surface-strong rounded-t-3xl sm:rounded-3xl p-0 max-w-lg"},wg={class:"flex items-center justify-between px-6 py-4 border-b border-white/5"},kg={class:"text-lg font-bold tracking-tight"},Sg={class:"text-xs text-base-content/50 mt-0.5"},Eg=["title"],Ag={class:"px-6 py-5 space-y-6"},Rg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Cg=["value"],Tg=["value"],Pg={class:"text-[11px] text-base-content/40 mt-1.5"},Og={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Dg={class:"text-[11px] text-base-content/40 mb-2"},Ng={class:"grid grid-cols-2 gap-2"},Ig=["onClick"],$g={key:0,class:"absolute top-1 right-1 text-[10px] font-bold opacity-80"},Lg={key:0,class:"mt-2 space-y-1 text-sm"},Fg={class:"text-xs opacity-50 w-4"},Mg={class:"flex-1"},Ug=["disabled","onClick"],Bg=["disabled","onClick"],Hg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},jg={class:"text-[11px] text-base-content/40 mb-2"},qg={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Vg={class:"flex-1 text-sm"},Wg={class:"block"},Kg={class:"block text-[11px] text-base-content/50"},zg={key:0,class:"grid grid-cols-1 gap-2"},Qg=["placeholder"],Gg=["placeholder"],Jg={class:"rounded-xl border border-white/10 bg-base-100/50 px-3 py-2.5 space-y-2"},Yg={class:"text-[11px] font-semibold text-base-content/70"},Xg={class:"text-[11px] text-base-content/50 space-y-1 list-disc pl-4"},Zg={class:"text-[10px] leading-relaxed text-base-content/60 whitespace-pre-wrap font-mono bg-base-300/30 rounded-lg px-2 py-1.5"},ey={class:"text-[11px] text-base-content/50"},ty=["placeholder"],ny={class:"text-[11px] text-base-content/40"},sy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mt-2"},oy={class:"block text-sm font-medium"},ry={class:"block text-[11px] text-base-content/50 mt-0.5"},iy={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 mt-2"},ly={class:"text-[11px] text-base-content/50"},ay={class:"text-[11px] text-base-content/50"},cy={class:"text-[11px] text-base-content/40"},uy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},dy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},fy={class:"flex-1 text-sm"},py={class:"block"},hy={class:"block text-[11px] text-base-content/50"},my={class:"flex items-baseline justify-between mb-1.5"},gy={class:"text-xs text-base-content/50"},yy={class:"text-[10px] text-base-content/40"},vy=["disabled"],by=["value"],_y={class:"grid grid-cols-2 gap-3"},xy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},wy=["value"],ky={class:"flex items-baseline justify-between mb-2"},Sy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50"},Ey={key:0,class:"text-[10px] text-base-content/40"},Ay=["disabled"],Ry=["value"],Cy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ty={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Py={class:"flex-1 text-sm"},Oy={class:"block"},Dy={class:"block text-[11px] text-base-content/50"},Ny={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Iy={class:"flex-1 text-sm"},$y={class:"block"},Ly={class:"block text-[11px] text-base-content/50"},Fy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},My={class:"text-[11px] text-base-content/40 mb-2"},Uy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},By={class:"flex-1 text-sm"},Hy={class:"block"},jy={class:"block text-[11px] text-base-content/50"},qy={key:0,class:"grid grid-cols-1 gap-2"},Vy=["placeholder"],Wy=["placeholder"],Ky=["placeholder"],zy=["placeholder"],Qy=["placeholder"],Gy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Jy={class:"flex-1 text-sm"},Yy={class:"block"},Xy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Zy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},ev={class:"flex-1 text-sm"},tv={class:"block"},nv={class:"block text-[11px] text-base-content/50"},sv={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},ov={class:"grid grid-cols-5 gap-1.5"},rv=["onClick"],iv={class:"text-[11px] text-base-content/40 mt-1.5"},lv={key:0,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-primary"},av={key:1,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-error"},cv={class:"flex items-center justify-end gap-2 px-6 py-4 border-t border-white/5"},uv={for:"settings-modal",class:"btn btn-sm h-10 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 cursor-pointer"},dv={class:"modal-backdrop",for:"settings-modal"},zn={__name:"Settings",setup(e){const t=uu(),{t:n,locale:s,setLocale:o,locales:r}=kt(),i={enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},l={enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256};js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.slskd;if(!y||typeof y!="object"){t.settings.value.slskd={...l};return}for(const[h,k]of Object.entries(l))(y[h]===void 0||y[h]===null)&&(y[h]=k)}),js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.navidrome;if(!y||typeof y!="object"){t.settings.value.navidrome={...i};return}for(const[h,k]of Object.entries(i))(y[h]===void 0||y[h]===null)&&(y[h]=k)}),js(()=>{var y;((y=t.settings.value)==null?void 0:y.sync_navidrome)===void 0&&(t.settings.value.sync_navidrome=!0)}),js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.audio_providers;(!Array.isArray(y)||y.length===0)&&(t.settings.value.audio_providers=["youtube-music"])});function a(y){return y==="youtube-music"?"YouTube Music":y==="youtube"?"YouTube":y==="slskd"?"slskd":y}const d=["slskd","youtube-music","youtube"];function c(y){var h;return(((h=t.settings.value)==null?void 0:h.audio_providers)||[]).indexOf(y)}function f(y){const v=[...t.settings.value.audio_providers||[]],h=v.indexOf(y);h>=0?v.splice(h,1):v.push(y),t.settings.value.audio_providers=v.length>0?v:["youtube-music"]}function m(y,v){const h=[...t.settings.value.audio_providers||[]],k=y+v;k<0||k>=h.length||([h[y],h[k]]=[h[k],h[y]],t.settings.value.audio_providers=h)}function b(){var v,h;const y=!!((h=(v=t.settings.value)==null?void 0:v.slskd)!=null&&h.enabled);t.settings.value.audio_providers=y?[...d]:["youtube-music","youtube"]}return(y,v)=>(A(),T(de,null,[v[23]||(v[23]=p("input",{type:"checkbox",id:"settings-modal",class:"modal-toggle"},null,-1)),p("div",_g,[p("div",xg,[p("div",wg,[p("div",null,[p("h3",kg,w(u(n)("settings.title")),1),p("p",Sg,w(u(n)("settings.subtitle")),1)]),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(n)("common.close")},[M(u(G),{icon:"clarity:close-line",class:"h-5 w-5"})],8,Eg)]),p("div",Ag,[p("div",null,[p("label",Rg,w(u(n)("settings.language")),1),p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",value:u(s),onChange:v[0]||(v[0]=h=>u(o)(h.target.value))},[(A(!0),T(de,null,Ie(u(r),h=>(A(),T("option",{key:h.code,value:h.code},w(h.name),9,Tg))),128))],40,Cg),p("p",Pg,w(u(n)("settings.languageHint")),1)]),p("div",null,[p("label",Og,w(u(n)("settings.audioSource")),1),p("p",Dg,w(u(n)("settings.audioSourceHint")),1),p("div",Ng,[(A(!0),T(de,null,Ie(u(t).settingsOptions.audio_providers,h=>(A(),T("button",{key:h,type:"button",class:Ae(["rounded-xl border px-3 py-2 text-sm transition-colors text-left relative",[c(h)>=0?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:k=>f(h)},[c(h)>=0?(A(),T("span",$g,w(c(h)+1),1)):ie("",!0),Re(" "+w(a(h)),1)],10,Ig))),128))]),u(t).settings.value.audio_providers.length?(A(),T("ul",Lg,[(A(!0),T(de,null,Ie(u(t).settings.value.audio_providers,(h,k)=>(A(),T("li",{key:h,class:"flex items-center gap-2 rounded-lg border border-white/10 px-2 py-1"},[p("span",Fg,w(k+1),1),p("span",Mg,w(a(h)),1),p("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:k===0,onClick:R=>m(k,-1)}," ↑ ",8,Ug),p("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:k===u(t).settings.value.audio_providers.length-1,onClick:R=>m(k,1)}," ↓ ",8,Bg)]))),128))])):ie("",!0),p("button",{type:"button",class:"btn btn-xs btn-ghost rounded-lg mt-2",onClick:b},w(u(n)("settings.audioSourceReset")),1)]),p("div",null,[p("label",Hg,w(u(n)("settings.slskdSection")),1),p("p",jg,w(u(n)("settings.slskdHint")),1),p("label",qg,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[1]||(v[1]=h=>u(t).settings.value.slskd.enabled=h)},null,512),[[en,u(t).settings.value.slskd.enabled]]),p("span",Vg,[p("span",Wg,w(u(n)("settings.slskdEnabled")),1),p("span",Kg,w(u(n)("settings.slskdEnabledHint")),1)])]),u(t).settings.value.slskd.enabled?(A(),T("div",zg,[Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.slskdBaseUrl"),"onUpdate:modelValue":v[2]||(v[2]=h=>u(t).settings.value.slskd.base_url=h)},null,8,Qg),[[rt,u(t).settings.value.slskd.base_url]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.slskdApiKey"),"onUpdate:modelValue":v[3]||(v[3]=h=>u(t).settings.value.slskd.api_key=h)},null,8,Gg),[[rt,u(t).settings.value.slskd.api_key]]),p("div",Jg,[p("p",Yg,w(u(n)("settings.slskdSourceDirTitle")),1),p("ul",Xg,[p("li",null,w(u(n)("settings.slskdSourceDirBullet1")),1),p("li",null,w(u(n)("settings.slskdSourceDirBullet2")),1),p("li",null,w(u(n)("settings.slskdSourceDirBullet3")),1)]),p("pre",Zg,w(u(n)("settings.slskdSourceDirExample")),1)]),p("label",ey,w(u(n)("settings.slskdSourceDirLabel")),1),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 font-mono text-sm",type:"text",placeholder:u(n)("settings.slskdSourceDirPlaceholder"),"onUpdate:modelValue":v[4]||(v[4]=h=>u(t).settings.value.slskd.source_dir=h)},null,8,ty),[[rt,u(t).settings.value.slskd.source_dir]]),p("p",ny,w(u(n)("settings.slskdSourceDirHint")),1),p("label",sy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[5]||(v[5]=h=>u(t).settings.value.slskd.leave_in_place=h)},null,512),[[en,u(t).settings.value.slskd.leave_in_place]]),p("span",null,[p("span",oy,w(u(n)("settings.slskdLeaveInPlace")),1),p("span",ry,w(u(n)("settings.slskdLeaveInPlaceHint")),1)])]),p("div",iy,[p("label",ly,[Re(w(u(n)("settings.slskdDownloadTimeout"))+" ",1),Ee(p("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"30",max:"3600","onUpdate:modelValue":v[6]||(v[6]=h=>u(t).settings.value.slskd.download_timeout_seconds=h)},null,512),[[rt,u(t).settings.value.slskd.download_timeout_seconds,void 0,{number:!0}]])]),p("label",ay,[Re(w(u(n)("settings.slskdQueuedTimeout"))+" ",1),Ee(p("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"15",max:"3600","onUpdate:modelValue":v[7]||(v[7]=h=>u(t).settings.value.slskd.queued_timeout_seconds=h)},null,512),[[rt,u(t).settings.value.slskd.queued_timeout_seconds,void 0,{number:!0}]])])]),p("p",cy,w(u(n)("settings.slskdTimeoutHint")),1)])):ie("",!0)]),p("div",null,[p("label",uy,w(u(n)("settings.lyricsSource")),1),p("label",dy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[8]||(v[8]=h=>u(t).settings.value.download_lyrics=h)},null,512),[[en,u(t).settings.value.download_lyrics]]),p("span",fy,[p("span",py,w(u(n)("settings.downloadLyrics")),1),p("span",hy,w(u(n)("settings.downloadLyricsHint")),1)])]),p("div",my,[p("span",gy,w(u(n)("settings.lyricsProvider")),1),p("span",yy,w(u(n)("settings.lyricsHint")),1)]),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 disabled:opacity-40","onUpdate:modelValue":v[9]||(v[9]=h=>u(t).settings.value.lyrics_providers[0]=h),disabled:!u(t).settings.value.download_lyrics},[(A(!0),T(de,null,Ie(u(t).settingsOptions.lyrics_providers,h=>(A(),T("option",{key:h,value:h},w(h),9,by))),128))],8,vy),[[Xs,u(t).settings.value.lyrics_providers[0]]])]),p("div",_y,[p("div",null,[p("label",xy,w(u(n)("settings.format")),1),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":v[10]||(v[10]=h=>u(t).settings.value.format=h)},[(A(!0),T(de,null,Ie(u(t).settingsOptions.format,h=>(A(),T("option",{key:h,value:h},w(h.toUpperCase()),9,wy))),128))],512),[[Xs,u(t).settings.value.format]])]),p("div",null,[p("div",ky,[p("label",Sy,w(u(n)("settings.quality")),1),u(t).settings.value.format==="flac"?(A(),T("span",Ey,w(u(n)("settings.qualityIgnored")),1)):ie("",!0)]),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":v[11]||(v[11]=h=>u(t).settings.value.bitrate=h),disabled:u(t).settings.value.format==="flac"},[(A(!0),T(de,null,Ie(u(t).settingsOptions.bitrate,h=>(A(),T("option",{key:h,value:h},w(h)+" kbps ",9,Ry))),128))],8,Ay),[[Xs,u(t).settings.value.bitrate]])])]),p("div",null,[p("label",Cy,w(u(n)("settings.playlistsSection")),1),p("label",Ty,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[12]||(v[12]=h=>u(t).settings.value.generate_m3u=h)},null,512),[[en,u(t).settings.value.generate_m3u]]),p("span",Py,[p("span",Oy,w(u(n)("settings.generateM3u")),1),p("span",Dy,w(u(n)("settings.generateM3uHint")),1)])]),p("label",Ny,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[13]||(v[13]=h=>u(t).settings.value.sync_navidrome=h)},null,512),[[en,u(t).settings.value.sync_navidrome]]),p("span",Iy,[p("span",$y,w(u(n)("settings.syncNavidrome")),1),p("span",Ly,w(u(n)("settings.syncNavidromeHint")),1)])])]),p("div",null,[p("label",Fy,w(u(n)("settings.navidromeSection")),1),p("p",My,w(u(n)("settings.navidromeHint")),1),p("label",Uy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[14]||(v[14]=h=>u(t).settings.value.navidrome.enabled=h)},null,512),[[en,u(t).settings.value.navidrome.enabled]]),p("span",By,[p("span",Hy,w(u(n)("settings.navidromeEnabled")),1),p("span",jy,w(u(n)("settings.navidromeEnabledHint")),1)])]),u(t).settings.value.navidrome.enabled?(A(),T("div",qy,[Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeUrl"),"onUpdate:modelValue":v[15]||(v[15]=h=>u(t).settings.value.navidrome.url=h)},null,8,Vy),[[rt,u(t).settings.value.navidrome.url]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeUsername"),"onUpdate:modelValue":v[16]||(v[16]=h=>u(t).settings.value.navidrome.username=h)},null,8,Wy),[[rt,u(t).settings.value.navidrome.username]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.navidromePassword"),"onUpdate:modelValue":v[17]||(v[17]=h=>u(t).settings.value.navidrome.password=h)},null,8,Ky),[[rt,u(t).settings.value.navidrome.password]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeAdminUser"),"onUpdate:modelValue":v[18]||(v[18]=h=>u(t).settings.value.navidrome.admin_username=h)},null,8,zy),[[rt,u(t).settings.value.navidrome.admin_username]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.navidromeAdminPassword"),"onUpdate:modelValue":v[19]||(v[19]=h=>u(t).settings.value.navidrome.admin_password=h)},null,8,Qy),[[rt,u(t).settings.value.navidrome.admin_password]]),p("label",Gy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[20]||(v[20]=h=>u(t).settings.value.navidrome.public_playlist=h)},null,512),[[en,u(t).settings.value.navidrome.public_playlist]]),p("span",Jy,[p("span",Yy,w(u(n)("settings.navidromePublic")),1)])])])):ie("",!0)]),p("div",null,[p("label",Xy,w(u(n)("settings.organizationSection")),1),p("label",Zy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[21]||(v[21]=h=>u(t).settings.value.organize_by_artist=h)},null,512),[[en,u(t).settings.value.organize_by_artist]]),p("span",ev,[p("span",tv,w(u(n)("settings.organizeByArtist")),1),p("span",nv,w(u(n)("settings.organizeByArtistHint")),1)])])]),p("div",null,[p("label",sv,w(u(n)("settings.parallelDownloads")),1),p("div",ov,[(A(!0),T(de,null,Ie(u(t).settingsOptions.max_parallel_downloads,h=>(A(),T("button",{key:h,type:"button",class:Ae(["rounded-xl border px-2 py-2 text-sm font-medium transition-colors text-center",[u(t).settings.value.max_parallel_downloads===h?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:k=>u(t).settings.value.max_parallel_downloads=h},w(h),11,rv))),128))]),p("p",iv,w(u(n)("settings.parallelDownloadsHint")),1)]),M(Rc,{"enter-active-class":"transition duration-200","enter-from-class":"opacity-0 -translate-y-1","enter-to-class":"opacity-100 translate-y-0","leave-active-class":"transition duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:ao(()=>[u(t).isSaved.value===!0?(A(),T("div",lv,[M(u(G),{icon:"clarity:check-line",class:"h-4 w-4 shrink-0"}),Re(" "+w(u(n)("settings.saved")),1)])):u(t).isSaved.value===!1?(A(),T("div",av,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-4 w-4 shrink-0"}),Re(" "+w(u(t).saveErrorText.value||u(n)("settings.saveError")),1)])):ie("",!0)]),_:1})]),p("div",cv,[p("label",uv,w(u(n)("common.cancel")),1),p("button",{class:"btn btn-primary btn-sm h-10 px-6 rounded-full",onClick:v[22]||(v[22]=h=>u(t).saveSettings())},w(u(n)("common.save")),1)])]),p("label",dv,w(u(n)("common.close")),1)])],64))}},Dt=te(""),Ql=te("light"),Gl=te("dark");function vi({useSystem:e=!0,initialTheme:t="",newLightAlias:n="",newDarkAlias:s=""}={}){function o(c){Ql.value=c,d()}function r(c){Gl.value=c,d()}function i(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function l(c){Dt.value=c,d()}function a(){Dt==="dark"?Dt.value="light":Dt==="light"&&(Dt.value="dark"),d()}function d(){document.documentElement.setAttribute("data-theme",Dt.value==="dark"?Gl.value:Ql.value)}return Dt.value!=="light"&&Dt.value!=="dark"&&(e&&l(i()),(t==="light"||t==="dark")&&(Dt.value=t)),n&&o(n),s&&r(s),d(),{currentTheme:Dt,setLightAlias:o,setDarkAlias:r,getSystemTheme:i,setTheme:l,switchTheme:a}}const fv={class:"min-h-dvh flex flex-col text-base-content"},pv={__name:"App",setup(e){const t=vi();return Za(()=>{t.setLightAlias("downtify-light"),t.setDarkAlias("downtify-dark")}),(n,s)=>{const o=xr("router-view");return A(),T("div",fv,[M(o,null,{default:ao(({Component:r,route:i})=>[M(Rc,{name:"page",mode:"out-in"},{default:ao(()=>[(A(),ct(Md(r),{key:i.fullPath}))]),_:2},1024)]),_:1}),M(gp),M(zn)])}}};/*! * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT - */const Tn=typeof document<"u";function du(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function dv(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&du(e.default)}const he=Object.assign;function lr(e,t){const n={};for(const s in t){const o=t[s];n[s]=wt(o)?o.map(e):e(o)}return n}const fs=()=>{},wt=Array.isArray;function Jl(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}const fu=/#/g,fv=/&/g,pv=/\//g,hv=/=/g,mv=/\?/g,pu=/\+/g,gv=/%5B/g,yv=/%5D/g,hu=/%5E/g,vv=/%60/g,mu=/%7B/g,bv=/%7C/g,gu=/%7D/g,_v=/%20/g;function bi(e){return e==null?"":encodeURI(""+e).replace(bv,"|").replace(gv,"[").replace(yv,"]")}function xv(e){return bi(e).replace(mu,"{").replace(gu,"}").replace(hu,"^")}function Lr(e){return bi(e).replace(pu,"%2B").replace(_v,"+").replace(fu,"%23").replace(fv,"%26").replace(vv,"`").replace(mu,"{").replace(gu,"}").replace(hu,"^")}function wv(e){return Lr(e).replace(hv,"%3D")}function kv(e){return bi(e).replace(fu,"%23").replace(mv,"%3F")}function Sv(e){return kv(e).replace(pv,"%2F")}function Ss(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const Ev=/\/$/,Av=e=>e.replace(Ev,"");function ar(e,t,n="/"){let s,o={},r="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return a=l>=0&&a>l?-1:a,a>=0&&(s=t.slice(0,a),r=t.slice(a,l>0?l:t.length),o=e(r.slice(1))),l>=0&&(s=s||t.slice(0,l),i=t.slice(l,t.length)),s=Pv(s??t,n),{fullPath:s+r+i,path:s,query:o,hash:Ss(i)}}function Rv(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Yl(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Cv(e,t,n){const s=t.matched.length-1,o=n.matched.length-1;return s>-1&&s===o&&Hn(t.matched[s],n.matched[o])&&yu(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Hn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function yu(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Tv(e[n],t[n]))return!1;return!0}function Tv(e,t){return wt(e)?Xl(e,t):wt(t)?Xl(t,e):(e==null?void 0:e.valueOf())===(t==null?void 0:t.valueOf())}function Xl(e,t){return wt(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function Pv(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),o=s[s.length-1];(o===".."||o===".")&&s.push("");let r=n.length-1,i,l;for(i=0;i1&&r--;else break;return n.slice(0,r).join("/")+"/"+s.slice(i).join("/")}const tn={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Fr=function(e){return e.pop="pop",e.push="push",e}({}),cr=function(e){return e.back="back",e.forward="forward",e.unknown="",e}({});function Ov(e){if(!e)if(Tn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Av(e)}const Dv=/^[^#]+#/;function Nv(e,t){return e.replace(Dv,"#")+t}function Iv(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Uo=()=>({left:window.scrollX,top:window.scrollY});function $v(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Iv(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Zl(e,t){return(history.state?history.state.position-t:-1)+e}const Mr=new Map;function Lv(e,t){Mr.set(e,t)}function Fv(e){const t=Mr.get(e);return Mr.delete(e),t}function Mv(e){return typeof e=="string"||e&&typeof e=="object"}function vu(e){return typeof e=="string"||typeof e=="symbol"}let Ce=function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e}({});const bu=Symbol("");Ce.MATCHER_NOT_FOUND+"",Ce.NAVIGATION_GUARD_REDIRECT+"",Ce.NAVIGATION_ABORTED+"",Ce.NAVIGATION_CANCELLED+"",Ce.NAVIGATION_DUPLICATED+"";function jn(e,t){return he(new Error,{type:e,[bu]:!0},t)}function Ht(e,t){return e instanceof Error&&bu in e&&(t==null||!!(e.type&t))}const Uv=["params","query","hash"];function Bv(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of Uv)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function Hv(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;so&&Lr(o)):[s&&Lr(s)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function jv(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=wt(s)?s.map(o=>o==null?null:""+o):s==null?s:""+s)}return t}const qv=Symbol(""),ta=Symbol(""),Bo=Symbol(""),_i=Symbol(""),Ur=Symbol("");function ns(){let e=[];function t(s){return e.push(s),()=>{const o=e.indexOf(s);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function rn(e,t,n,s,o,r=i=>i()){const i=s&&(s.enterCallbacks[o]=s.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const d=m=>{m===!1?a(jn(Ce.NAVIGATION_ABORTED,{from:n,to:t})):m instanceof Error?a(m):Mv(m)?a(jn(Ce.NAVIGATION_GUARD_REDIRECT,{from:t,to:m})):(i&&s.enterCallbacks[o]===i&&typeof m=="function"&&i.push(m),l())},c=r(()=>e.call(s&&s.instances[o],t,n,d));let f=Promise.resolve(c);e.length<3&&(f=f.then(d)),f.catch(m=>a(m))})}function ur(e,t,n,s,o=r=>r()){const r=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(du(a)){const d=(a.__vccOpts||a)[t];d&&r.push(rn(d,n,s,i,l,o))}else{let d=a();r.push(()=>d.then(c=>{if(!c)throw new Error(`Couldn't resolve component "${l}" at "${i.path}"`);const f=dv(c)?c.default:c;i.mods[l]=c,i.components[l]=f;const m=(f.__vccOpts||f)[t];return m&&rn(m,n,s,i,l,o)()}))}}return r}function Vv(e,t){const n=[],s=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let i=0;iHn(d,l))?s.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(d=>Hn(d,a))||o.push(a))}return[n,s,o]}/*! + */const Tn=typeof document<"u";function du(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function hv(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&du(e.default)}const he=Object.assign;function lr(e,t){const n={};for(const s in t){const o=t[s];n[s]=wt(o)?o.map(e):e(o)}return n}const fs=()=>{},wt=Array.isArray;function Jl(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}const fu=/#/g,mv=/&/g,gv=/\//g,yv=/=/g,vv=/\?/g,pu=/\+/g,bv=/%5B/g,_v=/%5D/g,hu=/%5E/g,xv=/%60/g,mu=/%7B/g,wv=/%7C/g,gu=/%7D/g,kv=/%20/g;function bi(e){return e==null?"":encodeURI(""+e).replace(wv,"|").replace(bv,"[").replace(_v,"]")}function Sv(e){return bi(e).replace(mu,"{").replace(gu,"}").replace(hu,"^")}function Lr(e){return bi(e).replace(pu,"%2B").replace(kv,"+").replace(fu,"%23").replace(mv,"%26").replace(xv,"`").replace(mu,"{").replace(gu,"}").replace(hu,"^")}function Ev(e){return Lr(e).replace(yv,"%3D")}function Av(e){return bi(e).replace(fu,"%23").replace(vv,"%3F")}function Rv(e){return Av(e).replace(gv,"%2F")}function Ss(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const Cv=/\/$/,Tv=e=>e.replace(Cv,"");function ar(e,t,n="/"){let s,o={},r="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return a=l>=0&&a>l?-1:a,a>=0&&(s=t.slice(0,a),r=t.slice(a,l>0?l:t.length),o=e(r.slice(1))),l>=0&&(s=s||t.slice(0,l),i=t.slice(l,t.length)),s=Nv(s??t,n),{fullPath:s+r+i,path:s,query:o,hash:Ss(i)}}function Pv(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Yl(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Ov(e,t,n){const s=t.matched.length-1,o=n.matched.length-1;return s>-1&&s===o&&Hn(t.matched[s],n.matched[o])&&yu(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Hn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function yu(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Dv(e[n],t[n]))return!1;return!0}function Dv(e,t){return wt(e)?Xl(e,t):wt(t)?Xl(t,e):(e==null?void 0:e.valueOf())===(t==null?void 0:t.valueOf())}function Xl(e,t){return wt(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function Nv(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),o=s[s.length-1];(o===".."||o===".")&&s.push("");let r=n.length-1,i,l;for(i=0;i1&&r--;else break;return n.slice(0,r).join("/")+"/"+s.slice(i).join("/")}const tn={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Fr=function(e){return e.pop="pop",e.push="push",e}({}),cr=function(e){return e.back="back",e.forward="forward",e.unknown="",e}({});function Iv(e){if(!e)if(Tn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Tv(e)}const $v=/^[^#]+#/;function Lv(e,t){return e.replace($v,"#")+t}function Fv(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Uo=()=>({left:window.scrollX,top:window.scrollY});function Mv(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Fv(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Zl(e,t){return(history.state?history.state.position-t:-1)+e}const Mr=new Map;function Uv(e,t){Mr.set(e,t)}function Bv(e){const t=Mr.get(e);return Mr.delete(e),t}function Hv(e){return typeof e=="string"||e&&typeof e=="object"}function vu(e){return typeof e=="string"||typeof e=="symbol"}let Ce=function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e}({});const bu=Symbol("");Ce.MATCHER_NOT_FOUND+"",Ce.NAVIGATION_GUARD_REDIRECT+"",Ce.NAVIGATION_ABORTED+"",Ce.NAVIGATION_CANCELLED+"",Ce.NAVIGATION_DUPLICATED+"";function jn(e,t){return he(new Error,{type:e,[bu]:!0},t)}function Ht(e,t){return e instanceof Error&&bu in e&&(t==null||!!(e.type&t))}const jv=["params","query","hash"];function qv(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of jv)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function Vv(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;so&&Lr(o)):[s&&Lr(s)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function Wv(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=wt(s)?s.map(o=>o==null?null:""+o):s==null?s:""+s)}return t}const Kv=Symbol(""),ta=Symbol(""),Bo=Symbol(""),_i=Symbol(""),Ur=Symbol("");function ns(){let e=[];function t(s){return e.push(s),()=>{const o=e.indexOf(s);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function rn(e,t,n,s,o,r=i=>i()){const i=s&&(s.enterCallbacks[o]=s.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const d=m=>{m===!1?a(jn(Ce.NAVIGATION_ABORTED,{from:n,to:t})):m instanceof Error?a(m):Hv(m)?a(jn(Ce.NAVIGATION_GUARD_REDIRECT,{from:t,to:m})):(i&&s.enterCallbacks[o]===i&&typeof m=="function"&&i.push(m),l())},c=r(()=>e.call(s&&s.instances[o],t,n,d));let f=Promise.resolve(c);e.length<3&&(f=f.then(d)),f.catch(m=>a(m))})}function ur(e,t,n,s,o=r=>r()){const r=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(du(a)){const d=(a.__vccOpts||a)[t];d&&r.push(rn(d,n,s,i,l,o))}else{let d=a();r.push(()=>d.then(c=>{if(!c)throw new Error(`Couldn't resolve component "${l}" at "${i.path}"`);const f=hv(c)?c.default:c;i.mods[l]=c,i.components[l]=f;const m=(f.__vccOpts||f)[t];return m&&rn(m,n,s,i,l,o)()}))}}return r}function zv(e,t){const n=[],s=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let i=0;iHn(d,l))?s.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(d=>Hn(d,a))||o.push(a))}return[n,s,o]}/*! * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT - */let Wv=()=>location.protocol+"//"+location.host;function _u(e,t){const{pathname:n,search:s,hash:o}=t,r=e.indexOf("#");if(r>-1){let i=o.includes(e.slice(r))?e.slice(r).length:1,l=o.slice(i);return l[0]!=="/"&&(l="/"+l),Yl(l,"")}return Yl(n,e)+s+o}function Kv(e,t,n,s){let o=[],r=[],i=null;const l=({state:m})=>{const b=_u(e,location),y=n.value,v=t.value;let h=0;if(m){if(n.value=b,t.value=m,i&&i===y){i=null;return}h=v?m.position-v.position:0}else s(b);o.forEach(k=>{k(n.value,y,{delta:h,type:Fr.pop,direction:h?h>0?cr.forward:cr.back:cr.unknown})})};function a(){i=n.value}function d(m){o.push(m);const b=()=>{const y=o.indexOf(m);y>-1&&o.splice(y,1)};return r.push(b),b}function c(){if(document.visibilityState==="hidden"){const{history:m}=window;if(!m.state)return;m.replaceState(he({},m.state,{scroll:Uo()}),"")}}function f(){for(const m of r)m();r=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:a,listen:d,destroy:f}}function na(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Uo():null}}function zv(e){const{history:t,location:n}=window,s={value:_u(e,n)},o={value:t.state};o.value||r(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(a,d,c){const f=e.indexOf("#"),m=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:Wv()+e+a;try{t[c?"replaceState":"pushState"](d,"",m),o.value=d}catch(b){console.error(b),n[c?"replace":"assign"](m)}}function i(a,d){r(a,he({},t.state,na(o.value.back,a,o.value.forward,!0),d,{position:o.value.position}),!0),s.value=a}function l(a,d){const c=he({},o.value,t.state,{forward:a,scroll:Uo()});r(c.current,c,!0),r(a,he({},na(s.value,a,null),{position:c.position+1},d),!1),s.value=a}return{location:s,state:o,push:l,replace:i}}function Qv(e){e=Ov(e);const t=zv(e),n=Kv(e,t.state,t.location,t.replace);function s(r,i=!0){i||n.pauseListeners(),history.go(r)}const o=he({location:"",base:e,go:s,createHref:Nv.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let xn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Ne=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Ne||{});const Gv={type:xn.Static,value:""},Jv=/[a-zA-Z0-9_]/;function Yv(e){if(!e)return[[]];if(e==="/")return[[Gv]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(b){throw new Error(`ERR (${n})/"${d}": ${b}`)}let n=Ne.Static,s=n;const o=[];let r;function i(){r&&o.push(r),r=[]}let l=0,a,d="",c="";function f(){d&&(n===Ne.Static?r.push({type:xn.Static,value:d}):n===Ne.Param||n===Ne.ParamRegExp||n===Ne.ParamRegExpEnd?(r.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),r.push({type:xn.Param,value:d,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),d="")}function m(){d+=a}for(;lt.length?t.length===1&&t[0]===We.Static+We.Segment?1:-1:0}function xu(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const nb={strict:!1,end:!0,sensitive:!1};function sb(e,t,n){const s=eb(Yv(e.path),n),o=he(s,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function ob(e,t){const n=[],s=new Map;t=Jl(nb,t);function o(f){return s.get(f)}function r(f,m,b){const y=!b,v=ia(f);v.aliasOf=b&&b.record;const h=Jl(t,f),k=[v];if("alias"in f){const C=typeof f.alias=="string"?[f.alias]:f.alias;for(const L of C)k.push(ia(he({},v,{components:b?b.record.components:v.components,path:L,aliasOf:b?b.record:v})))}let R,S;for(const C of k){const{path:L}=C;if(m&&L[0]!=="/"){const P=m.record.path,U=P[P.length-1]==="/"?"":"/";C.path=m.record.path+(L&&U+L)}if(R=sb(C,m,h),b?b.alias.push(R):(S=S||R,S!==R&&S.alias.push(R),y&&f.name&&!la(R)&&i(f.name)),wu(R)&&a(R),v.children){const P=v.children;for(let U=0;U{i(S)}:fs}function i(f){if(vu(f)){const m=s.get(f);m&&(s.delete(f),n.splice(n.indexOf(m),1),m.children.forEach(i),m.alias.forEach(i))}else{const m=n.indexOf(f);m>-1&&(n.splice(m,1),f.record.name&&s.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function l(){return n}function a(f){const m=lb(f,n);n.splice(m,0,f),f.record.name&&!la(f)&&s.set(f.record.name,f)}function d(f,m){let b,y={},v,h;if("name"in f&&f.name){if(b=s.get(f.name),!b)throw jn(Ce.MATCHER_NOT_FOUND,{location:f});h=b.record.name,y=he(ra(m.params,b.keys.filter(S=>!S.optional).concat(b.parent?b.parent.keys.filter(S=>S.optional):[]).map(S=>S.name)),f.params&&ra(f.params,b.keys.map(S=>S.name))),v=b.stringify(y)}else if(f.path!=null)v=f.path,b=n.find(S=>S.re.test(v)),b&&(y=b.parse(v),h=b.record.name);else{if(b=m.name?s.get(m.name):n.find(S=>S.re.test(m.path)),!b)throw jn(Ce.MATCHER_NOT_FOUND,{location:f,currentLocation:m});h=b.record.name,y=he({},m.params,f.params),v=b.stringify(y)}const k=[];let R=b;for(;R;)k.unshift(R.record),R=R.parent;return{name:h,path:v,params:y,matched:k,meta:ib(k)}}e.forEach(f=>r(f));function c(){n.length=0,s.clear()}return{addRoute:r,resolve:d,removeRoute:i,clearRoutes:c,getRoutes:l,getRecordMatcher:o}}function ra(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function ia(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:rb(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function rb(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function la(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function ib(e){return e.reduce((t,n)=>he(t,n.meta),{})}function lb(e,t){let n=0,s=t.length;for(;n!==s;){const r=n+s>>1;xu(e,t[r])<0?s=r:n=r+1}const o=ab(e);return o&&(s=t.lastIndexOf(o,s-1)),s}function ab(e){let t=e;for(;t=t.parent;)if(wu(t)&&xu(e,t)===0)return t}function wu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function aa(e){const t=bt(Bo),n=bt(_i),s=ve(()=>{const a=u(e.to);return t.resolve(a)}),o=ve(()=>{const{matched:a}=s.value,{length:d}=a,c=a[d-1],f=n.matched;if(!c||!f.length)return-1;const m=f.findIndex(Hn.bind(null,c));if(m>-1)return m;const b=ca(a[d-2]);return d>1&&ca(c)===b&&f[f.length-1].path!==b?f.findIndex(Hn.bind(null,a[d-2])):m}),r=ve(()=>o.value>-1&&pb(n.params,s.value.params)),i=ve(()=>o.value>-1&&o.value===n.matched.length-1&&yu(n.params,s.value.params));function l(a={}){if(fb(a)){const d=t[u(e.replace)?"replace":"push"](u(e.to)).catch(fs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:ve(()=>s.value.href),isActive:r,isExactActive:i,navigate:l}}function cb(e){return e.length===1?e[0]:e}const ub=si({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:aa,setup(e,{slots:t}){const n=Ln(aa(e)),{options:s}=bt(Bo),o=ve(()=>({[ua(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ua(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const r=t.default&&cb(t.default(n));return e.custom?r:bs("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}}),db=ub;function fb(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function pb(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!wt(o)||o.length!==s.length||s.some((r,i)=>r.valueOf()!==o[i].valueOf()))return!1}return!0}function ca(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ua=(e,t,n)=>e??t??n,hb=si({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=bt(Ur),o=ve(()=>e.route||s.value),r=bt(ta,0),i=ve(()=>{let d=u(r);const{matched:c}=o.value;let f;for(;(f=c[d])&&!f.components;)d++;return d}),l=ve(()=>o.value.matched[i.value]);Qs(ta,ve(()=>i.value+1)),Qs(qv,l),Qs(Ur,o);const a=te();return Ft(()=>[a.value,l.value,e.name],([d,c,f],[m,b,y])=>{c&&(c.instances[f]=d,b&&b!==c&&d&&d===m&&(c.leaveGuards.size||(c.leaveGuards=b.leaveGuards),c.updateGuards.size||(c.updateGuards=b.updateGuards))),d&&c&&(!b||!Hn(c,b)||!m)&&(c.enterCallbacks[f]||[]).forEach(v=>v(d))},{flush:"post"}),()=>{const d=o.value,c=e.name,f=l.value,m=f&&f.components[c];if(!m)return da(n.default,{Component:m,route:d});const b=f.props[c],y=b?b===!0?d.params:typeof b=="function"?b(d):b:null,h=bs(m,he({},y,t,{onVnodeUnmounted:k=>{k.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return da(n.default,{Component:h,route:d})||h}}});function da(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const mb=hb;function gb(e){const t=ob(e.routes,e),n=e.parseQuery||Hv,s=e.stringifyQuery||ea,o=e.history,r=ns(),i=ns(),l=ns(),a=fd(tn);let d=tn;Tn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=lr.bind(null,N=>""+N),f=lr.bind(null,Sv),m=lr.bind(null,Ss);function b(N,Q){let K,J;return vu(N)?(K=t.getRecordMatcher(N),J=Q):J=N,t.addRoute(J,K)}function y(N){const Q=t.getRecordMatcher(N);Q&&t.removeRoute(Q)}function v(){return t.getRoutes().map(N=>N.record)}function h(N){return!!t.getRecordMatcher(N)}function k(N,Q){if(Q=he({},Q||a.value),typeof N=="string"){const x=ar(n,N,Q.path),O=t.resolve({path:x.path},Q),$=o.createHref(x.fullPath);return he(x,O,{params:m(O.params),hash:Ss(x.hash),redirectedFrom:void 0,href:$})}let K;if(N.path!=null)K=he({},N,{path:ar(n,N.path,Q.path).path});else{const x=he({},N.params);for(const O in x)x[O]==null&&delete x[O];K=he({},N,{params:f(x)}),Q.params=f(Q.params)}const J=t.resolve(K,Q),ce=N.hash||"";J.params=c(m(J.params));const g=Rv(s,he({},N,{hash:xv(ce),path:J.path})),_=o.createHref(g);return he({fullPath:g,hash:ce,query:s===ea?jv(N.query):N.query||{}},J,{redirectedFrom:void 0,href:_})}function R(N){return typeof N=="string"?ar(n,N,a.value.path):he({},N)}function S(N,Q){if(d!==N)return jn(Ce.NAVIGATION_CANCELLED,{from:Q,to:N})}function C(N){return U(N)}function L(N){return C(he(R(N),{replace:!0}))}function P(N,Q){const K=N.matched[N.matched.length-1];if(K&&K.redirect){const{redirect:J}=K;let ce=typeof J=="function"?J(N,Q):J;return typeof ce=="string"&&(ce=ce.includes("?")||ce.includes("#")?ce=R(ce):{path:ce},ce.params={}),he({query:N.query,hash:N.hash,params:ce.path!=null?{}:N.params},ce)}}function U(N,Q){const K=d=k(N),J=a.value,ce=N.state,g=N.force,_=N.replace===!0,x=P(K,J);if(x)return U(he(R(x),{state:typeof x=="object"?he({},ce,x.state):ce,force:g,replace:_}),Q||K);const O=K;O.redirectedFrom=Q;let $;return!g&&Cv(s,J,K)&&($=jn(Ce.NAVIGATION_DUPLICATED,{to:O,from:J}),De(J,J,!0,!1)),($?Promise.resolve($):W(O,J)).catch(D=>Ht(D)?Ht(D,Ce.NAVIGATION_GUARD_REDIRECT)?D:Et(D):re(D,O,J)).then(D=>{if(D){if(Ht(D,Ce.NAVIGATION_GUARD_REDIRECT))return U(he({replace:_},R(D.to),{state:typeof D.to=="object"?he({},ce,D.to.state):ce,force:g}),Q||O)}else D=q(O,J,!0,_,ce);return B(O,J,D),D})}function ae(N,Q){const K=S(N,Q);return K?Promise.reject(K):Promise.resolve()}function I(N){const Q=gt.values().next().value;return Q&&typeof Q.runWithContext=="function"?Q.runWithContext(N):N()}function W(N,Q){let K;const[J,ce,g]=Vv(N,Q);K=ur(J.reverse(),"beforeRouteLeave",N,Q);for(const x of J)x.leaveGuards.forEach(O=>{K.push(rn(O,N,Q))});const _=ae.bind(null,N,Q);return K.push(_),dt(K).then(()=>{K=[];for(const x of r.list())K.push(rn(x,N,Q));return K.push(_),dt(K)}).then(()=>{K=ur(ce,"beforeRouteUpdate",N,Q);for(const x of ce)x.updateGuards.forEach(O=>{K.push(rn(O,N,Q))});return K.push(_),dt(K)}).then(()=>{K=[];for(const x of g)if(x.beforeEnter)if(wt(x.beforeEnter))for(const O of x.beforeEnter)K.push(rn(O,N,Q));else K.push(rn(x.beforeEnter,N,Q));return K.push(_),dt(K)}).then(()=>(N.matched.forEach(x=>x.enterCallbacks={}),K=ur(g,"beforeRouteEnter",N,Q,I),K.push(_),dt(K))).then(()=>{K=[];for(const x of i.list())K.push(rn(x,N,Q));return K.push(_),dt(K)}).catch(x=>Ht(x,Ce.NAVIGATION_CANCELLED)?x:Promise.reject(x))}function B(N,Q,K){l.list().forEach(J=>I(()=>J(N,Q,K)))}function q(N,Q,K,J,ce){const g=S(N,Q);if(g)return g;const _=Q===tn,x=Tn?history.state:{};K&&(J||_?o.replace(N.fullPath,he({scroll:_&&x&&x.scroll},ce)):o.push(N.fullPath,ce)),a.value=N,De(N,Q,K,_),Et()}let se;function xe(){se||(se=o.listen((N,Q,K)=>{if(!Rt.listening)return;const J=k(N),ce=P(J,Rt.currentRoute.value);if(ce){U(he(ce,{replace:!0,force:!0}),J).catch(fs);return}d=J;const g=a.value;Tn&&Lv(Zl(g.fullPath,K.delta),Uo()),W(J,g).catch(_=>Ht(_,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_CANCELLED)?_:Ht(_,Ce.NAVIGATION_GUARD_REDIRECT)?(U(he(R(_.to),{force:!0}),J).then(x=>{Ht(x,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_DUPLICATED)&&!K.delta&&K.type===Fr.pop&&o.go(-1,!1)}).catch(fs),Promise.reject()):(K.delta&&o.go(-K.delta,!1),re(_,J,g))).then(_=>{_=_||q(J,g,!1),_&&(K.delta&&!Ht(_,Ce.NAVIGATION_CANCELLED)?o.go(-K.delta,!1):K.type===Fr.pop&&Ht(_,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),B(J,g,_)}).catch(fs)}))}let Me=ns(),le=ns(),fe;function re(N,Q,K){Et(N);const J=le.list();return J.length?J.forEach(ce=>ce(N,Q,K)):console.error(N),Promise.reject(N)}function ut(){return fe&&a.value!==tn?Promise.resolve():new Promise((N,Q)=>{Me.add([N,Q])})}function Et(N){return fe||(fe=!N,xe(),Me.list().forEach(([Q,K])=>N?K(N):Q()),Me.reset()),N}function De(N,Q,K,J){const{scrollBehavior:ce}=e;if(!Tn||!ce)return Promise.resolve();const g=!K&&Fv(Zl(N.fullPath,0))||(J||!K)&&history.state&&history.state.scroll||null;return ei().then(()=>ce(N,Q,g)).then(_=>_&&$v(_)).catch(_=>re(_,N,Q))}const Oe=N=>o.go(N);let At;const gt=new Set,Rt={currentRoute:a,listening:!0,addRoute:b,removeRoute:y,clearRoutes:t.clearRoutes,hasRoute:h,getRoutes:v,resolve:k,options:e,push:C,replace:L,go:Oe,back:()=>Oe(-1),forward:()=>Oe(1),beforeEach:r.add,beforeResolve:i.add,afterEach:l.add,onError:le.add,isReady:ut,install(N){N.component("RouterLink",db),N.component("RouterView",mb),N.config.globalProperties.$router=Rt,Object.defineProperty(N.config.globalProperties,"$route",{enumerable:!0,get:()=>u(a)}),Tn&&!At&&a.value===tn&&(At=!0,C(o.location).catch(J=>{}));const Q={};for(const J in tn)Object.defineProperty(Q,J,{get:()=>a.value[J],enumerable:!0});N.provide(Bo,Rt),N.provide(_i,La(Q)),N.provide(Ur,a);const K=N.unmount;gt.add(N),N.unmount=function(){gt.delete(N),gt.size<1&&(d=tn,se&&se(),se=null,a.value=tn,At=!1,fe=!1),K()}}};function dt(N){return N.reduce((Q,K)=>Q.then(()=>I(K)),Promise.resolve())}return Rt}function yb(){return bt(Bo)}function ku(e){return bt(_i)}const xi="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='256'%20height='256'%20viewBox='0%200%2067.733332%2067.733333'%20version='1.1'%20id='svg1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3cdefs%20id='defs1'%20/%3e%3cg%20id='layer1'%3e%3cg%20style='fill:%23040000;fill-opacity:1'%20id='g1'%20transform='matrix(0.06566918,0,0,0.06566918,17.061212,17.059932)'%3e%3cg%20id='g2'%3e%3ccircle%20style='fill:%231ad35d;fill-opacity:1;stroke-width:0.472667'%20id='path2'%20cx='33.866665'%20cy='33.866665'%20r='21.644735'%20transform='matrix(23.824636,0,0,23.824636,-550.95013,-550.93064)'%20/%3e%3cpath%20d='M%20480.6,111.5%20H%20406.5%20V%2035.6%20c%200,-10.7%20-8.3,-19.6%20-19,-20.4%20-104,-7.5%20-200.4,-3.7%20-263,0.8%20-10.7,0.8%20-19,9.8%20-19,20.5%20v%2074.9%20H%2031.4%20c%20-10.9,0%20-20.9,8.8%20-20.6,22%2040.6,166%20230.9,361.7%20230.9,361.7%209.8,10.8%2025.6,4%2028.6,0%200,0%20177.1,-165.8%20230.3,-359.4%201.6,-5.8%20-0.5,-24.3%20-20,-24.2%20z'%20id='path1'%20style='fill:%23040000;fill-opacity:1'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",fa=te(""),dr=te(),ss=te(!1),Ws=te(!1),Ks=te("");function Ho(){function e(o){return t(o)||n(o)}function t(o){return!(o===""||o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")||o.includes("://open.spotify.com/show/")||o.includes("://open.spotify.com/artist/"))}function n(o){return o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")}function s(o){console.log("Searching for:",o),dr.value=[],ss.value=!0,fa.value=o,Ws.value=!1,Ks.value="",Se.search(o).then(r=>{console.log("Received Search Data:",r.data),r.status===200?(dr.value=r.data,ss.value=!1):(console.error("Error Searching:",r),ss.value=!1,Ws.value=!0,Ks.value=r.toString())}).catch(r=>{console.error("Other Error Searching:",r.message),ss.value=!1,Ws.value=!0,Ks.value=r.message})}return{searchTerm:fa,isSearching:ss,results:dr,error:Ws,errorValue:Ks,searchFor:s,isValid:e,isValidSearch:t,isValidURL:n}}const nn={QUEUED:"In Queue",DOWNLOADING:"Downloading...",DOWNLOADED:"Done",ERROR:"Error"},Ke=te([]);class Su{constructor(t){this.song=t,this.web_status=nn.QUEUED,this.progress=0,this.message="",this.web_download_url=null,this.filename=null}setDownloading(){this.web_status=nn.DOWNLOADING}setDownloaded(){this.web_status=nn.DOWNLOADED}setError(){this.web_status=nn.ERROR}resetForRetry(){this.web_status=nn.QUEUED,this.progress=0,this.message="",this.web_download_url=null,this.filename=null}setWebURL(t){this.web_download_url=t}setFilename(t){this.filename=t}isQueued(){return this.song.song_id!==void 0}isDownloading(){return this.web_status===nn.DOWNLOADING}isDownloaded(){return this.web_status===nn.DOWNLOADED}isErrored(){return this.web_status===nn.ERROR}wsUpdate(t){this.progress=t.progress,this.message=t.message}}function Is(){function e(o){return Ke.value.findIndex(r=>r.song.song_id===o.song_id)}function t(o){let r=new Su(o);Ke.value.push(r)}function n(o){console.log("removing",o,o.song_id),Ke.value=Ke.value.filter(r=>r.song.song_id!==o.song_id),console.log(Ke.value)}function s(o){return e(o)===-1?null:Ke.value[e(o)]}return{appendSong:t,removeSong:n,getBySong:s,downloadQueue:Ke}}const Fe=Is();Se.ws_onmessage(e=>{let t=JSON.parse(e.data),n=Fe.getBySong(t.song);!n&&(Fe.appendSong(t.song),n=Fe.getBySong(t.song),!n)||(t.status==="done"?(n.progress=100,t.filename&&(n.setWebURL(Se.downloadFileURL(t.filename)),n.setFilename(t.filename)),n.setDownloaded()):t.status==="error"?(n.wsUpdate(t),n.setError()):t.status==="queued"?n.message=t.message||"":(n.wsUpdate(t),n.isDownloading()||n.setDownloading()))});Se.ws_onerror(e=>{console.log("websocket error:",e)});async function vb(){try{const t=(await Se.getQueue()).data||[];for(const n of t){if(Ke.value.some(o=>o.song.song_id===n.song.song_id))continue;const s=new Su(n.song);n.status==="done"?(s.setDownloaded(),n.filename&&(s.setWebURL(Se.downloadFileURL(n.filename)),s.setFilename(n.filename)),s.progress=100):n.status==="error"?(s.setError(),s.message=n.message||""):(n.status==="downloading"&&(s.setDownloading(),s.progress=n.progress||0),s.message=n.message||""),Ke.value.push(s)}}catch(e){console.log("Failed to load queue from server:",e)}}vb();function wi(){const e=te(!1),t=uu();async function n(){Ke.value=Ke.value.filter(m=>!m.isDownloaded());try{await Se.clearCompletedQueue()}catch(m){console.log("Failed to clear completed queue on server:",m)}}function s(m){const b=(m||"").includes("://open.spotify.com/playlist/"),y=t.settings.value.generate_m3u!==!1;return e.value=!0,(b?n():Promise.resolve()).then(()=>Se.open(m)).then(h=>{if(console.log("Received Response:",h),h.status!==200){console.log("Error:",h);return}const k=h.data;if(Array.isArray(k)){for(const R of k)Fe.getBySong(R)||Fe.appendSong(R);return Se.downloadBatch({songs:k,playlist_url:b?m:"",generate_m3u:y}).catch(R=>{console.log("Batch submit failed:",R.message)})}else console.log("Opened Song:",k),r(k)}).catch(h=>{console.log("Other Error:",h.message)}).finally(()=>{e.value=!1})}function o(m){return console.log("Downloading",m),Fe.getBySong(m).setDownloading(),Se.download(m).then(b=>{if(console.log("Received Response:",b),b.status===200){let y=b.data;return console.log("Download Complete:",y),Fe.getBySong(m).setWebURL(Se.downloadFileURL(y)),Fe.getBySong(m).setFilename(y),Fe.getBySong(m).setDownloaded(),{song:m,filename:y}}else return console.log("Error:",b),Fe.getBySong(m).setError(),{song:m,filename:null}}).catch(b=>(console.log("Other Error:",b.message),Fe.getBySong(m).setError(),{song:m,filename:null}))}function r(m,b=!0){return Fe.appendSong(m),b?o(m):Promise.resolve({song:m,filename:null})}function i(m,b){const y={...m,youtube_id:b},v=Fe.getBySong(m);return v&&(v.song.youtube_id=b,v.setDownloading(),v.progress=0,v.message=""),Se.download(y).then(h=>{const k=Fe.getBySong(y);if(h.status===200){const R=h.data;return k&&(k.setWebURL(Se.downloadFileURL(R)),k.setFilename(R),k.setDownloaded()),{song:y,filename:R}}return k&&k.setError(),{song:y,filename:null}}).catch(h=>{console.error("retryWithAudio error:",h.message);const k=Fe.getBySong(y);return k&&k.setError(),{song:y,filename:null}})}function l(m){const b=String(m.song_id||m.url||"");Fe.removeSong(m),b&&Se.removeQueueItem(b).catch(()=>{})}async function a(){await Se.clearQueue(),Ke.value=[]}async function d(){await Se.clearCompletedQueue(),Ke.value=Ke.value.filter(m=>!m.isDownloaded())}function c(m){const b=Fe.getBySong(m);return b&&b.resetForRetry(),o(m)}function f(){const m=Ke.value.filter(b=>b.isErrored());for(const b of m)c(b.song);return m.length}return{fromURL:s,download:o,queue:r,retry:c,retryWithAudio:i,retryAllFailed:f,remove:l,clearAll:a,clearCompleted:d,loading:e}}const bb={class:"relative w-full"},_b=["placeholder"],xb=["disabled"],Br={__name:"SearchInput",props:{compact:{type:Boolean,default:!1}},setup(e){const t=Ho(),n=wi(),{t:s,locale:o}=kt(),r=["https://open.spotify.com/track/4vfN00PlILRXy5dcXHQE9M","drugs - EDEN","Não Gosto Eu Amo - Henrique e Juliano","Perfect - Ed Sheeran","Lightning Crashes - Live"],i=te(0),l=ve(()=>(o.value,i.value===0?s("search.placeholder"):r[i.value-1])),a=setInterval(()=>{i.value=(i.value+1)%(r.length+1)},5e3);oi(()=>clearInterval(a));function d(c){!c||!c.trim()||(t.isValidURL(c)?(n.fromURL(c),it.push({name:"Download"})):t.isValidSearch(c)&&it.push({name:"Search",params:{query:c}}))}return(c,f)=>(A(),T("div",bb,[Ee(p("input",{type:"text",placeholder:l.value,class:Ae(["input-modern",e.compact?"h-11 text-sm":"h-14 text-base"]),"onUpdate:modelValue":f[0]||(f[0]=m=>u(t).searchTerm.value=m),onKeyup:f[1]||(f[1]=np(m=>d(u(t).searchTerm.value),["enter"]))},null,42,_b),[[rt,u(t).searchTerm.value]]),p("button",{class:Ae(["absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm transition hover:scale-105 active:scale-95 disabled:opacity-60",e.compact?"h-9 w-9":"h-11 w-11"]),disabled:u(n).loading.value,onClick:f[2]||(f[2]=m=>d(u(t).searchTerm.value))},[u(n).loading.value?(A(),T("span",{key:0,class:Ae(["loading loading-spinner",e.compact?"loading-xs":"loading-sm"])},null,2)):u(t).isValidURL(u(t).searchTerm.value)?(A(),ct(u(G),{key:1,icon:"clarity:download-line",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},null,8,["class"])):(A(),T("svg",{key:2,xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"2",stroke:"currentColor",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},[...f[3]||(f[3]=[p("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"},null,-1)])],2))],10,xb)]))}},wb={class:"relative flex min-h-[calc(100dvh-4rem)] items-center justify-center px-6 pt-24 pb-16 overflow-hidden"},kb={class:"relative w-full max-w-2xl text-center animate-slide-up"},Sb={class:"mt-3 flex items-center justify-center gap-2"},Eb={class:"badge-soft"},Ab={class:"badge-neutral-soft"},Rb={class:"mx-auto mt-5 max-w-md text-balance text-base sm:text-lg text-base-content/70"},Cb={class:"mt-10"},Tb={class:"mt-4 flex flex-wrap items-center justify-center gap-2 text-xs text-base-content/60"},Pb={class:"pill bg-white/5 border border-white/10"},Ob={class:"pill bg-white/5 border border-white/10"},Db={class:"pill bg-white/5 border border-white/10"},Nb={__name:"Hero",setup(e){const{t}=kt(),n=te(localStorage.getItem("version")||"2.7.0");return Xt(()=>{const s=localStorage.getItem("version");s&&(n.value=s)}),(s,o)=>(A(),T("section",wb,[o[4]||(o[4]=p("div",{"aria-hidden":"true",class:"pointer-events-none absolute inset-0 -z-10"},[p("div",{class:"absolute left-1/2 top-1/4 -translate-x-1/2 h-[420px] w-[420px] rounded-full bg-primary/25 blur-[120px]"}),p("div",{class:"absolute right-10 bottom-12 h-64 w-64 rounded-full bg-primary/10 blur-3xl"})],-1)),p("div",kb,[o[3]||(o[3]=mf('

    Downtify

    ',2)),p("div",Sb,[p("span",Eb,"v"+w(n.value),1),p("span",Ab,w(u(t)("hero.noAccount")),1)]),p("p",Rb,w(u(t)("hero.tagline")),1),p("div",Cb,[M(Br,{class:"w-full"}),p("div",Tb,[p("span",Pb,[o[0]||(o[0]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.songs")),1)]),p("span",Ob,[o[1]||(o[1]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.albums")),1)]),p("span",Db,[o[2]||(o[2]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.playlists")),1)])])])])]))}},Ib={class:"absolute top-0 inset-x-0 z-30"},$b={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Lb={class:"ml-auto flex items-center gap-1 sm:gap-2"},Fb=["title"],Mb=["title"],Ub=["title"],Bb=["title"],Hb={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},jb=["title"],qb=["title"],Vb={__name:"NavbarFront",setup(e){const t=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),n=Is(),{t:s}=kt();return(o,r)=>(A(),T("header",Ib,[p("div",$b,[r[5]||(r[5]=p("div",{class:"flex items-center gap-2"},[p("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"}),p("span",{class:"text-lg font-bold tracking-tight"},"Downtify")],-1)),p("div",Lb,[p("button",{class:"icon-btn",onClick:r[0]||(r[0]=i=>u(it).push({name:"List"})),title:u(s)("nav.library")},[M(u(G),{icon:"clarity:library-line",class:"h-5 w-5"})],8,Fb),p("button",{class:"icon-btn",onClick:r[1]||(r[1]=i=>u(it).push({name:"Player"})),title:u(s)("nav.player")},[M(u(G),{icon:"clarity:headphones-line",class:"h-5 w-5"})],8,Mb),p("button",{class:"icon-btn",onClick:r[2]||(r[2]=i=>u(it).push({name:"Monitor"})),title:u(s)("nav.monitor")},[M(u(G),{icon:"clarity:eye-line",class:"h-5 w-5"})],8,Ub),p("button",{class:"icon-btn relative",onClick:r[3]||(r[3]=i=>u(it).push({name:"Download"})),title:u(s)("nav.queue")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"}),u(n).downloadQueue.value.length>0?(A(),T("span",Hb,w(u(n).downloadQueue.value.length),1)):ie("",!0)],8,Bb),p("button",{class:"icon-btn",onClick:r[4]||(r[4]=i=>u(t).setTheme(u(t).currentTheme.value==="dark"?"light":"dark")),title:u(t).currentTheme.value==="dark"?u(s)("nav.switchToLight"):u(s)("nav.switchToDark")},[u(t).currentTheme.value==="dark"?(A(),ct(u(G),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(G),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,jb),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(s)("nav.settings")},[M(u(G),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,qb)])])]))}},Eu=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Wb={components:{NavbarFront:Vb,Hero:Nb},setup(){return Xt(()=>{window.scroll(0,0)}),{}}};function Kb(e,t,n,s,o,r){const i=xr("NavbarFront"),l=xr("Hero");return A(),T("div",null,[M(i),M(l)])}const zb=Eu(Wb,[["render",Kb]]),Qb={class:"sticky top-0 z-30 glass-nav"},Gb={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Jb=["title"],Yb={class:"hidden md:flex flex-1 justify-center"},Xb={class:"ml-auto flex items-center gap-1 sm:gap-2"},Zb=["title"],e_=["title"],t_=["title"],n_=["title"],s_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},o_=["title"],r_=["title"],i_={class:"md:hidden px-4 pb-3"},$s={__name:"Navbar",setup(e){const t=ku(),n=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),s=Is(),o=Ho(),{t:r}=kt();return(i,l)=>(A(),T("header",Qb,[p("div",Gb,[p("button",{class:"flex items-center gap-2 shrink-0",onClick:l[0]||(l[0]=a=>u(it).push({name:"Home"})),title:u(r)("nav.home")},[...l[6]||(l[6]=[p("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"},null,-1),p("span",{class:"hidden sm:inline text-lg font-bold tracking-tight"}," Downtify ",-1)])],8,Jb),p("div",Yb,[M(Br,{class:"w-full max-w-md",compact:!0})]),p("div",Xb,[p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="List"}]),onClick:l[1]||(l[1]=a=>u(it).push({name:"List"})),title:u(r)("nav.library")},[M(u(G),{icon:"clarity:library-line",class:"h-5 w-5"})],10,Zb),p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Player"}]),onClick:l[2]||(l[2]=a=>u(it).push({name:"Player"})),title:u(r)("nav.player")},[M(u(G),{icon:"clarity:headphones-line",class:"h-5 w-5"})],10,e_),p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Monitor"}]),onClick:l[3]||(l[3]=a=>u(it).push({name:"Monitor"})),title:u(r)("nav.monitor")},[M(u(G),{icon:"clarity:eye-line",class:"h-5 w-5"})],10,t_),p("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(t).name==="Download"}]),onClick:l[4]||(l[4]=a=>u(t).name==="Download"?u(it).push({name:"Search",params:{query:u(o).searchTerm.value||" "}}):u(it).push({name:"Download"})),title:u(r)("nav.queue")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"}),u(s).downloadQueue.value.length>0?(A(),T("span",s_,w(u(s).downloadQueue.value.length),1)):ie("",!0)],10,n_),p("button",{class:"icon-btn",onClick:l[5]||(l[5]=a=>u(n).setTheme(u(n).currentTheme.value==="dark"?"light":"dark")),title:u(n).currentTheme.value==="dark"?u(r)("nav.switchToLight"):u(r)("nav.switchToDark")},[u(n).currentTheme.value==="dark"?(A(),ct(u(G),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(G),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,o_),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(r)("nav.settings")},[M(u(G),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,r_)])]),p("div",i_,[M(Br,{compact:!0})])]))}},l_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},a_={class:"mb-8"},c_={class:"text-2xl font-bold tracking-tight"},u_={class:"mt-1 text-sm text-base-content/60"},d_={class:"text-base-content/90 font-medium"},f_={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},p_={key:1,class:"space-y-3"},h_={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},m_={class:"text-base-content/50 text-sm"},g_={class:"text-base-content/40 text-xs mt-1"},y_={key:3,class:"space-y-2"},v_={class:"track-cover"},b_=["src","alt"],__={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},x_={class:"flex-1 min-w-0"},w_={class:"flex items-center gap-2 mb-0.5"},k_={class:"font-semibold truncate"},S_={key:0,class:"badge-error-soft shrink-0"},E_={class:"text-xs text-base-content/70 truncate"},A_={key:0,class:"text-xs text-base-content/40 truncate"},R_={key:0,class:"text-base-content/30"},C_={class:"flex items-center gap-1 shrink-0"},T_=["href","title"],P_=["title"],O_=["onClick","title"],D_={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},N_=["disabled","title"],I_=["onClick"],$_=["disabled","title"],fr=5,L_={__name:"SearchList",props:["data","error"],emits:["download"],setup(e,{emit:t}){const n=e,s=t,o=Ho(),r=Is(),{t:i}=kt(),l=te(1),a=ve(()=>{var b;return Math.ceil((((b=n.data)==null?void 0:b.length)||0)/fr)}),d=ve(()=>{if(!n.data)return[];const b=(l.value-1)*fr;return n.data.slice(b,b+fr)});Ft(()=>n.data,()=>{l.value=1});function c(b){return Array.isArray(b.artists)&&b.artists.length?b.artists.join(", "):b.artist||i("common.unknownArtist")}function f(b){const y=r.getBySong(b);return y?y.isErrored()?"error":(y.isDownloaded(),"queued"):"idle"}function m(b){s("download",b)}return(b,y)=>{var v;return A(),T("div",l_,[p("div",a_,[p("h1",c_,w(u(i)("search.title")),1),p("p",u_,[u(o).searchTerm.value?(A(),T(de,{key:0},[Re(w(u(i)("search.matchesFor"))+" ",1),p("span",d_,' "'+w(u(o).searchTerm.value)+'" ',1),!u(o).isSearching.value&&(((v=n.data)==null?void 0:v.length)||0)>0?(A(),T(de,{key:0},[Re(w(n.data.length===1?u(i)("search.songsCount",{count:n.data.length}):u(i)("search.songsCountPlural",{count:n.data.length})),1)],64)):ie("",!0)],64)):(A(),T(de,{key:1},[Re(w(u(i)("search.typeToBegin")),1)],64))])]),n.error?(A(),T("div",f_,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),p("span",null,w(u(o).errorValue.value?u(i)("search.errorWithDetail",{detail:u(o).errorValue.value}):u(i)("search.error")),1)])):ie("",!0),u(o).isSearching.value?(A(),T("div",p_,[(A(),T(de,null,Ie(5,h=>p("div",{key:h,class:"skeleton h-24 rounded-2xl"})),64))])):!n.data||n.data.length===0?(A(),T("div",h_,[M(u(G),{icon:"clarity:search-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",m_,w(u(i)("search.empty")),1),p("p",g_,w(u(i)("search.emptyHint")),1)])):(A(),T("ul",y_,[(A(!0),T(de,null,Ie(d.value,(h,k)=>(A(),T("li",{key:h.song_id||k,class:"surface rounded-2xl track-card"},[p("div",v_,[h.cover_url?(A(),T("img",{key:0,src:h.cover_url,alt:h.name,class:"h-full w-full object-cover",loading:"lazy"},null,8,b_)):(A(),T("div",__,[M(u(G),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),p("div",x_,[p("div",w_,[p("span",k_,w(h.name),1),h.explicit?(A(),T("span",S_,"E")):ie("",!0)]),p("p",E_,w(c(h)),1),h.album_name?(A(),T("p",A_,[Re(w(h.album_name)+" ",1),h.year?(A(),T("span",R_," · "+w(h.year),1)):ie("",!0)])):ie("",!0)]),p("div",C_,[h.url?(A(),T("a",{key:0,class:"icon-btn",href:h.url,target:"_blank",rel:"noopener",title:u(i)("search.openOnSpotify")},[M(u(G),{icon:"clarity:pop-out-line",class:"h-4 w-4"})],8,T_)):ie("",!0),f(h)==="queued"?(A(),T("button",{key:1,class:"icon-btn text-primary cursor-default",title:u(i)("search.inQueue"),disabled:""},[M(u(G),{icon:"clarity:check-circle-line",class:"h-5 w-5"})],8,P_)):(A(),T("button",{key:2,class:"icon-btn text-primary hover:bg-primary/10",onClick:R=>m(h),title:u(i)("search.download")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"})],8,O_))])]))),128))])),a.value>1?(A(),T("nav",D_,[p("button",{class:"icon-btn",disabled:l.value===1,onClick:y[0]||(y[0]=h=>l.value--),title:u(i)("search.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,N_),(A(!0),T(de,null,Ie(a.value,h=>(A(),T("button",{key:h,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",h===l.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:k=>l.value=h},w(h),11,I_))),128)),p("button",{class:"icon-btn",disabled:l.value===a.value,onClick:y[1]||(y[1]=h=>l.value++),title:u(i)("search.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,$_)])):ie("",!0)])}}},F_={class:"min-h-screen"},M_={__name:"Search",setup(e){Xt(()=>window.scroll(0,0));const t=ku(),n=Ho(),s=wi();return Ft(()=>t.params.query,()=>{t.params.query&&n.searchFor(t.params.query)},{deep:!0}),n.searchFor(t.params.query),(o,r)=>(A(),T("div",F_,[M($s),M(zn),M(L_,{data:u(n).results.value,error:u(n).error.value,onDownload:r[0]||(r[0]=i=>u(s).queue(i))},null,8,["data","error"])]))}},U_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},B_={class:"mb-6 flex flex-wrap items-end justify-between gap-4"},H_={class:"text-2xl font-bold tracking-tight"},j_={class:"mt-1 text-sm text-base-content/60"},q_={key:0,class:"flex flex-wrap gap-2 justify-end"},V_=["title"],W_={key:0,class:"mb-6 flex flex-wrap gap-2",role:"tablist"},K_=["onClick"],z_={key:0,class:"ml-1 opacity-80 tabular-nums"},Q_={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},G_={class:"text-base-content/50 text-sm"},J_={class:"text-base-content/40 text-xs mt-1"},Y_={key:2,class:"surface rounded-2xl p-8 text-center text-sm text-base-content/50"},X_={key:3,class:"space-y-3"},Z_={class:"flex items-center gap-4"},e0={class:"track-cover h-16 w-16 sm:h-20 sm:w-20 shrink-0"},t0=["src","alt"],n0={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},s0={class:"flex-1 min-w-0"},o0={class:"flex items-center gap-2 mb-0.5 flex-wrap"},r0={class:"font-semibold truncate"},i0={class:"text-xs text-base-content/60 truncate"},l0={key:0,class:"text-xs text-base-content/40 truncate"},a0={key:1,class:"text-xs text-error/80 mt-1 line-clamp-2"},c0={class:"flex items-center gap-2 shrink-0"},u0=["title","onClick"],d0=["onClick","title"],f0={class:"text-[10px] font-semibold"},p0={key:3,class:"loading loading-spinner loading-sm text-primary"},h0=["onClick","title"],m0={key:0,class:"mt-3 pt-3 border-t border-white/10 flex flex-wrap gap-2 items-center"},g0=["onUpdate:modelValue","placeholder"],y0=["onClick"],v0=["onClick"],b0=["onClick"],_0={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},x0=["disabled","title"],w0=["onClick"],k0=["disabled","title"],pr=10,S0={__name:"DownloadList",setup(e){const t=Is(),n=wi(),{t:s}=kt(),o=te("active"),r=te(1),i=Ln({}),l=Ln({});function a(I){return I.isErrored()?"failed":I.isDownloaded()?"done":I.isDownloading()?"downloading":"queued"}const d=ve(()=>t.downloadQueue.value.filter(I=>a(I)==="done").length),c=ve(()=>t.downloadQueue.value.filter(I=>a(I)==="failed").length),f=ve(()=>t.downloadQueue.value.filter(I=>{const W=a(I);return W==="queued"||W==="downloading"}).length),m=ve(()=>[{id:"active",label:s("queue.filterActive"),count:f.value},{id:"all",label:s("queue.filterAll"),count:t.downloadQueue.value.length},{id:"downloading",label:s("queue.filterDownloading"),count:t.downloadQueue.value.filter(I=>a(I)==="downloading").length},{id:"queued",label:s("queue.filterQueued"),count:t.downloadQueue.value.filter(I=>a(I)==="queued").length},{id:"done",label:s("queue.filterDone"),count:d.value},{id:"failed",label:s("queue.filterFailed"),count:c.value}]),b=ve(()=>{const I=t.downloadQueue.value;switch(o.value){case"all":return I;case"active":return I.filter(W=>{const B=a(W);return B==="queued"||B==="downloading"});case"downloading":return I.filter(W=>a(W)==="downloading");case"queued":return I.filter(W=>a(W)==="queued");case"done":return I.filter(W=>a(W)==="done");case"failed":return I.filter(W=>a(W)==="failed");default:return I}}),y=ve(()=>Math.ceil(b.value.length/pr)),v=ve(()=>{const I=(r.value-1)*pr;return b.value.slice(I,I+pr)});Ft(o,()=>{r.value=1}),Ft(()=>b.value.length,()=>{r.value>y.value&&y.value>0&&(r.value=y.value),r.value<1&&(r.value=1)}),Ft(()=>t.downloadQueue.value.length,I=>{I===0?o.value="active":o.value==="active"&&f.value===0&&c.value>0&&(o.value="failed")});async function h(){confirm(s("queue.clearAllPrompt"))&&await n.clearAll()}async function k(){await n.clearCompleted()}function R(){n.retryAllFailed()}function S(I){return Array.isArray(I.artists)&&I.artists.length?I.artists.join(", "):I.artist||s("common.unknownArtist")}function C(I){return I.isErrored()?"badge-error-soft":I.isDownloaded()||I.isDownloading()?"badge-soft":"badge-neutral-soft"}function L(I){return I.message?I.message:I.isErrored()?s("queue.statusFailed"):I.isDownloaded()?s("queue.statusDone"):I.isDownloading()?s("queue.statusDownloading"):s("queue.statusQueued")}function P(I){const W=String(I||"").match(/(?:v=|youtu\.be\/)([A-Za-z0-9_-]{6,})/);return W?W[1]:null}function U(I){const W=I.song.song_id,B=P(l[W]);if(!B){alert(s("queue.invalidYouTubeURL"));return}i[W]=!1,n.retryWithAudio(I.song,B)}function ae(I){const W=document.createElement("a");W.href=I,W.download=I.split("/").pop(),document.body.appendChild(W),W.click(),document.body.removeChild(W)}return(I,W)=>(A(),T("div",U_,[p("div",B_,[p("div",null,[p("h1",H_,w(u(s)("queue.title")),1),p("p",j_,w(u(s)("queue.subtitle")),1)]),u(t).downloadQueue.value.length>0?(A(),T("div",q_,[c.value>0?(A(),T("button",{key:0,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:R},[M(u(G),{icon:"clarity:refresh-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(s)("queue.retryAllFailed",{count:c.value})),1)])):ie("",!0),d.value>0?(A(),T("button",{key:1,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:k},w(u(s)("queue.clearCompleted",{count:d.value})),1)):ie("",!0),p("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 text-error/70 hover:text-error",onClick:h,title:u(s)("queue.clearAll")},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(s)("queue.clearAll")),1)],8,V_)])):ie("",!0)]),u(t).downloadQueue.value.length>0?(A(),T("div",W_,[(A(!0),T(de,null,Ie(m.value,B=>(A(),T("button",{key:B.id,type:"button",class:Ae(["btn btn-sm rounded-full border-white/10",o.value===B.id?"btn-primary":"bg-base-100/85 hover:bg-base-100"]),onClick:q=>o.value=B.id},[Re(w(B.label)+" ",1),B.count>0?(A(),T("span",z_,"("+w(B.count)+")",1)):ie("",!0)],10,K_))),128))])):ie("",!0),u(t).downloadQueue.value.length===0?(A(),T("div",Q_,[M(u(G),{icon:"clarity:download-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",G_,w(u(s)("queue.empty")),1),p("p",J_,w(u(s)("queue.emptyHint")),1)])):b.value.length===0?(A(),T("div",Y_,w(u(s)("queue.emptyFilter")),1)):(A(),T("ul",X_,[(A(!0),T(de,null,Ie(v.value,(B,q)=>(A(),T("li",{key:B.song.song_id||B.song.url||q,class:"surface rounded-2xl p-3 sm:p-4"},[p("div",Z_,[p("div",e0,[B.song.cover_url?(A(),T("img",{key:0,src:B.song.cover_url,alt:B.song.name,class:"h-full w-full object-cover"},null,8,t0)):(A(),T("div",n0,[M(u(G),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),p("div",s0,[p("div",o0,[p("span",r0,w(B.song.name),1),p("span",{class:Ae([C(B),"shrink-0"])},w(L(B)),3)]),p("p",i0,w(S(B.song)),1),B.song.album_name?(A(),T("p",l0,w(B.song.album_name),1)):ie("",!0),B.isErrored()&&B.message?(A(),T("p",a0,w(B.message),1)):ie("",!0)]),p("div",c0,[B.isErrored()?(A(),T("button",{key:0,class:"icon-btn text-primary hover:bg-primary/10",title:u(s)("queue.retry"),onClick:se=>u(n).retry(B.song)},[M(u(G),{icon:"clarity:refresh-line",class:"h-4 w-4"})],8,u0)):ie("",!0),B.isDownloaded()?(A(),T("a",{key:1,class:"icon-btn text-primary hover:bg-primary/10",href:"javascript:;",onClick:se=>ae(B.web_download_url),title:u(s)("queue.saveToDevice")},[M(u(G),{icon:"clarity:download-line",class:"h-4 w-4"})],8,d0)):B.isDownloading()&&!B.isErrored()?(A(),T("div",{key:2,class:"radial-progress text-primary",style:$n(`--value:${Math.max(0,B.progress)}; --size:2.75rem; --thickness:3px`)},[p("span",f0,w(Math.round(B.progress))+"% ",1)],4)):B.isErrored()?ie("",!0):(A(),T("span",p0)),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",onClick:se=>u(n).remove(B.song),title:u(s)("queue.removeFromQueue")},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,h0)])]),B.isErrored()&&i[B.song.song_id]?(A(),T("div",m0,[Ee(p("input",{"onUpdate:modelValue":se=>l[B.song.song_id]=se,type:"text",class:"input input-sm flex-1 min-w-[12rem] rounded-xl bg-base-100/80",placeholder:u(s)("queue.overridePlaceholder")},null,8,g0),[[rt,l[B.song.song_id]]]),p("button",{class:"btn btn-sm btn-primary rounded-full",onClick:se=>U(B)},w(u(s)("queue.applyOverride")),9,y0),p("button",{class:"btn btn-sm btn-ghost rounded-full",onClick:se=>i[B.song.song_id]=!1},w(u(s)("common.cancel")),9,v0)])):B.isErrored()?(A(),T("button",{key:1,type:"button",class:"mt-2 text-xs text-primary/80 hover:text-primary",onClick:se=>i[B.song.song_id]=!0},w(u(s)("queue.forceAudio")),9,b0)):ie("",!0)]))),128))])),y.value>1?(A(),T("nav",_0,[p("button",{class:"icon-btn",disabled:r.value===1,onClick:W[0]||(W[0]=B=>r.value--),title:u(s)("common.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,x0),(A(!0),T(de,null,Ie(y.value,B=>(A(),T("button",{key:B,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",B===r.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:q=>r.value=B},w(B),11,w0))),128)),p("button",{class:"icon-btn",disabled:r.value===y.value,onClick:W[1]||(W[1]=B=>r.value++),title:u(s)("common.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,k0)])):ie("",!0)]))}},E0={class:"min-h-screen"},A0={__name:"Download",setup(e){return Xt(()=>window.scroll(0,0)),(t,n)=>(A(),T("div",E0,[M($s),M(zn),M(S0)]))}},Au="downtify-player-volume",qe=te([]),st=te(-1),vo=te(!1),Ls=te(0),un=te(0),ki=te(parseFloat(localStorage.getItem(Au)||"0.85")),In=te(!1),Qn=te("off"),dn=te(!1);let be=null,yt=[],jo=0;function qo(){return be||(be=new Audio,be.preload="metadata",be.volume=ki.value,be.addEventListener("timeupdate",()=>{Ls.value=be.currentTime}),be.addEventListener("loadedmetadata",()=>{un.value=isFinite(be.duration)?be.duration:0}),be.addEventListener("durationchange",()=>{un.value=isFinite(be.duration)?be.duration:0}),be.addEventListener("ended",$0),be.addEventListener("play",()=>{vo.value=!0}),be.addEventListener("pause",()=>{vo.value=!1}),be)}function Hr(e){const t=e.replace(/\.[^.]+$/,"");let n="",s=t;const o=t.indexOf(" - ");return o>0&&(n=t.slice(0,o).trim(),s=t.slice(o+3).trim()),{file:e,url:Se.downloadFileURL(e),cover:Se.coverFileURL(e),title:s,artist:n,album:""}}function Si(e){if(typeof e=="string")return Hr(e);const t=String((e==null?void 0:e.file)||""),n=Hr(t),s=String((e==null?void 0:e.title)||"").trim(),o=String((e==null?void 0:e.artist)||"").trim(),r=String((e==null?void 0:e.album)||"").trim();return{file:t,url:n.url,cover:n.cover,title:s||n.title,artist:o||n.artist,album:r||n.album}}function Fs(){const e=qe.value.map((t,n)=>n);for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}yt=e,jo=st.value>=0?Math.max(0,yt.indexOf(st.value)):0}function R0(e,t={}){const n=(e||[]).map(s=>typeof s=="string"?Hr(s):Si(s));qe.value=n,st.value>=n.length&&(st.value=-1),dn.value&&Fs(),typeof t.startIndex=="number"?qn(t.startIndex):t.autoplay&&n.length>0&&st.value<0&&qn(0)}function qn(e){if(e<0||e>=qe.value.length)return;const t=qo();if(st.value=e,dn.value){yt.length!==qe.value.length&&Fs();const n=yt.indexOf(e);n>=0&&(jo=n)}t.src=qe.value[e].url,t.currentTime=0,Ls.value=0,t.play().catch(()=>{})}function Ru(){if(qe.value.length===0)return;const e=qo();if(st.value<0){qn(0);return}e.src||(e.src=qe.value[st.value].url),e.play().catch(()=>{})}function Ei(){be&&be.pause()}function C0(){vo.value?Ei():Ru()}function Vo(e){const t=qo(),n=un.value||0,s=Math.max(0,Math.min(n,e));t.currentTime=s,Ls.value=s}function T0(e){un.value&&Vo(un.value*Math.max(0,Math.min(1,e)))}function P0(e){const t=Math.max(0,Math.min(1,e));ki.value=t,be&&(be.volume=t);try{localStorage.setItem(Au,String(t))}catch{}t>0&&In.value&&(In.value=!1,be&&(be.muted=!1))}function O0(){In.value=!In.value,be&&(be.muted=In.value)}function D0(){if(qe.value.length===0)return-1;if(dn.value){yt.length!==qe.value.length&&Fs();const t=(jo+1)%yt.length;return yt[t]}const e=st.value+1;return e>=qe.value.length?Qn.value==="all"?0:-1:e}function N0(){if(qe.value.length===0)return-1;if(dn.value){yt.length!==qe.value.length&&Fs();const t=(jo-1+yt.length)%yt.length;return yt[t]}const e=st.value-1;return e<0?Qn.value==="all"?qe.value.length-1:0:e}function Cu(){const e=D0();if(e<0){Ei();return}qn(e)}function I0(){if(qo().currentTime>3){Vo(0);return}const t=N0();t<0||qn(t)}function $0(){if(Qn.value==="one"){Vo(0),be&&be.play().catch(()=>{});return}Cu()}function Tu(e){["off","all","one"].includes(e)&&(Qn.value=e)}function L0(){const e=["off","all","one"],t=e.indexOf(Qn.value);Tu(e[(t+1)%e.length])}function Pu(e){dn.value=!!e,dn.value&&Fs()}function F0(){Pu(!dn.value)}const M0=ve(()=>st.value>=0&&st.valueun.value>0?Ls.value/un.value*100:0);function pa(e){if(!isFinite(e)||e<0)return"0:00";const t=Math.floor(e),n=Math.floor(t/60),s=t%60;return`${n}:${s.toString().padStart(2,"0")}`}function Ou(){return{playlist:qe,currentIndex:st,currentTrack:M0,isPlaying:vo,currentTime:Ls,duration:un,progressPct:U0,volume:ki,isMuted:In,repeatMode:Qn,shuffle:dn,setPlaylist:R0,playAt:qn,play:Ru,pause:Ei,toggle:C0,seek:Vo,seekRatio:T0,setVolume:P0,toggleMute:O0,next:Cu,prev:I0,setRepeat:Tu,cycleRepeat:L0,setShuffle:Pu,toggleShuffle:F0}}const B0={class:"min-h-screen"},H0={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},j0={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},q0={class:"text-2xl font-bold tracking-tight"},V0={class:"mt-1 text-sm text-base-content/60"},W0={class:"flex items-center gap-2"},K0=["title"],z0=["disabled"],Q0={key:0,class:"loading loading-spinner loading-xs mr-2"},G0={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},J0={key:1,class:"space-y-3"},Y0={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},X0={class:"text-base-content/50 text-sm"},Z0={class:"text-base-content/40 text-xs mt-1"},ex={key:3,class:"space-y-2"},tx={class:"relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden"},nx=["src","alt","onError"],sx={class:"flex-1 min-w-0"},ox={class:"text-sm font-medium truncate block"},rx={key:0,class:"text-xs text-base-content/60 truncate"},ix={class:"text-xs text-base-content/40"},lx={key:0,class:"mr-2 text-primary/70"},ax={class:"flex items-center gap-1 shrink-0"},cx=["onClick","title"],ux=["href","title"],dx=["disabled","onClick","title"],fx={key:0,class:"loading loading-spinner loading-xs"},px={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},hx=["disabled","title"],mx=["onClick"],gx=["disabled","title"],yx={key:5,class:"mt-6 text-xs text-base-content/40 text-center"},hr=10,vx={__name:"Downloads",setup(e){const{t}=kt(),n=Ou(),s=yb(),o=te([]),r=te(!1),i=te(""),l=te({}),a=te({}),d=te(1),c=ve(()=>Math.ceil(o.value.length/hr)),f=ve(()=>{const C=(d.value-1)*hr;return o.value.slice(C,C+hr)});Ft(o,()=>{d.value=1});function m(C){return Se.coverFileURL(C)}function b(C){a.value={...a.value,[C]:!0}}async function y(){r.value=!0,i.value="";try{const C=await Se.listDownloads();o.value=(C.data||[]).map(Si)}catch{i.value=t("library.failedLoad")}finally{r.value=!1}}async function v(C){if(confirm(t("library.deletePrompt",{file:C}))){l.value={...l.value,[C]:!0};try{await Se.deleteDownload(C),o.value=o.value.filter(L=>L!==C)}catch{i.value=t("library.failedDelete",{file:C})}finally{l.value={...l.value,[C]:!1}}}}function h(C){const L=C.lastIndexOf(".");return L>0?C.slice(L+1).toUpperCase():""}function k(C){const L=C.lastIndexOf("/");return L>=0?C.slice(0,L):""}function R(C){const L=o.value.findIndex(P=>P.file===C.file);L<0||(n.setPlaylist(o.value,{startIndex:L}),s.push({name:"Player"}))}function S(){o.value.length&&(n.setPlaylist(o.value,{startIndex:0}),s.push({name:"Player"}))}return Xt(y),(C,L)=>(A(),T("div",B0,[M($s),M(zn),p("div",H0,[p("div",j0,[p("div",null,[p("h1",q0,w(u(t)("library.title")),1),p("p",V0,w(u(t)("library.subtitle")),1)]),p("div",W0,[o.value.length>0?(A(),T("button",{key:0,class:"btn btn-primary btn-sm h-11 px-5 rounded-full",onClick:S,title:u(t)("library.play")},[M(u(G),{icon:"clarity:play-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(t)("library.play")),1)],8,K0)):ie("",!0),p("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:y,disabled:r.value},[r.value?(A(),T("span",Q0)):(A(),ct(u(G),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4 mr-2"})),Re(" "+w(u(t)("common.refresh")),1)],8,z0)])]),i.value?(A(),T("div",G0,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),p("span",null,w(i.value),1)])):ie("",!0),r.value&&o.value.length===0?(A(),T("div",J0,[(A(),T(de,null,Ie(4,P=>p("div",{key:P,class:"skeleton h-16 rounded-2xl"})),64))])):o.value.length===0?(A(),T("div",Y0,[M(u(G),{icon:"clarity:library-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",X0,w(u(t)("library.empty")),1),p("p",Z0,w(u(t)("library.emptyHint")),1)])):(A(),T("ul",ex,[(A(!0),T(de,null,Ie(f.value,P=>(A(),T("li",{key:P.file,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-3"},[p("div",tx,[a.value[P.file]?(A(),ct(u(G),{key:1,icon:"clarity:music-note-line",class:"h-5 w-5"})):(A(),T("img",{key:0,src:m(P.file),alt:P.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:U=>b(P.file)},null,40,nx))]),p("div",sx,[p("span",ox,w(P.title),1),P.artist?(A(),T("p",rx,w(P.artist),1)):ie("",!0),p("span",ix,[k(P.file)?(A(),T("span",lx,[M(u(G),{icon:"clarity:folder-line",class:"inline h-3 w-3 mr-0.5 align-text-top"}),Re(w(k(P.file)),1)])):ie("",!0),Re(" "+w(h(P.file)),1)])]),p("div",ax,[p("button",{class:"icon-btn text-primary hover:bg-primary/10",onClick:U=>R(P),title:u(t)("library.play")},[M(u(G),{icon:"clarity:play-line",class:"h-4 w-4"})],8,cx),p("a",{class:"icon-btn",href:u(Se).downloadFileURL(P.file),download:"",title:u(t)("library.downloadToDevice")},[M(u(G),{icon:"clarity:download-line",class:"h-4 w-4"})],8,ux),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",disabled:l.value[P.file]===!0,onClick:U=>v(P.file),title:u(t)("library.deleteFile")},[l.value[P.file]===!0?(A(),T("span",fx)):(A(),ct(u(G),{key:1,icon:"clarity:trash-line",class:"h-4 w-4"}))],8,dx)])]))),128))])),c.value>1?(A(),T("nav",px,[p("button",{class:"icon-btn",disabled:d.value===1,onClick:L[0]||(L[0]=P=>d.value--),title:u(t)("common.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,hx),(A(!0),T(de,null,Ie(c.value,P=>(A(),T("button",{key:P,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",P===d.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:U=>d.value=P},w(P),11,mx))),128)),p("button",{class:"icon-btn",disabled:d.value===c.value,onClick:L[1]||(L[1]=P=>d.value++),title:u(t)("common.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,gx)])):ie("",!0),o.value.length>0?(A(),T("p",yx,w(o.value.length===1?u(t)("library.countOne",{count:o.value.length}):u(t)("library.countMany",{count:o.value.length})),1)):ie("",!0)])]))}},Ms=Pe.create({baseURL:`${Ge.PROTOCOL}//${Ge.BACKEND}:${Ge.PORT}${Ge.BASEURL}`});function bx(){return Ms.get("/api/monitor/playlists")}function _x(e,t=60){return Ms.post("/api/monitor/playlists",{url:e,interval_minutes:t})}function xx(e,t){return Ms.patch(`/api/monitor/playlists/${e}`,t)}function wx(e){return Ms.delete(`/api/monitor/playlists/${e}`)}function kx(e){return Ms.post(`/api/monitor/playlists/${e}/check`)}const yn={listMonitoredPlaylists:bx,addMonitoredPlaylist:_x,updateMonitoredPlaylist:xx,deleteMonitoredPlaylist:wx,checkMonitoredPlaylist:kx},Sx={class:"min-h-screen"},Ex={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},Ax={class:"mb-8"},Rx={class:"text-2xl font-bold tracking-tight"},Cx={class:"mt-1 text-sm text-base-content/60"},Tx={class:"surface rounded-2xl p-5 mb-8"},Px={class:"text-sm font-semibold uppercase tracking-wider text-base-content/50 mb-4"},Ox=["placeholder","disabled"],Dx={class:"flex items-center gap-2 shrink-0"},Nx=["disabled"],Ix={value:15},$x={value:30},Lx={value:60},Fx={value:180},Mx={value:360},Ux={value:720},Bx={value:1440},Hx={value:10080},jx={value:20160},qx={value:43200},Vx=["disabled"],Wx={key:0,class:"loading loading-spinner loading-xs"},Kx={key:1},zx={key:0,class:"mt-2 text-xs text-error"},Qx={key:0,class:"space-y-3"},Gx={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},Jx={class:"text-base-content/50 text-sm"},Yx={class:"text-base-content/40 text-xs mt-1"},Xx={key:2,class:"space-y-3"},Zx={class:"flex-1 min-w-0"},ew={class:"flex items-center gap-2 mb-1"},tw={class:"font-semibold truncate"},nw={class:"flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-base-content/50"},sw={key:0},ow={key:1,class:"italic"},rw={class:"flex items-center gap-2 shrink-0"},iw=["value","onChange"],lw={value:15},aw={value:30},cw={value:60},uw={value:180},dw={value:360},fw={value:720},pw={value:1440},hw={value:10080},mw={value:20160},gw={value:43200},yw=["title","onClick"],vw=["title","disabled","onClick"],bw={key:0,class:"loading loading-spinner loading-xs"},_w=["title","onClick"],xw={class:"mt-8 surface rounded-2xl p-4 flex gap-3 text-sm text-base-content/60"},ww={__name:"Monitor",setup(e){const{t}=kt(),n=te([]),s=te(!1),o=te(!1),r=te(""),i=te(""),l=te(60),a=te({});async function d(){s.value=!0;try{const k=await yn.listMonitoredPlaylists();n.value=k.data||[]}finally{s.value=!1}}async function c(){var k,R;r.value="",o.value=!0;try{const S=await yn.addMonitoredPlaylist(i.value.trim(),l.value);n.value.unshift(S.data),i.value=""}catch(S){r.value=((R=(k=S==null?void 0:S.response)==null?void 0:k.data)==null?void 0:R.detail)||t("monitor.failedAdd")}finally{o.value=!1}}async function f(k){try{const R=await yn.updateMonitoredPlaylist(k.id,{enabled:!k.enabled});Object.assign(k,R.data)}catch{}}async function m(k,R){const S=parseInt(R.target.value,10);try{const C=await yn.updateMonitoredPlaylist(k.id,{interval_minutes:S});Object.assign(k,C.data)}catch{}}async function b(k){a.value={...a.value,[k.id]:!0};try{await yn.checkMonitoredPlaylist(k.id),setTimeout(async()=>{try{const R=await yn.listMonitoredPlaylists();n.value=R.data||[]}finally{a.value={...a.value,[k.id]:!1}}},3e3)}catch{a.value={...a.value,[k.id]:!1}}}async function y(k){if(confirm(t("monitor.deletePrompt",{name:k.name})))try{await yn.deleteMonitoredPlaylist(k.id),n.value=n.value.filter(R=>R.id!==k.id)}catch{}}function v(k){if(k<60)return`${k} ${t("monitor.minSuffix")}`;if(k<1440)return`${k/60} ${t("monitor.hourSuffix")}`;if(k<10080){const S=k/1440;return`${S} ${t(S===1?"monitor.daySuffix":"monitor.daysSuffix")}`}if(k<43200){const S=k/10080;return`${S} ${t(S===1?"monitor.weekSuffix":"monitor.weeksSuffix")}`}const R=Math.round(k/43200);return`${R} ${t(R===1?"monitor.monthSuffix":"monitor.monthsSuffix")}`}function h(k){try{const R=Date.now()-new Date(k).getTime(),S=Math.floor(R/6e4);if(S<1)return t("monitor.timeJustNow");if(S<60)return t("monitor.timeMinAgo",{n:S});const C=Math.floor(S/60);return C<24?t("monitor.timeHourAgo",{n:C}):t("monitor.timeDayAgo",{n:Math.floor(C/24)})}catch{return""}}return Xt(d),(k,R)=>(A(),T("div",Sx,[M($s),M(zn),p("div",Ex,[p("div",Ax,[p("h1",Rx,w(u(t)("monitor.title")),1),p("p",Cx,w(u(t)("monitor.subtitle")),1)]),p("div",Tx,[p("h2",Px,w(u(t)("monitor.watchNew")),1),p("form",{onSubmit:ep(c,["prevent"]),class:"flex flex-col sm:flex-row gap-3"},[Ee(p("input",{"onUpdate:modelValue":R[0]||(R[0]=S=>i.value=S),type:"text",placeholder:u(t)("monitor.urlPlaceholder"),class:"input-modern flex-1 h-11 text-sm",disabled:o.value},null,8,Ox),[[rt,i.value]]),p("div",Dx,[Ee(p("select",{"onUpdate:modelValue":R[1]||(R[1]=S=>l.value=S),class:"select select-sm rounded-full border border-white/10 bg-base-100/85 focus:border-primary/60 h-11 px-3 text-sm",disabled:o.value},[p("option",Ix,w(u(t)("monitor.every15")),1),p("option",$x,w(u(t)("monitor.every30")),1),p("option",Lx,w(u(t)("monitor.every1h")),1),p("option",Fx,w(u(t)("monitor.every3h")),1),p("option",Mx,w(u(t)("monitor.every6h")),1),p("option",Ux,w(u(t)("monitor.every12h")),1),p("option",Bx,w(u(t)("monitor.every1d")),1),p("option",Hx,w(u(t)("monitor.every1w")),1),p("option",jx,w(u(t)("monitor.every2w")),1),p("option",qx,w(u(t)("monitor.every1mo")),1)],8,Nx),[[Xs,l.value]]),p("button",{type:"submit",class:"btn btn-primary btn-sm h-11 px-5 rounded-full",disabled:o.value||!i.value.trim()},[o.value?(A(),T("span",Wx)):(A(),T("span",Kx,w(u(t)("monitor.watch")),1))],8,Vx)])],32),r.value?(A(),T("p",zx,w(r.value),1)):ie("",!0)]),s.value?(A(),T("div",Qx,[(A(),T(de,null,Ie(3,S=>p("div",{key:S,class:"skeleton h-24 rounded-2xl"})),64))])):n.value.length===0?(A(),T("div",Gx,[M(u(G),{icon:"clarity:music-note-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",Jx,w(u(t)("monitor.empty")),1),p("p",Yx,w(u(t)("monitor.emptyHint")),1)])):(A(),T("ul",Xx,[(A(!0),T(de,null,Ie(n.value,S=>(A(),T("li",{key:S.id,class:"surface rounded-2xl p-4 sm:p-5 flex flex-col sm:flex-row sm:items-center gap-4"},[p("div",Zx,[p("div",ew,[p("span",tw,w(S.name),1),p("span",{class:Ae(["pill shrink-0",S.enabled?"badge-soft":"badge-neutral-soft"])},w(S.enabled?u(t)("monitor.active"):u(t)("monitor.paused")),3)]),p("div",nw,[p("span",null,[M(u(G),{icon:"clarity:refresh-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(u(t)("monitor.everyInterval",{interval:v(S.interval_minutes)})),1)]),p("span",null,[M(u(G),{icon:"clarity:music-note-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(S.last_track_count===1?u(t)("monitor.tracksOne",{count:S.last_track_count}):u(t)("monitor.tracksMany",{count:S.last_track_count})),1)]),S.last_checked?(A(),T("span",sw,[M(u(G),{icon:"clarity:clock-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(u(t)("monitor.checked",{when:h(S.last_checked)})),1)])):(A(),T("span",ow,w(u(t)("monitor.notChecked")),1))])]),p("div",rw,[p("select",{value:S.interval_minutes,onChange:C=>m(S,C),class:"select select-xs rounded-full border border-white/10 bg-base-100/60 text-xs focus:border-primary/60"},[p("option",lw,w(u(t)("monitor.short15")),1),p("option",aw,w(u(t)("monitor.short30")),1),p("option",cw,w(u(t)("monitor.short1h")),1),p("option",uw,w(u(t)("monitor.short3h")),1),p("option",dw,w(u(t)("monitor.short6h")),1),p("option",fw,w(u(t)("monitor.short12h")),1),p("option",pw,w(u(t)("monitor.short1d")),1),p("option",hw,w(u(t)("monitor.short1w")),1),p("option",mw,w(u(t)("monitor.short2w")),1),p("option",gw,w(u(t)("monitor.short1mo")),1)],40,iw),p("button",{class:"icon-btn",title:S.enabled?u(t)("monitor.pause"):u(t)("monitor.resume"),onClick:C=>f(S)},[M(u(G),{icon:S.enabled?"clarity:pause-line":"clarity:play-line",class:"h-4 w-4"},null,8,["icon"])],8,yw),p("button",{class:"icon-btn",title:u(t)("monitor.checkNow"),disabled:a.value[S.id],onClick:C=>b(S)},[a.value[S.id]?(A(),T("span",bw)):(A(),ct(u(G),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4"}))],8,vw),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",title:u(t)("monitor.stop"),onClick:C=>y(S)},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,_w)])]))),128))])),p("div",xw,[M(u(G),{icon:"clarity:info-standard-line",class:"h-5 w-5 shrink-0 mt-0.5 text-primary/70"}),p("p",null,w(u(t)("monitor.info")),1)])])]))}},kw={class:"min-h-screen"},Sw={class:"mx-auto max-w-5xl px-4 py-8 sm:px-6"},Ew={class:"mb-8"},Aw={class:"text-2xl font-bold tracking-tight"},Rw={class:"mt-1 text-sm text-base-content/60"},Cw={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},Tw={class:"text-base-content/50 text-sm"},Pw={class:"text-base-content/40 text-xs mt-1"},Ow={key:1,class:"space-y-3"},Dw={key:2,class:"grid gap-6 lg:grid-cols-[1fr_360px]"},Nw={class:"surface rounded-3xl p-6 sm:p-8 flex flex-col items-center text-center"},Iw=["src","alt"],$w={key:2,class:"absolute bottom-3 right-3 equalizer h-5","aria-hidden":"true"},Lw={class:"mt-6 w-full"},Fw={class:"text-xl font-bold tracking-tight truncate"},Mw={class:"text-sm text-base-content/60 truncate mt-0.5"},Uw={class:"mt-6 w-full"},Bw={class:"mt-2 flex items-center justify-between text-xs text-base-content/50 tabular-nums"},Hw={class:"mt-5 flex items-center justify-center gap-3"},jw=["title"],qw=["title","disabled"],Vw=["disabled","title"],Ww=["title","disabled"],Kw=["title"],zw={key:0,class:"absolute -bottom-0.5 -right-0.5 h-4 min-w-[1rem] px-1 rounded-full bg-primary text-primary-content text-[9px] font-bold flex items-center justify-center"},Qw={class:"mt-6 w-full max-w-xs flex items-center gap-3"},Gw=["title"],Jw=["value","title"],Yw={class:"surface rounded-3xl p-4 sm:p-5 lg:max-h-[640px] lg:overflow-y-auto"},Xw={class:"flex items-center justify-between mb-3 px-1"},Zw={class:"text-xs font-semibold uppercase tracking-wider text-base-content/50"},e1={class:"text-[11px] text-base-content/40"},t1={key:0,class:"space-y-1"},n1=["onClick"],s1=["src","alt","onError"],o1={key:1,class:"relative equalizer h-3","aria-hidden":"true"},r1={class:"flex-1 min-w-0"},i1={class:"text-sm truncate font-medium"},l1={class:"text-[11px] truncate text-base-content/50"},a1={key:1,class:"text-center py-10"},c1={class:"text-base-content/50 text-sm"},u1={__name:"Player",setup(e){const{t}=kt(),n=Ou(),s=te([]),o=te(!1),r=te(null),i=te({});let l=!1;function a(L){return Se.coverFileURL(L)}function d(L){i.value={...i.value,[L]:!0}}async function c(){o.value=!0;try{const L=await Se.listDownloads();s.value=(L.data||[]).map(Si),n.playlist.value.length===0&&s.value.length>0&&n.setPlaylist(s.value)}finally{o.value=!1}}function f(L){var P,U;n.playlist.value.length!==s.value.length||((P=n.playlist.value[L])==null?void 0:P.file)!==((U=s.value[L])==null?void 0:U.file)?n.setPlaylist(s.value,{startIndex:L}):n.playAt(L)}const m=ve(()=>{const L=n.currentTrack.value;return L&&L.title?L.title:t("player.empty")}),b=ve(()=>{const L=n.currentTrack.value;return L&&L.artist?L.artist:L?t("common.unknownArtist"):""}),y=ve(()=>n.repeatMode.value==="one"?t("player.repeatOne"):n.repeatMode.value==="all"?t("player.repeatAll"):t("player.repeatOff"));function v(L){n.setVolume(parseFloat(L.target.value))}function h(L){const P=r.value;if(!P)return 0;const U=P.getBoundingClientRect(),ae=(L.clientX||0)-U.left;return Math.max(0,Math.min(1,ae/U.width))}function k(L){n.seekRatio(h(L))}function R(L){l=!0,n.seekRatio(h(L)),window.addEventListener("pointermove",S),window.addEventListener("pointerup",C,{once:!0})}function S(L){l&&n.seekRatio(h(L))}function C(){l=!1,window.removeEventListener("pointermove",S)}return Xt(()=>{window.scroll(0,0),c()}),ri(()=>{window.removeEventListener("pointermove",S)}),(L,P)=>(A(),T("div",kw,[M($s),M(zn),p("div",Sw,[p("div",Ew,[p("h1",Aw,w(u(t)("player.title")),1),p("p",Rw,w(u(t)("player.subtitle")),1)]),s.value.length===0&&!o.value?(A(),T("div",Cw,[M(u(G),{icon:"clarity:headphones-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",Tw,w(u(t)("player.empty")),1),p("p",Pw,w(u(t)("player.emptyHint")),1)])):o.value&&!u(n).currentTrack.value?(A(),T("div",Ow,[...P[8]||(P[8]=[p("div",{class:"skeleton h-72 rounded-3xl"},null,-1),p("div",{class:"skeleton h-16 rounded-2xl"},null,-1),p("div",{class:"skeleton h-16 rounded-2xl"},null,-1)])])):(A(),T("div",Dw,[p("section",Nw,[p("div",{class:Ae(["relative h-56 w-56 sm:h-64 sm:w-64 rounded-3xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden shadow-glow",{"pulse-glow":u(n).isPlaying.value}])},[u(n).currentTrack.value&&u(n).currentTrack.value.cover&&!i.value[u(n).currentTrack.value.file]?(A(),T("img",{key:0,src:u(n).currentTrack.value.cover,alt:u(n).currentTrack.value.title,class:"absolute inset-0 h-full w-full object-cover",onError:P[0]||(P[0]=U=>d(u(n).currentTrack.value.file))},null,40,Iw)):(A(),ct(u(G),{key:1,icon:"clarity:music-note-line",class:"h-24 w-24"})),u(n).isPlaying.value?(A(),T("div",$w,[...P[9]||(P[9]=[p("span",null,null,-1),p("span",null,null,-1),p("span",null,null,-1)])])):ie("",!0)],2),p("div",Lw,[p("p",Fw,w(m.value),1),p("p",Mw,w(b.value),1)]),p("div",Uw,[p("div",{class:"relative h-2 rounded-full bg-white/10 overflow-hidden cursor-pointer group",ref_key:"progressBar",ref:r,onClick:k,onPointerdown:R},[p("div",{class:"h-full bg-primary transition-[width] duration-150",style:$n(`width: ${u(n).progressPct.value}%`)},null,4),p("div",{class:"absolute top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded-full bg-primary shadow-glow-sm transition-all duration-150 opacity-0 group-hover:opacity-100",style:$n(`left: calc(${u(n).progressPct.value}% - 7px)`)},null,4)],544),p("div",Bw,[p("span",null,w(u(pa)(u(n).currentTime.value)),1),p("span",null,w(u(pa)(u(n).duration.value)),1)])]),p("div",Hw,[p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(n).shuffle.value}]),onClick:P[1]||(P[1]=U=>u(n).toggleShuffle()),title:u(n).shuffle.value?u(t)("player.shuffleOn"):u(t)("player.shuffleOff")},[M(u(G),{icon:"clarity:shuffle-line",class:"h-5 w-5"})],10,jw),p("button",{class:"icon-btn",onClick:P[2]||(P[2]=U=>u(n).prev()),title:u(t)("player.previous"),disabled:s.value.length===0},[M(u(G),{icon:"clarity:step-forward-2-line",class:"h-5 w-5 -scale-x-100"})],8,qw),p("button",{class:"inline-flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm hover:scale-105 active:scale-95 transition disabled:opacity-50",onClick:P[3]||(P[3]=U=>u(n).toggle()),disabled:s.value.length===0,title:u(n).isPlaying.value?u(t)("player.pause"):u(t)("player.play")},[M(u(G),{icon:u(n).isPlaying.value?"clarity:pause-solid":"clarity:play-solid",class:"h-6 w-6"},null,8,["icon"])],8,Vw),p("button",{class:"icon-btn",onClick:P[4]||(P[4]=U=>u(n).next()),title:u(t)("player.next"),disabled:s.value.length===0},[M(u(G),{icon:"clarity:step-forward-2-line",class:"h-5 w-5"})],8,Ww),p("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(n).repeatMode.value!=="off"}]),onClick:P[5]||(P[5]=U=>u(n).cycleRepeat()),title:y.value},[M(u(G),{icon:"clarity:refresh-line",class:"h-5 w-5"}),u(n).repeatMode.value==="one"?(A(),T("span",zw," 1 ")):ie("",!0)],10,Kw)]),p("div",Qw,[p("button",{class:"icon-btn",onClick:P[6]||(P[6]=U=>u(n).toggleMute()),title:u(n).isMuted.value?u(t)("player.unmute"):u(t)("player.mute")},[M(u(G),{icon:u(n).isMuted.value||u(n).volume.value===0?"clarity:volume-mute-line":u(n).volume.value<.5?"clarity:volume-down-line":"clarity:volume-up-line",class:"h-5 w-5"},null,8,["icon"])],8,Gw),p("input",{type:"range",min:"0",max:"1",step:"0.01",value:u(n).isMuted.value?0:u(n).volume.value,onInput:P[7]||(P[7]=U=>v(U)),class:"player-range flex-1",title:u(t)("player.volume")},null,40,Jw)])]),p("aside",Yw,[p("div",Xw,[p("h2",Zw,w(u(t)("player.queue")),1),p("span",e1,w(s.value.length===1?u(t)("player.countOne",{count:s.value.length}):u(t)("player.countMany",{count:s.value.length})),1)]),s.value.length>0?(A(),T("ul",t1,[(A(!0),T(de,null,Ie(s.value,(U,ae)=>(A(),T("li",{key:U.file,class:Ae(["rounded-xl px-2 py-2 flex items-center gap-3 cursor-pointer transition-colors",ae===u(n).currentIndex.value?"bg-primary/10 text-primary":"hover:bg-white/5"]),onClick:I=>f(ae)},[p("div",{class:Ae(["relative h-9 w-9 shrink-0 rounded-lg overflow-hidden flex items-center justify-center",ae===u(n).currentIndex.value?"bg-primary/15":"bg-base-100/60"])},[i.value[U.file]?ie("",!0):(A(),T("img",{key:0,src:a(U.file),alt:U.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:I=>d(U.file)},null,40,s1)),ae===u(n).currentIndex.value&&u(n).isPlaying.value?(A(),T("span",o1,[...P[10]||(P[10]=[p("span",null,null,-1),p("span",null,null,-1),p("span",null,null,-1)])])):i.value[U.file]?(A(),ct(u(G),{key:2,icon:"clarity:music-note-line",class:"h-4 w-4 text-base-content/50"})):ie("",!0)],2),p("div",r1,[p("p",i1,w(U.title),1),p("p",l1,w(U.artist||u(t)("common.unknownArtist")),1)])],10,n1))),128))])):(A(),T("div",a1,[p("p",c1,w(u(t)("player.empty")),1)]))])]))])]))}},d1=Eu(u1,[["__scopeId","data-v-98956c70"]]),f1=[{path:"/",name:"Home",component:zb},{path:"/search/:query",name:"Search",component:M_},{path:"/download",name:"Download",component:A0},{path:"/list",name:"List",component:vx},{path:"/monitor",name:"Monitor",component:ww},{path:"/player",name:"Player",component:d1}],it=gb({history:Qv(Ge.BASEURL),routes:f1}),Du=rp(uv);Du.use(it);Du.mount("#app"); + */let Qv=()=>location.protocol+"//"+location.host;function _u(e,t){const{pathname:n,search:s,hash:o}=t,r=e.indexOf("#");if(r>-1){let i=o.includes(e.slice(r))?e.slice(r).length:1,l=o.slice(i);return l[0]!=="/"&&(l="/"+l),Yl(l,"")}return Yl(n,e)+s+o}function Gv(e,t,n,s){let o=[],r=[],i=null;const l=({state:m})=>{const b=_u(e,location),y=n.value,v=t.value;let h=0;if(m){if(n.value=b,t.value=m,i&&i===y){i=null;return}h=v?m.position-v.position:0}else s(b);o.forEach(k=>{k(n.value,y,{delta:h,type:Fr.pop,direction:h?h>0?cr.forward:cr.back:cr.unknown})})};function a(){i=n.value}function d(m){o.push(m);const b=()=>{const y=o.indexOf(m);y>-1&&o.splice(y,1)};return r.push(b),b}function c(){if(document.visibilityState==="hidden"){const{history:m}=window;if(!m.state)return;m.replaceState(he({},m.state,{scroll:Uo()}),"")}}function f(){for(const m of r)m();r=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:a,listen:d,destroy:f}}function na(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Uo():null}}function Jv(e){const{history:t,location:n}=window,s={value:_u(e,n)},o={value:t.state};o.value||r(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(a,d,c){const f=e.indexOf("#"),m=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:Qv()+e+a;try{t[c?"replaceState":"pushState"](d,"",m),o.value=d}catch(b){console.error(b),n[c?"replace":"assign"](m)}}function i(a,d){r(a,he({},t.state,na(o.value.back,a,o.value.forward,!0),d,{position:o.value.position}),!0),s.value=a}function l(a,d){const c=he({},o.value,t.state,{forward:a,scroll:Uo()});r(c.current,c,!0),r(a,he({},na(s.value,a,null),{position:c.position+1},d),!1),s.value=a}return{location:s,state:o,push:l,replace:i}}function Yv(e){e=Iv(e);const t=Jv(e),n=Gv(e,t.state,t.location,t.replace);function s(r,i=!0){i||n.pauseListeners(),history.go(r)}const o=he({location:"",base:e,go:s,createHref:Lv.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let xn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Ne=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Ne||{});const Xv={type:xn.Static,value:""},Zv=/[a-zA-Z0-9_]/;function eb(e){if(!e)return[[]];if(e==="/")return[[Xv]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(b){throw new Error(`ERR (${n})/"${d}": ${b}`)}let n=Ne.Static,s=n;const o=[];let r;function i(){r&&o.push(r),r=[]}let l=0,a,d="",c="";function f(){d&&(n===Ne.Static?r.push({type:xn.Static,value:d}):n===Ne.Param||n===Ne.ParamRegExp||n===Ne.ParamRegExpEnd?(r.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),r.push({type:xn.Param,value:d,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),d="")}function m(){d+=a}for(;lt.length?t.length===1&&t[0]===We.Static+We.Segment?1:-1:0}function xu(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const rb={strict:!1,end:!0,sensitive:!1};function ib(e,t,n){const s=sb(eb(e.path),n),o=he(s,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function lb(e,t){const n=[],s=new Map;t=Jl(rb,t);function o(f){return s.get(f)}function r(f,m,b){const y=!b,v=ia(f);v.aliasOf=b&&b.record;const h=Jl(t,f),k=[v];if("alias"in f){const C=typeof f.alias=="string"?[f.alias]:f.alias;for(const L of C)k.push(ia(he({},v,{components:b?b.record.components:v.components,path:L,aliasOf:b?b.record:v})))}let R,S;for(const C of k){const{path:L}=C;if(m&&L[0]!=="/"){const P=m.record.path,U=P[P.length-1]==="/"?"":"/";C.path=m.record.path+(L&&U+L)}if(R=ib(C,m,h),b?b.alias.push(R):(S=S||R,S!==R&&S.alias.push(R),y&&f.name&&!la(R)&&i(f.name)),wu(R)&&a(R),v.children){const P=v.children;for(let U=0;U{i(S)}:fs}function i(f){if(vu(f)){const m=s.get(f);m&&(s.delete(f),n.splice(n.indexOf(m),1),m.children.forEach(i),m.alias.forEach(i))}else{const m=n.indexOf(f);m>-1&&(n.splice(m,1),f.record.name&&s.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function l(){return n}function a(f){const m=ub(f,n);n.splice(m,0,f),f.record.name&&!la(f)&&s.set(f.record.name,f)}function d(f,m){let b,y={},v,h;if("name"in f&&f.name){if(b=s.get(f.name),!b)throw jn(Ce.MATCHER_NOT_FOUND,{location:f});h=b.record.name,y=he(ra(m.params,b.keys.filter(S=>!S.optional).concat(b.parent?b.parent.keys.filter(S=>S.optional):[]).map(S=>S.name)),f.params&&ra(f.params,b.keys.map(S=>S.name))),v=b.stringify(y)}else if(f.path!=null)v=f.path,b=n.find(S=>S.re.test(v)),b&&(y=b.parse(v),h=b.record.name);else{if(b=m.name?s.get(m.name):n.find(S=>S.re.test(m.path)),!b)throw jn(Ce.MATCHER_NOT_FOUND,{location:f,currentLocation:m});h=b.record.name,y=he({},m.params,f.params),v=b.stringify(y)}const k=[];let R=b;for(;R;)k.unshift(R.record),R=R.parent;return{name:h,path:v,params:y,matched:k,meta:cb(k)}}e.forEach(f=>r(f));function c(){n.length=0,s.clear()}return{addRoute:r,resolve:d,removeRoute:i,clearRoutes:c,getRoutes:l,getRecordMatcher:o}}function ra(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function ia(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:ab(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function ab(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function la(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function cb(e){return e.reduce((t,n)=>he(t,n.meta),{})}function ub(e,t){let n=0,s=t.length;for(;n!==s;){const r=n+s>>1;xu(e,t[r])<0?s=r:n=r+1}const o=db(e);return o&&(s=t.lastIndexOf(o,s-1)),s}function db(e){let t=e;for(;t=t.parent;)if(wu(t)&&xu(e,t)===0)return t}function wu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function aa(e){const t=bt(Bo),n=bt(_i),s=be(()=>{const a=u(e.to);return t.resolve(a)}),o=be(()=>{const{matched:a}=s.value,{length:d}=a,c=a[d-1],f=n.matched;if(!c||!f.length)return-1;const m=f.findIndex(Hn.bind(null,c));if(m>-1)return m;const b=ca(a[d-2]);return d>1&&ca(c)===b&&f[f.length-1].path!==b?f.findIndex(Hn.bind(null,a[d-2])):m}),r=be(()=>o.value>-1&&gb(n.params,s.value.params)),i=be(()=>o.value>-1&&o.value===n.matched.length-1&&yu(n.params,s.value.params));function l(a={}){if(mb(a)){const d=t[u(e.replace)?"replace":"push"](u(e.to)).catch(fs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:be(()=>s.value.href),isActive:r,isExactActive:i,navigate:l}}function fb(e){return e.length===1?e[0]:e}const pb=si({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:aa,setup(e,{slots:t}){const n=Ln(aa(e)),{options:s}=bt(Bo),o=be(()=>({[ua(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ua(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const r=t.default&&fb(t.default(n));return e.custom?r:bs("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}}),hb=pb;function mb(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function gb(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!wt(o)||o.length!==s.length||s.some((r,i)=>r.valueOf()!==o[i].valueOf()))return!1}return!0}function ca(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ua=(e,t,n)=>e??t??n,yb=si({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=bt(Ur),o=be(()=>e.route||s.value),r=bt(ta,0),i=be(()=>{let d=u(r);const{matched:c}=o.value;let f;for(;(f=c[d])&&!f.components;)d++;return d}),l=be(()=>o.value.matched[i.value]);Qs(ta,be(()=>i.value+1)),Qs(Kv,l),Qs(Ur,o);const a=te();return Ft(()=>[a.value,l.value,e.name],([d,c,f],[m,b,y])=>{c&&(c.instances[f]=d,b&&b!==c&&d&&d===m&&(c.leaveGuards.size||(c.leaveGuards=b.leaveGuards),c.updateGuards.size||(c.updateGuards=b.updateGuards))),d&&c&&(!b||!Hn(c,b)||!m)&&(c.enterCallbacks[f]||[]).forEach(v=>v(d))},{flush:"post"}),()=>{const d=o.value,c=e.name,f=l.value,m=f&&f.components[c];if(!m)return da(n.default,{Component:m,route:d});const b=f.props[c],y=b?b===!0?d.params:typeof b=="function"?b(d):b:null,h=bs(m,he({},y,t,{onVnodeUnmounted:k=>{k.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return da(n.default,{Component:h,route:d})||h}}});function da(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const vb=yb;function bb(e){const t=lb(e.routes,e),n=e.parseQuery||Vv,s=e.stringifyQuery||ea,o=e.history,r=ns(),i=ns(),l=ns(),a=fd(tn);let d=tn;Tn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=lr.bind(null,N=>""+N),f=lr.bind(null,Rv),m=lr.bind(null,Ss);function b(N,Q){let K,J;return vu(N)?(K=t.getRecordMatcher(N),J=Q):J=N,t.addRoute(J,K)}function y(N){const Q=t.getRecordMatcher(N);Q&&t.removeRoute(Q)}function v(){return t.getRoutes().map(N=>N.record)}function h(N){return!!t.getRecordMatcher(N)}function k(N,Q){if(Q=he({},Q||a.value),typeof N=="string"){const x=ar(n,N,Q.path),O=t.resolve({path:x.path},Q),$=o.createHref(x.fullPath);return he(x,O,{params:m(O.params),hash:Ss(x.hash),redirectedFrom:void 0,href:$})}let K;if(N.path!=null)K=he({},N,{path:ar(n,N.path,Q.path).path});else{const x=he({},N.params);for(const O in x)x[O]==null&&delete x[O];K=he({},N,{params:f(x)}),Q.params=f(Q.params)}const J=t.resolve(K,Q),ce=N.hash||"";J.params=c(m(J.params));const g=Pv(s,he({},N,{hash:Sv(ce),path:J.path})),_=o.createHref(g);return he({fullPath:g,hash:ce,query:s===ea?Wv(N.query):N.query||{}},J,{redirectedFrom:void 0,href:_})}function R(N){return typeof N=="string"?ar(n,N,a.value.path):he({},N)}function S(N,Q){if(d!==N)return jn(Ce.NAVIGATION_CANCELLED,{from:Q,to:N})}function C(N){return U(N)}function L(N){return C(he(R(N),{replace:!0}))}function P(N,Q){const K=N.matched[N.matched.length-1];if(K&&K.redirect){const{redirect:J}=K;let ce=typeof J=="function"?J(N,Q):J;return typeof ce=="string"&&(ce=ce.includes("?")||ce.includes("#")?ce=R(ce):{path:ce},ce.params={}),he({query:N.query,hash:N.hash,params:ce.path!=null?{}:N.params},ce)}}function U(N,Q){const K=d=k(N),J=a.value,ce=N.state,g=N.force,_=N.replace===!0,x=P(K,J);if(x)return U(he(R(x),{state:typeof x=="object"?he({},ce,x.state):ce,force:g,replace:_}),Q||K);const O=K;O.redirectedFrom=Q;let $;return!g&&Ov(s,J,K)&&($=jn(Ce.NAVIGATION_DUPLICATED,{to:O,from:J}),De(J,J,!0,!1)),($?Promise.resolve($):W(O,J)).catch(D=>Ht(D)?Ht(D,Ce.NAVIGATION_GUARD_REDIRECT)?D:Et(D):re(D,O,J)).then(D=>{if(D){if(Ht(D,Ce.NAVIGATION_GUARD_REDIRECT))return U(he({replace:_},R(D.to),{state:typeof D.to=="object"?he({},ce,D.to.state):ce,force:g}),Q||O)}else D=q(O,J,!0,_,ce);return B(O,J,D),D})}function ae(N,Q){const K=S(N,Q);return K?Promise.reject(K):Promise.resolve()}function I(N){const Q=gt.values().next().value;return Q&&typeof Q.runWithContext=="function"?Q.runWithContext(N):N()}function W(N,Q){let K;const[J,ce,g]=zv(N,Q);K=ur(J.reverse(),"beforeRouteLeave",N,Q);for(const x of J)x.leaveGuards.forEach(O=>{K.push(rn(O,N,Q))});const _=ae.bind(null,N,Q);return K.push(_),dt(K).then(()=>{K=[];for(const x of r.list())K.push(rn(x,N,Q));return K.push(_),dt(K)}).then(()=>{K=ur(ce,"beforeRouteUpdate",N,Q);for(const x of ce)x.updateGuards.forEach(O=>{K.push(rn(O,N,Q))});return K.push(_),dt(K)}).then(()=>{K=[];for(const x of g)if(x.beforeEnter)if(wt(x.beforeEnter))for(const O of x.beforeEnter)K.push(rn(O,N,Q));else K.push(rn(x.beforeEnter,N,Q));return K.push(_),dt(K)}).then(()=>(N.matched.forEach(x=>x.enterCallbacks={}),K=ur(g,"beforeRouteEnter",N,Q,I),K.push(_),dt(K))).then(()=>{K=[];for(const x of i.list())K.push(rn(x,N,Q));return K.push(_),dt(K)}).catch(x=>Ht(x,Ce.NAVIGATION_CANCELLED)?x:Promise.reject(x))}function B(N,Q,K){l.list().forEach(J=>I(()=>J(N,Q,K)))}function q(N,Q,K,J,ce){const g=S(N,Q);if(g)return g;const _=Q===tn,x=Tn?history.state:{};K&&(J||_?o.replace(N.fullPath,he({scroll:_&&x&&x.scroll},ce)):o.push(N.fullPath,ce)),a.value=N,De(N,Q,K,_),Et()}let se;function we(){se||(se=o.listen((N,Q,K)=>{if(!Rt.listening)return;const J=k(N),ce=P(J,Rt.currentRoute.value);if(ce){U(he(ce,{replace:!0,force:!0}),J).catch(fs);return}d=J;const g=a.value;Tn&&Uv(Zl(g.fullPath,K.delta),Uo()),W(J,g).catch(_=>Ht(_,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_CANCELLED)?_:Ht(_,Ce.NAVIGATION_GUARD_REDIRECT)?(U(he(R(_.to),{force:!0}),J).then(x=>{Ht(x,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_DUPLICATED)&&!K.delta&&K.type===Fr.pop&&o.go(-1,!1)}).catch(fs),Promise.reject()):(K.delta&&o.go(-K.delta,!1),re(_,J,g))).then(_=>{_=_||q(J,g,!1),_&&(K.delta&&!Ht(_,Ce.NAVIGATION_CANCELLED)?o.go(-K.delta,!1):K.type===Fr.pop&&Ht(_,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),B(J,g,_)}).catch(fs)}))}let Me=ns(),le=ns(),fe;function re(N,Q,K){Et(N);const J=le.list();return J.length?J.forEach(ce=>ce(N,Q,K)):console.error(N),Promise.reject(N)}function ut(){return fe&&a.value!==tn?Promise.resolve():new Promise((N,Q)=>{Me.add([N,Q])})}function Et(N){return fe||(fe=!N,we(),Me.list().forEach(([Q,K])=>N?K(N):Q()),Me.reset()),N}function De(N,Q,K,J){const{scrollBehavior:ce}=e;if(!Tn||!ce)return Promise.resolve();const g=!K&&Bv(Zl(N.fullPath,0))||(J||!K)&&history.state&&history.state.scroll||null;return ei().then(()=>ce(N,Q,g)).then(_=>_&&Mv(_)).catch(_=>re(_,N,Q))}const Oe=N=>o.go(N);let At;const gt=new Set,Rt={currentRoute:a,listening:!0,addRoute:b,removeRoute:y,clearRoutes:t.clearRoutes,hasRoute:h,getRoutes:v,resolve:k,options:e,push:C,replace:L,go:Oe,back:()=>Oe(-1),forward:()=>Oe(1),beforeEach:r.add,beforeResolve:i.add,afterEach:l.add,onError:le.add,isReady:ut,install(N){N.component("RouterLink",hb),N.component("RouterView",vb),N.config.globalProperties.$router=Rt,Object.defineProperty(N.config.globalProperties,"$route",{enumerable:!0,get:()=>u(a)}),Tn&&!At&&a.value===tn&&(At=!0,C(o.location).catch(J=>{}));const Q={};for(const J in tn)Object.defineProperty(Q,J,{get:()=>a.value[J],enumerable:!0});N.provide(Bo,Rt),N.provide(_i,La(Q)),N.provide(Ur,a);const K=N.unmount;gt.add(N),N.unmount=function(){gt.delete(N),gt.size<1&&(d=tn,se&&se(),se=null,a.value=tn,At=!1,fe=!1),K()}}};function dt(N){return N.reduce((Q,K)=>Q.then(()=>I(K)),Promise.resolve())}return Rt}function _b(){return bt(Bo)}function ku(e){return bt(_i)}const xi="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='256'%20height='256'%20viewBox='0%200%2067.733332%2067.733333'%20version='1.1'%20id='svg1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3cdefs%20id='defs1'%20/%3e%3cg%20id='layer1'%3e%3cg%20style='fill:%23040000;fill-opacity:1'%20id='g1'%20transform='matrix(0.06566918,0,0,0.06566918,17.061212,17.059932)'%3e%3cg%20id='g2'%3e%3ccircle%20style='fill:%231ad35d;fill-opacity:1;stroke-width:0.472667'%20id='path2'%20cx='33.866665'%20cy='33.866665'%20r='21.644735'%20transform='matrix(23.824636,0,0,23.824636,-550.95013,-550.93064)'%20/%3e%3cpath%20d='M%20480.6,111.5%20H%20406.5%20V%2035.6%20c%200,-10.7%20-8.3,-19.6%20-19,-20.4%20-104,-7.5%20-200.4,-3.7%20-263,0.8%20-10.7,0.8%20-19,9.8%20-19,20.5%20v%2074.9%20H%2031.4%20c%20-10.9,0%20-20.9,8.8%20-20.6,22%2040.6,166%20230.9,361.7%20230.9,361.7%209.8,10.8%2025.6,4%2028.6,0%200,0%20177.1,-165.8%20230.3,-359.4%201.6,-5.8%20-0.5,-24.3%20-20,-24.2%20z'%20id='path1'%20style='fill:%23040000;fill-opacity:1'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",fa=te(""),dr=te(),ss=te(!1),Ws=te(!1),Ks=te("");function Ho(){function e(o){return t(o)||n(o)}function t(o){return!(o===""||o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")||o.includes("://open.spotify.com/show/")||o.includes("://open.spotify.com/artist/"))}function n(o){return o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")}function s(o){console.log("Searching for:",o),dr.value=[],ss.value=!0,fa.value=o,Ws.value=!1,Ks.value="",ve.search(o).then(r=>{console.log("Received Search Data:",r.data),r.status===200?(dr.value=r.data,ss.value=!1):(console.error("Error Searching:",r),ss.value=!1,Ws.value=!0,Ks.value=r.toString())}).catch(r=>{console.error("Other Error Searching:",r.message),ss.value=!1,Ws.value=!0,Ks.value=r.message})}return{searchTerm:fa,isSearching:ss,results:dr,error:Ws,errorValue:Ks,searchFor:s,isValid:e,isValidSearch:t,isValidURL:n}}const nn={QUEUED:"In Queue",DOWNLOADING:"Downloading...",DOWNLOADED:"Done",ERROR:"Error"},Ke=te([]);class Su{constructor(t){this.song=t,this.web_status=nn.QUEUED,this.progress=0,this.message="",this.web_download_url=null,this.filename=null}setDownloading(){this.web_status=nn.DOWNLOADING}setDownloaded(){this.web_status=nn.DOWNLOADED}setError(){this.web_status=nn.ERROR}resetForRetry(){this.web_status=nn.QUEUED,this.progress=0,this.message="",this.web_download_url=null,this.filename=null}setWebURL(t){this.web_download_url=t}setFilename(t){this.filename=t}isQueued(){return this.song.song_id!==void 0}isDownloading(){return this.web_status===nn.DOWNLOADING}isDownloaded(){return this.web_status===nn.DOWNLOADED}isErrored(){return this.web_status===nn.ERROR}wsUpdate(t){this.progress=t.progress,this.message=t.message}}function Is(){function e(o){return Ke.value.findIndex(r=>r.song.song_id===o.song_id)}function t(o){let r=new Su(o);Ke.value.push(r)}function n(o){console.log("removing",o,o.song_id),Ke.value=Ke.value.filter(r=>r.song.song_id!==o.song_id),console.log(Ke.value)}function s(o){return e(o)===-1?null:Ke.value[e(o)]}return{appendSong:t,removeSong:n,getBySong:s,downloadQueue:Ke}}const Fe=Is();ve.ws_onmessage(e=>{let t=JSON.parse(e.data),n=Fe.getBySong(t.song);!n&&(Fe.appendSong(t.song),n=Fe.getBySong(t.song),!n)||(t.status==="done"?(n.progress=100,t.filename&&(n.setWebURL(ve.downloadFileURL(t.filename)),n.setFilename(t.filename)),n.setDownloaded()):t.status==="error"?(n.wsUpdate(t),n.setError()):t.status==="queued"?n.message=t.message||"":(n.wsUpdate(t),n.isDownloading()||n.setDownloading()))});ve.ws_onerror(e=>{console.log("websocket error:",e)});async function xb(){try{const t=(await ve.getQueue()).data||[];for(const n of t){if(Ke.value.some(o=>o.song.song_id===n.song.song_id))continue;const s=new Su(n.song);n.status==="done"?(s.setDownloaded(),n.filename&&(s.setWebURL(ve.downloadFileURL(n.filename)),s.setFilename(n.filename)),s.progress=100):n.status==="error"?(s.setError(),s.message=n.message||""):(n.status==="downloading"&&(s.setDownloading(),s.progress=n.progress||0),s.message=n.message||""),Ke.value.push(s)}}catch(e){console.log("Failed to load queue from server:",e)}}xb();function wi(){const e=te(!1),t=uu();async function n(){Ke.value=Ke.value.filter(m=>!m.isDownloaded());try{await ve.clearCompletedQueue()}catch(m){console.log("Failed to clear completed queue on server:",m)}}function s(m){const b=(m||"").includes("://open.spotify.com/playlist/"),y=t.settings.value.generate_m3u!==!1;return e.value=!0,(b?n():Promise.resolve()).then(()=>ve.open(m)).then(h=>{if(console.log("Received Response:",h),h.status!==200){console.log("Error:",h);return}const k=h.data;if(Array.isArray(k)){for(const R of k)Fe.getBySong(R)||Fe.appendSong(R);return ve.downloadBatch({songs:k,playlist_url:b?m:"",generate_m3u:y}).catch(R=>{console.log("Batch submit failed:",R.message)})}else console.log("Opened Song:",k),r(k)}).catch(h=>{console.log("Other Error:",h.message)}).finally(()=>{e.value=!1})}function o(m){return console.log("Downloading",m),Fe.getBySong(m).setDownloading(),ve.download(m).then(b=>{if(console.log("Received Response:",b),b.status===200){let y=b.data;return console.log("Download Complete:",y),Fe.getBySong(m).setWebURL(ve.downloadFileURL(y)),Fe.getBySong(m).setFilename(y),Fe.getBySong(m).setDownloaded(),{song:m,filename:y}}else return console.log("Error:",b),Fe.getBySong(m).setError(),{song:m,filename:null}}).catch(b=>(console.log("Other Error:",b.message),Fe.getBySong(m).setError(),{song:m,filename:null}))}function r(m,b=!0){return Fe.appendSong(m),b?o(m):Promise.resolve({song:m,filename:null})}function i(m,b){const y={...m,youtube_id:b},v=Fe.getBySong(m);return v&&(v.song.youtube_id=b,v.setDownloading(),v.progress=0,v.message=""),ve.download(y).then(h=>{const k=Fe.getBySong(y);if(h.status===200){const R=h.data;return k&&(k.setWebURL(ve.downloadFileURL(R)),k.setFilename(R),k.setDownloaded()),{song:y,filename:R}}return k&&k.setError(),{song:y,filename:null}}).catch(h=>{console.error("retryWithAudio error:",h.message);const k=Fe.getBySong(y);return k&&k.setError(),{song:y,filename:null}})}function l(m){const b=String(m.song_id||m.url||"");Fe.removeSong(m),b&&ve.removeQueueItem(b).catch(()=>{})}async function a(){await ve.clearQueue(),Ke.value=[]}async function d(){await ve.clearCompletedQueue(),Ke.value=Ke.value.filter(m=>!m.isDownloaded())}function c(m){const b=Fe.getBySong(m);return b&&b.resetForRetry(),o(m)}function f(){const m=Ke.value.filter(b=>b.isErrored());for(const b of m)c(b.song);return m.length}return{fromURL:s,download:o,queue:r,retry:c,retryWithAudio:i,retryAllFailed:f,remove:l,clearAll:a,clearCompleted:d,loading:e}}const wb={class:"relative w-full"},kb=["placeholder"],Sb=["disabled"],Br={__name:"SearchInput",props:{compact:{type:Boolean,default:!1}},setup(e){const t=Ho(),n=wi(),{t:s,locale:o}=kt(),r=["https://open.spotify.com/track/4vfN00PlILRXy5dcXHQE9M","drugs - EDEN","Não Gosto Eu Amo - Henrique e Juliano","Perfect - Ed Sheeran","Lightning Crashes - Live"],i=te(0),l=be(()=>(o.value,i.value===0?s("search.placeholder"):r[i.value-1])),a=setInterval(()=>{i.value=(i.value+1)%(r.length+1)},5e3);oi(()=>clearInterval(a));function d(c){!c||!c.trim()||(t.isValidURL(c)?(n.fromURL(c),it.push({name:"Download"})):t.isValidSearch(c)&&it.push({name:"Search",params:{query:c}}))}return(c,f)=>(A(),T("div",wb,[Ee(p("input",{type:"text",placeholder:l.value,class:Ae(["input-modern",e.compact?"h-11 text-sm":"h-14 text-base"]),"onUpdate:modelValue":f[0]||(f[0]=m=>u(t).searchTerm.value=m),onKeyup:f[1]||(f[1]=np(m=>d(u(t).searchTerm.value),["enter"]))},null,42,kb),[[rt,u(t).searchTerm.value]]),p("button",{class:Ae(["absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm transition hover:scale-105 active:scale-95 disabled:opacity-60",e.compact?"h-9 w-9":"h-11 w-11"]),disabled:u(n).loading.value,onClick:f[2]||(f[2]=m=>d(u(t).searchTerm.value))},[u(n).loading.value?(A(),T("span",{key:0,class:Ae(["loading loading-spinner",e.compact?"loading-xs":"loading-sm"])},null,2)):u(t).isValidURL(u(t).searchTerm.value)?(A(),ct(u(G),{key:1,icon:"clarity:download-line",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},null,8,["class"])):(A(),T("svg",{key:2,xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"2",stroke:"currentColor",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},[...f[3]||(f[3]=[p("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"},null,-1)])],2))],10,Sb)]))}},Eb={class:"relative flex min-h-[calc(100dvh-4rem)] items-center justify-center px-6 pt-24 pb-16 overflow-hidden"},Ab={class:"relative w-full max-w-2xl text-center animate-slide-up"},Rb={class:"mt-3 flex items-center justify-center gap-2"},Cb={class:"badge-soft"},Tb={class:"badge-neutral-soft"},Pb={class:"mx-auto mt-5 max-w-md text-balance text-base sm:text-lg text-base-content/70"},Ob={class:"mt-10"},Db={class:"mt-4 flex flex-wrap items-center justify-center gap-2 text-xs text-base-content/60"},Nb={class:"pill bg-white/5 border border-white/10"},Ib={class:"pill bg-white/5 border border-white/10"},$b={class:"pill bg-white/5 border border-white/10"},Lb={__name:"Hero",setup(e){const{t}=kt(),n=te(localStorage.getItem("version")||"2.7.0");return Xt(()=>{const s=localStorage.getItem("version");s&&(n.value=s)}),(s,o)=>(A(),T("section",Eb,[o[4]||(o[4]=p("div",{"aria-hidden":"true",class:"pointer-events-none absolute inset-0 -z-10"},[p("div",{class:"absolute left-1/2 top-1/4 -translate-x-1/2 h-[420px] w-[420px] rounded-full bg-primary/25 blur-[120px]"}),p("div",{class:"absolute right-10 bottom-12 h-64 w-64 rounded-full bg-primary/10 blur-3xl"})],-1)),p("div",Ab,[o[3]||(o[3]=mf('

    Downtify

    ',2)),p("div",Rb,[p("span",Cb,"v"+w(n.value),1),p("span",Tb,w(u(t)("hero.noAccount")),1)]),p("p",Pb,w(u(t)("hero.tagline")),1),p("div",Ob,[M(Br,{class:"w-full"}),p("div",Db,[p("span",Nb,[o[0]||(o[0]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.songs")),1)]),p("span",Ib,[o[1]||(o[1]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.albums")),1)]),p("span",$b,[o[2]||(o[2]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.playlists")),1)])])])])]))}},Fb={class:"absolute top-0 inset-x-0 z-30"},Mb={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Ub={class:"ml-auto flex items-center gap-1 sm:gap-2"},Bb=["title"],Hb=["title"],jb=["title"],qb=["title"],Vb={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},Wb=["title"],Kb=["title"],zb={__name:"NavbarFront",setup(e){const t=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),n=Is(),{t:s}=kt();return(o,r)=>(A(),T("header",Fb,[p("div",Mb,[r[5]||(r[5]=p("div",{class:"flex items-center gap-2"},[p("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"}),p("span",{class:"text-lg font-bold tracking-tight"},"Downtify")],-1)),p("div",Ub,[p("button",{class:"icon-btn",onClick:r[0]||(r[0]=i=>u(it).push({name:"List"})),title:u(s)("nav.library")},[M(u(G),{icon:"clarity:library-line",class:"h-5 w-5"})],8,Bb),p("button",{class:"icon-btn",onClick:r[1]||(r[1]=i=>u(it).push({name:"Player"})),title:u(s)("nav.player")},[M(u(G),{icon:"clarity:headphones-line",class:"h-5 w-5"})],8,Hb),p("button",{class:"icon-btn",onClick:r[2]||(r[2]=i=>u(it).push({name:"Monitor"})),title:u(s)("nav.monitor")},[M(u(G),{icon:"clarity:eye-line",class:"h-5 w-5"})],8,jb),p("button",{class:"icon-btn relative",onClick:r[3]||(r[3]=i=>u(it).push({name:"Download"})),title:u(s)("nav.queue")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"}),u(n).downloadQueue.value.length>0?(A(),T("span",Vb,w(u(n).downloadQueue.value.length),1)):ie("",!0)],8,qb),p("button",{class:"icon-btn",onClick:r[4]||(r[4]=i=>u(t).setTheme(u(t).currentTheme.value==="dark"?"light":"dark")),title:u(t).currentTheme.value==="dark"?u(s)("nav.switchToLight"):u(s)("nav.switchToDark")},[u(t).currentTheme.value==="dark"?(A(),ct(u(G),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(G),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,Wb),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(s)("nav.settings")},[M(u(G),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,Kb)])])]))}},Eu=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Qb={components:{NavbarFront:zb,Hero:Lb},setup(){return Xt(()=>{window.scroll(0,0)}),{}}};function Gb(e,t,n,s,o,r){const i=xr("NavbarFront"),l=xr("Hero");return A(),T("div",null,[M(i),M(l)])}const Jb=Eu(Qb,[["render",Gb]]),Yb={class:"sticky top-0 z-30 glass-nav"},Xb={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Zb=["title"],e_={class:"hidden md:flex flex-1 justify-center"},t_={class:"ml-auto flex items-center gap-1 sm:gap-2"},n_=["title"],s_=["title"],o_=["title"],r_=["title"],i_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},l_=["title"],a_=["title"],c_={class:"md:hidden px-4 pb-3"},$s={__name:"Navbar",setup(e){const t=ku(),n=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),s=Is(),o=Ho(),{t:r}=kt();return(i,l)=>(A(),T("header",Yb,[p("div",Xb,[p("button",{class:"flex items-center gap-2 shrink-0",onClick:l[0]||(l[0]=a=>u(it).push({name:"Home"})),title:u(r)("nav.home")},[...l[6]||(l[6]=[p("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"},null,-1),p("span",{class:"hidden sm:inline text-lg font-bold tracking-tight"}," Downtify ",-1)])],8,Zb),p("div",e_,[M(Br,{class:"w-full max-w-md",compact:!0})]),p("div",t_,[p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="List"}]),onClick:l[1]||(l[1]=a=>u(it).push({name:"List"})),title:u(r)("nav.library")},[M(u(G),{icon:"clarity:library-line",class:"h-5 w-5"})],10,n_),p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Player"}]),onClick:l[2]||(l[2]=a=>u(it).push({name:"Player"})),title:u(r)("nav.player")},[M(u(G),{icon:"clarity:headphones-line",class:"h-5 w-5"})],10,s_),p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Monitor"}]),onClick:l[3]||(l[3]=a=>u(it).push({name:"Monitor"})),title:u(r)("nav.monitor")},[M(u(G),{icon:"clarity:eye-line",class:"h-5 w-5"})],10,o_),p("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(t).name==="Download"}]),onClick:l[4]||(l[4]=a=>u(t).name==="Download"?u(it).push({name:"Search",params:{query:u(o).searchTerm.value||" "}}):u(it).push({name:"Download"})),title:u(r)("nav.queue")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"}),u(s).downloadQueue.value.length>0?(A(),T("span",i_,w(u(s).downloadQueue.value.length),1)):ie("",!0)],10,r_),p("button",{class:"icon-btn",onClick:l[5]||(l[5]=a=>u(n).setTheme(u(n).currentTheme.value==="dark"?"light":"dark")),title:u(n).currentTheme.value==="dark"?u(r)("nav.switchToLight"):u(r)("nav.switchToDark")},[u(n).currentTheme.value==="dark"?(A(),ct(u(G),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(G),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,l_),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(r)("nav.settings")},[M(u(G),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,a_)])]),p("div",c_,[M(Br,{compact:!0})])]))}},u_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},d_={class:"mb-8"},f_={class:"text-2xl font-bold tracking-tight"},p_={class:"mt-1 text-sm text-base-content/60"},h_={class:"text-base-content/90 font-medium"},m_={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},g_={key:1,class:"space-y-3"},y_={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},v_={class:"text-base-content/50 text-sm"},b_={class:"text-base-content/40 text-xs mt-1"},__={key:3,class:"space-y-2"},x_={class:"track-cover"},w_=["src","alt"],k_={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},S_={class:"flex-1 min-w-0"},E_={class:"flex items-center gap-2 mb-0.5"},A_={class:"font-semibold truncate"},R_={key:0,class:"badge-error-soft shrink-0"},C_={class:"text-xs text-base-content/70 truncate"},T_={key:0,class:"text-xs text-base-content/40 truncate"},P_={key:0,class:"text-base-content/30"},O_={class:"flex items-center gap-1 shrink-0"},D_=["href","title"],N_=["title"],I_=["onClick","title"],$_={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},L_=["disabled","title"],F_=["onClick"],M_=["disabled","title"],fr=5,U_={__name:"SearchList",props:["data","error"],emits:["download"],setup(e,{emit:t}){const n=e,s=t,o=Ho(),r=Is(),{t:i}=kt(),l=te(1),a=be(()=>{var b;return Math.ceil((((b=n.data)==null?void 0:b.length)||0)/fr)}),d=be(()=>{if(!n.data)return[];const b=(l.value-1)*fr;return n.data.slice(b,b+fr)});Ft(()=>n.data,()=>{l.value=1});function c(b){return Array.isArray(b.artists)&&b.artists.length?b.artists.join(", "):b.artist||i("common.unknownArtist")}function f(b){const y=r.getBySong(b);return y?y.isErrored()?"error":(y.isDownloaded(),"queued"):"idle"}function m(b){s("download",b)}return(b,y)=>{var v;return A(),T("div",u_,[p("div",d_,[p("h1",f_,w(u(i)("search.title")),1),p("p",p_,[u(o).searchTerm.value?(A(),T(de,{key:0},[Re(w(u(i)("search.matchesFor"))+" ",1),p("span",h_,' "'+w(u(o).searchTerm.value)+'" ',1),!u(o).isSearching.value&&(((v=n.data)==null?void 0:v.length)||0)>0?(A(),T(de,{key:0},[Re(w(n.data.length===1?u(i)("search.songsCount",{count:n.data.length}):u(i)("search.songsCountPlural",{count:n.data.length})),1)],64)):ie("",!0)],64)):(A(),T(de,{key:1},[Re(w(u(i)("search.typeToBegin")),1)],64))])]),n.error?(A(),T("div",m_,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),p("span",null,w(u(o).errorValue.value?u(i)("search.errorWithDetail",{detail:u(o).errorValue.value}):u(i)("search.error")),1)])):ie("",!0),u(o).isSearching.value?(A(),T("div",g_,[(A(),T(de,null,Ie(5,h=>p("div",{key:h,class:"skeleton h-24 rounded-2xl"})),64))])):!n.data||n.data.length===0?(A(),T("div",y_,[M(u(G),{icon:"clarity:search-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",v_,w(u(i)("search.empty")),1),p("p",b_,w(u(i)("search.emptyHint")),1)])):(A(),T("ul",__,[(A(!0),T(de,null,Ie(d.value,(h,k)=>(A(),T("li",{key:h.song_id||k,class:"surface rounded-2xl track-card"},[p("div",x_,[h.cover_url?(A(),T("img",{key:0,src:h.cover_url,alt:h.name,class:"h-full w-full object-cover",loading:"lazy"},null,8,w_)):(A(),T("div",k_,[M(u(G),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),p("div",S_,[p("div",E_,[p("span",A_,w(h.name),1),h.explicit?(A(),T("span",R_,"E")):ie("",!0)]),p("p",C_,w(c(h)),1),h.album_name?(A(),T("p",T_,[Re(w(h.album_name)+" ",1),h.year?(A(),T("span",P_," · "+w(h.year),1)):ie("",!0)])):ie("",!0)]),p("div",O_,[h.url?(A(),T("a",{key:0,class:"icon-btn",href:h.url,target:"_blank",rel:"noopener",title:u(i)("search.openOnSpotify")},[M(u(G),{icon:"clarity:pop-out-line",class:"h-4 w-4"})],8,D_)):ie("",!0),f(h)==="queued"?(A(),T("button",{key:1,class:"icon-btn text-primary cursor-default",title:u(i)("search.inQueue"),disabled:""},[M(u(G),{icon:"clarity:check-circle-line",class:"h-5 w-5"})],8,N_)):(A(),T("button",{key:2,class:"icon-btn text-primary hover:bg-primary/10",onClick:R=>m(h),title:u(i)("search.download")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"})],8,I_))])]))),128))])),a.value>1?(A(),T("nav",$_,[p("button",{class:"icon-btn",disabled:l.value===1,onClick:y[0]||(y[0]=h=>l.value--),title:u(i)("search.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,L_),(A(!0),T(de,null,Ie(a.value,h=>(A(),T("button",{key:h,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",h===l.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:k=>l.value=h},w(h),11,F_))),128)),p("button",{class:"icon-btn",disabled:l.value===a.value,onClick:y[1]||(y[1]=h=>l.value++),title:u(i)("search.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,M_)])):ie("",!0)])}}},B_={class:"min-h-screen"},H_={__name:"Search",setup(e){Xt(()=>window.scroll(0,0));const t=ku(),n=Ho(),s=wi();return Ft(()=>t.params.query,()=>{t.params.query&&n.searchFor(t.params.query)},{deep:!0}),n.searchFor(t.params.query),(o,r)=>(A(),T("div",B_,[M($s),M(zn),M(U_,{data:u(n).results.value,error:u(n).error.value,onDownload:r[0]||(r[0]=i=>u(s).queue(i))},null,8,["data","error"])]))}},j_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},q_={class:"mb-6 flex flex-wrap items-end justify-between gap-4"},V_={class:"text-2xl font-bold tracking-tight"},W_={class:"mt-1 text-sm text-base-content/60"},K_={key:0,class:"flex flex-wrap gap-2 justify-end"},z_=["title"],Q_={key:0,class:"mb-6 flex flex-wrap gap-2",role:"tablist"},G_=["onClick"],J_={key:0,class:"ml-1 opacity-80 tabular-nums"},Y_={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},X_={class:"text-base-content/50 text-sm"},Z_={class:"text-base-content/40 text-xs mt-1"},e0={key:2,class:"surface rounded-2xl p-8 text-center text-sm text-base-content/50"},t0={key:3,class:"space-y-3"},n0={class:"flex items-center gap-4"},s0={class:"track-cover h-16 w-16 sm:h-20 sm:w-20 shrink-0"},o0=["src","alt"],r0={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},i0={class:"flex-1 min-w-0"},l0={class:"flex items-center gap-2 mb-0.5 flex-wrap"},a0={class:"font-semibold truncate"},c0={class:"text-xs text-base-content/60 truncate"},u0={key:0,class:"text-xs text-base-content/40 truncate"},d0={key:1,class:"text-xs text-error/80 mt-1 line-clamp-2"},f0={class:"flex items-center gap-2 shrink-0"},p0=["title","onClick"],h0=["onClick","title"],m0={class:"text-[10px] font-semibold"},g0={key:3,class:"loading loading-spinner loading-sm text-primary"},y0=["onClick","title"],v0={key:0,class:"mt-3 pt-3 border-t border-white/10 flex flex-wrap gap-2 items-center"},b0=["onUpdate:modelValue","placeholder"],_0=["onClick"],x0=["onClick"],w0=["onClick"],k0={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},S0=["disabled","title"],E0=["onClick"],A0=["disabled","title"],pr=10,R0={__name:"DownloadList",setup(e){const t=Is(),n=wi(),{t:s}=kt(),o=te("active"),r=te(1),i=Ln({}),l=Ln({});function a(I){return I.isErrored()?"failed":I.isDownloaded()?"done":I.isDownloading()?"downloading":"queued"}const d=be(()=>t.downloadQueue.value.filter(I=>a(I)==="done").length),c=be(()=>t.downloadQueue.value.filter(I=>a(I)==="failed").length),f=be(()=>t.downloadQueue.value.filter(I=>{const W=a(I);return W==="queued"||W==="downloading"}).length),m=be(()=>[{id:"active",label:s("queue.filterActive"),count:f.value},{id:"all",label:s("queue.filterAll"),count:t.downloadQueue.value.length},{id:"downloading",label:s("queue.filterDownloading"),count:t.downloadQueue.value.filter(I=>a(I)==="downloading").length},{id:"queued",label:s("queue.filterQueued"),count:t.downloadQueue.value.filter(I=>a(I)==="queued").length},{id:"done",label:s("queue.filterDone"),count:d.value},{id:"failed",label:s("queue.filterFailed"),count:c.value}]),b=be(()=>{const I=t.downloadQueue.value;switch(o.value){case"all":return I;case"active":return I.filter(W=>{const B=a(W);return B==="queued"||B==="downloading"});case"downloading":return I.filter(W=>a(W)==="downloading");case"queued":return I.filter(W=>a(W)==="queued");case"done":return I.filter(W=>a(W)==="done");case"failed":return I.filter(W=>a(W)==="failed");default:return I}}),y=be(()=>Math.ceil(b.value.length/pr)),v=be(()=>{const I=(r.value-1)*pr;return b.value.slice(I,I+pr)});Ft(o,()=>{r.value=1}),Ft(()=>b.value.length,()=>{r.value>y.value&&y.value>0&&(r.value=y.value),r.value<1&&(r.value=1)}),Ft(()=>t.downloadQueue.value.length,I=>{I===0?o.value="active":o.value==="active"&&f.value===0&&c.value>0&&(o.value="failed")});async function h(){confirm(s("queue.clearAllPrompt"))&&await n.clearAll()}async function k(){await n.clearCompleted()}function R(){n.retryAllFailed()}function S(I){return Array.isArray(I.artists)&&I.artists.length?I.artists.join(", "):I.artist||s("common.unknownArtist")}function C(I){return I.isErrored()?"badge-error-soft":I.isDownloaded()||I.isDownloading()?"badge-soft":"badge-neutral-soft"}function L(I){return I.message?I.message:I.isErrored()?s("queue.statusFailed"):I.isDownloaded()?s("queue.statusDone"):I.isDownloading()?s("queue.statusDownloading"):s("queue.statusQueued")}function P(I){const W=String(I||"").match(/(?:v=|youtu\.be\/)([A-Za-z0-9_-]{6,})/);return W?W[1]:null}function U(I){const W=I.song.song_id,B=P(l[W]);if(!B){alert(s("queue.invalidYouTubeURL"));return}i[W]=!1,n.retryWithAudio(I.song,B)}function ae(I){const W=document.createElement("a");W.href=I,W.download=ve.downloadSaveName(I),document.body.appendChild(W),W.click(),document.body.removeChild(W)}return(I,W)=>(A(),T("div",j_,[p("div",q_,[p("div",null,[p("h1",V_,w(u(s)("queue.title")),1),p("p",W_,w(u(s)("queue.subtitle")),1)]),u(t).downloadQueue.value.length>0?(A(),T("div",K_,[c.value>0?(A(),T("button",{key:0,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:R},[M(u(G),{icon:"clarity:refresh-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(s)("queue.retryAllFailed",{count:c.value})),1)])):ie("",!0),d.value>0?(A(),T("button",{key:1,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:k},w(u(s)("queue.clearCompleted",{count:d.value})),1)):ie("",!0),p("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 text-error/70 hover:text-error",onClick:h,title:u(s)("queue.clearAll")},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(s)("queue.clearAll")),1)],8,z_)])):ie("",!0)]),u(t).downloadQueue.value.length>0?(A(),T("div",Q_,[(A(!0),T(de,null,Ie(m.value,B=>(A(),T("button",{key:B.id,type:"button",class:Ae(["btn btn-sm rounded-full border-white/10",o.value===B.id?"btn-primary":"bg-base-100/85 hover:bg-base-100"]),onClick:q=>o.value=B.id},[Re(w(B.label)+" ",1),B.count>0?(A(),T("span",J_,"("+w(B.count)+")",1)):ie("",!0)],10,G_))),128))])):ie("",!0),u(t).downloadQueue.value.length===0?(A(),T("div",Y_,[M(u(G),{icon:"clarity:download-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",X_,w(u(s)("queue.empty")),1),p("p",Z_,w(u(s)("queue.emptyHint")),1)])):b.value.length===0?(A(),T("div",e0,w(u(s)("queue.emptyFilter")),1)):(A(),T("ul",t0,[(A(!0),T(de,null,Ie(v.value,(B,q)=>(A(),T("li",{key:B.song.song_id||B.song.url||q,class:"surface rounded-2xl p-3 sm:p-4"},[p("div",n0,[p("div",s0,[B.song.cover_url?(A(),T("img",{key:0,src:B.song.cover_url,alt:B.song.name,class:"h-full w-full object-cover"},null,8,o0)):(A(),T("div",r0,[M(u(G),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),p("div",i0,[p("div",l0,[p("span",a0,w(B.song.name),1),p("span",{class:Ae([C(B),"shrink-0"])},w(L(B)),3)]),p("p",c0,w(S(B.song)),1),B.song.album_name?(A(),T("p",u0,w(B.song.album_name),1)):ie("",!0),B.isErrored()&&B.message?(A(),T("p",d0,w(B.message),1)):ie("",!0)]),p("div",f0,[B.isErrored()?(A(),T("button",{key:0,class:"icon-btn text-primary hover:bg-primary/10",title:u(s)("queue.retry"),onClick:se=>u(n).retry(B.song)},[M(u(G),{icon:"clarity:refresh-line",class:"h-4 w-4"})],8,p0)):ie("",!0),B.isDownloaded()?(A(),T("a",{key:1,class:"icon-btn text-primary hover:bg-primary/10",href:"javascript:;",onClick:se=>ae(B.web_download_url),title:u(s)("queue.saveToDevice")},[M(u(G),{icon:"clarity:download-line",class:"h-4 w-4"})],8,h0)):B.isDownloading()&&!B.isErrored()?(A(),T("div",{key:2,class:"radial-progress text-primary",style:$n(`--value:${Math.max(0,B.progress)}; --size:2.75rem; --thickness:3px`)},[p("span",m0,w(Math.round(B.progress))+"% ",1)],4)):B.isErrored()?ie("",!0):(A(),T("span",g0)),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",onClick:se=>u(n).remove(B.song),title:u(s)("queue.removeFromQueue")},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,y0)])]),B.isErrored()&&i[B.song.song_id]?(A(),T("div",v0,[Ee(p("input",{"onUpdate:modelValue":se=>l[B.song.song_id]=se,type:"text",class:"input input-sm flex-1 min-w-[12rem] rounded-xl bg-base-100/80",placeholder:u(s)("queue.overridePlaceholder")},null,8,b0),[[rt,l[B.song.song_id]]]),p("button",{class:"btn btn-sm btn-primary rounded-full",onClick:se=>U(B)},w(u(s)("queue.applyOverride")),9,_0),p("button",{class:"btn btn-sm btn-ghost rounded-full",onClick:se=>i[B.song.song_id]=!1},w(u(s)("common.cancel")),9,x0)])):B.isErrored()?(A(),T("button",{key:1,type:"button",class:"mt-2 text-xs text-primary/80 hover:text-primary",onClick:se=>i[B.song.song_id]=!0},w(u(s)("queue.forceAudio")),9,w0)):ie("",!0)]))),128))])),y.value>1?(A(),T("nav",k0,[p("button",{class:"icon-btn",disabled:r.value===1,onClick:W[0]||(W[0]=B=>r.value--),title:u(s)("common.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,S0),(A(!0),T(de,null,Ie(y.value,B=>(A(),T("button",{key:B,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",B===r.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:q=>r.value=B},w(B),11,E0))),128)),p("button",{class:"icon-btn",disabled:r.value===y.value,onClick:W[1]||(W[1]=B=>r.value++),title:u(s)("common.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,A0)])):ie("",!0)]))}},C0={class:"min-h-screen"},T0={__name:"Download",setup(e){return Xt(()=>window.scroll(0,0)),(t,n)=>(A(),T("div",C0,[M($s),M(zn),M(R0)]))}},Au="downtify-player-volume",qe=te([]),st=te(-1),vo=te(!1),Ls=te(0),un=te(0),ki=te(parseFloat(localStorage.getItem(Au)||"0.85")),In=te(!1),Qn=te("off"),dn=te(!1);let _e=null,yt=[],jo=0;function qo(){return _e||(_e=new Audio,_e.preload="metadata",_e.volume=ki.value,_e.addEventListener("timeupdate",()=>{Ls.value=_e.currentTime}),_e.addEventListener("loadedmetadata",()=>{un.value=isFinite(_e.duration)?_e.duration:0}),_e.addEventListener("durationchange",()=>{un.value=isFinite(_e.duration)?_e.duration:0}),_e.addEventListener("ended",M0),_e.addEventListener("play",()=>{vo.value=!0}),_e.addEventListener("pause",()=>{vo.value=!1}),_e)}function Hr(e){const t=e.replace(/\.[^.]+$/,"");let n="",s=t;const o=t.indexOf(" - ");return o>0&&(n=t.slice(0,o).trim(),s=t.slice(o+3).trim()),{file:e,url:ve.downloadFileURL(e),cover:ve.coverFileURL(e),title:s,artist:n,album:""}}function Si(e){if(typeof e=="string")return Hr(e);const t=String((e==null?void 0:e.file)||""),n=Hr(t),s=String((e==null?void 0:e.title)||"").trim(),o=String((e==null?void 0:e.artist)||"").trim(),r=String((e==null?void 0:e.album)||"").trim();return{file:t,url:n.url,cover:n.cover,title:s||n.title,artist:o||n.artist,album:r||n.album}}function Fs(){const e=qe.value.map((t,n)=>n);for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}yt=e,jo=st.value>=0?Math.max(0,yt.indexOf(st.value)):0}function P0(e,t={}){const n=(e||[]).map(s=>typeof s=="string"?Hr(s):Si(s));qe.value=n,st.value>=n.length&&(st.value=-1),dn.value&&Fs(),typeof t.startIndex=="number"?qn(t.startIndex):t.autoplay&&n.length>0&&st.value<0&&qn(0)}function qn(e){if(e<0||e>=qe.value.length)return;const t=qo();if(st.value=e,dn.value){yt.length!==qe.value.length&&Fs();const n=yt.indexOf(e);n>=0&&(jo=n)}t.src=qe.value[e].url,t.currentTime=0,Ls.value=0,t.play().catch(()=>{})}function Ru(){if(qe.value.length===0)return;const e=qo();if(st.value<0){qn(0);return}e.src||(e.src=qe.value[st.value].url),e.play().catch(()=>{})}function Ei(){_e&&_e.pause()}function O0(){vo.value?Ei():Ru()}function Vo(e){const t=qo(),n=un.value||0,s=Math.max(0,Math.min(n,e));t.currentTime=s,Ls.value=s}function D0(e){un.value&&Vo(un.value*Math.max(0,Math.min(1,e)))}function N0(e){const t=Math.max(0,Math.min(1,e));ki.value=t,_e&&(_e.volume=t);try{localStorage.setItem(Au,String(t))}catch{}t>0&&In.value&&(In.value=!1,_e&&(_e.muted=!1))}function I0(){In.value=!In.value,_e&&(_e.muted=In.value)}function $0(){if(qe.value.length===0)return-1;if(dn.value){yt.length!==qe.value.length&&Fs();const t=(jo+1)%yt.length;return yt[t]}const e=st.value+1;return e>=qe.value.length?Qn.value==="all"?0:-1:e}function L0(){if(qe.value.length===0)return-1;if(dn.value){yt.length!==qe.value.length&&Fs();const t=(jo-1+yt.length)%yt.length;return yt[t]}const e=st.value-1;return e<0?Qn.value==="all"?qe.value.length-1:0:e}function Cu(){const e=$0();if(e<0){Ei();return}qn(e)}function F0(){if(qo().currentTime>3){Vo(0);return}const t=L0();t<0||qn(t)}function M0(){if(Qn.value==="one"){Vo(0),_e&&_e.play().catch(()=>{});return}Cu()}function Tu(e){["off","all","one"].includes(e)&&(Qn.value=e)}function U0(){const e=["off","all","one"],t=e.indexOf(Qn.value);Tu(e[(t+1)%e.length])}function Pu(e){dn.value=!!e,dn.value&&Fs()}function B0(){Pu(!dn.value)}const H0=be(()=>st.value>=0&&st.valueun.value>0?Ls.value/un.value*100:0);function pa(e){if(!isFinite(e)||e<0)return"0:00";const t=Math.floor(e),n=Math.floor(t/60),s=t%60;return`${n}:${s.toString().padStart(2,"0")}`}function Ou(){return{playlist:qe,currentIndex:st,currentTrack:H0,isPlaying:vo,currentTime:Ls,duration:un,progressPct:j0,volume:ki,isMuted:In,repeatMode:Qn,shuffle:dn,setPlaylist:P0,playAt:qn,play:Ru,pause:Ei,toggle:O0,seek:Vo,seekRatio:D0,setVolume:N0,toggleMute:I0,next:Cu,prev:F0,setRepeat:Tu,cycleRepeat:U0,setShuffle:Pu,toggleShuffle:B0}}const q0={class:"min-h-screen"},V0={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},W0={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},K0={class:"text-2xl font-bold tracking-tight"},z0={class:"mt-1 text-sm text-base-content/60"},Q0={class:"flex items-center gap-2"},G0=["title"],J0=["disabled"],Y0={key:0,class:"loading loading-spinner loading-xs mr-2"},X0={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},Z0={key:1,class:"space-y-3"},ex={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},tx={class:"text-base-content/50 text-sm"},nx={class:"text-base-content/40 text-xs mt-1"},sx={key:3,class:"space-y-2"},ox={class:"relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden"},rx=["src","alt","onError"],ix={class:"flex-1 min-w-0"},lx={class:"text-sm font-medium truncate block"},ax={key:0,class:"text-xs text-base-content/60 truncate"},cx={class:"text-xs text-base-content/40"},ux={key:0,class:"mr-2 text-primary/70"},dx={class:"flex items-center gap-1 shrink-0"},fx=["onClick","title"],px=["href","download","title"],hx=["disabled","onClick","title"],mx={key:0,class:"loading loading-spinner loading-xs"},gx={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},yx=["disabled","title"],vx=["onClick"],bx=["disabled","title"],_x={key:5,class:"mt-6 text-xs text-base-content/40 text-center"},hr=10,xx={__name:"Downloads",setup(e){const{t}=kt(),n=Ou(),s=_b(),o=te([]),r=te(!1),i=te(""),l=te({}),a=te({}),d=te(1),c=be(()=>Math.ceil(o.value.length/hr)),f=be(()=>{const C=(d.value-1)*hr;return o.value.slice(C,C+hr)});Ft(o,()=>{d.value=1});function m(C){return ve.coverFileURL(C)}function b(C){a.value={...a.value,[C]:!0}}async function y(){r.value=!0,i.value="";try{const C=await ve.listDownloads();o.value=(C.data||[]).map(Si)}catch{i.value=t("library.failedLoad")}finally{r.value=!1}}async function v(C){if(confirm(t("library.deletePrompt",{file:C}))){l.value={...l.value,[C]:!0};try{await ve.deleteDownload(C),o.value=o.value.filter(L=>L!==C)}catch{i.value=t("library.failedDelete",{file:C})}finally{l.value={...l.value,[C]:!1}}}}function h(C){const L=C.lastIndexOf(".");return L>0?C.slice(L+1).toUpperCase():""}function k(C){const L=C.lastIndexOf("/");return L>=0?C.slice(0,L):""}function R(C){const L=o.value.findIndex(P=>P.file===C.file);L<0||(n.setPlaylist(o.value,{startIndex:L}),s.push({name:"Player"}))}function S(){o.value.length&&(n.setPlaylist(o.value,{startIndex:0}),s.push({name:"Player"}))}return Xt(y),(C,L)=>(A(),T("div",q0,[M($s),M(zn),p("div",V0,[p("div",W0,[p("div",null,[p("h1",K0,w(u(t)("library.title")),1),p("p",z0,w(u(t)("library.subtitle")),1)]),p("div",Q0,[o.value.length>0?(A(),T("button",{key:0,class:"btn btn-primary btn-sm h-11 px-5 rounded-full",onClick:S,title:u(t)("library.play")},[M(u(G),{icon:"clarity:play-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(t)("library.play")),1)],8,G0)):ie("",!0),p("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:y,disabled:r.value},[r.value?(A(),T("span",Y0)):(A(),ct(u(G),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4 mr-2"})),Re(" "+w(u(t)("common.refresh")),1)],8,J0)])]),i.value?(A(),T("div",X0,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),p("span",null,w(i.value),1)])):ie("",!0),r.value&&o.value.length===0?(A(),T("div",Z0,[(A(),T(de,null,Ie(4,P=>p("div",{key:P,class:"skeleton h-16 rounded-2xl"})),64))])):o.value.length===0?(A(),T("div",ex,[M(u(G),{icon:"clarity:library-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",tx,w(u(t)("library.empty")),1),p("p",nx,w(u(t)("library.emptyHint")),1)])):(A(),T("ul",sx,[(A(!0),T(de,null,Ie(f.value,P=>(A(),T("li",{key:P.file,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-3"},[p("div",ox,[a.value[P.file]?(A(),ct(u(G),{key:1,icon:"clarity:music-note-line",class:"h-5 w-5"})):(A(),T("img",{key:0,src:m(P.file),alt:P.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:U=>b(P.file)},null,40,rx))]),p("div",ix,[p("span",lx,w(P.title),1),P.artist?(A(),T("p",ax,w(P.artist),1)):ie("",!0),p("span",cx,[k(P.file)?(A(),T("span",ux,[M(u(G),{icon:"clarity:folder-line",class:"inline h-3 w-3 mr-0.5 align-text-top"}),Re(w(k(P.file)),1)])):ie("",!0),Re(" "+w(h(P.file)),1)])]),p("div",dx,[p("button",{class:"icon-btn text-primary hover:bg-primary/10",onClick:U=>R(P),title:u(t)("library.play")},[M(u(G),{icon:"clarity:play-line",class:"h-4 w-4"})],8,fx),p("a",{class:"icon-btn",href:u(ve).downloadFileURL(P.file),download:u(ve).downloadSaveName(P.file),title:u(t)("library.downloadToDevice")},[M(u(G),{icon:"clarity:download-line",class:"h-4 w-4"})],8,px),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",disabled:l.value[P.file]===!0,onClick:U=>v(P.file),title:u(t)("library.deleteFile")},[l.value[P.file]===!0?(A(),T("span",mx)):(A(),ct(u(G),{key:1,icon:"clarity:trash-line",class:"h-4 w-4"}))],8,hx)])]))),128))])),c.value>1?(A(),T("nav",gx,[p("button",{class:"icon-btn",disabled:d.value===1,onClick:L[0]||(L[0]=P=>d.value--),title:u(t)("common.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,yx),(A(!0),T(de,null,Ie(c.value,P=>(A(),T("button",{key:P,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",P===d.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:U=>d.value=P},w(P),11,vx))),128)),p("button",{class:"icon-btn",disabled:d.value===c.value,onClick:L[1]||(L[1]=P=>d.value++),title:u(t)("common.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,bx)])):ie("",!0),o.value.length>0?(A(),T("p",_x,w(o.value.length===1?u(t)("library.countOne",{count:o.value.length}):u(t)("library.countMany",{count:o.value.length})),1)):ie("",!0)])]))}},Ms=Pe.create({baseURL:`${Ge.PROTOCOL}//${Ge.BACKEND}:${Ge.PORT}${Ge.BASEURL}`});function wx(){return Ms.get("/api/monitor/playlists")}function kx(e,t=60){return Ms.post("/api/monitor/playlists",{url:e,interval_minutes:t})}function Sx(e,t){return Ms.patch(`/api/monitor/playlists/${e}`,t)}function Ex(e){return Ms.delete(`/api/monitor/playlists/${e}`)}function Ax(e){return Ms.post(`/api/monitor/playlists/${e}/check`)}const yn={listMonitoredPlaylists:wx,addMonitoredPlaylist:kx,updateMonitoredPlaylist:Sx,deleteMonitoredPlaylist:Ex,checkMonitoredPlaylist:Ax},Rx={class:"min-h-screen"},Cx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},Tx={class:"mb-8"},Px={class:"text-2xl font-bold tracking-tight"},Ox={class:"mt-1 text-sm text-base-content/60"},Dx={class:"surface rounded-2xl p-5 mb-8"},Nx={class:"text-sm font-semibold uppercase tracking-wider text-base-content/50 mb-4"},Ix=["placeholder","disabled"],$x={class:"flex items-center gap-2 shrink-0"},Lx=["disabled"],Fx={value:15},Mx={value:30},Ux={value:60},Bx={value:180},Hx={value:360},jx={value:720},qx={value:1440},Vx={value:10080},Wx={value:20160},Kx={value:43200},zx=["disabled"],Qx={key:0,class:"loading loading-spinner loading-xs"},Gx={key:1},Jx={key:0,class:"mt-2 text-xs text-error"},Yx={key:0,class:"space-y-3"},Xx={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},Zx={class:"text-base-content/50 text-sm"},ew={class:"text-base-content/40 text-xs mt-1"},tw={key:2,class:"space-y-3"},nw={class:"flex-1 min-w-0"},sw={class:"flex items-center gap-2 mb-1"},ow={class:"font-semibold truncate"},rw={class:"flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-base-content/50"},iw={key:0},lw={key:1,class:"italic"},aw={class:"flex items-center gap-2 shrink-0"},cw=["value","onChange"],uw={value:15},dw={value:30},fw={value:60},pw={value:180},hw={value:360},mw={value:720},gw={value:1440},yw={value:10080},vw={value:20160},bw={value:43200},_w=["title","onClick"],xw=["title","disabled","onClick"],ww={key:0,class:"loading loading-spinner loading-xs"},kw=["title","onClick"],Sw={class:"mt-8 surface rounded-2xl p-4 flex gap-3 text-sm text-base-content/60"},Ew={__name:"Monitor",setup(e){const{t}=kt(),n=te([]),s=te(!1),o=te(!1),r=te(""),i=te(""),l=te(60),a=te({});async function d(){s.value=!0;try{const k=await yn.listMonitoredPlaylists();n.value=k.data||[]}finally{s.value=!1}}async function c(){var k,R;r.value="",o.value=!0;try{const S=await yn.addMonitoredPlaylist(i.value.trim(),l.value);n.value.unshift(S.data),i.value=""}catch(S){r.value=((R=(k=S==null?void 0:S.response)==null?void 0:k.data)==null?void 0:R.detail)||t("monitor.failedAdd")}finally{o.value=!1}}async function f(k){try{const R=await yn.updateMonitoredPlaylist(k.id,{enabled:!k.enabled});Object.assign(k,R.data)}catch{}}async function m(k,R){const S=parseInt(R.target.value,10);try{const C=await yn.updateMonitoredPlaylist(k.id,{interval_minutes:S});Object.assign(k,C.data)}catch{}}async function b(k){a.value={...a.value,[k.id]:!0};try{await yn.checkMonitoredPlaylist(k.id),setTimeout(async()=>{try{const R=await yn.listMonitoredPlaylists();n.value=R.data||[]}finally{a.value={...a.value,[k.id]:!1}}},3e3)}catch{a.value={...a.value,[k.id]:!1}}}async function y(k){if(confirm(t("monitor.deletePrompt",{name:k.name})))try{await yn.deleteMonitoredPlaylist(k.id),n.value=n.value.filter(R=>R.id!==k.id)}catch{}}function v(k){if(k<60)return`${k} ${t("monitor.minSuffix")}`;if(k<1440)return`${k/60} ${t("monitor.hourSuffix")}`;if(k<10080){const S=k/1440;return`${S} ${t(S===1?"monitor.daySuffix":"monitor.daysSuffix")}`}if(k<43200){const S=k/10080;return`${S} ${t(S===1?"monitor.weekSuffix":"monitor.weeksSuffix")}`}const R=Math.round(k/43200);return`${R} ${t(R===1?"monitor.monthSuffix":"monitor.monthsSuffix")}`}function h(k){try{const R=Date.now()-new Date(k).getTime(),S=Math.floor(R/6e4);if(S<1)return t("monitor.timeJustNow");if(S<60)return t("monitor.timeMinAgo",{n:S});const C=Math.floor(S/60);return C<24?t("monitor.timeHourAgo",{n:C}):t("monitor.timeDayAgo",{n:Math.floor(C/24)})}catch{return""}}return Xt(d),(k,R)=>(A(),T("div",Rx,[M($s),M(zn),p("div",Cx,[p("div",Tx,[p("h1",Px,w(u(t)("monitor.title")),1),p("p",Ox,w(u(t)("monitor.subtitle")),1)]),p("div",Dx,[p("h2",Nx,w(u(t)("monitor.watchNew")),1),p("form",{onSubmit:ep(c,["prevent"]),class:"flex flex-col sm:flex-row gap-3"},[Ee(p("input",{"onUpdate:modelValue":R[0]||(R[0]=S=>i.value=S),type:"text",placeholder:u(t)("monitor.urlPlaceholder"),class:"input-modern flex-1 h-11 text-sm",disabled:o.value},null,8,Ix),[[rt,i.value]]),p("div",$x,[Ee(p("select",{"onUpdate:modelValue":R[1]||(R[1]=S=>l.value=S),class:"select select-sm rounded-full border border-white/10 bg-base-100/85 focus:border-primary/60 h-11 px-3 text-sm",disabled:o.value},[p("option",Fx,w(u(t)("monitor.every15")),1),p("option",Mx,w(u(t)("monitor.every30")),1),p("option",Ux,w(u(t)("monitor.every1h")),1),p("option",Bx,w(u(t)("monitor.every3h")),1),p("option",Hx,w(u(t)("monitor.every6h")),1),p("option",jx,w(u(t)("monitor.every12h")),1),p("option",qx,w(u(t)("monitor.every1d")),1),p("option",Vx,w(u(t)("monitor.every1w")),1),p("option",Wx,w(u(t)("monitor.every2w")),1),p("option",Kx,w(u(t)("monitor.every1mo")),1)],8,Lx),[[Xs,l.value]]),p("button",{type:"submit",class:"btn btn-primary btn-sm h-11 px-5 rounded-full",disabled:o.value||!i.value.trim()},[o.value?(A(),T("span",Qx)):(A(),T("span",Gx,w(u(t)("monitor.watch")),1))],8,zx)])],32),r.value?(A(),T("p",Jx,w(r.value),1)):ie("",!0)]),s.value?(A(),T("div",Yx,[(A(),T(de,null,Ie(3,S=>p("div",{key:S,class:"skeleton h-24 rounded-2xl"})),64))])):n.value.length===0?(A(),T("div",Xx,[M(u(G),{icon:"clarity:music-note-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",Zx,w(u(t)("monitor.empty")),1),p("p",ew,w(u(t)("monitor.emptyHint")),1)])):(A(),T("ul",tw,[(A(!0),T(de,null,Ie(n.value,S=>(A(),T("li",{key:S.id,class:"surface rounded-2xl p-4 sm:p-5 flex flex-col sm:flex-row sm:items-center gap-4"},[p("div",nw,[p("div",sw,[p("span",ow,w(S.name),1),p("span",{class:Ae(["pill shrink-0",S.enabled?"badge-soft":"badge-neutral-soft"])},w(S.enabled?u(t)("monitor.active"):u(t)("monitor.paused")),3)]),p("div",rw,[p("span",null,[M(u(G),{icon:"clarity:refresh-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(u(t)("monitor.everyInterval",{interval:v(S.interval_minutes)})),1)]),p("span",null,[M(u(G),{icon:"clarity:music-note-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(S.last_track_count===1?u(t)("monitor.tracksOne",{count:S.last_track_count}):u(t)("monitor.tracksMany",{count:S.last_track_count})),1)]),S.last_checked?(A(),T("span",iw,[M(u(G),{icon:"clarity:clock-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(u(t)("monitor.checked",{when:h(S.last_checked)})),1)])):(A(),T("span",lw,w(u(t)("monitor.notChecked")),1))])]),p("div",aw,[p("select",{value:S.interval_minutes,onChange:C=>m(S,C),class:"select select-xs rounded-full border border-white/10 bg-base-100/60 text-xs focus:border-primary/60"},[p("option",uw,w(u(t)("monitor.short15")),1),p("option",dw,w(u(t)("monitor.short30")),1),p("option",fw,w(u(t)("monitor.short1h")),1),p("option",pw,w(u(t)("monitor.short3h")),1),p("option",hw,w(u(t)("monitor.short6h")),1),p("option",mw,w(u(t)("monitor.short12h")),1),p("option",gw,w(u(t)("monitor.short1d")),1),p("option",yw,w(u(t)("monitor.short1w")),1),p("option",vw,w(u(t)("monitor.short2w")),1),p("option",bw,w(u(t)("monitor.short1mo")),1)],40,cw),p("button",{class:"icon-btn",title:S.enabled?u(t)("monitor.pause"):u(t)("monitor.resume"),onClick:C=>f(S)},[M(u(G),{icon:S.enabled?"clarity:pause-line":"clarity:play-line",class:"h-4 w-4"},null,8,["icon"])],8,_w),p("button",{class:"icon-btn",title:u(t)("monitor.checkNow"),disabled:a.value[S.id],onClick:C=>b(S)},[a.value[S.id]?(A(),T("span",ww)):(A(),ct(u(G),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4"}))],8,xw),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",title:u(t)("monitor.stop"),onClick:C=>y(S)},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,kw)])]))),128))])),p("div",Sw,[M(u(G),{icon:"clarity:info-standard-line",class:"h-5 w-5 shrink-0 mt-0.5 text-primary/70"}),p("p",null,w(u(t)("monitor.info")),1)])])]))}},Aw={class:"min-h-screen"},Rw={class:"mx-auto max-w-5xl px-4 py-8 sm:px-6"},Cw={class:"mb-8"},Tw={class:"text-2xl font-bold tracking-tight"},Pw={class:"mt-1 text-sm text-base-content/60"},Ow={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},Dw={class:"text-base-content/50 text-sm"},Nw={class:"text-base-content/40 text-xs mt-1"},Iw={key:1,class:"space-y-3"},$w={key:2,class:"grid gap-6 lg:grid-cols-[1fr_360px]"},Lw={class:"surface rounded-3xl p-6 sm:p-8 flex flex-col items-center text-center"},Fw=["src","alt"],Mw={key:2,class:"absolute bottom-3 right-3 equalizer h-5","aria-hidden":"true"},Uw={class:"mt-6 w-full"},Bw={class:"text-xl font-bold tracking-tight truncate"},Hw={class:"text-sm text-base-content/60 truncate mt-0.5"},jw={class:"mt-6 w-full"},qw={class:"mt-2 flex items-center justify-between text-xs text-base-content/50 tabular-nums"},Vw={class:"mt-5 flex items-center justify-center gap-3"},Ww=["title"],Kw=["title","disabled"],zw=["disabled","title"],Qw=["title","disabled"],Gw=["title"],Jw={key:0,class:"absolute -bottom-0.5 -right-0.5 h-4 min-w-[1rem] px-1 rounded-full bg-primary text-primary-content text-[9px] font-bold flex items-center justify-center"},Yw={class:"mt-6 w-full max-w-xs flex items-center gap-3"},Xw=["title"],Zw=["value","title"],e1={class:"surface rounded-3xl p-4 sm:p-5 lg:max-h-[640px] lg:overflow-y-auto"},t1={class:"flex items-center justify-between mb-3 px-1"},n1={class:"text-xs font-semibold uppercase tracking-wider text-base-content/50"},s1={class:"text-[11px] text-base-content/40"},o1={key:0,class:"space-y-1"},r1=["onClick"],i1=["src","alt","onError"],l1={key:1,class:"relative equalizer h-3","aria-hidden":"true"},a1={class:"flex-1 min-w-0"},c1={class:"text-sm truncate font-medium"},u1={class:"text-[11px] truncate text-base-content/50"},d1={key:1,class:"text-center py-10"},f1={class:"text-base-content/50 text-sm"},p1={__name:"Player",setup(e){const{t}=kt(),n=Ou(),s=te([]),o=te(!1),r=te(null),i=te({});let l=!1;function a(L){return ve.coverFileURL(L)}function d(L){i.value={...i.value,[L]:!0}}async function c(){o.value=!0;try{const L=await ve.listDownloads();s.value=(L.data||[]).map(Si),n.playlist.value.length===0&&s.value.length>0&&n.setPlaylist(s.value)}finally{o.value=!1}}function f(L){var P,U;n.playlist.value.length!==s.value.length||((P=n.playlist.value[L])==null?void 0:P.file)!==((U=s.value[L])==null?void 0:U.file)?n.setPlaylist(s.value,{startIndex:L}):n.playAt(L)}const m=be(()=>{const L=n.currentTrack.value;return L&&L.title?L.title:t("player.empty")}),b=be(()=>{const L=n.currentTrack.value;return L&&L.artist?L.artist:L?t("common.unknownArtist"):""}),y=be(()=>n.repeatMode.value==="one"?t("player.repeatOne"):n.repeatMode.value==="all"?t("player.repeatAll"):t("player.repeatOff"));function v(L){n.setVolume(parseFloat(L.target.value))}function h(L){const P=r.value;if(!P)return 0;const U=P.getBoundingClientRect(),ae=(L.clientX||0)-U.left;return Math.max(0,Math.min(1,ae/U.width))}function k(L){n.seekRatio(h(L))}function R(L){l=!0,n.seekRatio(h(L)),window.addEventListener("pointermove",S),window.addEventListener("pointerup",C,{once:!0})}function S(L){l&&n.seekRatio(h(L))}function C(){l=!1,window.removeEventListener("pointermove",S)}return Xt(()=>{window.scroll(0,0),c()}),ri(()=>{window.removeEventListener("pointermove",S)}),(L,P)=>(A(),T("div",Aw,[M($s),M(zn),p("div",Rw,[p("div",Cw,[p("h1",Tw,w(u(t)("player.title")),1),p("p",Pw,w(u(t)("player.subtitle")),1)]),s.value.length===0&&!o.value?(A(),T("div",Ow,[M(u(G),{icon:"clarity:headphones-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",Dw,w(u(t)("player.empty")),1),p("p",Nw,w(u(t)("player.emptyHint")),1)])):o.value&&!u(n).currentTrack.value?(A(),T("div",Iw,[...P[8]||(P[8]=[p("div",{class:"skeleton h-72 rounded-3xl"},null,-1),p("div",{class:"skeleton h-16 rounded-2xl"},null,-1),p("div",{class:"skeleton h-16 rounded-2xl"},null,-1)])])):(A(),T("div",$w,[p("section",Lw,[p("div",{class:Ae(["relative h-56 w-56 sm:h-64 sm:w-64 rounded-3xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden shadow-glow",{"pulse-glow":u(n).isPlaying.value}])},[u(n).currentTrack.value&&u(n).currentTrack.value.cover&&!i.value[u(n).currentTrack.value.file]?(A(),T("img",{key:0,src:u(n).currentTrack.value.cover,alt:u(n).currentTrack.value.title,class:"absolute inset-0 h-full w-full object-cover",onError:P[0]||(P[0]=U=>d(u(n).currentTrack.value.file))},null,40,Fw)):(A(),ct(u(G),{key:1,icon:"clarity:music-note-line",class:"h-24 w-24"})),u(n).isPlaying.value?(A(),T("div",Mw,[...P[9]||(P[9]=[p("span",null,null,-1),p("span",null,null,-1),p("span",null,null,-1)])])):ie("",!0)],2),p("div",Uw,[p("p",Bw,w(m.value),1),p("p",Hw,w(b.value),1)]),p("div",jw,[p("div",{class:"relative h-2 rounded-full bg-white/10 overflow-hidden cursor-pointer group",ref_key:"progressBar",ref:r,onClick:k,onPointerdown:R},[p("div",{class:"h-full bg-primary transition-[width] duration-150",style:$n(`width: ${u(n).progressPct.value}%`)},null,4),p("div",{class:"absolute top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded-full bg-primary shadow-glow-sm transition-all duration-150 opacity-0 group-hover:opacity-100",style:$n(`left: calc(${u(n).progressPct.value}% - 7px)`)},null,4)],544),p("div",qw,[p("span",null,w(u(pa)(u(n).currentTime.value)),1),p("span",null,w(u(pa)(u(n).duration.value)),1)])]),p("div",Vw,[p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(n).shuffle.value}]),onClick:P[1]||(P[1]=U=>u(n).toggleShuffle()),title:u(n).shuffle.value?u(t)("player.shuffleOn"):u(t)("player.shuffleOff")},[M(u(G),{icon:"clarity:shuffle-line",class:"h-5 w-5"})],10,Ww),p("button",{class:"icon-btn",onClick:P[2]||(P[2]=U=>u(n).prev()),title:u(t)("player.previous"),disabled:s.value.length===0},[M(u(G),{icon:"clarity:step-forward-2-line",class:"h-5 w-5 -scale-x-100"})],8,Kw),p("button",{class:"inline-flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm hover:scale-105 active:scale-95 transition disabled:opacity-50",onClick:P[3]||(P[3]=U=>u(n).toggle()),disabled:s.value.length===0,title:u(n).isPlaying.value?u(t)("player.pause"):u(t)("player.play")},[M(u(G),{icon:u(n).isPlaying.value?"clarity:pause-solid":"clarity:play-solid",class:"h-6 w-6"},null,8,["icon"])],8,zw),p("button",{class:"icon-btn",onClick:P[4]||(P[4]=U=>u(n).next()),title:u(t)("player.next"),disabled:s.value.length===0},[M(u(G),{icon:"clarity:step-forward-2-line",class:"h-5 w-5"})],8,Qw),p("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(n).repeatMode.value!=="off"}]),onClick:P[5]||(P[5]=U=>u(n).cycleRepeat()),title:y.value},[M(u(G),{icon:"clarity:refresh-line",class:"h-5 w-5"}),u(n).repeatMode.value==="one"?(A(),T("span",Jw," 1 ")):ie("",!0)],10,Gw)]),p("div",Yw,[p("button",{class:"icon-btn",onClick:P[6]||(P[6]=U=>u(n).toggleMute()),title:u(n).isMuted.value?u(t)("player.unmute"):u(t)("player.mute")},[M(u(G),{icon:u(n).isMuted.value||u(n).volume.value===0?"clarity:volume-mute-line":u(n).volume.value<.5?"clarity:volume-down-line":"clarity:volume-up-line",class:"h-5 w-5"},null,8,["icon"])],8,Xw),p("input",{type:"range",min:"0",max:"1",step:"0.01",value:u(n).isMuted.value?0:u(n).volume.value,onInput:P[7]||(P[7]=U=>v(U)),class:"player-range flex-1",title:u(t)("player.volume")},null,40,Zw)])]),p("aside",e1,[p("div",t1,[p("h2",n1,w(u(t)("player.queue")),1),p("span",s1,w(s.value.length===1?u(t)("player.countOne",{count:s.value.length}):u(t)("player.countMany",{count:s.value.length})),1)]),s.value.length>0?(A(),T("ul",o1,[(A(!0),T(de,null,Ie(s.value,(U,ae)=>(A(),T("li",{key:U.file,class:Ae(["rounded-xl px-2 py-2 flex items-center gap-3 cursor-pointer transition-colors",ae===u(n).currentIndex.value?"bg-primary/10 text-primary":"hover:bg-white/5"]),onClick:I=>f(ae)},[p("div",{class:Ae(["relative h-9 w-9 shrink-0 rounded-lg overflow-hidden flex items-center justify-center",ae===u(n).currentIndex.value?"bg-primary/15":"bg-base-100/60"])},[i.value[U.file]?ie("",!0):(A(),T("img",{key:0,src:a(U.file),alt:U.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:I=>d(U.file)},null,40,i1)),ae===u(n).currentIndex.value&&u(n).isPlaying.value?(A(),T("span",l1,[...P[10]||(P[10]=[p("span",null,null,-1),p("span",null,null,-1),p("span",null,null,-1)])])):i.value[U.file]?(A(),ct(u(G),{key:2,icon:"clarity:music-note-line",class:"h-4 w-4 text-base-content/50"})):ie("",!0)],2),p("div",a1,[p("p",c1,w(U.title),1),p("p",u1,w(U.artist||u(t)("common.unknownArtist")),1)])],10,r1))),128))])):(A(),T("div",d1,[p("p",f1,w(u(t)("player.empty")),1)]))])]))])]))}},h1=Eu(p1,[["__scopeId","data-v-98956c70"]]),m1=[{path:"/",name:"Home",component:Jb},{path:"/search/:query",name:"Search",component:H_},{path:"/download",name:"Download",component:T0},{path:"/list",name:"List",component:xx},{path:"/monitor",name:"Monitor",component:Ew},{path:"/player",name:"Player",component:h1}],it=bb({history:Yv(Ge.BASEURL),routes:m1}),Du=rp(pv);Du.use(it);Du.mount("#app"); diff --git a/frontend/dist/index.html b/frontend/dist/index.html index cbe3ef1..cb54471 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -5,7 +5,7 @@ Downtify - + diff --git a/frontend/package.json b/frontend/package.json index 78c4671..bb60e33 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "downtify-web", - "version": "2.7.8", + "version": "2.7.9", "scripts": { "dev": "vite", "build": "vite build", diff --git a/frontend/src/components/DownloadList.vue b/frontend/src/components/DownloadList.vue index 675943c..9518621 100644 --- a/frontend/src/components/DownloadList.vue +++ b/frontend/src/components/DownloadList.vue @@ -257,6 +257,7 @@ + diff --git a/frontend/package.json b/frontend/package.json index bb60e33..8dbad3d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "downtify-web", - "version": "2.7.9", + "version": "2.7.10", "scripts": { "dev": "vite", "build": "vite build", diff --git a/frontend/src/components/DownloadList.vue b/frontend/src/components/DownloadList.vue index 9518621..0c2026b 100644 --- a/frontend/src/components/DownloadList.vue +++ b/frontend/src/components/DownloadList.vue @@ -276,6 +276,7 @@ function queueItemState(item) { if (item.isErrored()) return 'failed' if (item.isDownloaded()) return 'done' if (item.isDownloading()) return 'downloading' + if (item.isQueued()) return 'queued' return 'queued' } @@ -305,24 +306,17 @@ const filterTabs = computed(() => [ label: t('queue.filterActive'), count: activeCount.value, }, - { - id: 'all', - label: t('queue.filterAll'), - count: pt.downloadQueue.value.length, - }, - { - id: 'downloading', - label: t('queue.filterDownloading'), - count: pt.downloadQueue.value.filter( - (i) => queueItemState(i) === 'downloading' - ).length, - }, { id: 'queued', label: t('queue.filterQueued'), count: pt.downloadQueue.value.filter((i) => queueItemState(i) === 'queued') .length, }, + { + id: 'all', + label: t('queue.filterAll'), + count: pt.downloadQueue.value.length, + }, { id: 'done', label: t('queue.filterDone'), diff --git a/frontend/src/i18n/locales/en.js b/frontend/src/i18n/locales/en.js index 9c254e6..7ff8c78 100644 --- a/frontend/src/i18n/locales/en.js +++ b/frontend/src/i18n/locales/en.js @@ -153,7 +153,7 @@ export default { subtitle: 'Tweak how Downtify fetches and tags your music.', audioSource: 'Audio sources (fallback order)', audioSourceHint: - 'Enable one or more. Downtify tries them in order (1, 2, 3) per track. Use slskd then YouTube for playlists.', + 'Enable one or more. Each track tries sources in order (1, 2, 3) until one succeeds.', audioSourceReset: 'Use recommended order', lyricsSource: 'Lyrics source', lyricsHint: 'only lrclib is active', diff --git a/frontend/src/i18n/locales/es.js b/frontend/src/i18n/locales/es.js index 21853d5..3dc43bb 100644 --- a/frontend/src/i18n/locales/es.js +++ b/frontend/src/i18n/locales/es.js @@ -156,7 +156,7 @@ export default { subtitle: 'Ajusta cómo Downtify descarga y etiqueta tu música.', audioSource: 'Fuentes de audio (orden de respaldo)', audioSourceHint: - 'Activa una o más. Downtify las prueba en orden (1, 2, 3) por pista. Para listas: slskd y luego YouTube.', + 'Activa una o más. Cada pista prueba las fuentes en orden (1, 2, 3) hasta que una funcione.', audioSourceReset: 'Usar orden recomendado', lyricsSource: 'Fuente de letras', lyricsHint: 'solo lrclib está activo', diff --git a/frontend/src/i18n/locales/pt-BR.js b/frontend/src/i18n/locales/pt-BR.js index d5c63d5..067e9a2 100644 --- a/frontend/src/i18n/locales/pt-BR.js +++ b/frontend/src/i18n/locales/pt-BR.js @@ -155,7 +155,7 @@ export default { subtitle: 'Ajuste como o Downtify baixa e marca suas músicas.', audioSource: 'Fontes de áudio (ordem de fallback)', audioSourceHint: - 'Ative uma ou mais. O Downtify tenta na ordem (1, 2, 3) por faixa. Para playlists: slskd e depois YouTube.', + 'Ative uma ou mais. Cada faixa tenta as fontes na ordem (1, 2, 3) até uma funcionar.', audioSourceReset: 'Usar ordem recomendada', lyricsSource: 'Fonte de letras', lyricsHint: 'apenas o lrclib está ativo', diff --git a/frontend/src/model/download.js b/frontend/src/model/download.js index 376d8f6..2f32e5d 100644 --- a/frontend/src/model/download.js +++ b/frontend/src/model/download.js @@ -44,8 +44,7 @@ class DownloadItem { this.filename = name } isQueued() { - return this.song.song_id !== undefined ? true : false - // return this.web_status === STATUS.QUEUED + return this.web_status === STATUS.QUEUED } isDownloading() { return this.web_status === STATUS.DOWNLOADING @@ -115,6 +114,7 @@ API.ws_onmessage((event) => { item.wsUpdate(data) item.setError() } else if (data.status === 'queued') { + item.web_status = STATUS.QUEUED item.message = data.message || '' } else { item.wsUpdate(data) @@ -148,6 +148,7 @@ async function _hydrateFromServer() { item.progress = job.progress || 0 item.message = job.message || '' } else { + item.web_status = STATUS.QUEUED item.message = job.message || '' } downloadQueue.value.push(item) diff --git a/pyproject.toml b/pyproject.toml index 6eb0b72..5fe7a09 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "downtify" -version = "2.7.9" +version = "2.7.10" description = "Download your Spotify playlists and songs along with album art and metadata in a self-hosted way via Docker" readme = "README.md" requires-python = ">=3.10,<3.14" From f3b840c1300e67bbcf1d4ea8822d5197ca448f18 Mon Sep 17 00:00:00 2001 From: dx616b Date: Thu, 28 May 2026 22:06:13 +0200 Subject: [PATCH 09/58] Refine queue filters: In progress vs Waiting, no wait spinner. In progress covers active work (provider search and download); Waiting is only tracks not started yet. Show search progress in the UI. Co-authored-by: Cursor --- downtify/downloader.py | 8 +++++ .../{index-CgVP4Olc.js => index-D2e78VYf.js} | 16 +++++----- frontend/dist/index.html | 2 +- frontend/src/components/DownloadList.vue | 29 ++++++------------- frontend/src/i18n/locales/en.js | 4 +-- frontend/src/i18n/locales/es.js | 2 +- frontend/src/i18n/locales/pt-BR.js | 2 +- frontend/src/model/download.js | 2 +- 8 files changed, 31 insertions(+), 34 deletions(-) rename frontend/dist/assets/{index-CgVP4Olc.js => index-D2e78VYf.js} (70%) diff --git a/downtify/downloader.py b/downtify/downloader.py index 798c2ff..37d410b 100644 --- a/downtify/downloader.py +++ b/downtify/downloader.py @@ -249,6 +249,14 @@ def _resolve_video_id( Returns ``(video_id, ytm_match, provider_used, local_file_path)``. """ + if progress_cb is not None: + try: + progress_cb(0.0, 'Searching for audio…') + except Exception: + logger.opt(exception=True).debug( + 'progress callback error at search start' + ) + tried_ytdlp = False for provider in self.audio_providers: if provider == 'youtube-music': diff --git a/frontend/dist/assets/index-CgVP4Olc.js b/frontend/dist/assets/index-D2e78VYf.js similarity index 70% rename from frontend/dist/assets/index-CgVP4Olc.js rename to frontend/dist/assets/index-D2e78VYf.js index f661f91..44fd417 100644 --- a/frontend/dist/assets/index-CgVP4Olc.js +++ b/frontend/dist/assets/index-D2e78VYf.js @@ -10,19 +10,19 @@ * @vue/runtime-core v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/function As(e,t,n,s){try{return s?e(...s):e()}catch(o){Eo(o,t,n)}}function wt(e,t,n,s){if(oe(e)){const o=As(e,t,n,s);return o&&ma(o)&&o.catch(r=>{Eo(r,t,n)}),o}if(X(e)){const o=[];for(let r=0;r>>1,o=ze[s],r=ms(o);r=ms(n)?ze.push(e):ze.splice(_d(t),0,e),e.flags|=1,Ba()}}function Ba(){io||(io=Ua.then(ja))}function xd(e){X(e)?Dn.push(...e):on&&e.id===-1?on.splice(Cn+1,0,e):e.flags&1||(Dn.push(e),e.flags|=1),Ba()}function Ni(e,t,n=It+1){for(;nms(n)-ms(s));if(Dn.length=0,on){on.push(...t);return}for(on=t,Cn=0;Cne.id==null?e.flags&2?-1:1/0:e.id;function ja(e){try{for(It=0;It{s._d&&fo(-1);const r=lo(t);let i;try{i=e(...o)}finally{lo(r),s._d&&fo(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function Ee(e,t){if(lt===null)return e;const n=Po(lt),s=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&oe(t)?t.call(s&&s.proxy):t}}const wd=Symbol.for("v-scx"),kd=()=>_t(wd);function js(e,t){return ni(e,null,t)}function Mt(e,t,n){return ni(e,t,n)}function ni(e,t,n=xe){const{immediate:s,deep:o,flush:r,once:i}=n,l=$e({},n),a=t&&s||!t&&r!=="post";let d;if(vs){if(r==="sync"){const b=kd();d=b.__watcherHandles||(b.__watcherHandles=[])}else if(!a){const b=()=>{};return b.stop=Ft,b.resume=Ft,b.pause=Ft,b}}const c=Be;l.call=(b,y,v)=>wt(b,c,y,v);let f=!1;r==="post"?l.scheduler=b=>{Ze(b,c&&c.suspense)}:r!=="sync"&&(f=!0,l.scheduler=(b,y)=>{y?b():ti(b)}),l.augmentJob=b=>{t&&(b.flags|=4),f&&(b.flags|=2,c&&(b.id=c.uid,b.i=c))};const m=vd(e,t,l);return vs&&(d?d.push(m):a&&m()),m}function Sd(e,t,n){const s=this.proxy,o=Te(e)?e.includes(".")?Va(s,e):()=>s[e]:e.bind(s,s);let r;oe(t)?r=t:(r=t.handler,n=t);const i=Rs(this),l=ni(o,r.bind(s),n);return i(),l}function Va(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;oe.__isTeleport,$t=Symbol("_leaveCb"),Yn=Symbol("_enterCb");function Ad(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Zt(()=>{e.isMounted=!0}),oi(()=>{e.isUnmounting=!0}),e}const ft=[Function,Array],Ka={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ft,onEnter:ft,onAfterEnter:ft,onEnterCancelled:ft,onBeforeLeave:ft,onLeave:ft,onAfterLeave:ft,onLeaveCancelled:ft,onBeforeAppear:ft,onAppear:ft,onAfterAppear:ft,onAppearCancelled:ft},za=e=>{const t=e.subTree;return t.component?za(t.component):t},Rd={name:"BaseTransition",props:Ka,setup(e,{slots:t}){const n=wc(),s=Ad();return()=>{const o=t.default&&Ja(t.default(),!0);if(!o||!o.length)return;const r=Qa(o),i=pe(e),{mode:l}=i;if(s.isLeaving)return Jo(r);const a=Ii(r);if(!a)return Jo(r);let d=_r(a,i,s,n,f=>d=f);a.type!==Qe&&gs(a,d);let c=n.subTree&&Ii(n.subTree);if(c&&c.type!==Qe&&!bn(c,a)&&za(n).type!==Qe){let f=_r(c,i,s,n);if(gs(c,f),l==="out-in"&&a.type!==Qe)return s.isLeaving=!0,f.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,c=void 0},Jo(r);l==="in-out"&&a.type!==Qe?f.delayLeave=(m,b,y)=>{const v=Ga(s,c);v[String(c.key)]=c,m[$t]=()=>{b(),m[$t]=void 0,delete d.delayedLeave,c=void 0},d.delayedLeave=()=>{y(),delete d.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return r}}};function Qa(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Qe){t=n;break}}return t}const Cd=Rd;function Ga(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function _r(e,t,n,s,o){const{appear:r,mode:i,persisted:l=!1,onBeforeEnter:a,onEnter:d,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:m,onLeave:b,onAfterLeave:y,onLeaveCancelled:v,onBeforeAppear:h,onAppear:k,onAfterAppear:R,onAppearCancelled:S}=t,C=String(e.key),L=Ga(n,e),P=($,W)=>{$&&wt($,s,9,W)},U=($,W)=>{const B=W[1];P($,W),X($)?$.every(q=>q.length<=1)&&B():$.length<=1&&B()},ae={mode:i,persisted:l,beforeEnter($){let W=a;if(!n.isMounted)if(r)W=h||a;else return;$[$t]&&$[$t](!0);const B=L[C];B&&bn(e,B)&&B.el[$t]&&B.el[$t](),P(W,[$])},enter($){let W=d,B=c,q=f;if(!n.isMounted)if(r)W=k||d,B=R||c,q=S||f;else return;let se=!1;$[Yn]=Me=>{se||(se=!0,Me?P(q,[$]):P(B,[$]),ae.delayedLeave&&ae.delayedLeave(),$[Yn]=void 0)};const we=$[Yn].bind(null,!1);W?U(W,[$,we]):we()},leave($,W){const B=String(e.key);if($[Yn]&&$[Yn](!0),n.isUnmounting)return W();P(m,[$]);let q=!1;$[$t]=we=>{q||(q=!0,W(),we?P(v,[$]):P(y,[$]),$[$t]=void 0,L[B]===e&&delete L[B])};const se=$[$t].bind(null,!1);L[B]=e,b?U(b,[$,se]):se()},clone($){const W=_r($,t,n,s,o);return o&&o(W),W}};return ae}function Jo(e){if(Ao(e))return e=cn(e),e.children=null,e}function Ii(e){if(!Ao(e))return Wa(e.type)&&e.children?Qa(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&oe(n.default))return n.default()}}function gs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,gs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ja(e,t=!1,n){let s=[],o=0;for(let r=0;r1)for(let r=0;ras(v,t&&(X(t)?t[h]:t),n,s,o));return}if(cs(s)&&!o){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&as(e,t,n,s.component.subTree);return}const r=s.shapeFlag&4?Po(s.component):s.el,i=o?null:r,{i:l,r:a}=e,d=t&&t.r,c=l.refs===xe?l.refs={}:l.refs,f=l.setupState,m=pe(f),b=f===xe?ha:v=>$i(c,v)?!1:me(m,v),y=(v,h)=>!(h&&$i(c,h));if(d!=null&&d!==a){if(Li(t),Te(d))c[d]=null,b(d)&&(f[d]=null);else if(je(d)){const v=t;y(d,v.k)&&(d.value=null),v.k&&(c[v.k]=null)}}if(oe(a))As(a,l,12,[i,c]);else{const v=Te(a),h=je(a);if(v||h){const k=()=>{if(e.f){const R=v?b(a)?f[a]:c[a]:y()||!e.k?a.value:c[e.k];if(o)X(R)&&Vr(R,r);else if(X(R))R.includes(r)||R.push(r);else if(v)c[a]=[r],b(a)&&(f[a]=c[a]);else{const S=[r];y(a,e.k)&&(a.value=S),e.k&&(c[e.k]=S)}}else v?(c[a]=i,b(a)&&(f[a]=i)):h&&(y(a,e.k)&&(a.value=i),e.k&&(c[e.k]=i))};if(i){const R=()=>{k(),co.delete(e)};R.id=-1,co.set(e,R),Ze(R,n)}else Li(e),k()}}}function Li(e){const t=co.get(e);t&&(t.flags|=8,co.delete(e))}ko().requestIdleCallback;ko().cancelIdleCallback;const cs=e=>!!e.type.__asyncLoader,Ao=e=>e.type.__isKeepAlive;function Td(e,t){Xa(e,"a",t)}function Pd(e,t){Xa(e,"da",t)}function Xa(e,t,n=Be){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ro(t,s,n),n){let o=n.parent;for(;o&&o.parent;)Ao(o.parent.vnode)&&Od(s,t,n,o),o=o.parent}}function Od(e,t,n,s){const o=Ro(t,e,s,!0);ri(()=>{Vr(s[t],o)},n)}function Ro(e,t,n=Be,s=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...i)=>{Gt();const l=Rs(n),a=wt(t,n,e,i);return l(),Jt(),a});return s?o.unshift(r):o.push(r),r}}const Xt=e=>(t,n=Be)=>{(!vs||e==="sp")&&Ro(e,(...s)=>t(...s),n)},Za=Xt("bm"),Zt=Xt("m"),Dd=Xt("bu"),Nd=Xt("u"),oi=Xt("bum"),ri=Xt("um"),Id=Xt("sp"),$d=Xt("rtg"),Ld=Xt("rtc");function Fd(e,t=Be){Ro("ec",e,t)}const ec="components";function xr(e,t){return nc(ec,e,!0,t)||e}const tc=Symbol.for("v-ndc");function Md(e){return Te(e)?nc(ec,e,!1)||e:e||tc}function nc(e,t,n=!0,s=!1){const o=lt||Be;if(o){const r=o.type;{const l=Sf(r,!1);if(l&&(l===t||l===mt(t)||l===xo(mt(t))))return r}const i=Fi(o[e]||r[e],t)||Fi(o.appContext[e],t);return!i&&s?r:i}}function Fi(e,t){return e&&(e[t]||e[mt(t)]||e[xo(mt(t))])}function Ie(e,t,n,s){let o;const r=n,i=X(e);if(i||Te(e)){const l=i&&kn(e);let a=!1,d=!1;l&&(a=!ht(e),d=Yt(e),e=So(e)),o=new Array(e.length);for(let c=0,f=e.length;ct(l,a,void 0,r));else{const l=Object.keys(e);o=new Array(l.length);for(let a=0,d=l.length;ae?kc(e)?Po(e):wr(e.parent):null,us=$e(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>wr(e.parent),$root:e=>wr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>oc(e),$forceUpdate:e=>e.f||(e.f=()=>{ti(e.update)}),$nextTick:e=>e.n||(e.n=ei.bind(e.proxy)),$watch:e=>Sd.bind(e)}),Yo=(e,t)=>e!==xe&&!e.__isScriptSetup&&me(e,t),Ud={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:o,props:r,accessCache:i,type:l,appContext:a}=e;if(t[0]!=="$"){const m=i[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return r[t]}else{if(Yo(s,t))return i[t]=1,s[t];if(o!==xe&&me(o,t))return i[t]=2,o[t];if(me(r,t))return i[t]=3,r[t];if(n!==xe&&me(n,t))return i[t]=4,n[t];kr&&(i[t]=0)}}const d=us[t];let c,f;if(d)return t==="$attrs"&&Ue(e.attrs,"get",""),d(e);if((c=l.__cssModules)&&(c=c[t]))return c;if(n!==xe&&me(n,t))return i[t]=4,n[t];if(f=a.config.globalProperties,me(f,t))return f[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:r}=e;return Yo(o,t)?(o[t]=n,!0):s!==xe&&me(s,t)?(s[t]=n,!0):me(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,props:r,type:i}},l){let a;return!!(n[l]||e!==xe&&l[0]!=="$"&&me(e,l)||Yo(t,l)||me(r,l)||me(s,l)||me(us,l)||me(o.config.globalProperties,l)||(a=i.__cssModules)&&a[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:me(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Mi(e){return X(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let kr=!0;function Bd(e){const t=oc(e),n=e.proxy,s=e.ctx;kr=!1,t.beforeCreate&&Ui(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:i,watch:l,provide:a,inject:d,created:c,beforeMount:f,mounted:m,beforeUpdate:b,updated:y,activated:v,deactivated:h,beforeDestroy:k,beforeUnmount:R,destroyed:S,unmounted:C,render:L,renderTracked:P,renderTriggered:U,errorCaptured:ae,serverPrefetch:$,expose:W,inheritAttrs:B,components:q,directives:se,filters:we}=t;if(d&&Hd(d,s,null),i)for(const fe in i){const re=i[fe];oe(re)&&(s[fe]=re.bind(n))}if(o){const fe=o.call(n,n);ge(fe)&&(e.data=Ln(fe))}if(kr=!0,r)for(const fe in r){const re=r[fe],ut=oe(re)?re.bind(n,n):oe(re.get)?re.get.bind(n,n):Ft,At=!oe(re)&&oe(re.set)?re.set.bind(n):Ft,De=be({get:ut,set:At});Object.defineProperty(s,fe,{enumerable:!0,configurable:!0,get:()=>De.value,set:Oe=>De.value=Oe})}if(l)for(const fe in l)sc(l[fe],s,n,fe);if(a){const fe=oe(a)?a.call(n):a;Reflect.ownKeys(fe).forEach(re=>{Qs(re,fe[re])})}c&&Ui(c,e,"c");function le(fe,re){X(re)?re.forEach(ut=>fe(ut.bind(n))):re&&fe(re.bind(n))}if(le(Za,f),le(Zt,m),le(Dd,b),le(Nd,y),le(Td,v),le(Pd,h),le(Fd,ae),le(Ld,P),le($d,U),le(oi,R),le(ri,C),le(Id,$),X(W))if(W.length){const fe=e.exposed||(e.exposed={});W.forEach(re=>{Object.defineProperty(fe,re,{get:()=>n[re],set:ut=>n[re]=ut,enumerable:!0})})}else e.exposed||(e.exposed={});L&&e.render===Ft&&(e.render=L),B!=null&&(e.inheritAttrs=B),q&&(e.components=q),se&&(e.directives=se),$&&Ya(e)}function Hd(e,t,n=Ft){X(e)&&(e=Sr(e));for(const s in e){const o=e[s];let r;ge(o)?"default"in o?r=_t(o.from||s,o.default,!0):r=_t(o.from||s):r=_t(o),je(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:i=>r.value=i}):t[s]=r}}function Ui(e,t,n){wt(X(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function sc(e,t,n,s){let o=s.includes(".")?Va(n,s):()=>n[s];if(Te(e)){const r=t[e];oe(r)&&Mt(o,r)}else if(oe(e))Mt(o,e.bind(n));else if(ge(e))if(X(e))e.forEach(r=>sc(r,t,n,s));else{const r=oe(e.handler)?e.handler.bind(n):t[e.handler];oe(r)&&Mt(o,r,e)}}function oc(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:i}}=e.appContext,l=r.get(t);let a;return l?a=l:!o.length&&!n&&!s?a=t:(a={},o.length&&o.forEach(d=>uo(a,d,i,!0)),uo(a,t,i)),ge(t)&&r.set(t,a),a}function uo(e,t,n,s=!1){const{mixins:o,extends:r}=t;r&&uo(e,r,n,!0),o&&o.forEach(i=>uo(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=jd[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const jd={data:Bi,props:Hi,emits:Hi,methods:os,computed:os,beforeCreate:Ve,created:Ve,beforeMount:Ve,mounted:Ve,beforeUpdate:Ve,updated:Ve,beforeDestroy:Ve,beforeUnmount:Ve,destroyed:Ve,unmounted:Ve,activated:Ve,deactivated:Ve,errorCaptured:Ve,serverPrefetch:Ve,components:os,directives:os,watch:Vd,provide:Bi,inject:qd};function Bi(e,t){return t?e?function(){return $e(oe(e)?e.call(this,this):e,oe(t)?t.call(this,this):t)}:t:e}function qd(e,t){return os(Sr(e),Sr(t))}function Sr(e){if(X(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${mt(t)}Modifiers`]||e[`${fn(t)}Modifiers`];function Qd(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||xe;let o=n;const r=t.startsWith("update:"),i=r&&zd(s,t.slice(7));i&&(i.trim&&(o=n.map(c=>Te(c)?c.trim():c)),i.number&&(o=n.map(wo)));let l,a=s[l=Wo(t)]||s[l=Wo(mt(t))];!a&&r&&(a=s[l=Wo(fn(t))]),a&&wt(a,e,6,o);const d=s[l+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,wt(d,e,6,o)}}const Gd=new WeakMap;function ic(e,t,n=!1){const s=n?Gd:t.emitsCache,o=s.get(e);if(o!==void 0)return o;const r=e.emits;let i={},l=!1;if(!oe(e)){const a=d=>{const c=ic(d,t,!0);c&&(l=!0,$e(i,c))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!l?(ge(e)&&s.set(e,null),null):(X(r)?r.forEach(a=>i[a]=null):$e(i,r),ge(e)&&s.set(e,i),i)}function Co(e,t){return!e||!bo(t)?!1:(t=t.slice(2).replace(/Once$/,""),me(e,t[0].toLowerCase()+t.slice(1))||me(e,fn(t))||me(e,t))}function ji(e){const{type:t,vnode:n,proxy:s,withProxy:o,propsOptions:[r],slots:i,attrs:l,emit:a,render:d,renderCache:c,props:f,data:m,setupState:b,ctx:y,inheritAttrs:v}=e,h=lo(e);let k,R;try{if(n.shapeFlag&4){const C=o||s,L=C;k=Lt(d.call(L,C,c,f,b,m,y)),R=l}else{const C=t;k=Lt(C.length>1?C(f,{attrs:l,slots:i,emit:a}):C(f,null)),R=t.props?l:Jd(l)}}catch(C){ds.length=0,Eo(C,e,1),k=M(Qe)}let S=k;if(R&&v!==!1){const C=Object.keys(R),{shapeFlag:L}=S;C.length&&L&7&&(r&&C.some(qr)&&(R=Yd(R,r)),S=cn(S,R,!1,!0))}return n.dirs&&(S=cn(S,null,!1,!0),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&gs(S,n.transition),k=S,lo(h),k}const Jd=e=>{let t;for(const n in e)(n==="class"||n==="style"||bo(n))&&((t||(t={}))[n]=e[n]);return t},Yd=(e,t)=>{const n={};for(const s in e)(!qr(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Xd(e,t,n){const{props:s,children:o,component:r}=e,{props:i,children:l,patchFlag:a}=t,d=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return s?qi(s,i,d):!!i;if(a&8){const c=t.dynamicProps;for(let f=0;fObject.create(ac),uc=e=>Object.getPrototypeOf(e)===ac;function ef(e,t,n,s=!1){const o={},r=cc();e.propsDefaults=Object.create(null),dc(e,t,o,r);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=s?o:La(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function tf(e,t,n,s){const{props:o,attrs:r,vnode:{patchFlag:i}}=e,l=pe(o),[a]=e.propsOptions;let d=!1;if((s||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[m,b]=fc(f,t,!0);$e(i,m),b&&l.push(...b)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!r&&!a)return ge(e)&&s.set(e,Pn),Pn;if(X(r))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",li=e=>X(e)?e.map(Lt):[Lt(e)],sf=(e,t,n)=>{if(t._n)return t;const s=ao((...o)=>li(t(...o)),n);return s._c=!1,s},pc=(e,t,n)=>{const s=e._ctx;for(const o in e){if(ii(o))continue;const r=e[o];if(oe(r))t[o]=sf(o,r,s);else if(r!=null){const i=li(r);t[o]=()=>i}}},hc=(e,t)=>{const n=li(t);e.slots.default=()=>n},mc=(e,t,n)=>{for(const s in t)(n||!ii(s))&&(e[s]=t[s])},of=(e,t,n)=>{const s=e.slots=cc();if(e.vnode.shapeFlag&32){const o=t._;o?(mc(s,t,n),n&&va(s,"_",o,!0)):pc(t,s)}else t&&hc(e,t)},rf=(e,t,n)=>{const{vnode:s,slots:o}=e;let r=!0,i=xe;if(s.shapeFlag&32){const l=t._;l?n&&l===1?r=!1:mc(o,t,n):(r=!t.$stable,pc(t,o)),i=t}else t&&(hc(e,t),i={default:1});if(r)for(const l in o)!ii(l)&&i[l]==null&&delete o[l]},Ze=df;function lf(e){return af(e)}function af(e,t){const n=ko();n.__VUE__=!0;const{insert:s,remove:o,patchProp:r,createElement:i,createText:l,createComment:a,setText:d,setElementText:c,parentNode:f,nextSibling:m,setScopeId:b=Ft,insertStaticContent:y}=e,v=(g,_,x,O=null,I=null,D=null,V=void 0,j=null,H=!!_.dynamicChildren)=>{if(g===_)return;g&&!bn(g,_)&&(O=N(g),Oe(g,I,D,!0),g=null),_.patchFlag===-2&&(H=!1,_.dynamicChildren=null);const{type:F,ref:Z,shapeFlag:z}=_;switch(F){case To:h(g,_,x,O);break;case Qe:k(g,_,x,O);break;case Gs:g==null&&R(_,x,O,V);break;case de:q(g,_,x,O,I,D,V,j,H);break;default:z&1?L(g,_,x,O,I,D,V,j,H):z&6?se(g,_,x,O,I,D,V,j,H):(z&64||z&128)&&F.process(g,_,x,O,I,D,V,j,H,J)}Z!=null&&I?as(Z,g&&g.ref,D,_||g,!_):Z==null&&g&&g.ref!=null&&as(g.ref,null,D,g,!0)},h=(g,_,x,O)=>{if(g==null)s(_.el=l(_.children),x,O);else{const I=_.el=g.el;_.children!==g.children&&d(I,_.children)}},k=(g,_,x,O)=>{g==null?s(_.el=a(_.children||""),x,O):_.el=g.el},R=(g,_,x,O)=>{[g.el,g.anchor]=y(g.children,_,x,O,g.el,g.anchor)},S=({el:g,anchor:_},x,O)=>{let I;for(;g&&g!==_;)I=m(g),s(g,x,O),g=I;s(_,x,O)},C=({el:g,anchor:_})=>{let x;for(;g&&g!==_;)x=m(g),o(g),g=x;o(_)},L=(g,_,x,O,I,D,V,j,H)=>{if(_.type==="svg"?V="svg":_.type==="math"&&(V="mathml"),g==null)P(_,x,O,I,D,V,j,H);else{const F=g.el&&g.el._isVueCE?g.el:null;try{F&&F._beginPatch(),$(g,_,I,D,V,j,H)}finally{F&&F._endPatch()}}},P=(g,_,x,O,I,D,V,j)=>{let H,F;const{props:Z,shapeFlag:z,transition:Y,dirs:ne}=g;if(H=g.el=i(g.type,D,Z&&Z.is,Z),z&8?c(H,g.children):z&16&&ae(g.children,H,null,O,I,Xo(g,D),V,j),ne&&pn(g,null,O,"created"),U(H,g,g.scopeId,V,O),Z){for(const ke in Z)ke!=="value"&&!rs(ke)&&r(H,ke,null,Z[ke],D,O);"value"in Z&&r(H,"value",null,Z.value,D),(F=Z.onVnodeBeforeMount)&&Dt(F,O,g)}ne&&pn(g,null,O,"beforeMount");const ue=cf(I,Y);ue&&Y.beforeEnter(H),s(H,_,x),((F=Z&&Z.onVnodeMounted)||ue||ne)&&Ze(()=>{F&&Dt(F,O,g),ue&&Y.enter(H),ne&&pn(g,null,O,"mounted")},I)},U=(g,_,x,O,I)=>{if(x&&b(g,x),O)for(let D=0;D{for(let F=H;F{const j=_.el=g.el;let{patchFlag:H,dynamicChildren:F,dirs:Z}=_;H|=g.patchFlag&16;const z=g.props||xe,Y=_.props||xe;let ne;if(x&&hn(x,!1),(ne=Y.onVnodeBeforeUpdate)&&Dt(ne,x,_,g),Z&&pn(_,g,x,"beforeUpdate"),x&&hn(x,!0),(z.innerHTML&&Y.innerHTML==null||z.textContent&&Y.textContent==null)&&c(j,""),F?W(g.dynamicChildren,F,j,x,O,Xo(_,I),D):V||re(g,_,j,null,x,O,Xo(_,I),D,!1),H>0){if(H&16)B(j,z,Y,x,I);else if(H&2&&z.class!==Y.class&&r(j,"class",null,Y.class,I),H&4&&r(j,"style",z.style,Y.style,I),H&8){const ue=_.dynamicProps;for(let ke=0;ke{ne&&Dt(ne,x,_,g),Z&&pn(_,g,x,"updated")},O)},W=(g,_,x,O,I,D,V)=>{for(let j=0;j<_.length;j++){const H=g[j],F=_[j],Z=H.el&&(H.type===de||!bn(H,F)||H.shapeFlag&198)?f(H.el):x;v(H,F,Z,null,O,I,D,V,!0)}},B=(g,_,x,O,I)=>{if(_!==x){if(_!==xe)for(const D in _)!rs(D)&&!(D in x)&&r(g,D,_[D],null,I,O);for(const D in x){if(rs(D))continue;const V=x[D],j=_[D];V!==j&&D!=="value"&&r(g,D,j,V,I,O)}"value"in x&&r(g,"value",_.value,x.value,I)}},q=(g,_,x,O,I,D,V,j,H)=>{const F=_.el=g?g.el:l(""),Z=_.anchor=g?g.anchor:l("");let{patchFlag:z,dynamicChildren:Y,slotScopeIds:ne}=_;ne&&(j=j?j.concat(ne):ne),g==null?(s(F,x,O),s(Z,x,O),ae(_.children||[],x,Z,I,D,V,j,H)):z>0&&z&64&&Y&&g.dynamicChildren&&g.dynamicChildren.length===Y.length?(W(g.dynamicChildren,Y,x,I,D,V,j),(_.key!=null||I&&_===I.subTree)&&gc(g,_,!0)):re(g,_,x,Z,I,D,V,j,H)},se=(g,_,x,O,I,D,V,j,H)=>{_.slotScopeIds=j,g==null?_.shapeFlag&512?I.ctx.activate(_,x,O,V,H):we(_,x,O,I,D,V,H):Me(g,_,H)},we=(g,_,x,O,I,D,V)=>{const j=g.component=bf(g,O,I);if(Ao(g)&&(j.ctx.renderer=J),_f(j,!1,V),j.asyncDep){if(I&&I.registerDep(j,le,V),!g.el){const H=j.subTree=M(Qe);k(null,H,_,x),g.placeholder=H.el}}else le(j,g,_,x,I,D,V)},Me=(g,_,x)=>{const O=_.component=g.component;if(Xd(g,_,x))if(O.asyncDep&&!O.asyncResolved){fe(O,_,x);return}else O.next=_,O.update();else _.el=g.el,O.vnode=_},le=(g,_,x,O,I,D,V)=>{const j=()=>{if(g.isMounted){let{next:z,bu:Y,u:ne,parent:ue,vnode:ke}=g;{const Pt=yc(g);if(Pt){z&&(z.el=ke.el,fe(g,z,V)),Pt.asyncDep.then(()=>{Ze(()=>{g.isUnmounted||F()},I)});return}}let ye=z,Ye;hn(g,!1),z?(z.el=ke.el,fe(g,z,V)):z=ke,Y&&zs(Y),(Ye=z.props&&z.props.onVnodeBeforeUpdate)&&Dt(Ye,ue,z,ke),hn(g,!0);const Xe=ji(g),Tt=g.subTree;g.subTree=Xe,v(Tt,Xe,f(Tt.el),N(Tt),g,I,D),z.el=Xe.el,ye===null&&Zd(g,Xe.el),ne&&Ze(ne,I),(Ye=z.props&&z.props.onVnodeUpdated)&&Ze(()=>Dt(Ye,ue,z,ke),I)}else{let z;const{el:Y,props:ne}=_,{bm:ue,m:ke,parent:ye,root:Ye,type:Xe}=g,Tt=cs(_);hn(g,!1),ue&&zs(ue),!Tt&&(z=ne&&ne.onVnodeBeforeMount)&&Dt(z,ye,_),hn(g,!0);{Ye.ce&&Ye.ce._hasShadowRoot()&&Ye.ce._injectChildStyle(Xe);const Pt=g.subTree=ji(g);v(null,Pt,x,O,g,I,D),_.el=Pt.el}if(ke&&Ze(ke,I),!Tt&&(z=ne&&ne.onVnodeMounted)){const Pt=_;Ze(()=>Dt(z,ye,Pt),I)}(_.shapeFlag&256||ye&&cs(ye.vnode)&&ye.vnode.shapeFlag&256)&&g.a&&Ze(g.a,I),g.isMounted=!0,_=x=O=null}};g.scope.on();const H=g.effect=new wa(j);g.scope.off();const F=g.update=H.run.bind(H),Z=g.job=H.runIfDirty.bind(H);Z.i=g,Z.id=g.uid,H.scheduler=()=>ti(Z),hn(g,!0),F()},fe=(g,_,x)=>{_.component=g;const O=g.vnode.props;g.vnode=_,g.next=null,tf(g,_.props,O,x),rf(g,_.children,x),Gt(),Ni(g),Jt()},re=(g,_,x,O,I,D,V,j,H=!1)=>{const F=g&&g.children,Z=g?g.shapeFlag:0,z=_.children,{patchFlag:Y,shapeFlag:ne}=_;if(Y>0){if(Y&128){At(F,z,x,O,I,D,V,j,H);return}else if(Y&256){ut(F,z,x,O,I,D,V,j,H);return}}ne&8?(Z&16&&dt(F,I,D),z!==F&&c(x,z)):Z&16?ne&16?At(F,z,x,O,I,D,V,j,H):dt(F,I,D,!0):(Z&8&&c(x,""),ne&16&&ae(z,x,O,I,D,V,j,H))},ut=(g,_,x,O,I,D,V,j,H)=>{g=g||Pn,_=_||Pn;const F=g.length,Z=_.length,z=Math.min(F,Z);let Y;for(Y=0;YZ?dt(g,I,D,!0,!1,z):ae(_,x,O,I,D,V,j,H,z)},At=(g,_,x,O,I,D,V,j,H)=>{let F=0;const Z=_.length;let z=g.length-1,Y=Z-1;for(;F<=z&&F<=Y;){const ne=g[F],ue=_[F]=H?Vt(_[F]):Lt(_[F]);if(bn(ne,ue))v(ne,ue,x,null,I,D,V,j,H);else break;F++}for(;F<=z&&F<=Y;){const ne=g[z],ue=_[Y]=H?Vt(_[Y]):Lt(_[Y]);if(bn(ne,ue))v(ne,ue,x,null,I,D,V,j,H);else break;z--,Y--}if(F>z){if(F<=Y){const ne=Y+1,ue=neY)for(;F<=z;)Oe(g[F],I,D,!0),F++;else{const ne=F,ue=F,ke=new Map;for(F=ue;F<=Y;F++){const ot=_[F]=H?Vt(_[F]):Lt(_[F]);ot.key!=null&&ke.set(ot.key,F)}let ye,Ye=0;const Xe=Y-ue+1;let Tt=!1,Pt=0;const Gn=new Array(Xe);for(F=0;F=Xe){Oe(ot,I,D,!0);continue}let Ot;if(ot.key!=null)Ot=ke.get(ot.key);else for(ye=ue;ye<=Y;ye++)if(Gn[ye-ue]===0&&bn(ot,_[ye])){Ot=ye;break}Ot===void 0?Oe(ot,I,D,!0):(Gn[Ot-ue]=F+1,Ot>=Pt?Pt=Ot:Tt=!0,v(ot,_[Ot],x,null,I,D,V,j,H),Ye++)}const Ai=Tt?uf(Gn):Pn;for(ye=Ai.length-1,F=Xe-1;F>=0;F--){const ot=ue+F,Ot=_[ot],Ri=_[ot+1],Ci=ot+1{const{el:D,type:V,transition:j,children:H,shapeFlag:F}=g;if(F&6){De(g.component.subTree,_,x,O);return}if(F&128){g.suspense.move(_,x,O);return}if(F&64){V.move(g,_,x,J);return}if(V===de){s(D,_,x);for(let z=0;zj.enter(D),I);else{const{leave:z,delayLeave:Y,afterLeave:ne}=j,ue=()=>{g.ctx.isUnmounted?o(D):s(D,_,x)},ke=()=>{D._isLeaving&&D[$t](!0),z(D,()=>{ue(),ne&&ne()})};Y?Y(D,ue,ke):ke()}else s(D,_,x)},Oe=(g,_,x,O=!1,I=!1)=>{const{type:D,props:V,ref:j,children:H,dynamicChildren:F,shapeFlag:Z,patchFlag:z,dirs:Y,cacheIndex:ne}=g;if(z===-2&&(I=!1),j!=null&&(Gt(),as(j,null,x,g,!0),Jt()),ne!=null&&(_.renderCache[ne]=void 0),Z&256){_.ctx.deactivate(g);return}const ue=Z&1&&Y,ke=!cs(g);let ye;if(ke&&(ye=V&&V.onVnodeBeforeUnmount)&&Dt(ye,_,g),Z&6)Ct(g.component,x,O);else{if(Z&128){g.suspense.unmount(x,O);return}ue&&pn(g,null,_,"beforeUnmount"),Z&64?g.type.remove(g,_,x,J,O):F&&!F.hasOnce&&(D!==de||z>0&&z&64)?dt(F,_,x,!1,!0):(D===de&&z&384||!I&&Z&16)&&dt(H,_,x),O&&Rt(g)}(ke&&(ye=V&&V.onVnodeUnmounted)||ue)&&Ze(()=>{ye&&Dt(ye,_,g),ue&&pn(g,null,_,"unmounted")},x)},Rt=g=>{const{type:_,el:x,anchor:O,transition:I}=g;if(_===de){gt(x,O);return}if(_===Gs){C(g);return}const D=()=>{o(x),I&&!I.persisted&&I.afterLeave&&I.afterLeave()};if(g.shapeFlag&1&&I&&!I.persisted){const{leave:V,delayLeave:j}=I,H=()=>V(x,D);j?j(g.el,D,H):H()}else D()},gt=(g,_)=>{let x;for(;g!==_;)x=m(g),o(g),g=x;o(_)},Ct=(g,_,x)=>{const{bum:O,scope:I,job:D,subTree:V,um:j,m:H,a:F}=g;Wi(H),Wi(F),O&&zs(O),I.stop(),D&&(D.flags|=8,Oe(V,g,_,x)),j&&Ze(j,_),Ze(()=>{g.isUnmounted=!0},_)},dt=(g,_,x,O=!1,I=!1,D=0)=>{for(let V=D;V{if(g.shapeFlag&6)return N(g.component.subTree);if(g.shapeFlag&128)return g.suspense.next();const _=m(g.anchor||g.el),x=_&&_[Ed];return x?m(x):_};let Q=!1;const K=(g,_,x)=>{let O;g==null?_._vnode&&(Oe(_._vnode,null,null,!0),O=_._vnode.component):v(_._vnode||null,g,_,null,null,null,x),_._vnode=g,Q||(Q=!0,Ni(O),Ha(),Q=!1)},J={p:v,um:Oe,m:De,r:Rt,mt:we,mc:ae,pc:re,pbc:W,n:N,o:e};return{render:K,hydrate:void 0,createApp:Kd(K)}}function Xo({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function hn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function cf(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function gc(e,t,n=!1){const s=e.children,o=t.children;if(X(s)&&X(o))for(let r=0;r>1,e[n[l]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,i=n[r-1];r-- >0;)n[r]=i,i=t[i];return n}function yc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:yc(t)}function Wi(e){if(e)for(let t=0;te.__isSuspense;function df(e,t){t&&t.pendingBranch?X(e)?t.effects.push(...e):t.effects.push(e):xd(e)}const de=Symbol.for("v-fgt"),To=Symbol.for("v-txt"),Qe=Symbol.for("v-cmt"),Gs=Symbol.for("v-stc"),ds=[];let at=null;function A(e=!1){ds.push(at=e?null:[])}function ff(){ds.pop(),at=ds[ds.length-1]||null}let ys=1;function fo(e,t=!1){ys+=e,e<0&&at&&t&&(at.hasOnce=!0)}function _c(e){return e.dynamicChildren=ys>0?at||Pn:null,ff(),ys>0&&at&&at.push(e),e}function T(e,t,n,s,o,r){return _c(p(e,t,n,s,o,r,!0))}function ct(e,t,n,s,o){return _c(M(e,t,n,s,o,!0))}function po(e){return e?e.__v_isVNode===!0:!1}function bn(e,t){return e.type===t.type&&e.key===t.key}const xc=({key:e})=>e??null,Js=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Te(e)||je(e)||oe(e)?{i:lt,r:e,k:t,f:!!n}:e:null);function p(e,t=null,n=null,s=0,o=null,r=e===de?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&xc(t),ref:t&&Js(t),scopeId:qa,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:lt};return l?(ai(a,n),r&128&&e.normalize(a)):n&&(a.shapeFlag|=Te(n)?8:16),ys>0&&!i&&at&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&at.push(a),a}const M=pf;function pf(e,t=null,n=null,s=0,o=null,r=!1){if((!e||e===tc)&&(e=Qe),po(e)){const l=cn(e,t,!0);return n&&ai(l,n),ys>0&&!r&&at&&(l.shapeFlag&6?at[at.indexOf(e)]=l:at.push(l)),l.patchFlag=-2,l}if(Ef(e)&&(e=e.__vccOpts),t){t=hf(t);let{class:l,style:a}=t;l&&!Te(l)&&(t.class=Ae(l)),ge(a)&&(Zr(a)&&!X(a)&&(a=$e({},a)),t.style=$n(a))}const i=Te(e)?1:bc(e)?128:Wa(e)?64:ge(e)?4:oe(e)?2:0;return p(e,t,n,s,o,i,r,!0)}function hf(e){return e?Zr(e)||uc(e)?$e({},e):e:null}function cn(e,t,n=!1,s=!1){const{props:o,ref:r,patchFlag:i,children:l,transition:a}=e,d=t?gf(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&xc(d),ref:t&&t.ref?n&&r?X(r)?r.concat(Js(t)):[r,Js(t)]:Js(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==de?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&cn(e.ssContent),ssFallback:e.ssFallback&&cn(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&s&&gs(c,a.clone(c)),c}function Re(e=" ",t=0){return M(To,null,e,t)}function mf(e,t){const n=M(Gs,null,e);return n.staticCount=t,n}function ie(e="",t=!1){return t?(A(),ct(Qe,null,e)):M(Qe,null,e)}function Lt(e){return e==null||typeof e=="boolean"?M(Qe):X(e)?M(de,null,e.slice()):po(e)?Vt(e):M(To,null,String(e))}function Vt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:cn(e)}function ai(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(X(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),ai(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!uc(t)?t._ctx=lt:o===3&<&&(lt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else oe(t)?(t={default:t,_ctx:lt},n=32):(t=String(t),s&64?(n=16,t=[Re(t)]):n=8);e.children=t,e.shapeFlag|=n}function gf(...e){const t={};for(let n=0;nBe||lt;let ho,Ar;{const e=ko(),t=(n,s)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),r=>{o.length>1?o.forEach(i=>i(r)):o[0](r)}};ho=t("__VUE_INSTANCE_SETTERS__",n=>Be=n),Ar=t("__VUE_SSR_SETTERS__",n=>vs=n)}const Rs=e=>{const t=Be;return ho(e),e.scope.on(),()=>{e.scope.off(),ho(t)}},Ki=()=>{Be&&Be.scope.off(),ho(null)};function kc(e){return e.vnode.shapeFlag&4}let vs=!1;function _f(e,t=!1,n=!1){t&&Ar(t);const{props:s,children:o}=e.vnode,r=kc(e);ef(e,s,r,t),of(e,o,n||t);const i=r?xf(e,t):void 0;return t&&Ar(!1),i}function xf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ud);const{setup:s}=n;if(s){Gt();const o=e.setupContext=s.length>1?kf(e):null,r=Rs(e),i=As(s,e,0,[e.props,o]),l=ma(i);if(Jt(),r(),(l||e.sp)&&!cs(e)&&Ya(e),l){if(i.then(Ki,Ki),t)return i.then(a=>{zi(e,a)}).catch(a=>{Eo(a,e,0)});e.asyncDep=i}else zi(e,i)}else Sc(e)}function zi(e,t,n){oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ge(t)&&(e.setupState=Ma(t)),Sc(e)}function Sc(e,t,n){const s=e.type;e.render||(e.render=s.render||Ft);{const o=Rs(e);Gt();try{Bd(e)}finally{Jt(),o()}}}const wf={get(e,t){return Ue(e,"get",""),e[t]}};function kf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,wf),slots:e.slots,emit:e.emit,expose:t}}function Po(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ma(dd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in us)return us[n](e)},has(t,n){return n in t||n in us}})):e.proxy}function Sf(e,t=!0){return oe(e)?e.displayName||e.name:e.name||t&&e.__name}function Ef(e){return oe(e)&&"__vccOpts"in e}const be=(e,t)=>gd(e,t,vs);function bs(e,t,n){try{fo(-1);const s=arguments.length;return s===2?ge(t)&&!X(t)?po(t)?M(e,null,[t]):M(e,t):M(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&po(n)&&(n=[n]),M(e,t,n))}finally{fo(1)}}const Af="3.5.28";/** +**/function As(e,t,n,s){try{return s?e(...s):e()}catch(o){Eo(o,t,n)}}function wt(e,t,n,s){if(oe(e)){const o=As(e,t,n,s);return o&&ma(o)&&o.catch(r=>{Eo(r,t,n)}),o}if(X(e)){const o=[];for(let r=0;r>>1,o=ze[s],r=ms(o);r=ms(n)?ze.push(e):ze.splice(_d(t),0,e),e.flags|=1,Ba()}}function Ba(){io||(io=Ua.then(ja))}function xd(e){X(e)?Dn.push(...e):on&&e.id===-1?on.splice(Cn+1,0,e):e.flags&1||(Dn.push(e),e.flags|=1),Ba()}function Ni(e,t,n=It+1){for(;nms(n)-ms(s));if(Dn.length=0,on){on.push(...t);return}for(on=t,Cn=0;Cne.id==null?e.flags&2?-1:1/0:e.id;function ja(e){try{for(It=0;It{s._d&&fo(-1);const r=lo(t);let i;try{i=e(...o)}finally{lo(r),s._d&&fo(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function Ee(e,t){if(lt===null)return e;const n=Po(lt),s=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&oe(t)?t.call(s&&s.proxy):t}}const wd=Symbol.for("v-scx"),kd=()=>_t(wd);function js(e,t){return ni(e,null,t)}function Mt(e,t,n){return ni(e,t,n)}function ni(e,t,n=xe){const{immediate:s,deep:o,flush:r,once:i}=n,l=$e({},n),a=t&&s||!t&&r!=="post";let d;if(vs){if(r==="sync"){const b=kd();d=b.__watcherHandles||(b.__watcherHandles=[])}else if(!a){const b=()=>{};return b.stop=Ft,b.resume=Ft,b.pause=Ft,b}}const c=Be;l.call=(b,y,v)=>wt(b,c,y,v);let f=!1;r==="post"?l.scheduler=b=>{Ze(b,c&&c.suspense)}:r!=="sync"&&(f=!0,l.scheduler=(b,y)=>{y?b():ti(b)}),l.augmentJob=b=>{t&&(b.flags|=4),f&&(b.flags|=2,c&&(b.id=c.uid,b.i=c))};const m=vd(e,t,l);return vs&&(d?d.push(m):a&&m()),m}function Sd(e,t,n){const s=this.proxy,o=Te(e)?e.includes(".")?Va(s,e):()=>s[e]:e.bind(s,s);let r;oe(t)?r=t:(r=t.handler,n=t);const i=Rs(this),l=ni(o,r.bind(s),n);return i(),l}function Va(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;oe.__isTeleport,$t=Symbol("_leaveCb"),Yn=Symbol("_enterCb");function Ad(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Zt(()=>{e.isMounted=!0}),oi(()=>{e.isUnmounting=!0}),e}const ft=[Function,Array],Ka={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ft,onEnter:ft,onAfterEnter:ft,onEnterCancelled:ft,onBeforeLeave:ft,onLeave:ft,onAfterLeave:ft,onLeaveCancelled:ft,onBeforeAppear:ft,onAppear:ft,onAfterAppear:ft,onAppearCancelled:ft},za=e=>{const t=e.subTree;return t.component?za(t.component):t},Rd={name:"BaseTransition",props:Ka,setup(e,{slots:t}){const n=wc(),s=Ad();return()=>{const o=t.default&&Ja(t.default(),!0);if(!o||!o.length)return;const r=Qa(o),i=pe(e),{mode:l}=i;if(s.isLeaving)return Jo(r);const a=Ii(r);if(!a)return Jo(r);let d=_r(a,i,s,n,f=>d=f);a.type!==Qe&&gs(a,d);let c=n.subTree&&Ii(n.subTree);if(c&&c.type!==Qe&&!bn(c,a)&&za(n).type!==Qe){let f=_r(c,i,s,n);if(gs(c,f),l==="out-in"&&a.type!==Qe)return s.isLeaving=!0,f.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,c=void 0},Jo(r);l==="in-out"&&a.type!==Qe?f.delayLeave=(m,b,y)=>{const v=Ga(s,c);v[String(c.key)]=c,m[$t]=()=>{b(),m[$t]=void 0,delete d.delayedLeave,c=void 0},d.delayedLeave=()=>{y(),delete d.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return r}}};function Qa(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Qe){t=n;break}}return t}const Cd=Rd;function Ga(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function _r(e,t,n,s,o){const{appear:r,mode:i,persisted:l=!1,onBeforeEnter:a,onEnter:d,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:m,onLeave:b,onAfterLeave:y,onLeaveCancelled:v,onBeforeAppear:h,onAppear:k,onAfterAppear:R,onAppearCancelled:S}=t,C=String(e.key),L=Ga(n,e),P=($,K)=>{$&&wt($,s,9,K)},U=($,K)=>{const H=K[1];P($,K),X($)?$.every(q=>q.length<=1)&&H():$.length<=1&&H()},ae={mode:i,persisted:l,beforeEnter($){let K=a;if(!n.isMounted)if(r)K=h||a;else return;$[$t]&&$[$t](!0);const H=L[C];H&&bn(e,H)&&H.el[$t]&&H.el[$t](),P(K,[$])},enter($){let K=d,H=c,q=f;if(!n.isMounted)if(r)K=k||d,H=R||c,q=S||f;else return;let se=!1;$[Yn]=Me=>{se||(se=!0,Me?P(q,[$]):P(H,[$]),ae.delayedLeave&&ae.delayedLeave(),$[Yn]=void 0)};const we=$[Yn].bind(null,!1);K?U(K,[$,we]):we()},leave($,K){const H=String(e.key);if($[Yn]&&$[Yn](!0),n.isUnmounting)return K();P(m,[$]);let q=!1;$[$t]=we=>{q||(q=!0,K(),we?P(v,[$]):P(y,[$]),$[$t]=void 0,L[H]===e&&delete L[H])};const se=$[$t].bind(null,!1);L[H]=e,b?U(b,[$,se]):se()},clone($){const K=_r($,t,n,s,o);return o&&o(K),K}};return ae}function Jo(e){if(Ao(e))return e=cn(e),e.children=null,e}function Ii(e){if(!Ao(e))return Wa(e.type)&&e.children?Qa(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&oe(n.default))return n.default()}}function gs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,gs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ja(e,t=!1,n){let s=[],o=0;for(let r=0;r1)for(let r=0;ras(v,t&&(X(t)?t[h]:t),n,s,o));return}if(cs(s)&&!o){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&as(e,t,n,s.component.subTree);return}const r=s.shapeFlag&4?Po(s.component):s.el,i=o?null:r,{i:l,r:a}=e,d=t&&t.r,c=l.refs===xe?l.refs={}:l.refs,f=l.setupState,m=pe(f),b=f===xe?ha:v=>$i(c,v)?!1:me(m,v),y=(v,h)=>!(h&&$i(c,h));if(d!=null&&d!==a){if(Li(t),Te(d))c[d]=null,b(d)&&(f[d]=null);else if(je(d)){const v=t;y(d,v.k)&&(d.value=null),v.k&&(c[v.k]=null)}}if(oe(a))As(a,l,12,[i,c]);else{const v=Te(a),h=je(a);if(v||h){const k=()=>{if(e.f){const R=v?b(a)?f[a]:c[a]:y()||!e.k?a.value:c[e.k];if(o)X(R)&&Vr(R,r);else if(X(R))R.includes(r)||R.push(r);else if(v)c[a]=[r],b(a)&&(f[a]=c[a]);else{const S=[r];y(a,e.k)&&(a.value=S),e.k&&(c[e.k]=S)}}else v?(c[a]=i,b(a)&&(f[a]=i)):h&&(y(a,e.k)&&(a.value=i),e.k&&(c[e.k]=i))};if(i){const R=()=>{k(),co.delete(e)};R.id=-1,co.set(e,R),Ze(R,n)}else Li(e),k()}}}function Li(e){const t=co.get(e);t&&(t.flags|=8,co.delete(e))}ko().requestIdleCallback;ko().cancelIdleCallback;const cs=e=>!!e.type.__asyncLoader,Ao=e=>e.type.__isKeepAlive;function Td(e,t){Xa(e,"a",t)}function Pd(e,t){Xa(e,"da",t)}function Xa(e,t,n=Be){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ro(t,s,n),n){let o=n.parent;for(;o&&o.parent;)Ao(o.parent.vnode)&&Od(s,t,n,o),o=o.parent}}function Od(e,t,n,s){const o=Ro(t,e,s,!0);ri(()=>{Vr(s[t],o)},n)}function Ro(e,t,n=Be,s=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...i)=>{Gt();const l=Rs(n),a=wt(t,n,e,i);return l(),Jt(),a});return s?o.unshift(r):o.push(r),r}}const Xt=e=>(t,n=Be)=>{(!vs||e==="sp")&&Ro(e,(...s)=>t(...s),n)},Za=Xt("bm"),Zt=Xt("m"),Dd=Xt("bu"),Nd=Xt("u"),oi=Xt("bum"),ri=Xt("um"),Id=Xt("sp"),$d=Xt("rtg"),Ld=Xt("rtc");function Fd(e,t=Be){Ro("ec",e,t)}const ec="components";function xr(e,t){return nc(ec,e,!0,t)||e}const tc=Symbol.for("v-ndc");function Md(e){return Te(e)?nc(ec,e,!1)||e:e||tc}function nc(e,t,n=!0,s=!1){const o=lt||Be;if(o){const r=o.type;{const l=Sf(r,!1);if(l&&(l===t||l===mt(t)||l===xo(mt(t))))return r}const i=Fi(o[e]||r[e],t)||Fi(o.appContext[e],t);return!i&&s?r:i}}function Fi(e,t){return e&&(e[t]||e[mt(t)]||e[xo(mt(t))])}function Ie(e,t,n,s){let o;const r=n,i=X(e);if(i||Te(e)){const l=i&&kn(e);let a=!1,d=!1;l&&(a=!ht(e),d=Yt(e),e=So(e)),o=new Array(e.length);for(let c=0,f=e.length;ct(l,a,void 0,r));else{const l=Object.keys(e);o=new Array(l.length);for(let a=0,d=l.length;ae?kc(e)?Po(e):wr(e.parent):null,us=$e(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>wr(e.parent),$root:e=>wr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>oc(e),$forceUpdate:e=>e.f||(e.f=()=>{ti(e.update)}),$nextTick:e=>e.n||(e.n=ei.bind(e.proxy)),$watch:e=>Sd.bind(e)}),Yo=(e,t)=>e!==xe&&!e.__isScriptSetup&&me(e,t),Ud={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:o,props:r,accessCache:i,type:l,appContext:a}=e;if(t[0]!=="$"){const m=i[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return r[t]}else{if(Yo(s,t))return i[t]=1,s[t];if(o!==xe&&me(o,t))return i[t]=2,o[t];if(me(r,t))return i[t]=3,r[t];if(n!==xe&&me(n,t))return i[t]=4,n[t];kr&&(i[t]=0)}}const d=us[t];let c,f;if(d)return t==="$attrs"&&Ue(e.attrs,"get",""),d(e);if((c=l.__cssModules)&&(c=c[t]))return c;if(n!==xe&&me(n,t))return i[t]=4,n[t];if(f=a.config.globalProperties,me(f,t))return f[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:r}=e;return Yo(o,t)?(o[t]=n,!0):s!==xe&&me(s,t)?(s[t]=n,!0):me(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,props:r,type:i}},l){let a;return!!(n[l]||e!==xe&&l[0]!=="$"&&me(e,l)||Yo(t,l)||me(r,l)||me(s,l)||me(us,l)||me(o.config.globalProperties,l)||(a=i.__cssModules)&&a[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:me(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Mi(e){return X(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let kr=!0;function Bd(e){const t=oc(e),n=e.proxy,s=e.ctx;kr=!1,t.beforeCreate&&Ui(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:i,watch:l,provide:a,inject:d,created:c,beforeMount:f,mounted:m,beforeUpdate:b,updated:y,activated:v,deactivated:h,beforeDestroy:k,beforeUnmount:R,destroyed:S,unmounted:C,render:L,renderTracked:P,renderTriggered:U,errorCaptured:ae,serverPrefetch:$,expose:K,inheritAttrs:H,components:q,directives:se,filters:we}=t;if(d&&Hd(d,s,null),i)for(const fe in i){const re=i[fe];oe(re)&&(s[fe]=re.bind(n))}if(o){const fe=o.call(n,n);ge(fe)&&(e.data=Ln(fe))}if(kr=!0,r)for(const fe in r){const re=r[fe],ut=oe(re)?re.bind(n,n):oe(re.get)?re.get.bind(n,n):Ft,At=!oe(re)&&oe(re.set)?re.set.bind(n):Ft,De=be({get:ut,set:At});Object.defineProperty(s,fe,{enumerable:!0,configurable:!0,get:()=>De.value,set:Oe=>De.value=Oe})}if(l)for(const fe in l)sc(l[fe],s,n,fe);if(a){const fe=oe(a)?a.call(n):a;Reflect.ownKeys(fe).forEach(re=>{Qs(re,fe[re])})}c&&Ui(c,e,"c");function le(fe,re){X(re)?re.forEach(ut=>fe(ut.bind(n))):re&&fe(re.bind(n))}if(le(Za,f),le(Zt,m),le(Dd,b),le(Nd,y),le(Td,v),le(Pd,h),le(Fd,ae),le(Ld,P),le($d,U),le(oi,R),le(ri,C),le(Id,$),X(K))if(K.length){const fe=e.exposed||(e.exposed={});K.forEach(re=>{Object.defineProperty(fe,re,{get:()=>n[re],set:ut=>n[re]=ut,enumerable:!0})})}else e.exposed||(e.exposed={});L&&e.render===Ft&&(e.render=L),H!=null&&(e.inheritAttrs=H),q&&(e.components=q),se&&(e.directives=se),$&&Ya(e)}function Hd(e,t,n=Ft){X(e)&&(e=Sr(e));for(const s in e){const o=e[s];let r;ge(o)?"default"in o?r=_t(o.from||s,o.default,!0):r=_t(o.from||s):r=_t(o),je(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:i=>r.value=i}):t[s]=r}}function Ui(e,t,n){wt(X(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function sc(e,t,n,s){let o=s.includes(".")?Va(n,s):()=>n[s];if(Te(e)){const r=t[e];oe(r)&&Mt(o,r)}else if(oe(e))Mt(o,e.bind(n));else if(ge(e))if(X(e))e.forEach(r=>sc(r,t,n,s));else{const r=oe(e.handler)?e.handler.bind(n):t[e.handler];oe(r)&&Mt(o,r,e)}}function oc(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:i}}=e.appContext,l=r.get(t);let a;return l?a=l:!o.length&&!n&&!s?a=t:(a={},o.length&&o.forEach(d=>uo(a,d,i,!0)),uo(a,t,i)),ge(t)&&r.set(t,a),a}function uo(e,t,n,s=!1){const{mixins:o,extends:r}=t;r&&uo(e,r,n,!0),o&&o.forEach(i=>uo(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=jd[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const jd={data:Bi,props:Hi,emits:Hi,methods:os,computed:os,beforeCreate:Ve,created:Ve,beforeMount:Ve,mounted:Ve,beforeUpdate:Ve,updated:Ve,beforeDestroy:Ve,beforeUnmount:Ve,destroyed:Ve,unmounted:Ve,activated:Ve,deactivated:Ve,errorCaptured:Ve,serverPrefetch:Ve,components:os,directives:os,watch:Vd,provide:Bi,inject:qd};function Bi(e,t){return t?e?function(){return $e(oe(e)?e.call(this,this):e,oe(t)?t.call(this,this):t)}:t:e}function qd(e,t){return os(Sr(e),Sr(t))}function Sr(e){if(X(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${mt(t)}Modifiers`]||e[`${fn(t)}Modifiers`];function Qd(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||xe;let o=n;const r=t.startsWith("update:"),i=r&&zd(s,t.slice(7));i&&(i.trim&&(o=n.map(c=>Te(c)?c.trim():c)),i.number&&(o=n.map(wo)));let l,a=s[l=Wo(t)]||s[l=Wo(mt(t))];!a&&r&&(a=s[l=Wo(fn(t))]),a&&wt(a,e,6,o);const d=s[l+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,wt(d,e,6,o)}}const Gd=new WeakMap;function ic(e,t,n=!1){const s=n?Gd:t.emitsCache,o=s.get(e);if(o!==void 0)return o;const r=e.emits;let i={},l=!1;if(!oe(e)){const a=d=>{const c=ic(d,t,!0);c&&(l=!0,$e(i,c))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!l?(ge(e)&&s.set(e,null),null):(X(r)?r.forEach(a=>i[a]=null):$e(i,r),ge(e)&&s.set(e,i),i)}function Co(e,t){return!e||!bo(t)?!1:(t=t.slice(2).replace(/Once$/,""),me(e,t[0].toLowerCase()+t.slice(1))||me(e,fn(t))||me(e,t))}function ji(e){const{type:t,vnode:n,proxy:s,withProxy:o,propsOptions:[r],slots:i,attrs:l,emit:a,render:d,renderCache:c,props:f,data:m,setupState:b,ctx:y,inheritAttrs:v}=e,h=lo(e);let k,R;try{if(n.shapeFlag&4){const C=o||s,L=C;k=Lt(d.call(L,C,c,f,b,m,y)),R=l}else{const C=t;k=Lt(C.length>1?C(f,{attrs:l,slots:i,emit:a}):C(f,null)),R=t.props?l:Jd(l)}}catch(C){ds.length=0,Eo(C,e,1),k=M(Qe)}let S=k;if(R&&v!==!1){const C=Object.keys(R),{shapeFlag:L}=S;C.length&&L&7&&(r&&C.some(qr)&&(R=Yd(R,r)),S=cn(S,R,!1,!0))}return n.dirs&&(S=cn(S,null,!1,!0),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&gs(S,n.transition),k=S,lo(h),k}const Jd=e=>{let t;for(const n in e)(n==="class"||n==="style"||bo(n))&&((t||(t={}))[n]=e[n]);return t},Yd=(e,t)=>{const n={};for(const s in e)(!qr(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Xd(e,t,n){const{props:s,children:o,component:r}=e,{props:i,children:l,patchFlag:a}=t,d=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return s?qi(s,i,d):!!i;if(a&8){const c=t.dynamicProps;for(let f=0;fObject.create(ac),uc=e=>Object.getPrototypeOf(e)===ac;function ef(e,t,n,s=!1){const o={},r=cc();e.propsDefaults=Object.create(null),dc(e,t,o,r);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=s?o:La(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function tf(e,t,n,s){const{props:o,attrs:r,vnode:{patchFlag:i}}=e,l=pe(o),[a]=e.propsOptions;let d=!1;if((s||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[m,b]=fc(f,t,!0);$e(i,m),b&&l.push(...b)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!r&&!a)return ge(e)&&s.set(e,Pn),Pn;if(X(r))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",li=e=>X(e)?e.map(Lt):[Lt(e)],sf=(e,t,n)=>{if(t._n)return t;const s=ao((...o)=>li(t(...o)),n);return s._c=!1,s},pc=(e,t,n)=>{const s=e._ctx;for(const o in e){if(ii(o))continue;const r=e[o];if(oe(r))t[o]=sf(o,r,s);else if(r!=null){const i=li(r);t[o]=()=>i}}},hc=(e,t)=>{const n=li(t);e.slots.default=()=>n},mc=(e,t,n)=>{for(const s in t)(n||!ii(s))&&(e[s]=t[s])},of=(e,t,n)=>{const s=e.slots=cc();if(e.vnode.shapeFlag&32){const o=t._;o?(mc(s,t,n),n&&va(s,"_",o,!0)):pc(t,s)}else t&&hc(e,t)},rf=(e,t,n)=>{const{vnode:s,slots:o}=e;let r=!0,i=xe;if(s.shapeFlag&32){const l=t._;l?n&&l===1?r=!1:mc(o,t,n):(r=!t.$stable,pc(t,o)),i=t}else t&&(hc(e,t),i={default:1});if(r)for(const l in o)!ii(l)&&i[l]==null&&delete o[l]},Ze=df;function lf(e){return af(e)}function af(e,t){const n=ko();n.__VUE__=!0;const{insert:s,remove:o,patchProp:r,createElement:i,createText:l,createComment:a,setText:d,setElementText:c,parentNode:f,nextSibling:m,setScopeId:b=Ft,insertStaticContent:y}=e,v=(g,_,x,O=null,I=null,D=null,V=void 0,j=null,B=!!_.dynamicChildren)=>{if(g===_)return;g&&!bn(g,_)&&(O=N(g),Oe(g,I,D,!0),g=null),_.patchFlag===-2&&(B=!1,_.dynamicChildren=null);const{type:F,ref:Z,shapeFlag:z}=_;switch(F){case To:h(g,_,x,O);break;case Qe:k(g,_,x,O);break;case Gs:g==null&&R(_,x,O,V);break;case de:q(g,_,x,O,I,D,V,j,B);break;default:z&1?L(g,_,x,O,I,D,V,j,B):z&6?se(g,_,x,O,I,D,V,j,B):(z&64||z&128)&&F.process(g,_,x,O,I,D,V,j,B,J)}Z!=null&&I?as(Z,g&&g.ref,D,_||g,!_):Z==null&&g&&g.ref!=null&&as(g.ref,null,D,g,!0)},h=(g,_,x,O)=>{if(g==null)s(_.el=l(_.children),x,O);else{const I=_.el=g.el;_.children!==g.children&&d(I,_.children)}},k=(g,_,x,O)=>{g==null?s(_.el=a(_.children||""),x,O):_.el=g.el},R=(g,_,x,O)=>{[g.el,g.anchor]=y(g.children,_,x,O,g.el,g.anchor)},S=({el:g,anchor:_},x,O)=>{let I;for(;g&&g!==_;)I=m(g),s(g,x,O),g=I;s(_,x,O)},C=({el:g,anchor:_})=>{let x;for(;g&&g!==_;)x=m(g),o(g),g=x;o(_)},L=(g,_,x,O,I,D,V,j,B)=>{if(_.type==="svg"?V="svg":_.type==="math"&&(V="mathml"),g==null)P(_,x,O,I,D,V,j,B);else{const F=g.el&&g.el._isVueCE?g.el:null;try{F&&F._beginPatch(),$(g,_,I,D,V,j,B)}finally{F&&F._endPatch()}}},P=(g,_,x,O,I,D,V,j)=>{let B,F;const{props:Z,shapeFlag:z,transition:Y,dirs:ne}=g;if(B=g.el=i(g.type,D,Z&&Z.is,Z),z&8?c(B,g.children):z&16&&ae(g.children,B,null,O,I,Xo(g,D),V,j),ne&&pn(g,null,O,"created"),U(B,g,g.scopeId,V,O),Z){for(const ke in Z)ke!=="value"&&!rs(ke)&&r(B,ke,null,Z[ke],D,O);"value"in Z&&r(B,"value",null,Z.value,D),(F=Z.onVnodeBeforeMount)&&Dt(F,O,g)}ne&&pn(g,null,O,"beforeMount");const ue=cf(I,Y);ue&&Y.beforeEnter(B),s(B,_,x),((F=Z&&Z.onVnodeMounted)||ue||ne)&&Ze(()=>{F&&Dt(F,O,g),ue&&Y.enter(B),ne&&pn(g,null,O,"mounted")},I)},U=(g,_,x,O,I)=>{if(x&&b(g,x),O)for(let D=0;D{for(let F=B;F{const j=_.el=g.el;let{patchFlag:B,dynamicChildren:F,dirs:Z}=_;B|=g.patchFlag&16;const z=g.props||xe,Y=_.props||xe;let ne;if(x&&hn(x,!1),(ne=Y.onVnodeBeforeUpdate)&&Dt(ne,x,_,g),Z&&pn(_,g,x,"beforeUpdate"),x&&hn(x,!0),(z.innerHTML&&Y.innerHTML==null||z.textContent&&Y.textContent==null)&&c(j,""),F?K(g.dynamicChildren,F,j,x,O,Xo(_,I),D):V||re(g,_,j,null,x,O,Xo(_,I),D,!1),B>0){if(B&16)H(j,z,Y,x,I);else if(B&2&&z.class!==Y.class&&r(j,"class",null,Y.class,I),B&4&&r(j,"style",z.style,Y.style,I),B&8){const ue=_.dynamicProps;for(let ke=0;ke{ne&&Dt(ne,x,_,g),Z&&pn(_,g,x,"updated")},O)},K=(g,_,x,O,I,D,V)=>{for(let j=0;j<_.length;j++){const B=g[j],F=_[j],Z=B.el&&(B.type===de||!bn(B,F)||B.shapeFlag&198)?f(B.el):x;v(B,F,Z,null,O,I,D,V,!0)}},H=(g,_,x,O,I)=>{if(_!==x){if(_!==xe)for(const D in _)!rs(D)&&!(D in x)&&r(g,D,_[D],null,I,O);for(const D in x){if(rs(D))continue;const V=x[D],j=_[D];V!==j&&D!=="value"&&r(g,D,j,V,I,O)}"value"in x&&r(g,"value",_.value,x.value,I)}},q=(g,_,x,O,I,D,V,j,B)=>{const F=_.el=g?g.el:l(""),Z=_.anchor=g?g.anchor:l("");let{patchFlag:z,dynamicChildren:Y,slotScopeIds:ne}=_;ne&&(j=j?j.concat(ne):ne),g==null?(s(F,x,O),s(Z,x,O),ae(_.children||[],x,Z,I,D,V,j,B)):z>0&&z&64&&Y&&g.dynamicChildren&&g.dynamicChildren.length===Y.length?(K(g.dynamicChildren,Y,x,I,D,V,j),(_.key!=null||I&&_===I.subTree)&&gc(g,_,!0)):re(g,_,x,Z,I,D,V,j,B)},se=(g,_,x,O,I,D,V,j,B)=>{_.slotScopeIds=j,g==null?_.shapeFlag&512?I.ctx.activate(_,x,O,V,B):we(_,x,O,I,D,V,B):Me(g,_,B)},we=(g,_,x,O,I,D,V)=>{const j=g.component=bf(g,O,I);if(Ao(g)&&(j.ctx.renderer=J),_f(j,!1,V),j.asyncDep){if(I&&I.registerDep(j,le,V),!g.el){const B=j.subTree=M(Qe);k(null,B,_,x),g.placeholder=B.el}}else le(j,g,_,x,I,D,V)},Me=(g,_,x)=>{const O=_.component=g.component;if(Xd(g,_,x))if(O.asyncDep&&!O.asyncResolved){fe(O,_,x);return}else O.next=_,O.update();else _.el=g.el,O.vnode=_},le=(g,_,x,O,I,D,V)=>{const j=()=>{if(g.isMounted){let{next:z,bu:Y,u:ne,parent:ue,vnode:ke}=g;{const Pt=yc(g);if(Pt){z&&(z.el=ke.el,fe(g,z,V)),Pt.asyncDep.then(()=>{Ze(()=>{g.isUnmounted||F()},I)});return}}let ye=z,Ye;hn(g,!1),z?(z.el=ke.el,fe(g,z,V)):z=ke,Y&&zs(Y),(Ye=z.props&&z.props.onVnodeBeforeUpdate)&&Dt(Ye,ue,z,ke),hn(g,!0);const Xe=ji(g),Tt=g.subTree;g.subTree=Xe,v(Tt,Xe,f(Tt.el),N(Tt),g,I,D),z.el=Xe.el,ye===null&&Zd(g,Xe.el),ne&&Ze(ne,I),(Ye=z.props&&z.props.onVnodeUpdated)&&Ze(()=>Dt(Ye,ue,z,ke),I)}else{let z;const{el:Y,props:ne}=_,{bm:ue,m:ke,parent:ye,root:Ye,type:Xe}=g,Tt=cs(_);hn(g,!1),ue&&zs(ue),!Tt&&(z=ne&&ne.onVnodeBeforeMount)&&Dt(z,ye,_),hn(g,!0);{Ye.ce&&Ye.ce._hasShadowRoot()&&Ye.ce._injectChildStyle(Xe);const Pt=g.subTree=ji(g);v(null,Pt,x,O,g,I,D),_.el=Pt.el}if(ke&&Ze(ke,I),!Tt&&(z=ne&&ne.onVnodeMounted)){const Pt=_;Ze(()=>Dt(z,ye,Pt),I)}(_.shapeFlag&256||ye&&cs(ye.vnode)&&ye.vnode.shapeFlag&256)&&g.a&&Ze(g.a,I),g.isMounted=!0,_=x=O=null}};g.scope.on();const B=g.effect=new wa(j);g.scope.off();const F=g.update=B.run.bind(B),Z=g.job=B.runIfDirty.bind(B);Z.i=g,Z.id=g.uid,B.scheduler=()=>ti(Z),hn(g,!0),F()},fe=(g,_,x)=>{_.component=g;const O=g.vnode.props;g.vnode=_,g.next=null,tf(g,_.props,O,x),rf(g,_.children,x),Gt(),Ni(g),Jt()},re=(g,_,x,O,I,D,V,j,B=!1)=>{const F=g&&g.children,Z=g?g.shapeFlag:0,z=_.children,{patchFlag:Y,shapeFlag:ne}=_;if(Y>0){if(Y&128){At(F,z,x,O,I,D,V,j,B);return}else if(Y&256){ut(F,z,x,O,I,D,V,j,B);return}}ne&8?(Z&16&&dt(F,I,D),z!==F&&c(x,z)):Z&16?ne&16?At(F,z,x,O,I,D,V,j,B):dt(F,I,D,!0):(Z&8&&c(x,""),ne&16&&ae(z,x,O,I,D,V,j,B))},ut=(g,_,x,O,I,D,V,j,B)=>{g=g||Pn,_=_||Pn;const F=g.length,Z=_.length,z=Math.min(F,Z);let Y;for(Y=0;YZ?dt(g,I,D,!0,!1,z):ae(_,x,O,I,D,V,j,B,z)},At=(g,_,x,O,I,D,V,j,B)=>{let F=0;const Z=_.length;let z=g.length-1,Y=Z-1;for(;F<=z&&F<=Y;){const ne=g[F],ue=_[F]=B?Vt(_[F]):Lt(_[F]);if(bn(ne,ue))v(ne,ue,x,null,I,D,V,j,B);else break;F++}for(;F<=z&&F<=Y;){const ne=g[z],ue=_[Y]=B?Vt(_[Y]):Lt(_[Y]);if(bn(ne,ue))v(ne,ue,x,null,I,D,V,j,B);else break;z--,Y--}if(F>z){if(F<=Y){const ne=Y+1,ue=neY)for(;F<=z;)Oe(g[F],I,D,!0),F++;else{const ne=F,ue=F,ke=new Map;for(F=ue;F<=Y;F++){const ot=_[F]=B?Vt(_[F]):Lt(_[F]);ot.key!=null&&ke.set(ot.key,F)}let ye,Ye=0;const Xe=Y-ue+1;let Tt=!1,Pt=0;const Gn=new Array(Xe);for(F=0;F=Xe){Oe(ot,I,D,!0);continue}let Ot;if(ot.key!=null)Ot=ke.get(ot.key);else for(ye=ue;ye<=Y;ye++)if(Gn[ye-ue]===0&&bn(ot,_[ye])){Ot=ye;break}Ot===void 0?Oe(ot,I,D,!0):(Gn[Ot-ue]=F+1,Ot>=Pt?Pt=Ot:Tt=!0,v(ot,_[Ot],x,null,I,D,V,j,B),Ye++)}const Ai=Tt?uf(Gn):Pn;for(ye=Ai.length-1,F=Xe-1;F>=0;F--){const ot=ue+F,Ot=_[ot],Ri=_[ot+1],Ci=ot+1{const{el:D,type:V,transition:j,children:B,shapeFlag:F}=g;if(F&6){De(g.component.subTree,_,x,O);return}if(F&128){g.suspense.move(_,x,O);return}if(F&64){V.move(g,_,x,J);return}if(V===de){s(D,_,x);for(let z=0;zj.enter(D),I);else{const{leave:z,delayLeave:Y,afterLeave:ne}=j,ue=()=>{g.ctx.isUnmounted?o(D):s(D,_,x)},ke=()=>{D._isLeaving&&D[$t](!0),z(D,()=>{ue(),ne&&ne()})};Y?Y(D,ue,ke):ke()}else s(D,_,x)},Oe=(g,_,x,O=!1,I=!1)=>{const{type:D,props:V,ref:j,children:B,dynamicChildren:F,shapeFlag:Z,patchFlag:z,dirs:Y,cacheIndex:ne}=g;if(z===-2&&(I=!1),j!=null&&(Gt(),as(j,null,x,g,!0),Jt()),ne!=null&&(_.renderCache[ne]=void 0),Z&256){_.ctx.deactivate(g);return}const ue=Z&1&&Y,ke=!cs(g);let ye;if(ke&&(ye=V&&V.onVnodeBeforeUnmount)&&Dt(ye,_,g),Z&6)Ct(g.component,x,O);else{if(Z&128){g.suspense.unmount(x,O);return}ue&&pn(g,null,_,"beforeUnmount"),Z&64?g.type.remove(g,_,x,J,O):F&&!F.hasOnce&&(D!==de||z>0&&z&64)?dt(F,_,x,!1,!0):(D===de&&z&384||!I&&Z&16)&&dt(B,_,x),O&&Rt(g)}(ke&&(ye=V&&V.onVnodeUnmounted)||ue)&&Ze(()=>{ye&&Dt(ye,_,g),ue&&pn(g,null,_,"unmounted")},x)},Rt=g=>{const{type:_,el:x,anchor:O,transition:I}=g;if(_===de){gt(x,O);return}if(_===Gs){C(g);return}const D=()=>{o(x),I&&!I.persisted&&I.afterLeave&&I.afterLeave()};if(g.shapeFlag&1&&I&&!I.persisted){const{leave:V,delayLeave:j}=I,B=()=>V(x,D);j?j(g.el,D,B):B()}else D()},gt=(g,_)=>{let x;for(;g!==_;)x=m(g),o(g),g=x;o(_)},Ct=(g,_,x)=>{const{bum:O,scope:I,job:D,subTree:V,um:j,m:B,a:F}=g;Wi(B),Wi(F),O&&zs(O),I.stop(),D&&(D.flags|=8,Oe(V,g,_,x)),j&&Ze(j,_),Ze(()=>{g.isUnmounted=!0},_)},dt=(g,_,x,O=!1,I=!1,D=0)=>{for(let V=D;V{if(g.shapeFlag&6)return N(g.component.subTree);if(g.shapeFlag&128)return g.suspense.next();const _=m(g.anchor||g.el),x=_&&_[Ed];return x?m(x):_};let Q=!1;const W=(g,_,x)=>{let O;g==null?_._vnode&&(Oe(_._vnode,null,null,!0),O=_._vnode.component):v(_._vnode||null,g,_,null,null,null,x),_._vnode=g,Q||(Q=!0,Ni(O),Ha(),Q=!1)},J={p:v,um:Oe,m:De,r:Rt,mt:we,mc:ae,pc:re,pbc:K,n:N,o:e};return{render:W,hydrate:void 0,createApp:Kd(W)}}function Xo({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function hn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function cf(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function gc(e,t,n=!1){const s=e.children,o=t.children;if(X(s)&&X(o))for(let r=0;r>1,e[n[l]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,i=n[r-1];r-- >0;)n[r]=i,i=t[i];return n}function yc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:yc(t)}function Wi(e){if(e)for(let t=0;te.__isSuspense;function df(e,t){t&&t.pendingBranch?X(e)?t.effects.push(...e):t.effects.push(e):xd(e)}const de=Symbol.for("v-fgt"),To=Symbol.for("v-txt"),Qe=Symbol.for("v-cmt"),Gs=Symbol.for("v-stc"),ds=[];let at=null;function A(e=!1){ds.push(at=e?null:[])}function ff(){ds.pop(),at=ds[ds.length-1]||null}let ys=1;function fo(e,t=!1){ys+=e,e<0&&at&&t&&(at.hasOnce=!0)}function _c(e){return e.dynamicChildren=ys>0?at||Pn:null,ff(),ys>0&&at&&at.push(e),e}function T(e,t,n,s,o,r){return _c(p(e,t,n,s,o,r,!0))}function ct(e,t,n,s,o){return _c(M(e,t,n,s,o,!0))}function po(e){return e?e.__v_isVNode===!0:!1}function bn(e,t){return e.type===t.type&&e.key===t.key}const xc=({key:e})=>e??null,Js=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Te(e)||je(e)||oe(e)?{i:lt,r:e,k:t,f:!!n}:e:null);function p(e,t=null,n=null,s=0,o=null,r=e===de?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&xc(t),ref:t&&Js(t),scopeId:qa,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:lt};return l?(ai(a,n),r&128&&e.normalize(a)):n&&(a.shapeFlag|=Te(n)?8:16),ys>0&&!i&&at&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&at.push(a),a}const M=pf;function pf(e,t=null,n=null,s=0,o=null,r=!1){if((!e||e===tc)&&(e=Qe),po(e)){const l=cn(e,t,!0);return n&&ai(l,n),ys>0&&!r&&at&&(l.shapeFlag&6?at[at.indexOf(e)]=l:at.push(l)),l.patchFlag=-2,l}if(Ef(e)&&(e=e.__vccOpts),t){t=hf(t);let{class:l,style:a}=t;l&&!Te(l)&&(t.class=Ae(l)),ge(a)&&(Zr(a)&&!X(a)&&(a=$e({},a)),t.style=$n(a))}const i=Te(e)?1:bc(e)?128:Wa(e)?64:ge(e)?4:oe(e)?2:0;return p(e,t,n,s,o,i,r,!0)}function hf(e){return e?Zr(e)||uc(e)?$e({},e):e:null}function cn(e,t,n=!1,s=!1){const{props:o,ref:r,patchFlag:i,children:l,transition:a}=e,d=t?gf(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&xc(d),ref:t&&t.ref?n&&r?X(r)?r.concat(Js(t)):[r,Js(t)]:Js(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==de?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&cn(e.ssContent),ssFallback:e.ssFallback&&cn(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&s&&gs(c,a.clone(c)),c}function Re(e=" ",t=0){return M(To,null,e,t)}function mf(e,t){const n=M(Gs,null,e);return n.staticCount=t,n}function ie(e="",t=!1){return t?(A(),ct(Qe,null,e)):M(Qe,null,e)}function Lt(e){return e==null||typeof e=="boolean"?M(Qe):X(e)?M(de,null,e.slice()):po(e)?Vt(e):M(To,null,String(e))}function Vt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:cn(e)}function ai(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(X(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),ai(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!uc(t)?t._ctx=lt:o===3&<&&(lt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else oe(t)?(t={default:t,_ctx:lt},n=32):(t=String(t),s&64?(n=16,t=[Re(t)]):n=8);e.children=t,e.shapeFlag|=n}function gf(...e){const t={};for(let n=0;nBe||lt;let ho,Ar;{const e=ko(),t=(n,s)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),r=>{o.length>1?o.forEach(i=>i(r)):o[0](r)}};ho=t("__VUE_INSTANCE_SETTERS__",n=>Be=n),Ar=t("__VUE_SSR_SETTERS__",n=>vs=n)}const Rs=e=>{const t=Be;return ho(e),e.scope.on(),()=>{e.scope.off(),ho(t)}},Ki=()=>{Be&&Be.scope.off(),ho(null)};function kc(e){return e.vnode.shapeFlag&4}let vs=!1;function _f(e,t=!1,n=!1){t&&Ar(t);const{props:s,children:o}=e.vnode,r=kc(e);ef(e,s,r,t),of(e,o,n||t);const i=r?xf(e,t):void 0;return t&&Ar(!1),i}function xf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ud);const{setup:s}=n;if(s){Gt();const o=e.setupContext=s.length>1?kf(e):null,r=Rs(e),i=As(s,e,0,[e.props,o]),l=ma(i);if(Jt(),r(),(l||e.sp)&&!cs(e)&&Ya(e),l){if(i.then(Ki,Ki),t)return i.then(a=>{zi(e,a)}).catch(a=>{Eo(a,e,0)});e.asyncDep=i}else zi(e,i)}else Sc(e)}function zi(e,t,n){oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ge(t)&&(e.setupState=Ma(t)),Sc(e)}function Sc(e,t,n){const s=e.type;e.render||(e.render=s.render||Ft);{const o=Rs(e);Gt();try{Bd(e)}finally{Jt(),o()}}}const wf={get(e,t){return Ue(e,"get",""),e[t]}};function kf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,wf),slots:e.slots,emit:e.emit,expose:t}}function Po(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ma(dd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in us)return us[n](e)},has(t,n){return n in t||n in us}})):e.proxy}function Sf(e,t=!0){return oe(e)?e.displayName||e.name:e.name||t&&e.__name}function Ef(e){return oe(e)&&"__vccOpts"in e}const be=(e,t)=>gd(e,t,vs);function bs(e,t,n){try{fo(-1);const s=arguments.length;return s===2?ge(t)&&!X(t)?po(t)?M(e,null,[t]):M(e,t):M(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&po(n)&&(n=[n]),M(e,t,n))}finally{fo(1)}}const Af="3.5.28";/** * @vue/runtime-dom v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let Rr;const Qi=typeof window<"u"&&window.trustedTypes;if(Qi)try{Rr=Qi.createPolicy("vue",{createHTML:e=>e})}catch{}const Ec=Rr?e=>Rr.createHTML(e):e=>e,Rf="http://www.w3.org/2000/svg",Cf="http://www.w3.org/1998/Math/MathML",qt=typeof document<"u"?document:null,Gi=qt&&qt.createElement("template"),Tf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?qt.createElementNS(Rf,e):t==="mathml"?qt.createElementNS(Cf,e):n?qt.createElement(e,{is:n}):qt.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>qt.createTextNode(e),createComment:e=>qt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>qt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,r){const i=n?n.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===r||!(o=o.nextSibling)););else{Gi.innerHTML=Ec(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Gi.content;if(s==="svg"||s==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},en="transition",Xn="animation",_s=Symbol("_vtc"),Ac={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Pf=$e({},Ka,Ac),Of=e=>(e.displayName="Transition",e.props=Pf,e),Rc=Of((e,{slots:t})=>bs(Cd,Df(e),t)),mn=(e,t=[])=>{X(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ji=e=>e?X(e)?e.some(t=>t.length>1):e.length>1:!1;function Df(e){const t={};for(const q in e)q in Ac||(t[q]=e[q]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=r,appearActiveClass:d=i,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:b=`${n}-leave-to`}=e,y=Nf(o),v=y&&y[0],h=y&&y[1],{onBeforeEnter:k,onEnter:R,onEnterCancelled:S,onLeave:C,onLeaveCancelled:L,onBeforeAppear:P=k,onAppear:U=R,onAppearCancelled:ae=S}=t,$=(q,se,we,Me)=>{q._enterCancelled=Me,gn(q,se?c:l),gn(q,se?d:i),we&&we()},W=(q,se)=>{q._isLeaving=!1,gn(q,f),gn(q,b),gn(q,m),se&&se()},B=q=>(se,we)=>{const Me=q?U:R,le=()=>$(se,q,we);mn(Me,[se,le]),Yi(()=>{gn(se,q?a:r),Ht(se,q?c:l),Ji(Me)||Xi(se,s,v,le)})};return $e(t,{onBeforeEnter(q){mn(k,[q]),Ht(q,r),Ht(q,i)},onBeforeAppear(q){mn(P,[q]),Ht(q,a),Ht(q,d)},onEnter:B(!1),onAppear:B(!0),onLeave(q,se){q._isLeaving=!0;const we=()=>W(q,se);Ht(q,f),q._enterCancelled?(Ht(q,m),tl(q)):(tl(q),Ht(q,m)),Yi(()=>{q._isLeaving&&(gn(q,f),Ht(q,b),Ji(C)||Xi(q,s,h,we))}),mn(C,[q,we])},onEnterCancelled(q){$(q,!1,void 0,!0),mn(S,[q])},onAppearCancelled(q){$(q,!0,void 0,!0),mn(ae,[q])},onLeaveCancelled(q){W(q),mn(L,[q])}})}function Nf(e){if(e==null)return null;if(ge(e))return[Zo(e.enter),Zo(e.leave)];{const t=Zo(e);return[t,t]}}function Zo(e){return Fu(e)}function Ht(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[_s]||(e[_s]=new Set)).add(t)}function gn(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[_s];n&&(n.delete(t),n.size||(e[_s]=void 0))}function Yi(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let If=0;function Xi(e,t,n,s){const o=e._endId=++If,r=()=>{o===e._endId&&s()};if(n!=null)return setTimeout(r,n);const{type:i,timeout:l,propCount:a}=$f(e,t);if(!i)return s();const d=i+"end";let c=0;const f=()=>{e.removeEventListener(d,m),r()},m=b=>{b.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[y]||"").split(", "),o=s(`${en}Delay`),r=s(`${en}Duration`),i=Zi(o,r),l=s(`${Xn}Delay`),a=s(`${Xn}Duration`),d=Zi(l,a);let c=null,f=0,m=0;t===en?i>0&&(c=en,f=i,m=r.length):t===Xn?d>0&&(c=Xn,f=d,m=a.length):(f=Math.max(i,d),c=f>0?i>d?en:Xn:null,m=c?c===en?r.length:a.length:0);const b=c===en&&/\b(?:transform|all)(?:,|$)/.test(s(`${en}Property`).toString());return{type:c,timeout:f,propCount:m,hasTransform:b}}function Zi(e,t){for(;e.lengthel(n)+el(e[s])))}function el(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function tl(e){return(e?e.ownerDocument:document).body.offsetHeight}function Lf(e,t,n){const s=e[_s];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const nl=Symbol("_vod"),Ff=Symbol("_vsh"),Mf=Symbol(""),Uf=/(?:^|;)\s*display\s*:/;function Bf(e,t,n){const s=e.style,o=Te(n);let r=!1;if(n&&!o){if(t)if(Te(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Ys(s,l,"")}else for(const i in t)n[i]==null&&Ys(s,i,"");for(const i in n)i==="display"&&(r=!0),Ys(s,i,n[i])}else if(o){if(t!==n){const i=s[Mf];i&&(n+=";"+i),s.cssText=n,r=Uf.test(n)}}else t&&e.removeAttribute("style");nl in e&&(e[nl]=r?s.display:"",e[Ff]&&(s.display="none"))}const sl=/\s*!important$/;function Ys(e,t,n){if(X(n))n.forEach(s=>Ys(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Hf(e,t);sl.test(n)?e.setProperty(fn(s),n.replace(sl,""),"important"):e[s]=n}}const ol=["Webkit","Moz","ms"],er={};function Hf(e,t){const n=er[t];if(n)return n;let s=mt(t);if(s!=="filter"&&s in e)return er[t]=s;s=xo(s);for(let o=0;otr||(Wf.then(()=>tr=0),tr=Date.now());function zf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;wt(Qf(s,n.value),t,5,[s])};return n.value=e,n.attached=Kf(),n}function Qf(e,t){if(X(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const ul=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Gf=(e,t,n,s,o,r)=>{const i=o==="svg";t==="class"?Lf(e,s,i):t==="style"?Bf(e,n,s):bo(t)?qr(t)||qf(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Jf(e,t,s,i))?(ll(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&il(e,t,s,i,r,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Te(s))?ll(e,mt(t),s,r,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),il(e,t,s,i))};function Jf(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ul(t)&&oe(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ul(t)&&Te(n)?!1:t in e}const Mn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return X(t)?n=>zs(t,n):t};function Yf(e){e.target.composing=!0}function dl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Qt=Symbol("_assign");function fl(e,t,n){return t&&(e=e.trim()),n&&(e=wo(e)),e}const rt={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e[Qt]=Mn(o);const r=s||o.props&&o.props.type==="number";ln(e,t?"change":"input",i=>{i.target.composing||e[Qt](fl(e.value,n,r))}),(n||r)&&ln(e,"change",()=>{e.value=fl(e.value,n,r)}),t||(ln(e,"compositionstart",Yf),ln(e,"compositionend",dl),ln(e,"change",dl))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:o,number:r}},i){if(e[Qt]=Mn(i),e.composing)return;const l=(r||e.type==="number")&&!/^0\d/.test(e.value)?wo(e.value):e.value,a=t??"";l!==a&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||o&&e.value.trim()===a)||(e.value=a))}},tn={deep:!0,created(e,t,n){e[Qt]=Mn(n),ln(e,"change",()=>{const s=e._modelValue,o=xs(e),r=e.checked,i=e[Qt];if(X(s)){const l=Kr(s,o),a=l!==-1;if(r&&!a)i(s.concat(o));else if(!r&&a){const d=[...s];d.splice(l,1),i(d)}}else if(Vn(s)){const l=new Set(s);r?l.add(o):l.delete(o),i(l)}else i(Cc(e,r))})},mounted:pl,beforeUpdate(e,t,n){e[Qt]=Mn(n),pl(e,t,n)}};function pl(e,{value:t,oldValue:n},s){e._modelValue=t;let o;if(X(t))o=Kr(t,s.props.value)>-1;else if(Vn(t))o=t.has(s.props.value);else{if(t===n)return;o=Wn(t,Cc(e,!0))}e.checked!==o&&(e.checked=o)}const Xs={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const o=Vn(t);ln(e,"change",()=>{const r=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?wo(xs(i)):xs(i));e[Qt](e.multiple?o?new Set(r):r:r[0]),e._assigning=!0,ei(()=>{e._assigning=!1})}),e[Qt]=Mn(s)},mounted(e,{value:t}){hl(e,t)},beforeUpdate(e,t,n){e[Qt]=Mn(n)},updated(e,{value:t}){e._assigning||hl(e,t)}};function hl(e,t){const n=e.multiple,s=X(t);if(!(n&&!s&&!Vn(t))){for(let o=0,r=e.options.length;oString(d)===String(l)):i.selected=Kr(t,l)>-1}else i.selected=t.has(l);else if(Wn(xs(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function xs(e){return"_value"in e?e._value:e.value}function Cc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Xf=["ctrl","shift","alt","meta"],Zf={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Xf.some(n=>e[`${n}Key`]&&!t.includes(n))},ep=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(o,...r)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=o=>{if(!("key"in o))return;const r=fn(o.key);if(t.some(i=>i===r||tp[i]===r))return e(o)})},sp=$e({patchProp:Gf},Tf);let ml;function op(){return ml||(ml=lf(sp))}const rp=(...e)=>{const t=op().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=lp(s);if(!o)return;const r=t._component;!oe(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const i=n(o,!1,ip(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function ip(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function lp(e){return Te(e)?document.querySelector(e):e}const ap={language:{name:"English"},common:{cancel:"Cancel",save:"Save",close:"Close",delete:"Delete",refresh:"Refresh",download:"Download",unknownArtist:"Unknown artist",unknownTrack:"Unknown track",previousPage:"Previous page",nextPage:"Next page"},nav:{home:"Home",library:"Library",monitor:"Playlist Monitor",queue:"Queue",player:"Player",settings:"Settings",switchToLight:"Switch to light",switchToDark:"Switch to dark"},hero:{noAccount:"no Spotify account needed",tagline:"Your music with full metadata, album art and lyrics — in one click.",songs:"Songs",albums:"Albums",playlists:"Playlists"},search:{placeholder:"Search, paste a Spotify or YouTube Music link…",title:"Search results",matchesFor:"Showing matches for",songsCount:"— {count} song",songsCountPlural:"— {count} songs",typeToBegin:"Type something in the search bar to begin.",error:"Something went wrong.",errorWithDetail:"Something went wrong: {detail}",empty:"No songs found.",emptyHint:"Try another query — artist + title usually works best.",openOnSpotify:"Open on Spotify",inQueue:"In queue",download:"Download",previousPage:"Previous page",nextPage:"Next page"},queue:{title:"Download Queue",subtitle:"Songs you've queued. Use filters for what's active or failed. A new Spotify playlist clears finished tracks and keeps failures.",empty:"Nothing queued right now.",emptyHint:"Search for a song and hit download to start.",emptyFilter:"No tracks match this filter.",filterAll:"All",filterActive:"In progress",filterDownloading:"Downloading",filterQueued:"Waiting",filterDone:"Done",filterFailed:"Failed",statusQueued:"Waiting",statusDownloading:"Downloading",statusDone:"Done",statusFailed:"Failed",retry:"Retry download",retryAllFailed:"Retry failed ({count})",clearCompleted:"Clear done ({count})",saveToDevice:"Save to device",removeFromQueue:"Remove from queue",clearAll:"Clear all",clearAllPrompt:"Remove all items from the queue?",forceAudio:"Use a YouTube URL instead",overridePlaceholder:"Paste a YouTube or YouTube Music URL…",applyOverride:"Apply",invalidYouTubeURL:"Invalid YouTube URL"},library:{title:"Library",subtitle:"Music you've already downloaded. Listen, re-download or remove.",empty:"No downloads yet.",emptyHint:"Find a song to start filling your library.",failedLoad:"Failed to load downloads.",failedDelete:"Failed to delete {file}",deletePrompt:'Delete "{file}"?',countOne:"{count} file in your library",countMany:"{count} files in your library",downloadToDevice:"Download to device",deleteFile:"Delete file",play:"Play"},monitor:{title:"Playlist Monitor",subtitle:"Add Spotify playlists to watch. New tracks added to those playlists will be downloaded automatically.",watchNew:"Watch a new playlist",urlPlaceholder:"Paste a Spotify playlist URL…",watch:"Watch",failedAdd:"Failed to add playlist. Check the URL and try again.",empty:"No playlists being monitored yet.",emptyHint:"Paste a Spotify playlist link above to get started.",active:"Active",paused:"Paused",everyInterval:"Every {interval}",tracksOne:"{count} track",tracksMany:"{count} tracks",checked:"Checked {when}",notChecked:"Not checked yet",pause:"Pause monitoring",resume:"Resume monitoring",checkNow:"Check now",stop:"Stop monitoring",deletePrompt:'Stop monitoring "{name}"?',info:"When you add a playlist, Downtify downloads every track it currently contains and then keeps watching it. Any songs added later on Spotify are detected and downloaded automatically on the next scheduled check.",every15:"Every 15 min",every30:"Every 30 min",every1h:"Every hour",every3h:"Every 3 h",every6h:"Every 6 h",every12h:"Every 12 h",every1d:"Every day",every1w:"Every week",every2w:"Every 2 weeks",every1mo:"Every month",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 day",short1w:"1 wk",short2w:"2 wk",short1mo:"1 mo",minSuffix:"min",hourSuffix:"h",daySuffix:"day",daysSuffix:"days",weekSuffix:"week",weeksSuffix:"weeks",monthSuffix:"month",monthsSuffix:"months",timeJustNow:"just now",timeMinAgo:"{n} min ago",timeHourAgo:"{n} h ago",timeDayAgo:"{n} day(s) ago"},settings:{title:"Settings",subtitle:"Tweak how Downtify fetches and tags your music.",audioSource:"Audio sources (fallback order)",audioSourceHint:"Enable one or more. Each track tries sources in order (1, 2, 3) until one succeeds.",audioSourceReset:"Use recommended order",lyricsSource:"Lyrics source",lyricsHint:"only lrclib is active",downloadLyrics:"Download lyrics",downloadLyricsHint:"Embed lyrics in audio files and write .lrc sidecar files",lyricsProvider:"Provider",format:"Format",quality:"Quality",qualityIgnored:"ignored (lossless)",playlistsSection:"Playlists",generateM3u:"Generate M3U file for playlists",generateM3uHint:"Writes Playlists/.m3u with absolute file paths (/downloads/... and /slskd/...) for manual downloads and Playlist Monitor sweeps.",syncNavidrome:"Create playlist in Navidrome",syncNavidromeHint:"After a Spotify playlist download finishes, scan the library and create/update a Navidrome playlist with the same name.",navidromeSection:"Navidrome",navidromeHint:"Uses the Subsonic API (same as Explo). Point your music folder in Navidrome at Downtify downloads.",navidromeEnabled:"Enable Navidrome sync",navidromeEnabledHint:"Requires URL, username, and password. Admin account recommended: triggers Subsonic startScan (incremental) before matching tracks, same as Explo.",navidromeUrl:"Navidrome URL (example: https://music.example.com)",navidromeUsername:"Navidrome username",navidromePassword:"Navidrome password",navidromeAdminUser:"Admin username (optional, for library scan)",navidromeAdminPassword:"Admin password (optional)",navidromePublic:"Public playlist in Navidrome",organizationSection:"File organization",organizeByArtist:"Organize by artist",organizeByArtistHint:"Save songs in subfolders named after the artist. Playlist tracks are also placed in their artist's folder instead of a playlist folder.",parallelDownloads:"Parallel downloads",parallelDownloadsHint:"Maximum number of songs downloaded simultaneously. Higher values are faster but use more bandwidth.",saved:"Changes saved",saveError:"Couldn't save settings.",language:"Language",languageHint:"Choose the interface language",slskdSection:"slskd",slskdHint:"Soulseek via slskd. With Navidrome enabled, playlists are built in Navidrome after a library scan — files can stay in the slskd folder.",slskdEnabled:"Enable slskd provider",slskdEnabledHint:"When off, slskd is never attempted in provider fallback.",slskdBaseUrl:"slskd base URL (example: https://slskd.example.com)",slskdApiKey:"slskd API key",slskdSourceDirTitle:"slskd download folder (inside this container)",slskdSourceDirBullet1:"slskd writes completed transfers here (e.g. /slskd → host music/slskd).",slskdSourceDirBullet2:"Navidrome must scan the parent music library that includes this folder.",slskdSourceDirBullet3:"Use the path Downtify sees — not the host path, not the slskd web URL.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads -Downtify: /mnt/storage/music/slskd:/slskd → set /slskd`,slskdSourceDirLabel:"slskd folder path in Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify watches this folder for finished slskd files. No copy into /downloads when leave-in-place is on.",slskdLeaveInPlace:"Leave slskd files in place",slskdLeaveInPlaceHint:"Do not copy into /downloads. Tag in place, register for dedupe, and add tracks to Navidrome playlists via library search (recommended with Navidrome sync).",slskdDownloadTimeout:"Total slskd timeout (seconds)",slskdQueuedTimeout:"Queued / no-progress timeout (seconds)",slskdTimeoutHint:'If slskd does not finish in time, Downtify tries the next audio provider (YouTube). Lower the queued timeout when tracks sit on "Queued on slskd" too long.'},player:{title:"Player",subtitle:"Listen to the music you've downloaded.",empty:"Nothing to play yet",emptyHint:"Download some music to start listening.",queue:"Queue",play:"Play",pause:"Pause",previous:"Previous",next:"Next",shuffle:"Shuffle",shuffleOn:"Shuffle on",shuffleOff:"Shuffle off",repeatOff:"Repeat off",repeatAll:"Repeat all",repeatOne:"Repeat one",volume:"Volume",mute:"Mute",unmute:"Unmute",nowPlaying:"Now playing",upNext:"Up next",playFromLibrary:"Open in player",countOne:"{count} track",countMany:"{count} tracks"},footer:{tagline:"Open source music downloader"}},cp={language:{name:"Español"},common:{cancel:"Cancelar",save:"Guardar",close:"Cerrar",delete:"Eliminar",refresh:"Actualizar",download:"Descargar",unknownArtist:"Artista desconocido",unknownTrack:"Pista desconocida",previousPage:"Página anterior",nextPage:"Página siguiente"},nav:{home:"Inicio",library:"Biblioteca",monitor:"Monitor de listas",queue:"Cola",player:"Reproductor",settings:"Ajustes",switchToLight:"Cambiar a claro",switchToDark:"Cambiar a oscuro"},hero:{noAccount:"sin cuenta de Spotify",tagline:"Tu música con metadatos completos, portada y letras — en un clic.",songs:"Canciones",albums:"Álbumes",playlists:"Listas"},search:{placeholder:"Busca o pega un enlace de Spotify o YouTube Music…",title:"Resultados de búsqueda",matchesFor:"Mostrando coincidencias para",songsCount:"— {count} canción",songsCountPlural:"— {count} canciones",typeToBegin:"Escribe algo en la barra de búsqueda para empezar.",error:"Algo salió mal.",errorWithDetail:"Algo salió mal: {detail}",empty:"No se encontraron canciones.",emptyHint:"Prueba con otra búsqueda — artista + título suele funcionar mejor.",openOnSpotify:"Abrir en Spotify",inQueue:"En la cola",download:"Descargar",previousPage:"Página anterior",nextPage:"Página siguiente"},queue:{title:"Cola de descargas",subtitle:"Canciones en cola. Filtra por activas o fallidas. Una playlist nueva de Spotify quita las terminadas y conserva los fallos.",empty:"No hay nada en la cola ahora mismo.",emptyHint:"Busca una canción y pulsa descargar para empezar.",emptyFilter:"Ninguna pista coincide con este filtro.",filterAll:"Todas",filterActive:"En curso",filterDownloading:"Descargando",filterQueued:"En espera",filterDone:"Hechas",filterFailed:"Fallidas",statusQueued:"En espera",statusDownloading:"Descargando",statusDone:"Hecha",statusFailed:"Fallida",retry:"Reintentar descarga",retryAllFailed:"Reintentar fallidas ({count})",clearCompleted:"Quitar hechas ({count})",saveToDevice:"Guardar en el dispositivo",removeFromQueue:"Quitar de la cola",clearAll:"Limpiar todo",clearAllPrompt:"¿Eliminar todos los elementos de la cola?",forceAudio:"Usar una URL de YouTube",overridePlaceholder:"Pega una URL de YouTube o YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL de YouTube no válida"},library:{title:"Biblioteca",subtitle:"Música que ya has descargado. Escucha, descarga otra vez o elimina.",empty:"Aún no hay descargas.",emptyHint:"Encuentra una canción para empezar a llenar tu biblioteca.",failedLoad:"No se pudieron cargar las descargas.",failedDelete:"No se pudo eliminar {file}",deletePrompt:'¿Eliminar "{file}"?',countOne:"{count} archivo en tu biblioteca",countMany:"{count} archivos en tu biblioteca",downloadToDevice:"Descargar al dispositivo",deleteFile:"Eliminar archivo",play:"Reproducir"},monitor:{title:"Monitor de listas",subtitle:"Añade listas de Spotify para vigilar. Las nuevas pistas añadidas a esas listas se descargarán automáticamente.",watchNew:"Vigilar una nueva lista",urlPlaceholder:"Pega una URL de lista de Spotify…",watch:"Vigilar",failedAdd:"No se pudo añadir la lista. Comprueba la URL e inténtalo de nuevo.",empty:"Aún no hay listas vigiladas.",emptyHint:"Pega un enlace de lista de Spotify arriba para empezar.",active:"Activa",paused:"Pausada",everyInterval:"Cada {interval}",tracksOne:"{count} pista",tracksMany:"{count} pistas",checked:"Revisada {when}",notChecked:"Aún no revisada",pause:"Pausar vigilancia",resume:"Reanudar vigilancia",checkNow:"Revisar ahora",stop:"Dejar de vigilar",deletePrompt:'¿Dejar de vigilar "{name}"?',info:"Al añadir una lista, Downtify descarga todas las pistas que contenga en ese momento y la sigue vigilando. Cualquier canción añadida después en Spotify se detecta y descarga automáticamente en la siguiente revisión.",every15:"Cada 15 min",every30:"Cada 30 min",every1h:"Cada hora",every3h:"Cada 3 h",every6h:"Cada 6 h",every12h:"Cada 12 h",every1d:"Cada día",every1w:"Cada semana",every2w:"Cada 2 semanas",every1mo:"Cada mes",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 día",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mes",minSuffix:"min",hourSuffix:"h",daySuffix:"día",daysSuffix:"días",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mes",monthsSuffix:"meses",timeJustNow:"justo ahora",timeMinAgo:"hace {n} min",timeHourAgo:"hace {n} h",timeDayAgo:"hace {n} día(s)"},settings:{title:"Ajustes",subtitle:"Ajusta cómo Downtify descarga y etiqueta tu música.",audioSource:"Fuentes de audio (orden de respaldo)",audioSourceHint:"Activa una o más. Cada pista prueba las fuentes en orden (1, 2, 3) hasta que una funcione.",audioSourceReset:"Usar orden recomendado",lyricsSource:"Fuente de letras",lyricsHint:"solo lrclib está activo",downloadLyrics:"Descargar letras",downloadLyricsHint:"Incrusta letras en los archivos de audio y escribe archivos .lrc",lyricsProvider:"Proveedor",format:"Formato",quality:"Calidad",qualityIgnored:"ignorada (sin pérdidas)",playlistsSection:"Listas",generateM3u:"Generar archivo M3U para las listas",generateM3uHint:"Escribe Playlists/.m3u con rutas absolutas (/downloads/... y /slskd/...) para descargas y el Monitor.",syncNavidrome:"Crear lista en Navidrome",syncNavidromeHint:"Tras descargar una lista de Spotify, escanea la biblioteca y crea/actualiza una lista en Navidrome con el mismo nombre.",navidromeSection:"Navidrome",navidromeHint:"Usa la API Subsonic (como Explo). La carpeta de música en Navidrome debe apuntar a las descargas de Downtify.",navidromeEnabled:"Activar sincronización con Navidrome",navidromeEnabledHint:"Requiere URL, usuario y contraseña. La cuenta admin opcional inicia el escaneo de la biblioteca.",navidromeUrl:"URL de Navidrome (ejemplo: https://musica.ejemplo.com)",navidromeUsername:"Usuario de Navidrome",navidromePassword:"Contraseña de Navidrome",navidromeAdminUser:"Usuario admin (opcional, para escaneo)",navidromeAdminPassword:"Contraseña admin (opcional)",navidromePublic:"Lista pública en Navidrome",organizationSection:"Organización de archivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Guarda las canciones en subcarpetas con el nombre del artista. Las pistas de listas también se guardan en la carpeta del artista en lugar de la carpeta de la lista.",parallelDownloads:"Descargas paralelas",parallelDownloadsHint:"Número máximo de canciones descargadas simultáneamente. Valores más altos son más rápidos pero consumen más ancho de banda.",saved:"Cambios guardados",saveError:"No se pudieron guardar los ajustes.",language:"Idioma",languageHint:"Elige el idioma de la interfaz",slskdSection:"slskd",slskdHint:"Soulseek vía slskd. Con Navidrome activo, las listas se crean allí tras escanear la biblioteca; los archivos pueden quedarse en la carpeta slskd.",slskdEnabled:"Activar proveedor slskd",slskdEnabledHint:"Si está desactivado, slskd nunca se intentará en la cadena de fallback.",slskdBaseUrl:"URL base de slskd (ejemplo: https://slskd.ejemplo.com)",slskdApiKey:"API key de slskd",slskdSourceDirTitle:"Carpeta de descargas de slskd (en este contenedor)",slskdSourceDirBullet1:"slskd escribe aquí las transferencias completadas (ej. /slskd → music/slskd en el host).",slskdSourceDirBullet2:"Navidrome debe escanear la biblioteca que incluye esta carpeta.",slskdSourceDirBullet3:"Ruta que ve Downtify — no la ruta del host ni la URL web de slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads -Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Carpeta slskd en Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify detecta archivos slskd aquí. Sin copia a /downloads si “dejar en sitio” está activo.",slskdLeaveInPlace:"Dejar archivos slskd en su sitio",slskdLeaveInPlaceHint:"No copiar a /downloads. Etiquetar en sitio y añadir a listas de Navidrome tras el escaneo.",slskdDownloadTimeout:"Tiempo máximo slskd (segundos)",slskdQueuedTimeout:"Tiempo en cola sin progreso (segundos)",slskdTimeoutHint:'Si slskd no termina a tiempo, Downtify prueba el siguiente proveedor (YouTube). Baja el tiempo en cola si se queda en "Queued on slskd".'},player:{title:"Reproductor",subtitle:"Escucha la música que has descargado.",empty:"Nada que reproducir aún",emptyHint:"Descarga música para empezar a escuchar.",queue:"Cola",play:"Reproducir",pause:"Pausar",previous:"Anterior",next:"Siguiente",shuffle:"Aleatorio",shuffleOn:"Aleatorio activado",shuffleOff:"Aleatorio desactivado",repeatOff:"Repetición desactivada",repeatAll:"Repetir todo",repeatOne:"Repetir una",volume:"Volumen",mute:"Silenciar",unmute:"Activar sonido",nowPlaying:"Sonando ahora",upNext:"A continuación",playFromLibrary:"Abrir en el reproductor",countOne:"{count} pista",countMany:"{count} pistas"},footer:{tagline:"Descargador de música de código abierto"}},up={language:{name:"Português (BR)"},common:{cancel:"Cancelar",save:"Salvar",close:"Fechar",delete:"Excluir",refresh:"Atualizar",download:"Baixar",unknownArtist:"Artista desconhecido",unknownTrack:"Faixa desconhecida",previousPage:"Página anterior",nextPage:"Próxima página"},nav:{home:"Início",library:"Biblioteca",monitor:"Monitor de playlists",queue:"Fila",player:"Player",settings:"Configurações",switchToLight:"Mudar para claro",switchToDark:"Mudar para escuro"},hero:{noAccount:"sem precisar de conta no Spotify",tagline:"Sua música com metadados completos, capa do álbum e letras — em um clique.",songs:"Músicas",albums:"Álbuns",playlists:"Playlists"},search:{placeholder:"Busque uma música ou cole um link do Spotify ou YouTube Music…",title:"Resultados da busca",matchesFor:"Mostrando resultados para",songsCount:"— {count} música",songsCountPlural:"— {count} músicas",typeToBegin:"Digite algo na barra de busca para começar.",error:"Algo deu errado.",errorWithDetail:"Algo deu errado: {detail}",empty:"Nenhuma música encontrada.",emptyHint:"Tente outra busca — artista + título costuma funcionar melhor.",openOnSpotify:"Abrir no Spotify",inQueue:"Na fila",download:"Baixar",previousPage:"Página anterior",nextPage:"Próxima página"},queue:{title:"Fila de download",subtitle:"Músicas na fila. Filtre o que está ativo ou com falha. Uma playlist nova do Spotify remove as concluídas e mantém as com erro.",empty:"Nada na fila no momento.",emptyHint:"Procure uma música e clique em baixar para começar.",emptyFilter:"Nenhuma faixa neste filtro.",filterAll:"Todas",filterActive:"Em andamento",filterDownloading:"Baixando",filterQueued:"Aguardando",filterDone:"Concluídas",filterFailed:"Com falha",statusQueued:"Aguardando",statusDownloading:"Baixando",statusDone:"Concluída",statusFailed:"Falhou",retry:"Tentar de novo",retryAllFailed:"Repetir falhas ({count})",clearCompleted:"Limpar concluídas ({count})",saveToDevice:"Salvar no dispositivo",removeFromQueue:"Remover da fila",clearAll:"Limpar tudo",clearAllPrompt:"Remover todos os itens da fila?",forceAudio:"Usar URL do YouTube",overridePlaceholder:"Cole uma URL do YouTube ou YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL do YouTube inválida"},library:{title:"Biblioteca",subtitle:"Músicas que você já baixou. Escute, baixe novamente ou remova.",empty:"Nenhum download ainda.",emptyHint:"Encontre uma música para começar a montar sua biblioteca.",failedLoad:"Falha ao carregar os downloads.",failedDelete:"Falha ao excluir {file}",deletePrompt:'Excluir "{file}"?',countOne:"{count} arquivo na sua biblioteca",countMany:"{count} arquivos na sua biblioteca",downloadToDevice:"Baixar para o dispositivo",deleteFile:"Excluir arquivo",play:"Reproduzir"},monitor:{title:"Monitor de playlists",subtitle:"Adicione playlists do Spotify para monitorar. Novas faixas adicionadas a essas playlists serão baixadas automaticamente.",watchNew:"Monitorar uma nova playlist",urlPlaceholder:"Cole uma URL de playlist do Spotify…",watch:"Monitorar",failedAdd:"Falha ao adicionar a playlist. Verifique a URL e tente novamente.",empty:"Nenhuma playlist sendo monitorada ainda.",emptyHint:"Cole um link de playlist do Spotify acima para começar.",active:"Ativa",paused:"Pausada",everyInterval:"A cada {interval}",tracksOne:"{count} faixa",tracksMany:"{count} faixas",checked:"Verificada {when}",notChecked:"Ainda não verificada",pause:"Pausar monitoramento",resume:"Retomar monitoramento",checkNow:"Verificar agora",stop:"Parar de monitorar",deletePrompt:'Parar de monitorar "{name}"?',info:"Quando você adiciona uma playlist, o Downtify baixa todas as faixas atuais dela e segue monitorando. Qualquer música adicionada depois no Spotify é detectada e baixada automaticamente na próxima verificação.",every15:"A cada 15 min",every30:"A cada 30 min",every1h:"A cada hora",every3h:"A cada 3 h",every6h:"A cada 6 h",every12h:"A cada 12 h",every1d:"Todo dia",every1w:"Toda semana",every2w:"A cada 2 semanas",every1mo:"Todo mês",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 dia",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mês",minSuffix:"min",hourSuffix:"h",daySuffix:"dia",daysSuffix:"dias",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mês",monthsSuffix:"meses",timeJustNow:"agora mesmo",timeMinAgo:"há {n} min",timeHourAgo:"há {n} h",timeDayAgo:"há {n} dia(s)"},settings:{title:"Configurações",subtitle:"Ajuste como o Downtify baixa e marca suas músicas.",audioSource:"Fontes de áudio (ordem de fallback)",audioSourceHint:"Ative uma ou mais. Cada faixa tenta as fontes na ordem (1, 2, 3) até uma funcionar.",audioSourceReset:"Usar ordem recomendada",lyricsSource:"Fonte de letras",lyricsHint:"apenas o lrclib está ativo",downloadLyrics:"Baixar letras",downloadLyricsHint:"Incorpora letras nos arquivos de áudio e grava arquivos .lrc",lyricsProvider:"Provedor",format:"Formato",quality:"Qualidade",qualityIgnored:"ignorada (sem perdas)",playlistsSection:"Playlists",generateM3u:"Gerar arquivo M3U para playlists",generateM3uHint:"Grava Playlists/.m3u com caminhos absolutos (/downloads/... e /slskd/...) para downloads e o Monitor.",syncNavidrome:"Criar playlist no Navidrome",syncNavidromeHint:"Depois de baixar uma playlist do Spotify, escaneia a biblioteca e cria/atualiza uma playlist no Navidrome com o mesmo nome.",navidromeSection:"Navidrome",navidromeHint:"Usa a API Subsonic (como o Explo). A pasta de música no Navidrome deve apontar para os downloads do Downtify.",navidromeEnabled:"Ativar sincronização com Navidrome",navidromeEnabledHint:"Exige URL, usuário e senha. Conta admin opcional dispara varredura da biblioteca.",navidromeUrl:"URL do Navidrome (exemplo: https://musica.exemplo.com)",navidromeUsername:"Usuário do Navidrome",navidromePassword:"Senha do Navidrome",navidromeAdminUser:"Usuário admin (opcional, para varredura)",navidromeAdminPassword:"Senha admin (opcional)",navidromePublic:"Playlist pública no Navidrome",organizationSection:"Organização de arquivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Salva as músicas em subpastas com o nome do artista. Músicas de playlists também são salvas na pasta do artista, não na pasta da playlist.",parallelDownloads:"Downloads paralelos",parallelDownloadsHint:"Número máximo de músicas baixadas ao mesmo tempo. Valores maiores são mais rápidos, mas consomem mais banda.",saved:"Alterações salvas",saveError:"Não foi possível salvar as configurações.",language:"Idioma",languageHint:"Escolha o idioma da interface",slskdSection:"slskd",slskdHint:"Soulseek via slskd. Com Navidrome ativo, playlists são criadas lá após varrer a biblioteca; arquivos podem ficar na pasta do slskd.",slskdEnabled:"Ativar provedor slskd",slskdEnabledHint:"Quando desativado, o slskd nunca é tentado na cadeia de fallback.",slskdBaseUrl:"URL base do slskd (exemplo: https://slskd.exemplo.com)",slskdApiKey:"API key do slskd",slskdSourceDirTitle:"Pasta de download do slskd (neste container)",slskdSourceDirBullet1:"O slskd grava transferências concluídas aqui (ex.: /slskd → music/slskd no host).",slskdSourceDirBullet2:"O Navidrome deve varrer a biblioteca que inclui esta pasta.",slskdSourceDirBullet3:"Caminho visto pelo Downtify — não o caminho do host nem a URL do slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads -Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Pasta slskd no Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"O Downtify observa esta pasta. Sem cópia para /downloads com “deixar no lugar” ativo.",slskdLeaveInPlace:"Deixar arquivos do slskd no lugar",slskdLeaveInPlaceHint:"Não copiar para /downloads. Taguear no lugar e montar playlists no Navidrome após o scan.",slskdDownloadTimeout:"Tempo máximo slskd (segundos)",slskdQueuedTimeout:"Tempo na fila sem progresso (segundos)",slskdTimeoutHint:'Se o slskd não terminar a tempo, o Downtify tenta o próximo provedor (YouTube). Reduza o tempo na fila se ficar em "Queued on slskd".'},player:{title:"Player",subtitle:"Ouça as músicas que você baixou.",empty:"Nada para tocar ainda",emptyHint:"Baixe alguma música para começar a ouvir.",queue:"Fila",play:"Reproduzir",pause:"Pausar",previous:"Anterior",next:"Próxima",shuffle:"Aleatório",shuffleOn:"Aleatório ligado",shuffleOff:"Aleatório desligado",repeatOff:"Repetição desligada",repeatAll:"Repetir tudo",repeatOne:"Repetir uma",volume:"Volume",mute:"Mudo",unmute:"Tirar mudo",nowPlaying:"Tocando agora",upNext:"A seguir",playFromLibrary:"Abrir no player",countOne:"{count} faixa",countMany:"{count} faixas"},footer:{tagline:"Baixador de músicas de código aberto"}},ws=[{code:"en",name:"English",messages:ap},{code:"es",name:"Español",messages:cp},{code:"pt-BR",name:"Português (BR)",messages:up}],mo="en",Tc="downtify-locale",gl=(()=>{try{return localStorage.getItem(Tc)}catch{return null}})(),dp=ws.find(e=>e.code===gl)?gl:mo,Oo=te(dp);function yl(e){return ws.find(t=>t.code===e)||ws.find(t=>t.code===mo)}function vl(e,t){if(!e)return;const n=t.split(".");let s=e;for(const o of n){if(s==null||typeof s!="object")return;s=s[o]}return typeof s=="string"?s:void 0}function fp(e,t){return t?e.replace(/\{(\w+)\}/g,(n,s)=>t[s]!==void 0&&t[s]!==null?String(t[s]):`{${s}}`):e}function pp(e,t){const n=Oo.value;let s=vl(yl(n).messages,e);return s===void 0&&n!==mo&&(s=vl(yl(mo).messages,e)),fp(s!==void 0?s:e,t)}function hp(e){if(ws.find(t=>t.code===e)){Oo.value=e;try{localStorage.setItem(Tc,e)}catch{}typeof document<"u"&&document.documentElement.setAttribute("lang",e)}}function St(){return{t:pp,locale:Oo,setLocale:hp,locales:ws}}typeof document<"u"&&document.documentElement.setAttribute("lang",Oo.value);const mp={class:"mt-auto px-6 py-6 text-center text-sm text-base-content/60"},gp={__name:"Footer",setup(e){const{t}=St();return(n,s)=>(A(),T("footer",mp,[s[0]||(s[0]=p("a",{class:"font-semibold text-primary hover:underline",href:"https://github.com/henriquesebastiao/downtify",target:"_blank",rel:"noopener"},"Downtify",-1)),s[1]||(s[1]=p("span",{class:"mx-2 opacity-50"},"·",-1)),p("span",null,w(u(t)("footer.tagline")),1)]))}},Pc=/^[a-z0-9]+(-[a-z0-9]+)*$/,Do=(e,t,n,s="")=>{const o=e.split(":");if(e.slice(0,1)==="@"){if(o.length<2||o.length>3)return null;s=o.shift().slice(1)}if(o.length>3||!o.length)return null;if(o.length>1){const l=o.pop(),a=o.pop(),d={provider:o.length>0?o[0]:s,prefix:a,name:l};return t&&!Zs(d)?null:d}const r=o[0],i=r.split("-");if(i.length>1){const l={provider:s,prefix:i.shift(),name:i.join("-")};return t&&!Zs(l)?null:l}if(n&&s===""){const l={provider:s,prefix:"",name:r};return t&&!Zs(l,n)?null:l}return null},Zs=(e,t)=>e?!!((t&&e.prefix===""||e.prefix)&&e.name):!1,Oc=Object.freeze({left:0,top:0,width:16,height:16}),go=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),No=Object.freeze({...Oc,...go}),Cr=Object.freeze({...No,body:"",hidden:!1});function yp(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const s=((e.rotate||0)+(t.rotate||0))%4;return s&&(n.rotate=s),n}function bl(e,t){const n=yp(e,t);for(const s in Cr)s in go?s in e&&!(s in n)&&(n[s]=go[s]):s in t?n[s]=t[s]:s in e&&(n[s]=e[s]);return n}function vp(e,t){const n=e.icons,s=e.aliases||Object.create(null),o=Object.create(null);function r(i){if(n[i])return o[i]=[];if(!(i in o)){o[i]=null;const l=s[i]&&s[i].parent,a=l&&r(l);a&&(o[i]=[l].concat(a))}return o[i]}return Object.keys(n).concat(Object.keys(s)).forEach(r),o}function bp(e,t,n){const s=e.icons,o=e.aliases||Object.create(null);let r={};function i(l){r=bl(s[l]||o[l],r)}return i(t),n.forEach(i),bl(e,r)}function Dc(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(o=>{t(o,null),n.push(o)});const s=vp(e);for(const o in s){const r=s[o];r&&(t(o,bp(e,o,r)),n.push(o))}return n}const _p={provider:"",aliases:{},not_found:{},...Oc};function nr(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function Nc(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!nr(e,_p))return null;const n=t.icons;for(const o in n){const r=n[o];if(!o||typeof r.body!="string"||!nr(r,Cr))return null}const s=t.aliases||Object.create(null);for(const o in s){const r=s[o],i=r.parent;if(!o||typeof i!="string"||!n[i]&&!s[i]||!nr(r,Cr))return null}return t}const _l=Object.create(null);function xp(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function Un(e,t){const n=_l[e]||(_l[e]=Object.create(null));return n[t]||(n[t]=xp(e,t))}function Ic(e,t){return Nc(t)?Dc(t,(n,s)=>{s?e.icons[n]=s:e.missing.add(n)}):[]}function wp(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let ks=!1;function $c(e){return typeof e=="boolean"&&(ks=e),ks}function kp(e){const t=typeof e=="string"?Do(e,!0,ks):e;if(t){const n=Un(t.provider,t.prefix),s=t.name;return n.icons[s]||(n.missing.has(s)?null:void 0)}}function Sp(e,t){const n=Do(e,!0,ks);if(!n)return!1;const s=Un(n.provider,n.prefix);return t?wp(s,n.name,t):(s.missing.add(n.name),!0)}function Ep(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),ks&&!t&&!e.prefix){let o=!1;return Nc(e)&&(e.prefix="",Dc(e,(r,i)=>{Sp(r,i)&&(o=!0)})),o}const n=e.prefix;if(!Zs({prefix:n,name:"a"}))return!1;const s=Un(t,n);return!!Ic(s,e)}const Lc=Object.freeze({width:null,height:null}),Fc=Object.freeze({...Lc,...go}),Ap=/(-?[0-9.]*[0-9]+[0-9.]*)/g,Rp=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function xl(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const s=e.split(Ap);if(s===null||!s.length)return e;const o=[];let r=s.shift(),i=Rp.test(r);for(;;){if(i){const l=parseFloat(r);isNaN(l)?o.push(r):o.push(Math.ceil(l*t*n)/n)}else o.push(r);if(r=s.shift(),r===void 0)return o.join("");i=!i}}function Cp(e,t="defs"){let n="";const s=e.indexOf("<"+t);for(;s>=0;){const o=e.indexOf(">",s),r=e.indexOf("",r);if(i===-1)break;n+=e.slice(o+1,r).trim(),e=e.slice(0,s).trim()+e.slice(i+1)}return{defs:n,content:e}}function Tp(e,t){return e?""+e+""+t:t}function Pp(e,t,n){const s=Cp(e);return Tp(s.defs,t+s.content+n)}const Op=e=>e==="unset"||e==="undefined"||e==="none";function Dp(e,t){const n={...No,...e},s={...Fc,...t},o={left:n.left,top:n.top,width:n.width,height:n.height};let r=n.body;[n,s].forEach(v=>{const h=[],k=v.hFlip,R=v.vFlip;let S=v.rotate;k?R?S+=2:(h.push("translate("+(o.width+o.left).toString()+" "+(0-o.top).toString()+")"),h.push("scale(-1 1)"),o.top=o.left=0):R&&(h.push("translate("+(0-o.left).toString()+" "+(o.height+o.top).toString()+")"),h.push("scale(1 -1)"),o.top=o.left=0);let C;switch(S<0&&(S-=Math.floor(S/4)*4),S=S%4,S){case 1:C=o.height/2+o.top,h.unshift("rotate(90 "+C.toString()+" "+C.toString()+")");break;case 2:h.unshift("rotate(180 "+(o.width/2+o.left).toString()+" "+(o.height/2+o.top).toString()+")");break;case 3:C=o.width/2+o.left,h.unshift("rotate(-90 "+C.toString()+" "+C.toString()+")");break}S%2===1&&(o.left!==o.top&&(C=o.left,o.left=o.top,o.top=C),o.width!==o.height&&(C=o.width,o.width=o.height,o.height=C)),h.length&&(r=Pp(r,'',""))});const i=s.width,l=s.height,a=o.width,d=o.height;let c,f;i===null?(f=l===null?"1em":l==="auto"?d:l,c=xl(f,a/d)):(c=i==="auto"?a:i,f=l===null?xl(c,d/a):l==="auto"?d:l);const m={},b=(v,h)=>{Op(h)||(m[v]=h.toString())};b("width",c),b("height",f);const y=[o.left,o.top,a,d];return m.viewBox=y.join(" "),{attributes:m,viewBox:y,body:r}}const Np=/\sid="(\S+)"/g,Ip="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let $p=0;function Lp(e,t=Ip){const n=[];let s;for(;s=Np.exec(e);)n.push(s[1]);if(!n.length)return e;const o="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(r=>{const i=typeof t=="function"?t(r):t+($p++).toString(),l=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+i+o+"$3")}),e=e.replace(new RegExp(o,"g"),""),e}const Tr=Object.create(null);function Fp(e,t){Tr[e]=t}function Pr(e){return Tr[e]||Tr[""]}function ci(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const ui=Object.create(null),Zn=["https://api.simplesvg.com","https://api.unisvg.com"],eo=[];for(;Zn.length>0;)Zn.length===1||Math.random()>.5?eo.push(Zn.shift()):eo.push(Zn.pop());ui[""]=ci({resources:["https://api.iconify.design"].concat(eo)});function Mp(e,t){const n=ci(t);return n===null?!1:(ui[e]=n,!0)}function di(e){return ui[e]}const Up=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let wl=Up();function Bp(e,t){const n=di(e);if(!n)return 0;let s;if(!n.maxURL)s=0;else{let o=0;n.resources.forEach(i=>{o=Math.max(o,i.length)});const r=t+".json?icons=";s=n.maxURL-o-n.path.length-r.length}return s}function Hp(e){return e===404}const jp=(e,t,n)=>{const s=[],o=Bp(e,t),r="icons";let i={type:r,provider:e,prefix:t,icons:[]},l=0;return n.forEach((a,d)=>{l+=a.length+1,l>=o&&d>0&&(s.push(i),i={type:r,provider:e,prefix:t,icons:[]},l=a.length),i.icons.push(a)}),s.push(i),s};function qp(e){if(typeof e=="string"){const t=di(e);if(t)return t.path}return"/"}const Vp=(e,t,n)=>{if(!wl){n("abort",424);return}let s=qp(t.provider);switch(t.type){case"icons":{const r=t.prefix,l=t.icons.join(","),a=new URLSearchParams({icons:l});s+=r+".json?"+a.toString();break}case"custom":{const r=t.uri;s+=r.slice(0,1)==="/"?r.slice(1):r;break}default:n("abort",400);return}let o=503;wl(e+s).then(r=>{const i=r.status;if(i!==200){setTimeout(()=>{n(Hp(i)?"abort":"next",i)});return}return o=501,r.json()}).then(r=>{if(typeof r!="object"||r===null){setTimeout(()=>{r===404?n("abort",r):n("next",o)});return}setTimeout(()=>{n("success",r)})}).catch(()=>{n("next",o)})},Wp={prepare:jp,send:Vp};function Kp(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((o,r)=>o.provider!==r.provider?o.provider.localeCompare(r.provider):o.prefix!==r.prefix?o.prefix.localeCompare(r.prefix):o.name.localeCompare(r.name));let s={provider:"",prefix:"",name:""};return e.forEach(o=>{if(s.name===o.name&&s.prefix===o.prefix&&s.provider===o.provider)return;s=o;const r=o.provider,i=o.prefix,l=o.name,a=n[r]||(n[r]=Object.create(null)),d=a[i]||(a[i]=Un(r,i));let c;l in d.icons?c=t.loaded:i===""||d.missing.has(l)?c=t.missing:c=t.pending;const f={provider:r,prefix:i,name:l};c.push(f)}),t}function Mc(e,t){e.forEach(n=>{const s=n.loaderCallbacks;s&&(n.loaderCallbacks=s.filter(o=>o.id!==t))})}function zp(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const s=e.provider,o=e.prefix;t.forEach(r=>{const i=r.icons,l=i.pending.length;i.pending=i.pending.filter(a=>{if(a.prefix!==o)return!0;const d=a.name;if(e.icons[d])i.loaded.push({provider:s,prefix:o,name:d});else if(e.missing.has(d))i.missing.push({provider:s,prefix:o,name:d});else return n=!0,!0;return!1}),i.pending.length!==l&&(n||Mc([e],r.id),r.callback(i.loaded.slice(0),i.missing.slice(0),i.pending.slice(0),r.abort))})}))}let Qp=0;function Gp(e,t,n){const s=Qp++,o=Mc.bind(null,n,s);if(!t.pending.length)return o;const r={id:s,icons:t,callback:e,abort:o};return n.forEach(i=>{(i.loaderCallbacks||(i.loaderCallbacks=[])).push(r)}),o}function Jp(e,t=!0,n=!1){const s=[];return e.forEach(o=>{const r=typeof o=="string"?Do(o,t,n):o;r&&s.push(r)}),s}var Yp={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function Xp(e,t,n,s){const o=e.resources.length,r=e.random?Math.floor(Math.random()*o):e.index;let i;if(e.random){let P=e.resources.slice(0);for(i=[];P.length>1;){const U=Math.floor(Math.random()*P.length);i.push(P[U]),P=P.slice(0,U).concat(P.slice(U+1))}i=i.concat(P)}else i=e.resources.slice(r).concat(e.resources.slice(0,r));const l=Date.now();let a="pending",d=0,c,f=null,m=[],b=[];typeof s=="function"&&b.push(s);function y(){f&&(clearTimeout(f),f=null)}function v(){a==="pending"&&(a="aborted"),y(),m.forEach(P=>{P.status==="pending"&&(P.status="aborted")}),m=[]}function h(P,U){U&&(b=[]),typeof P=="function"&&b.push(P)}function k(){return{startTime:l,payload:t,status:a,queriesSent:d,queriesPending:m.length,subscribe:h,abort:v}}function R(){a="failed",b.forEach(P=>{P(void 0,c)})}function S(){m.forEach(P=>{P.status==="pending"&&(P.status="aborted")}),m=[]}function C(P,U,ae){const $=U!=="success";switch(m=m.filter(W=>W!==P),a){case"pending":break;case"failed":if($||!e.dataAfterTimeout)return;break;default:return}if(U==="abort"){c=ae,R();return}if($){c=ae,m.length||(i.length?L():R());return}if(y(),S(),!e.random){const W=e.resources.indexOf(P.resource);W!==-1&&W!==e.index&&(e.index=W)}a="completed",b.forEach(W=>{W(ae)})}function L(){if(a!=="pending")return;y();const P=i.shift();if(P===void 0){if(m.length){f=setTimeout(()=>{y(),a==="pending"&&(S(),R())},e.timeout);return}R();return}const U={status:"pending",resource:P,callback:(ae,$)=>{C(U,ae,$)}};m.push(U),d++,f=setTimeout(L,e.rotate),n(P,t,U.callback)}return setTimeout(L),k}function Uc(e){const t={...Yp,...e};let n=[];function s(){n=n.filter(l=>l().status==="pending")}function o(l,a,d){const c=Xp(t,l,a,(f,m)=>{s(),d&&d(f,m)});return n.push(c),c}function r(l){return n.find(a=>l(a))||null}return{query:o,find:r,setIndex:l=>{t.index=l},getIndex:()=>t.index,cleanup:s}}function kl(){}const sr=Object.create(null);function Zp(e){if(!sr[e]){const t=di(e);if(!t)return;const n=Uc(t),s={config:t,redundancy:n};sr[e]=s}return sr[e]}function eh(e,t,n){let s,o;if(typeof e=="string"){const r=Pr(e);if(!r)return n(void 0,424),kl;o=r.send;const i=Zp(e);i&&(s=i.redundancy)}else{const r=ci(e);if(r){s=Uc(r);const i=e.resources?e.resources[0]:"",l=Pr(i);l&&(o=l.send)}}return!s||!o?(n(void 0,424),kl):s.query(t,o,n)().abort}function Sl(){}function th(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,zp(e)}))}function nh(e){const t=[],n=[];return e.forEach(s=>{(s.match(Pc)?t:n).push(s)}),{valid:t,invalid:n}}function es(e,t,n){function s(){const o=e.pendingIcons;t.forEach(r=>{o&&o.delete(r),e.icons[r]||e.missing.add(r)})}if(n&&typeof n=="object")try{if(!Ic(e,n).length){s();return}}catch(o){console.error(o)}s(),th(e)}function El(e,t){e instanceof Promise?e.then(n=>{t(n)}).catch(()=>{t(null)}):t(e)}function sh(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:s}=e,o=e.iconsToLoad;if(delete e.iconsToLoad,!o||!o.length)return;const r=e.loadIcon;if(e.loadIcons&&(o.length>1||!r)){El(e.loadIcons(o,s,n),c=>{es(e,o,c)});return}if(r){o.forEach(c=>{const f=r(c,s,n);El(f,m=>{const b=m?{prefix:s,icons:{[c]:m}}:null;es(e,[c],b)})});return}const{valid:i,invalid:l}=nh(o);if(l.length&&es(e,l,null),!i.length)return;const a=s.match(Pc)?Pr(n):null;if(!a){es(e,i,null);return}a.prepare(n,s,i).forEach(c=>{eh(n,c,f=>{es(e,c.icons,f)})})}))}const oh=(e,t)=>{const n=Jp(e,!0,$c()),s=Kp(n);if(!s.pending.length){let a=!0;return t&&setTimeout(()=>{a&&t(s.loaded,s.missing,s.pending,Sl)}),()=>{a=!1}}const o=Object.create(null),r=[];let i,l;return s.pending.forEach(a=>{const{provider:d,prefix:c}=a;if(c===l&&d===i)return;i=d,l=c,r.push(Un(d,c));const f=o[d]||(o[d]=Object.create(null));f[c]||(f[c]=[])}),s.pending.forEach(a=>{const{provider:d,prefix:c,name:f}=a,m=Un(d,c),b=m.pendingIcons||(m.pendingIcons=new Set);b.has(f)||(b.add(f),o[d][c].push(f))}),r.forEach(a=>{const d=o[a.provider][a.prefix];d.length&&sh(a,d)}),t?Gp(t,s,r):Sl};function rh(e,t){const n={...e};for(const s in t){const o=t[s],r=typeof o;s in Lc?(o===null||o&&(r==="string"||r==="number"))&&(n[s]=o):r===typeof n[s]&&(n[s]=s==="rotate"?o%4:o)}return n}const ih=/[\s,]+/;function lh(e,t){t.split(ih).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function ah(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function s(o){for(;o<0;)o+=4;return o%4}if(n===""){const o=parseInt(e);return isNaN(o)?0:s(o)}else if(n!==e){let o=0;switch(n){case"%":o=25;break;case"deg":o=90}if(o){let r=parseFloat(e.slice(0,e.length-n.length));return isNaN(r)?0:(r=r/o,r%1===0?s(r):0)}}return t}function ch(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const s in t)n+=" "+s+'="'+t[s]+'"';return'"+e+""}function uh(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function dh(e){return"data:image/svg+xml,"+uh(e)}function fh(e){return'url("'+dh(e)+'")'}const Al={...Fc,inline:!1},ph={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},hh={display:"inline-block"},Or={backgroundColor:"currentColor"},Bc={backgroundColor:"transparent"},Rl={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Cl={webkitMask:Or,mask:Or,background:Bc};for(const e in Cl){const t=Cl[e];for(const n in Rl)t[e+n]=Rl[n]}const to={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";to[e+"-flip"]=t,to[e.slice(0,1)+"-flip"]=t,to[e+"Flip"]=t});function Tl(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const Pl=(e,t)=>{const n=rh(Al,t),s={...ph},o=t.mode||"svg",r={},i=t.style,l=typeof i=="object"&&!(i instanceof Array)?i:{};for(let v in t){const h=t[v];if(h!==void 0)switch(v){case"icon":case"style":case"onLoad":case"mode":case"ssr":break;case"inline":case"hFlip":case"vFlip":n[v]=h===!0||h==="true"||h===1;break;case"flip":typeof h=="string"&&lh(n,h);break;case"color":r.color=h;break;case"rotate":typeof h=="string"?n[v]=ah(h):typeof h=="number"&&(n[v]=h);break;case"ariaHidden":case"aria-hidden":h!==!0&&h!=="true"&&delete s["aria-hidden"];break;default:{const k=to[v];k?(h===!0||h==="true"||h===1)&&(n[k]=!0):Al[v]===void 0&&(s[v]=h)}}}const a=Dp(e,n),d=a.attributes;if(n.inline&&(r.verticalAlign="-0.125em"),o==="svg"){s.style={...r,...l},Object.assign(s,d);let v=0,h=t.id;return typeof h=="string"&&(h=h.replace(/-/g,"_")),s.innerHTML=Lp(a.body,h?()=>h+"ID"+v++:"iconifyVue"),bs("svg",s)}const{body:c,width:f,height:m}=e,b=o==="mask"||(o==="bg"?!1:c.indexOf("currentColor")!==-1),y=ch(c,{...d,width:f+"",height:m+""});return s.style={...r,"--svg":fh(y),width:Tl(d.width),height:Tl(d.height),...hh,...b?Or:Bc,...l},bs("span",s)};$c(!0);Fp("",Wp);if(typeof document<"u"&&typeof window<"u"){const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(s=>{try{(typeof s!="object"||s===null||s instanceof Array||typeof s.icons!="object"||typeof s.prefix!="string"||!Ep(s))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const s="IconifyProviders["+n+"] is invalid.";try{const o=t[n];if(typeof o!="object"||!o||o.resources===void 0)continue;Mp(n,o)||console.error(s)}catch{console.error(s)}}}}const mh={...No,body:""},G=si({inheritAttrs:!1,data(){return{_name:"",_loadingIcon:null,iconMounted:!1,counter:0}},mounted(){this.iconMounted=!0},unmounted(){this.abortLoading()},methods:{abortLoading(){this._loadingIcon&&(this._loadingIcon.abort(),this._loadingIcon=null)},getIcon(e,t,n){if(typeof e=="object"&&e!==null&&typeof e.body=="string")return this._name="",this.abortLoading(),{data:e};let s;if(typeof e!="string"||(s=Do(e,!1,!0))===null)return this.abortLoading(),null;let o=kp(s);if(!o)return(!this._loadingIcon||this._loadingIcon.name!==e)&&(this.abortLoading(),this._name="",o!==null&&(this._loadingIcon={name:e,abort:oh([s],()=>{this.counter++})})),null;if(this.abortLoading(),this._name!==e&&(this._name=e,t&&t(e)),n){o=Object.assign({},o);const i=n(o.body,s.name,s.prefix,s.provider);typeof i=="string"&&(o.body=i)}const r=["iconify"];return s.prefix!==""&&r.push("iconify--"+s.prefix),s.provider!==""&&r.push("iconify--"+s.provider),{data:o,classes:r}}},render(){this.counter;const e=this.$attrs,t=this.iconMounted||e.ssr?this.getIcon(e.icon,e.onLoad,e.customise):null;if(!t)return Pl(mh,e);let n=e;return t.classes&&(n={...e,class:(typeof e.class=="string"?e.class+" ":"")+t.classes.join(" ")}),Pl({...No,...t.data},n)}});function Hc(e,t){return function(){return e.apply(t,arguments)}}const{toString:gh}=Object.prototype,{getPrototypeOf:fi}=Object,{iterator:Io,toStringTag:jc}=Symbol,$o=(e=>t=>{const n=gh.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Et=e=>(e=e.toLowerCase(),t=>$o(t)===e),Lo=e=>t=>typeof t===e,{isArray:Kn}=Array,Bn=Lo("undefined");function Cs(e){return e!==null&&!Bn(e)&&e.constructor!==null&&!Bn(e.constructor)&&tt(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const qc=Et("ArrayBuffer");function yh(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&qc(e.buffer),t}const vh=Lo("string"),tt=Lo("function"),Vc=Lo("number"),Ts=e=>e!==null&&typeof e=="object",bh=e=>e===!0||e===!1,no=e=>{if($o(e)!=="object")return!1;const t=fi(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(jc in e)&&!(Io in e)},_h=e=>{if(!Ts(e)||Cs(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},xh=Et("Date"),wh=Et("File"),kh=Et("Blob"),Sh=Et("FileList"),Eh=e=>Ts(e)&&tt(e.pipe),Ah=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||tt(e.append)&&((t=$o(e))==="formdata"||t==="object"&&tt(e.toString)&&e.toString()==="[object FormData]"))},Rh=Et("URLSearchParams"),[Ch,Th,Ph,Oh]=["ReadableStream","Request","Response","Headers"].map(Et),Dh=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ps(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let s,o;if(typeof e!="object"&&(e=[e]),Kn(e))for(s=0,o=e.length;s0;)if(o=n[s],t===o.toLowerCase())return o;return null}const _n=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Kc=e=>!Bn(e)&&e!==_n;function Dr(){const{caseless:e,skipUndefined:t}=Kc(this)&&this||{},n={},s=(o,r)=>{if(r==="__proto__"||r==="constructor"||r==="prototype")return;const i=e&&Wc(n,r)||r;no(n[i])&&no(o)?n[i]=Dr(n[i],o):no(o)?n[i]=Dr({},o):Kn(o)?n[i]=o.slice():(!t||!Bn(o))&&(n[i]=o)};for(let o=0,r=arguments.length;o(Ps(t,(o,r)=>{n&&tt(o)?Object.defineProperty(e,r,{value:Hc(o,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:s}),e),Ih=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),$h=(e,t,n,s)=>{e.prototype=Object.create(t.prototype,s),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},Lh=(e,t,n,s)=>{let o,r,i;const l={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),r=o.length;r-- >0;)i=o[r],(!s||s(i,e,t))&&!l[i]&&(t[i]=e[i],l[i]=!0);e=n!==!1&&fi(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Fh=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const s=e.indexOf(t,n);return s!==-1&&s===n},Mh=e=>{if(!e)return null;if(Kn(e))return e;let t=e.length;if(!Vc(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Uh=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&fi(Uint8Array)),Bh=(e,t)=>{const s=(e&&e[Io]).call(e);let o;for(;(o=s.next())&&!o.done;){const r=o.value;t.call(e,r[0],r[1])}},Hh=(e,t)=>{let n;const s=[];for(;(n=e.exec(t))!==null;)s.push(n);return s},jh=Et("HTMLFormElement"),qh=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,s,o){return s.toUpperCase()+o}),Ol=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Vh=Et("RegExp"),zc=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),s={};Ps(n,(o,r)=>{let i;(i=t(o,r,e))!==!1&&(s[r]=i||o)}),Object.defineProperties(e,s)},Wh=e=>{zc(e,(t,n)=>{if(tt(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const s=e[n];if(tt(s)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},Kh=(e,t)=>{const n={},s=o=>{o.forEach(r=>{n[r]=!0})};return Kn(e)?s(e):s(String(e).split(t)),n},zh=()=>{},Qh=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Gh(e){return!!(e&&tt(e.append)&&e[jc]==="FormData"&&e[Io])}const Jh=e=>{const t=new Array(10),n=(s,o)=>{if(Ts(s)){if(t.indexOf(s)>=0)return;if(Cs(s))return s;if(!("toJSON"in s)){t[o]=s;const r=Kn(s)?[]:{};return Ps(s,(i,l)=>{const a=n(i,o+1);!Bn(a)&&(r[l]=a)}),t[o]=void 0,r}}return s};return n(e,0)},Yh=Et("AsyncFunction"),Xh=e=>e&&(Ts(e)||tt(e))&&tt(e.then)&&tt(e.catch),Qc=((e,t)=>e?setImmediate:t?((n,s)=>(_n.addEventListener("message",({source:o,data:r})=>{o===_n&&r===n&&s.length&&s.shift()()},!1),o=>{s.push(o),_n.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",tt(_n.postMessage)),Zh=typeof queueMicrotask<"u"?queueMicrotask.bind(_n):typeof process<"u"&&process.nextTick||Qc,em=e=>e!=null&&tt(e[Io]),E={isArray:Kn,isArrayBuffer:qc,isBuffer:Cs,isFormData:Ah,isArrayBufferView:yh,isString:vh,isNumber:Vc,isBoolean:bh,isObject:Ts,isPlainObject:no,isEmptyObject:_h,isReadableStream:Ch,isRequest:Th,isResponse:Ph,isHeaders:Oh,isUndefined:Bn,isDate:xh,isFile:wh,isBlob:kh,isRegExp:Vh,isFunction:tt,isStream:Eh,isURLSearchParams:Rh,isTypedArray:Uh,isFileList:Sh,forEach:Ps,merge:Dr,extend:Nh,trim:Dh,stripBOM:Ih,inherits:$h,toFlatObject:Lh,kindOf:$o,kindOfTest:Et,endsWith:Fh,toArray:Mh,forEachEntry:Bh,matchAll:Hh,isHTMLForm:jh,hasOwnProperty:Ol,hasOwnProp:Ol,reduceDescriptors:zc,freezeMethods:Wh,toObjectSet:Kh,toCamelCase:qh,noop:zh,toFiniteNumber:Qh,findKey:Wc,global:_n,isContextDefined:Kc,isSpecCompliantForm:Gh,toJSONObject:Jh,isAsyncFn:Yh,isThenable:Xh,setImmediate:Qc,asap:Zh,isIterable:em};let ee=class Gc extends Error{static from(t,n,s,o,r,i){const l=new Gc(t.message,n||t.code,s,o,r);return l.cause=t,l.name=t.name,i&&Object.assign(l,i),l}constructor(t,n,s,o,r){super(t),this.name="AxiosError",this.isAxiosError=!0,n&&(this.code=n),s&&(this.config=s),o&&(this.request=o),r&&(this.response=r,this.status=r.status)}toJSON(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:E.toJSONObject(this.config),code:this.code,status:this.status}}};ee.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";ee.ERR_BAD_OPTION="ERR_BAD_OPTION";ee.ECONNABORTED="ECONNABORTED";ee.ETIMEDOUT="ETIMEDOUT";ee.ERR_NETWORK="ERR_NETWORK";ee.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";ee.ERR_DEPRECATED="ERR_DEPRECATED";ee.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";ee.ERR_BAD_REQUEST="ERR_BAD_REQUEST";ee.ERR_CANCELED="ERR_CANCELED";ee.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";ee.ERR_INVALID_URL="ERR_INVALID_URL";const tm=null;function Nr(e){return E.isPlainObject(e)||E.isArray(e)}function Jc(e){return E.endsWith(e,"[]")?e.slice(0,-2):e}function Dl(e,t,n){return e?e.concat(t).map(function(o,r){return o=Jc(o),!n&&r?"["+o+"]":o}).join(n?".":""):t}function nm(e){return E.isArray(e)&&!e.some(Nr)}const sm=E.toFlatObject(E,{},null,function(t){return/^is[A-Z]/.test(t)});function Fo(e,t,n){if(!E.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=E.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(v,h){return!E.isUndefined(h[v])});const s=n.metaTokens,o=n.visitor||c,r=n.dots,i=n.indexes,a=(n.Blob||typeof Blob<"u"&&Blob)&&E.isSpecCompliantForm(t);if(!E.isFunction(o))throw new TypeError("visitor must be a function");function d(y){if(y===null)return"";if(E.isDate(y))return y.toISOString();if(E.isBoolean(y))return y.toString();if(!a&&E.isBlob(y))throw new ee("Blob is not supported. Use a Buffer instead.");return E.isArrayBuffer(y)||E.isTypedArray(y)?a&&typeof Blob=="function"?new Blob([y]):Buffer.from(y):y}function c(y,v,h){let k=y;if(y&&!h&&typeof y=="object"){if(E.endsWith(v,"{}"))v=s?v:v.slice(0,-2),y=JSON.stringify(y);else if(E.isArray(y)&&nm(y)||(E.isFileList(y)||E.endsWith(v,"[]"))&&(k=E.toArray(y)))return v=Jc(v),k.forEach(function(S,C){!(E.isUndefined(S)||S===null)&&t.append(i===!0?Dl([v],C,r):i===null?v:v+"[]",d(S))}),!1}return Nr(y)?!0:(t.append(Dl(h,v,r),d(y)),!1)}const f=[],m=Object.assign(sm,{defaultVisitor:c,convertValue:d,isVisitable:Nr});function b(y,v){if(!E.isUndefined(y)){if(f.indexOf(y)!==-1)throw Error("Circular reference detected in "+v.join("."));f.push(y),E.forEach(y,function(k,R){(!(E.isUndefined(k)||k===null)&&o.call(t,k,E.isString(R)?R.trim():R,v,m))===!0&&b(k,v?v.concat(R):[R])}),f.pop()}}if(!E.isObject(e))throw new TypeError("data must be an object");return b(e),t}function Nl(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(s){return t[s]})}function pi(e,t){this._pairs=[],e&&Fo(e,this,t)}const Yc=pi.prototype;Yc.append=function(t,n){this._pairs.push([t,n])};Yc.toString=function(t){const n=t?function(s){return t.call(this,s,Nl)}:Nl;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function om(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Xc(e,t,n){if(!t)return e;const s=n&&n.encode||om,o=E.isFunction(n)?{serialize:n}:n,r=o&&o.serialize;let i;if(r?i=r(t,o):i=E.isURLSearchParams(t)?t.toString():new pi(t,o).toString(s),i){const l=e.indexOf("#");l!==-1&&(e=e.slice(0,l)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class Il{constructor(){this.handlers=[]}use(t,n,s){return this.handlers.push({fulfilled:t,rejected:n,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){E.forEach(this.handlers,function(s){s!==null&&t(s)})}}const hi={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},rm=typeof URLSearchParams<"u"?URLSearchParams:pi,im=typeof FormData<"u"?FormData:null,lm=typeof Blob<"u"?Blob:null,am={isBrowser:!0,classes:{URLSearchParams:rm,FormData:im,Blob:lm},protocols:["http","https","file","blob","url","data"]},mi=typeof window<"u"&&typeof document<"u",Ir=typeof navigator=="object"&&navigator||void 0,cm=mi&&(!Ir||["ReactNative","NativeScript","NS"].indexOf(Ir.product)<0),um=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",dm=mi&&window.location.href||"http://localhost",fm=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:mi,hasStandardBrowserEnv:cm,hasStandardBrowserWebWorkerEnv:um,navigator:Ir,origin:dm},Symbol.toStringTag,{value:"Module"})),He={...fm,...am};function pm(e,t){return Fo(e,new He.classes.URLSearchParams,{visitor:function(n,s,o,r){return He.isNode&&E.isBuffer(n)?(this.append(s,n.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...t})}function hm(e){return E.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function mm(e){const t={},n=Object.keys(e);let s;const o=n.length;let r;for(s=0;s=n.length;return i=!i&&E.isArray(o)?o.length:i,a?(E.hasOwnProp(o,i)?o[i]=[o[i],s]:o[i]=s,!l):((!o[i]||!E.isObject(o[i]))&&(o[i]=[]),t(n,s,o[i],r)&&E.isArray(o[i])&&(o[i]=mm(o[i])),!l)}if(E.isFormData(e)&&E.isFunction(e.entries)){const n={};return E.forEachEntry(e,(s,o)=>{t(hm(s),o,n,0)}),n}return null}function gm(e,t,n){if(E.isString(e))try{return(t||JSON.parse)(e),E.trim(e)}catch(s){if(s.name!=="SyntaxError")throw s}return(n||JSON.stringify)(e)}const Os={transitional:hi,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const s=n.getContentType()||"",o=s.indexOf("application/json")>-1,r=E.isObject(t);if(r&&E.isHTMLForm(t)&&(t=new FormData(t)),E.isFormData(t))return o?JSON.stringify(Zc(t)):t;if(E.isArrayBuffer(t)||E.isBuffer(t)||E.isStream(t)||E.isFile(t)||E.isBlob(t)||E.isReadableStream(t))return t;if(E.isArrayBufferView(t))return t.buffer;if(E.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(r){if(s.indexOf("application/x-www-form-urlencoded")>-1)return pm(t,this.formSerializer).toString();if((l=E.isFileList(t))||s.indexOf("multipart/form-data")>-1){const a=this.env&&this.env.FormData;return Fo(l?{"files[]":t}:t,a&&new a,this.formSerializer)}}return r||o?(n.setContentType("application/json",!1),gm(t)):t}],transformResponse:[function(t){const n=this.transitional||Os.transitional,s=n&&n.forcedJSONParsing,o=this.responseType==="json";if(E.isResponse(t)||E.isReadableStream(t))return t;if(t&&E.isString(t)&&(s&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t,this.parseReviver)}catch(l){if(i)throw l.name==="SyntaxError"?ee.from(l,ee.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:He.classes.FormData,Blob:He.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};E.forEach(["delete","get","head","post","put","patch"],e=>{Os.headers[e]={}});const ym=E.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),vm=e=>{const t={};let n,s,o;return e&&e.split(` +**/let Rr;const Qi=typeof window<"u"&&window.trustedTypes;if(Qi)try{Rr=Qi.createPolicy("vue",{createHTML:e=>e})}catch{}const Ec=Rr?e=>Rr.createHTML(e):e=>e,Rf="http://www.w3.org/2000/svg",Cf="http://www.w3.org/1998/Math/MathML",qt=typeof document<"u"?document:null,Gi=qt&&qt.createElement("template"),Tf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?qt.createElementNS(Rf,e):t==="mathml"?qt.createElementNS(Cf,e):n?qt.createElement(e,{is:n}):qt.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>qt.createTextNode(e),createComment:e=>qt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>qt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,r){const i=n?n.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===r||!(o=o.nextSibling)););else{Gi.innerHTML=Ec(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Gi.content;if(s==="svg"||s==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},en="transition",Xn="animation",_s=Symbol("_vtc"),Ac={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Pf=$e({},Ka,Ac),Of=e=>(e.displayName="Transition",e.props=Pf,e),Rc=Of((e,{slots:t})=>bs(Cd,Df(e),t)),mn=(e,t=[])=>{X(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ji=e=>e?X(e)?e.some(t=>t.length>1):e.length>1:!1;function Df(e){const t={};for(const q in e)q in Ac||(t[q]=e[q]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=r,appearActiveClass:d=i,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:b=`${n}-leave-to`}=e,y=Nf(o),v=y&&y[0],h=y&&y[1],{onBeforeEnter:k,onEnter:R,onEnterCancelled:S,onLeave:C,onLeaveCancelled:L,onBeforeAppear:P=k,onAppear:U=R,onAppearCancelled:ae=S}=t,$=(q,se,we,Me)=>{q._enterCancelled=Me,gn(q,se?c:l),gn(q,se?d:i),we&&we()},K=(q,se)=>{q._isLeaving=!1,gn(q,f),gn(q,b),gn(q,m),se&&se()},H=q=>(se,we)=>{const Me=q?U:R,le=()=>$(se,q,we);mn(Me,[se,le]),Yi(()=>{gn(se,q?a:r),Ht(se,q?c:l),Ji(Me)||Xi(se,s,v,le)})};return $e(t,{onBeforeEnter(q){mn(k,[q]),Ht(q,r),Ht(q,i)},onBeforeAppear(q){mn(P,[q]),Ht(q,a),Ht(q,d)},onEnter:H(!1),onAppear:H(!0),onLeave(q,se){q._isLeaving=!0;const we=()=>K(q,se);Ht(q,f),q._enterCancelled?(Ht(q,m),tl(q)):(tl(q),Ht(q,m)),Yi(()=>{q._isLeaving&&(gn(q,f),Ht(q,b),Ji(C)||Xi(q,s,h,we))}),mn(C,[q,we])},onEnterCancelled(q){$(q,!1,void 0,!0),mn(S,[q])},onAppearCancelled(q){$(q,!0,void 0,!0),mn(ae,[q])},onLeaveCancelled(q){K(q),mn(L,[q])}})}function Nf(e){if(e==null)return null;if(ge(e))return[Zo(e.enter),Zo(e.leave)];{const t=Zo(e);return[t,t]}}function Zo(e){return Fu(e)}function Ht(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[_s]||(e[_s]=new Set)).add(t)}function gn(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[_s];n&&(n.delete(t),n.size||(e[_s]=void 0))}function Yi(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let If=0;function Xi(e,t,n,s){const o=e._endId=++If,r=()=>{o===e._endId&&s()};if(n!=null)return setTimeout(r,n);const{type:i,timeout:l,propCount:a}=$f(e,t);if(!i)return s();const d=i+"end";let c=0;const f=()=>{e.removeEventListener(d,m),r()},m=b=>{b.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[y]||"").split(", "),o=s(`${en}Delay`),r=s(`${en}Duration`),i=Zi(o,r),l=s(`${Xn}Delay`),a=s(`${Xn}Duration`),d=Zi(l,a);let c=null,f=0,m=0;t===en?i>0&&(c=en,f=i,m=r.length):t===Xn?d>0&&(c=Xn,f=d,m=a.length):(f=Math.max(i,d),c=f>0?i>d?en:Xn:null,m=c?c===en?r.length:a.length:0);const b=c===en&&/\b(?:transform|all)(?:,|$)/.test(s(`${en}Property`).toString());return{type:c,timeout:f,propCount:m,hasTransform:b}}function Zi(e,t){for(;e.lengthel(n)+el(e[s])))}function el(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function tl(e){return(e?e.ownerDocument:document).body.offsetHeight}function Lf(e,t,n){const s=e[_s];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const nl=Symbol("_vod"),Ff=Symbol("_vsh"),Mf=Symbol(""),Uf=/(?:^|;)\s*display\s*:/;function Bf(e,t,n){const s=e.style,o=Te(n);let r=!1;if(n&&!o){if(t)if(Te(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Ys(s,l,"")}else for(const i in t)n[i]==null&&Ys(s,i,"");for(const i in n)i==="display"&&(r=!0),Ys(s,i,n[i])}else if(o){if(t!==n){const i=s[Mf];i&&(n+=";"+i),s.cssText=n,r=Uf.test(n)}}else t&&e.removeAttribute("style");nl in e&&(e[nl]=r?s.display:"",e[Ff]&&(s.display="none"))}const sl=/\s*!important$/;function Ys(e,t,n){if(X(n))n.forEach(s=>Ys(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Hf(e,t);sl.test(n)?e.setProperty(fn(s),n.replace(sl,""),"important"):e[s]=n}}const ol=["Webkit","Moz","ms"],er={};function Hf(e,t){const n=er[t];if(n)return n;let s=mt(t);if(s!=="filter"&&s in e)return er[t]=s;s=xo(s);for(let o=0;otr||(Wf.then(()=>tr=0),tr=Date.now());function zf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;wt(Qf(s,n.value),t,5,[s])};return n.value=e,n.attached=Kf(),n}function Qf(e,t){if(X(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const ul=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Gf=(e,t,n,s,o,r)=>{const i=o==="svg";t==="class"?Lf(e,s,i):t==="style"?Bf(e,n,s):bo(t)?qr(t)||qf(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Jf(e,t,s,i))?(ll(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&il(e,t,s,i,r,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Te(s))?ll(e,mt(t),s,r,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),il(e,t,s,i))};function Jf(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ul(t)&&oe(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ul(t)&&Te(n)?!1:t in e}const Mn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return X(t)?n=>zs(t,n):t};function Yf(e){e.target.composing=!0}function dl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Qt=Symbol("_assign");function fl(e,t,n){return t&&(e=e.trim()),n&&(e=wo(e)),e}const rt={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e[Qt]=Mn(o);const r=s||o.props&&o.props.type==="number";ln(e,t?"change":"input",i=>{i.target.composing||e[Qt](fl(e.value,n,r))}),(n||r)&&ln(e,"change",()=>{e.value=fl(e.value,n,r)}),t||(ln(e,"compositionstart",Yf),ln(e,"compositionend",dl),ln(e,"change",dl))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:o,number:r}},i){if(e[Qt]=Mn(i),e.composing)return;const l=(r||e.type==="number")&&!/^0\d/.test(e.value)?wo(e.value):e.value,a=t??"";l!==a&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||o&&e.value.trim()===a)||(e.value=a))}},tn={deep:!0,created(e,t,n){e[Qt]=Mn(n),ln(e,"change",()=>{const s=e._modelValue,o=xs(e),r=e.checked,i=e[Qt];if(X(s)){const l=Kr(s,o),a=l!==-1;if(r&&!a)i(s.concat(o));else if(!r&&a){const d=[...s];d.splice(l,1),i(d)}}else if(Vn(s)){const l=new Set(s);r?l.add(o):l.delete(o),i(l)}else i(Cc(e,r))})},mounted:pl,beforeUpdate(e,t,n){e[Qt]=Mn(n),pl(e,t,n)}};function pl(e,{value:t,oldValue:n},s){e._modelValue=t;let o;if(X(t))o=Kr(t,s.props.value)>-1;else if(Vn(t))o=t.has(s.props.value);else{if(t===n)return;o=Wn(t,Cc(e,!0))}e.checked!==o&&(e.checked=o)}const Xs={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const o=Vn(t);ln(e,"change",()=>{const r=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?wo(xs(i)):xs(i));e[Qt](e.multiple?o?new Set(r):r:r[0]),e._assigning=!0,ei(()=>{e._assigning=!1})}),e[Qt]=Mn(s)},mounted(e,{value:t}){hl(e,t)},beforeUpdate(e,t,n){e[Qt]=Mn(n)},updated(e,{value:t}){e._assigning||hl(e,t)}};function hl(e,t){const n=e.multiple,s=X(t);if(!(n&&!s&&!Vn(t))){for(let o=0,r=e.options.length;oString(d)===String(l)):i.selected=Kr(t,l)>-1}else i.selected=t.has(l);else if(Wn(xs(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function xs(e){return"_value"in e?e._value:e.value}function Cc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Xf=["ctrl","shift","alt","meta"],Zf={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Xf.some(n=>e[`${n}Key`]&&!t.includes(n))},ep=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(o,...r)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=o=>{if(!("key"in o))return;const r=fn(o.key);if(t.some(i=>i===r||tp[i]===r))return e(o)})},sp=$e({patchProp:Gf},Tf);let ml;function op(){return ml||(ml=lf(sp))}const rp=(...e)=>{const t=op().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=lp(s);if(!o)return;const r=t._component;!oe(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const i=n(o,!1,ip(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function ip(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function lp(e){return Te(e)?document.querySelector(e):e}const ap={language:{name:"English"},common:{cancel:"Cancel",save:"Save",close:"Close",delete:"Delete",refresh:"Refresh",download:"Download",unknownArtist:"Unknown artist",unknownTrack:"Unknown track",previousPage:"Previous page",nextPage:"Next page"},nav:{home:"Home",library:"Library",monitor:"Playlist Monitor",queue:"Queue",player:"Player",settings:"Settings",switchToLight:"Switch to light",switchToDark:"Switch to dark"},hero:{noAccount:"no Spotify account needed",tagline:"Your music with full metadata, album art and lyrics — in one click.",songs:"Songs",albums:"Albums",playlists:"Playlists"},search:{placeholder:"Search, paste a Spotify or YouTube Music link…",title:"Search results",matchesFor:"Showing matches for",songsCount:"— {count} song",songsCountPlural:"— {count} songs",typeToBegin:"Type something in the search bar to begin.",error:"Something went wrong.",errorWithDetail:"Something went wrong: {detail}",empty:"No songs found.",emptyHint:"Try another query — artist + title usually works best.",openOnSpotify:"Open on Spotify",inQueue:"In queue",download:"Download",previousPage:"Previous page",nextPage:"Next page"},queue:{title:"Download Queue",subtitle:"In progress = work started (searching providers or transferring). Waiting = not started yet. A new playlist clears done tracks and keeps failures.",empty:"Nothing queued right now.",emptyHint:"Search for a song and hit download to start.",emptyFilter:"No tracks match this filter.",filterAll:"All",filterActive:"In progress",filterQueued:"Waiting",filterDone:"Done",filterFailed:"Failed",statusQueued:"Waiting",statusActive:"In progress",statusDownloading:"Downloading",statusDone:"Done",statusFailed:"Failed",retry:"Retry download",retryAllFailed:"Retry failed ({count})",clearCompleted:"Clear done ({count})",saveToDevice:"Save to device",removeFromQueue:"Remove from queue",clearAll:"Clear all",clearAllPrompt:"Remove all items from the queue?",forceAudio:"Use a YouTube URL instead",overridePlaceholder:"Paste a YouTube or YouTube Music URL…",applyOverride:"Apply",invalidYouTubeURL:"Invalid YouTube URL"},library:{title:"Library",subtitle:"Music you've already downloaded. Listen, re-download or remove.",empty:"No downloads yet.",emptyHint:"Find a song to start filling your library.",failedLoad:"Failed to load downloads.",failedDelete:"Failed to delete {file}",deletePrompt:'Delete "{file}"?',countOne:"{count} file in your library",countMany:"{count} files in your library",downloadToDevice:"Download to device",deleteFile:"Delete file",play:"Play"},monitor:{title:"Playlist Monitor",subtitle:"Add Spotify playlists to watch. New tracks added to those playlists will be downloaded automatically.",watchNew:"Watch a new playlist",urlPlaceholder:"Paste a Spotify playlist URL…",watch:"Watch",failedAdd:"Failed to add playlist. Check the URL and try again.",empty:"No playlists being monitored yet.",emptyHint:"Paste a Spotify playlist link above to get started.",active:"Active",paused:"Paused",everyInterval:"Every {interval}",tracksOne:"{count} track",tracksMany:"{count} tracks",checked:"Checked {when}",notChecked:"Not checked yet",pause:"Pause monitoring",resume:"Resume monitoring",checkNow:"Check now",stop:"Stop monitoring",deletePrompt:'Stop monitoring "{name}"?',info:"When you add a playlist, Downtify downloads every track it currently contains and then keeps watching it. Any songs added later on Spotify are detected and downloaded automatically on the next scheduled check.",every15:"Every 15 min",every30:"Every 30 min",every1h:"Every hour",every3h:"Every 3 h",every6h:"Every 6 h",every12h:"Every 12 h",every1d:"Every day",every1w:"Every week",every2w:"Every 2 weeks",every1mo:"Every month",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 day",short1w:"1 wk",short2w:"2 wk",short1mo:"1 mo",minSuffix:"min",hourSuffix:"h",daySuffix:"day",daysSuffix:"days",weekSuffix:"week",weeksSuffix:"weeks",monthSuffix:"month",monthsSuffix:"months",timeJustNow:"just now",timeMinAgo:"{n} min ago",timeHourAgo:"{n} h ago",timeDayAgo:"{n} day(s) ago"},settings:{title:"Settings",subtitle:"Tweak how Downtify fetches and tags your music.",audioSource:"Audio sources (fallback order)",audioSourceHint:"Enable one or more. Each track tries sources in order (1, 2, 3) until one succeeds.",audioSourceReset:"Use recommended order",lyricsSource:"Lyrics source",lyricsHint:"only lrclib is active",downloadLyrics:"Download lyrics",downloadLyricsHint:"Embed lyrics in audio files and write .lrc sidecar files",lyricsProvider:"Provider",format:"Format",quality:"Quality",qualityIgnored:"ignored (lossless)",playlistsSection:"Playlists",generateM3u:"Generate M3U file for playlists",generateM3uHint:"Writes Playlists/.m3u with absolute file paths (/downloads/... and /slskd/...) for manual downloads and Playlist Monitor sweeps.",syncNavidrome:"Create playlist in Navidrome",syncNavidromeHint:"After a Spotify playlist download finishes, scan the library and create/update a Navidrome playlist with the same name.",navidromeSection:"Navidrome",navidromeHint:"Uses the Subsonic API (same as Explo). Point your music folder in Navidrome at Downtify downloads.",navidromeEnabled:"Enable Navidrome sync",navidromeEnabledHint:"Requires URL, username, and password. Admin account recommended: triggers Subsonic startScan (incremental) before matching tracks, same as Explo.",navidromeUrl:"Navidrome URL (example: https://music.example.com)",navidromeUsername:"Navidrome username",navidromePassword:"Navidrome password",navidromeAdminUser:"Admin username (optional, for library scan)",navidromeAdminPassword:"Admin password (optional)",navidromePublic:"Public playlist in Navidrome",organizationSection:"File organization",organizeByArtist:"Organize by artist",organizeByArtistHint:"Save songs in subfolders named after the artist. Playlist tracks are also placed in their artist's folder instead of a playlist folder.",parallelDownloads:"Parallel downloads",parallelDownloadsHint:"Maximum number of songs downloaded simultaneously. Higher values are faster but use more bandwidth.",saved:"Changes saved",saveError:"Couldn't save settings.",language:"Language",languageHint:"Choose the interface language",slskdSection:"slskd",slskdHint:"Soulseek via slskd. With Navidrome enabled, playlists are built in Navidrome after a library scan — files can stay in the slskd folder.",slskdEnabled:"Enable slskd provider",slskdEnabledHint:"When off, slskd is never attempted in provider fallback.",slskdBaseUrl:"slskd base URL (example: https://slskd.example.com)",slskdApiKey:"slskd API key",slskdSourceDirTitle:"slskd download folder (inside this container)",slskdSourceDirBullet1:"slskd writes completed transfers here (e.g. /slskd → host music/slskd).",slskdSourceDirBullet2:"Navidrome must scan the parent music library that includes this folder.",slskdSourceDirBullet3:"Use the path Downtify sees — not the host path, not the slskd web URL.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads +Downtify: /mnt/storage/music/slskd:/slskd → set /slskd`,slskdSourceDirLabel:"slskd folder path in Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify watches this folder for finished slskd files. No copy into /downloads when leave-in-place is on.",slskdLeaveInPlace:"Leave slskd files in place",slskdLeaveInPlaceHint:"Do not copy into /downloads. Tag in place, register for dedupe, and add tracks to Navidrome playlists via library search (recommended with Navidrome sync).",slskdDownloadTimeout:"Total slskd timeout (seconds)",slskdQueuedTimeout:"Queued / no-progress timeout (seconds)",slskdTimeoutHint:'If slskd does not finish in time, Downtify tries the next audio provider (YouTube). Lower the queued timeout when tracks sit on "Queued on slskd" too long.'},player:{title:"Player",subtitle:"Listen to the music you've downloaded.",empty:"Nothing to play yet",emptyHint:"Download some music to start listening.",queue:"Queue",play:"Play",pause:"Pause",previous:"Previous",next:"Next",shuffle:"Shuffle",shuffleOn:"Shuffle on",shuffleOff:"Shuffle off",repeatOff:"Repeat off",repeatAll:"Repeat all",repeatOne:"Repeat one",volume:"Volume",mute:"Mute",unmute:"Unmute",nowPlaying:"Now playing",upNext:"Up next",playFromLibrary:"Open in player",countOne:"{count} track",countMany:"{count} tracks"},footer:{tagline:"Open source music downloader"}},cp={language:{name:"Español"},common:{cancel:"Cancelar",save:"Guardar",close:"Cerrar",delete:"Eliminar",refresh:"Actualizar",download:"Descargar",unknownArtist:"Artista desconocido",unknownTrack:"Pista desconocida",previousPage:"Página anterior",nextPage:"Página siguiente"},nav:{home:"Inicio",library:"Biblioteca",monitor:"Monitor de listas",queue:"Cola",player:"Reproductor",settings:"Ajustes",switchToLight:"Cambiar a claro",switchToDark:"Cambiar a oscuro"},hero:{noAccount:"sin cuenta de Spotify",tagline:"Tu música con metadatos completos, portada y letras — en un clic.",songs:"Canciones",albums:"Álbumes",playlists:"Listas"},search:{placeholder:"Busca o pega un enlace de Spotify o YouTube Music…",title:"Resultados de búsqueda",matchesFor:"Mostrando coincidencias para",songsCount:"— {count} canción",songsCountPlural:"— {count} canciones",typeToBegin:"Escribe algo en la barra de búsqueda para empezar.",error:"Algo salió mal.",errorWithDetail:"Algo salió mal: {detail}",empty:"No se encontraron canciones.",emptyHint:"Prueba con otra búsqueda — artista + título suele funcionar mejor.",openOnSpotify:"Abrir en Spotify",inQueue:"En la cola",download:"Descargar",previousPage:"Página anterior",nextPage:"Página siguiente"},queue:{title:"Cola de descargas",subtitle:"Canciones en cola. Filtra por activas o fallidas. Una playlist nueva de Spotify quita las terminadas y conserva los fallos.",empty:"No hay nada en la cola ahora mismo.",emptyHint:"Busca una canción y pulsa descargar para empezar.",emptyFilter:"Ninguna pista coincide con este filtro.",filterAll:"Todas",filterActive:"En curso",filterQueued:"En espera",filterDone:"Hechas",filterFailed:"Fallidas",statusQueued:"En espera",statusActive:"En curso",statusDownloading:"Descargando",statusDone:"Hecha",statusFailed:"Fallida",retry:"Reintentar descarga",retryAllFailed:"Reintentar fallidas ({count})",clearCompleted:"Quitar hechas ({count})",saveToDevice:"Guardar en el dispositivo",removeFromQueue:"Quitar de la cola",clearAll:"Limpiar todo",clearAllPrompt:"¿Eliminar todos los elementos de la cola?",forceAudio:"Usar una URL de YouTube",overridePlaceholder:"Pega una URL de YouTube o YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL de YouTube no válida"},library:{title:"Biblioteca",subtitle:"Música que ya has descargado. Escucha, descarga otra vez o elimina.",empty:"Aún no hay descargas.",emptyHint:"Encuentra una canción para empezar a llenar tu biblioteca.",failedLoad:"No se pudieron cargar las descargas.",failedDelete:"No se pudo eliminar {file}",deletePrompt:'¿Eliminar "{file}"?',countOne:"{count} archivo en tu biblioteca",countMany:"{count} archivos en tu biblioteca",downloadToDevice:"Descargar al dispositivo",deleteFile:"Eliminar archivo",play:"Reproducir"},monitor:{title:"Monitor de listas",subtitle:"Añade listas de Spotify para vigilar. Las nuevas pistas añadidas a esas listas se descargarán automáticamente.",watchNew:"Vigilar una nueva lista",urlPlaceholder:"Pega una URL de lista de Spotify…",watch:"Vigilar",failedAdd:"No se pudo añadir la lista. Comprueba la URL e inténtalo de nuevo.",empty:"Aún no hay listas vigiladas.",emptyHint:"Pega un enlace de lista de Spotify arriba para empezar.",active:"Activa",paused:"Pausada",everyInterval:"Cada {interval}",tracksOne:"{count} pista",tracksMany:"{count} pistas",checked:"Revisada {when}",notChecked:"Aún no revisada",pause:"Pausar vigilancia",resume:"Reanudar vigilancia",checkNow:"Revisar ahora",stop:"Dejar de vigilar",deletePrompt:'¿Dejar de vigilar "{name}"?',info:"Al añadir una lista, Downtify descarga todas las pistas que contenga en ese momento y la sigue vigilando. Cualquier canción añadida después en Spotify se detecta y descarga automáticamente en la siguiente revisión.",every15:"Cada 15 min",every30:"Cada 30 min",every1h:"Cada hora",every3h:"Cada 3 h",every6h:"Cada 6 h",every12h:"Cada 12 h",every1d:"Cada día",every1w:"Cada semana",every2w:"Cada 2 semanas",every1mo:"Cada mes",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 día",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mes",minSuffix:"min",hourSuffix:"h",daySuffix:"día",daysSuffix:"días",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mes",monthsSuffix:"meses",timeJustNow:"justo ahora",timeMinAgo:"hace {n} min",timeHourAgo:"hace {n} h",timeDayAgo:"hace {n} día(s)"},settings:{title:"Ajustes",subtitle:"Ajusta cómo Downtify descarga y etiqueta tu música.",audioSource:"Fuentes de audio (orden de respaldo)",audioSourceHint:"Activa una o más. Cada pista prueba las fuentes en orden (1, 2, 3) hasta que una funcione.",audioSourceReset:"Usar orden recomendado",lyricsSource:"Fuente de letras",lyricsHint:"solo lrclib está activo",downloadLyrics:"Descargar letras",downloadLyricsHint:"Incrusta letras en los archivos de audio y escribe archivos .lrc",lyricsProvider:"Proveedor",format:"Formato",quality:"Calidad",qualityIgnored:"ignorada (sin pérdidas)",playlistsSection:"Listas",generateM3u:"Generar archivo M3U para las listas",generateM3uHint:"Escribe Playlists/.m3u con rutas absolutas (/downloads/... y /slskd/...) para descargas y el Monitor.",syncNavidrome:"Crear lista en Navidrome",syncNavidromeHint:"Tras descargar una lista de Spotify, escanea la biblioteca y crea/actualiza una lista en Navidrome con el mismo nombre.",navidromeSection:"Navidrome",navidromeHint:"Usa la API Subsonic (como Explo). La carpeta de música en Navidrome debe apuntar a las descargas de Downtify.",navidromeEnabled:"Activar sincronización con Navidrome",navidromeEnabledHint:"Requiere URL, usuario y contraseña. La cuenta admin opcional inicia el escaneo de la biblioteca.",navidromeUrl:"URL de Navidrome (ejemplo: https://musica.ejemplo.com)",navidromeUsername:"Usuario de Navidrome",navidromePassword:"Contraseña de Navidrome",navidromeAdminUser:"Usuario admin (opcional, para escaneo)",navidromeAdminPassword:"Contraseña admin (opcional)",navidromePublic:"Lista pública en Navidrome",organizationSection:"Organización de archivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Guarda las canciones en subcarpetas con el nombre del artista. Las pistas de listas también se guardan en la carpeta del artista en lugar de la carpeta de la lista.",parallelDownloads:"Descargas paralelas",parallelDownloadsHint:"Número máximo de canciones descargadas simultáneamente. Valores más altos son más rápidos pero consumen más ancho de banda.",saved:"Cambios guardados",saveError:"No se pudieron guardar los ajustes.",language:"Idioma",languageHint:"Elige el idioma de la interfaz",slskdSection:"slskd",slskdHint:"Soulseek vía slskd. Con Navidrome activo, las listas se crean allí tras escanear la biblioteca; los archivos pueden quedarse en la carpeta slskd.",slskdEnabled:"Activar proveedor slskd",slskdEnabledHint:"Si está desactivado, slskd nunca se intentará en la cadena de fallback.",slskdBaseUrl:"URL base de slskd (ejemplo: https://slskd.ejemplo.com)",slskdApiKey:"API key de slskd",slskdSourceDirTitle:"Carpeta de descargas de slskd (en este contenedor)",slskdSourceDirBullet1:"slskd escribe aquí las transferencias completadas (ej. /slskd → music/slskd en el host).",slskdSourceDirBullet2:"Navidrome debe escanear la biblioteca que incluye esta carpeta.",slskdSourceDirBullet3:"Ruta que ve Downtify — no la ruta del host ni la URL web de slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads +Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Carpeta slskd en Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify detecta archivos slskd aquí. Sin copia a /downloads si “dejar en sitio” está activo.",slskdLeaveInPlace:"Dejar archivos slskd en su sitio",slskdLeaveInPlaceHint:"No copiar a /downloads. Etiquetar en sitio y añadir a listas de Navidrome tras el escaneo.",slskdDownloadTimeout:"Tiempo máximo slskd (segundos)",slskdQueuedTimeout:"Tiempo en cola sin progreso (segundos)",slskdTimeoutHint:'Si slskd no termina a tiempo, Downtify prueba el siguiente proveedor (YouTube). Baja el tiempo en cola si se queda en "Queued on slskd".'},player:{title:"Reproductor",subtitle:"Escucha la música que has descargado.",empty:"Nada que reproducir aún",emptyHint:"Descarga música para empezar a escuchar.",queue:"Cola",play:"Reproducir",pause:"Pausar",previous:"Anterior",next:"Siguiente",shuffle:"Aleatorio",shuffleOn:"Aleatorio activado",shuffleOff:"Aleatorio desactivado",repeatOff:"Repetición desactivada",repeatAll:"Repetir todo",repeatOne:"Repetir una",volume:"Volumen",mute:"Silenciar",unmute:"Activar sonido",nowPlaying:"Sonando ahora",upNext:"A continuación",playFromLibrary:"Abrir en el reproductor",countOne:"{count} pista",countMany:"{count} pistas"},footer:{tagline:"Descargador de música de código abierto"}},up={language:{name:"Português (BR)"},common:{cancel:"Cancelar",save:"Salvar",close:"Fechar",delete:"Excluir",refresh:"Atualizar",download:"Baixar",unknownArtist:"Artista desconhecido",unknownTrack:"Faixa desconhecida",previousPage:"Página anterior",nextPage:"Próxima página"},nav:{home:"Início",library:"Biblioteca",monitor:"Monitor de playlists",queue:"Fila",player:"Player",settings:"Configurações",switchToLight:"Mudar para claro",switchToDark:"Mudar para escuro"},hero:{noAccount:"sem precisar de conta no Spotify",tagline:"Sua música com metadados completos, capa do álbum e letras — em um clique.",songs:"Músicas",albums:"Álbuns",playlists:"Playlists"},search:{placeholder:"Busque uma música ou cole um link do Spotify ou YouTube Music…",title:"Resultados da busca",matchesFor:"Mostrando resultados para",songsCount:"— {count} música",songsCountPlural:"— {count} músicas",typeToBegin:"Digite algo na barra de busca para começar.",error:"Algo deu errado.",errorWithDetail:"Algo deu errado: {detail}",empty:"Nenhuma música encontrada.",emptyHint:"Tente outra busca — artista + título costuma funcionar melhor.",openOnSpotify:"Abrir no Spotify",inQueue:"Na fila",download:"Baixar",previousPage:"Página anterior",nextPage:"Próxima página"},queue:{title:"Fila de download",subtitle:"Músicas na fila. Filtre o que está ativo ou com falha. Uma playlist nova do Spotify remove as concluídas e mantém as com erro.",empty:"Nada na fila no momento.",emptyHint:"Procure uma música e clique em baixar para começar.",emptyFilter:"Nenhuma faixa neste filtro.",filterAll:"Todas",filterActive:"Em andamento",filterQueued:"Aguardando",filterDone:"Concluídas",filterFailed:"Com falha",statusQueued:"Aguardando",statusActive:"Em andamento",statusDownloading:"Baixando",statusDone:"Concluída",statusFailed:"Falhou",retry:"Tentar de novo",retryAllFailed:"Repetir falhas ({count})",clearCompleted:"Limpar concluídas ({count})",saveToDevice:"Salvar no dispositivo",removeFromQueue:"Remover da fila",clearAll:"Limpar tudo",clearAllPrompt:"Remover todos os itens da fila?",forceAudio:"Usar URL do YouTube",overridePlaceholder:"Cole uma URL do YouTube ou YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL do YouTube inválida"},library:{title:"Biblioteca",subtitle:"Músicas que você já baixou. Escute, baixe novamente ou remova.",empty:"Nenhum download ainda.",emptyHint:"Encontre uma música para começar a montar sua biblioteca.",failedLoad:"Falha ao carregar os downloads.",failedDelete:"Falha ao excluir {file}",deletePrompt:'Excluir "{file}"?',countOne:"{count} arquivo na sua biblioteca",countMany:"{count} arquivos na sua biblioteca",downloadToDevice:"Baixar para o dispositivo",deleteFile:"Excluir arquivo",play:"Reproduzir"},monitor:{title:"Monitor de playlists",subtitle:"Adicione playlists do Spotify para monitorar. Novas faixas adicionadas a essas playlists serão baixadas automaticamente.",watchNew:"Monitorar uma nova playlist",urlPlaceholder:"Cole uma URL de playlist do Spotify…",watch:"Monitorar",failedAdd:"Falha ao adicionar a playlist. Verifique a URL e tente novamente.",empty:"Nenhuma playlist sendo monitorada ainda.",emptyHint:"Cole um link de playlist do Spotify acima para começar.",active:"Ativa",paused:"Pausada",everyInterval:"A cada {interval}",tracksOne:"{count} faixa",tracksMany:"{count} faixas",checked:"Verificada {when}",notChecked:"Ainda não verificada",pause:"Pausar monitoramento",resume:"Retomar monitoramento",checkNow:"Verificar agora",stop:"Parar de monitorar",deletePrompt:'Parar de monitorar "{name}"?',info:"Quando você adiciona uma playlist, o Downtify baixa todas as faixas atuais dela e segue monitorando. Qualquer música adicionada depois no Spotify é detectada e baixada automaticamente na próxima verificação.",every15:"A cada 15 min",every30:"A cada 30 min",every1h:"A cada hora",every3h:"A cada 3 h",every6h:"A cada 6 h",every12h:"A cada 12 h",every1d:"Todo dia",every1w:"Toda semana",every2w:"A cada 2 semanas",every1mo:"Todo mês",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 dia",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mês",minSuffix:"min",hourSuffix:"h",daySuffix:"dia",daysSuffix:"dias",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mês",monthsSuffix:"meses",timeJustNow:"agora mesmo",timeMinAgo:"há {n} min",timeHourAgo:"há {n} h",timeDayAgo:"há {n} dia(s)"},settings:{title:"Configurações",subtitle:"Ajuste como o Downtify baixa e marca suas músicas.",audioSource:"Fontes de áudio (ordem de fallback)",audioSourceHint:"Ative uma ou mais. Cada faixa tenta as fontes na ordem (1, 2, 3) até uma funcionar.",audioSourceReset:"Usar ordem recomendada",lyricsSource:"Fonte de letras",lyricsHint:"apenas o lrclib está ativo",downloadLyrics:"Baixar letras",downloadLyricsHint:"Incorpora letras nos arquivos de áudio e grava arquivos .lrc",lyricsProvider:"Provedor",format:"Formato",quality:"Qualidade",qualityIgnored:"ignorada (sem perdas)",playlistsSection:"Playlists",generateM3u:"Gerar arquivo M3U para playlists",generateM3uHint:"Grava Playlists/.m3u com caminhos absolutos (/downloads/... e /slskd/...) para downloads e o Monitor.",syncNavidrome:"Criar playlist no Navidrome",syncNavidromeHint:"Depois de baixar uma playlist do Spotify, escaneia a biblioteca e cria/atualiza uma playlist no Navidrome com o mesmo nome.",navidromeSection:"Navidrome",navidromeHint:"Usa a API Subsonic (como o Explo). A pasta de música no Navidrome deve apontar para os downloads do Downtify.",navidromeEnabled:"Ativar sincronização com Navidrome",navidromeEnabledHint:"Exige URL, usuário e senha. Conta admin opcional dispara varredura da biblioteca.",navidromeUrl:"URL do Navidrome (exemplo: https://musica.exemplo.com)",navidromeUsername:"Usuário do Navidrome",navidromePassword:"Senha do Navidrome",navidromeAdminUser:"Usuário admin (opcional, para varredura)",navidromeAdminPassword:"Senha admin (opcional)",navidromePublic:"Playlist pública no Navidrome",organizationSection:"Organização de arquivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Salva as músicas em subpastas com o nome do artista. Músicas de playlists também são salvas na pasta do artista, não na pasta da playlist.",parallelDownloads:"Downloads paralelos",parallelDownloadsHint:"Número máximo de músicas baixadas ao mesmo tempo. Valores maiores são mais rápidos, mas consomem mais banda.",saved:"Alterações salvas",saveError:"Não foi possível salvar as configurações.",language:"Idioma",languageHint:"Escolha o idioma da interface",slskdSection:"slskd",slskdHint:"Soulseek via slskd. Com Navidrome ativo, playlists são criadas lá após varrer a biblioteca; arquivos podem ficar na pasta do slskd.",slskdEnabled:"Ativar provedor slskd",slskdEnabledHint:"Quando desativado, o slskd nunca é tentado na cadeia de fallback.",slskdBaseUrl:"URL base do slskd (exemplo: https://slskd.exemplo.com)",slskdApiKey:"API key do slskd",slskdSourceDirTitle:"Pasta de download do slskd (neste container)",slskdSourceDirBullet1:"O slskd grava transferências concluídas aqui (ex.: /slskd → music/slskd no host).",slskdSourceDirBullet2:"O Navidrome deve varrer a biblioteca que inclui esta pasta.",slskdSourceDirBullet3:"Caminho visto pelo Downtify — não o caminho do host nem a URL do slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads +Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Pasta slskd no Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"O Downtify observa esta pasta. Sem cópia para /downloads com “deixar no lugar” ativo.",slskdLeaveInPlace:"Deixar arquivos do slskd no lugar",slskdLeaveInPlaceHint:"Não copiar para /downloads. Taguear no lugar e montar playlists no Navidrome após o scan.",slskdDownloadTimeout:"Tempo máximo slskd (segundos)",slskdQueuedTimeout:"Tempo na fila sem progresso (segundos)",slskdTimeoutHint:'Se o slskd não terminar a tempo, o Downtify tenta o próximo provedor (YouTube). Reduza o tempo na fila se ficar em "Queued on slskd".'},player:{title:"Player",subtitle:"Ouça as músicas que você baixou.",empty:"Nada para tocar ainda",emptyHint:"Baixe alguma música para começar a ouvir.",queue:"Fila",play:"Reproduzir",pause:"Pausar",previous:"Anterior",next:"Próxima",shuffle:"Aleatório",shuffleOn:"Aleatório ligado",shuffleOff:"Aleatório desligado",repeatOff:"Repetição desligada",repeatAll:"Repetir tudo",repeatOne:"Repetir uma",volume:"Volume",mute:"Mudo",unmute:"Tirar mudo",nowPlaying:"Tocando agora",upNext:"A seguir",playFromLibrary:"Abrir no player",countOne:"{count} faixa",countMany:"{count} faixas"},footer:{tagline:"Baixador de músicas de código aberto"}},ws=[{code:"en",name:"English",messages:ap},{code:"es",name:"Español",messages:cp},{code:"pt-BR",name:"Português (BR)",messages:up}],mo="en",Tc="downtify-locale",gl=(()=>{try{return localStorage.getItem(Tc)}catch{return null}})(),dp=ws.find(e=>e.code===gl)?gl:mo,Oo=te(dp);function yl(e){return ws.find(t=>t.code===e)||ws.find(t=>t.code===mo)}function vl(e,t){if(!e)return;const n=t.split(".");let s=e;for(const o of n){if(s==null||typeof s!="object")return;s=s[o]}return typeof s=="string"?s:void 0}function fp(e,t){return t?e.replace(/\{(\w+)\}/g,(n,s)=>t[s]!==void 0&&t[s]!==null?String(t[s]):`{${s}}`):e}function pp(e,t){const n=Oo.value;let s=vl(yl(n).messages,e);return s===void 0&&n!==mo&&(s=vl(yl(mo).messages,e)),fp(s!==void 0?s:e,t)}function hp(e){if(ws.find(t=>t.code===e)){Oo.value=e;try{localStorage.setItem(Tc,e)}catch{}typeof document<"u"&&document.documentElement.setAttribute("lang",e)}}function St(){return{t:pp,locale:Oo,setLocale:hp,locales:ws}}typeof document<"u"&&document.documentElement.setAttribute("lang",Oo.value);const mp={class:"mt-auto px-6 py-6 text-center text-sm text-base-content/60"},gp={__name:"Footer",setup(e){const{t}=St();return(n,s)=>(A(),T("footer",mp,[s[0]||(s[0]=p("a",{class:"font-semibold text-primary hover:underline",href:"https://github.com/henriquesebastiao/downtify",target:"_blank",rel:"noopener"},"Downtify",-1)),s[1]||(s[1]=p("span",{class:"mx-2 opacity-50"},"·",-1)),p("span",null,w(u(t)("footer.tagline")),1)]))}},Pc=/^[a-z0-9]+(-[a-z0-9]+)*$/,Do=(e,t,n,s="")=>{const o=e.split(":");if(e.slice(0,1)==="@"){if(o.length<2||o.length>3)return null;s=o.shift().slice(1)}if(o.length>3||!o.length)return null;if(o.length>1){const l=o.pop(),a=o.pop(),d={provider:o.length>0?o[0]:s,prefix:a,name:l};return t&&!Zs(d)?null:d}const r=o[0],i=r.split("-");if(i.length>1){const l={provider:s,prefix:i.shift(),name:i.join("-")};return t&&!Zs(l)?null:l}if(n&&s===""){const l={provider:s,prefix:"",name:r};return t&&!Zs(l,n)?null:l}return null},Zs=(e,t)=>e?!!((t&&e.prefix===""||e.prefix)&&e.name):!1,Oc=Object.freeze({left:0,top:0,width:16,height:16}),go=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),No=Object.freeze({...Oc,...go}),Cr=Object.freeze({...No,body:"",hidden:!1});function yp(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const s=((e.rotate||0)+(t.rotate||0))%4;return s&&(n.rotate=s),n}function bl(e,t){const n=yp(e,t);for(const s in Cr)s in go?s in e&&!(s in n)&&(n[s]=go[s]):s in t?n[s]=t[s]:s in e&&(n[s]=e[s]);return n}function vp(e,t){const n=e.icons,s=e.aliases||Object.create(null),o=Object.create(null);function r(i){if(n[i])return o[i]=[];if(!(i in o)){o[i]=null;const l=s[i]&&s[i].parent,a=l&&r(l);a&&(o[i]=[l].concat(a))}return o[i]}return Object.keys(n).concat(Object.keys(s)).forEach(r),o}function bp(e,t,n){const s=e.icons,o=e.aliases||Object.create(null);let r={};function i(l){r=bl(s[l]||o[l],r)}return i(t),n.forEach(i),bl(e,r)}function Dc(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(o=>{t(o,null),n.push(o)});const s=vp(e);for(const o in s){const r=s[o];r&&(t(o,bp(e,o,r)),n.push(o))}return n}const _p={provider:"",aliases:{},not_found:{},...Oc};function nr(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function Nc(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!nr(e,_p))return null;const n=t.icons;for(const o in n){const r=n[o];if(!o||typeof r.body!="string"||!nr(r,Cr))return null}const s=t.aliases||Object.create(null);for(const o in s){const r=s[o],i=r.parent;if(!o||typeof i!="string"||!n[i]&&!s[i]||!nr(r,Cr))return null}return t}const _l=Object.create(null);function xp(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function Un(e,t){const n=_l[e]||(_l[e]=Object.create(null));return n[t]||(n[t]=xp(e,t))}function Ic(e,t){return Nc(t)?Dc(t,(n,s)=>{s?e.icons[n]=s:e.missing.add(n)}):[]}function wp(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let ks=!1;function $c(e){return typeof e=="boolean"&&(ks=e),ks}function kp(e){const t=typeof e=="string"?Do(e,!0,ks):e;if(t){const n=Un(t.provider,t.prefix),s=t.name;return n.icons[s]||(n.missing.has(s)?null:void 0)}}function Sp(e,t){const n=Do(e,!0,ks);if(!n)return!1;const s=Un(n.provider,n.prefix);return t?wp(s,n.name,t):(s.missing.add(n.name),!0)}function Ep(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),ks&&!t&&!e.prefix){let o=!1;return Nc(e)&&(e.prefix="",Dc(e,(r,i)=>{Sp(r,i)&&(o=!0)})),o}const n=e.prefix;if(!Zs({prefix:n,name:"a"}))return!1;const s=Un(t,n);return!!Ic(s,e)}const Lc=Object.freeze({width:null,height:null}),Fc=Object.freeze({...Lc,...go}),Ap=/(-?[0-9.]*[0-9]+[0-9.]*)/g,Rp=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function xl(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const s=e.split(Ap);if(s===null||!s.length)return e;const o=[];let r=s.shift(),i=Rp.test(r);for(;;){if(i){const l=parseFloat(r);isNaN(l)?o.push(r):o.push(Math.ceil(l*t*n)/n)}else o.push(r);if(r=s.shift(),r===void 0)return o.join("");i=!i}}function Cp(e,t="defs"){let n="";const s=e.indexOf("<"+t);for(;s>=0;){const o=e.indexOf(">",s),r=e.indexOf("",r);if(i===-1)break;n+=e.slice(o+1,r).trim(),e=e.slice(0,s).trim()+e.slice(i+1)}return{defs:n,content:e}}function Tp(e,t){return e?""+e+""+t:t}function Pp(e,t,n){const s=Cp(e);return Tp(s.defs,t+s.content+n)}const Op=e=>e==="unset"||e==="undefined"||e==="none";function Dp(e,t){const n={...No,...e},s={...Fc,...t},o={left:n.left,top:n.top,width:n.width,height:n.height};let r=n.body;[n,s].forEach(v=>{const h=[],k=v.hFlip,R=v.vFlip;let S=v.rotate;k?R?S+=2:(h.push("translate("+(o.width+o.left).toString()+" "+(0-o.top).toString()+")"),h.push("scale(-1 1)"),o.top=o.left=0):R&&(h.push("translate("+(0-o.left).toString()+" "+(o.height+o.top).toString()+")"),h.push("scale(1 -1)"),o.top=o.left=0);let C;switch(S<0&&(S-=Math.floor(S/4)*4),S=S%4,S){case 1:C=o.height/2+o.top,h.unshift("rotate(90 "+C.toString()+" "+C.toString()+")");break;case 2:h.unshift("rotate(180 "+(o.width/2+o.left).toString()+" "+(o.height/2+o.top).toString()+")");break;case 3:C=o.width/2+o.left,h.unshift("rotate(-90 "+C.toString()+" "+C.toString()+")");break}S%2===1&&(o.left!==o.top&&(C=o.left,o.left=o.top,o.top=C),o.width!==o.height&&(C=o.width,o.width=o.height,o.height=C)),h.length&&(r=Pp(r,'',""))});const i=s.width,l=s.height,a=o.width,d=o.height;let c,f;i===null?(f=l===null?"1em":l==="auto"?d:l,c=xl(f,a/d)):(c=i==="auto"?a:i,f=l===null?xl(c,d/a):l==="auto"?d:l);const m={},b=(v,h)=>{Op(h)||(m[v]=h.toString())};b("width",c),b("height",f);const y=[o.left,o.top,a,d];return m.viewBox=y.join(" "),{attributes:m,viewBox:y,body:r}}const Np=/\sid="(\S+)"/g,Ip="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let $p=0;function Lp(e,t=Ip){const n=[];let s;for(;s=Np.exec(e);)n.push(s[1]);if(!n.length)return e;const o="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(r=>{const i=typeof t=="function"?t(r):t+($p++).toString(),l=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+i+o+"$3")}),e=e.replace(new RegExp(o,"g"),""),e}const Tr=Object.create(null);function Fp(e,t){Tr[e]=t}function Pr(e){return Tr[e]||Tr[""]}function ci(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const ui=Object.create(null),Zn=["https://api.simplesvg.com","https://api.unisvg.com"],eo=[];for(;Zn.length>0;)Zn.length===1||Math.random()>.5?eo.push(Zn.shift()):eo.push(Zn.pop());ui[""]=ci({resources:["https://api.iconify.design"].concat(eo)});function Mp(e,t){const n=ci(t);return n===null?!1:(ui[e]=n,!0)}function di(e){return ui[e]}const Up=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let wl=Up();function Bp(e,t){const n=di(e);if(!n)return 0;let s;if(!n.maxURL)s=0;else{let o=0;n.resources.forEach(i=>{o=Math.max(o,i.length)});const r=t+".json?icons=";s=n.maxURL-o-n.path.length-r.length}return s}function Hp(e){return e===404}const jp=(e,t,n)=>{const s=[],o=Bp(e,t),r="icons";let i={type:r,provider:e,prefix:t,icons:[]},l=0;return n.forEach((a,d)=>{l+=a.length+1,l>=o&&d>0&&(s.push(i),i={type:r,provider:e,prefix:t,icons:[]},l=a.length),i.icons.push(a)}),s.push(i),s};function qp(e){if(typeof e=="string"){const t=di(e);if(t)return t.path}return"/"}const Vp=(e,t,n)=>{if(!wl){n("abort",424);return}let s=qp(t.provider);switch(t.type){case"icons":{const r=t.prefix,l=t.icons.join(","),a=new URLSearchParams({icons:l});s+=r+".json?"+a.toString();break}case"custom":{const r=t.uri;s+=r.slice(0,1)==="/"?r.slice(1):r;break}default:n("abort",400);return}let o=503;wl(e+s).then(r=>{const i=r.status;if(i!==200){setTimeout(()=>{n(Hp(i)?"abort":"next",i)});return}return o=501,r.json()}).then(r=>{if(typeof r!="object"||r===null){setTimeout(()=>{r===404?n("abort",r):n("next",o)});return}setTimeout(()=>{n("success",r)})}).catch(()=>{n("next",o)})},Wp={prepare:jp,send:Vp};function Kp(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((o,r)=>o.provider!==r.provider?o.provider.localeCompare(r.provider):o.prefix!==r.prefix?o.prefix.localeCompare(r.prefix):o.name.localeCompare(r.name));let s={provider:"",prefix:"",name:""};return e.forEach(o=>{if(s.name===o.name&&s.prefix===o.prefix&&s.provider===o.provider)return;s=o;const r=o.provider,i=o.prefix,l=o.name,a=n[r]||(n[r]=Object.create(null)),d=a[i]||(a[i]=Un(r,i));let c;l in d.icons?c=t.loaded:i===""||d.missing.has(l)?c=t.missing:c=t.pending;const f={provider:r,prefix:i,name:l};c.push(f)}),t}function Mc(e,t){e.forEach(n=>{const s=n.loaderCallbacks;s&&(n.loaderCallbacks=s.filter(o=>o.id!==t))})}function zp(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const s=e.provider,o=e.prefix;t.forEach(r=>{const i=r.icons,l=i.pending.length;i.pending=i.pending.filter(a=>{if(a.prefix!==o)return!0;const d=a.name;if(e.icons[d])i.loaded.push({provider:s,prefix:o,name:d});else if(e.missing.has(d))i.missing.push({provider:s,prefix:o,name:d});else return n=!0,!0;return!1}),i.pending.length!==l&&(n||Mc([e],r.id),r.callback(i.loaded.slice(0),i.missing.slice(0),i.pending.slice(0),r.abort))})}))}let Qp=0;function Gp(e,t,n){const s=Qp++,o=Mc.bind(null,n,s);if(!t.pending.length)return o;const r={id:s,icons:t,callback:e,abort:o};return n.forEach(i=>{(i.loaderCallbacks||(i.loaderCallbacks=[])).push(r)}),o}function Jp(e,t=!0,n=!1){const s=[];return e.forEach(o=>{const r=typeof o=="string"?Do(o,t,n):o;r&&s.push(r)}),s}var Yp={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function Xp(e,t,n,s){const o=e.resources.length,r=e.random?Math.floor(Math.random()*o):e.index;let i;if(e.random){let P=e.resources.slice(0);for(i=[];P.length>1;){const U=Math.floor(Math.random()*P.length);i.push(P[U]),P=P.slice(0,U).concat(P.slice(U+1))}i=i.concat(P)}else i=e.resources.slice(r).concat(e.resources.slice(0,r));const l=Date.now();let a="pending",d=0,c,f=null,m=[],b=[];typeof s=="function"&&b.push(s);function y(){f&&(clearTimeout(f),f=null)}function v(){a==="pending"&&(a="aborted"),y(),m.forEach(P=>{P.status==="pending"&&(P.status="aborted")}),m=[]}function h(P,U){U&&(b=[]),typeof P=="function"&&b.push(P)}function k(){return{startTime:l,payload:t,status:a,queriesSent:d,queriesPending:m.length,subscribe:h,abort:v}}function R(){a="failed",b.forEach(P=>{P(void 0,c)})}function S(){m.forEach(P=>{P.status==="pending"&&(P.status="aborted")}),m=[]}function C(P,U,ae){const $=U!=="success";switch(m=m.filter(K=>K!==P),a){case"pending":break;case"failed":if($||!e.dataAfterTimeout)return;break;default:return}if(U==="abort"){c=ae,R();return}if($){c=ae,m.length||(i.length?L():R());return}if(y(),S(),!e.random){const K=e.resources.indexOf(P.resource);K!==-1&&K!==e.index&&(e.index=K)}a="completed",b.forEach(K=>{K(ae)})}function L(){if(a!=="pending")return;y();const P=i.shift();if(P===void 0){if(m.length){f=setTimeout(()=>{y(),a==="pending"&&(S(),R())},e.timeout);return}R();return}const U={status:"pending",resource:P,callback:(ae,$)=>{C(U,ae,$)}};m.push(U),d++,f=setTimeout(L,e.rotate),n(P,t,U.callback)}return setTimeout(L),k}function Uc(e){const t={...Yp,...e};let n=[];function s(){n=n.filter(l=>l().status==="pending")}function o(l,a,d){const c=Xp(t,l,a,(f,m)=>{s(),d&&d(f,m)});return n.push(c),c}function r(l){return n.find(a=>l(a))||null}return{query:o,find:r,setIndex:l=>{t.index=l},getIndex:()=>t.index,cleanup:s}}function kl(){}const sr=Object.create(null);function Zp(e){if(!sr[e]){const t=di(e);if(!t)return;const n=Uc(t),s={config:t,redundancy:n};sr[e]=s}return sr[e]}function eh(e,t,n){let s,o;if(typeof e=="string"){const r=Pr(e);if(!r)return n(void 0,424),kl;o=r.send;const i=Zp(e);i&&(s=i.redundancy)}else{const r=ci(e);if(r){s=Uc(r);const i=e.resources?e.resources[0]:"",l=Pr(i);l&&(o=l.send)}}return!s||!o?(n(void 0,424),kl):s.query(t,o,n)().abort}function Sl(){}function th(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,zp(e)}))}function nh(e){const t=[],n=[];return e.forEach(s=>{(s.match(Pc)?t:n).push(s)}),{valid:t,invalid:n}}function es(e,t,n){function s(){const o=e.pendingIcons;t.forEach(r=>{o&&o.delete(r),e.icons[r]||e.missing.add(r)})}if(n&&typeof n=="object")try{if(!Ic(e,n).length){s();return}}catch(o){console.error(o)}s(),th(e)}function El(e,t){e instanceof Promise?e.then(n=>{t(n)}).catch(()=>{t(null)}):t(e)}function sh(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:s}=e,o=e.iconsToLoad;if(delete e.iconsToLoad,!o||!o.length)return;const r=e.loadIcon;if(e.loadIcons&&(o.length>1||!r)){El(e.loadIcons(o,s,n),c=>{es(e,o,c)});return}if(r){o.forEach(c=>{const f=r(c,s,n);El(f,m=>{const b=m?{prefix:s,icons:{[c]:m}}:null;es(e,[c],b)})});return}const{valid:i,invalid:l}=nh(o);if(l.length&&es(e,l,null),!i.length)return;const a=s.match(Pc)?Pr(n):null;if(!a){es(e,i,null);return}a.prepare(n,s,i).forEach(c=>{eh(n,c,f=>{es(e,c.icons,f)})})}))}const oh=(e,t)=>{const n=Jp(e,!0,$c()),s=Kp(n);if(!s.pending.length){let a=!0;return t&&setTimeout(()=>{a&&t(s.loaded,s.missing,s.pending,Sl)}),()=>{a=!1}}const o=Object.create(null),r=[];let i,l;return s.pending.forEach(a=>{const{provider:d,prefix:c}=a;if(c===l&&d===i)return;i=d,l=c,r.push(Un(d,c));const f=o[d]||(o[d]=Object.create(null));f[c]||(f[c]=[])}),s.pending.forEach(a=>{const{provider:d,prefix:c,name:f}=a,m=Un(d,c),b=m.pendingIcons||(m.pendingIcons=new Set);b.has(f)||(b.add(f),o[d][c].push(f))}),r.forEach(a=>{const d=o[a.provider][a.prefix];d.length&&sh(a,d)}),t?Gp(t,s,r):Sl};function rh(e,t){const n={...e};for(const s in t){const o=t[s],r=typeof o;s in Lc?(o===null||o&&(r==="string"||r==="number"))&&(n[s]=o):r===typeof n[s]&&(n[s]=s==="rotate"?o%4:o)}return n}const ih=/[\s,]+/;function lh(e,t){t.split(ih).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function ah(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function s(o){for(;o<0;)o+=4;return o%4}if(n===""){const o=parseInt(e);return isNaN(o)?0:s(o)}else if(n!==e){let o=0;switch(n){case"%":o=25;break;case"deg":o=90}if(o){let r=parseFloat(e.slice(0,e.length-n.length));return isNaN(r)?0:(r=r/o,r%1===0?s(r):0)}}return t}function ch(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const s in t)n+=" "+s+'="'+t[s]+'"';return'"+e+""}function uh(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function dh(e){return"data:image/svg+xml,"+uh(e)}function fh(e){return'url("'+dh(e)+'")'}const Al={...Fc,inline:!1},ph={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},hh={display:"inline-block"},Or={backgroundColor:"currentColor"},Bc={backgroundColor:"transparent"},Rl={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Cl={webkitMask:Or,mask:Or,background:Bc};for(const e in Cl){const t=Cl[e];for(const n in Rl)t[e+n]=Rl[n]}const to={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";to[e+"-flip"]=t,to[e.slice(0,1)+"-flip"]=t,to[e+"Flip"]=t});function Tl(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const Pl=(e,t)=>{const n=rh(Al,t),s={...ph},o=t.mode||"svg",r={},i=t.style,l=typeof i=="object"&&!(i instanceof Array)?i:{};for(let v in t){const h=t[v];if(h!==void 0)switch(v){case"icon":case"style":case"onLoad":case"mode":case"ssr":break;case"inline":case"hFlip":case"vFlip":n[v]=h===!0||h==="true"||h===1;break;case"flip":typeof h=="string"&&lh(n,h);break;case"color":r.color=h;break;case"rotate":typeof h=="string"?n[v]=ah(h):typeof h=="number"&&(n[v]=h);break;case"ariaHidden":case"aria-hidden":h!==!0&&h!=="true"&&delete s["aria-hidden"];break;default:{const k=to[v];k?(h===!0||h==="true"||h===1)&&(n[k]=!0):Al[v]===void 0&&(s[v]=h)}}}const a=Dp(e,n),d=a.attributes;if(n.inline&&(r.verticalAlign="-0.125em"),o==="svg"){s.style={...r,...l},Object.assign(s,d);let v=0,h=t.id;return typeof h=="string"&&(h=h.replace(/-/g,"_")),s.innerHTML=Lp(a.body,h?()=>h+"ID"+v++:"iconifyVue"),bs("svg",s)}const{body:c,width:f,height:m}=e,b=o==="mask"||(o==="bg"?!1:c.indexOf("currentColor")!==-1),y=ch(c,{...d,width:f+"",height:m+""});return s.style={...r,"--svg":fh(y),width:Tl(d.width),height:Tl(d.height),...hh,...b?Or:Bc,...l},bs("span",s)};$c(!0);Fp("",Wp);if(typeof document<"u"&&typeof window<"u"){const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(s=>{try{(typeof s!="object"||s===null||s instanceof Array||typeof s.icons!="object"||typeof s.prefix!="string"||!Ep(s))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const s="IconifyProviders["+n+"] is invalid.";try{const o=t[n];if(typeof o!="object"||!o||o.resources===void 0)continue;Mp(n,o)||console.error(s)}catch{console.error(s)}}}}const mh={...No,body:""},G=si({inheritAttrs:!1,data(){return{_name:"",_loadingIcon:null,iconMounted:!1,counter:0}},mounted(){this.iconMounted=!0},unmounted(){this.abortLoading()},methods:{abortLoading(){this._loadingIcon&&(this._loadingIcon.abort(),this._loadingIcon=null)},getIcon(e,t,n){if(typeof e=="object"&&e!==null&&typeof e.body=="string")return this._name="",this.abortLoading(),{data:e};let s;if(typeof e!="string"||(s=Do(e,!1,!0))===null)return this.abortLoading(),null;let o=kp(s);if(!o)return(!this._loadingIcon||this._loadingIcon.name!==e)&&(this.abortLoading(),this._name="",o!==null&&(this._loadingIcon={name:e,abort:oh([s],()=>{this.counter++})})),null;if(this.abortLoading(),this._name!==e&&(this._name=e,t&&t(e)),n){o=Object.assign({},o);const i=n(o.body,s.name,s.prefix,s.provider);typeof i=="string"&&(o.body=i)}const r=["iconify"];return s.prefix!==""&&r.push("iconify--"+s.prefix),s.provider!==""&&r.push("iconify--"+s.provider),{data:o,classes:r}}},render(){this.counter;const e=this.$attrs,t=this.iconMounted||e.ssr?this.getIcon(e.icon,e.onLoad,e.customise):null;if(!t)return Pl(mh,e);let n=e;return t.classes&&(n={...e,class:(typeof e.class=="string"?e.class+" ":"")+t.classes.join(" ")}),Pl({...No,...t.data},n)}});function Hc(e,t){return function(){return e.apply(t,arguments)}}const{toString:gh}=Object.prototype,{getPrototypeOf:fi}=Object,{iterator:Io,toStringTag:jc}=Symbol,$o=(e=>t=>{const n=gh.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Et=e=>(e=e.toLowerCase(),t=>$o(t)===e),Lo=e=>t=>typeof t===e,{isArray:Kn}=Array,Bn=Lo("undefined");function Cs(e){return e!==null&&!Bn(e)&&e.constructor!==null&&!Bn(e.constructor)&&tt(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const qc=Et("ArrayBuffer");function yh(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&qc(e.buffer),t}const vh=Lo("string"),tt=Lo("function"),Vc=Lo("number"),Ts=e=>e!==null&&typeof e=="object",bh=e=>e===!0||e===!1,no=e=>{if($o(e)!=="object")return!1;const t=fi(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(jc in e)&&!(Io in e)},_h=e=>{if(!Ts(e)||Cs(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},xh=Et("Date"),wh=Et("File"),kh=Et("Blob"),Sh=Et("FileList"),Eh=e=>Ts(e)&&tt(e.pipe),Ah=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||tt(e.append)&&((t=$o(e))==="formdata"||t==="object"&&tt(e.toString)&&e.toString()==="[object FormData]"))},Rh=Et("URLSearchParams"),[Ch,Th,Ph,Oh]=["ReadableStream","Request","Response","Headers"].map(Et),Dh=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ps(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let s,o;if(typeof e!="object"&&(e=[e]),Kn(e))for(s=0,o=e.length;s0;)if(o=n[s],t===o.toLowerCase())return o;return null}const _n=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Kc=e=>!Bn(e)&&e!==_n;function Dr(){const{caseless:e,skipUndefined:t}=Kc(this)&&this||{},n={},s=(o,r)=>{if(r==="__proto__"||r==="constructor"||r==="prototype")return;const i=e&&Wc(n,r)||r;no(n[i])&&no(o)?n[i]=Dr(n[i],o):no(o)?n[i]=Dr({},o):Kn(o)?n[i]=o.slice():(!t||!Bn(o))&&(n[i]=o)};for(let o=0,r=arguments.length;o(Ps(t,(o,r)=>{n&&tt(o)?Object.defineProperty(e,r,{value:Hc(o,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:s}),e),Ih=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),$h=(e,t,n,s)=>{e.prototype=Object.create(t.prototype,s),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},Lh=(e,t,n,s)=>{let o,r,i;const l={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),r=o.length;r-- >0;)i=o[r],(!s||s(i,e,t))&&!l[i]&&(t[i]=e[i],l[i]=!0);e=n!==!1&&fi(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Fh=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const s=e.indexOf(t,n);return s!==-1&&s===n},Mh=e=>{if(!e)return null;if(Kn(e))return e;let t=e.length;if(!Vc(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Uh=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&fi(Uint8Array)),Bh=(e,t)=>{const s=(e&&e[Io]).call(e);let o;for(;(o=s.next())&&!o.done;){const r=o.value;t.call(e,r[0],r[1])}},Hh=(e,t)=>{let n;const s=[];for(;(n=e.exec(t))!==null;)s.push(n);return s},jh=Et("HTMLFormElement"),qh=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,s,o){return s.toUpperCase()+o}),Ol=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Vh=Et("RegExp"),zc=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),s={};Ps(n,(o,r)=>{let i;(i=t(o,r,e))!==!1&&(s[r]=i||o)}),Object.defineProperties(e,s)},Wh=e=>{zc(e,(t,n)=>{if(tt(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const s=e[n];if(tt(s)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},Kh=(e,t)=>{const n={},s=o=>{o.forEach(r=>{n[r]=!0})};return Kn(e)?s(e):s(String(e).split(t)),n},zh=()=>{},Qh=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Gh(e){return!!(e&&tt(e.append)&&e[jc]==="FormData"&&e[Io])}const Jh=e=>{const t=new Array(10),n=(s,o)=>{if(Ts(s)){if(t.indexOf(s)>=0)return;if(Cs(s))return s;if(!("toJSON"in s)){t[o]=s;const r=Kn(s)?[]:{};return Ps(s,(i,l)=>{const a=n(i,o+1);!Bn(a)&&(r[l]=a)}),t[o]=void 0,r}}return s};return n(e,0)},Yh=Et("AsyncFunction"),Xh=e=>e&&(Ts(e)||tt(e))&&tt(e.then)&&tt(e.catch),Qc=((e,t)=>e?setImmediate:t?((n,s)=>(_n.addEventListener("message",({source:o,data:r})=>{o===_n&&r===n&&s.length&&s.shift()()},!1),o=>{s.push(o),_n.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",tt(_n.postMessage)),Zh=typeof queueMicrotask<"u"?queueMicrotask.bind(_n):typeof process<"u"&&process.nextTick||Qc,em=e=>e!=null&&tt(e[Io]),E={isArray:Kn,isArrayBuffer:qc,isBuffer:Cs,isFormData:Ah,isArrayBufferView:yh,isString:vh,isNumber:Vc,isBoolean:bh,isObject:Ts,isPlainObject:no,isEmptyObject:_h,isReadableStream:Ch,isRequest:Th,isResponse:Ph,isHeaders:Oh,isUndefined:Bn,isDate:xh,isFile:wh,isBlob:kh,isRegExp:Vh,isFunction:tt,isStream:Eh,isURLSearchParams:Rh,isTypedArray:Uh,isFileList:Sh,forEach:Ps,merge:Dr,extend:Nh,trim:Dh,stripBOM:Ih,inherits:$h,toFlatObject:Lh,kindOf:$o,kindOfTest:Et,endsWith:Fh,toArray:Mh,forEachEntry:Bh,matchAll:Hh,isHTMLForm:jh,hasOwnProperty:Ol,hasOwnProp:Ol,reduceDescriptors:zc,freezeMethods:Wh,toObjectSet:Kh,toCamelCase:qh,noop:zh,toFiniteNumber:Qh,findKey:Wc,global:_n,isContextDefined:Kc,isSpecCompliantForm:Gh,toJSONObject:Jh,isAsyncFn:Yh,isThenable:Xh,setImmediate:Qc,asap:Zh,isIterable:em};let ee=class Gc extends Error{static from(t,n,s,o,r,i){const l=new Gc(t.message,n||t.code,s,o,r);return l.cause=t,l.name=t.name,i&&Object.assign(l,i),l}constructor(t,n,s,o,r){super(t),this.name="AxiosError",this.isAxiosError=!0,n&&(this.code=n),s&&(this.config=s),o&&(this.request=o),r&&(this.response=r,this.status=r.status)}toJSON(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:E.toJSONObject(this.config),code:this.code,status:this.status}}};ee.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";ee.ERR_BAD_OPTION="ERR_BAD_OPTION";ee.ECONNABORTED="ECONNABORTED";ee.ETIMEDOUT="ETIMEDOUT";ee.ERR_NETWORK="ERR_NETWORK";ee.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";ee.ERR_DEPRECATED="ERR_DEPRECATED";ee.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";ee.ERR_BAD_REQUEST="ERR_BAD_REQUEST";ee.ERR_CANCELED="ERR_CANCELED";ee.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";ee.ERR_INVALID_URL="ERR_INVALID_URL";const tm=null;function Nr(e){return E.isPlainObject(e)||E.isArray(e)}function Jc(e){return E.endsWith(e,"[]")?e.slice(0,-2):e}function Dl(e,t,n){return e?e.concat(t).map(function(o,r){return o=Jc(o),!n&&r?"["+o+"]":o}).join(n?".":""):t}function nm(e){return E.isArray(e)&&!e.some(Nr)}const sm=E.toFlatObject(E,{},null,function(t){return/^is[A-Z]/.test(t)});function Fo(e,t,n){if(!E.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=E.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(v,h){return!E.isUndefined(h[v])});const s=n.metaTokens,o=n.visitor||c,r=n.dots,i=n.indexes,a=(n.Blob||typeof Blob<"u"&&Blob)&&E.isSpecCompliantForm(t);if(!E.isFunction(o))throw new TypeError("visitor must be a function");function d(y){if(y===null)return"";if(E.isDate(y))return y.toISOString();if(E.isBoolean(y))return y.toString();if(!a&&E.isBlob(y))throw new ee("Blob is not supported. Use a Buffer instead.");return E.isArrayBuffer(y)||E.isTypedArray(y)?a&&typeof Blob=="function"?new Blob([y]):Buffer.from(y):y}function c(y,v,h){let k=y;if(y&&!h&&typeof y=="object"){if(E.endsWith(v,"{}"))v=s?v:v.slice(0,-2),y=JSON.stringify(y);else if(E.isArray(y)&&nm(y)||(E.isFileList(y)||E.endsWith(v,"[]"))&&(k=E.toArray(y)))return v=Jc(v),k.forEach(function(S,C){!(E.isUndefined(S)||S===null)&&t.append(i===!0?Dl([v],C,r):i===null?v:v+"[]",d(S))}),!1}return Nr(y)?!0:(t.append(Dl(h,v,r),d(y)),!1)}const f=[],m=Object.assign(sm,{defaultVisitor:c,convertValue:d,isVisitable:Nr});function b(y,v){if(!E.isUndefined(y)){if(f.indexOf(y)!==-1)throw Error("Circular reference detected in "+v.join("."));f.push(y),E.forEach(y,function(k,R){(!(E.isUndefined(k)||k===null)&&o.call(t,k,E.isString(R)?R.trim():R,v,m))===!0&&b(k,v?v.concat(R):[R])}),f.pop()}}if(!E.isObject(e))throw new TypeError("data must be an object");return b(e),t}function Nl(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(s){return t[s]})}function pi(e,t){this._pairs=[],e&&Fo(e,this,t)}const Yc=pi.prototype;Yc.append=function(t,n){this._pairs.push([t,n])};Yc.toString=function(t){const n=t?function(s){return t.call(this,s,Nl)}:Nl;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function om(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Xc(e,t,n){if(!t)return e;const s=n&&n.encode||om,o=E.isFunction(n)?{serialize:n}:n,r=o&&o.serialize;let i;if(r?i=r(t,o):i=E.isURLSearchParams(t)?t.toString():new pi(t,o).toString(s),i){const l=e.indexOf("#");l!==-1&&(e=e.slice(0,l)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class Il{constructor(){this.handlers=[]}use(t,n,s){return this.handlers.push({fulfilled:t,rejected:n,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){E.forEach(this.handlers,function(s){s!==null&&t(s)})}}const hi={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},rm=typeof URLSearchParams<"u"?URLSearchParams:pi,im=typeof FormData<"u"?FormData:null,lm=typeof Blob<"u"?Blob:null,am={isBrowser:!0,classes:{URLSearchParams:rm,FormData:im,Blob:lm},protocols:["http","https","file","blob","url","data"]},mi=typeof window<"u"&&typeof document<"u",Ir=typeof navigator=="object"&&navigator||void 0,cm=mi&&(!Ir||["ReactNative","NativeScript","NS"].indexOf(Ir.product)<0),um=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",dm=mi&&window.location.href||"http://localhost",fm=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:mi,hasStandardBrowserEnv:cm,hasStandardBrowserWebWorkerEnv:um,navigator:Ir,origin:dm},Symbol.toStringTag,{value:"Module"})),He={...fm,...am};function pm(e,t){return Fo(e,new He.classes.URLSearchParams,{visitor:function(n,s,o,r){return He.isNode&&E.isBuffer(n)?(this.append(s,n.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...t})}function hm(e){return E.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function mm(e){const t={},n=Object.keys(e);let s;const o=n.length;let r;for(s=0;s=n.length;return i=!i&&E.isArray(o)?o.length:i,a?(E.hasOwnProp(o,i)?o[i]=[o[i],s]:o[i]=s,!l):((!o[i]||!E.isObject(o[i]))&&(o[i]=[]),t(n,s,o[i],r)&&E.isArray(o[i])&&(o[i]=mm(o[i])),!l)}if(E.isFormData(e)&&E.isFunction(e.entries)){const n={};return E.forEachEntry(e,(s,o)=>{t(hm(s),o,n,0)}),n}return null}function gm(e,t,n){if(E.isString(e))try{return(t||JSON.parse)(e),E.trim(e)}catch(s){if(s.name!=="SyntaxError")throw s}return(n||JSON.stringify)(e)}const Os={transitional:hi,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const s=n.getContentType()||"",o=s.indexOf("application/json")>-1,r=E.isObject(t);if(r&&E.isHTMLForm(t)&&(t=new FormData(t)),E.isFormData(t))return o?JSON.stringify(Zc(t)):t;if(E.isArrayBuffer(t)||E.isBuffer(t)||E.isStream(t)||E.isFile(t)||E.isBlob(t)||E.isReadableStream(t))return t;if(E.isArrayBufferView(t))return t.buffer;if(E.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(r){if(s.indexOf("application/x-www-form-urlencoded")>-1)return pm(t,this.formSerializer).toString();if((l=E.isFileList(t))||s.indexOf("multipart/form-data")>-1){const a=this.env&&this.env.FormData;return Fo(l?{"files[]":t}:t,a&&new a,this.formSerializer)}}return r||o?(n.setContentType("application/json",!1),gm(t)):t}],transformResponse:[function(t){const n=this.transitional||Os.transitional,s=n&&n.forcedJSONParsing,o=this.responseType==="json";if(E.isResponse(t)||E.isReadableStream(t))return t;if(t&&E.isString(t)&&(s&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t,this.parseReviver)}catch(l){if(i)throw l.name==="SyntaxError"?ee.from(l,ee.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:He.classes.FormData,Blob:He.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};E.forEach(["delete","get","head","post","put","patch"],e=>{Os.headers[e]={}});const ym=E.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),vm=e=>{const t={};let n,s,o;return e&&e.split(` `).forEach(function(i){o=i.indexOf(":"),n=i.substring(0,o).trim().toLowerCase(),s=i.substring(o+1).trim(),!(!n||t[n]&&ym[n])&&(n==="set-cookie"?t[n]?t[n].push(s):t[n]=[s]:t[n]=t[n]?t[n]+", "+s:s)}),t},$l=Symbol("internals");function ts(e){return e&&String(e).trim().toLowerCase()}function so(e){return e===!1||e==null?e:E.isArray(e)?e.map(so):String(e)}function bm(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=n.exec(e);)t[s[1]]=s[2];return t}const _m=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function or(e,t,n,s,o){if(E.isFunction(s))return s.call(this,t,n);if(o&&(t=n),!!E.isString(t)){if(E.isString(s))return t.indexOf(s)!==-1;if(E.isRegExp(s))return s.test(t)}}function xm(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,s)=>n.toUpperCase()+s)}function wm(e,t){const n=E.toCamelCase(" "+t);["get","set","has"].forEach(s=>{Object.defineProperty(e,s+n,{value:function(o,r,i){return this[s].call(this,t,o,r,i)},configurable:!0})})}let nt=class{constructor(t){t&&this.set(t)}set(t,n,s){const o=this;function r(l,a,d){const c=ts(a);if(!c)throw new Error("header name must be a non-empty string");const f=E.findKey(o,c);(!f||o[f]===void 0||d===!0||d===void 0&&o[f]!==!1)&&(o[f||a]=so(l))}const i=(l,a)=>E.forEach(l,(d,c)=>r(d,c,a));if(E.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(E.isString(t)&&(t=t.trim())&&!_m(t))i(vm(t),n);else if(E.isObject(t)&&E.isIterable(t)){let l={},a,d;for(const c of t){if(!E.isArray(c))throw TypeError("Object iterator must return a key-value pair");l[d=c[0]]=(a=l[d])?E.isArray(a)?[...a,c[1]]:[a,c[1]]:c[1]}i(l,n)}else t!=null&&r(n,t,s);return this}get(t,n){if(t=ts(t),t){const s=E.findKey(this,t);if(s){const o=this[s];if(!n)return o;if(n===!0)return bm(o);if(E.isFunction(n))return n.call(this,o,s);if(E.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=ts(t),t){const s=E.findKey(this,t);return!!(s&&this[s]!==void 0&&(!n||or(this,this[s],s,n)))}return!1}delete(t,n){const s=this;let o=!1;function r(i){if(i=ts(i),i){const l=E.findKey(s,i);l&&(!n||or(s,s[l],l,n))&&(delete s[l],o=!0)}}return E.isArray(t)?t.forEach(r):r(t),o}clear(t){const n=Object.keys(this);let s=n.length,o=!1;for(;s--;){const r=n[s];(!t||or(this,this[r],r,t,!0))&&(delete this[r],o=!0)}return o}normalize(t){const n=this,s={};return E.forEach(this,(o,r)=>{const i=E.findKey(s,r);if(i){n[i]=so(o),delete n[r];return}const l=t?xm(r):String(r).trim();l!==r&&delete n[r],n[l]=so(o),s[l]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return E.forEach(this,(s,o)=>{s!=null&&s!==!1&&(n[o]=t&&E.isArray(s)?s.join(", "):s)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` -`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const s=new this(t);return n.forEach(o=>s.set(o)),s}static accessor(t){const s=(this[$l]=this[$l]={accessors:{}}).accessors,o=this.prototype;function r(i){const l=ts(i);s[l]||(wm(o,i),s[l]=!0)}return E.isArray(t)?t.forEach(r):r(t),this}};nt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);E.reduceDescriptors(nt.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(s){this[n]=s}}});E.freezeMethods(nt);function rr(e,t){const n=this||Os,s=t||n,o=nt.from(s.headers);let r=s.data;return E.forEach(e,function(l){r=l.call(n,r,o.normalize(),t?t.status:void 0)}),o.normalize(),r}function eu(e){return!!(e&&e.__CANCEL__)}let Ds=class extends ee{constructor(t,n,s){super(t??"canceled",ee.ERR_CANCELED,n,s),this.name="CanceledError",this.__CANCEL__=!0}};function tu(e,t,n){const s=n.config.validateStatus;!n.status||!s||s(n.status)?e(n):t(new ee("Request failed with status code "+n.status,[ee.ERR_BAD_REQUEST,ee.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function km(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Sm(e,t){e=e||10;const n=new Array(e),s=new Array(e);let o=0,r=0,i;return t=t!==void 0?t:1e3,function(a){const d=Date.now(),c=s[r];i||(i=d),n[o]=a,s[o]=d;let f=r,m=0;for(;f!==o;)m+=n[f++],f=f%e;if(o=(o+1)%e,o===r&&(r=(r+1)%e),d-i{n=c,o=null,r&&(clearTimeout(r),r=null),e(...d)};return[(...d)=>{const c=Date.now(),f=c-n;f>=s?i(d,c):(o=d,r||(r=setTimeout(()=>{r=null,i(o)},s-f)))},()=>o&&i(o)]}const yo=(e,t,n=3)=>{let s=0;const o=Sm(50,250);return Em(r=>{const i=r.loaded,l=r.lengthComputable?r.total:void 0,a=i-s,d=o(a),c=i<=l;s=i;const f={loaded:i,total:l,progress:l?i/l:void 0,bytes:a,rate:d||void 0,estimated:d&&l&&c?(l-i)/d:void 0,event:r,lengthComputable:l!=null,[t?"download":"upload"]:!0};e(f)},n)},Ll=(e,t)=>{const n=e!=null;return[s=>t[0]({lengthComputable:n,total:e,loaded:s}),t[1]]},Fl=e=>(...t)=>E.asap(()=>e(...t)),Am=He.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,He.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(He.origin),He.navigator&&/(msie|trident)/i.test(He.navigator.userAgent)):()=>!0,Rm=He.hasStandardBrowserEnv?{write(e,t,n,s,o,r,i){if(typeof document>"u")return;const l=[`${e}=${encodeURIComponent(t)}`];E.isNumber(n)&&l.push(`expires=${new Date(n).toUTCString()}`),E.isString(s)&&l.push(`path=${s}`),E.isString(o)&&l.push(`domain=${o}`),r===!0&&l.push("secure"),E.isString(i)&&l.push(`SameSite=${i}`),document.cookie=l.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function Cm(e){return typeof e!="string"?!1:/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Tm(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function nu(e,t,n){let s=!Cm(t);return e&&(s||n==!1)?Tm(e,t):t}const Ml=e=>e instanceof nt?{...e}:e;function En(e,t){t=t||{};const n={};function s(d,c,f,m){return E.isPlainObject(d)&&E.isPlainObject(c)?E.merge.call({caseless:m},d,c):E.isPlainObject(c)?E.merge({},c):E.isArray(c)?c.slice():c}function o(d,c,f,m){if(E.isUndefined(c)){if(!E.isUndefined(d))return s(void 0,d,f,m)}else return s(d,c,f,m)}function r(d,c){if(!E.isUndefined(c))return s(void 0,c)}function i(d,c){if(E.isUndefined(c)){if(!E.isUndefined(d))return s(void 0,d)}else return s(void 0,c)}function l(d,c,f){if(f in t)return s(d,c);if(f in e)return s(void 0,d)}const a={url:r,method:r,data:r,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:l,headers:(d,c,f)=>o(Ml(d),Ml(c),f,!0)};return E.forEach(Object.keys({...e,...t}),function(c){if(c==="__proto__"||c==="constructor"||c==="prototype")return;const f=E.hasOwnProp(a,c)?a[c]:o,m=f(e[c],t[c],c);E.isUndefined(m)&&f!==l||(n[c]=m)}),n}const su=e=>{const t=En({},e);let{data:n,withXSRFToken:s,xsrfHeaderName:o,xsrfCookieName:r,headers:i,auth:l}=t;if(t.headers=i=nt.from(i),t.url=Xc(nu(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&i.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),E.isFormData(n)){if(He.hasStandardBrowserEnv||He.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if(E.isFunction(n.getHeaders)){const a=n.getHeaders(),d=["content-type","content-length"];Object.entries(a).forEach(([c,f])=>{d.includes(c.toLowerCase())&&i.set(c,f)})}}if(He.hasStandardBrowserEnv&&(s&&E.isFunction(s)&&(s=s(t)),s||s!==!1&&Am(t.url))){const a=o&&r&&Rm.read(r);a&&i.set(o,a)}return t},Pm=typeof XMLHttpRequest<"u",Om=Pm&&function(e){return new Promise(function(n,s){const o=su(e);let r=o.data;const i=nt.from(o.headers).normalize();let{responseType:l,onUploadProgress:a,onDownloadProgress:d}=o,c,f,m,b,y;function v(){b&&b(),y&&y(),o.cancelToken&&o.cancelToken.unsubscribe(c),o.signal&&o.signal.removeEventListener("abort",c)}let h=new XMLHttpRequest;h.open(o.method.toUpperCase(),o.url,!0),h.timeout=o.timeout;function k(){if(!h)return;const S=nt.from("getAllResponseHeaders"in h&&h.getAllResponseHeaders()),L={data:!l||l==="text"||l==="json"?h.responseText:h.response,status:h.status,statusText:h.statusText,headers:S,config:e,request:h};tu(function(U){n(U),v()},function(U){s(U),v()},L),h=null}"onloadend"in h?h.onloadend=k:h.onreadystatechange=function(){!h||h.readyState!==4||h.status===0&&!(h.responseURL&&h.responseURL.indexOf("file:")===0)||setTimeout(k)},h.onabort=function(){h&&(s(new ee("Request aborted",ee.ECONNABORTED,e,h)),h=null)},h.onerror=function(C){const L=C&&C.message?C.message:"Network Error",P=new ee(L,ee.ERR_NETWORK,e,h);P.event=C||null,s(P),h=null},h.ontimeout=function(){let C=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const L=o.transitional||hi;o.timeoutErrorMessage&&(C=o.timeoutErrorMessage),s(new ee(C,L.clarifyTimeoutError?ee.ETIMEDOUT:ee.ECONNABORTED,e,h)),h=null},r===void 0&&i.setContentType(null),"setRequestHeader"in h&&E.forEach(i.toJSON(),function(C,L){h.setRequestHeader(L,C)}),E.isUndefined(o.withCredentials)||(h.withCredentials=!!o.withCredentials),l&&l!=="json"&&(h.responseType=o.responseType),d&&([m,y]=yo(d,!0),h.addEventListener("progress",m)),a&&h.upload&&([f,b]=yo(a),h.upload.addEventListener("progress",f),h.upload.addEventListener("loadend",b)),(o.cancelToken||o.signal)&&(c=S=>{h&&(s(!S||S.type?new Ds(null,e,h):S),h.abort(),h=null)},o.cancelToken&&o.cancelToken.subscribe(c),o.signal&&(o.signal.aborted?c():o.signal.addEventListener("abort",c)));const R=km(o.url);if(R&&He.protocols.indexOf(R)===-1){s(new ee("Unsupported protocol "+R+":",ee.ERR_BAD_REQUEST,e));return}h.send(r||null)})},Dm=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let s=new AbortController,o;const r=function(d){if(!o){o=!0,l();const c=d instanceof Error?d:this.reason;s.abort(c instanceof ee?c:new Ds(c instanceof Error?c.message:c))}};let i=t&&setTimeout(()=>{i=null,r(new ee(`timeout of ${t}ms exceeded`,ee.ETIMEDOUT))},t);const l=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(d=>{d.unsubscribe?d.unsubscribe(r):d.removeEventListener("abort",r)}),e=null)};e.forEach(d=>d.addEventListener("abort",r));const{signal:a}=s;return a.unsubscribe=()=>E.asap(l),a}},Nm=function*(e,t){let n=e.byteLength;if(n{const o=Im(e,t);let r=0,i,l=a=>{i||(i=!0,s&&s(a))};return new ReadableStream({async pull(a){try{const{done:d,value:c}=await o.next();if(d){l(),a.close();return}let f=c.byteLength;if(n){let m=r+=f;n(m)}a.enqueue(new Uint8Array(c))}catch(d){throw l(d),d}},cancel(a){return l(a),o.return()}},{highWaterMark:2})},Bl=64*1024,{isFunction:qs}=E,Lm=(({Request:e,Response:t})=>({Request:e,Response:t}))(E.global),{ReadableStream:Hl,TextEncoder:jl}=E.global,ql=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Fm=e=>{e=E.merge.call({skipUndefined:!0},Lm,e);const{fetch:t,Request:n,Response:s}=e,o=t?qs(t):typeof fetch=="function",r=qs(n),i=qs(s);if(!o)return!1;const l=o&&qs(Hl),a=o&&(typeof jl=="function"?(y=>v=>y.encode(v))(new jl):async y=>new Uint8Array(await new n(y).arrayBuffer())),d=r&&l&&ql(()=>{let y=!1;const v=new n(He.origin,{body:new Hl,method:"POST",get duplex(){return y=!0,"half"}}).headers.has("Content-Type");return y&&!v}),c=i&&l&&ql(()=>E.isReadableStream(new s("").body)),f={stream:c&&(y=>y.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(y=>{!f[y]&&(f[y]=(v,h)=>{let k=v&&v[y];if(k)return k.call(v);throw new ee(`Response type '${y}' is not supported`,ee.ERR_NOT_SUPPORT,h)})});const m=async y=>{if(y==null)return 0;if(E.isBlob(y))return y.size;if(E.isSpecCompliantForm(y))return(await new n(He.origin,{method:"POST",body:y}).arrayBuffer()).byteLength;if(E.isArrayBufferView(y)||E.isArrayBuffer(y))return y.byteLength;if(E.isURLSearchParams(y)&&(y=y+""),E.isString(y))return(await a(y)).byteLength},b=async(y,v)=>{const h=E.toFiniteNumber(y.getContentLength());return h??m(v)};return async y=>{let{url:v,method:h,data:k,signal:R,cancelToken:S,timeout:C,onDownloadProgress:L,onUploadProgress:P,responseType:U,headers:ae,withCredentials:$="same-origin",fetchOptions:W}=su(y),B=t||fetch;U=U?(U+"").toLowerCase():"text";let q=Dm([R,S&&S.toAbortSignal()],C),se=null;const we=q&&q.unsubscribe&&(()=>{q.unsubscribe()});let Me;try{if(P&&d&&h!=="get"&&h!=="head"&&(Me=await b(ae,k))!==0){let De=new n(v,{method:"POST",body:k,duplex:"half"}),Oe;if(E.isFormData(k)&&(Oe=De.headers.get("content-type"))&&ae.setContentType(Oe),De.body){const[Rt,gt]=Ll(Me,yo(Fl(P)));k=Ul(De.body,Bl,Rt,gt)}}E.isString($)||($=$?"include":"omit");const le=r&&"credentials"in n.prototype,fe={...W,signal:q,method:h.toUpperCase(),headers:ae.normalize().toJSON(),body:k,duplex:"half",credentials:le?$:void 0};se=r&&new n(v,fe);let re=await(r?B(se,W):B(v,fe));const ut=c&&(U==="stream"||U==="response");if(c&&(L||ut&&we)){const De={};["status","statusText","headers"].forEach(Ct=>{De[Ct]=re[Ct]});const Oe=E.toFiniteNumber(re.headers.get("content-length")),[Rt,gt]=L&&Ll(Oe,yo(Fl(L),!0))||[];re=new s(Ul(re.body,Bl,Rt,()=>{gt&>(),we&&we()}),De)}U=U||"text";let At=await f[E.findKey(f,U)||"text"](re,y);return!ut&&we&&we(),await new Promise((De,Oe)=>{tu(De,Oe,{data:At,headers:nt.from(re.headers),status:re.status,statusText:re.statusText,config:y,request:se})})}catch(le){throw we&&we(),le&&le.name==="TypeError"&&/Load failed|fetch/i.test(le.message)?Object.assign(new ee("Network Error",ee.ERR_NETWORK,y,se,le&&le.response),{cause:le.cause||le}):ee.from(le,le&&le.code,y,se,le&&le.response)}}},Mm=new Map,ou=e=>{let t=e&&e.env||{};const{fetch:n,Request:s,Response:o}=t,r=[s,o,n];let i=r.length,l=i,a,d,c=Mm;for(;l--;)a=r[l],d=c.get(a),d===void 0&&c.set(a,d=l?new Map:Fm(t)),c=d;return d};ou();const gi={http:tm,xhr:Om,fetch:{get:ou}};E.forEach(gi,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Vl=e=>`- ${e}`,Um=e=>E.isFunction(e)||e===null||e===!1;function Bm(e,t){e=E.isArray(e)?e:[e];const{length:n}=e;let s,o;const r={};for(let i=0;i`adapter ${a} `+(d===!1?"is not supported by the environment":"is not available in the build"));let l=n?i.length>1?`since : +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const s=new this(t);return n.forEach(o=>s.set(o)),s}static accessor(t){const s=(this[$l]=this[$l]={accessors:{}}).accessors,o=this.prototype;function r(i){const l=ts(i);s[l]||(wm(o,i),s[l]=!0)}return E.isArray(t)?t.forEach(r):r(t),this}};nt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);E.reduceDescriptors(nt.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(s){this[n]=s}}});E.freezeMethods(nt);function rr(e,t){const n=this||Os,s=t||n,o=nt.from(s.headers);let r=s.data;return E.forEach(e,function(l){r=l.call(n,r,o.normalize(),t?t.status:void 0)}),o.normalize(),r}function eu(e){return!!(e&&e.__CANCEL__)}let Ds=class extends ee{constructor(t,n,s){super(t??"canceled",ee.ERR_CANCELED,n,s),this.name="CanceledError",this.__CANCEL__=!0}};function tu(e,t,n){const s=n.config.validateStatus;!n.status||!s||s(n.status)?e(n):t(new ee("Request failed with status code "+n.status,[ee.ERR_BAD_REQUEST,ee.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function km(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Sm(e,t){e=e||10;const n=new Array(e),s=new Array(e);let o=0,r=0,i;return t=t!==void 0?t:1e3,function(a){const d=Date.now(),c=s[r];i||(i=d),n[o]=a,s[o]=d;let f=r,m=0;for(;f!==o;)m+=n[f++],f=f%e;if(o=(o+1)%e,o===r&&(r=(r+1)%e),d-i{n=c,o=null,r&&(clearTimeout(r),r=null),e(...d)};return[(...d)=>{const c=Date.now(),f=c-n;f>=s?i(d,c):(o=d,r||(r=setTimeout(()=>{r=null,i(o)},s-f)))},()=>o&&i(o)]}const yo=(e,t,n=3)=>{let s=0;const o=Sm(50,250);return Em(r=>{const i=r.loaded,l=r.lengthComputable?r.total:void 0,a=i-s,d=o(a),c=i<=l;s=i;const f={loaded:i,total:l,progress:l?i/l:void 0,bytes:a,rate:d||void 0,estimated:d&&l&&c?(l-i)/d:void 0,event:r,lengthComputable:l!=null,[t?"download":"upload"]:!0};e(f)},n)},Ll=(e,t)=>{const n=e!=null;return[s=>t[0]({lengthComputable:n,total:e,loaded:s}),t[1]]},Fl=e=>(...t)=>E.asap(()=>e(...t)),Am=He.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,He.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(He.origin),He.navigator&&/(msie|trident)/i.test(He.navigator.userAgent)):()=>!0,Rm=He.hasStandardBrowserEnv?{write(e,t,n,s,o,r,i){if(typeof document>"u")return;const l=[`${e}=${encodeURIComponent(t)}`];E.isNumber(n)&&l.push(`expires=${new Date(n).toUTCString()}`),E.isString(s)&&l.push(`path=${s}`),E.isString(o)&&l.push(`domain=${o}`),r===!0&&l.push("secure"),E.isString(i)&&l.push(`SameSite=${i}`),document.cookie=l.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function Cm(e){return typeof e!="string"?!1:/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Tm(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function nu(e,t,n){let s=!Cm(t);return e&&(s||n==!1)?Tm(e,t):t}const Ml=e=>e instanceof nt?{...e}:e;function En(e,t){t=t||{};const n={};function s(d,c,f,m){return E.isPlainObject(d)&&E.isPlainObject(c)?E.merge.call({caseless:m},d,c):E.isPlainObject(c)?E.merge({},c):E.isArray(c)?c.slice():c}function o(d,c,f,m){if(E.isUndefined(c)){if(!E.isUndefined(d))return s(void 0,d,f,m)}else return s(d,c,f,m)}function r(d,c){if(!E.isUndefined(c))return s(void 0,c)}function i(d,c){if(E.isUndefined(c)){if(!E.isUndefined(d))return s(void 0,d)}else return s(void 0,c)}function l(d,c,f){if(f in t)return s(d,c);if(f in e)return s(void 0,d)}const a={url:r,method:r,data:r,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:l,headers:(d,c,f)=>o(Ml(d),Ml(c),f,!0)};return E.forEach(Object.keys({...e,...t}),function(c){if(c==="__proto__"||c==="constructor"||c==="prototype")return;const f=E.hasOwnProp(a,c)?a[c]:o,m=f(e[c],t[c],c);E.isUndefined(m)&&f!==l||(n[c]=m)}),n}const su=e=>{const t=En({},e);let{data:n,withXSRFToken:s,xsrfHeaderName:o,xsrfCookieName:r,headers:i,auth:l}=t;if(t.headers=i=nt.from(i),t.url=Xc(nu(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&i.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),E.isFormData(n)){if(He.hasStandardBrowserEnv||He.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if(E.isFunction(n.getHeaders)){const a=n.getHeaders(),d=["content-type","content-length"];Object.entries(a).forEach(([c,f])=>{d.includes(c.toLowerCase())&&i.set(c,f)})}}if(He.hasStandardBrowserEnv&&(s&&E.isFunction(s)&&(s=s(t)),s||s!==!1&&Am(t.url))){const a=o&&r&&Rm.read(r);a&&i.set(o,a)}return t},Pm=typeof XMLHttpRequest<"u",Om=Pm&&function(e){return new Promise(function(n,s){const o=su(e);let r=o.data;const i=nt.from(o.headers).normalize();let{responseType:l,onUploadProgress:a,onDownloadProgress:d}=o,c,f,m,b,y;function v(){b&&b(),y&&y(),o.cancelToken&&o.cancelToken.unsubscribe(c),o.signal&&o.signal.removeEventListener("abort",c)}let h=new XMLHttpRequest;h.open(o.method.toUpperCase(),o.url,!0),h.timeout=o.timeout;function k(){if(!h)return;const S=nt.from("getAllResponseHeaders"in h&&h.getAllResponseHeaders()),L={data:!l||l==="text"||l==="json"?h.responseText:h.response,status:h.status,statusText:h.statusText,headers:S,config:e,request:h};tu(function(U){n(U),v()},function(U){s(U),v()},L),h=null}"onloadend"in h?h.onloadend=k:h.onreadystatechange=function(){!h||h.readyState!==4||h.status===0&&!(h.responseURL&&h.responseURL.indexOf("file:")===0)||setTimeout(k)},h.onabort=function(){h&&(s(new ee("Request aborted",ee.ECONNABORTED,e,h)),h=null)},h.onerror=function(C){const L=C&&C.message?C.message:"Network Error",P=new ee(L,ee.ERR_NETWORK,e,h);P.event=C||null,s(P),h=null},h.ontimeout=function(){let C=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const L=o.transitional||hi;o.timeoutErrorMessage&&(C=o.timeoutErrorMessage),s(new ee(C,L.clarifyTimeoutError?ee.ETIMEDOUT:ee.ECONNABORTED,e,h)),h=null},r===void 0&&i.setContentType(null),"setRequestHeader"in h&&E.forEach(i.toJSON(),function(C,L){h.setRequestHeader(L,C)}),E.isUndefined(o.withCredentials)||(h.withCredentials=!!o.withCredentials),l&&l!=="json"&&(h.responseType=o.responseType),d&&([m,y]=yo(d,!0),h.addEventListener("progress",m)),a&&h.upload&&([f,b]=yo(a),h.upload.addEventListener("progress",f),h.upload.addEventListener("loadend",b)),(o.cancelToken||o.signal)&&(c=S=>{h&&(s(!S||S.type?new Ds(null,e,h):S),h.abort(),h=null)},o.cancelToken&&o.cancelToken.subscribe(c),o.signal&&(o.signal.aborted?c():o.signal.addEventListener("abort",c)));const R=km(o.url);if(R&&He.protocols.indexOf(R)===-1){s(new ee("Unsupported protocol "+R+":",ee.ERR_BAD_REQUEST,e));return}h.send(r||null)})},Dm=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let s=new AbortController,o;const r=function(d){if(!o){o=!0,l();const c=d instanceof Error?d:this.reason;s.abort(c instanceof ee?c:new Ds(c instanceof Error?c.message:c))}};let i=t&&setTimeout(()=>{i=null,r(new ee(`timeout of ${t}ms exceeded`,ee.ETIMEDOUT))},t);const l=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(d=>{d.unsubscribe?d.unsubscribe(r):d.removeEventListener("abort",r)}),e=null)};e.forEach(d=>d.addEventListener("abort",r));const{signal:a}=s;return a.unsubscribe=()=>E.asap(l),a}},Nm=function*(e,t){let n=e.byteLength;if(n{const o=Im(e,t);let r=0,i,l=a=>{i||(i=!0,s&&s(a))};return new ReadableStream({async pull(a){try{const{done:d,value:c}=await o.next();if(d){l(),a.close();return}let f=c.byteLength;if(n){let m=r+=f;n(m)}a.enqueue(new Uint8Array(c))}catch(d){throw l(d),d}},cancel(a){return l(a),o.return()}},{highWaterMark:2})},Bl=64*1024,{isFunction:qs}=E,Lm=(({Request:e,Response:t})=>({Request:e,Response:t}))(E.global),{ReadableStream:Hl,TextEncoder:jl}=E.global,ql=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Fm=e=>{e=E.merge.call({skipUndefined:!0},Lm,e);const{fetch:t,Request:n,Response:s}=e,o=t?qs(t):typeof fetch=="function",r=qs(n),i=qs(s);if(!o)return!1;const l=o&&qs(Hl),a=o&&(typeof jl=="function"?(y=>v=>y.encode(v))(new jl):async y=>new Uint8Array(await new n(y).arrayBuffer())),d=r&&l&&ql(()=>{let y=!1;const v=new n(He.origin,{body:new Hl,method:"POST",get duplex(){return y=!0,"half"}}).headers.has("Content-Type");return y&&!v}),c=i&&l&&ql(()=>E.isReadableStream(new s("").body)),f={stream:c&&(y=>y.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(y=>{!f[y]&&(f[y]=(v,h)=>{let k=v&&v[y];if(k)return k.call(v);throw new ee(`Response type '${y}' is not supported`,ee.ERR_NOT_SUPPORT,h)})});const m=async y=>{if(y==null)return 0;if(E.isBlob(y))return y.size;if(E.isSpecCompliantForm(y))return(await new n(He.origin,{method:"POST",body:y}).arrayBuffer()).byteLength;if(E.isArrayBufferView(y)||E.isArrayBuffer(y))return y.byteLength;if(E.isURLSearchParams(y)&&(y=y+""),E.isString(y))return(await a(y)).byteLength},b=async(y,v)=>{const h=E.toFiniteNumber(y.getContentLength());return h??m(v)};return async y=>{let{url:v,method:h,data:k,signal:R,cancelToken:S,timeout:C,onDownloadProgress:L,onUploadProgress:P,responseType:U,headers:ae,withCredentials:$="same-origin",fetchOptions:K}=su(y),H=t||fetch;U=U?(U+"").toLowerCase():"text";let q=Dm([R,S&&S.toAbortSignal()],C),se=null;const we=q&&q.unsubscribe&&(()=>{q.unsubscribe()});let Me;try{if(P&&d&&h!=="get"&&h!=="head"&&(Me=await b(ae,k))!==0){let De=new n(v,{method:"POST",body:k,duplex:"half"}),Oe;if(E.isFormData(k)&&(Oe=De.headers.get("content-type"))&&ae.setContentType(Oe),De.body){const[Rt,gt]=Ll(Me,yo(Fl(P)));k=Ul(De.body,Bl,Rt,gt)}}E.isString($)||($=$?"include":"omit");const le=r&&"credentials"in n.prototype,fe={...K,signal:q,method:h.toUpperCase(),headers:ae.normalize().toJSON(),body:k,duplex:"half",credentials:le?$:void 0};se=r&&new n(v,fe);let re=await(r?H(se,K):H(v,fe));const ut=c&&(U==="stream"||U==="response");if(c&&(L||ut&&we)){const De={};["status","statusText","headers"].forEach(Ct=>{De[Ct]=re[Ct]});const Oe=E.toFiniteNumber(re.headers.get("content-length")),[Rt,gt]=L&&Ll(Oe,yo(Fl(L),!0))||[];re=new s(Ul(re.body,Bl,Rt,()=>{gt&>(),we&&we()}),De)}U=U||"text";let At=await f[E.findKey(f,U)||"text"](re,y);return!ut&&we&&we(),await new Promise((De,Oe)=>{tu(De,Oe,{data:At,headers:nt.from(re.headers),status:re.status,statusText:re.statusText,config:y,request:se})})}catch(le){throw we&&we(),le&&le.name==="TypeError"&&/Load failed|fetch/i.test(le.message)?Object.assign(new ee("Network Error",ee.ERR_NETWORK,y,se,le&&le.response),{cause:le.cause||le}):ee.from(le,le&&le.code,y,se,le&&le.response)}}},Mm=new Map,ou=e=>{let t=e&&e.env||{};const{fetch:n,Request:s,Response:o}=t,r=[s,o,n];let i=r.length,l=i,a,d,c=Mm;for(;l--;)a=r[l],d=c.get(a),d===void 0&&c.set(a,d=l?new Map:Fm(t)),c=d;return d};ou();const gi={http:tm,xhr:Om,fetch:{get:ou}};E.forEach(gi,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Vl=e=>`- ${e}`,Um=e=>E.isFunction(e)||e===null||e===!1;function Bm(e,t){e=E.isArray(e)?e:[e];const{length:n}=e;let s,o;const r={};for(let i=0;i`adapter ${a} `+(d===!1?"is not supported by the environment":"is not available in the build"));let l=n?i.length>1?`since : `+i.map(Vl).join(` `):" "+Vl(i[0]):"as no adapter specified";throw new ee("There is no suitable adapter to dispatch the request "+l,"ERR_NOT_SUPPORT")}return o}const ru={getAdapter:Bm,adapters:gi};function ir(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ds(null,e)}function Wl(e){return ir(e),e.headers=nt.from(e.headers),e.data=rr.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),ru.getAdapter(e.adapter||Os.adapter,e)(e).then(function(s){return ir(e),s.data=rr.call(e,e.transformResponse,s),s.headers=nt.from(s.headers),s},function(s){return eu(s)||(ir(e),s&&s.response&&(s.response.data=rr.call(e,e.transformResponse,s.response),s.response.headers=nt.from(s.response.headers))),Promise.reject(s)})}const iu="1.13.5",Mo={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Mo[e]=function(s){return typeof s===e||"a"+(t<1?"n ":" ")+e}});const Kl={};Mo.transitional=function(t,n,s){function o(r,i){return"[Axios v"+iu+"] Transitional option '"+r+"'"+i+(s?". "+s:"")}return(r,i,l)=>{if(t===!1)throw new ee(o(i," has been removed"+(n?" in "+n:"")),ee.ERR_DEPRECATED);return n&&!Kl[i]&&(Kl[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(r,i,l):!0}};Mo.spelling=function(t){return(n,s)=>(console.warn(`${s} is likely a misspelling of ${t}`),!0)};function Hm(e,t,n){if(typeof e!="object")throw new ee("options must be an object",ee.ERR_BAD_OPTION_VALUE);const s=Object.keys(e);let o=s.length;for(;o-- >0;){const r=s[o],i=t[r];if(i){const l=e[r],a=l===void 0||i(l,r,e);if(a!==!0)throw new ee("option "+r+" must be "+a,ee.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new ee("Unknown option "+r,ee.ERR_BAD_OPTION)}}const oo={assertOptions:Hm,validators:Mo},pt=oo.validators;let Sn=class{constructor(t){this.defaults=t||{},this.interceptors={request:new Il,response:new Il}}async request(t,n){try{return await this._request(t,n)}catch(s){if(s instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;const r=o.stack?o.stack.replace(/^.+\n/,""):"";try{s.stack?r&&!String(s.stack).endsWith(r.replace(/^.+\n.+\n/,""))&&(s.stack+=` -`+r):s.stack=r}catch{}}throw s}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=En(this.defaults,n);const{transitional:s,paramsSerializer:o,headers:r}=n;s!==void 0&&oo.assertOptions(s,{silentJSONParsing:pt.transitional(pt.boolean),forcedJSONParsing:pt.transitional(pt.boolean),clarifyTimeoutError:pt.transitional(pt.boolean),legacyInterceptorReqResOrdering:pt.transitional(pt.boolean)},!1),o!=null&&(E.isFunction(o)?n.paramsSerializer={serialize:o}:oo.assertOptions(o,{encode:pt.function,serialize:pt.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),oo.assertOptions(n,{baseUrl:pt.spelling("baseURL"),withXsrfToken:pt.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=r&&E.merge(r.common,r[n.method]);r&&E.forEach(["delete","get","head","post","put","patch","common"],y=>{delete r[y]}),n.headers=nt.concat(i,r);const l=[];let a=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;a=a&&v.synchronous;const h=n.transitional||hi;h&&h.legacyInterceptorReqResOrdering?l.unshift(v.fulfilled,v.rejected):l.push(v.fulfilled,v.rejected)});const d=[];this.interceptors.response.forEach(function(v){d.push(v.fulfilled,v.rejected)});let c,f=0,m;if(!a){const y=[Wl.bind(this),void 0];for(y.unshift(...l),y.push(...d),m=y.length,c=Promise.resolve(n);f{if(!s._listeners)return;let r=s._listeners.length;for(;r-- >0;)s._listeners[r](o);s._listeners=null}),this.promise.then=o=>{let r;const i=new Promise(l=>{s.subscribe(l),r=l}).then(o);return i.cancel=function(){s.unsubscribe(r)},i},t(function(r,i,l){s.reason||(s.reason=new Ds(r,i,l),n(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=s=>{t.abort(s)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new lu(function(o){t=o}),cancel:t}}};function qm(e){return function(n){return e.apply(null,n)}}function Vm(e){return E.isObject(e)&&e.isAxiosError===!0}const $r={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries($r).forEach(([e,t])=>{$r[t]=e});function au(e){const t=new Sn(e),n=Hc(Sn.prototype.request,t);return E.extend(n,Sn.prototype,t,{allOwnKeys:!0}),E.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return au(En(e,o))},n}const Pe=au(Os);Pe.Axios=Sn;Pe.CanceledError=Ds;Pe.CancelToken=jm;Pe.isCancel=eu;Pe.VERSION=iu;Pe.toFormData=Fo;Pe.AxiosError=ee;Pe.Cancel=Pe.CanceledError;Pe.all=function(t){return Promise.all(t)};Pe.spread=qm;Pe.isAxiosError=Vm;Pe.mergeConfig=En;Pe.AxiosHeaders=nt;Pe.formToJSON=e=>Zc(E.isHTMLForm(e)?new FormData(e):e);Pe.getAdapter=ru.getAdapter;Pe.HttpStatusCode=$r;Pe.default=Pe;const{Axios:b1,AxiosError:_1,CanceledError:x1,isCancel:w1,CancelToken:k1,VERSION:S1,all:E1,Cancel:A1,isAxiosError:R1,spread:C1,toFormData:T1,AxiosHeaders:P1,HttpStatusCode:O1,formToJSON:D1,getAdapter:N1,mergeConfig:I1}=Pe;var Rn={};const Ge={PROTOCOL:Rn.PROTOCOL||window.location.protocol,WS_PROTOCOL:Rn.WS_PROTOCOL||window.location.protocol==="https:"?"wss:":"ws:",BACKEND:Rn.BACKEND||window.location.hostname,PORT:Rn.PORT||window.location.port,WS_PORT:Rn.WS_PORT||window.location.port,BASEURL:Rn.BASEURL||""};let Vs;const Wm=new Uint8Array(16);function Km(){if(!Vs&&(Vs=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Vs))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Vs(Wm)}const Le=[];for(let e=0;e<256;++e)Le.push((e+256).toString(16).slice(1));function zm(e,t=0){return Le[e[t+0]]+Le[e[t+1]]+Le[e[t+2]]+Le[e[t+3]]+"-"+Le[e[t+4]]+Le[e[t+5]]+"-"+Le[e[t+6]]+Le[e[t+7]]+"-"+Le[e[t+8]]+Le[e[t+9]]+"-"+Le[e[t+10]]+Le[e[t+11]]+Le[e[t+12]]+Le[e[t+13]]+Le[e[t+14]]+Le[e[t+15]]}const Qm=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),zl={randomUUID:Qm};function Gm(e,t,n){if(zl.randomUUID&&!e)return zl.randomUUID();e=e||{};const s=e.random||(e.rng||Km)();return s[6]=s[6]&15|64,s[8]=s[8]&63|128,zm(s)}var Jm={};console.log("using env:",Jm);console.log("using config: ",Ge);const Je=Pe.create({baseURL:`${Ge.PROTOCOL}//${Ge.BACKEND}:${Ge.PORT}${Ge.BASEURL}`}),Ns=Gm();console.log("session ID: ",Ns);cu();const yi=new WebSocket(`${Ge.WS_PROTOCOL}//${Ge.BACKEND}${Ge.PORT!==""?":"+Ge.PORT:""}${Ge.BASEURL}/api/ws?client_id=${Ns}`);yi.onopen=e=>{console.log("websocket connection opened",e)};function cu(){Je.get("/api/version").then(e=>{const t=localStorage.getItem("version");console.log("Backend version: ",e.data),localStorage.setItem("version",e.data),t!=e.data&&location.reload()}).catch(e=>{console.error(e),console.log("Error getting version, using 0"),localStorage.setItem("version","0.0.0")})}function Ym(e){return Je.get("/api/songs/search",{params:{query:e}})}function Xm(e){return Je.get("/api/song/url",{params:{url:e}})}function Zm(e){const t=typeof e=="string"?e:e.url,n=typeof e=="string"?void 0:e;return Je.post("/api/download/url",n,{params:{url:t,client_id:Ns}})}function eg(e){return Je.post("/api/download/batch",e)}function tg(){return Je.get("/api/check_update")}function ng(e){return String(e||"").split("/").map(encodeURIComponent).join("/")}function sg(e){return`/media/${ng(e)}`}function og(e){try{return decodeURIComponent(e)}catch{return e}}function rg(e){let t=String(e||"");const n=t.indexOf("/media/");return n>=0?t=t.slice(n+7):t=t.replace(/^\//,""),t.split("/").filter(Boolean).map(og).join("/")}function ig(e){const t=rg(e);if(!t)return"download";const n=t.split("/");return n[n.length-1]||"download"}function lg(e){return`/cover?file=${encodeURIComponent(e)}`}function ag(){return Je.get("/list")}function cg(e){return Je.delete("/delete",{params:{file:e}})}function ug(e){return Je.post("/api/playlist/m3u",e)}function dg(){return Je.get("/api/queue")}function fg(e){return Je.delete("/api/queue/item",{params:{song_id:e}})}function pg(){return Je.delete("/api/queue")}function hg(){return Je.delete("/api/queue/completed")}function mg(){return Je.get("/api/settings",{params:{client_id:Ns}})}function gg(e){return Je.post("/api/settings/update",e,{params:{client_id:Ns}})}function yg(e){return yi.onmessage=e}function vg(e){return yi.onerror=e}const ve={search:Ym,open:Xm,download:Zm,downloadBatch:eg,downloadFileURL:sg,downloadSaveName:ig,coverFileURL:lg,listDownloads:ag,deleteDownload:cg,writePlaylistM3u:ug,getQueue:dg,removeQueueItem:fg,clearQueue:pg,clearCompletedQueue:hg,getSettings:mg,setSettings:gg,check_for_update:tg,ws_onmessage:yg,ws_onerror:vg,getVersion:cu},zt=te({audio_providers:[""],slskd:{enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256},lyrics_providers:[""],download_lyrics:!0,format:"",bitrate:"320",output:"",generate_m3u:!0,sync_navidrome:!0,navidrome:{enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},organize_by_artist:!1,max_parallel_downloads:3}),bg={audio_providers:["youtube","youtube-music","slskd"],lyrics_providers:["lrclib","genius","musixmatch","azlyrics"],format:["mp3","flac","ogg","opus","m4a"],bitrate:["128","192","256","320"],max_parallel_downloads:[1,2,3,5,8],output:"{artists} - {title}.{output-ext}"};ve.getSettings().then(e=>{e.status===200?(console.log("Received settings:",e.data),zt.value={...zt.value,...e.data,slskd:{...zt.value.slskd,...e.data.slskd||{}},navidrome:{...zt.value.navidrome,...e.data.navidrome||{}}}):console.log("Error loading settings")});function uu(){const e=te(),t=te("");function n(){var i,l;const o=((i=zt.value)==null?void 0:i.slskd)||{};if(o.enabled){if(!String(o.base_url||"").trim())return"slskd base URL is required when enabled";if(!String(o.api_key||"").trim())return"slskd API key is required when enabled"}const r=((l=zt.value)==null?void 0:l.navidrome)||{};if(r.enabled){if(!String(r.url||"").trim())return"Navidrome URL is required when enabled";if(!String(r.username||"").trim())return"Navidrome username is required when enabled";if(!String(r.password||""))return"Navidrome password is required when enabled"}return""}function s(){console.log("Saving settings:",zt.value);const o=n();if(o){t.value=o,e.value=!1,setTimeout(()=>{e.value=null},2500);return}t.value="",ve.setSettings(zt.value).then(r=>{if(r.status===200){console.log("Saved!"),e.value=!0;const i=document.getElementById("settings-modal");i&&"checked"in i&&(i.checked=!1),setTimeout(()=>{e.value=null},2e3)}else console.error("Error saving settings.",r),t.value="Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2e3)}).catch(r=>{var l,a;const i=(a=(l=r==null?void 0:r.response)==null?void 0:l.data)==null?void 0:a.detail;t.value=typeof i=="string"&&i.trim()?i:"Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2500)})}return{saveSettings:s,settings:zt,settingsOptions:bg,isSaved:e,saveErrorText:t}}const _g={class:"modal modal-bottom sm:modal-middle"},xg={class:"modal-box surface-strong rounded-t-3xl sm:rounded-3xl p-0 max-w-lg"},wg={class:"flex items-center justify-between px-6 py-4 border-b border-white/5"},kg={class:"text-lg font-bold tracking-tight"},Sg={class:"text-xs text-base-content/50 mt-0.5"},Eg=["title"],Ag={class:"px-6 py-5 space-y-6"},Rg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Cg=["value"],Tg=["value"],Pg={class:"text-[11px] text-base-content/40 mt-1.5"},Og={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Dg={class:"text-[11px] text-base-content/40 mb-2"},Ng={class:"grid grid-cols-2 gap-2"},Ig=["onClick"],$g={key:0,class:"absolute top-1 right-1 text-[10px] font-bold opacity-80"},Lg={key:0,class:"mt-2 space-y-1 text-sm"},Fg={class:"text-xs opacity-50 w-4"},Mg={class:"flex-1"},Ug=["disabled","onClick"],Bg=["disabled","onClick"],Hg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},jg={class:"text-[11px] text-base-content/40 mb-2"},qg={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Vg={class:"flex-1 text-sm"},Wg={class:"block"},Kg={class:"block text-[11px] text-base-content/50"},zg={key:0,class:"grid grid-cols-1 gap-2"},Qg=["placeholder"],Gg=["placeholder"],Jg={class:"rounded-xl border border-white/10 bg-base-100/50 px-3 py-2.5 space-y-2"},Yg={class:"text-[11px] font-semibold text-base-content/70"},Xg={class:"text-[11px] text-base-content/50 space-y-1 list-disc pl-4"},Zg={class:"text-[10px] leading-relaxed text-base-content/60 whitespace-pre-wrap font-mono bg-base-300/30 rounded-lg px-2 py-1.5"},ey={class:"text-[11px] text-base-content/50"},ty=["placeholder"],ny={class:"text-[11px] text-base-content/40"},sy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mt-2"},oy={class:"block text-sm font-medium"},ry={class:"block text-[11px] text-base-content/50 mt-0.5"},iy={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 mt-2"},ly={class:"text-[11px] text-base-content/50"},ay={class:"text-[11px] text-base-content/50"},cy={class:"text-[11px] text-base-content/40"},uy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},dy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},fy={class:"flex-1 text-sm"},py={class:"block"},hy={class:"block text-[11px] text-base-content/50"},my={class:"flex items-baseline justify-between mb-1.5"},gy={class:"text-xs text-base-content/50"},yy={class:"text-[10px] text-base-content/40"},vy=["disabled"],by=["value"],_y={class:"grid grid-cols-2 gap-3"},xy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},wy=["value"],ky={class:"flex items-baseline justify-between mb-2"},Sy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50"},Ey={key:0,class:"text-[10px] text-base-content/40"},Ay=["disabled"],Ry=["value"],Cy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ty={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Py={class:"flex-1 text-sm"},Oy={class:"block"},Dy={class:"block text-[11px] text-base-content/50"},Ny={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Iy={class:"flex-1 text-sm"},$y={class:"block"},Ly={class:"block text-[11px] text-base-content/50"},Fy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},My={class:"text-[11px] text-base-content/40 mb-2"},Uy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},By={class:"flex-1 text-sm"},Hy={class:"block"},jy={class:"block text-[11px] text-base-content/50"},qy={key:0,class:"grid grid-cols-1 gap-2"},Vy=["placeholder"],Wy=["placeholder"],Ky=["placeholder"],zy=["placeholder"],Qy=["placeholder"],Gy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Jy={class:"flex-1 text-sm"},Yy={class:"block"},Xy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Zy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},ev={class:"flex-1 text-sm"},tv={class:"block"},nv={class:"block text-[11px] text-base-content/50"},sv={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},ov={class:"grid grid-cols-5 gap-1.5"},rv=["onClick"],iv={class:"text-[11px] text-base-content/40 mt-1.5"},lv={key:0,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-primary"},av={key:1,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-error"},cv={class:"flex items-center justify-end gap-2 px-6 py-4 border-t border-white/5"},uv={for:"settings-modal",class:"btn btn-sm h-10 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 cursor-pointer"},dv={class:"modal-backdrop",for:"settings-modal"},zn={__name:"Settings",setup(e){const t=uu(),{t:n,locale:s,setLocale:o,locales:r}=St(),i={enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},l={enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256};js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.slskd;if(!y||typeof y!="object"){t.settings.value.slskd={...l};return}for(const[h,k]of Object.entries(l))(y[h]===void 0||y[h]===null)&&(y[h]=k)}),js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.navidrome;if(!y||typeof y!="object"){t.settings.value.navidrome={...i};return}for(const[h,k]of Object.entries(i))(y[h]===void 0||y[h]===null)&&(y[h]=k)}),js(()=>{var y;((y=t.settings.value)==null?void 0:y.sync_navidrome)===void 0&&(t.settings.value.sync_navidrome=!0)}),js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.audio_providers;(!Array.isArray(y)||y.length===0)&&(t.settings.value.audio_providers=["youtube-music"])});function a(y){return y==="youtube-music"?"YouTube Music":y==="youtube"?"YouTube":y==="slskd"?"slskd":y}const d=["slskd","youtube-music","youtube"];function c(y){var h;return(((h=t.settings.value)==null?void 0:h.audio_providers)||[]).indexOf(y)}function f(y){const v=[...t.settings.value.audio_providers||[]],h=v.indexOf(y);h>=0?v.splice(h,1):v.push(y),t.settings.value.audio_providers=v.length>0?v:["youtube-music"]}function m(y,v){const h=[...t.settings.value.audio_providers||[]],k=y+v;k<0||k>=h.length||([h[y],h[k]]=[h[k],h[y]],t.settings.value.audio_providers=h)}function b(){var v,h;const y=!!((h=(v=t.settings.value)==null?void 0:v.slskd)!=null&&h.enabled);t.settings.value.audio_providers=y?[...d]:["youtube-music","youtube"]}return(y,v)=>(A(),T(de,null,[v[23]||(v[23]=p("input",{type:"checkbox",id:"settings-modal",class:"modal-toggle"},null,-1)),p("div",_g,[p("div",xg,[p("div",wg,[p("div",null,[p("h3",kg,w(u(n)("settings.title")),1),p("p",Sg,w(u(n)("settings.subtitle")),1)]),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(n)("common.close")},[M(u(G),{icon:"clarity:close-line",class:"h-5 w-5"})],8,Eg)]),p("div",Ag,[p("div",null,[p("label",Rg,w(u(n)("settings.language")),1),p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",value:u(s),onChange:v[0]||(v[0]=h=>u(o)(h.target.value))},[(A(!0),T(de,null,Ie(u(r),h=>(A(),T("option",{key:h.code,value:h.code},w(h.name),9,Tg))),128))],40,Cg),p("p",Pg,w(u(n)("settings.languageHint")),1)]),p("div",null,[p("label",Og,w(u(n)("settings.audioSource")),1),p("p",Dg,w(u(n)("settings.audioSourceHint")),1),p("div",Ng,[(A(!0),T(de,null,Ie(u(t).settingsOptions.audio_providers,h=>(A(),T("button",{key:h,type:"button",class:Ae(["rounded-xl border px-3 py-2 text-sm transition-colors text-left relative",[c(h)>=0?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:k=>f(h)},[c(h)>=0?(A(),T("span",$g,w(c(h)+1),1)):ie("",!0),Re(" "+w(a(h)),1)],10,Ig))),128))]),u(t).settings.value.audio_providers.length?(A(),T("ul",Lg,[(A(!0),T(de,null,Ie(u(t).settings.value.audio_providers,(h,k)=>(A(),T("li",{key:h,class:"flex items-center gap-2 rounded-lg border border-white/10 px-2 py-1"},[p("span",Fg,w(k+1),1),p("span",Mg,w(a(h)),1),p("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:k===0,onClick:R=>m(k,-1)}," ↑ ",8,Ug),p("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:k===u(t).settings.value.audio_providers.length-1,onClick:R=>m(k,1)}," ↓ ",8,Bg)]))),128))])):ie("",!0),p("button",{type:"button",class:"btn btn-xs btn-ghost rounded-lg mt-2",onClick:b},w(u(n)("settings.audioSourceReset")),1)]),p("div",null,[p("label",Hg,w(u(n)("settings.slskdSection")),1),p("p",jg,w(u(n)("settings.slskdHint")),1),p("label",qg,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[1]||(v[1]=h=>u(t).settings.value.slskd.enabled=h)},null,512),[[tn,u(t).settings.value.slskd.enabled]]),p("span",Vg,[p("span",Wg,w(u(n)("settings.slskdEnabled")),1),p("span",Kg,w(u(n)("settings.slskdEnabledHint")),1)])]),u(t).settings.value.slskd.enabled?(A(),T("div",zg,[Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.slskdBaseUrl"),"onUpdate:modelValue":v[2]||(v[2]=h=>u(t).settings.value.slskd.base_url=h)},null,8,Qg),[[rt,u(t).settings.value.slskd.base_url]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.slskdApiKey"),"onUpdate:modelValue":v[3]||(v[3]=h=>u(t).settings.value.slskd.api_key=h)},null,8,Gg),[[rt,u(t).settings.value.slskd.api_key]]),p("div",Jg,[p("p",Yg,w(u(n)("settings.slskdSourceDirTitle")),1),p("ul",Xg,[p("li",null,w(u(n)("settings.slskdSourceDirBullet1")),1),p("li",null,w(u(n)("settings.slskdSourceDirBullet2")),1),p("li",null,w(u(n)("settings.slskdSourceDirBullet3")),1)]),p("pre",Zg,w(u(n)("settings.slskdSourceDirExample")),1)]),p("label",ey,w(u(n)("settings.slskdSourceDirLabel")),1),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 font-mono text-sm",type:"text",placeholder:u(n)("settings.slskdSourceDirPlaceholder"),"onUpdate:modelValue":v[4]||(v[4]=h=>u(t).settings.value.slskd.source_dir=h)},null,8,ty),[[rt,u(t).settings.value.slskd.source_dir]]),p("p",ny,w(u(n)("settings.slskdSourceDirHint")),1),p("label",sy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[5]||(v[5]=h=>u(t).settings.value.slskd.leave_in_place=h)},null,512),[[tn,u(t).settings.value.slskd.leave_in_place]]),p("span",null,[p("span",oy,w(u(n)("settings.slskdLeaveInPlace")),1),p("span",ry,w(u(n)("settings.slskdLeaveInPlaceHint")),1)])]),p("div",iy,[p("label",ly,[Re(w(u(n)("settings.slskdDownloadTimeout"))+" ",1),Ee(p("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"30",max:"3600","onUpdate:modelValue":v[6]||(v[6]=h=>u(t).settings.value.slskd.download_timeout_seconds=h)},null,512),[[rt,u(t).settings.value.slskd.download_timeout_seconds,void 0,{number:!0}]])]),p("label",ay,[Re(w(u(n)("settings.slskdQueuedTimeout"))+" ",1),Ee(p("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"15",max:"3600","onUpdate:modelValue":v[7]||(v[7]=h=>u(t).settings.value.slskd.queued_timeout_seconds=h)},null,512),[[rt,u(t).settings.value.slskd.queued_timeout_seconds,void 0,{number:!0}]])])]),p("p",cy,w(u(n)("settings.slskdTimeoutHint")),1)])):ie("",!0)]),p("div",null,[p("label",uy,w(u(n)("settings.lyricsSource")),1),p("label",dy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[8]||(v[8]=h=>u(t).settings.value.download_lyrics=h)},null,512),[[tn,u(t).settings.value.download_lyrics]]),p("span",fy,[p("span",py,w(u(n)("settings.downloadLyrics")),1),p("span",hy,w(u(n)("settings.downloadLyricsHint")),1)])]),p("div",my,[p("span",gy,w(u(n)("settings.lyricsProvider")),1),p("span",yy,w(u(n)("settings.lyricsHint")),1)]),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 disabled:opacity-40","onUpdate:modelValue":v[9]||(v[9]=h=>u(t).settings.value.lyrics_providers[0]=h),disabled:!u(t).settings.value.download_lyrics},[(A(!0),T(de,null,Ie(u(t).settingsOptions.lyrics_providers,h=>(A(),T("option",{key:h,value:h},w(h),9,by))),128))],8,vy),[[Xs,u(t).settings.value.lyrics_providers[0]]])]),p("div",_y,[p("div",null,[p("label",xy,w(u(n)("settings.format")),1),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":v[10]||(v[10]=h=>u(t).settings.value.format=h)},[(A(!0),T(de,null,Ie(u(t).settingsOptions.format,h=>(A(),T("option",{key:h,value:h},w(h.toUpperCase()),9,wy))),128))],512),[[Xs,u(t).settings.value.format]])]),p("div",null,[p("div",ky,[p("label",Sy,w(u(n)("settings.quality")),1),u(t).settings.value.format==="flac"?(A(),T("span",Ey,w(u(n)("settings.qualityIgnored")),1)):ie("",!0)]),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":v[11]||(v[11]=h=>u(t).settings.value.bitrate=h),disabled:u(t).settings.value.format==="flac"},[(A(!0),T(de,null,Ie(u(t).settingsOptions.bitrate,h=>(A(),T("option",{key:h,value:h},w(h)+" kbps ",9,Ry))),128))],8,Ay),[[Xs,u(t).settings.value.bitrate]])])]),p("div",null,[p("label",Cy,w(u(n)("settings.playlistsSection")),1),p("label",Ty,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[12]||(v[12]=h=>u(t).settings.value.generate_m3u=h)},null,512),[[tn,u(t).settings.value.generate_m3u]]),p("span",Py,[p("span",Oy,w(u(n)("settings.generateM3u")),1),p("span",Dy,w(u(n)("settings.generateM3uHint")),1)])]),p("label",Ny,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[13]||(v[13]=h=>u(t).settings.value.sync_navidrome=h)},null,512),[[tn,u(t).settings.value.sync_navidrome]]),p("span",Iy,[p("span",$y,w(u(n)("settings.syncNavidrome")),1),p("span",Ly,w(u(n)("settings.syncNavidromeHint")),1)])])]),p("div",null,[p("label",Fy,w(u(n)("settings.navidromeSection")),1),p("p",My,w(u(n)("settings.navidromeHint")),1),p("label",Uy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[14]||(v[14]=h=>u(t).settings.value.navidrome.enabled=h)},null,512),[[tn,u(t).settings.value.navidrome.enabled]]),p("span",By,[p("span",Hy,w(u(n)("settings.navidromeEnabled")),1),p("span",jy,w(u(n)("settings.navidromeEnabledHint")),1)])]),u(t).settings.value.navidrome.enabled?(A(),T("div",qy,[Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeUrl"),"onUpdate:modelValue":v[15]||(v[15]=h=>u(t).settings.value.navidrome.url=h)},null,8,Vy),[[rt,u(t).settings.value.navidrome.url]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeUsername"),"onUpdate:modelValue":v[16]||(v[16]=h=>u(t).settings.value.navidrome.username=h)},null,8,Wy),[[rt,u(t).settings.value.navidrome.username]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.navidromePassword"),"onUpdate:modelValue":v[17]||(v[17]=h=>u(t).settings.value.navidrome.password=h)},null,8,Ky),[[rt,u(t).settings.value.navidrome.password]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeAdminUser"),"onUpdate:modelValue":v[18]||(v[18]=h=>u(t).settings.value.navidrome.admin_username=h)},null,8,zy),[[rt,u(t).settings.value.navidrome.admin_username]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.navidromeAdminPassword"),"onUpdate:modelValue":v[19]||(v[19]=h=>u(t).settings.value.navidrome.admin_password=h)},null,8,Qy),[[rt,u(t).settings.value.navidrome.admin_password]]),p("label",Gy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[20]||(v[20]=h=>u(t).settings.value.navidrome.public_playlist=h)},null,512),[[tn,u(t).settings.value.navidrome.public_playlist]]),p("span",Jy,[p("span",Yy,w(u(n)("settings.navidromePublic")),1)])])])):ie("",!0)]),p("div",null,[p("label",Xy,w(u(n)("settings.organizationSection")),1),p("label",Zy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[21]||(v[21]=h=>u(t).settings.value.organize_by_artist=h)},null,512),[[tn,u(t).settings.value.organize_by_artist]]),p("span",ev,[p("span",tv,w(u(n)("settings.organizeByArtist")),1),p("span",nv,w(u(n)("settings.organizeByArtistHint")),1)])])]),p("div",null,[p("label",sv,w(u(n)("settings.parallelDownloads")),1),p("div",ov,[(A(!0),T(de,null,Ie(u(t).settingsOptions.max_parallel_downloads,h=>(A(),T("button",{key:h,type:"button",class:Ae(["rounded-xl border px-2 py-2 text-sm font-medium transition-colors text-center",[u(t).settings.value.max_parallel_downloads===h?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:k=>u(t).settings.value.max_parallel_downloads=h},w(h),11,rv))),128))]),p("p",iv,w(u(n)("settings.parallelDownloadsHint")),1)]),M(Rc,{"enter-active-class":"transition duration-200","enter-from-class":"opacity-0 -translate-y-1","enter-to-class":"opacity-100 translate-y-0","leave-active-class":"transition duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:ao(()=>[u(t).isSaved.value===!0?(A(),T("div",lv,[M(u(G),{icon:"clarity:check-line",class:"h-4 w-4 shrink-0"}),Re(" "+w(u(n)("settings.saved")),1)])):u(t).isSaved.value===!1?(A(),T("div",av,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-4 w-4 shrink-0"}),Re(" "+w(u(t).saveErrorText.value||u(n)("settings.saveError")),1)])):ie("",!0)]),_:1})]),p("div",cv,[p("label",uv,w(u(n)("common.cancel")),1),p("button",{class:"btn btn-primary btn-sm h-10 px-6 rounded-full",onClick:v[22]||(v[22]=h=>u(t).saveSettings())},w(u(n)("common.save")),1)])]),p("label",dv,w(u(n)("common.close")),1)])],64))}},Nt=te(""),Ql=te("light"),Gl=te("dark");function vi({useSystem:e=!0,initialTheme:t="",newLightAlias:n="",newDarkAlias:s=""}={}){function o(c){Ql.value=c,d()}function r(c){Gl.value=c,d()}function i(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function l(c){Nt.value=c,d()}function a(){Nt==="dark"?Nt.value="light":Nt==="light"&&(Nt.value="dark"),d()}function d(){document.documentElement.setAttribute("data-theme",Nt.value==="dark"?Gl.value:Ql.value)}return Nt.value!=="light"&&Nt.value!=="dark"&&(e&&l(i()),(t==="light"||t==="dark")&&(Nt.value=t)),n&&o(n),s&&r(s),d(),{currentTheme:Nt,setLightAlias:o,setDarkAlias:r,getSystemTheme:i,setTheme:l,switchTheme:a}}const fv={class:"min-h-dvh flex flex-col text-base-content"},pv={__name:"App",setup(e){const t=vi();return Za(()=>{t.setLightAlias("downtify-light"),t.setDarkAlias("downtify-dark")}),(n,s)=>{const o=xr("router-view");return A(),T("div",fv,[M(o,null,{default:ao(({Component:r,route:i})=>[M(Rc,{name:"page",mode:"out-in"},{default:ao(()=>[(A(),ct(Md(r),{key:i.fullPath}))]),_:2},1024)]),_:1}),M(gp),M(zn)])}}};/*! +`+r):s.stack=r}catch{}}throw s}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=En(this.defaults,n);const{transitional:s,paramsSerializer:o,headers:r}=n;s!==void 0&&oo.assertOptions(s,{silentJSONParsing:pt.transitional(pt.boolean),forcedJSONParsing:pt.transitional(pt.boolean),clarifyTimeoutError:pt.transitional(pt.boolean),legacyInterceptorReqResOrdering:pt.transitional(pt.boolean)},!1),o!=null&&(E.isFunction(o)?n.paramsSerializer={serialize:o}:oo.assertOptions(o,{encode:pt.function,serialize:pt.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),oo.assertOptions(n,{baseUrl:pt.spelling("baseURL"),withXsrfToken:pt.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=r&&E.merge(r.common,r[n.method]);r&&E.forEach(["delete","get","head","post","put","patch","common"],y=>{delete r[y]}),n.headers=nt.concat(i,r);const l=[];let a=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;a=a&&v.synchronous;const h=n.transitional||hi;h&&h.legacyInterceptorReqResOrdering?l.unshift(v.fulfilled,v.rejected):l.push(v.fulfilled,v.rejected)});const d=[];this.interceptors.response.forEach(function(v){d.push(v.fulfilled,v.rejected)});let c,f=0,m;if(!a){const y=[Wl.bind(this),void 0];for(y.unshift(...l),y.push(...d),m=y.length,c=Promise.resolve(n);f{if(!s._listeners)return;let r=s._listeners.length;for(;r-- >0;)s._listeners[r](o);s._listeners=null}),this.promise.then=o=>{let r;const i=new Promise(l=>{s.subscribe(l),r=l}).then(o);return i.cancel=function(){s.unsubscribe(r)},i},t(function(r,i,l){s.reason||(s.reason=new Ds(r,i,l),n(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=s=>{t.abort(s)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new lu(function(o){t=o}),cancel:t}}};function qm(e){return function(n){return e.apply(null,n)}}function Vm(e){return E.isObject(e)&&e.isAxiosError===!0}const $r={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries($r).forEach(([e,t])=>{$r[t]=e});function au(e){const t=new Sn(e),n=Hc(Sn.prototype.request,t);return E.extend(n,Sn.prototype,t,{allOwnKeys:!0}),E.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return au(En(e,o))},n}const Pe=au(Os);Pe.Axios=Sn;Pe.CanceledError=Ds;Pe.CancelToken=jm;Pe.isCancel=eu;Pe.VERSION=iu;Pe.toFormData=Fo;Pe.AxiosError=ee;Pe.Cancel=Pe.CanceledError;Pe.all=function(t){return Promise.all(t)};Pe.spread=qm;Pe.isAxiosError=Vm;Pe.mergeConfig=En;Pe.AxiosHeaders=nt;Pe.formToJSON=e=>Zc(E.isHTMLForm(e)?new FormData(e):e);Pe.getAdapter=ru.getAdapter;Pe.HttpStatusCode=$r;Pe.default=Pe;const{Axios:v1,AxiosError:b1,CanceledError:_1,isCancel:x1,CancelToken:w1,VERSION:k1,all:S1,Cancel:E1,isAxiosError:A1,spread:R1,toFormData:C1,AxiosHeaders:T1,HttpStatusCode:P1,formToJSON:O1,getAdapter:D1,mergeConfig:N1}=Pe;var Rn={};const Ge={PROTOCOL:Rn.PROTOCOL||window.location.protocol,WS_PROTOCOL:Rn.WS_PROTOCOL||window.location.protocol==="https:"?"wss:":"ws:",BACKEND:Rn.BACKEND||window.location.hostname,PORT:Rn.PORT||window.location.port,WS_PORT:Rn.WS_PORT||window.location.port,BASEURL:Rn.BASEURL||""};let Vs;const Wm=new Uint8Array(16);function Km(){if(!Vs&&(Vs=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Vs))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Vs(Wm)}const Le=[];for(let e=0;e<256;++e)Le.push((e+256).toString(16).slice(1));function zm(e,t=0){return Le[e[t+0]]+Le[e[t+1]]+Le[e[t+2]]+Le[e[t+3]]+"-"+Le[e[t+4]]+Le[e[t+5]]+"-"+Le[e[t+6]]+Le[e[t+7]]+"-"+Le[e[t+8]]+Le[e[t+9]]+"-"+Le[e[t+10]]+Le[e[t+11]]+Le[e[t+12]]+Le[e[t+13]]+Le[e[t+14]]+Le[e[t+15]]}const Qm=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),zl={randomUUID:Qm};function Gm(e,t,n){if(zl.randomUUID&&!e)return zl.randomUUID();e=e||{};const s=e.random||(e.rng||Km)();return s[6]=s[6]&15|64,s[8]=s[8]&63|128,zm(s)}var Jm={};console.log("using env:",Jm);console.log("using config: ",Ge);const Je=Pe.create({baseURL:`${Ge.PROTOCOL}//${Ge.BACKEND}:${Ge.PORT}${Ge.BASEURL}`}),Ns=Gm();console.log("session ID: ",Ns);cu();const yi=new WebSocket(`${Ge.WS_PROTOCOL}//${Ge.BACKEND}${Ge.PORT!==""?":"+Ge.PORT:""}${Ge.BASEURL}/api/ws?client_id=${Ns}`);yi.onopen=e=>{console.log("websocket connection opened",e)};function cu(){Je.get("/api/version").then(e=>{const t=localStorage.getItem("version");console.log("Backend version: ",e.data),localStorage.setItem("version",e.data),t!=e.data&&location.reload()}).catch(e=>{console.error(e),console.log("Error getting version, using 0"),localStorage.setItem("version","0.0.0")})}function Ym(e){return Je.get("/api/songs/search",{params:{query:e}})}function Xm(e){return Je.get("/api/song/url",{params:{url:e}})}function Zm(e){const t=typeof e=="string"?e:e.url,n=typeof e=="string"?void 0:e;return Je.post("/api/download/url",n,{params:{url:t,client_id:Ns}})}function eg(e){return Je.post("/api/download/batch",e)}function tg(){return Je.get("/api/check_update")}function ng(e){return String(e||"").split("/").map(encodeURIComponent).join("/")}function sg(e){return`/media/${ng(e)}`}function og(e){try{return decodeURIComponent(e)}catch{return e}}function rg(e){let t=String(e||"");const n=t.indexOf("/media/");return n>=0?t=t.slice(n+7):t=t.replace(/^\//,""),t.split("/").filter(Boolean).map(og).join("/")}function ig(e){const t=rg(e);if(!t)return"download";const n=t.split("/");return n[n.length-1]||"download"}function lg(e){return`/cover?file=${encodeURIComponent(e)}`}function ag(){return Je.get("/list")}function cg(e){return Je.delete("/delete",{params:{file:e}})}function ug(e){return Je.post("/api/playlist/m3u",e)}function dg(){return Je.get("/api/queue")}function fg(e){return Je.delete("/api/queue/item",{params:{song_id:e}})}function pg(){return Je.delete("/api/queue")}function hg(){return Je.delete("/api/queue/completed")}function mg(){return Je.get("/api/settings",{params:{client_id:Ns}})}function gg(e){return Je.post("/api/settings/update",e,{params:{client_id:Ns}})}function yg(e){return yi.onmessage=e}function vg(e){return yi.onerror=e}const ve={search:Ym,open:Xm,download:Zm,downloadBatch:eg,downloadFileURL:sg,downloadSaveName:ig,coverFileURL:lg,listDownloads:ag,deleteDownload:cg,writePlaylistM3u:ug,getQueue:dg,removeQueueItem:fg,clearQueue:pg,clearCompletedQueue:hg,getSettings:mg,setSettings:gg,check_for_update:tg,ws_onmessage:yg,ws_onerror:vg,getVersion:cu},zt=te({audio_providers:[""],slskd:{enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256},lyrics_providers:[""],download_lyrics:!0,format:"",bitrate:"320",output:"",generate_m3u:!0,sync_navidrome:!0,navidrome:{enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},organize_by_artist:!1,max_parallel_downloads:3}),bg={audio_providers:["youtube","youtube-music","slskd"],lyrics_providers:["lrclib","genius","musixmatch","azlyrics"],format:["mp3","flac","ogg","opus","m4a"],bitrate:["128","192","256","320"],max_parallel_downloads:[1,2,3,5,8],output:"{artists} - {title}.{output-ext}"};ve.getSettings().then(e=>{e.status===200?(console.log("Received settings:",e.data),zt.value={...zt.value,...e.data,slskd:{...zt.value.slskd,...e.data.slskd||{}},navidrome:{...zt.value.navidrome,...e.data.navidrome||{}}}):console.log("Error loading settings")});function uu(){const e=te(),t=te("");function n(){var i,l;const o=((i=zt.value)==null?void 0:i.slskd)||{};if(o.enabled){if(!String(o.base_url||"").trim())return"slskd base URL is required when enabled";if(!String(o.api_key||"").trim())return"slskd API key is required when enabled"}const r=((l=zt.value)==null?void 0:l.navidrome)||{};if(r.enabled){if(!String(r.url||"").trim())return"Navidrome URL is required when enabled";if(!String(r.username||"").trim())return"Navidrome username is required when enabled";if(!String(r.password||""))return"Navidrome password is required when enabled"}return""}function s(){console.log("Saving settings:",zt.value);const o=n();if(o){t.value=o,e.value=!1,setTimeout(()=>{e.value=null},2500);return}t.value="",ve.setSettings(zt.value).then(r=>{if(r.status===200){console.log("Saved!"),e.value=!0;const i=document.getElementById("settings-modal");i&&"checked"in i&&(i.checked=!1),setTimeout(()=>{e.value=null},2e3)}else console.error("Error saving settings.",r),t.value="Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2e3)}).catch(r=>{var l,a;const i=(a=(l=r==null?void 0:r.response)==null?void 0:l.data)==null?void 0:a.detail;t.value=typeof i=="string"&&i.trim()?i:"Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2500)})}return{saveSettings:s,settings:zt,settingsOptions:bg,isSaved:e,saveErrorText:t}}const _g={class:"modal modal-bottom sm:modal-middle"},xg={class:"modal-box surface-strong rounded-t-3xl sm:rounded-3xl p-0 max-w-lg"},wg={class:"flex items-center justify-between px-6 py-4 border-b border-white/5"},kg={class:"text-lg font-bold tracking-tight"},Sg={class:"text-xs text-base-content/50 mt-0.5"},Eg=["title"],Ag={class:"px-6 py-5 space-y-6"},Rg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Cg=["value"],Tg=["value"],Pg={class:"text-[11px] text-base-content/40 mt-1.5"},Og={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Dg={class:"text-[11px] text-base-content/40 mb-2"},Ng={class:"grid grid-cols-2 gap-2"},Ig=["onClick"],$g={key:0,class:"absolute top-1 right-1 text-[10px] font-bold opacity-80"},Lg={key:0,class:"mt-2 space-y-1 text-sm"},Fg={class:"text-xs opacity-50 w-4"},Mg={class:"flex-1"},Ug=["disabled","onClick"],Bg=["disabled","onClick"],Hg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},jg={class:"text-[11px] text-base-content/40 mb-2"},qg={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Vg={class:"flex-1 text-sm"},Wg={class:"block"},Kg={class:"block text-[11px] text-base-content/50"},zg={key:0,class:"grid grid-cols-1 gap-2"},Qg=["placeholder"],Gg=["placeholder"],Jg={class:"rounded-xl border border-white/10 bg-base-100/50 px-3 py-2.5 space-y-2"},Yg={class:"text-[11px] font-semibold text-base-content/70"},Xg={class:"text-[11px] text-base-content/50 space-y-1 list-disc pl-4"},Zg={class:"text-[10px] leading-relaxed text-base-content/60 whitespace-pre-wrap font-mono bg-base-300/30 rounded-lg px-2 py-1.5"},ey={class:"text-[11px] text-base-content/50"},ty=["placeholder"],ny={class:"text-[11px] text-base-content/40"},sy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mt-2"},oy={class:"block text-sm font-medium"},ry={class:"block text-[11px] text-base-content/50 mt-0.5"},iy={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 mt-2"},ly={class:"text-[11px] text-base-content/50"},ay={class:"text-[11px] text-base-content/50"},cy={class:"text-[11px] text-base-content/40"},uy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},dy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},fy={class:"flex-1 text-sm"},py={class:"block"},hy={class:"block text-[11px] text-base-content/50"},my={class:"flex items-baseline justify-between mb-1.5"},gy={class:"text-xs text-base-content/50"},yy={class:"text-[10px] text-base-content/40"},vy=["disabled"],by=["value"],_y={class:"grid grid-cols-2 gap-3"},xy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},wy=["value"],ky={class:"flex items-baseline justify-between mb-2"},Sy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50"},Ey={key:0,class:"text-[10px] text-base-content/40"},Ay=["disabled"],Ry=["value"],Cy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ty={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Py={class:"flex-1 text-sm"},Oy={class:"block"},Dy={class:"block text-[11px] text-base-content/50"},Ny={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Iy={class:"flex-1 text-sm"},$y={class:"block"},Ly={class:"block text-[11px] text-base-content/50"},Fy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},My={class:"text-[11px] text-base-content/40 mb-2"},Uy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},By={class:"flex-1 text-sm"},Hy={class:"block"},jy={class:"block text-[11px] text-base-content/50"},qy={key:0,class:"grid grid-cols-1 gap-2"},Vy=["placeholder"],Wy=["placeholder"],Ky=["placeholder"],zy=["placeholder"],Qy=["placeholder"],Gy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Jy={class:"flex-1 text-sm"},Yy={class:"block"},Xy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Zy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},ev={class:"flex-1 text-sm"},tv={class:"block"},nv={class:"block text-[11px] text-base-content/50"},sv={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},ov={class:"grid grid-cols-5 gap-1.5"},rv=["onClick"],iv={class:"text-[11px] text-base-content/40 mt-1.5"},lv={key:0,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-primary"},av={key:1,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-error"},cv={class:"flex items-center justify-end gap-2 px-6 py-4 border-t border-white/5"},uv={for:"settings-modal",class:"btn btn-sm h-10 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 cursor-pointer"},dv={class:"modal-backdrop",for:"settings-modal"},zn={__name:"Settings",setup(e){const t=uu(),{t:n,locale:s,setLocale:o,locales:r}=St(),i={enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},l={enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256};js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.slskd;if(!y||typeof y!="object"){t.settings.value.slskd={...l};return}for(const[h,k]of Object.entries(l))(y[h]===void 0||y[h]===null)&&(y[h]=k)}),js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.navidrome;if(!y||typeof y!="object"){t.settings.value.navidrome={...i};return}for(const[h,k]of Object.entries(i))(y[h]===void 0||y[h]===null)&&(y[h]=k)}),js(()=>{var y;((y=t.settings.value)==null?void 0:y.sync_navidrome)===void 0&&(t.settings.value.sync_navidrome=!0)}),js(()=>{var v;const y=(v=t.settings.value)==null?void 0:v.audio_providers;(!Array.isArray(y)||y.length===0)&&(t.settings.value.audio_providers=["youtube-music"])});function a(y){return y==="youtube-music"?"YouTube Music":y==="youtube"?"YouTube":y==="slskd"?"slskd":y}const d=["slskd","youtube-music","youtube"];function c(y){var h;return(((h=t.settings.value)==null?void 0:h.audio_providers)||[]).indexOf(y)}function f(y){const v=[...t.settings.value.audio_providers||[]],h=v.indexOf(y);h>=0?v.splice(h,1):v.push(y),t.settings.value.audio_providers=v.length>0?v:["youtube-music"]}function m(y,v){const h=[...t.settings.value.audio_providers||[]],k=y+v;k<0||k>=h.length||([h[y],h[k]]=[h[k],h[y]],t.settings.value.audio_providers=h)}function b(){var v,h;const y=!!((h=(v=t.settings.value)==null?void 0:v.slskd)!=null&&h.enabled);t.settings.value.audio_providers=y?[...d]:["youtube-music","youtube"]}return(y,v)=>(A(),T(de,null,[v[23]||(v[23]=p("input",{type:"checkbox",id:"settings-modal",class:"modal-toggle"},null,-1)),p("div",_g,[p("div",xg,[p("div",wg,[p("div",null,[p("h3",kg,w(u(n)("settings.title")),1),p("p",Sg,w(u(n)("settings.subtitle")),1)]),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(n)("common.close")},[M(u(G),{icon:"clarity:close-line",class:"h-5 w-5"})],8,Eg)]),p("div",Ag,[p("div",null,[p("label",Rg,w(u(n)("settings.language")),1),p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",value:u(s),onChange:v[0]||(v[0]=h=>u(o)(h.target.value))},[(A(!0),T(de,null,Ie(u(r),h=>(A(),T("option",{key:h.code,value:h.code},w(h.name),9,Tg))),128))],40,Cg),p("p",Pg,w(u(n)("settings.languageHint")),1)]),p("div",null,[p("label",Og,w(u(n)("settings.audioSource")),1),p("p",Dg,w(u(n)("settings.audioSourceHint")),1),p("div",Ng,[(A(!0),T(de,null,Ie(u(t).settingsOptions.audio_providers,h=>(A(),T("button",{key:h,type:"button",class:Ae(["rounded-xl border px-3 py-2 text-sm transition-colors text-left relative",[c(h)>=0?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:k=>f(h)},[c(h)>=0?(A(),T("span",$g,w(c(h)+1),1)):ie("",!0),Re(" "+w(a(h)),1)],10,Ig))),128))]),u(t).settings.value.audio_providers.length?(A(),T("ul",Lg,[(A(!0),T(de,null,Ie(u(t).settings.value.audio_providers,(h,k)=>(A(),T("li",{key:h,class:"flex items-center gap-2 rounded-lg border border-white/10 px-2 py-1"},[p("span",Fg,w(k+1),1),p("span",Mg,w(a(h)),1),p("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:k===0,onClick:R=>m(k,-1)}," ↑ ",8,Ug),p("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:k===u(t).settings.value.audio_providers.length-1,onClick:R=>m(k,1)}," ↓ ",8,Bg)]))),128))])):ie("",!0),p("button",{type:"button",class:"btn btn-xs btn-ghost rounded-lg mt-2",onClick:b},w(u(n)("settings.audioSourceReset")),1)]),p("div",null,[p("label",Hg,w(u(n)("settings.slskdSection")),1),p("p",jg,w(u(n)("settings.slskdHint")),1),p("label",qg,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[1]||(v[1]=h=>u(t).settings.value.slskd.enabled=h)},null,512),[[tn,u(t).settings.value.slskd.enabled]]),p("span",Vg,[p("span",Wg,w(u(n)("settings.slskdEnabled")),1),p("span",Kg,w(u(n)("settings.slskdEnabledHint")),1)])]),u(t).settings.value.slskd.enabled?(A(),T("div",zg,[Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.slskdBaseUrl"),"onUpdate:modelValue":v[2]||(v[2]=h=>u(t).settings.value.slskd.base_url=h)},null,8,Qg),[[rt,u(t).settings.value.slskd.base_url]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.slskdApiKey"),"onUpdate:modelValue":v[3]||(v[3]=h=>u(t).settings.value.slskd.api_key=h)},null,8,Gg),[[rt,u(t).settings.value.slskd.api_key]]),p("div",Jg,[p("p",Yg,w(u(n)("settings.slskdSourceDirTitle")),1),p("ul",Xg,[p("li",null,w(u(n)("settings.slskdSourceDirBullet1")),1),p("li",null,w(u(n)("settings.slskdSourceDirBullet2")),1),p("li",null,w(u(n)("settings.slskdSourceDirBullet3")),1)]),p("pre",Zg,w(u(n)("settings.slskdSourceDirExample")),1)]),p("label",ey,w(u(n)("settings.slskdSourceDirLabel")),1),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 font-mono text-sm",type:"text",placeholder:u(n)("settings.slskdSourceDirPlaceholder"),"onUpdate:modelValue":v[4]||(v[4]=h=>u(t).settings.value.slskd.source_dir=h)},null,8,ty),[[rt,u(t).settings.value.slskd.source_dir]]),p("p",ny,w(u(n)("settings.slskdSourceDirHint")),1),p("label",sy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[5]||(v[5]=h=>u(t).settings.value.slskd.leave_in_place=h)},null,512),[[tn,u(t).settings.value.slskd.leave_in_place]]),p("span",null,[p("span",oy,w(u(n)("settings.slskdLeaveInPlace")),1),p("span",ry,w(u(n)("settings.slskdLeaveInPlaceHint")),1)])]),p("div",iy,[p("label",ly,[Re(w(u(n)("settings.slskdDownloadTimeout"))+" ",1),Ee(p("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"30",max:"3600","onUpdate:modelValue":v[6]||(v[6]=h=>u(t).settings.value.slskd.download_timeout_seconds=h)},null,512),[[rt,u(t).settings.value.slskd.download_timeout_seconds,void 0,{number:!0}]])]),p("label",ay,[Re(w(u(n)("settings.slskdQueuedTimeout"))+" ",1),Ee(p("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"15",max:"3600","onUpdate:modelValue":v[7]||(v[7]=h=>u(t).settings.value.slskd.queued_timeout_seconds=h)},null,512),[[rt,u(t).settings.value.slskd.queued_timeout_seconds,void 0,{number:!0}]])])]),p("p",cy,w(u(n)("settings.slskdTimeoutHint")),1)])):ie("",!0)]),p("div",null,[p("label",uy,w(u(n)("settings.lyricsSource")),1),p("label",dy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[8]||(v[8]=h=>u(t).settings.value.download_lyrics=h)},null,512),[[tn,u(t).settings.value.download_lyrics]]),p("span",fy,[p("span",py,w(u(n)("settings.downloadLyrics")),1),p("span",hy,w(u(n)("settings.downloadLyricsHint")),1)])]),p("div",my,[p("span",gy,w(u(n)("settings.lyricsProvider")),1),p("span",yy,w(u(n)("settings.lyricsHint")),1)]),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 disabled:opacity-40","onUpdate:modelValue":v[9]||(v[9]=h=>u(t).settings.value.lyrics_providers[0]=h),disabled:!u(t).settings.value.download_lyrics},[(A(!0),T(de,null,Ie(u(t).settingsOptions.lyrics_providers,h=>(A(),T("option",{key:h,value:h},w(h),9,by))),128))],8,vy),[[Xs,u(t).settings.value.lyrics_providers[0]]])]),p("div",_y,[p("div",null,[p("label",xy,w(u(n)("settings.format")),1),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":v[10]||(v[10]=h=>u(t).settings.value.format=h)},[(A(!0),T(de,null,Ie(u(t).settingsOptions.format,h=>(A(),T("option",{key:h,value:h},w(h.toUpperCase()),9,wy))),128))],512),[[Xs,u(t).settings.value.format]])]),p("div",null,[p("div",ky,[p("label",Sy,w(u(n)("settings.quality")),1),u(t).settings.value.format==="flac"?(A(),T("span",Ey,w(u(n)("settings.qualityIgnored")),1)):ie("",!0)]),Ee(p("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":v[11]||(v[11]=h=>u(t).settings.value.bitrate=h),disabled:u(t).settings.value.format==="flac"},[(A(!0),T(de,null,Ie(u(t).settingsOptions.bitrate,h=>(A(),T("option",{key:h,value:h},w(h)+" kbps ",9,Ry))),128))],8,Ay),[[Xs,u(t).settings.value.bitrate]])])]),p("div",null,[p("label",Cy,w(u(n)("settings.playlistsSection")),1),p("label",Ty,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[12]||(v[12]=h=>u(t).settings.value.generate_m3u=h)},null,512),[[tn,u(t).settings.value.generate_m3u]]),p("span",Py,[p("span",Oy,w(u(n)("settings.generateM3u")),1),p("span",Dy,w(u(n)("settings.generateM3uHint")),1)])]),p("label",Ny,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[13]||(v[13]=h=>u(t).settings.value.sync_navidrome=h)},null,512),[[tn,u(t).settings.value.sync_navidrome]]),p("span",Iy,[p("span",$y,w(u(n)("settings.syncNavidrome")),1),p("span",Ly,w(u(n)("settings.syncNavidromeHint")),1)])])]),p("div",null,[p("label",Fy,w(u(n)("settings.navidromeSection")),1),p("p",My,w(u(n)("settings.navidromeHint")),1),p("label",Uy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[14]||(v[14]=h=>u(t).settings.value.navidrome.enabled=h)},null,512),[[tn,u(t).settings.value.navidrome.enabled]]),p("span",By,[p("span",Hy,w(u(n)("settings.navidromeEnabled")),1),p("span",jy,w(u(n)("settings.navidromeEnabledHint")),1)])]),u(t).settings.value.navidrome.enabled?(A(),T("div",qy,[Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeUrl"),"onUpdate:modelValue":v[15]||(v[15]=h=>u(t).settings.value.navidrome.url=h)},null,8,Vy),[[rt,u(t).settings.value.navidrome.url]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeUsername"),"onUpdate:modelValue":v[16]||(v[16]=h=>u(t).settings.value.navidrome.username=h)},null,8,Wy),[[rt,u(t).settings.value.navidrome.username]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.navidromePassword"),"onUpdate:modelValue":v[17]||(v[17]=h=>u(t).settings.value.navidrome.password=h)},null,8,Ky),[[rt,u(t).settings.value.navidrome.password]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(n)("settings.navidromeAdminUser"),"onUpdate:modelValue":v[18]||(v[18]=h=>u(t).settings.value.navidrome.admin_username=h)},null,8,zy),[[rt,u(t).settings.value.navidrome.admin_username]]),Ee(p("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(n)("settings.navidromeAdminPassword"),"onUpdate:modelValue":v[19]||(v[19]=h=>u(t).settings.value.navidrome.admin_password=h)},null,8,Qy),[[rt,u(t).settings.value.navidrome.admin_password]]),p("label",Gy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[20]||(v[20]=h=>u(t).settings.value.navidrome.public_playlist=h)},null,512),[[tn,u(t).settings.value.navidrome.public_playlist]]),p("span",Jy,[p("span",Yy,w(u(n)("settings.navidromePublic")),1)])])])):ie("",!0)]),p("div",null,[p("label",Xy,w(u(n)("settings.organizationSection")),1),p("label",Zy,[Ee(p("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":v[21]||(v[21]=h=>u(t).settings.value.organize_by_artist=h)},null,512),[[tn,u(t).settings.value.organize_by_artist]]),p("span",ev,[p("span",tv,w(u(n)("settings.organizeByArtist")),1),p("span",nv,w(u(n)("settings.organizeByArtistHint")),1)])])]),p("div",null,[p("label",sv,w(u(n)("settings.parallelDownloads")),1),p("div",ov,[(A(!0),T(de,null,Ie(u(t).settingsOptions.max_parallel_downloads,h=>(A(),T("button",{key:h,type:"button",class:Ae(["rounded-xl border px-2 py-2 text-sm font-medium transition-colors text-center",[u(t).settings.value.max_parallel_downloads===h?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:k=>u(t).settings.value.max_parallel_downloads=h},w(h),11,rv))),128))]),p("p",iv,w(u(n)("settings.parallelDownloadsHint")),1)]),M(Rc,{"enter-active-class":"transition duration-200","enter-from-class":"opacity-0 -translate-y-1","enter-to-class":"opacity-100 translate-y-0","leave-active-class":"transition duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:ao(()=>[u(t).isSaved.value===!0?(A(),T("div",lv,[M(u(G),{icon:"clarity:check-line",class:"h-4 w-4 shrink-0"}),Re(" "+w(u(n)("settings.saved")),1)])):u(t).isSaved.value===!1?(A(),T("div",av,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-4 w-4 shrink-0"}),Re(" "+w(u(t).saveErrorText.value||u(n)("settings.saveError")),1)])):ie("",!0)]),_:1})]),p("div",cv,[p("label",uv,w(u(n)("common.cancel")),1),p("button",{class:"btn btn-primary btn-sm h-10 px-6 rounded-full",onClick:v[22]||(v[22]=h=>u(t).saveSettings())},w(u(n)("common.save")),1)])]),p("label",dv,w(u(n)("common.close")),1)])],64))}},Nt=te(""),Ql=te("light"),Gl=te("dark");function vi({useSystem:e=!0,initialTheme:t="",newLightAlias:n="",newDarkAlias:s=""}={}){function o(c){Ql.value=c,d()}function r(c){Gl.value=c,d()}function i(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function l(c){Nt.value=c,d()}function a(){Nt==="dark"?Nt.value="light":Nt==="light"&&(Nt.value="dark"),d()}function d(){document.documentElement.setAttribute("data-theme",Nt.value==="dark"?Gl.value:Ql.value)}return Nt.value!=="light"&&Nt.value!=="dark"&&(e&&l(i()),(t==="light"||t==="dark")&&(Nt.value=t)),n&&o(n),s&&r(s),d(),{currentTheme:Nt,setLightAlias:o,setDarkAlias:r,getSystemTheme:i,setTheme:l,switchTheme:a}}const fv={class:"min-h-dvh flex flex-col text-base-content"},pv={__name:"App",setup(e){const t=vi();return Za(()=>{t.setLightAlias("downtify-light"),t.setDarkAlias("downtify-dark")}),(n,s)=>{const o=xr("router-view");return A(),T("div",fv,[M(o,null,{default:ao(({Component:r,route:i})=>[M(Rc,{name:"page",mode:"out-in"},{default:ao(()=>[(A(),ct(Md(r),{key:i.fullPath}))]),_:2},1024)]),_:1}),M(gp),M(zn)])}}};/*! * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT @@ -30,4 +30,4 @@ Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Past * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT - */let Qv=()=>location.protocol+"//"+location.host;function _u(e,t){const{pathname:n,search:s,hash:o}=t,r=e.indexOf("#");if(r>-1){let i=o.includes(e.slice(r))?e.slice(r).length:1,l=o.slice(i);return l[0]!=="/"&&(l="/"+l),Yl(l,"")}return Yl(n,e)+s+o}function Gv(e,t,n,s){let o=[],r=[],i=null;const l=({state:m})=>{const b=_u(e,location),y=n.value,v=t.value;let h=0;if(m){if(n.value=b,t.value=m,i&&i===y){i=null;return}h=v?m.position-v.position:0}else s(b);o.forEach(k=>{k(n.value,y,{delta:h,type:Fr.pop,direction:h?h>0?cr.forward:cr.back:cr.unknown})})};function a(){i=n.value}function d(m){o.push(m);const b=()=>{const y=o.indexOf(m);y>-1&&o.splice(y,1)};return r.push(b),b}function c(){if(document.visibilityState==="hidden"){const{history:m}=window;if(!m.state)return;m.replaceState(he({},m.state,{scroll:Uo()}),"")}}function f(){for(const m of r)m();r=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:a,listen:d,destroy:f}}function na(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Uo():null}}function Jv(e){const{history:t,location:n}=window,s={value:_u(e,n)},o={value:t.state};o.value||r(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(a,d,c){const f=e.indexOf("#"),m=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:Qv()+e+a;try{t[c?"replaceState":"pushState"](d,"",m),o.value=d}catch(b){console.error(b),n[c?"replace":"assign"](m)}}function i(a,d){r(a,he({},t.state,na(o.value.back,a,o.value.forward,!0),d,{position:o.value.position}),!0),s.value=a}function l(a,d){const c=he({},o.value,t.state,{forward:a,scroll:Uo()});r(c.current,c,!0),r(a,he({},na(s.value,a,null),{position:c.position+1},d),!1),s.value=a}return{location:s,state:o,push:l,replace:i}}function Yv(e){e=Iv(e);const t=Jv(e),n=Gv(e,t.state,t.location,t.replace);function s(r,i=!0){i||n.pauseListeners(),history.go(r)}const o=he({location:"",base:e,go:s,createHref:Lv.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let xn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Ne=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Ne||{});const Xv={type:xn.Static,value:""},Zv=/[a-zA-Z0-9_]/;function eb(e){if(!e)return[[]];if(e==="/")return[[Xv]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(b){throw new Error(`ERR (${n})/"${d}": ${b}`)}let n=Ne.Static,s=n;const o=[];let r;function i(){r&&o.push(r),r=[]}let l=0,a,d="",c="";function f(){d&&(n===Ne.Static?r.push({type:xn.Static,value:d}):n===Ne.Param||n===Ne.ParamRegExp||n===Ne.ParamRegExpEnd?(r.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),r.push({type:xn.Param,value:d,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),d="")}function m(){d+=a}for(;lt.length?t.length===1&&t[0]===We.Static+We.Segment?1:-1:0}function xu(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const rb={strict:!1,end:!0,sensitive:!1};function ib(e,t,n){const s=sb(eb(e.path),n),o=he(s,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function lb(e,t){const n=[],s=new Map;t=Jl(rb,t);function o(f){return s.get(f)}function r(f,m,b){const y=!b,v=ia(f);v.aliasOf=b&&b.record;const h=Jl(t,f),k=[v];if("alias"in f){const C=typeof f.alias=="string"?[f.alias]:f.alias;for(const L of C)k.push(ia(he({},v,{components:b?b.record.components:v.components,path:L,aliasOf:b?b.record:v})))}let R,S;for(const C of k){const{path:L}=C;if(m&&L[0]!=="/"){const P=m.record.path,U=P[P.length-1]==="/"?"":"/";C.path=m.record.path+(L&&U+L)}if(R=ib(C,m,h),b?b.alias.push(R):(S=S||R,S!==R&&S.alias.push(R),y&&f.name&&!la(R)&&i(f.name)),wu(R)&&a(R),v.children){const P=v.children;for(let U=0;U{i(S)}:fs}function i(f){if(vu(f)){const m=s.get(f);m&&(s.delete(f),n.splice(n.indexOf(m),1),m.children.forEach(i),m.alias.forEach(i))}else{const m=n.indexOf(f);m>-1&&(n.splice(m,1),f.record.name&&s.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function l(){return n}function a(f){const m=ub(f,n);n.splice(m,0,f),f.record.name&&!la(f)&&s.set(f.record.name,f)}function d(f,m){let b,y={},v,h;if("name"in f&&f.name){if(b=s.get(f.name),!b)throw jn(Ce.MATCHER_NOT_FOUND,{location:f});h=b.record.name,y=he(ra(m.params,b.keys.filter(S=>!S.optional).concat(b.parent?b.parent.keys.filter(S=>S.optional):[]).map(S=>S.name)),f.params&&ra(f.params,b.keys.map(S=>S.name))),v=b.stringify(y)}else if(f.path!=null)v=f.path,b=n.find(S=>S.re.test(v)),b&&(y=b.parse(v),h=b.record.name);else{if(b=m.name?s.get(m.name):n.find(S=>S.re.test(m.path)),!b)throw jn(Ce.MATCHER_NOT_FOUND,{location:f,currentLocation:m});h=b.record.name,y=he({},m.params,f.params),v=b.stringify(y)}const k=[];let R=b;for(;R;)k.unshift(R.record),R=R.parent;return{name:h,path:v,params:y,matched:k,meta:cb(k)}}e.forEach(f=>r(f));function c(){n.length=0,s.clear()}return{addRoute:r,resolve:d,removeRoute:i,clearRoutes:c,getRoutes:l,getRecordMatcher:o}}function ra(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function ia(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:ab(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function ab(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function la(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function cb(e){return e.reduce((t,n)=>he(t,n.meta),{})}function ub(e,t){let n=0,s=t.length;for(;n!==s;){const r=n+s>>1;xu(e,t[r])<0?s=r:n=r+1}const o=db(e);return o&&(s=t.lastIndexOf(o,s-1)),s}function db(e){let t=e;for(;t=t.parent;)if(wu(t)&&xu(e,t)===0)return t}function wu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function aa(e){const t=_t(Bo),n=_t(_i),s=be(()=>{const a=u(e.to);return t.resolve(a)}),o=be(()=>{const{matched:a}=s.value,{length:d}=a,c=a[d-1],f=n.matched;if(!c||!f.length)return-1;const m=f.findIndex(Hn.bind(null,c));if(m>-1)return m;const b=ca(a[d-2]);return d>1&&ca(c)===b&&f[f.length-1].path!==b?f.findIndex(Hn.bind(null,a[d-2])):m}),r=be(()=>o.value>-1&&gb(n.params,s.value.params)),i=be(()=>o.value>-1&&o.value===n.matched.length-1&&yu(n.params,s.value.params));function l(a={}){if(mb(a)){const d=t[u(e.replace)?"replace":"push"](u(e.to)).catch(fs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:be(()=>s.value.href),isActive:r,isExactActive:i,navigate:l}}function fb(e){return e.length===1?e[0]:e}const pb=si({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:aa,setup(e,{slots:t}){const n=Ln(aa(e)),{options:s}=_t(Bo),o=be(()=>({[ua(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ua(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const r=t.default&&fb(t.default(n));return e.custom?r:bs("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}}),hb=pb;function mb(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function gb(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!kt(o)||o.length!==s.length||s.some((r,i)=>r.valueOf()!==o[i].valueOf()))return!1}return!0}function ca(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ua=(e,t,n)=>e??t??n,yb=si({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=_t(Ur),o=be(()=>e.route||s.value),r=_t(ta,0),i=be(()=>{let d=u(r);const{matched:c}=o.value;let f;for(;(f=c[d])&&!f.components;)d++;return d}),l=be(()=>o.value.matched[i.value]);Qs(ta,be(()=>i.value+1)),Qs(Kv,l),Qs(Ur,o);const a=te();return Mt(()=>[a.value,l.value,e.name],([d,c,f],[m,b,y])=>{c&&(c.instances[f]=d,b&&b!==c&&d&&d===m&&(c.leaveGuards.size||(c.leaveGuards=b.leaveGuards),c.updateGuards.size||(c.updateGuards=b.updateGuards))),d&&c&&(!b||!Hn(c,b)||!m)&&(c.enterCallbacks[f]||[]).forEach(v=>v(d))},{flush:"post"}),()=>{const d=o.value,c=e.name,f=l.value,m=f&&f.components[c];if(!m)return da(n.default,{Component:m,route:d});const b=f.props[c],y=b?b===!0?d.params:typeof b=="function"?b(d):b:null,h=bs(m,he({},y,t,{onVnodeUnmounted:k=>{k.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return da(n.default,{Component:h,route:d})||h}}});function da(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const vb=yb;function bb(e){const t=lb(e.routes,e),n=e.parseQuery||Vv,s=e.stringifyQuery||ea,o=e.history,r=ns(),i=ns(),l=ns(),a=fd(nn);let d=nn;Tn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=lr.bind(null,N=>""+N),f=lr.bind(null,Rv),m=lr.bind(null,Ss);function b(N,Q){let K,J;return vu(N)?(K=t.getRecordMatcher(N),J=Q):J=N,t.addRoute(J,K)}function y(N){const Q=t.getRecordMatcher(N);Q&&t.removeRoute(Q)}function v(){return t.getRoutes().map(N=>N.record)}function h(N){return!!t.getRecordMatcher(N)}function k(N,Q){if(Q=he({},Q||a.value),typeof N=="string"){const x=ar(n,N,Q.path),O=t.resolve({path:x.path},Q),I=o.createHref(x.fullPath);return he(x,O,{params:m(O.params),hash:Ss(x.hash),redirectedFrom:void 0,href:I})}let K;if(N.path!=null)K=he({},N,{path:ar(n,N.path,Q.path).path});else{const x=he({},N.params);for(const O in x)x[O]==null&&delete x[O];K=he({},N,{params:f(x)}),Q.params=f(Q.params)}const J=t.resolve(K,Q),ce=N.hash||"";J.params=c(m(J.params));const g=Pv(s,he({},N,{hash:Sv(ce),path:J.path})),_=o.createHref(g);return he({fullPath:g,hash:ce,query:s===ea?Wv(N.query):N.query||{}},J,{redirectedFrom:void 0,href:_})}function R(N){return typeof N=="string"?ar(n,N,a.value.path):he({},N)}function S(N,Q){if(d!==N)return jn(Ce.NAVIGATION_CANCELLED,{from:Q,to:N})}function C(N){return U(N)}function L(N){return C(he(R(N),{replace:!0}))}function P(N,Q){const K=N.matched[N.matched.length-1];if(K&&K.redirect){const{redirect:J}=K;let ce=typeof J=="function"?J(N,Q):J;return typeof ce=="string"&&(ce=ce.includes("?")||ce.includes("#")?ce=R(ce):{path:ce},ce.params={}),he({query:N.query,hash:N.hash,params:ce.path!=null?{}:N.params},ce)}}function U(N,Q){const K=d=k(N),J=a.value,ce=N.state,g=N.force,_=N.replace===!0,x=P(K,J);if(x)return U(he(R(x),{state:typeof x=="object"?he({},ce,x.state):ce,force:g,replace:_}),Q||K);const O=K;O.redirectedFrom=Q;let I;return!g&&Ov(s,J,K)&&(I=jn(Ce.NAVIGATION_DUPLICATED,{to:O,from:J}),De(J,J,!0,!1)),(I?Promise.resolve(I):W(O,J)).catch(D=>jt(D)?jt(D,Ce.NAVIGATION_GUARD_REDIRECT)?D:At(D):re(D,O,J)).then(D=>{if(D){if(jt(D,Ce.NAVIGATION_GUARD_REDIRECT))return U(he({replace:_},R(D.to),{state:typeof D.to=="object"?he({},ce,D.to.state):ce,force:g}),Q||O)}else D=q(O,J,!0,_,ce);return B(O,J,D),D})}function ae(N,Q){const K=S(N,Q);return K?Promise.reject(K):Promise.resolve()}function $(N){const Q=gt.values().next().value;return Q&&typeof Q.runWithContext=="function"?Q.runWithContext(N):N()}function W(N,Q){let K;const[J,ce,g]=zv(N,Q);K=ur(J.reverse(),"beforeRouteLeave",N,Q);for(const x of J)x.leaveGuards.forEach(O=>{K.push(rn(O,N,Q))});const _=ae.bind(null,N,Q);return K.push(_),dt(K).then(()=>{K=[];for(const x of r.list())K.push(rn(x,N,Q));return K.push(_),dt(K)}).then(()=>{K=ur(ce,"beforeRouteUpdate",N,Q);for(const x of ce)x.updateGuards.forEach(O=>{K.push(rn(O,N,Q))});return K.push(_),dt(K)}).then(()=>{K=[];for(const x of g)if(x.beforeEnter)if(kt(x.beforeEnter))for(const O of x.beforeEnter)K.push(rn(O,N,Q));else K.push(rn(x.beforeEnter,N,Q));return K.push(_),dt(K)}).then(()=>(N.matched.forEach(x=>x.enterCallbacks={}),K=ur(g,"beforeRouteEnter",N,Q,$),K.push(_),dt(K))).then(()=>{K=[];for(const x of i.list())K.push(rn(x,N,Q));return K.push(_),dt(K)}).catch(x=>jt(x,Ce.NAVIGATION_CANCELLED)?x:Promise.reject(x))}function B(N,Q,K){l.list().forEach(J=>$(()=>J(N,Q,K)))}function q(N,Q,K,J,ce){const g=S(N,Q);if(g)return g;const _=Q===nn,x=Tn?history.state:{};K&&(J||_?o.replace(N.fullPath,he({scroll:_&&x&&x.scroll},ce)):o.push(N.fullPath,ce)),a.value=N,De(N,Q,K,_),At()}let se;function we(){se||(se=o.listen((N,Q,K)=>{if(!Ct.listening)return;const J=k(N),ce=P(J,Ct.currentRoute.value);if(ce){U(he(ce,{replace:!0,force:!0}),J).catch(fs);return}d=J;const g=a.value;Tn&&Uv(Zl(g.fullPath,K.delta),Uo()),W(J,g).catch(_=>jt(_,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_CANCELLED)?_:jt(_,Ce.NAVIGATION_GUARD_REDIRECT)?(U(he(R(_.to),{force:!0}),J).then(x=>{jt(x,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_DUPLICATED)&&!K.delta&&K.type===Fr.pop&&o.go(-1,!1)}).catch(fs),Promise.reject()):(K.delta&&o.go(-K.delta,!1),re(_,J,g))).then(_=>{_=_||q(J,g,!1),_&&(K.delta&&!jt(_,Ce.NAVIGATION_CANCELLED)?o.go(-K.delta,!1):K.type===Fr.pop&&jt(_,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),B(J,g,_)}).catch(fs)}))}let Me=ns(),le=ns(),fe;function re(N,Q,K){At(N);const J=le.list();return J.length?J.forEach(ce=>ce(N,Q,K)):console.error(N),Promise.reject(N)}function ut(){return fe&&a.value!==nn?Promise.resolve():new Promise((N,Q)=>{Me.add([N,Q])})}function At(N){return fe||(fe=!N,we(),Me.list().forEach(([Q,K])=>N?K(N):Q()),Me.reset()),N}function De(N,Q,K,J){const{scrollBehavior:ce}=e;if(!Tn||!ce)return Promise.resolve();const g=!K&&Bv(Zl(N.fullPath,0))||(J||!K)&&history.state&&history.state.scroll||null;return ei().then(()=>ce(N,Q,g)).then(_=>_&&Mv(_)).catch(_=>re(_,N,Q))}const Oe=N=>o.go(N);let Rt;const gt=new Set,Ct={currentRoute:a,listening:!0,addRoute:b,removeRoute:y,clearRoutes:t.clearRoutes,hasRoute:h,getRoutes:v,resolve:k,options:e,push:C,replace:L,go:Oe,back:()=>Oe(-1),forward:()=>Oe(1),beforeEach:r.add,beforeResolve:i.add,afterEach:l.add,onError:le.add,isReady:ut,install(N){N.component("RouterLink",hb),N.component("RouterView",vb),N.config.globalProperties.$router=Ct,Object.defineProperty(N.config.globalProperties,"$route",{enumerable:!0,get:()=>u(a)}),Tn&&!Rt&&a.value===nn&&(Rt=!0,C(o.location).catch(J=>{}));const Q={};for(const J in nn)Object.defineProperty(Q,J,{get:()=>a.value[J],enumerable:!0});N.provide(Bo,Ct),N.provide(_i,La(Q)),N.provide(Ur,a);const K=N.unmount;gt.add(N),N.unmount=function(){gt.delete(N),gt.size<1&&(d=nn,se&&se(),se=null,a.value=nn,Rt=!1,fe=!1),K()}}};function dt(N){return N.reduce((Q,K)=>Q.then(()=>$(K)),Promise.resolve())}return Ct}function _b(){return _t(Bo)}function ku(e){return _t(_i)}const xi="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='256'%20height='256'%20viewBox='0%200%2067.733332%2067.733333'%20version='1.1'%20id='svg1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3cdefs%20id='defs1'%20/%3e%3cg%20id='layer1'%3e%3cg%20style='fill:%23040000;fill-opacity:1'%20id='g1'%20transform='matrix(0.06566918,0,0,0.06566918,17.061212,17.059932)'%3e%3cg%20id='g2'%3e%3ccircle%20style='fill:%231ad35d;fill-opacity:1;stroke-width:0.472667'%20id='path2'%20cx='33.866665'%20cy='33.866665'%20r='21.644735'%20transform='matrix(23.824636,0,0,23.824636,-550.95013,-550.93064)'%20/%3e%3cpath%20d='M%20480.6,111.5%20H%20406.5%20V%2035.6%20c%200,-10.7%20-8.3,-19.6%20-19,-20.4%20-104,-7.5%20-200.4,-3.7%20-263,0.8%20-10.7,0.8%20-19,9.8%20-19,20.5%20v%2074.9%20H%2031.4%20c%20-10.9,0%20-20.9,8.8%20-20.6,22%2040.6,166%20230.9,361.7%20230.9,361.7%209.8,10.8%2025.6,4%2028.6,0%200,0%20177.1,-165.8%20230.3,-359.4%201.6,-5.8%20-0.5,-24.3%20-20,-24.2%20z'%20id='path1'%20style='fill:%23040000;fill-opacity:1'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",fa=te(""),dr=te(),ss=te(!1),Ws=te(!1),Ks=te("");function Ho(){function e(o){return t(o)||n(o)}function t(o){return!(o===""||o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")||o.includes("://open.spotify.com/show/")||o.includes("://open.spotify.com/artist/"))}function n(o){return o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")}function s(o){console.log("Searching for:",o),dr.value=[],ss.value=!0,fa.value=o,Ws.value=!1,Ks.value="",ve.search(o).then(r=>{console.log("Received Search Data:",r.data),r.status===200?(dr.value=r.data,ss.value=!1):(console.error("Error Searching:",r),ss.value=!1,Ws.value=!0,Ks.value=r.toString())}).catch(r=>{console.error("Other Error Searching:",r.message),ss.value=!1,Ws.value=!0,Ks.value=r.message})}return{searchTerm:fa,isSearching:ss,results:dr,error:Ws,errorValue:Ks,searchFor:s,isValid:e,isValidSearch:t,isValidURL:n}}const yt={QUEUED:"In Queue",DOWNLOADING:"Downloading...",DOWNLOADED:"Done",ERROR:"Error"},Ke=te([]);class Su{constructor(t){this.song=t,this.web_status=yt.QUEUED,this.progress=0,this.message="",this.web_download_url=null,this.filename=null}setDownloading(){this.web_status=yt.DOWNLOADING}setDownloaded(){this.web_status=yt.DOWNLOADED}setError(){this.web_status=yt.ERROR}resetForRetry(){this.web_status=yt.QUEUED,this.progress=0,this.message="",this.web_download_url=null,this.filename=null}setWebURL(t){this.web_download_url=t}setFilename(t){this.filename=t}isQueued(){return this.web_status===yt.QUEUED}isDownloading(){return this.web_status===yt.DOWNLOADING}isDownloaded(){return this.web_status===yt.DOWNLOADED}isErrored(){return this.web_status===yt.ERROR}wsUpdate(t){this.progress=t.progress,this.message=t.message}}function Is(){function e(o){return Ke.value.findIndex(r=>r.song.song_id===o.song_id)}function t(o){let r=new Su(o);Ke.value.push(r)}function n(o){console.log("removing",o,o.song_id),Ke.value=Ke.value.filter(r=>r.song.song_id!==o.song_id),console.log(Ke.value)}function s(o){return e(o)===-1?null:Ke.value[e(o)]}return{appendSong:t,removeSong:n,getBySong:s,downloadQueue:Ke}}const Fe=Is();ve.ws_onmessage(e=>{let t=JSON.parse(e.data),n=Fe.getBySong(t.song);!n&&(Fe.appendSong(t.song),n=Fe.getBySong(t.song),!n)||(t.status==="done"?(n.progress=100,t.filename&&(n.setWebURL(ve.downloadFileURL(t.filename)),n.setFilename(t.filename)),n.setDownloaded()):t.status==="error"?(n.wsUpdate(t),n.setError()):t.status==="queued"?(n.web_status=yt.QUEUED,n.message=t.message||""):(n.wsUpdate(t),n.isDownloading()||n.setDownloading()))});ve.ws_onerror(e=>{console.log("websocket error:",e)});async function xb(){try{const t=(await ve.getQueue()).data||[];for(const n of t){if(Ke.value.some(o=>o.song.song_id===n.song.song_id))continue;const s=new Su(n.song);n.status==="done"?(s.setDownloaded(),n.filename&&(s.setWebURL(ve.downloadFileURL(n.filename)),s.setFilename(n.filename)),s.progress=100):n.status==="error"?(s.setError(),s.message=n.message||""):n.status==="downloading"?(s.setDownloading(),s.progress=n.progress||0,s.message=n.message||""):(s.web_status=yt.QUEUED,s.message=n.message||""),Ke.value.push(s)}}catch(e){console.log("Failed to load queue from server:",e)}}xb();function wi(){const e=te(!1),t=uu();async function n(){Ke.value=Ke.value.filter(m=>!m.isDownloaded());try{await ve.clearCompletedQueue()}catch(m){console.log("Failed to clear completed queue on server:",m)}}function s(m){const b=(m||"").includes("://open.spotify.com/playlist/"),y=t.settings.value.generate_m3u!==!1;return e.value=!0,(b?n():Promise.resolve()).then(()=>ve.open(m)).then(h=>{if(console.log("Received Response:",h),h.status!==200){console.log("Error:",h);return}const k=h.data;if(Array.isArray(k)){for(const R of k)Fe.getBySong(R)||Fe.appendSong(R);return ve.downloadBatch({songs:k,playlist_url:b?m:"",generate_m3u:y}).catch(R=>{console.log("Batch submit failed:",R.message)})}else console.log("Opened Song:",k),r(k)}).catch(h=>{console.log("Other Error:",h.message)}).finally(()=>{e.value=!1})}function o(m){return console.log("Downloading",m),Fe.getBySong(m).setDownloading(),ve.download(m).then(b=>{if(console.log("Received Response:",b),b.status===200){let y=b.data;return console.log("Download Complete:",y),Fe.getBySong(m).setWebURL(ve.downloadFileURL(y)),Fe.getBySong(m).setFilename(y),Fe.getBySong(m).setDownloaded(),{song:m,filename:y}}else return console.log("Error:",b),Fe.getBySong(m).setError(),{song:m,filename:null}}).catch(b=>(console.log("Other Error:",b.message),Fe.getBySong(m).setError(),{song:m,filename:null}))}function r(m,b=!0){return Fe.appendSong(m),b?o(m):Promise.resolve({song:m,filename:null})}function i(m,b){const y={...m,youtube_id:b},v=Fe.getBySong(m);return v&&(v.song.youtube_id=b,v.setDownloading(),v.progress=0,v.message=""),ve.download(y).then(h=>{const k=Fe.getBySong(y);if(h.status===200){const R=h.data;return k&&(k.setWebURL(ve.downloadFileURL(R)),k.setFilename(R),k.setDownloaded()),{song:y,filename:R}}return k&&k.setError(),{song:y,filename:null}}).catch(h=>{console.error("retryWithAudio error:",h.message);const k=Fe.getBySong(y);return k&&k.setError(),{song:y,filename:null}})}function l(m){const b=String(m.song_id||m.url||"");Fe.removeSong(m),b&&ve.removeQueueItem(b).catch(()=>{})}async function a(){await ve.clearQueue(),Ke.value=[]}async function d(){await ve.clearCompletedQueue(),Ke.value=Ke.value.filter(m=>!m.isDownloaded())}function c(m){const b=Fe.getBySong(m);return b&&b.resetForRetry(),o(m)}function f(){const m=Ke.value.filter(b=>b.isErrored());for(const b of m)c(b.song);return m.length}return{fromURL:s,download:o,queue:r,retry:c,retryWithAudio:i,retryAllFailed:f,remove:l,clearAll:a,clearCompleted:d,loading:e}}const wb={class:"relative w-full"},kb=["placeholder"],Sb=["disabled"],Br={__name:"SearchInput",props:{compact:{type:Boolean,default:!1}},setup(e){const t=Ho(),n=wi(),{t:s,locale:o}=St(),r=["https://open.spotify.com/track/4vfN00PlILRXy5dcXHQE9M","drugs - EDEN","Não Gosto Eu Amo - Henrique e Juliano","Perfect - Ed Sheeran","Lightning Crashes - Live"],i=te(0),l=be(()=>(o.value,i.value===0?s("search.placeholder"):r[i.value-1])),a=setInterval(()=>{i.value=(i.value+1)%(r.length+1)},5e3);oi(()=>clearInterval(a));function d(c){!c||!c.trim()||(t.isValidURL(c)?(n.fromURL(c),it.push({name:"Download"})):t.isValidSearch(c)&&it.push({name:"Search",params:{query:c}}))}return(c,f)=>(A(),T("div",wb,[Ee(p("input",{type:"text",placeholder:l.value,class:Ae(["input-modern",e.compact?"h-11 text-sm":"h-14 text-base"]),"onUpdate:modelValue":f[0]||(f[0]=m=>u(t).searchTerm.value=m),onKeyup:f[1]||(f[1]=np(m=>d(u(t).searchTerm.value),["enter"]))},null,42,kb),[[rt,u(t).searchTerm.value]]),p("button",{class:Ae(["absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm transition hover:scale-105 active:scale-95 disabled:opacity-60",e.compact?"h-9 w-9":"h-11 w-11"]),disabled:u(n).loading.value,onClick:f[2]||(f[2]=m=>d(u(t).searchTerm.value))},[u(n).loading.value?(A(),T("span",{key:0,class:Ae(["loading loading-spinner",e.compact?"loading-xs":"loading-sm"])},null,2)):u(t).isValidURL(u(t).searchTerm.value)?(A(),ct(u(G),{key:1,icon:"clarity:download-line",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},null,8,["class"])):(A(),T("svg",{key:2,xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"2",stroke:"currentColor",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},[...f[3]||(f[3]=[p("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"},null,-1)])],2))],10,Sb)]))}},Eb={class:"relative flex min-h-[calc(100dvh-4rem)] items-center justify-center px-6 pt-24 pb-16 overflow-hidden"},Ab={class:"relative w-full max-w-2xl text-center animate-slide-up"},Rb={class:"mt-3 flex items-center justify-center gap-2"},Cb={class:"badge-soft"},Tb={class:"badge-neutral-soft"},Pb={class:"mx-auto mt-5 max-w-md text-balance text-base sm:text-lg text-base-content/70"},Ob={class:"mt-10"},Db={class:"mt-4 flex flex-wrap items-center justify-center gap-2 text-xs text-base-content/60"},Nb={class:"pill bg-white/5 border border-white/10"},Ib={class:"pill bg-white/5 border border-white/10"},$b={class:"pill bg-white/5 border border-white/10"},Lb={__name:"Hero",setup(e){const{t}=St(),n=te(localStorage.getItem("version")||"2.7.0");return Zt(()=>{const s=localStorage.getItem("version");s&&(n.value=s)}),(s,o)=>(A(),T("section",Eb,[o[4]||(o[4]=p("div",{"aria-hidden":"true",class:"pointer-events-none absolute inset-0 -z-10"},[p("div",{class:"absolute left-1/2 top-1/4 -translate-x-1/2 h-[420px] w-[420px] rounded-full bg-primary/25 blur-[120px]"}),p("div",{class:"absolute right-10 bottom-12 h-64 w-64 rounded-full bg-primary/10 blur-3xl"})],-1)),p("div",Ab,[o[3]||(o[3]=mf('

    Downtify

    ',2)),p("div",Rb,[p("span",Cb,"v"+w(n.value),1),p("span",Tb,w(u(t)("hero.noAccount")),1)]),p("p",Pb,w(u(t)("hero.tagline")),1),p("div",Ob,[M(Br,{class:"w-full"}),p("div",Db,[p("span",Nb,[o[0]||(o[0]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.songs")),1)]),p("span",Ib,[o[1]||(o[1]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.albums")),1)]),p("span",$b,[o[2]||(o[2]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.playlists")),1)])])])])]))}},Fb={class:"absolute top-0 inset-x-0 z-30"},Mb={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Ub={class:"ml-auto flex items-center gap-1 sm:gap-2"},Bb=["title"],Hb=["title"],jb=["title"],qb=["title"],Vb={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},Wb=["title"],Kb=["title"],zb={__name:"NavbarFront",setup(e){const t=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),n=Is(),{t:s}=St();return(o,r)=>(A(),T("header",Fb,[p("div",Mb,[r[5]||(r[5]=p("div",{class:"flex items-center gap-2"},[p("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"}),p("span",{class:"text-lg font-bold tracking-tight"},"Downtify")],-1)),p("div",Ub,[p("button",{class:"icon-btn",onClick:r[0]||(r[0]=i=>u(it).push({name:"List"})),title:u(s)("nav.library")},[M(u(G),{icon:"clarity:library-line",class:"h-5 w-5"})],8,Bb),p("button",{class:"icon-btn",onClick:r[1]||(r[1]=i=>u(it).push({name:"Player"})),title:u(s)("nav.player")},[M(u(G),{icon:"clarity:headphones-line",class:"h-5 w-5"})],8,Hb),p("button",{class:"icon-btn",onClick:r[2]||(r[2]=i=>u(it).push({name:"Monitor"})),title:u(s)("nav.monitor")},[M(u(G),{icon:"clarity:eye-line",class:"h-5 w-5"})],8,jb),p("button",{class:"icon-btn relative",onClick:r[3]||(r[3]=i=>u(it).push({name:"Download"})),title:u(s)("nav.queue")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"}),u(n).downloadQueue.value.length>0?(A(),T("span",Vb,w(u(n).downloadQueue.value.length),1)):ie("",!0)],8,qb),p("button",{class:"icon-btn",onClick:r[4]||(r[4]=i=>u(t).setTheme(u(t).currentTheme.value==="dark"?"light":"dark")),title:u(t).currentTheme.value==="dark"?u(s)("nav.switchToLight"):u(s)("nav.switchToDark")},[u(t).currentTheme.value==="dark"?(A(),ct(u(G),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(G),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,Wb),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(s)("nav.settings")},[M(u(G),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,Kb)])])]))}},Eu=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Qb={components:{NavbarFront:zb,Hero:Lb},setup(){return Zt(()=>{window.scroll(0,0)}),{}}};function Gb(e,t,n,s,o,r){const i=xr("NavbarFront"),l=xr("Hero");return A(),T("div",null,[M(i),M(l)])}const Jb=Eu(Qb,[["render",Gb]]),Yb={class:"sticky top-0 z-30 glass-nav"},Xb={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Zb=["title"],e_={class:"hidden md:flex flex-1 justify-center"},t_={class:"ml-auto flex items-center gap-1 sm:gap-2"},n_=["title"],s_=["title"],o_=["title"],r_=["title"],i_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},l_=["title"],a_=["title"],c_={class:"md:hidden px-4 pb-3"},$s={__name:"Navbar",setup(e){const t=ku(),n=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),s=Is(),o=Ho(),{t:r}=St();return(i,l)=>(A(),T("header",Yb,[p("div",Xb,[p("button",{class:"flex items-center gap-2 shrink-0",onClick:l[0]||(l[0]=a=>u(it).push({name:"Home"})),title:u(r)("nav.home")},[...l[6]||(l[6]=[p("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"},null,-1),p("span",{class:"hidden sm:inline text-lg font-bold tracking-tight"}," Downtify ",-1)])],8,Zb),p("div",e_,[M(Br,{class:"w-full max-w-md",compact:!0})]),p("div",t_,[p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="List"}]),onClick:l[1]||(l[1]=a=>u(it).push({name:"List"})),title:u(r)("nav.library")},[M(u(G),{icon:"clarity:library-line",class:"h-5 w-5"})],10,n_),p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Player"}]),onClick:l[2]||(l[2]=a=>u(it).push({name:"Player"})),title:u(r)("nav.player")},[M(u(G),{icon:"clarity:headphones-line",class:"h-5 w-5"})],10,s_),p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Monitor"}]),onClick:l[3]||(l[3]=a=>u(it).push({name:"Monitor"})),title:u(r)("nav.monitor")},[M(u(G),{icon:"clarity:eye-line",class:"h-5 w-5"})],10,o_),p("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(t).name==="Download"}]),onClick:l[4]||(l[4]=a=>u(t).name==="Download"?u(it).push({name:"Search",params:{query:u(o).searchTerm.value||" "}}):u(it).push({name:"Download"})),title:u(r)("nav.queue")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"}),u(s).downloadQueue.value.length>0?(A(),T("span",i_,w(u(s).downloadQueue.value.length),1)):ie("",!0)],10,r_),p("button",{class:"icon-btn",onClick:l[5]||(l[5]=a=>u(n).setTheme(u(n).currentTheme.value==="dark"?"light":"dark")),title:u(n).currentTheme.value==="dark"?u(r)("nav.switchToLight"):u(r)("nav.switchToDark")},[u(n).currentTheme.value==="dark"?(A(),ct(u(G),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(G),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,l_),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(r)("nav.settings")},[M(u(G),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,a_)])]),p("div",c_,[M(Br,{compact:!0})])]))}},u_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},d_={class:"mb-8"},f_={class:"text-2xl font-bold tracking-tight"},p_={class:"mt-1 text-sm text-base-content/60"},h_={class:"text-base-content/90 font-medium"},m_={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},g_={key:1,class:"space-y-3"},y_={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},v_={class:"text-base-content/50 text-sm"},b_={class:"text-base-content/40 text-xs mt-1"},__={key:3,class:"space-y-2"},x_={class:"track-cover"},w_=["src","alt"],k_={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},S_={class:"flex-1 min-w-0"},E_={class:"flex items-center gap-2 mb-0.5"},A_={class:"font-semibold truncate"},R_={key:0,class:"badge-error-soft shrink-0"},C_={class:"text-xs text-base-content/70 truncate"},T_={key:0,class:"text-xs text-base-content/40 truncate"},P_={key:0,class:"text-base-content/30"},O_={class:"flex items-center gap-1 shrink-0"},D_=["href","title"],N_=["title"],I_=["onClick","title"],$_={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},L_=["disabled","title"],F_=["onClick"],M_=["disabled","title"],fr=5,U_={__name:"SearchList",props:["data","error"],emits:["download"],setup(e,{emit:t}){const n=e,s=t,o=Ho(),r=Is(),{t:i}=St(),l=te(1),a=be(()=>{var b;return Math.ceil((((b=n.data)==null?void 0:b.length)||0)/fr)}),d=be(()=>{if(!n.data)return[];const b=(l.value-1)*fr;return n.data.slice(b,b+fr)});Mt(()=>n.data,()=>{l.value=1});function c(b){return Array.isArray(b.artists)&&b.artists.length?b.artists.join(", "):b.artist||i("common.unknownArtist")}function f(b){const y=r.getBySong(b);return y?y.isErrored()?"error":(y.isDownloaded(),"queued"):"idle"}function m(b){s("download",b)}return(b,y)=>{var v;return A(),T("div",u_,[p("div",d_,[p("h1",f_,w(u(i)("search.title")),1),p("p",p_,[u(o).searchTerm.value?(A(),T(de,{key:0},[Re(w(u(i)("search.matchesFor"))+" ",1),p("span",h_,' "'+w(u(o).searchTerm.value)+'" ',1),!u(o).isSearching.value&&(((v=n.data)==null?void 0:v.length)||0)>0?(A(),T(de,{key:0},[Re(w(n.data.length===1?u(i)("search.songsCount",{count:n.data.length}):u(i)("search.songsCountPlural",{count:n.data.length})),1)],64)):ie("",!0)],64)):(A(),T(de,{key:1},[Re(w(u(i)("search.typeToBegin")),1)],64))])]),n.error?(A(),T("div",m_,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),p("span",null,w(u(o).errorValue.value?u(i)("search.errorWithDetail",{detail:u(o).errorValue.value}):u(i)("search.error")),1)])):ie("",!0),u(o).isSearching.value?(A(),T("div",g_,[(A(),T(de,null,Ie(5,h=>p("div",{key:h,class:"skeleton h-24 rounded-2xl"})),64))])):!n.data||n.data.length===0?(A(),T("div",y_,[M(u(G),{icon:"clarity:search-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",v_,w(u(i)("search.empty")),1),p("p",b_,w(u(i)("search.emptyHint")),1)])):(A(),T("ul",__,[(A(!0),T(de,null,Ie(d.value,(h,k)=>(A(),T("li",{key:h.song_id||k,class:"surface rounded-2xl track-card"},[p("div",x_,[h.cover_url?(A(),T("img",{key:0,src:h.cover_url,alt:h.name,class:"h-full w-full object-cover",loading:"lazy"},null,8,w_)):(A(),T("div",k_,[M(u(G),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),p("div",S_,[p("div",E_,[p("span",A_,w(h.name),1),h.explicit?(A(),T("span",R_,"E")):ie("",!0)]),p("p",C_,w(c(h)),1),h.album_name?(A(),T("p",T_,[Re(w(h.album_name)+" ",1),h.year?(A(),T("span",P_," · "+w(h.year),1)):ie("",!0)])):ie("",!0)]),p("div",O_,[h.url?(A(),T("a",{key:0,class:"icon-btn",href:h.url,target:"_blank",rel:"noopener",title:u(i)("search.openOnSpotify")},[M(u(G),{icon:"clarity:pop-out-line",class:"h-4 w-4"})],8,D_)):ie("",!0),f(h)==="queued"?(A(),T("button",{key:1,class:"icon-btn text-primary cursor-default",title:u(i)("search.inQueue"),disabled:""},[M(u(G),{icon:"clarity:check-circle-line",class:"h-5 w-5"})],8,N_)):(A(),T("button",{key:2,class:"icon-btn text-primary hover:bg-primary/10",onClick:R=>m(h),title:u(i)("search.download")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"})],8,I_))])]))),128))])),a.value>1?(A(),T("nav",$_,[p("button",{class:"icon-btn",disabled:l.value===1,onClick:y[0]||(y[0]=h=>l.value--),title:u(i)("search.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,L_),(A(!0),T(de,null,Ie(a.value,h=>(A(),T("button",{key:h,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",h===l.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:k=>l.value=h},w(h),11,F_))),128)),p("button",{class:"icon-btn",disabled:l.value===a.value,onClick:y[1]||(y[1]=h=>l.value++),title:u(i)("search.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,M_)])):ie("",!0)])}}},B_={class:"min-h-screen"},H_={__name:"Search",setup(e){Zt(()=>window.scroll(0,0));const t=ku(),n=Ho(),s=wi();return Mt(()=>t.params.query,()=>{t.params.query&&n.searchFor(t.params.query)},{deep:!0}),n.searchFor(t.params.query),(o,r)=>(A(),T("div",B_,[M($s),M(zn),M(U_,{data:u(n).results.value,error:u(n).error.value,onDownload:r[0]||(r[0]=i=>u(s).queue(i))},null,8,["data","error"])]))}},j_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},q_={class:"mb-6 flex flex-wrap items-end justify-between gap-4"},V_={class:"text-2xl font-bold tracking-tight"},W_={class:"mt-1 text-sm text-base-content/60"},K_={key:0,class:"flex flex-wrap gap-2 justify-end"},z_=["title"],Q_={key:0,class:"mb-6 flex flex-wrap gap-2",role:"tablist"},G_=["onClick"],J_={key:0,class:"ml-1 opacity-80 tabular-nums"},Y_={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},X_={class:"text-base-content/50 text-sm"},Z_={class:"text-base-content/40 text-xs mt-1"},e0={key:2,class:"surface rounded-2xl p-8 text-center text-sm text-base-content/50"},t0={key:3,class:"space-y-3"},n0={class:"flex items-center gap-4"},s0={class:"track-cover h-16 w-16 sm:h-20 sm:w-20 shrink-0"},o0=["src","alt"],r0={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},i0={class:"flex-1 min-w-0"},l0={class:"flex items-center gap-2 mb-0.5 flex-wrap"},a0={class:"font-semibold truncate"},c0={class:"text-xs text-base-content/60 truncate"},u0={key:0,class:"text-xs text-base-content/40 truncate"},d0={key:1,class:"text-xs text-error/80 mt-1 line-clamp-2"},f0={class:"flex items-center gap-2 shrink-0"},p0=["title","onClick"],h0=["onClick","title"],m0={class:"text-[10px] font-semibold"},g0={key:3,class:"loading loading-spinner loading-sm text-primary"},y0=["onClick","title"],v0={key:0,class:"mt-3 pt-3 border-t border-white/10 flex flex-wrap gap-2 items-center"},b0=["onUpdate:modelValue","placeholder"],_0=["onClick"],x0=["onClick"],w0=["onClick"],k0={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},S0=["disabled","title"],E0=["onClick"],A0=["disabled","title"],pr=10,R0={__name:"DownloadList",setup(e){const t=Is(),n=wi(),{t:s}=St(),o=te("active"),r=te(1),i=Ln({}),l=Ln({});function a($){return $.isErrored()?"failed":$.isDownloaded()?"done":$.isDownloading()?"downloading":($.isQueued(),"queued")}const d=be(()=>t.downloadQueue.value.filter($=>a($)==="done").length),c=be(()=>t.downloadQueue.value.filter($=>a($)==="failed").length),f=be(()=>t.downloadQueue.value.filter($=>{const W=a($);return W==="queued"||W==="downloading"}).length),m=be(()=>[{id:"active",label:s("queue.filterActive"),count:f.value},{id:"queued",label:s("queue.filterQueued"),count:t.downloadQueue.value.filter($=>a($)==="queued").length},{id:"all",label:s("queue.filterAll"),count:t.downloadQueue.value.length},{id:"done",label:s("queue.filterDone"),count:d.value},{id:"failed",label:s("queue.filterFailed"),count:c.value}]),b=be(()=>{const $=t.downloadQueue.value;switch(o.value){case"all":return $;case"active":return $.filter(W=>{const B=a(W);return B==="queued"||B==="downloading"});case"downloading":return $.filter(W=>a(W)==="downloading");case"queued":return $.filter(W=>a(W)==="queued");case"done":return $.filter(W=>a(W)==="done");case"failed":return $.filter(W=>a(W)==="failed");default:return $}}),y=be(()=>Math.ceil(b.value.length/pr)),v=be(()=>{const $=(r.value-1)*pr;return b.value.slice($,$+pr)});Mt(o,()=>{r.value=1}),Mt(()=>b.value.length,()=>{r.value>y.value&&y.value>0&&(r.value=y.value),r.value<1&&(r.value=1)}),Mt(()=>t.downloadQueue.value.length,$=>{$===0?o.value="active":o.value==="active"&&f.value===0&&c.value>0&&(o.value="failed")});async function h(){confirm(s("queue.clearAllPrompt"))&&await n.clearAll()}async function k(){await n.clearCompleted()}function R(){n.retryAllFailed()}function S($){return Array.isArray($.artists)&&$.artists.length?$.artists.join(", "):$.artist||s("common.unknownArtist")}function C($){return $.isErrored()?"badge-error-soft":$.isDownloaded()||$.isDownloading()?"badge-soft":"badge-neutral-soft"}function L($){return $.message?$.message:$.isErrored()?s("queue.statusFailed"):$.isDownloaded()?s("queue.statusDone"):$.isDownloading()?s("queue.statusDownloading"):s("queue.statusQueued")}function P($){const W=String($||"").match(/(?:v=|youtu\.be\/)([A-Za-z0-9_-]{6,})/);return W?W[1]:null}function U($){const W=$.song.song_id,B=P(l[W]);if(!B){alert(s("queue.invalidYouTubeURL"));return}i[W]=!1,n.retryWithAudio($.song,B)}function ae($){const W=document.createElement("a");W.href=$,W.download=ve.downloadSaveName($),document.body.appendChild(W),W.click(),document.body.removeChild(W)}return($,W)=>(A(),T("div",j_,[p("div",q_,[p("div",null,[p("h1",V_,w(u(s)("queue.title")),1),p("p",W_,w(u(s)("queue.subtitle")),1)]),u(t).downloadQueue.value.length>0?(A(),T("div",K_,[c.value>0?(A(),T("button",{key:0,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:R},[M(u(G),{icon:"clarity:refresh-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(s)("queue.retryAllFailed",{count:c.value})),1)])):ie("",!0),d.value>0?(A(),T("button",{key:1,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:k},w(u(s)("queue.clearCompleted",{count:d.value})),1)):ie("",!0),p("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 text-error/70 hover:text-error",onClick:h,title:u(s)("queue.clearAll")},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(s)("queue.clearAll")),1)],8,z_)])):ie("",!0)]),u(t).downloadQueue.value.length>0?(A(),T("div",Q_,[(A(!0),T(de,null,Ie(m.value,B=>(A(),T("button",{key:B.id,type:"button",class:Ae(["btn btn-sm rounded-full border-white/10",o.value===B.id?"btn-primary":"bg-base-100/85 hover:bg-base-100"]),onClick:q=>o.value=B.id},[Re(w(B.label)+" ",1),B.count>0?(A(),T("span",J_,"("+w(B.count)+")",1)):ie("",!0)],10,G_))),128))])):ie("",!0),u(t).downloadQueue.value.length===0?(A(),T("div",Y_,[M(u(G),{icon:"clarity:download-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",X_,w(u(s)("queue.empty")),1),p("p",Z_,w(u(s)("queue.emptyHint")),1)])):b.value.length===0?(A(),T("div",e0,w(u(s)("queue.emptyFilter")),1)):(A(),T("ul",t0,[(A(!0),T(de,null,Ie(v.value,(B,q)=>(A(),T("li",{key:B.song.song_id||B.song.url||q,class:"surface rounded-2xl p-3 sm:p-4"},[p("div",n0,[p("div",s0,[B.song.cover_url?(A(),T("img",{key:0,src:B.song.cover_url,alt:B.song.name,class:"h-full w-full object-cover"},null,8,o0)):(A(),T("div",r0,[M(u(G),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),p("div",i0,[p("div",l0,[p("span",a0,w(B.song.name),1),p("span",{class:Ae([C(B),"shrink-0"])},w(L(B)),3)]),p("p",c0,w(S(B.song)),1),B.song.album_name?(A(),T("p",u0,w(B.song.album_name),1)):ie("",!0),B.isErrored()&&B.message?(A(),T("p",d0,w(B.message),1)):ie("",!0)]),p("div",f0,[B.isErrored()?(A(),T("button",{key:0,class:"icon-btn text-primary hover:bg-primary/10",title:u(s)("queue.retry"),onClick:se=>u(n).retry(B.song)},[M(u(G),{icon:"clarity:refresh-line",class:"h-4 w-4"})],8,p0)):ie("",!0),B.isDownloaded()?(A(),T("a",{key:1,class:"icon-btn text-primary hover:bg-primary/10",href:"javascript:;",onClick:se=>ae(B.web_download_url),title:u(s)("queue.saveToDevice")},[M(u(G),{icon:"clarity:download-line",class:"h-4 w-4"})],8,h0)):B.isDownloading()&&!B.isErrored()?(A(),T("div",{key:2,class:"radial-progress text-primary",style:$n(`--value:${Math.max(0,B.progress)}; --size:2.75rem; --thickness:3px`)},[p("span",m0,w(Math.round(B.progress))+"% ",1)],4)):B.isErrored()?ie("",!0):(A(),T("span",g0)),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",onClick:se=>u(n).remove(B.song),title:u(s)("queue.removeFromQueue")},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,y0)])]),B.isErrored()&&i[B.song.song_id]?(A(),T("div",v0,[Ee(p("input",{"onUpdate:modelValue":se=>l[B.song.song_id]=se,type:"text",class:"input input-sm flex-1 min-w-[12rem] rounded-xl bg-base-100/80",placeholder:u(s)("queue.overridePlaceholder")},null,8,b0),[[rt,l[B.song.song_id]]]),p("button",{class:"btn btn-sm btn-primary rounded-full",onClick:se=>U(B)},w(u(s)("queue.applyOverride")),9,_0),p("button",{class:"btn btn-sm btn-ghost rounded-full",onClick:se=>i[B.song.song_id]=!1},w(u(s)("common.cancel")),9,x0)])):B.isErrored()?(A(),T("button",{key:1,type:"button",class:"mt-2 text-xs text-primary/80 hover:text-primary",onClick:se=>i[B.song.song_id]=!0},w(u(s)("queue.forceAudio")),9,w0)):ie("",!0)]))),128))])),y.value>1?(A(),T("nav",k0,[p("button",{class:"icon-btn",disabled:r.value===1,onClick:W[0]||(W[0]=B=>r.value--),title:u(s)("common.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,S0),(A(!0),T(de,null,Ie(y.value,B=>(A(),T("button",{key:B,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",B===r.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:q=>r.value=B},w(B),11,E0))),128)),p("button",{class:"icon-btn",disabled:r.value===y.value,onClick:W[1]||(W[1]=B=>r.value++),title:u(s)("common.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,A0)])):ie("",!0)]))}},C0={class:"min-h-screen"},T0={__name:"Download",setup(e){return Zt(()=>window.scroll(0,0)),(t,n)=>(A(),T("div",C0,[M($s),M(zn),M(R0)]))}},Au="downtify-player-volume",qe=te([]),st=te(-1),vo=te(!1),Ls=te(0),un=te(0),ki=te(parseFloat(localStorage.getItem(Au)||"0.85")),In=te(!1),Qn=te("off"),dn=te(!1);let _e=null,vt=[],jo=0;function qo(){return _e||(_e=new Audio,_e.preload="metadata",_e.volume=ki.value,_e.addEventListener("timeupdate",()=>{Ls.value=_e.currentTime}),_e.addEventListener("loadedmetadata",()=>{un.value=isFinite(_e.duration)?_e.duration:0}),_e.addEventListener("durationchange",()=>{un.value=isFinite(_e.duration)?_e.duration:0}),_e.addEventListener("ended",M0),_e.addEventListener("play",()=>{vo.value=!0}),_e.addEventListener("pause",()=>{vo.value=!1}),_e)}function Hr(e){const t=e.replace(/\.[^.]+$/,"");let n="",s=t;const o=t.indexOf(" - ");return o>0&&(n=t.slice(0,o).trim(),s=t.slice(o+3).trim()),{file:e,url:ve.downloadFileURL(e),cover:ve.coverFileURL(e),title:s,artist:n,album:""}}function Si(e){if(typeof e=="string")return Hr(e);const t=String((e==null?void 0:e.file)||""),n=Hr(t),s=String((e==null?void 0:e.title)||"").trim(),o=String((e==null?void 0:e.artist)||"").trim(),r=String((e==null?void 0:e.album)||"").trim();return{file:t,url:n.url,cover:n.cover,title:s||n.title,artist:o||n.artist,album:r||n.album}}function Fs(){const e=qe.value.map((t,n)=>n);for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}vt=e,jo=st.value>=0?Math.max(0,vt.indexOf(st.value)):0}function P0(e,t={}){const n=(e||[]).map(s=>typeof s=="string"?Hr(s):Si(s));qe.value=n,st.value>=n.length&&(st.value=-1),dn.value&&Fs(),typeof t.startIndex=="number"?qn(t.startIndex):t.autoplay&&n.length>0&&st.value<0&&qn(0)}function qn(e){if(e<0||e>=qe.value.length)return;const t=qo();if(st.value=e,dn.value){vt.length!==qe.value.length&&Fs();const n=vt.indexOf(e);n>=0&&(jo=n)}t.src=qe.value[e].url,t.currentTime=0,Ls.value=0,t.play().catch(()=>{})}function Ru(){if(qe.value.length===0)return;const e=qo();if(st.value<0){qn(0);return}e.src||(e.src=qe.value[st.value].url),e.play().catch(()=>{})}function Ei(){_e&&_e.pause()}function O0(){vo.value?Ei():Ru()}function Vo(e){const t=qo(),n=un.value||0,s=Math.max(0,Math.min(n,e));t.currentTime=s,Ls.value=s}function D0(e){un.value&&Vo(un.value*Math.max(0,Math.min(1,e)))}function N0(e){const t=Math.max(0,Math.min(1,e));ki.value=t,_e&&(_e.volume=t);try{localStorage.setItem(Au,String(t))}catch{}t>0&&In.value&&(In.value=!1,_e&&(_e.muted=!1))}function I0(){In.value=!In.value,_e&&(_e.muted=In.value)}function $0(){if(qe.value.length===0)return-1;if(dn.value){vt.length!==qe.value.length&&Fs();const t=(jo+1)%vt.length;return vt[t]}const e=st.value+1;return e>=qe.value.length?Qn.value==="all"?0:-1:e}function L0(){if(qe.value.length===0)return-1;if(dn.value){vt.length!==qe.value.length&&Fs();const t=(jo-1+vt.length)%vt.length;return vt[t]}const e=st.value-1;return e<0?Qn.value==="all"?qe.value.length-1:0:e}function Cu(){const e=$0();if(e<0){Ei();return}qn(e)}function F0(){if(qo().currentTime>3){Vo(0);return}const t=L0();t<0||qn(t)}function M0(){if(Qn.value==="one"){Vo(0),_e&&_e.play().catch(()=>{});return}Cu()}function Tu(e){["off","all","one"].includes(e)&&(Qn.value=e)}function U0(){const e=["off","all","one"],t=e.indexOf(Qn.value);Tu(e[(t+1)%e.length])}function Pu(e){dn.value=!!e,dn.value&&Fs()}function B0(){Pu(!dn.value)}const H0=be(()=>st.value>=0&&st.valueun.value>0?Ls.value/un.value*100:0);function pa(e){if(!isFinite(e)||e<0)return"0:00";const t=Math.floor(e),n=Math.floor(t/60),s=t%60;return`${n}:${s.toString().padStart(2,"0")}`}function Ou(){return{playlist:qe,currentIndex:st,currentTrack:H0,isPlaying:vo,currentTime:Ls,duration:un,progressPct:j0,volume:ki,isMuted:In,repeatMode:Qn,shuffle:dn,setPlaylist:P0,playAt:qn,play:Ru,pause:Ei,toggle:O0,seek:Vo,seekRatio:D0,setVolume:N0,toggleMute:I0,next:Cu,prev:F0,setRepeat:Tu,cycleRepeat:U0,setShuffle:Pu,toggleShuffle:B0}}const q0={class:"min-h-screen"},V0={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},W0={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},K0={class:"text-2xl font-bold tracking-tight"},z0={class:"mt-1 text-sm text-base-content/60"},Q0={class:"flex items-center gap-2"},G0=["title"],J0=["disabled"],Y0={key:0,class:"loading loading-spinner loading-xs mr-2"},X0={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},Z0={key:1,class:"space-y-3"},ex={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},tx={class:"text-base-content/50 text-sm"},nx={class:"text-base-content/40 text-xs mt-1"},sx={key:3,class:"space-y-2"},ox={class:"relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden"},rx=["src","alt","onError"],ix={class:"flex-1 min-w-0"},lx={class:"text-sm font-medium truncate block"},ax={key:0,class:"text-xs text-base-content/60 truncate"},cx={class:"text-xs text-base-content/40"},ux={key:0,class:"mr-2 text-primary/70"},dx={class:"flex items-center gap-1 shrink-0"},fx=["onClick","title"],px=["href","download","title"],hx=["disabled","onClick","title"],mx={key:0,class:"loading loading-spinner loading-xs"},gx={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},yx=["disabled","title"],vx=["onClick"],bx=["disabled","title"],_x={key:5,class:"mt-6 text-xs text-base-content/40 text-center"},hr=10,xx={__name:"Downloads",setup(e){const{t}=St(),n=Ou(),s=_b(),o=te([]),r=te(!1),i=te(""),l=te({}),a=te({}),d=te(1),c=be(()=>Math.ceil(o.value.length/hr)),f=be(()=>{const C=(d.value-1)*hr;return o.value.slice(C,C+hr)});Mt(o,()=>{d.value=1});function m(C){return ve.coverFileURL(C)}function b(C){a.value={...a.value,[C]:!0}}async function y(){r.value=!0,i.value="";try{const C=await ve.listDownloads();o.value=(C.data||[]).map(Si)}catch{i.value=t("library.failedLoad")}finally{r.value=!1}}async function v(C){if(confirm(t("library.deletePrompt",{file:C}))){l.value={...l.value,[C]:!0};try{await ve.deleteDownload(C),o.value=o.value.filter(L=>L!==C)}catch{i.value=t("library.failedDelete",{file:C})}finally{l.value={...l.value,[C]:!1}}}}function h(C){const L=C.lastIndexOf(".");return L>0?C.slice(L+1).toUpperCase():""}function k(C){const L=C.lastIndexOf("/");return L>=0?C.slice(0,L):""}function R(C){const L=o.value.findIndex(P=>P.file===C.file);L<0||(n.setPlaylist(o.value,{startIndex:L}),s.push({name:"Player"}))}function S(){o.value.length&&(n.setPlaylist(o.value,{startIndex:0}),s.push({name:"Player"}))}return Zt(y),(C,L)=>(A(),T("div",q0,[M($s),M(zn),p("div",V0,[p("div",W0,[p("div",null,[p("h1",K0,w(u(t)("library.title")),1),p("p",z0,w(u(t)("library.subtitle")),1)]),p("div",Q0,[o.value.length>0?(A(),T("button",{key:0,class:"btn btn-primary btn-sm h-11 px-5 rounded-full",onClick:S,title:u(t)("library.play")},[M(u(G),{icon:"clarity:play-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(t)("library.play")),1)],8,G0)):ie("",!0),p("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:y,disabled:r.value},[r.value?(A(),T("span",Y0)):(A(),ct(u(G),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4 mr-2"})),Re(" "+w(u(t)("common.refresh")),1)],8,J0)])]),i.value?(A(),T("div",X0,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),p("span",null,w(i.value),1)])):ie("",!0),r.value&&o.value.length===0?(A(),T("div",Z0,[(A(),T(de,null,Ie(4,P=>p("div",{key:P,class:"skeleton h-16 rounded-2xl"})),64))])):o.value.length===0?(A(),T("div",ex,[M(u(G),{icon:"clarity:library-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",tx,w(u(t)("library.empty")),1),p("p",nx,w(u(t)("library.emptyHint")),1)])):(A(),T("ul",sx,[(A(!0),T(de,null,Ie(f.value,P=>(A(),T("li",{key:P.file,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-3"},[p("div",ox,[a.value[P.file]?(A(),ct(u(G),{key:1,icon:"clarity:music-note-line",class:"h-5 w-5"})):(A(),T("img",{key:0,src:m(P.file),alt:P.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:U=>b(P.file)},null,40,rx))]),p("div",ix,[p("span",lx,w(P.title),1),P.artist?(A(),T("p",ax,w(P.artist),1)):ie("",!0),p("span",cx,[k(P.file)?(A(),T("span",ux,[M(u(G),{icon:"clarity:folder-line",class:"inline h-3 w-3 mr-0.5 align-text-top"}),Re(w(k(P.file)),1)])):ie("",!0),Re(" "+w(h(P.file)),1)])]),p("div",dx,[p("button",{class:"icon-btn text-primary hover:bg-primary/10",onClick:U=>R(P),title:u(t)("library.play")},[M(u(G),{icon:"clarity:play-line",class:"h-4 w-4"})],8,fx),p("a",{class:"icon-btn",href:u(ve).downloadFileURL(P.file),download:u(ve).downloadSaveName(P.file),title:u(t)("library.downloadToDevice")},[M(u(G),{icon:"clarity:download-line",class:"h-4 w-4"})],8,px),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",disabled:l.value[P.file]===!0,onClick:U=>v(P.file),title:u(t)("library.deleteFile")},[l.value[P.file]===!0?(A(),T("span",mx)):(A(),ct(u(G),{key:1,icon:"clarity:trash-line",class:"h-4 w-4"}))],8,hx)])]))),128))])),c.value>1?(A(),T("nav",gx,[p("button",{class:"icon-btn",disabled:d.value===1,onClick:L[0]||(L[0]=P=>d.value--),title:u(t)("common.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,yx),(A(!0),T(de,null,Ie(c.value,P=>(A(),T("button",{key:P,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",P===d.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:U=>d.value=P},w(P),11,vx))),128)),p("button",{class:"icon-btn",disabled:d.value===c.value,onClick:L[1]||(L[1]=P=>d.value++),title:u(t)("common.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,bx)])):ie("",!0),o.value.length>0?(A(),T("p",_x,w(o.value.length===1?u(t)("library.countOne",{count:o.value.length}):u(t)("library.countMany",{count:o.value.length})),1)):ie("",!0)])]))}},Ms=Pe.create({baseURL:`${Ge.PROTOCOL}//${Ge.BACKEND}:${Ge.PORT}${Ge.BASEURL}`});function wx(){return Ms.get("/api/monitor/playlists")}function kx(e,t=60){return Ms.post("/api/monitor/playlists",{url:e,interval_minutes:t})}function Sx(e,t){return Ms.patch(`/api/monitor/playlists/${e}`,t)}function Ex(e){return Ms.delete(`/api/monitor/playlists/${e}`)}function Ax(e){return Ms.post(`/api/monitor/playlists/${e}/check`)}const yn={listMonitoredPlaylists:wx,addMonitoredPlaylist:kx,updateMonitoredPlaylist:Sx,deleteMonitoredPlaylist:Ex,checkMonitoredPlaylist:Ax},Rx={class:"min-h-screen"},Cx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},Tx={class:"mb-8"},Px={class:"text-2xl font-bold tracking-tight"},Ox={class:"mt-1 text-sm text-base-content/60"},Dx={class:"surface rounded-2xl p-5 mb-8"},Nx={class:"text-sm font-semibold uppercase tracking-wider text-base-content/50 mb-4"},Ix=["placeholder","disabled"],$x={class:"flex items-center gap-2 shrink-0"},Lx=["disabled"],Fx={value:15},Mx={value:30},Ux={value:60},Bx={value:180},Hx={value:360},jx={value:720},qx={value:1440},Vx={value:10080},Wx={value:20160},Kx={value:43200},zx=["disabled"],Qx={key:0,class:"loading loading-spinner loading-xs"},Gx={key:1},Jx={key:0,class:"mt-2 text-xs text-error"},Yx={key:0,class:"space-y-3"},Xx={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},Zx={class:"text-base-content/50 text-sm"},ew={class:"text-base-content/40 text-xs mt-1"},tw={key:2,class:"space-y-3"},nw={class:"flex-1 min-w-0"},sw={class:"flex items-center gap-2 mb-1"},ow={class:"font-semibold truncate"},rw={class:"flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-base-content/50"},iw={key:0},lw={key:1,class:"italic"},aw={class:"flex items-center gap-2 shrink-0"},cw=["value","onChange"],uw={value:15},dw={value:30},fw={value:60},pw={value:180},hw={value:360},mw={value:720},gw={value:1440},yw={value:10080},vw={value:20160},bw={value:43200},_w=["title","onClick"],xw=["title","disabled","onClick"],ww={key:0,class:"loading loading-spinner loading-xs"},kw=["title","onClick"],Sw={class:"mt-8 surface rounded-2xl p-4 flex gap-3 text-sm text-base-content/60"},Ew={__name:"Monitor",setup(e){const{t}=St(),n=te([]),s=te(!1),o=te(!1),r=te(""),i=te(""),l=te(60),a=te({});async function d(){s.value=!0;try{const k=await yn.listMonitoredPlaylists();n.value=k.data||[]}finally{s.value=!1}}async function c(){var k,R;r.value="",o.value=!0;try{const S=await yn.addMonitoredPlaylist(i.value.trim(),l.value);n.value.unshift(S.data),i.value=""}catch(S){r.value=((R=(k=S==null?void 0:S.response)==null?void 0:k.data)==null?void 0:R.detail)||t("monitor.failedAdd")}finally{o.value=!1}}async function f(k){try{const R=await yn.updateMonitoredPlaylist(k.id,{enabled:!k.enabled});Object.assign(k,R.data)}catch{}}async function m(k,R){const S=parseInt(R.target.value,10);try{const C=await yn.updateMonitoredPlaylist(k.id,{interval_minutes:S});Object.assign(k,C.data)}catch{}}async function b(k){a.value={...a.value,[k.id]:!0};try{await yn.checkMonitoredPlaylist(k.id),setTimeout(async()=>{try{const R=await yn.listMonitoredPlaylists();n.value=R.data||[]}finally{a.value={...a.value,[k.id]:!1}}},3e3)}catch{a.value={...a.value,[k.id]:!1}}}async function y(k){if(confirm(t("monitor.deletePrompt",{name:k.name})))try{await yn.deleteMonitoredPlaylist(k.id),n.value=n.value.filter(R=>R.id!==k.id)}catch{}}function v(k){if(k<60)return`${k} ${t("monitor.minSuffix")}`;if(k<1440)return`${k/60} ${t("monitor.hourSuffix")}`;if(k<10080){const S=k/1440;return`${S} ${t(S===1?"monitor.daySuffix":"monitor.daysSuffix")}`}if(k<43200){const S=k/10080;return`${S} ${t(S===1?"monitor.weekSuffix":"monitor.weeksSuffix")}`}const R=Math.round(k/43200);return`${R} ${t(R===1?"monitor.monthSuffix":"monitor.monthsSuffix")}`}function h(k){try{const R=Date.now()-new Date(k).getTime(),S=Math.floor(R/6e4);if(S<1)return t("monitor.timeJustNow");if(S<60)return t("monitor.timeMinAgo",{n:S});const C=Math.floor(S/60);return C<24?t("monitor.timeHourAgo",{n:C}):t("monitor.timeDayAgo",{n:Math.floor(C/24)})}catch{return""}}return Zt(d),(k,R)=>(A(),T("div",Rx,[M($s),M(zn),p("div",Cx,[p("div",Tx,[p("h1",Px,w(u(t)("monitor.title")),1),p("p",Ox,w(u(t)("monitor.subtitle")),1)]),p("div",Dx,[p("h2",Nx,w(u(t)("monitor.watchNew")),1),p("form",{onSubmit:ep(c,["prevent"]),class:"flex flex-col sm:flex-row gap-3"},[Ee(p("input",{"onUpdate:modelValue":R[0]||(R[0]=S=>i.value=S),type:"text",placeholder:u(t)("monitor.urlPlaceholder"),class:"input-modern flex-1 h-11 text-sm",disabled:o.value},null,8,Ix),[[rt,i.value]]),p("div",$x,[Ee(p("select",{"onUpdate:modelValue":R[1]||(R[1]=S=>l.value=S),class:"select select-sm rounded-full border border-white/10 bg-base-100/85 focus:border-primary/60 h-11 px-3 text-sm",disabled:o.value},[p("option",Fx,w(u(t)("monitor.every15")),1),p("option",Mx,w(u(t)("monitor.every30")),1),p("option",Ux,w(u(t)("monitor.every1h")),1),p("option",Bx,w(u(t)("monitor.every3h")),1),p("option",Hx,w(u(t)("monitor.every6h")),1),p("option",jx,w(u(t)("monitor.every12h")),1),p("option",qx,w(u(t)("monitor.every1d")),1),p("option",Vx,w(u(t)("monitor.every1w")),1),p("option",Wx,w(u(t)("monitor.every2w")),1),p("option",Kx,w(u(t)("monitor.every1mo")),1)],8,Lx),[[Xs,l.value]]),p("button",{type:"submit",class:"btn btn-primary btn-sm h-11 px-5 rounded-full",disabled:o.value||!i.value.trim()},[o.value?(A(),T("span",Qx)):(A(),T("span",Gx,w(u(t)("monitor.watch")),1))],8,zx)])],32),r.value?(A(),T("p",Jx,w(r.value),1)):ie("",!0)]),s.value?(A(),T("div",Yx,[(A(),T(de,null,Ie(3,S=>p("div",{key:S,class:"skeleton h-24 rounded-2xl"})),64))])):n.value.length===0?(A(),T("div",Xx,[M(u(G),{icon:"clarity:music-note-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",Zx,w(u(t)("monitor.empty")),1),p("p",ew,w(u(t)("monitor.emptyHint")),1)])):(A(),T("ul",tw,[(A(!0),T(de,null,Ie(n.value,S=>(A(),T("li",{key:S.id,class:"surface rounded-2xl p-4 sm:p-5 flex flex-col sm:flex-row sm:items-center gap-4"},[p("div",nw,[p("div",sw,[p("span",ow,w(S.name),1),p("span",{class:Ae(["pill shrink-0",S.enabled?"badge-soft":"badge-neutral-soft"])},w(S.enabled?u(t)("monitor.active"):u(t)("monitor.paused")),3)]),p("div",rw,[p("span",null,[M(u(G),{icon:"clarity:refresh-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(u(t)("monitor.everyInterval",{interval:v(S.interval_minutes)})),1)]),p("span",null,[M(u(G),{icon:"clarity:music-note-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(S.last_track_count===1?u(t)("monitor.tracksOne",{count:S.last_track_count}):u(t)("monitor.tracksMany",{count:S.last_track_count})),1)]),S.last_checked?(A(),T("span",iw,[M(u(G),{icon:"clarity:clock-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(u(t)("monitor.checked",{when:h(S.last_checked)})),1)])):(A(),T("span",lw,w(u(t)("monitor.notChecked")),1))])]),p("div",aw,[p("select",{value:S.interval_minutes,onChange:C=>m(S,C),class:"select select-xs rounded-full border border-white/10 bg-base-100/60 text-xs focus:border-primary/60"},[p("option",uw,w(u(t)("monitor.short15")),1),p("option",dw,w(u(t)("monitor.short30")),1),p("option",fw,w(u(t)("monitor.short1h")),1),p("option",pw,w(u(t)("monitor.short3h")),1),p("option",hw,w(u(t)("monitor.short6h")),1),p("option",mw,w(u(t)("monitor.short12h")),1),p("option",gw,w(u(t)("monitor.short1d")),1),p("option",yw,w(u(t)("monitor.short1w")),1),p("option",vw,w(u(t)("monitor.short2w")),1),p("option",bw,w(u(t)("monitor.short1mo")),1)],40,cw),p("button",{class:"icon-btn",title:S.enabled?u(t)("monitor.pause"):u(t)("monitor.resume"),onClick:C=>f(S)},[M(u(G),{icon:S.enabled?"clarity:pause-line":"clarity:play-line",class:"h-4 w-4"},null,8,["icon"])],8,_w),p("button",{class:"icon-btn",title:u(t)("monitor.checkNow"),disabled:a.value[S.id],onClick:C=>b(S)},[a.value[S.id]?(A(),T("span",ww)):(A(),ct(u(G),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4"}))],8,xw),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",title:u(t)("monitor.stop"),onClick:C=>y(S)},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,kw)])]))),128))])),p("div",Sw,[M(u(G),{icon:"clarity:info-standard-line",class:"h-5 w-5 shrink-0 mt-0.5 text-primary/70"}),p("p",null,w(u(t)("monitor.info")),1)])])]))}},Aw={class:"min-h-screen"},Rw={class:"mx-auto max-w-5xl px-4 py-8 sm:px-6"},Cw={class:"mb-8"},Tw={class:"text-2xl font-bold tracking-tight"},Pw={class:"mt-1 text-sm text-base-content/60"},Ow={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},Dw={class:"text-base-content/50 text-sm"},Nw={class:"text-base-content/40 text-xs mt-1"},Iw={key:1,class:"space-y-3"},$w={key:2,class:"grid gap-6 lg:grid-cols-[1fr_360px]"},Lw={class:"surface rounded-3xl p-6 sm:p-8 flex flex-col items-center text-center"},Fw=["src","alt"],Mw={key:2,class:"absolute bottom-3 right-3 equalizer h-5","aria-hidden":"true"},Uw={class:"mt-6 w-full"},Bw={class:"text-xl font-bold tracking-tight truncate"},Hw={class:"text-sm text-base-content/60 truncate mt-0.5"},jw={class:"mt-6 w-full"},qw={class:"mt-2 flex items-center justify-between text-xs text-base-content/50 tabular-nums"},Vw={class:"mt-5 flex items-center justify-center gap-3"},Ww=["title"],Kw=["title","disabled"],zw=["disabled","title"],Qw=["title","disabled"],Gw=["title"],Jw={key:0,class:"absolute -bottom-0.5 -right-0.5 h-4 min-w-[1rem] px-1 rounded-full bg-primary text-primary-content text-[9px] font-bold flex items-center justify-center"},Yw={class:"mt-6 w-full max-w-xs flex items-center gap-3"},Xw=["title"],Zw=["value","title"],e1={class:"surface rounded-3xl p-4 sm:p-5 lg:max-h-[640px] lg:overflow-y-auto"},t1={class:"flex items-center justify-between mb-3 px-1"},n1={class:"text-xs font-semibold uppercase tracking-wider text-base-content/50"},s1={class:"text-[11px] text-base-content/40"},o1={key:0,class:"space-y-1"},r1=["onClick"],i1=["src","alt","onError"],l1={key:1,class:"relative equalizer h-3","aria-hidden":"true"},a1={class:"flex-1 min-w-0"},c1={class:"text-sm truncate font-medium"},u1={class:"text-[11px] truncate text-base-content/50"},d1={key:1,class:"text-center py-10"},f1={class:"text-base-content/50 text-sm"},p1={__name:"Player",setup(e){const{t}=St(),n=Ou(),s=te([]),o=te(!1),r=te(null),i=te({});let l=!1;function a(L){return ve.coverFileURL(L)}function d(L){i.value={...i.value,[L]:!0}}async function c(){o.value=!0;try{const L=await ve.listDownloads();s.value=(L.data||[]).map(Si),n.playlist.value.length===0&&s.value.length>0&&n.setPlaylist(s.value)}finally{o.value=!1}}function f(L){var P,U;n.playlist.value.length!==s.value.length||((P=n.playlist.value[L])==null?void 0:P.file)!==((U=s.value[L])==null?void 0:U.file)?n.setPlaylist(s.value,{startIndex:L}):n.playAt(L)}const m=be(()=>{const L=n.currentTrack.value;return L&&L.title?L.title:t("player.empty")}),b=be(()=>{const L=n.currentTrack.value;return L&&L.artist?L.artist:L?t("common.unknownArtist"):""}),y=be(()=>n.repeatMode.value==="one"?t("player.repeatOne"):n.repeatMode.value==="all"?t("player.repeatAll"):t("player.repeatOff"));function v(L){n.setVolume(parseFloat(L.target.value))}function h(L){const P=r.value;if(!P)return 0;const U=P.getBoundingClientRect(),ae=(L.clientX||0)-U.left;return Math.max(0,Math.min(1,ae/U.width))}function k(L){n.seekRatio(h(L))}function R(L){l=!0,n.seekRatio(h(L)),window.addEventListener("pointermove",S),window.addEventListener("pointerup",C,{once:!0})}function S(L){l&&n.seekRatio(h(L))}function C(){l=!1,window.removeEventListener("pointermove",S)}return Zt(()=>{window.scroll(0,0),c()}),ri(()=>{window.removeEventListener("pointermove",S)}),(L,P)=>(A(),T("div",Aw,[M($s),M(zn),p("div",Rw,[p("div",Cw,[p("h1",Tw,w(u(t)("player.title")),1),p("p",Pw,w(u(t)("player.subtitle")),1)]),s.value.length===0&&!o.value?(A(),T("div",Ow,[M(u(G),{icon:"clarity:headphones-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",Dw,w(u(t)("player.empty")),1),p("p",Nw,w(u(t)("player.emptyHint")),1)])):o.value&&!u(n).currentTrack.value?(A(),T("div",Iw,[...P[8]||(P[8]=[p("div",{class:"skeleton h-72 rounded-3xl"},null,-1),p("div",{class:"skeleton h-16 rounded-2xl"},null,-1),p("div",{class:"skeleton h-16 rounded-2xl"},null,-1)])])):(A(),T("div",$w,[p("section",Lw,[p("div",{class:Ae(["relative h-56 w-56 sm:h-64 sm:w-64 rounded-3xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden shadow-glow",{"pulse-glow":u(n).isPlaying.value}])},[u(n).currentTrack.value&&u(n).currentTrack.value.cover&&!i.value[u(n).currentTrack.value.file]?(A(),T("img",{key:0,src:u(n).currentTrack.value.cover,alt:u(n).currentTrack.value.title,class:"absolute inset-0 h-full w-full object-cover",onError:P[0]||(P[0]=U=>d(u(n).currentTrack.value.file))},null,40,Fw)):(A(),ct(u(G),{key:1,icon:"clarity:music-note-line",class:"h-24 w-24"})),u(n).isPlaying.value?(A(),T("div",Mw,[...P[9]||(P[9]=[p("span",null,null,-1),p("span",null,null,-1),p("span",null,null,-1)])])):ie("",!0)],2),p("div",Uw,[p("p",Bw,w(m.value),1),p("p",Hw,w(b.value),1)]),p("div",jw,[p("div",{class:"relative h-2 rounded-full bg-white/10 overflow-hidden cursor-pointer group",ref_key:"progressBar",ref:r,onClick:k,onPointerdown:R},[p("div",{class:"h-full bg-primary transition-[width] duration-150",style:$n(`width: ${u(n).progressPct.value}%`)},null,4),p("div",{class:"absolute top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded-full bg-primary shadow-glow-sm transition-all duration-150 opacity-0 group-hover:opacity-100",style:$n(`left: calc(${u(n).progressPct.value}% - 7px)`)},null,4)],544),p("div",qw,[p("span",null,w(u(pa)(u(n).currentTime.value)),1),p("span",null,w(u(pa)(u(n).duration.value)),1)])]),p("div",Vw,[p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(n).shuffle.value}]),onClick:P[1]||(P[1]=U=>u(n).toggleShuffle()),title:u(n).shuffle.value?u(t)("player.shuffleOn"):u(t)("player.shuffleOff")},[M(u(G),{icon:"clarity:shuffle-line",class:"h-5 w-5"})],10,Ww),p("button",{class:"icon-btn",onClick:P[2]||(P[2]=U=>u(n).prev()),title:u(t)("player.previous"),disabled:s.value.length===0},[M(u(G),{icon:"clarity:step-forward-2-line",class:"h-5 w-5 -scale-x-100"})],8,Kw),p("button",{class:"inline-flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm hover:scale-105 active:scale-95 transition disabled:opacity-50",onClick:P[3]||(P[3]=U=>u(n).toggle()),disabled:s.value.length===0,title:u(n).isPlaying.value?u(t)("player.pause"):u(t)("player.play")},[M(u(G),{icon:u(n).isPlaying.value?"clarity:pause-solid":"clarity:play-solid",class:"h-6 w-6"},null,8,["icon"])],8,zw),p("button",{class:"icon-btn",onClick:P[4]||(P[4]=U=>u(n).next()),title:u(t)("player.next"),disabled:s.value.length===0},[M(u(G),{icon:"clarity:step-forward-2-line",class:"h-5 w-5"})],8,Qw),p("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(n).repeatMode.value!=="off"}]),onClick:P[5]||(P[5]=U=>u(n).cycleRepeat()),title:y.value},[M(u(G),{icon:"clarity:refresh-line",class:"h-5 w-5"}),u(n).repeatMode.value==="one"?(A(),T("span",Jw," 1 ")):ie("",!0)],10,Gw)]),p("div",Yw,[p("button",{class:"icon-btn",onClick:P[6]||(P[6]=U=>u(n).toggleMute()),title:u(n).isMuted.value?u(t)("player.unmute"):u(t)("player.mute")},[M(u(G),{icon:u(n).isMuted.value||u(n).volume.value===0?"clarity:volume-mute-line":u(n).volume.value<.5?"clarity:volume-down-line":"clarity:volume-up-line",class:"h-5 w-5"},null,8,["icon"])],8,Xw),p("input",{type:"range",min:"0",max:"1",step:"0.01",value:u(n).isMuted.value?0:u(n).volume.value,onInput:P[7]||(P[7]=U=>v(U)),class:"player-range flex-1",title:u(t)("player.volume")},null,40,Zw)])]),p("aside",e1,[p("div",t1,[p("h2",n1,w(u(t)("player.queue")),1),p("span",s1,w(s.value.length===1?u(t)("player.countOne",{count:s.value.length}):u(t)("player.countMany",{count:s.value.length})),1)]),s.value.length>0?(A(),T("ul",o1,[(A(!0),T(de,null,Ie(s.value,(U,ae)=>(A(),T("li",{key:U.file,class:Ae(["rounded-xl px-2 py-2 flex items-center gap-3 cursor-pointer transition-colors",ae===u(n).currentIndex.value?"bg-primary/10 text-primary":"hover:bg-white/5"]),onClick:$=>f(ae)},[p("div",{class:Ae(["relative h-9 w-9 shrink-0 rounded-lg overflow-hidden flex items-center justify-center",ae===u(n).currentIndex.value?"bg-primary/15":"bg-base-100/60"])},[i.value[U.file]?ie("",!0):(A(),T("img",{key:0,src:a(U.file),alt:U.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:$=>d(U.file)},null,40,i1)),ae===u(n).currentIndex.value&&u(n).isPlaying.value?(A(),T("span",l1,[...P[10]||(P[10]=[p("span",null,null,-1),p("span",null,null,-1),p("span",null,null,-1)])])):i.value[U.file]?(A(),ct(u(G),{key:2,icon:"clarity:music-note-line",class:"h-4 w-4 text-base-content/50"})):ie("",!0)],2),p("div",a1,[p("p",c1,w(U.title),1),p("p",u1,w(U.artist||u(t)("common.unknownArtist")),1)])],10,r1))),128))])):(A(),T("div",d1,[p("p",f1,w(u(t)("player.empty")),1)]))])]))])]))}},h1=Eu(p1,[["__scopeId","data-v-98956c70"]]),m1=[{path:"/",name:"Home",component:Jb},{path:"/search/:query",name:"Search",component:H_},{path:"/download",name:"Download",component:T0},{path:"/list",name:"List",component:xx},{path:"/monitor",name:"Monitor",component:Ew},{path:"/player",name:"Player",component:h1}],it=bb({history:Yv(Ge.BASEURL),routes:m1}),Du=rp(pv);Du.use(it);Du.mount("#app"); + */let Qv=()=>location.protocol+"//"+location.host;function _u(e,t){const{pathname:n,search:s,hash:o}=t,r=e.indexOf("#");if(r>-1){let i=o.includes(e.slice(r))?e.slice(r).length:1,l=o.slice(i);return l[0]!=="/"&&(l="/"+l),Yl(l,"")}return Yl(n,e)+s+o}function Gv(e,t,n,s){let o=[],r=[],i=null;const l=({state:m})=>{const b=_u(e,location),y=n.value,v=t.value;let h=0;if(m){if(n.value=b,t.value=m,i&&i===y){i=null;return}h=v?m.position-v.position:0}else s(b);o.forEach(k=>{k(n.value,y,{delta:h,type:Fr.pop,direction:h?h>0?cr.forward:cr.back:cr.unknown})})};function a(){i=n.value}function d(m){o.push(m);const b=()=>{const y=o.indexOf(m);y>-1&&o.splice(y,1)};return r.push(b),b}function c(){if(document.visibilityState==="hidden"){const{history:m}=window;if(!m.state)return;m.replaceState(he({},m.state,{scroll:Uo()}),"")}}function f(){for(const m of r)m();r=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:a,listen:d,destroy:f}}function na(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Uo():null}}function Jv(e){const{history:t,location:n}=window,s={value:_u(e,n)},o={value:t.state};o.value||r(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(a,d,c){const f=e.indexOf("#"),m=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:Qv()+e+a;try{t[c?"replaceState":"pushState"](d,"",m),o.value=d}catch(b){console.error(b),n[c?"replace":"assign"](m)}}function i(a,d){r(a,he({},t.state,na(o.value.back,a,o.value.forward,!0),d,{position:o.value.position}),!0),s.value=a}function l(a,d){const c=he({},o.value,t.state,{forward:a,scroll:Uo()});r(c.current,c,!0),r(a,he({},na(s.value,a,null),{position:c.position+1},d),!1),s.value=a}return{location:s,state:o,push:l,replace:i}}function Yv(e){e=Iv(e);const t=Jv(e),n=Gv(e,t.state,t.location,t.replace);function s(r,i=!0){i||n.pauseListeners(),history.go(r)}const o=he({location:"",base:e,go:s,createHref:Lv.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let xn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Ne=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Ne||{});const Xv={type:xn.Static,value:""},Zv=/[a-zA-Z0-9_]/;function eb(e){if(!e)return[[]];if(e==="/")return[[Xv]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(b){throw new Error(`ERR (${n})/"${d}": ${b}`)}let n=Ne.Static,s=n;const o=[];let r;function i(){r&&o.push(r),r=[]}let l=0,a,d="",c="";function f(){d&&(n===Ne.Static?r.push({type:xn.Static,value:d}):n===Ne.Param||n===Ne.ParamRegExp||n===Ne.ParamRegExpEnd?(r.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),r.push({type:xn.Param,value:d,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),d="")}function m(){d+=a}for(;lt.length?t.length===1&&t[0]===We.Static+We.Segment?1:-1:0}function xu(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const rb={strict:!1,end:!0,sensitive:!1};function ib(e,t,n){const s=sb(eb(e.path),n),o=he(s,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function lb(e,t){const n=[],s=new Map;t=Jl(rb,t);function o(f){return s.get(f)}function r(f,m,b){const y=!b,v=ia(f);v.aliasOf=b&&b.record;const h=Jl(t,f),k=[v];if("alias"in f){const C=typeof f.alias=="string"?[f.alias]:f.alias;for(const L of C)k.push(ia(he({},v,{components:b?b.record.components:v.components,path:L,aliasOf:b?b.record:v})))}let R,S;for(const C of k){const{path:L}=C;if(m&&L[0]!=="/"){const P=m.record.path,U=P[P.length-1]==="/"?"":"/";C.path=m.record.path+(L&&U+L)}if(R=ib(C,m,h),b?b.alias.push(R):(S=S||R,S!==R&&S.alias.push(R),y&&f.name&&!la(R)&&i(f.name)),wu(R)&&a(R),v.children){const P=v.children;for(let U=0;U{i(S)}:fs}function i(f){if(vu(f)){const m=s.get(f);m&&(s.delete(f),n.splice(n.indexOf(m),1),m.children.forEach(i),m.alias.forEach(i))}else{const m=n.indexOf(f);m>-1&&(n.splice(m,1),f.record.name&&s.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function l(){return n}function a(f){const m=ub(f,n);n.splice(m,0,f),f.record.name&&!la(f)&&s.set(f.record.name,f)}function d(f,m){let b,y={},v,h;if("name"in f&&f.name){if(b=s.get(f.name),!b)throw jn(Ce.MATCHER_NOT_FOUND,{location:f});h=b.record.name,y=he(ra(m.params,b.keys.filter(S=>!S.optional).concat(b.parent?b.parent.keys.filter(S=>S.optional):[]).map(S=>S.name)),f.params&&ra(f.params,b.keys.map(S=>S.name))),v=b.stringify(y)}else if(f.path!=null)v=f.path,b=n.find(S=>S.re.test(v)),b&&(y=b.parse(v),h=b.record.name);else{if(b=m.name?s.get(m.name):n.find(S=>S.re.test(m.path)),!b)throw jn(Ce.MATCHER_NOT_FOUND,{location:f,currentLocation:m});h=b.record.name,y=he({},m.params,f.params),v=b.stringify(y)}const k=[];let R=b;for(;R;)k.unshift(R.record),R=R.parent;return{name:h,path:v,params:y,matched:k,meta:cb(k)}}e.forEach(f=>r(f));function c(){n.length=0,s.clear()}return{addRoute:r,resolve:d,removeRoute:i,clearRoutes:c,getRoutes:l,getRecordMatcher:o}}function ra(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function ia(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:ab(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function ab(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function la(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function cb(e){return e.reduce((t,n)=>he(t,n.meta),{})}function ub(e,t){let n=0,s=t.length;for(;n!==s;){const r=n+s>>1;xu(e,t[r])<0?s=r:n=r+1}const o=db(e);return o&&(s=t.lastIndexOf(o,s-1)),s}function db(e){let t=e;for(;t=t.parent;)if(wu(t)&&xu(e,t)===0)return t}function wu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function aa(e){const t=_t(Bo),n=_t(_i),s=be(()=>{const a=u(e.to);return t.resolve(a)}),o=be(()=>{const{matched:a}=s.value,{length:d}=a,c=a[d-1],f=n.matched;if(!c||!f.length)return-1;const m=f.findIndex(Hn.bind(null,c));if(m>-1)return m;const b=ca(a[d-2]);return d>1&&ca(c)===b&&f[f.length-1].path!==b?f.findIndex(Hn.bind(null,a[d-2])):m}),r=be(()=>o.value>-1&&gb(n.params,s.value.params)),i=be(()=>o.value>-1&&o.value===n.matched.length-1&&yu(n.params,s.value.params));function l(a={}){if(mb(a)){const d=t[u(e.replace)?"replace":"push"](u(e.to)).catch(fs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:be(()=>s.value.href),isActive:r,isExactActive:i,navigate:l}}function fb(e){return e.length===1?e[0]:e}const pb=si({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:aa,setup(e,{slots:t}){const n=Ln(aa(e)),{options:s}=_t(Bo),o=be(()=>({[ua(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ua(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const r=t.default&&fb(t.default(n));return e.custom?r:bs("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}}),hb=pb;function mb(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function gb(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!kt(o)||o.length!==s.length||s.some((r,i)=>r.valueOf()!==o[i].valueOf()))return!1}return!0}function ca(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ua=(e,t,n)=>e??t??n,yb=si({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=_t(Ur),o=be(()=>e.route||s.value),r=_t(ta,0),i=be(()=>{let d=u(r);const{matched:c}=o.value;let f;for(;(f=c[d])&&!f.components;)d++;return d}),l=be(()=>o.value.matched[i.value]);Qs(ta,be(()=>i.value+1)),Qs(Kv,l),Qs(Ur,o);const a=te();return Mt(()=>[a.value,l.value,e.name],([d,c,f],[m,b,y])=>{c&&(c.instances[f]=d,b&&b!==c&&d&&d===m&&(c.leaveGuards.size||(c.leaveGuards=b.leaveGuards),c.updateGuards.size||(c.updateGuards=b.updateGuards))),d&&c&&(!b||!Hn(c,b)||!m)&&(c.enterCallbacks[f]||[]).forEach(v=>v(d))},{flush:"post"}),()=>{const d=o.value,c=e.name,f=l.value,m=f&&f.components[c];if(!m)return da(n.default,{Component:m,route:d});const b=f.props[c],y=b?b===!0?d.params:typeof b=="function"?b(d):b:null,h=bs(m,he({},y,t,{onVnodeUnmounted:k=>{k.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return da(n.default,{Component:h,route:d})||h}}});function da(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const vb=yb;function bb(e){const t=lb(e.routes,e),n=e.parseQuery||Vv,s=e.stringifyQuery||ea,o=e.history,r=ns(),i=ns(),l=ns(),a=fd(nn);let d=nn;Tn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=lr.bind(null,N=>""+N),f=lr.bind(null,Rv),m=lr.bind(null,Ss);function b(N,Q){let W,J;return vu(N)?(W=t.getRecordMatcher(N),J=Q):J=N,t.addRoute(J,W)}function y(N){const Q=t.getRecordMatcher(N);Q&&t.removeRoute(Q)}function v(){return t.getRoutes().map(N=>N.record)}function h(N){return!!t.getRecordMatcher(N)}function k(N,Q){if(Q=he({},Q||a.value),typeof N=="string"){const x=ar(n,N,Q.path),O=t.resolve({path:x.path},Q),I=o.createHref(x.fullPath);return he(x,O,{params:m(O.params),hash:Ss(x.hash),redirectedFrom:void 0,href:I})}let W;if(N.path!=null)W=he({},N,{path:ar(n,N.path,Q.path).path});else{const x=he({},N.params);for(const O in x)x[O]==null&&delete x[O];W=he({},N,{params:f(x)}),Q.params=f(Q.params)}const J=t.resolve(W,Q),ce=N.hash||"";J.params=c(m(J.params));const g=Pv(s,he({},N,{hash:Sv(ce),path:J.path})),_=o.createHref(g);return he({fullPath:g,hash:ce,query:s===ea?Wv(N.query):N.query||{}},J,{redirectedFrom:void 0,href:_})}function R(N){return typeof N=="string"?ar(n,N,a.value.path):he({},N)}function S(N,Q){if(d!==N)return jn(Ce.NAVIGATION_CANCELLED,{from:Q,to:N})}function C(N){return U(N)}function L(N){return C(he(R(N),{replace:!0}))}function P(N,Q){const W=N.matched[N.matched.length-1];if(W&&W.redirect){const{redirect:J}=W;let ce=typeof J=="function"?J(N,Q):J;return typeof ce=="string"&&(ce=ce.includes("?")||ce.includes("#")?ce=R(ce):{path:ce},ce.params={}),he({query:N.query,hash:N.hash,params:ce.path!=null?{}:N.params},ce)}}function U(N,Q){const W=d=k(N),J=a.value,ce=N.state,g=N.force,_=N.replace===!0,x=P(W,J);if(x)return U(he(R(x),{state:typeof x=="object"?he({},ce,x.state):ce,force:g,replace:_}),Q||W);const O=W;O.redirectedFrom=Q;let I;return!g&&Ov(s,J,W)&&(I=jn(Ce.NAVIGATION_DUPLICATED,{to:O,from:J}),De(J,J,!0,!1)),(I?Promise.resolve(I):K(O,J)).catch(D=>jt(D)?jt(D,Ce.NAVIGATION_GUARD_REDIRECT)?D:At(D):re(D,O,J)).then(D=>{if(D){if(jt(D,Ce.NAVIGATION_GUARD_REDIRECT))return U(he({replace:_},R(D.to),{state:typeof D.to=="object"?he({},ce,D.to.state):ce,force:g}),Q||O)}else D=q(O,J,!0,_,ce);return H(O,J,D),D})}function ae(N,Q){const W=S(N,Q);return W?Promise.reject(W):Promise.resolve()}function $(N){const Q=gt.values().next().value;return Q&&typeof Q.runWithContext=="function"?Q.runWithContext(N):N()}function K(N,Q){let W;const[J,ce,g]=zv(N,Q);W=ur(J.reverse(),"beforeRouteLeave",N,Q);for(const x of J)x.leaveGuards.forEach(O=>{W.push(rn(O,N,Q))});const _=ae.bind(null,N,Q);return W.push(_),dt(W).then(()=>{W=[];for(const x of r.list())W.push(rn(x,N,Q));return W.push(_),dt(W)}).then(()=>{W=ur(ce,"beforeRouteUpdate",N,Q);for(const x of ce)x.updateGuards.forEach(O=>{W.push(rn(O,N,Q))});return W.push(_),dt(W)}).then(()=>{W=[];for(const x of g)if(x.beforeEnter)if(kt(x.beforeEnter))for(const O of x.beforeEnter)W.push(rn(O,N,Q));else W.push(rn(x.beforeEnter,N,Q));return W.push(_),dt(W)}).then(()=>(N.matched.forEach(x=>x.enterCallbacks={}),W=ur(g,"beforeRouteEnter",N,Q,$),W.push(_),dt(W))).then(()=>{W=[];for(const x of i.list())W.push(rn(x,N,Q));return W.push(_),dt(W)}).catch(x=>jt(x,Ce.NAVIGATION_CANCELLED)?x:Promise.reject(x))}function H(N,Q,W){l.list().forEach(J=>$(()=>J(N,Q,W)))}function q(N,Q,W,J,ce){const g=S(N,Q);if(g)return g;const _=Q===nn,x=Tn?history.state:{};W&&(J||_?o.replace(N.fullPath,he({scroll:_&&x&&x.scroll},ce)):o.push(N.fullPath,ce)),a.value=N,De(N,Q,W,_),At()}let se;function we(){se||(se=o.listen((N,Q,W)=>{if(!Ct.listening)return;const J=k(N),ce=P(J,Ct.currentRoute.value);if(ce){U(he(ce,{replace:!0,force:!0}),J).catch(fs);return}d=J;const g=a.value;Tn&&Uv(Zl(g.fullPath,W.delta),Uo()),K(J,g).catch(_=>jt(_,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_CANCELLED)?_:jt(_,Ce.NAVIGATION_GUARD_REDIRECT)?(U(he(R(_.to),{force:!0}),J).then(x=>{jt(x,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_DUPLICATED)&&!W.delta&&W.type===Fr.pop&&o.go(-1,!1)}).catch(fs),Promise.reject()):(W.delta&&o.go(-W.delta,!1),re(_,J,g))).then(_=>{_=_||q(J,g,!1),_&&(W.delta&&!jt(_,Ce.NAVIGATION_CANCELLED)?o.go(-W.delta,!1):W.type===Fr.pop&&jt(_,Ce.NAVIGATION_ABORTED|Ce.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),H(J,g,_)}).catch(fs)}))}let Me=ns(),le=ns(),fe;function re(N,Q,W){At(N);const J=le.list();return J.length?J.forEach(ce=>ce(N,Q,W)):console.error(N),Promise.reject(N)}function ut(){return fe&&a.value!==nn?Promise.resolve():new Promise((N,Q)=>{Me.add([N,Q])})}function At(N){return fe||(fe=!N,we(),Me.list().forEach(([Q,W])=>N?W(N):Q()),Me.reset()),N}function De(N,Q,W,J){const{scrollBehavior:ce}=e;if(!Tn||!ce)return Promise.resolve();const g=!W&&Bv(Zl(N.fullPath,0))||(J||!W)&&history.state&&history.state.scroll||null;return ei().then(()=>ce(N,Q,g)).then(_=>_&&Mv(_)).catch(_=>re(_,N,Q))}const Oe=N=>o.go(N);let Rt;const gt=new Set,Ct={currentRoute:a,listening:!0,addRoute:b,removeRoute:y,clearRoutes:t.clearRoutes,hasRoute:h,getRoutes:v,resolve:k,options:e,push:C,replace:L,go:Oe,back:()=>Oe(-1),forward:()=>Oe(1),beforeEach:r.add,beforeResolve:i.add,afterEach:l.add,onError:le.add,isReady:ut,install(N){N.component("RouterLink",hb),N.component("RouterView",vb),N.config.globalProperties.$router=Ct,Object.defineProperty(N.config.globalProperties,"$route",{enumerable:!0,get:()=>u(a)}),Tn&&!Rt&&a.value===nn&&(Rt=!0,C(o.location).catch(J=>{}));const Q={};for(const J in nn)Object.defineProperty(Q,J,{get:()=>a.value[J],enumerable:!0});N.provide(Bo,Ct),N.provide(_i,La(Q)),N.provide(Ur,a);const W=N.unmount;gt.add(N),N.unmount=function(){gt.delete(N),gt.size<1&&(d=nn,se&&se(),se=null,a.value=nn,Rt=!1,fe=!1),W()}}};function dt(N){return N.reduce((Q,W)=>Q.then(()=>$(W)),Promise.resolve())}return Ct}function _b(){return _t(Bo)}function ku(e){return _t(_i)}const xi="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='256'%20height='256'%20viewBox='0%200%2067.733332%2067.733333'%20version='1.1'%20id='svg1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3cdefs%20id='defs1'%20/%3e%3cg%20id='layer1'%3e%3cg%20style='fill:%23040000;fill-opacity:1'%20id='g1'%20transform='matrix(0.06566918,0,0,0.06566918,17.061212,17.059932)'%3e%3cg%20id='g2'%3e%3ccircle%20style='fill:%231ad35d;fill-opacity:1;stroke-width:0.472667'%20id='path2'%20cx='33.866665'%20cy='33.866665'%20r='21.644735'%20transform='matrix(23.824636,0,0,23.824636,-550.95013,-550.93064)'%20/%3e%3cpath%20d='M%20480.6,111.5%20H%20406.5%20V%2035.6%20c%200,-10.7%20-8.3,-19.6%20-19,-20.4%20-104,-7.5%20-200.4,-3.7%20-263,0.8%20-10.7,0.8%20-19,9.8%20-19,20.5%20v%2074.9%20H%2031.4%20c%20-10.9,0%20-20.9,8.8%20-20.6,22%2040.6,166%20230.9,361.7%20230.9,361.7%209.8,10.8%2025.6,4%2028.6,0%200,0%20177.1,-165.8%20230.3,-359.4%201.6,-5.8%20-0.5,-24.3%20-20,-24.2%20z'%20id='path1'%20style='fill:%23040000;fill-opacity:1'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",fa=te(""),dr=te(),ss=te(!1),Ws=te(!1),Ks=te("");function Ho(){function e(o){return t(o)||n(o)}function t(o){return!(o===""||o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")||o.includes("://open.spotify.com/show/")||o.includes("://open.spotify.com/artist/"))}function n(o){return o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")}function s(o){console.log("Searching for:",o),dr.value=[],ss.value=!0,fa.value=o,Ws.value=!1,Ks.value="",ve.search(o).then(r=>{console.log("Received Search Data:",r.data),r.status===200?(dr.value=r.data,ss.value=!1):(console.error("Error Searching:",r),ss.value=!1,Ws.value=!0,Ks.value=r.toString())}).catch(r=>{console.error("Other Error Searching:",r.message),ss.value=!1,Ws.value=!0,Ks.value=r.message})}return{searchTerm:fa,isSearching:ss,results:dr,error:Ws,errorValue:Ks,searchFor:s,isValid:e,isValidSearch:t,isValidURL:n}}const yt={QUEUED:"In Queue",DOWNLOADING:"Downloading...",DOWNLOADED:"Done",ERROR:"Error"},Ke=te([]);class Su{constructor(t){this.song=t,this.web_status=yt.QUEUED,this.progress=0,this.message="",this.web_download_url=null,this.filename=null}setDownloading(){this.web_status=yt.DOWNLOADING}setDownloaded(){this.web_status=yt.DOWNLOADED}setError(){this.web_status=yt.ERROR}resetForRetry(){this.web_status=yt.QUEUED,this.progress=0,this.message="",this.web_download_url=null,this.filename=null}setWebURL(t){this.web_download_url=t}setFilename(t){this.filename=t}isQueued(){return this.web_status===yt.QUEUED}isDownloading(){return this.web_status===yt.DOWNLOADING}isDownloaded(){return this.web_status===yt.DOWNLOADED}isErrored(){return this.web_status===yt.ERROR}wsUpdate(t){this.progress=t.progress,this.message=t.message}}function Is(){function e(o){return Ke.value.findIndex(r=>r.song.song_id===o.song_id)}function t(o){let r=new Su(o);Ke.value.push(r)}function n(o){console.log("removing",o,o.song_id),Ke.value=Ke.value.filter(r=>r.song.song_id!==o.song_id),console.log(Ke.value)}function s(o){return e(o)===-1?null:Ke.value[e(o)]}return{appendSong:t,removeSong:n,getBySong:s,downloadQueue:Ke}}const Fe=Is();ve.ws_onmessage(e=>{let t=JSON.parse(e.data),n=Fe.getBySong(t.song);!n&&(Fe.appendSong(t.song),n=Fe.getBySong(t.song),!n)||(t.status==="done"?(n.progress=100,t.filename&&(n.setWebURL(ve.downloadFileURL(t.filename)),n.setFilename(t.filename)),n.setDownloaded()):t.status==="error"?(n.wsUpdate(t),n.setError()):t.status==="queued"?(n.web_status=yt.QUEUED,n.message=t.message||""):(n.wsUpdate(t),n.setDownloading()))});ve.ws_onerror(e=>{console.log("websocket error:",e)});async function xb(){try{const t=(await ve.getQueue()).data||[];for(const n of t){if(Ke.value.some(o=>o.song.song_id===n.song.song_id))continue;const s=new Su(n.song);n.status==="done"?(s.setDownloaded(),n.filename&&(s.setWebURL(ve.downloadFileURL(n.filename)),s.setFilename(n.filename)),s.progress=100):n.status==="error"?(s.setError(),s.message=n.message||""):n.status==="downloading"?(s.setDownloading(),s.progress=n.progress||0,s.message=n.message||""):(s.web_status=yt.QUEUED,s.message=n.message||""),Ke.value.push(s)}}catch(e){console.log("Failed to load queue from server:",e)}}xb();function wi(){const e=te(!1),t=uu();async function n(){Ke.value=Ke.value.filter(m=>!m.isDownloaded());try{await ve.clearCompletedQueue()}catch(m){console.log("Failed to clear completed queue on server:",m)}}function s(m){const b=(m||"").includes("://open.spotify.com/playlist/"),y=t.settings.value.generate_m3u!==!1;return e.value=!0,(b?n():Promise.resolve()).then(()=>ve.open(m)).then(h=>{if(console.log("Received Response:",h),h.status!==200){console.log("Error:",h);return}const k=h.data;if(Array.isArray(k)){for(const R of k)Fe.getBySong(R)||Fe.appendSong(R);return ve.downloadBatch({songs:k,playlist_url:b?m:"",generate_m3u:y}).catch(R=>{console.log("Batch submit failed:",R.message)})}else console.log("Opened Song:",k),r(k)}).catch(h=>{console.log("Other Error:",h.message)}).finally(()=>{e.value=!1})}function o(m){return console.log("Downloading",m),Fe.getBySong(m).setDownloading(),ve.download(m).then(b=>{if(console.log("Received Response:",b),b.status===200){let y=b.data;return console.log("Download Complete:",y),Fe.getBySong(m).setWebURL(ve.downloadFileURL(y)),Fe.getBySong(m).setFilename(y),Fe.getBySong(m).setDownloaded(),{song:m,filename:y}}else return console.log("Error:",b),Fe.getBySong(m).setError(),{song:m,filename:null}}).catch(b=>(console.log("Other Error:",b.message),Fe.getBySong(m).setError(),{song:m,filename:null}))}function r(m,b=!0){return Fe.appendSong(m),b?o(m):Promise.resolve({song:m,filename:null})}function i(m,b){const y={...m,youtube_id:b},v=Fe.getBySong(m);return v&&(v.song.youtube_id=b,v.setDownloading(),v.progress=0,v.message=""),ve.download(y).then(h=>{const k=Fe.getBySong(y);if(h.status===200){const R=h.data;return k&&(k.setWebURL(ve.downloadFileURL(R)),k.setFilename(R),k.setDownloaded()),{song:y,filename:R}}return k&&k.setError(),{song:y,filename:null}}).catch(h=>{console.error("retryWithAudio error:",h.message);const k=Fe.getBySong(y);return k&&k.setError(),{song:y,filename:null}})}function l(m){const b=String(m.song_id||m.url||"");Fe.removeSong(m),b&&ve.removeQueueItem(b).catch(()=>{})}async function a(){await ve.clearQueue(),Ke.value=[]}async function d(){await ve.clearCompletedQueue(),Ke.value=Ke.value.filter(m=>!m.isDownloaded())}function c(m){const b=Fe.getBySong(m);return b&&b.resetForRetry(),o(m)}function f(){const m=Ke.value.filter(b=>b.isErrored());for(const b of m)c(b.song);return m.length}return{fromURL:s,download:o,queue:r,retry:c,retryWithAudio:i,retryAllFailed:f,remove:l,clearAll:a,clearCompleted:d,loading:e}}const wb={class:"relative w-full"},kb=["placeholder"],Sb=["disabled"],Br={__name:"SearchInput",props:{compact:{type:Boolean,default:!1}},setup(e){const t=Ho(),n=wi(),{t:s,locale:o}=St(),r=["https://open.spotify.com/track/4vfN00PlILRXy5dcXHQE9M","drugs - EDEN","Não Gosto Eu Amo - Henrique e Juliano","Perfect - Ed Sheeran","Lightning Crashes - Live"],i=te(0),l=be(()=>(o.value,i.value===0?s("search.placeholder"):r[i.value-1])),a=setInterval(()=>{i.value=(i.value+1)%(r.length+1)},5e3);oi(()=>clearInterval(a));function d(c){!c||!c.trim()||(t.isValidURL(c)?(n.fromURL(c),it.push({name:"Download"})):t.isValidSearch(c)&&it.push({name:"Search",params:{query:c}}))}return(c,f)=>(A(),T("div",wb,[Ee(p("input",{type:"text",placeholder:l.value,class:Ae(["input-modern",e.compact?"h-11 text-sm":"h-14 text-base"]),"onUpdate:modelValue":f[0]||(f[0]=m=>u(t).searchTerm.value=m),onKeyup:f[1]||(f[1]=np(m=>d(u(t).searchTerm.value),["enter"]))},null,42,kb),[[rt,u(t).searchTerm.value]]),p("button",{class:Ae(["absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm transition hover:scale-105 active:scale-95 disabled:opacity-60",e.compact?"h-9 w-9":"h-11 w-11"]),disabled:u(n).loading.value,onClick:f[2]||(f[2]=m=>d(u(t).searchTerm.value))},[u(n).loading.value?(A(),T("span",{key:0,class:Ae(["loading loading-spinner",e.compact?"loading-xs":"loading-sm"])},null,2)):u(t).isValidURL(u(t).searchTerm.value)?(A(),ct(u(G),{key:1,icon:"clarity:download-line",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},null,8,["class"])):(A(),T("svg",{key:2,xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"2",stroke:"currentColor",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},[...f[3]||(f[3]=[p("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"},null,-1)])],2))],10,Sb)]))}},Eb={class:"relative flex min-h-[calc(100dvh-4rem)] items-center justify-center px-6 pt-24 pb-16 overflow-hidden"},Ab={class:"relative w-full max-w-2xl text-center animate-slide-up"},Rb={class:"mt-3 flex items-center justify-center gap-2"},Cb={class:"badge-soft"},Tb={class:"badge-neutral-soft"},Pb={class:"mx-auto mt-5 max-w-md text-balance text-base sm:text-lg text-base-content/70"},Ob={class:"mt-10"},Db={class:"mt-4 flex flex-wrap items-center justify-center gap-2 text-xs text-base-content/60"},Nb={class:"pill bg-white/5 border border-white/10"},Ib={class:"pill bg-white/5 border border-white/10"},$b={class:"pill bg-white/5 border border-white/10"},Lb={__name:"Hero",setup(e){const{t}=St(),n=te(localStorage.getItem("version")||"2.7.0");return Zt(()=>{const s=localStorage.getItem("version");s&&(n.value=s)}),(s,o)=>(A(),T("section",Eb,[o[4]||(o[4]=p("div",{"aria-hidden":"true",class:"pointer-events-none absolute inset-0 -z-10"},[p("div",{class:"absolute left-1/2 top-1/4 -translate-x-1/2 h-[420px] w-[420px] rounded-full bg-primary/25 blur-[120px]"}),p("div",{class:"absolute right-10 bottom-12 h-64 w-64 rounded-full bg-primary/10 blur-3xl"})],-1)),p("div",Ab,[o[3]||(o[3]=mf('

    Downtify

    ',2)),p("div",Rb,[p("span",Cb,"v"+w(n.value),1),p("span",Tb,w(u(t)("hero.noAccount")),1)]),p("p",Pb,w(u(t)("hero.tagline")),1),p("div",Ob,[M(Br,{class:"w-full"}),p("div",Db,[p("span",Nb,[o[0]||(o[0]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.songs")),1)]),p("span",Ib,[o[1]||(o[1]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.albums")),1)]),p("span",$b,[o[2]||(o[2]=p("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Re(" "+w(u(t)("hero.playlists")),1)])])])])]))}},Fb={class:"absolute top-0 inset-x-0 z-30"},Mb={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Ub={class:"ml-auto flex items-center gap-1 sm:gap-2"},Bb=["title"],Hb=["title"],jb=["title"],qb=["title"],Vb={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},Wb=["title"],Kb=["title"],zb={__name:"NavbarFront",setup(e){const t=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),n=Is(),{t:s}=St();return(o,r)=>(A(),T("header",Fb,[p("div",Mb,[r[5]||(r[5]=p("div",{class:"flex items-center gap-2"},[p("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"}),p("span",{class:"text-lg font-bold tracking-tight"},"Downtify")],-1)),p("div",Ub,[p("button",{class:"icon-btn",onClick:r[0]||(r[0]=i=>u(it).push({name:"List"})),title:u(s)("nav.library")},[M(u(G),{icon:"clarity:library-line",class:"h-5 w-5"})],8,Bb),p("button",{class:"icon-btn",onClick:r[1]||(r[1]=i=>u(it).push({name:"Player"})),title:u(s)("nav.player")},[M(u(G),{icon:"clarity:headphones-line",class:"h-5 w-5"})],8,Hb),p("button",{class:"icon-btn",onClick:r[2]||(r[2]=i=>u(it).push({name:"Monitor"})),title:u(s)("nav.monitor")},[M(u(G),{icon:"clarity:eye-line",class:"h-5 w-5"})],8,jb),p("button",{class:"icon-btn relative",onClick:r[3]||(r[3]=i=>u(it).push({name:"Download"})),title:u(s)("nav.queue")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"}),u(n).downloadQueue.value.length>0?(A(),T("span",Vb,w(u(n).downloadQueue.value.length),1)):ie("",!0)],8,qb),p("button",{class:"icon-btn",onClick:r[4]||(r[4]=i=>u(t).setTheme(u(t).currentTheme.value==="dark"?"light":"dark")),title:u(t).currentTheme.value==="dark"?u(s)("nav.switchToLight"):u(s)("nav.switchToDark")},[u(t).currentTheme.value==="dark"?(A(),ct(u(G),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(G),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,Wb),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(s)("nav.settings")},[M(u(G),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,Kb)])])]))}},Eu=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Qb={components:{NavbarFront:zb,Hero:Lb},setup(){return Zt(()=>{window.scroll(0,0)}),{}}};function Gb(e,t,n,s,o,r){const i=xr("NavbarFront"),l=xr("Hero");return A(),T("div",null,[M(i),M(l)])}const Jb=Eu(Qb,[["render",Gb]]),Yb={class:"sticky top-0 z-30 glass-nav"},Xb={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Zb=["title"],e_={class:"hidden md:flex flex-1 justify-center"},t_={class:"ml-auto flex items-center gap-1 sm:gap-2"},n_=["title"],s_=["title"],o_=["title"],r_=["title"],i_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},l_=["title"],a_=["title"],c_={class:"md:hidden px-4 pb-3"},$s={__name:"Navbar",setup(e){const t=ku(),n=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),s=Is(),o=Ho(),{t:r}=St();return(i,l)=>(A(),T("header",Yb,[p("div",Xb,[p("button",{class:"flex items-center gap-2 shrink-0",onClick:l[0]||(l[0]=a=>u(it).push({name:"Home"})),title:u(r)("nav.home")},[...l[6]||(l[6]=[p("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"},null,-1),p("span",{class:"hidden sm:inline text-lg font-bold tracking-tight"}," Downtify ",-1)])],8,Zb),p("div",e_,[M(Br,{class:"w-full max-w-md",compact:!0})]),p("div",t_,[p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="List"}]),onClick:l[1]||(l[1]=a=>u(it).push({name:"List"})),title:u(r)("nav.library")},[M(u(G),{icon:"clarity:library-line",class:"h-5 w-5"})],10,n_),p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Player"}]),onClick:l[2]||(l[2]=a=>u(it).push({name:"Player"})),title:u(r)("nav.player")},[M(u(G),{icon:"clarity:headphones-line",class:"h-5 w-5"})],10,s_),p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Monitor"}]),onClick:l[3]||(l[3]=a=>u(it).push({name:"Monitor"})),title:u(r)("nav.monitor")},[M(u(G),{icon:"clarity:eye-line",class:"h-5 w-5"})],10,o_),p("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(t).name==="Download"}]),onClick:l[4]||(l[4]=a=>u(t).name==="Download"?u(it).push({name:"Search",params:{query:u(o).searchTerm.value||" "}}):u(it).push({name:"Download"})),title:u(r)("nav.queue")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"}),u(s).downloadQueue.value.length>0?(A(),T("span",i_,w(u(s).downloadQueue.value.length),1)):ie("",!0)],10,r_),p("button",{class:"icon-btn",onClick:l[5]||(l[5]=a=>u(n).setTheme(u(n).currentTheme.value==="dark"?"light":"dark")),title:u(n).currentTheme.value==="dark"?u(r)("nav.switchToLight"):u(r)("nav.switchToDark")},[u(n).currentTheme.value==="dark"?(A(),ct(u(G),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(G),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,l_),p("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(r)("nav.settings")},[M(u(G),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,a_)])]),p("div",c_,[M(Br,{compact:!0})])]))}},u_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},d_={class:"mb-8"},f_={class:"text-2xl font-bold tracking-tight"},p_={class:"mt-1 text-sm text-base-content/60"},h_={class:"text-base-content/90 font-medium"},m_={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},g_={key:1,class:"space-y-3"},y_={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},v_={class:"text-base-content/50 text-sm"},b_={class:"text-base-content/40 text-xs mt-1"},__={key:3,class:"space-y-2"},x_={class:"track-cover"},w_=["src","alt"],k_={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},S_={class:"flex-1 min-w-0"},E_={class:"flex items-center gap-2 mb-0.5"},A_={class:"font-semibold truncate"},R_={key:0,class:"badge-error-soft shrink-0"},C_={class:"text-xs text-base-content/70 truncate"},T_={key:0,class:"text-xs text-base-content/40 truncate"},P_={key:0,class:"text-base-content/30"},O_={class:"flex items-center gap-1 shrink-0"},D_=["href","title"],N_=["title"],I_=["onClick","title"],$_={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},L_=["disabled","title"],F_=["onClick"],M_=["disabled","title"],fr=5,U_={__name:"SearchList",props:["data","error"],emits:["download"],setup(e,{emit:t}){const n=e,s=t,o=Ho(),r=Is(),{t:i}=St(),l=te(1),a=be(()=>{var b;return Math.ceil((((b=n.data)==null?void 0:b.length)||0)/fr)}),d=be(()=>{if(!n.data)return[];const b=(l.value-1)*fr;return n.data.slice(b,b+fr)});Mt(()=>n.data,()=>{l.value=1});function c(b){return Array.isArray(b.artists)&&b.artists.length?b.artists.join(", "):b.artist||i("common.unknownArtist")}function f(b){const y=r.getBySong(b);return y?y.isErrored()?"error":(y.isDownloaded(),"queued"):"idle"}function m(b){s("download",b)}return(b,y)=>{var v;return A(),T("div",u_,[p("div",d_,[p("h1",f_,w(u(i)("search.title")),1),p("p",p_,[u(o).searchTerm.value?(A(),T(de,{key:0},[Re(w(u(i)("search.matchesFor"))+" ",1),p("span",h_,' "'+w(u(o).searchTerm.value)+'" ',1),!u(o).isSearching.value&&(((v=n.data)==null?void 0:v.length)||0)>0?(A(),T(de,{key:0},[Re(w(n.data.length===1?u(i)("search.songsCount",{count:n.data.length}):u(i)("search.songsCountPlural",{count:n.data.length})),1)],64)):ie("",!0)],64)):(A(),T(de,{key:1},[Re(w(u(i)("search.typeToBegin")),1)],64))])]),n.error?(A(),T("div",m_,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),p("span",null,w(u(o).errorValue.value?u(i)("search.errorWithDetail",{detail:u(o).errorValue.value}):u(i)("search.error")),1)])):ie("",!0),u(o).isSearching.value?(A(),T("div",g_,[(A(),T(de,null,Ie(5,h=>p("div",{key:h,class:"skeleton h-24 rounded-2xl"})),64))])):!n.data||n.data.length===0?(A(),T("div",y_,[M(u(G),{icon:"clarity:search-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",v_,w(u(i)("search.empty")),1),p("p",b_,w(u(i)("search.emptyHint")),1)])):(A(),T("ul",__,[(A(!0),T(de,null,Ie(d.value,(h,k)=>(A(),T("li",{key:h.song_id||k,class:"surface rounded-2xl track-card"},[p("div",x_,[h.cover_url?(A(),T("img",{key:0,src:h.cover_url,alt:h.name,class:"h-full w-full object-cover",loading:"lazy"},null,8,w_)):(A(),T("div",k_,[M(u(G),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),p("div",S_,[p("div",E_,[p("span",A_,w(h.name),1),h.explicit?(A(),T("span",R_,"E")):ie("",!0)]),p("p",C_,w(c(h)),1),h.album_name?(A(),T("p",T_,[Re(w(h.album_name)+" ",1),h.year?(A(),T("span",P_," · "+w(h.year),1)):ie("",!0)])):ie("",!0)]),p("div",O_,[h.url?(A(),T("a",{key:0,class:"icon-btn",href:h.url,target:"_blank",rel:"noopener",title:u(i)("search.openOnSpotify")},[M(u(G),{icon:"clarity:pop-out-line",class:"h-4 w-4"})],8,D_)):ie("",!0),f(h)==="queued"?(A(),T("button",{key:1,class:"icon-btn text-primary cursor-default",title:u(i)("search.inQueue"),disabled:""},[M(u(G),{icon:"clarity:check-circle-line",class:"h-5 w-5"})],8,N_)):(A(),T("button",{key:2,class:"icon-btn text-primary hover:bg-primary/10",onClick:R=>m(h),title:u(i)("search.download")},[M(u(G),{icon:"clarity:download-line",class:"h-5 w-5"})],8,I_))])]))),128))])),a.value>1?(A(),T("nav",$_,[p("button",{class:"icon-btn",disabled:l.value===1,onClick:y[0]||(y[0]=h=>l.value--),title:u(i)("search.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,L_),(A(!0),T(de,null,Ie(a.value,h=>(A(),T("button",{key:h,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",h===l.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:k=>l.value=h},w(h),11,F_))),128)),p("button",{class:"icon-btn",disabled:l.value===a.value,onClick:y[1]||(y[1]=h=>l.value++),title:u(i)("search.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,M_)])):ie("",!0)])}}},B_={class:"min-h-screen"},H_={__name:"Search",setup(e){Zt(()=>window.scroll(0,0));const t=ku(),n=Ho(),s=wi();return Mt(()=>t.params.query,()=>{t.params.query&&n.searchFor(t.params.query)},{deep:!0}),n.searchFor(t.params.query),(o,r)=>(A(),T("div",B_,[M($s),M(zn),M(U_,{data:u(n).results.value,error:u(n).error.value,onDownload:r[0]||(r[0]=i=>u(s).queue(i))},null,8,["data","error"])]))}},j_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},q_={class:"mb-6 flex flex-wrap items-end justify-between gap-4"},V_={class:"text-2xl font-bold tracking-tight"},W_={class:"mt-1 text-sm text-base-content/60"},K_={key:0,class:"flex flex-wrap gap-2 justify-end"},z_=["title"],Q_={key:0,class:"mb-6 flex flex-wrap gap-2",role:"tablist"},G_=["onClick"],J_={key:0,class:"ml-1 opacity-80 tabular-nums"},Y_={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},X_={class:"text-base-content/50 text-sm"},Z_={class:"text-base-content/40 text-xs mt-1"},e0={key:2,class:"surface rounded-2xl p-8 text-center text-sm text-base-content/50"},t0={key:3,class:"space-y-3"},n0={class:"flex items-center gap-4"},s0={class:"track-cover h-16 w-16 sm:h-20 sm:w-20 shrink-0"},o0=["src","alt"],r0={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},i0={class:"flex-1 min-w-0"},l0={class:"flex items-center gap-2 mb-0.5 flex-wrap"},a0={class:"font-semibold truncate"},c0={class:"text-xs text-base-content/60 truncate"},u0={key:0,class:"text-xs text-base-content/40 truncate"},d0={key:1,class:"text-xs text-error/80 mt-1 line-clamp-2"},f0={class:"flex items-center gap-2 shrink-0"},p0=["title","onClick"],h0=["onClick","title"],m0={class:"text-[10px] font-semibold"},g0=["onClick","title"],y0={key:0,class:"mt-3 pt-3 border-t border-white/10 flex flex-wrap gap-2 items-center"},v0=["onUpdate:modelValue","placeholder"],b0=["onClick"],_0=["onClick"],x0=["onClick"],w0={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},k0=["disabled","title"],S0=["onClick"],E0=["disabled","title"],pr=10,A0={__name:"DownloadList",setup(e){const t=Is(),n=wi(),{t:s}=St(),o=te("active"),r=te(1),i=Ln({}),l=Ln({});function a($){return $.isErrored()?"failed":$.isDownloaded()?"done":$.isQueued()?"queued":"active"}const d=be(()=>t.downloadQueue.value.filter($=>a($)==="done").length),c=be(()=>t.downloadQueue.value.filter($=>a($)==="failed").length),f=be(()=>t.downloadQueue.value.filter($=>a($)==="active").length),m=be(()=>[{id:"active",label:s("queue.filterActive"),count:f.value},{id:"queued",label:s("queue.filterQueued"),count:t.downloadQueue.value.filter($=>a($)==="queued").length},{id:"all",label:s("queue.filterAll"),count:t.downloadQueue.value.length},{id:"done",label:s("queue.filterDone"),count:d.value},{id:"failed",label:s("queue.filterFailed"),count:c.value}]),b=be(()=>{const $=t.downloadQueue.value;switch(o.value){case"all":return $;case"active":return $.filter(K=>a(K)==="active");case"queued":return $.filter(K=>a(K)==="queued");case"done":return $.filter(K=>a(K)==="done");case"failed":return $.filter(K=>a(K)==="failed");default:return $}}),y=be(()=>Math.ceil(b.value.length/pr)),v=be(()=>{const $=(r.value-1)*pr;return b.value.slice($,$+pr)});Mt(o,()=>{r.value=1}),Mt(()=>b.value.length,()=>{r.value>y.value&&y.value>0&&(r.value=y.value),r.value<1&&(r.value=1)}),Mt(()=>t.downloadQueue.value.length,$=>{$===0?o.value="active":o.value==="active"&&f.value===0&&c.value>0&&(o.value="failed")});async function h(){confirm(s("queue.clearAllPrompt"))&&await n.clearAll()}async function k(){await n.clearCompleted()}function R(){n.retryAllFailed()}function S($){return Array.isArray($.artists)&&$.artists.length?$.artists.join(", "):$.artist||s("common.unknownArtist")}function C($){return $.isErrored()?"badge-error-soft":$.isDownloaded()||a($)==="active"?"badge-soft":"badge-neutral-soft"}function L($){const K=a($);return K==="active"&&$.message?$.message:$.isErrored()?s("queue.statusFailed"):$.isDownloaded()?s("queue.statusDone"):s(K==="active"?"queue.statusActive":"queue.statusQueued")}function P($){const K=String($||"").match(/(?:v=|youtu\.be\/)([A-Za-z0-9_-]{6,})/);return K?K[1]:null}function U($){const K=$.song.song_id,H=P(l[K]);if(!H){alert(s("queue.invalidYouTubeURL"));return}i[K]=!1,n.retryWithAudio($.song,H)}function ae($){const K=document.createElement("a");K.href=$,K.download=ve.downloadSaveName($),document.body.appendChild(K),K.click(),document.body.removeChild(K)}return($,K)=>(A(),T("div",j_,[p("div",q_,[p("div",null,[p("h1",V_,w(u(s)("queue.title")),1),p("p",W_,w(u(s)("queue.subtitle")),1)]),u(t).downloadQueue.value.length>0?(A(),T("div",K_,[c.value>0?(A(),T("button",{key:0,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:R},[M(u(G),{icon:"clarity:refresh-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(s)("queue.retryAllFailed",{count:c.value})),1)])):ie("",!0),d.value>0?(A(),T("button",{key:1,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:k},w(u(s)("queue.clearCompleted",{count:d.value})),1)):ie("",!0),p("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 text-error/70 hover:text-error",onClick:h,title:u(s)("queue.clearAll")},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(s)("queue.clearAll")),1)],8,z_)])):ie("",!0)]),u(t).downloadQueue.value.length>0?(A(),T("div",Q_,[(A(!0),T(de,null,Ie(m.value,H=>(A(),T("button",{key:H.id,type:"button",class:Ae(["btn btn-sm rounded-full border-white/10",o.value===H.id?"btn-primary":"bg-base-100/85 hover:bg-base-100"]),onClick:q=>o.value=H.id},[Re(w(H.label)+" ",1),H.count>0?(A(),T("span",J_,"("+w(H.count)+")",1)):ie("",!0)],10,G_))),128))])):ie("",!0),u(t).downloadQueue.value.length===0?(A(),T("div",Y_,[M(u(G),{icon:"clarity:download-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",X_,w(u(s)("queue.empty")),1),p("p",Z_,w(u(s)("queue.emptyHint")),1)])):b.value.length===0?(A(),T("div",e0,w(u(s)("queue.emptyFilter")),1)):(A(),T("ul",t0,[(A(!0),T(de,null,Ie(v.value,(H,q)=>(A(),T("li",{key:H.song.song_id||H.song.url||q,class:"surface rounded-2xl p-3 sm:p-4"},[p("div",n0,[p("div",s0,[H.song.cover_url?(A(),T("img",{key:0,src:H.song.cover_url,alt:H.song.name,class:"h-full w-full object-cover"},null,8,o0)):(A(),T("div",r0,[M(u(G),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),p("div",i0,[p("div",l0,[p("span",a0,w(H.song.name),1),p("span",{class:Ae([C(H),"shrink-0"])},w(L(H)),3)]),p("p",c0,w(S(H.song)),1),H.song.album_name?(A(),T("p",u0,w(H.song.album_name),1)):ie("",!0),H.isErrored()&&H.message?(A(),T("p",d0,w(H.message),1)):ie("",!0)]),p("div",f0,[H.isErrored()?(A(),T("button",{key:0,class:"icon-btn text-primary hover:bg-primary/10",title:u(s)("queue.retry"),onClick:se=>u(n).retry(H.song)},[M(u(G),{icon:"clarity:refresh-line",class:"h-4 w-4"})],8,p0)):ie("",!0),H.isDownloaded()?(A(),T("a",{key:1,class:"icon-btn text-primary hover:bg-primary/10",href:"javascript:;",onClick:se=>ae(H.web_download_url),title:u(s)("queue.saveToDevice")},[M(u(G),{icon:"clarity:download-line",class:"h-4 w-4"})],8,h0)):a(H)==="active"?(A(),T("div",{key:2,class:"radial-progress text-primary",style:$n(`--value:${Math.max(0,H.progress)}; --size:2.75rem; --thickness:3px`)},[p("span",m0,w(Math.round(H.progress))+"% ",1)],4)):ie("",!0),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",onClick:se=>u(n).remove(H.song),title:u(s)("queue.removeFromQueue")},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,g0)])]),H.isErrored()&&i[H.song.song_id]?(A(),T("div",y0,[Ee(p("input",{"onUpdate:modelValue":se=>l[H.song.song_id]=se,type:"text",class:"input input-sm flex-1 min-w-[12rem] rounded-xl bg-base-100/80",placeholder:u(s)("queue.overridePlaceholder")},null,8,v0),[[rt,l[H.song.song_id]]]),p("button",{class:"btn btn-sm btn-primary rounded-full",onClick:se=>U(H)},w(u(s)("queue.applyOverride")),9,b0),p("button",{class:"btn btn-sm btn-ghost rounded-full",onClick:se=>i[H.song.song_id]=!1},w(u(s)("common.cancel")),9,_0)])):H.isErrored()?(A(),T("button",{key:1,type:"button",class:"mt-2 text-xs text-primary/80 hover:text-primary",onClick:se=>i[H.song.song_id]=!0},w(u(s)("queue.forceAudio")),9,x0)):ie("",!0)]))),128))])),y.value>1?(A(),T("nav",w0,[p("button",{class:"icon-btn",disabled:r.value===1,onClick:K[0]||(K[0]=H=>r.value--),title:u(s)("common.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,k0),(A(!0),T(de,null,Ie(y.value,H=>(A(),T("button",{key:H,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",H===r.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:q=>r.value=H},w(H),11,S0))),128)),p("button",{class:"icon-btn",disabled:r.value===y.value,onClick:K[1]||(K[1]=H=>r.value++),title:u(s)("common.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,E0)])):ie("",!0)]))}},R0={class:"min-h-screen"},C0={__name:"Download",setup(e){return Zt(()=>window.scroll(0,0)),(t,n)=>(A(),T("div",R0,[M($s),M(zn),M(A0)]))}},Au="downtify-player-volume",qe=te([]),st=te(-1),vo=te(!1),Ls=te(0),un=te(0),ki=te(parseFloat(localStorage.getItem(Au)||"0.85")),In=te(!1),Qn=te("off"),dn=te(!1);let _e=null,vt=[],jo=0;function qo(){return _e||(_e=new Audio,_e.preload="metadata",_e.volume=ki.value,_e.addEventListener("timeupdate",()=>{Ls.value=_e.currentTime}),_e.addEventListener("loadedmetadata",()=>{un.value=isFinite(_e.duration)?_e.duration:0}),_e.addEventListener("durationchange",()=>{un.value=isFinite(_e.duration)?_e.duration:0}),_e.addEventListener("ended",F0),_e.addEventListener("play",()=>{vo.value=!0}),_e.addEventListener("pause",()=>{vo.value=!1}),_e)}function Hr(e){const t=e.replace(/\.[^.]+$/,"");let n="",s=t;const o=t.indexOf(" - ");return o>0&&(n=t.slice(0,o).trim(),s=t.slice(o+3).trim()),{file:e,url:ve.downloadFileURL(e),cover:ve.coverFileURL(e),title:s,artist:n,album:""}}function Si(e){if(typeof e=="string")return Hr(e);const t=String((e==null?void 0:e.file)||""),n=Hr(t),s=String((e==null?void 0:e.title)||"").trim(),o=String((e==null?void 0:e.artist)||"").trim(),r=String((e==null?void 0:e.album)||"").trim();return{file:t,url:n.url,cover:n.cover,title:s||n.title,artist:o||n.artist,album:r||n.album}}function Fs(){const e=qe.value.map((t,n)=>n);for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}vt=e,jo=st.value>=0?Math.max(0,vt.indexOf(st.value)):0}function T0(e,t={}){const n=(e||[]).map(s=>typeof s=="string"?Hr(s):Si(s));qe.value=n,st.value>=n.length&&(st.value=-1),dn.value&&Fs(),typeof t.startIndex=="number"?qn(t.startIndex):t.autoplay&&n.length>0&&st.value<0&&qn(0)}function qn(e){if(e<0||e>=qe.value.length)return;const t=qo();if(st.value=e,dn.value){vt.length!==qe.value.length&&Fs();const n=vt.indexOf(e);n>=0&&(jo=n)}t.src=qe.value[e].url,t.currentTime=0,Ls.value=0,t.play().catch(()=>{})}function Ru(){if(qe.value.length===0)return;const e=qo();if(st.value<0){qn(0);return}e.src||(e.src=qe.value[st.value].url),e.play().catch(()=>{})}function Ei(){_e&&_e.pause()}function P0(){vo.value?Ei():Ru()}function Vo(e){const t=qo(),n=un.value||0,s=Math.max(0,Math.min(n,e));t.currentTime=s,Ls.value=s}function O0(e){un.value&&Vo(un.value*Math.max(0,Math.min(1,e)))}function D0(e){const t=Math.max(0,Math.min(1,e));ki.value=t,_e&&(_e.volume=t);try{localStorage.setItem(Au,String(t))}catch{}t>0&&In.value&&(In.value=!1,_e&&(_e.muted=!1))}function N0(){In.value=!In.value,_e&&(_e.muted=In.value)}function I0(){if(qe.value.length===0)return-1;if(dn.value){vt.length!==qe.value.length&&Fs();const t=(jo+1)%vt.length;return vt[t]}const e=st.value+1;return e>=qe.value.length?Qn.value==="all"?0:-1:e}function $0(){if(qe.value.length===0)return-1;if(dn.value){vt.length!==qe.value.length&&Fs();const t=(jo-1+vt.length)%vt.length;return vt[t]}const e=st.value-1;return e<0?Qn.value==="all"?qe.value.length-1:0:e}function Cu(){const e=I0();if(e<0){Ei();return}qn(e)}function L0(){if(qo().currentTime>3){Vo(0);return}const t=$0();t<0||qn(t)}function F0(){if(Qn.value==="one"){Vo(0),_e&&_e.play().catch(()=>{});return}Cu()}function Tu(e){["off","all","one"].includes(e)&&(Qn.value=e)}function M0(){const e=["off","all","one"],t=e.indexOf(Qn.value);Tu(e[(t+1)%e.length])}function Pu(e){dn.value=!!e,dn.value&&Fs()}function U0(){Pu(!dn.value)}const B0=be(()=>st.value>=0&&st.valueun.value>0?Ls.value/un.value*100:0);function pa(e){if(!isFinite(e)||e<0)return"0:00";const t=Math.floor(e),n=Math.floor(t/60),s=t%60;return`${n}:${s.toString().padStart(2,"0")}`}function Ou(){return{playlist:qe,currentIndex:st,currentTrack:B0,isPlaying:vo,currentTime:Ls,duration:un,progressPct:H0,volume:ki,isMuted:In,repeatMode:Qn,shuffle:dn,setPlaylist:T0,playAt:qn,play:Ru,pause:Ei,toggle:P0,seek:Vo,seekRatio:O0,setVolume:D0,toggleMute:N0,next:Cu,prev:L0,setRepeat:Tu,cycleRepeat:M0,setShuffle:Pu,toggleShuffle:U0}}const j0={class:"min-h-screen"},q0={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},V0={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},W0={class:"text-2xl font-bold tracking-tight"},K0={class:"mt-1 text-sm text-base-content/60"},z0={class:"flex items-center gap-2"},Q0=["title"],G0=["disabled"],J0={key:0,class:"loading loading-spinner loading-xs mr-2"},Y0={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},X0={key:1,class:"space-y-3"},Z0={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},ex={class:"text-base-content/50 text-sm"},tx={class:"text-base-content/40 text-xs mt-1"},nx={key:3,class:"space-y-2"},sx={class:"relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden"},ox=["src","alt","onError"],rx={class:"flex-1 min-w-0"},ix={class:"text-sm font-medium truncate block"},lx={key:0,class:"text-xs text-base-content/60 truncate"},ax={class:"text-xs text-base-content/40"},cx={key:0,class:"mr-2 text-primary/70"},ux={class:"flex items-center gap-1 shrink-0"},dx=["onClick","title"],fx=["href","download","title"],px=["disabled","onClick","title"],hx={key:0,class:"loading loading-spinner loading-xs"},mx={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},gx=["disabled","title"],yx=["onClick"],vx=["disabled","title"],bx={key:5,class:"mt-6 text-xs text-base-content/40 text-center"},hr=10,_x={__name:"Downloads",setup(e){const{t}=St(),n=Ou(),s=_b(),o=te([]),r=te(!1),i=te(""),l=te({}),a=te({}),d=te(1),c=be(()=>Math.ceil(o.value.length/hr)),f=be(()=>{const C=(d.value-1)*hr;return o.value.slice(C,C+hr)});Mt(o,()=>{d.value=1});function m(C){return ve.coverFileURL(C)}function b(C){a.value={...a.value,[C]:!0}}async function y(){r.value=!0,i.value="";try{const C=await ve.listDownloads();o.value=(C.data||[]).map(Si)}catch{i.value=t("library.failedLoad")}finally{r.value=!1}}async function v(C){if(confirm(t("library.deletePrompt",{file:C}))){l.value={...l.value,[C]:!0};try{await ve.deleteDownload(C),o.value=o.value.filter(L=>L!==C)}catch{i.value=t("library.failedDelete",{file:C})}finally{l.value={...l.value,[C]:!1}}}}function h(C){const L=C.lastIndexOf(".");return L>0?C.slice(L+1).toUpperCase():""}function k(C){const L=C.lastIndexOf("/");return L>=0?C.slice(0,L):""}function R(C){const L=o.value.findIndex(P=>P.file===C.file);L<0||(n.setPlaylist(o.value,{startIndex:L}),s.push({name:"Player"}))}function S(){o.value.length&&(n.setPlaylist(o.value,{startIndex:0}),s.push({name:"Player"}))}return Zt(y),(C,L)=>(A(),T("div",j0,[M($s),M(zn),p("div",q0,[p("div",V0,[p("div",null,[p("h1",W0,w(u(t)("library.title")),1),p("p",K0,w(u(t)("library.subtitle")),1)]),p("div",z0,[o.value.length>0?(A(),T("button",{key:0,class:"btn btn-primary btn-sm h-11 px-5 rounded-full",onClick:S,title:u(t)("library.play")},[M(u(G),{icon:"clarity:play-line",class:"h-4 w-4 mr-1.5"}),Re(" "+w(u(t)("library.play")),1)],8,Q0)):ie("",!0),p("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:y,disabled:r.value},[r.value?(A(),T("span",J0)):(A(),ct(u(G),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4 mr-2"})),Re(" "+w(u(t)("common.refresh")),1)],8,G0)])]),i.value?(A(),T("div",Y0,[M(u(G),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),p("span",null,w(i.value),1)])):ie("",!0),r.value&&o.value.length===0?(A(),T("div",X0,[(A(),T(de,null,Ie(4,P=>p("div",{key:P,class:"skeleton h-16 rounded-2xl"})),64))])):o.value.length===0?(A(),T("div",Z0,[M(u(G),{icon:"clarity:library-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",ex,w(u(t)("library.empty")),1),p("p",tx,w(u(t)("library.emptyHint")),1)])):(A(),T("ul",nx,[(A(!0),T(de,null,Ie(f.value,P=>(A(),T("li",{key:P.file,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-3"},[p("div",sx,[a.value[P.file]?(A(),ct(u(G),{key:1,icon:"clarity:music-note-line",class:"h-5 w-5"})):(A(),T("img",{key:0,src:m(P.file),alt:P.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:U=>b(P.file)},null,40,ox))]),p("div",rx,[p("span",ix,w(P.title),1),P.artist?(A(),T("p",lx,w(P.artist),1)):ie("",!0),p("span",ax,[k(P.file)?(A(),T("span",cx,[M(u(G),{icon:"clarity:folder-line",class:"inline h-3 w-3 mr-0.5 align-text-top"}),Re(w(k(P.file)),1)])):ie("",!0),Re(" "+w(h(P.file)),1)])]),p("div",ux,[p("button",{class:"icon-btn text-primary hover:bg-primary/10",onClick:U=>R(P),title:u(t)("library.play")},[M(u(G),{icon:"clarity:play-line",class:"h-4 w-4"})],8,dx),p("a",{class:"icon-btn",href:u(ve).downloadFileURL(P.file),download:u(ve).downloadSaveName(P.file),title:u(t)("library.downloadToDevice")},[M(u(G),{icon:"clarity:download-line",class:"h-4 w-4"})],8,fx),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",disabled:l.value[P.file]===!0,onClick:U=>v(P.file),title:u(t)("library.deleteFile")},[l.value[P.file]===!0?(A(),T("span",hx)):(A(),ct(u(G),{key:1,icon:"clarity:trash-line",class:"h-4 w-4"}))],8,px)])]))),128))])),c.value>1?(A(),T("nav",mx,[p("button",{class:"icon-btn",disabled:d.value===1,onClick:L[0]||(L[0]=P=>d.value--),title:u(t)("common.previousPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,gx),(A(!0),T(de,null,Ie(c.value,P=>(A(),T("button",{key:P,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",P===d.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:U=>d.value=P},w(P),11,yx))),128)),p("button",{class:"icon-btn",disabled:d.value===c.value,onClick:L[1]||(L[1]=P=>d.value++),title:u(t)("common.nextPage")},[M(u(G),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,vx)])):ie("",!0),o.value.length>0?(A(),T("p",bx,w(o.value.length===1?u(t)("library.countOne",{count:o.value.length}):u(t)("library.countMany",{count:o.value.length})),1)):ie("",!0)])]))}},Ms=Pe.create({baseURL:`${Ge.PROTOCOL}//${Ge.BACKEND}:${Ge.PORT}${Ge.BASEURL}`});function xx(){return Ms.get("/api/monitor/playlists")}function wx(e,t=60){return Ms.post("/api/monitor/playlists",{url:e,interval_minutes:t})}function kx(e,t){return Ms.patch(`/api/monitor/playlists/${e}`,t)}function Sx(e){return Ms.delete(`/api/monitor/playlists/${e}`)}function Ex(e){return Ms.post(`/api/monitor/playlists/${e}/check`)}const yn={listMonitoredPlaylists:xx,addMonitoredPlaylist:wx,updateMonitoredPlaylist:kx,deleteMonitoredPlaylist:Sx,checkMonitoredPlaylist:Ex},Ax={class:"min-h-screen"},Rx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},Cx={class:"mb-8"},Tx={class:"text-2xl font-bold tracking-tight"},Px={class:"mt-1 text-sm text-base-content/60"},Ox={class:"surface rounded-2xl p-5 mb-8"},Dx={class:"text-sm font-semibold uppercase tracking-wider text-base-content/50 mb-4"},Nx=["placeholder","disabled"],Ix={class:"flex items-center gap-2 shrink-0"},$x=["disabled"],Lx={value:15},Fx={value:30},Mx={value:60},Ux={value:180},Bx={value:360},Hx={value:720},jx={value:1440},qx={value:10080},Vx={value:20160},Wx={value:43200},Kx=["disabled"],zx={key:0,class:"loading loading-spinner loading-xs"},Qx={key:1},Gx={key:0,class:"mt-2 text-xs text-error"},Jx={key:0,class:"space-y-3"},Yx={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},Xx={class:"text-base-content/50 text-sm"},Zx={class:"text-base-content/40 text-xs mt-1"},ew={key:2,class:"space-y-3"},tw={class:"flex-1 min-w-0"},nw={class:"flex items-center gap-2 mb-1"},sw={class:"font-semibold truncate"},ow={class:"flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-base-content/50"},rw={key:0},iw={key:1,class:"italic"},lw={class:"flex items-center gap-2 shrink-0"},aw=["value","onChange"],cw={value:15},uw={value:30},dw={value:60},fw={value:180},pw={value:360},hw={value:720},mw={value:1440},gw={value:10080},yw={value:20160},vw={value:43200},bw=["title","onClick"],_w=["title","disabled","onClick"],xw={key:0,class:"loading loading-spinner loading-xs"},ww=["title","onClick"],kw={class:"mt-8 surface rounded-2xl p-4 flex gap-3 text-sm text-base-content/60"},Sw={__name:"Monitor",setup(e){const{t}=St(),n=te([]),s=te(!1),o=te(!1),r=te(""),i=te(""),l=te(60),a=te({});async function d(){s.value=!0;try{const k=await yn.listMonitoredPlaylists();n.value=k.data||[]}finally{s.value=!1}}async function c(){var k,R;r.value="",o.value=!0;try{const S=await yn.addMonitoredPlaylist(i.value.trim(),l.value);n.value.unshift(S.data),i.value=""}catch(S){r.value=((R=(k=S==null?void 0:S.response)==null?void 0:k.data)==null?void 0:R.detail)||t("monitor.failedAdd")}finally{o.value=!1}}async function f(k){try{const R=await yn.updateMonitoredPlaylist(k.id,{enabled:!k.enabled});Object.assign(k,R.data)}catch{}}async function m(k,R){const S=parseInt(R.target.value,10);try{const C=await yn.updateMonitoredPlaylist(k.id,{interval_minutes:S});Object.assign(k,C.data)}catch{}}async function b(k){a.value={...a.value,[k.id]:!0};try{await yn.checkMonitoredPlaylist(k.id),setTimeout(async()=>{try{const R=await yn.listMonitoredPlaylists();n.value=R.data||[]}finally{a.value={...a.value,[k.id]:!1}}},3e3)}catch{a.value={...a.value,[k.id]:!1}}}async function y(k){if(confirm(t("monitor.deletePrompt",{name:k.name})))try{await yn.deleteMonitoredPlaylist(k.id),n.value=n.value.filter(R=>R.id!==k.id)}catch{}}function v(k){if(k<60)return`${k} ${t("monitor.minSuffix")}`;if(k<1440)return`${k/60} ${t("monitor.hourSuffix")}`;if(k<10080){const S=k/1440;return`${S} ${t(S===1?"monitor.daySuffix":"monitor.daysSuffix")}`}if(k<43200){const S=k/10080;return`${S} ${t(S===1?"monitor.weekSuffix":"monitor.weeksSuffix")}`}const R=Math.round(k/43200);return`${R} ${t(R===1?"monitor.monthSuffix":"monitor.monthsSuffix")}`}function h(k){try{const R=Date.now()-new Date(k).getTime(),S=Math.floor(R/6e4);if(S<1)return t("monitor.timeJustNow");if(S<60)return t("monitor.timeMinAgo",{n:S});const C=Math.floor(S/60);return C<24?t("monitor.timeHourAgo",{n:C}):t("monitor.timeDayAgo",{n:Math.floor(C/24)})}catch{return""}}return Zt(d),(k,R)=>(A(),T("div",Ax,[M($s),M(zn),p("div",Rx,[p("div",Cx,[p("h1",Tx,w(u(t)("monitor.title")),1),p("p",Px,w(u(t)("monitor.subtitle")),1)]),p("div",Ox,[p("h2",Dx,w(u(t)("monitor.watchNew")),1),p("form",{onSubmit:ep(c,["prevent"]),class:"flex flex-col sm:flex-row gap-3"},[Ee(p("input",{"onUpdate:modelValue":R[0]||(R[0]=S=>i.value=S),type:"text",placeholder:u(t)("monitor.urlPlaceholder"),class:"input-modern flex-1 h-11 text-sm",disabled:o.value},null,8,Nx),[[rt,i.value]]),p("div",Ix,[Ee(p("select",{"onUpdate:modelValue":R[1]||(R[1]=S=>l.value=S),class:"select select-sm rounded-full border border-white/10 bg-base-100/85 focus:border-primary/60 h-11 px-3 text-sm",disabled:o.value},[p("option",Lx,w(u(t)("monitor.every15")),1),p("option",Fx,w(u(t)("monitor.every30")),1),p("option",Mx,w(u(t)("monitor.every1h")),1),p("option",Ux,w(u(t)("monitor.every3h")),1),p("option",Bx,w(u(t)("monitor.every6h")),1),p("option",Hx,w(u(t)("monitor.every12h")),1),p("option",jx,w(u(t)("monitor.every1d")),1),p("option",qx,w(u(t)("monitor.every1w")),1),p("option",Vx,w(u(t)("monitor.every2w")),1),p("option",Wx,w(u(t)("monitor.every1mo")),1)],8,$x),[[Xs,l.value]]),p("button",{type:"submit",class:"btn btn-primary btn-sm h-11 px-5 rounded-full",disabled:o.value||!i.value.trim()},[o.value?(A(),T("span",zx)):(A(),T("span",Qx,w(u(t)("monitor.watch")),1))],8,Kx)])],32),r.value?(A(),T("p",Gx,w(r.value),1)):ie("",!0)]),s.value?(A(),T("div",Jx,[(A(),T(de,null,Ie(3,S=>p("div",{key:S,class:"skeleton h-24 rounded-2xl"})),64))])):n.value.length===0?(A(),T("div",Yx,[M(u(G),{icon:"clarity:music-note-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",Xx,w(u(t)("monitor.empty")),1),p("p",Zx,w(u(t)("monitor.emptyHint")),1)])):(A(),T("ul",ew,[(A(!0),T(de,null,Ie(n.value,S=>(A(),T("li",{key:S.id,class:"surface rounded-2xl p-4 sm:p-5 flex flex-col sm:flex-row sm:items-center gap-4"},[p("div",tw,[p("div",nw,[p("span",sw,w(S.name),1),p("span",{class:Ae(["pill shrink-0",S.enabled?"badge-soft":"badge-neutral-soft"])},w(S.enabled?u(t)("monitor.active"):u(t)("monitor.paused")),3)]),p("div",ow,[p("span",null,[M(u(G),{icon:"clarity:refresh-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(u(t)("monitor.everyInterval",{interval:v(S.interval_minutes)})),1)]),p("span",null,[M(u(G),{icon:"clarity:music-note-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(S.last_track_count===1?u(t)("monitor.tracksOne",{count:S.last_track_count}):u(t)("monitor.tracksMany",{count:S.last_track_count})),1)]),S.last_checked?(A(),T("span",rw,[M(u(G),{icon:"clarity:clock-line",class:"inline h-3 w-3 mr-0.5"}),Re(" "+w(u(t)("monitor.checked",{when:h(S.last_checked)})),1)])):(A(),T("span",iw,w(u(t)("monitor.notChecked")),1))])]),p("div",lw,[p("select",{value:S.interval_minutes,onChange:C=>m(S,C),class:"select select-xs rounded-full border border-white/10 bg-base-100/60 text-xs focus:border-primary/60"},[p("option",cw,w(u(t)("monitor.short15")),1),p("option",uw,w(u(t)("monitor.short30")),1),p("option",dw,w(u(t)("monitor.short1h")),1),p("option",fw,w(u(t)("monitor.short3h")),1),p("option",pw,w(u(t)("monitor.short6h")),1),p("option",hw,w(u(t)("monitor.short12h")),1),p("option",mw,w(u(t)("monitor.short1d")),1),p("option",gw,w(u(t)("monitor.short1w")),1),p("option",yw,w(u(t)("monitor.short2w")),1),p("option",vw,w(u(t)("monitor.short1mo")),1)],40,aw),p("button",{class:"icon-btn",title:S.enabled?u(t)("monitor.pause"):u(t)("monitor.resume"),onClick:C=>f(S)},[M(u(G),{icon:S.enabled?"clarity:pause-line":"clarity:play-line",class:"h-4 w-4"},null,8,["icon"])],8,bw),p("button",{class:"icon-btn",title:u(t)("monitor.checkNow"),disabled:a.value[S.id],onClick:C=>b(S)},[a.value[S.id]?(A(),T("span",xw)):(A(),ct(u(G),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4"}))],8,_w),p("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",title:u(t)("monitor.stop"),onClick:C=>y(S)},[M(u(G),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,ww)])]))),128))])),p("div",kw,[M(u(G),{icon:"clarity:info-standard-line",class:"h-5 w-5 shrink-0 mt-0.5 text-primary/70"}),p("p",null,w(u(t)("monitor.info")),1)])])]))}},Ew={class:"min-h-screen"},Aw={class:"mx-auto max-w-5xl px-4 py-8 sm:px-6"},Rw={class:"mb-8"},Cw={class:"text-2xl font-bold tracking-tight"},Tw={class:"mt-1 text-sm text-base-content/60"},Pw={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},Ow={class:"text-base-content/50 text-sm"},Dw={class:"text-base-content/40 text-xs mt-1"},Nw={key:1,class:"space-y-3"},Iw={key:2,class:"grid gap-6 lg:grid-cols-[1fr_360px]"},$w={class:"surface rounded-3xl p-6 sm:p-8 flex flex-col items-center text-center"},Lw=["src","alt"],Fw={key:2,class:"absolute bottom-3 right-3 equalizer h-5","aria-hidden":"true"},Mw={class:"mt-6 w-full"},Uw={class:"text-xl font-bold tracking-tight truncate"},Bw={class:"text-sm text-base-content/60 truncate mt-0.5"},Hw={class:"mt-6 w-full"},jw={class:"mt-2 flex items-center justify-between text-xs text-base-content/50 tabular-nums"},qw={class:"mt-5 flex items-center justify-center gap-3"},Vw=["title"],Ww=["title","disabled"],Kw=["disabled","title"],zw=["title","disabled"],Qw=["title"],Gw={key:0,class:"absolute -bottom-0.5 -right-0.5 h-4 min-w-[1rem] px-1 rounded-full bg-primary text-primary-content text-[9px] font-bold flex items-center justify-center"},Jw={class:"mt-6 w-full max-w-xs flex items-center gap-3"},Yw=["title"],Xw=["value","title"],Zw={class:"surface rounded-3xl p-4 sm:p-5 lg:max-h-[640px] lg:overflow-y-auto"},e1={class:"flex items-center justify-between mb-3 px-1"},t1={class:"text-xs font-semibold uppercase tracking-wider text-base-content/50"},n1={class:"text-[11px] text-base-content/40"},s1={key:0,class:"space-y-1"},o1=["onClick"],r1=["src","alt","onError"],i1={key:1,class:"relative equalizer h-3","aria-hidden":"true"},l1={class:"flex-1 min-w-0"},a1={class:"text-sm truncate font-medium"},c1={class:"text-[11px] truncate text-base-content/50"},u1={key:1,class:"text-center py-10"},d1={class:"text-base-content/50 text-sm"},f1={__name:"Player",setup(e){const{t}=St(),n=Ou(),s=te([]),o=te(!1),r=te(null),i=te({});let l=!1;function a(L){return ve.coverFileURL(L)}function d(L){i.value={...i.value,[L]:!0}}async function c(){o.value=!0;try{const L=await ve.listDownloads();s.value=(L.data||[]).map(Si),n.playlist.value.length===0&&s.value.length>0&&n.setPlaylist(s.value)}finally{o.value=!1}}function f(L){var P,U;n.playlist.value.length!==s.value.length||((P=n.playlist.value[L])==null?void 0:P.file)!==((U=s.value[L])==null?void 0:U.file)?n.setPlaylist(s.value,{startIndex:L}):n.playAt(L)}const m=be(()=>{const L=n.currentTrack.value;return L&&L.title?L.title:t("player.empty")}),b=be(()=>{const L=n.currentTrack.value;return L&&L.artist?L.artist:L?t("common.unknownArtist"):""}),y=be(()=>n.repeatMode.value==="one"?t("player.repeatOne"):n.repeatMode.value==="all"?t("player.repeatAll"):t("player.repeatOff"));function v(L){n.setVolume(parseFloat(L.target.value))}function h(L){const P=r.value;if(!P)return 0;const U=P.getBoundingClientRect(),ae=(L.clientX||0)-U.left;return Math.max(0,Math.min(1,ae/U.width))}function k(L){n.seekRatio(h(L))}function R(L){l=!0,n.seekRatio(h(L)),window.addEventListener("pointermove",S),window.addEventListener("pointerup",C,{once:!0})}function S(L){l&&n.seekRatio(h(L))}function C(){l=!1,window.removeEventListener("pointermove",S)}return Zt(()=>{window.scroll(0,0),c()}),ri(()=>{window.removeEventListener("pointermove",S)}),(L,P)=>(A(),T("div",Ew,[M($s),M(zn),p("div",Aw,[p("div",Rw,[p("h1",Cw,w(u(t)("player.title")),1),p("p",Tw,w(u(t)("player.subtitle")),1)]),s.value.length===0&&!o.value?(A(),T("div",Pw,[M(u(G),{icon:"clarity:headphones-line",class:"h-12 w-12 text-base-content/20 mb-4"}),p("p",Ow,w(u(t)("player.empty")),1),p("p",Dw,w(u(t)("player.emptyHint")),1)])):o.value&&!u(n).currentTrack.value?(A(),T("div",Nw,[...P[8]||(P[8]=[p("div",{class:"skeleton h-72 rounded-3xl"},null,-1),p("div",{class:"skeleton h-16 rounded-2xl"},null,-1),p("div",{class:"skeleton h-16 rounded-2xl"},null,-1)])])):(A(),T("div",Iw,[p("section",$w,[p("div",{class:Ae(["relative h-56 w-56 sm:h-64 sm:w-64 rounded-3xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden shadow-glow",{"pulse-glow":u(n).isPlaying.value}])},[u(n).currentTrack.value&&u(n).currentTrack.value.cover&&!i.value[u(n).currentTrack.value.file]?(A(),T("img",{key:0,src:u(n).currentTrack.value.cover,alt:u(n).currentTrack.value.title,class:"absolute inset-0 h-full w-full object-cover",onError:P[0]||(P[0]=U=>d(u(n).currentTrack.value.file))},null,40,Lw)):(A(),ct(u(G),{key:1,icon:"clarity:music-note-line",class:"h-24 w-24"})),u(n).isPlaying.value?(A(),T("div",Fw,[...P[9]||(P[9]=[p("span",null,null,-1),p("span",null,null,-1),p("span",null,null,-1)])])):ie("",!0)],2),p("div",Mw,[p("p",Uw,w(m.value),1),p("p",Bw,w(b.value),1)]),p("div",Hw,[p("div",{class:"relative h-2 rounded-full bg-white/10 overflow-hidden cursor-pointer group",ref_key:"progressBar",ref:r,onClick:k,onPointerdown:R},[p("div",{class:"h-full bg-primary transition-[width] duration-150",style:$n(`width: ${u(n).progressPct.value}%`)},null,4),p("div",{class:"absolute top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded-full bg-primary shadow-glow-sm transition-all duration-150 opacity-0 group-hover:opacity-100",style:$n(`left: calc(${u(n).progressPct.value}% - 7px)`)},null,4)],544),p("div",jw,[p("span",null,w(u(pa)(u(n).currentTime.value)),1),p("span",null,w(u(pa)(u(n).duration.value)),1)])]),p("div",qw,[p("button",{class:Ae(["icon-btn",{"icon-btn-active":u(n).shuffle.value}]),onClick:P[1]||(P[1]=U=>u(n).toggleShuffle()),title:u(n).shuffle.value?u(t)("player.shuffleOn"):u(t)("player.shuffleOff")},[M(u(G),{icon:"clarity:shuffle-line",class:"h-5 w-5"})],10,Vw),p("button",{class:"icon-btn",onClick:P[2]||(P[2]=U=>u(n).prev()),title:u(t)("player.previous"),disabled:s.value.length===0},[M(u(G),{icon:"clarity:step-forward-2-line",class:"h-5 w-5 -scale-x-100"})],8,Ww),p("button",{class:"inline-flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm hover:scale-105 active:scale-95 transition disabled:opacity-50",onClick:P[3]||(P[3]=U=>u(n).toggle()),disabled:s.value.length===0,title:u(n).isPlaying.value?u(t)("player.pause"):u(t)("player.play")},[M(u(G),{icon:u(n).isPlaying.value?"clarity:pause-solid":"clarity:play-solid",class:"h-6 w-6"},null,8,["icon"])],8,Kw),p("button",{class:"icon-btn",onClick:P[4]||(P[4]=U=>u(n).next()),title:u(t)("player.next"),disabled:s.value.length===0},[M(u(G),{icon:"clarity:step-forward-2-line",class:"h-5 w-5"})],8,zw),p("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(n).repeatMode.value!=="off"}]),onClick:P[5]||(P[5]=U=>u(n).cycleRepeat()),title:y.value},[M(u(G),{icon:"clarity:refresh-line",class:"h-5 w-5"}),u(n).repeatMode.value==="one"?(A(),T("span",Gw," 1 ")):ie("",!0)],10,Qw)]),p("div",Jw,[p("button",{class:"icon-btn",onClick:P[6]||(P[6]=U=>u(n).toggleMute()),title:u(n).isMuted.value?u(t)("player.unmute"):u(t)("player.mute")},[M(u(G),{icon:u(n).isMuted.value||u(n).volume.value===0?"clarity:volume-mute-line":u(n).volume.value<.5?"clarity:volume-down-line":"clarity:volume-up-line",class:"h-5 w-5"},null,8,["icon"])],8,Yw),p("input",{type:"range",min:"0",max:"1",step:"0.01",value:u(n).isMuted.value?0:u(n).volume.value,onInput:P[7]||(P[7]=U=>v(U)),class:"player-range flex-1",title:u(t)("player.volume")},null,40,Xw)])]),p("aside",Zw,[p("div",e1,[p("h2",t1,w(u(t)("player.queue")),1),p("span",n1,w(s.value.length===1?u(t)("player.countOne",{count:s.value.length}):u(t)("player.countMany",{count:s.value.length})),1)]),s.value.length>0?(A(),T("ul",s1,[(A(!0),T(de,null,Ie(s.value,(U,ae)=>(A(),T("li",{key:U.file,class:Ae(["rounded-xl px-2 py-2 flex items-center gap-3 cursor-pointer transition-colors",ae===u(n).currentIndex.value?"bg-primary/10 text-primary":"hover:bg-white/5"]),onClick:$=>f(ae)},[p("div",{class:Ae(["relative h-9 w-9 shrink-0 rounded-lg overflow-hidden flex items-center justify-center",ae===u(n).currentIndex.value?"bg-primary/15":"bg-base-100/60"])},[i.value[U.file]?ie("",!0):(A(),T("img",{key:0,src:a(U.file),alt:U.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:$=>d(U.file)},null,40,r1)),ae===u(n).currentIndex.value&&u(n).isPlaying.value?(A(),T("span",i1,[...P[10]||(P[10]=[p("span",null,null,-1),p("span",null,null,-1),p("span",null,null,-1)])])):i.value[U.file]?(A(),ct(u(G),{key:2,icon:"clarity:music-note-line",class:"h-4 w-4 text-base-content/50"})):ie("",!0)],2),p("div",l1,[p("p",a1,w(U.title),1),p("p",c1,w(U.artist||u(t)("common.unknownArtist")),1)])],10,o1))),128))])):(A(),T("div",u1,[p("p",d1,w(u(t)("player.empty")),1)]))])]))])]))}},p1=Eu(f1,[["__scopeId","data-v-98956c70"]]),h1=[{path:"/",name:"Home",component:Jb},{path:"/search/:query",name:"Search",component:H_},{path:"/download",name:"Download",component:C0},{path:"/list",name:"List",component:_x},{path:"/monitor",name:"Monitor",component:Sw},{path:"/player",name:"Player",component:p1}],it=bb({history:Yv(Ge.BASEURL),routes:h1}),Du=rp(pv);Du.use(it);Du.mount("#app"); diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 0017cf9..eee027e 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -5,7 +5,7 @@ Downtify - + diff --git a/frontend/src/components/DownloadList.vue b/frontend/src/components/DownloadList.vue index 0c2026b..b3fa9f6 100644 --- a/frontend/src/components/DownloadList.vue +++ b/frontend/src/components/DownloadList.vue @@ -158,7 +158,7 @@
    @@ -166,10 +166,6 @@ {{ Math.round(item.progress) }}%
    - + +

    + {{ youtubeCookiesError }} +

    + +
    - -
    - - {{ t('settings.youtubeSection') }} - - {{ t('settings.youtubeCookiesSummary') }} - - -
    -

    - {{ t('settings.youtubeCookiesHint') }} -

    -

    - {{ t('settings.youtubeCookiesReady') }} -

    -

    - {{ t('settings.youtubeCookiesWeak') }} -

    -

    - {{ t('settings.youtubeCookiesMissing') }} -

    - - -
    - - -
    -

    - {{ youtubeCookiesError }} -

    -
    -
    -
    + +
    + +
    +

    + {{ t('settings.youtubeCookiesHint') }} +

    +

    + {{ t('settings.youtubeCookiesWeak') }} +

    +

    + {{ t('settings.youtubeCookiesMissing') }} +

    + +
    + + +
    +

    + {{ youtubeCookiesError }} +

    +
    +
    + Boolean(sm.settings.value?.youtube?.cookies_looks_authenticated) ) -const youtubeCookiesOpen = computed( - () => youtubeCookiesReady.value || Boolean(youtubeCookiesPath.value) -) const { t, locale, setLocale, locales } = useI18n() const NAVIDROME_DEFAULTS = { diff --git a/frontend/src/i18n/locales/en.js b/frontend/src/i18n/locales/en.js index 5643be0..08a5817 100644 --- a/frontend/src/i18n/locales/en.js +++ b/frontend/src/i18n/locales/en.js @@ -194,12 +194,10 @@ export default { saveError: "Couldn't save settings.", language: 'Language', languageHint: 'Choose the interface language', - youtubeSection: 'YouTube cookies (optional)', - youtubeCookiesSummary: - 'Not required for most downloads. May help when a YouTube fallback is age-restricted.', + youtubeAdvancedToggle: 'Advanced: YouTube cookies (optional)', + youtubeCookiesConfigured: 'on', youtubeCookiesHint: - 'Only needed in a few cases (age-verified sign-in on youtube.com). Export Netscape cookies.txt from a private window (single tab: youtube.com/robots.txt), upload here, or mount at the path below. Most tracks work without this.', - youtubeCookiesPath: 'Cookies file path (inside container)', + 'Rarely needed — only some age-restricted YouTube fallbacks. Export cookies.txt from youtube.com if required.', youtubeCookiesPathPlaceholder: '/data/youtube-cookies.txt', youtubeCookiesUpload: 'Upload cookies.txt', youtubeCookiesClear: 'Remove cookies', diff --git a/frontend/src/i18n/locales/es.js b/frontend/src/i18n/locales/es.js index ba48b80..5ff8540 100644 --- a/frontend/src/i18n/locales/es.js +++ b/frontend/src/i18n/locales/es.js @@ -197,12 +197,10 @@ export default { saveError: 'No se pudieron guardar los ajustes.', language: 'Idioma', languageHint: 'Elige el idioma de la interfaz', - youtubeSection: 'Cookies de YouTube (opcional)', - youtubeCookiesSummary: - 'No hace falta en la mayoría de descargas. Puede ayudar si el fallback de YouTube exige edad.', + youtubeAdvancedToggle: 'Avanzado: cookies de YouTube (opcional)', + youtubeCookiesConfigured: 'activo', youtubeCookiesHint: - 'Solo en casos puntuales (cuenta verificada en youtube.com). Exporta cookies.txt Netscape en ventana privada (una pestaña: youtube.com/robots.txt) o monta la ruta. La mayoría de pistas funcionan sin esto.', - youtubeCookiesPath: 'Ruta del archivo de cookies (en el contenedor)', + 'Casi nunca hace falta — solo algunos fallbacks de YouTube con edad. Exporta cookies.txt de youtube.com si lo necesitas.', youtubeCookiesPathPlaceholder: '/data/youtube-cookies.txt', youtubeCookiesUpload: 'Subir cookies.txt', youtubeCookiesClear: 'Quitar cookies', diff --git a/frontend/src/i18n/locales/pt-BR.js b/frontend/src/i18n/locales/pt-BR.js index c79dcf1..a1c7b6d 100644 --- a/frontend/src/i18n/locales/pt-BR.js +++ b/frontend/src/i18n/locales/pt-BR.js @@ -196,12 +196,10 @@ export default { saveError: 'Não foi possível salvar as configurações.', language: 'Idioma', languageHint: 'Escolha o idioma da interface', - youtubeSection: 'Cookies do YouTube (opcional)', - youtubeCookiesSummary: - 'Não é necessário na maioria das baixas. Pode ajudar quando o fallback do YouTube exige idade.', + youtubeAdvancedToggle: 'Avançado: cookies do YouTube (opcional)', + youtubeCookiesConfigured: 'ativo', youtubeCookiesHint: - 'Só em casos raros (conta verificada em youtube.com). Exporte cookies.txt Netscape em janela privada (uma aba: youtube.com/robots.txt) ou monte o caminho. A maioria das faixas funciona sem isso.', - youtubeCookiesPath: 'Caminho do arquivo de cookies (no container)', + 'Quase nunca necessário — só alguns fallbacks do YouTube com idade. Exporte cookies.txt de youtube.com se precisar.', youtubeCookiesPathPlaceholder: '/data/youtube-cookies.txt', youtubeCookiesUpload: 'Enviar cookies.txt', youtubeCookiesClear: 'Remover cookies', From e56e9a69830c86c6d4f3045ab2e06032ac2f0b1f Mon Sep 17 00:00:00 2001 From: dx616b Date: Thu, 28 May 2026 23:39:20 +0200 Subject: [PATCH 23/58] Style YouTube cookies like other Settings toggle sections. Use the same section header and checkbox card as slskd/navidrome; expand upload fields only when the toggle is on. Co-authored-by: Cursor --- frontend/dist/assets/index-BfwHuem5.css | 1 + frontend/dist/assets/index-F6u2nS5A.css | 1 - .../{index-CDknlPfS.js => index-pD3TceX1.js} | 26 +-- frontend/dist/index.html | 4 +- frontend/src/components/Settings.vue | 151 ++++++++++-------- frontend/src/i18n/locales/en.js | 9 +- frontend/src/i18n/locales/es.js | 9 +- frontend/src/i18n/locales/pt-BR.js | 9 +- 8 files changed, 118 insertions(+), 92 deletions(-) create mode 100644 frontend/dist/assets/index-BfwHuem5.css delete mode 100644 frontend/dist/assets/index-F6u2nS5A.css rename frontend/dist/assets/{index-CDknlPfS.js => index-pD3TceX1.js} (63%) diff --git a/frontend/dist/assets/index-BfwHuem5.css b/frontend/dist/assets/index-BfwHuem5.css new file mode 100644 index 0000000..5bb4fe3 --- /dev/null +++ b/frontend/dist/assets/index-BfwHuem5.css @@ -0,0 +1 @@ +@import"https://rsms.me/inter/inter.css";.page-enter-active,.page-leave-active{transition:opacity .25s ease,transform .25s ease}.page-enter-from,.page-leave-to{opacity:0;transform:translateY(8px)}.player-range[data-v-98956c70]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#ffffff1a;height:4px;border-radius:9999px;outline:none}[data-theme=downtify-light] .player-range[data-v-98956c70]{background:#0000001a}.player-range[data-v-98956c70]::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;height:14px;width:14px;border-radius:9999px;background:#1ad05c;cursor:pointer;box-shadow:0 0 12px #1ad05c73}.player-range[data-v-98956c70]::-moz-range-thumb{height:14px;width:14px;border-radius:9999px;background:#1ad05c;border:none;cursor:pointer;box-shadow:0 0 12px #1ad05c73}.pulse-glow[data-v-98956c70]{animation:glow-98956c70 2.4s ease-in-out infinite}@keyframes glow-98956c70{0%,to{box-shadow:0 0 36px #1ad05c4d}50%{box-shadow:0 0 60px #1ad05c8c}}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color: oklch(0% 0 0)){:root{color-scheme:light;--fallback-p: #491eff;--fallback-pc: #d4dbff;--fallback-s: #ff41c7;--fallback-sc: #fff9fc;--fallback-a: #00cfbd;--fallback-ac: #00100d;--fallback-n: #2b3440;--fallback-nc: #d7dde4;--fallback-b1: #ffffff;--fallback-b2: #e5e6e6;--fallback-b3: #e5e6e6;--fallback-bc: #1f2937;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--fallback-p: #7582ff;--fallback-pc: #050617;--fallback-s: #ff71cf;--fallback-sc: #190211;--fallback-a: #00c7b5;--fallback-ac: #000e0c;--fallback-n: #2a323c;--fallback-nc: #a6adbb;--fallback-b1: #1d232a;--fallback-b2: #191e24;--fallback-b3: #15191e;--fallback-bc: #a6adbb;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,transparent) transparent}*:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,transparent) transparent}:root{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 19.4918% .049187 153.969854;--s: 71.366% .019176 261.324645;--sc: 14.4788% 0 0;--a: 75.0492% .208056 148.653144;--ac: 19.4918% .049187 153.969854;--n: 18.2204% 0 0;--nc: 92.7582% .005814 264.531291;--b1: 20.9036% 0 0;--b2: 17.7638% 0 0;--b3: 0% 0 0;--bc: 96.7434% .001326 286.375246;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}[data-theme=downtify-dark]{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 19.4918% .049187 153.969854;--s: 71.366% .019176 261.324645;--sc: 14.4788% 0 0;--a: 75.0492% .208056 148.653144;--ac: 19.4918% .049187 153.969854;--n: 18.2204% 0 0;--nc: 92.7582% .005814 264.531291;--b1: 20.9036% 0 0;--b2: 17.7638% 0 0;--b3: 0% 0 0;--bc: 96.7434% .001326 286.375246;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}[data-theme=downtify-light]{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 100% 0 0;--s: 47.8359% 0 0;--sc: 100% 0 0;--a: 74.4235% .210286 148.118822;--ac: 100% 0 0;--n: 23.9292% 0 0;--nc: 96.7434% .001326 286.375246;--b1: 100% 0 0;--b2: 97.2666% .001711 247.839212;--b3: 94.2414% .004574 258.325042;--bc: 20.7682% .039824 265.754874;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}html,body{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"cv02","cv03","cv04","cv11"}body{background-image:radial-gradient(circle at 0% 0%,rgba(26,208,92,.15),transparent 45%),radial-gradient(circle at 100% 0%,rgba(26,208,92,.08),transparent 55%),radial-gradient(circle at 50% 100%,rgba(26,208,92,.07),transparent 60%);background-attachment:fixed;min-height:100dvh}[data-theme=downtify-light] body{background-image:radial-gradient(circle at 0% 0%,rgba(26,208,92,.18),transparent 35%),radial-gradient(circle at 100% 0%,rgba(26,208,92,.12),transparent 45%),radial-gradient(circle at 50% 100%,rgba(26,208,92,.08),transparent 55%)}::selection{background-color:#1ad05c59;color:#fff}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#ffffff14;border-radius:9999px}::-webkit-scrollbar-thumb:hover{background:#1ad05c73}[data-theme=downtify-light] ::-webkit-scrollbar-thumb{background:#0000001f}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.alert{display:grid;width:100%;grid-auto-flow:row;align-content:flex-start;align-items:center;justify-items:center;gap:1rem;text-align:center;border-radius:var(--rounded-box, 1rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));padding:1rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-b2,oklch(var(--b2)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1));background-color:var(--alert-bg)}@media (min-width: 640px){.alert{grid-auto-flow:column;grid-template-columns:auto minmax(auto,1fr);justify-items:start;text-align:start}}.avatar.placeholder>div{display:flex;align-items:center;justify-content:center}.badge{display:inline-flex;align-items:center;justify-content:center;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;height:1.25rem;font-size:.875rem;line-height:1.25rem;width:fit-content;padding-left:.563rem;padding-right:.563rem;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}@media (hover:hover){.checkbox-primary:hover{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.label a:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.tab:hover{--tw-text-opacity: 1}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-color:transparent;border-color:oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn, 1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));--tw-bg-opacity: 1;--tw-border-opacity: 1}.btn-disabled,.btn[disabled],.btn:disabled{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box, 1rem)}.card:focus{outline:2px solid transparent;outline-offset:2px}.card figure{display:flex;align-items:center;justify-content:center}.card.image-full{display:grid}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;object-fit:cover}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.checkbox{flex-shrink:0;--chkbg: var(--fallback-bc,oklch(var(--bc)/1));--chkfg: var(--fallback-b1,oklch(var(--b1)/1));height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2}.diff{position:relative;display:grid;width:100%;overflow:hidden;direction:ltr;container-type:inline-size;grid-template-columns:auto 1fr}@media (hover: hover){.btm-nav>*.disabled:hover,.btm-nav>*[disabled]:hover{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:hover{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,black)}}@supports not (color: oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn.glass:hover{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost:hover{border-color:transparent}@supports (color: oklch(0% 0 0)){.btn-ghost:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}}.btn-outline:hover{--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary:hover{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.btn-outline.btn-secondary:hover{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-secondary:hover{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}}.btn-outline.btn-accent:hover{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-accent:hover{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn-outline.btn-success:hover{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-success:hover{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black)}}.btn-outline.btn-info:hover{--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-info:hover{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black)}}.btn-outline.btn-warning:hover{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-warning:hover{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black)}}.btn-outline.btn-error:hover{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-error:hover{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black)}}.btn-disabled:hover,.btn[disabled]:hover,.btn:disabled:hover{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}@supports (color: color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.tab[disabled],.tab[disabled]:hover{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}}.footer{display:grid;width:100%;grid-auto-flow:row;place-items:start;column-gap:1rem;row-gap:2.5rem;font-size:.875rem;line-height:1.25rem}.footer>*{display:grid;place-items:start;gap:.5rem}@media (min-width: 48rem){.footer{grid-auto-flow:column}.footer-center{grid-auto-flow:row dense}}.label{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.hero{display:grid;width:100%;place-items:center;background-size:cover;background-position:center}.hero>*{grid-column-start:1;grid-row-start:1}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input[type=number]::-webkit-inner-spin-button,.input-md[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.input-sm[type=number]::-webkit-inner-spin-button{margin-top:0;margin-bottom:0;margin-inline-end:-0px}.join{display:inline-flex;align-items:stretch;border-radius:var(--rounded-btn, .5rem)}.join :where(.join-item){border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:not(:first-child):not(:last-child),.join *:not(:first-child):not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0}.join .dropdown .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .dropdown .join-item{border-start-end-radius:inherit;border-end-end-radius:inherit}.join :where(.join-item:first-child:not(:last-child)),.join :where(*:first-child:not(:last-child) .join-item){border-end-start-radius:inherit;border-start-start-radius:inherit}.join .join-item:last-child:not(:first-child),.join *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0}.join :where(.join-item:last-child:not(:first-child)),.join :where(*:last-child:not(:first-child) .join-item){border-start-end-radius:inherit;border-end-end-radius:inherit}@supports not selector(:has(*)){:where(.join *){border-radius:inherit}}@supports selector(:has(*)){:where(.join *:has(.join-item)){border-radius:inherit}}.link{cursor:pointer;text-decoration-line:underline}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}:where(.menu li) .badge{justify-self:end}.modal{pointer-events:none;position:fixed;top:0;right:0;bottom:0;left:0;margin:0;display:grid;height:100%;max-height:none;width:100%;max-width:none;justify-items:center;padding:0;opacity:0;overscroll-behavior:contain;z-index:999;background-color:transparent;color:inherit;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity,visibility;overflow-y:hidden}:where(.modal){align-items:center}.modal-box{max-height:calc(100vh - 5em);grid-column-start:1;grid-row-start:1;width:91.666667%;max-width:32rem;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));padding:1.5rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;box-shadow:#00000040 0 25px 50px -12px;overflow-y:auto;overscroll-behavior:contain}.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open]{pointer-events:auto;visibility:visible;opacity:1}.modal-toggle{position:fixed;height:0px;width:0px;-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden;scrollbar-gutter:stable}.progress{position:relative;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:hidden;height:.5rem;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.radial-progress{position:relative;display:inline-grid;height:var(--size);width:var(--size);place-content:center;border-radius:9999px;background-color:transparent;vertical-align:middle;box-sizing:content-box;--value: 0;--size: 5rem;--thickness: calc(var(--size) / 10)}.radial-progress::-moz-progress-bar{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress::-webkit-progress-value{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress::-webkit-progress-bar{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress:before,.radial-progress:after{position:absolute;border-radius:9999px;content:""}.radial-progress:before{top:0;right:0;bottom:0;left:0;background:radial-gradient(farthest-side,currentColor 98%,#0000) top/var(--thickness) var(--thickness) no-repeat,conic-gradient(currentColor calc(var(--value) * 1%),#0000 0);-webkit-mask:radial-gradient(farthest-side,#0000 calc(99% - var(--thickness)),#000 calc(100% - var(--thickness)));mask:radial-gradient(farthest-side,#0000 calc(99% - var(--thickness)),#000 calc(100% - var(--thickness)))}.radial-progress:after{inset:calc(50% - var(--thickness) / 2);transform:rotate(calc(var(--value) * 3.6deg - 90deg)) translate(calc(var(--size) / 2 - 50%));background-color:currentColor}.range{height:1.5rem;width:100%;cursor:pointer;-moz-appearance:none;appearance:none;-webkit-appearance:none;--range-shdw: var(--fallback-bc,oklch(var(--bc)/1));overflow:hidden;border-radius:var(--rounded-box, 1rem);background-color:transparent}.range:focus{outline:none}.select{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;min-height:3rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-size:4px 4px,4px 4px;background-repeat:no-repeat}.select[multiple]{height:auto}.steps .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-columns:auto;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-rows:40px 1fr;place-items:center;text-align:center;min-width:4rem}.tabs-lifted:has(.tab-content[class^=rounded-]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])),.tabs-lifted:has(.tab-content[class*=" rounded-"]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])){border-bottom-color:transparent}.tab{position:relative;grid-row-start:1;display:inline-flex;height:2rem;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;flex-wrap:wrap;align-items:center;justify-content:center;text-align:center;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem;--tw-text-opacity: .5;--tab-color: var(--fallback-bc,oklch(var(--bc)/1));--tab-bg: var(--fallback-b1,oklch(var(--b1)/1));--tab-border-color: var(--fallback-b3,oklch(var(--b3)/1));color:var(--tab-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem)}.tab:is(input[type=radio]){width:auto;border-bottom-right-radius:0;border-bottom-left-radius:0}.tab:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.tab:not(input):empty{cursor:default;grid-column-start:span 9999}input.tab:checked+.tab-content,:is(.tab-active,[aria-selected=true])+.tab-content{display:block}.toggle{flex-shrink:0;--tglbg: var(--fallback-b1,oklch(var(--b1)/1));--handleoffset: 1.5rem;--handleoffsetcalculator: calc(var(--handleoffset) * -1);--togglehandleborder: 0 0;height:1.5rem;width:3rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;border-color:currentColor;background-color:currentColor;color:var(--fallback-bc,oklch(var(--bc)/.5));transition:background,box-shadow var(--animation-input, .2s) ease-out;box-shadow:var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset,var(--togglehandleborder)}.badge-outline{border-color:currentColor;--tw-border-opacity: .5;background-color:transparent;color:currentColor}.badge-outline.badge-neutral{--tw-text-opacity: 1;color:var(--fallback-n,oklch(var(--n)/var(--tw-text-opacity)))}.badge-outline.badge-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.badge-outline.badge-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.badge-outline.badge-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.badge-outline.badge-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.badge-outline.badge-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.badge-outline.badge-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.badge-outline.badge-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btm-nav>*:where(.active){border-top-width:2px;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.btm-nav>*.disabled,.btm-nav>*[disabled]{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}@media (prefers-reduced-motion: no-preference){.btn{animation:button-pop var(--animation-btn, .25s) ease-out}}.btn:active:hover,.btn:active:focus{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale, .97))}@supports not (color: oklch(0% 0 0)){.btn{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}.btn-primary{--btn-color: var(--fallback-p)}.btn-secondary{--btn-color: var(--fallback-s)}.btn-accent{--btn-color: var(--fallback-a)}}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}.btn-outline.btn-secondary.btn-active{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}.btn-outline.btn-accent.btn-active{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}.btn-outline.btn-success.btn-active{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black)}.btn-outline.btn-info.btn-active{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black)}.btn-outline.btn-warning.btn-active{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black)}.btn-outline.btn-error.btn-active{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black)}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color: oklch(0% 0 0)){.btn-primary{--btn-color: var(--p)}.btn-secondary{--btn-color: var(--s)}.btn-accent{--btn-color: var(--a)}}.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)));outline-color:var(--fallback-s,oklch(var(--s)/1))}.btn-accent{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)));outline-color:var(--fallback-a,oklch(var(--a)/1))}.btn.glass{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost{border-width:1px;border-color:transparent;background-color:transparent;color:currentColor;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn-ghost.btn-active{border-color:transparent;background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.btn-outline{border-color:currentColor;background-color:transparent;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-outline.btn-active{--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.btn-outline.btn-secondary.btn-active{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.btn-outline.btn-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.btn-outline.btn-accent.btn-active{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.btn-outline.btn-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.btn-outline.btn-success.btn-active{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.btn-outline.btn-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.btn-outline.btn-info.btn-active{--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.btn-outline.btn-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.btn-outline.btn-warning.btn-active{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.btn-outline.btn-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btn-outline.btn-error.btn-active{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn[disabled],.btn:disabled{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale, .98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.checkbox:disabled{border-width:0px;cursor:not-allowed;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.2}.checkbox:checked,.checkbox[aria-checked=true]{background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,transparent 65%,var(--chkbg) 65.99%),linear-gradient(45deg,transparent 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,transparent 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,transparent 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%)}.checkbox:indeterminate{--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-image:linear-gradient(90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(-90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%)}.checkbox-primary{--chkbg: var(--fallback-p,oklch(var(--p)/1));--chkfg: var(--fallback-pc,oklch(var(--pc)/1));--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.checkbox-primary:focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}.checkbox-primary:checked,.checkbox-primary[aria-checked=true]{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}.input input{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:transparent}.input input:focus{outline:2px solid transparent;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input:focus,.input:focus-within{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:has(>input[disabled]),.input-disabled,.input:disabled,.input[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input:has(>input[disabled])::placeholder,.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1)}.link:focus{outline:2px solid transparent;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.\!loading{pointer-events:none!important;display:inline-block!important;aspect-ratio:1 / 1!important;width:1.5rem!important;background-color:currentColor!important;-webkit-mask-size:100%!important;mask-size:100%!important;-webkit-mask-repeat:no-repeat!important;mask-repeat:no-repeat!important;-webkit-mask-position:center!important;mask-position:center!important;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important;mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important}.loading{pointer-events:none;display:inline-block;aspect-ratio:1 / 1;width:1.5rem;background-color:currentColor;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-xs{width:1rem}.loading-sm{width:1.25rem}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;left:.5rem;top:50%;aspect-ratio:1 / 1;height:.75rem;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:2px;border-color:currentColor;opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{content:"";position:absolute;left:1.25rem;top:50%;height:.5rem;--tw-translate-y: 25%;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1px;border-color:currentColor;opacity:.6}.modal:not(dialog:not(.modal-open)),.modal::backdrop{background-color:#0006;animation:modal-pop .2s ease-out}.modal-backdrop{z-index:-1;grid-column-start:1;grid-row-start:1;display:grid;align-self:stretch;justify-self:stretch;color:transparent}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y: 0px;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes modal-pop{0%{opacity:0}}.progress::-moz-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate{--progress-color: var(--fallback-bc,oklch(var(--bc)/1));background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}.progress::-webkit-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:transparent}.progress::-webkit-progress-value{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate::-moz-progress-bar{background-color:transparent;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}@keyframes progress-loading{50%{background-position-x:-115%}}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}.range:focus-visible::-webkit-slider-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range:focus-visible::-moz-range-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range::-webkit-slider-runnable-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-moz-range-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-webkit-slider-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));-moz-appearance:none;appearance:none;-webkit-appearance:none;top:50%;color:var(--range-shdw);transform:translateY(-50%);--filler-size: 100rem;--filler-offset: .6rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}.range::-moz-range-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));top:50%;color:var(--range-shdw);--filler-size: 100rem;--filler-offset: .5rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select-disabled,.select:disabled,.select[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:calc(0% + 12px) calc(1px + 50%),calc(0% + 16px) calc(1px + 50%)}.skeleton{border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));will-change:background-position;animation:skeleton 1.8s ease-in-out infinite;background-image:linear-gradient(105deg,transparent 0%,transparent 40%,var(--fallback-b1,oklch(var(--b1)/1)) 50%,transparent 60%,transparent 100%);background-size:200% auto;background-repeat:no-repeat;background-position-x:-50%}@media (prefers-reduced-motion){.skeleton{animation-duration:15s}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}.steps .step:before{top:0;grid-column-start:1;grid-row-start:1;height:.5rem;width:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));content:"";margin-inline-start:-100%}.steps .step:after{content:counter(step);counter-increment:step;z-index:1;position:relative;grid-column-start:1;grid-row-start:1;display:grid;height:2rem;width:2rem;place-items:center;place-self:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.steps .step:first-child:before{content:none}.steps .step[data-content]:after{content:attr(data-content)}.tabs-lifted>.tab:focus-visible{border-end-end-radius:0;border-end-start-radius:0}.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tab:is(input:checked){border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: 1;--tw-text-opacity: 1}.tab:focus{outline:2px solid transparent;outline-offset:2px}.tab:focus-visible{outline:2px solid currentColor;outline-offset:-5px}.tab-disabled,.tab[disabled]{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.tabs-bordered>.tab{border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2;border-style:solid;border-bottom-width:calc(var(--tab-border, 1px) + 1px)}.tabs-lifted>.tab{border:var(--tab-border, 1px) solid transparent;border-width:0 0 var(--tab-border, 1px) 0;border-start-start-radius:var(--tab-radius, .5rem);border-start-end-radius:var(--tab-radius, .5rem);border-bottom-color:var(--tab-border-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem);padding-top:var(--tab-border, 1px)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tabs-lifted>.tab:is(input:checked){background-color:var(--tab-bg);border-width:var(--tab-border, 1px) var(--tab-border, 1px) 0 var(--tab-border, 1px);border-inline-start-color:var(--tab-border-color);border-inline-end-color:var(--tab-border-color);border-top-color:var(--tab-border-color);padding-inline-start:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-inline-end:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-bottom:var(--tab-border, 1px);padding-top:0}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked):before{z-index:1;content:"";display:block;position:absolute;width:calc(100% + var(--tab-radius, .5rem) * 2);height:var(--tab-radius, .5rem);bottom:0;background-size:var(--tab-radius, .5rem);background-position:top left,top right;background-repeat:no-repeat;--tab-grad: calc(69% - var(--tab-border, 1px));--radius-start: radial-gradient( circle at top left, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );--radius-end: radial-gradient( circle at top right, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );background-image:var(--radius-start),var(--radius-end)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,.tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-end);background-position:top right}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-start);background-position:top left}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,.tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-start);background-position:top left}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-end);background-position:top right}.tabs-lifted>:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled])+.tabs-lifted :is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked)+.tabs-lifted .tab:is(input:checked):before{background-image:var(--radius-end);background-position:top right}.tabs-boxed .tab{border-radius:var(--rounded-btn, .5rem)}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.active,.table-zebra tr.active:nth-child(2n),.table-zebra-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}[dir=rtl] .toggle{--handleoffsetcalculator: calc(var(--handleoffset) * 1)}.toggle:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.toggle:hover{background-color:currentColor}.toggle:checked,.toggle[aria-checked=true]{background-image:none;--handleoffsetcalculator: var(--handleoffset);--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}[dir=rtl] .toggle:checked,[dir=rtl] .toggle[aria-checked=true]{--handleoffsetcalculator: calc(var(--handleoffset) * -1)}.toggle:indeterminate{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}[dir=rtl] .toggle:indeterminate{box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}.toggle:disabled{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));background-color:transparent;opacity:.3;--togglehandleborder: 0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset, var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset}.badge-xs{height:.75rem;font-size:.75rem;line-height:.75rem;padding-left:.313rem;padding-right:.313rem}.btm-nav-xs>*:where(.active){border-top-width:1px}.btm-nav-sm>*:where(.active){border-top-width:2px}.btm-nav-md>*:where(.active){border-top-width:2px}.btm-nav-lg>*:where(.active){border-top-width:4px}.btn-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:.5rem;font-size:.75rem}.btn-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem}.btn-square:where(.btn-xs){height:1.5rem;width:1.5rem;padding:0}.btn-square:where(.btn-sm){height:2rem;width:2rem;padding:0}.btn-circle:where(.btn-xs){height:1.5rem;width:1.5rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-sm){height:2rem;width:2rem;border-radius:9999px;padding:0}[type=checkbox].checkbox-sm{height:1.25rem;width:1.25rem}.input-sm{height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem;line-height:2rem}.join.join-vertical{flex-direction:column}.join.join-vertical .join-item:first-child:not(:last-child),.join.join-vertical *:first-child:not(:last-child) .join-item{border-end-start-radius:0;border-end-end-radius:0;border-start-start-radius:inherit;border-start-end-radius:inherit}.join.join-vertical .join-item:last-child:not(:first-child),.join.join-vertical *:last-child:not(:first-child) .join-item{border-start-start-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-end-end-radius:inherit}.join.join-horizontal{flex-direction:row}.join.join-horizontal .join-item:first-child:not(:last-child),.join.join-horizontal *:first-child:not(:last-child) .join-item{border-end-end-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-start-start-radius:inherit}.join.join-horizontal .join-item:last-child:not(:first-child),.join.join-horizontal *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0;border-end-end-radius:inherit;border-start-end-radius:inherit}.modal-bottom{place-items:end}.select-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:2rem;font-size:.875rem;line-height:2rem}[dir=rtl] .select-sm{padding-left:2rem;padding-right:.75rem}.select-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:2rem;font-size:.75rem;line-height:1rem;line-height:1.625}[dir=rtl] .select-xs{padding-left:2rem;padding-right:.5rem}.steps-horizontal .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));place-items:center;text-align:center}.steps-vertical .step{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(1,minmax(0,1fr))}.tabs-md :where(.tab){height:2rem;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem}.tabs-lg :where(.tab){height:3rem;font-size:1.125rem;line-height:1.75rem;line-height:2;--tab-padding: 1.25rem}.tabs-sm :where(.tab){height:1.5rem;font-size:.875rem;line-height:.75rem;--tab-padding: .75rem}.tabs-xs :where(.tab){height:1.25rem;font-size:.75rem;line-height:.75rem;--tab-padding: .5rem}.join.join-vertical>:where(*:not(:first-child)){margin-left:0;margin-right:0;margin-top:-1px}.join.join-vertical>:where(*:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn) * -1)}.join.join-horizontal>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join.join-horizontal>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1);margin-top:0}.modal-top :where(.modal-box){width:100%;max-width:none;--tw-translate-y: -2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:0;border-top-right-radius:0}.modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}.modal-bottom :where(.modal-box){width:100%;max-width:none;--tw-translate-y: 2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:0;border-bottom-left-radius:0}.steps-horizontal .step{grid-template-rows:40px 1fr;grid-template-columns:auto;min-width:4rem}.steps-horizontal .step:before{height:.5rem;width:100%;--tw-translate-x: 0px;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));content:"";margin-inline-start:-100%}.steps-horizontal .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.steps-vertical .step{gap:.5rem;grid-template-columns:40px 1fr;grid-template-rows:auto;min-height:4rem;justify-items:start}.steps-vertical .step:before{height:100%;width:.5rem;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));margin-inline-start:50%}.steps-vertical .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.surface{border-width:1px;border-color:#ffffff0d;background-color:var(--fallback-b1,oklch(var(--b1)/.9));--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}[data-theme=downtify-light] .surface{border-color:#0000000d;background-color:#ffffffd9}.surface-strong{border-width:1px;border-color:#ffffff1a;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}[data-theme=downtify-light] .surface-strong{border-color:#0000001a;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.glass-nav{background:#121212b8;backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);border-bottom:1px solid rgba(255,255,255,.06)}[data-theme=downtify-light] .glass-nav{background:#ffffffc7;border-bottom:1px solid rgba(0,0,0,.06)}.icon-btn{display:inline-flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:9999px;color:var(--fallback-bc,oklch(var(--bc)/.8));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.icon-btn:hover{background-color:#ffffff1a;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}[data-theme=downtify-light] .icon-btn:hover{background-color:#0000000d}.icon-btn-active{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)));--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.icon-btn-active:hover{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)))}.pill{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500}.input-modern{height:3rem;width:100%;border-radius:9999px;border-width:1px;border-color:#ffffff1a;background-color:var(--fallback-b1,oklch(var(--b1)/.85));padding-left:1.25rem;padding-right:3.5rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)));outline:2px solid transparent;outline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input-modern::placeholder{color:var(--fallback-bc,oklch(var(--bc)/.4))}.input-modern:focus{border-color:var(--fallback-p,oklch(var(--p)/.6));--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-theme=downtify-light] .input-modern{border-color:#0000001a;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.track-card{position:relative;display:flex;align-items:center;gap:1rem;border-radius:1rem;padding:.75rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.track-card:hover{background-color:#ffffff0d}@media (min-width: 640px){.track-card{padding:1rem}}[data-theme=downtify-light] .track-card:hover{background-color:#0000000d}.track-cover{position:relative;aspect-ratio:1 / 1;width:4rem;flex-shrink:0;overflow:hidden;border-radius:.75rem;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)));--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (min-width: 640px){.track-cover{width:5rem}}.badge-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:var(--fallback-p,oklch(var(--p)/.2));background-color:var(--fallback-p,oklch(var(--p)/.15));--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.badge-error-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:var(--fallback-er,oklch(var(--er)/.25));background-color:var(--fallback-er,oklch(var(--er)/.15));--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.badge-neutral-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:#ffffff1a;background-color:#ffffff0d;color:var(--fallback-bc,oklch(var(--bc)/.7))}[data-theme=downtify-light] .badge-neutral-soft{border-color:#0000001a;background-color:#0000000d}.equalizer{display:inline-flex;height:1rem;align-items:flex-end;gap:.125rem}.equalizer span{display:block;height:100%;width:.125rem;transform-origin:bottom;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)))}.equalizer span:nth-child(1){animation:eq 1.05s ease-in-out infinite}.equalizer span:nth-child(2){animation:eq .95s ease-in-out infinite -.2s}.equalizer span:nth-child(3){animation:eq .85s ease-in-out infinite -.4s}@keyframes pulse{50%{opacity:.5}}.skeleton{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;border-radius:.75rem;background-color:#ffffff1a}[data-theme=downtify-light] .skeleton{background-color:#0000001a}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.-bottom-0\.5{bottom:-.125rem}.-right-0\.5{right:-.125rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-12{bottom:3rem}.bottom-3{bottom:.75rem}.left-1\/2{left:50%}.right-1{right:.25rem}.right-1\.5{right:.375rem}.right-10{right:2.5rem}.right-3{right:.75rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-1\/4{top:25%}.-z-10{z-index:-10}.z-30{z-index:30}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mr-0\.5{margin-right:.125rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[420px\]{height:420px}.h-full{height:100%}.min-h-0{min-height:0px}.min-h-\[calc\(100dvh-4rem\)\]{min-height:calc(100dvh - 4rem)}.min-h-dvh{min-height:100dvh}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[420px\]{width:420px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[1\.25rem\]{min-width:1.25rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[1rem\]{min-width:1rem}.min-w-\[2\.5rem\]{min-width:2.5rem}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-\[-90deg\]{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-scale-x-100{--tw-scale-x: -1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes slideUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.animate-slide-up{animation:slideUp .4s cubic-bezier(.22,1,.36,1)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-4{column-gap:1rem}.gap-y-0\.5{row-gap:.125rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-primary\/50{border-color:var(--fallback-p,oklch(var(--p)/.5))}.border-white\/10{border-color:#ffffff1a}.border-white\/5{border-color:#ffffff0d}.bg-base-100{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.bg-base-100\/50{background-color:var(--fallback-b1,oklch(var(--b1)/.5))}.bg-base-100\/60{background-color:var(--fallback-b1,oklch(var(--b1)/.6))}.bg-base-100\/80{background-color:var(--fallback-b1,oklch(var(--b1)/.8))}.bg-base-100\/85{background-color:var(--fallback-b1,oklch(var(--b1)/.85))}.bg-base-300\/30{background-color:var(--fallback-b3,oklch(var(--b3)/.3))}.bg-primary{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)))}.bg-primary\/10{background-color:var(--fallback-p,oklch(var(--p)/.1))}.bg-primary\/15{background-color:var(--fallback-p,oklch(var(--p)/.15))}.bg-primary\/25{background-color:var(--fallback-p,oklch(var(--p)/.25))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/5{background-color:#ffffff0d}.object-cover{object-fit:cover}.p-0{padding:0}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-16{padding-bottom:4rem}.pb-3{padding-bottom:.75rem}.pl-4{padding-left:1rem}.pt-24{padding-top:6rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.align-text-top{vertical-align:text-top}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-base-content{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.text-base-content\/20{color:var(--fallback-bc,oklch(var(--bc)/.2))}.text-base-content\/30{color:var(--fallback-bc,oklch(var(--bc)/.3))}.text-base-content\/40{color:var(--fallback-bc,oklch(var(--bc)/.4))}.text-base-content\/50{color:var(--fallback-bc,oklch(var(--bc)/.5))}.text-base-content\/60{color:var(--fallback-bc,oklch(var(--bc)/.6))}.text-base-content\/70{color:var(--fallback-bc,oklch(var(--bc)/.7))}.text-base-content\/90{color:var(--fallback-bc,oklch(var(--bc)/.9))}.text-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.text-error\/70{color:var(--fallback-er,oklch(var(--er)/.7))}.text-error\/80{color:var(--fallback-er,oklch(var(--er)/.8))}.text-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.text-primary-content{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)))}.text-primary\/70{color:var(--fallback-p,oklch(var(--p)/.7))}.text-primary\/80{color:var(--fallback-p,oklch(var(--p)/.8))}.text-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity, 1)))}.text-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity, 1)))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow-glow{--tw-shadow: 0 0 36px rgba(26, 208, 92, .3);--tw-shadow-colored: 0 0 36px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glow-sm{--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur-3xl{--tw-blur: blur(64px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-\[120px\]{--tw-blur: blur(120px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-\[0_0_8px_rgba\(26\,208\,92\,0\.55\)\]{--tw-drop-shadow: drop-shadow(0 0 8px rgba(26,208,92,.55));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.text-balance{text-wrap:balance}@media (min-width: 640px){.sm\:modal-middle{place-items:center}.sm\:modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-white\/20:hover{border-color:#fff3}.hover\:bg-base-100:hover{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.hover\:bg-error\/10:hover{background-color:var(--fallback-er,oklch(var(--er)/.1))}.hover\:bg-primary\/10:hover{background-color:var(--fallback-p,oklch(var(--p)/.1))}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:text-base-content:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.hover\:text-error:hover{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.hover\:text-primary:hover{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-primary\/60:focus{border-color:var(--fallback-p,oklch(var(--p)/.6))}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width: 640px){.sm\:inline{display:inline}.sm\:h-20{height:5rem}.sm\:h-64{height:16rem}.sm\:w-20{width:5rem}.sm\:w-64{width:16rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-2{gap:.5rem}.sm\:rounded-3xl{border-radius:1.5rem}.sm\:p-4{padding:1rem}.sm\:p-5{padding:1.25rem}.sm\:p-8{padding:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}}@media (min-width: 768px){.md\:flex{display:flex}.md\:hidden{display:none}}@media (min-width: 1024px){.lg\:max-h-\[640px\]{max-height:640px}.lg\:grid-cols-\[1fr_360px\]{grid-template-columns:1fr 360px}.lg\:overflow-y-auto{overflow-y:auto}} diff --git a/frontend/dist/assets/index-F6u2nS5A.css b/frontend/dist/assets/index-F6u2nS5A.css deleted file mode 100644 index 07fb561..0000000 --- a/frontend/dist/assets/index-F6u2nS5A.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://rsms.me/inter/inter.css";.page-enter-active,.page-leave-active{transition:opacity .25s ease,transform .25s ease}.page-enter-from,.page-leave-to{opacity:0;transform:translateY(8px)}.player-range[data-v-98956c70]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#ffffff1a;height:4px;border-radius:9999px;outline:none}[data-theme=downtify-light] .player-range[data-v-98956c70]{background:#0000001a}.player-range[data-v-98956c70]::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;height:14px;width:14px;border-radius:9999px;background:#1ad05c;cursor:pointer;box-shadow:0 0 12px #1ad05c73}.player-range[data-v-98956c70]::-moz-range-thumb{height:14px;width:14px;border-radius:9999px;background:#1ad05c;border:none;cursor:pointer;box-shadow:0 0 12px #1ad05c73}.pulse-glow[data-v-98956c70]{animation:glow-98956c70 2.4s ease-in-out infinite}@keyframes glow-98956c70{0%,to{box-shadow:0 0 36px #1ad05c4d}50%{box-shadow:0 0 60px #1ad05c8c}}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color: oklch(0% 0 0)){:root{color-scheme:light;--fallback-p: #491eff;--fallback-pc: #d4dbff;--fallback-s: #ff41c7;--fallback-sc: #fff9fc;--fallback-a: #00cfbd;--fallback-ac: #00100d;--fallback-n: #2b3440;--fallback-nc: #d7dde4;--fallback-b1: #ffffff;--fallback-b2: #e5e6e6;--fallback-b3: #e5e6e6;--fallback-bc: #1f2937;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--fallback-p: #7582ff;--fallback-pc: #050617;--fallback-s: #ff71cf;--fallback-sc: #190211;--fallback-a: #00c7b5;--fallback-ac: #000e0c;--fallback-n: #2a323c;--fallback-nc: #a6adbb;--fallback-b1: #1d232a;--fallback-b2: #191e24;--fallback-b3: #15191e;--fallback-bc: #a6adbb;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,transparent) transparent}*:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,transparent) transparent}:root{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 19.4918% .049187 153.969854;--s: 71.366% .019176 261.324645;--sc: 14.4788% 0 0;--a: 75.0492% .208056 148.653144;--ac: 19.4918% .049187 153.969854;--n: 18.2204% 0 0;--nc: 92.7582% .005814 264.531291;--b1: 20.9036% 0 0;--b2: 17.7638% 0 0;--b3: 0% 0 0;--bc: 96.7434% .001326 286.375246;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}[data-theme=downtify-dark]{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 19.4918% .049187 153.969854;--s: 71.366% .019176 261.324645;--sc: 14.4788% 0 0;--a: 75.0492% .208056 148.653144;--ac: 19.4918% .049187 153.969854;--n: 18.2204% 0 0;--nc: 92.7582% .005814 264.531291;--b1: 20.9036% 0 0;--b2: 17.7638% 0 0;--b3: 0% 0 0;--bc: 96.7434% .001326 286.375246;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}[data-theme=downtify-light]{--p: 75.0492% .208056 148.653144;--inc: 15.1705% .027481 231.6166;--suc: 15.0098% .041611 148.653144;--wac: 16.6604% .032836 83.424292;--erc: 14.2439% .032979 22.150603;--btn-focus-scale: .95;--tab-border: 1px;primary-focus:#15b150;--pc: 100% 0 0;--s: 47.8359% 0 0;--sc: 100% 0 0;--a: 74.4235% .210286 148.118822;--ac: 100% 0 0;--n: 23.9292% 0 0;--nc: 96.7434% .001326 286.375246;--b1: 100% 0 0;--b2: 97.2666% .001711 247.839212;--b3: 94.2414% .004574 258.325042;--bc: 20.7682% .039824 265.754874;--in: 75.8525% .137405 231.6166;--su: 75.0492% .208056 148.653144;--wa: 83.302% .164179 83.424292;--er: 71.2196% .164893 22.150603;--rounded-box: 1.25rem;--rounded-btn: 9999px;--rounded-badge: 9999px;--btn-text-case: none;--animation-btn: .25s;--animation-input: .2s;--border-btn: 1px;--tab-radius: .75rem}html,body{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"cv02","cv03","cv04","cv11"}body{background-image:radial-gradient(circle at 0% 0%,rgba(26,208,92,.15),transparent 45%),radial-gradient(circle at 100% 0%,rgba(26,208,92,.08),transparent 55%),radial-gradient(circle at 50% 100%,rgba(26,208,92,.07),transparent 60%);background-attachment:fixed;min-height:100dvh}[data-theme=downtify-light] body{background-image:radial-gradient(circle at 0% 0%,rgba(26,208,92,.18),transparent 35%),radial-gradient(circle at 100% 0%,rgba(26,208,92,.12),transparent 45%),radial-gradient(circle at 50% 100%,rgba(26,208,92,.08),transparent 55%)}::selection{background-color:#1ad05c59;color:#fff}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#ffffff14;border-radius:9999px}::-webkit-scrollbar-thumb:hover{background:#1ad05c73}[data-theme=downtify-light] ::-webkit-scrollbar-thumb{background:#0000001f}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.alert{display:grid;width:100%;grid-auto-flow:row;align-content:flex-start;align-items:center;justify-items:center;gap:1rem;text-align:center;border-radius:var(--rounded-box, 1rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));padding:1rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-b2,oklch(var(--b2)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1));background-color:var(--alert-bg)}@media (min-width: 640px){.alert{grid-auto-flow:column;grid-template-columns:auto minmax(auto,1fr);justify-items:start;text-align:start}}.avatar.placeholder>div{display:flex;align-items:center;justify-content:center}.badge{display:inline-flex;align-items:center;justify-content:center;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;height:1.25rem;font-size:.875rem;line-height:1.25rem;width:fit-content;padding-left:.563rem;padding-right:.563rem;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}@media (hover:hover){.checkbox-primary:hover{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.label a:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.tab:hover{--tw-text-opacity: 1}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-color:transparent;border-color:oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn, 1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));--tw-bg-opacity: 1;--tw-border-opacity: 1}.btn-disabled,.btn[disabled],.btn:disabled{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box, 1rem)}.card:focus{outline:2px solid transparent;outline-offset:2px}.card figure{display:flex;align-items:center;justify-content:center}.card.image-full{display:grid}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;object-fit:cover}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.checkbox{flex-shrink:0;--chkbg: var(--fallback-bc,oklch(var(--bc)/1));--chkfg: var(--fallback-b1,oklch(var(--b1)/1));height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2}.diff{position:relative;display:grid;width:100%;overflow:hidden;direction:ltr;container-type:inline-size;grid-template-columns:auto 1fr}@media (hover: hover){.btm-nav>*.disabled:hover,.btm-nav>*[disabled]:hover{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:hover{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,black)}}@supports not (color: oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn.glass:hover{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost:hover{border-color:transparent}@supports (color: oklch(0% 0 0)){.btn-ghost:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}}.btn-outline.btn-primary:hover{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.btn-outline.btn-secondary:hover{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-secondary:hover{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}}.btn-outline.btn-accent:hover{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-accent:hover{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn-disabled:hover,.btn[disabled]:hover,.btn:disabled:hover{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}@supports (color: color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.tab[disabled],.tab[disabled]:hover{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}}.footer{display:grid;width:100%;grid-auto-flow:row;place-items:start;column-gap:1rem;row-gap:2.5rem;font-size:.875rem;line-height:1.25rem}.footer>*{display:grid;place-items:start;gap:.5rem}@media (min-width: 48rem){.footer{grid-auto-flow:column}.footer-center{grid-auto-flow:row dense}}.label{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.hero{display:grid;width:100%;place-items:center;background-size:cover;background-position:center}.hero>*{grid-column-start:1;grid-row-start:1}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input[type=number]::-webkit-inner-spin-button,.input-md[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.input-xs[type=number]::-webkit-inner-spin-button{margin-top:-.25rem;margin-bottom:-.25rem;margin-inline-end:-0px}.input-sm[type=number]::-webkit-inner-spin-button{margin-top:0;margin-bottom:0;margin-inline-end:-0px}.join{display:inline-flex;align-items:stretch;border-radius:var(--rounded-btn, .5rem)}.join :where(.join-item){border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:not(:first-child):not(:last-child),.join *:not(:first-child):not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0}.join .dropdown .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .dropdown .join-item{border-start-end-radius:inherit;border-end-end-radius:inherit}.join :where(.join-item:first-child:not(:last-child)),.join :where(*:first-child:not(:last-child) .join-item){border-end-start-radius:inherit;border-start-start-radius:inherit}.join .join-item:last-child:not(:first-child),.join *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0}.join :where(.join-item:last-child:not(:first-child)),.join :where(*:last-child:not(:first-child) .join-item){border-start-end-radius:inherit;border-end-end-radius:inherit}@supports not selector(:has(*)){:where(.join *){border-radius:inherit}}@supports selector(:has(*)){:where(.join *:has(.join-item)){border-radius:inherit}}.link{cursor:pointer;text-decoration-line:underline}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}:where(.menu li) .badge{justify-self:end}.modal{pointer-events:none;position:fixed;top:0;right:0;bottom:0;left:0;margin:0;display:grid;height:100%;max-height:none;width:100%;max-width:none;justify-items:center;padding:0;opacity:0;overscroll-behavior:contain;z-index:999;background-color:transparent;color:inherit;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity,visibility;overflow-y:hidden}:where(.modal){align-items:center}.modal-box{max-height:calc(100vh - 5em);grid-column-start:1;grid-row-start:1;width:91.666667%;max-width:32rem;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));padding:1.5rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;box-shadow:#00000040 0 25px 50px -12px;overflow-y:auto;overscroll-behavior:contain}.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open]{pointer-events:auto;visibility:visible;opacity:1}.modal-toggle{position:fixed;height:0px;width:0px;-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden;scrollbar-gutter:stable}.progress{position:relative;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:hidden;height:.5rem;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.radial-progress{position:relative;display:inline-grid;height:var(--size);width:var(--size);place-content:center;border-radius:9999px;background-color:transparent;vertical-align:middle;box-sizing:content-box;--value: 0;--size: 5rem;--thickness: calc(var(--size) / 10)}.radial-progress::-moz-progress-bar{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress::-webkit-progress-value{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress::-webkit-progress-bar{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress:before,.radial-progress:after{position:absolute;border-radius:9999px;content:""}.radial-progress:before{top:0;right:0;bottom:0;left:0;background:radial-gradient(farthest-side,currentColor 98%,#0000) top/var(--thickness) var(--thickness) no-repeat,conic-gradient(currentColor calc(var(--value) * 1%),#0000 0);-webkit-mask:radial-gradient(farthest-side,#0000 calc(99% - var(--thickness)),#000 calc(100% - var(--thickness)));mask:radial-gradient(farthest-side,#0000 calc(99% - var(--thickness)),#000 calc(100% - var(--thickness)))}.radial-progress:after{inset:calc(50% - var(--thickness) / 2);transform:rotate(calc(var(--value) * 3.6deg - 90deg)) translate(calc(var(--size) / 2 - 50%));background-color:currentColor}.range{height:1.5rem;width:100%;cursor:pointer;-moz-appearance:none;appearance:none;-webkit-appearance:none;--range-shdw: var(--fallback-bc,oklch(var(--bc)/1));overflow:hidden;border-radius:var(--rounded-box, 1rem);background-color:transparent}.range:focus{outline:none}.select{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;min-height:3rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-size:4px 4px,4px 4px;background-repeat:no-repeat}.select[multiple]{height:auto}.steps .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-columns:auto;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-rows:40px 1fr;place-items:center;text-align:center;min-width:4rem}.tabs-lifted:has(.tab-content[class^=rounded-]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])),.tabs-lifted:has(.tab-content[class*=" rounded-"]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])){border-bottom-color:transparent}.tab{position:relative;grid-row-start:1;display:inline-flex;height:2rem;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;flex-wrap:wrap;align-items:center;justify-content:center;text-align:center;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem;--tw-text-opacity: .5;--tab-color: var(--fallback-bc,oklch(var(--bc)/1));--tab-bg: var(--fallback-b1,oklch(var(--b1)/1));--tab-border-color: var(--fallback-b3,oklch(var(--b3)/1));color:var(--tab-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem)}.tab:is(input[type=radio]){width:auto;border-bottom-right-radius:0;border-bottom-left-radius:0}.tab:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.tab:not(input):empty{cursor:default;grid-column-start:span 9999}input.tab:checked+.tab-content,:is(.tab-active,[aria-selected=true])+.tab-content{display:block}.toggle{flex-shrink:0;--tglbg: var(--fallback-b1,oklch(var(--b1)/1));--handleoffset: 1.5rem;--handleoffsetcalculator: calc(var(--handleoffset) * -1);--togglehandleborder: 0 0;height:1.5rem;width:3rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;border-color:currentColor;background-color:currentColor;color:var(--fallback-bc,oklch(var(--bc)/.5));transition:background,box-shadow var(--animation-input, .2s) ease-out;box-shadow:var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset,var(--togglehandleborder)}.badge-outline{border-color:currentColor;--tw-border-opacity: .5;background-color:transparent;color:currentColor}.badge-outline.badge-neutral{--tw-text-opacity: 1;color:var(--fallback-n,oklch(var(--n)/var(--tw-text-opacity)))}.badge-outline.badge-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.badge-outline.badge-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.badge-outline.badge-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.badge-outline.badge-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.badge-outline.badge-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.badge-outline.badge-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.badge-outline.badge-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btm-nav>*:where(.active){border-top-width:2px;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.btm-nav>*.disabled,.btm-nav>*[disabled]{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}@media (prefers-reduced-motion: no-preference){.btn{animation:button-pop var(--animation-btn, .25s) ease-out}}.btn:active:hover,.btn:active:focus{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale, .97))}@supports not (color: oklch(0% 0 0)){.btn{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}.btn-primary{--btn-color: var(--fallback-p)}.btn-secondary{--btn-color: var(--fallback-s)}.btn-accent{--btn-color: var(--fallback-a)}}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}.btn-outline.btn-secondary.btn-active{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}.btn-outline.btn-accent.btn-active{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color: oklch(0% 0 0)){.btn-primary{--btn-color: var(--p)}.btn-secondary{--btn-color: var(--s)}.btn-accent{--btn-color: var(--a)}}.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)));outline-color:var(--fallback-s,oklch(var(--s)/1))}.btn-accent{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)));outline-color:var(--fallback-a,oklch(var(--a)/1))}.btn.glass{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost{border-width:1px;border-color:transparent;background-color:transparent;color:currentColor;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn-ghost.btn-active{border-color:transparent;background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.btn-outline.btn-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.btn-outline.btn-secondary.btn-active{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.btn-outline.btn-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.btn-outline.btn-accent.btn-active{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn[disabled],.btn:disabled{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale, .98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.checkbox:disabled{border-width:0px;cursor:not-allowed;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.2}.checkbox:checked,.checkbox[aria-checked=true]{background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,transparent 65%,var(--chkbg) 65.99%),linear-gradient(45deg,transparent 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,transparent 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,transparent 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%)}.checkbox:indeterminate{--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-image:linear-gradient(90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(-90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%)}.checkbox-primary{--chkbg: var(--fallback-p,oklch(var(--p)/1));--chkfg: var(--fallback-pc,oklch(var(--pc)/1));--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.checkbox-primary:focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}.checkbox-primary:checked,.checkbox-primary[aria-checked=true]{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}.input input{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:transparent}.input input:focus{outline:2px solid transparent;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input:focus,.input:focus-within{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:has(>input[disabled]),.input-disabled,.input:disabled,.input[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input:has(>input[disabled])::placeholder,.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1)}.link:focus{outline:2px solid transparent;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.\!loading{pointer-events:none!important;display:inline-block!important;aspect-ratio:1 / 1!important;width:1.5rem!important;background-color:currentColor!important;-webkit-mask-size:100%!important;mask-size:100%!important;-webkit-mask-repeat:no-repeat!important;mask-repeat:no-repeat!important;-webkit-mask-position:center!important;mask-position:center!important;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important;mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important}.loading{pointer-events:none;display:inline-block;aspect-ratio:1 / 1;width:1.5rem;background-color:currentColor;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-xs{width:1rem}.loading-sm{width:1.25rem}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;left:.5rem;top:50%;aspect-ratio:1 / 1;height:.75rem;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:2px;border-color:currentColor;opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{content:"";position:absolute;left:1.25rem;top:50%;height:.5rem;--tw-translate-y: 25%;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1px;border-color:currentColor;opacity:.6}.modal:not(dialog:not(.modal-open)),.modal::backdrop{background-color:#0006;animation:modal-pop .2s ease-out}.modal-backdrop{z-index:-1;grid-column-start:1;grid-row-start:1;display:grid;align-self:stretch;justify-self:stretch;color:transparent}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y: 0px;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes modal-pop{0%{opacity:0}}.progress::-moz-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate{--progress-color: var(--fallback-bc,oklch(var(--bc)/1));background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}.progress::-webkit-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:transparent}.progress::-webkit-progress-value{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate::-moz-progress-bar{background-color:transparent;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}@keyframes progress-loading{50%{background-position-x:-115%}}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}.range:focus-visible::-webkit-slider-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range:focus-visible::-moz-range-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range::-webkit-slider-runnable-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-moz-range-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-webkit-slider-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));-moz-appearance:none;appearance:none;-webkit-appearance:none;top:50%;color:var(--range-shdw);transform:translateY(-50%);--filler-size: 100rem;--filler-offset: .6rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}.range::-moz-range-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));top:50%;color:var(--range-shdw);--filler-size: 100rem;--filler-offset: .5rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select-disabled,.select:disabled,.select[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:calc(0% + 12px) calc(1px + 50%),calc(0% + 16px) calc(1px + 50%)}.skeleton{border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));will-change:background-position;animation:skeleton 1.8s ease-in-out infinite;background-image:linear-gradient(105deg,transparent 0%,transparent 40%,var(--fallback-b1,oklch(var(--b1)/1)) 50%,transparent 60%,transparent 100%);background-size:200% auto;background-repeat:no-repeat;background-position-x:-50%}@media (prefers-reduced-motion){.skeleton{animation-duration:15s}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}.steps .step:before{top:0;grid-column-start:1;grid-row-start:1;height:.5rem;width:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));content:"";margin-inline-start:-100%}.steps .step:after{content:counter(step);counter-increment:step;z-index:1;position:relative;grid-column-start:1;grid-row-start:1;display:grid;height:2rem;width:2rem;place-items:center;place-self:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.steps .step:first-child:before{content:none}.steps .step[data-content]:after{content:attr(data-content)}.tabs-lifted>.tab:focus-visible{border-end-end-radius:0;border-end-start-radius:0}.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tab:is(input:checked){border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: 1;--tw-text-opacity: 1}.tab:focus{outline:2px solid transparent;outline-offset:2px}.tab:focus-visible{outline:2px solid currentColor;outline-offset:-5px}.tab-disabled,.tab[disabled]{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.tabs-bordered>.tab{border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2;border-style:solid;border-bottom-width:calc(var(--tab-border, 1px) + 1px)}.tabs-lifted>.tab{border:var(--tab-border, 1px) solid transparent;border-width:0 0 var(--tab-border, 1px) 0;border-start-start-radius:var(--tab-radius, .5rem);border-start-end-radius:var(--tab-radius, .5rem);border-bottom-color:var(--tab-border-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem);padding-top:var(--tab-border, 1px)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tabs-lifted>.tab:is(input:checked){background-color:var(--tab-bg);border-width:var(--tab-border, 1px) var(--tab-border, 1px) 0 var(--tab-border, 1px);border-inline-start-color:var(--tab-border-color);border-inline-end-color:var(--tab-border-color);border-top-color:var(--tab-border-color);padding-inline-start:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-inline-end:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-bottom:var(--tab-border, 1px);padding-top:0}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked):before{z-index:1;content:"";display:block;position:absolute;width:calc(100% + var(--tab-radius, .5rem) * 2);height:var(--tab-radius, .5rem);bottom:0;background-size:var(--tab-radius, .5rem);background-position:top left,top right;background-repeat:no-repeat;--tab-grad: calc(69% - var(--tab-border, 1px));--radius-start: radial-gradient( circle at top left, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );--radius-end: radial-gradient( circle at top right, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );background-image:var(--radius-start),var(--radius-end)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,.tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-end);background-position:top right}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-start);background-position:top left}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,.tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-start);background-position:top left}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-end);background-position:top right}.tabs-lifted>:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled])+.tabs-lifted :is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked)+.tabs-lifted .tab:is(input:checked):before{background-image:var(--radius-end);background-position:top right}.tabs-boxed .tab{border-radius:var(--rounded-btn, .5rem)}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.active,.table-zebra tr.active:nth-child(2n),.table-zebra-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}[dir=rtl] .toggle{--handleoffsetcalculator: calc(var(--handleoffset) * 1)}.toggle:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.toggle:hover{background-color:currentColor}.toggle:checked,.toggle[aria-checked=true]{background-image:none;--handleoffsetcalculator: var(--handleoffset);--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}[dir=rtl] .toggle:checked,[dir=rtl] .toggle[aria-checked=true]{--handleoffsetcalculator: calc(var(--handleoffset) * -1)}.toggle:indeterminate{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}[dir=rtl] .toggle:indeterminate{box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}.toggle:disabled{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));background-color:transparent;opacity:.3;--togglehandleborder: 0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset, var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset}.badge-xs{height:.75rem;font-size:.75rem;line-height:.75rem;padding-left:.313rem;padding-right:.313rem}.btm-nav-xs>*:where(.active){border-top-width:1px}.btm-nav-sm>*:where(.active){border-top-width:2px}.btm-nav-md>*:where(.active){border-top-width:2px}.btm-nav-lg>*:where(.active){border-top-width:4px}.btn-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:.5rem;font-size:.75rem}.btn-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem}.btn-square:where(.btn-xs){height:1.5rem;width:1.5rem;padding:0}.btn-square:where(.btn-sm){height:2rem;width:2rem;padding:0}.btn-circle:where(.btn-xs){height:1.5rem;width:1.5rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-sm){height:2rem;width:2rem;border-radius:9999px;padding:0}[type=checkbox].checkbox-sm{height:1.25rem;width:1.25rem}.input-xs{height:1.5rem;padding-left:.5rem;padding-right:.5rem;font-size:.75rem;line-height:1rem;line-height:1.625}.input-sm{height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem;line-height:2rem}.join.join-vertical{flex-direction:column}.join.join-vertical .join-item:first-child:not(:last-child),.join.join-vertical *:first-child:not(:last-child) .join-item{border-end-start-radius:0;border-end-end-radius:0;border-start-start-radius:inherit;border-start-end-radius:inherit}.join.join-vertical .join-item:last-child:not(:first-child),.join.join-vertical *:last-child:not(:first-child) .join-item{border-start-start-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-end-end-radius:inherit}.join.join-horizontal{flex-direction:row}.join.join-horizontal .join-item:first-child:not(:last-child),.join.join-horizontal *:first-child:not(:last-child) .join-item{border-end-end-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-start-start-radius:inherit}.join.join-horizontal .join-item:last-child:not(:first-child),.join.join-horizontal *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0;border-end-end-radius:inherit;border-start-end-radius:inherit}.modal-bottom{place-items:end}.select-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:2rem;font-size:.875rem;line-height:2rem}[dir=rtl] .select-sm{padding-left:2rem;padding-right:.75rem}.select-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:2rem;font-size:.75rem;line-height:1rem;line-height:1.625}[dir=rtl] .select-xs{padding-left:2rem;padding-right:.5rem}.steps-horizontal .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));place-items:center;text-align:center}.steps-vertical .step{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(1,minmax(0,1fr))}.tabs-md :where(.tab){height:2rem;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem}.tabs-lg :where(.tab){height:3rem;font-size:1.125rem;line-height:1.75rem;line-height:2;--tab-padding: 1.25rem}.tabs-sm :where(.tab){height:1.5rem;font-size:.875rem;line-height:.75rem;--tab-padding: .75rem}.tabs-xs :where(.tab){height:1.25rem;font-size:.75rem;line-height:.75rem;--tab-padding: .5rem}.join.join-vertical>:where(*:not(:first-child)){margin-left:0;margin-right:0;margin-top:-1px}.join.join-vertical>:where(*:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn) * -1)}.join.join-horizontal>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join.join-horizontal>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1);margin-top:0}.modal-top :where(.modal-box){width:100%;max-width:none;--tw-translate-y: -2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:0;border-top-right-radius:0}.modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}.modal-bottom :where(.modal-box){width:100%;max-width:none;--tw-translate-y: 2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:0;border-bottom-left-radius:0}.steps-horizontal .step{grid-template-rows:40px 1fr;grid-template-columns:auto;min-width:4rem}.steps-horizontal .step:before{height:.5rem;width:100%;--tw-translate-x: 0px;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));content:"";margin-inline-start:-100%}.steps-horizontal .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.steps-vertical .step{gap:.5rem;grid-template-columns:40px 1fr;grid-template-rows:auto;min-height:4rem;justify-items:start}.steps-vertical .step:before{height:100%;width:.5rem;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));margin-inline-start:50%}.steps-vertical .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.surface{border-width:1px;border-color:#ffffff0d;background-color:var(--fallback-b1,oklch(var(--b1)/.9));--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}[data-theme=downtify-light] .surface{border-color:#0000000d;background-color:#ffffffd9}.surface-strong{border-width:1px;border-color:#ffffff1a;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}[data-theme=downtify-light] .surface-strong{border-color:#0000001a;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.glass-nav{background:#121212b8;backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);border-bottom:1px solid rgba(255,255,255,.06)}[data-theme=downtify-light] .glass-nav{background:#ffffffc7;border-bottom:1px solid rgba(0,0,0,.06)}.icon-btn{display:inline-flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:9999px;color:var(--fallback-bc,oklch(var(--bc)/.8));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.icon-btn:hover{background-color:#ffffff1a;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}[data-theme=downtify-light] .icon-btn:hover{background-color:#0000000d}.icon-btn-active{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)));--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.icon-btn-active:hover{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)))}.pill{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500}.input-modern{height:3rem;width:100%;border-radius:9999px;border-width:1px;border-color:#ffffff1a;background-color:var(--fallback-b1,oklch(var(--b1)/.85));padding-left:1.25rem;padding-right:3.5rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)));outline:2px solid transparent;outline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input-modern::placeholder{color:var(--fallback-bc,oklch(var(--bc)/.4))}.input-modern:focus{border-color:var(--fallback-p,oklch(var(--p)/.6));--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-theme=downtify-light] .input-modern{border-color:#0000001a;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.track-card{position:relative;display:flex;align-items:center;gap:1rem;border-radius:1rem;padding:.75rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.track-card:hover{background-color:#ffffff0d}@media (min-width: 640px){.track-card{padding:1rem}}[data-theme=downtify-light] .track-card:hover{background-color:#0000000d}.track-cover{position:relative;aspect-ratio:1 / 1;width:4rem;flex-shrink:0;overflow:hidden;border-radius:.75rem;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)));--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (min-width: 640px){.track-cover{width:5rem}}.badge-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:var(--fallback-p,oklch(var(--p)/.2));background-color:var(--fallback-p,oklch(var(--p)/.15));--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.badge-error-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:var(--fallback-er,oklch(var(--er)/.25));background-color:var(--fallback-er,oklch(var(--er)/.15));--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.badge-neutral-soft{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;border-width:1px;border-color:#ffffff1a;background-color:#ffffff0d;color:var(--fallback-bc,oklch(var(--bc)/.7))}[data-theme=downtify-light] .badge-neutral-soft{border-color:#0000001a;background-color:#0000000d}.equalizer{display:inline-flex;height:1rem;align-items:flex-end;gap:.125rem}.equalizer span{display:block;height:100%;width:.125rem;transform-origin:bottom;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)))}.equalizer span:nth-child(1){animation:eq 1.05s ease-in-out infinite}.equalizer span:nth-child(2){animation:eq .95s ease-in-out infinite -.2s}.equalizer span:nth-child(3){animation:eq .85s ease-in-out infinite -.4s}@keyframes pulse{50%{opacity:.5}}.skeleton{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;border-radius:.75rem;background-color:#ffffff1a}[data-theme=downtify-light] .skeleton{background-color:#0000001a}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.-bottom-0\.5{bottom:-.125rem}.-right-0\.5{right:-.125rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-12{bottom:3rem}.bottom-3{bottom:.75rem}.left-1\/2{left:50%}.right-1{right:.25rem}.right-1\.5{right:.375rem}.right-10{right:2.5rem}.right-3{right:.75rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-1\/4{top:25%}.-z-10{z-index:-10}.z-30{z-index:30}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mr-0\.5{margin-right:.125rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[420px\]{height:420px}.h-full{height:100%}.min-h-0{min-height:0px}.min-h-\[calc\(100dvh-4rem\)\]{min-height:calc(100dvh - 4rem)}.min-h-dvh{min-height:100dvh}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[420px\]{width:420px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[1\.25rem\]{min-width:1.25rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[1rem\]{min-width:1rem}.min-w-\[2\.5rem\]{min-width:2.5rem}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-\[-90deg\]{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-scale-x-100{--tw-scale-x: -1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes slideUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.animate-slide-up{animation:slideUp .4s cubic-bezier(.22,1,.36,1)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-4{column-gap:1rem}.gap-y-0\.5{row-gap:.125rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-primary\/50{border-color:var(--fallback-p,oklch(var(--p)/.5))}.border-white\/10{border-color:#ffffff1a}.border-white\/5{border-color:#ffffff0d}.bg-base-100{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.bg-base-100\/30{background-color:var(--fallback-b1,oklch(var(--b1)/.3))}.bg-base-100\/50{background-color:var(--fallback-b1,oklch(var(--b1)/.5))}.bg-base-100\/60{background-color:var(--fallback-b1,oklch(var(--b1)/.6))}.bg-base-100\/80{background-color:var(--fallback-b1,oklch(var(--b1)/.8))}.bg-base-100\/85{background-color:var(--fallback-b1,oklch(var(--b1)/.85))}.bg-base-300\/30{background-color:var(--fallback-b3,oklch(var(--b3)/.3))}.bg-primary{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)))}.bg-primary\/10{background-color:var(--fallback-p,oklch(var(--p)/.1))}.bg-primary\/15{background-color:var(--fallback-p,oklch(var(--p)/.15))}.bg-primary\/25{background-color:var(--fallback-p,oklch(var(--p)/.25))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/5{background-color:#ffffff0d}.object-cover{object-fit:cover}.p-0{padding:0}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-16{padding-bottom:4rem}.pb-3{padding-bottom:.75rem}.pl-4{padding-left:1rem}.pt-1{padding-top:.25rem}.pt-24{padding-top:6rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.align-text-top{vertical-align:text-top}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-base-content{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.text-base-content\/20{color:var(--fallback-bc,oklch(var(--bc)/.2))}.text-base-content\/30{color:var(--fallback-bc,oklch(var(--bc)/.3))}.text-base-content\/35{color:var(--fallback-bc,oklch(var(--bc)/.35))}.text-base-content\/40{color:var(--fallback-bc,oklch(var(--bc)/.4))}.text-base-content\/50{color:var(--fallback-bc,oklch(var(--bc)/.5))}.text-base-content\/60{color:var(--fallback-bc,oklch(var(--bc)/.6))}.text-base-content\/70{color:var(--fallback-bc,oklch(var(--bc)/.7))}.text-base-content\/90{color:var(--fallback-bc,oklch(var(--bc)/.9))}.text-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.text-error\/70{color:var(--fallback-er,oklch(var(--er)/.7))}.text-error\/80{color:var(--fallback-er,oklch(var(--er)/.8))}.text-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.text-primary-content{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)))}.text-primary\/70{color:var(--fallback-p,oklch(var(--p)/.7))}.text-primary\/80{color:var(--fallback-p,oklch(var(--p)/.8))}.text-success\/80{color:var(--fallback-su,oklch(var(--su)/.8))}.text-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity, 1)))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow-glow{--tw-shadow: 0 0 36px rgba(26, 208, 92, .3);--tw-shadow-colored: 0 0 36px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glow-sm{--tw-shadow: 0 0 24px rgba(26, 208, 92, .18);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur-3xl{--tw-blur: blur(64px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-\[120px\]{--tw-blur: blur(120px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-\[0_0_8px_rgba\(26\,208\,92\,0\.55\)\]{--tw-drop-shadow: drop-shadow(0 0 8px rgba(26,208,92,.55));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.text-balance{text-wrap:balance}@media (min-width: 640px){.sm\:modal-middle{place-items:center}.sm\:modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-white\/20:hover{border-color:#fff3}.hover\:bg-base-100:hover{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.hover\:bg-error\/10:hover{background-color:var(--fallback-er,oklch(var(--er)/.1))}.hover\:bg-primary\/10:hover{background-color:var(--fallback-p,oklch(var(--p)/.1))}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:text-base-content:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.hover\:text-base-content\/55:hover{color:var(--fallback-bc,oklch(var(--bc)/.55))}.hover\:text-error:hover{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.hover\:text-primary:hover{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-primary\/60:focus{border-color:var(--fallback-p,oklch(var(--p)/.6))}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width: 640px){.sm\:inline{display:inline}.sm\:h-20{height:5rem}.sm\:h-64{height:16rem}.sm\:w-20{width:5rem}.sm\:w-64{width:16rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-2{gap:.5rem}.sm\:rounded-3xl{border-radius:1.5rem}.sm\:p-4{padding:1rem}.sm\:p-5{padding:1.25rem}.sm\:p-8{padding:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}}@media (min-width: 768px){.md\:flex{display:flex}.md\:hidden{display:none}}@media (min-width: 1024px){.lg\:max-h-\[640px\]{max-height:640px}.lg\:grid-cols-\[1fr_360px\]{grid-template-columns:1fr 360px}.lg\:overflow-y-auto{overflow-y:auto}} diff --git a/frontend/dist/assets/index-CDknlPfS.js b/frontend/dist/assets/index-pD3TceX1.js similarity index 63% rename from frontend/dist/assets/index-CDknlPfS.js rename to frontend/dist/assets/index-pD3TceX1.js index 271ad70..15e906d 100644 --- a/frontend/dist/assets/index-CDknlPfS.js +++ b/frontend/dist/assets/index-pD3TceX1.js @@ -2,32 +2,32 @@ * @vue/shared v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/function jr(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const we={},On=[],Ut=()=>{},hl=()=>!1,bo=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),qr=e=>e.startsWith("onUpdate:"),$e=Object.assign,Vr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Nu=Object.prototype.hasOwnProperty,ye=(e,t)=>Nu.call(e,t),Z=Array.isArray,Dn=e=>Cs(e)==="[object Map]",Wn=e=>Cs(e)==="[object Set]",Ti=e=>Cs(e)==="[object Date]",re=e=>typeof e=="function",Te=e=>typeof e=="string",Bt=e=>typeof e=="symbol",be=e=>e!==null&&typeof e=="object",ml=e=>(be(e)||re(e))&&re(e.then)&&re(e.catch),gl=Object.prototype.toString,Cs=e=>gl.call(e),Iu=e=>Cs(e).slice(8,-1),yl=e=>Cs(e)==="[object Object]",Wr=e=>Te(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,as=jr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),_o=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$u=/-\w/g,mt=_o(e=>e.replace($u,t=>t.slice(1).toUpperCase())),Lu=/\B([A-Z])/g,fn=_o(e=>e.replace(Lu,"-$1").toLowerCase()),xo=_o(e=>e.charAt(0).toUpperCase()+e.slice(1)),Wo=_o(e=>e?`on${xo(e)}`:""),ln=(e,t)=>!Object.is(e,t),Ks=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},wo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Fu=e=>{const t=Te(e)?Number(e):NaN;return isNaN(t)?e:t};let Pi;const ko=()=>Pi||(Pi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ln(e){if(Z(e)){const t={};for(let n=0;n{if(n){const s=n.split(Mu);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ce(e){let t="";if(Te(e))t=e;else if(Z(e))for(let n=0;nzn(n,t))}const _l=e=>!!(e&&e.__v_isRef===!0),w=e=>Te(e)?e:e==null?"":Z(e)||be(e)&&(e.toString===gl||!re(e.toString))?_l(e)?w(e.value):JSON.stringify(e,xl,2):String(e),xl=(e,t)=>_l(t)?xl(e,t.value):Dn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o],r)=>(n[zo(s,r)+" =>"]=o,n),{})}:Wn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>zo(n))}:Bt(t)?zo(t):be(t)&&!Z(t)&&!yl(t)?String(t):t,zo=(e,t="")=>{var n;return Bt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +**/function jr(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ke={},On=[],Ft=()=>{},hl=()=>!1,vo=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),qr=e=>e.startsWith("onUpdate:"),$e=Object.assign,Vr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Nu=Object.prototype.hasOwnProperty,ye=(e,t)=>Nu.call(e,t),Z=Array.isArray,Dn=e=>Cs(e)==="[object Map]",Wn=e=>Cs(e)==="[object Set]",Ti=e=>Cs(e)==="[object Date]",re=e=>typeof e=="function",Te=e=>typeof e=="string",Bt=e=>typeof e=="symbol",ve=e=>e!==null&&typeof e=="object",ml=e=>(ve(e)||re(e))&&re(e.then)&&re(e.catch),gl=Object.prototype.toString,Cs=e=>gl.call(e),Iu=e=>Cs(e).slice(8,-1),yl=e=>Cs(e)==="[object Object]",Wr=e=>Te(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,as=jr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),_o=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$u=/-\w/g,mt=_o(e=>e.replace($u,t=>t.slice(1).toUpperCase())),Lu=/\B([A-Z])/g,fn=_o(e=>e.replace(Lu,"-$1").toLowerCase()),xo=_o(e=>e.charAt(0).toUpperCase()+e.slice(1)),Wo=_o(e=>e?`on${xo(e)}`:""),ln=(e,t)=>!Object.is(e,t),Ks=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},wo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Uu=e=>{const t=Te(e)?Number(e):NaN;return isNaN(t)?e:t};let Pi;const ko=()=>Pi||(Pi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ln(e){if(Z(e)){const t={};for(let n=0;n{if(n){const s=n.split(Mu);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ae(e){let t="";if(Te(e))t=e;else if(Z(e))for(let n=0;nzn(n,t))}const _l=e=>!!(e&&e.__v_isRef===!0),w=e=>Te(e)?e:e==null?"":Z(e)||ve(e)&&(e.toString===gl||!re(e.toString))?_l(e)?w(e.value):JSON.stringify(e,xl,2):String(e),xl=(e,t)=>_l(t)?xl(e,t.value):Dn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o],r)=>(n[zo(s,r)+" =>"]=o,n),{})}:Wn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>zo(n))}:Bt(t)?zo(t):ve(t)&&!Z(t)&&!yl(t)?String(t):t,zo=(e,t="")=>{var n;return Bt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** * @vue/reactivity v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let tt;class Wu{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=tt,!t&&tt&&(this.index=(tt.scopes||(tt.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(tt=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(cs){let t=cs;for(cs=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;ls;){let t=ls;for(ls=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function El(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Al(e){let t,n=e.depsTail,s=n;for(;s;){const o=s.prevDep;s.version===-1?(s===n&&(n=o),Gr(s),Ku(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=o}e.deps=t,e.depsTail=n}function mr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Cl(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Cl(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===ms)||(e.globalVersion=ms,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!mr(e))))return;e.flags|=2;const t=e.dep,n=Ee,s=bt;Ee=e,bt=!0;try{El(e);const o=e.fn(e._value);(t.version===0||ln(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{Ee=n,bt=s,Al(e),e.flags&=-3}}function Gr(e,t=!1){const{dep:n,prevSub:s,nextSub:o}=e;if(s&&(s.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let r=n.computed.deps;r;r=r.nextDep)Gr(r,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Ku(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let bt=!0;const Rl=[];function Gt(){Rl.push(bt),bt=!1}function Yt(){const e=Rl.pop();bt=e===void 0?!0:e}function Oi(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Ee;Ee=void 0;try{t()}finally{Ee=n}}}let ms=0;class Qu{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Yr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Ee||!bt||Ee===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Ee)n=this.activeLink=new Qu(Ee,this),Ee.deps?(n.prevDep=Ee.depsTail,Ee.depsTail.nextDep=n,Ee.depsTail=n):Ee.deps=Ee.depsTail=n,Tl(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=Ee.depsTail,n.nextDep=void 0,Ee.depsTail.nextDep=n,Ee.depsTail=n,Ee.deps===n&&(Ee.deps=s)}return n}trigger(t){this.version++,ms++,this.notify(t)}notify(t){Kr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Qr()}}}function Tl(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Tl(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const gr=new WeakMap,wn=Symbol(""),yr=Symbol(""),gs=Symbol("");function Be(e,t,n){if(bt&&Ee){let s=gr.get(e);s||gr.set(e,s=new Map);let o=s.get(n);o||(s.set(n,o=new Yr),o.map=s,o.key=n),o.track()}}function zt(e,t,n,s,o,r){const i=gr.get(e);if(!i){ms++;return}const a=l=>{l&&l.trigger()};if(Kr(),t==="clear")i.forEach(a);else{const l=Z(e),d=l&&Wr(n);if(l&&n==="length"){const c=Number(s);i.forEach((p,h)=>{(h==="length"||h===gs||!Bt(h)&&h>=c)&&a(p)})}else switch((n!==void 0||i.has(void 0))&&a(i.get(n)),d&&a(i.get(gs)),t){case"add":l?d&&a(i.get("length")):(a(i.get(wn)),Dn(e)&&a(i.get(yr)));break;case"delete":l||(a(i.get(wn)),Dn(e)&&a(i.get(yr)));break;case"set":Dn(e)&&a(i.get(wn));break}}Qr()}function Cn(e){const t=he(e);return t===e?t:(Be(t,"iterate",gs),ht(e)?t:t.map(xt))}function So(e){return Be(e=he(e),"iterate",gs),e}function sn(e,t){return Jt(e)?Un(kn(e)?xt(t):t):xt(t)}const Gu={__proto__:null,[Symbol.iterator](){return Qo(this,Symbol.iterator,e=>sn(this,e))},concat(...e){return Cn(this).concat(...e.map(t=>Z(t)?Cn(t):t))},entries(){return Qo(this,"entries",e=>(e[1]=sn(this,e[1]),e))},every(e,t){return Ht(this,"every",e,t,void 0,arguments)},filter(e,t){return Ht(this,"filter",e,t,n=>n.map(s=>sn(this,s)),arguments)},find(e,t){return Ht(this,"find",e,t,n=>sn(this,n),arguments)},findIndex(e,t){return Ht(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ht(this,"findLast",e,t,n=>sn(this,n),arguments)},findLastIndex(e,t){return Ht(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ht(this,"forEach",e,t,void 0,arguments)},includes(...e){return Go(this,"includes",e)},indexOf(...e){return Go(this,"indexOf",e)},join(e){return Cn(this).join(e)},lastIndexOf(...e){return Go(this,"lastIndexOf",e)},map(e,t){return Ht(this,"map",e,t,void 0,arguments)},pop(){return Jn(this,"pop")},push(...e){return Jn(this,"push",e)},reduce(e,...t){return Di(this,"reduce",e,t)},reduceRight(e,...t){return Di(this,"reduceRight",e,t)},shift(){return Jn(this,"shift")},some(e,t){return Ht(this,"some",e,t,void 0,arguments)},splice(...e){return Jn(this,"splice",e)},toReversed(){return Cn(this).toReversed()},toSorted(e){return Cn(this).toSorted(e)},toSpliced(...e){return Cn(this).toSpliced(...e)},unshift(...e){return Jn(this,"unshift",e)},values(){return Qo(this,"values",e=>sn(this,e))}};function Qo(e,t,n){const s=So(e),o=s[t]();return s!==e&&!ht(e)&&(o._next=o.next,o.next=()=>{const r=o._next();return r.done||(r.value=n(r.value)),r}),o}const Yu=Array.prototype;function Ht(e,t,n,s,o,r){const i=So(e),a=i!==e&&!ht(e),l=i[t];if(l!==Yu[t]){const p=l.apply(e,r);return a?xt(p):p}let d=n;i!==e&&(a?d=function(p,h){return n.call(this,sn(e,p),h,e)}:n.length>2&&(d=function(p,h){return n.call(this,p,h,e)}));const c=l.call(i,d,s);return a&&o?o(c):c}function Di(e,t,n,s){const o=So(e);let r=n;return o!==e&&(ht(e)?n.length>3&&(r=function(i,a,l){return n.call(this,i,a,l,e)}):r=function(i,a,l){return n.call(this,i,sn(e,a),l,e)}),o[t](r,...s)}function Go(e,t,n){const s=he(e);Be(s,"iterate",gs);const o=s[t](...n);return(o===-1||o===!1)&&Zr(n[0])?(n[0]=he(n[0]),s[t](...n)):o}function Jn(e,t,n=[]){Gt(),Kr();const s=he(e)[t].apply(e,n);return Qr(),Yt(),s}const Ju=jr("__proto__,__v_isRef,__isVue"),Pl=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Bt));function Xu(e){Bt(e)||(e=String(e));const t=he(this);return Be(t,"has",e),t.hasOwnProperty(e)}class Ol{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,r=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return r;if(n==="__v_raw")return s===(o?r?ld:$l:r?Il:Nl).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const i=Z(t);if(!o){let l;if(i&&(l=Gu[n]))return l;if(n==="hasOwnProperty")return Xu}const a=Reflect.get(t,n,qe(t)?t:s);if((Bt(n)?Pl.has(n):Ju(n))||(o||Be(t,"get",n),r))return a;if(qe(a)){const l=i&&Wr(n)?a:a.value;return o&&be(l)?br(l):l}return be(a)?o?br(a):Fn(a):a}}class Dl extends Ol{constructor(t=!1){super(!1,t)}set(t,n,s,o){let r=t[n];const i=Z(t)&&Wr(n);if(!this._isShallow){const d=Jt(r);if(!ht(s)&&!Jt(s)&&(r=he(r),s=he(s)),!i&&qe(r)&&!qe(s))return d||(r.value=s),!0}const a=i?Number(n)e,Bs=e=>Reflect.getPrototypeOf(e);function sd(e,t,n){return function(...s){const o=this.__v_raw,r=he(o),i=Dn(r),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,d=o[e](...s),c=n?vr:t?Un:xt;return!t&&Be(r,"iterate",l?yr:wn),$e(Object.create(d),{next(){const{value:p,done:h}=d.next();return h?{value:p,done:h}:{value:a?[c(p[0]),c(p[1])]:c(p),done:h}}})}}function Hs(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function od(e,t){const n={get(o){const r=this.__v_raw,i=he(r),a=he(o);e||(ln(o,a)&&Be(i,"get",o),Be(i,"get",a));const{has:l}=Bs(i),d=t?vr:e?Un:xt;if(l.call(i,o))return d(r.get(o));if(l.call(i,a))return d(r.get(a));r!==i&&r.get(o)},get size(){const o=this.__v_raw;return!e&&Be(he(o),"iterate",wn),o.size},has(o){const r=this.__v_raw,i=he(r),a=he(o);return e||(ln(o,a)&&Be(i,"has",o),Be(i,"has",a)),o===a?r.has(o):r.has(o)||r.has(a)},forEach(o,r){const i=this,a=i.__v_raw,l=he(a),d=t?vr:e?Un:xt;return!e&&Be(l,"iterate",wn),a.forEach((c,p)=>o.call(r,d(c),d(p),i))}};return $e(n,e?{add:Hs("add"),set:Hs("set"),delete:Hs("delete"),clear:Hs("clear")}:{add(o){!t&&!ht(o)&&!Jt(o)&&(o=he(o));const r=he(this);return Bs(r).has.call(r,o)||(r.add(o),zt(r,"add",o,o)),this},set(o,r){!t&&!ht(r)&&!Jt(r)&&(r=he(r));const i=he(this),{has:a,get:l}=Bs(i);let d=a.call(i,o);d||(o=he(o),d=a.call(i,o));const c=l.call(i,o);return i.set(o,r),d?ln(r,c)&&zt(i,"set",o,r):zt(i,"add",o,r),this},delete(o){const r=he(this),{has:i,get:a}=Bs(r);let l=i.call(r,o);l||(o=he(o),l=i.call(r,o)),a&&a.call(r,o);const d=r.delete(o);return l&&zt(r,"delete",o,void 0),d},clear(){const o=he(this),r=o.size!==0,i=o.clear();return r&&zt(o,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=sd(o,e,t)}),n}function Jr(e,t){const n=od(e,t);return(s,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(ye(n,o)&&o in s?n:s,o,r)}const rd={get:Jr(!1,!1)},id={get:Jr(!1,!0)},ad={get:Jr(!0,!1)};const Nl=new WeakMap,Il=new WeakMap,$l=new WeakMap,ld=new WeakMap;function cd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ud(e){return e.__v_skip||!Object.isExtensible(e)?0:cd(Iu(e))}function Fn(e){return Jt(e)?e:Xr(e,!1,ed,rd,Nl)}function Ll(e){return Xr(e,!1,nd,id,Il)}function br(e){return Xr(e,!0,td,ad,$l)}function Xr(e,t,n,s,o){if(!be(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const r=ud(e);if(r===0)return e;const i=o.get(e);if(i)return i;const a=new Proxy(e,r===2?s:n);return o.set(e,a),a}function kn(e){return Jt(e)?kn(e.__v_raw):!!(e&&e.__v_isReactive)}function Jt(e){return!!(e&&e.__v_isReadonly)}function ht(e){return!!(e&&e.__v_isShallow)}function Zr(e){return e?!!e.__v_raw:!1}function he(e){const t=e&&e.__v_raw;return t?he(t):e}function dd(e){return!ye(e,"__v_skip")&&Object.isExtensible(e)&&vl(e,"__v_skip",!0),e}const xt=e=>be(e)?Fn(e):e,Un=e=>be(e)?br(e):e;function qe(e){return e?e.__v_isRef===!0:!1}function se(e){return Fl(e,!1)}function fd(e){return Fl(e,!0)}function Fl(e,t){return qe(e)?e:new pd(e,t)}class pd{constructor(t,n){this.dep=new Yr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:he(t),this._value=n?t:xt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||ht(t)||Jt(t);t=s?t:he(t),ln(t,n)&&(this._rawValue=t,this._value=s?t:xt(t),this.dep.trigger())}}function u(e){return qe(e)?e.value:e}const hd={get:(e,t,n)=>t==="__v_raw"?e:u(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return qe(o)&&!qe(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function Ul(e){return kn(e)?e:new Proxy(e,hd)}class md{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Yr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ms-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&Ee!==this)return Sl(this,!0),!0}get value(){const t=this.dep.track();return Cl(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function gd(e,t,n=!1){let s,o;return re(e)?s=e:(s=e.get,o=e.set),new md(s,o,n)}const js={},ro=new WeakMap;let vn;function yd(e,t=!1,n=vn){if(n){let s=ro.get(n);s||ro.set(n,s=[]),s.push(e)}}function vd(e,t,n=we){const{immediate:s,deep:o,once:r,scheduler:i,augmentJob:a,call:l}=n,d=P=>o?P:ht(P)||o===!1||o===0?Kt(P,1):Kt(P);let c,p,h,g,v=!1,k=!1;if(qe(e)?(p=()=>e.value,v=ht(e)):kn(e)?(p=()=>d(e),v=!0):Z(e)?(k=!0,v=e.some(P=>kn(P)||ht(P)),p=()=>e.map(P=>{if(qe(P))return P.value;if(kn(P))return d(P);if(re(P))return l?l(P,2):P()})):re(e)?t?p=l?()=>l(e,2):e:p=()=>{if(h){Gt();try{h()}finally{Yt()}}const P=vn;vn=c;try{return l?l(e,3,[g]):e(g)}finally{vn=P}}:p=Ut,t&&o){const P=p,U=o===!0?1/0:o;p=()=>Kt(P(),U)}const b=zu(),R=()=>{c.stop(),b&&b.active&&Vr(b.effects,c)};if(r&&t){const P=t;t=(...U)=>{P(...U),R()}}let D=k?new Array(e.length).fill(js):js;const C=P=>{if(!(!(c.flags&1)||!c.dirty&&!P))if(t){const U=c.run();if(o||v||(k?U.some((x,_)=>ln(x,D[_])):ln(U,D))){h&&h();const x=vn;vn=c;try{const _=[U,D===js?void 0:k&&D[0]===js?[]:D,g];D=U,l?l(t,3,_):t(..._)}finally{vn=x}}}else c.run()};return a&&a(C),c=new wl(p),c.scheduler=i?()=>i(C,!1):C,g=P=>yd(P,!1,c),h=c.onStop=()=>{const P=ro.get(c);if(P){if(l)l(P,4);else for(const U of P)U();ro.delete(c)}},t?s?C(!0):D=c.run():i?i(C.bind(null,!0),!0):c.run(),R.pause=c.pause.bind(c),R.resume=c.resume.bind(c),R.stop=R,R}function Kt(e,t=1/0,n){if(t<=0||!be(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,qe(e))Kt(e.value,t,n);else if(Z(e))for(let s=0;s{Kt(s,t,n)});else if(yl(e)){for(const s in e)Kt(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Kt(e[s],t,n)}return e}/** +**/let tt;class Wu{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=tt,!t&&tt&&(this.index=(tt.scopes||(tt.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(tt=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(cs){let t=cs;for(cs=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;ls;){let t=ls;for(ls=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function El(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Al(e){let t,n=e.depsTail,s=n;for(;s;){const o=s.prevDep;s.version===-1?(s===n&&(n=o),Gr(s),Ku(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=o}e.deps=t,e.depsTail=n}function mr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Cl(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Cl(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===ms)||(e.globalVersion=ms,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!mr(e))))return;e.flags|=2;const t=e.dep,n=Ee,s=vt;Ee=e,vt=!0;try{El(e);const o=e.fn(e._value);(t.version===0||ln(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{Ee=n,vt=s,Al(e),e.flags&=-3}}function Gr(e,t=!1){const{dep:n,prevSub:s,nextSub:o}=e;if(s&&(s.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let r=n.computed.deps;r;r=r.nextDep)Gr(r,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Ku(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let vt=!0;const Rl=[];function Yt(){Rl.push(vt),vt=!1}function Jt(){const e=Rl.pop();vt=e===void 0?!0:e}function Oi(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Ee;Ee=void 0;try{t()}finally{Ee=n}}}let ms=0;class Qu{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Yr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Ee||!vt||Ee===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Ee)n=this.activeLink=new Qu(Ee,this),Ee.deps?(n.prevDep=Ee.depsTail,Ee.depsTail.nextDep=n,Ee.depsTail=n):Ee.deps=Ee.depsTail=n,Tl(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=Ee.depsTail,n.nextDep=void 0,Ee.depsTail.nextDep=n,Ee.depsTail=n,Ee.deps===n&&(Ee.deps=s)}return n}trigger(t){this.version++,ms++,this.notify(t)}notify(t){Kr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Qr()}}}function Tl(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Tl(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const gr=new WeakMap,wn=Symbol(""),yr=Symbol(""),gs=Symbol("");function Be(e,t,n){if(vt&&Ee){let s=gr.get(e);s||gr.set(e,s=new Map);let o=s.get(n);o||(s.set(n,o=new Yr),o.map=s,o.key=n),o.track()}}function Kt(e,t,n,s,o,r){const i=gr.get(e);if(!i){ms++;return}const a=l=>{l&&l.trigger()};if(Kr(),t==="clear")i.forEach(a);else{const l=Z(e),d=l&&Wr(n);if(l&&n==="length"){const c=Number(s);i.forEach((p,h)=>{(h==="length"||h===gs||!Bt(h)&&h>=c)&&a(p)})}else switch((n!==void 0||i.has(void 0))&&a(i.get(n)),d&&a(i.get(gs)),t){case"add":l?d&&a(i.get("length")):(a(i.get(wn)),Dn(e)&&a(i.get(yr)));break;case"delete":l||(a(i.get(wn)),Dn(e)&&a(i.get(yr)));break;case"set":Dn(e)&&a(i.get(wn));break}}Qr()}function Cn(e){const t=he(e);return t===e?t:(Be(t,"iterate",gs),ht(e)?t:t.map(xt))}function So(e){return Be(e=he(e),"iterate",gs),e}function sn(e,t){return Xt(e)?Fn(kn(e)?xt(t):t):xt(t)}const Gu={__proto__:null,[Symbol.iterator](){return Qo(this,Symbol.iterator,e=>sn(this,e))},concat(...e){return Cn(this).concat(...e.map(t=>Z(t)?Cn(t):t))},entries(){return Qo(this,"entries",e=>(e[1]=sn(this,e[1]),e))},every(e,t){return Ht(this,"every",e,t,void 0,arguments)},filter(e,t){return Ht(this,"filter",e,t,n=>n.map(s=>sn(this,s)),arguments)},find(e,t){return Ht(this,"find",e,t,n=>sn(this,n),arguments)},findIndex(e,t){return Ht(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ht(this,"findLast",e,t,n=>sn(this,n),arguments)},findLastIndex(e,t){return Ht(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ht(this,"forEach",e,t,void 0,arguments)},includes(...e){return Go(this,"includes",e)},indexOf(...e){return Go(this,"indexOf",e)},join(e){return Cn(this).join(e)},lastIndexOf(...e){return Go(this,"lastIndexOf",e)},map(e,t){return Ht(this,"map",e,t,void 0,arguments)},pop(){return Jn(this,"pop")},push(...e){return Jn(this,"push",e)},reduce(e,...t){return Di(this,"reduce",e,t)},reduceRight(e,...t){return Di(this,"reduceRight",e,t)},shift(){return Jn(this,"shift")},some(e,t){return Ht(this,"some",e,t,void 0,arguments)},splice(...e){return Jn(this,"splice",e)},toReversed(){return Cn(this).toReversed()},toSorted(e){return Cn(this).toSorted(e)},toSpliced(...e){return Cn(this).toSpliced(...e)},unshift(...e){return Jn(this,"unshift",e)},values(){return Qo(this,"values",e=>sn(this,e))}};function Qo(e,t,n){const s=So(e),o=s[t]();return s!==e&&!ht(e)&&(o._next=o.next,o.next=()=>{const r=o._next();return r.done||(r.value=n(r.value)),r}),o}const Yu=Array.prototype;function Ht(e,t,n,s,o,r){const i=So(e),a=i!==e&&!ht(e),l=i[t];if(l!==Yu[t]){const p=l.apply(e,r);return a?xt(p):p}let d=n;i!==e&&(a?d=function(p,h){return n.call(this,sn(e,p),h,e)}:n.length>2&&(d=function(p,h){return n.call(this,p,h,e)}));const c=l.call(i,d,s);return a&&o?o(c):c}function Di(e,t,n,s){const o=So(e);let r=n;return o!==e&&(ht(e)?n.length>3&&(r=function(i,a,l){return n.call(this,i,a,l,e)}):r=function(i,a,l){return n.call(this,i,sn(e,a),l,e)}),o[t](r,...s)}function Go(e,t,n){const s=he(e);Be(s,"iterate",gs);const o=s[t](...n);return(o===-1||o===!1)&&Zr(n[0])?(n[0]=he(n[0]),s[t](...n)):o}function Jn(e,t,n=[]){Yt(),Kr();const s=he(e)[t].apply(e,n);return Qr(),Jt(),s}const Ju=jr("__proto__,__v_isRef,__isVue"),Pl=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Bt));function Xu(e){Bt(e)||(e=String(e));const t=he(this);return Be(t,"has",e),t.hasOwnProperty(e)}class Ol{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,r=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return r;if(n==="__v_raw")return s===(o?r?ld:$l:r?Il:Nl).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const i=Z(t);if(!o){let l;if(i&&(l=Gu[n]))return l;if(n==="hasOwnProperty")return Xu}const a=Reflect.get(t,n,qe(t)?t:s);if((Bt(n)?Pl.has(n):Ju(n))||(o||Be(t,"get",n),r))return a;if(qe(a)){const l=i&&Wr(n)?a:a.value;return o&&ve(l)?vr(l):l}return ve(a)?o?vr(a):Un(a):a}}class Dl extends Ol{constructor(t=!1){super(!1,t)}set(t,n,s,o){let r=t[n];const i=Z(t)&&Wr(n);if(!this._isShallow){const d=Xt(r);if(!ht(s)&&!Xt(s)&&(r=he(r),s=he(s)),!i&&qe(r)&&!qe(s))return d||(r.value=s),!0}const a=i?Number(n)e,Bs=e=>Reflect.getPrototypeOf(e);function sd(e,t,n){return function(...s){const o=this.__v_raw,r=he(o),i=Dn(r),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,d=o[e](...s),c=n?br:t?Fn:xt;return!t&&Be(r,"iterate",l?yr:wn),$e(Object.create(d),{next(){const{value:p,done:h}=d.next();return h?{value:p,done:h}:{value:a?[c(p[0]),c(p[1])]:c(p),done:h}}})}}function Hs(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function od(e,t){const n={get(o){const r=this.__v_raw,i=he(r),a=he(o);e||(ln(o,a)&&Be(i,"get",o),Be(i,"get",a));const{has:l}=Bs(i),d=t?br:e?Fn:xt;if(l.call(i,o))return d(r.get(o));if(l.call(i,a))return d(r.get(a));r!==i&&r.get(o)},get size(){const o=this.__v_raw;return!e&&Be(he(o),"iterate",wn),o.size},has(o){const r=this.__v_raw,i=he(r),a=he(o);return e||(ln(o,a)&&Be(i,"has",o),Be(i,"has",a)),o===a?r.has(o):r.has(o)||r.has(a)},forEach(o,r){const i=this,a=i.__v_raw,l=he(a),d=t?br:e?Fn:xt;return!e&&Be(l,"iterate",wn),a.forEach((c,p)=>o.call(r,d(c),d(p),i))}};return $e(n,e?{add:Hs("add"),set:Hs("set"),delete:Hs("delete"),clear:Hs("clear")}:{add(o){!t&&!ht(o)&&!Xt(o)&&(o=he(o));const r=he(this);return Bs(r).has.call(r,o)||(r.add(o),Kt(r,"add",o,o)),this},set(o,r){!t&&!ht(r)&&!Xt(r)&&(r=he(r));const i=he(this),{has:a,get:l}=Bs(i);let d=a.call(i,o);d||(o=he(o),d=a.call(i,o));const c=l.call(i,o);return i.set(o,r),d?ln(r,c)&&Kt(i,"set",o,r):Kt(i,"add",o,r),this},delete(o){const r=he(this),{has:i,get:a}=Bs(r);let l=i.call(r,o);l||(o=he(o),l=i.call(r,o)),a&&a.call(r,o);const d=r.delete(o);return l&&Kt(r,"delete",o,void 0),d},clear(){const o=he(this),r=o.size!==0,i=o.clear();return r&&Kt(o,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=sd(o,e,t)}),n}function Jr(e,t){const n=od(e,t);return(s,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(ye(n,o)&&o in s?n:s,o,r)}const rd={get:Jr(!1,!1)},id={get:Jr(!1,!0)},ad={get:Jr(!0,!1)};const Nl=new WeakMap,Il=new WeakMap,$l=new WeakMap,ld=new WeakMap;function cd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ud(e){return e.__v_skip||!Object.isExtensible(e)?0:cd(Iu(e))}function Un(e){return Xt(e)?e:Xr(e,!1,ed,rd,Nl)}function Ll(e){return Xr(e,!1,nd,id,Il)}function vr(e){return Xr(e,!0,td,ad,$l)}function Xr(e,t,n,s,o){if(!ve(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const r=ud(e);if(r===0)return e;const i=o.get(e);if(i)return i;const a=new Proxy(e,r===2?s:n);return o.set(e,a),a}function kn(e){return Xt(e)?kn(e.__v_raw):!!(e&&e.__v_isReactive)}function Xt(e){return!!(e&&e.__v_isReadonly)}function ht(e){return!!(e&&e.__v_isShallow)}function Zr(e){return e?!!e.__v_raw:!1}function he(e){const t=e&&e.__v_raw;return t?he(t):e}function dd(e){return!ye(e,"__v_skip")&&Object.isExtensible(e)&&bl(e,"__v_skip",!0),e}const xt=e=>ve(e)?Un(e):e,Fn=e=>ve(e)?vr(e):e;function qe(e){return e?e.__v_isRef===!0:!1}function se(e){return Ul(e,!1)}function fd(e){return Ul(e,!0)}function Ul(e,t){return qe(e)?e:new pd(e,t)}class pd{constructor(t,n){this.dep=new Yr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:he(t),this._value=n?t:xt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||ht(t)||Xt(t);t=s?t:he(t),ln(t,n)&&(this._rawValue=t,this._value=s?t:xt(t),this.dep.trigger())}}function u(e){return qe(e)?e.value:e}const hd={get:(e,t,n)=>t==="__v_raw"?e:u(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return qe(o)&&!qe(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function Fl(e){return kn(e)?e:new Proxy(e,hd)}class md{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Yr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ms-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&Ee!==this)return Sl(this,!0),!0}get value(){const t=this.dep.track();return Cl(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function gd(e,t,n=!1){let s,o;return re(e)?s=e:(s=e.get,o=e.set),new md(s,o,n)}const js={},ro=new WeakMap;let bn;function yd(e,t=!1,n=bn){if(n){let s=ro.get(n);s||ro.set(n,s=[]),s.push(e)}}function bd(e,t,n=ke){const{immediate:s,deep:o,once:r,scheduler:i,augmentJob:a,call:l}=n,d=P=>o?P:ht(P)||o===!1||o===0?Qt(P,1):Qt(P);let c,p,h,g,b=!1,k=!1;if(qe(e)?(p=()=>e.value,b=ht(e)):kn(e)?(p=()=>d(e),b=!0):Z(e)?(k=!0,b=e.some(P=>kn(P)||ht(P)),p=()=>e.map(P=>{if(qe(P))return P.value;if(kn(P))return d(P);if(re(P))return l?l(P,2):P()})):re(e)?t?p=l?()=>l(e,2):e:p=()=>{if(h){Yt();try{h()}finally{Jt()}}const P=bn;bn=c;try{return l?l(e,3,[g]):e(g)}finally{bn=P}}:p=Ft,t&&o){const P=p,F=o===!0?1/0:o;p=()=>Qt(P(),F)}const v=zu(),R=()=>{c.stop(),v&&v.active&&Vr(v.effects,c)};if(r&&t){const P=t;t=(...F)=>{P(...F),R()}}let D=k?new Array(e.length).fill(js):js;const C=P=>{if(!(!(c.flags&1)||!c.dirty&&!P))if(t){const F=c.run();if(o||b||(k?F.some((x,_)=>ln(x,D[_])):ln(F,D))){h&&h();const x=bn;bn=c;try{const _=[F,D===js?void 0:k&&D[0]===js?[]:D,g];D=F,l?l(t,3,_):t(..._)}finally{bn=x}}}else c.run()};return a&&a(C),c=new wl(p),c.scheduler=i?()=>i(C,!1):C,g=P=>yd(P,!1,c),h=c.onStop=()=>{const P=ro.get(c);if(P){if(l)l(P,4);else for(const F of P)F();ro.delete(c)}},t?s?C(!0):D=c.run():i?i(C.bind(null,!0),!0):c.run(),R.pause=c.pause.bind(c),R.resume=c.resume.bind(c),R.stop=R,R}function Qt(e,t=1/0,n){if(t<=0||!ve(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,qe(e))Qt(e.value,t,n);else if(Z(e))for(let s=0;s{Qt(s,t,n)});else if(yl(e)){for(const s in e)Qt(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Qt(e[s],t,n)}return e}/** * @vue/runtime-core v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/function Rs(e,t,n,s){try{return s?e(...s):e()}catch(o){Eo(o,t,n)}}function wt(e,t,n,s){if(re(e)){const o=Rs(e,t,n,s);return o&&ml(o)&&o.catch(r=>{Eo(r,t,n)}),o}if(Z(e)){const o=[];for(let r=0;r>>1,o=Qe[s],r=ys(o);r=ys(n)?Qe.push(e):Qe.splice(_d(t),0,e),e.flags|=1,Bl()}}function Bl(){io||(io=Ml.then(jl))}function xd(e){Z(e)?Nn.push(...e):on&&e.id===-1?on.splice(Tn+1,0,e):e.flags&1||(Nn.push(e),e.flags|=1),Bl()}function Ni(e,t,n=It+1){for(;nys(n)-ys(s));if(Nn.length=0,on){on.push(...t);return}for(on=t,Tn=0;Tne.id==null?e.flags&2?-1:1/0:e.id;function jl(e){try{for(It=0;It{s._d&&fo(-1);const r=ao(t);let i;try{i=e(...o)}finally{ao(r),s._d&&fo(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function Se(e,t){if(at===null)return e;const n=Po(at),s=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&re(t)?t.call(s&&s.proxy):t}}const wd=Symbol.for("v-scx"),kd=()=>_t(wd);function Xn(e,t){return ni(e,null,t)}function Mt(e,t,n){return ni(e,t,n)}function ni(e,t,n=we){const{immediate:s,deep:o,flush:r,once:i}=n,a=$e({},n),l=t&&s||!t&&r!=="post";let d;if(_s){if(r==="sync"){const g=kd();d=g.__watcherHandles||(g.__watcherHandles=[])}else if(!l){const g=()=>{};return g.stop=Ut,g.resume=Ut,g.pause=Ut,g}}const c=He;a.call=(g,v,k)=>wt(g,c,v,k);let p=!1;r==="post"?a.scheduler=g=>{Ze(g,c&&c.suspense)}:r!=="sync"&&(p=!0,a.scheduler=(g,v)=>{v?g():ti(g)}),a.augmentJob=g=>{t&&(g.flags|=4),p&&(g.flags|=2,c&&(g.id=c.uid,g.i=c))};const h=vd(e,t,a);return _s&&(d?d.push(h):l&&h()),h}function Sd(e,t,n){const s=this.proxy,o=Te(e)?e.includes(".")?Vl(s,e):()=>s[e]:e.bind(s,s);let r;re(t)?r=t:(r=t.handler,n=t);const i=Ts(this),a=ni(o,r.bind(s),n);return i(),a}function Vl(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;oe.__isTeleport,$t=Symbol("_leaveCb"),Zn=Symbol("_enterCb");function Ad(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Zt(()=>{e.isMounted=!0}),oi(()=>{e.isUnmounting=!0}),e}const ft=[Function,Array],zl={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ft,onEnter:ft,onAfterEnter:ft,onEnterCancelled:ft,onBeforeLeave:ft,onLeave:ft,onAfterLeave:ft,onLeaveCancelled:ft,onBeforeAppear:ft,onAppear:ft,onAfterAppear:ft,onAppearCancelled:ft},Kl=e=>{const t=e.subTree;return t.component?Kl(t.component):t},Cd={name:"BaseTransition",props:zl,setup(e,{slots:t}){const n=wc(),s=Ad();return()=>{const o=t.default&&Yl(t.default(),!0);if(!o||!o.length)return;const r=Ql(o),i=he(e),{mode:a}=i;if(s.isLeaving)return Yo(r);const l=Ii(r);if(!l)return Yo(r);let d=_r(l,i,s,n,p=>d=p);l.type!==Ge&&vs(l,d);let c=n.subTree&&Ii(n.subTree);if(c&&c.type!==Ge&&!bn(c,l)&&Kl(n).type!==Ge){let p=_r(c,i,s,n);if(vs(c,p),a==="out-in"&&l.type!==Ge)return s.isLeaving=!0,p.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete p.afterLeave,c=void 0},Yo(r);a==="in-out"&&l.type!==Ge?p.delayLeave=(h,g,v)=>{const k=Gl(s,c);k[String(c.key)]=c,h[$t]=()=>{g(),h[$t]=void 0,delete d.delayedLeave,c=void 0},d.delayedLeave=()=>{v(),delete d.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return r}}};function Ql(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Ge){t=n;break}}return t}const Rd=Cd;function Gl(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function _r(e,t,n,s,o){const{appear:r,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:d,onAfterEnter:c,onEnterCancelled:p,onBeforeLeave:h,onLeave:g,onAfterLeave:v,onLeaveCancelled:k,onBeforeAppear:b,onAppear:R,onAfterAppear:D,onAppearCancelled:C}=t,P=String(e.key),U=Gl(n,e),x=(j,M)=>{j&&wt(j,s,9,M)},_=(j,M)=>{const Q=M[1];x(j,M),Z(j)?j.every(N=>N.length<=1)&&Q():j.length<=1&&Q()},E={mode:i,persisted:a,beforeEnter(j){let M=l;if(!n.isMounted)if(r)M=b||l;else return;j[$t]&&j[$t](!0);const Q=U[P];Q&&bn(e,Q)&&Q.el[$t]&&Q.el[$t](),x(M,[j])},enter(j){let M=d,Q=c,N=p;if(!n.isMounted)if(r)M=R||d,Q=D||c,N=C||p;else return;let te=!1;j[Zn]=Me=>{te||(te=!0,Me?x(N,[j]):x(Q,[j]),E.delayedLeave&&E.delayedLeave(),j[Zn]=void 0)};const le=j[Zn].bind(null,!1);M?_(M,[j,le]):le()},leave(j,M){const Q=String(e.key);if(j[Zn]&&j[Zn](!0),n.isUnmounting)return M();x(h,[j]);let N=!1;j[$t]=le=>{N||(N=!0,M(),le?x(k,[j]):x(v,[j]),j[$t]=void 0,U[Q]===e&&delete U[Q])};const te=j[$t].bind(null,!1);U[Q]=e,g?_(g,[j,te]):te()},clone(j){const M=_r(j,t,n,s,o);return o&&o(M),M}};return E}function Yo(e){if(Ao(e))return e=cn(e),e.children=null,e}function Ii(e){if(!Ao(e))return Wl(e.type)&&e.children?Ql(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&re(n.default))return n.default()}}function vs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,vs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Yl(e,t=!1,n){let s=[],o=0;for(let r=0;r1)for(let r=0;rus(k,t&&(Z(t)?t[b]:t),n,s,o));return}if(ds(s)&&!o){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&us(e,t,n,s.component.subTree);return}const r=s.shapeFlag&4?Po(s.component):s.el,i=o?null:r,{i:a,r:l}=e,d=t&&t.r,c=a.refs===we?a.refs={}:a.refs,p=a.setupState,h=he(p),g=p===we?hl:k=>$i(c,k)?!1:ye(h,k),v=(k,b)=>!(b&&$i(c,b));if(d!=null&&d!==l){if(Li(t),Te(d))c[d]=null,g(d)&&(p[d]=null);else if(qe(d)){const k=t;v(d,k.k)&&(d.value=null),k.k&&(c[k.k]=null)}}if(re(l))Rs(l,a,12,[i,c]);else{const k=Te(l),b=qe(l);if(k||b){const R=()=>{if(e.f){const D=k?g(l)?p[l]:c[l]:v()||!e.k?l.value:c[e.k];if(o)Z(D)&&Vr(D,r);else if(Z(D))D.includes(r)||D.push(r);else if(k)c[l]=[r],g(l)&&(p[l]=c[l]);else{const C=[r];v(l,e.k)&&(l.value=C),e.k&&(c[e.k]=C)}}else k?(c[l]=i,g(l)&&(p[l]=i)):b&&(v(l,e.k)&&(l.value=i),e.k&&(c[e.k]=i))};if(i){const D=()=>{R(),co.delete(e)};D.id=-1,co.set(e,D),Ze(D,n)}else Li(e),R()}}}function Li(e){const t=co.get(e);t&&(t.flags|=8,co.delete(e))}ko().requestIdleCallback;ko().cancelIdleCallback;const ds=e=>!!e.type.__asyncLoader,Ao=e=>e.type.__isKeepAlive;function Td(e,t){Xl(e,"a",t)}function Pd(e,t){Xl(e,"da",t)}function Xl(e,t,n=He){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Co(t,s,n),n){let o=n.parent;for(;o&&o.parent;)Ao(o.parent.vnode)&&Od(s,t,n,o),o=o.parent}}function Od(e,t,n,s){const o=Co(t,e,s,!0);ri(()=>{Vr(s[t],o)},n)}function Co(e,t,n=He,s=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...i)=>{Gt();const a=Ts(n),l=wt(t,n,e,i);return a(),Yt(),l});return s?o.unshift(r):o.push(r),r}}const Xt=e=>(t,n=He)=>{(!_s||e==="sp")&&Co(e,(...s)=>t(...s),n)},Zl=Xt("bm"),Zt=Xt("m"),Dd=Xt("bu"),Nd=Xt("u"),oi=Xt("bum"),ri=Xt("um"),Id=Xt("sp"),$d=Xt("rtg"),Ld=Xt("rtc");function Fd(e,t=He){Co("ec",e,t)}const ec="components";function xr(e,t){return nc(ec,e,!0,t)||e}const tc=Symbol.for("v-ndc");function Ud(e){return Te(e)?nc(ec,e,!1)||e:e||tc}function nc(e,t,n=!0,s=!1){const o=at||He;if(o){const r=o.type;{const a=Sf(r,!1);if(a&&(a===t||a===mt(t)||a===xo(mt(t))))return r}const i=Fi(o[e]||r[e],t)||Fi(o.appContext[e],t);return!i&&s?r:i}}function Fi(e,t){return e&&(e[t]||e[mt(t)]||e[xo(mt(t))])}function Ie(e,t,n,s){let o;const r=n,i=Z(e);if(i||Te(e)){const a=i&&kn(e);let l=!1,d=!1;a&&(l=!ht(e),d=Jt(e),e=So(e)),o=new Array(e.length);for(let c=0,p=e.length;ct(a,l,void 0,r));else{const a=Object.keys(e);o=new Array(a.length);for(let l=0,d=a.length;le?kc(e)?Po(e):wr(e.parent):null,fs=$e(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>wr(e.parent),$root:e=>wr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>oc(e),$forceUpdate:e=>e.f||(e.f=()=>{ti(e.update)}),$nextTick:e=>e.n||(e.n=ei.bind(e.proxy)),$watch:e=>Sd.bind(e)}),Jo=(e,t)=>e!==we&&!e.__isScriptSetup&&ye(e,t),Md={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:o,props:r,accessCache:i,type:a,appContext:l}=e;if(t[0]!=="$"){const h=i[t];if(h!==void 0)switch(h){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return r[t]}else{if(Jo(s,t))return i[t]=1,s[t];if(o!==we&&ye(o,t))return i[t]=2,o[t];if(ye(r,t))return i[t]=3,r[t];if(n!==we&&ye(n,t))return i[t]=4,n[t];kr&&(i[t]=0)}}const d=fs[t];let c,p;if(d)return t==="$attrs"&&Be(e.attrs,"get",""),d(e);if((c=a.__cssModules)&&(c=c[t]))return c;if(n!==we&&ye(n,t))return i[t]=4,n[t];if(p=l.config.globalProperties,ye(p,t))return p[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:r}=e;return Jo(o,t)?(o[t]=n,!0):s!==we&&ye(s,t)?(s[t]=n,!0):ye(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,props:r,type:i}},a){let l;return!!(n[a]||e!==we&&a[0]!=="$"&&ye(e,a)||Jo(t,a)||ye(r,a)||ye(s,a)||ye(fs,a)||ye(o.config.globalProperties,a)||(l=i.__cssModules)&&l[a])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ye(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Ui(e){return Z(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let kr=!0;function Bd(e){const t=oc(e),n=e.proxy,s=e.ctx;kr=!1,t.beforeCreate&&Mi(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:i,watch:a,provide:l,inject:d,created:c,beforeMount:p,mounted:h,beforeUpdate:g,updated:v,activated:k,deactivated:b,beforeDestroy:R,beforeUnmount:D,destroyed:C,unmounted:P,render:U,renderTracked:x,renderTriggered:_,errorCaptured:E,serverPrefetch:j,expose:M,inheritAttrs:Q,components:N,directives:te,filters:le}=t;if(d&&Hd(d,s,null),i)for(const pe in i){const ae=i[pe];re(ae)&&(s[pe]=ae.bind(n))}if(o){const pe=o.call(n,n);be(pe)&&(e.data=Fn(pe))}if(kr=!0,r)for(const pe in r){const ae=r[pe],ut=re(ae)?ae.bind(n,n):re(ae.get)?ae.get.bind(n,n):Ut,At=!re(ae)&&re(ae.set)?ae.set.bind(n):Ut,De=me({get:ut,set:At});Object.defineProperty(s,pe,{enumerable:!0,configurable:!0,get:()=>De.value,set:Oe=>De.value=Oe})}if(a)for(const pe in a)sc(a[pe],s,n,pe);if(l){const pe=re(l)?l.call(n):l;Reflect.ownKeys(pe).forEach(ae=>{Qs(ae,pe[ae])})}c&&Mi(c,e,"c");function ce(pe,ae){Z(ae)?ae.forEach(ut=>pe(ut.bind(n))):ae&&pe(ae.bind(n))}if(ce(Zl,p),ce(Zt,h),ce(Dd,g),ce(Nd,v),ce(Td,k),ce(Pd,b),ce(Fd,E),ce(Ld,x),ce($d,_),ce(oi,D),ce(ri,P),ce(Id,j),Z(M))if(M.length){const pe=e.exposed||(e.exposed={});M.forEach(ae=>{Object.defineProperty(pe,ae,{get:()=>n[ae],set:ut=>n[ae]=ut,enumerable:!0})})}else e.exposed||(e.exposed={});U&&e.render===Ut&&(e.render=U),Q!=null&&(e.inheritAttrs=Q),N&&(e.components=N),te&&(e.directives=te),j&&Jl(e)}function Hd(e,t,n=Ut){Z(e)&&(e=Sr(e));for(const s in e){const o=e[s];let r;be(o)?"default"in o?r=_t(o.from||s,o.default,!0):r=_t(o.from||s):r=_t(o),qe(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:i=>r.value=i}):t[s]=r}}function Mi(e,t,n){wt(Z(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function sc(e,t,n,s){let o=s.includes(".")?Vl(n,s):()=>n[s];if(Te(e)){const r=t[e];re(r)&&Mt(o,r)}else if(re(e))Mt(o,e.bind(n));else if(be(e))if(Z(e))e.forEach(r=>sc(r,t,n,s));else{const r=re(e.handler)?e.handler.bind(n):t[e.handler];re(r)&&Mt(o,r,e)}}function oc(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:i}}=e.appContext,a=r.get(t);let l;return a?l=a:!o.length&&!n&&!s?l=t:(l={},o.length&&o.forEach(d=>uo(l,d,i,!0)),uo(l,t,i)),be(t)&&r.set(t,l),l}function uo(e,t,n,s=!1){const{mixins:o,extends:r}=t;r&&uo(e,r,n,!0),o&&o.forEach(i=>uo(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const a=jd[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const jd={data:Bi,props:Hi,emits:Hi,methods:is,computed:is,beforeCreate:We,created:We,beforeMount:We,mounted:We,beforeUpdate:We,updated:We,beforeDestroy:We,beforeUnmount:We,destroyed:We,unmounted:We,activated:We,deactivated:We,errorCaptured:We,serverPrefetch:We,components:is,directives:is,watch:Vd,provide:Bi,inject:qd};function Bi(e,t){return t?e?function(){return $e(re(e)?e.call(this,this):e,re(t)?t.call(this,this):t)}:t:e}function qd(e,t){return is(Sr(e),Sr(t))}function Sr(e){if(Z(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${mt(t)}Modifiers`]||e[`${fn(t)}Modifiers`];function Qd(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||we;let o=n;const r=t.startsWith("update:"),i=r&&Kd(s,t.slice(7));i&&(i.trim&&(o=n.map(c=>Te(c)?c.trim():c)),i.number&&(o=n.map(wo)));let a,l=s[a=Wo(t)]||s[a=Wo(mt(t))];!l&&r&&(l=s[a=Wo(fn(t))]),l&&wt(l,e,6,o);const d=s[a+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,wt(d,e,6,o)}}const Gd=new WeakMap;function ic(e,t,n=!1){const s=n?Gd:t.emitsCache,o=s.get(e);if(o!==void 0)return o;const r=e.emits;let i={},a=!1;if(!re(e)){const l=d=>{const c=ic(d,t,!0);c&&(a=!0,$e(i,c))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!r&&!a?(be(e)&&s.set(e,null),null):(Z(r)?r.forEach(l=>i[l]=null):$e(i,r),be(e)&&s.set(e,i),i)}function Ro(e,t){return!e||!bo(t)?!1:(t=t.slice(2).replace(/Once$/,""),ye(e,t[0].toLowerCase()+t.slice(1))||ye(e,fn(t))||ye(e,t))}function ji(e){const{type:t,vnode:n,proxy:s,withProxy:o,propsOptions:[r],slots:i,attrs:a,emit:l,render:d,renderCache:c,props:p,data:h,setupState:g,ctx:v,inheritAttrs:k}=e,b=ao(e);let R,D;try{if(n.shapeFlag&4){const P=o||s,U=P;R=Lt(d.call(U,P,c,p,g,h,v)),D=a}else{const P=t;R=Lt(P.length>1?P(p,{attrs:a,slots:i,emit:l}):P(p,null)),D=t.props?a:Yd(a)}}catch(P){ps.length=0,Eo(P,e,1),R=H(Ge)}let C=R;if(D&&k!==!1){const P=Object.keys(D),{shapeFlag:U}=C;P.length&&U&7&&(r&&P.some(qr)&&(D=Jd(D,r)),C=cn(C,D,!1,!0))}return n.dirs&&(C=cn(C,null,!1,!0),C.dirs=C.dirs?C.dirs.concat(n.dirs):n.dirs),n.transition&&vs(C,n.transition),R=C,ao(b),R}const Yd=e=>{let t;for(const n in e)(n==="class"||n==="style"||bo(n))&&((t||(t={}))[n]=e[n]);return t},Jd=(e,t)=>{const n={};for(const s in e)(!qr(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Xd(e,t,n){const{props:s,children:o,component:r}=e,{props:i,children:a,patchFlag:l}=t,d=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return s?qi(s,i,d):!!i;if(l&8){const c=t.dynamicProps;for(let p=0;pObject.create(lc),uc=e=>Object.getPrototypeOf(e)===lc;function ef(e,t,n,s=!1){const o={},r=cc();e.propsDefaults=Object.create(null),dc(e,t,o,r);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=s?o:Ll(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function tf(e,t,n,s){const{props:o,attrs:r,vnode:{patchFlag:i}}=e,a=he(o),[l]=e.propsOptions;let d=!1;if((s||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let p=0;p{l=!0;const[h,g]=fc(p,t,!0);$e(i,h),g&&a.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!r&&!l)return be(e)&&s.set(e,On),On;if(Z(r))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",ai=e=>Z(e)?e.map(Lt):[Lt(e)],sf=(e,t,n)=>{if(t._n)return t;const s=lo((...o)=>ai(t(...o)),n);return s._c=!1,s},pc=(e,t,n)=>{const s=e._ctx;for(const o in e){if(ii(o))continue;const r=e[o];if(re(r))t[o]=sf(o,r,s);else if(r!=null){const i=ai(r);t[o]=()=>i}}},hc=(e,t)=>{const n=ai(t);e.slots.default=()=>n},mc=(e,t,n)=>{for(const s in t)(n||!ii(s))&&(e[s]=t[s])},of=(e,t,n)=>{const s=e.slots=cc();if(e.vnode.shapeFlag&32){const o=t._;o?(mc(s,t,n),n&&vl(s,"_",o,!0)):pc(t,s)}else t&&hc(e,t)},rf=(e,t,n)=>{const{vnode:s,slots:o}=e;let r=!0,i=we;if(s.shapeFlag&32){const a=t._;a?n&&a===1?r=!1:mc(o,t,n):(r=!t.$stable,pc(t,o)),i=t}else t&&(hc(e,t),i={default:1});if(r)for(const a in o)!ii(a)&&i[a]==null&&delete o[a]},Ze=df;function af(e){return lf(e)}function lf(e,t){const n=ko();n.__VUE__=!0;const{insert:s,remove:o,patchProp:r,createElement:i,createText:a,createComment:l,setText:d,setElementText:c,parentNode:p,nextSibling:h,setScopeId:g=Ut,insertStaticContent:v}=e,k=(m,y,S,I=null,F=null,$=null,W=void 0,V=null,q=!!y.dynamicChildren)=>{if(m===y)return;m&&!bn(m,y)&&(I=L(m),Oe(m,F,$,!0),m=null),y.patchFlag===-2&&(q=!1,y.dynamicChildren=null);const{type:B,ref:ee,shapeFlag:K}=y;switch(B){case To:b(m,y,S,I);break;case Ge:R(m,y,S,I);break;case Gs:m==null&&D(y,S,I,W);break;case fe:N(m,y,S,I,F,$,W,V,q);break;default:K&1?U(m,y,S,I,F,$,W,V,q):K&6?te(m,y,S,I,F,$,W,V,q):(K&64||K&128)&&B.process(m,y,S,I,F,$,W,V,q,J)}ee!=null&&F?us(ee,m&&m.ref,$,y||m,!y):ee==null&&m&&m.ref!=null&&us(m.ref,null,$,m,!0)},b=(m,y,S,I)=>{if(m==null)s(y.el=a(y.children),S,I);else{const F=y.el=m.el;y.children!==m.children&&d(F,y.children)}},R=(m,y,S,I)=>{m==null?s(y.el=l(y.children||""),S,I):y.el=m.el},D=(m,y,S,I)=>{[m.el,m.anchor]=v(m.children,y,S,I,m.el,m.anchor)},C=({el:m,anchor:y},S,I)=>{let F;for(;m&&m!==y;)F=h(m),s(m,S,I),m=F;s(y,S,I)},P=({el:m,anchor:y})=>{let S;for(;m&&m!==y;)S=h(m),o(m),m=S;o(y)},U=(m,y,S,I,F,$,W,V,q)=>{if(y.type==="svg"?W="svg":y.type==="math"&&(W="mathml"),m==null)x(y,S,I,F,$,W,V,q);else{const B=m.el&&m.el._isVueCE?m.el:null;try{B&&B._beginPatch(),j(m,y,F,$,W,V,q)}finally{B&&B._endPatch()}}},x=(m,y,S,I,F,$,W,V)=>{let q,B;const{props:ee,shapeFlag:K,transition:X,dirs:oe}=m;if(q=m.el=i(m.type,$,ee&&ee.is,ee),K&8?c(q,m.children):K&16&&E(m.children,q,null,I,F,Xo(m,$),W,V),oe&&pn(m,null,I,"created"),_(q,m,m.scopeId,W,I),ee){for(const ke in ee)ke!=="value"&&!as(ke)&&r(q,ke,null,ee[ke],$,I);"value"in ee&&r(q,"value",null,ee.value,$),(B=ee.onVnodeBeforeMount)&&Dt(B,I,m)}oe&&pn(m,null,I,"beforeMount");const de=cf(F,X);de&&X.beforeEnter(q),s(q,y,S),((B=ee&&ee.onVnodeMounted)||de||oe)&&Ze(()=>{B&&Dt(B,I,m),de&&X.enter(q),oe&&pn(m,null,I,"mounted")},F)},_=(m,y,S,I,F)=>{if(S&&g(m,S),I)for(let $=0;${for(let B=q;B{const V=y.el=m.el;let{patchFlag:q,dynamicChildren:B,dirs:ee}=y;q|=m.patchFlag&16;const K=m.props||we,X=y.props||we;let oe;if(S&&hn(S,!1),(oe=X.onVnodeBeforeUpdate)&&Dt(oe,S,y,m),ee&&pn(y,m,S,"beforeUpdate"),S&&hn(S,!0),(K.innerHTML&&X.innerHTML==null||K.textContent&&X.textContent==null)&&c(V,""),B?M(m.dynamicChildren,B,V,S,I,Xo(y,F),$):W||ae(m,y,V,null,S,I,Xo(y,F),$,!1),q>0){if(q&16)Q(V,K,X,S,F);else if(q&2&&K.class!==X.class&&r(V,"class",null,X.class,F),q&4&&r(V,"style",K.style,X.style,F),q&8){const de=y.dynamicProps;for(let ke=0;ke{oe&&Dt(oe,S,y,m),ee&&pn(y,m,S,"updated")},I)},M=(m,y,S,I,F,$,W)=>{for(let V=0;V{if(y!==S){if(y!==we)for(const $ in y)!as($)&&!($ in S)&&r(m,$,y[$],null,F,I);for(const $ in S){if(as($))continue;const W=S[$],V=y[$];W!==V&&$!=="value"&&r(m,$,V,W,F,I)}"value"in S&&r(m,"value",y.value,S.value,F)}},N=(m,y,S,I,F,$,W,V,q)=>{const B=y.el=m?m.el:a(""),ee=y.anchor=m?m.anchor:a("");let{patchFlag:K,dynamicChildren:X,slotScopeIds:oe}=y;oe&&(V=V?V.concat(oe):oe),m==null?(s(B,S,I),s(ee,S,I),E(y.children||[],S,ee,F,$,W,V,q)):K>0&&K&64&&X&&m.dynamicChildren&&m.dynamicChildren.length===X.length?(M(m.dynamicChildren,X,S,F,$,W,V),(y.key!=null||F&&y===F.subTree)&&gc(m,y,!0)):ae(m,y,S,ee,F,$,W,V,q)},te=(m,y,S,I,F,$,W,V,q)=>{y.slotScopeIds=V,m==null?y.shapeFlag&512?F.ctx.activate(y,S,I,W,q):le(y,S,I,F,$,W,q):Me(m,y,q)},le=(m,y,S,I,F,$,W)=>{const V=m.component=bf(m,I,F);if(Ao(m)&&(V.ctx.renderer=J),_f(V,!1,W),V.asyncDep){if(F&&F.registerDep(V,ce,W),!m.el){const q=V.subTree=H(Ge);R(null,q,y,S),m.placeholder=q.el}}else ce(V,m,y,S,F,$,W)},Me=(m,y,S)=>{const I=y.component=m.component;if(Xd(m,y,S))if(I.asyncDep&&!I.asyncResolved){pe(I,y,S);return}else I.next=y,I.update();else y.el=m.el,I.vnode=y},ce=(m,y,S,I,F,$,W)=>{const V=()=>{if(m.isMounted){let{next:K,bu:X,u:oe,parent:de,vnode:ke}=m;{const Pt=yc(m);if(Pt){K&&(K.el=ke.el,pe(m,K,W)),Pt.asyncDep.then(()=>{Ze(()=>{m.isUnmounted||B()},F)});return}}let _e=K,Je;hn(m,!1),K?(K.el=ke.el,pe(m,K,W)):K=ke,X&&Ks(X),(Je=K.props&&K.props.onVnodeBeforeUpdate)&&Dt(Je,de,K,ke),hn(m,!0);const Xe=ji(m),Tt=m.subTree;m.subTree=Xe,k(Tt,Xe,p(Tt.el),L(Tt),m,F,$),K.el=Xe.el,_e===null&&Zd(m,Xe.el),oe&&Ze(oe,F),(Je=K.props&&K.props.onVnodeUpdated)&&Ze(()=>Dt(Je,de,K,ke),F)}else{let K;const{el:X,props:oe}=y,{bm:de,m:ke,parent:_e,root:Je,type:Xe}=m,Tt=ds(y);hn(m,!1),de&&Ks(de),!Tt&&(K=oe&&oe.onVnodeBeforeMount)&&Dt(K,_e,y),hn(m,!0);{Je.ce&&Je.ce._hasShadowRoot()&&Je.ce._injectChildStyle(Xe);const Pt=m.subTree=ji(m);k(null,Pt,S,I,m,F,$),y.el=Pt.el}if(ke&&Ze(ke,F),!Tt&&(K=oe&&oe.onVnodeMounted)){const Pt=y;Ze(()=>Dt(K,_e,Pt),F)}(y.shapeFlag&256||_e&&ds(_e.vnode)&&_e.vnode.shapeFlag&256)&&m.a&&Ze(m.a,F),m.isMounted=!0,y=S=I=null}};m.scope.on();const q=m.effect=new wl(V);m.scope.off();const B=m.update=q.run.bind(q),ee=m.job=q.runIfDirty.bind(q);ee.i=m,ee.id=m.uid,q.scheduler=()=>ti(ee),hn(m,!0),B()},pe=(m,y,S)=>{y.component=m;const I=m.vnode.props;m.vnode=y,m.next=null,tf(m,y.props,I,S),rf(m,y.children,S),Gt(),Ni(m),Yt()},ae=(m,y,S,I,F,$,W,V,q=!1)=>{const B=m&&m.children,ee=m?m.shapeFlag:0,K=y.children,{patchFlag:X,shapeFlag:oe}=y;if(X>0){if(X&128){At(B,K,S,I,F,$,W,V,q);return}else if(X&256){ut(B,K,S,I,F,$,W,V,q);return}}oe&8?(ee&16&&dt(B,F,$),K!==B&&c(S,K)):ee&16?oe&16?At(B,K,S,I,F,$,W,V,q):dt(B,F,$,!0):(ee&8&&c(S,""),oe&16&&E(K,S,I,F,$,W,V,q))},ut=(m,y,S,I,F,$,W,V,q)=>{m=m||On,y=y||On;const B=m.length,ee=y.length,K=Math.min(B,ee);let X;for(X=0;Xee?dt(m,F,$,!0,!1,K):E(y,S,I,F,$,W,V,q,K)},At=(m,y,S,I,F,$,W,V,q)=>{let B=0;const ee=y.length;let K=m.length-1,X=ee-1;for(;B<=K&&B<=X;){const oe=m[B],de=y[B]=q?Wt(y[B]):Lt(y[B]);if(bn(oe,de))k(oe,de,S,null,F,$,W,V,q);else break;B++}for(;B<=K&&B<=X;){const oe=m[K],de=y[X]=q?Wt(y[X]):Lt(y[X]);if(bn(oe,de))k(oe,de,S,null,F,$,W,V,q);else break;K--,X--}if(B>K){if(B<=X){const oe=X+1,de=oeX)for(;B<=K;)Oe(m[B],F,$,!0),B++;else{const oe=B,de=B,ke=new Map;for(B=de;B<=X;B++){const rt=y[B]=q?Wt(y[B]):Lt(y[B]);rt.key!=null&&ke.set(rt.key,B)}let _e,Je=0;const Xe=X-de+1;let Tt=!1,Pt=0;const Yn=new Array(Xe);for(B=0;B=Xe){Oe(rt,F,$,!0);continue}let Ot;if(rt.key!=null)Ot=ke.get(rt.key);else for(_e=de;_e<=X;_e++)if(Yn[_e-de]===0&&bn(rt,y[_e])){Ot=_e;break}Ot===void 0?Oe(rt,F,$,!0):(Yn[Ot-de]=B+1,Ot>=Pt?Pt=Ot:Tt=!0,k(rt,y[Ot],S,null,F,$,W,V,q),Je++)}const Ai=Tt?uf(Yn):On;for(_e=Ai.length-1,B=Xe-1;B>=0;B--){const rt=de+B,Ot=y[rt],Ci=y[rt+1],Ri=rt+1{const{el:$,type:W,transition:V,children:q,shapeFlag:B}=m;if(B&6){De(m.component.subTree,y,S,I);return}if(B&128){m.suspense.move(y,S,I);return}if(B&64){W.move(m,y,S,J);return}if(W===fe){s($,y,S);for(let K=0;KV.enter($),F);else{const{leave:K,delayLeave:X,afterLeave:oe}=V,de=()=>{m.ctx.isUnmounted?o($):s($,y,S)},ke=()=>{$._isLeaving&&$[$t](!0),K($,()=>{de(),oe&&oe()})};X?X($,de,ke):ke()}else s($,y,S)},Oe=(m,y,S,I=!1,F=!1)=>{const{type:$,props:W,ref:V,children:q,dynamicChildren:B,shapeFlag:ee,patchFlag:K,dirs:X,cacheIndex:oe}=m;if(K===-2&&(F=!1),V!=null&&(Gt(),us(V,null,S,m,!0),Yt()),oe!=null&&(y.renderCache[oe]=void 0),ee&256){y.ctx.deactivate(m);return}const de=ee&1&&X,ke=!ds(m);let _e;if(ke&&(_e=W&&W.onVnodeBeforeUnmount)&&Dt(_e,y,m),ee&6)Rt(m.component,S,I);else{if(ee&128){m.suspense.unmount(S,I);return}de&&pn(m,null,y,"beforeUnmount"),ee&64?m.type.remove(m,y,S,J,I):B&&!B.hasOnce&&($!==fe||K>0&&K&64)?dt(B,y,S,!1,!0):($===fe&&K&384||!F&&ee&16)&&dt(q,y,S),I&&Ct(m)}(ke&&(_e=W&&W.onVnodeUnmounted)||de)&&Ze(()=>{_e&&Dt(_e,y,m),de&&pn(m,null,y,"unmounted")},S)},Ct=m=>{const{type:y,el:S,anchor:I,transition:F}=m;if(y===fe){gt(S,I);return}if(y===Gs){P(m);return}const $=()=>{o(S),F&&!F.persisted&&F.afterLeave&&F.afterLeave()};if(m.shapeFlag&1&&F&&!F.persisted){const{leave:W,delayLeave:V}=F,q=()=>W(S,$);V?V(m.el,$,q):q()}else $()},gt=(m,y)=>{let S;for(;m!==y;)S=h(m),o(m),m=S;o(y)},Rt=(m,y,S)=>{const{bum:I,scope:F,job:$,subTree:W,um:V,m:q,a:B}=m;Wi(q),Wi(B),I&&Ks(I),F.stop(),$&&($.flags|=8,Oe(W,m,y,S)),V&&Ze(V,y),Ze(()=>{m.isUnmounted=!0},y)},dt=(m,y,S,I=!1,F=!1,$=0)=>{for(let W=$;W{if(m.shapeFlag&6)return L(m.component.subTree);if(m.shapeFlag&128)return m.suspense.next();const y=h(m.anchor||m.el),S=y&&y[Ed];return S?h(S):y};let G=!1;const z=(m,y,S)=>{let I;m==null?y._vnode&&(Oe(y._vnode,null,null,!0),I=y._vnode.component):k(y._vnode||null,m,y,null,null,null,S),y._vnode=m,G||(G=!0,Ni(I),Hl(),G=!1)},J={p:k,um:Oe,m:De,r:Ct,mt:le,mc:E,pc:ae,pbc:M,n:L,o:e};return{render:z,hydrate:void 0,createApp:zd(z)}}function Xo({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function hn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function cf(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function gc(e,t,n=!1){const s=e.children,o=t.children;if(Z(s)&&Z(o))for(let r=0;r>1,e[n[a]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,i=n[r-1];r-- >0;)n[r]=i,i=t[i];return n}function yc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:yc(t)}function Wi(e){if(e)for(let t=0;te.__isSuspense;function df(e,t){t&&t.pendingBranch?Z(e)?t.effects.push(...e):t.effects.push(e):xd(e)}const fe=Symbol.for("v-fgt"),To=Symbol.for("v-txt"),Ge=Symbol.for("v-cmt"),Gs=Symbol.for("v-stc"),ps=[];let lt=null;function A(e=!1){ps.push(lt=e?null:[])}function ff(){ps.pop(),lt=ps[ps.length-1]||null}let bs=1;function fo(e,t=!1){bs+=e,e<0&<&&t&&(lt.hasOnce=!0)}function _c(e){return e.dynamicChildren=bs>0?lt||On:null,ff(),bs>0&<&<.push(e),e}function O(e,t,n,s,o,r){return _c(f(e,t,n,s,o,r,!0))}function ct(e,t,n,s,o){return _c(H(e,t,n,s,o,!0))}function po(e){return e?e.__v_isVNode===!0:!1}function bn(e,t){return e.type===t.type&&e.key===t.key}const xc=({key:e})=>e??null,Ys=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Te(e)||qe(e)||re(e)?{i:at,r:e,k:t,f:!!n}:e:null);function f(e,t=null,n=null,s=0,o=null,r=e===fe?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&xc(t),ref:t&&Ys(t),scopeId:ql,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:at};return a?(li(l,n),r&128&&e.normalize(l)):n&&(l.shapeFlag|=Te(n)?8:16),bs>0&&!i&<&&(l.patchFlag>0||r&6)&&l.patchFlag!==32&<.push(l),l}const H=pf;function pf(e,t=null,n=null,s=0,o=null,r=!1){if((!e||e===tc)&&(e=Ge),po(e)){const a=cn(e,t,!0);return n&&li(a,n),bs>0&&!r&<&&(a.shapeFlag&6?lt[lt.indexOf(e)]=a:lt.push(a)),a.patchFlag=-2,a}if(Ef(e)&&(e=e.__vccOpts),t){t=hf(t);let{class:a,style:l}=t;a&&!Te(a)&&(t.class=Ce(a)),be(l)&&(Zr(l)&&!Z(l)&&(l=$e({},l)),t.style=Ln(l))}const i=Te(e)?1:bc(e)?128:Wl(e)?64:be(e)?4:re(e)?2:0;return f(e,t,n,s,o,i,r,!0)}function hf(e){return e?Zr(e)||uc(e)?$e({},e):e:null}function cn(e,t,n=!1,s=!1){const{props:o,ref:r,patchFlag:i,children:a,transition:l}=e,d=t?gf(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&xc(d),ref:t&&t.ref?n&&r?Z(r)?r.concat(Ys(t)):[r,Ys(t)]:Ys(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==fe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&cn(e.ssContent),ssFallback:e.ssFallback&&cn(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&s&&vs(c,l.clone(c)),c}function Ae(e=" ",t=0){return H(To,null,e,t)}function mf(e,t){const n=H(Gs,null,e);return n.staticCount=t,n}function ie(e="",t=!1){return t?(A(),ct(Ge,null,e)):H(Ge,null,e)}function Lt(e){return e==null||typeof e=="boolean"?H(Ge):Z(e)?H(fe,null,e.slice()):po(e)?Wt(e):H(To,null,String(e))}function Wt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:cn(e)}function li(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(Z(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),li(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!uc(t)?t._ctx=at:o===3&&at&&(at.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else re(t)?(t={default:t,_ctx:at},n=32):(t=String(t),s&64?(n=16,t=[Ae(t)]):n=8);e.children=t,e.shapeFlag|=n}function gf(...e){const t={};for(let n=0;nHe||at;let ho,Ar;{const e=ko(),t=(n,s)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),r=>{o.length>1?o.forEach(i=>i(r)):o[0](r)}};ho=t("__VUE_INSTANCE_SETTERS__",n=>He=n),Ar=t("__VUE_SSR_SETTERS__",n=>_s=n)}const Ts=e=>{const t=He;return ho(e),e.scope.on(),()=>{e.scope.off(),ho(t)}},zi=()=>{He&&He.scope.off(),ho(null)};function kc(e){return e.vnode.shapeFlag&4}let _s=!1;function _f(e,t=!1,n=!1){t&&Ar(t);const{props:s,children:o}=e.vnode,r=kc(e);ef(e,s,r,t),of(e,o,n||t);const i=r?xf(e,t):void 0;return t&&Ar(!1),i}function xf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Md);const{setup:s}=n;if(s){Gt();const o=e.setupContext=s.length>1?kf(e):null,r=Ts(e),i=Rs(s,e,0,[e.props,o]),a=ml(i);if(Yt(),r(),(a||e.sp)&&!ds(e)&&Jl(e),a){if(i.then(zi,zi),t)return i.then(l=>{Ki(e,l)}).catch(l=>{Eo(l,e,0)});e.asyncDep=i}else Ki(e,i)}else Sc(e)}function Ki(e,t,n){re(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:be(t)&&(e.setupState=Ul(t)),Sc(e)}function Sc(e,t,n){const s=e.type;e.render||(e.render=s.render||Ut);{const o=Ts(e);Gt();try{Bd(e)}finally{Yt(),o()}}}const wf={get(e,t){return Be(e,"get",""),e[t]}};function kf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,wf),slots:e.slots,emit:e.emit,expose:t}}function Po(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ul(dd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in fs)return fs[n](e)},has(t,n){return n in t||n in fs}})):e.proxy}function Sf(e,t=!0){return re(e)?e.displayName||e.name:e.name||t&&e.__name}function Ef(e){return re(e)&&"__vccOpts"in e}const me=(e,t)=>gd(e,t,_s);function xs(e,t,n){try{fo(-1);const s=arguments.length;return s===2?be(t)&&!Z(t)?po(t)?H(e,null,[t]):H(e,t):H(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&po(n)&&(n=[n]),H(e,t,n))}finally{fo(1)}}const Af="3.5.28";/** +**/function Rs(e,t,n,s){try{return s?e(...s):e()}catch(o){Eo(o,t,n)}}function wt(e,t,n,s){if(re(e)){const o=Rs(e,t,n,s);return o&&ml(o)&&o.catch(r=>{Eo(r,t,n)}),o}if(Z(e)){const o=[];for(let r=0;r>>1,o=Qe[s],r=ys(o);r=ys(n)?Qe.push(e):Qe.splice(_d(t),0,e),e.flags|=1,Bl()}}function Bl(){io||(io=Ml.then(jl))}function xd(e){Z(e)?Nn.push(...e):on&&e.id===-1?on.splice(Tn+1,0,e):e.flags&1||(Nn.push(e),e.flags|=1),Bl()}function Ni(e,t,n=It+1){for(;nys(n)-ys(s));if(Nn.length=0,on){on.push(...t);return}for(on=t,Tn=0;Tne.id==null?e.flags&2?-1:1/0:e.id;function jl(e){try{for(It=0;It{s._d&&fo(-1);const r=ao(t);let i;try{i=e(...o)}finally{ao(r),s._d&&fo(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function xe(e,t){if(at===null)return e;const n=Po(at),s=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&re(t)?t.call(s&&s.proxy):t}}const wd=Symbol.for("v-scx"),kd=()=>_t(wd);function Xn(e,t){return ni(e,null,t)}function Mt(e,t,n){return ni(e,t,n)}function ni(e,t,n=ke){const{immediate:s,deep:o,flush:r,once:i}=n,a=$e({},n),l=t&&s||!t&&r!=="post";let d;if(_s){if(r==="sync"){const g=kd();d=g.__watcherHandles||(g.__watcherHandles=[])}else if(!l){const g=()=>{};return g.stop=Ft,g.resume=Ft,g.pause=Ft,g}}const c=He;a.call=(g,b,k)=>wt(g,c,b,k);let p=!1;r==="post"?a.scheduler=g=>{Ze(g,c&&c.suspense)}:r!=="sync"&&(p=!0,a.scheduler=(g,b)=>{b?g():ti(g)}),a.augmentJob=g=>{t&&(g.flags|=4),p&&(g.flags|=2,c&&(g.id=c.uid,g.i=c))};const h=bd(e,t,a);return _s&&(d?d.push(h):l&&h()),h}function Sd(e,t,n){const s=this.proxy,o=Te(e)?e.includes(".")?Vl(s,e):()=>s[e]:e.bind(s,s);let r;re(t)?r=t:(r=t.handler,n=t);const i=Ts(this),a=ni(o,r.bind(s),n);return i(),a}function Vl(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;oe.__isTeleport,$t=Symbol("_leaveCb"),Zn=Symbol("_enterCb");function Ad(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return en(()=>{e.isMounted=!0}),oi(()=>{e.isUnmounting=!0}),e}const ft=[Function,Array],zl={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ft,onEnter:ft,onAfterEnter:ft,onEnterCancelled:ft,onBeforeLeave:ft,onLeave:ft,onAfterLeave:ft,onLeaveCancelled:ft,onBeforeAppear:ft,onAppear:ft,onAfterAppear:ft,onAppearCancelled:ft},Kl=e=>{const t=e.subTree;return t.component?Kl(t.component):t},Cd={name:"BaseTransition",props:zl,setup(e,{slots:t}){const n=wc(),s=Ad();return()=>{const o=t.default&&Yl(t.default(),!0);if(!o||!o.length)return;const r=Ql(o),i=he(e),{mode:a}=i;if(s.isLeaving)return Yo(r);const l=Ii(r);if(!l)return Yo(r);let d=_r(l,i,s,n,p=>d=p);l.type!==Ge&&bs(l,d);let c=n.subTree&&Ii(n.subTree);if(c&&c.type!==Ge&&!vn(c,l)&&Kl(n).type!==Ge){let p=_r(c,i,s,n);if(bs(c,p),a==="out-in"&&l.type!==Ge)return s.isLeaving=!0,p.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete p.afterLeave,c=void 0},Yo(r);a==="in-out"&&l.type!==Ge?p.delayLeave=(h,g,b)=>{const k=Gl(s,c);k[String(c.key)]=c,h[$t]=()=>{g(),h[$t]=void 0,delete d.delayedLeave,c=void 0},d.delayedLeave=()=>{b(),delete d.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return r}}};function Ql(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Ge){t=n;break}}return t}const Rd=Cd;function Gl(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function _r(e,t,n,s,o){const{appear:r,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:d,onAfterEnter:c,onEnterCancelled:p,onBeforeLeave:h,onLeave:g,onAfterLeave:b,onLeaveCancelled:k,onBeforeAppear:v,onAppear:R,onAfterAppear:D,onAppearCancelled:C}=t,P=String(e.key),F=Gl(n,e),x=(j,M)=>{j&&wt(j,s,9,M)},_=(j,M)=>{const Q=M[1];x(j,M),Z(j)?j.every(N=>N.length<=1)&&Q():j.length<=1&&Q()},E={mode:i,persisted:a,beforeEnter(j){let M=l;if(!n.isMounted)if(r)M=v||l;else return;j[$t]&&j[$t](!0);const Q=F[P];Q&&vn(e,Q)&&Q.el[$t]&&Q.el[$t](),x(M,[j])},enter(j){let M=d,Q=c,N=p;if(!n.isMounted)if(r)M=R||d,Q=D||c,N=C||p;else return;let te=!1;j[Zn]=Me=>{te||(te=!0,Me?x(N,[j]):x(Q,[j]),E.delayedLeave&&E.delayedLeave(),j[Zn]=void 0)};const le=j[Zn].bind(null,!1);M?_(M,[j,le]):le()},leave(j,M){const Q=String(e.key);if(j[Zn]&&j[Zn](!0),n.isUnmounting)return M();x(h,[j]);let N=!1;j[$t]=le=>{N||(N=!0,M(),le?x(k,[j]):x(b,[j]),j[$t]=void 0,F[Q]===e&&delete F[Q])};const te=j[$t].bind(null,!1);F[Q]=e,g?_(g,[j,te]):te()},clone(j){const M=_r(j,t,n,s,o);return o&&o(M),M}};return E}function Yo(e){if(Ao(e))return e=cn(e),e.children=null,e}function Ii(e){if(!Ao(e))return Wl(e.type)&&e.children?Ql(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&re(n.default))return n.default()}}function bs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,bs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Yl(e,t=!1,n){let s=[],o=0;for(let r=0;r1)for(let r=0;rus(k,t&&(Z(t)?t[v]:t),n,s,o));return}if(ds(s)&&!o){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&us(e,t,n,s.component.subTree);return}const r=s.shapeFlag&4?Po(s.component):s.el,i=o?null:r,{i:a,r:l}=e,d=t&&t.r,c=a.refs===ke?a.refs={}:a.refs,p=a.setupState,h=he(p),g=p===ke?hl:k=>$i(c,k)?!1:ye(h,k),b=(k,v)=>!(v&&$i(c,v));if(d!=null&&d!==l){if(Li(t),Te(d))c[d]=null,g(d)&&(p[d]=null);else if(qe(d)){const k=t;b(d,k.k)&&(d.value=null),k.k&&(c[k.k]=null)}}if(re(l))Rs(l,a,12,[i,c]);else{const k=Te(l),v=qe(l);if(k||v){const R=()=>{if(e.f){const D=k?g(l)?p[l]:c[l]:b()||!e.k?l.value:c[e.k];if(o)Z(D)&&Vr(D,r);else if(Z(D))D.includes(r)||D.push(r);else if(k)c[l]=[r],g(l)&&(p[l]=c[l]);else{const C=[r];b(l,e.k)&&(l.value=C),e.k&&(c[e.k]=C)}}else k?(c[l]=i,g(l)&&(p[l]=i)):v&&(b(l,e.k)&&(l.value=i),e.k&&(c[e.k]=i))};if(i){const D=()=>{R(),co.delete(e)};D.id=-1,co.set(e,D),Ze(D,n)}else Li(e),R()}}}function Li(e){const t=co.get(e);t&&(t.flags|=8,co.delete(e))}ko().requestIdleCallback;ko().cancelIdleCallback;const ds=e=>!!e.type.__asyncLoader,Ao=e=>e.type.__isKeepAlive;function Td(e,t){Xl(e,"a",t)}function Pd(e,t){Xl(e,"da",t)}function Xl(e,t,n=He){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Co(t,s,n),n){let o=n.parent;for(;o&&o.parent;)Ao(o.parent.vnode)&&Od(s,t,n,o),o=o.parent}}function Od(e,t,n,s){const o=Co(t,e,s,!0);ri(()=>{Vr(s[t],o)},n)}function Co(e,t,n=He,s=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...i)=>{Yt();const a=Ts(n),l=wt(t,n,e,i);return a(),Jt(),l});return s?o.unshift(r):o.push(r),r}}const Zt=e=>(t,n=He)=>{(!_s||e==="sp")&&Co(e,(...s)=>t(...s),n)},Zl=Zt("bm"),en=Zt("m"),Dd=Zt("bu"),Nd=Zt("u"),oi=Zt("bum"),ri=Zt("um"),Id=Zt("sp"),$d=Zt("rtg"),Ld=Zt("rtc");function Ud(e,t=He){Co("ec",e,t)}const ec="components";function xr(e,t){return nc(ec,e,!0,t)||e}const tc=Symbol.for("v-ndc");function Fd(e){return Te(e)?nc(ec,e,!1)||e:e||tc}function nc(e,t,n=!0,s=!1){const o=at||He;if(o){const r=o.type;{const a=Sf(r,!1);if(a&&(a===t||a===mt(t)||a===xo(mt(t))))return r}const i=Ui(o[e]||r[e],t)||Ui(o.appContext[e],t);return!i&&s?r:i}}function Ui(e,t){return e&&(e[t]||e[mt(t)]||e[xo(mt(t))])}function Ie(e,t,n,s){let o;const r=n,i=Z(e);if(i||Te(e)){const a=i&&kn(e);let l=!1,d=!1;a&&(l=!ht(e),d=Xt(e),e=So(e)),o=new Array(e.length);for(let c=0,p=e.length;ct(a,l,void 0,r));else{const a=Object.keys(e);o=new Array(a.length);for(let l=0,d=a.length;le?kc(e)?Po(e):wr(e.parent):null,fs=$e(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>wr(e.parent),$root:e=>wr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>oc(e),$forceUpdate:e=>e.f||(e.f=()=>{ti(e.update)}),$nextTick:e=>e.n||(e.n=ei.bind(e.proxy)),$watch:e=>Sd.bind(e)}),Jo=(e,t)=>e!==ke&&!e.__isScriptSetup&&ye(e,t),Md={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:o,props:r,accessCache:i,type:a,appContext:l}=e;if(t[0]!=="$"){const h=i[t];if(h!==void 0)switch(h){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return r[t]}else{if(Jo(s,t))return i[t]=1,s[t];if(o!==ke&&ye(o,t))return i[t]=2,o[t];if(ye(r,t))return i[t]=3,r[t];if(n!==ke&&ye(n,t))return i[t]=4,n[t];kr&&(i[t]=0)}}const d=fs[t];let c,p;if(d)return t==="$attrs"&&Be(e.attrs,"get",""),d(e);if((c=a.__cssModules)&&(c=c[t]))return c;if(n!==ke&&ye(n,t))return i[t]=4,n[t];if(p=l.config.globalProperties,ye(p,t))return p[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:r}=e;return Jo(o,t)?(o[t]=n,!0):s!==ke&&ye(s,t)?(s[t]=n,!0):ye(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,props:r,type:i}},a){let l;return!!(n[a]||e!==ke&&a[0]!=="$"&&ye(e,a)||Jo(t,a)||ye(r,a)||ye(s,a)||ye(fs,a)||ye(o.config.globalProperties,a)||(l=i.__cssModules)&&l[a])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ye(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Fi(e){return Z(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let kr=!0;function Bd(e){const t=oc(e),n=e.proxy,s=e.ctx;kr=!1,t.beforeCreate&&Mi(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:i,watch:a,provide:l,inject:d,created:c,beforeMount:p,mounted:h,beforeUpdate:g,updated:b,activated:k,deactivated:v,beforeDestroy:R,beforeUnmount:D,destroyed:C,unmounted:P,render:F,renderTracked:x,renderTriggered:_,errorCaptured:E,serverPrefetch:j,expose:M,inheritAttrs:Q,components:N,directives:te,filters:le}=t;if(d&&Hd(d,s,null),i)for(const pe in i){const ae=i[pe];re(ae)&&(s[pe]=ae.bind(n))}if(o){const pe=o.call(n,n);ve(pe)&&(e.data=Un(pe))}if(kr=!0,r)for(const pe in r){const ae=r[pe],ut=re(ae)?ae.bind(n,n):re(ae.get)?ae.get.bind(n,n):Ft,At=!re(ae)&&re(ae.set)?ae.set.bind(n):Ft,De=me({get:ut,set:At});Object.defineProperty(s,pe,{enumerable:!0,configurable:!0,get:()=>De.value,set:Oe=>De.value=Oe})}if(a)for(const pe in a)sc(a[pe],s,n,pe);if(l){const pe=re(l)?l.call(n):l;Reflect.ownKeys(pe).forEach(ae=>{Qs(ae,pe[ae])})}c&&Mi(c,e,"c");function ce(pe,ae){Z(ae)?ae.forEach(ut=>pe(ut.bind(n))):ae&&pe(ae.bind(n))}if(ce(Zl,p),ce(en,h),ce(Dd,g),ce(Nd,b),ce(Td,k),ce(Pd,v),ce(Ud,E),ce(Ld,x),ce($d,_),ce(oi,D),ce(ri,P),ce(Id,j),Z(M))if(M.length){const pe=e.exposed||(e.exposed={});M.forEach(ae=>{Object.defineProperty(pe,ae,{get:()=>n[ae],set:ut=>n[ae]=ut,enumerable:!0})})}else e.exposed||(e.exposed={});F&&e.render===Ft&&(e.render=F),Q!=null&&(e.inheritAttrs=Q),N&&(e.components=N),te&&(e.directives=te),j&&Jl(e)}function Hd(e,t,n=Ft){Z(e)&&(e=Sr(e));for(const s in e){const o=e[s];let r;ve(o)?"default"in o?r=_t(o.from||s,o.default,!0):r=_t(o.from||s):r=_t(o),qe(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:i=>r.value=i}):t[s]=r}}function Mi(e,t,n){wt(Z(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function sc(e,t,n,s){let o=s.includes(".")?Vl(n,s):()=>n[s];if(Te(e)){const r=t[e];re(r)&&Mt(o,r)}else if(re(e))Mt(o,e.bind(n));else if(ve(e))if(Z(e))e.forEach(r=>sc(r,t,n,s));else{const r=re(e.handler)?e.handler.bind(n):t[e.handler];re(r)&&Mt(o,r,e)}}function oc(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:i}}=e.appContext,a=r.get(t);let l;return a?l=a:!o.length&&!n&&!s?l=t:(l={},o.length&&o.forEach(d=>uo(l,d,i,!0)),uo(l,t,i)),ve(t)&&r.set(t,l),l}function uo(e,t,n,s=!1){const{mixins:o,extends:r}=t;r&&uo(e,r,n,!0),o&&o.forEach(i=>uo(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const a=jd[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const jd={data:Bi,props:Hi,emits:Hi,methods:is,computed:is,beforeCreate:We,created:We,beforeMount:We,mounted:We,beforeUpdate:We,updated:We,beforeDestroy:We,beforeUnmount:We,destroyed:We,unmounted:We,activated:We,deactivated:We,errorCaptured:We,serverPrefetch:We,components:is,directives:is,watch:Vd,provide:Bi,inject:qd};function Bi(e,t){return t?e?function(){return $e(re(e)?e.call(this,this):e,re(t)?t.call(this,this):t)}:t:e}function qd(e,t){return is(Sr(e),Sr(t))}function Sr(e){if(Z(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${mt(t)}Modifiers`]||e[`${fn(t)}Modifiers`];function Qd(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ke;let o=n;const r=t.startsWith("update:"),i=r&&Kd(s,t.slice(7));i&&(i.trim&&(o=n.map(c=>Te(c)?c.trim():c)),i.number&&(o=n.map(wo)));let a,l=s[a=Wo(t)]||s[a=Wo(mt(t))];!l&&r&&(l=s[a=Wo(fn(t))]),l&&wt(l,e,6,o);const d=s[a+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,wt(d,e,6,o)}}const Gd=new WeakMap;function ic(e,t,n=!1){const s=n?Gd:t.emitsCache,o=s.get(e);if(o!==void 0)return o;const r=e.emits;let i={},a=!1;if(!re(e)){const l=d=>{const c=ic(d,t,!0);c&&(a=!0,$e(i,c))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!r&&!a?(ve(e)&&s.set(e,null),null):(Z(r)?r.forEach(l=>i[l]=null):$e(i,r),ve(e)&&s.set(e,i),i)}function Ro(e,t){return!e||!vo(t)?!1:(t=t.slice(2).replace(/Once$/,""),ye(e,t[0].toLowerCase()+t.slice(1))||ye(e,fn(t))||ye(e,t))}function ji(e){const{type:t,vnode:n,proxy:s,withProxy:o,propsOptions:[r],slots:i,attrs:a,emit:l,render:d,renderCache:c,props:p,data:h,setupState:g,ctx:b,inheritAttrs:k}=e,v=ao(e);let R,D;try{if(n.shapeFlag&4){const P=o||s,F=P;R=Lt(d.call(F,P,c,p,g,h,b)),D=a}else{const P=t;R=Lt(P.length>1?P(p,{attrs:a,slots:i,emit:l}):P(p,null)),D=t.props?a:Yd(a)}}catch(P){ps.length=0,Eo(P,e,1),R=H(Ge)}let C=R;if(D&&k!==!1){const P=Object.keys(D),{shapeFlag:F}=C;P.length&&F&7&&(r&&P.some(qr)&&(D=Jd(D,r)),C=cn(C,D,!1,!0))}return n.dirs&&(C=cn(C,null,!1,!0),C.dirs=C.dirs?C.dirs.concat(n.dirs):n.dirs),n.transition&&bs(C,n.transition),R=C,ao(v),R}const Yd=e=>{let t;for(const n in e)(n==="class"||n==="style"||vo(n))&&((t||(t={}))[n]=e[n]);return t},Jd=(e,t)=>{const n={};for(const s in e)(!qr(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Xd(e,t,n){const{props:s,children:o,component:r}=e,{props:i,children:a,patchFlag:l}=t,d=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return s?qi(s,i,d):!!i;if(l&8){const c=t.dynamicProps;for(let p=0;pObject.create(lc),uc=e=>Object.getPrototypeOf(e)===lc;function ef(e,t,n,s=!1){const o={},r=cc();e.propsDefaults=Object.create(null),dc(e,t,o,r);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=s?o:Ll(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function tf(e,t,n,s){const{props:o,attrs:r,vnode:{patchFlag:i}}=e,a=he(o),[l]=e.propsOptions;let d=!1;if((s||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let p=0;p{l=!0;const[h,g]=fc(p,t,!0);$e(i,h),g&&a.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!r&&!l)return ve(e)&&s.set(e,On),On;if(Z(r))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",ai=e=>Z(e)?e.map(Lt):[Lt(e)],sf=(e,t,n)=>{if(t._n)return t;const s=lo((...o)=>ai(t(...o)),n);return s._c=!1,s},pc=(e,t,n)=>{const s=e._ctx;for(const o in e){if(ii(o))continue;const r=e[o];if(re(r))t[o]=sf(o,r,s);else if(r!=null){const i=ai(r);t[o]=()=>i}}},hc=(e,t)=>{const n=ai(t);e.slots.default=()=>n},mc=(e,t,n)=>{for(const s in t)(n||!ii(s))&&(e[s]=t[s])},of=(e,t,n)=>{const s=e.slots=cc();if(e.vnode.shapeFlag&32){const o=t._;o?(mc(s,t,n),n&&bl(s,"_",o,!0)):pc(t,s)}else t&&hc(e,t)},rf=(e,t,n)=>{const{vnode:s,slots:o}=e;let r=!0,i=ke;if(s.shapeFlag&32){const a=t._;a?n&&a===1?r=!1:mc(o,t,n):(r=!t.$stable,pc(t,o)),i=t}else t&&(hc(e,t),i={default:1});if(r)for(const a in o)!ii(a)&&i[a]==null&&delete o[a]},Ze=df;function af(e){return lf(e)}function lf(e,t){const n=ko();n.__VUE__=!0;const{insert:s,remove:o,patchProp:r,createElement:i,createText:a,createComment:l,setText:d,setElementText:c,parentNode:p,nextSibling:h,setScopeId:g=Ft,insertStaticContent:b}=e,k=(m,y,S,I=null,U=null,$=null,W=void 0,V=null,q=!!y.dynamicChildren)=>{if(m===y)return;m&&!vn(m,y)&&(I=L(m),Oe(m,U,$,!0),m=null),y.patchFlag===-2&&(q=!1,y.dynamicChildren=null);const{type:B,ref:ee,shapeFlag:K}=y;switch(B){case To:v(m,y,S,I);break;case Ge:R(m,y,S,I);break;case Gs:m==null&&D(y,S,I,W);break;case fe:N(m,y,S,I,U,$,W,V,q);break;default:K&1?F(m,y,S,I,U,$,W,V,q):K&6?te(m,y,S,I,U,$,W,V,q):(K&64||K&128)&&B.process(m,y,S,I,U,$,W,V,q,J)}ee!=null&&U?us(ee,m&&m.ref,$,y||m,!y):ee==null&&m&&m.ref!=null&&us(m.ref,null,$,m,!0)},v=(m,y,S,I)=>{if(m==null)s(y.el=a(y.children),S,I);else{const U=y.el=m.el;y.children!==m.children&&d(U,y.children)}},R=(m,y,S,I)=>{m==null?s(y.el=l(y.children||""),S,I):y.el=m.el},D=(m,y,S,I)=>{[m.el,m.anchor]=b(m.children,y,S,I,m.el,m.anchor)},C=({el:m,anchor:y},S,I)=>{let U;for(;m&&m!==y;)U=h(m),s(m,S,I),m=U;s(y,S,I)},P=({el:m,anchor:y})=>{let S;for(;m&&m!==y;)S=h(m),o(m),m=S;o(y)},F=(m,y,S,I,U,$,W,V,q)=>{if(y.type==="svg"?W="svg":y.type==="math"&&(W="mathml"),m==null)x(y,S,I,U,$,W,V,q);else{const B=m.el&&m.el._isVueCE?m.el:null;try{B&&B._beginPatch(),j(m,y,U,$,W,V,q)}finally{B&&B._endPatch()}}},x=(m,y,S,I,U,$,W,V)=>{let q,B;const{props:ee,shapeFlag:K,transition:X,dirs:oe}=m;if(q=m.el=i(m.type,$,ee&&ee.is,ee),K&8?c(q,m.children):K&16&&E(m.children,q,null,I,U,Xo(m,$),W,V),oe&&pn(m,null,I,"created"),_(q,m,m.scopeId,W,I),ee){for(const Se in ee)Se!=="value"&&!as(Se)&&r(q,Se,null,ee[Se],$,I);"value"in ee&&r(q,"value",null,ee.value,$),(B=ee.onVnodeBeforeMount)&&Dt(B,I,m)}oe&&pn(m,null,I,"beforeMount");const de=cf(U,X);de&&X.beforeEnter(q),s(q,y,S),((B=ee&&ee.onVnodeMounted)||de||oe)&&Ze(()=>{B&&Dt(B,I,m),de&&X.enter(q),oe&&pn(m,null,I,"mounted")},U)},_=(m,y,S,I,U)=>{if(S&&g(m,S),I)for(let $=0;${for(let B=q;B{const V=y.el=m.el;let{patchFlag:q,dynamicChildren:B,dirs:ee}=y;q|=m.patchFlag&16;const K=m.props||ke,X=y.props||ke;let oe;if(S&&hn(S,!1),(oe=X.onVnodeBeforeUpdate)&&Dt(oe,S,y,m),ee&&pn(y,m,S,"beforeUpdate"),S&&hn(S,!0),(K.innerHTML&&X.innerHTML==null||K.textContent&&X.textContent==null)&&c(V,""),B?M(m.dynamicChildren,B,V,S,I,Xo(y,U),$):W||ae(m,y,V,null,S,I,Xo(y,U),$,!1),q>0){if(q&16)Q(V,K,X,S,U);else if(q&2&&K.class!==X.class&&r(V,"class",null,X.class,U),q&4&&r(V,"style",K.style,X.style,U),q&8){const de=y.dynamicProps;for(let Se=0;Se{oe&&Dt(oe,S,y,m),ee&&pn(y,m,S,"updated")},I)},M=(m,y,S,I,U,$,W)=>{for(let V=0;V{if(y!==S){if(y!==ke)for(const $ in y)!as($)&&!($ in S)&&r(m,$,y[$],null,U,I);for(const $ in S){if(as($))continue;const W=S[$],V=y[$];W!==V&&$!=="value"&&r(m,$,V,W,U,I)}"value"in S&&r(m,"value",y.value,S.value,U)}},N=(m,y,S,I,U,$,W,V,q)=>{const B=y.el=m?m.el:a(""),ee=y.anchor=m?m.anchor:a("");let{patchFlag:K,dynamicChildren:X,slotScopeIds:oe}=y;oe&&(V=V?V.concat(oe):oe),m==null?(s(B,S,I),s(ee,S,I),E(y.children||[],S,ee,U,$,W,V,q)):K>0&&K&64&&X&&m.dynamicChildren&&m.dynamicChildren.length===X.length?(M(m.dynamicChildren,X,S,U,$,W,V),(y.key!=null||U&&y===U.subTree)&&gc(m,y,!0)):ae(m,y,S,ee,U,$,W,V,q)},te=(m,y,S,I,U,$,W,V,q)=>{y.slotScopeIds=V,m==null?y.shapeFlag&512?U.ctx.activate(y,S,I,W,q):le(y,S,I,U,$,W,q):Me(m,y,q)},le=(m,y,S,I,U,$,W)=>{const V=m.component=vf(m,I,U);if(Ao(m)&&(V.ctx.renderer=J),_f(V,!1,W),V.asyncDep){if(U&&U.registerDep(V,ce,W),!m.el){const q=V.subTree=H(Ge);R(null,q,y,S),m.placeholder=q.el}}else ce(V,m,y,S,U,$,W)},Me=(m,y,S)=>{const I=y.component=m.component;if(Xd(m,y,S))if(I.asyncDep&&!I.asyncResolved){pe(I,y,S);return}else I.next=y,I.update();else y.el=m.el,I.vnode=y},ce=(m,y,S,I,U,$,W)=>{const V=()=>{if(m.isMounted){let{next:K,bu:X,u:oe,parent:de,vnode:Se}=m;{const Pt=yc(m);if(Pt){K&&(K.el=Se.el,pe(m,K,W)),Pt.asyncDep.then(()=>{Ze(()=>{m.isUnmounted||B()},U)});return}}let _e=K,Je;hn(m,!1),K?(K.el=Se.el,pe(m,K,W)):K=Se,X&&Ks(X),(Je=K.props&&K.props.onVnodeBeforeUpdate)&&Dt(Je,de,K,Se),hn(m,!0);const Xe=ji(m),Tt=m.subTree;m.subTree=Xe,k(Tt,Xe,p(Tt.el),L(Tt),m,U,$),K.el=Xe.el,_e===null&&Zd(m,Xe.el),oe&&Ze(oe,U),(Je=K.props&&K.props.onVnodeUpdated)&&Ze(()=>Dt(Je,de,K,Se),U)}else{let K;const{el:X,props:oe}=y,{bm:de,m:Se,parent:_e,root:Je,type:Xe}=m,Tt=ds(y);hn(m,!1),de&&Ks(de),!Tt&&(K=oe&&oe.onVnodeBeforeMount)&&Dt(K,_e,y),hn(m,!0);{Je.ce&&Je.ce._hasShadowRoot()&&Je.ce._injectChildStyle(Xe);const Pt=m.subTree=ji(m);k(null,Pt,S,I,m,U,$),y.el=Pt.el}if(Se&&Ze(Se,U),!Tt&&(K=oe&&oe.onVnodeMounted)){const Pt=y;Ze(()=>Dt(K,_e,Pt),U)}(y.shapeFlag&256||_e&&ds(_e.vnode)&&_e.vnode.shapeFlag&256)&&m.a&&Ze(m.a,U),m.isMounted=!0,y=S=I=null}};m.scope.on();const q=m.effect=new wl(V);m.scope.off();const B=m.update=q.run.bind(q),ee=m.job=q.runIfDirty.bind(q);ee.i=m,ee.id=m.uid,q.scheduler=()=>ti(ee),hn(m,!0),B()},pe=(m,y,S)=>{y.component=m;const I=m.vnode.props;m.vnode=y,m.next=null,tf(m,y.props,I,S),rf(m,y.children,S),Yt(),Ni(m),Jt()},ae=(m,y,S,I,U,$,W,V,q=!1)=>{const B=m&&m.children,ee=m?m.shapeFlag:0,K=y.children,{patchFlag:X,shapeFlag:oe}=y;if(X>0){if(X&128){At(B,K,S,I,U,$,W,V,q);return}else if(X&256){ut(B,K,S,I,U,$,W,V,q);return}}oe&8?(ee&16&&dt(B,U,$),K!==B&&c(S,K)):ee&16?oe&16?At(B,K,S,I,U,$,W,V,q):dt(B,U,$,!0):(ee&8&&c(S,""),oe&16&&E(K,S,I,U,$,W,V,q))},ut=(m,y,S,I,U,$,W,V,q)=>{m=m||On,y=y||On;const B=m.length,ee=y.length,K=Math.min(B,ee);let X;for(X=0;Xee?dt(m,U,$,!0,!1,K):E(y,S,I,U,$,W,V,q,K)},At=(m,y,S,I,U,$,W,V,q)=>{let B=0;const ee=y.length;let K=m.length-1,X=ee-1;for(;B<=K&&B<=X;){const oe=m[B],de=y[B]=q?zt(y[B]):Lt(y[B]);if(vn(oe,de))k(oe,de,S,null,U,$,W,V,q);else break;B++}for(;B<=K&&B<=X;){const oe=m[K],de=y[X]=q?zt(y[X]):Lt(y[X]);if(vn(oe,de))k(oe,de,S,null,U,$,W,V,q);else break;K--,X--}if(B>K){if(B<=X){const oe=X+1,de=oeX)for(;B<=K;)Oe(m[B],U,$,!0),B++;else{const oe=B,de=B,Se=new Map;for(B=de;B<=X;B++){const rt=y[B]=q?zt(y[B]):Lt(y[B]);rt.key!=null&&Se.set(rt.key,B)}let _e,Je=0;const Xe=X-de+1;let Tt=!1,Pt=0;const Yn=new Array(Xe);for(B=0;B=Xe){Oe(rt,U,$,!0);continue}let Ot;if(rt.key!=null)Ot=Se.get(rt.key);else for(_e=de;_e<=X;_e++)if(Yn[_e-de]===0&&vn(rt,y[_e])){Ot=_e;break}Ot===void 0?Oe(rt,U,$,!0):(Yn[Ot-de]=B+1,Ot>=Pt?Pt=Ot:Tt=!0,k(rt,y[Ot],S,null,U,$,W,V,q),Je++)}const Ai=Tt?uf(Yn):On;for(_e=Ai.length-1,B=Xe-1;B>=0;B--){const rt=de+B,Ot=y[rt],Ci=y[rt+1],Ri=rt+1{const{el:$,type:W,transition:V,children:q,shapeFlag:B}=m;if(B&6){De(m.component.subTree,y,S,I);return}if(B&128){m.suspense.move(y,S,I);return}if(B&64){W.move(m,y,S,J);return}if(W===fe){s($,y,S);for(let K=0;KV.enter($),U);else{const{leave:K,delayLeave:X,afterLeave:oe}=V,de=()=>{m.ctx.isUnmounted?o($):s($,y,S)},Se=()=>{$._isLeaving&&$[$t](!0),K($,()=>{de(),oe&&oe()})};X?X($,de,Se):Se()}else s($,y,S)},Oe=(m,y,S,I=!1,U=!1)=>{const{type:$,props:W,ref:V,children:q,dynamicChildren:B,shapeFlag:ee,patchFlag:K,dirs:X,cacheIndex:oe}=m;if(K===-2&&(U=!1),V!=null&&(Yt(),us(V,null,S,m,!0),Jt()),oe!=null&&(y.renderCache[oe]=void 0),ee&256){y.ctx.deactivate(m);return}const de=ee&1&&X,Se=!ds(m);let _e;if(Se&&(_e=W&&W.onVnodeBeforeUnmount)&&Dt(_e,y,m),ee&6)Rt(m.component,S,I);else{if(ee&128){m.suspense.unmount(S,I);return}de&&pn(m,null,y,"beforeUnmount"),ee&64?m.type.remove(m,y,S,J,I):B&&!B.hasOnce&&($!==fe||K>0&&K&64)?dt(B,y,S,!1,!0):($===fe&&K&384||!U&&ee&16)&&dt(q,y,S),I&&Ct(m)}(Se&&(_e=W&&W.onVnodeUnmounted)||de)&&Ze(()=>{_e&&Dt(_e,y,m),de&&pn(m,null,y,"unmounted")},S)},Ct=m=>{const{type:y,el:S,anchor:I,transition:U}=m;if(y===fe){gt(S,I);return}if(y===Gs){P(m);return}const $=()=>{o(S),U&&!U.persisted&&U.afterLeave&&U.afterLeave()};if(m.shapeFlag&1&&U&&!U.persisted){const{leave:W,delayLeave:V}=U,q=()=>W(S,$);V?V(m.el,$,q):q()}else $()},gt=(m,y)=>{let S;for(;m!==y;)S=h(m),o(m),m=S;o(y)},Rt=(m,y,S)=>{const{bum:I,scope:U,job:$,subTree:W,um:V,m:q,a:B}=m;Wi(q),Wi(B),I&&Ks(I),U.stop(),$&&($.flags|=8,Oe(W,m,y,S)),V&&Ze(V,y),Ze(()=>{m.isUnmounted=!0},y)},dt=(m,y,S,I=!1,U=!1,$=0)=>{for(let W=$;W{if(m.shapeFlag&6)return L(m.component.subTree);if(m.shapeFlag&128)return m.suspense.next();const y=h(m.anchor||m.el),S=y&&y[Ed];return S?h(S):y};let G=!1;const z=(m,y,S)=>{let I;m==null?y._vnode&&(Oe(y._vnode,null,null,!0),I=y._vnode.component):k(y._vnode||null,m,y,null,null,null,S),y._vnode=m,G||(G=!0,Ni(I),Hl(),G=!1)},J={p:k,um:Oe,m:De,r:Ct,mt:le,mc:E,pc:ae,pbc:M,n:L,o:e};return{render:z,hydrate:void 0,createApp:zd(z)}}function Xo({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function hn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function cf(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function gc(e,t,n=!1){const s=e.children,o=t.children;if(Z(s)&&Z(o))for(let r=0;r>1,e[n[a]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,i=n[r-1];r-- >0;)n[r]=i,i=t[i];return n}function yc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:yc(t)}function Wi(e){if(e)for(let t=0;te.__isSuspense;function df(e,t){t&&t.pendingBranch?Z(e)?t.effects.push(...e):t.effects.push(e):xd(e)}const fe=Symbol.for("v-fgt"),To=Symbol.for("v-txt"),Ge=Symbol.for("v-cmt"),Gs=Symbol.for("v-stc"),ps=[];let lt=null;function A(e=!1){ps.push(lt=e?null:[])}function ff(){ps.pop(),lt=ps[ps.length-1]||null}let vs=1;function fo(e,t=!1){vs+=e,e<0&<&&t&&(lt.hasOnce=!0)}function _c(e){return e.dynamicChildren=vs>0?lt||On:null,ff(),vs>0&<&<.push(e),e}function O(e,t,n,s,o,r){return _c(f(e,t,n,s,o,r,!0))}function ct(e,t,n,s,o){return _c(H(e,t,n,s,o,!0))}function po(e){return e?e.__v_isVNode===!0:!1}function vn(e,t){return e.type===t.type&&e.key===t.key}const xc=({key:e})=>e??null,Ys=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Te(e)||qe(e)||re(e)?{i:at,r:e,k:t,f:!!n}:e:null);function f(e,t=null,n=null,s=0,o=null,r=e===fe?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&xc(t),ref:t&&Ys(t),scopeId:ql,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:at};return a?(li(l,n),r&128&&e.normalize(l)):n&&(l.shapeFlag|=Te(n)?8:16),vs>0&&!i&<&&(l.patchFlag>0||r&6)&&l.patchFlag!==32&<.push(l),l}const H=pf;function pf(e,t=null,n=null,s=0,o=null,r=!1){if((!e||e===tc)&&(e=Ge),po(e)){const a=cn(e,t,!0);return n&&li(a,n),vs>0&&!r&<&&(a.shapeFlag&6?lt[lt.indexOf(e)]=a:lt.push(a)),a.patchFlag=-2,a}if(Ef(e)&&(e=e.__vccOpts),t){t=hf(t);let{class:a,style:l}=t;a&&!Te(a)&&(t.class=Ae(a)),ve(l)&&(Zr(l)&&!Z(l)&&(l=$e({},l)),t.style=Ln(l))}const i=Te(e)?1:vc(e)?128:Wl(e)?64:ve(e)?4:re(e)?2:0;return f(e,t,n,s,o,i,r,!0)}function hf(e){return e?Zr(e)||uc(e)?$e({},e):e:null}function cn(e,t,n=!1,s=!1){const{props:o,ref:r,patchFlag:i,children:a,transition:l}=e,d=t?gf(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&xc(d),ref:t&&t.ref?n&&r?Z(r)?r.concat(Ys(t)):[r,Ys(t)]:Ys(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==fe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&cn(e.ssContent),ssFallback:e.ssFallback&&cn(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&s&&bs(c,l.clone(c)),c}function Ce(e=" ",t=0){return H(To,null,e,t)}function mf(e,t){const n=H(Gs,null,e);return n.staticCount=t,n}function ie(e="",t=!1){return t?(A(),ct(Ge,null,e)):H(Ge,null,e)}function Lt(e){return e==null||typeof e=="boolean"?H(Ge):Z(e)?H(fe,null,e.slice()):po(e)?zt(e):H(To,null,String(e))}function zt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:cn(e)}function li(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(Z(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),li(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!uc(t)?t._ctx=at:o===3&&at&&(at.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else re(t)?(t={default:t,_ctx:at},n=32):(t=String(t),s&64?(n=16,t=[Ce(t)]):n=8);e.children=t,e.shapeFlag|=n}function gf(...e){const t={};for(let n=0;nHe||at;let ho,Ar;{const e=ko(),t=(n,s)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),r=>{o.length>1?o.forEach(i=>i(r)):o[0](r)}};ho=t("__VUE_INSTANCE_SETTERS__",n=>He=n),Ar=t("__VUE_SSR_SETTERS__",n=>_s=n)}const Ts=e=>{const t=He;return ho(e),e.scope.on(),()=>{e.scope.off(),ho(t)}},zi=()=>{He&&He.scope.off(),ho(null)};function kc(e){return e.vnode.shapeFlag&4}let _s=!1;function _f(e,t=!1,n=!1){t&&Ar(t);const{props:s,children:o}=e.vnode,r=kc(e);ef(e,s,r,t),of(e,o,n||t);const i=r?xf(e,t):void 0;return t&&Ar(!1),i}function xf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Md);const{setup:s}=n;if(s){Yt();const o=e.setupContext=s.length>1?kf(e):null,r=Ts(e),i=Rs(s,e,0,[e.props,o]),a=ml(i);if(Jt(),r(),(a||e.sp)&&!ds(e)&&Jl(e),a){if(i.then(zi,zi),t)return i.then(l=>{Ki(e,l)}).catch(l=>{Eo(l,e,0)});e.asyncDep=i}else Ki(e,i)}else Sc(e)}function Ki(e,t,n){re(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ve(t)&&(e.setupState=Fl(t)),Sc(e)}function Sc(e,t,n){const s=e.type;e.render||(e.render=s.render||Ft);{const o=Ts(e);Yt();try{Bd(e)}finally{Jt(),o()}}}const wf={get(e,t){return Be(e,"get",""),e[t]}};function kf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,wf),slots:e.slots,emit:e.emit,expose:t}}function Po(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Fl(dd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in fs)return fs[n](e)},has(t,n){return n in t||n in fs}})):e.proxy}function Sf(e,t=!0){return re(e)?e.displayName||e.name:e.name||t&&e.__name}function Ef(e){return re(e)&&"__vccOpts"in e}const me=(e,t)=>gd(e,t,_s);function xs(e,t,n){try{fo(-1);const s=arguments.length;return s===2?ve(t)&&!Z(t)?po(t)?H(e,null,[t]):H(e,t):H(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&po(n)&&(n=[n]),H(e,t,n))}finally{fo(1)}}const Af="3.5.28";/** * @vue/runtime-dom v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let Cr;const Qi=typeof window<"u"&&window.trustedTypes;if(Qi)try{Cr=Qi.createPolicy("vue",{createHTML:e=>e})}catch{}const Ec=Cr?e=>Cr.createHTML(e):e=>e,Cf="http://www.w3.org/2000/svg",Rf="http://www.w3.org/1998/Math/MathML",Vt=typeof document<"u"?document:null,Gi=Vt&&Vt.createElement("template"),Tf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?Vt.createElementNS(Cf,e):t==="mathml"?Vt.createElementNS(Rf,e):n?Vt.createElement(e,{is:n}):Vt.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>Vt.createTextNode(e),createComment:e=>Vt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Vt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,r){const i=n?n.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===r||!(o=o.nextSibling)););else{Gi.innerHTML=Ec(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const a=Gi.content;if(s==="svg"||s==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},en="transition",es="animation",ws=Symbol("_vtc"),Ac={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Pf=$e({},zl,Ac),Of=e=>(e.displayName="Transition",e.props=Pf,e),Cc=Of((e,{slots:t})=>xs(Rd,Df(e),t)),mn=(e,t=[])=>{Z(e)?e.forEach(n=>n(...t)):e&&e(...t)},Yi=e=>e?Z(e)?e.some(t=>t.length>1):e.length>1:!1;function Df(e){const t={};for(const N in e)N in Ac||(t[N]=e[N]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=r,appearActiveClass:d=i,appearToClass:c=a,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,v=Nf(o),k=v&&v[0],b=v&&v[1],{onBeforeEnter:R,onEnter:D,onEnterCancelled:C,onLeave:P,onLeaveCancelled:U,onBeforeAppear:x=R,onAppear:_=D,onAppearCancelled:E=C}=t,j=(N,te,le,Me)=>{N._enterCancelled=Me,gn(N,te?c:a),gn(N,te?d:i),le&&le()},M=(N,te)=>{N._isLeaving=!1,gn(N,p),gn(N,g),gn(N,h),te&&te()},Q=N=>(te,le)=>{const Me=N?_:D,ce=()=>j(te,N,le);mn(Me,[te,ce]),Ji(()=>{gn(te,N?l:r),jt(te,N?c:a),Yi(Me)||Xi(te,s,k,ce)})};return $e(t,{onBeforeEnter(N){mn(R,[N]),jt(N,r),jt(N,i)},onBeforeAppear(N){mn(x,[N]),jt(N,l),jt(N,d)},onEnter:Q(!1),onAppear:Q(!0),onLeave(N,te){N._isLeaving=!0;const le=()=>M(N,te);jt(N,p),N._enterCancelled?(jt(N,h),ta(N)):(ta(N),jt(N,h)),Ji(()=>{N._isLeaving&&(gn(N,p),jt(N,g),Yi(P)||Xi(N,s,b,le))}),mn(P,[N,le])},onEnterCancelled(N){j(N,!1,void 0,!0),mn(C,[N])},onAppearCancelled(N){j(N,!0,void 0,!0),mn(E,[N])},onLeaveCancelled(N){M(N),mn(U,[N])}})}function Nf(e){if(e==null)return null;if(be(e))return[Zo(e.enter),Zo(e.leave)];{const t=Zo(e);return[t,t]}}function Zo(e){return Fu(e)}function jt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[ws]||(e[ws]=new Set)).add(t)}function gn(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[ws];n&&(n.delete(t),n.size||(e[ws]=void 0))}function Ji(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let If=0;function Xi(e,t,n,s){const o=e._endId=++If,r=()=>{o===e._endId&&s()};if(n!=null)return setTimeout(r,n);const{type:i,timeout:a,propCount:l}=$f(e,t);if(!i)return s();const d=i+"end";let c=0;const p=()=>{e.removeEventListener(d,h),r()},h=g=>{g.target===e&&++c>=l&&p()};setTimeout(()=>{c(n[v]||"").split(", "),o=s(`${en}Delay`),r=s(`${en}Duration`),i=Zi(o,r),a=s(`${es}Delay`),l=s(`${es}Duration`),d=Zi(a,l);let c=null,p=0,h=0;t===en?i>0&&(c=en,p=i,h=r.length):t===es?d>0&&(c=es,p=d,h=l.length):(p=Math.max(i,d),c=p>0?i>d?en:es:null,h=c?c===en?r.length:l.length:0);const g=c===en&&/\b(?:transform|all)(?:,|$)/.test(s(`${en}Property`).toString());return{type:c,timeout:p,propCount:h,hasTransform:g}}function Zi(e,t){for(;e.lengthea(n)+ea(e[s])))}function ea(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ta(e){return(e?e.ownerDocument:document).body.offsetHeight}function Lf(e,t,n){const s=e[ws];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const na=Symbol("_vod"),Ff=Symbol("_vsh"),Uf=Symbol(""),Mf=/(?:^|;)\s*display\s*:/;function Bf(e,t,n){const s=e.style,o=Te(n);let r=!1;if(n&&!o){if(t)if(Te(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&Js(s,a,"")}else for(const i in t)n[i]==null&&Js(s,i,"");for(const i in n)i==="display"&&(r=!0),Js(s,i,n[i])}else if(o){if(t!==n){const i=s[Uf];i&&(n+=";"+i),s.cssText=n,r=Mf.test(n)}}else t&&e.removeAttribute("style");na in e&&(e[na]=r?s.display:"",e[Ff]&&(s.display="none"))}const sa=/\s*!important$/;function Js(e,t,n){if(Z(n))n.forEach(s=>Js(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Hf(e,t);sa.test(n)?e.setProperty(fn(s),n.replace(sa,""),"important"):e[s]=n}}const oa=["Webkit","Moz","ms"],er={};function Hf(e,t){const n=er[t];if(n)return n;let s=mt(t);if(s!=="filter"&&s in e)return er[t]=s;s=xo(s);for(let o=0;otr||(Wf.then(()=>tr=0),tr=Date.now());function Kf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;wt(Qf(s,n.value),t,5,[s])};return n.value=e,n.attached=zf(),n}function Qf(e,t){if(Z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const ua=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Gf=(e,t,n,s,o,r)=>{const i=o==="svg";t==="class"?Lf(e,s,i):t==="style"?Bf(e,n,s):bo(t)?qr(t)||qf(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Yf(e,t,s,i))?(aa(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ia(e,t,s,i,r,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Te(s))?aa(e,mt(t),s,r,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ia(e,t,s,i))};function Yf(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ua(t)&&re(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ua(t)&&Te(n)?!1:t in e}const Mn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Z(t)?n=>Ks(t,n):t};function Jf(e){e.target.composing=!0}function da(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Qt=Symbol("_assign");function fa(e,t,n){return t&&(e=e.trim()),n&&(e=wo(e)),e}const et={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e[Qt]=Mn(o);const r=s||o.props&&o.props.type==="number";an(e,t?"change":"input",i=>{i.target.composing||e[Qt](fa(e.value,n,r))}),(n||r)&&an(e,"change",()=>{e.value=fa(e.value,n,r)}),t||(an(e,"compositionstart",Jf),an(e,"compositionend",da),an(e,"change",da))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:o,number:r}},i){if(e[Qt]=Mn(i),e.composing)return;const a=(r||e.type==="number")&&!/^0\d/.test(e.value)?wo(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||o&&e.value.trim()===l)||(e.value=l))}},tn={deep:!0,created(e,t,n){e[Qt]=Mn(n),an(e,"change",()=>{const s=e._modelValue,o=ks(e),r=e.checked,i=e[Qt];if(Z(s)){const a=zr(s,o),l=a!==-1;if(r&&!l)i(s.concat(o));else if(!r&&l){const d=[...s];d.splice(a,1),i(d)}}else if(Wn(s)){const a=new Set(s);r?a.add(o):a.delete(o),i(a)}else i(Rc(e,r))})},mounted:pa,beforeUpdate(e,t,n){e[Qt]=Mn(n),pa(e,t,n)}};function pa(e,{value:t,oldValue:n},s){e._modelValue=t;let o;if(Z(t))o=zr(t,s.props.value)>-1;else if(Wn(t))o=t.has(s.props.value);else{if(t===n)return;o=zn(t,Rc(e,!0))}e.checked!==o&&(e.checked=o)}const Xs={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const o=Wn(t);an(e,"change",()=>{const r=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?wo(ks(i)):ks(i));e[Qt](e.multiple?o?new Set(r):r:r[0]),e._assigning=!0,ei(()=>{e._assigning=!1})}),e[Qt]=Mn(s)},mounted(e,{value:t}){ha(e,t)},beforeUpdate(e,t,n){e[Qt]=Mn(n)},updated(e,{value:t}){e._assigning||ha(e,t)}};function ha(e,t){const n=e.multiple,s=Z(t);if(!(n&&!s&&!Wn(t))){for(let o=0,r=e.options.length;oString(d)===String(a)):i.selected=zr(t,a)>-1}else i.selected=t.has(a);else if(zn(ks(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function ks(e){return"_value"in e?e._value:e.value}function Rc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Xf=["ctrl","shift","alt","meta"],Zf={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Xf.some(n=>e[`${n}Key`]&&!t.includes(n))},ep=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(o,...r)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=o=>{if(!("key"in o))return;const r=fn(o.key);if(t.some(i=>i===r||tp[i]===r))return e(o)})},sp=$e({patchProp:Gf},Tf);let ma;function op(){return ma||(ma=af(sp))}const rp=(...e)=>{const t=op().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=ap(s);if(!o)return;const r=t._component;!re(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const i=n(o,!1,ip(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function ip(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ap(e){return Te(e)?document.querySelector(e):e}const lp={language:{name:"English"},common:{cancel:"Cancel",save:"Save",close:"Close",delete:"Delete",refresh:"Refresh",download:"Download",unknownArtist:"Unknown artist",unknownTrack:"Unknown track",previousPage:"Previous page",nextPage:"Next page"},nav:{home:"Home",library:"Library",monitor:"Playlist Monitor",queue:"Queue",player:"Player",settings:"Settings",switchToLight:"Switch to light",switchToDark:"Switch to dark"},hero:{noAccount:"no Spotify account needed",tagline:"Your music with full metadata, album art and lyrics — in one click.",songs:"Songs",albums:"Albums",playlists:"Playlists"},search:{placeholder:"Search, paste a Spotify or YouTube Music link…",title:"Search results",matchesFor:"Showing matches for",songsCount:"— {count} song",songsCountPlural:"— {count} songs",typeToBegin:"Type something in the search bar to begin.",error:"Something went wrong.",errorWithDetail:"Something went wrong: {detail}",empty:"No songs found.",emptyHint:"Try another query — artist + title usually works best.",openOnSpotify:"Open on Spotify",inQueue:"In queue",download:"Download",previousPage:"Previous page",nextPage:"Next page"},queue:{title:"Download Queue",subtitle:"In progress = work started (searching providers or transferring). Waiting = not started yet. A new playlist clears done tracks and keeps failures.",empty:"Nothing queued right now.",emptyHint:"Search for a song and hit download to start.",emptyFilter:"No tracks match this filter.",filterAll:"All",filterActive:"In progress",filterQueued:"Waiting",filterDone:"Done",filterFailed:"Failed",statusQueued:"Waiting",statusActive:"In progress",statusDownloading:"Downloading",statusDone:"Done",statusFailed:"Failed",retry:"Retry download",retryAllFailed:"Retry failed ({count})",clearCompleted:"Clear done ({count})",saveToDevice:"Save to device",removeFromQueue:"Remove from queue",clearAll:"Clear all",clearAllPrompt:"Remove all items from the queue?",forceAudio:"Use a YouTube URL instead",overridePlaceholder:"Paste a YouTube or YouTube Music URL…",applyOverride:"Apply",invalidYouTubeURL:"Invalid YouTube URL"},library:{title:"Library",subtitle:"Music you've already downloaded. Listen, re-download or remove.",empty:"No downloads yet.",emptyHint:"Find a song to start filling your library.",failedLoad:"Failed to load downloads.",failedDelete:"Failed to delete {file}",deletePrompt:'Delete "{file}"?',countOne:"{count} file in your library",countMany:"{count} files in your library",downloadToDevice:"Download to device",deleteFile:"Delete file",play:"Play"},monitor:{title:"Playlist Monitor",subtitle:"Add Spotify playlists to watch. New tracks added to those playlists will be downloaded automatically.",watchNew:"Watch a new playlist",urlPlaceholder:"Paste a Spotify playlist URL…",watch:"Watch",failedAdd:"Failed to add playlist. Check the URL and try again.",empty:"No playlists being monitored yet.",emptyHint:"Paste a Spotify playlist link above to get started.",active:"Active",paused:"Paused",everyInterval:"Every {interval}",tracksOne:"{count} track",tracksMany:"{count} tracks",checked:"Checked {when}",notChecked:"Not checked yet",pause:"Pause monitoring",resume:"Resume monitoring",checkNow:"Check now",stop:"Stop monitoring",deletePrompt:'Stop monitoring "{name}"?',info:"When you add a playlist, Downtify downloads every track it currently contains and then keeps watching it. Any songs added later on Spotify are detected and downloaded automatically on the next scheduled check.",every15:"Every 15 min",every30:"Every 30 min",every1h:"Every hour",every3h:"Every 3 h",every6h:"Every 6 h",every12h:"Every 12 h",every1d:"Every day",every1w:"Every week",every2w:"Every 2 weeks",every1mo:"Every month",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 day",short1w:"1 wk",short2w:"2 wk",short1mo:"1 mo",minSuffix:"min",hourSuffix:"h",daySuffix:"day",daysSuffix:"days",weekSuffix:"week",weeksSuffix:"weeks",monthSuffix:"month",monthsSuffix:"months",timeJustNow:"just now",timeMinAgo:"{n} min ago",timeHourAgo:"{n} h ago",timeDayAgo:"{n} day(s) ago"},settings:{title:"Settings",subtitle:"Tweak how Downtify fetches and tags your music.",audioSource:"Audio sources (fallback order)",audioSourceHint:"Enable one or more. Each track tries sources in order (1, 2, 3) until one succeeds.",audioSourceReset:"Use recommended order",lyricsSource:"Lyrics source",lyricsHint:"only lrclib is active",downloadLyrics:"Download lyrics",downloadLyricsHint:"Embed lyrics in audio files and write .lrc sidecar files",lyricsProvider:"Provider",format:"Format",quality:"Quality",qualityIgnored:"ignored (lossless)",playlistsSection:"Playlists",generateM3u:"Generate M3U file for playlists",generateM3uHint:"Writes Playlists/.m3u with absolute file paths (/downloads/... and /slskd/...) for manual downloads and Playlist Monitor sweeps.",syncNavidrome:"Create playlist in Navidrome",syncNavidromeHint:"After a Spotify playlist download finishes, scan the library and create/update a Navidrome playlist with the same name.",navidromeSection:"Navidrome",navidromeHint:"Uses the Subsonic API (same as Explo). Point your music folder in Navidrome at Downtify downloads.",navidromeEnabled:"Enable Navidrome sync",navidromeEnabledHint:"Requires URL, username, and password. Admin account recommended: triggers Subsonic startScan (incremental) before matching tracks, same as Explo.",navidromeUrl:"Navidrome URL (example: https://music.example.com)",navidromeUsername:"Navidrome username",navidromePassword:"Navidrome password",navidromeAdminUser:"Admin username (optional, for library scan)",navidromeAdminPassword:"Admin password (optional)",navidromePublic:"Public playlist in Navidrome",organizationSection:"File organization",organizeByArtist:"Organize by artist",organizeByArtistHint:"Save songs in subfolders named after the artist. Playlist tracks are also placed in their artist's folder instead of a playlist folder.",parallelDownloads:"Parallel downloads",parallelDownloadsHint:"Maximum songs at once (YouTube and slskd). Tap a number, then Save — applies to new work; a playlist already running keeps its current batch until you start another. With slskd on, prefer 2–3: slskd caps concurrent Soulseek searches; higher values mostly queue or fail, not faster downloads.",saved:"Changes saved",saveError:"Couldn't save settings.",language:"Language",languageHint:"Choose the interface language",youtubeAdvancedToggle:"Advanced: YouTube cookies (optional)",youtubeCookiesConfigured:"on",youtubeCookiesHint:"Rarely needed — only some age-restricted YouTube fallbacks. Export cookies.txt from youtube.com if required.",youtubeCookiesPathPlaceholder:"/data/youtube-cookies.txt",youtubeCookiesUpload:"Upload cookies.txt",youtubeCookiesClear:"Remove cookies",youtubeCookiesReady:"Login cookies detected — yt-dlp will use them for age-restricted videos.",youtubeCookiesWeak:"File found but no YouTube login session in it. Re-export from youtube.com while signed in (see hint above).",youtubeCookiesMissing:"Path is set but the file is missing on disk. Upload again or fix the mount path.",slskdSection:"slskd",slskdHint:"Soulseek via slskd. With Navidrome enabled, playlists are built in Navidrome after a library scan — files can stay in the slskd folder.",slskdEnabled:"Enable slskd provider",slskdEnabledHint:"When off, slskd is never attempted in provider fallback.",slskdBaseUrl:"slskd base URL (example: https://slskd.example.com)",slskdApiKey:"slskd API key",slskdSourceDirTitle:"slskd download folder (inside this container)",slskdSourceDirBullet1:"slskd writes completed transfers here (e.g. /slskd → host music/slskd).",slskdSourceDirBullet2:"Navidrome must scan the parent music library that includes this folder.",slskdSourceDirBullet3:"Use the path Downtify sees — not the host path, not the slskd web URL.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads -Downtify: /mnt/storage/music/slskd:/slskd → set /slskd`,slskdSourceDirLabel:"slskd folder path in Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify watches this folder for finished slskd files. No copy into /downloads when leave-in-place is on.",slskdLeaveInPlace:"Leave slskd files in place",slskdLeaveInPlaceHint:"Do not copy into /downloads. Tag in place, register for dedupe, and add tracks to Navidrome playlists via library search (recommended with Navidrome sync).",slskdDownloadTimeout:"Total slskd timeout (seconds)",slskdQueuedTimeout:"Queued / no-progress timeout (seconds)",slskdTimeoutHint:'If slskd does not finish in time, Downtify tries the next audio provider (YouTube). Lower the queued timeout when tracks sit on "Queued on slskd" too long.'},player:{title:"Player",subtitle:"Listen to the music you've downloaded.",empty:"Nothing to play yet",emptyHint:"Download some music to start listening.",queue:"Queue",play:"Play",pause:"Pause",previous:"Previous",next:"Next",shuffle:"Shuffle",shuffleOn:"Shuffle on",shuffleOff:"Shuffle off",repeatOff:"Repeat off",repeatAll:"Repeat all",repeatOne:"Repeat one",volume:"Volume",mute:"Mute",unmute:"Unmute",nowPlaying:"Now playing",upNext:"Up next",playFromLibrary:"Open in player",countOne:"{count} track",countMany:"{count} tracks"},footer:{tagline:"Open source music downloader"}},cp={language:{name:"Español"},common:{cancel:"Cancelar",save:"Guardar",close:"Cerrar",delete:"Eliminar",refresh:"Actualizar",download:"Descargar",unknownArtist:"Artista desconocido",unknownTrack:"Pista desconocida",previousPage:"Página anterior",nextPage:"Página siguiente"},nav:{home:"Inicio",library:"Biblioteca",monitor:"Monitor de listas",queue:"Cola",player:"Reproductor",settings:"Ajustes",switchToLight:"Cambiar a claro",switchToDark:"Cambiar a oscuro"},hero:{noAccount:"sin cuenta de Spotify",tagline:"Tu música con metadatos completos, portada y letras — en un clic.",songs:"Canciones",albums:"Álbumes",playlists:"Listas"},search:{placeholder:"Busca o pega un enlace de Spotify o YouTube Music…",title:"Resultados de búsqueda",matchesFor:"Mostrando coincidencias para",songsCount:"— {count} canción",songsCountPlural:"— {count} canciones",typeToBegin:"Escribe algo en la barra de búsqueda para empezar.",error:"Algo salió mal.",errorWithDetail:"Algo salió mal: {detail}",empty:"No se encontraron canciones.",emptyHint:"Prueba con otra búsqueda — artista + título suele funcionar mejor.",openOnSpotify:"Abrir en Spotify",inQueue:"En la cola",download:"Descargar",previousPage:"Página anterior",nextPage:"Página siguiente"},queue:{title:"Cola de descargas",subtitle:"Canciones en cola. Filtra por activas o fallidas. Una playlist nueva de Spotify quita las terminadas y conserva los fallos.",empty:"No hay nada en la cola ahora mismo.",emptyHint:"Busca una canción y pulsa descargar para empezar.",emptyFilter:"Ninguna pista coincide con este filtro.",filterAll:"Todas",filterActive:"En curso",filterQueued:"En espera",filterDone:"Hechas",filterFailed:"Fallidas",statusQueued:"En espera",statusActive:"En curso",statusDownloading:"Descargando",statusDone:"Hecha",statusFailed:"Fallida",retry:"Reintentar descarga",retryAllFailed:"Reintentar fallidas ({count})",clearCompleted:"Quitar hechas ({count})",saveToDevice:"Guardar en el dispositivo",removeFromQueue:"Quitar de la cola",clearAll:"Limpiar todo",clearAllPrompt:"¿Eliminar todos los elementos de la cola?",forceAudio:"Usar una URL de YouTube",overridePlaceholder:"Pega una URL de YouTube o YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL de YouTube no válida"},library:{title:"Biblioteca",subtitle:"Música que ya has descargado. Escucha, descarga otra vez o elimina.",empty:"Aún no hay descargas.",emptyHint:"Encuentra una canción para empezar a llenar tu biblioteca.",failedLoad:"No se pudieron cargar las descargas.",failedDelete:"No se pudo eliminar {file}",deletePrompt:'¿Eliminar "{file}"?',countOne:"{count} archivo en tu biblioteca",countMany:"{count} archivos en tu biblioteca",downloadToDevice:"Descargar al dispositivo",deleteFile:"Eliminar archivo",play:"Reproducir"},monitor:{title:"Monitor de listas",subtitle:"Añade listas de Spotify para vigilar. Las nuevas pistas añadidas a esas listas se descargarán automáticamente.",watchNew:"Vigilar una nueva lista",urlPlaceholder:"Pega una URL de lista de Spotify…",watch:"Vigilar",failedAdd:"No se pudo añadir la lista. Comprueba la URL e inténtalo de nuevo.",empty:"Aún no hay listas vigiladas.",emptyHint:"Pega un enlace de lista de Spotify arriba para empezar.",active:"Activa",paused:"Pausada",everyInterval:"Cada {interval}",tracksOne:"{count} pista",tracksMany:"{count} pistas",checked:"Revisada {when}",notChecked:"Aún no revisada",pause:"Pausar vigilancia",resume:"Reanudar vigilancia",checkNow:"Revisar ahora",stop:"Dejar de vigilar",deletePrompt:'¿Dejar de vigilar "{name}"?',info:"Al añadir una lista, Downtify descarga todas las pistas que contenga en ese momento y la sigue vigilando. Cualquier canción añadida después en Spotify se detecta y descarga automáticamente en la siguiente revisión.",every15:"Cada 15 min",every30:"Cada 30 min",every1h:"Cada hora",every3h:"Cada 3 h",every6h:"Cada 6 h",every12h:"Cada 12 h",every1d:"Cada día",every1w:"Cada semana",every2w:"Cada 2 semanas",every1mo:"Cada mes",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 día",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mes",minSuffix:"min",hourSuffix:"h",daySuffix:"día",daysSuffix:"días",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mes",monthsSuffix:"meses",timeJustNow:"justo ahora",timeMinAgo:"hace {n} min",timeHourAgo:"hace {n} h",timeDayAgo:"hace {n} día(s)"},settings:{title:"Ajustes",subtitle:"Ajusta cómo Downtify descarga y etiqueta tu música.",audioSource:"Fuentes de audio (orden de respaldo)",audioSourceHint:"Activa una o más. Cada pista prueba las fuentes en orden (1, 2, 3) hasta que una funcione.",audioSourceReset:"Usar orden recomendado",lyricsSource:"Fuente de letras",lyricsHint:"solo lrclib está activo",downloadLyrics:"Descargar letras",downloadLyricsHint:"Incrusta letras en los archivos de audio y escribe archivos .lrc",lyricsProvider:"Proveedor",format:"Formato",quality:"Calidad",qualityIgnored:"ignorada (sin pérdidas)",playlistsSection:"Listas",generateM3u:"Generar archivo M3U para las listas",generateM3uHint:"Escribe Playlists/.m3u con rutas absolutas (/downloads/... y /slskd/...) para descargas y el Monitor.",syncNavidrome:"Crear lista en Navidrome",syncNavidromeHint:"Tras descargar una lista de Spotify, escanea la biblioteca y crea/actualiza una lista en Navidrome con el mismo nombre.",navidromeSection:"Navidrome",navidromeHint:"Usa la API Subsonic (como Explo). La carpeta de música en Navidrome debe apuntar a las descargas de Downtify.",navidromeEnabled:"Activar sincronización con Navidrome",navidromeEnabledHint:"Requiere URL, usuario y contraseña. La cuenta admin opcional inicia el escaneo de la biblioteca.",navidromeUrl:"URL de Navidrome (ejemplo: https://musica.ejemplo.com)",navidromeUsername:"Usuario de Navidrome",navidromePassword:"Contraseña de Navidrome",navidromeAdminUser:"Usuario admin (opcional, para escaneo)",navidromeAdminPassword:"Contraseña admin (opcional)",navidromePublic:"Lista pública en Navidrome",organizationSection:"Organización de archivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Guarda las canciones en subcarpetas con el nombre del artista. Las pistas de listas también se guardan en la carpeta del artista en lugar de la carpeta de la lista.",parallelDownloads:"Descargas paralelas",parallelDownloadsHint:"Máximo de canciones a la vez (YouTube y slskd). Toca un número y Guardar; afecta trabajo nuevo. Con slskd activo, usa 2–3: slskd limita búsquedas Soulseek simultáneas; valores altos suelen encolarse o fallar, no acelerar.",saved:"Cambios guardados",saveError:"No se pudieron guardar los ajustes.",language:"Idioma",languageHint:"Elige el idioma de la interfaz",youtubeAdvancedToggle:"Avanzado: cookies de YouTube (opcional)",youtubeCookiesConfigured:"activo",youtubeCookiesHint:"Casi nunca hace falta — solo algunos fallbacks de YouTube con edad. Exporta cookies.txt de youtube.com si lo necesitas.",youtubeCookiesPathPlaceholder:"/data/youtube-cookies.txt",youtubeCookiesUpload:"Subir cookies.txt",youtubeCookiesClear:"Quitar cookies",youtubeCookiesReady:"Cookies de inicio de sesión detectadas — yt-dlp las usará en vídeos con edad.",youtubeCookiesWeak:"Archivo presente pero sin sesión de YouTube. Vuelve a exportar desde youtube.com con la cuenta iniciada.",youtubeCookiesMissing:"Ruta configurada pero el archivo no existe. Vuelve a subirlo o revisa el volumen.",slskdSection:"slskd",slskdHint:"Soulseek vía slskd. Con Navidrome activo, las listas se crean allí tras escanear la biblioteca; los archivos pueden quedarse en la carpeta slskd.",slskdEnabled:"Activar proveedor slskd",slskdEnabledHint:"Si está desactivado, slskd nunca se intentará en la cadena de fallback.",slskdBaseUrl:"URL base de slskd (ejemplo: https://slskd.ejemplo.com)",slskdApiKey:"API key de slskd",slskdSourceDirTitle:"Carpeta de descargas de slskd (en este contenedor)",slskdSourceDirBullet1:"slskd escribe aquí las transferencias completadas (ej. /slskd → music/slskd en el host).",slskdSourceDirBullet2:"Navidrome debe escanear la biblioteca que incluye esta carpeta.",slskdSourceDirBullet3:"Ruta que ve Downtify — no la ruta del host ni la URL web de slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads -Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Carpeta slskd en Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify detecta archivos slskd aquí. Sin copia a /downloads si “dejar en sitio” está activo.",slskdLeaveInPlace:"Dejar archivos slskd en su sitio",slskdLeaveInPlaceHint:"No copiar a /downloads. Etiquetar en sitio y añadir a listas de Navidrome tras el escaneo.",slskdDownloadTimeout:"Tiempo máximo slskd (segundos)",slskdQueuedTimeout:"Tiempo en cola sin progreso (segundos)",slskdTimeoutHint:'Si slskd no termina a tiempo, Downtify prueba el siguiente proveedor (YouTube). Baja el tiempo en cola si se queda en "Queued on slskd".'},player:{title:"Reproductor",subtitle:"Escucha la música que has descargado.",empty:"Nada que reproducir aún",emptyHint:"Descarga música para empezar a escuchar.",queue:"Cola",play:"Reproducir",pause:"Pausar",previous:"Anterior",next:"Siguiente",shuffle:"Aleatorio",shuffleOn:"Aleatorio activado",shuffleOff:"Aleatorio desactivado",repeatOff:"Repetición desactivada",repeatAll:"Repetir todo",repeatOne:"Repetir una",volume:"Volumen",mute:"Silenciar",unmute:"Activar sonido",nowPlaying:"Sonando ahora",upNext:"A continuación",playFromLibrary:"Abrir en el reproductor",countOne:"{count} pista",countMany:"{count} pistas"},footer:{tagline:"Descargador de música de código abierto"}},up={language:{name:"Português (BR)"},common:{cancel:"Cancelar",save:"Salvar",close:"Fechar",delete:"Excluir",refresh:"Atualizar",download:"Baixar",unknownArtist:"Artista desconhecido",unknownTrack:"Faixa desconhecida",previousPage:"Página anterior",nextPage:"Próxima página"},nav:{home:"Início",library:"Biblioteca",monitor:"Monitor de playlists",queue:"Fila",player:"Player",settings:"Configurações",switchToLight:"Mudar para claro",switchToDark:"Mudar para escuro"},hero:{noAccount:"sem precisar de conta no Spotify",tagline:"Sua música com metadados completos, capa do álbum e letras — em um clique.",songs:"Músicas",albums:"Álbuns",playlists:"Playlists"},search:{placeholder:"Busque uma música ou cole um link do Spotify ou YouTube Music…",title:"Resultados da busca",matchesFor:"Mostrando resultados para",songsCount:"— {count} música",songsCountPlural:"— {count} músicas",typeToBegin:"Digite algo na barra de busca para começar.",error:"Algo deu errado.",errorWithDetail:"Algo deu errado: {detail}",empty:"Nenhuma música encontrada.",emptyHint:"Tente outra busca — artista + título costuma funcionar melhor.",openOnSpotify:"Abrir no Spotify",inQueue:"Na fila",download:"Baixar",previousPage:"Página anterior",nextPage:"Próxima página"},queue:{title:"Fila de download",subtitle:"Músicas na fila. Filtre o que está ativo ou com falha. Uma playlist nova do Spotify remove as concluídas e mantém as com erro.",empty:"Nada na fila no momento.",emptyHint:"Procure uma música e clique em baixar para começar.",emptyFilter:"Nenhuma faixa neste filtro.",filterAll:"Todas",filterActive:"Em andamento",filterQueued:"Aguardando",filterDone:"Concluídas",filterFailed:"Com falha",statusQueued:"Aguardando",statusActive:"Em andamento",statusDownloading:"Baixando",statusDone:"Concluída",statusFailed:"Falhou",retry:"Tentar de novo",retryAllFailed:"Repetir falhas ({count})",clearCompleted:"Limpar concluídas ({count})",saveToDevice:"Salvar no dispositivo",removeFromQueue:"Remover da fila",clearAll:"Limpar tudo",clearAllPrompt:"Remover todos os itens da fila?",forceAudio:"Usar URL do YouTube",overridePlaceholder:"Cole uma URL do YouTube ou YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL do YouTube inválida"},library:{title:"Biblioteca",subtitle:"Músicas que você já baixou. Escute, baixe novamente ou remova.",empty:"Nenhum download ainda.",emptyHint:"Encontre uma música para começar a montar sua biblioteca.",failedLoad:"Falha ao carregar os downloads.",failedDelete:"Falha ao excluir {file}",deletePrompt:'Excluir "{file}"?',countOne:"{count} arquivo na sua biblioteca",countMany:"{count} arquivos na sua biblioteca",downloadToDevice:"Baixar para o dispositivo",deleteFile:"Excluir arquivo",play:"Reproduzir"},monitor:{title:"Monitor de playlists",subtitle:"Adicione playlists do Spotify para monitorar. Novas faixas adicionadas a essas playlists serão baixadas automaticamente.",watchNew:"Monitorar uma nova playlist",urlPlaceholder:"Cole uma URL de playlist do Spotify…",watch:"Monitorar",failedAdd:"Falha ao adicionar a playlist. Verifique a URL e tente novamente.",empty:"Nenhuma playlist sendo monitorada ainda.",emptyHint:"Cole um link de playlist do Spotify acima para começar.",active:"Ativa",paused:"Pausada",everyInterval:"A cada {interval}",tracksOne:"{count} faixa",tracksMany:"{count} faixas",checked:"Verificada {when}",notChecked:"Ainda não verificada",pause:"Pausar monitoramento",resume:"Retomar monitoramento",checkNow:"Verificar agora",stop:"Parar de monitorar",deletePrompt:'Parar de monitorar "{name}"?',info:"Quando você adiciona uma playlist, o Downtify baixa todas as faixas atuais dela e segue monitorando. Qualquer música adicionada depois no Spotify é detectada e baixada automaticamente na próxima verificação.",every15:"A cada 15 min",every30:"A cada 30 min",every1h:"A cada hora",every3h:"A cada 3 h",every6h:"A cada 6 h",every12h:"A cada 12 h",every1d:"Todo dia",every1w:"Toda semana",every2w:"A cada 2 semanas",every1mo:"Todo mês",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 dia",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mês",minSuffix:"min",hourSuffix:"h",daySuffix:"dia",daysSuffix:"dias",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mês",monthsSuffix:"meses",timeJustNow:"agora mesmo",timeMinAgo:"há {n} min",timeHourAgo:"há {n} h",timeDayAgo:"há {n} dia(s)"},settings:{title:"Configurações",subtitle:"Ajuste como o Downtify baixa e marca suas músicas.",audioSource:"Fontes de áudio (ordem de fallback)",audioSourceHint:"Ative uma ou mais. Cada faixa tenta as fontes na ordem (1, 2, 3) até uma funcionar.",audioSourceReset:"Usar ordem recomendada",lyricsSource:"Fonte de letras",lyricsHint:"apenas o lrclib está ativo",downloadLyrics:"Baixar letras",downloadLyricsHint:"Incorpora letras nos arquivos de áudio e grava arquivos .lrc",lyricsProvider:"Provedor",format:"Formato",quality:"Qualidade",qualityIgnored:"ignorada (sem perdas)",playlistsSection:"Playlists",generateM3u:"Gerar arquivo M3U para playlists",generateM3uHint:"Grava Playlists/.m3u com caminhos absolutos (/downloads/... e /slskd/...) para downloads e o Monitor.",syncNavidrome:"Criar playlist no Navidrome",syncNavidromeHint:"Depois de baixar uma playlist do Spotify, escaneia a biblioteca e cria/atualiza uma playlist no Navidrome com o mesmo nome.",navidromeSection:"Navidrome",navidromeHint:"Usa a API Subsonic (como o Explo). A pasta de música no Navidrome deve apontar para os downloads do Downtify.",navidromeEnabled:"Ativar sincronização com Navidrome",navidromeEnabledHint:"Exige URL, usuário e senha. Conta admin opcional dispara varredura da biblioteca.",navidromeUrl:"URL do Navidrome (exemplo: https://musica.exemplo.com)",navidromeUsername:"Usuário do Navidrome",navidromePassword:"Senha do Navidrome",navidromeAdminUser:"Usuário admin (opcional, para varredura)",navidromeAdminPassword:"Senha admin (opcional)",navidromePublic:"Playlist pública no Navidrome",organizationSection:"Organização de arquivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Salva as músicas em subpastas com o nome do artista. Músicas de playlists também são salvas na pasta do artista, não na pasta da playlist.",parallelDownloads:"Downloads paralelos",parallelDownloadsHint:"Máximo de músicas ao mesmo tempo (YouTube e slskd). Toque um número e Salvar; vale para trabalho novo. Com slskd ativo, prefira 2–3: o slskd limita buscas Soulseek simultâneas; valores altos só enfileiram ou falham.",saved:"Alterações salvas",saveError:"Não foi possível salvar as configurações.",language:"Idioma",languageHint:"Escolha o idioma da interface",youtubeAdvancedToggle:"Avançado: cookies do YouTube (opcional)",youtubeCookiesConfigured:"ativo",youtubeCookiesHint:"Quase nunca necessário — só alguns fallbacks do YouTube com idade. Exporte cookies.txt de youtube.com se precisar.",youtubeCookiesPathPlaceholder:"/data/youtube-cookies.txt",youtubeCookiesUpload:"Enviar cookies.txt",youtubeCookiesClear:"Remover cookies",youtubeCookiesReady:"Cookies de login detectadas — yt-dlp usará em vídeos com verificação de idade.",youtubeCookiesWeak:"Arquivo presente, mas sem sessão do YouTube. Exporte de novo de youtube.com logado.",youtubeCookiesMissing:"Caminho definido mas o arquivo não existe. Envie de novo ou confira o volume.",slskdSection:"slskd",slskdHint:"Soulseek via slskd. Com Navidrome ativo, playlists são criadas lá após varrer a biblioteca; arquivos podem ficar na pasta do slskd.",slskdEnabled:"Ativar provedor slskd",slskdEnabledHint:"Quando desativado, o slskd nunca é tentado na cadeia de fallback.",slskdBaseUrl:"URL base do slskd (exemplo: https://slskd.exemplo.com)",slskdApiKey:"API key do slskd",slskdSourceDirTitle:"Pasta de download do slskd (neste container)",slskdSourceDirBullet1:"O slskd grava transferências concluídas aqui (ex.: /slskd → music/slskd no host).",slskdSourceDirBullet2:"O Navidrome deve varrer a biblioteca que inclui esta pasta.",slskdSourceDirBullet3:"Caminho visto pelo Downtify — não o caminho do host nem a URL do slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads -Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Pasta slskd no Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"O Downtify observa esta pasta. Sem cópia para /downloads com “deixar no lugar” ativo.",slskdLeaveInPlace:"Deixar arquivos do slskd no lugar",slskdLeaveInPlaceHint:"Não copiar para /downloads. Taguear no lugar e montar playlists no Navidrome após o scan.",slskdDownloadTimeout:"Tempo máximo slskd (segundos)",slskdQueuedTimeout:"Tempo na fila sem progresso (segundos)",slskdTimeoutHint:'Se o slskd não terminar a tempo, o Downtify tenta o próximo provedor (YouTube). Reduza o tempo na fila se ficar em "Queued on slskd".'},player:{title:"Player",subtitle:"Ouça as músicas que você baixou.",empty:"Nada para tocar ainda",emptyHint:"Baixe alguma música para começar a ouvir.",queue:"Fila",play:"Reproduzir",pause:"Pausar",previous:"Anterior",next:"Próxima",shuffle:"Aleatório",shuffleOn:"Aleatório ligado",shuffleOff:"Aleatório desligado",repeatOff:"Repetição desligada",repeatAll:"Repetir tudo",repeatOne:"Repetir uma",volume:"Volume",mute:"Mudo",unmute:"Tirar mudo",nowPlaying:"Tocando agora",upNext:"A seguir",playFromLibrary:"Abrir no player",countOne:"{count} faixa",countMany:"{count} faixas"},footer:{tagline:"Baixador de músicas de código aberto"}},Ss=[{code:"en",name:"English",messages:lp},{code:"es",name:"Español",messages:cp},{code:"pt-BR",name:"Português (BR)",messages:up}],mo="en",Tc="downtify-locale",ga=(()=>{try{return localStorage.getItem(Tc)}catch{return null}})(),dp=Ss.find(e=>e.code===ga)?ga:mo,Oo=se(dp);function ya(e){return Ss.find(t=>t.code===e)||Ss.find(t=>t.code===mo)}function va(e,t){if(!e)return;const n=t.split(".");let s=e;for(const o of n){if(s==null||typeof s!="object")return;s=s[o]}return typeof s=="string"?s:void 0}function fp(e,t){return t?e.replace(/\{(\w+)\}/g,(n,s)=>t[s]!==void 0&&t[s]!==null?String(t[s]):`{${s}}`):e}function pp(e,t){const n=Oo.value;let s=va(ya(n).messages,e);return s===void 0&&n!==mo&&(s=va(ya(mo).messages,e)),fp(s!==void 0?s:e,t)}function hp(e){if(Ss.find(t=>t.code===e)){Oo.value=e;try{localStorage.setItem(Tc,e)}catch{}typeof document<"u"&&document.documentElement.setAttribute("lang",e)}}function St(){return{t:pp,locale:Oo,setLocale:hp,locales:Ss}}typeof document<"u"&&document.documentElement.setAttribute("lang",Oo.value);const mp={class:"mt-auto px-6 py-6 text-center text-sm text-base-content/60"},gp={__name:"Footer",setup(e){const{t}=St();return(n,s)=>(A(),O("footer",mp,[s[0]||(s[0]=f("a",{class:"font-semibold text-primary hover:underline",href:"https://github.com/henriquesebastiao/downtify",target:"_blank",rel:"noopener"},"Downtify",-1)),s[1]||(s[1]=f("span",{class:"mx-2 opacity-50"},"·",-1)),f("span",null,w(u(t)("footer.tagline")),1)]))}},Pc=/^[a-z0-9]+(-[a-z0-9]+)*$/,Do=(e,t,n,s="")=>{const o=e.split(":");if(e.slice(0,1)==="@"){if(o.length<2||o.length>3)return null;s=o.shift().slice(1)}if(o.length>3||!o.length)return null;if(o.length>1){const a=o.pop(),l=o.pop(),d={provider:o.length>0?o[0]:s,prefix:l,name:a};return t&&!Zs(d)?null:d}const r=o[0],i=r.split("-");if(i.length>1){const a={provider:s,prefix:i.shift(),name:i.join("-")};return t&&!Zs(a)?null:a}if(n&&s===""){const a={provider:s,prefix:"",name:r};return t&&!Zs(a,n)?null:a}return null},Zs=(e,t)=>e?!!((t&&e.prefix===""||e.prefix)&&e.name):!1,Oc=Object.freeze({left:0,top:0,width:16,height:16}),go=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),No=Object.freeze({...Oc,...go}),Rr=Object.freeze({...No,body:"",hidden:!1});function yp(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const s=((e.rotate||0)+(t.rotate||0))%4;return s&&(n.rotate=s),n}function ba(e,t){const n=yp(e,t);for(const s in Rr)s in go?s in e&&!(s in n)&&(n[s]=go[s]):s in t?n[s]=t[s]:s in e&&(n[s]=e[s]);return n}function vp(e,t){const n=e.icons,s=e.aliases||Object.create(null),o=Object.create(null);function r(i){if(n[i])return o[i]=[];if(!(i in o)){o[i]=null;const a=s[i]&&s[i].parent,l=a&&r(a);l&&(o[i]=[a].concat(l))}return o[i]}return Object.keys(n).concat(Object.keys(s)).forEach(r),o}function bp(e,t,n){const s=e.icons,o=e.aliases||Object.create(null);let r={};function i(a){r=ba(s[a]||o[a],r)}return i(t),n.forEach(i),ba(e,r)}function Dc(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(o=>{t(o,null),n.push(o)});const s=vp(e);for(const o in s){const r=s[o];r&&(t(o,bp(e,o,r)),n.push(o))}return n}const _p={provider:"",aliases:{},not_found:{},...Oc};function nr(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function Nc(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!nr(e,_p))return null;const n=t.icons;for(const o in n){const r=n[o];if(!o||typeof r.body!="string"||!nr(r,Rr))return null}const s=t.aliases||Object.create(null);for(const o in s){const r=s[o],i=r.parent;if(!o||typeof i!="string"||!n[i]&&!s[i]||!nr(r,Rr))return null}return t}const _a=Object.create(null);function xp(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function Bn(e,t){const n=_a[e]||(_a[e]=Object.create(null));return n[t]||(n[t]=xp(e,t))}function Ic(e,t){return Nc(t)?Dc(t,(n,s)=>{s?e.icons[n]=s:e.missing.add(n)}):[]}function wp(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let Es=!1;function $c(e){return typeof e=="boolean"&&(Es=e),Es}function kp(e){const t=typeof e=="string"?Do(e,!0,Es):e;if(t){const n=Bn(t.provider,t.prefix),s=t.name;return n.icons[s]||(n.missing.has(s)?null:void 0)}}function Sp(e,t){const n=Do(e,!0,Es);if(!n)return!1;const s=Bn(n.provider,n.prefix);return t?wp(s,n.name,t):(s.missing.add(n.name),!0)}function Ep(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),Es&&!t&&!e.prefix){let o=!1;return Nc(e)&&(e.prefix="",Dc(e,(r,i)=>{Sp(r,i)&&(o=!0)})),o}const n=e.prefix;if(!Zs({prefix:n,name:"a"}))return!1;const s=Bn(t,n);return!!Ic(s,e)}const Lc=Object.freeze({width:null,height:null}),Fc=Object.freeze({...Lc,...go}),Ap=/(-?[0-9.]*[0-9]+[0-9.]*)/g,Cp=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function xa(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const s=e.split(Ap);if(s===null||!s.length)return e;const o=[];let r=s.shift(),i=Cp.test(r);for(;;){if(i){const a=parseFloat(r);isNaN(a)?o.push(r):o.push(Math.ceil(a*t*n)/n)}else o.push(r);if(r=s.shift(),r===void 0)return o.join("");i=!i}}function Rp(e,t="defs"){let n="";const s=e.indexOf("<"+t);for(;s>=0;){const o=e.indexOf(">",s),r=e.indexOf("",r);if(i===-1)break;n+=e.slice(o+1,r).trim(),e=e.slice(0,s).trim()+e.slice(i+1)}return{defs:n,content:e}}function Tp(e,t){return e?""+e+""+t:t}function Pp(e,t,n){const s=Rp(e);return Tp(s.defs,t+s.content+n)}const Op=e=>e==="unset"||e==="undefined"||e==="none";function Dp(e,t){const n={...No,...e},s={...Fc,...t},o={left:n.left,top:n.top,width:n.width,height:n.height};let r=n.body;[n,s].forEach(k=>{const b=[],R=k.hFlip,D=k.vFlip;let C=k.rotate;R?D?C+=2:(b.push("translate("+(o.width+o.left).toString()+" "+(0-o.top).toString()+")"),b.push("scale(-1 1)"),o.top=o.left=0):D&&(b.push("translate("+(0-o.left).toString()+" "+(o.height+o.top).toString()+")"),b.push("scale(1 -1)"),o.top=o.left=0);let P;switch(C<0&&(C-=Math.floor(C/4)*4),C=C%4,C){case 1:P=o.height/2+o.top,b.unshift("rotate(90 "+P.toString()+" "+P.toString()+")");break;case 2:b.unshift("rotate(180 "+(o.width/2+o.left).toString()+" "+(o.height/2+o.top).toString()+")");break;case 3:P=o.width/2+o.left,b.unshift("rotate(-90 "+P.toString()+" "+P.toString()+")");break}C%2===1&&(o.left!==o.top&&(P=o.left,o.left=o.top,o.top=P),o.width!==o.height&&(P=o.width,o.width=o.height,o.height=P)),b.length&&(r=Pp(r,'',""))});const i=s.width,a=s.height,l=o.width,d=o.height;let c,p;i===null?(p=a===null?"1em":a==="auto"?d:a,c=xa(p,l/d)):(c=i==="auto"?l:i,p=a===null?xa(c,d/l):a==="auto"?d:a);const h={},g=(k,b)=>{Op(b)||(h[k]=b.toString())};g("width",c),g("height",p);const v=[o.left,o.top,l,d];return h.viewBox=v.join(" "),{attributes:h,viewBox:v,body:r}}const Np=/\sid="(\S+)"/g,Ip="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let $p=0;function Lp(e,t=Ip){const n=[];let s;for(;s=Np.exec(e);)n.push(s[1]);if(!n.length)return e;const o="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(r=>{const i=typeof t=="function"?t(r):t+($p++).toString(),a=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+a+')([")]|\\.[a-z])',"g"),"$1"+i+o+"$3")}),e=e.replace(new RegExp(o,"g"),""),e}const Tr=Object.create(null);function Fp(e,t){Tr[e]=t}function Pr(e){return Tr[e]||Tr[""]}function ci(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const ui=Object.create(null),ts=["https://api.simplesvg.com","https://api.unisvg.com"],eo=[];for(;ts.length>0;)ts.length===1||Math.random()>.5?eo.push(ts.shift()):eo.push(ts.pop());ui[""]=ci({resources:["https://api.iconify.design"].concat(eo)});function Up(e,t){const n=ci(t);return n===null?!1:(ui[e]=n,!0)}function di(e){return ui[e]}const Mp=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let wa=Mp();function Bp(e,t){const n=di(e);if(!n)return 0;let s;if(!n.maxURL)s=0;else{let o=0;n.resources.forEach(i=>{o=Math.max(o,i.length)});const r=t+".json?icons=";s=n.maxURL-o-n.path.length-r.length}return s}function Hp(e){return e===404}const jp=(e,t,n)=>{const s=[],o=Bp(e,t),r="icons";let i={type:r,provider:e,prefix:t,icons:[]},a=0;return n.forEach((l,d)=>{a+=l.length+1,a>=o&&d>0&&(s.push(i),i={type:r,provider:e,prefix:t,icons:[]},a=l.length),i.icons.push(l)}),s.push(i),s};function qp(e){if(typeof e=="string"){const t=di(e);if(t)return t.path}return"/"}const Vp=(e,t,n)=>{if(!wa){n("abort",424);return}let s=qp(t.provider);switch(t.type){case"icons":{const r=t.prefix,a=t.icons.join(","),l=new URLSearchParams({icons:a});s+=r+".json?"+l.toString();break}case"custom":{const r=t.uri;s+=r.slice(0,1)==="/"?r.slice(1):r;break}default:n("abort",400);return}let o=503;wa(e+s).then(r=>{const i=r.status;if(i!==200){setTimeout(()=>{n(Hp(i)?"abort":"next",i)});return}return o=501,r.json()}).then(r=>{if(typeof r!="object"||r===null){setTimeout(()=>{r===404?n("abort",r):n("next",o)});return}setTimeout(()=>{n("success",r)})}).catch(()=>{n("next",o)})},Wp={prepare:jp,send:Vp};function zp(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((o,r)=>o.provider!==r.provider?o.provider.localeCompare(r.provider):o.prefix!==r.prefix?o.prefix.localeCompare(r.prefix):o.name.localeCompare(r.name));let s={provider:"",prefix:"",name:""};return e.forEach(o=>{if(s.name===o.name&&s.prefix===o.prefix&&s.provider===o.provider)return;s=o;const r=o.provider,i=o.prefix,a=o.name,l=n[r]||(n[r]=Object.create(null)),d=l[i]||(l[i]=Bn(r,i));let c;a in d.icons?c=t.loaded:i===""||d.missing.has(a)?c=t.missing:c=t.pending;const p={provider:r,prefix:i,name:a};c.push(p)}),t}function Uc(e,t){e.forEach(n=>{const s=n.loaderCallbacks;s&&(n.loaderCallbacks=s.filter(o=>o.id!==t))})}function Kp(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const s=e.provider,o=e.prefix;t.forEach(r=>{const i=r.icons,a=i.pending.length;i.pending=i.pending.filter(l=>{if(l.prefix!==o)return!0;const d=l.name;if(e.icons[d])i.loaded.push({provider:s,prefix:o,name:d});else if(e.missing.has(d))i.missing.push({provider:s,prefix:o,name:d});else return n=!0,!0;return!1}),i.pending.length!==a&&(n||Uc([e],r.id),r.callback(i.loaded.slice(0),i.missing.slice(0),i.pending.slice(0),r.abort))})}))}let Qp=0;function Gp(e,t,n){const s=Qp++,o=Uc.bind(null,n,s);if(!t.pending.length)return o;const r={id:s,icons:t,callback:e,abort:o};return n.forEach(i=>{(i.loaderCallbacks||(i.loaderCallbacks=[])).push(r)}),o}function Yp(e,t=!0,n=!1){const s=[];return e.forEach(o=>{const r=typeof o=="string"?Do(o,t,n):o;r&&s.push(r)}),s}var Jp={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function Xp(e,t,n,s){const o=e.resources.length,r=e.random?Math.floor(Math.random()*o):e.index;let i;if(e.random){let x=e.resources.slice(0);for(i=[];x.length>1;){const _=Math.floor(Math.random()*x.length);i.push(x[_]),x=x.slice(0,_).concat(x.slice(_+1))}i=i.concat(x)}else i=e.resources.slice(r).concat(e.resources.slice(0,r));const a=Date.now();let l="pending",d=0,c,p=null,h=[],g=[];typeof s=="function"&&g.push(s);function v(){p&&(clearTimeout(p),p=null)}function k(){l==="pending"&&(l="aborted"),v(),h.forEach(x=>{x.status==="pending"&&(x.status="aborted")}),h=[]}function b(x,_){_&&(g=[]),typeof x=="function"&&g.push(x)}function R(){return{startTime:a,payload:t,status:l,queriesSent:d,queriesPending:h.length,subscribe:b,abort:k}}function D(){l="failed",g.forEach(x=>{x(void 0,c)})}function C(){h.forEach(x=>{x.status==="pending"&&(x.status="aborted")}),h=[]}function P(x,_,E){const j=_!=="success";switch(h=h.filter(M=>M!==x),l){case"pending":break;case"failed":if(j||!e.dataAfterTimeout)return;break;default:return}if(_==="abort"){c=E,D();return}if(j){c=E,h.length||(i.length?U():D());return}if(v(),C(),!e.random){const M=e.resources.indexOf(x.resource);M!==-1&&M!==e.index&&(e.index=M)}l="completed",g.forEach(M=>{M(E)})}function U(){if(l!=="pending")return;v();const x=i.shift();if(x===void 0){if(h.length){p=setTimeout(()=>{v(),l==="pending"&&(C(),D())},e.timeout);return}D();return}const _={status:"pending",resource:x,callback:(E,j)=>{P(_,E,j)}};h.push(_),d++,p=setTimeout(U,e.rotate),n(x,t,_.callback)}return setTimeout(U),R}function Mc(e){const t={...Jp,...e};let n=[];function s(){n=n.filter(a=>a().status==="pending")}function o(a,l,d){const c=Xp(t,a,l,(p,h)=>{s(),d&&d(p,h)});return n.push(c),c}function r(a){return n.find(l=>a(l))||null}return{query:o,find:r,setIndex:a=>{t.index=a},getIndex:()=>t.index,cleanup:s}}function ka(){}const sr=Object.create(null);function Zp(e){if(!sr[e]){const t=di(e);if(!t)return;const n=Mc(t),s={config:t,redundancy:n};sr[e]=s}return sr[e]}function eh(e,t,n){let s,o;if(typeof e=="string"){const r=Pr(e);if(!r)return n(void 0,424),ka;o=r.send;const i=Zp(e);i&&(s=i.redundancy)}else{const r=ci(e);if(r){s=Mc(r);const i=e.resources?e.resources[0]:"",a=Pr(i);a&&(o=a.send)}}return!s||!o?(n(void 0,424),ka):s.query(t,o,n)().abort}function Sa(){}function th(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,Kp(e)}))}function nh(e){const t=[],n=[];return e.forEach(s=>{(s.match(Pc)?t:n).push(s)}),{valid:t,invalid:n}}function ns(e,t,n){function s(){const o=e.pendingIcons;t.forEach(r=>{o&&o.delete(r),e.icons[r]||e.missing.add(r)})}if(n&&typeof n=="object")try{if(!Ic(e,n).length){s();return}}catch(o){console.error(o)}s(),th(e)}function Ea(e,t){e instanceof Promise?e.then(n=>{t(n)}).catch(()=>{t(null)}):t(e)}function sh(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:s}=e,o=e.iconsToLoad;if(delete e.iconsToLoad,!o||!o.length)return;const r=e.loadIcon;if(e.loadIcons&&(o.length>1||!r)){Ea(e.loadIcons(o,s,n),c=>{ns(e,o,c)});return}if(r){o.forEach(c=>{const p=r(c,s,n);Ea(p,h=>{const g=h?{prefix:s,icons:{[c]:h}}:null;ns(e,[c],g)})});return}const{valid:i,invalid:a}=nh(o);if(a.length&&ns(e,a,null),!i.length)return;const l=s.match(Pc)?Pr(n):null;if(!l){ns(e,i,null);return}l.prepare(n,s,i).forEach(c=>{eh(n,c,p=>{ns(e,c.icons,p)})})}))}const oh=(e,t)=>{const n=Yp(e,!0,$c()),s=zp(n);if(!s.pending.length){let l=!0;return t&&setTimeout(()=>{l&&t(s.loaded,s.missing,s.pending,Sa)}),()=>{l=!1}}const o=Object.create(null),r=[];let i,a;return s.pending.forEach(l=>{const{provider:d,prefix:c}=l;if(c===a&&d===i)return;i=d,a=c,r.push(Bn(d,c));const p=o[d]||(o[d]=Object.create(null));p[c]||(p[c]=[])}),s.pending.forEach(l=>{const{provider:d,prefix:c,name:p}=l,h=Bn(d,c),g=h.pendingIcons||(h.pendingIcons=new Set);g.has(p)||(g.add(p),o[d][c].push(p))}),r.forEach(l=>{const d=o[l.provider][l.prefix];d.length&&sh(l,d)}),t?Gp(t,s,r):Sa};function rh(e,t){const n={...e};for(const s in t){const o=t[s],r=typeof o;s in Lc?(o===null||o&&(r==="string"||r==="number"))&&(n[s]=o):r===typeof n[s]&&(n[s]=s==="rotate"?o%4:o)}return n}const ih=/[\s,]+/;function ah(e,t){t.split(ih).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function lh(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function s(o){for(;o<0;)o+=4;return o%4}if(n===""){const o=parseInt(e);return isNaN(o)?0:s(o)}else if(n!==e){let o=0;switch(n){case"%":o=25;break;case"deg":o=90}if(o){let r=parseFloat(e.slice(0,e.length-n.length));return isNaN(r)?0:(r=r/o,r%1===0?s(r):0)}}return t}function ch(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const s in t)n+=" "+s+'="'+t[s]+'"';return'"+e+""}function uh(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function dh(e){return"data:image/svg+xml,"+uh(e)}function fh(e){return'url("'+dh(e)+'")'}const Aa={...Fc,inline:!1},ph={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},hh={display:"inline-block"},Or={backgroundColor:"currentColor"},Bc={backgroundColor:"transparent"},Ca={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Ra={webkitMask:Or,mask:Or,background:Bc};for(const e in Ra){const t=Ra[e];for(const n in Ca)t[e+n]=Ca[n]}const to={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";to[e+"-flip"]=t,to[e.slice(0,1)+"-flip"]=t,to[e+"Flip"]=t});function Ta(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const Pa=(e,t)=>{const n=rh(Aa,t),s={...ph},o=t.mode||"svg",r={},i=t.style,a=typeof i=="object"&&!(i instanceof Array)?i:{};for(let k in t){const b=t[k];if(b!==void 0)switch(k){case"icon":case"style":case"onLoad":case"mode":case"ssr":break;case"inline":case"hFlip":case"vFlip":n[k]=b===!0||b==="true"||b===1;break;case"flip":typeof b=="string"&&ah(n,b);break;case"color":r.color=b;break;case"rotate":typeof b=="string"?n[k]=lh(b):typeof b=="number"&&(n[k]=b);break;case"ariaHidden":case"aria-hidden":b!==!0&&b!=="true"&&delete s["aria-hidden"];break;default:{const R=to[k];R?(b===!0||b==="true"||b===1)&&(n[R]=!0):Aa[k]===void 0&&(s[k]=b)}}}const l=Dp(e,n),d=l.attributes;if(n.inline&&(r.verticalAlign="-0.125em"),o==="svg"){s.style={...r,...a},Object.assign(s,d);let k=0,b=t.id;return typeof b=="string"&&(b=b.replace(/-/g,"_")),s.innerHTML=Lp(l.body,b?()=>b+"ID"+k++:"iconifyVue"),xs("svg",s)}const{body:c,width:p,height:h}=e,g=o==="mask"||(o==="bg"?!1:c.indexOf("currentColor")!==-1),v=ch(c,{...d,width:p+"",height:h+""});return s.style={...r,"--svg":fh(v),width:Ta(d.width),height:Ta(d.height),...hh,...g?Or:Bc,...a},xs("span",s)};$c(!0);Fp("",Wp);if(typeof document<"u"&&typeof window<"u"){const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(s=>{try{(typeof s!="object"||s===null||s instanceof Array||typeof s.icons!="object"||typeof s.prefix!="string"||!Ep(s))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const s="IconifyProviders["+n+"] is invalid.";try{const o=t[n];if(typeof o!="object"||!o||o.resources===void 0)continue;Up(n,o)||console.error(s)}catch{console.error(s)}}}}const mh={...No,body:""},Y=si({inheritAttrs:!1,data(){return{_name:"",_loadingIcon:null,iconMounted:!1,counter:0}},mounted(){this.iconMounted=!0},unmounted(){this.abortLoading()},methods:{abortLoading(){this._loadingIcon&&(this._loadingIcon.abort(),this._loadingIcon=null)},getIcon(e,t,n){if(typeof e=="object"&&e!==null&&typeof e.body=="string")return this._name="",this.abortLoading(),{data:e};let s;if(typeof e!="string"||(s=Do(e,!1,!0))===null)return this.abortLoading(),null;let o=kp(s);if(!o)return(!this._loadingIcon||this._loadingIcon.name!==e)&&(this.abortLoading(),this._name="",o!==null&&(this._loadingIcon={name:e,abort:oh([s],()=>{this.counter++})})),null;if(this.abortLoading(),this._name!==e&&(this._name=e,t&&t(e)),n){o=Object.assign({},o);const i=n(o.body,s.name,s.prefix,s.provider);typeof i=="string"&&(o.body=i)}const r=["iconify"];return s.prefix!==""&&r.push("iconify--"+s.prefix),s.provider!==""&&r.push("iconify--"+s.provider),{data:o,classes:r}}},render(){this.counter;const e=this.$attrs,t=this.iconMounted||e.ssr?this.getIcon(e.icon,e.onLoad,e.customise):null;if(!t)return Pa(mh,e);let n=e;return t.classes&&(n={...e,class:(typeof e.class=="string"?e.class+" ":"")+t.classes.join(" ")}),Pa({...No,...t.data},n)}});function Hc(e,t){return function(){return e.apply(t,arguments)}}const{toString:gh}=Object.prototype,{getPrototypeOf:fi}=Object,{iterator:Io,toStringTag:jc}=Symbol,$o=(e=>t=>{const n=gh.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Et=e=>(e=e.toLowerCase(),t=>$o(t)===e),Lo=e=>t=>typeof t===e,{isArray:Kn}=Array,Hn=Lo("undefined");function Ps(e){return e!==null&&!Hn(e)&&e.constructor!==null&&!Hn(e.constructor)&&nt(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const qc=Et("ArrayBuffer");function yh(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&qc(e.buffer),t}const vh=Lo("string"),nt=Lo("function"),Vc=Lo("number"),Os=e=>e!==null&&typeof e=="object",bh=e=>e===!0||e===!1,no=e=>{if($o(e)!=="object")return!1;const t=fi(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(jc in e)&&!(Io in e)},_h=e=>{if(!Os(e)||Ps(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},xh=Et("Date"),wh=Et("File"),kh=Et("Blob"),Sh=Et("FileList"),Eh=e=>Os(e)&&nt(e.pipe),Ah=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||nt(e.append)&&((t=$o(e))==="formdata"||t==="object"&&nt(e.toString)&&e.toString()==="[object FormData]"))},Ch=Et("URLSearchParams"),[Rh,Th,Ph,Oh]=["ReadableStream","Request","Response","Headers"].map(Et),Dh=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ds(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let s,o;if(typeof e!="object"&&(e=[e]),Kn(e))for(s=0,o=e.length;s0;)if(o=n[s],t===o.toLowerCase())return o;return null}const _n=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,zc=e=>!Hn(e)&&e!==_n;function Dr(){const{caseless:e,skipUndefined:t}=zc(this)&&this||{},n={},s=(o,r)=>{if(r==="__proto__"||r==="constructor"||r==="prototype")return;const i=e&&Wc(n,r)||r;no(n[i])&&no(o)?n[i]=Dr(n[i],o):no(o)?n[i]=Dr({},o):Kn(o)?n[i]=o.slice():(!t||!Hn(o))&&(n[i]=o)};for(let o=0,r=arguments.length;o(Ds(t,(o,r)=>{n&&nt(o)?Object.defineProperty(e,r,{value:Hc(o,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:s}),e),Ih=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),$h=(e,t,n,s)=>{e.prototype=Object.create(t.prototype,s),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},Lh=(e,t,n,s)=>{let o,r,i;const a={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),r=o.length;r-- >0;)i=o[r],(!s||s(i,e,t))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&fi(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Fh=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const s=e.indexOf(t,n);return s!==-1&&s===n},Uh=e=>{if(!e)return null;if(Kn(e))return e;let t=e.length;if(!Vc(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Mh=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&fi(Uint8Array)),Bh=(e,t)=>{const s=(e&&e[Io]).call(e);let o;for(;(o=s.next())&&!o.done;){const r=o.value;t.call(e,r[0],r[1])}},Hh=(e,t)=>{let n;const s=[];for(;(n=e.exec(t))!==null;)s.push(n);return s},jh=Et("HTMLFormElement"),qh=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,s,o){return s.toUpperCase()+o}),Oa=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Vh=Et("RegExp"),Kc=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),s={};Ds(n,(o,r)=>{let i;(i=t(o,r,e))!==!1&&(s[r]=i||o)}),Object.defineProperties(e,s)},Wh=e=>{Kc(e,(t,n)=>{if(nt(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const s=e[n];if(nt(s)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},zh=(e,t)=>{const n={},s=o=>{o.forEach(r=>{n[r]=!0})};return Kn(e)?s(e):s(String(e).split(t)),n},Kh=()=>{},Qh=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Gh(e){return!!(e&&nt(e.append)&&e[jc]==="FormData"&&e[Io])}const Yh=e=>{const t=new Array(10),n=(s,o)=>{if(Os(s)){if(t.indexOf(s)>=0)return;if(Ps(s))return s;if(!("toJSON"in s)){t[o]=s;const r=Kn(s)?[]:{};return Ds(s,(i,a)=>{const l=n(i,o+1);!Hn(l)&&(r[a]=l)}),t[o]=void 0,r}}return s};return n(e,0)},Jh=Et("AsyncFunction"),Xh=e=>e&&(Os(e)||nt(e))&&nt(e.then)&&nt(e.catch),Qc=((e,t)=>e?setImmediate:t?((n,s)=>(_n.addEventListener("message",({source:o,data:r})=>{o===_n&&r===n&&s.length&&s.shift()()},!1),o=>{s.push(o),_n.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",nt(_n.postMessage)),Zh=typeof queueMicrotask<"u"?queueMicrotask.bind(_n):typeof process<"u"&&process.nextTick||Qc,em=e=>e!=null&&nt(e[Io]),T={isArray:Kn,isArrayBuffer:qc,isBuffer:Ps,isFormData:Ah,isArrayBufferView:yh,isString:vh,isNumber:Vc,isBoolean:bh,isObject:Os,isPlainObject:no,isEmptyObject:_h,isReadableStream:Rh,isRequest:Th,isResponse:Ph,isHeaders:Oh,isUndefined:Hn,isDate:xh,isFile:wh,isBlob:kh,isRegExp:Vh,isFunction:nt,isStream:Eh,isURLSearchParams:Ch,isTypedArray:Mh,isFileList:Sh,forEach:Ds,merge:Dr,extend:Nh,trim:Dh,stripBOM:Ih,inherits:$h,toFlatObject:Lh,kindOf:$o,kindOfTest:Et,endsWith:Fh,toArray:Uh,forEachEntry:Bh,matchAll:Hh,isHTMLForm:jh,hasOwnProperty:Oa,hasOwnProp:Oa,reduceDescriptors:Kc,freezeMethods:Wh,toObjectSet:zh,toCamelCase:qh,noop:Kh,toFiniteNumber:Qh,findKey:Wc,global:_n,isContextDefined:zc,isSpecCompliantForm:Gh,toJSONObject:Yh,isAsyncFn:Jh,isThenable:Xh,setImmediate:Qc,asap:Zh,isIterable:em};let ne=class Gc extends Error{static from(t,n,s,o,r,i){const a=new Gc(t.message,n||t.code,s,o,r);return a.cause=t,a.name=t.name,i&&Object.assign(a,i),a}constructor(t,n,s,o,r){super(t),this.name="AxiosError",this.isAxiosError=!0,n&&(this.code=n),s&&(this.config=s),o&&(this.request=o),r&&(this.response=r,this.status=r.status)}toJSON(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:T.toJSONObject(this.config),code:this.code,status:this.status}}};ne.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";ne.ERR_BAD_OPTION="ERR_BAD_OPTION";ne.ECONNABORTED="ECONNABORTED";ne.ETIMEDOUT="ETIMEDOUT";ne.ERR_NETWORK="ERR_NETWORK";ne.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";ne.ERR_DEPRECATED="ERR_DEPRECATED";ne.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";ne.ERR_BAD_REQUEST="ERR_BAD_REQUEST";ne.ERR_CANCELED="ERR_CANCELED";ne.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";ne.ERR_INVALID_URL="ERR_INVALID_URL";const tm=null;function Nr(e){return T.isPlainObject(e)||T.isArray(e)}function Yc(e){return T.endsWith(e,"[]")?e.slice(0,-2):e}function Da(e,t,n){return e?e.concat(t).map(function(o,r){return o=Yc(o),!n&&r?"["+o+"]":o}).join(n?".":""):t}function nm(e){return T.isArray(e)&&!e.some(Nr)}const sm=T.toFlatObject(T,{},null,function(t){return/^is[A-Z]/.test(t)});function Fo(e,t,n){if(!T.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=T.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(k,b){return!T.isUndefined(b[k])});const s=n.metaTokens,o=n.visitor||c,r=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&T.isSpecCompliantForm(t);if(!T.isFunction(o))throw new TypeError("visitor must be a function");function d(v){if(v===null)return"";if(T.isDate(v))return v.toISOString();if(T.isBoolean(v))return v.toString();if(!l&&T.isBlob(v))throw new ne("Blob is not supported. Use a Buffer instead.");return T.isArrayBuffer(v)||T.isTypedArray(v)?l&&typeof Blob=="function"?new Blob([v]):Buffer.from(v):v}function c(v,k,b){let R=v;if(v&&!b&&typeof v=="object"){if(T.endsWith(k,"{}"))k=s?k:k.slice(0,-2),v=JSON.stringify(v);else if(T.isArray(v)&&nm(v)||(T.isFileList(v)||T.endsWith(k,"[]"))&&(R=T.toArray(v)))return k=Yc(k),R.forEach(function(C,P){!(T.isUndefined(C)||C===null)&&t.append(i===!0?Da([k],P,r):i===null?k:k+"[]",d(C))}),!1}return Nr(v)?!0:(t.append(Da(b,k,r),d(v)),!1)}const p=[],h=Object.assign(sm,{defaultVisitor:c,convertValue:d,isVisitable:Nr});function g(v,k){if(!T.isUndefined(v)){if(p.indexOf(v)!==-1)throw Error("Circular reference detected in "+k.join("."));p.push(v),T.forEach(v,function(R,D){(!(T.isUndefined(R)||R===null)&&o.call(t,R,T.isString(D)?D.trim():D,k,h))===!0&&g(R,k?k.concat(D):[D])}),p.pop()}}if(!T.isObject(e))throw new TypeError("data must be an object");return g(e),t}function Na(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(s){return t[s]})}function pi(e,t){this._pairs=[],e&&Fo(e,this,t)}const Jc=pi.prototype;Jc.append=function(t,n){this._pairs.push([t,n])};Jc.toString=function(t){const n=t?function(s){return t.call(this,s,Na)}:Na;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function om(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Xc(e,t,n){if(!t)return e;const s=n&&n.encode||om,o=T.isFunction(n)?{serialize:n}:n,r=o&&o.serialize;let i;if(r?i=r(t,o):i=T.isURLSearchParams(t)?t.toString():new pi(t,o).toString(s),i){const a=e.indexOf("#");a!==-1&&(e=e.slice(0,a)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class Ia{constructor(){this.handlers=[]}use(t,n,s){return this.handlers.push({fulfilled:t,rejected:n,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){T.forEach(this.handlers,function(s){s!==null&&t(s)})}}const hi={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},rm=typeof URLSearchParams<"u"?URLSearchParams:pi,im=typeof FormData<"u"?FormData:null,am=typeof Blob<"u"?Blob:null,lm={isBrowser:!0,classes:{URLSearchParams:rm,FormData:im,Blob:am},protocols:["http","https","file","blob","url","data"]},mi=typeof window<"u"&&typeof document<"u",Ir=typeof navigator=="object"&&navigator||void 0,cm=mi&&(!Ir||["ReactNative","NativeScript","NS"].indexOf(Ir.product)<0),um=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",dm=mi&&window.location.href||"http://localhost",fm=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:mi,hasStandardBrowserEnv:cm,hasStandardBrowserWebWorkerEnv:um,navigator:Ir,origin:dm},Symbol.toStringTag,{value:"Module"})),je={...fm,...lm};function pm(e,t){return Fo(e,new je.classes.URLSearchParams,{visitor:function(n,s,o,r){return je.isNode&&T.isBuffer(n)?(this.append(s,n.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...t})}function hm(e){return T.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function mm(e){const t={},n=Object.keys(e);let s;const o=n.length;let r;for(s=0;s=n.length;return i=!i&&T.isArray(o)?o.length:i,l?(T.hasOwnProp(o,i)?o[i]=[o[i],s]:o[i]=s,!a):((!o[i]||!T.isObject(o[i]))&&(o[i]=[]),t(n,s,o[i],r)&&T.isArray(o[i])&&(o[i]=mm(o[i])),!a)}if(T.isFormData(e)&&T.isFunction(e.entries)){const n={};return T.forEachEntry(e,(s,o)=>{t(hm(s),o,n,0)}),n}return null}function gm(e,t,n){if(T.isString(e))try{return(t||JSON.parse)(e),T.trim(e)}catch(s){if(s.name!=="SyntaxError")throw s}return(n||JSON.stringify)(e)}const Ns={transitional:hi,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const s=n.getContentType()||"",o=s.indexOf("application/json")>-1,r=T.isObject(t);if(r&&T.isHTMLForm(t)&&(t=new FormData(t)),T.isFormData(t))return o?JSON.stringify(Zc(t)):t;if(T.isArrayBuffer(t)||T.isBuffer(t)||T.isStream(t)||T.isFile(t)||T.isBlob(t)||T.isReadableStream(t))return t;if(T.isArrayBufferView(t))return t.buffer;if(T.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(r){if(s.indexOf("application/x-www-form-urlencoded")>-1)return pm(t,this.formSerializer).toString();if((a=T.isFileList(t))||s.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Fo(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return r||o?(n.setContentType("application/json",!1),gm(t)):t}],transformResponse:[function(t){const n=this.transitional||Ns.transitional,s=n&&n.forcedJSONParsing,o=this.responseType==="json";if(T.isResponse(t)||T.isReadableStream(t))return t;if(t&&T.isString(t)&&(s&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t,this.parseReviver)}catch(a){if(i)throw a.name==="SyntaxError"?ne.from(a,ne.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:je.classes.FormData,Blob:je.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};T.forEach(["delete","get","head","post","put","patch"],e=>{Ns.headers[e]={}});const ym=T.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),vm=e=>{const t={};let n,s,o;return e&&e.split(` -`).forEach(function(i){o=i.indexOf(":"),n=i.substring(0,o).trim().toLowerCase(),s=i.substring(o+1).trim(),!(!n||t[n]&&ym[n])&&(n==="set-cookie"?t[n]?t[n].push(s):t[n]=[s]:t[n]=t[n]?t[n]+", "+s:s)}),t},$a=Symbol("internals");function ss(e){return e&&String(e).trim().toLowerCase()}function so(e){return e===!1||e==null?e:T.isArray(e)?e.map(so):String(e)}function bm(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=n.exec(e);)t[s[1]]=s[2];return t}const _m=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function or(e,t,n,s,o){if(T.isFunction(s))return s.call(this,t,n);if(o&&(t=n),!!T.isString(t)){if(T.isString(s))return t.indexOf(s)!==-1;if(T.isRegExp(s))return s.test(t)}}function xm(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,s)=>n.toUpperCase()+s)}function wm(e,t){const n=T.toCamelCase(" "+t);["get","set","has"].forEach(s=>{Object.defineProperty(e,s+n,{value:function(o,r,i){return this[s].call(this,t,o,r,i)},configurable:!0})})}let st=class{constructor(t){t&&this.set(t)}set(t,n,s){const o=this;function r(a,l,d){const c=ss(l);if(!c)throw new Error("header name must be a non-empty string");const p=T.findKey(o,c);(!p||o[p]===void 0||d===!0||d===void 0&&o[p]!==!1)&&(o[p||l]=so(a))}const i=(a,l)=>T.forEach(a,(d,c)=>r(d,c,l));if(T.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(T.isString(t)&&(t=t.trim())&&!_m(t))i(vm(t),n);else if(T.isObject(t)&&T.isIterable(t)){let a={},l,d;for(const c of t){if(!T.isArray(c))throw TypeError("Object iterator must return a key-value pair");a[d=c[0]]=(l=a[d])?T.isArray(l)?[...l,c[1]]:[l,c[1]]:c[1]}i(a,n)}else t!=null&&r(n,t,s);return this}get(t,n){if(t=ss(t),t){const s=T.findKey(this,t);if(s){const o=this[s];if(!n)return o;if(n===!0)return bm(o);if(T.isFunction(n))return n.call(this,o,s);if(T.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=ss(t),t){const s=T.findKey(this,t);return!!(s&&this[s]!==void 0&&(!n||or(this,this[s],s,n)))}return!1}delete(t,n){const s=this;let o=!1;function r(i){if(i=ss(i),i){const a=T.findKey(s,i);a&&(!n||or(s,s[a],a,n))&&(delete s[a],o=!0)}}return T.isArray(t)?t.forEach(r):r(t),o}clear(t){const n=Object.keys(this);let s=n.length,o=!1;for(;s--;){const r=n[s];(!t||or(this,this[r],r,t,!0))&&(delete this[r],o=!0)}return o}normalize(t){const n=this,s={};return T.forEach(this,(o,r)=>{const i=T.findKey(s,r);if(i){n[i]=so(o),delete n[r];return}const a=t?xm(r):String(r).trim();a!==r&&delete n[r],n[a]=so(o),s[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return T.forEach(this,(s,o)=>{s!=null&&s!==!1&&(n[o]=t&&T.isArray(s)?s.join(", "):s)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` -`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const s=new this(t);return n.forEach(o=>s.set(o)),s}static accessor(t){const s=(this[$a]=this[$a]={accessors:{}}).accessors,o=this.prototype;function r(i){const a=ss(i);s[a]||(wm(o,i),s[a]=!0)}return T.isArray(t)?t.forEach(r):r(t),this}};st.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);T.reduceDescriptors(st.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(s){this[n]=s}}});T.freezeMethods(st);function rr(e,t){const n=this||Ns,s=t||n,o=st.from(s.headers);let r=s.data;return T.forEach(e,function(a){r=a.call(n,r,o.normalize(),t?t.status:void 0)}),o.normalize(),r}function eu(e){return!!(e&&e.__CANCEL__)}let Is=class extends ne{constructor(t,n,s){super(t??"canceled",ne.ERR_CANCELED,n,s),this.name="CanceledError",this.__CANCEL__=!0}};function tu(e,t,n){const s=n.config.validateStatus;!n.status||!s||s(n.status)?e(n):t(new ne("Request failed with status code "+n.status,[ne.ERR_BAD_REQUEST,ne.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function km(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Sm(e,t){e=e||10;const n=new Array(e),s=new Array(e);let o=0,r=0,i;return t=t!==void 0?t:1e3,function(l){const d=Date.now(),c=s[r];i||(i=d),n[o]=l,s[o]=d;let p=r,h=0;for(;p!==o;)h+=n[p++],p=p%e;if(o=(o+1)%e,o===r&&(r=(r+1)%e),d-i{n=c,o=null,r&&(clearTimeout(r),r=null),e(...d)};return[(...d)=>{const c=Date.now(),p=c-n;p>=s?i(d,c):(o=d,r||(r=setTimeout(()=>{r=null,i(o)},s-p)))},()=>o&&i(o)]}const yo=(e,t,n=3)=>{let s=0;const o=Sm(50,250);return Em(r=>{const i=r.loaded,a=r.lengthComputable?r.total:void 0,l=i-s,d=o(l),c=i<=a;s=i;const p={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:d||void 0,estimated:d&&a&&c?(a-i)/d:void 0,event:r,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(p)},n)},La=(e,t)=>{const n=e!=null;return[s=>t[0]({lengthComputable:n,total:e,loaded:s}),t[1]]},Fa=e=>(...t)=>T.asap(()=>e(...t)),Am=je.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,je.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(je.origin),je.navigator&&/(msie|trident)/i.test(je.navigator.userAgent)):()=>!0,Cm=je.hasStandardBrowserEnv?{write(e,t,n,s,o,r,i){if(typeof document>"u")return;const a=[`${e}=${encodeURIComponent(t)}`];T.isNumber(n)&&a.push(`expires=${new Date(n).toUTCString()}`),T.isString(s)&&a.push(`path=${s}`),T.isString(o)&&a.push(`domain=${o}`),r===!0&&a.push("secure"),T.isString(i)&&a.push(`SameSite=${i}`),document.cookie=a.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function Rm(e){return typeof e!="string"?!1:/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Tm(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function nu(e,t,n){let s=!Rm(t);return e&&(s||n==!1)?Tm(e,t):t}const Ua=e=>e instanceof st?{...e}:e;function En(e,t){t=t||{};const n={};function s(d,c,p,h){return T.isPlainObject(d)&&T.isPlainObject(c)?T.merge.call({caseless:h},d,c):T.isPlainObject(c)?T.merge({},c):T.isArray(c)?c.slice():c}function o(d,c,p,h){if(T.isUndefined(c)){if(!T.isUndefined(d))return s(void 0,d,p,h)}else return s(d,c,p,h)}function r(d,c){if(!T.isUndefined(c))return s(void 0,c)}function i(d,c){if(T.isUndefined(c)){if(!T.isUndefined(d))return s(void 0,d)}else return s(void 0,c)}function a(d,c,p){if(p in t)return s(d,c);if(p in e)return s(void 0,d)}const l={url:r,method:r,data:r,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a,headers:(d,c,p)=>o(Ua(d),Ua(c),p,!0)};return T.forEach(Object.keys({...e,...t}),function(c){if(c==="__proto__"||c==="constructor"||c==="prototype")return;const p=T.hasOwnProp(l,c)?l[c]:o,h=p(e[c],t[c],c);T.isUndefined(h)&&p!==a||(n[c]=h)}),n}const su=e=>{const t=En({},e);let{data:n,withXSRFToken:s,xsrfHeaderName:o,xsrfCookieName:r,headers:i,auth:a}=t;if(t.headers=i=st.from(i),t.url=Xc(nu(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):""))),T.isFormData(n)){if(je.hasStandardBrowserEnv||je.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if(T.isFunction(n.getHeaders)){const l=n.getHeaders(),d=["content-type","content-length"];Object.entries(l).forEach(([c,p])=>{d.includes(c.toLowerCase())&&i.set(c,p)})}}if(je.hasStandardBrowserEnv&&(s&&T.isFunction(s)&&(s=s(t)),s||s!==!1&&Am(t.url))){const l=o&&r&&Cm.read(r);l&&i.set(o,l)}return t},Pm=typeof XMLHttpRequest<"u",Om=Pm&&function(e){return new Promise(function(n,s){const o=su(e);let r=o.data;const i=st.from(o.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:d}=o,c,p,h,g,v;function k(){g&&g(),v&&v(),o.cancelToken&&o.cancelToken.unsubscribe(c),o.signal&&o.signal.removeEventListener("abort",c)}let b=new XMLHttpRequest;b.open(o.method.toUpperCase(),o.url,!0),b.timeout=o.timeout;function R(){if(!b)return;const C=st.from("getAllResponseHeaders"in b&&b.getAllResponseHeaders()),U={data:!a||a==="text"||a==="json"?b.responseText:b.response,status:b.status,statusText:b.statusText,headers:C,config:e,request:b};tu(function(_){n(_),k()},function(_){s(_),k()},U),b=null}"onloadend"in b?b.onloadend=R:b.onreadystatechange=function(){!b||b.readyState!==4||b.status===0&&!(b.responseURL&&b.responseURL.indexOf("file:")===0)||setTimeout(R)},b.onabort=function(){b&&(s(new ne("Request aborted",ne.ECONNABORTED,e,b)),b=null)},b.onerror=function(P){const U=P&&P.message?P.message:"Network Error",x=new ne(U,ne.ERR_NETWORK,e,b);x.event=P||null,s(x),b=null},b.ontimeout=function(){let P=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const U=o.transitional||hi;o.timeoutErrorMessage&&(P=o.timeoutErrorMessage),s(new ne(P,U.clarifyTimeoutError?ne.ETIMEDOUT:ne.ECONNABORTED,e,b)),b=null},r===void 0&&i.setContentType(null),"setRequestHeader"in b&&T.forEach(i.toJSON(),function(P,U){b.setRequestHeader(U,P)}),T.isUndefined(o.withCredentials)||(b.withCredentials=!!o.withCredentials),a&&a!=="json"&&(b.responseType=o.responseType),d&&([h,v]=yo(d,!0),b.addEventListener("progress",h)),l&&b.upload&&([p,g]=yo(l),b.upload.addEventListener("progress",p),b.upload.addEventListener("loadend",g)),(o.cancelToken||o.signal)&&(c=C=>{b&&(s(!C||C.type?new Is(null,e,b):C),b.abort(),b=null)},o.cancelToken&&o.cancelToken.subscribe(c),o.signal&&(o.signal.aborted?c():o.signal.addEventListener("abort",c)));const D=km(o.url);if(D&&je.protocols.indexOf(D)===-1){s(new ne("Unsupported protocol "+D+":",ne.ERR_BAD_REQUEST,e));return}b.send(r||null)})},Dm=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let s=new AbortController,o;const r=function(d){if(!o){o=!0,a();const c=d instanceof Error?d:this.reason;s.abort(c instanceof ne?c:new Is(c instanceof Error?c.message:c))}};let i=t&&setTimeout(()=>{i=null,r(new ne(`timeout of ${t}ms exceeded`,ne.ETIMEDOUT))},t);const a=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(d=>{d.unsubscribe?d.unsubscribe(r):d.removeEventListener("abort",r)}),e=null)};e.forEach(d=>d.addEventListener("abort",r));const{signal:l}=s;return l.unsubscribe=()=>T.asap(a),l}},Nm=function*(e,t){let n=e.byteLength;if(n{const o=Im(e,t);let r=0,i,a=l=>{i||(i=!0,s&&s(l))};return new ReadableStream({async pull(l){try{const{done:d,value:c}=await o.next();if(d){a(),l.close();return}let p=c.byteLength;if(n){let h=r+=p;n(h)}l.enqueue(new Uint8Array(c))}catch(d){throw a(d),d}},cancel(l){return a(l),o.return()}},{highWaterMark:2})},Ba=64*1024,{isFunction:qs}=T,Lm=(({Request:e,Response:t})=>({Request:e,Response:t}))(T.global),{ReadableStream:Ha,TextEncoder:ja}=T.global,qa=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Fm=e=>{e=T.merge.call({skipUndefined:!0},Lm,e);const{fetch:t,Request:n,Response:s}=e,o=t?qs(t):typeof fetch=="function",r=qs(n),i=qs(s);if(!o)return!1;const a=o&&qs(Ha),l=o&&(typeof ja=="function"?(v=>k=>v.encode(k))(new ja):async v=>new Uint8Array(await new n(v).arrayBuffer())),d=r&&a&&qa(()=>{let v=!1;const k=new n(je.origin,{body:new Ha,method:"POST",get duplex(){return v=!0,"half"}}).headers.has("Content-Type");return v&&!k}),c=i&&a&&qa(()=>T.isReadableStream(new s("").body)),p={stream:c&&(v=>v.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(v=>{!p[v]&&(p[v]=(k,b)=>{let R=k&&k[v];if(R)return R.call(k);throw new ne(`Response type '${v}' is not supported`,ne.ERR_NOT_SUPPORT,b)})});const h=async v=>{if(v==null)return 0;if(T.isBlob(v))return v.size;if(T.isSpecCompliantForm(v))return(await new n(je.origin,{method:"POST",body:v}).arrayBuffer()).byteLength;if(T.isArrayBufferView(v)||T.isArrayBuffer(v))return v.byteLength;if(T.isURLSearchParams(v)&&(v=v+""),T.isString(v))return(await l(v)).byteLength},g=async(v,k)=>{const b=T.toFiniteNumber(v.getContentLength());return b??h(k)};return async v=>{let{url:k,method:b,data:R,signal:D,cancelToken:C,timeout:P,onDownloadProgress:U,onUploadProgress:x,responseType:_,headers:E,withCredentials:j="same-origin",fetchOptions:M}=su(v),Q=t||fetch;_=_?(_+"").toLowerCase():"text";let N=Dm([D,C&&C.toAbortSignal()],P),te=null;const le=N&&N.unsubscribe&&(()=>{N.unsubscribe()});let Me;try{if(x&&d&&b!=="get"&&b!=="head"&&(Me=await g(E,R))!==0){let De=new n(k,{method:"POST",body:R,duplex:"half"}),Oe;if(T.isFormData(R)&&(Oe=De.headers.get("content-type"))&&E.setContentType(Oe),De.body){const[Ct,gt]=La(Me,yo(Fa(x)));R=Ma(De.body,Ba,Ct,gt)}}T.isString(j)||(j=j?"include":"omit");const ce=r&&"credentials"in n.prototype,pe={...M,signal:N,method:b.toUpperCase(),headers:E.normalize().toJSON(),body:R,duplex:"half",credentials:ce?j:void 0};te=r&&new n(k,pe);let ae=await(r?Q(te,M):Q(k,pe));const ut=c&&(_==="stream"||_==="response");if(c&&(U||ut&&le)){const De={};["status","statusText","headers"].forEach(Rt=>{De[Rt]=ae[Rt]});const Oe=T.toFiniteNumber(ae.headers.get("content-length")),[Ct,gt]=U&&La(Oe,yo(Fa(U),!0))||[];ae=new s(Ma(ae.body,Ba,Ct,()=>{gt&>(),le&&le()}),De)}_=_||"text";let At=await p[T.findKey(p,_)||"text"](ae,v);return!ut&&le&&le(),await new Promise((De,Oe)=>{tu(De,Oe,{data:At,headers:st.from(ae.headers),status:ae.status,statusText:ae.statusText,config:v,request:te})})}catch(ce){throw le&&le(),ce&&ce.name==="TypeError"&&/Load failed|fetch/i.test(ce.message)?Object.assign(new ne("Network Error",ne.ERR_NETWORK,v,te,ce&&ce.response),{cause:ce.cause||ce}):ne.from(ce,ce&&ce.code,v,te,ce&&ce.response)}}},Um=new Map,ou=e=>{let t=e&&e.env||{};const{fetch:n,Request:s,Response:o}=t,r=[s,o,n];let i=r.length,a=i,l,d,c=Um;for(;a--;)l=r[a],d=c.get(l),d===void 0&&c.set(l,d=a?new Map:Fm(t)),c=d;return d};ou();const gi={http:tm,xhr:Om,fetch:{get:ou}};T.forEach(gi,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Va=e=>`- ${e}`,Mm=e=>T.isFunction(e)||e===null||e===!1;function Bm(e,t){e=T.isArray(e)?e:[e];const{length:n}=e;let s,o;const r={};for(let i=0;i`adapter ${l} `+(d===!1?"is not supported by the environment":"is not available in the build"));let a=n?i.length>1?`since : +**/let Cr;const Qi=typeof window<"u"&&window.trustedTypes;if(Qi)try{Cr=Qi.createPolicy("vue",{createHTML:e=>e})}catch{}const Ec=Cr?e=>Cr.createHTML(e):e=>e,Cf="http://www.w3.org/2000/svg",Rf="http://www.w3.org/1998/Math/MathML",Wt=typeof document<"u"?document:null,Gi=Wt&&Wt.createElement("template"),Tf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?Wt.createElementNS(Cf,e):t==="mathml"?Wt.createElementNS(Rf,e):n?Wt.createElement(e,{is:n}):Wt.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>Wt.createTextNode(e),createComment:e=>Wt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Wt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,r){const i=n?n.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===r||!(o=o.nextSibling)););else{Gi.innerHTML=Ec(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const a=Gi.content;if(s==="svg"||s==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},tn="transition",es="animation",ws=Symbol("_vtc"),Ac={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Pf=$e({},zl,Ac),Of=e=>(e.displayName="Transition",e.props=Pf,e),Cc=Of((e,{slots:t})=>xs(Rd,Df(e),t)),mn=(e,t=[])=>{Z(e)?e.forEach(n=>n(...t)):e&&e(...t)},Yi=e=>e?Z(e)?e.some(t=>t.length>1):e.length>1:!1;function Df(e){const t={};for(const N in e)N in Ac||(t[N]=e[N]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=r,appearActiveClass:d=i,appearToClass:c=a,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,b=Nf(o),k=b&&b[0],v=b&&b[1],{onBeforeEnter:R,onEnter:D,onEnterCancelled:C,onLeave:P,onLeaveCancelled:F,onBeforeAppear:x=R,onAppear:_=D,onAppearCancelled:E=C}=t,j=(N,te,le,Me)=>{N._enterCancelled=Me,gn(N,te?c:a),gn(N,te?d:i),le&&le()},M=(N,te)=>{N._isLeaving=!1,gn(N,p),gn(N,g),gn(N,h),te&&te()},Q=N=>(te,le)=>{const Me=N?_:D,ce=()=>j(te,N,le);mn(Me,[te,ce]),Ji(()=>{gn(te,N?l:r),jt(te,N?c:a),Yi(Me)||Xi(te,s,k,ce)})};return $e(t,{onBeforeEnter(N){mn(R,[N]),jt(N,r),jt(N,i)},onBeforeAppear(N){mn(x,[N]),jt(N,l),jt(N,d)},onEnter:Q(!1),onAppear:Q(!0),onLeave(N,te){N._isLeaving=!0;const le=()=>M(N,te);jt(N,p),N._enterCancelled?(jt(N,h),ta(N)):(ta(N),jt(N,h)),Ji(()=>{N._isLeaving&&(gn(N,p),jt(N,g),Yi(P)||Xi(N,s,v,le))}),mn(P,[N,le])},onEnterCancelled(N){j(N,!1,void 0,!0),mn(C,[N])},onAppearCancelled(N){j(N,!0,void 0,!0),mn(E,[N])},onLeaveCancelled(N){M(N),mn(F,[N])}})}function Nf(e){if(e==null)return null;if(ve(e))return[Zo(e.enter),Zo(e.leave)];{const t=Zo(e);return[t,t]}}function Zo(e){return Uu(e)}function jt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[ws]||(e[ws]=new Set)).add(t)}function gn(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[ws];n&&(n.delete(t),n.size||(e[ws]=void 0))}function Ji(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let If=0;function Xi(e,t,n,s){const o=e._endId=++If,r=()=>{o===e._endId&&s()};if(n!=null)return setTimeout(r,n);const{type:i,timeout:a,propCount:l}=$f(e,t);if(!i)return s();const d=i+"end";let c=0;const p=()=>{e.removeEventListener(d,h),r()},h=g=>{g.target===e&&++c>=l&&p()};setTimeout(()=>{c(n[b]||"").split(", "),o=s(`${tn}Delay`),r=s(`${tn}Duration`),i=Zi(o,r),a=s(`${es}Delay`),l=s(`${es}Duration`),d=Zi(a,l);let c=null,p=0,h=0;t===tn?i>0&&(c=tn,p=i,h=r.length):t===es?d>0&&(c=es,p=d,h=l.length):(p=Math.max(i,d),c=p>0?i>d?tn:es:null,h=c?c===tn?r.length:l.length:0);const g=c===tn&&/\b(?:transform|all)(?:,|$)/.test(s(`${tn}Property`).toString());return{type:c,timeout:p,propCount:h,hasTransform:g}}function Zi(e,t){for(;e.lengthea(n)+ea(e[s])))}function ea(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ta(e){return(e?e.ownerDocument:document).body.offsetHeight}function Lf(e,t,n){const s=e[ws];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const na=Symbol("_vod"),Uf=Symbol("_vsh"),Ff=Symbol(""),Mf=/(?:^|;)\s*display\s*:/;function Bf(e,t,n){const s=e.style,o=Te(n);let r=!1;if(n&&!o){if(t)if(Te(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&Js(s,a,"")}else for(const i in t)n[i]==null&&Js(s,i,"");for(const i in n)i==="display"&&(r=!0),Js(s,i,n[i])}else if(o){if(t!==n){const i=s[Ff];i&&(n+=";"+i),s.cssText=n,r=Mf.test(n)}}else t&&e.removeAttribute("style");na in e&&(e[na]=r?s.display:"",e[Uf]&&(s.display="none"))}const sa=/\s*!important$/;function Js(e,t,n){if(Z(n))n.forEach(s=>Js(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Hf(e,t);sa.test(n)?e.setProperty(fn(s),n.replace(sa,""),"important"):e[s]=n}}const oa=["Webkit","Moz","ms"],er={};function Hf(e,t){const n=er[t];if(n)return n;let s=mt(t);if(s!=="filter"&&s in e)return er[t]=s;s=xo(s);for(let o=0;otr||(Wf.then(()=>tr=0),tr=Date.now());function Kf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;wt(Qf(s,n.value),t,5,[s])};return n.value=e,n.attached=zf(),n}function Qf(e,t){if(Z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const ua=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Gf=(e,t,n,s,o,r)=>{const i=o==="svg";t==="class"?Lf(e,s,i):t==="style"?Bf(e,n,s):vo(t)?qr(t)||qf(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Yf(e,t,s,i))?(aa(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ia(e,t,s,i,r,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Te(s))?aa(e,mt(t),s,r,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ia(e,t,s,i))};function Yf(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ua(t)&&re(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ua(t)&&Te(n)?!1:t in e}const Mn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Z(t)?n=>Ks(t,n):t};function Jf(e){e.target.composing=!0}function da(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Gt=Symbol("_assign");function fa(e,t,n){return t&&(e=e.trim()),n&&(e=wo(e)),e}const et={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e[Gt]=Mn(o);const r=s||o.props&&o.props.type==="number";an(e,t?"change":"input",i=>{i.target.composing||e[Gt](fa(e.value,n,r))}),(n||r)&&an(e,"change",()=>{e.value=fa(e.value,n,r)}),t||(an(e,"compositionstart",Jf),an(e,"compositionend",da),an(e,"change",da))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:o,number:r}},i){if(e[Gt]=Mn(i),e.composing)return;const a=(r||e.type==="number")&&!/^0\d/.test(e.value)?wo(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||o&&e.value.trim()===l)||(e.value=l))}},qt={deep:!0,created(e,t,n){e[Gt]=Mn(n),an(e,"change",()=>{const s=e._modelValue,o=ks(e),r=e.checked,i=e[Gt];if(Z(s)){const a=zr(s,o),l=a!==-1;if(r&&!l)i(s.concat(o));else if(!r&&l){const d=[...s];d.splice(a,1),i(d)}}else if(Wn(s)){const a=new Set(s);r?a.add(o):a.delete(o),i(a)}else i(Rc(e,r))})},mounted:pa,beforeUpdate(e,t,n){e[Gt]=Mn(n),pa(e,t,n)}};function pa(e,{value:t,oldValue:n},s){e._modelValue=t;let o;if(Z(t))o=zr(t,s.props.value)>-1;else if(Wn(t))o=t.has(s.props.value);else{if(t===n)return;o=zn(t,Rc(e,!0))}e.checked!==o&&(e.checked=o)}const Xs={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const o=Wn(t);an(e,"change",()=>{const r=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?wo(ks(i)):ks(i));e[Gt](e.multiple?o?new Set(r):r:r[0]),e._assigning=!0,ei(()=>{e._assigning=!1})}),e[Gt]=Mn(s)},mounted(e,{value:t}){ha(e,t)},beforeUpdate(e,t,n){e[Gt]=Mn(n)},updated(e,{value:t}){e._assigning||ha(e,t)}};function ha(e,t){const n=e.multiple,s=Z(t);if(!(n&&!s&&!Wn(t))){for(let o=0,r=e.options.length;oString(d)===String(a)):i.selected=zr(t,a)>-1}else i.selected=t.has(a);else if(zn(ks(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function ks(e){return"_value"in e?e._value:e.value}function Rc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Xf=["ctrl","shift","alt","meta"],Zf={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Xf.some(n=>e[`${n}Key`]&&!t.includes(n))},ep=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(o,...r)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=o=>{if(!("key"in o))return;const r=fn(o.key);if(t.some(i=>i===r||tp[i]===r))return e(o)})},sp=$e({patchProp:Gf},Tf);let ma;function op(){return ma||(ma=af(sp))}const rp=(...e)=>{const t=op().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=ap(s);if(!o)return;const r=t._component;!re(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const i=n(o,!1,ip(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function ip(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ap(e){return Te(e)?document.querySelector(e):e}const lp={language:{name:"English"},common:{cancel:"Cancel",save:"Save",close:"Close",delete:"Delete",refresh:"Refresh",download:"Download",unknownArtist:"Unknown artist",unknownTrack:"Unknown track",previousPage:"Previous page",nextPage:"Next page"},nav:{home:"Home",library:"Library",monitor:"Playlist Monitor",queue:"Queue",player:"Player",settings:"Settings",switchToLight:"Switch to light",switchToDark:"Switch to dark"},hero:{noAccount:"no Spotify account needed",tagline:"Your music with full metadata, album art and lyrics — in one click.",songs:"Songs",albums:"Albums",playlists:"Playlists"},search:{placeholder:"Search, paste a Spotify or YouTube Music link…",title:"Search results",matchesFor:"Showing matches for",songsCount:"— {count} song",songsCountPlural:"— {count} songs",typeToBegin:"Type something in the search bar to begin.",error:"Something went wrong.",errorWithDetail:"Something went wrong: {detail}",empty:"No songs found.",emptyHint:"Try another query — artist + title usually works best.",openOnSpotify:"Open on Spotify",inQueue:"In queue",download:"Download",previousPage:"Previous page",nextPage:"Next page"},queue:{title:"Download Queue",subtitle:"In progress = work started (searching providers or transferring). Waiting = not started yet. A new playlist clears done tracks and keeps failures.",empty:"Nothing queued right now.",emptyHint:"Search for a song and hit download to start.",emptyFilter:"No tracks match this filter.",filterAll:"All",filterActive:"In progress",filterQueued:"Waiting",filterDone:"Done",filterFailed:"Failed",statusQueued:"Waiting",statusActive:"In progress",statusDownloading:"Downloading",statusDone:"Done",statusFailed:"Failed",retry:"Retry download",retryAllFailed:"Retry failed ({count})",clearCompleted:"Clear done ({count})",saveToDevice:"Save to device",removeFromQueue:"Remove from queue",clearAll:"Clear all",clearAllPrompt:"Remove all items from the queue?",forceAudio:"Use a YouTube URL instead",overridePlaceholder:"Paste a YouTube or YouTube Music URL…",applyOverride:"Apply",invalidYouTubeURL:"Invalid YouTube URL"},library:{title:"Library",subtitle:"Music you've already downloaded. Listen, re-download or remove.",empty:"No downloads yet.",emptyHint:"Find a song to start filling your library.",failedLoad:"Failed to load downloads.",failedDelete:"Failed to delete {file}",deletePrompt:'Delete "{file}"?',countOne:"{count} file in your library",countMany:"{count} files in your library",downloadToDevice:"Download to device",deleteFile:"Delete file",play:"Play"},monitor:{title:"Playlist Monitor",subtitle:"Add Spotify playlists to watch. New tracks added to those playlists will be downloaded automatically.",watchNew:"Watch a new playlist",urlPlaceholder:"Paste a Spotify playlist URL…",watch:"Watch",failedAdd:"Failed to add playlist. Check the URL and try again.",empty:"No playlists being monitored yet.",emptyHint:"Paste a Spotify playlist link above to get started.",active:"Active",paused:"Paused",everyInterval:"Every {interval}",tracksOne:"{count} track",tracksMany:"{count} tracks",checked:"Checked {when}",notChecked:"Not checked yet",pause:"Pause monitoring",resume:"Resume monitoring",checkNow:"Check now",stop:"Stop monitoring",deletePrompt:'Stop monitoring "{name}"?',info:"When you add a playlist, Downtify downloads every track it currently contains and then keeps watching it. Any songs added later on Spotify are detected and downloaded automatically on the next scheduled check.",every15:"Every 15 min",every30:"Every 30 min",every1h:"Every hour",every3h:"Every 3 h",every6h:"Every 6 h",every12h:"Every 12 h",every1d:"Every day",every1w:"Every week",every2w:"Every 2 weeks",every1mo:"Every month",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 day",short1w:"1 wk",short2w:"2 wk",short1mo:"1 mo",minSuffix:"min",hourSuffix:"h",daySuffix:"day",daysSuffix:"days",weekSuffix:"week",weeksSuffix:"weeks",monthSuffix:"month",monthsSuffix:"months",timeJustNow:"just now",timeMinAgo:"{n} min ago",timeHourAgo:"{n} h ago",timeDayAgo:"{n} day(s) ago"},settings:{title:"Settings",subtitle:"Tweak how Downtify fetches and tags your music.",audioSource:"Audio sources (fallback order)",audioSourceHint:"Enable one or more. Each track tries sources in order (1, 2, 3) until one succeeds.",audioSourceReset:"Use recommended order",lyricsSource:"Lyrics source",lyricsHint:"only lrclib is active",downloadLyrics:"Download lyrics",downloadLyricsHint:"Embed lyrics in audio files and write .lrc sidecar files",lyricsProvider:"Provider",format:"Format",quality:"Quality",qualityIgnored:"ignored (lossless)",playlistsSection:"Playlists",generateM3u:"Generate M3U file for playlists",generateM3uHint:"Writes Playlists/.m3u with absolute file paths (/downloads/... and /slskd/...) for manual downloads and Playlist Monitor sweeps.",syncNavidrome:"Create playlist in Navidrome",syncNavidromeHint:"After a Spotify playlist download finishes, scan the library and create/update a Navidrome playlist with the same name.",navidromeSection:"Navidrome",navidromeHint:"Uses the Subsonic API (same as Explo). Point your music folder in Navidrome at Downtify downloads.",navidromeEnabled:"Enable Navidrome sync",navidromeEnabledHint:"Requires URL, username, and password. Admin account recommended: triggers Subsonic startScan (incremental) before matching tracks, same as Explo.",navidromeUrl:"Navidrome URL (example: https://music.example.com)",navidromeUsername:"Navidrome username",navidromePassword:"Navidrome password",navidromeAdminUser:"Admin username (optional, for library scan)",navidromeAdminPassword:"Admin password (optional)",navidromePublic:"Public playlist in Navidrome",organizationSection:"File organization",organizeByArtist:"Organize by artist",organizeByArtistHint:"Save songs in subfolders named after the artist. Playlist tracks are also placed in their artist's folder instead of a playlist folder.",parallelDownloads:"Parallel downloads",parallelDownloadsHint:"Maximum songs at once (YouTube and slskd). Tap a number, then Save — applies to new work; a playlist already running keeps its current batch until you start another. With slskd on, prefer 2–3: slskd caps concurrent Soulseek searches; higher values mostly queue or fail, not faster downloads.",saved:"Changes saved",saveError:"Couldn't save settings.",language:"Language",languageHint:"Choose the interface language",youtubeSection:"YouTube cookies (optional)",youtubeEnabled:"Configure YouTube cookies",youtubeEnabledHint:"Optional — only helps with some age-restricted YouTube fallbacks. Most tracks work without this.",youtubeCookiesHint:"Not required for normal downloads. Use only if YouTube fallbacks fail on age-restricted videos.",youtubeCookiesPath:"Cookies file path (inside container)",youtubeCookiesPathPlaceholder:"/data/youtube-cookies.txt",youtubeCookiesUpload:"Upload cookies.txt",youtubeCookiesClear:"Remove cookies",youtubeCookiesReady:"Login cookies detected — yt-dlp will use them for age-restricted videos.",youtubeCookiesWeak:"File found but no YouTube login session in it. Re-export from youtube.com while signed in (see hint above).",youtubeCookiesMissing:"Path is set but the file is missing on disk. Upload again or fix the mount path.",slskdSection:"slskd",slskdHint:"Soulseek via slskd. With Navidrome enabled, playlists are built in Navidrome after a library scan — files can stay in the slskd folder.",slskdEnabled:"Enable slskd provider",slskdEnabledHint:"When off, slskd is never attempted in provider fallback.",slskdBaseUrl:"slskd base URL (example: https://slskd.example.com)",slskdApiKey:"slskd API key",slskdSourceDirTitle:"slskd download folder (inside this container)",slskdSourceDirBullet1:"slskd writes completed transfers here (e.g. /slskd → host music/slskd).",slskdSourceDirBullet2:"Navidrome must scan the parent music library that includes this folder.",slskdSourceDirBullet3:"Use the path Downtify sees — not the host path, not the slskd web URL.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads +Downtify: /mnt/storage/music/slskd:/slskd → set /slskd`,slskdSourceDirLabel:"slskd folder path in Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify watches this folder for finished slskd files. No copy into /downloads when leave-in-place is on.",slskdLeaveInPlace:"Leave slskd files in place",slskdLeaveInPlaceHint:"Do not copy into /downloads. Tag in place, register for dedupe, and add tracks to Navidrome playlists via library search (recommended with Navidrome sync).",slskdDownloadTimeout:"Total slskd timeout (seconds)",slskdQueuedTimeout:"Queued / no-progress timeout (seconds)",slskdTimeoutHint:'If slskd does not finish in time, Downtify tries the next audio provider (YouTube). Lower the queued timeout when tracks sit on "Queued on slskd" too long.'},player:{title:"Player",subtitle:"Listen to the music you've downloaded.",empty:"Nothing to play yet",emptyHint:"Download some music to start listening.",queue:"Queue",play:"Play",pause:"Pause",previous:"Previous",next:"Next",shuffle:"Shuffle",shuffleOn:"Shuffle on",shuffleOff:"Shuffle off",repeatOff:"Repeat off",repeatAll:"Repeat all",repeatOne:"Repeat one",volume:"Volume",mute:"Mute",unmute:"Unmute",nowPlaying:"Now playing",upNext:"Up next",playFromLibrary:"Open in player",countOne:"{count} track",countMany:"{count} tracks"},footer:{tagline:"Open source music downloader"}},cp={language:{name:"Español"},common:{cancel:"Cancelar",save:"Guardar",close:"Cerrar",delete:"Eliminar",refresh:"Actualizar",download:"Descargar",unknownArtist:"Artista desconocido",unknownTrack:"Pista desconocida",previousPage:"Página anterior",nextPage:"Página siguiente"},nav:{home:"Inicio",library:"Biblioteca",monitor:"Monitor de listas",queue:"Cola",player:"Reproductor",settings:"Ajustes",switchToLight:"Cambiar a claro",switchToDark:"Cambiar a oscuro"},hero:{noAccount:"sin cuenta de Spotify",tagline:"Tu música con metadatos completos, portada y letras — en un clic.",songs:"Canciones",albums:"Álbumes",playlists:"Listas"},search:{placeholder:"Busca o pega un enlace de Spotify o YouTube Music…",title:"Resultados de búsqueda",matchesFor:"Mostrando coincidencias para",songsCount:"— {count} canción",songsCountPlural:"— {count} canciones",typeToBegin:"Escribe algo en la barra de búsqueda para empezar.",error:"Algo salió mal.",errorWithDetail:"Algo salió mal: {detail}",empty:"No se encontraron canciones.",emptyHint:"Prueba con otra búsqueda — artista + título suele funcionar mejor.",openOnSpotify:"Abrir en Spotify",inQueue:"En la cola",download:"Descargar",previousPage:"Página anterior",nextPage:"Página siguiente"},queue:{title:"Cola de descargas",subtitle:"Canciones en cola. Filtra por activas o fallidas. Una playlist nueva de Spotify quita las terminadas y conserva los fallos.",empty:"No hay nada en la cola ahora mismo.",emptyHint:"Busca una canción y pulsa descargar para empezar.",emptyFilter:"Ninguna pista coincide con este filtro.",filterAll:"Todas",filterActive:"En curso",filterQueued:"En espera",filterDone:"Hechas",filterFailed:"Fallidas",statusQueued:"En espera",statusActive:"En curso",statusDownloading:"Descargando",statusDone:"Hecha",statusFailed:"Fallida",retry:"Reintentar descarga",retryAllFailed:"Reintentar fallidas ({count})",clearCompleted:"Quitar hechas ({count})",saveToDevice:"Guardar en el dispositivo",removeFromQueue:"Quitar de la cola",clearAll:"Limpiar todo",clearAllPrompt:"¿Eliminar todos los elementos de la cola?",forceAudio:"Usar una URL de YouTube",overridePlaceholder:"Pega una URL de YouTube o YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL de YouTube no válida"},library:{title:"Biblioteca",subtitle:"Música que ya has descargado. Escucha, descarga otra vez o elimina.",empty:"Aún no hay descargas.",emptyHint:"Encuentra una canción para empezar a llenar tu biblioteca.",failedLoad:"No se pudieron cargar las descargas.",failedDelete:"No se pudo eliminar {file}",deletePrompt:'¿Eliminar "{file}"?',countOne:"{count} archivo en tu biblioteca",countMany:"{count} archivos en tu biblioteca",downloadToDevice:"Descargar al dispositivo",deleteFile:"Eliminar archivo",play:"Reproducir"},monitor:{title:"Monitor de listas",subtitle:"Añade listas de Spotify para vigilar. Las nuevas pistas añadidas a esas listas se descargarán automáticamente.",watchNew:"Vigilar una nueva lista",urlPlaceholder:"Pega una URL de lista de Spotify…",watch:"Vigilar",failedAdd:"No se pudo añadir la lista. Comprueba la URL e inténtalo de nuevo.",empty:"Aún no hay listas vigiladas.",emptyHint:"Pega un enlace de lista de Spotify arriba para empezar.",active:"Activa",paused:"Pausada",everyInterval:"Cada {interval}",tracksOne:"{count} pista",tracksMany:"{count} pistas",checked:"Revisada {when}",notChecked:"Aún no revisada",pause:"Pausar vigilancia",resume:"Reanudar vigilancia",checkNow:"Revisar ahora",stop:"Dejar de vigilar",deletePrompt:'¿Dejar de vigilar "{name}"?',info:"Al añadir una lista, Downtify descarga todas las pistas que contenga en ese momento y la sigue vigilando. Cualquier canción añadida después en Spotify se detecta y descarga automáticamente en la siguiente revisión.",every15:"Cada 15 min",every30:"Cada 30 min",every1h:"Cada hora",every3h:"Cada 3 h",every6h:"Cada 6 h",every12h:"Cada 12 h",every1d:"Cada día",every1w:"Cada semana",every2w:"Cada 2 semanas",every1mo:"Cada mes",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 día",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mes",minSuffix:"min",hourSuffix:"h",daySuffix:"día",daysSuffix:"días",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mes",monthsSuffix:"meses",timeJustNow:"justo ahora",timeMinAgo:"hace {n} min",timeHourAgo:"hace {n} h",timeDayAgo:"hace {n} día(s)"},settings:{title:"Ajustes",subtitle:"Ajusta cómo Downtify descarga y etiqueta tu música.",audioSource:"Fuentes de audio (orden de respaldo)",audioSourceHint:"Activa una o más. Cada pista prueba las fuentes en orden (1, 2, 3) hasta que una funcione.",audioSourceReset:"Usar orden recomendado",lyricsSource:"Fuente de letras",lyricsHint:"solo lrclib está activo",downloadLyrics:"Descargar letras",downloadLyricsHint:"Incrusta letras en los archivos de audio y escribe archivos .lrc",lyricsProvider:"Proveedor",format:"Formato",quality:"Calidad",qualityIgnored:"ignorada (sin pérdidas)",playlistsSection:"Listas",generateM3u:"Generar archivo M3U para las listas",generateM3uHint:"Escribe Playlists/.m3u con rutas absolutas (/downloads/... y /slskd/...) para descargas y el Monitor.",syncNavidrome:"Crear lista en Navidrome",syncNavidromeHint:"Tras descargar una lista de Spotify, escanea la biblioteca y crea/actualiza una lista en Navidrome con el mismo nombre.",navidromeSection:"Navidrome",navidromeHint:"Usa la API Subsonic (como Explo). La carpeta de música en Navidrome debe apuntar a las descargas de Downtify.",navidromeEnabled:"Activar sincronización con Navidrome",navidromeEnabledHint:"Requiere URL, usuario y contraseña. La cuenta admin opcional inicia el escaneo de la biblioteca.",navidromeUrl:"URL de Navidrome (ejemplo: https://musica.ejemplo.com)",navidromeUsername:"Usuario de Navidrome",navidromePassword:"Contraseña de Navidrome",navidromeAdminUser:"Usuario admin (opcional, para escaneo)",navidromeAdminPassword:"Contraseña admin (opcional)",navidromePublic:"Lista pública en Navidrome",organizationSection:"Organización de archivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Guarda las canciones en subcarpetas con el nombre del artista. Las pistas de listas también se guardan en la carpeta del artista en lugar de la carpeta de la lista.",parallelDownloads:"Descargas paralelas",parallelDownloadsHint:"Máximo de canciones a la vez (YouTube y slskd). Toca un número y Guardar; afecta trabajo nuevo. Con slskd activo, usa 2–3: slskd limita búsquedas Soulseek simultáneas; valores altos suelen encolarse o fallar, no acelerar.",saved:"Cambios guardados",saveError:"No se pudieron guardar los ajustes.",language:"Idioma",languageHint:"Elige el idioma de la interfaz",youtubeSection:"Cookies de YouTube (opcional)",youtubeEnabled:"Configurar cookies de YouTube",youtubeEnabledHint:"Opcional — solo ayuda con algunos fallbacks de YouTube con edad. La mayoría funciona sin esto.",youtubeCookiesHint:"No hace falta para descargas normales. Úsalo solo si fallan vídeos con verificación de edad.",youtubeCookiesPath:"Ruta del archivo de cookies (en el contenedor)",youtubeCookiesPathPlaceholder:"/data/youtube-cookies.txt",youtubeCookiesUpload:"Subir cookies.txt",youtubeCookiesClear:"Quitar cookies",youtubeCookiesReady:"Cookies de inicio de sesión detectadas — yt-dlp las usará en vídeos con edad.",youtubeCookiesWeak:"Archivo presente pero sin sesión de YouTube. Vuelve a exportar desde youtube.com con la cuenta iniciada.",youtubeCookiesMissing:"Ruta configurada pero el archivo no existe. Vuelve a subirlo o revisa el volumen.",slskdSection:"slskd",slskdHint:"Soulseek vía slskd. Con Navidrome activo, las listas se crean allí tras escanear la biblioteca; los archivos pueden quedarse en la carpeta slskd.",slskdEnabled:"Activar proveedor slskd",slskdEnabledHint:"Si está desactivado, slskd nunca se intentará en la cadena de fallback.",slskdBaseUrl:"URL base de slskd (ejemplo: https://slskd.ejemplo.com)",slskdApiKey:"API key de slskd",slskdSourceDirTitle:"Carpeta de descargas de slskd (en este contenedor)",slskdSourceDirBullet1:"slskd escribe aquí las transferencias completadas (ej. /slskd → music/slskd en el host).",slskdSourceDirBullet2:"Navidrome debe escanear la biblioteca que incluye esta carpeta.",slskdSourceDirBullet3:"Ruta que ve Downtify — no la ruta del host ni la URL web de slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads +Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Carpeta slskd en Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"Downtify detecta archivos slskd aquí. Sin copia a /downloads si “dejar en sitio” está activo.",slskdLeaveInPlace:"Dejar archivos slskd en su sitio",slskdLeaveInPlaceHint:"No copiar a /downloads. Etiquetar en sitio y añadir a listas de Navidrome tras el escaneo.",slskdDownloadTimeout:"Tiempo máximo slskd (segundos)",slskdQueuedTimeout:"Tiempo en cola sin progreso (segundos)",slskdTimeoutHint:'Si slskd no termina a tiempo, Downtify prueba el siguiente proveedor (YouTube). Baja el tiempo en cola si se queda en "Queued on slskd".'},player:{title:"Reproductor",subtitle:"Escucha la música que has descargado.",empty:"Nada que reproducir aún",emptyHint:"Descarga música para empezar a escuchar.",queue:"Cola",play:"Reproducir",pause:"Pausar",previous:"Anterior",next:"Siguiente",shuffle:"Aleatorio",shuffleOn:"Aleatorio activado",shuffleOff:"Aleatorio desactivado",repeatOff:"Repetición desactivada",repeatAll:"Repetir todo",repeatOne:"Repetir una",volume:"Volumen",mute:"Silenciar",unmute:"Activar sonido",nowPlaying:"Sonando ahora",upNext:"A continuación",playFromLibrary:"Abrir en el reproductor",countOne:"{count} pista",countMany:"{count} pistas"},footer:{tagline:"Descargador de música de código abierto"}},up={language:{name:"Português (BR)"},common:{cancel:"Cancelar",save:"Salvar",close:"Fechar",delete:"Excluir",refresh:"Atualizar",download:"Baixar",unknownArtist:"Artista desconhecido",unknownTrack:"Faixa desconhecida",previousPage:"Página anterior",nextPage:"Próxima página"},nav:{home:"Início",library:"Biblioteca",monitor:"Monitor de playlists",queue:"Fila",player:"Player",settings:"Configurações",switchToLight:"Mudar para claro",switchToDark:"Mudar para escuro"},hero:{noAccount:"sem precisar de conta no Spotify",tagline:"Sua música com metadados completos, capa do álbum e letras — em um clique.",songs:"Músicas",albums:"Álbuns",playlists:"Playlists"},search:{placeholder:"Busque uma música ou cole um link do Spotify ou YouTube Music…",title:"Resultados da busca",matchesFor:"Mostrando resultados para",songsCount:"— {count} música",songsCountPlural:"— {count} músicas",typeToBegin:"Digite algo na barra de busca para começar.",error:"Algo deu errado.",errorWithDetail:"Algo deu errado: {detail}",empty:"Nenhuma música encontrada.",emptyHint:"Tente outra busca — artista + título costuma funcionar melhor.",openOnSpotify:"Abrir no Spotify",inQueue:"Na fila",download:"Baixar",previousPage:"Página anterior",nextPage:"Próxima página"},queue:{title:"Fila de download",subtitle:"Músicas na fila. Filtre o que está ativo ou com falha. Uma playlist nova do Spotify remove as concluídas e mantém as com erro.",empty:"Nada na fila no momento.",emptyHint:"Procure uma música e clique em baixar para começar.",emptyFilter:"Nenhuma faixa neste filtro.",filterAll:"Todas",filterActive:"Em andamento",filterQueued:"Aguardando",filterDone:"Concluídas",filterFailed:"Com falha",statusQueued:"Aguardando",statusActive:"Em andamento",statusDownloading:"Baixando",statusDone:"Concluída",statusFailed:"Falhou",retry:"Tentar de novo",retryAllFailed:"Repetir falhas ({count})",clearCompleted:"Limpar concluídas ({count})",saveToDevice:"Salvar no dispositivo",removeFromQueue:"Remover da fila",clearAll:"Limpar tudo",clearAllPrompt:"Remover todos os itens da fila?",forceAudio:"Usar URL do YouTube",overridePlaceholder:"Cole uma URL do YouTube ou YouTube Music…",applyOverride:"Aplicar",invalidYouTubeURL:"URL do YouTube inválida"},library:{title:"Biblioteca",subtitle:"Músicas que você já baixou. Escute, baixe novamente ou remova.",empty:"Nenhum download ainda.",emptyHint:"Encontre uma música para começar a montar sua biblioteca.",failedLoad:"Falha ao carregar os downloads.",failedDelete:"Falha ao excluir {file}",deletePrompt:'Excluir "{file}"?',countOne:"{count} arquivo na sua biblioteca",countMany:"{count} arquivos na sua biblioteca",downloadToDevice:"Baixar para o dispositivo",deleteFile:"Excluir arquivo",play:"Reproduzir"},monitor:{title:"Monitor de playlists",subtitle:"Adicione playlists do Spotify para monitorar. Novas faixas adicionadas a essas playlists serão baixadas automaticamente.",watchNew:"Monitorar uma nova playlist",urlPlaceholder:"Cole uma URL de playlist do Spotify…",watch:"Monitorar",failedAdd:"Falha ao adicionar a playlist. Verifique a URL e tente novamente.",empty:"Nenhuma playlist sendo monitorada ainda.",emptyHint:"Cole um link de playlist do Spotify acima para começar.",active:"Ativa",paused:"Pausada",everyInterval:"A cada {interval}",tracksOne:"{count} faixa",tracksMany:"{count} faixas",checked:"Verificada {when}",notChecked:"Ainda não verificada",pause:"Pausar monitoramento",resume:"Retomar monitoramento",checkNow:"Verificar agora",stop:"Parar de monitorar",deletePrompt:'Parar de monitorar "{name}"?',info:"Quando você adiciona uma playlist, o Downtify baixa todas as faixas atuais dela e segue monitorando. Qualquer música adicionada depois no Spotify é detectada e baixada automaticamente na próxima verificação.",every15:"A cada 15 min",every30:"A cada 30 min",every1h:"A cada hora",every3h:"A cada 3 h",every6h:"A cada 6 h",every12h:"A cada 12 h",every1d:"Todo dia",every1w:"Toda semana",every2w:"A cada 2 semanas",every1mo:"Todo mês",short15:"15 min",short30:"30 min",short1h:"1 h",short3h:"3 h",short6h:"6 h",short12h:"12 h",short1d:"1 dia",short1w:"1 sem",short2w:"2 sem",short1mo:"1 mês",minSuffix:"min",hourSuffix:"h",daySuffix:"dia",daysSuffix:"dias",weekSuffix:"semana",weeksSuffix:"semanas",monthSuffix:"mês",monthsSuffix:"meses",timeJustNow:"agora mesmo",timeMinAgo:"há {n} min",timeHourAgo:"há {n} h",timeDayAgo:"há {n} dia(s)"},settings:{title:"Configurações",subtitle:"Ajuste como o Downtify baixa e marca suas músicas.",audioSource:"Fontes de áudio (ordem de fallback)",audioSourceHint:"Ative uma ou mais. Cada faixa tenta as fontes na ordem (1, 2, 3) até uma funcionar.",audioSourceReset:"Usar ordem recomendada",lyricsSource:"Fonte de letras",lyricsHint:"apenas o lrclib está ativo",downloadLyrics:"Baixar letras",downloadLyricsHint:"Incorpora letras nos arquivos de áudio e grava arquivos .lrc",lyricsProvider:"Provedor",format:"Formato",quality:"Qualidade",qualityIgnored:"ignorada (sem perdas)",playlistsSection:"Playlists",generateM3u:"Gerar arquivo M3U para playlists",generateM3uHint:"Grava Playlists/.m3u com caminhos absolutos (/downloads/... e /slskd/...) para downloads e o Monitor.",syncNavidrome:"Criar playlist no Navidrome",syncNavidromeHint:"Depois de baixar uma playlist do Spotify, escaneia a biblioteca e cria/atualiza uma playlist no Navidrome com o mesmo nome.",navidromeSection:"Navidrome",navidromeHint:"Usa a API Subsonic (como o Explo). A pasta de música no Navidrome deve apontar para os downloads do Downtify.",navidromeEnabled:"Ativar sincronização com Navidrome",navidromeEnabledHint:"Exige URL, usuário e senha. Conta admin opcional dispara varredura da biblioteca.",navidromeUrl:"URL do Navidrome (exemplo: https://musica.exemplo.com)",navidromeUsername:"Usuário do Navidrome",navidromePassword:"Senha do Navidrome",navidromeAdminUser:"Usuário admin (opcional, para varredura)",navidromeAdminPassword:"Senha admin (opcional)",navidromePublic:"Playlist pública no Navidrome",organizationSection:"Organização de arquivos",organizeByArtist:"Organizar por artista",organizeByArtistHint:"Salva as músicas em subpastas com o nome do artista. Músicas de playlists também são salvas na pasta do artista, não na pasta da playlist.",parallelDownloads:"Downloads paralelos",parallelDownloadsHint:"Máximo de músicas ao mesmo tempo (YouTube e slskd). Toque um número e Salvar; vale para trabalho novo. Com slskd ativo, prefira 2–3: o slskd limita buscas Soulseek simultâneas; valores altos só enfileiram ou falham.",saved:"Alterações salvas",saveError:"Não foi possível salvar as configurações.",language:"Idioma",languageHint:"Escolha o idioma da interface",youtubeSection:"Cookies do YouTube (opcional)",youtubeEnabled:"Configurar cookies do YouTube",youtubeEnabledHint:"Opcional — só ajuda em alguns fallbacks do YouTube com idade. A maioria funciona sem isso.",youtubeCookiesHint:"Não é necessário para baixas normais. Use só se fallbacks falharem por verificação de idade.",youtubeCookiesPath:"Caminho do arquivo de cookies (no container)",youtubeCookiesPathPlaceholder:"/data/youtube-cookies.txt",youtubeCookiesUpload:"Enviar cookies.txt",youtubeCookiesClear:"Remover cookies",youtubeCookiesReady:"Cookies de login detectadas — yt-dlp usará em vídeos com verificação de idade.",youtubeCookiesWeak:"Arquivo presente, mas sem sessão do YouTube. Exporte de novo de youtube.com logado.",youtubeCookiesMissing:"Caminho definido mas o arquivo não existe. Envie de novo ou confira o volume.",slskdSection:"slskd",slskdHint:"Soulseek via slskd. Com Navidrome ativo, playlists são criadas lá após varrer a biblioteca; arquivos podem ficar na pasta do slskd.",slskdEnabled:"Ativar provedor slskd",slskdEnabledHint:"Quando desativado, o slskd nunca é tentado na cadeia de fallback.",slskdBaseUrl:"URL base do slskd (exemplo: https://slskd.exemplo.com)",slskdApiKey:"API key do slskd",slskdSourceDirTitle:"Pasta de download do slskd (neste container)",slskdSourceDirBullet1:"O slskd grava transferências concluídas aqui (ex.: /slskd → music/slskd no host).",slskdSourceDirBullet2:"O Navidrome deve varrer a biblioteca que inclui esta pasta.",slskdSourceDirBullet3:"Caminho visto pelo Downtify — não o caminho do host nem a URL do slskd.",slskdSourceDirExample:`slskd: /mnt/storage/music/slskd:/downloads +Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Pasta slskd no Downtify",slskdSourceDirPlaceholder:"/slskd",slskdSourceDirHint:"O Downtify observa esta pasta. Sem cópia para /downloads com “deixar no lugar” ativo.",slskdLeaveInPlace:"Deixar arquivos do slskd no lugar",slskdLeaveInPlaceHint:"Não copiar para /downloads. Taguear no lugar e montar playlists no Navidrome após o scan.",slskdDownloadTimeout:"Tempo máximo slskd (segundos)",slskdQueuedTimeout:"Tempo na fila sem progresso (segundos)",slskdTimeoutHint:'Se o slskd não terminar a tempo, o Downtify tenta o próximo provedor (YouTube). Reduza o tempo na fila se ficar em "Queued on slskd".'},player:{title:"Player",subtitle:"Ouça as músicas que você baixou.",empty:"Nada para tocar ainda",emptyHint:"Baixe alguma música para começar a ouvir.",queue:"Fila",play:"Reproduzir",pause:"Pausar",previous:"Anterior",next:"Próxima",shuffle:"Aleatório",shuffleOn:"Aleatório ligado",shuffleOff:"Aleatório desligado",repeatOff:"Repetição desligada",repeatAll:"Repetir tudo",repeatOne:"Repetir uma",volume:"Volume",mute:"Mudo",unmute:"Tirar mudo",nowPlaying:"Tocando agora",upNext:"A seguir",playFromLibrary:"Abrir no player",countOne:"{count} faixa",countMany:"{count} faixas"},footer:{tagline:"Baixador de músicas de código aberto"}},Ss=[{code:"en",name:"English",messages:lp},{code:"es",name:"Español",messages:cp},{code:"pt-BR",name:"Português (BR)",messages:up}],mo="en",Tc="downtify-locale",ga=(()=>{try{return localStorage.getItem(Tc)}catch{return null}})(),dp=Ss.find(e=>e.code===ga)?ga:mo,Oo=se(dp);function ya(e){return Ss.find(t=>t.code===e)||Ss.find(t=>t.code===mo)}function ba(e,t){if(!e)return;const n=t.split(".");let s=e;for(const o of n){if(s==null||typeof s!="object")return;s=s[o]}return typeof s=="string"?s:void 0}function fp(e,t){return t?e.replace(/\{(\w+)\}/g,(n,s)=>t[s]!==void 0&&t[s]!==null?String(t[s]):`{${s}}`):e}function pp(e,t){const n=Oo.value;let s=ba(ya(n).messages,e);return s===void 0&&n!==mo&&(s=ba(ya(mo).messages,e)),fp(s!==void 0?s:e,t)}function hp(e){if(Ss.find(t=>t.code===e)){Oo.value=e;try{localStorage.setItem(Tc,e)}catch{}typeof document<"u"&&document.documentElement.setAttribute("lang",e)}}function St(){return{t:pp,locale:Oo,setLocale:hp,locales:Ss}}typeof document<"u"&&document.documentElement.setAttribute("lang",Oo.value);const mp={class:"mt-auto px-6 py-6 text-center text-sm text-base-content/60"},gp={__name:"Footer",setup(e){const{t}=St();return(n,s)=>(A(),O("footer",mp,[s[0]||(s[0]=f("a",{class:"font-semibold text-primary hover:underline",href:"https://github.com/henriquesebastiao/downtify",target:"_blank",rel:"noopener"},"Downtify",-1)),s[1]||(s[1]=f("span",{class:"mx-2 opacity-50"},"·",-1)),f("span",null,w(u(t)("footer.tagline")),1)]))}},Pc=/^[a-z0-9]+(-[a-z0-9]+)*$/,Do=(e,t,n,s="")=>{const o=e.split(":");if(e.slice(0,1)==="@"){if(o.length<2||o.length>3)return null;s=o.shift().slice(1)}if(o.length>3||!o.length)return null;if(o.length>1){const a=o.pop(),l=o.pop(),d={provider:o.length>0?o[0]:s,prefix:l,name:a};return t&&!Zs(d)?null:d}const r=o[0],i=r.split("-");if(i.length>1){const a={provider:s,prefix:i.shift(),name:i.join("-")};return t&&!Zs(a)?null:a}if(n&&s===""){const a={provider:s,prefix:"",name:r};return t&&!Zs(a,n)?null:a}return null},Zs=(e,t)=>e?!!((t&&e.prefix===""||e.prefix)&&e.name):!1,Oc=Object.freeze({left:0,top:0,width:16,height:16}),go=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),No=Object.freeze({...Oc,...go}),Rr=Object.freeze({...No,body:"",hidden:!1});function yp(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const s=((e.rotate||0)+(t.rotate||0))%4;return s&&(n.rotate=s),n}function va(e,t){const n=yp(e,t);for(const s in Rr)s in go?s in e&&!(s in n)&&(n[s]=go[s]):s in t?n[s]=t[s]:s in e&&(n[s]=e[s]);return n}function bp(e,t){const n=e.icons,s=e.aliases||Object.create(null),o=Object.create(null);function r(i){if(n[i])return o[i]=[];if(!(i in o)){o[i]=null;const a=s[i]&&s[i].parent,l=a&&r(a);l&&(o[i]=[a].concat(l))}return o[i]}return Object.keys(n).concat(Object.keys(s)).forEach(r),o}function vp(e,t,n){const s=e.icons,o=e.aliases||Object.create(null);let r={};function i(a){r=va(s[a]||o[a],r)}return i(t),n.forEach(i),va(e,r)}function Dc(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(o=>{t(o,null),n.push(o)});const s=bp(e);for(const o in s){const r=s[o];r&&(t(o,vp(e,o,r)),n.push(o))}return n}const _p={provider:"",aliases:{},not_found:{},...Oc};function nr(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function Nc(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!nr(e,_p))return null;const n=t.icons;for(const o in n){const r=n[o];if(!o||typeof r.body!="string"||!nr(r,Rr))return null}const s=t.aliases||Object.create(null);for(const o in s){const r=s[o],i=r.parent;if(!o||typeof i!="string"||!n[i]&&!s[i]||!nr(r,Rr))return null}return t}const _a=Object.create(null);function xp(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function Bn(e,t){const n=_a[e]||(_a[e]=Object.create(null));return n[t]||(n[t]=xp(e,t))}function Ic(e,t){return Nc(t)?Dc(t,(n,s)=>{s?e.icons[n]=s:e.missing.add(n)}):[]}function wp(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let Es=!1;function $c(e){return typeof e=="boolean"&&(Es=e),Es}function kp(e){const t=typeof e=="string"?Do(e,!0,Es):e;if(t){const n=Bn(t.provider,t.prefix),s=t.name;return n.icons[s]||(n.missing.has(s)?null:void 0)}}function Sp(e,t){const n=Do(e,!0,Es);if(!n)return!1;const s=Bn(n.provider,n.prefix);return t?wp(s,n.name,t):(s.missing.add(n.name),!0)}function Ep(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),Es&&!t&&!e.prefix){let o=!1;return Nc(e)&&(e.prefix="",Dc(e,(r,i)=>{Sp(r,i)&&(o=!0)})),o}const n=e.prefix;if(!Zs({prefix:n,name:"a"}))return!1;const s=Bn(t,n);return!!Ic(s,e)}const Lc=Object.freeze({width:null,height:null}),Uc=Object.freeze({...Lc,...go}),Ap=/(-?[0-9.]*[0-9]+[0-9.]*)/g,Cp=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function xa(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const s=e.split(Ap);if(s===null||!s.length)return e;const o=[];let r=s.shift(),i=Cp.test(r);for(;;){if(i){const a=parseFloat(r);isNaN(a)?o.push(r):o.push(Math.ceil(a*t*n)/n)}else o.push(r);if(r=s.shift(),r===void 0)return o.join("");i=!i}}function Rp(e,t="defs"){let n="";const s=e.indexOf("<"+t);for(;s>=0;){const o=e.indexOf(">",s),r=e.indexOf("",r);if(i===-1)break;n+=e.slice(o+1,r).trim(),e=e.slice(0,s).trim()+e.slice(i+1)}return{defs:n,content:e}}function Tp(e,t){return e?""+e+""+t:t}function Pp(e,t,n){const s=Rp(e);return Tp(s.defs,t+s.content+n)}const Op=e=>e==="unset"||e==="undefined"||e==="none";function Dp(e,t){const n={...No,...e},s={...Uc,...t},o={left:n.left,top:n.top,width:n.width,height:n.height};let r=n.body;[n,s].forEach(k=>{const v=[],R=k.hFlip,D=k.vFlip;let C=k.rotate;R?D?C+=2:(v.push("translate("+(o.width+o.left).toString()+" "+(0-o.top).toString()+")"),v.push("scale(-1 1)"),o.top=o.left=0):D&&(v.push("translate("+(0-o.left).toString()+" "+(o.height+o.top).toString()+")"),v.push("scale(1 -1)"),o.top=o.left=0);let P;switch(C<0&&(C-=Math.floor(C/4)*4),C=C%4,C){case 1:P=o.height/2+o.top,v.unshift("rotate(90 "+P.toString()+" "+P.toString()+")");break;case 2:v.unshift("rotate(180 "+(o.width/2+o.left).toString()+" "+(o.height/2+o.top).toString()+")");break;case 3:P=o.width/2+o.left,v.unshift("rotate(-90 "+P.toString()+" "+P.toString()+")");break}C%2===1&&(o.left!==o.top&&(P=o.left,o.left=o.top,o.top=P),o.width!==o.height&&(P=o.width,o.width=o.height,o.height=P)),v.length&&(r=Pp(r,'',""))});const i=s.width,a=s.height,l=o.width,d=o.height;let c,p;i===null?(p=a===null?"1em":a==="auto"?d:a,c=xa(p,l/d)):(c=i==="auto"?l:i,p=a===null?xa(c,d/l):a==="auto"?d:a);const h={},g=(k,v)=>{Op(v)||(h[k]=v.toString())};g("width",c),g("height",p);const b=[o.left,o.top,l,d];return h.viewBox=b.join(" "),{attributes:h,viewBox:b,body:r}}const Np=/\sid="(\S+)"/g,Ip="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let $p=0;function Lp(e,t=Ip){const n=[];let s;for(;s=Np.exec(e);)n.push(s[1]);if(!n.length)return e;const o="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(r=>{const i=typeof t=="function"?t(r):t+($p++).toString(),a=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+a+')([")]|\\.[a-z])',"g"),"$1"+i+o+"$3")}),e=e.replace(new RegExp(o,"g"),""),e}const Tr=Object.create(null);function Up(e,t){Tr[e]=t}function Pr(e){return Tr[e]||Tr[""]}function ci(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const ui=Object.create(null),ts=["https://api.simplesvg.com","https://api.unisvg.com"],eo=[];for(;ts.length>0;)ts.length===1||Math.random()>.5?eo.push(ts.shift()):eo.push(ts.pop());ui[""]=ci({resources:["https://api.iconify.design"].concat(eo)});function Fp(e,t){const n=ci(t);return n===null?!1:(ui[e]=n,!0)}function di(e){return ui[e]}const Mp=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let wa=Mp();function Bp(e,t){const n=di(e);if(!n)return 0;let s;if(!n.maxURL)s=0;else{let o=0;n.resources.forEach(i=>{o=Math.max(o,i.length)});const r=t+".json?icons=";s=n.maxURL-o-n.path.length-r.length}return s}function Hp(e){return e===404}const jp=(e,t,n)=>{const s=[],o=Bp(e,t),r="icons";let i={type:r,provider:e,prefix:t,icons:[]},a=0;return n.forEach((l,d)=>{a+=l.length+1,a>=o&&d>0&&(s.push(i),i={type:r,provider:e,prefix:t,icons:[]},a=l.length),i.icons.push(l)}),s.push(i),s};function qp(e){if(typeof e=="string"){const t=di(e);if(t)return t.path}return"/"}const Vp=(e,t,n)=>{if(!wa){n("abort",424);return}let s=qp(t.provider);switch(t.type){case"icons":{const r=t.prefix,a=t.icons.join(","),l=new URLSearchParams({icons:a});s+=r+".json?"+l.toString();break}case"custom":{const r=t.uri;s+=r.slice(0,1)==="/"?r.slice(1):r;break}default:n("abort",400);return}let o=503;wa(e+s).then(r=>{const i=r.status;if(i!==200){setTimeout(()=>{n(Hp(i)?"abort":"next",i)});return}return o=501,r.json()}).then(r=>{if(typeof r!="object"||r===null){setTimeout(()=>{r===404?n("abort",r):n("next",o)});return}setTimeout(()=>{n("success",r)})}).catch(()=>{n("next",o)})},Wp={prepare:jp,send:Vp};function zp(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((o,r)=>o.provider!==r.provider?o.provider.localeCompare(r.provider):o.prefix!==r.prefix?o.prefix.localeCompare(r.prefix):o.name.localeCompare(r.name));let s={provider:"",prefix:"",name:""};return e.forEach(o=>{if(s.name===o.name&&s.prefix===o.prefix&&s.provider===o.provider)return;s=o;const r=o.provider,i=o.prefix,a=o.name,l=n[r]||(n[r]=Object.create(null)),d=l[i]||(l[i]=Bn(r,i));let c;a in d.icons?c=t.loaded:i===""||d.missing.has(a)?c=t.missing:c=t.pending;const p={provider:r,prefix:i,name:a};c.push(p)}),t}function Fc(e,t){e.forEach(n=>{const s=n.loaderCallbacks;s&&(n.loaderCallbacks=s.filter(o=>o.id!==t))})}function Kp(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const s=e.provider,o=e.prefix;t.forEach(r=>{const i=r.icons,a=i.pending.length;i.pending=i.pending.filter(l=>{if(l.prefix!==o)return!0;const d=l.name;if(e.icons[d])i.loaded.push({provider:s,prefix:o,name:d});else if(e.missing.has(d))i.missing.push({provider:s,prefix:o,name:d});else return n=!0,!0;return!1}),i.pending.length!==a&&(n||Fc([e],r.id),r.callback(i.loaded.slice(0),i.missing.slice(0),i.pending.slice(0),r.abort))})}))}let Qp=0;function Gp(e,t,n){const s=Qp++,o=Fc.bind(null,n,s);if(!t.pending.length)return o;const r={id:s,icons:t,callback:e,abort:o};return n.forEach(i=>{(i.loaderCallbacks||(i.loaderCallbacks=[])).push(r)}),o}function Yp(e,t=!0,n=!1){const s=[];return e.forEach(o=>{const r=typeof o=="string"?Do(o,t,n):o;r&&s.push(r)}),s}var Jp={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function Xp(e,t,n,s){const o=e.resources.length,r=e.random?Math.floor(Math.random()*o):e.index;let i;if(e.random){let x=e.resources.slice(0);for(i=[];x.length>1;){const _=Math.floor(Math.random()*x.length);i.push(x[_]),x=x.slice(0,_).concat(x.slice(_+1))}i=i.concat(x)}else i=e.resources.slice(r).concat(e.resources.slice(0,r));const a=Date.now();let l="pending",d=0,c,p=null,h=[],g=[];typeof s=="function"&&g.push(s);function b(){p&&(clearTimeout(p),p=null)}function k(){l==="pending"&&(l="aborted"),b(),h.forEach(x=>{x.status==="pending"&&(x.status="aborted")}),h=[]}function v(x,_){_&&(g=[]),typeof x=="function"&&g.push(x)}function R(){return{startTime:a,payload:t,status:l,queriesSent:d,queriesPending:h.length,subscribe:v,abort:k}}function D(){l="failed",g.forEach(x=>{x(void 0,c)})}function C(){h.forEach(x=>{x.status==="pending"&&(x.status="aborted")}),h=[]}function P(x,_,E){const j=_!=="success";switch(h=h.filter(M=>M!==x),l){case"pending":break;case"failed":if(j||!e.dataAfterTimeout)return;break;default:return}if(_==="abort"){c=E,D();return}if(j){c=E,h.length||(i.length?F():D());return}if(b(),C(),!e.random){const M=e.resources.indexOf(x.resource);M!==-1&&M!==e.index&&(e.index=M)}l="completed",g.forEach(M=>{M(E)})}function F(){if(l!=="pending")return;b();const x=i.shift();if(x===void 0){if(h.length){p=setTimeout(()=>{b(),l==="pending"&&(C(),D())},e.timeout);return}D();return}const _={status:"pending",resource:x,callback:(E,j)=>{P(_,E,j)}};h.push(_),d++,p=setTimeout(F,e.rotate),n(x,t,_.callback)}return setTimeout(F),R}function Mc(e){const t={...Jp,...e};let n=[];function s(){n=n.filter(a=>a().status==="pending")}function o(a,l,d){const c=Xp(t,a,l,(p,h)=>{s(),d&&d(p,h)});return n.push(c),c}function r(a){return n.find(l=>a(l))||null}return{query:o,find:r,setIndex:a=>{t.index=a},getIndex:()=>t.index,cleanup:s}}function ka(){}const sr=Object.create(null);function Zp(e){if(!sr[e]){const t=di(e);if(!t)return;const n=Mc(t),s={config:t,redundancy:n};sr[e]=s}return sr[e]}function eh(e,t,n){let s,o;if(typeof e=="string"){const r=Pr(e);if(!r)return n(void 0,424),ka;o=r.send;const i=Zp(e);i&&(s=i.redundancy)}else{const r=ci(e);if(r){s=Mc(r);const i=e.resources?e.resources[0]:"",a=Pr(i);a&&(o=a.send)}}return!s||!o?(n(void 0,424),ka):s.query(t,o,n)().abort}function Sa(){}function th(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,Kp(e)}))}function nh(e){const t=[],n=[];return e.forEach(s=>{(s.match(Pc)?t:n).push(s)}),{valid:t,invalid:n}}function ns(e,t,n){function s(){const o=e.pendingIcons;t.forEach(r=>{o&&o.delete(r),e.icons[r]||e.missing.add(r)})}if(n&&typeof n=="object")try{if(!Ic(e,n).length){s();return}}catch(o){console.error(o)}s(),th(e)}function Ea(e,t){e instanceof Promise?e.then(n=>{t(n)}).catch(()=>{t(null)}):t(e)}function sh(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:s}=e,o=e.iconsToLoad;if(delete e.iconsToLoad,!o||!o.length)return;const r=e.loadIcon;if(e.loadIcons&&(o.length>1||!r)){Ea(e.loadIcons(o,s,n),c=>{ns(e,o,c)});return}if(r){o.forEach(c=>{const p=r(c,s,n);Ea(p,h=>{const g=h?{prefix:s,icons:{[c]:h}}:null;ns(e,[c],g)})});return}const{valid:i,invalid:a}=nh(o);if(a.length&&ns(e,a,null),!i.length)return;const l=s.match(Pc)?Pr(n):null;if(!l){ns(e,i,null);return}l.prepare(n,s,i).forEach(c=>{eh(n,c,p=>{ns(e,c.icons,p)})})}))}const oh=(e,t)=>{const n=Yp(e,!0,$c()),s=zp(n);if(!s.pending.length){let l=!0;return t&&setTimeout(()=>{l&&t(s.loaded,s.missing,s.pending,Sa)}),()=>{l=!1}}const o=Object.create(null),r=[];let i,a;return s.pending.forEach(l=>{const{provider:d,prefix:c}=l;if(c===a&&d===i)return;i=d,a=c,r.push(Bn(d,c));const p=o[d]||(o[d]=Object.create(null));p[c]||(p[c]=[])}),s.pending.forEach(l=>{const{provider:d,prefix:c,name:p}=l,h=Bn(d,c),g=h.pendingIcons||(h.pendingIcons=new Set);g.has(p)||(g.add(p),o[d][c].push(p))}),r.forEach(l=>{const d=o[l.provider][l.prefix];d.length&&sh(l,d)}),t?Gp(t,s,r):Sa};function rh(e,t){const n={...e};for(const s in t){const o=t[s],r=typeof o;s in Lc?(o===null||o&&(r==="string"||r==="number"))&&(n[s]=o):r===typeof n[s]&&(n[s]=s==="rotate"?o%4:o)}return n}const ih=/[\s,]+/;function ah(e,t){t.split(ih).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function lh(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function s(o){for(;o<0;)o+=4;return o%4}if(n===""){const o=parseInt(e);return isNaN(o)?0:s(o)}else if(n!==e){let o=0;switch(n){case"%":o=25;break;case"deg":o=90}if(o){let r=parseFloat(e.slice(0,e.length-n.length));return isNaN(r)?0:(r=r/o,r%1===0?s(r):0)}}return t}function ch(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const s in t)n+=" "+s+'="'+t[s]+'"';return'"+e+""}function uh(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function dh(e){return"data:image/svg+xml,"+uh(e)}function fh(e){return'url("'+dh(e)+'")'}const Aa={...Uc,inline:!1},ph={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},hh={display:"inline-block"},Or={backgroundColor:"currentColor"},Bc={backgroundColor:"transparent"},Ca={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Ra={webkitMask:Or,mask:Or,background:Bc};for(const e in Ra){const t=Ra[e];for(const n in Ca)t[e+n]=Ca[n]}const to={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";to[e+"-flip"]=t,to[e.slice(0,1)+"-flip"]=t,to[e+"Flip"]=t});function Ta(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const Pa=(e,t)=>{const n=rh(Aa,t),s={...ph},o=t.mode||"svg",r={},i=t.style,a=typeof i=="object"&&!(i instanceof Array)?i:{};for(let k in t){const v=t[k];if(v!==void 0)switch(k){case"icon":case"style":case"onLoad":case"mode":case"ssr":break;case"inline":case"hFlip":case"vFlip":n[k]=v===!0||v==="true"||v===1;break;case"flip":typeof v=="string"&&ah(n,v);break;case"color":r.color=v;break;case"rotate":typeof v=="string"?n[k]=lh(v):typeof v=="number"&&(n[k]=v);break;case"ariaHidden":case"aria-hidden":v!==!0&&v!=="true"&&delete s["aria-hidden"];break;default:{const R=to[k];R?(v===!0||v==="true"||v===1)&&(n[R]=!0):Aa[k]===void 0&&(s[k]=v)}}}const l=Dp(e,n),d=l.attributes;if(n.inline&&(r.verticalAlign="-0.125em"),o==="svg"){s.style={...r,...a},Object.assign(s,d);let k=0,v=t.id;return typeof v=="string"&&(v=v.replace(/-/g,"_")),s.innerHTML=Lp(l.body,v?()=>v+"ID"+k++:"iconifyVue"),xs("svg",s)}const{body:c,width:p,height:h}=e,g=o==="mask"||(o==="bg"?!1:c.indexOf("currentColor")!==-1),b=ch(c,{...d,width:p+"",height:h+""});return s.style={...r,"--svg":fh(b),width:Ta(d.width),height:Ta(d.height),...hh,...g?Or:Bc,...a},xs("span",s)};$c(!0);Up("",Wp);if(typeof document<"u"&&typeof window<"u"){const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(s=>{try{(typeof s!="object"||s===null||s instanceof Array||typeof s.icons!="object"||typeof s.prefix!="string"||!Ep(s))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const s="IconifyProviders["+n+"] is invalid.";try{const o=t[n];if(typeof o!="object"||!o||o.resources===void 0)continue;Fp(n,o)||console.error(s)}catch{console.error(s)}}}}const mh={...No,body:""},Y=si({inheritAttrs:!1,data(){return{_name:"",_loadingIcon:null,iconMounted:!1,counter:0}},mounted(){this.iconMounted=!0},unmounted(){this.abortLoading()},methods:{abortLoading(){this._loadingIcon&&(this._loadingIcon.abort(),this._loadingIcon=null)},getIcon(e,t,n){if(typeof e=="object"&&e!==null&&typeof e.body=="string")return this._name="",this.abortLoading(),{data:e};let s;if(typeof e!="string"||(s=Do(e,!1,!0))===null)return this.abortLoading(),null;let o=kp(s);if(!o)return(!this._loadingIcon||this._loadingIcon.name!==e)&&(this.abortLoading(),this._name="",o!==null&&(this._loadingIcon={name:e,abort:oh([s],()=>{this.counter++})})),null;if(this.abortLoading(),this._name!==e&&(this._name=e,t&&t(e)),n){o=Object.assign({},o);const i=n(o.body,s.name,s.prefix,s.provider);typeof i=="string"&&(o.body=i)}const r=["iconify"];return s.prefix!==""&&r.push("iconify--"+s.prefix),s.provider!==""&&r.push("iconify--"+s.provider),{data:o,classes:r}}},render(){this.counter;const e=this.$attrs,t=this.iconMounted||e.ssr?this.getIcon(e.icon,e.onLoad,e.customise):null;if(!t)return Pa(mh,e);let n=e;return t.classes&&(n={...e,class:(typeof e.class=="string"?e.class+" ":"")+t.classes.join(" ")}),Pa({...No,...t.data},n)}});function Hc(e,t){return function(){return e.apply(t,arguments)}}const{toString:gh}=Object.prototype,{getPrototypeOf:fi}=Object,{iterator:Io,toStringTag:jc}=Symbol,$o=(e=>t=>{const n=gh.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Et=e=>(e=e.toLowerCase(),t=>$o(t)===e),Lo=e=>t=>typeof t===e,{isArray:Kn}=Array,Hn=Lo("undefined");function Ps(e){return e!==null&&!Hn(e)&&e.constructor!==null&&!Hn(e.constructor)&&nt(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const qc=Et("ArrayBuffer");function yh(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&qc(e.buffer),t}const bh=Lo("string"),nt=Lo("function"),Vc=Lo("number"),Os=e=>e!==null&&typeof e=="object",vh=e=>e===!0||e===!1,no=e=>{if($o(e)!=="object")return!1;const t=fi(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(jc in e)&&!(Io in e)},_h=e=>{if(!Os(e)||Ps(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},xh=Et("Date"),wh=Et("File"),kh=Et("Blob"),Sh=Et("FileList"),Eh=e=>Os(e)&&nt(e.pipe),Ah=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||nt(e.append)&&((t=$o(e))==="formdata"||t==="object"&&nt(e.toString)&&e.toString()==="[object FormData]"))},Ch=Et("URLSearchParams"),[Rh,Th,Ph,Oh]=["ReadableStream","Request","Response","Headers"].map(Et),Dh=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ds(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let s,o;if(typeof e!="object"&&(e=[e]),Kn(e))for(s=0,o=e.length;s0;)if(o=n[s],t===o.toLowerCase())return o;return null}const _n=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,zc=e=>!Hn(e)&&e!==_n;function Dr(){const{caseless:e,skipUndefined:t}=zc(this)&&this||{},n={},s=(o,r)=>{if(r==="__proto__"||r==="constructor"||r==="prototype")return;const i=e&&Wc(n,r)||r;no(n[i])&&no(o)?n[i]=Dr(n[i],o):no(o)?n[i]=Dr({},o):Kn(o)?n[i]=o.slice():(!t||!Hn(o))&&(n[i]=o)};for(let o=0,r=arguments.length;o(Ds(t,(o,r)=>{n&&nt(o)?Object.defineProperty(e,r,{value:Hc(o,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:s}),e),Ih=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),$h=(e,t,n,s)=>{e.prototype=Object.create(t.prototype,s),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},Lh=(e,t,n,s)=>{let o,r,i;const a={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),r=o.length;r-- >0;)i=o[r],(!s||s(i,e,t))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&fi(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Uh=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const s=e.indexOf(t,n);return s!==-1&&s===n},Fh=e=>{if(!e)return null;if(Kn(e))return e;let t=e.length;if(!Vc(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Mh=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&fi(Uint8Array)),Bh=(e,t)=>{const s=(e&&e[Io]).call(e);let o;for(;(o=s.next())&&!o.done;){const r=o.value;t.call(e,r[0],r[1])}},Hh=(e,t)=>{let n;const s=[];for(;(n=e.exec(t))!==null;)s.push(n);return s},jh=Et("HTMLFormElement"),qh=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,s,o){return s.toUpperCase()+o}),Oa=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Vh=Et("RegExp"),Kc=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),s={};Ds(n,(o,r)=>{let i;(i=t(o,r,e))!==!1&&(s[r]=i||o)}),Object.defineProperties(e,s)},Wh=e=>{Kc(e,(t,n)=>{if(nt(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const s=e[n];if(nt(s)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},zh=(e,t)=>{const n={},s=o=>{o.forEach(r=>{n[r]=!0})};return Kn(e)?s(e):s(String(e).split(t)),n},Kh=()=>{},Qh=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Gh(e){return!!(e&&nt(e.append)&&e[jc]==="FormData"&&e[Io])}const Yh=e=>{const t=new Array(10),n=(s,o)=>{if(Os(s)){if(t.indexOf(s)>=0)return;if(Ps(s))return s;if(!("toJSON"in s)){t[o]=s;const r=Kn(s)?[]:{};return Ds(s,(i,a)=>{const l=n(i,o+1);!Hn(l)&&(r[a]=l)}),t[o]=void 0,r}}return s};return n(e,0)},Jh=Et("AsyncFunction"),Xh=e=>e&&(Os(e)||nt(e))&&nt(e.then)&&nt(e.catch),Qc=((e,t)=>e?setImmediate:t?((n,s)=>(_n.addEventListener("message",({source:o,data:r})=>{o===_n&&r===n&&s.length&&s.shift()()},!1),o=>{s.push(o),_n.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",nt(_n.postMessage)),Zh=typeof queueMicrotask<"u"?queueMicrotask.bind(_n):typeof process<"u"&&process.nextTick||Qc,em=e=>e!=null&&nt(e[Io]),T={isArray:Kn,isArrayBuffer:qc,isBuffer:Ps,isFormData:Ah,isArrayBufferView:yh,isString:bh,isNumber:Vc,isBoolean:vh,isObject:Os,isPlainObject:no,isEmptyObject:_h,isReadableStream:Rh,isRequest:Th,isResponse:Ph,isHeaders:Oh,isUndefined:Hn,isDate:xh,isFile:wh,isBlob:kh,isRegExp:Vh,isFunction:nt,isStream:Eh,isURLSearchParams:Ch,isTypedArray:Mh,isFileList:Sh,forEach:Ds,merge:Dr,extend:Nh,trim:Dh,stripBOM:Ih,inherits:$h,toFlatObject:Lh,kindOf:$o,kindOfTest:Et,endsWith:Uh,toArray:Fh,forEachEntry:Bh,matchAll:Hh,isHTMLForm:jh,hasOwnProperty:Oa,hasOwnProp:Oa,reduceDescriptors:Kc,freezeMethods:Wh,toObjectSet:zh,toCamelCase:qh,noop:Kh,toFiniteNumber:Qh,findKey:Wc,global:_n,isContextDefined:zc,isSpecCompliantForm:Gh,toJSONObject:Yh,isAsyncFn:Jh,isThenable:Xh,setImmediate:Qc,asap:Zh,isIterable:em};let ne=class Gc extends Error{static from(t,n,s,o,r,i){const a=new Gc(t.message,n||t.code,s,o,r);return a.cause=t,a.name=t.name,i&&Object.assign(a,i),a}constructor(t,n,s,o,r){super(t),this.name="AxiosError",this.isAxiosError=!0,n&&(this.code=n),s&&(this.config=s),o&&(this.request=o),r&&(this.response=r,this.status=r.status)}toJSON(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:T.toJSONObject(this.config),code:this.code,status:this.status}}};ne.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";ne.ERR_BAD_OPTION="ERR_BAD_OPTION";ne.ECONNABORTED="ECONNABORTED";ne.ETIMEDOUT="ETIMEDOUT";ne.ERR_NETWORK="ERR_NETWORK";ne.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";ne.ERR_DEPRECATED="ERR_DEPRECATED";ne.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";ne.ERR_BAD_REQUEST="ERR_BAD_REQUEST";ne.ERR_CANCELED="ERR_CANCELED";ne.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";ne.ERR_INVALID_URL="ERR_INVALID_URL";const tm=null;function Nr(e){return T.isPlainObject(e)||T.isArray(e)}function Yc(e){return T.endsWith(e,"[]")?e.slice(0,-2):e}function Da(e,t,n){return e?e.concat(t).map(function(o,r){return o=Yc(o),!n&&r?"["+o+"]":o}).join(n?".":""):t}function nm(e){return T.isArray(e)&&!e.some(Nr)}const sm=T.toFlatObject(T,{},null,function(t){return/^is[A-Z]/.test(t)});function Uo(e,t,n){if(!T.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=T.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(k,v){return!T.isUndefined(v[k])});const s=n.metaTokens,o=n.visitor||c,r=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&T.isSpecCompliantForm(t);if(!T.isFunction(o))throw new TypeError("visitor must be a function");function d(b){if(b===null)return"";if(T.isDate(b))return b.toISOString();if(T.isBoolean(b))return b.toString();if(!l&&T.isBlob(b))throw new ne("Blob is not supported. Use a Buffer instead.");return T.isArrayBuffer(b)||T.isTypedArray(b)?l&&typeof Blob=="function"?new Blob([b]):Buffer.from(b):b}function c(b,k,v){let R=b;if(b&&!v&&typeof b=="object"){if(T.endsWith(k,"{}"))k=s?k:k.slice(0,-2),b=JSON.stringify(b);else if(T.isArray(b)&&nm(b)||(T.isFileList(b)||T.endsWith(k,"[]"))&&(R=T.toArray(b)))return k=Yc(k),R.forEach(function(C,P){!(T.isUndefined(C)||C===null)&&t.append(i===!0?Da([k],P,r):i===null?k:k+"[]",d(C))}),!1}return Nr(b)?!0:(t.append(Da(v,k,r),d(b)),!1)}const p=[],h=Object.assign(sm,{defaultVisitor:c,convertValue:d,isVisitable:Nr});function g(b,k){if(!T.isUndefined(b)){if(p.indexOf(b)!==-1)throw Error("Circular reference detected in "+k.join("."));p.push(b),T.forEach(b,function(R,D){(!(T.isUndefined(R)||R===null)&&o.call(t,R,T.isString(D)?D.trim():D,k,h))===!0&&g(R,k?k.concat(D):[D])}),p.pop()}}if(!T.isObject(e))throw new TypeError("data must be an object");return g(e),t}function Na(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(s){return t[s]})}function pi(e,t){this._pairs=[],e&&Uo(e,this,t)}const Jc=pi.prototype;Jc.append=function(t,n){this._pairs.push([t,n])};Jc.toString=function(t){const n=t?function(s){return t.call(this,s,Na)}:Na;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function om(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Xc(e,t,n){if(!t)return e;const s=n&&n.encode||om,o=T.isFunction(n)?{serialize:n}:n,r=o&&o.serialize;let i;if(r?i=r(t,o):i=T.isURLSearchParams(t)?t.toString():new pi(t,o).toString(s),i){const a=e.indexOf("#");a!==-1&&(e=e.slice(0,a)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class Ia{constructor(){this.handlers=[]}use(t,n,s){return this.handlers.push({fulfilled:t,rejected:n,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){T.forEach(this.handlers,function(s){s!==null&&t(s)})}}const hi={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},rm=typeof URLSearchParams<"u"?URLSearchParams:pi,im=typeof FormData<"u"?FormData:null,am=typeof Blob<"u"?Blob:null,lm={isBrowser:!0,classes:{URLSearchParams:rm,FormData:im,Blob:am},protocols:["http","https","file","blob","url","data"]},mi=typeof window<"u"&&typeof document<"u",Ir=typeof navigator=="object"&&navigator||void 0,cm=mi&&(!Ir||["ReactNative","NativeScript","NS"].indexOf(Ir.product)<0),um=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",dm=mi&&window.location.href||"http://localhost",fm=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:mi,hasStandardBrowserEnv:cm,hasStandardBrowserWebWorkerEnv:um,navigator:Ir,origin:dm},Symbol.toStringTag,{value:"Module"})),je={...fm,...lm};function pm(e,t){return Uo(e,new je.classes.URLSearchParams,{visitor:function(n,s,o,r){return je.isNode&&T.isBuffer(n)?(this.append(s,n.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...t})}function hm(e){return T.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function mm(e){const t={},n=Object.keys(e);let s;const o=n.length;let r;for(s=0;s=n.length;return i=!i&&T.isArray(o)?o.length:i,l?(T.hasOwnProp(o,i)?o[i]=[o[i],s]:o[i]=s,!a):((!o[i]||!T.isObject(o[i]))&&(o[i]=[]),t(n,s,o[i],r)&&T.isArray(o[i])&&(o[i]=mm(o[i])),!a)}if(T.isFormData(e)&&T.isFunction(e.entries)){const n={};return T.forEachEntry(e,(s,o)=>{t(hm(s),o,n,0)}),n}return null}function gm(e,t,n){if(T.isString(e))try{return(t||JSON.parse)(e),T.trim(e)}catch(s){if(s.name!=="SyntaxError")throw s}return(n||JSON.stringify)(e)}const Ns={transitional:hi,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const s=n.getContentType()||"",o=s.indexOf("application/json")>-1,r=T.isObject(t);if(r&&T.isHTMLForm(t)&&(t=new FormData(t)),T.isFormData(t))return o?JSON.stringify(Zc(t)):t;if(T.isArrayBuffer(t)||T.isBuffer(t)||T.isStream(t)||T.isFile(t)||T.isBlob(t)||T.isReadableStream(t))return t;if(T.isArrayBufferView(t))return t.buffer;if(T.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(r){if(s.indexOf("application/x-www-form-urlencoded")>-1)return pm(t,this.formSerializer).toString();if((a=T.isFileList(t))||s.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Uo(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return r||o?(n.setContentType("application/json",!1),gm(t)):t}],transformResponse:[function(t){const n=this.transitional||Ns.transitional,s=n&&n.forcedJSONParsing,o=this.responseType==="json";if(T.isResponse(t)||T.isReadableStream(t))return t;if(t&&T.isString(t)&&(s&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t,this.parseReviver)}catch(a){if(i)throw a.name==="SyntaxError"?ne.from(a,ne.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:je.classes.FormData,Blob:je.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};T.forEach(["delete","get","head","post","put","patch"],e=>{Ns.headers[e]={}});const ym=T.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),bm=e=>{const t={};let n,s,o;return e&&e.split(` +`).forEach(function(i){o=i.indexOf(":"),n=i.substring(0,o).trim().toLowerCase(),s=i.substring(o+1).trim(),!(!n||t[n]&&ym[n])&&(n==="set-cookie"?t[n]?t[n].push(s):t[n]=[s]:t[n]=t[n]?t[n]+", "+s:s)}),t},$a=Symbol("internals");function ss(e){return e&&String(e).trim().toLowerCase()}function so(e){return e===!1||e==null?e:T.isArray(e)?e.map(so):String(e)}function vm(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=n.exec(e);)t[s[1]]=s[2];return t}const _m=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function or(e,t,n,s,o){if(T.isFunction(s))return s.call(this,t,n);if(o&&(t=n),!!T.isString(t)){if(T.isString(s))return t.indexOf(s)!==-1;if(T.isRegExp(s))return s.test(t)}}function xm(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,s)=>n.toUpperCase()+s)}function wm(e,t){const n=T.toCamelCase(" "+t);["get","set","has"].forEach(s=>{Object.defineProperty(e,s+n,{value:function(o,r,i){return this[s].call(this,t,o,r,i)},configurable:!0})})}let st=class{constructor(t){t&&this.set(t)}set(t,n,s){const o=this;function r(a,l,d){const c=ss(l);if(!c)throw new Error("header name must be a non-empty string");const p=T.findKey(o,c);(!p||o[p]===void 0||d===!0||d===void 0&&o[p]!==!1)&&(o[p||l]=so(a))}const i=(a,l)=>T.forEach(a,(d,c)=>r(d,c,l));if(T.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(T.isString(t)&&(t=t.trim())&&!_m(t))i(bm(t),n);else if(T.isObject(t)&&T.isIterable(t)){let a={},l,d;for(const c of t){if(!T.isArray(c))throw TypeError("Object iterator must return a key-value pair");a[d=c[0]]=(l=a[d])?T.isArray(l)?[...l,c[1]]:[l,c[1]]:c[1]}i(a,n)}else t!=null&&r(n,t,s);return this}get(t,n){if(t=ss(t),t){const s=T.findKey(this,t);if(s){const o=this[s];if(!n)return o;if(n===!0)return vm(o);if(T.isFunction(n))return n.call(this,o,s);if(T.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=ss(t),t){const s=T.findKey(this,t);return!!(s&&this[s]!==void 0&&(!n||or(this,this[s],s,n)))}return!1}delete(t,n){const s=this;let o=!1;function r(i){if(i=ss(i),i){const a=T.findKey(s,i);a&&(!n||or(s,s[a],a,n))&&(delete s[a],o=!0)}}return T.isArray(t)?t.forEach(r):r(t),o}clear(t){const n=Object.keys(this);let s=n.length,o=!1;for(;s--;){const r=n[s];(!t||or(this,this[r],r,t,!0))&&(delete this[r],o=!0)}return o}normalize(t){const n=this,s={};return T.forEach(this,(o,r)=>{const i=T.findKey(s,r);if(i){n[i]=so(o),delete n[r];return}const a=t?xm(r):String(r).trim();a!==r&&delete n[r],n[a]=so(o),s[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return T.forEach(this,(s,o)=>{s!=null&&s!==!1&&(n[o]=t&&T.isArray(s)?s.join(", "):s)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const s=new this(t);return n.forEach(o=>s.set(o)),s}static accessor(t){const s=(this[$a]=this[$a]={accessors:{}}).accessors,o=this.prototype;function r(i){const a=ss(i);s[a]||(wm(o,i),s[a]=!0)}return T.isArray(t)?t.forEach(r):r(t),this}};st.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);T.reduceDescriptors(st.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(s){this[n]=s}}});T.freezeMethods(st);function rr(e,t){const n=this||Ns,s=t||n,o=st.from(s.headers);let r=s.data;return T.forEach(e,function(a){r=a.call(n,r,o.normalize(),t?t.status:void 0)}),o.normalize(),r}function eu(e){return!!(e&&e.__CANCEL__)}let Is=class extends ne{constructor(t,n,s){super(t??"canceled",ne.ERR_CANCELED,n,s),this.name="CanceledError",this.__CANCEL__=!0}};function tu(e,t,n){const s=n.config.validateStatus;!n.status||!s||s(n.status)?e(n):t(new ne("Request failed with status code "+n.status,[ne.ERR_BAD_REQUEST,ne.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function km(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Sm(e,t){e=e||10;const n=new Array(e),s=new Array(e);let o=0,r=0,i;return t=t!==void 0?t:1e3,function(l){const d=Date.now(),c=s[r];i||(i=d),n[o]=l,s[o]=d;let p=r,h=0;for(;p!==o;)h+=n[p++],p=p%e;if(o=(o+1)%e,o===r&&(r=(r+1)%e),d-i{n=c,o=null,r&&(clearTimeout(r),r=null),e(...d)};return[(...d)=>{const c=Date.now(),p=c-n;p>=s?i(d,c):(o=d,r||(r=setTimeout(()=>{r=null,i(o)},s-p)))},()=>o&&i(o)]}const yo=(e,t,n=3)=>{let s=0;const o=Sm(50,250);return Em(r=>{const i=r.loaded,a=r.lengthComputable?r.total:void 0,l=i-s,d=o(l),c=i<=a;s=i;const p={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:d||void 0,estimated:d&&a&&c?(a-i)/d:void 0,event:r,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(p)},n)},La=(e,t)=>{const n=e!=null;return[s=>t[0]({lengthComputable:n,total:e,loaded:s}),t[1]]},Ua=e=>(...t)=>T.asap(()=>e(...t)),Am=je.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,je.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(je.origin),je.navigator&&/(msie|trident)/i.test(je.navigator.userAgent)):()=>!0,Cm=je.hasStandardBrowserEnv?{write(e,t,n,s,o,r,i){if(typeof document>"u")return;const a=[`${e}=${encodeURIComponent(t)}`];T.isNumber(n)&&a.push(`expires=${new Date(n).toUTCString()}`),T.isString(s)&&a.push(`path=${s}`),T.isString(o)&&a.push(`domain=${o}`),r===!0&&a.push("secure"),T.isString(i)&&a.push(`SameSite=${i}`),document.cookie=a.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function Rm(e){return typeof e!="string"?!1:/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Tm(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function nu(e,t,n){let s=!Rm(t);return e&&(s||n==!1)?Tm(e,t):t}const Fa=e=>e instanceof st?{...e}:e;function En(e,t){t=t||{};const n={};function s(d,c,p,h){return T.isPlainObject(d)&&T.isPlainObject(c)?T.merge.call({caseless:h},d,c):T.isPlainObject(c)?T.merge({},c):T.isArray(c)?c.slice():c}function o(d,c,p,h){if(T.isUndefined(c)){if(!T.isUndefined(d))return s(void 0,d,p,h)}else return s(d,c,p,h)}function r(d,c){if(!T.isUndefined(c))return s(void 0,c)}function i(d,c){if(T.isUndefined(c)){if(!T.isUndefined(d))return s(void 0,d)}else return s(void 0,c)}function a(d,c,p){if(p in t)return s(d,c);if(p in e)return s(void 0,d)}const l={url:r,method:r,data:r,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a,headers:(d,c,p)=>o(Fa(d),Fa(c),p,!0)};return T.forEach(Object.keys({...e,...t}),function(c){if(c==="__proto__"||c==="constructor"||c==="prototype")return;const p=T.hasOwnProp(l,c)?l[c]:o,h=p(e[c],t[c],c);T.isUndefined(h)&&p!==a||(n[c]=h)}),n}const su=e=>{const t=En({},e);let{data:n,withXSRFToken:s,xsrfHeaderName:o,xsrfCookieName:r,headers:i,auth:a}=t;if(t.headers=i=st.from(i),t.url=Xc(nu(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):""))),T.isFormData(n)){if(je.hasStandardBrowserEnv||je.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if(T.isFunction(n.getHeaders)){const l=n.getHeaders(),d=["content-type","content-length"];Object.entries(l).forEach(([c,p])=>{d.includes(c.toLowerCase())&&i.set(c,p)})}}if(je.hasStandardBrowserEnv&&(s&&T.isFunction(s)&&(s=s(t)),s||s!==!1&&Am(t.url))){const l=o&&r&&Cm.read(r);l&&i.set(o,l)}return t},Pm=typeof XMLHttpRequest<"u",Om=Pm&&function(e){return new Promise(function(n,s){const o=su(e);let r=o.data;const i=st.from(o.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:d}=o,c,p,h,g,b;function k(){g&&g(),b&&b(),o.cancelToken&&o.cancelToken.unsubscribe(c),o.signal&&o.signal.removeEventListener("abort",c)}let v=new XMLHttpRequest;v.open(o.method.toUpperCase(),o.url,!0),v.timeout=o.timeout;function R(){if(!v)return;const C=st.from("getAllResponseHeaders"in v&&v.getAllResponseHeaders()),F={data:!a||a==="text"||a==="json"?v.responseText:v.response,status:v.status,statusText:v.statusText,headers:C,config:e,request:v};tu(function(_){n(_),k()},function(_){s(_),k()},F),v=null}"onloadend"in v?v.onloadend=R:v.onreadystatechange=function(){!v||v.readyState!==4||v.status===0&&!(v.responseURL&&v.responseURL.indexOf("file:")===0)||setTimeout(R)},v.onabort=function(){v&&(s(new ne("Request aborted",ne.ECONNABORTED,e,v)),v=null)},v.onerror=function(P){const F=P&&P.message?P.message:"Network Error",x=new ne(F,ne.ERR_NETWORK,e,v);x.event=P||null,s(x),v=null},v.ontimeout=function(){let P=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const F=o.transitional||hi;o.timeoutErrorMessage&&(P=o.timeoutErrorMessage),s(new ne(P,F.clarifyTimeoutError?ne.ETIMEDOUT:ne.ECONNABORTED,e,v)),v=null},r===void 0&&i.setContentType(null),"setRequestHeader"in v&&T.forEach(i.toJSON(),function(P,F){v.setRequestHeader(F,P)}),T.isUndefined(o.withCredentials)||(v.withCredentials=!!o.withCredentials),a&&a!=="json"&&(v.responseType=o.responseType),d&&([h,b]=yo(d,!0),v.addEventListener("progress",h)),l&&v.upload&&([p,g]=yo(l),v.upload.addEventListener("progress",p),v.upload.addEventListener("loadend",g)),(o.cancelToken||o.signal)&&(c=C=>{v&&(s(!C||C.type?new Is(null,e,v):C),v.abort(),v=null)},o.cancelToken&&o.cancelToken.subscribe(c),o.signal&&(o.signal.aborted?c():o.signal.addEventListener("abort",c)));const D=km(o.url);if(D&&je.protocols.indexOf(D)===-1){s(new ne("Unsupported protocol "+D+":",ne.ERR_BAD_REQUEST,e));return}v.send(r||null)})},Dm=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let s=new AbortController,o;const r=function(d){if(!o){o=!0,a();const c=d instanceof Error?d:this.reason;s.abort(c instanceof ne?c:new Is(c instanceof Error?c.message:c))}};let i=t&&setTimeout(()=>{i=null,r(new ne(`timeout of ${t}ms exceeded`,ne.ETIMEDOUT))},t);const a=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(d=>{d.unsubscribe?d.unsubscribe(r):d.removeEventListener("abort",r)}),e=null)};e.forEach(d=>d.addEventListener("abort",r));const{signal:l}=s;return l.unsubscribe=()=>T.asap(a),l}},Nm=function*(e,t){let n=e.byteLength;if(n{const o=Im(e,t);let r=0,i,a=l=>{i||(i=!0,s&&s(l))};return new ReadableStream({async pull(l){try{const{done:d,value:c}=await o.next();if(d){a(),l.close();return}let p=c.byteLength;if(n){let h=r+=p;n(h)}l.enqueue(new Uint8Array(c))}catch(d){throw a(d),d}},cancel(l){return a(l),o.return()}},{highWaterMark:2})},Ba=64*1024,{isFunction:qs}=T,Lm=(({Request:e,Response:t})=>({Request:e,Response:t}))(T.global),{ReadableStream:Ha,TextEncoder:ja}=T.global,qa=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Um=e=>{e=T.merge.call({skipUndefined:!0},Lm,e);const{fetch:t,Request:n,Response:s}=e,o=t?qs(t):typeof fetch=="function",r=qs(n),i=qs(s);if(!o)return!1;const a=o&&qs(Ha),l=o&&(typeof ja=="function"?(b=>k=>b.encode(k))(new ja):async b=>new Uint8Array(await new n(b).arrayBuffer())),d=r&&a&&qa(()=>{let b=!1;const k=new n(je.origin,{body:new Ha,method:"POST",get duplex(){return b=!0,"half"}}).headers.has("Content-Type");return b&&!k}),c=i&&a&&qa(()=>T.isReadableStream(new s("").body)),p={stream:c&&(b=>b.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(b=>{!p[b]&&(p[b]=(k,v)=>{let R=k&&k[b];if(R)return R.call(k);throw new ne(`Response type '${b}' is not supported`,ne.ERR_NOT_SUPPORT,v)})});const h=async b=>{if(b==null)return 0;if(T.isBlob(b))return b.size;if(T.isSpecCompliantForm(b))return(await new n(je.origin,{method:"POST",body:b}).arrayBuffer()).byteLength;if(T.isArrayBufferView(b)||T.isArrayBuffer(b))return b.byteLength;if(T.isURLSearchParams(b)&&(b=b+""),T.isString(b))return(await l(b)).byteLength},g=async(b,k)=>{const v=T.toFiniteNumber(b.getContentLength());return v??h(k)};return async b=>{let{url:k,method:v,data:R,signal:D,cancelToken:C,timeout:P,onDownloadProgress:F,onUploadProgress:x,responseType:_,headers:E,withCredentials:j="same-origin",fetchOptions:M}=su(b),Q=t||fetch;_=_?(_+"").toLowerCase():"text";let N=Dm([D,C&&C.toAbortSignal()],P),te=null;const le=N&&N.unsubscribe&&(()=>{N.unsubscribe()});let Me;try{if(x&&d&&v!=="get"&&v!=="head"&&(Me=await g(E,R))!==0){let De=new n(k,{method:"POST",body:R,duplex:"half"}),Oe;if(T.isFormData(R)&&(Oe=De.headers.get("content-type"))&&E.setContentType(Oe),De.body){const[Ct,gt]=La(Me,yo(Ua(x)));R=Ma(De.body,Ba,Ct,gt)}}T.isString(j)||(j=j?"include":"omit");const ce=r&&"credentials"in n.prototype,pe={...M,signal:N,method:v.toUpperCase(),headers:E.normalize().toJSON(),body:R,duplex:"half",credentials:ce?j:void 0};te=r&&new n(k,pe);let ae=await(r?Q(te,M):Q(k,pe));const ut=c&&(_==="stream"||_==="response");if(c&&(F||ut&&le)){const De={};["status","statusText","headers"].forEach(Rt=>{De[Rt]=ae[Rt]});const Oe=T.toFiniteNumber(ae.headers.get("content-length")),[Ct,gt]=F&&La(Oe,yo(Ua(F),!0))||[];ae=new s(Ma(ae.body,Ba,Ct,()=>{gt&>(),le&&le()}),De)}_=_||"text";let At=await p[T.findKey(p,_)||"text"](ae,b);return!ut&&le&&le(),await new Promise((De,Oe)=>{tu(De,Oe,{data:At,headers:st.from(ae.headers),status:ae.status,statusText:ae.statusText,config:b,request:te})})}catch(ce){throw le&&le(),ce&&ce.name==="TypeError"&&/Load failed|fetch/i.test(ce.message)?Object.assign(new ne("Network Error",ne.ERR_NETWORK,b,te,ce&&ce.response),{cause:ce.cause||ce}):ne.from(ce,ce&&ce.code,b,te,ce&&ce.response)}}},Fm=new Map,ou=e=>{let t=e&&e.env||{};const{fetch:n,Request:s,Response:o}=t,r=[s,o,n];let i=r.length,a=i,l,d,c=Fm;for(;a--;)l=r[a],d=c.get(l),d===void 0&&c.set(l,d=a?new Map:Um(t)),c=d;return d};ou();const gi={http:tm,xhr:Om,fetch:{get:ou}};T.forEach(gi,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Va=e=>`- ${e}`,Mm=e=>T.isFunction(e)||e===null||e===!1;function Bm(e,t){e=T.isArray(e)?e:[e];const{length:n}=e;let s,o;const r={};for(let i=0;i`adapter ${l} `+(d===!1?"is not supported by the environment":"is not available in the build"));let a=n?i.length>1?`since : `+i.map(Va).join(` -`):" "+Va(i[0]):"as no adapter specified";throw new ne("There is no suitable adapter to dispatch the request "+a,"ERR_NOT_SUPPORT")}return o}const ru={getAdapter:Bm,adapters:gi};function ir(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Is(null,e)}function Wa(e){return ir(e),e.headers=st.from(e.headers),e.data=rr.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),ru.getAdapter(e.adapter||Ns.adapter,e)(e).then(function(s){return ir(e),s.data=rr.call(e,e.transformResponse,s),s.headers=st.from(s.headers),s},function(s){return eu(s)||(ir(e),s&&s.response&&(s.response.data=rr.call(e,e.transformResponse,s.response),s.response.headers=st.from(s.response.headers))),Promise.reject(s)})}const iu="1.13.5",Uo={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Uo[e]=function(s){return typeof s===e||"a"+(t<1?"n ":" ")+e}});const za={};Uo.transitional=function(t,n,s){function o(r,i){return"[Axios v"+iu+"] Transitional option '"+r+"'"+i+(s?". "+s:"")}return(r,i,a)=>{if(t===!1)throw new ne(o(i," has been removed"+(n?" in "+n:"")),ne.ERR_DEPRECATED);return n&&!za[i]&&(za[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(r,i,a):!0}};Uo.spelling=function(t){return(n,s)=>(console.warn(`${s} is likely a misspelling of ${t}`),!0)};function Hm(e,t,n){if(typeof e!="object")throw new ne("options must be an object",ne.ERR_BAD_OPTION_VALUE);const s=Object.keys(e);let o=s.length;for(;o-- >0;){const r=s[o],i=t[r];if(i){const a=e[r],l=a===void 0||i(a,r,e);if(l!==!0)throw new ne("option "+r+" must be "+l,ne.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new ne("Unknown option "+r,ne.ERR_BAD_OPTION)}}const oo={assertOptions:Hm,validators:Uo},pt=oo.validators;let Sn=class{constructor(t){this.defaults=t||{},this.interceptors={request:new Ia,response:new Ia}}async request(t,n){try{return await this._request(t,n)}catch(s){if(s instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;const r=o.stack?o.stack.replace(/^.+\n/,""):"";try{s.stack?r&&!String(s.stack).endsWith(r.replace(/^.+\n.+\n/,""))&&(s.stack+=` -`+r):s.stack=r}catch{}}throw s}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=En(this.defaults,n);const{transitional:s,paramsSerializer:o,headers:r}=n;s!==void 0&&oo.assertOptions(s,{silentJSONParsing:pt.transitional(pt.boolean),forcedJSONParsing:pt.transitional(pt.boolean),clarifyTimeoutError:pt.transitional(pt.boolean),legacyInterceptorReqResOrdering:pt.transitional(pt.boolean)},!1),o!=null&&(T.isFunction(o)?n.paramsSerializer={serialize:o}:oo.assertOptions(o,{encode:pt.function,serialize:pt.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),oo.assertOptions(n,{baseUrl:pt.spelling("baseURL"),withXsrfToken:pt.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=r&&T.merge(r.common,r[n.method]);r&&T.forEach(["delete","get","head","post","put","patch","common"],v=>{delete r[v]}),n.headers=st.concat(i,r);const a=[];let l=!0;this.interceptors.request.forEach(function(k){if(typeof k.runWhen=="function"&&k.runWhen(n)===!1)return;l=l&&k.synchronous;const b=n.transitional||hi;b&&b.legacyInterceptorReqResOrdering?a.unshift(k.fulfilled,k.rejected):a.push(k.fulfilled,k.rejected)});const d=[];this.interceptors.response.forEach(function(k){d.push(k.fulfilled,k.rejected)});let c,p=0,h;if(!l){const v=[Wa.bind(this),void 0];for(v.unshift(...a),v.push(...d),h=v.length,c=Promise.resolve(n);p{if(!s._listeners)return;let r=s._listeners.length;for(;r-- >0;)s._listeners[r](o);s._listeners=null}),this.promise.then=o=>{let r;const i=new Promise(a=>{s.subscribe(a),r=a}).then(o);return i.cancel=function(){s.unsubscribe(r)},i},t(function(r,i,a){s.reason||(s.reason=new Is(r,i,a),n(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=s=>{t.abort(s)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new au(function(o){t=o}),cancel:t}}};function qm(e){return function(n){return e.apply(null,n)}}function Vm(e){return T.isObject(e)&&e.isAxiosError===!0}const $r={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries($r).forEach(([e,t])=>{$r[t]=e});function lu(e){const t=new Sn(e),n=Hc(Sn.prototype.request,t);return T.extend(n,Sn.prototype,t,{allOwnKeys:!0}),T.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return lu(En(e,o))},n}const Pe=lu(Ns);Pe.Axios=Sn;Pe.CanceledError=Is;Pe.CancelToken=jm;Pe.isCancel=eu;Pe.VERSION=iu;Pe.toFormData=Fo;Pe.AxiosError=ne;Pe.Cancel=Pe.CanceledError;Pe.all=function(t){return Promise.all(t)};Pe.spread=qm;Pe.isAxiosError=Vm;Pe.mergeConfig=En;Pe.AxiosHeaders=st;Pe.formToJSON=e=>Zc(T.isHTMLForm(e)?new FormData(e):e);Pe.getAdapter=ru.getAdapter;Pe.HttpStatusCode=$r;Pe.default=Pe;const{Axios:Nw,AxiosError:Iw,CanceledError:$w,isCancel:Lw,CancelToken:Fw,VERSION:Uw,all:Mw,Cancel:Bw,isAxiosError:Hw,spread:jw,toFormData:qw,AxiosHeaders:Vw,HttpStatusCode:Ww,formToJSON:zw,getAdapter:Kw,mergeConfig:Qw}=Pe;var Rn={};const Ye={PROTOCOL:Rn.PROTOCOL||window.location.protocol,WS_PROTOCOL:Rn.WS_PROTOCOL||window.location.protocol==="https:"?"wss:":"ws:",BACKEND:Rn.BACKEND||window.location.hostname,PORT:Rn.PORT||window.location.port,WS_PORT:Rn.WS_PORT||window.location.port,BASEURL:Rn.BASEURL||""};let Vs;const Wm=new Uint8Array(16);function zm(){if(!Vs&&(Vs=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Vs))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Vs(Wm)}const Le=[];for(let e=0;e<256;++e)Le.push((e+256).toString(16).slice(1));function Km(e,t=0){return Le[e[t+0]]+Le[e[t+1]]+Le[e[t+2]]+Le[e[t+3]]+"-"+Le[e[t+4]]+Le[e[t+5]]+"-"+Le[e[t+6]]+Le[e[t+7]]+"-"+Le[e[t+8]]+Le[e[t+9]]+"-"+Le[e[t+10]]+Le[e[t+11]]+Le[e[t+12]]+Le[e[t+13]]+Le[e[t+14]]+Le[e[t+15]]}const Qm=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),Ka={randomUUID:Qm};function Gm(e,t,n){if(Ka.randomUUID&&!e)return Ka.randomUUID();e=e||{};const s=e.random||(e.rng||zm)();return s[6]=s[6]&15|64,s[8]=s[8]&63|128,Km(s)}var Ym={};console.log("using env:",Ym);console.log("using config: ",Ye);const Ue=Pe.create({baseURL:`${Ye.PROTOCOL}//${Ye.BACKEND}:${Ye.PORT}${Ye.BASEURL}`}),An=Gm();console.log("session ID: ",An);cu();const yi=new WebSocket(`${Ye.WS_PROTOCOL}//${Ye.BACKEND}${Ye.PORT!==""?":"+Ye.PORT:""}${Ye.BASEURL}/api/ws?client_id=${An}`);yi.onopen=e=>{console.log("websocket connection opened",e)};function cu(){Ue.get("/api/version").then(e=>{const t=localStorage.getItem("version");console.log("Backend version: ",e.data),localStorage.setItem("version",e.data),t!=e.data&&location.reload()}).catch(e=>{console.error(e),console.log("Error getting version, using 0"),localStorage.setItem("version","0.0.0")})}function Jm(e){return Ue.get("/api/songs/search",{params:{query:e}})}function Xm(e){return Ue.get("/api/song/url",{params:{url:e}})}function Zm(e){const t=typeof e=="string"?e:e.url,n=typeof e=="string"?void 0:e;return Ue.post("/api/download/url",n,{params:{url:t,client_id:An}})}function eg(e){return Ue.post("/api/download/batch",e)}function tg(){return Ue.get("/api/check_update")}function ng(e){return String(e||"").split("/").map(encodeURIComponent).join("/")}function sg(e){return`/media/${ng(e)}`}function og(e){try{return decodeURIComponent(e)}catch{return e}}function rg(e){let t=String(e||"");const n=t.indexOf("/media/");return n>=0?t=t.slice(n+7):t=t.replace(/^\//,""),t.split("/").filter(Boolean).map(og).join("/")}function ig(e){const t=rg(e);if(!t)return"download";const n=t.split("/");return n[n.length-1]||"download"}function ag(e){return`/cover?file=${encodeURIComponent(e)}`}function lg(){return Ue.get("/list")}function cg(e){return Ue.delete("/delete",{params:{file:e}})}function ug(e){return Ue.post("/api/playlist/m3u",e)}function dg(){return Ue.get("/api/queue")}function fg(e){return Ue.delete("/api/queue/item",{params:{song_id:e}})}function pg(){return Ue.delete("/api/queue")}function hg(){return Ue.delete("/api/queue/completed")}function mg(){return Ue.get("/api/settings",{params:{client_id:An}})}function gg(e){return Ue.post("/api/settings/update",e,{params:{client_id:An}})}function yg(e){const t=new FormData;return t.append("file",e),Ue.post("/api/settings/youtube-cookies",t,{params:{client_id:An},headers:{"Content-Type":"multipart/form-data"}})}function vg(){return Ue.delete("/api/settings/youtube-cookies",{params:{client_id:An}})}function bg(e){return yi.onmessage=e}function _g(e){return yi.onerror=e}const ve={search:Jm,open:Xm,download:Zm,downloadBatch:eg,downloadFileURL:sg,downloadSaveName:ig,coverFileURL:ag,listDownloads:lg,deleteDownload:cg,writePlaylistM3u:ug,getQueue:dg,removeQueueItem:fg,clearQueue:pg,clearCompletedQueue:hg,getSettings:mg,setSettings:gg,uploadYoutubeCookies:yg,clearYoutubeCookies:vg,check_for_update:tg,ws_onmessage:bg,ws_onerror:_g,getVersion:cu},Ft=se({audio_providers:[""],youtube:{cookies_file:"",cookies_from_browser:"",cookies_file_exists:!1,cookies_looks_authenticated:!1,cookies_auth_names:[],cookies_warnings:[]},slskd:{enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256},lyrics_providers:[""],download_lyrics:!0,format:"",bitrate:"320",output:"",generate_m3u:!0,sync_navidrome:!0,navidrome:{enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},organize_by_artist:!1,max_parallel_downloads:3}),xg={audio_providers:["youtube","youtube-music","slskd"],lyrics_providers:["lrclib","genius","musixmatch","azlyrics"],format:["mp3","flac","ogg","opus","m4a"],bitrate:["128","192","256","320"],max_parallel_downloads:[1,2,3,5,8],output:"{artists} - {title}.{output-ext}"};ve.getSettings().then(e=>{e.status===200?(console.log("Received settings:",e.data),Ft.value={...Ft.value,...e.data,youtube:{...Ft.value.youtube,...e.data.youtube||{}},slskd:{...Ft.value.slskd,...e.data.slskd||{}},navidrome:{...Ft.value.navidrome,...e.data.navidrome||{}}}):console.log("Error loading settings")});function uu(){const e=se(),t=se("");function n(){var i,a;const o=((i=Ft.value)==null?void 0:i.slskd)||{};if(o.enabled){if(!String(o.base_url||"").trim())return"slskd base URL is required when enabled";if(!String(o.api_key||"").trim())return"slskd API key is required when enabled"}const r=((a=Ft.value)==null?void 0:a.navidrome)||{};if(r.enabled){if(!String(r.url||"").trim())return"Navidrome URL is required when enabled";if(!String(r.username||"").trim())return"Navidrome username is required when enabled";if(!String(r.password||""))return"Navidrome password is required when enabled"}return""}function s(){console.log("Saving settings:",Ft.value);const o=n();if(o){t.value=o,e.value=!1,setTimeout(()=>{e.value=null},2500);return}t.value="",ve.setSettings(Ft.value).then(r=>{if(r.status===200){console.log("Saved!"),e.value=!0;const i=document.getElementById("settings-modal");i&&"checked"in i&&(i.checked=!1),setTimeout(()=>{e.value=null},2e3)}else console.error("Error saving settings.",r),t.value="Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2e3)}).catch(r=>{var a,l;const i=(l=(a=r==null?void 0:r.response)==null?void 0:a.data)==null?void 0:l.detail;t.value=typeof i=="string"&&i.trim()?i:"Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2500)})}return{saveSettings:s,settings:Ft,settingsOptions:xg,isSaved:e,saveErrorText:t}}const wg={class:"modal modal-bottom sm:modal-middle"},kg={class:"modal-box surface-strong rounded-t-3xl sm:rounded-3xl p-0 max-w-lg"},Sg={class:"flex items-center justify-between px-6 py-4 border-b border-white/5"},Eg={class:"text-lg font-bold tracking-tight"},Ag={class:"text-xs text-base-content/50 mt-0.5"},Cg=["title"],Rg={class:"px-6 py-5 space-y-6"},Tg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Pg=["value"],Og=["value"],Dg={class:"text-[11px] text-base-content/40 mt-1.5"},Ng={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ig={class:"text-[11px] text-base-content/40 mb-2"},$g={class:"grid grid-cols-2 gap-2"},Lg=["onClick"],Fg={key:0,class:"absolute top-1 right-1 text-[10px] font-bold opacity-80"},Ug={key:0,class:"mt-2 space-y-1 text-sm"},Mg={class:"text-xs opacity-50 w-4"},Bg={class:"flex-1"},Hg=["disabled","onClick"],jg=["disabled","onClick"],qg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Vg={class:"text-[11px] text-base-content/40 mb-2"},Wg={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},zg={class:"flex-1 text-sm"},Kg={class:"block"},Qg={class:"block text-[11px] text-base-content/50"},Gg={key:0,class:"grid grid-cols-1 gap-2"},Yg=["placeholder"],Jg=["placeholder"],Xg={class:"rounded-xl border border-white/10 bg-base-100/50 px-3 py-2.5 space-y-2"},Zg={class:"text-[11px] font-semibold text-base-content/70"},ey={class:"text-[11px] text-base-content/50 space-y-1 list-disc pl-4"},ty={class:"text-[10px] leading-relaxed text-base-content/60 whitespace-pre-wrap font-mono bg-base-300/30 rounded-lg px-2 py-1.5"},ny={class:"text-[11px] text-base-content/50"},sy=["placeholder"],oy={class:"text-[11px] text-base-content/40"},ry={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mt-2"},iy={class:"block text-sm font-medium"},ay={class:"block text-[11px] text-base-content/50 mt-0.5"},ly={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 mt-2"},cy={class:"text-[11px] text-base-content/50"},uy={class:"text-[11px] text-base-content/50"},dy={class:"text-[11px] text-base-content/40"},fy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},py={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},hy={class:"flex-1 text-sm"},my={class:"block"},gy={class:"block text-[11px] text-base-content/50"},yy={class:"flex items-baseline justify-between mb-1.5"},vy={class:"text-xs text-base-content/50"},by={class:"text-[10px] text-base-content/40"},_y=["disabled"],xy=["value"],wy={class:"grid grid-cols-2 gap-3"},ky={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Sy=["value"],Ey={class:"flex items-baseline justify-between mb-2"},Ay={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50"},Cy={key:0,class:"text-[10px] text-base-content/40"},Ry=["disabled"],Ty=["value"],Py={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Oy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Dy={class:"flex-1 text-sm"},Ny={class:"block"},Iy={class:"block text-[11px] text-base-content/50"},$y={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Ly={class:"flex-1 text-sm"},Fy={class:"block"},Uy={class:"block text-[11px] text-base-content/50"},My={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},By={class:"text-[11px] text-base-content/40 mb-2"},Hy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},jy={class:"flex-1 text-sm"},qy={class:"block"},Vy={class:"block text-[11px] text-base-content/50"},Wy={key:0,class:"grid grid-cols-1 gap-2"},zy=["placeholder"],Ky=["placeholder"],Qy=["placeholder"],Gy=["placeholder"],Yy=["placeholder"],Jy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Xy={class:"flex-1 text-sm"},Zy={class:"block"},ev={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},tv={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},nv={class:"flex-1 text-sm"},sv={class:"block"},ov={class:"block text-[11px] text-base-content/50"},rv={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},iv={class:"grid grid-cols-5 gap-1.5"},av=["onClick"],lv={class:"text-[11px] text-base-content/40 mt-1.5"},cv={class:"pt-1"},uv={key:0,class:"text-success/80"},dv={key:0,class:"mt-2 space-y-2 rounded-lg border border-white/5 bg-base-100/30 px-3 py-2"},fv={class:"text-[10px] leading-snug text-base-content/40"},pv={key:0,class:"text-[10px] text-warning"},hv={key:1,class:"text-[10px] text-warning"},mv=["placeholder"],gv={class:"flex flex-wrap gap-1.5"},yv={class:"btn btn-xs btn-ghost rounded-lg cursor-pointer normal-case"},vv=["disabled"],bv={key:2,class:"text-[10px] text-error"},_v={key:0,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-primary"},xv={key:1,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-error"},wv={class:"flex items-center justify-end gap-2 px-6 py-4 border-t border-white/5"},kv={for:"settings-modal",class:"btn btn-sm h-10 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 cursor-pointer"},Sv={class:"modal-backdrop",for:"settings-modal"},Qn={__name:"Settings",setup(e){const t=uu(),n=se(""),s=se(!1),o={cookies_file:"",cookies_from_browser:"",cookies_file_exists:!1,cookies_looks_authenticated:!1,cookies_auth_names:[],cookies_warnings:[]},r=me(()=>{var x,_;return String(((_=(x=t.settings.value)==null?void 0:x.youtube)==null?void 0:_.cookies_file)||"").trim()}),i=me(()=>{var x,_;return!!((_=(x=t.settings.value)==null?void 0:x.youtube)!=null&&_.cookies_file_exists)}),a=me(()=>{var x,_;return!!((_=(x=t.settings.value)==null?void 0:x.youtube)!=null&&_.cookies_looks_authenticated)}),{t:l,locale:d,setLocale:c,locales:p}=St(),h={enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},g={enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256};Xn(()=>{var _;const x=(_=t.settings.value)==null?void 0:_.youtube;if(!x||typeof x!="object"){t.settings.value.youtube={...o};return}for(const[E,j]of Object.entries(o))(x[E]===void 0||x[E]===null)&&(x[E]=j)}),Xn(()=>{var _;const x=(_=t.settings.value)==null?void 0:_.slskd;if(!x||typeof x!="object"){t.settings.value.slskd={...g};return}for(const[E,j]of Object.entries(g))(x[E]===void 0||x[E]===null)&&(x[E]=j)}),Xn(()=>{var _;const x=(_=t.settings.value)==null?void 0:_.navidrome;if(!x||typeof x!="object"){t.settings.value.navidrome={...h};return}for(const[E,j]of Object.entries(h))(x[E]===void 0||x[E]===null)&&(x[E]=j)}),Xn(()=>{var x;((x=t.settings.value)==null?void 0:x.sync_navidrome)===void 0&&(t.settings.value.sync_navidrome=!0)}),Xn(()=>{var _;const x=(_=t.settings.value)==null?void 0:_.audio_providers;(!Array.isArray(x)||x.length===0)&&(t.settings.value.audio_providers=["youtube-music"])});async function v(x){var j,M,Q,N;const _=x.target,E=(j=_==null?void 0:_.files)==null?void 0:j[0];if(E){n.value="";try{const te=await ve.uploadYoutubeCookies(E);te.status===200&&((M=te.data)!=null&&M.youtube)?t.settings.value.youtube={...t.settings.value.youtube,...te.data.youtube}:n.value=l("settings.saveError")}catch(te){const le=(N=(Q=te==null?void 0:te.response)==null?void 0:Q.data)==null?void 0:N.detail;n.value=typeof le=="string"&&le.trim()?le:l("settings.saveError")}finally{_&&(_.value="")}}}async function k(){var x,_,E;n.value="";try{const j=await ve.clearYoutubeCookies();j.status===200&&((x=j.data)!=null&&x.youtube)&&(t.settings.value.youtube={...t.settings.value.youtube,...j.data.youtube})}catch(j){const M=(E=(_=j==null?void 0:j.response)==null?void 0:_.data)==null?void 0:E.detail;n.value=typeof M=="string"&&M.trim()?M:l("settings.saveError")}}function b(x){return x==="youtube-music"?"YouTube Music":x==="youtube"?"YouTube":x==="slskd"?"slskd":x}const R=["slskd","youtube-music","youtube"];function D(x){var E;return(((E=t.settings.value)==null?void 0:E.audio_providers)||[]).indexOf(x)}function C(x){const _=[...t.settings.value.audio_providers||[]],E=_.indexOf(x);E>=0?_.splice(E,1):_.push(x),t.settings.value.audio_providers=_.length>0?_:["youtube-music"]}function P(x,_){const E=[...t.settings.value.audio_providers||[]],j=x+_;j<0||j>=E.length||([E[x],E[j]]=[E[j],E[x]],t.settings.value.audio_providers=E)}function U(){var _,E;const x=!!((E=(_=t.settings.value)==null?void 0:_.slskd)!=null&&E.enabled);t.settings.value.audio_providers=x?[...R]:["youtube-music","youtube"]}return(x,_)=>(A(),O(fe,null,[_[25]||(_[25]=f("input",{type:"checkbox",id:"settings-modal",class:"modal-toggle"},null,-1)),f("div",wg,[f("div",kg,[f("div",Sg,[f("div",null,[f("h3",Eg,w(u(l)("settings.title")),1),f("p",Ag,w(u(l)("settings.subtitle")),1)]),f("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(l)("common.close")},[H(u(Y),{icon:"clarity:close-line",class:"h-5 w-5"})],8,Cg)]),f("div",Rg,[f("div",null,[f("label",Tg,w(u(l)("settings.language")),1),f("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",value:u(d),onChange:_[0]||(_[0]=E=>u(c)(E.target.value))},[(A(!0),O(fe,null,Ie(u(p),E=>(A(),O("option",{key:E.code,value:E.code},w(E.name),9,Og))),128))],40,Pg),f("p",Dg,w(u(l)("settings.languageHint")),1)]),f("div",null,[f("label",Ng,w(u(l)("settings.audioSource")),1),f("p",Ig,w(u(l)("settings.audioSourceHint")),1),f("div",$g,[(A(!0),O(fe,null,Ie(u(t).settingsOptions.audio_providers,E=>(A(),O("button",{key:E,type:"button",class:Ce(["rounded-xl border px-3 py-2 text-sm transition-colors text-left relative",[D(E)>=0?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:j=>C(E)},[D(E)>=0?(A(),O("span",Fg,w(D(E)+1),1)):ie("",!0),Ae(" "+w(b(E)),1)],10,Lg))),128))]),u(t).settings.value.audio_providers.length?(A(),O("ul",Ug,[(A(!0),O(fe,null,Ie(u(t).settings.value.audio_providers,(E,j)=>(A(),O("li",{key:E,class:"flex items-center gap-2 rounded-lg border border-white/10 px-2 py-1"},[f("span",Mg,w(j+1),1),f("span",Bg,w(b(E)),1),f("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:j===0,onClick:M=>P(j,-1)}," ↑ ",8,Hg),f("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:j===u(t).settings.value.audio_providers.length-1,onClick:M=>P(j,1)}," ↓ ",8,jg)]))),128))])):ie("",!0),f("button",{type:"button",class:"btn btn-xs btn-ghost rounded-lg mt-2",onClick:U},w(u(l)("settings.audioSourceReset")),1)]),f("div",null,[f("label",qg,w(u(l)("settings.slskdSection")),1),f("p",Vg,w(u(l)("settings.slskdHint")),1),f("label",Wg,[Se(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[1]||(_[1]=E=>u(t).settings.value.slskd.enabled=E)},null,512),[[tn,u(t).settings.value.slskd.enabled]]),f("span",zg,[f("span",Kg,w(u(l)("settings.slskdEnabled")),1),f("span",Qg,w(u(l)("settings.slskdEnabledHint")),1)])]),u(t).settings.value.slskd.enabled?(A(),O("div",Gg,[Se(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(l)("settings.slskdBaseUrl"),"onUpdate:modelValue":_[2]||(_[2]=E=>u(t).settings.value.slskd.base_url=E)},null,8,Yg),[[et,u(t).settings.value.slskd.base_url]]),Se(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(l)("settings.slskdApiKey"),"onUpdate:modelValue":_[3]||(_[3]=E=>u(t).settings.value.slskd.api_key=E)},null,8,Jg),[[et,u(t).settings.value.slskd.api_key]]),f("div",Xg,[f("p",Zg,w(u(l)("settings.slskdSourceDirTitle")),1),f("ul",ey,[f("li",null,w(u(l)("settings.slskdSourceDirBullet1")),1),f("li",null,w(u(l)("settings.slskdSourceDirBullet2")),1),f("li",null,w(u(l)("settings.slskdSourceDirBullet3")),1)]),f("pre",ty,w(u(l)("settings.slskdSourceDirExample")),1)]),f("label",ny,w(u(l)("settings.slskdSourceDirLabel")),1),Se(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 font-mono text-sm",type:"text",placeholder:u(l)("settings.slskdSourceDirPlaceholder"),"onUpdate:modelValue":_[4]||(_[4]=E=>u(t).settings.value.slskd.source_dir=E)},null,8,sy),[[et,u(t).settings.value.slskd.source_dir]]),f("p",oy,w(u(l)("settings.slskdSourceDirHint")),1),f("label",ry,[Se(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[5]||(_[5]=E=>u(t).settings.value.slskd.leave_in_place=E)},null,512),[[tn,u(t).settings.value.slskd.leave_in_place]]),f("span",null,[f("span",iy,w(u(l)("settings.slskdLeaveInPlace")),1),f("span",ay,w(u(l)("settings.slskdLeaveInPlaceHint")),1)])]),f("div",ly,[f("label",cy,[Ae(w(u(l)("settings.slskdDownloadTimeout"))+" ",1),Se(f("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"30",max:"3600","onUpdate:modelValue":_[6]||(_[6]=E=>u(t).settings.value.slskd.download_timeout_seconds=E)},null,512),[[et,u(t).settings.value.slskd.download_timeout_seconds,void 0,{number:!0}]])]),f("label",uy,[Ae(w(u(l)("settings.slskdQueuedTimeout"))+" ",1),Se(f("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"15",max:"3600","onUpdate:modelValue":_[7]||(_[7]=E=>u(t).settings.value.slskd.queued_timeout_seconds=E)},null,512),[[et,u(t).settings.value.slskd.queued_timeout_seconds,void 0,{number:!0}]])])]),f("p",dy,w(u(l)("settings.slskdTimeoutHint")),1)])):ie("",!0)]),f("div",null,[f("label",fy,w(u(l)("settings.lyricsSource")),1),f("label",py,[Se(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[8]||(_[8]=E=>u(t).settings.value.download_lyrics=E)},null,512),[[tn,u(t).settings.value.download_lyrics]]),f("span",hy,[f("span",my,w(u(l)("settings.downloadLyrics")),1),f("span",gy,w(u(l)("settings.downloadLyricsHint")),1)])]),f("div",yy,[f("span",vy,w(u(l)("settings.lyricsProvider")),1),f("span",by,w(u(l)("settings.lyricsHint")),1)]),Se(f("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 disabled:opacity-40","onUpdate:modelValue":_[9]||(_[9]=E=>u(t).settings.value.lyrics_providers[0]=E),disabled:!u(t).settings.value.download_lyrics},[(A(!0),O(fe,null,Ie(u(t).settingsOptions.lyrics_providers,E=>(A(),O("option",{key:E,value:E},w(E),9,xy))),128))],8,_y),[[Xs,u(t).settings.value.lyrics_providers[0]]])]),f("div",wy,[f("div",null,[f("label",ky,w(u(l)("settings.format")),1),Se(f("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":_[10]||(_[10]=E=>u(t).settings.value.format=E)},[(A(!0),O(fe,null,Ie(u(t).settingsOptions.format,E=>(A(),O("option",{key:E,value:E},w(E.toUpperCase()),9,Sy))),128))],512),[[Xs,u(t).settings.value.format]])]),f("div",null,[f("div",Ey,[f("label",Ay,w(u(l)("settings.quality")),1),u(t).settings.value.format==="flac"?(A(),O("span",Cy,w(u(l)("settings.qualityIgnored")),1)):ie("",!0)]),Se(f("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":_[11]||(_[11]=E=>u(t).settings.value.bitrate=E),disabled:u(t).settings.value.format==="flac"},[(A(!0),O(fe,null,Ie(u(t).settingsOptions.bitrate,E=>(A(),O("option",{key:E,value:E},w(E)+" kbps ",9,Ty))),128))],8,Ry),[[Xs,u(t).settings.value.bitrate]])])]),f("div",null,[f("label",Py,w(u(l)("settings.playlistsSection")),1),f("label",Oy,[Se(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[12]||(_[12]=E=>u(t).settings.value.generate_m3u=E)},null,512),[[tn,u(t).settings.value.generate_m3u]]),f("span",Dy,[f("span",Ny,w(u(l)("settings.generateM3u")),1),f("span",Iy,w(u(l)("settings.generateM3uHint")),1)])]),f("label",$y,[Se(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[13]||(_[13]=E=>u(t).settings.value.sync_navidrome=E)},null,512),[[tn,u(t).settings.value.sync_navidrome]]),f("span",Ly,[f("span",Fy,w(u(l)("settings.syncNavidrome")),1),f("span",Uy,w(u(l)("settings.syncNavidromeHint")),1)])])]),f("div",null,[f("label",My,w(u(l)("settings.navidromeSection")),1),f("p",By,w(u(l)("settings.navidromeHint")),1),f("label",Hy,[Se(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[14]||(_[14]=E=>u(t).settings.value.navidrome.enabled=E)},null,512),[[tn,u(t).settings.value.navidrome.enabled]]),f("span",jy,[f("span",qy,w(u(l)("settings.navidromeEnabled")),1),f("span",Vy,w(u(l)("settings.navidromeEnabledHint")),1)])]),u(t).settings.value.navidrome.enabled?(A(),O("div",Wy,[Se(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(l)("settings.navidromeUrl"),"onUpdate:modelValue":_[15]||(_[15]=E=>u(t).settings.value.navidrome.url=E)},null,8,zy),[[et,u(t).settings.value.navidrome.url]]),Se(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(l)("settings.navidromeUsername"),"onUpdate:modelValue":_[16]||(_[16]=E=>u(t).settings.value.navidrome.username=E)},null,8,Ky),[[et,u(t).settings.value.navidrome.username]]),Se(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(l)("settings.navidromePassword"),"onUpdate:modelValue":_[17]||(_[17]=E=>u(t).settings.value.navidrome.password=E)},null,8,Qy),[[et,u(t).settings.value.navidrome.password]]),Se(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(l)("settings.navidromeAdminUser"),"onUpdate:modelValue":_[18]||(_[18]=E=>u(t).settings.value.navidrome.admin_username=E)},null,8,Gy),[[et,u(t).settings.value.navidrome.admin_username]]),Se(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(l)("settings.navidromeAdminPassword"),"onUpdate:modelValue":_[19]||(_[19]=E=>u(t).settings.value.navidrome.admin_password=E)},null,8,Yy),[[et,u(t).settings.value.navidrome.admin_password]]),f("label",Jy,[Se(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[20]||(_[20]=E=>u(t).settings.value.navidrome.public_playlist=E)},null,512),[[tn,u(t).settings.value.navidrome.public_playlist]]),f("span",Xy,[f("span",Zy,w(u(l)("settings.navidromePublic")),1)])])])):ie("",!0)]),f("div",null,[f("label",ev,w(u(l)("settings.organizationSection")),1),f("label",tv,[Se(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[21]||(_[21]=E=>u(t).settings.value.organize_by_artist=E)},null,512),[[tn,u(t).settings.value.organize_by_artist]]),f("span",nv,[f("span",sv,w(u(l)("settings.organizeByArtist")),1),f("span",ov,w(u(l)("settings.organizeByArtistHint")),1)])])]),f("div",null,[f("label",rv,w(u(l)("settings.parallelDownloads")),1),f("div",iv,[(A(!0),O(fe,null,Ie(u(t).settingsOptions.max_parallel_downloads,E=>(A(),O("button",{key:E,type:"button",class:Ce(["rounded-xl border px-2 py-2 text-sm font-medium transition-colors text-center",[u(t).settings.value.max_parallel_downloads===E?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:j=>u(t).settings.value.max_parallel_downloads=E},w(E),11,av))),128))]),f("p",lv,w(u(l)("settings.parallelDownloadsHint")),1)]),f("div",cv,[f("button",{type:"button",class:"text-[11px] text-base-content/35 hover:text-base-content/55 transition-colors",onClick:_[22]||(_[22]=E=>s.value=!s.value)},[Ae(w(u(l)("settings.youtubeAdvancedToggle"))+" ",1),i.value&&a.value?(A(),O("span",uv," · "+w(u(l)("settings.youtubeCookiesConfigured")),1)):ie("",!0)]),s.value?(A(),O("div",dv,[f("p",fv,w(u(l)("settings.youtubeCookiesHint")),1),i.value&&!a.value?(A(),O("p",pv,w(u(l)("settings.youtubeCookiesWeak")),1)):r.value&&!i.value?(A(),O("p",hv,w(u(l)("settings.youtubeCookiesMissing")),1)):ie("",!0),Se(f("input",{type:"text",class:"input input-xs w-full rounded-lg bg-base-100/85 border border-white/10",placeholder:u(l)("settings.youtubeCookiesPathPlaceholder"),"onUpdate:modelValue":_[23]||(_[23]=E=>u(t).settings.value.youtube.cookies_file=E)},null,8,mv),[[et,u(t).settings.value.youtube.cookies_file]]),f("div",gv,[f("label",yv,[Ae(w(u(l)("settings.youtubeCookiesUpload"))+" ",1),f("input",{type:"file",accept:".txt,text/plain",class:"hidden",onChange:v},null,32)]),f("button",{type:"button",class:"btn btn-xs btn-ghost rounded-lg normal-case",disabled:!i.value&&!r.value,onClick:k},w(u(l)("settings.youtubeCookiesClear")),9,vv)]),n.value?(A(),O("p",bv,w(n.value),1)):ie("",!0)])):ie("",!0)]),H(Cc,{"enter-active-class":"transition duration-200","enter-from-class":"opacity-0 -translate-y-1","enter-to-class":"opacity-100 translate-y-0","leave-active-class":"transition duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:lo(()=>[u(t).isSaved.value===!0?(A(),O("div",_v,[H(u(Y),{icon:"clarity:check-line",class:"h-4 w-4 shrink-0"}),Ae(" "+w(u(l)("settings.saved")),1)])):u(t).isSaved.value===!1?(A(),O("div",xv,[H(u(Y),{icon:"clarity:exclamation-circle-line",class:"h-4 w-4 shrink-0"}),Ae(" "+w(u(t).saveErrorText.value||u(l)("settings.saveError")),1)])):ie("",!0)]),_:1})]),f("div",wv,[f("label",kv,w(u(l)("common.cancel")),1),f("button",{class:"btn btn-primary btn-sm h-10 px-6 rounded-full",onClick:_[24]||(_[24]=E=>u(t).saveSettings())},w(u(l)("common.save")),1)])]),f("label",Sv,w(u(l)("common.close")),1)])],64))}},Nt=se(""),Qa=se("light"),Ga=se("dark");function vi({useSystem:e=!0,initialTheme:t="",newLightAlias:n="",newDarkAlias:s=""}={}){function o(c){Qa.value=c,d()}function r(c){Ga.value=c,d()}function i(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function a(c){Nt.value=c,d()}function l(){Nt==="dark"?Nt.value="light":Nt==="light"&&(Nt.value="dark"),d()}function d(){document.documentElement.setAttribute("data-theme",Nt.value==="dark"?Ga.value:Qa.value)}return Nt.value!=="light"&&Nt.value!=="dark"&&(e&&a(i()),(t==="light"||t==="dark")&&(Nt.value=t)),n&&o(n),s&&r(s),d(),{currentTheme:Nt,setLightAlias:o,setDarkAlias:r,getSystemTheme:i,setTheme:a,switchTheme:l}}const Ev={class:"min-h-dvh flex flex-col text-base-content"},Av={__name:"App",setup(e){const t=vi();return Zl(()=>{t.setLightAlias("downtify-light"),t.setDarkAlias("downtify-dark")}),(n,s)=>{const o=xr("router-view");return A(),O("div",Ev,[H(o,null,{default:lo(({Component:r,route:i})=>[H(Cc,{name:"page",mode:"out-in"},{default:lo(()=>[(A(),ct(Ud(r),{key:i.fullPath}))]),_:2},1024)]),_:1}),H(gp),H(Qn)])}}};/*! +`):" "+Va(i[0]):"as no adapter specified";throw new ne("There is no suitable adapter to dispatch the request "+a,"ERR_NOT_SUPPORT")}return o}const ru={getAdapter:Bm,adapters:gi};function ir(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Is(null,e)}function Wa(e){return ir(e),e.headers=st.from(e.headers),e.data=rr.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),ru.getAdapter(e.adapter||Ns.adapter,e)(e).then(function(s){return ir(e),s.data=rr.call(e,e.transformResponse,s),s.headers=st.from(s.headers),s},function(s){return eu(s)||(ir(e),s&&s.response&&(s.response.data=rr.call(e,e.transformResponse,s.response),s.response.headers=st.from(s.response.headers))),Promise.reject(s)})}const iu="1.13.5",Fo={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Fo[e]=function(s){return typeof s===e||"a"+(t<1?"n ":" ")+e}});const za={};Fo.transitional=function(t,n,s){function o(r,i){return"[Axios v"+iu+"] Transitional option '"+r+"'"+i+(s?". "+s:"")}return(r,i,a)=>{if(t===!1)throw new ne(o(i," has been removed"+(n?" in "+n:"")),ne.ERR_DEPRECATED);return n&&!za[i]&&(za[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(r,i,a):!0}};Fo.spelling=function(t){return(n,s)=>(console.warn(`${s} is likely a misspelling of ${t}`),!0)};function Hm(e,t,n){if(typeof e!="object")throw new ne("options must be an object",ne.ERR_BAD_OPTION_VALUE);const s=Object.keys(e);let o=s.length;for(;o-- >0;){const r=s[o],i=t[r];if(i){const a=e[r],l=a===void 0||i(a,r,e);if(l!==!0)throw new ne("option "+r+" must be "+l,ne.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new ne("Unknown option "+r,ne.ERR_BAD_OPTION)}}const oo={assertOptions:Hm,validators:Fo},pt=oo.validators;let Sn=class{constructor(t){this.defaults=t||{},this.interceptors={request:new Ia,response:new Ia}}async request(t,n){try{return await this._request(t,n)}catch(s){if(s instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;const r=o.stack?o.stack.replace(/^.+\n/,""):"";try{s.stack?r&&!String(s.stack).endsWith(r.replace(/^.+\n.+\n/,""))&&(s.stack+=` +`+r):s.stack=r}catch{}}throw s}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=En(this.defaults,n);const{transitional:s,paramsSerializer:o,headers:r}=n;s!==void 0&&oo.assertOptions(s,{silentJSONParsing:pt.transitional(pt.boolean),forcedJSONParsing:pt.transitional(pt.boolean),clarifyTimeoutError:pt.transitional(pt.boolean),legacyInterceptorReqResOrdering:pt.transitional(pt.boolean)},!1),o!=null&&(T.isFunction(o)?n.paramsSerializer={serialize:o}:oo.assertOptions(o,{encode:pt.function,serialize:pt.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),oo.assertOptions(n,{baseUrl:pt.spelling("baseURL"),withXsrfToken:pt.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=r&&T.merge(r.common,r[n.method]);r&&T.forEach(["delete","get","head","post","put","patch","common"],b=>{delete r[b]}),n.headers=st.concat(i,r);const a=[];let l=!0;this.interceptors.request.forEach(function(k){if(typeof k.runWhen=="function"&&k.runWhen(n)===!1)return;l=l&&k.synchronous;const v=n.transitional||hi;v&&v.legacyInterceptorReqResOrdering?a.unshift(k.fulfilled,k.rejected):a.push(k.fulfilled,k.rejected)});const d=[];this.interceptors.response.forEach(function(k){d.push(k.fulfilled,k.rejected)});let c,p=0,h;if(!l){const b=[Wa.bind(this),void 0];for(b.unshift(...a),b.push(...d),h=b.length,c=Promise.resolve(n);p{if(!s._listeners)return;let r=s._listeners.length;for(;r-- >0;)s._listeners[r](o);s._listeners=null}),this.promise.then=o=>{let r;const i=new Promise(a=>{s.subscribe(a),r=a}).then(o);return i.cancel=function(){s.unsubscribe(r)},i},t(function(r,i,a){s.reason||(s.reason=new Is(r,i,a),n(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=s=>{t.abort(s)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new au(function(o){t=o}),cancel:t}}};function qm(e){return function(n){return e.apply(null,n)}}function Vm(e){return T.isObject(e)&&e.isAxiosError===!0}const $r={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries($r).forEach(([e,t])=>{$r[t]=e});function lu(e){const t=new Sn(e),n=Hc(Sn.prototype.request,t);return T.extend(n,Sn.prototype,t,{allOwnKeys:!0}),T.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return lu(En(e,o))},n}const Pe=lu(Ns);Pe.Axios=Sn;Pe.CanceledError=Is;Pe.CancelToken=jm;Pe.isCancel=eu;Pe.VERSION=iu;Pe.toFormData=Uo;Pe.AxiosError=ne;Pe.Cancel=Pe.CanceledError;Pe.all=function(t){return Promise.all(t)};Pe.spread=qm;Pe.isAxiosError=Vm;Pe.mergeConfig=En;Pe.AxiosHeaders=st;Pe.formToJSON=e=>Zc(T.isHTMLForm(e)?new FormData(e):e);Pe.getAdapter=ru.getAdapter;Pe.HttpStatusCode=$r;Pe.default=Pe;const{Axios:Fw,AxiosError:Mw,CanceledError:Bw,isCancel:Hw,CancelToken:jw,VERSION:qw,all:Vw,Cancel:Ww,isAxiosError:zw,spread:Kw,toFormData:Qw,AxiosHeaders:Gw,HttpStatusCode:Yw,formToJSON:Jw,getAdapter:Xw,mergeConfig:Zw}=Pe;var Rn={};const Ye={PROTOCOL:Rn.PROTOCOL||window.location.protocol,WS_PROTOCOL:Rn.WS_PROTOCOL||window.location.protocol==="https:"?"wss:":"ws:",BACKEND:Rn.BACKEND||window.location.hostname,PORT:Rn.PORT||window.location.port,WS_PORT:Rn.WS_PORT||window.location.port,BASEURL:Rn.BASEURL||""};let Vs;const Wm=new Uint8Array(16);function zm(){if(!Vs&&(Vs=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Vs))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Vs(Wm)}const Le=[];for(let e=0;e<256;++e)Le.push((e+256).toString(16).slice(1));function Km(e,t=0){return Le[e[t+0]]+Le[e[t+1]]+Le[e[t+2]]+Le[e[t+3]]+"-"+Le[e[t+4]]+Le[e[t+5]]+"-"+Le[e[t+6]]+Le[e[t+7]]+"-"+Le[e[t+8]]+Le[e[t+9]]+"-"+Le[e[t+10]]+Le[e[t+11]]+Le[e[t+12]]+Le[e[t+13]]+Le[e[t+14]]+Le[e[t+15]]}const Qm=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),Ka={randomUUID:Qm};function Gm(e,t,n){if(Ka.randomUUID&&!e)return Ka.randomUUID();e=e||{};const s=e.random||(e.rng||zm)();return s[6]=s[6]&15|64,s[8]=s[8]&63|128,Km(s)}var Ym={};console.log("using env:",Ym);console.log("using config: ",Ye);const Fe=Pe.create({baseURL:`${Ye.PROTOCOL}//${Ye.BACKEND}:${Ye.PORT}${Ye.BASEURL}`}),An=Gm();console.log("session ID: ",An);cu();const yi=new WebSocket(`${Ye.WS_PROTOCOL}//${Ye.BACKEND}${Ye.PORT!==""?":"+Ye.PORT:""}${Ye.BASEURL}/api/ws?client_id=${An}`);yi.onopen=e=>{console.log("websocket connection opened",e)};function cu(){Fe.get("/api/version").then(e=>{const t=localStorage.getItem("version");console.log("Backend version: ",e.data),localStorage.setItem("version",e.data),t!=e.data&&location.reload()}).catch(e=>{console.error(e),console.log("Error getting version, using 0"),localStorage.setItem("version","0.0.0")})}function Jm(e){return Fe.get("/api/songs/search",{params:{query:e}})}function Xm(e){return Fe.get("/api/song/url",{params:{url:e}})}function Zm(e){const t=typeof e=="string"?e:e.url,n=typeof e=="string"?void 0:e;return Fe.post("/api/download/url",n,{params:{url:t,client_id:An}})}function eg(e){return Fe.post("/api/download/batch",e)}function tg(){return Fe.get("/api/check_update")}function ng(e){return String(e||"").split("/").map(encodeURIComponent).join("/")}function sg(e){return`/media/${ng(e)}`}function og(e){try{return decodeURIComponent(e)}catch{return e}}function rg(e){let t=String(e||"");const n=t.indexOf("/media/");return n>=0?t=t.slice(n+7):t=t.replace(/^\//,""),t.split("/").filter(Boolean).map(og).join("/")}function ig(e){const t=rg(e);if(!t)return"download";const n=t.split("/");return n[n.length-1]||"download"}function ag(e){return`/cover?file=${encodeURIComponent(e)}`}function lg(){return Fe.get("/list")}function cg(e){return Fe.delete("/delete",{params:{file:e}})}function ug(e){return Fe.post("/api/playlist/m3u",e)}function dg(){return Fe.get("/api/queue")}function fg(e){return Fe.delete("/api/queue/item",{params:{song_id:e}})}function pg(){return Fe.delete("/api/queue")}function hg(){return Fe.delete("/api/queue/completed")}function mg(){return Fe.get("/api/settings",{params:{client_id:An}})}function gg(e){return Fe.post("/api/settings/update",e,{params:{client_id:An}})}function yg(e){const t=new FormData;return t.append("file",e),Fe.post("/api/settings/youtube-cookies",t,{params:{client_id:An},headers:{"Content-Type":"multipart/form-data"}})}function bg(){return Fe.delete("/api/settings/youtube-cookies",{params:{client_id:An}})}function vg(e){return yi.onmessage=e}function _g(e){return yi.onerror=e}const be={search:Jm,open:Xm,download:Zm,downloadBatch:eg,downloadFileURL:sg,downloadSaveName:ig,coverFileURL:ag,listDownloads:lg,deleteDownload:cg,writePlaylistM3u:ug,getQueue:dg,removeQueueItem:fg,clearQueue:pg,clearCompletedQueue:hg,getSettings:mg,setSettings:gg,uploadYoutubeCookies:yg,clearYoutubeCookies:bg,check_for_update:tg,ws_onmessage:vg,ws_onerror:_g,getVersion:cu},Ut=se({audio_providers:[""],youtube:{cookies_file:"",cookies_from_browser:"",cookies_file_exists:!1,cookies_looks_authenticated:!1,cookies_auth_names:[],cookies_warnings:[]},slskd:{enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256},lyrics_providers:[""],download_lyrics:!0,format:"",bitrate:"320",output:"",generate_m3u:!0,sync_navidrome:!0,navidrome:{enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},organize_by_artist:!1,max_parallel_downloads:3}),xg={audio_providers:["youtube","youtube-music","slskd"],lyrics_providers:["lrclib","genius","musixmatch","azlyrics"],format:["mp3","flac","ogg","opus","m4a"],bitrate:["128","192","256","320"],max_parallel_downloads:[1,2,3,5,8],output:"{artists} - {title}.{output-ext}"};be.getSettings().then(e=>{e.status===200?(console.log("Received settings:",e.data),Ut.value={...Ut.value,...e.data,youtube:{...Ut.value.youtube,...e.data.youtube||{}},slskd:{...Ut.value.slskd,...e.data.slskd||{}},navidrome:{...Ut.value.navidrome,...e.data.navidrome||{}}}):console.log("Error loading settings")});function uu(){const e=se(),t=se("");function n(){var i,a;const o=((i=Ut.value)==null?void 0:i.slskd)||{};if(o.enabled){if(!String(o.base_url||"").trim())return"slskd base URL is required when enabled";if(!String(o.api_key||"").trim())return"slskd API key is required when enabled"}const r=((a=Ut.value)==null?void 0:a.navidrome)||{};if(r.enabled){if(!String(r.url||"").trim())return"Navidrome URL is required when enabled";if(!String(r.username||"").trim())return"Navidrome username is required when enabled";if(!String(r.password||""))return"Navidrome password is required when enabled"}return""}function s(){console.log("Saving settings:",Ut.value);const o=n();if(o){t.value=o,e.value=!1,setTimeout(()=>{e.value=null},2500);return}t.value="",be.setSettings(Ut.value).then(r=>{if(r.status===200){console.log("Saved!"),e.value=!0;const i=document.getElementById("settings-modal");i&&"checked"in i&&(i.checked=!1),setTimeout(()=>{e.value=null},2e3)}else console.error("Error saving settings.",r),t.value="Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2e3)}).catch(r=>{var a,l;const i=(l=(a=r==null?void 0:r.response)==null?void 0:a.data)==null?void 0:l.detail;t.value=typeof i=="string"&&i.trim()?i:"Could not save settings",e.value=!1,setTimeout(()=>{e.value=null},2500)})}return{saveSettings:s,settings:Ut,settingsOptions:xg,isSaved:e,saveErrorText:t}}const wg={class:"modal modal-bottom sm:modal-middle"},kg={class:"modal-box surface-strong rounded-t-3xl sm:rounded-3xl p-0 max-w-lg"},Sg={class:"flex items-center justify-between px-6 py-4 border-b border-white/5"},Eg={class:"text-lg font-bold tracking-tight"},Ag={class:"text-xs text-base-content/50 mt-0.5"},Cg=["title"],Rg={class:"px-6 py-5 space-y-6"},Tg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Pg=["value"],Og=["value"],Dg={class:"text-[11px] text-base-content/40 mt-1.5"},Ng={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ig={class:"text-[11px] text-base-content/40 mb-2"},$g={class:"grid grid-cols-2 gap-2"},Lg=["onClick"],Ug={key:0,class:"absolute top-1 right-1 text-[10px] font-bold opacity-80"},Fg={key:0,class:"mt-2 space-y-1 text-sm"},Mg={class:"text-xs opacity-50 w-4"},Bg={class:"flex-1"},Hg=["disabled","onClick"],jg=["disabled","onClick"],qg={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Vg={class:"text-[11px] text-base-content/40 mb-2"},Wg={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},zg={class:"flex-1 text-sm"},Kg={class:"block"},Qg={class:"block text-[11px] text-base-content/50"},Gg={key:0,class:"grid grid-cols-1 gap-2"},Yg=["placeholder"],Jg=["placeholder"],Xg={class:"rounded-xl border border-white/10 bg-base-100/50 px-3 py-2.5 space-y-2"},Zg={class:"text-[11px] font-semibold text-base-content/70"},ey={class:"text-[11px] text-base-content/50 space-y-1 list-disc pl-4"},ty={class:"text-[10px] leading-relaxed text-base-content/60 whitespace-pre-wrap font-mono bg-base-300/30 rounded-lg px-2 py-1.5"},ny={class:"text-[11px] text-base-content/50"},sy=["placeholder"],oy={class:"text-[11px] text-base-content/40"},ry={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mt-2"},iy={class:"block text-sm font-medium"},ay={class:"block text-[11px] text-base-content/50 mt-0.5"},ly={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 mt-2"},cy={class:"text-[11px] text-base-content/50"},uy={class:"text-[11px] text-base-content/50"},dy={class:"text-[11px] text-base-content/40"},fy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},py={class:"text-[11px] text-base-content/40 mb-2"},hy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},my={class:"flex-1 text-sm"},gy={class:"block"},yy={class:"block text-[11px] text-base-content/50"},by={key:0,class:"block text-[11px] text-success mt-1"},vy={key:0,class:"grid grid-cols-1 gap-2"},_y={key:0,class:"text-xs text-warning"},xy={key:1,class:"text-xs text-warning"},wy={class:"text-[11px] text-base-content/50"},ky=["placeholder"],Sy={class:"flex flex-wrap gap-2"},Ey={class:"btn btn-sm btn-outline rounded-xl cursor-pointer"},Ay=["disabled"],Cy={key:2,class:"text-xs text-error"},Ry={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ty={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Py={class:"flex-1 text-sm"},Oy={class:"block"},Dy={class:"block text-[11px] text-base-content/50"},Ny={class:"flex items-baseline justify-between mb-1.5"},Iy={class:"text-xs text-base-content/50"},$y={class:"text-[10px] text-base-content/40"},Ly=["disabled"],Uy=["value"],Fy={class:"grid grid-cols-2 gap-3"},My={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},By=["value"],Hy={class:"flex items-baseline justify-between mb-2"},jy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50"},qy={key:0,class:"text-[10px] text-base-content/40"},Vy=["disabled"],Wy=["value"],zy={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},Ky={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},Qy={class:"flex-1 text-sm"},Gy={class:"block"},Yy={class:"block text-[11px] text-base-content/50"},Jy={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},Xy={class:"flex-1 text-sm"},Zy={class:"block"},eb={class:"block text-[11px] text-base-content/50"},tb={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},nb={class:"text-[11px] text-base-content/40 mb-2"},sb={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20 mb-2"},ob={class:"flex-1 text-sm"},rb={class:"block"},ib={class:"block text-[11px] text-base-content/50"},ab={key:0,class:"grid grid-cols-1 gap-2"},lb=["placeholder"],cb=["placeholder"],ub=["placeholder"],db=["placeholder"],fb=["placeholder"],pb={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},hb={class:"flex-1 text-sm"},mb={class:"block"},gb={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},yb={class:"flex items-start gap-3 rounded-xl border border-white/10 bg-base-100/85 px-3 py-2.5 cursor-pointer hover:border-white/20"},bb={class:"flex-1 text-sm"},vb={class:"block"},_b={class:"block text-[11px] text-base-content/50"},xb={class:"block text-xs font-semibold uppercase tracking-wider text-base-content/50 mb-2"},wb={class:"grid grid-cols-5 gap-1.5"},kb=["onClick"],Sb={class:"text-[11px] text-base-content/40 mt-1.5"},Eb={key:0,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-primary"},Ab={key:1,class:"surface rounded-xl p-3 flex items-center gap-2 text-sm text-error"},Cb={class:"flex items-center justify-end gap-2 px-6 py-4 border-t border-white/5"},Rb={for:"settings-modal",class:"btn btn-sm h-10 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 cursor-pointer"},Tb={class:"modal-backdrop",for:"settings-modal"},Qn={__name:"Settings",setup(e){const t=uu(),n=se(""),s=se(!1),o={cookies_file:"",cookies_from_browser:"",cookies_file_exists:!1,cookies_looks_authenticated:!1,cookies_auth_names:[],cookies_warnings:[]},r=me(()=>{var x,_;return String(((_=(x=t.settings.value)==null?void 0:x.youtube)==null?void 0:_.cookies_file)||"").trim()}),i=me(()=>{var x,_;return!!((_=(x=t.settings.value)==null?void 0:x.youtube)!=null&&_.cookies_file_exists)}),a=me(()=>{var x,_;return!!((_=(x=t.settings.value)==null?void 0:x.youtube)!=null&&_.cookies_looks_authenticated)}),{t:l,locale:d,setLocale:c,locales:p}=St(),h={enabled:!1,url:"",username:"",password:"",admin_username:"",admin_password:"",public_playlist:!1,scan_after_download:!0,scan_wait_seconds:120,scan_poll_seconds:30,client_name:"Downtify",api_version:"1.16.1"},g={enabled:!1,base_url:"",api_key:"",source_dir:"/slskd",leave_in_place:!0,timeout_seconds:20,search_retries:5,search_poll_seconds:15,download_attempts:3,poll_interval_seconds:5,poll_max_attempts:60,download_timeout_seconds:600,queued_timeout_seconds:180,extensions:["mp3","flac"],min_bitrate:256};Xn(()=>{var _;const x=(_=t.settings.value)==null?void 0:_.youtube;if(!x||typeof x!="object"){t.settings.value.youtube={...o};return}for(const[E,j]of Object.entries(o))(x[E]===void 0||x[E]===null)&&(x[E]=j)}),Xn(()=>{var _;const x=(_=t.settings.value)==null?void 0:_.slskd;if(!x||typeof x!="object"){t.settings.value.slskd={...g};return}for(const[E,j]of Object.entries(g))(x[E]===void 0||x[E]===null)&&(x[E]=j)}),Xn(()=>{var _;const x=(_=t.settings.value)==null?void 0:_.navidrome;if(!x||typeof x!="object"){t.settings.value.navidrome={...h};return}for(const[E,j]of Object.entries(h))(x[E]===void 0||x[E]===null)&&(x[E]=j)}),Xn(()=>{var x;((x=t.settings.value)==null?void 0:x.sync_navidrome)===void 0&&(t.settings.value.sync_navidrome=!0)}),Xn(()=>{var _;const x=(_=t.settings.value)==null?void 0:_.audio_providers;(!Array.isArray(x)||x.length===0)&&(t.settings.value.audio_providers=["youtube-music"])});async function b(x){var j,M,Q,N;const _=x.target,E=(j=_==null?void 0:_.files)==null?void 0:j[0];if(E){n.value="";try{const te=await be.uploadYoutubeCookies(E);te.status===200&&((M=te.data)!=null&&M.youtube)?t.settings.value.youtube={...t.settings.value.youtube,...te.data.youtube}:n.value=l("settings.saveError")}catch(te){const le=(N=(Q=te==null?void 0:te.response)==null?void 0:Q.data)==null?void 0:N.detail;n.value=typeof le=="string"&&le.trim()?le:l("settings.saveError")}finally{_&&(_.value="")}}}async function k(){var x,_,E;n.value="";try{const j=await be.clearYoutubeCookies();j.status===200&&((x=j.data)!=null&&x.youtube)&&(t.settings.value.youtube={...t.settings.value.youtube,...j.data.youtube})}catch(j){const M=(E=(_=j==null?void 0:j.response)==null?void 0:_.data)==null?void 0:E.detail;n.value=typeof M=="string"&&M.trim()?M:l("settings.saveError")}}function v(x){return x==="youtube-music"?"YouTube Music":x==="youtube"?"YouTube":x==="slskd"?"slskd":x}const R=["slskd","youtube-music","youtube"];function D(x){var E;return(((E=t.settings.value)==null?void 0:E.audio_providers)||[]).indexOf(x)}function C(x){const _=[...t.settings.value.audio_providers||[]],E=_.indexOf(x);E>=0?_.splice(E,1):_.push(x),t.settings.value.audio_providers=_.length>0?_:["youtube-music"]}function P(x,_){const E=[...t.settings.value.audio_providers||[]],j=x+_;j<0||j>=E.length||([E[x],E[j]]=[E[j],E[x]],t.settings.value.audio_providers=E)}function F(){var _,E;const x=!!((E=(_=t.settings.value)==null?void 0:_.slskd)!=null&&E.enabled);t.settings.value.audio_providers=x?[...R]:["youtube-music","youtube"]}return(x,_)=>(A(),O(fe,null,[_[25]||(_[25]=f("input",{type:"checkbox",id:"settings-modal",class:"modal-toggle"},null,-1)),f("div",wg,[f("div",kg,[f("div",Sg,[f("div",null,[f("h3",Eg,w(u(l)("settings.title")),1),f("p",Ag,w(u(l)("settings.subtitle")),1)]),f("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(l)("common.close")},[H(u(Y),{icon:"clarity:close-line",class:"h-5 w-5"})],8,Cg)]),f("div",Rg,[f("div",null,[f("label",Tg,w(u(l)("settings.language")),1),f("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",value:u(d),onChange:_[0]||(_[0]=E=>u(c)(E.target.value))},[(A(!0),O(fe,null,Ie(u(p),E=>(A(),O("option",{key:E.code,value:E.code},w(E.name),9,Og))),128))],40,Pg),f("p",Dg,w(u(l)("settings.languageHint")),1)]),f("div",null,[f("label",Ng,w(u(l)("settings.audioSource")),1),f("p",Ig,w(u(l)("settings.audioSourceHint")),1),f("div",$g,[(A(!0),O(fe,null,Ie(u(t).settingsOptions.audio_providers,E=>(A(),O("button",{key:E,type:"button",class:Ae(["rounded-xl border px-3 py-2 text-sm transition-colors text-left relative",[D(E)>=0?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:j=>C(E)},[D(E)>=0?(A(),O("span",Ug,w(D(E)+1),1)):ie("",!0),Ce(" "+w(v(E)),1)],10,Lg))),128))]),u(t).settings.value.audio_providers.length?(A(),O("ul",Fg,[(A(!0),O(fe,null,Ie(u(t).settings.value.audio_providers,(E,j)=>(A(),O("li",{key:E,class:"flex items-center gap-2 rounded-lg border border-white/10 px-2 py-1"},[f("span",Mg,w(j+1),1),f("span",Bg,w(v(E)),1),f("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:j===0,onClick:M=>P(j,-1)}," ↑ ",8,Hg),f("button",{type:"button",class:"btn btn-xs btn-ghost px-1 min-h-0 h-7",disabled:j===u(t).settings.value.audio_providers.length-1,onClick:M=>P(j,1)}," ↓ ",8,jg)]))),128))])):ie("",!0),f("button",{type:"button",class:"btn btn-xs btn-ghost rounded-lg mt-2",onClick:F},w(u(l)("settings.audioSourceReset")),1)]),f("div",null,[f("label",qg,w(u(l)("settings.slskdSection")),1),f("p",Vg,w(u(l)("settings.slskdHint")),1),f("label",Wg,[xe(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[1]||(_[1]=E=>u(t).settings.value.slskd.enabled=E)},null,512),[[qt,u(t).settings.value.slskd.enabled]]),f("span",zg,[f("span",Kg,w(u(l)("settings.slskdEnabled")),1),f("span",Qg,w(u(l)("settings.slskdEnabledHint")),1)])]),u(t).settings.value.slskd.enabled?(A(),O("div",Gg,[xe(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(l)("settings.slskdBaseUrl"),"onUpdate:modelValue":_[2]||(_[2]=E=>u(t).settings.value.slskd.base_url=E)},null,8,Yg),[[et,u(t).settings.value.slskd.base_url]]),xe(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(l)("settings.slskdApiKey"),"onUpdate:modelValue":_[3]||(_[3]=E=>u(t).settings.value.slskd.api_key=E)},null,8,Jg),[[et,u(t).settings.value.slskd.api_key]]),f("div",Xg,[f("p",Zg,w(u(l)("settings.slskdSourceDirTitle")),1),f("ul",ey,[f("li",null,w(u(l)("settings.slskdSourceDirBullet1")),1),f("li",null,w(u(l)("settings.slskdSourceDirBullet2")),1),f("li",null,w(u(l)("settings.slskdSourceDirBullet3")),1)]),f("pre",ty,w(u(l)("settings.slskdSourceDirExample")),1)]),f("label",ny,w(u(l)("settings.slskdSourceDirLabel")),1),xe(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 font-mono text-sm",type:"text",placeholder:u(l)("settings.slskdSourceDirPlaceholder"),"onUpdate:modelValue":_[4]||(_[4]=E=>u(t).settings.value.slskd.source_dir=E)},null,8,sy),[[et,u(t).settings.value.slskd.source_dir]]),f("p",oy,w(u(l)("settings.slskdSourceDirHint")),1),f("label",ry,[xe(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[5]||(_[5]=E=>u(t).settings.value.slskd.leave_in_place=E)},null,512),[[qt,u(t).settings.value.slskd.leave_in_place]]),f("span",null,[f("span",iy,w(u(l)("settings.slskdLeaveInPlace")),1),f("span",ay,w(u(l)("settings.slskdLeaveInPlaceHint")),1)])]),f("div",ly,[f("label",cy,[Ce(w(u(l)("settings.slskdDownloadTimeout"))+" ",1),xe(f("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"30",max:"3600","onUpdate:modelValue":_[6]||(_[6]=E=>u(t).settings.value.slskd.download_timeout_seconds=E)},null,512),[[et,u(t).settings.value.slskd.download_timeout_seconds,void 0,{number:!0}]])]),f("label",uy,[Ce(w(u(l)("settings.slskdQueuedTimeout"))+" ",1),xe(f("input",{class:"input input-sm w-full mt-1 rounded-xl bg-base-100/85 border border-white/10",type:"number",min:"15",max:"3600","onUpdate:modelValue":_[7]||(_[7]=E=>u(t).settings.value.slskd.queued_timeout_seconds=E)},null,512),[[et,u(t).settings.value.slskd.queued_timeout_seconds,void 0,{number:!0}]])])]),f("p",dy,w(u(l)("settings.slskdTimeoutHint")),1)])):ie("",!0)]),f("div",null,[f("label",fy,w(u(l)("settings.youtubeSection")),1),f("p",py,w(u(l)("settings.youtubeCookiesHint")),1),f("label",hy,[xe(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[8]||(_[8]=E=>s.value=E)},null,512),[[qt,s.value]]),f("span",my,[f("span",gy,w(u(l)("settings.youtubeEnabled")),1),f("span",yy,w(u(l)("settings.youtubeEnabledHint")),1),i.value&&a.value?(A(),O("span",by,w(u(l)("settings.youtubeCookiesReady")),1)):ie("",!0)])]),s.value?(A(),O("div",vy,[i.value&&!a.value?(A(),O("p",_y,w(u(l)("settings.youtubeCookiesWeak")),1)):r.value&&!i.value?(A(),O("p",xy,w(u(l)("settings.youtubeCookiesMissing")),1)):ie("",!0),f("label",wy,w(u(l)("settings.youtubeCookiesPath")),1),xe(f("input",{type:"text",class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 font-mono text-sm",placeholder:u(l)("settings.youtubeCookiesPathPlaceholder"),"onUpdate:modelValue":_[9]||(_[9]=E=>u(t).settings.value.youtube.cookies_file=E)},null,8,ky),[[et,u(t).settings.value.youtube.cookies_file]]),f("div",Sy,[f("label",Ey,[Ce(w(u(l)("settings.youtubeCookiesUpload"))+" ",1),f("input",{type:"file",accept:".txt,text/plain",class:"hidden",onChange:b},null,32)]),f("button",{type:"button",class:"btn btn-sm btn-ghost rounded-xl",disabled:!i.value&&!r.value,onClick:k},w(u(l)("settings.youtubeCookiesClear")),9,Ay)]),n.value?(A(),O("p",Cy,w(n.value),1)):ie("",!0)])):ie("",!0)]),f("div",null,[f("label",Ry,w(u(l)("settings.lyricsSource")),1),f("label",Ty,[xe(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[10]||(_[10]=E=>u(t).settings.value.download_lyrics=E)},null,512),[[qt,u(t).settings.value.download_lyrics]]),f("span",Py,[f("span",Oy,w(u(l)("settings.downloadLyrics")),1),f("span",Dy,w(u(l)("settings.downloadLyricsHint")),1)])]),f("div",Ny,[f("span",Iy,w(u(l)("settings.lyricsProvider")),1),f("span",$y,w(u(l)("settings.lyricsHint")),1)]),xe(f("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60 disabled:opacity-40","onUpdate:modelValue":_[11]||(_[11]=E=>u(t).settings.value.lyrics_providers[0]=E),disabled:!u(t).settings.value.download_lyrics},[(A(!0),O(fe,null,Ie(u(t).settingsOptions.lyrics_providers,E=>(A(),O("option",{key:E,value:E},w(E),9,Uy))),128))],8,Ly),[[Xs,u(t).settings.value.lyrics_providers[0]]])]),f("div",Fy,[f("div",null,[f("label",My,w(u(l)("settings.format")),1),xe(f("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":_[12]||(_[12]=E=>u(t).settings.value.format=E)},[(A(!0),O(fe,null,Ie(u(t).settingsOptions.format,E=>(A(),O("option",{key:E,value:E},w(E.toUpperCase()),9,By))),128))],512),[[Xs,u(t).settings.value.format]])]),f("div",null,[f("div",Hy,[f("label",jy,w(u(l)("settings.quality")),1),u(t).settings.value.format==="flac"?(A(),O("span",qy,w(u(l)("settings.qualityIgnored")),1)):ie("",!0)]),xe(f("select",{class:"select w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60","onUpdate:modelValue":_[13]||(_[13]=E=>u(t).settings.value.bitrate=E),disabled:u(t).settings.value.format==="flac"},[(A(!0),O(fe,null,Ie(u(t).settingsOptions.bitrate,E=>(A(),O("option",{key:E,value:E},w(E)+" kbps ",9,Wy))),128))],8,Vy),[[Xs,u(t).settings.value.bitrate]])])]),f("div",null,[f("label",zy,w(u(l)("settings.playlistsSection")),1),f("label",Ky,[xe(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[14]||(_[14]=E=>u(t).settings.value.generate_m3u=E)},null,512),[[qt,u(t).settings.value.generate_m3u]]),f("span",Qy,[f("span",Gy,w(u(l)("settings.generateM3u")),1),f("span",Yy,w(u(l)("settings.generateM3uHint")),1)])]),f("label",Jy,[xe(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[15]||(_[15]=E=>u(t).settings.value.sync_navidrome=E)},null,512),[[qt,u(t).settings.value.sync_navidrome]]),f("span",Xy,[f("span",Zy,w(u(l)("settings.syncNavidrome")),1),f("span",eb,w(u(l)("settings.syncNavidromeHint")),1)])])]),f("div",null,[f("label",tb,w(u(l)("settings.navidromeSection")),1),f("p",nb,w(u(l)("settings.navidromeHint")),1),f("label",sb,[xe(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[16]||(_[16]=E=>u(t).settings.value.navidrome.enabled=E)},null,512),[[qt,u(t).settings.value.navidrome.enabled]]),f("span",ob,[f("span",rb,w(u(l)("settings.navidromeEnabled")),1),f("span",ib,w(u(l)("settings.navidromeEnabledHint")),1)])]),u(t).settings.value.navidrome.enabled?(A(),O("div",ab,[xe(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(l)("settings.navidromeUrl"),"onUpdate:modelValue":_[17]||(_[17]=E=>u(t).settings.value.navidrome.url=E)},null,8,lb),[[et,u(t).settings.value.navidrome.url]]),xe(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(l)("settings.navidromeUsername"),"onUpdate:modelValue":_[18]||(_[18]=E=>u(t).settings.value.navidrome.username=E)},null,8,cb),[[et,u(t).settings.value.navidrome.username]]),xe(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(l)("settings.navidromePassword"),"onUpdate:modelValue":_[19]||(_[19]=E=>u(t).settings.value.navidrome.password=E)},null,8,ub),[[et,u(t).settings.value.navidrome.password]]),xe(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"text",placeholder:u(l)("settings.navidromeAdminUser"),"onUpdate:modelValue":_[20]||(_[20]=E=>u(t).settings.value.navidrome.admin_username=E)},null,8,db),[[et,u(t).settings.value.navidrome.admin_username]]),xe(f("input",{class:"input w-full rounded-xl bg-base-100/85 border border-white/10 focus:border-primary/60",type:"password",placeholder:u(l)("settings.navidromeAdminPassword"),"onUpdate:modelValue":_[21]||(_[21]=E=>u(t).settings.value.navidrome.admin_password=E)},null,8,fb),[[et,u(t).settings.value.navidrome.admin_password]]),f("label",pb,[xe(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[22]||(_[22]=E=>u(t).settings.value.navidrome.public_playlist=E)},null,512),[[qt,u(t).settings.value.navidrome.public_playlist]]),f("span",hb,[f("span",mb,w(u(l)("settings.navidromePublic")),1)])])])):ie("",!0)]),f("div",null,[f("label",gb,w(u(l)("settings.organizationSection")),1),f("label",yb,[xe(f("input",{type:"checkbox",class:"checkbox checkbox-sm checkbox-primary mt-0.5","onUpdate:modelValue":_[23]||(_[23]=E=>u(t).settings.value.organize_by_artist=E)},null,512),[[qt,u(t).settings.value.organize_by_artist]]),f("span",bb,[f("span",vb,w(u(l)("settings.organizeByArtist")),1),f("span",_b,w(u(l)("settings.organizeByArtistHint")),1)])])]),f("div",null,[f("label",xb,w(u(l)("settings.parallelDownloads")),1),f("div",wb,[(A(!0),O(fe,null,Ie(u(t).settingsOptions.max_parallel_downloads,E=>(A(),O("button",{key:E,type:"button",class:Ae(["rounded-xl border px-2 py-2 text-sm font-medium transition-colors text-center",[u(t).settings.value.max_parallel_downloads===E?"border-primary/50 bg-primary/10 text-primary":"border-white/10 hover:border-white/20 hover:bg-white/5"]]),onClick:j=>u(t).settings.value.max_parallel_downloads=E},w(E),11,kb))),128))]),f("p",Sb,w(u(l)("settings.parallelDownloadsHint")),1)]),H(Cc,{"enter-active-class":"transition duration-200","enter-from-class":"opacity-0 -translate-y-1","enter-to-class":"opacity-100 translate-y-0","leave-active-class":"transition duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:lo(()=>[u(t).isSaved.value===!0?(A(),O("div",Eb,[H(u(Y),{icon:"clarity:check-line",class:"h-4 w-4 shrink-0"}),Ce(" "+w(u(l)("settings.saved")),1)])):u(t).isSaved.value===!1?(A(),O("div",Ab,[H(u(Y),{icon:"clarity:exclamation-circle-line",class:"h-4 w-4 shrink-0"}),Ce(" "+w(u(t).saveErrorText.value||u(l)("settings.saveError")),1)])):ie("",!0)]),_:1})]),f("div",Cb,[f("label",Rb,w(u(l)("common.cancel")),1),f("button",{class:"btn btn-primary btn-sm h-10 px-6 rounded-full",onClick:_[24]||(_[24]=E=>u(t).saveSettings())},w(u(l)("common.save")),1)])]),f("label",Tb,w(u(l)("common.close")),1)])],64))}},Nt=se(""),Qa=se("light"),Ga=se("dark");function bi({useSystem:e=!0,initialTheme:t="",newLightAlias:n="",newDarkAlias:s=""}={}){function o(c){Qa.value=c,d()}function r(c){Ga.value=c,d()}function i(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function a(c){Nt.value=c,d()}function l(){Nt==="dark"?Nt.value="light":Nt==="light"&&(Nt.value="dark"),d()}function d(){document.documentElement.setAttribute("data-theme",Nt.value==="dark"?Ga.value:Qa.value)}return Nt.value!=="light"&&Nt.value!=="dark"&&(e&&a(i()),(t==="light"||t==="dark")&&(Nt.value=t)),n&&o(n),s&&r(s),d(),{currentTheme:Nt,setLightAlias:o,setDarkAlias:r,getSystemTheme:i,setTheme:a,switchTheme:l}}const Pb={class:"min-h-dvh flex flex-col text-base-content"},Ob={__name:"App",setup(e){const t=bi();return Zl(()=>{t.setLightAlias("downtify-light"),t.setDarkAlias("downtify-dark")}),(n,s)=>{const o=xr("router-view");return A(),O("div",Pb,[H(o,null,{default:lo(({Component:r,route:i})=>[H(Cc,{name:"page",mode:"out-in"},{default:lo(()=>[(A(),ct(Fd(r),{key:i.fullPath}))]),_:2},1024)]),_:1}),H(gp),H(Qn)])}}};/*! * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT - */const Pn=typeof document<"u";function du(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Cv(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&du(e.default)}const ge=Object.assign;function ar(e,t){const n={};for(const s in t){const o=t[s];n[s]=kt(o)?o.map(e):e(o)}return n}const hs=()=>{},kt=Array.isArray;function Ya(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}const fu=/#/g,Rv=/&/g,Tv=/\//g,Pv=/=/g,Ov=/\?/g,pu=/\+/g,Dv=/%5B/g,Nv=/%5D/g,hu=/%5E/g,Iv=/%60/g,mu=/%7B/g,$v=/%7C/g,gu=/%7D/g,Lv=/%20/g;function bi(e){return e==null?"":encodeURI(""+e).replace($v,"|").replace(Dv,"[").replace(Nv,"]")}function Fv(e){return bi(e).replace(mu,"{").replace(gu,"}").replace(hu,"^")}function Lr(e){return bi(e).replace(pu,"%2B").replace(Lv,"+").replace(fu,"%23").replace(Rv,"%26").replace(Iv,"`").replace(mu,"{").replace(gu,"}").replace(hu,"^")}function Uv(e){return Lr(e).replace(Pv,"%3D")}function Mv(e){return bi(e).replace(fu,"%23").replace(Ov,"%3F")}function Bv(e){return Mv(e).replace(Tv,"%2F")}function As(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const Hv=/\/$/,jv=e=>e.replace(Hv,"");function lr(e,t,n="/"){let s,o={},r="",i="";const a=t.indexOf("#");let l=t.indexOf("?");return l=a>=0&&l>a?-1:l,l>=0&&(s=t.slice(0,l),r=t.slice(l,a>0?a:t.length),o=e(r.slice(1))),a>=0&&(s=s||t.slice(0,a),i=t.slice(a,t.length)),s=zv(s??t,n),{fullPath:s+r+i,path:s,query:o,hash:As(i)}}function qv(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Ja(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Vv(e,t,n){const s=t.matched.length-1,o=n.matched.length-1;return s>-1&&s===o&&jn(t.matched[s],n.matched[o])&&yu(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function jn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function yu(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Wv(e[n],t[n]))return!1;return!0}function Wv(e,t){return kt(e)?Xa(e,t):kt(t)?Xa(t,e):(e==null?void 0:e.valueOf())===(t==null?void 0:t.valueOf())}function Xa(e,t){return kt(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function zv(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),o=s[s.length-1];(o===".."||o===".")&&s.push("");let r=n.length-1,i,a;for(i=0;i1&&r--;else break;return n.slice(0,r).join("/")+"/"+s.slice(i).join("/")}const nn={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Fr=function(e){return e.pop="pop",e.push="push",e}({}),cr=function(e){return e.back="back",e.forward="forward",e.unknown="",e}({});function Kv(e){if(!e)if(Pn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),jv(e)}const Qv=/^[^#]+#/;function Gv(e,t){return e.replace(Qv,"#")+t}function Yv(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Mo=()=>({left:window.scrollX,top:window.scrollY});function Jv(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Yv(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Za(e,t){return(history.state?history.state.position-t:-1)+e}const Ur=new Map;function Xv(e,t){Ur.set(e,t)}function Zv(e){const t=Ur.get(e);return Ur.delete(e),t}function eb(e){return typeof e=="string"||e&&typeof e=="object"}function vu(e){return typeof e=="string"||typeof e=="symbol"}let Re=function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e}({});const bu=Symbol("");Re.MATCHER_NOT_FOUND+"",Re.NAVIGATION_GUARD_REDIRECT+"",Re.NAVIGATION_ABORTED+"",Re.NAVIGATION_CANCELLED+"",Re.NAVIGATION_DUPLICATED+"";function qn(e,t){return ge(new Error,{type:e,[bu]:!0},t)}function qt(e,t){return e instanceof Error&&bu in e&&(t==null||!!(e.type&t))}const tb=["params","query","hash"];function nb(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of tb)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function sb(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;so&&Lr(o)):[s&&Lr(s)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function ob(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=kt(s)?s.map(o=>o==null?null:""+o):s==null?s:""+s)}return t}const rb=Symbol(""),tl=Symbol(""),Bo=Symbol(""),_i=Symbol(""),Mr=Symbol("");function os(){let e=[];function t(s){return e.push(s),()=>{const o=e.indexOf(s);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function rn(e,t,n,s,o,r=i=>i()){const i=s&&(s.enterCallbacks[o]=s.enterCallbacks[o]||[]);return()=>new Promise((a,l)=>{const d=h=>{h===!1?l(qn(Re.NAVIGATION_ABORTED,{from:n,to:t})):h instanceof Error?l(h):eb(h)?l(qn(Re.NAVIGATION_GUARD_REDIRECT,{from:t,to:h})):(i&&s.enterCallbacks[o]===i&&typeof h=="function"&&i.push(h),a())},c=r(()=>e.call(s&&s.instances[o],t,n,d));let p=Promise.resolve(c);e.length<3&&(p=p.then(d)),p.catch(h=>l(h))})}function ur(e,t,n,s,o=r=>r()){const r=[];for(const i of e)for(const a in i.components){let l=i.components[a];if(!(t!=="beforeRouteEnter"&&!i.instances[a]))if(du(l)){const d=(l.__vccOpts||l)[t];d&&r.push(rn(d,n,s,i,a,o))}else{let d=l();r.push(()=>d.then(c=>{if(!c)throw new Error(`Couldn't resolve component "${a}" at "${i.path}"`);const p=Cv(c)?c.default:c;i.mods[a]=c,i.components[a]=p;const h=(p.__vccOpts||p)[t];return h&&rn(h,n,s,i,a,o)()}))}}return r}function ib(e,t){const n=[],s=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let i=0;ijn(d,a))?s.push(a):n.push(a));const l=e.matched[i];l&&(t.matched.find(d=>jn(d,l))||o.push(l))}return[n,s,o]}/*! + */const Pn=typeof document<"u";function du(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Db(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&du(e.default)}const ge=Object.assign;function ar(e,t){const n={};for(const s in t){const o=t[s];n[s]=kt(o)?o.map(e):e(o)}return n}const hs=()=>{},kt=Array.isArray;function Ya(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}const fu=/#/g,Nb=/&/g,Ib=/\//g,$b=/=/g,Lb=/\?/g,pu=/\+/g,Ub=/%5B/g,Fb=/%5D/g,hu=/%5E/g,Mb=/%60/g,mu=/%7B/g,Bb=/%7C/g,gu=/%7D/g,Hb=/%20/g;function vi(e){return e==null?"":encodeURI(""+e).replace(Bb,"|").replace(Ub,"[").replace(Fb,"]")}function jb(e){return vi(e).replace(mu,"{").replace(gu,"}").replace(hu,"^")}function Lr(e){return vi(e).replace(pu,"%2B").replace(Hb,"+").replace(fu,"%23").replace(Nb,"%26").replace(Mb,"`").replace(mu,"{").replace(gu,"}").replace(hu,"^")}function qb(e){return Lr(e).replace($b,"%3D")}function Vb(e){return vi(e).replace(fu,"%23").replace(Lb,"%3F")}function Wb(e){return Vb(e).replace(Ib,"%2F")}function As(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const zb=/\/$/,Kb=e=>e.replace(zb,"");function lr(e,t,n="/"){let s,o={},r="",i="";const a=t.indexOf("#");let l=t.indexOf("?");return l=a>=0&&l>a?-1:l,l>=0&&(s=t.slice(0,l),r=t.slice(l,a>0?a:t.length),o=e(r.slice(1))),a>=0&&(s=s||t.slice(0,a),i=t.slice(a,t.length)),s=Jb(s??t,n),{fullPath:s+r+i,path:s,query:o,hash:As(i)}}function Qb(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Ja(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Gb(e,t,n){const s=t.matched.length-1,o=n.matched.length-1;return s>-1&&s===o&&jn(t.matched[s],n.matched[o])&&yu(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function jn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function yu(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Yb(e[n],t[n]))return!1;return!0}function Yb(e,t){return kt(e)?Xa(e,t):kt(t)?Xa(t,e):(e==null?void 0:e.valueOf())===(t==null?void 0:t.valueOf())}function Xa(e,t){return kt(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function Jb(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),o=s[s.length-1];(o===".."||o===".")&&s.push("");let r=n.length-1,i,a;for(i=0;i1&&r--;else break;return n.slice(0,r).join("/")+"/"+s.slice(i).join("/")}const nn={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Ur=function(e){return e.pop="pop",e.push="push",e}({}),cr=function(e){return e.back="back",e.forward="forward",e.unknown="",e}({});function Xb(e){if(!e)if(Pn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Kb(e)}const Zb=/^[^#]+#/;function ev(e,t){return e.replace(Zb,"#")+t}function tv(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Mo=()=>({left:window.scrollX,top:window.scrollY});function nv(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=tv(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Za(e,t){return(history.state?history.state.position-t:-1)+e}const Fr=new Map;function sv(e,t){Fr.set(e,t)}function ov(e){const t=Fr.get(e);return Fr.delete(e),t}function rv(e){return typeof e=="string"||e&&typeof e=="object"}function bu(e){return typeof e=="string"||typeof e=="symbol"}let Re=function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e}({});const vu=Symbol("");Re.MATCHER_NOT_FOUND+"",Re.NAVIGATION_GUARD_REDIRECT+"",Re.NAVIGATION_ABORTED+"",Re.NAVIGATION_CANCELLED+"",Re.NAVIGATION_DUPLICATED+"";function qn(e,t){return ge(new Error,{type:e,[vu]:!0},t)}function Vt(e,t){return e instanceof Error&&vu in e&&(t==null||!!(e.type&t))}const iv=["params","query","hash"];function av(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of iv)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function lv(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;so&&Lr(o)):[s&&Lr(s)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function cv(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=kt(s)?s.map(o=>o==null?null:""+o):s==null?s:""+s)}return t}const uv=Symbol(""),tl=Symbol(""),Bo=Symbol(""),_i=Symbol(""),Mr=Symbol("");function os(){let e=[];function t(s){return e.push(s),()=>{const o=e.indexOf(s);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function rn(e,t,n,s,o,r=i=>i()){const i=s&&(s.enterCallbacks[o]=s.enterCallbacks[o]||[]);return()=>new Promise((a,l)=>{const d=h=>{h===!1?l(qn(Re.NAVIGATION_ABORTED,{from:n,to:t})):h instanceof Error?l(h):rv(h)?l(qn(Re.NAVIGATION_GUARD_REDIRECT,{from:t,to:h})):(i&&s.enterCallbacks[o]===i&&typeof h=="function"&&i.push(h),a())},c=r(()=>e.call(s&&s.instances[o],t,n,d));let p=Promise.resolve(c);e.length<3&&(p=p.then(d)),p.catch(h=>l(h))})}function ur(e,t,n,s,o=r=>r()){const r=[];for(const i of e)for(const a in i.components){let l=i.components[a];if(!(t!=="beforeRouteEnter"&&!i.instances[a]))if(du(l)){const d=(l.__vccOpts||l)[t];d&&r.push(rn(d,n,s,i,a,o))}else{let d=l();r.push(()=>d.then(c=>{if(!c)throw new Error(`Couldn't resolve component "${a}" at "${i.path}"`);const p=Db(c)?c.default:c;i.mods[a]=c,i.components[a]=p;const h=(p.__vccOpts||p)[t];return h&&rn(h,n,s,i,a,o)()}))}}return r}function dv(e,t){const n=[],s=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let i=0;ijn(d,a))?s.push(a):n.push(a));const l=e.matched[i];l&&(t.matched.find(d=>jn(d,l))||o.push(l))}return[n,s,o]}/*! * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT - */let ab=()=>location.protocol+"//"+location.host;function _u(e,t){const{pathname:n,search:s,hash:o}=t,r=e.indexOf("#");if(r>-1){let i=o.includes(e.slice(r))?e.slice(r).length:1,a=o.slice(i);return a[0]!=="/"&&(a="/"+a),Ja(a,"")}return Ja(n,e)+s+o}function lb(e,t,n,s){let o=[],r=[],i=null;const a=({state:h})=>{const g=_u(e,location),v=n.value,k=t.value;let b=0;if(h){if(n.value=g,t.value=h,i&&i===v){i=null;return}b=k?h.position-k.position:0}else s(g);o.forEach(R=>{R(n.value,v,{delta:b,type:Fr.pop,direction:b?b>0?cr.forward:cr.back:cr.unknown})})};function l(){i=n.value}function d(h){o.push(h);const g=()=>{const v=o.indexOf(h);v>-1&&o.splice(v,1)};return r.push(g),g}function c(){if(document.visibilityState==="hidden"){const{history:h}=window;if(!h.state)return;h.replaceState(ge({},h.state,{scroll:Mo()}),"")}}function p(){for(const h of r)h();r=[],window.removeEventListener("popstate",a),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",a),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:l,listen:d,destroy:p}}function nl(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Mo():null}}function cb(e){const{history:t,location:n}=window,s={value:_u(e,n)},o={value:t.state};o.value||r(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(l,d,c){const p=e.indexOf("#"),h=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+l:ab()+e+l;try{t[c?"replaceState":"pushState"](d,"",h),o.value=d}catch(g){console.error(g),n[c?"replace":"assign"](h)}}function i(l,d){r(l,ge({},t.state,nl(o.value.back,l,o.value.forward,!0),d,{position:o.value.position}),!0),s.value=l}function a(l,d){const c=ge({},o.value,t.state,{forward:l,scroll:Mo()});r(c.current,c,!0),r(l,ge({},nl(s.value,l,null),{position:c.position+1},d),!1),s.value=l}return{location:s,state:o,push:a,replace:i}}function ub(e){e=Kv(e);const t=cb(e),n=lb(e,t.state,t.location,t.replace);function s(r,i=!0){i||n.pauseListeners(),history.go(r)}const o=ge({location:"",base:e,go:s,createHref:Gv.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let xn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Ne=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Ne||{});const db={type:xn.Static,value:""},fb=/[a-zA-Z0-9_]/;function pb(e){if(!e)return[[]];if(e==="/")return[[db]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${d}": ${g}`)}let n=Ne.Static,s=n;const o=[];let r;function i(){r&&o.push(r),r=[]}let a=0,l,d="",c="";function p(){d&&(n===Ne.Static?r.push({type:xn.Static,value:d}):n===Ne.Param||n===Ne.ParamRegExp||n===Ne.ParamRegExpEnd?(r.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),r.push({type:xn.Param,value:d,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),d="")}function h(){d+=l}for(;at.length?t.length===1&&t[0]===ze.Static+ze.Segment?1:-1:0}function xu(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const vb={strict:!1,end:!0,sensitive:!1};function bb(e,t,n){const s=gb(pb(e.path),n),o=ge(s,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function _b(e,t){const n=[],s=new Map;t=Ya(vb,t);function o(p){return s.get(p)}function r(p,h,g){const v=!g,k=il(p);k.aliasOf=g&&g.record;const b=Ya(t,p),R=[k];if("alias"in p){const P=typeof p.alias=="string"?[p.alias]:p.alias;for(const U of P)R.push(il(ge({},k,{components:g?g.record.components:k.components,path:U,aliasOf:g?g.record:k})))}let D,C;for(const P of R){const{path:U}=P;if(h&&U[0]!=="/"){const x=h.record.path,_=x[x.length-1]==="/"?"":"/";P.path=h.record.path+(U&&_+U)}if(D=bb(P,h,b),g?g.alias.push(D):(C=C||D,C!==D&&C.alias.push(D),v&&p.name&&!al(D)&&i(p.name)),wu(D)&&l(D),k.children){const x=k.children;for(let _=0;_{i(C)}:hs}function i(p){if(vu(p)){const h=s.get(p);h&&(s.delete(p),n.splice(n.indexOf(h),1),h.children.forEach(i),h.alias.forEach(i))}else{const h=n.indexOf(p);h>-1&&(n.splice(h,1),p.record.name&&s.delete(p.record.name),p.children.forEach(i),p.alias.forEach(i))}}function a(){return n}function l(p){const h=kb(p,n);n.splice(h,0,p),p.record.name&&!al(p)&&s.set(p.record.name,p)}function d(p,h){let g,v={},k,b;if("name"in p&&p.name){if(g=s.get(p.name),!g)throw qn(Re.MATCHER_NOT_FOUND,{location:p});b=g.record.name,v=ge(rl(h.params,g.keys.filter(C=>!C.optional).concat(g.parent?g.parent.keys.filter(C=>C.optional):[]).map(C=>C.name)),p.params&&rl(p.params,g.keys.map(C=>C.name))),k=g.stringify(v)}else if(p.path!=null)k=p.path,g=n.find(C=>C.re.test(k)),g&&(v=g.parse(k),b=g.record.name);else{if(g=h.name?s.get(h.name):n.find(C=>C.re.test(h.path)),!g)throw qn(Re.MATCHER_NOT_FOUND,{location:p,currentLocation:h});b=g.record.name,v=ge({},h.params,p.params),k=g.stringify(v)}const R=[];let D=g;for(;D;)R.unshift(D.record),D=D.parent;return{name:b,path:k,params:v,matched:R,meta:wb(R)}}e.forEach(p=>r(p));function c(){n.length=0,s.clear()}return{addRoute:r,resolve:d,removeRoute:i,clearRoutes:c,getRoutes:a,getRecordMatcher:o}}function rl(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function il(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:xb(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function xb(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function al(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function wb(e){return e.reduce((t,n)=>ge(t,n.meta),{})}function kb(e,t){let n=0,s=t.length;for(;n!==s;){const r=n+s>>1;xu(e,t[r])<0?s=r:n=r+1}const o=Sb(e);return o&&(s=t.lastIndexOf(o,s-1)),s}function Sb(e){let t=e;for(;t=t.parent;)if(wu(t)&&xu(e,t)===0)return t}function wu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function ll(e){const t=_t(Bo),n=_t(_i),s=me(()=>{const l=u(e.to);return t.resolve(l)}),o=me(()=>{const{matched:l}=s.value,{length:d}=l,c=l[d-1],p=n.matched;if(!c||!p.length)return-1;const h=p.findIndex(jn.bind(null,c));if(h>-1)return h;const g=cl(l[d-2]);return d>1&&cl(c)===g&&p[p.length-1].path!==g?p.findIndex(jn.bind(null,l[d-2])):h}),r=me(()=>o.value>-1&&Tb(n.params,s.value.params)),i=me(()=>o.value>-1&&o.value===n.matched.length-1&&yu(n.params,s.value.params));function a(l={}){if(Rb(l)){const d=t[u(e.replace)?"replace":"push"](u(e.to)).catch(hs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:me(()=>s.value.href),isActive:r,isExactActive:i,navigate:a}}function Eb(e){return e.length===1?e[0]:e}const Ab=si({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:ll,setup(e,{slots:t}){const n=Fn(ll(e)),{options:s}=_t(Bo),o=me(()=>({[ul(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ul(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const r=t.default&&Eb(t.default(n));return e.custom?r:xs("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}}),Cb=Ab;function Rb(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Tb(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!kt(o)||o.length!==s.length||s.some((r,i)=>r.valueOf()!==o[i].valueOf()))return!1}return!0}function cl(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ul=(e,t,n)=>e??t??n,Pb=si({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=_t(Mr),o=me(()=>e.route||s.value),r=_t(tl,0),i=me(()=>{let d=u(r);const{matched:c}=o.value;let p;for(;(p=c[d])&&!p.components;)d++;return d}),a=me(()=>o.value.matched[i.value]);Qs(tl,me(()=>i.value+1)),Qs(rb,a),Qs(Mr,o);const l=se();return Mt(()=>[l.value,a.value,e.name],([d,c,p],[h,g,v])=>{c&&(c.instances[p]=d,g&&g!==c&&d&&d===h&&(c.leaveGuards.size||(c.leaveGuards=g.leaveGuards),c.updateGuards.size||(c.updateGuards=g.updateGuards))),d&&c&&(!g||!jn(c,g)||!h)&&(c.enterCallbacks[p]||[]).forEach(k=>k(d))},{flush:"post"}),()=>{const d=o.value,c=e.name,p=a.value,h=p&&p.components[c];if(!h)return dl(n.default,{Component:h,route:d});const g=p.props[c],v=g?g===!0?d.params:typeof g=="function"?g(d):g:null,b=xs(h,ge({},v,t,{onVnodeUnmounted:R=>{R.component.isUnmounted&&(p.instances[c]=null)},ref:l}));return dl(n.default,{Component:b,route:d})||b}}});function dl(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Ob=Pb;function Db(e){const t=_b(e.routes,e),n=e.parseQuery||sb,s=e.stringifyQuery||el,o=e.history,r=os(),i=os(),a=os(),l=fd(nn);let d=nn;Pn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=ar.bind(null,L=>""+L),p=ar.bind(null,Bv),h=ar.bind(null,As);function g(L,G){let z,J;return vu(L)?(z=t.getRecordMatcher(L),J=G):J=L,t.addRoute(J,z)}function v(L){const G=t.getRecordMatcher(L);G&&t.removeRoute(G)}function k(){return t.getRoutes().map(L=>L.record)}function b(L){return!!t.getRecordMatcher(L)}function R(L,G){if(G=ge({},G||l.value),typeof L=="string"){const S=lr(n,L,G.path),I=t.resolve({path:S.path},G),F=o.createHref(S.fullPath);return ge(S,I,{params:h(I.params),hash:As(S.hash),redirectedFrom:void 0,href:F})}let z;if(L.path!=null)z=ge({},L,{path:lr(n,L.path,G.path).path});else{const S=ge({},L.params);for(const I in S)S[I]==null&&delete S[I];z=ge({},L,{params:p(S)}),G.params=p(G.params)}const J=t.resolve(z,G),ue=L.hash||"";J.params=c(h(J.params));const m=qv(s,ge({},L,{hash:Fv(ue),path:J.path})),y=o.createHref(m);return ge({fullPath:m,hash:ue,query:s===el?ob(L.query):L.query||{}},J,{redirectedFrom:void 0,href:y})}function D(L){return typeof L=="string"?lr(n,L,l.value.path):ge({},L)}function C(L,G){if(d!==L)return qn(Re.NAVIGATION_CANCELLED,{from:G,to:L})}function P(L){return _(L)}function U(L){return P(ge(D(L),{replace:!0}))}function x(L,G){const z=L.matched[L.matched.length-1];if(z&&z.redirect){const{redirect:J}=z;let ue=typeof J=="function"?J(L,G):J;return typeof ue=="string"&&(ue=ue.includes("?")||ue.includes("#")?ue=D(ue):{path:ue},ue.params={}),ge({query:L.query,hash:L.hash,params:ue.path!=null?{}:L.params},ue)}}function _(L,G){const z=d=R(L),J=l.value,ue=L.state,m=L.force,y=L.replace===!0,S=x(z,J);if(S)return _(ge(D(S),{state:typeof S=="object"?ge({},ue,S.state):ue,force:m,replace:y}),G||z);const I=z;I.redirectedFrom=G;let F;return!m&&Vv(s,J,z)&&(F=qn(Re.NAVIGATION_DUPLICATED,{to:I,from:J}),De(J,J,!0,!1)),(F?Promise.resolve(F):M(I,J)).catch($=>qt($)?qt($,Re.NAVIGATION_GUARD_REDIRECT)?$:At($):ae($,I,J)).then($=>{if($){if(qt($,Re.NAVIGATION_GUARD_REDIRECT))return _(ge({replace:y},D($.to),{state:typeof $.to=="object"?ge({},ue,$.to.state):ue,force:m}),G||I)}else $=N(I,J,!0,y,ue);return Q(I,J,$),$})}function E(L,G){const z=C(L,G);return z?Promise.reject(z):Promise.resolve()}function j(L){const G=gt.values().next().value;return G&&typeof G.runWithContext=="function"?G.runWithContext(L):L()}function M(L,G){let z;const[J,ue,m]=ib(L,G);z=ur(J.reverse(),"beforeRouteLeave",L,G);for(const S of J)S.leaveGuards.forEach(I=>{z.push(rn(I,L,G))});const y=E.bind(null,L,G);return z.push(y),dt(z).then(()=>{z=[];for(const S of r.list())z.push(rn(S,L,G));return z.push(y),dt(z)}).then(()=>{z=ur(ue,"beforeRouteUpdate",L,G);for(const S of ue)S.updateGuards.forEach(I=>{z.push(rn(I,L,G))});return z.push(y),dt(z)}).then(()=>{z=[];for(const S of m)if(S.beforeEnter)if(kt(S.beforeEnter))for(const I of S.beforeEnter)z.push(rn(I,L,G));else z.push(rn(S.beforeEnter,L,G));return z.push(y),dt(z)}).then(()=>(L.matched.forEach(S=>S.enterCallbacks={}),z=ur(m,"beforeRouteEnter",L,G,j),z.push(y),dt(z))).then(()=>{z=[];for(const S of i.list())z.push(rn(S,L,G));return z.push(y),dt(z)}).catch(S=>qt(S,Re.NAVIGATION_CANCELLED)?S:Promise.reject(S))}function Q(L,G,z){a.list().forEach(J=>j(()=>J(L,G,z)))}function N(L,G,z,J,ue){const m=C(L,G);if(m)return m;const y=G===nn,S=Pn?history.state:{};z&&(J||y?o.replace(L.fullPath,ge({scroll:y&&S&&S.scroll},ue)):o.push(L.fullPath,ue)),l.value=L,De(L,G,z,y),At()}let te;function le(){te||(te=o.listen((L,G,z)=>{if(!Rt.listening)return;const J=R(L),ue=x(J,Rt.currentRoute.value);if(ue){_(ge(ue,{replace:!0,force:!0}),J).catch(hs);return}d=J;const m=l.value;Pn&&Xv(Za(m.fullPath,z.delta),Mo()),M(J,m).catch(y=>qt(y,Re.NAVIGATION_ABORTED|Re.NAVIGATION_CANCELLED)?y:qt(y,Re.NAVIGATION_GUARD_REDIRECT)?(_(ge(D(y.to),{force:!0}),J).then(S=>{qt(S,Re.NAVIGATION_ABORTED|Re.NAVIGATION_DUPLICATED)&&!z.delta&&z.type===Fr.pop&&o.go(-1,!1)}).catch(hs),Promise.reject()):(z.delta&&o.go(-z.delta,!1),ae(y,J,m))).then(y=>{y=y||N(J,m,!1),y&&(z.delta&&!qt(y,Re.NAVIGATION_CANCELLED)?o.go(-z.delta,!1):z.type===Fr.pop&&qt(y,Re.NAVIGATION_ABORTED|Re.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),Q(J,m,y)}).catch(hs)}))}let Me=os(),ce=os(),pe;function ae(L,G,z){At(L);const J=ce.list();return J.length?J.forEach(ue=>ue(L,G,z)):console.error(L),Promise.reject(L)}function ut(){return pe&&l.value!==nn?Promise.resolve():new Promise((L,G)=>{Me.add([L,G])})}function At(L){return pe||(pe=!L,le(),Me.list().forEach(([G,z])=>L?z(L):G()),Me.reset()),L}function De(L,G,z,J){const{scrollBehavior:ue}=e;if(!Pn||!ue)return Promise.resolve();const m=!z&&Zv(Za(L.fullPath,0))||(J||!z)&&history.state&&history.state.scroll||null;return ei().then(()=>ue(L,G,m)).then(y=>y&&Jv(y)).catch(y=>ae(y,L,G))}const Oe=L=>o.go(L);let Ct;const gt=new Set,Rt={currentRoute:l,listening:!0,addRoute:g,removeRoute:v,clearRoutes:t.clearRoutes,hasRoute:b,getRoutes:k,resolve:R,options:e,push:P,replace:U,go:Oe,back:()=>Oe(-1),forward:()=>Oe(1),beforeEach:r.add,beforeResolve:i.add,afterEach:a.add,onError:ce.add,isReady:ut,install(L){L.component("RouterLink",Cb),L.component("RouterView",Ob),L.config.globalProperties.$router=Rt,Object.defineProperty(L.config.globalProperties,"$route",{enumerable:!0,get:()=>u(l)}),Pn&&!Ct&&l.value===nn&&(Ct=!0,P(o.location).catch(J=>{}));const G={};for(const J in nn)Object.defineProperty(G,J,{get:()=>l.value[J],enumerable:!0});L.provide(Bo,Rt),L.provide(_i,Ll(G)),L.provide(Mr,l);const z=L.unmount;gt.add(L),L.unmount=function(){gt.delete(L),gt.size<1&&(d=nn,te&&te(),te=null,l.value=nn,Ct=!1,pe=!1),z()}}};function dt(L){return L.reduce((G,z)=>G.then(()=>j(z)),Promise.resolve())}return Rt}function Nb(){return _t(Bo)}function ku(e){return _t(_i)}const xi="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='256'%20height='256'%20viewBox='0%200%2067.733332%2067.733333'%20version='1.1'%20id='svg1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3cdefs%20id='defs1'%20/%3e%3cg%20id='layer1'%3e%3cg%20style='fill:%23040000;fill-opacity:1'%20id='g1'%20transform='matrix(0.06566918,0,0,0.06566918,17.061212,17.059932)'%3e%3cg%20id='g2'%3e%3ccircle%20style='fill:%231ad35d;fill-opacity:1;stroke-width:0.472667'%20id='path2'%20cx='33.866665'%20cy='33.866665'%20r='21.644735'%20transform='matrix(23.824636,0,0,23.824636,-550.95013,-550.93064)'%20/%3e%3cpath%20d='M%20480.6,111.5%20H%20406.5%20V%2035.6%20c%200,-10.7%20-8.3,-19.6%20-19,-20.4%20-104,-7.5%20-200.4,-3.7%20-263,0.8%20-10.7,0.8%20-19,9.8%20-19,20.5%20v%2074.9%20H%2031.4%20c%20-10.9,0%20-20.9,8.8%20-20.6,22%2040.6,166%20230.9,361.7%20230.9,361.7%209.8,10.8%2025.6,4%2028.6,0%200,0%20177.1,-165.8%20230.3,-359.4%201.6,-5.8%20-0.5,-24.3%20-20,-24.2%20z'%20id='path1'%20style='fill:%23040000;fill-opacity:1'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",fl=se(""),dr=se(),rs=se(!1),Ws=se(!1),zs=se("");function Ho(){function e(o){return t(o)||n(o)}function t(o){return!(o===""||o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")||o.includes("://open.spotify.com/show/")||o.includes("://open.spotify.com/artist/"))}function n(o){return o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")}function s(o){console.log("Searching for:",o),dr.value=[],rs.value=!0,fl.value=o,Ws.value=!1,zs.value="",ve.search(o).then(r=>{console.log("Received Search Data:",r.data),r.status===200?(dr.value=r.data,rs.value=!1):(console.error("Error Searching:",r),rs.value=!1,Ws.value=!0,zs.value=r.toString())}).catch(r=>{console.error("Other Error Searching:",r.message),rs.value=!1,Ws.value=!0,zs.value=r.message})}return{searchTerm:fl,isSearching:rs,results:dr,error:Ws,errorValue:zs,searchFor:s,isValid:e,isValidSearch:t,isValidURL:n}}const yt={QUEUED:"In Queue",DOWNLOADING:"Downloading...",DOWNLOADED:"Done",ERROR:"Error"},Ke=se([]);class Su{constructor(t){this.song=t,this.web_status=yt.QUEUED,this.progress=0,this.message="",this.provider="",this.web_download_url=null,this.filename=null}setDownloading(){this.web_status=yt.DOWNLOADING}setDownloaded(){this.web_status=yt.DOWNLOADED}setError(){this.web_status=yt.ERROR}resetForRetry(){this.web_status=yt.QUEUED,this.progress=0,this.message="",this.provider="",this.web_download_url=null,this.filename=null}setWebURL(t){this.web_download_url=t}setFilename(t){this.filename=t}isQueued(){return this.web_status===yt.QUEUED}isDownloading(){return this.web_status===yt.DOWNLOADING}isDownloaded(){return this.web_status===yt.DOWNLOADED}isErrored(){return this.web_status===yt.ERROR}wsUpdate(t){this.progress=t.progress,this.message=t.message,t.provider&&(this.provider=t.provider)}}function $s(){function e(o){return Ke.value.findIndex(r=>r.song.song_id===o.song_id)}function t(o){let r=new Su(o);Ke.value.push(r)}function n(o){console.log("removing",o,o.song_id),Ke.value=Ke.value.filter(r=>r.song.song_id!==o.song_id),console.log(Ke.value)}function s(o){return e(o)===-1?null:Ke.value[e(o)]}return{appendSong:t,removeSong:n,getBySong:s,downloadQueue:Ke}}const Fe=$s();ve.ws_onmessage(e=>{let t=JSON.parse(e.data),n=Fe.getBySong(t.song);!n&&(Fe.appendSong(t.song),n=Fe.getBySong(t.song),!n)||(t.status==="done"?(n.progress=100,t.filename&&(n.setWebURL(ve.downloadFileURL(t.filename)),n.setFilename(t.filename)),n.setDownloaded()):t.status==="error"?(n.wsUpdate(t),n.setError()):t.status==="queued"?(n.web_status=yt.QUEUED,n.message=t.message||"",t.provider&&(n.provider=t.provider)):(n.wsUpdate(t),n.setDownloading()))});ve.ws_onerror(e=>{console.log("websocket error:",e)});async function Ib(){try{const t=(await ve.getQueue()).data||[];for(const n of t){if(Ke.value.some(o=>o.song.song_id===n.song.song_id))continue;const s=new Su(n.song);n.status==="done"?(s.setDownloaded(),n.filename&&(s.setWebURL(ve.downloadFileURL(n.filename)),s.setFilename(n.filename)),s.progress=100):n.status==="error"?(s.setError(),s.message=n.message||""):n.status==="downloading"?(s.setDownloading(),s.progress=n.progress||0,s.message=n.message||"",s.provider=n.provider||""):(s.web_status=yt.QUEUED,s.message=n.message||"",s.provider=n.provider||""),Ke.value.push(s)}}catch(e){console.log("Failed to load queue from server:",e)}}Ib();function wi(){const e=se(!1),t=uu();async function n(){Ke.value=Ke.value.filter(h=>!h.isDownloaded());try{await ve.clearCompletedQueue()}catch(h){console.log("Failed to clear completed queue on server:",h)}}function s(h){const g=(h||"").includes("://open.spotify.com/playlist/"),v=t.settings.value.generate_m3u!==!1;return e.value=!0,(g?n():Promise.resolve()).then(()=>ve.open(h)).then(b=>{if(console.log("Received Response:",b),b.status!==200){console.log("Error:",b);return}const R=b.data;if(Array.isArray(R)){for(const D of R)Fe.getBySong(D)||Fe.appendSong(D);return ve.downloadBatch({songs:R,playlist_url:g?h:"",generate_m3u:v}).catch(D=>{console.log("Batch submit failed:",D.message)})}else console.log("Opened Song:",R),r(R)}).catch(b=>{console.log("Other Error:",b.message)}).finally(()=>{e.value=!1})}function o(h){return console.log("Downloading",h),Fe.getBySong(h).setDownloading(),ve.download(h).then(g=>{if(console.log("Received Response:",g),g.status===200){let v=g.data;return console.log("Download Complete:",v),Fe.getBySong(h).setWebURL(ve.downloadFileURL(v)),Fe.getBySong(h).setFilename(v),Fe.getBySong(h).setDownloaded(),{song:h,filename:v}}else return console.log("Error:",g),Fe.getBySong(h).setError(),{song:h,filename:null}}).catch(g=>(console.log("Other Error:",g.message),Fe.getBySong(h).setError(),{song:h,filename:null}))}function r(h,g=!0){return Fe.appendSong(h),g?o(h):Promise.resolve({song:h,filename:null})}function i(h,g){const v={...h,youtube_id:g},k=Fe.getBySong(h);return k&&(k.song.youtube_id=g,k.setDownloading(),k.progress=0,k.message=""),ve.download(v).then(b=>{const R=Fe.getBySong(v);if(b.status===200){const D=b.data;return R&&(R.setWebURL(ve.downloadFileURL(D)),R.setFilename(D),R.setDownloaded()),{song:v,filename:D}}return R&&R.setError(),{song:v,filename:null}}).catch(b=>{console.error("retryWithAudio error:",b.message);const R=Fe.getBySong(v);return R&&R.setError(),{song:v,filename:null}})}function a(h){const g=String(h.song_id||h.url||"");Fe.removeSong(h),g&&ve.removeQueueItem(g).catch(()=>{})}async function l(){await ve.clearQueue(),Ke.value=[]}async function d(){await ve.clearCompletedQueue(),Ke.value=Ke.value.filter(h=>!h.isDownloaded())}function c(h){const g=Fe.getBySong(h);return g&&g.resetForRetry(),o(h)}function p(){const h=Ke.value.filter(g=>g.isErrored());for(const g of h)c(g.song);return h.length}return{fromURL:s,download:o,queue:r,retry:c,retryWithAudio:i,retryAllFailed:p,remove:a,clearAll:l,clearCompleted:d,loading:e}}const $b={class:"relative w-full"},Lb=["placeholder"],Fb=["disabled"],Br={__name:"SearchInput",props:{compact:{type:Boolean,default:!1}},setup(e){const t=Ho(),n=wi(),{t:s,locale:o}=St(),r=["https://open.spotify.com/track/4vfN00PlILRXy5dcXHQE9M","drugs - EDEN","Não Gosto Eu Amo - Henrique e Juliano","Perfect - Ed Sheeran","Lightning Crashes - Live"],i=se(0),a=me(()=>(o.value,i.value===0?s("search.placeholder"):r[i.value-1])),l=setInterval(()=>{i.value=(i.value+1)%(r.length+1)},5e3);oi(()=>clearInterval(l));function d(c){!c||!c.trim()||(t.isValidURL(c)?(n.fromURL(c),it.push({name:"Download"})):t.isValidSearch(c)&&it.push({name:"Search",params:{query:c}}))}return(c,p)=>(A(),O("div",$b,[Se(f("input",{type:"text",placeholder:a.value,class:Ce(["input-modern",e.compact?"h-11 text-sm":"h-14 text-base"]),"onUpdate:modelValue":p[0]||(p[0]=h=>u(t).searchTerm.value=h),onKeyup:p[1]||(p[1]=np(h=>d(u(t).searchTerm.value),["enter"]))},null,42,Lb),[[et,u(t).searchTerm.value]]),f("button",{class:Ce(["absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm transition hover:scale-105 active:scale-95 disabled:opacity-60",e.compact?"h-9 w-9":"h-11 w-11"]),disabled:u(n).loading.value,onClick:p[2]||(p[2]=h=>d(u(t).searchTerm.value))},[u(n).loading.value?(A(),O("span",{key:0,class:Ce(["loading loading-spinner",e.compact?"loading-xs":"loading-sm"])},null,2)):u(t).isValidURL(u(t).searchTerm.value)?(A(),ct(u(Y),{key:1,icon:"clarity:download-line",class:Ce(e.compact?"h-4 w-4":"h-5 w-5")},null,8,["class"])):(A(),O("svg",{key:2,xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"2",stroke:"currentColor",class:Ce(e.compact?"h-4 w-4":"h-5 w-5")},[...p[3]||(p[3]=[f("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"},null,-1)])],2))],10,Fb)]))}},Ub={class:"relative flex min-h-[calc(100dvh-4rem)] items-center justify-center px-6 pt-24 pb-16 overflow-hidden"},Mb={class:"relative w-full max-w-2xl text-center animate-slide-up"},Bb={class:"mt-3 flex items-center justify-center gap-2"},Hb={class:"badge-soft"},jb={class:"badge-neutral-soft"},qb={class:"mx-auto mt-5 max-w-md text-balance text-base sm:text-lg text-base-content/70"},Vb={class:"mt-10"},Wb={class:"mt-4 flex flex-wrap items-center justify-center gap-2 text-xs text-base-content/60"},zb={class:"pill bg-white/5 border border-white/10"},Kb={class:"pill bg-white/5 border border-white/10"},Qb={class:"pill bg-white/5 border border-white/10"},Gb={__name:"Hero",setup(e){const{t}=St(),n=se(localStorage.getItem("version")||"2.7.0");return Zt(()=>{const s=localStorage.getItem("version");s&&(n.value=s)}),(s,o)=>(A(),O("section",Ub,[o[4]||(o[4]=f("div",{"aria-hidden":"true",class:"pointer-events-none absolute inset-0 -z-10"},[f("div",{class:"absolute left-1/2 top-1/4 -translate-x-1/2 h-[420px] w-[420px] rounded-full bg-primary/25 blur-[120px]"}),f("div",{class:"absolute right-10 bottom-12 h-64 w-64 rounded-full bg-primary/10 blur-3xl"})],-1)),f("div",Mb,[o[3]||(o[3]=mf('

    Downtify

    ',2)),f("div",Bb,[f("span",Hb,"v"+w(n.value),1),f("span",jb,w(u(t)("hero.noAccount")),1)]),f("p",qb,w(u(t)("hero.tagline")),1),f("div",Vb,[H(Br,{class:"w-full"}),f("div",Wb,[f("span",zb,[o[0]||(o[0]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ae(" "+w(u(t)("hero.songs")),1)]),f("span",Kb,[o[1]||(o[1]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ae(" "+w(u(t)("hero.albums")),1)]),f("span",Qb,[o[2]||(o[2]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ae(" "+w(u(t)("hero.playlists")),1)])])])])]))}},Yb={class:"absolute top-0 inset-x-0 z-30"},Jb={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},Xb={class:"ml-auto flex items-center gap-1 sm:gap-2"},Zb=["title"],e_=["title"],t_=["title"],n_=["title"],s_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},o_=["title"],r_=["title"],i_={__name:"NavbarFront",setup(e){const t=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),n=$s(),{t:s}=St();return(o,r)=>(A(),O("header",Yb,[f("div",Jb,[r[5]||(r[5]=f("div",{class:"flex items-center gap-2"},[f("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"}),f("span",{class:"text-lg font-bold tracking-tight"},"Downtify")],-1)),f("div",Xb,[f("button",{class:"icon-btn",onClick:r[0]||(r[0]=i=>u(it).push({name:"List"})),title:u(s)("nav.library")},[H(u(Y),{icon:"clarity:library-line",class:"h-5 w-5"})],8,Zb),f("button",{class:"icon-btn",onClick:r[1]||(r[1]=i=>u(it).push({name:"Player"})),title:u(s)("nav.player")},[H(u(Y),{icon:"clarity:headphones-line",class:"h-5 w-5"})],8,e_),f("button",{class:"icon-btn",onClick:r[2]||(r[2]=i=>u(it).push({name:"Monitor"})),title:u(s)("nav.monitor")},[H(u(Y),{icon:"clarity:eye-line",class:"h-5 w-5"})],8,t_),f("button",{class:"icon-btn relative",onClick:r[3]||(r[3]=i=>u(it).push({name:"Download"})),title:u(s)("nav.queue")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"}),u(n).downloadQueue.value.length>0?(A(),O("span",s_,w(u(n).downloadQueue.value.length),1)):ie("",!0)],8,n_),f("button",{class:"icon-btn",onClick:r[4]||(r[4]=i=>u(t).setTheme(u(t).currentTheme.value==="dark"?"light":"dark")),title:u(t).currentTheme.value==="dark"?u(s)("nav.switchToLight"):u(s)("nav.switchToDark")},[u(t).currentTheme.value==="dark"?(A(),ct(u(Y),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(Y),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,o_),f("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(s)("nav.settings")},[H(u(Y),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,r_)])])]))}},Eu=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},a_={components:{NavbarFront:i_,Hero:Gb},setup(){return Zt(()=>{window.scroll(0,0)}),{}}};function l_(e,t,n,s,o,r){const i=xr("NavbarFront"),a=xr("Hero");return A(),O("div",null,[H(i),H(a)])}const c_=Eu(a_,[["render",l_]]),u_={class:"sticky top-0 z-30 glass-nav"},d_={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},f_=["title"],p_={class:"hidden md:flex flex-1 justify-center"},h_={class:"ml-auto flex items-center gap-1 sm:gap-2"},m_=["title"],g_=["title"],y_=["title"],v_=["title"],b_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},__=["title"],x_=["title"],w_={class:"md:hidden px-4 pb-3"},Ls={__name:"Navbar",setup(e){const t=ku(),n=vi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),s=$s(),o=Ho(),{t:r}=St();return(i,a)=>(A(),O("header",u_,[f("div",d_,[f("button",{class:"flex items-center gap-2 shrink-0",onClick:a[0]||(a[0]=l=>u(it).push({name:"Home"})),title:u(r)("nav.home")},[...a[6]||(a[6]=[f("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"},null,-1),f("span",{class:"hidden sm:inline text-lg font-bold tracking-tight"}," Downtify ",-1)])],8,f_),f("div",p_,[H(Br,{class:"w-full max-w-md",compact:!0})]),f("div",h_,[f("button",{class:Ce(["icon-btn",{"icon-btn-active":u(t).name==="List"}]),onClick:a[1]||(a[1]=l=>u(it).push({name:"List"})),title:u(r)("nav.library")},[H(u(Y),{icon:"clarity:library-line",class:"h-5 w-5"})],10,m_),f("button",{class:Ce(["icon-btn",{"icon-btn-active":u(t).name==="Player"}]),onClick:a[2]||(a[2]=l=>u(it).push({name:"Player"})),title:u(r)("nav.player")},[H(u(Y),{icon:"clarity:headphones-line",class:"h-5 w-5"})],10,g_),f("button",{class:Ce(["icon-btn",{"icon-btn-active":u(t).name==="Monitor"}]),onClick:a[3]||(a[3]=l=>u(it).push({name:"Monitor"})),title:u(r)("nav.monitor")},[H(u(Y),{icon:"clarity:eye-line",class:"h-5 w-5"})],10,y_),f("button",{class:Ce(["icon-btn relative",{"icon-btn-active":u(t).name==="Download"}]),onClick:a[4]||(a[4]=l=>u(t).name==="Download"?u(it).push({name:"Search",params:{query:u(o).searchTerm.value||" "}}):u(it).push({name:"Download"})),title:u(r)("nav.queue")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"}),u(s).downloadQueue.value.length>0?(A(),O("span",b_,w(u(s).downloadQueue.value.length),1)):ie("",!0)],10,v_),f("button",{class:"icon-btn",onClick:a[5]||(a[5]=l=>u(n).setTheme(u(n).currentTheme.value==="dark"?"light":"dark")),title:u(n).currentTheme.value==="dark"?u(r)("nav.switchToLight"):u(r)("nav.switchToDark")},[u(n).currentTheme.value==="dark"?(A(),ct(u(Y),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(Y),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,__),f("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(r)("nav.settings")},[H(u(Y),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,x_)])]),f("div",w_,[H(Br,{compact:!0})])]))}},k_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},S_={class:"mb-8"},E_={class:"text-2xl font-bold tracking-tight"},A_={class:"mt-1 text-sm text-base-content/60"},C_={class:"text-base-content/90 font-medium"},R_={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},T_={key:1,class:"space-y-3"},P_={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},O_={class:"text-base-content/50 text-sm"},D_={class:"text-base-content/40 text-xs mt-1"},N_={key:3,class:"space-y-2"},I_={class:"track-cover"},$_=["src","alt"],L_={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},F_={class:"flex-1 min-w-0"},U_={class:"flex items-center gap-2 mb-0.5"},M_={class:"font-semibold truncate"},B_={key:0,class:"badge-error-soft shrink-0"},H_={class:"text-xs text-base-content/70 truncate"},j_={key:0,class:"text-xs text-base-content/40 truncate"},q_={key:0,class:"text-base-content/30"},V_={class:"flex items-center gap-1 shrink-0"},W_=["href","title"],z_=["title"],K_=["onClick","title"],Q_={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},G_=["disabled","title"],Y_=["onClick"],J_=["disabled","title"],fr=5,X_={__name:"SearchList",props:["data","error"],emits:["download"],setup(e,{emit:t}){const n=e,s=t,o=Ho(),r=$s(),{t:i}=St(),a=se(1),l=me(()=>{var g;return Math.ceil((((g=n.data)==null?void 0:g.length)||0)/fr)}),d=me(()=>{if(!n.data)return[];const g=(a.value-1)*fr;return n.data.slice(g,g+fr)});Mt(()=>n.data,()=>{a.value=1});function c(g){return Array.isArray(g.artists)&&g.artists.length?g.artists.join(", "):g.artist||i("common.unknownArtist")}function p(g){const v=r.getBySong(g);return v?v.isErrored()?"error":(v.isDownloaded(),"queued"):"idle"}function h(g){s("download",g)}return(g,v)=>{var k;return A(),O("div",k_,[f("div",S_,[f("h1",E_,w(u(i)("search.title")),1),f("p",A_,[u(o).searchTerm.value?(A(),O(fe,{key:0},[Ae(w(u(i)("search.matchesFor"))+" ",1),f("span",C_,' "'+w(u(o).searchTerm.value)+'" ',1),!u(o).isSearching.value&&(((k=n.data)==null?void 0:k.length)||0)>0?(A(),O(fe,{key:0},[Ae(w(n.data.length===1?u(i)("search.songsCount",{count:n.data.length}):u(i)("search.songsCountPlural",{count:n.data.length})),1)],64)):ie("",!0)],64)):(A(),O(fe,{key:1},[Ae(w(u(i)("search.typeToBegin")),1)],64))])]),n.error?(A(),O("div",R_,[H(u(Y),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),f("span",null,w(u(o).errorValue.value?u(i)("search.errorWithDetail",{detail:u(o).errorValue.value}):u(i)("search.error")),1)])):ie("",!0),u(o).isSearching.value?(A(),O("div",T_,[(A(),O(fe,null,Ie(5,b=>f("div",{key:b,class:"skeleton h-24 rounded-2xl"})),64))])):!n.data||n.data.length===0?(A(),O("div",P_,[H(u(Y),{icon:"clarity:search-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",O_,w(u(i)("search.empty")),1),f("p",D_,w(u(i)("search.emptyHint")),1)])):(A(),O("ul",N_,[(A(!0),O(fe,null,Ie(d.value,(b,R)=>(A(),O("li",{key:b.song_id||R,class:"surface rounded-2xl track-card"},[f("div",I_,[b.cover_url?(A(),O("img",{key:0,src:b.cover_url,alt:b.name,class:"h-full w-full object-cover",loading:"lazy"},null,8,$_)):(A(),O("div",L_,[H(u(Y),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),f("div",F_,[f("div",U_,[f("span",M_,w(b.name),1),b.explicit?(A(),O("span",B_,"E")):ie("",!0)]),f("p",H_,w(c(b)),1),b.album_name?(A(),O("p",j_,[Ae(w(b.album_name)+" ",1),b.year?(A(),O("span",q_," · "+w(b.year),1)):ie("",!0)])):ie("",!0)]),f("div",V_,[b.url?(A(),O("a",{key:0,class:"icon-btn",href:b.url,target:"_blank",rel:"noopener",title:u(i)("search.openOnSpotify")},[H(u(Y),{icon:"clarity:pop-out-line",class:"h-4 w-4"})],8,W_)):ie("",!0),p(b)==="queued"?(A(),O("button",{key:1,class:"icon-btn text-primary cursor-default",title:u(i)("search.inQueue"),disabled:""},[H(u(Y),{icon:"clarity:check-circle-line",class:"h-5 w-5"})],8,z_)):(A(),O("button",{key:2,class:"icon-btn text-primary hover:bg-primary/10",onClick:D=>h(b),title:u(i)("search.download")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"})],8,K_))])]))),128))])),l.value>1?(A(),O("nav",Q_,[f("button",{class:"icon-btn",disabled:a.value===1,onClick:v[0]||(v[0]=b=>a.value--),title:u(i)("search.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,G_),(A(!0),O(fe,null,Ie(l.value,b=>(A(),O("button",{key:b,class:Ce(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",b===a.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:R=>a.value=b},w(b),11,Y_))),128)),f("button",{class:"icon-btn",disabled:a.value===l.value,onClick:v[1]||(v[1]=b=>a.value++),title:u(i)("search.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,J_)])):ie("",!0)])}}},Z_={class:"min-h-screen"},e0={__name:"Search",setup(e){Zt(()=>window.scroll(0,0));const t=ku(),n=Ho(),s=wi();return Mt(()=>t.params.query,()=>{t.params.query&&n.searchFor(t.params.query)},{deep:!0}),n.searchFor(t.params.query),(o,r)=>(A(),O("div",Z_,[H(Ls),H(Qn),H(X_,{data:u(n).results.value,error:u(n).error.value,onDownload:r[0]||(r[0]=i=>u(s).queue(i))},null,8,["data","error"])]))}},t0={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},n0={class:"mb-6 flex flex-wrap items-end justify-between gap-4"},s0={class:"text-2xl font-bold tracking-tight"},o0={class:"mt-1 text-sm text-base-content/60"},r0={key:0,class:"flex flex-wrap gap-2 justify-end"},i0=["title"],a0={key:0,class:"mb-6 flex flex-wrap gap-2",role:"tablist"},l0=["onClick"],c0={key:0,class:"ml-1 opacity-80 tabular-nums"},u0={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},d0={class:"text-base-content/50 text-sm"},f0={class:"text-base-content/40 text-xs mt-1"},p0={key:2,class:"surface rounded-2xl p-8 text-center text-sm text-base-content/50"},h0={key:3,class:"space-y-3"},m0={class:"flex items-center gap-4"},g0={class:"track-cover h-16 w-16 sm:h-20 sm:w-20 shrink-0"},y0=["src","alt"],v0={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},b0={class:"flex-1 min-w-0"},_0={class:"flex items-center gap-2 mb-0.5 flex-wrap"},x0={class:"font-semibold truncate"},w0={key:0,class:"badge badge-xs badge-outline opacity-80 shrink-0"},k0={class:"text-xs text-base-content/60 truncate"},S0={key:0,class:"text-xs text-base-content/50 mt-0.5 line-clamp-2"},E0={key:1,class:"text-xs text-base-content/40 truncate"},A0={key:2,class:"text-xs text-error/80 mt-1 line-clamp-2"},C0={class:"flex items-center gap-2 shrink-0"},R0=["title","onClick"],T0=["onClick","title"],P0={class:"text-[10px] font-semibold"},O0=["onClick","title"],D0={key:0,class:"mt-3 pt-3 border-t border-white/10 flex flex-wrap gap-2 items-center"},N0=["onUpdate:modelValue","placeholder"],I0=["onClick"],$0=["onClick"],L0=["onClick"],F0={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},U0=["disabled","title"],M0=["onClick"],B0=["disabled","title"],pr=10,H0={__name:"DownloadList",setup(e){const t=$s(),n=wi(),{t:s}=St(),o=se("active"),r=se(1),i=Fn({}),a=Fn({});function l(M){return M.isErrored()?"failed":M.isDownloaded()?"done":M.isQueued()?"queued":"active"}const d=me(()=>t.downloadQueue.value.filter(M=>l(M)==="done").length),c=me(()=>t.downloadQueue.value.filter(M=>l(M)==="failed").length),p=me(()=>t.downloadQueue.value.filter(M=>l(M)==="active").length),h=me(()=>[{id:"active",label:s("queue.filterActive"),count:p.value},{id:"queued",label:s("queue.filterQueued"),count:t.downloadQueue.value.filter(M=>l(M)==="queued").length},{id:"all",label:s("queue.filterAll"),count:t.downloadQueue.value.length},{id:"done",label:s("queue.filterDone"),count:d.value},{id:"failed",label:s("queue.filterFailed"),count:c.value}]),g=me(()=>{const M=t.downloadQueue.value;switch(o.value){case"all":return M;case"active":return M.filter(Q=>l(Q)==="active");case"queued":return M.filter(Q=>l(Q)==="queued");case"done":return M.filter(Q=>l(Q)==="done");case"failed":return M.filter(Q=>l(Q)==="failed");default:return M}}),v=me(()=>Math.ceil(g.value.length/pr)),k=me(()=>{const M=(r.value-1)*pr;return g.value.slice(M,M+pr)});Mt(o,()=>{r.value=1}),Mt(()=>g.value.length,()=>{r.value>v.value&&v.value>0&&(r.value=v.value),r.value<1&&(r.value=1)}),Mt(()=>t.downloadQueue.value.length,M=>{M===0?o.value="active":o.value==="active"&&p.value===0&&c.value>0&&(o.value="failed")});async function b(){confirm(s("queue.clearAllPrompt"))&&await n.clearAll()}async function R(){await n.clearCompleted()}function D(){n.retryAllFailed()}function C(M){return Array.isArray(M.artists)&&M.artists.length?M.artists.join(", "):M.artist||s("common.unknownArtist")}function P(M){return M.isErrored()?"badge-error-soft":M.isDownloaded()||l(M)==="active"?"badge-soft":"badge-neutral-soft"}function U(M){const Q=l(M);return Q==="active"&&M.message?s("queue.statusActive"):M.isErrored()?s("queue.statusFailed"):M.isDownloaded()?s("queue.statusDone"):s(Q==="active"?"queue.statusActive":"queue.statusQueued")}function x(M){const Q=String(M.provider||"").trim();return Q==="youtube-music"?"YouTube Music":Q==="youtube"?"YouTube":Q==="slskd"?"slskd":""}function _(M){const Q=String(M||"").match(/(?:v=|youtu\.be\/)([A-Za-z0-9_-]{6,})/);return Q?Q[1]:null}function E(M){const Q=M.song.song_id,N=_(a[Q]);if(!N){alert(s("queue.invalidYouTubeURL"));return}i[Q]=!1,n.retryWithAudio(M.song,N)}function j(M){const Q=document.createElement("a");Q.href=M,Q.download=ve.downloadSaveName(M),document.body.appendChild(Q),Q.click(),document.body.removeChild(Q)}return(M,Q)=>(A(),O("div",t0,[f("div",n0,[f("div",null,[f("h1",s0,w(u(s)("queue.title")),1),f("p",o0,w(u(s)("queue.subtitle")),1)]),u(t).downloadQueue.value.length>0?(A(),O("div",r0,[c.value>0?(A(),O("button",{key:0,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:D},[H(u(Y),{icon:"clarity:refresh-line",class:"h-4 w-4 mr-1.5"}),Ae(" "+w(u(s)("queue.retryAllFailed",{count:c.value})),1)])):ie("",!0),d.value>0?(A(),O("button",{key:1,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:R},w(u(s)("queue.clearCompleted",{count:d.value})),1)):ie("",!0),f("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 text-error/70 hover:text-error",onClick:b,title:u(s)("queue.clearAll")},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4 mr-1.5"}),Ae(" "+w(u(s)("queue.clearAll")),1)],8,i0)])):ie("",!0)]),u(t).downloadQueue.value.length>0?(A(),O("div",a0,[(A(!0),O(fe,null,Ie(h.value,N=>(A(),O("button",{key:N.id,type:"button",class:Ce(["btn btn-sm rounded-full border-white/10",o.value===N.id?"btn-primary":"bg-base-100/85 hover:bg-base-100"]),onClick:te=>o.value=N.id},[Ae(w(N.label)+" ",1),N.count>0?(A(),O("span",c0,"("+w(N.count)+")",1)):ie("",!0)],10,l0))),128))])):ie("",!0),u(t).downloadQueue.value.length===0?(A(),O("div",u0,[H(u(Y),{icon:"clarity:download-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",d0,w(u(s)("queue.empty")),1),f("p",f0,w(u(s)("queue.emptyHint")),1)])):g.value.length===0?(A(),O("div",p0,w(u(s)("queue.emptyFilter")),1)):(A(),O("ul",h0,[(A(!0),O(fe,null,Ie(k.value,(N,te)=>(A(),O("li",{key:N.song.song_id||N.song.url||te,class:"surface rounded-2xl p-3 sm:p-4"},[f("div",m0,[f("div",g0,[N.song.cover_url?(A(),O("img",{key:0,src:N.song.cover_url,alt:N.song.name,class:"h-full w-full object-cover"},null,8,y0)):(A(),O("div",v0,[H(u(Y),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),f("div",b0,[f("div",_0,[f("span",x0,w(N.song.name),1),x(N)?(A(),O("span",w0,w(x(N)),1)):ie("",!0),f("span",{class:Ce([P(N),"shrink-0"])},w(U(N)),3)]),f("p",k0,w(C(N.song)),1),l(N)==="active"&&N.message?(A(),O("p",S0,w(N.message),1)):ie("",!0),N.song.album_name?(A(),O("p",E0,w(N.song.album_name),1)):ie("",!0),N.isErrored()&&N.message?(A(),O("p",A0,w(N.message),1)):ie("",!0)]),f("div",C0,[N.isErrored()?(A(),O("button",{key:0,class:"icon-btn text-primary hover:bg-primary/10",title:u(s)("queue.retry"),onClick:le=>u(n).retry(N.song)},[H(u(Y),{icon:"clarity:refresh-line",class:"h-4 w-4"})],8,R0)):ie("",!0),N.isDownloaded()?(A(),O("a",{key:1,class:"icon-btn text-primary hover:bg-primary/10",href:"javascript:;",onClick:le=>j(N.web_download_url),title:u(s)("queue.saveToDevice")},[H(u(Y),{icon:"clarity:download-line",class:"h-4 w-4"})],8,T0)):l(N)==="active"?(A(),O("div",{key:2,class:"radial-progress text-primary",style:Ln(`--value:${Math.max(0,N.progress)}; --size:2.75rem; --thickness:3px`)},[f("span",P0,w(Math.round(N.progress))+"% ",1)],4)):ie("",!0),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",onClick:le=>u(n).remove(N.song),title:u(s)("queue.removeFromQueue")},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,O0)])]),N.isErrored()&&i[N.song.song_id]?(A(),O("div",D0,[Se(f("input",{"onUpdate:modelValue":le=>a[N.song.song_id]=le,type:"text",class:"input input-sm flex-1 min-w-[12rem] rounded-xl bg-base-100/80",placeholder:u(s)("queue.overridePlaceholder")},null,8,N0),[[et,a[N.song.song_id]]]),f("button",{class:"btn btn-sm btn-primary rounded-full",onClick:le=>E(N)},w(u(s)("queue.applyOverride")),9,I0),f("button",{class:"btn btn-sm btn-ghost rounded-full",onClick:le=>i[N.song.song_id]=!1},w(u(s)("common.cancel")),9,$0)])):N.isErrored()?(A(),O("button",{key:1,type:"button",class:"mt-2 text-xs text-primary/80 hover:text-primary",onClick:le=>i[N.song.song_id]=!0},w(u(s)("queue.forceAudio")),9,L0)):ie("",!0)]))),128))])),v.value>1?(A(),O("nav",F0,[f("button",{class:"icon-btn",disabled:r.value===1,onClick:Q[0]||(Q[0]=N=>r.value--),title:u(s)("common.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,U0),(A(!0),O(fe,null,Ie(v.value,N=>(A(),O("button",{key:N,class:Ce(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",N===r.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:te=>r.value=N},w(N),11,M0))),128)),f("button",{class:"icon-btn",disabled:r.value===v.value,onClick:Q[1]||(Q[1]=N=>r.value++),title:u(s)("common.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,B0)])):ie("",!0)]))}},j0={class:"min-h-screen"},q0={__name:"Download",setup(e){return Zt(()=>window.scroll(0,0)),(t,n)=>(A(),O("div",j0,[H(Ls),H(Qn),H(H0)]))}},Au="downtify-player-volume",Ve=se([]),ot=se(-1),vo=se(!1),Fs=se(0),un=se(0),ki=se(parseFloat(localStorage.getItem(Au)||"0.85")),$n=se(!1),Gn=se("off"),dn=se(!1);let xe=null,vt=[],jo=0;function qo(){return xe||(xe=new Audio,xe.preload="metadata",xe.volume=ki.value,xe.addEventListener("timeupdate",()=>{Fs.value=xe.currentTime}),xe.addEventListener("loadedmetadata",()=>{un.value=isFinite(xe.duration)?xe.duration:0}),xe.addEventListener("durationchange",()=>{un.value=isFinite(xe.duration)?xe.duration:0}),xe.addEventListener("ended",X0),xe.addEventListener("play",()=>{vo.value=!0}),xe.addEventListener("pause",()=>{vo.value=!1}),xe)}function Hr(e){const t=e.replace(/\.[^.]+$/,"");let n="",s=t;const o=t.indexOf(" - ");return o>0&&(n=t.slice(0,o).trim(),s=t.slice(o+3).trim()),{file:e,url:ve.downloadFileURL(e),cover:ve.coverFileURL(e),title:s,artist:n,album:""}}function Si(e){if(typeof e=="string")return Hr(e);const t=String((e==null?void 0:e.file)||""),n=Hr(t),s=String((e==null?void 0:e.title)||"").trim(),o=String((e==null?void 0:e.artist)||"").trim(),r=String((e==null?void 0:e.album)||"").trim();return{file:t,url:n.url,cover:n.cover,title:s||n.title,artist:o||n.artist,album:r||n.album}}function Us(){const e=Ve.value.map((t,n)=>n);for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}vt=e,jo=ot.value>=0?Math.max(0,vt.indexOf(ot.value)):0}function V0(e,t={}){const n=(e||[]).map(s=>typeof s=="string"?Hr(s):Si(s));Ve.value=n,ot.value>=n.length&&(ot.value=-1),dn.value&&Us(),typeof t.startIndex=="number"?Vn(t.startIndex):t.autoplay&&n.length>0&&ot.value<0&&Vn(0)}function Vn(e){if(e<0||e>=Ve.value.length)return;const t=qo();if(ot.value=e,dn.value){vt.length!==Ve.value.length&&Us();const n=vt.indexOf(e);n>=0&&(jo=n)}t.src=Ve.value[e].url,t.currentTime=0,Fs.value=0,t.play().catch(()=>{})}function Cu(){if(Ve.value.length===0)return;const e=qo();if(ot.value<0){Vn(0);return}e.src||(e.src=Ve.value[ot.value].url),e.play().catch(()=>{})}function Ei(){xe&&xe.pause()}function W0(){vo.value?Ei():Cu()}function Vo(e){const t=qo(),n=un.value||0,s=Math.max(0,Math.min(n,e));t.currentTime=s,Fs.value=s}function z0(e){un.value&&Vo(un.value*Math.max(0,Math.min(1,e)))}function K0(e){const t=Math.max(0,Math.min(1,e));ki.value=t,xe&&(xe.volume=t);try{localStorage.setItem(Au,String(t))}catch{}t>0&&$n.value&&($n.value=!1,xe&&(xe.muted=!1))}function Q0(){$n.value=!$n.value,xe&&(xe.muted=$n.value)}function G0(){if(Ve.value.length===0)return-1;if(dn.value){vt.length!==Ve.value.length&&Us();const t=(jo+1)%vt.length;return vt[t]}const e=ot.value+1;return e>=Ve.value.length?Gn.value==="all"?0:-1:e}function Y0(){if(Ve.value.length===0)return-1;if(dn.value){vt.length!==Ve.value.length&&Us();const t=(jo-1+vt.length)%vt.length;return vt[t]}const e=ot.value-1;return e<0?Gn.value==="all"?Ve.value.length-1:0:e}function Ru(){const e=G0();if(e<0){Ei();return}Vn(e)}function J0(){if(qo().currentTime>3){Vo(0);return}const t=Y0();t<0||Vn(t)}function X0(){if(Gn.value==="one"){Vo(0),xe&&xe.play().catch(()=>{});return}Ru()}function Tu(e){["off","all","one"].includes(e)&&(Gn.value=e)}function Z0(){const e=["off","all","one"],t=e.indexOf(Gn.value);Tu(e[(t+1)%e.length])}function Pu(e){dn.value=!!e,dn.value&&Us()}function ex(){Pu(!dn.value)}const tx=me(()=>ot.value>=0&&ot.valueun.value>0?Fs.value/un.value*100:0);function pl(e){if(!isFinite(e)||e<0)return"0:00";const t=Math.floor(e),n=Math.floor(t/60),s=t%60;return`${n}:${s.toString().padStart(2,"0")}`}function Ou(){return{playlist:Ve,currentIndex:ot,currentTrack:tx,isPlaying:vo,currentTime:Fs,duration:un,progressPct:nx,volume:ki,isMuted:$n,repeatMode:Gn,shuffle:dn,setPlaylist:V0,playAt:Vn,play:Cu,pause:Ei,toggle:W0,seek:Vo,seekRatio:z0,setVolume:K0,toggleMute:Q0,next:Ru,prev:J0,setRepeat:Tu,cycleRepeat:Z0,setShuffle:Pu,toggleShuffle:ex}}const sx={class:"min-h-screen"},ox={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},rx={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},ix={class:"text-2xl font-bold tracking-tight"},ax={class:"mt-1 text-sm text-base-content/60"},lx={class:"flex items-center gap-2"},cx=["title"],ux=["disabled"],dx={key:0,class:"loading loading-spinner loading-xs mr-2"},fx={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},px={key:1,class:"space-y-3"},hx={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},mx={class:"text-base-content/50 text-sm"},gx={class:"text-base-content/40 text-xs mt-1"},yx={key:3,class:"space-y-2"},vx={class:"relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden"},bx=["src","alt","onError"],_x={class:"flex-1 min-w-0"},xx={class:"text-sm font-medium truncate block"},wx={key:0,class:"text-xs text-base-content/60 truncate"},kx={class:"text-xs text-base-content/40"},Sx={key:0,class:"mr-2 text-primary/70"},Ex={class:"flex items-center gap-1 shrink-0"},Ax=["onClick","title"],Cx=["href","download","title"],Rx=["disabled","onClick","title"],Tx={key:0,class:"loading loading-spinner loading-xs"},Px={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},Ox=["disabled","title"],Dx=["onClick"],Nx=["disabled","title"],Ix={key:5,class:"mt-6 text-xs text-base-content/40 text-center"},hr=10,$x={__name:"Downloads",setup(e){const{t}=St(),n=Ou(),s=Nb(),o=se([]),r=se(!1),i=se(""),a=se({}),l=se({}),d=se(1),c=me(()=>Math.ceil(o.value.length/hr)),p=me(()=>{const P=(d.value-1)*hr;return o.value.slice(P,P+hr)});Mt(o,()=>{d.value=1});function h(P){return ve.coverFileURL(P)}function g(P){l.value={...l.value,[P]:!0}}async function v(){r.value=!0,i.value="";try{const P=await ve.listDownloads();o.value=(P.data||[]).map(Si)}catch{i.value=t("library.failedLoad")}finally{r.value=!1}}async function k(P){if(confirm(t("library.deletePrompt",{file:P}))){a.value={...a.value,[P]:!0};try{await ve.deleteDownload(P),o.value=o.value.filter(U=>U!==P)}catch{i.value=t("library.failedDelete",{file:P})}finally{a.value={...a.value,[P]:!1}}}}function b(P){const U=P.lastIndexOf(".");return U>0?P.slice(U+1).toUpperCase():""}function R(P){const U=P.lastIndexOf("/");return U>=0?P.slice(0,U):""}function D(P){const U=o.value.findIndex(x=>x.file===P.file);U<0||(n.setPlaylist(o.value,{startIndex:U}),s.push({name:"Player"}))}function C(){o.value.length&&(n.setPlaylist(o.value,{startIndex:0}),s.push({name:"Player"}))}return Zt(v),(P,U)=>(A(),O("div",sx,[H(Ls),H(Qn),f("div",ox,[f("div",rx,[f("div",null,[f("h1",ix,w(u(t)("library.title")),1),f("p",ax,w(u(t)("library.subtitle")),1)]),f("div",lx,[o.value.length>0?(A(),O("button",{key:0,class:"btn btn-primary btn-sm h-11 px-5 rounded-full",onClick:C,title:u(t)("library.play")},[H(u(Y),{icon:"clarity:play-line",class:"h-4 w-4 mr-1.5"}),Ae(" "+w(u(t)("library.play")),1)],8,cx)):ie("",!0),f("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:v,disabled:r.value},[r.value?(A(),O("span",dx)):(A(),ct(u(Y),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4 mr-2"})),Ae(" "+w(u(t)("common.refresh")),1)],8,ux)])]),i.value?(A(),O("div",fx,[H(u(Y),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),f("span",null,w(i.value),1)])):ie("",!0),r.value&&o.value.length===0?(A(),O("div",px,[(A(),O(fe,null,Ie(4,x=>f("div",{key:x,class:"skeleton h-16 rounded-2xl"})),64))])):o.value.length===0?(A(),O("div",hx,[H(u(Y),{icon:"clarity:library-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",mx,w(u(t)("library.empty")),1),f("p",gx,w(u(t)("library.emptyHint")),1)])):(A(),O("ul",yx,[(A(!0),O(fe,null,Ie(p.value,x=>(A(),O("li",{key:x.file,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-3"},[f("div",vx,[l.value[x.file]?(A(),ct(u(Y),{key:1,icon:"clarity:music-note-line",class:"h-5 w-5"})):(A(),O("img",{key:0,src:h(x.file),alt:x.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:_=>g(x.file)},null,40,bx))]),f("div",_x,[f("span",xx,w(x.title),1),x.artist?(A(),O("p",wx,w(x.artist),1)):ie("",!0),f("span",kx,[R(x.file)?(A(),O("span",Sx,[H(u(Y),{icon:"clarity:folder-line",class:"inline h-3 w-3 mr-0.5 align-text-top"}),Ae(w(R(x.file)),1)])):ie("",!0),Ae(" "+w(b(x.file)),1)])]),f("div",Ex,[f("button",{class:"icon-btn text-primary hover:bg-primary/10",onClick:_=>D(x),title:u(t)("library.play")},[H(u(Y),{icon:"clarity:play-line",class:"h-4 w-4"})],8,Ax),f("a",{class:"icon-btn",href:u(ve).downloadFileURL(x.file),download:u(ve).downloadSaveName(x.file),title:u(t)("library.downloadToDevice")},[H(u(Y),{icon:"clarity:download-line",class:"h-4 w-4"})],8,Cx),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",disabled:a.value[x.file]===!0,onClick:_=>k(x.file),title:u(t)("library.deleteFile")},[a.value[x.file]===!0?(A(),O("span",Tx)):(A(),ct(u(Y),{key:1,icon:"clarity:trash-line",class:"h-4 w-4"}))],8,Rx)])]))),128))])),c.value>1?(A(),O("nav",Px,[f("button",{class:"icon-btn",disabled:d.value===1,onClick:U[0]||(U[0]=x=>d.value--),title:u(t)("common.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,Ox),(A(!0),O(fe,null,Ie(c.value,x=>(A(),O("button",{key:x,class:Ce(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",x===d.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:_=>d.value=x},w(x),11,Dx))),128)),f("button",{class:"icon-btn",disabled:d.value===c.value,onClick:U[1]||(U[1]=x=>d.value++),title:u(t)("common.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,Nx)])):ie("",!0),o.value.length>0?(A(),O("p",Ix,w(o.value.length===1?u(t)("library.countOne",{count:o.value.length}):u(t)("library.countMany",{count:o.value.length})),1)):ie("",!0)])]))}},Ms=Pe.create({baseURL:`${Ye.PROTOCOL}//${Ye.BACKEND}:${Ye.PORT}${Ye.BASEURL}`});function Lx(){return Ms.get("/api/monitor/playlists")}function Fx(e,t=60){return Ms.post("/api/monitor/playlists",{url:e,interval_minutes:t})}function Ux(e,t){return Ms.patch(`/api/monitor/playlists/${e}`,t)}function Mx(e){return Ms.delete(`/api/monitor/playlists/${e}`)}function Bx(e){return Ms.post(`/api/monitor/playlists/${e}/check`)}const yn={listMonitoredPlaylists:Lx,addMonitoredPlaylist:Fx,updateMonitoredPlaylist:Ux,deleteMonitoredPlaylist:Mx,checkMonitoredPlaylist:Bx},Hx={class:"min-h-screen"},jx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},qx={class:"mb-8"},Vx={class:"text-2xl font-bold tracking-tight"},Wx={class:"mt-1 text-sm text-base-content/60"},zx={class:"surface rounded-2xl p-5 mb-8"},Kx={class:"text-sm font-semibold uppercase tracking-wider text-base-content/50 mb-4"},Qx=["placeholder","disabled"],Gx={class:"flex items-center gap-2 shrink-0"},Yx=["disabled"],Jx={value:15},Xx={value:30},Zx={value:60},e1={value:180},t1={value:360},n1={value:720},s1={value:1440},o1={value:10080},r1={value:20160},i1={value:43200},a1=["disabled"],l1={key:0,class:"loading loading-spinner loading-xs"},c1={key:1},u1={key:0,class:"mt-2 text-xs text-error"},d1={key:0,class:"space-y-3"},f1={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},p1={class:"text-base-content/50 text-sm"},h1={class:"text-base-content/40 text-xs mt-1"},m1={key:2,class:"space-y-3"},g1={class:"flex-1 min-w-0"},y1={class:"flex items-center gap-2 mb-1"},v1={class:"font-semibold truncate"},b1={class:"flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-base-content/50"},_1={key:0},x1={key:1,class:"italic"},w1={class:"flex items-center gap-2 shrink-0"},k1=["value","onChange"],S1={value:15},E1={value:30},A1={value:60},C1={value:180},R1={value:360},T1={value:720},P1={value:1440},O1={value:10080},D1={value:20160},N1={value:43200},I1=["title","onClick"],$1=["title","disabled","onClick"],L1={key:0,class:"loading loading-spinner loading-xs"},F1=["title","onClick"],U1={class:"mt-8 surface rounded-2xl p-4 flex gap-3 text-sm text-base-content/60"},M1={__name:"Monitor",setup(e){const{t}=St(),n=se([]),s=se(!1),o=se(!1),r=se(""),i=se(""),a=se(60),l=se({});async function d(){s.value=!0;try{const R=await yn.listMonitoredPlaylists();n.value=R.data||[]}finally{s.value=!1}}async function c(){var R,D;r.value="",o.value=!0;try{const C=await yn.addMonitoredPlaylist(i.value.trim(),a.value);n.value.unshift(C.data),i.value=""}catch(C){r.value=((D=(R=C==null?void 0:C.response)==null?void 0:R.data)==null?void 0:D.detail)||t("monitor.failedAdd")}finally{o.value=!1}}async function p(R){try{const D=await yn.updateMonitoredPlaylist(R.id,{enabled:!R.enabled});Object.assign(R,D.data)}catch{}}async function h(R,D){const C=parseInt(D.target.value,10);try{const P=await yn.updateMonitoredPlaylist(R.id,{interval_minutes:C});Object.assign(R,P.data)}catch{}}async function g(R){l.value={...l.value,[R.id]:!0};try{await yn.checkMonitoredPlaylist(R.id),setTimeout(async()=>{try{const D=await yn.listMonitoredPlaylists();n.value=D.data||[]}finally{l.value={...l.value,[R.id]:!1}}},3e3)}catch{l.value={...l.value,[R.id]:!1}}}async function v(R){if(confirm(t("monitor.deletePrompt",{name:R.name})))try{await yn.deleteMonitoredPlaylist(R.id),n.value=n.value.filter(D=>D.id!==R.id)}catch{}}function k(R){if(R<60)return`${R} ${t("monitor.minSuffix")}`;if(R<1440)return`${R/60} ${t("monitor.hourSuffix")}`;if(R<10080){const C=R/1440;return`${C} ${t(C===1?"monitor.daySuffix":"monitor.daysSuffix")}`}if(R<43200){const C=R/10080;return`${C} ${t(C===1?"monitor.weekSuffix":"monitor.weeksSuffix")}`}const D=Math.round(R/43200);return`${D} ${t(D===1?"monitor.monthSuffix":"monitor.monthsSuffix")}`}function b(R){try{const D=Date.now()-new Date(R).getTime(),C=Math.floor(D/6e4);if(C<1)return t("monitor.timeJustNow");if(C<60)return t("monitor.timeMinAgo",{n:C});const P=Math.floor(C/60);return P<24?t("monitor.timeHourAgo",{n:P}):t("monitor.timeDayAgo",{n:Math.floor(P/24)})}catch{return""}}return Zt(d),(R,D)=>(A(),O("div",Hx,[H(Ls),H(Qn),f("div",jx,[f("div",qx,[f("h1",Vx,w(u(t)("monitor.title")),1),f("p",Wx,w(u(t)("monitor.subtitle")),1)]),f("div",zx,[f("h2",Kx,w(u(t)("monitor.watchNew")),1),f("form",{onSubmit:ep(c,["prevent"]),class:"flex flex-col sm:flex-row gap-3"},[Se(f("input",{"onUpdate:modelValue":D[0]||(D[0]=C=>i.value=C),type:"text",placeholder:u(t)("monitor.urlPlaceholder"),class:"input-modern flex-1 h-11 text-sm",disabled:o.value},null,8,Qx),[[et,i.value]]),f("div",Gx,[Se(f("select",{"onUpdate:modelValue":D[1]||(D[1]=C=>a.value=C),class:"select select-sm rounded-full border border-white/10 bg-base-100/85 focus:border-primary/60 h-11 px-3 text-sm",disabled:o.value},[f("option",Jx,w(u(t)("monitor.every15")),1),f("option",Xx,w(u(t)("monitor.every30")),1),f("option",Zx,w(u(t)("monitor.every1h")),1),f("option",e1,w(u(t)("monitor.every3h")),1),f("option",t1,w(u(t)("monitor.every6h")),1),f("option",n1,w(u(t)("monitor.every12h")),1),f("option",s1,w(u(t)("monitor.every1d")),1),f("option",o1,w(u(t)("monitor.every1w")),1),f("option",r1,w(u(t)("monitor.every2w")),1),f("option",i1,w(u(t)("monitor.every1mo")),1)],8,Yx),[[Xs,a.value]]),f("button",{type:"submit",class:"btn btn-primary btn-sm h-11 px-5 rounded-full",disabled:o.value||!i.value.trim()},[o.value?(A(),O("span",l1)):(A(),O("span",c1,w(u(t)("monitor.watch")),1))],8,a1)])],32),r.value?(A(),O("p",u1,w(r.value),1)):ie("",!0)]),s.value?(A(),O("div",d1,[(A(),O(fe,null,Ie(3,C=>f("div",{key:C,class:"skeleton h-24 rounded-2xl"})),64))])):n.value.length===0?(A(),O("div",f1,[H(u(Y),{icon:"clarity:music-note-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",p1,w(u(t)("monitor.empty")),1),f("p",h1,w(u(t)("monitor.emptyHint")),1)])):(A(),O("ul",m1,[(A(!0),O(fe,null,Ie(n.value,C=>(A(),O("li",{key:C.id,class:"surface rounded-2xl p-4 sm:p-5 flex flex-col sm:flex-row sm:items-center gap-4"},[f("div",g1,[f("div",y1,[f("span",v1,w(C.name),1),f("span",{class:Ce(["pill shrink-0",C.enabled?"badge-soft":"badge-neutral-soft"])},w(C.enabled?u(t)("monitor.active"):u(t)("monitor.paused")),3)]),f("div",b1,[f("span",null,[H(u(Y),{icon:"clarity:refresh-line",class:"inline h-3 w-3 mr-0.5"}),Ae(" "+w(u(t)("monitor.everyInterval",{interval:k(C.interval_minutes)})),1)]),f("span",null,[H(u(Y),{icon:"clarity:music-note-line",class:"inline h-3 w-3 mr-0.5"}),Ae(" "+w(C.last_track_count===1?u(t)("monitor.tracksOne",{count:C.last_track_count}):u(t)("monitor.tracksMany",{count:C.last_track_count})),1)]),C.last_checked?(A(),O("span",_1,[H(u(Y),{icon:"clarity:clock-line",class:"inline h-3 w-3 mr-0.5"}),Ae(" "+w(u(t)("monitor.checked",{when:b(C.last_checked)})),1)])):(A(),O("span",x1,w(u(t)("monitor.notChecked")),1))])]),f("div",w1,[f("select",{value:C.interval_minutes,onChange:P=>h(C,P),class:"select select-xs rounded-full border border-white/10 bg-base-100/60 text-xs focus:border-primary/60"},[f("option",S1,w(u(t)("monitor.short15")),1),f("option",E1,w(u(t)("monitor.short30")),1),f("option",A1,w(u(t)("monitor.short1h")),1),f("option",C1,w(u(t)("monitor.short3h")),1),f("option",R1,w(u(t)("monitor.short6h")),1),f("option",T1,w(u(t)("monitor.short12h")),1),f("option",P1,w(u(t)("monitor.short1d")),1),f("option",O1,w(u(t)("monitor.short1w")),1),f("option",D1,w(u(t)("monitor.short2w")),1),f("option",N1,w(u(t)("monitor.short1mo")),1)],40,k1),f("button",{class:"icon-btn",title:C.enabled?u(t)("monitor.pause"):u(t)("monitor.resume"),onClick:P=>p(C)},[H(u(Y),{icon:C.enabled?"clarity:pause-line":"clarity:play-line",class:"h-4 w-4"},null,8,["icon"])],8,I1),f("button",{class:"icon-btn",title:u(t)("monitor.checkNow"),disabled:l.value[C.id],onClick:P=>g(C)},[l.value[C.id]?(A(),O("span",L1)):(A(),ct(u(Y),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4"}))],8,$1),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",title:u(t)("monitor.stop"),onClick:P=>v(C)},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,F1)])]))),128))])),f("div",U1,[H(u(Y),{icon:"clarity:info-standard-line",class:"h-5 w-5 shrink-0 mt-0.5 text-primary/70"}),f("p",null,w(u(t)("monitor.info")),1)])])]))}},B1={class:"min-h-screen"},H1={class:"mx-auto max-w-5xl px-4 py-8 sm:px-6"},j1={class:"mb-8"},q1={class:"text-2xl font-bold tracking-tight"},V1={class:"mt-1 text-sm text-base-content/60"},W1={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},z1={class:"text-base-content/50 text-sm"},K1={class:"text-base-content/40 text-xs mt-1"},Q1={key:1,class:"space-y-3"},G1={key:2,class:"grid gap-6 lg:grid-cols-[1fr_360px]"},Y1={class:"surface rounded-3xl p-6 sm:p-8 flex flex-col items-center text-center"},J1=["src","alt"],X1={key:2,class:"absolute bottom-3 right-3 equalizer h-5","aria-hidden":"true"},Z1={class:"mt-6 w-full"},ew={class:"text-xl font-bold tracking-tight truncate"},tw={class:"text-sm text-base-content/60 truncate mt-0.5"},nw={class:"mt-6 w-full"},sw={class:"mt-2 flex items-center justify-between text-xs text-base-content/50 tabular-nums"},ow={class:"mt-5 flex items-center justify-center gap-3"},rw=["title"],iw=["title","disabled"],aw=["disabled","title"],lw=["title","disabled"],cw=["title"],uw={key:0,class:"absolute -bottom-0.5 -right-0.5 h-4 min-w-[1rem] px-1 rounded-full bg-primary text-primary-content text-[9px] font-bold flex items-center justify-center"},dw={class:"mt-6 w-full max-w-xs flex items-center gap-3"},fw=["title"],pw=["value","title"],hw={class:"surface rounded-3xl p-4 sm:p-5 lg:max-h-[640px] lg:overflow-y-auto"},mw={class:"flex items-center justify-between mb-3 px-1"},gw={class:"text-xs font-semibold uppercase tracking-wider text-base-content/50"},yw={class:"text-[11px] text-base-content/40"},vw={key:0,class:"space-y-1"},bw=["onClick"],_w=["src","alt","onError"],xw={key:1,class:"relative equalizer h-3","aria-hidden":"true"},ww={class:"flex-1 min-w-0"},kw={class:"text-sm truncate font-medium"},Sw={class:"text-[11px] truncate text-base-content/50"},Ew={key:1,class:"text-center py-10"},Aw={class:"text-base-content/50 text-sm"},Cw={__name:"Player",setup(e){const{t}=St(),n=Ou(),s=se([]),o=se(!1),r=se(null),i=se({});let a=!1;function l(U){return ve.coverFileURL(U)}function d(U){i.value={...i.value,[U]:!0}}async function c(){o.value=!0;try{const U=await ve.listDownloads();s.value=(U.data||[]).map(Si),n.playlist.value.length===0&&s.value.length>0&&n.setPlaylist(s.value)}finally{o.value=!1}}function p(U){var x,_;n.playlist.value.length!==s.value.length||((x=n.playlist.value[U])==null?void 0:x.file)!==((_=s.value[U])==null?void 0:_.file)?n.setPlaylist(s.value,{startIndex:U}):n.playAt(U)}const h=me(()=>{const U=n.currentTrack.value;return U&&U.title?U.title:t("player.empty")}),g=me(()=>{const U=n.currentTrack.value;return U&&U.artist?U.artist:U?t("common.unknownArtist"):""}),v=me(()=>n.repeatMode.value==="one"?t("player.repeatOne"):n.repeatMode.value==="all"?t("player.repeatAll"):t("player.repeatOff"));function k(U){n.setVolume(parseFloat(U.target.value))}function b(U){const x=r.value;if(!x)return 0;const _=x.getBoundingClientRect(),E=(U.clientX||0)-_.left;return Math.max(0,Math.min(1,E/_.width))}function R(U){n.seekRatio(b(U))}function D(U){a=!0,n.seekRatio(b(U)),window.addEventListener("pointermove",C),window.addEventListener("pointerup",P,{once:!0})}function C(U){a&&n.seekRatio(b(U))}function P(){a=!1,window.removeEventListener("pointermove",C)}return Zt(()=>{window.scroll(0,0),c()}),ri(()=>{window.removeEventListener("pointermove",C)}),(U,x)=>(A(),O("div",B1,[H(Ls),H(Qn),f("div",H1,[f("div",j1,[f("h1",q1,w(u(t)("player.title")),1),f("p",V1,w(u(t)("player.subtitle")),1)]),s.value.length===0&&!o.value?(A(),O("div",W1,[H(u(Y),{icon:"clarity:headphones-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",z1,w(u(t)("player.empty")),1),f("p",K1,w(u(t)("player.emptyHint")),1)])):o.value&&!u(n).currentTrack.value?(A(),O("div",Q1,[...x[8]||(x[8]=[f("div",{class:"skeleton h-72 rounded-3xl"},null,-1),f("div",{class:"skeleton h-16 rounded-2xl"},null,-1),f("div",{class:"skeleton h-16 rounded-2xl"},null,-1)])])):(A(),O("div",G1,[f("section",Y1,[f("div",{class:Ce(["relative h-56 w-56 sm:h-64 sm:w-64 rounded-3xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden shadow-glow",{"pulse-glow":u(n).isPlaying.value}])},[u(n).currentTrack.value&&u(n).currentTrack.value.cover&&!i.value[u(n).currentTrack.value.file]?(A(),O("img",{key:0,src:u(n).currentTrack.value.cover,alt:u(n).currentTrack.value.title,class:"absolute inset-0 h-full w-full object-cover",onError:x[0]||(x[0]=_=>d(u(n).currentTrack.value.file))},null,40,J1)):(A(),ct(u(Y),{key:1,icon:"clarity:music-note-line",class:"h-24 w-24"})),u(n).isPlaying.value?(A(),O("div",X1,[...x[9]||(x[9]=[f("span",null,null,-1),f("span",null,null,-1),f("span",null,null,-1)])])):ie("",!0)],2),f("div",Z1,[f("p",ew,w(h.value),1),f("p",tw,w(g.value),1)]),f("div",nw,[f("div",{class:"relative h-2 rounded-full bg-white/10 overflow-hidden cursor-pointer group",ref_key:"progressBar",ref:r,onClick:R,onPointerdown:D},[f("div",{class:"h-full bg-primary transition-[width] duration-150",style:Ln(`width: ${u(n).progressPct.value}%`)},null,4),f("div",{class:"absolute top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded-full bg-primary shadow-glow-sm transition-all duration-150 opacity-0 group-hover:opacity-100",style:Ln(`left: calc(${u(n).progressPct.value}% - 7px)`)},null,4)],544),f("div",sw,[f("span",null,w(u(pl)(u(n).currentTime.value)),1),f("span",null,w(u(pl)(u(n).duration.value)),1)])]),f("div",ow,[f("button",{class:Ce(["icon-btn",{"icon-btn-active":u(n).shuffle.value}]),onClick:x[1]||(x[1]=_=>u(n).toggleShuffle()),title:u(n).shuffle.value?u(t)("player.shuffleOn"):u(t)("player.shuffleOff")},[H(u(Y),{icon:"clarity:shuffle-line",class:"h-5 w-5"})],10,rw),f("button",{class:"icon-btn",onClick:x[2]||(x[2]=_=>u(n).prev()),title:u(t)("player.previous"),disabled:s.value.length===0},[H(u(Y),{icon:"clarity:step-forward-2-line",class:"h-5 w-5 -scale-x-100"})],8,iw),f("button",{class:"inline-flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm hover:scale-105 active:scale-95 transition disabled:opacity-50",onClick:x[3]||(x[3]=_=>u(n).toggle()),disabled:s.value.length===0,title:u(n).isPlaying.value?u(t)("player.pause"):u(t)("player.play")},[H(u(Y),{icon:u(n).isPlaying.value?"clarity:pause-solid":"clarity:play-solid",class:"h-6 w-6"},null,8,["icon"])],8,aw),f("button",{class:"icon-btn",onClick:x[4]||(x[4]=_=>u(n).next()),title:u(t)("player.next"),disabled:s.value.length===0},[H(u(Y),{icon:"clarity:step-forward-2-line",class:"h-5 w-5"})],8,lw),f("button",{class:Ce(["icon-btn relative",{"icon-btn-active":u(n).repeatMode.value!=="off"}]),onClick:x[5]||(x[5]=_=>u(n).cycleRepeat()),title:v.value},[H(u(Y),{icon:"clarity:refresh-line",class:"h-5 w-5"}),u(n).repeatMode.value==="one"?(A(),O("span",uw," 1 ")):ie("",!0)],10,cw)]),f("div",dw,[f("button",{class:"icon-btn",onClick:x[6]||(x[6]=_=>u(n).toggleMute()),title:u(n).isMuted.value?u(t)("player.unmute"):u(t)("player.mute")},[H(u(Y),{icon:u(n).isMuted.value||u(n).volume.value===0?"clarity:volume-mute-line":u(n).volume.value<.5?"clarity:volume-down-line":"clarity:volume-up-line",class:"h-5 w-5"},null,8,["icon"])],8,fw),f("input",{type:"range",min:"0",max:"1",step:"0.01",value:u(n).isMuted.value?0:u(n).volume.value,onInput:x[7]||(x[7]=_=>k(_)),class:"player-range flex-1",title:u(t)("player.volume")},null,40,pw)])]),f("aside",hw,[f("div",mw,[f("h2",gw,w(u(t)("player.queue")),1),f("span",yw,w(s.value.length===1?u(t)("player.countOne",{count:s.value.length}):u(t)("player.countMany",{count:s.value.length})),1)]),s.value.length>0?(A(),O("ul",vw,[(A(!0),O(fe,null,Ie(s.value,(_,E)=>(A(),O("li",{key:_.file,class:Ce(["rounded-xl px-2 py-2 flex items-center gap-3 cursor-pointer transition-colors",E===u(n).currentIndex.value?"bg-primary/10 text-primary":"hover:bg-white/5"]),onClick:j=>p(E)},[f("div",{class:Ce(["relative h-9 w-9 shrink-0 rounded-lg overflow-hidden flex items-center justify-center",E===u(n).currentIndex.value?"bg-primary/15":"bg-base-100/60"])},[i.value[_.file]?ie("",!0):(A(),O("img",{key:0,src:l(_.file),alt:_.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:j=>d(_.file)},null,40,_w)),E===u(n).currentIndex.value&&u(n).isPlaying.value?(A(),O("span",xw,[...x[10]||(x[10]=[f("span",null,null,-1),f("span",null,null,-1),f("span",null,null,-1)])])):i.value[_.file]?(A(),ct(u(Y),{key:2,icon:"clarity:music-note-line",class:"h-4 w-4 text-base-content/50"})):ie("",!0)],2),f("div",ww,[f("p",kw,w(_.title),1),f("p",Sw,w(_.artist||u(t)("common.unknownArtist")),1)])],10,bw))),128))])):(A(),O("div",Ew,[f("p",Aw,w(u(t)("player.empty")),1)]))])]))])]))}},Rw=Eu(Cw,[["__scopeId","data-v-98956c70"]]),Tw=[{path:"/",name:"Home",component:c_},{path:"/search/:query",name:"Search",component:e0},{path:"/download",name:"Download",component:q0},{path:"/list",name:"List",component:$x},{path:"/monitor",name:"Monitor",component:M1},{path:"/player",name:"Player",component:Rw}],it=Db({history:ub(Ye.BASEURL),routes:Tw}),Du=rp(Av);Du.use(it);Du.mount("#app"); + */let fv=()=>location.protocol+"//"+location.host;function _u(e,t){const{pathname:n,search:s,hash:o}=t,r=e.indexOf("#");if(r>-1){let i=o.includes(e.slice(r))?e.slice(r).length:1,a=o.slice(i);return a[0]!=="/"&&(a="/"+a),Ja(a,"")}return Ja(n,e)+s+o}function pv(e,t,n,s){let o=[],r=[],i=null;const a=({state:h})=>{const g=_u(e,location),b=n.value,k=t.value;let v=0;if(h){if(n.value=g,t.value=h,i&&i===b){i=null;return}v=k?h.position-k.position:0}else s(g);o.forEach(R=>{R(n.value,b,{delta:v,type:Ur.pop,direction:v?v>0?cr.forward:cr.back:cr.unknown})})};function l(){i=n.value}function d(h){o.push(h);const g=()=>{const b=o.indexOf(h);b>-1&&o.splice(b,1)};return r.push(g),g}function c(){if(document.visibilityState==="hidden"){const{history:h}=window;if(!h.state)return;h.replaceState(ge({},h.state,{scroll:Mo()}),"")}}function p(){for(const h of r)h();r=[],window.removeEventListener("popstate",a),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",a),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:l,listen:d,destroy:p}}function nl(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Mo():null}}function hv(e){const{history:t,location:n}=window,s={value:_u(e,n)},o={value:t.state};o.value||r(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(l,d,c){const p=e.indexOf("#"),h=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+l:fv()+e+l;try{t[c?"replaceState":"pushState"](d,"",h),o.value=d}catch(g){console.error(g),n[c?"replace":"assign"](h)}}function i(l,d){r(l,ge({},t.state,nl(o.value.back,l,o.value.forward,!0),d,{position:o.value.position}),!0),s.value=l}function a(l,d){const c=ge({},o.value,t.state,{forward:l,scroll:Mo()});r(c.current,c,!0),r(l,ge({},nl(s.value,l,null),{position:c.position+1},d),!1),s.value=l}return{location:s,state:o,push:a,replace:i}}function mv(e){e=Xb(e);const t=hv(e),n=pv(e,t.state,t.location,t.replace);function s(r,i=!0){i||n.pauseListeners(),history.go(r)}const o=ge({location:"",base:e,go:s,createHref:ev.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let xn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Ne=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Ne||{});const gv={type:xn.Static,value:""},yv=/[a-zA-Z0-9_]/;function bv(e){if(!e)return[[]];if(e==="/")return[[gv]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${d}": ${g}`)}let n=Ne.Static,s=n;const o=[];let r;function i(){r&&o.push(r),r=[]}let a=0,l,d="",c="";function p(){d&&(n===Ne.Static?r.push({type:xn.Static,value:d}):n===Ne.Param||n===Ne.ParamRegExp||n===Ne.ParamRegExpEnd?(r.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),r.push({type:xn.Param,value:d,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),d="")}function h(){d+=l}for(;at.length?t.length===1&&t[0]===ze.Static+ze.Segment?1:-1:0}function xu(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const kv={strict:!1,end:!0,sensitive:!1};function Sv(e,t,n){const s=xv(bv(e.path),n),o=ge(s,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function Ev(e,t){const n=[],s=new Map;t=Ya(kv,t);function o(p){return s.get(p)}function r(p,h,g){const b=!g,k=il(p);k.aliasOf=g&&g.record;const v=Ya(t,p),R=[k];if("alias"in p){const P=typeof p.alias=="string"?[p.alias]:p.alias;for(const F of P)R.push(il(ge({},k,{components:g?g.record.components:k.components,path:F,aliasOf:g?g.record:k})))}let D,C;for(const P of R){const{path:F}=P;if(h&&F[0]!=="/"){const x=h.record.path,_=x[x.length-1]==="/"?"":"/";P.path=h.record.path+(F&&_+F)}if(D=Sv(P,h,v),g?g.alias.push(D):(C=C||D,C!==D&&C.alias.push(D),b&&p.name&&!al(D)&&i(p.name)),wu(D)&&l(D),k.children){const x=k.children;for(let _=0;_{i(C)}:hs}function i(p){if(bu(p)){const h=s.get(p);h&&(s.delete(p),n.splice(n.indexOf(h),1),h.children.forEach(i),h.alias.forEach(i))}else{const h=n.indexOf(p);h>-1&&(n.splice(h,1),p.record.name&&s.delete(p.record.name),p.children.forEach(i),p.alias.forEach(i))}}function a(){return n}function l(p){const h=Rv(p,n);n.splice(h,0,p),p.record.name&&!al(p)&&s.set(p.record.name,p)}function d(p,h){let g,b={},k,v;if("name"in p&&p.name){if(g=s.get(p.name),!g)throw qn(Re.MATCHER_NOT_FOUND,{location:p});v=g.record.name,b=ge(rl(h.params,g.keys.filter(C=>!C.optional).concat(g.parent?g.parent.keys.filter(C=>C.optional):[]).map(C=>C.name)),p.params&&rl(p.params,g.keys.map(C=>C.name))),k=g.stringify(b)}else if(p.path!=null)k=p.path,g=n.find(C=>C.re.test(k)),g&&(b=g.parse(k),v=g.record.name);else{if(g=h.name?s.get(h.name):n.find(C=>C.re.test(h.path)),!g)throw qn(Re.MATCHER_NOT_FOUND,{location:p,currentLocation:h});v=g.record.name,b=ge({},h.params,p.params),k=g.stringify(b)}const R=[];let D=g;for(;D;)R.unshift(D.record),D=D.parent;return{name:v,path:k,params:b,matched:R,meta:Cv(R)}}e.forEach(p=>r(p));function c(){n.length=0,s.clear()}return{addRoute:r,resolve:d,removeRoute:i,clearRoutes:c,getRoutes:a,getRecordMatcher:o}}function rl(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function il(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Av(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Av(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function al(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Cv(e){return e.reduce((t,n)=>ge(t,n.meta),{})}function Rv(e,t){let n=0,s=t.length;for(;n!==s;){const r=n+s>>1;xu(e,t[r])<0?s=r:n=r+1}const o=Tv(e);return o&&(s=t.lastIndexOf(o,s-1)),s}function Tv(e){let t=e;for(;t=t.parent;)if(wu(t)&&xu(e,t)===0)return t}function wu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function ll(e){const t=_t(Bo),n=_t(_i),s=me(()=>{const l=u(e.to);return t.resolve(l)}),o=me(()=>{const{matched:l}=s.value,{length:d}=l,c=l[d-1],p=n.matched;if(!c||!p.length)return-1;const h=p.findIndex(jn.bind(null,c));if(h>-1)return h;const g=cl(l[d-2]);return d>1&&cl(c)===g&&p[p.length-1].path!==g?p.findIndex(jn.bind(null,l[d-2])):h}),r=me(()=>o.value>-1&&Iv(n.params,s.value.params)),i=me(()=>o.value>-1&&o.value===n.matched.length-1&&yu(n.params,s.value.params));function a(l={}){if(Nv(l)){const d=t[u(e.replace)?"replace":"push"](u(e.to)).catch(hs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:me(()=>s.value.href),isActive:r,isExactActive:i,navigate:a}}function Pv(e){return e.length===1?e[0]:e}const Ov=si({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:ll,setup(e,{slots:t}){const n=Un(ll(e)),{options:s}=_t(Bo),o=me(()=>({[ul(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ul(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const r=t.default&&Pv(t.default(n));return e.custom?r:xs("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}}),Dv=Ov;function Nv(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Iv(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!kt(o)||o.length!==s.length||s.some((r,i)=>r.valueOf()!==o[i].valueOf()))return!1}return!0}function cl(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ul=(e,t,n)=>e??t??n,$v=si({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=_t(Mr),o=me(()=>e.route||s.value),r=_t(tl,0),i=me(()=>{let d=u(r);const{matched:c}=o.value;let p;for(;(p=c[d])&&!p.components;)d++;return d}),a=me(()=>o.value.matched[i.value]);Qs(tl,me(()=>i.value+1)),Qs(uv,a),Qs(Mr,o);const l=se();return Mt(()=>[l.value,a.value,e.name],([d,c,p],[h,g,b])=>{c&&(c.instances[p]=d,g&&g!==c&&d&&d===h&&(c.leaveGuards.size||(c.leaveGuards=g.leaveGuards),c.updateGuards.size||(c.updateGuards=g.updateGuards))),d&&c&&(!g||!jn(c,g)||!h)&&(c.enterCallbacks[p]||[]).forEach(k=>k(d))},{flush:"post"}),()=>{const d=o.value,c=e.name,p=a.value,h=p&&p.components[c];if(!h)return dl(n.default,{Component:h,route:d});const g=p.props[c],b=g?g===!0?d.params:typeof g=="function"?g(d):g:null,v=xs(h,ge({},b,t,{onVnodeUnmounted:R=>{R.component.isUnmounted&&(p.instances[c]=null)},ref:l}));return dl(n.default,{Component:v,route:d})||v}}});function dl(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Lv=$v;function Uv(e){const t=Ev(e.routes,e),n=e.parseQuery||lv,s=e.stringifyQuery||el,o=e.history,r=os(),i=os(),a=os(),l=fd(nn);let d=nn;Pn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=ar.bind(null,L=>""+L),p=ar.bind(null,Wb),h=ar.bind(null,As);function g(L,G){let z,J;return bu(L)?(z=t.getRecordMatcher(L),J=G):J=L,t.addRoute(J,z)}function b(L){const G=t.getRecordMatcher(L);G&&t.removeRoute(G)}function k(){return t.getRoutes().map(L=>L.record)}function v(L){return!!t.getRecordMatcher(L)}function R(L,G){if(G=ge({},G||l.value),typeof L=="string"){const S=lr(n,L,G.path),I=t.resolve({path:S.path},G),U=o.createHref(S.fullPath);return ge(S,I,{params:h(I.params),hash:As(S.hash),redirectedFrom:void 0,href:U})}let z;if(L.path!=null)z=ge({},L,{path:lr(n,L.path,G.path).path});else{const S=ge({},L.params);for(const I in S)S[I]==null&&delete S[I];z=ge({},L,{params:p(S)}),G.params=p(G.params)}const J=t.resolve(z,G),ue=L.hash||"";J.params=c(h(J.params));const m=Qb(s,ge({},L,{hash:jb(ue),path:J.path})),y=o.createHref(m);return ge({fullPath:m,hash:ue,query:s===el?cv(L.query):L.query||{}},J,{redirectedFrom:void 0,href:y})}function D(L){return typeof L=="string"?lr(n,L,l.value.path):ge({},L)}function C(L,G){if(d!==L)return qn(Re.NAVIGATION_CANCELLED,{from:G,to:L})}function P(L){return _(L)}function F(L){return P(ge(D(L),{replace:!0}))}function x(L,G){const z=L.matched[L.matched.length-1];if(z&&z.redirect){const{redirect:J}=z;let ue=typeof J=="function"?J(L,G):J;return typeof ue=="string"&&(ue=ue.includes("?")||ue.includes("#")?ue=D(ue):{path:ue},ue.params={}),ge({query:L.query,hash:L.hash,params:ue.path!=null?{}:L.params},ue)}}function _(L,G){const z=d=R(L),J=l.value,ue=L.state,m=L.force,y=L.replace===!0,S=x(z,J);if(S)return _(ge(D(S),{state:typeof S=="object"?ge({},ue,S.state):ue,force:m,replace:y}),G||z);const I=z;I.redirectedFrom=G;let U;return!m&&Gb(s,J,z)&&(U=qn(Re.NAVIGATION_DUPLICATED,{to:I,from:J}),De(J,J,!0,!1)),(U?Promise.resolve(U):M(I,J)).catch($=>Vt($)?Vt($,Re.NAVIGATION_GUARD_REDIRECT)?$:At($):ae($,I,J)).then($=>{if($){if(Vt($,Re.NAVIGATION_GUARD_REDIRECT))return _(ge({replace:y},D($.to),{state:typeof $.to=="object"?ge({},ue,$.to.state):ue,force:m}),G||I)}else $=N(I,J,!0,y,ue);return Q(I,J,$),$})}function E(L,G){const z=C(L,G);return z?Promise.reject(z):Promise.resolve()}function j(L){const G=gt.values().next().value;return G&&typeof G.runWithContext=="function"?G.runWithContext(L):L()}function M(L,G){let z;const[J,ue,m]=dv(L,G);z=ur(J.reverse(),"beforeRouteLeave",L,G);for(const S of J)S.leaveGuards.forEach(I=>{z.push(rn(I,L,G))});const y=E.bind(null,L,G);return z.push(y),dt(z).then(()=>{z=[];for(const S of r.list())z.push(rn(S,L,G));return z.push(y),dt(z)}).then(()=>{z=ur(ue,"beforeRouteUpdate",L,G);for(const S of ue)S.updateGuards.forEach(I=>{z.push(rn(I,L,G))});return z.push(y),dt(z)}).then(()=>{z=[];for(const S of m)if(S.beforeEnter)if(kt(S.beforeEnter))for(const I of S.beforeEnter)z.push(rn(I,L,G));else z.push(rn(S.beforeEnter,L,G));return z.push(y),dt(z)}).then(()=>(L.matched.forEach(S=>S.enterCallbacks={}),z=ur(m,"beforeRouteEnter",L,G,j),z.push(y),dt(z))).then(()=>{z=[];for(const S of i.list())z.push(rn(S,L,G));return z.push(y),dt(z)}).catch(S=>Vt(S,Re.NAVIGATION_CANCELLED)?S:Promise.reject(S))}function Q(L,G,z){a.list().forEach(J=>j(()=>J(L,G,z)))}function N(L,G,z,J,ue){const m=C(L,G);if(m)return m;const y=G===nn,S=Pn?history.state:{};z&&(J||y?o.replace(L.fullPath,ge({scroll:y&&S&&S.scroll},ue)):o.push(L.fullPath,ue)),l.value=L,De(L,G,z,y),At()}let te;function le(){te||(te=o.listen((L,G,z)=>{if(!Rt.listening)return;const J=R(L),ue=x(J,Rt.currentRoute.value);if(ue){_(ge(ue,{replace:!0,force:!0}),J).catch(hs);return}d=J;const m=l.value;Pn&&sv(Za(m.fullPath,z.delta),Mo()),M(J,m).catch(y=>Vt(y,Re.NAVIGATION_ABORTED|Re.NAVIGATION_CANCELLED)?y:Vt(y,Re.NAVIGATION_GUARD_REDIRECT)?(_(ge(D(y.to),{force:!0}),J).then(S=>{Vt(S,Re.NAVIGATION_ABORTED|Re.NAVIGATION_DUPLICATED)&&!z.delta&&z.type===Ur.pop&&o.go(-1,!1)}).catch(hs),Promise.reject()):(z.delta&&o.go(-z.delta,!1),ae(y,J,m))).then(y=>{y=y||N(J,m,!1),y&&(z.delta&&!Vt(y,Re.NAVIGATION_CANCELLED)?o.go(-z.delta,!1):z.type===Ur.pop&&Vt(y,Re.NAVIGATION_ABORTED|Re.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),Q(J,m,y)}).catch(hs)}))}let Me=os(),ce=os(),pe;function ae(L,G,z){At(L);const J=ce.list();return J.length?J.forEach(ue=>ue(L,G,z)):console.error(L),Promise.reject(L)}function ut(){return pe&&l.value!==nn?Promise.resolve():new Promise((L,G)=>{Me.add([L,G])})}function At(L){return pe||(pe=!L,le(),Me.list().forEach(([G,z])=>L?z(L):G()),Me.reset()),L}function De(L,G,z,J){const{scrollBehavior:ue}=e;if(!Pn||!ue)return Promise.resolve();const m=!z&&ov(Za(L.fullPath,0))||(J||!z)&&history.state&&history.state.scroll||null;return ei().then(()=>ue(L,G,m)).then(y=>y&&nv(y)).catch(y=>ae(y,L,G))}const Oe=L=>o.go(L);let Ct;const gt=new Set,Rt={currentRoute:l,listening:!0,addRoute:g,removeRoute:b,clearRoutes:t.clearRoutes,hasRoute:v,getRoutes:k,resolve:R,options:e,push:P,replace:F,go:Oe,back:()=>Oe(-1),forward:()=>Oe(1),beforeEach:r.add,beforeResolve:i.add,afterEach:a.add,onError:ce.add,isReady:ut,install(L){L.component("RouterLink",Dv),L.component("RouterView",Lv),L.config.globalProperties.$router=Rt,Object.defineProperty(L.config.globalProperties,"$route",{enumerable:!0,get:()=>u(l)}),Pn&&!Ct&&l.value===nn&&(Ct=!0,P(o.location).catch(J=>{}));const G={};for(const J in nn)Object.defineProperty(G,J,{get:()=>l.value[J],enumerable:!0});L.provide(Bo,Rt),L.provide(_i,Ll(G)),L.provide(Mr,l);const z=L.unmount;gt.add(L),L.unmount=function(){gt.delete(L),gt.size<1&&(d=nn,te&&te(),te=null,l.value=nn,Ct=!1,pe=!1),z()}}};function dt(L){return L.reduce((G,z)=>G.then(()=>j(z)),Promise.resolve())}return Rt}function Fv(){return _t(Bo)}function ku(e){return _t(_i)}const xi="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='256'%20height='256'%20viewBox='0%200%2067.733332%2067.733333'%20version='1.1'%20id='svg1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3cdefs%20id='defs1'%20/%3e%3cg%20id='layer1'%3e%3cg%20style='fill:%23040000;fill-opacity:1'%20id='g1'%20transform='matrix(0.06566918,0,0,0.06566918,17.061212,17.059932)'%3e%3cg%20id='g2'%3e%3ccircle%20style='fill:%231ad35d;fill-opacity:1;stroke-width:0.472667'%20id='path2'%20cx='33.866665'%20cy='33.866665'%20r='21.644735'%20transform='matrix(23.824636,0,0,23.824636,-550.95013,-550.93064)'%20/%3e%3cpath%20d='M%20480.6,111.5%20H%20406.5%20V%2035.6%20c%200,-10.7%20-8.3,-19.6%20-19,-20.4%20-104,-7.5%20-200.4,-3.7%20-263,0.8%20-10.7,0.8%20-19,9.8%20-19,20.5%20v%2074.9%20H%2031.4%20c%20-10.9,0%20-20.9,8.8%20-20.6,22%2040.6,166%20230.9,361.7%20230.9,361.7%209.8,10.8%2025.6,4%2028.6,0%200,0%20177.1,-165.8%20230.3,-359.4%201.6,-5.8%20-0.5,-24.3%20-20,-24.2%20z'%20id='path1'%20style='fill:%23040000;fill-opacity:1'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",fl=se(""),dr=se(),rs=se(!1),Ws=se(!1),zs=se("");function Ho(){function e(o){return t(o)||n(o)}function t(o){return!(o===""||o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")||o.includes("://open.spotify.com/show/")||o.includes("://open.spotify.com/artist/"))}function n(o){return o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")}function s(o){console.log("Searching for:",o),dr.value=[],rs.value=!0,fl.value=o,Ws.value=!1,zs.value="",be.search(o).then(r=>{console.log("Received Search Data:",r.data),r.status===200?(dr.value=r.data,rs.value=!1):(console.error("Error Searching:",r),rs.value=!1,Ws.value=!0,zs.value=r.toString())}).catch(r=>{console.error("Other Error Searching:",r.message),rs.value=!1,Ws.value=!0,zs.value=r.message})}return{searchTerm:fl,isSearching:rs,results:dr,error:Ws,errorValue:zs,searchFor:s,isValid:e,isValidSearch:t,isValidURL:n}}const yt={QUEUED:"In Queue",DOWNLOADING:"Downloading...",DOWNLOADED:"Done",ERROR:"Error"},Ke=se([]);class Su{constructor(t){this.song=t,this.web_status=yt.QUEUED,this.progress=0,this.message="",this.provider="",this.web_download_url=null,this.filename=null}setDownloading(){this.web_status=yt.DOWNLOADING}setDownloaded(){this.web_status=yt.DOWNLOADED}setError(){this.web_status=yt.ERROR}resetForRetry(){this.web_status=yt.QUEUED,this.progress=0,this.message="",this.provider="",this.web_download_url=null,this.filename=null}setWebURL(t){this.web_download_url=t}setFilename(t){this.filename=t}isQueued(){return this.web_status===yt.QUEUED}isDownloading(){return this.web_status===yt.DOWNLOADING}isDownloaded(){return this.web_status===yt.DOWNLOADED}isErrored(){return this.web_status===yt.ERROR}wsUpdate(t){this.progress=t.progress,this.message=t.message,t.provider&&(this.provider=t.provider)}}function $s(){function e(o){return Ke.value.findIndex(r=>r.song.song_id===o.song_id)}function t(o){let r=new Su(o);Ke.value.push(r)}function n(o){console.log("removing",o,o.song_id),Ke.value=Ke.value.filter(r=>r.song.song_id!==o.song_id),console.log(Ke.value)}function s(o){return e(o)===-1?null:Ke.value[e(o)]}return{appendSong:t,removeSong:n,getBySong:s,downloadQueue:Ke}}const Ue=$s();be.ws_onmessage(e=>{let t=JSON.parse(e.data),n=Ue.getBySong(t.song);!n&&(Ue.appendSong(t.song),n=Ue.getBySong(t.song),!n)||(t.status==="done"?(n.progress=100,t.filename&&(n.setWebURL(be.downloadFileURL(t.filename)),n.setFilename(t.filename)),n.setDownloaded()):t.status==="error"?(n.wsUpdate(t),n.setError()):t.status==="queued"?(n.web_status=yt.QUEUED,n.message=t.message||"",t.provider&&(n.provider=t.provider)):(n.wsUpdate(t),n.setDownloading()))});be.ws_onerror(e=>{console.log("websocket error:",e)});async function Mv(){try{const t=(await be.getQueue()).data||[];for(const n of t){if(Ke.value.some(o=>o.song.song_id===n.song.song_id))continue;const s=new Su(n.song);n.status==="done"?(s.setDownloaded(),n.filename&&(s.setWebURL(be.downloadFileURL(n.filename)),s.setFilename(n.filename)),s.progress=100):n.status==="error"?(s.setError(),s.message=n.message||""):n.status==="downloading"?(s.setDownloading(),s.progress=n.progress||0,s.message=n.message||"",s.provider=n.provider||""):(s.web_status=yt.QUEUED,s.message=n.message||"",s.provider=n.provider||""),Ke.value.push(s)}}catch(e){console.log("Failed to load queue from server:",e)}}Mv();function wi(){const e=se(!1),t=uu();async function n(){Ke.value=Ke.value.filter(h=>!h.isDownloaded());try{await be.clearCompletedQueue()}catch(h){console.log("Failed to clear completed queue on server:",h)}}function s(h){const g=(h||"").includes("://open.spotify.com/playlist/"),b=t.settings.value.generate_m3u!==!1;return e.value=!0,(g?n():Promise.resolve()).then(()=>be.open(h)).then(v=>{if(console.log("Received Response:",v),v.status!==200){console.log("Error:",v);return}const R=v.data;if(Array.isArray(R)){for(const D of R)Ue.getBySong(D)||Ue.appendSong(D);return be.downloadBatch({songs:R,playlist_url:g?h:"",generate_m3u:b}).catch(D=>{console.log("Batch submit failed:",D.message)})}else console.log("Opened Song:",R),r(R)}).catch(v=>{console.log("Other Error:",v.message)}).finally(()=>{e.value=!1})}function o(h){return console.log("Downloading",h),Ue.getBySong(h).setDownloading(),be.download(h).then(g=>{if(console.log("Received Response:",g),g.status===200){let b=g.data;return console.log("Download Complete:",b),Ue.getBySong(h).setWebURL(be.downloadFileURL(b)),Ue.getBySong(h).setFilename(b),Ue.getBySong(h).setDownloaded(),{song:h,filename:b}}else return console.log("Error:",g),Ue.getBySong(h).setError(),{song:h,filename:null}}).catch(g=>(console.log("Other Error:",g.message),Ue.getBySong(h).setError(),{song:h,filename:null}))}function r(h,g=!0){return Ue.appendSong(h),g?o(h):Promise.resolve({song:h,filename:null})}function i(h,g){const b={...h,youtube_id:g},k=Ue.getBySong(h);return k&&(k.song.youtube_id=g,k.setDownloading(),k.progress=0,k.message=""),be.download(b).then(v=>{const R=Ue.getBySong(b);if(v.status===200){const D=v.data;return R&&(R.setWebURL(be.downloadFileURL(D)),R.setFilename(D),R.setDownloaded()),{song:b,filename:D}}return R&&R.setError(),{song:b,filename:null}}).catch(v=>{console.error("retryWithAudio error:",v.message);const R=Ue.getBySong(b);return R&&R.setError(),{song:b,filename:null}})}function a(h){const g=String(h.song_id||h.url||"");Ue.removeSong(h),g&&be.removeQueueItem(g).catch(()=>{})}async function l(){await be.clearQueue(),Ke.value=[]}async function d(){await be.clearCompletedQueue(),Ke.value=Ke.value.filter(h=>!h.isDownloaded())}function c(h){const g=Ue.getBySong(h);return g&&g.resetForRetry(),o(h)}function p(){const h=Ke.value.filter(g=>g.isErrored());for(const g of h)c(g.song);return h.length}return{fromURL:s,download:o,queue:r,retry:c,retryWithAudio:i,retryAllFailed:p,remove:a,clearAll:l,clearCompleted:d,loading:e}}const Bv={class:"relative w-full"},Hv=["placeholder"],jv=["disabled"],Br={__name:"SearchInput",props:{compact:{type:Boolean,default:!1}},setup(e){const t=Ho(),n=wi(),{t:s,locale:o}=St(),r=["https://open.spotify.com/track/4vfN00PlILRXy5dcXHQE9M","drugs - EDEN","Não Gosto Eu Amo - Henrique e Juliano","Perfect - Ed Sheeran","Lightning Crashes - Live"],i=se(0),a=me(()=>(o.value,i.value===0?s("search.placeholder"):r[i.value-1])),l=setInterval(()=>{i.value=(i.value+1)%(r.length+1)},5e3);oi(()=>clearInterval(l));function d(c){!c||!c.trim()||(t.isValidURL(c)?(n.fromURL(c),it.push({name:"Download"})):t.isValidSearch(c)&&it.push({name:"Search",params:{query:c}}))}return(c,p)=>(A(),O("div",Bv,[xe(f("input",{type:"text",placeholder:a.value,class:Ae(["input-modern",e.compact?"h-11 text-sm":"h-14 text-base"]),"onUpdate:modelValue":p[0]||(p[0]=h=>u(t).searchTerm.value=h),onKeyup:p[1]||(p[1]=np(h=>d(u(t).searchTerm.value),["enter"]))},null,42,Hv),[[et,u(t).searchTerm.value]]),f("button",{class:Ae(["absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm transition hover:scale-105 active:scale-95 disabled:opacity-60",e.compact?"h-9 w-9":"h-11 w-11"]),disabled:u(n).loading.value,onClick:p[2]||(p[2]=h=>d(u(t).searchTerm.value))},[u(n).loading.value?(A(),O("span",{key:0,class:Ae(["loading loading-spinner",e.compact?"loading-xs":"loading-sm"])},null,2)):u(t).isValidURL(u(t).searchTerm.value)?(A(),ct(u(Y),{key:1,icon:"clarity:download-line",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},null,8,["class"])):(A(),O("svg",{key:2,xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"2",stroke:"currentColor",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},[...p[3]||(p[3]=[f("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"},null,-1)])],2))],10,jv)]))}},qv={class:"relative flex min-h-[calc(100dvh-4rem)] items-center justify-center px-6 pt-24 pb-16 overflow-hidden"},Vv={class:"relative w-full max-w-2xl text-center animate-slide-up"},Wv={class:"mt-3 flex items-center justify-center gap-2"},zv={class:"badge-soft"},Kv={class:"badge-neutral-soft"},Qv={class:"mx-auto mt-5 max-w-md text-balance text-base sm:text-lg text-base-content/70"},Gv={class:"mt-10"},Yv={class:"mt-4 flex flex-wrap items-center justify-center gap-2 text-xs text-base-content/60"},Jv={class:"pill bg-white/5 border border-white/10"},Xv={class:"pill bg-white/5 border border-white/10"},Zv={class:"pill bg-white/5 border border-white/10"},e_={__name:"Hero",setup(e){const{t}=St(),n=se(localStorage.getItem("version")||"2.7.0");return en(()=>{const s=localStorage.getItem("version");s&&(n.value=s)}),(s,o)=>(A(),O("section",qv,[o[4]||(o[4]=f("div",{"aria-hidden":"true",class:"pointer-events-none absolute inset-0 -z-10"},[f("div",{class:"absolute left-1/2 top-1/4 -translate-x-1/2 h-[420px] w-[420px] rounded-full bg-primary/25 blur-[120px]"}),f("div",{class:"absolute right-10 bottom-12 h-64 w-64 rounded-full bg-primary/10 blur-3xl"})],-1)),f("div",Vv,[o[3]||(o[3]=mf('

    Downtify

    ',2)),f("div",Wv,[f("span",zv,"v"+w(n.value),1),f("span",Kv,w(u(t)("hero.noAccount")),1)]),f("p",Qv,w(u(t)("hero.tagline")),1),f("div",Gv,[H(Br,{class:"w-full"}),f("div",Yv,[f("span",Jv,[o[0]||(o[0]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ce(" "+w(u(t)("hero.songs")),1)]),f("span",Xv,[o[1]||(o[1]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ce(" "+w(u(t)("hero.albums")),1)]),f("span",Zv,[o[2]||(o[2]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ce(" "+w(u(t)("hero.playlists")),1)])])])])]))}},t_={class:"absolute top-0 inset-x-0 z-30"},n_={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},s_={class:"ml-auto flex items-center gap-1 sm:gap-2"},o_=["title"],r_=["title"],i_=["title"],a_=["title"],l_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},c_=["title"],u_=["title"],d_={__name:"NavbarFront",setup(e){const t=bi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),n=$s(),{t:s}=St();return(o,r)=>(A(),O("header",t_,[f("div",n_,[r[5]||(r[5]=f("div",{class:"flex items-center gap-2"},[f("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"}),f("span",{class:"text-lg font-bold tracking-tight"},"Downtify")],-1)),f("div",s_,[f("button",{class:"icon-btn",onClick:r[0]||(r[0]=i=>u(it).push({name:"List"})),title:u(s)("nav.library")},[H(u(Y),{icon:"clarity:library-line",class:"h-5 w-5"})],8,o_),f("button",{class:"icon-btn",onClick:r[1]||(r[1]=i=>u(it).push({name:"Player"})),title:u(s)("nav.player")},[H(u(Y),{icon:"clarity:headphones-line",class:"h-5 w-5"})],8,r_),f("button",{class:"icon-btn",onClick:r[2]||(r[2]=i=>u(it).push({name:"Monitor"})),title:u(s)("nav.monitor")},[H(u(Y),{icon:"clarity:eye-line",class:"h-5 w-5"})],8,i_),f("button",{class:"icon-btn relative",onClick:r[3]||(r[3]=i=>u(it).push({name:"Download"})),title:u(s)("nav.queue")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"}),u(n).downloadQueue.value.length>0?(A(),O("span",l_,w(u(n).downloadQueue.value.length),1)):ie("",!0)],8,a_),f("button",{class:"icon-btn",onClick:r[4]||(r[4]=i=>u(t).setTheme(u(t).currentTheme.value==="dark"?"light":"dark")),title:u(t).currentTheme.value==="dark"?u(s)("nav.switchToLight"):u(s)("nav.switchToDark")},[u(t).currentTheme.value==="dark"?(A(),ct(u(Y),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(Y),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,c_),f("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(s)("nav.settings")},[H(u(Y),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,u_)])])]))}},Eu=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},f_={components:{NavbarFront:d_,Hero:e_},setup(){return en(()=>{window.scroll(0,0)}),{}}};function p_(e,t,n,s,o,r){const i=xr("NavbarFront"),a=xr("Hero");return A(),O("div",null,[H(i),H(a)])}const h_=Eu(f_,[["render",p_]]),m_={class:"sticky top-0 z-30 glass-nav"},g_={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},y_=["title"],b_={class:"hidden md:flex flex-1 justify-center"},v_={class:"ml-auto flex items-center gap-1 sm:gap-2"},__=["title"],x_=["title"],w_=["title"],k_=["title"],S_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},E_=["title"],A_=["title"],C_={class:"md:hidden px-4 pb-3"},Ls={__name:"Navbar",setup(e){const t=ku(),n=bi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),s=$s(),o=Ho(),{t:r}=St();return(i,a)=>(A(),O("header",m_,[f("div",g_,[f("button",{class:"flex items-center gap-2 shrink-0",onClick:a[0]||(a[0]=l=>u(it).push({name:"Home"})),title:u(r)("nav.home")},[...a[6]||(a[6]=[f("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"},null,-1),f("span",{class:"hidden sm:inline text-lg font-bold tracking-tight"}," Downtify ",-1)])],8,y_),f("div",b_,[H(Br,{class:"w-full max-w-md",compact:!0})]),f("div",v_,[f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="List"}]),onClick:a[1]||(a[1]=l=>u(it).push({name:"List"})),title:u(r)("nav.library")},[H(u(Y),{icon:"clarity:library-line",class:"h-5 w-5"})],10,__),f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Player"}]),onClick:a[2]||(a[2]=l=>u(it).push({name:"Player"})),title:u(r)("nav.player")},[H(u(Y),{icon:"clarity:headphones-line",class:"h-5 w-5"})],10,x_),f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Monitor"}]),onClick:a[3]||(a[3]=l=>u(it).push({name:"Monitor"})),title:u(r)("nav.monitor")},[H(u(Y),{icon:"clarity:eye-line",class:"h-5 w-5"})],10,w_),f("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(t).name==="Download"}]),onClick:a[4]||(a[4]=l=>u(t).name==="Download"?u(it).push({name:"Search",params:{query:u(o).searchTerm.value||" "}}):u(it).push({name:"Download"})),title:u(r)("nav.queue")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"}),u(s).downloadQueue.value.length>0?(A(),O("span",S_,w(u(s).downloadQueue.value.length),1)):ie("",!0)],10,k_),f("button",{class:"icon-btn",onClick:a[5]||(a[5]=l=>u(n).setTheme(u(n).currentTheme.value==="dark"?"light":"dark")),title:u(n).currentTheme.value==="dark"?u(r)("nav.switchToLight"):u(r)("nav.switchToDark")},[u(n).currentTheme.value==="dark"?(A(),ct(u(Y),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(Y),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,E_),f("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(r)("nav.settings")},[H(u(Y),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,A_)])]),f("div",C_,[H(Br,{compact:!0})])]))}},R_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},T_={class:"mb-8"},P_={class:"text-2xl font-bold tracking-tight"},O_={class:"mt-1 text-sm text-base-content/60"},D_={class:"text-base-content/90 font-medium"},N_={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},I_={key:1,class:"space-y-3"},$_={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},L_={class:"text-base-content/50 text-sm"},U_={class:"text-base-content/40 text-xs mt-1"},F_={key:3,class:"space-y-2"},M_={class:"track-cover"},B_=["src","alt"],H_={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},j_={class:"flex-1 min-w-0"},q_={class:"flex items-center gap-2 mb-0.5"},V_={class:"font-semibold truncate"},W_={key:0,class:"badge-error-soft shrink-0"},z_={class:"text-xs text-base-content/70 truncate"},K_={key:0,class:"text-xs text-base-content/40 truncate"},Q_={key:0,class:"text-base-content/30"},G_={class:"flex items-center gap-1 shrink-0"},Y_=["href","title"],J_=["title"],X_=["onClick","title"],Z_={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},e0=["disabled","title"],t0=["onClick"],n0=["disabled","title"],fr=5,s0={__name:"SearchList",props:["data","error"],emits:["download"],setup(e,{emit:t}){const n=e,s=t,o=Ho(),r=$s(),{t:i}=St(),a=se(1),l=me(()=>{var g;return Math.ceil((((g=n.data)==null?void 0:g.length)||0)/fr)}),d=me(()=>{if(!n.data)return[];const g=(a.value-1)*fr;return n.data.slice(g,g+fr)});Mt(()=>n.data,()=>{a.value=1});function c(g){return Array.isArray(g.artists)&&g.artists.length?g.artists.join(", "):g.artist||i("common.unknownArtist")}function p(g){const b=r.getBySong(g);return b?b.isErrored()?"error":(b.isDownloaded(),"queued"):"idle"}function h(g){s("download",g)}return(g,b)=>{var k;return A(),O("div",R_,[f("div",T_,[f("h1",P_,w(u(i)("search.title")),1),f("p",O_,[u(o).searchTerm.value?(A(),O(fe,{key:0},[Ce(w(u(i)("search.matchesFor"))+" ",1),f("span",D_,' "'+w(u(o).searchTerm.value)+'" ',1),!u(o).isSearching.value&&(((k=n.data)==null?void 0:k.length)||0)>0?(A(),O(fe,{key:0},[Ce(w(n.data.length===1?u(i)("search.songsCount",{count:n.data.length}):u(i)("search.songsCountPlural",{count:n.data.length})),1)],64)):ie("",!0)],64)):(A(),O(fe,{key:1},[Ce(w(u(i)("search.typeToBegin")),1)],64))])]),n.error?(A(),O("div",N_,[H(u(Y),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),f("span",null,w(u(o).errorValue.value?u(i)("search.errorWithDetail",{detail:u(o).errorValue.value}):u(i)("search.error")),1)])):ie("",!0),u(o).isSearching.value?(A(),O("div",I_,[(A(),O(fe,null,Ie(5,v=>f("div",{key:v,class:"skeleton h-24 rounded-2xl"})),64))])):!n.data||n.data.length===0?(A(),O("div",$_,[H(u(Y),{icon:"clarity:search-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",L_,w(u(i)("search.empty")),1),f("p",U_,w(u(i)("search.emptyHint")),1)])):(A(),O("ul",F_,[(A(!0),O(fe,null,Ie(d.value,(v,R)=>(A(),O("li",{key:v.song_id||R,class:"surface rounded-2xl track-card"},[f("div",M_,[v.cover_url?(A(),O("img",{key:0,src:v.cover_url,alt:v.name,class:"h-full w-full object-cover",loading:"lazy"},null,8,B_)):(A(),O("div",H_,[H(u(Y),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),f("div",j_,[f("div",q_,[f("span",V_,w(v.name),1),v.explicit?(A(),O("span",W_,"E")):ie("",!0)]),f("p",z_,w(c(v)),1),v.album_name?(A(),O("p",K_,[Ce(w(v.album_name)+" ",1),v.year?(A(),O("span",Q_," · "+w(v.year),1)):ie("",!0)])):ie("",!0)]),f("div",G_,[v.url?(A(),O("a",{key:0,class:"icon-btn",href:v.url,target:"_blank",rel:"noopener",title:u(i)("search.openOnSpotify")},[H(u(Y),{icon:"clarity:pop-out-line",class:"h-4 w-4"})],8,Y_)):ie("",!0),p(v)==="queued"?(A(),O("button",{key:1,class:"icon-btn text-primary cursor-default",title:u(i)("search.inQueue"),disabled:""},[H(u(Y),{icon:"clarity:check-circle-line",class:"h-5 w-5"})],8,J_)):(A(),O("button",{key:2,class:"icon-btn text-primary hover:bg-primary/10",onClick:D=>h(v),title:u(i)("search.download")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"})],8,X_))])]))),128))])),l.value>1?(A(),O("nav",Z_,[f("button",{class:"icon-btn",disabled:a.value===1,onClick:b[0]||(b[0]=v=>a.value--),title:u(i)("search.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,e0),(A(!0),O(fe,null,Ie(l.value,v=>(A(),O("button",{key:v,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",v===a.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:R=>a.value=v},w(v),11,t0))),128)),f("button",{class:"icon-btn",disabled:a.value===l.value,onClick:b[1]||(b[1]=v=>a.value++),title:u(i)("search.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,n0)])):ie("",!0)])}}},o0={class:"min-h-screen"},r0={__name:"Search",setup(e){en(()=>window.scroll(0,0));const t=ku(),n=Ho(),s=wi();return Mt(()=>t.params.query,()=>{t.params.query&&n.searchFor(t.params.query)},{deep:!0}),n.searchFor(t.params.query),(o,r)=>(A(),O("div",o0,[H(Ls),H(Qn),H(s0,{data:u(n).results.value,error:u(n).error.value,onDownload:r[0]||(r[0]=i=>u(s).queue(i))},null,8,["data","error"])]))}},i0={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},a0={class:"mb-6 flex flex-wrap items-end justify-between gap-4"},l0={class:"text-2xl font-bold tracking-tight"},c0={class:"mt-1 text-sm text-base-content/60"},u0={key:0,class:"flex flex-wrap gap-2 justify-end"},d0=["title"],f0={key:0,class:"mb-6 flex flex-wrap gap-2",role:"tablist"},p0=["onClick"],h0={key:0,class:"ml-1 opacity-80 tabular-nums"},m0={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},g0={class:"text-base-content/50 text-sm"},y0={class:"text-base-content/40 text-xs mt-1"},b0={key:2,class:"surface rounded-2xl p-8 text-center text-sm text-base-content/50"},v0={key:3,class:"space-y-3"},_0={class:"flex items-center gap-4"},x0={class:"track-cover h-16 w-16 sm:h-20 sm:w-20 shrink-0"},w0=["src","alt"],k0={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},S0={class:"flex-1 min-w-0"},E0={class:"flex items-center gap-2 mb-0.5 flex-wrap"},A0={class:"font-semibold truncate"},C0={key:0,class:"badge badge-xs badge-outline opacity-80 shrink-0"},R0={class:"text-xs text-base-content/60 truncate"},T0={key:0,class:"text-xs text-base-content/50 mt-0.5 line-clamp-2"},P0={key:1,class:"text-xs text-base-content/40 truncate"},O0={key:2,class:"text-xs text-error/80 mt-1 line-clamp-2"},D0={class:"flex items-center gap-2 shrink-0"},N0=["title","onClick"],I0=["onClick","title"],$0={class:"text-[10px] font-semibold"},L0=["onClick","title"],U0={key:0,class:"mt-3 pt-3 border-t border-white/10 flex flex-wrap gap-2 items-center"},F0=["onUpdate:modelValue","placeholder"],M0=["onClick"],B0=["onClick"],H0=["onClick"],j0={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},q0=["disabled","title"],V0=["onClick"],W0=["disabled","title"],pr=10,z0={__name:"DownloadList",setup(e){const t=$s(),n=wi(),{t:s}=St(),o=se("active"),r=se(1),i=Un({}),a=Un({});function l(M){return M.isErrored()?"failed":M.isDownloaded()?"done":M.isQueued()?"queued":"active"}const d=me(()=>t.downloadQueue.value.filter(M=>l(M)==="done").length),c=me(()=>t.downloadQueue.value.filter(M=>l(M)==="failed").length),p=me(()=>t.downloadQueue.value.filter(M=>l(M)==="active").length),h=me(()=>[{id:"active",label:s("queue.filterActive"),count:p.value},{id:"queued",label:s("queue.filterQueued"),count:t.downloadQueue.value.filter(M=>l(M)==="queued").length},{id:"all",label:s("queue.filterAll"),count:t.downloadQueue.value.length},{id:"done",label:s("queue.filterDone"),count:d.value},{id:"failed",label:s("queue.filterFailed"),count:c.value}]),g=me(()=>{const M=t.downloadQueue.value;switch(o.value){case"all":return M;case"active":return M.filter(Q=>l(Q)==="active");case"queued":return M.filter(Q=>l(Q)==="queued");case"done":return M.filter(Q=>l(Q)==="done");case"failed":return M.filter(Q=>l(Q)==="failed");default:return M}}),b=me(()=>Math.ceil(g.value.length/pr)),k=me(()=>{const M=(r.value-1)*pr;return g.value.slice(M,M+pr)});Mt(o,()=>{r.value=1}),Mt(()=>g.value.length,()=>{r.value>b.value&&b.value>0&&(r.value=b.value),r.value<1&&(r.value=1)}),Mt(()=>t.downloadQueue.value.length,M=>{M===0?o.value="active":o.value==="active"&&p.value===0&&c.value>0&&(o.value="failed")});async function v(){confirm(s("queue.clearAllPrompt"))&&await n.clearAll()}async function R(){await n.clearCompleted()}function D(){n.retryAllFailed()}function C(M){return Array.isArray(M.artists)&&M.artists.length?M.artists.join(", "):M.artist||s("common.unknownArtist")}function P(M){return M.isErrored()?"badge-error-soft":M.isDownloaded()||l(M)==="active"?"badge-soft":"badge-neutral-soft"}function F(M){const Q=l(M);return Q==="active"&&M.message?s("queue.statusActive"):M.isErrored()?s("queue.statusFailed"):M.isDownloaded()?s("queue.statusDone"):s(Q==="active"?"queue.statusActive":"queue.statusQueued")}function x(M){const Q=String(M.provider||"").trim();return Q==="youtube-music"?"YouTube Music":Q==="youtube"?"YouTube":Q==="slskd"?"slskd":""}function _(M){const Q=String(M||"").match(/(?:v=|youtu\.be\/)([A-Za-z0-9_-]{6,})/);return Q?Q[1]:null}function E(M){const Q=M.song.song_id,N=_(a[Q]);if(!N){alert(s("queue.invalidYouTubeURL"));return}i[Q]=!1,n.retryWithAudio(M.song,N)}function j(M){const Q=document.createElement("a");Q.href=M,Q.download=be.downloadSaveName(M),document.body.appendChild(Q),Q.click(),document.body.removeChild(Q)}return(M,Q)=>(A(),O("div",i0,[f("div",a0,[f("div",null,[f("h1",l0,w(u(s)("queue.title")),1),f("p",c0,w(u(s)("queue.subtitle")),1)]),u(t).downloadQueue.value.length>0?(A(),O("div",u0,[c.value>0?(A(),O("button",{key:0,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:D},[H(u(Y),{icon:"clarity:refresh-line",class:"h-4 w-4 mr-1.5"}),Ce(" "+w(u(s)("queue.retryAllFailed",{count:c.value})),1)])):ie("",!0),d.value>0?(A(),O("button",{key:1,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:R},w(u(s)("queue.clearCompleted",{count:d.value})),1)):ie("",!0),f("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 text-error/70 hover:text-error",onClick:v,title:u(s)("queue.clearAll")},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4 mr-1.5"}),Ce(" "+w(u(s)("queue.clearAll")),1)],8,d0)])):ie("",!0)]),u(t).downloadQueue.value.length>0?(A(),O("div",f0,[(A(!0),O(fe,null,Ie(h.value,N=>(A(),O("button",{key:N.id,type:"button",class:Ae(["btn btn-sm rounded-full border-white/10",o.value===N.id?"btn-primary":"bg-base-100/85 hover:bg-base-100"]),onClick:te=>o.value=N.id},[Ce(w(N.label)+" ",1),N.count>0?(A(),O("span",h0,"("+w(N.count)+")",1)):ie("",!0)],10,p0))),128))])):ie("",!0),u(t).downloadQueue.value.length===0?(A(),O("div",m0,[H(u(Y),{icon:"clarity:download-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",g0,w(u(s)("queue.empty")),1),f("p",y0,w(u(s)("queue.emptyHint")),1)])):g.value.length===0?(A(),O("div",b0,w(u(s)("queue.emptyFilter")),1)):(A(),O("ul",v0,[(A(!0),O(fe,null,Ie(k.value,(N,te)=>(A(),O("li",{key:N.song.song_id||N.song.url||te,class:"surface rounded-2xl p-3 sm:p-4"},[f("div",_0,[f("div",x0,[N.song.cover_url?(A(),O("img",{key:0,src:N.song.cover_url,alt:N.song.name,class:"h-full w-full object-cover"},null,8,w0)):(A(),O("div",k0,[H(u(Y),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),f("div",S0,[f("div",E0,[f("span",A0,w(N.song.name),1),x(N)?(A(),O("span",C0,w(x(N)),1)):ie("",!0),f("span",{class:Ae([P(N),"shrink-0"])},w(F(N)),3)]),f("p",R0,w(C(N.song)),1),l(N)==="active"&&N.message?(A(),O("p",T0,w(N.message),1)):ie("",!0),N.song.album_name?(A(),O("p",P0,w(N.song.album_name),1)):ie("",!0),N.isErrored()&&N.message?(A(),O("p",O0,w(N.message),1)):ie("",!0)]),f("div",D0,[N.isErrored()?(A(),O("button",{key:0,class:"icon-btn text-primary hover:bg-primary/10",title:u(s)("queue.retry"),onClick:le=>u(n).retry(N.song)},[H(u(Y),{icon:"clarity:refresh-line",class:"h-4 w-4"})],8,N0)):ie("",!0),N.isDownloaded()?(A(),O("a",{key:1,class:"icon-btn text-primary hover:bg-primary/10",href:"javascript:;",onClick:le=>j(N.web_download_url),title:u(s)("queue.saveToDevice")},[H(u(Y),{icon:"clarity:download-line",class:"h-4 w-4"})],8,I0)):l(N)==="active"?(A(),O("div",{key:2,class:"radial-progress text-primary",style:Ln(`--value:${Math.max(0,N.progress)}; --size:2.75rem; --thickness:3px`)},[f("span",$0,w(Math.round(N.progress))+"% ",1)],4)):ie("",!0),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",onClick:le=>u(n).remove(N.song),title:u(s)("queue.removeFromQueue")},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,L0)])]),N.isErrored()&&i[N.song.song_id]?(A(),O("div",U0,[xe(f("input",{"onUpdate:modelValue":le=>a[N.song.song_id]=le,type:"text",class:"input input-sm flex-1 min-w-[12rem] rounded-xl bg-base-100/80",placeholder:u(s)("queue.overridePlaceholder")},null,8,F0),[[et,a[N.song.song_id]]]),f("button",{class:"btn btn-sm btn-primary rounded-full",onClick:le=>E(N)},w(u(s)("queue.applyOverride")),9,M0),f("button",{class:"btn btn-sm btn-ghost rounded-full",onClick:le=>i[N.song.song_id]=!1},w(u(s)("common.cancel")),9,B0)])):N.isErrored()?(A(),O("button",{key:1,type:"button",class:"mt-2 text-xs text-primary/80 hover:text-primary",onClick:le=>i[N.song.song_id]=!0},w(u(s)("queue.forceAudio")),9,H0)):ie("",!0)]))),128))])),b.value>1?(A(),O("nav",j0,[f("button",{class:"icon-btn",disabled:r.value===1,onClick:Q[0]||(Q[0]=N=>r.value--),title:u(s)("common.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,q0),(A(!0),O(fe,null,Ie(b.value,N=>(A(),O("button",{key:N,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",N===r.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:te=>r.value=N},w(N),11,V0))),128)),f("button",{class:"icon-btn",disabled:r.value===b.value,onClick:Q[1]||(Q[1]=N=>r.value++),title:u(s)("common.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,W0)])):ie("",!0)]))}},K0={class:"min-h-screen"},Q0={__name:"Download",setup(e){return en(()=>window.scroll(0,0)),(t,n)=>(A(),O("div",K0,[H(Ls),H(Qn),H(z0)]))}},Au="downtify-player-volume",Ve=se([]),ot=se(-1),bo=se(!1),Us=se(0),un=se(0),ki=se(parseFloat(localStorage.getItem(Au)||"0.85")),$n=se(!1),Gn=se("off"),dn=se(!1);let we=null,bt=[],jo=0;function qo(){return we||(we=new Audio,we.preload="metadata",we.volume=ki.value,we.addEventListener("timeupdate",()=>{Us.value=we.currentTime}),we.addEventListener("loadedmetadata",()=>{un.value=isFinite(we.duration)?we.duration:0}),we.addEventListener("durationchange",()=>{un.value=isFinite(we.duration)?we.duration:0}),we.addEventListener("ended",sx),we.addEventListener("play",()=>{bo.value=!0}),we.addEventListener("pause",()=>{bo.value=!1}),we)}function Hr(e){const t=e.replace(/\.[^.]+$/,"");let n="",s=t;const o=t.indexOf(" - ");return o>0&&(n=t.slice(0,o).trim(),s=t.slice(o+3).trim()),{file:e,url:be.downloadFileURL(e),cover:be.coverFileURL(e),title:s,artist:n,album:""}}function Si(e){if(typeof e=="string")return Hr(e);const t=String((e==null?void 0:e.file)||""),n=Hr(t),s=String((e==null?void 0:e.title)||"").trim(),o=String((e==null?void 0:e.artist)||"").trim(),r=String((e==null?void 0:e.album)||"").trim();return{file:t,url:n.url,cover:n.cover,title:s||n.title,artist:o||n.artist,album:r||n.album}}function Fs(){const e=Ve.value.map((t,n)=>n);for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}bt=e,jo=ot.value>=0?Math.max(0,bt.indexOf(ot.value)):0}function G0(e,t={}){const n=(e||[]).map(s=>typeof s=="string"?Hr(s):Si(s));Ve.value=n,ot.value>=n.length&&(ot.value=-1),dn.value&&Fs(),typeof t.startIndex=="number"?Vn(t.startIndex):t.autoplay&&n.length>0&&ot.value<0&&Vn(0)}function Vn(e){if(e<0||e>=Ve.value.length)return;const t=qo();if(ot.value=e,dn.value){bt.length!==Ve.value.length&&Fs();const n=bt.indexOf(e);n>=0&&(jo=n)}t.src=Ve.value[e].url,t.currentTime=0,Us.value=0,t.play().catch(()=>{})}function Cu(){if(Ve.value.length===0)return;const e=qo();if(ot.value<0){Vn(0);return}e.src||(e.src=Ve.value[ot.value].url),e.play().catch(()=>{})}function Ei(){we&&we.pause()}function Y0(){bo.value?Ei():Cu()}function Vo(e){const t=qo(),n=un.value||0,s=Math.max(0,Math.min(n,e));t.currentTime=s,Us.value=s}function J0(e){un.value&&Vo(un.value*Math.max(0,Math.min(1,e)))}function X0(e){const t=Math.max(0,Math.min(1,e));ki.value=t,we&&(we.volume=t);try{localStorage.setItem(Au,String(t))}catch{}t>0&&$n.value&&($n.value=!1,we&&(we.muted=!1))}function Z0(){$n.value=!$n.value,we&&(we.muted=$n.value)}function ex(){if(Ve.value.length===0)return-1;if(dn.value){bt.length!==Ve.value.length&&Fs();const t=(jo+1)%bt.length;return bt[t]}const e=ot.value+1;return e>=Ve.value.length?Gn.value==="all"?0:-1:e}function tx(){if(Ve.value.length===0)return-1;if(dn.value){bt.length!==Ve.value.length&&Fs();const t=(jo-1+bt.length)%bt.length;return bt[t]}const e=ot.value-1;return e<0?Gn.value==="all"?Ve.value.length-1:0:e}function Ru(){const e=ex();if(e<0){Ei();return}Vn(e)}function nx(){if(qo().currentTime>3){Vo(0);return}const t=tx();t<0||Vn(t)}function sx(){if(Gn.value==="one"){Vo(0),we&&we.play().catch(()=>{});return}Ru()}function Tu(e){["off","all","one"].includes(e)&&(Gn.value=e)}function ox(){const e=["off","all","one"],t=e.indexOf(Gn.value);Tu(e[(t+1)%e.length])}function Pu(e){dn.value=!!e,dn.value&&Fs()}function rx(){Pu(!dn.value)}const ix=me(()=>ot.value>=0&&ot.valueun.value>0?Us.value/un.value*100:0);function pl(e){if(!isFinite(e)||e<0)return"0:00";const t=Math.floor(e),n=Math.floor(t/60),s=t%60;return`${n}:${s.toString().padStart(2,"0")}`}function Ou(){return{playlist:Ve,currentIndex:ot,currentTrack:ix,isPlaying:bo,currentTime:Us,duration:un,progressPct:ax,volume:ki,isMuted:$n,repeatMode:Gn,shuffle:dn,setPlaylist:G0,playAt:Vn,play:Cu,pause:Ei,toggle:Y0,seek:Vo,seekRatio:J0,setVolume:X0,toggleMute:Z0,next:Ru,prev:nx,setRepeat:Tu,cycleRepeat:ox,setShuffle:Pu,toggleShuffle:rx}}const lx={class:"min-h-screen"},cx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},ux={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},dx={class:"text-2xl font-bold tracking-tight"},fx={class:"mt-1 text-sm text-base-content/60"},px={class:"flex items-center gap-2"},hx=["title"],mx=["disabled"],gx={key:0,class:"loading loading-spinner loading-xs mr-2"},yx={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},bx={key:1,class:"space-y-3"},vx={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},_x={class:"text-base-content/50 text-sm"},xx={class:"text-base-content/40 text-xs mt-1"},wx={key:3,class:"space-y-2"},kx={class:"relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden"},Sx=["src","alt","onError"],Ex={class:"flex-1 min-w-0"},Ax={class:"text-sm font-medium truncate block"},Cx={key:0,class:"text-xs text-base-content/60 truncate"},Rx={class:"text-xs text-base-content/40"},Tx={key:0,class:"mr-2 text-primary/70"},Px={class:"flex items-center gap-1 shrink-0"},Ox=["onClick","title"],Dx=["href","download","title"],Nx=["disabled","onClick","title"],Ix={key:0,class:"loading loading-spinner loading-xs"},$x={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},Lx=["disabled","title"],Ux=["onClick"],Fx=["disabled","title"],Mx={key:5,class:"mt-6 text-xs text-base-content/40 text-center"},hr=10,Bx={__name:"Downloads",setup(e){const{t}=St(),n=Ou(),s=Fv(),o=se([]),r=se(!1),i=se(""),a=se({}),l=se({}),d=se(1),c=me(()=>Math.ceil(o.value.length/hr)),p=me(()=>{const P=(d.value-1)*hr;return o.value.slice(P,P+hr)});Mt(o,()=>{d.value=1});function h(P){return be.coverFileURL(P)}function g(P){l.value={...l.value,[P]:!0}}async function b(){r.value=!0,i.value="";try{const P=await be.listDownloads();o.value=(P.data||[]).map(Si)}catch{i.value=t("library.failedLoad")}finally{r.value=!1}}async function k(P){if(confirm(t("library.deletePrompt",{file:P}))){a.value={...a.value,[P]:!0};try{await be.deleteDownload(P),o.value=o.value.filter(F=>F!==P)}catch{i.value=t("library.failedDelete",{file:P})}finally{a.value={...a.value,[P]:!1}}}}function v(P){const F=P.lastIndexOf(".");return F>0?P.slice(F+1).toUpperCase():""}function R(P){const F=P.lastIndexOf("/");return F>=0?P.slice(0,F):""}function D(P){const F=o.value.findIndex(x=>x.file===P.file);F<0||(n.setPlaylist(o.value,{startIndex:F}),s.push({name:"Player"}))}function C(){o.value.length&&(n.setPlaylist(o.value,{startIndex:0}),s.push({name:"Player"}))}return en(b),(P,F)=>(A(),O("div",lx,[H(Ls),H(Qn),f("div",cx,[f("div",ux,[f("div",null,[f("h1",dx,w(u(t)("library.title")),1),f("p",fx,w(u(t)("library.subtitle")),1)]),f("div",px,[o.value.length>0?(A(),O("button",{key:0,class:"btn btn-primary btn-sm h-11 px-5 rounded-full",onClick:C,title:u(t)("library.play")},[H(u(Y),{icon:"clarity:play-line",class:"h-4 w-4 mr-1.5"}),Ce(" "+w(u(t)("library.play")),1)],8,hx)):ie("",!0),f("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:b,disabled:r.value},[r.value?(A(),O("span",gx)):(A(),ct(u(Y),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4 mr-2"})),Ce(" "+w(u(t)("common.refresh")),1)],8,mx)])]),i.value?(A(),O("div",yx,[H(u(Y),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),f("span",null,w(i.value),1)])):ie("",!0),r.value&&o.value.length===0?(A(),O("div",bx,[(A(),O(fe,null,Ie(4,x=>f("div",{key:x,class:"skeleton h-16 rounded-2xl"})),64))])):o.value.length===0?(A(),O("div",vx,[H(u(Y),{icon:"clarity:library-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",_x,w(u(t)("library.empty")),1),f("p",xx,w(u(t)("library.emptyHint")),1)])):(A(),O("ul",wx,[(A(!0),O(fe,null,Ie(p.value,x=>(A(),O("li",{key:x.file,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-3"},[f("div",kx,[l.value[x.file]?(A(),ct(u(Y),{key:1,icon:"clarity:music-note-line",class:"h-5 w-5"})):(A(),O("img",{key:0,src:h(x.file),alt:x.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:_=>g(x.file)},null,40,Sx))]),f("div",Ex,[f("span",Ax,w(x.title),1),x.artist?(A(),O("p",Cx,w(x.artist),1)):ie("",!0),f("span",Rx,[R(x.file)?(A(),O("span",Tx,[H(u(Y),{icon:"clarity:folder-line",class:"inline h-3 w-3 mr-0.5 align-text-top"}),Ce(w(R(x.file)),1)])):ie("",!0),Ce(" "+w(v(x.file)),1)])]),f("div",Px,[f("button",{class:"icon-btn text-primary hover:bg-primary/10",onClick:_=>D(x),title:u(t)("library.play")},[H(u(Y),{icon:"clarity:play-line",class:"h-4 w-4"})],8,Ox),f("a",{class:"icon-btn",href:u(be).downloadFileURL(x.file),download:u(be).downloadSaveName(x.file),title:u(t)("library.downloadToDevice")},[H(u(Y),{icon:"clarity:download-line",class:"h-4 w-4"})],8,Dx),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",disabled:a.value[x.file]===!0,onClick:_=>k(x.file),title:u(t)("library.deleteFile")},[a.value[x.file]===!0?(A(),O("span",Ix)):(A(),ct(u(Y),{key:1,icon:"clarity:trash-line",class:"h-4 w-4"}))],8,Nx)])]))),128))])),c.value>1?(A(),O("nav",$x,[f("button",{class:"icon-btn",disabled:d.value===1,onClick:F[0]||(F[0]=x=>d.value--),title:u(t)("common.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,Lx),(A(!0),O(fe,null,Ie(c.value,x=>(A(),O("button",{key:x,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",x===d.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:_=>d.value=x},w(x),11,Ux))),128)),f("button",{class:"icon-btn",disabled:d.value===c.value,onClick:F[1]||(F[1]=x=>d.value++),title:u(t)("common.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,Fx)])):ie("",!0),o.value.length>0?(A(),O("p",Mx,w(o.value.length===1?u(t)("library.countOne",{count:o.value.length}):u(t)("library.countMany",{count:o.value.length})),1)):ie("",!0)])]))}},Ms=Pe.create({baseURL:`${Ye.PROTOCOL}//${Ye.BACKEND}:${Ye.PORT}${Ye.BASEURL}`});function Hx(){return Ms.get("/api/monitor/playlists")}function jx(e,t=60){return Ms.post("/api/monitor/playlists",{url:e,interval_minutes:t})}function qx(e,t){return Ms.patch(`/api/monitor/playlists/${e}`,t)}function Vx(e){return Ms.delete(`/api/monitor/playlists/${e}`)}function Wx(e){return Ms.post(`/api/monitor/playlists/${e}/check`)}const yn={listMonitoredPlaylists:Hx,addMonitoredPlaylist:jx,updateMonitoredPlaylist:qx,deleteMonitoredPlaylist:Vx,checkMonitoredPlaylist:Wx},zx={class:"min-h-screen"},Kx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},Qx={class:"mb-8"},Gx={class:"text-2xl font-bold tracking-tight"},Yx={class:"mt-1 text-sm text-base-content/60"},Jx={class:"surface rounded-2xl p-5 mb-8"},Xx={class:"text-sm font-semibold uppercase tracking-wider text-base-content/50 mb-4"},Zx=["placeholder","disabled"],e1={class:"flex items-center gap-2 shrink-0"},t1=["disabled"],n1={value:15},s1={value:30},o1={value:60},r1={value:180},i1={value:360},a1={value:720},l1={value:1440},c1={value:10080},u1={value:20160},d1={value:43200},f1=["disabled"],p1={key:0,class:"loading loading-spinner loading-xs"},h1={key:1},m1={key:0,class:"mt-2 text-xs text-error"},g1={key:0,class:"space-y-3"},y1={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},b1={class:"text-base-content/50 text-sm"},v1={class:"text-base-content/40 text-xs mt-1"},_1={key:2,class:"space-y-3"},x1={class:"flex-1 min-w-0"},w1={class:"flex items-center gap-2 mb-1"},k1={class:"font-semibold truncate"},S1={class:"flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-base-content/50"},E1={key:0},A1={key:1,class:"italic"},C1={class:"flex items-center gap-2 shrink-0"},R1=["value","onChange"],T1={value:15},P1={value:30},O1={value:60},D1={value:180},N1={value:360},I1={value:720},$1={value:1440},L1={value:10080},U1={value:20160},F1={value:43200},M1=["title","onClick"],B1=["title","disabled","onClick"],H1={key:0,class:"loading loading-spinner loading-xs"},j1=["title","onClick"],q1={class:"mt-8 surface rounded-2xl p-4 flex gap-3 text-sm text-base-content/60"},V1={__name:"Monitor",setup(e){const{t}=St(),n=se([]),s=se(!1),o=se(!1),r=se(""),i=se(""),a=se(60),l=se({});async function d(){s.value=!0;try{const R=await yn.listMonitoredPlaylists();n.value=R.data||[]}finally{s.value=!1}}async function c(){var R,D;r.value="",o.value=!0;try{const C=await yn.addMonitoredPlaylist(i.value.trim(),a.value);n.value.unshift(C.data),i.value=""}catch(C){r.value=((D=(R=C==null?void 0:C.response)==null?void 0:R.data)==null?void 0:D.detail)||t("monitor.failedAdd")}finally{o.value=!1}}async function p(R){try{const D=await yn.updateMonitoredPlaylist(R.id,{enabled:!R.enabled});Object.assign(R,D.data)}catch{}}async function h(R,D){const C=parseInt(D.target.value,10);try{const P=await yn.updateMonitoredPlaylist(R.id,{interval_minutes:C});Object.assign(R,P.data)}catch{}}async function g(R){l.value={...l.value,[R.id]:!0};try{await yn.checkMonitoredPlaylist(R.id),setTimeout(async()=>{try{const D=await yn.listMonitoredPlaylists();n.value=D.data||[]}finally{l.value={...l.value,[R.id]:!1}}},3e3)}catch{l.value={...l.value,[R.id]:!1}}}async function b(R){if(confirm(t("monitor.deletePrompt",{name:R.name})))try{await yn.deleteMonitoredPlaylist(R.id),n.value=n.value.filter(D=>D.id!==R.id)}catch{}}function k(R){if(R<60)return`${R} ${t("monitor.minSuffix")}`;if(R<1440)return`${R/60} ${t("monitor.hourSuffix")}`;if(R<10080){const C=R/1440;return`${C} ${t(C===1?"monitor.daySuffix":"monitor.daysSuffix")}`}if(R<43200){const C=R/10080;return`${C} ${t(C===1?"monitor.weekSuffix":"monitor.weeksSuffix")}`}const D=Math.round(R/43200);return`${D} ${t(D===1?"monitor.monthSuffix":"monitor.monthsSuffix")}`}function v(R){try{const D=Date.now()-new Date(R).getTime(),C=Math.floor(D/6e4);if(C<1)return t("monitor.timeJustNow");if(C<60)return t("monitor.timeMinAgo",{n:C});const P=Math.floor(C/60);return P<24?t("monitor.timeHourAgo",{n:P}):t("monitor.timeDayAgo",{n:Math.floor(P/24)})}catch{return""}}return en(d),(R,D)=>(A(),O("div",zx,[H(Ls),H(Qn),f("div",Kx,[f("div",Qx,[f("h1",Gx,w(u(t)("monitor.title")),1),f("p",Yx,w(u(t)("monitor.subtitle")),1)]),f("div",Jx,[f("h2",Xx,w(u(t)("monitor.watchNew")),1),f("form",{onSubmit:ep(c,["prevent"]),class:"flex flex-col sm:flex-row gap-3"},[xe(f("input",{"onUpdate:modelValue":D[0]||(D[0]=C=>i.value=C),type:"text",placeholder:u(t)("monitor.urlPlaceholder"),class:"input-modern flex-1 h-11 text-sm",disabled:o.value},null,8,Zx),[[et,i.value]]),f("div",e1,[xe(f("select",{"onUpdate:modelValue":D[1]||(D[1]=C=>a.value=C),class:"select select-sm rounded-full border border-white/10 bg-base-100/85 focus:border-primary/60 h-11 px-3 text-sm",disabled:o.value},[f("option",n1,w(u(t)("monitor.every15")),1),f("option",s1,w(u(t)("monitor.every30")),1),f("option",o1,w(u(t)("monitor.every1h")),1),f("option",r1,w(u(t)("monitor.every3h")),1),f("option",i1,w(u(t)("monitor.every6h")),1),f("option",a1,w(u(t)("monitor.every12h")),1),f("option",l1,w(u(t)("monitor.every1d")),1),f("option",c1,w(u(t)("monitor.every1w")),1),f("option",u1,w(u(t)("monitor.every2w")),1),f("option",d1,w(u(t)("monitor.every1mo")),1)],8,t1),[[Xs,a.value]]),f("button",{type:"submit",class:"btn btn-primary btn-sm h-11 px-5 rounded-full",disabled:o.value||!i.value.trim()},[o.value?(A(),O("span",p1)):(A(),O("span",h1,w(u(t)("monitor.watch")),1))],8,f1)])],32),r.value?(A(),O("p",m1,w(r.value),1)):ie("",!0)]),s.value?(A(),O("div",g1,[(A(),O(fe,null,Ie(3,C=>f("div",{key:C,class:"skeleton h-24 rounded-2xl"})),64))])):n.value.length===0?(A(),O("div",y1,[H(u(Y),{icon:"clarity:music-note-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",b1,w(u(t)("monitor.empty")),1),f("p",v1,w(u(t)("monitor.emptyHint")),1)])):(A(),O("ul",_1,[(A(!0),O(fe,null,Ie(n.value,C=>(A(),O("li",{key:C.id,class:"surface rounded-2xl p-4 sm:p-5 flex flex-col sm:flex-row sm:items-center gap-4"},[f("div",x1,[f("div",w1,[f("span",k1,w(C.name),1),f("span",{class:Ae(["pill shrink-0",C.enabled?"badge-soft":"badge-neutral-soft"])},w(C.enabled?u(t)("monitor.active"):u(t)("monitor.paused")),3)]),f("div",S1,[f("span",null,[H(u(Y),{icon:"clarity:refresh-line",class:"inline h-3 w-3 mr-0.5"}),Ce(" "+w(u(t)("monitor.everyInterval",{interval:k(C.interval_minutes)})),1)]),f("span",null,[H(u(Y),{icon:"clarity:music-note-line",class:"inline h-3 w-3 mr-0.5"}),Ce(" "+w(C.last_track_count===1?u(t)("monitor.tracksOne",{count:C.last_track_count}):u(t)("monitor.tracksMany",{count:C.last_track_count})),1)]),C.last_checked?(A(),O("span",E1,[H(u(Y),{icon:"clarity:clock-line",class:"inline h-3 w-3 mr-0.5"}),Ce(" "+w(u(t)("monitor.checked",{when:v(C.last_checked)})),1)])):(A(),O("span",A1,w(u(t)("monitor.notChecked")),1))])]),f("div",C1,[f("select",{value:C.interval_minutes,onChange:P=>h(C,P),class:"select select-xs rounded-full border border-white/10 bg-base-100/60 text-xs focus:border-primary/60"},[f("option",T1,w(u(t)("monitor.short15")),1),f("option",P1,w(u(t)("monitor.short30")),1),f("option",O1,w(u(t)("monitor.short1h")),1),f("option",D1,w(u(t)("monitor.short3h")),1),f("option",N1,w(u(t)("monitor.short6h")),1),f("option",I1,w(u(t)("monitor.short12h")),1),f("option",$1,w(u(t)("monitor.short1d")),1),f("option",L1,w(u(t)("monitor.short1w")),1),f("option",U1,w(u(t)("monitor.short2w")),1),f("option",F1,w(u(t)("monitor.short1mo")),1)],40,R1),f("button",{class:"icon-btn",title:C.enabled?u(t)("monitor.pause"):u(t)("monitor.resume"),onClick:P=>p(C)},[H(u(Y),{icon:C.enabled?"clarity:pause-line":"clarity:play-line",class:"h-4 w-4"},null,8,["icon"])],8,M1),f("button",{class:"icon-btn",title:u(t)("monitor.checkNow"),disabled:l.value[C.id],onClick:P=>g(C)},[l.value[C.id]?(A(),O("span",H1)):(A(),ct(u(Y),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4"}))],8,B1),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",title:u(t)("monitor.stop"),onClick:P=>b(C)},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,j1)])]))),128))])),f("div",q1,[H(u(Y),{icon:"clarity:info-standard-line",class:"h-5 w-5 shrink-0 mt-0.5 text-primary/70"}),f("p",null,w(u(t)("monitor.info")),1)])])]))}},W1={class:"min-h-screen"},z1={class:"mx-auto max-w-5xl px-4 py-8 sm:px-6"},K1={class:"mb-8"},Q1={class:"text-2xl font-bold tracking-tight"},G1={class:"mt-1 text-sm text-base-content/60"},Y1={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},J1={class:"text-base-content/50 text-sm"},X1={class:"text-base-content/40 text-xs mt-1"},Z1={key:1,class:"space-y-3"},ew={key:2,class:"grid gap-6 lg:grid-cols-[1fr_360px]"},tw={class:"surface rounded-3xl p-6 sm:p-8 flex flex-col items-center text-center"},nw=["src","alt"],sw={key:2,class:"absolute bottom-3 right-3 equalizer h-5","aria-hidden":"true"},ow={class:"mt-6 w-full"},rw={class:"text-xl font-bold tracking-tight truncate"},iw={class:"text-sm text-base-content/60 truncate mt-0.5"},aw={class:"mt-6 w-full"},lw={class:"mt-2 flex items-center justify-between text-xs text-base-content/50 tabular-nums"},cw={class:"mt-5 flex items-center justify-center gap-3"},uw=["title"],dw=["title","disabled"],fw=["disabled","title"],pw=["title","disabled"],hw=["title"],mw={key:0,class:"absolute -bottom-0.5 -right-0.5 h-4 min-w-[1rem] px-1 rounded-full bg-primary text-primary-content text-[9px] font-bold flex items-center justify-center"},gw={class:"mt-6 w-full max-w-xs flex items-center gap-3"},yw=["title"],bw=["value","title"],vw={class:"surface rounded-3xl p-4 sm:p-5 lg:max-h-[640px] lg:overflow-y-auto"},_w={class:"flex items-center justify-between mb-3 px-1"},xw={class:"text-xs font-semibold uppercase tracking-wider text-base-content/50"},ww={class:"text-[11px] text-base-content/40"},kw={key:0,class:"space-y-1"},Sw=["onClick"],Ew=["src","alt","onError"],Aw={key:1,class:"relative equalizer h-3","aria-hidden":"true"},Cw={class:"flex-1 min-w-0"},Rw={class:"text-sm truncate font-medium"},Tw={class:"text-[11px] truncate text-base-content/50"},Pw={key:1,class:"text-center py-10"},Ow={class:"text-base-content/50 text-sm"},Dw={__name:"Player",setup(e){const{t}=St(),n=Ou(),s=se([]),o=se(!1),r=se(null),i=se({});let a=!1;function l(F){return be.coverFileURL(F)}function d(F){i.value={...i.value,[F]:!0}}async function c(){o.value=!0;try{const F=await be.listDownloads();s.value=(F.data||[]).map(Si),n.playlist.value.length===0&&s.value.length>0&&n.setPlaylist(s.value)}finally{o.value=!1}}function p(F){var x,_;n.playlist.value.length!==s.value.length||((x=n.playlist.value[F])==null?void 0:x.file)!==((_=s.value[F])==null?void 0:_.file)?n.setPlaylist(s.value,{startIndex:F}):n.playAt(F)}const h=me(()=>{const F=n.currentTrack.value;return F&&F.title?F.title:t("player.empty")}),g=me(()=>{const F=n.currentTrack.value;return F&&F.artist?F.artist:F?t("common.unknownArtist"):""}),b=me(()=>n.repeatMode.value==="one"?t("player.repeatOne"):n.repeatMode.value==="all"?t("player.repeatAll"):t("player.repeatOff"));function k(F){n.setVolume(parseFloat(F.target.value))}function v(F){const x=r.value;if(!x)return 0;const _=x.getBoundingClientRect(),E=(F.clientX||0)-_.left;return Math.max(0,Math.min(1,E/_.width))}function R(F){n.seekRatio(v(F))}function D(F){a=!0,n.seekRatio(v(F)),window.addEventListener("pointermove",C),window.addEventListener("pointerup",P,{once:!0})}function C(F){a&&n.seekRatio(v(F))}function P(){a=!1,window.removeEventListener("pointermove",C)}return en(()=>{window.scroll(0,0),c()}),ri(()=>{window.removeEventListener("pointermove",C)}),(F,x)=>(A(),O("div",W1,[H(Ls),H(Qn),f("div",z1,[f("div",K1,[f("h1",Q1,w(u(t)("player.title")),1),f("p",G1,w(u(t)("player.subtitle")),1)]),s.value.length===0&&!o.value?(A(),O("div",Y1,[H(u(Y),{icon:"clarity:headphones-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",J1,w(u(t)("player.empty")),1),f("p",X1,w(u(t)("player.emptyHint")),1)])):o.value&&!u(n).currentTrack.value?(A(),O("div",Z1,[...x[8]||(x[8]=[f("div",{class:"skeleton h-72 rounded-3xl"},null,-1),f("div",{class:"skeleton h-16 rounded-2xl"},null,-1),f("div",{class:"skeleton h-16 rounded-2xl"},null,-1)])])):(A(),O("div",ew,[f("section",tw,[f("div",{class:Ae(["relative h-56 w-56 sm:h-64 sm:w-64 rounded-3xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden shadow-glow",{"pulse-glow":u(n).isPlaying.value}])},[u(n).currentTrack.value&&u(n).currentTrack.value.cover&&!i.value[u(n).currentTrack.value.file]?(A(),O("img",{key:0,src:u(n).currentTrack.value.cover,alt:u(n).currentTrack.value.title,class:"absolute inset-0 h-full w-full object-cover",onError:x[0]||(x[0]=_=>d(u(n).currentTrack.value.file))},null,40,nw)):(A(),ct(u(Y),{key:1,icon:"clarity:music-note-line",class:"h-24 w-24"})),u(n).isPlaying.value?(A(),O("div",sw,[...x[9]||(x[9]=[f("span",null,null,-1),f("span",null,null,-1),f("span",null,null,-1)])])):ie("",!0)],2),f("div",ow,[f("p",rw,w(h.value),1),f("p",iw,w(g.value),1)]),f("div",aw,[f("div",{class:"relative h-2 rounded-full bg-white/10 overflow-hidden cursor-pointer group",ref_key:"progressBar",ref:r,onClick:R,onPointerdown:D},[f("div",{class:"h-full bg-primary transition-[width] duration-150",style:Ln(`width: ${u(n).progressPct.value}%`)},null,4),f("div",{class:"absolute top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded-full bg-primary shadow-glow-sm transition-all duration-150 opacity-0 group-hover:opacity-100",style:Ln(`left: calc(${u(n).progressPct.value}% - 7px)`)},null,4)],544),f("div",lw,[f("span",null,w(u(pl)(u(n).currentTime.value)),1),f("span",null,w(u(pl)(u(n).duration.value)),1)])]),f("div",cw,[f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(n).shuffle.value}]),onClick:x[1]||(x[1]=_=>u(n).toggleShuffle()),title:u(n).shuffle.value?u(t)("player.shuffleOn"):u(t)("player.shuffleOff")},[H(u(Y),{icon:"clarity:shuffle-line",class:"h-5 w-5"})],10,uw),f("button",{class:"icon-btn",onClick:x[2]||(x[2]=_=>u(n).prev()),title:u(t)("player.previous"),disabled:s.value.length===0},[H(u(Y),{icon:"clarity:step-forward-2-line",class:"h-5 w-5 -scale-x-100"})],8,dw),f("button",{class:"inline-flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm hover:scale-105 active:scale-95 transition disabled:opacity-50",onClick:x[3]||(x[3]=_=>u(n).toggle()),disabled:s.value.length===0,title:u(n).isPlaying.value?u(t)("player.pause"):u(t)("player.play")},[H(u(Y),{icon:u(n).isPlaying.value?"clarity:pause-solid":"clarity:play-solid",class:"h-6 w-6"},null,8,["icon"])],8,fw),f("button",{class:"icon-btn",onClick:x[4]||(x[4]=_=>u(n).next()),title:u(t)("player.next"),disabled:s.value.length===0},[H(u(Y),{icon:"clarity:step-forward-2-line",class:"h-5 w-5"})],8,pw),f("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(n).repeatMode.value!=="off"}]),onClick:x[5]||(x[5]=_=>u(n).cycleRepeat()),title:b.value},[H(u(Y),{icon:"clarity:refresh-line",class:"h-5 w-5"}),u(n).repeatMode.value==="one"?(A(),O("span",mw," 1 ")):ie("",!0)],10,hw)]),f("div",gw,[f("button",{class:"icon-btn",onClick:x[6]||(x[6]=_=>u(n).toggleMute()),title:u(n).isMuted.value?u(t)("player.unmute"):u(t)("player.mute")},[H(u(Y),{icon:u(n).isMuted.value||u(n).volume.value===0?"clarity:volume-mute-line":u(n).volume.value<.5?"clarity:volume-down-line":"clarity:volume-up-line",class:"h-5 w-5"},null,8,["icon"])],8,yw),f("input",{type:"range",min:"0",max:"1",step:"0.01",value:u(n).isMuted.value?0:u(n).volume.value,onInput:x[7]||(x[7]=_=>k(_)),class:"player-range flex-1",title:u(t)("player.volume")},null,40,bw)])]),f("aside",vw,[f("div",_w,[f("h2",xw,w(u(t)("player.queue")),1),f("span",ww,w(s.value.length===1?u(t)("player.countOne",{count:s.value.length}):u(t)("player.countMany",{count:s.value.length})),1)]),s.value.length>0?(A(),O("ul",kw,[(A(!0),O(fe,null,Ie(s.value,(_,E)=>(A(),O("li",{key:_.file,class:Ae(["rounded-xl px-2 py-2 flex items-center gap-3 cursor-pointer transition-colors",E===u(n).currentIndex.value?"bg-primary/10 text-primary":"hover:bg-white/5"]),onClick:j=>p(E)},[f("div",{class:Ae(["relative h-9 w-9 shrink-0 rounded-lg overflow-hidden flex items-center justify-center",E===u(n).currentIndex.value?"bg-primary/15":"bg-base-100/60"])},[i.value[_.file]?ie("",!0):(A(),O("img",{key:0,src:l(_.file),alt:_.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:j=>d(_.file)},null,40,Ew)),E===u(n).currentIndex.value&&u(n).isPlaying.value?(A(),O("span",Aw,[...x[10]||(x[10]=[f("span",null,null,-1),f("span",null,null,-1),f("span",null,null,-1)])])):i.value[_.file]?(A(),ct(u(Y),{key:2,icon:"clarity:music-note-line",class:"h-4 w-4 text-base-content/50"})):ie("",!0)],2),f("div",Cw,[f("p",Rw,w(_.title),1),f("p",Tw,w(_.artist||u(t)("common.unknownArtist")),1)])],10,Sw))),128))])):(A(),O("div",Pw,[f("p",Ow,w(u(t)("player.empty")),1)]))])]))])]))}},Nw=Eu(Dw,[["__scopeId","data-v-98956c70"]]),Iw=[{path:"/",name:"Home",component:h_},{path:"/search/:query",name:"Search",component:r0},{path:"/download",name:"Download",component:Q0},{path:"/list",name:"List",component:Bx},{path:"/monitor",name:"Monitor",component:V1},{path:"/player",name:"Player",component:Nw}],it=Uv({history:mv(Ye.BASEURL),routes:Iw}),Du=rp(Ob);Du.use(it);Du.mount("#app"); diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 8287a9e..67c6cf9 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -5,8 +5,8 @@ Downtify - - + +
    diff --git a/frontend/src/components/Settings.vue b/frontend/src/components/Settings.vue index 6d889c1..d3d478b 100644 --- a/frontend/src/components/Settings.vue +++ b/frontend/src/components/Settings.vue @@ -229,6 +229,90 @@ + +
    + +

    + {{ t('settings.youtubeCookiesHint') }} +

    + +
    +

    + {{ t('settings.youtubeCookiesWeak') }} +

    +

    + {{ t('settings.youtubeCookiesMissing') }} +

    + + +
    + + +
    +

    + {{ youtubeCookiesError }} +

    +
    +
    +
    - -
    - -
    -

    - {{ t('settings.youtubeCookiesHint') }} -

    -

    - {{ t('settings.youtubeCookiesWeak') }} -

    -

    - {{ t('settings.youtubeCookiesMissing') }} -

    - -
    - - -
    -

    - {{ youtubeCookiesError }} -

    -
    -
    - Date: Fri, 29 May 2026 10:39:31 +0200 Subject: [PATCH 24/58] Score slskd search results and require confident artist+title match. Require artist and title in filenames, tighten duration for short titles, rank all candidates by score, enforce minimum score before download, and log pick reasons. Try next ranked file when transfer fails. Co-authored-by: Cursor --- downtify/slskd_provider.py | 254 +++++++++++++++++++++++++++++----- tests/test_slskd_responses.py | 110 ++++++++++++++- 2 files changed, 325 insertions(+), 39 deletions(-) diff --git a/downtify/slskd_provider.py b/downtify/slskd_provider.py index 7faf336..411795b 100644 --- a/downtify/slskd_provider.py +++ b/downtify/slskd_provider.py @@ -89,6 +89,16 @@ def _past_deadline(deadline: float) -> bool: 'acapella', 'karaoke', ) +_PATH_PENALTY_KEYWORDS = ( + 'unreleased', + 'bootleg', + 'mixtape', + 'discography', +) +_AMBIGUOUS_TITLE_ALNUM_LEN = 4 +_DEFAULT_MATCH_MIN_SCORE = 5 +_STRICT_DURATION_SECONDS = 3 +_DEFAULT_DURATION_TOLERANCE_SECONDS = 10 class SlskdClient: @@ -436,18 +446,122 @@ def _filter_slskd_responses( return [r for r in responses if _response_has_free_slot(r)] -def _collect_matching_files( - song: dict[str, Any], responses: list[dict[str, Any]] -) -> list[dict[str, Any]]: +def _song_duration_seconds(song: dict[str, Any]) -> int: + target_duration = int(song.get('duration') or 0) + if target_duration > 1000: + return target_duration // 1000 + return target_duration + + +def _title_is_ambiguous(title_alnum: str) -> bool: + return len(title_alnum) < _AMBIGUOUS_TITLE_ALNUM_LEN + + +def _match_min_score(settings: dict[str, Any]) -> int: + try: + value = int(settings.get('match_min_score') or _DEFAULT_MATCH_MIN_SCORE) + except (TypeError, ValueError): + value = _DEFAULT_MATCH_MIN_SCORE + return max(0, value) + + +def _score_slskd_candidate( + song: dict[str, Any], + filename: str, + file_row: dict[str, Any], + *, + target_duration: int, +) -> Optional[tuple[int, list[str]]]: + """Return (score, reasons) or None when hard requirements fail.""" artist = _alnum_only( ' '.join(str(a) for a in (song.get('artists') or [])[:1]) ) album = _alnum_only(str(song.get('album_name') or '')) title = _alnum_only(_primary_title(str(song.get('name') or ''))) - target_duration = int(song.get('duration') or 0) - if target_duration > 1000: - target_duration = target_duration // 1000 - matches: list[dict[str, Any]] = [] + sanitized_name = _alnum_only(filename) + basename = _file_basename(filename) + base_alnum = _alnum_only(basename) + + if artist and artist not in sanitized_name: + return None + if title and title not in sanitized_name: + return None + if not artist and not title: + return None + + length = _parse_duration_seconds( + file_row.get('length') or file_row.get('duration') + ) + if _title_is_ambiguous(title): + if not (target_duration and length): + return None + if abs(target_duration - length) > _STRICT_DURATION_SECONDS: + return None + elif ( + target_duration + and length + and abs(target_duration - length) > _DEFAULT_DURATION_TOLERANCE_SECONDS + ): + return None + + score = 0 + reasons: list[str] = [] + + if artist and base_alnum.startswith(artist): + score += 3 + reasons.append('artist_prefix') + elif artist and artist in base_alnum: + score += 1 + reasons.append('artist') + + if title and title in base_alnum: + score += 2 + reasons.append('title') + if artist and base_alnum.find(artist) < base_alnum.find(title): + score += 2 + reasons.append('artist_before_title') + + if target_duration and length: + delta = abs(target_duration - length) + if delta <= _STRICT_DURATION_SECONDS: + score += 3 + reasons.append('duration_3s') + elif delta <= _DEFAULT_DURATION_TOLERANCE_SECONDS: + score += 1 + reasons.append('duration_10s') + + if album and album in sanitized_name: + score += 1 + reasons.append('album') + + path_folded = filename.casefold() + if any(keyword in path_folded for keyword in _PATH_PENALTY_KEYWORDS): + score -= 2 + reasons.append('path_penalty') + + try: + bitrate = int(file_row.get('bitRate') or file_row.get('bitrate') or 0) + except (TypeError, ValueError): + bitrate = 0 + if bitrate >= 320: + score += 1 + reasons.append('bitrate_320') + elif bitrate >= 192: + score += 1 + reasons.append('bitrate_192') + + return score, reasons + + +def _rank_slskd_candidates( + song: dict[str, Any], + responses: list[dict[str, Any]], + settings: Optional[dict[str, Any]] = None, +) -> list[dict[str, Any]]: + """Score and sort all viable files (highest confidence first).""" + _ = settings + target_duration = _song_duration_seconds(song) + ranked: list[dict[str, Any]] = [] for resp in _filter_slskd_responses(responses): if int(resp.get('fileCount') or 0) <= 0: @@ -474,26 +588,46 @@ def _collect_matching_files( continue if _contains_keyword(song, filename): continue - length = _parse_duration_seconds( - file_row.get('length') or file_row.get('duration') + + scored = _score_slskd_candidate( + song, + filename, + file_row, + target_duration=target_duration, ) - if target_duration and length and abs(target_duration - length) > 10: - continue - sanitized_name = _alnum_only(filename) - if not ( - (artist and artist in sanitized_name) - or (album and album in sanitized_name) - ): + if scored is None: continue - if title and title not in sanitized_name: - continue - matches.append({**file_row, 'username': username, 'filename': filename}) - return matches + score, reasons = scored + ranked.append( + { + **file_row, + 'username': username, + 'filename': filename, + 'match_score': score, + 'match_reasons': reasons, + } + ) + + ranked.sort( + key=lambda row: ( + -int(row.get('match_score') or 0), + -int(row.get('bitRate') or row.get('bitrate') or 0), + ) + ) + return ranked -def _filter_by_quality( - files: list[dict[str, Any]], settings: dict[str, Any] +def _collect_matching_files( + song: dict[str, Any], responses: list[dict[str, Any]] ) -> list[dict[str, Any]]: + """Ranked candidates without applying the minimum score gate (tests).""" + return _rank_slskd_candidates(song, responses) + + +def _select_download_candidates( + ranked: list[dict[str, Any]], settings: dict[str, Any] +) -> list[dict[str, Any]]: + """Pick up to download_attempts files, preferring extension order at equal score.""" raw_ext = settings.get('extensions') or ['mp3', 'flac'] extensions = [ str(e).strip().lower().lstrip('.') @@ -502,21 +636,44 @@ def _filter_by_quality( ] or ['mp3', 'flac'] min_bitrate = int(settings.get('min_bitrate') or 0) max_files = int(settings.get('download_attempts') or 3) - filtered: list[dict[str, Any]] = [] - for ext in extensions: - for file_row in files: - if _file_extension(str(file_row.get('filename') or '')) != ext: + + by_score: dict[int, list[dict[str, Any]]] = {} + for row in ranked: + by_score.setdefault(int(row.get('match_score') or 0), []).append(row) + + selected: list[dict[str, Any]] = [] + for score in sorted(by_score.keys(), reverse=True): + bucket = by_score[score] + for ext in extensions: + for file_row in bucket: + if _file_extension(str(file_row.get('filename') or '')) != ext: + continue + try: + bitrate = int( + file_row.get('bitRate') or file_row.get('bitrate') or 0 + ) + except (TypeError, ValueError): + bitrate = 0 + if min_bitrate and bitrate and bitrate < min_bitrate: + continue + selected.append(file_row) + if len(selected) >= max_files: + return selected + for file_row in bucket: + if file_row in selected: continue try: - bitrate = int(file_row.get('bitRate') or file_row.get('bitrate') or 0) + bitrate = int( + file_row.get('bitRate') or file_row.get('bitrate') or 0 + ) except (TypeError, ValueError): bitrate = 0 if min_bitrate and bitrate and bitrate < min_bitrate: continue - filtered.append(file_row) - if len(filtered) >= max_files: - return filtered - return filtered + selected.append(file_row) + if len(selected) >= max_files: + return selected + return selected def _file_basename(filename: str) -> str: @@ -992,7 +1149,7 @@ def report(pct: float, message: str) -> None: client.delete_search(search_id) return None - candidates = _collect_matching_files(song, responses) + candidates = _rank_slskd_candidates(song, responses, settings) if not candidates: logger.info( 'slskd: no matching audio files title={!r} q={!r} responses={}', @@ -1003,7 +1160,26 @@ def report(pct: float, message: str) -> None: client.delete_search(search_id) return None - files = _filter_by_quality(candidates, settings) + min_score = _match_min_score(settings) + qualified = [ + row + for row in candidates + if int(row.get('match_score') or 0) >= min_score + ] + if not qualified: + top = candidates[0] + logger.info( + 'slskd: no confident match title={!r} top_score={} ' + 'top_file={!r} min_score={}', + song.get('name'), + top.get('match_score'), + _file_basename(str(top.get('filename') or '')), + min_score, + ) + client.delete_search(search_id) + return None + + files = _select_download_candidates(qualified, settings) if not files: logger.info( 'slskd: no files passed quality filters title={!r}', @@ -1012,6 +1188,18 @@ def report(pct: float, message: str) -> None: client.delete_search(search_id) return None + pick = files[0] + logger.info( + 'slskd: picked score={} reasons={} file={!r} user={!r} ' + 'candidates={} qualified={}', + pick.get('match_score'), + ','.join(pick.get('match_reasons') or []), + _file_basename(str(pick.get('filename') or '')), + pick.get('username'), + len(candidates), + len(qualified), + ) + if _past_deadline(deadline): client.delete_search(search_id) logger.info( diff --git a/tests/test_slskd_responses.py b/tests/test_slskd_responses.py index fc7d9c5..def4a4a 100644 --- a/tests/test_slskd_responses.py +++ b/tests/test_slskd_responses.py @@ -9,7 +9,9 @@ _filter_slskd_responses, _find_on_disk, _flatten_slskd_responses, + _match_min_score, _paths_match, + _rank_slskd_candidates, _slskd_search_queries, download_from_slskd, ) @@ -73,6 +75,98 @@ def test_collect_matching_files_skips_wrong_extension_and_keywords(): matches = _collect_matching_files(song, responses) assert len(matches) == 1 assert 'DRAMA KING.mp3' in matches[0]['filename'] + assert matches[0]['match_score'] >= _match_min_score({}) + + +def test_rank_rejects_album_only_without_artist_in_filename(): + song = { + 'artists': ['Pitbull'], + 'name': 'Hotel Room Service', + 'album_name': 'Hotel Room Service Album', + 'duration': 242, + } + responses = [ + { + 'username': 'peer1', + 'fileCount': 1, + 'hasFreeUploadSlot': True, + 'files': [ + { + 'filename': '@@x\\Compilations\\Hotel Room Service Album\\01 Intro.mp3', + 'size': 1, + 'length': 242, + }, + ], + } + ] + ranked = _rank_slskd_candidates(song, responses) + assert ranked == [] + + +def test_rank_rejects_wrong_track_same_artist_short_title(): + song = { + 'artists': ['Gunna'], + 'name': 'W', + 'album_name': 'Single', + 'duration': 200, + } + responses = [ + { + 'username': 'peer1', + 'fileCount': 2, + 'hasFreeUploadSlot': True, + 'files': [ + { + 'filename': 'Unreleased\\Mellow (feat. Gunna & Lil Baby).mp3', + 'size': 1, + 'length': 180, + }, + { + 'filename': 'Gunna - W.mp3', + 'size': 2, + 'length': 200, + 'bitRate': 320, + }, + ], + } + ] + ranked = _rank_slskd_candidates(song, responses) + assert len(ranked) == 1 + assert 'Gunna - W.mp3' in ranked[0]['filename'] + assert ranked[0]['match_score'] >= _match_min_score({}) + + +def test_rank_prefers_better_title_match(): + song = { + 'artists': ['Melxdie'], + 'name': 'DRAMA KING', + 'album_name': 'FAILED ROCKSTAR', + 'duration': 152, + } + responses = [ + { + 'username': 'peer1', + 'fileCount': 2, + 'hasFreeUploadSlot': True, + 'files': [ + { + 'filename': '@@x\\Melxdie - DRAMA KING (demo).mp3', + 'size': 1, + 'length': 152, + }, + { + 'filename': '@@x\\Melxdie - DRAMA KING.mp3', + 'size': 2, + 'length': 152, + 'bitRate': 320, + }, + ], + } + ] + ranked = _rank_slskd_candidates(song, responses) + assert len(ranked) >= 1 + assert 'DRAMA KING.mp3' in ranked[0]['filename'] + assert 'demo' not in ranked[0]['filename'].casefold() def test_filter_slskd_responses_hides_no_free_slot_and_locked_files(): @@ -261,11 +355,15 @@ def test_download_from_slskd_tries_next_candidate_on_failure(monkeypatch, tmp_pa 'username': 'peer1', 'filename': 'Artist - Track (1).mp3', 'size': 1000, + 'match_score': 8, + 'match_reasons': ['artist', 'title'], }, { 'username': 'peer2', 'filename': 'Artist - Track (2).mp3', 'size': 1000, + 'match_score': 9, + 'match_reasons': ['artist', 'title'], }, ] success = tmp_path / 'Artist - Track (2).mp3' @@ -311,12 +409,12 @@ def fake_wait(client, song, username, filename, settings, roots, **kwargs): lambda settings: FakeClient(), ) monkeypatch.setattr( - 'downtify.slskd_provider._collect_matching_files', - lambda song, responses: list(candidates), + 'downtify.slskd_provider._rank_slskd_candidates', + lambda song, responses, settings=None: list(candidates), ) monkeypatch.setattr( - 'downtify.slskd_provider._filter_by_quality', - lambda files, settings: files, + 'downtify.slskd_provider._select_download_candidates', + lambda ranked, settings: ranked, ) monkeypatch.setattr( 'downtify.slskd_provider._search_roots', @@ -338,5 +436,5 @@ def fake_wait(client, song, username, filename, settings, roots, **kwargs): ) assert result == success assert len(wait_calls) == 2 - assert wait_calls[0].endswith('(1).mp3') - assert wait_calls[1].endswith('(2).mp3') + assert wait_calls[0].endswith('(2).mp3') + assert wait_calls[1].endswith('(1).mp3') From 4f920b154e5a6a1f89acfd77ddc19baae2bfd434 Mon Sep 17 00:00:00 2001 From: dx616b Date: Fri, 29 May 2026 10:40:39 +0200 Subject: [PATCH 25/58] Treat Soulseek folder paths as first-class match signals. Score artist/title found in parent directories, only apply remix/live filters to basename and immediate parent folder, and soften path penalties. Co-authored-by: Cursor --- downtify/slskd_provider.py | 49 +++++++++++++++++++++++++++++++---- tests/test_slskd_responses.py | 45 ++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/downtify/slskd_provider.py b/downtify/slskd_provider.py index 411795b..7584b74 100644 --- a/downtify/slskd_provider.py +++ b/downtify/slskd_provider.py @@ -379,15 +379,29 @@ def _file_extension(filename: str) -> str: return re.sub(r'[^a-z0-9]+', '', ext) +def _path_segments(filename: str) -> list[str]: + """Parent folders in a Soulseek path (people often encode artist/album there).""" + normalized = str(filename or '').replace('\\', '/') + parent = Path(normalized).parent + return [part for part in parent.parts if part not in ('.', '/')] + + def _contains_keyword(song: dict[str, Any], filename: str) -> bool: + """Filter remix/live/etc. on the file name, not parent folder names.""" title = str(song.get('name') or '').casefold() artist = ' '.join(str(a) for a in (song.get('artists') or [])).casefold() - content = filename.casefold() + basename = _file_basename(filename) + haystacks = [basename.casefold()] + segments = _path_segments(filename) + if segments: + # Immediate parent folder (e.g. "Artist - Album") — not the whole tree. + haystacks.append(segments[-1].casefold()) for keyword in _FILTER_KEYWORDS: if keyword in title or keyword in artist: continue - if keyword in content: - return True + for haystack in haystacks: + if keyword in haystack: + return True return False @@ -506,6 +520,7 @@ def _score_slskd_candidate( score = 0 reasons: list[str] = [] + path_segments = _path_segments(filename) if artist and base_alnum.startswith(artist): score += 3 @@ -513,6 +528,9 @@ def _score_slskd_candidate( elif artist and artist in base_alnum: score += 1 reasons.append('artist') + elif artist and artist in sanitized_name: + score += 2 + reasons.append('artist_in_path') if title and title in base_alnum: score += 2 @@ -520,6 +538,22 @@ def _score_slskd_candidate( if artist and base_alnum.find(artist) < base_alnum.find(title): score += 2 reasons.append('artist_before_title') + elif title and title in sanitized_name: + score += 2 + reasons.append('title_in_path') + + for segment in path_segments: + segment_alnum = _alnum_only(segment) + if not segment_alnum: + continue + if artist and title and artist in segment_alnum and title in segment_alnum: + score += 2 + reasons.append('folder_segment') + break + if album and album in segment_alnum: + score += 1 + reasons.append('album_folder') + break if target_duration and length: delta = abs(target_duration - length) @@ -534,9 +568,14 @@ def _score_slskd_candidate( score += 1 reasons.append('album') + # Soft penalty only when the leaf file name lacks title (dump folders). path_folded = filename.casefold() - if any(keyword in path_folded for keyword in _PATH_PENALTY_KEYWORDS): - score -= 2 + if ( + title + and title not in base_alnum + and any(keyword in path_folded for keyword in _PATH_PENALTY_KEYWORDS) + ): + score -= 1 reasons.append('path_penalty') try: diff --git a/tests/test_slskd_responses.py b/tests/test_slskd_responses.py index def4a4a..45ce194 100644 --- a/tests/test_slskd_responses.py +++ b/tests/test_slskd_responses.py @@ -78,6 +78,51 @@ def test_collect_matching_files_skips_wrong_extension_and_keywords(): assert matches[0]['match_score'] >= _match_min_score({}) +def test_rank_accepts_title_and_artist_from_parent_folders(): + song = { + 'artists': ['Daft Punk'], + 'name': 'One More Time', + 'album_name': 'Discovery', + 'duration': 320, + } + responses = [ + { + 'username': 'peer1', + 'fileCount': 1, + 'hasFreeUploadSlot': True, + 'files': [ + { + 'filename': '@@files\\Daft Punk\\Discovery\\01 - One More Time.mp3', + 'size': 1, + 'length': 320, + 'bitRate': 320, + }, + ], + } + ] + ranked = _rank_slskd_candidates(song, responses) + assert len(ranked) == 1 + assert 'One More Time' in ranked[0]['filename'] + reasons = ranked[0].get('match_reasons') or [] + assert 'title_in_path' in reasons or 'folder_segment' in reasons + + +def test_contains_keyword_ignores_remix_in_distant_parent_folder(): + song = { + 'artists': ['Artist'], + 'name': 'Song', + 'album_name': 'Album', + 'duration': 200, + } + from downtify.slskd_provider import _contains_keyword + + assert not _contains_keyword( + song, + '@@share\\Remix Collections\\Artist\\Song.mp3', + ) + assert _contains_keyword(song, '@@share\\Artist\\Song (Remix).mp3') + + def test_rank_rejects_album_only_without_artist_in_filename(): song = { 'artists': ['Pitbull'], From 9a06c0724aa392ab97116014bc0c667edcd78005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrique=20Sebasti=C3=A3o?= Date: Mon, 1 Jun 2026 19:54:45 -0400 Subject: [PATCH 26/58] Format code --- downtify/api.py | 49 ++-- downtify/downloader.py | 88 +++--- downtify/library_catalog.py | 20 +- downtify/library_metadata.py | 4 +- downtify/library_paths.py | 8 +- downtify/monitor.py | 17 +- downtify/navidrome.py | 34 ++- downtify/providers.py | 36 +-- downtify/slskd_provider.py | 99 ++++--- downtify/spotify.py | 6 +- downtify/track_index.py | 1 - main.py | 5 +- pyproject.toml | 2 +- tests/test_api_queue.py | 14 +- tests/test_api_settings.py | 24 +- tests/test_api_skip_existing.py | 6 +- tests/test_downloader_extended.py | 50 ++-- tests/test_library_catalog.py | 5 +- tests/test_library_metadata.py | 8 +- tests/test_library_paths.py | 7 +- tests/test_navidrome.py | 29 +- tests/test_providers.py | 24 +- tests/test_slskd_leave_in_place.py | 1 - tests/test_slskd_responses.py | 87 +++--- tests/test_slskd_timeout.py | 13 +- tests/test_text_search_stub.py | 5 +- tests/test_track_index.py | 12 +- tests/test_youtube_cookies.py | 10 +- uv.lock | 441 +++++++++++++++++++---------- 29 files changed, 679 insertions(+), 426 deletions(-) diff --git a/downtify/api.py b/downtify/api.py index 73b038d..91130fc 100644 --- a/downtify/api.py +++ b/downtify/api.py @@ -38,12 +38,17 @@ ) from loguru import logger +from downtify.slskd_provider import reset_slskd_parallelism + from . import m3u, providers, spotify from .downloader import Downloader, NoAudioMatchError, inspect_youtube_cookies -from .monitor import PlaylistMonitorDB, check_playlist -from .navidrome import _effective_navidrome_settings, sync_playlist_to_navidrome from .library_metadata import read_audio_metadata from .library_paths import locate_library_file, slskd_dir_from_downloader +from .monitor import PlaylistMonitorDB, check_playlist +from .navidrome import ( + _effective_navidrome_settings, + sync_playlist_to_navidrome, +) from .track_index import TrackIndex, resolve_existing_download DEFAULT_YOUTUBE_COOKIES_BASENAME = 'youtube-cookies.txt' @@ -146,7 +151,7 @@ def _effective_audio_providers(settings: dict[str, Any]) -> list[str]: slskd_cfg = _effective_slskd_settings(settings) out: list[str] = [] seen: set[str] = set() - for raw in (settings.get('audio_providers') or []): + for raw in settings.get('audio_providers') or []: p = str(raw or '').strip() if p == 'slskd' and not bool(slskd_cfg.get('enabled')): continue @@ -157,7 +162,9 @@ def _effective_audio_providers(settings: dict[str, Any]) -> list[str]: return ['youtube-music'] # UI historically stored a single provider; keep playlist downloads useful # by falling back to YouTube when slskd is selected without a backup. - if 'slskd' in out and not any(p in out for p in ('youtube', 'youtube-music')): + if 'slskd' in out and not any( + p in out for p in ('youtube', 'youtube-music') + ): for fallback in ('youtube-music', 'youtube'): if fallback not in seen: seen.add(fallback) @@ -467,7 +474,10 @@ def _merge_client_track_hints( def _song_from_download_request( url: str, client_hints: Optional[dict[str, Any]] ) -> dict[str, Any]: - if isinstance(client_hints, dict) and client_hints.get('source') == 'text_search': + if ( + isinstance(client_hints, dict) + and client_hints.get('source') == 'text_search' + ): return dict(client_hints) song = _song_for_download(url) _merge_client_track_hints(song, client_hints) @@ -681,7 +691,9 @@ def _songs_for_navidrome_sync( Path(downloader.download_dir) if downloader is not None else None ) slskd_dir = ( - slskd_dir_from_downloader(downloader) if downloader is not None else None + slskd_dir_from_downloader(downloader) + if downloader is not None + else None ) for r in results: if not r or not r.get('filename'): @@ -719,7 +731,9 @@ async def _sync_playlist_navidrome( state.settings, ) except Exception: - logger.exception('Navidrome sync failed for playlist {}', playlist_name) + logger.exception( + 'Navidrome sync failed for playlist {}', playlist_name + ) async def _process_batch( @@ -775,7 +789,9 @@ async def _bounded(song: dict[str, Any], song_id: str) -> dict[str, Any]: }) if generate_m3u and playlist_subdir and entries: - organize = bool(state.downloader and state.downloader.organize_by_artist) + organize = bool( + state.downloader and state.downloader.organize_by_artist + ) try: await asyncio.to_thread( m3u.write_m3u, @@ -1026,8 +1042,8 @@ async def update_settings_endpoint( payload['organize_by_artist'] ) if 'youtube' in payload: - state.downloader.youtube_settings = _effective_youtube_settings( - state.settings + state.downloader.youtube_settings = ( + _effective_youtube_settings(state.settings) ) if 'max_parallel_downloads' in payload: try: @@ -1035,10 +1051,9 @@ async def update_settings_endpoint( count = min(8, count) state.download_semaphore = asyncio.Semaphore(count) if state.downloader is not None: - state.downloader.slskd_settings = _effective_slskd_settings( - state.settings + state.downloader.slskd_settings = ( + _effective_slskd_settings(state.settings) ) - from downtify.slskd_provider import reset_slskd_parallelism reset_slskd_parallelism(state.settings) except (TypeError, ValueError): @@ -1052,9 +1067,7 @@ async def update_settings_endpoint( def _validate_youtube_cookies_bytes(raw: bytes) -> None: if not raw or not raw.strip(): - raise HTTPException( - status_code=400, detail='cookies file is empty' - ) + raise HTTPException(status_code=400, detail='cookies file is empty') if len(raw) > 512_000: raise HTTPException( status_code=400, detail='cookies file is too large' @@ -1121,7 +1134,9 @@ def delete_youtube_cookies_endpoint( try: Path(path_str).unlink(missing_ok=True) except OSError as exc: - logger.warning('Could not delete cookies file {}: {}', path_str, exc) + logger.warning( + 'Could not delete cookies file {}: {}', path_str, exc + ) state.settings['youtube'] = { 'cookies_file': '', 'cookies_from_browser': '', diff --git a/downtify/downloader.py b/downtify/downloader.py index 3cfe7c6..97af354 100644 --- a/downtify/downloader.py +++ b/downtify/downloader.py @@ -12,7 +12,6 @@ import requests import yt_dlp from loguru import logger -from yt_dlp.utils import DownloadError from mutagen.flac import FLAC, Picture from mutagen.id3 import ( APIC, @@ -30,12 +29,13 @@ from mutagen.mp4 import MP4, MP4Cover from mutagen.oggopus import OggOpus from mutagen.oggvorbis import OggVorbis +from yt_dlp.utils import DownloadError from . import lyrics as lyrics_mod from . import spotify as spotify_mod +from .library_paths import library_stored_path, slskd_dir_from_downloader from .m3u import sanitize_playlist_name from .providers import enrich_from_match, find_match, find_match_for_video -from .library_paths import library_stored_path, slskd_dir_from_downloader from .slskd_provider import download_from_slskd _INVALID_FS_CHARS = re.compile(r'[\\/:*?"<>|\x00-\x1f]') @@ -172,17 +172,15 @@ def apply_ytdlp_cookie_opts( 'tv', ) -_YOUTUBE_AUTH_COOKIE_NAMES = frozenset( - { - 'LOGIN_INFO', - 'SID', - '__Secure-1PSID', - '__Secure-3PSID', - 'SAPISID', - '__Secure-1PAPISID', - '__Secure-3PAPISID', - } -) +_YOUTUBE_AUTH_COOKIE_NAMES = frozenset({ + 'LOGIN_INFO', + 'SID', + '__Secure-1PSID', + '__Secure-3PSID', + 'SAPISID', + '__Secure-1PAPISID', + '__Secure-3PAPISID', +}) def inspect_youtube_cookies(path: Path | str) -> dict[str, Any]: @@ -222,9 +220,7 @@ def inspect_youtube_cookies(path: Path | str) -> dict[str, Any]: found = sorted(names & _YOUTUBE_AUTH_COOKIE_NAMES) out['auth_cookies_found'] = found out['looks_authenticated'] = bool(found) and ( - 'LOGIN_INFO' in names - or '__Secure-3PSID' in names - or 'SID' in names + 'LOGIN_INFO' in names or '__Secure-3PSID' in names or 'SID' in names ) if not out['looks_authenticated']: out['warnings'].append( @@ -234,7 +230,9 @@ def inspect_youtube_cookies(path: Path | str) -> dict[str, Any]: return out -def _log_youtube_cookie_health(youtube_settings: Optional[dict[str, Any]]) -> None: +def _log_youtube_cookie_health( + youtube_settings: Optional[dict[str, Any]], +) -> None: path_str = str((youtube_settings or {}).get('cookies_file') or '').strip() if not path_str: return @@ -278,20 +276,16 @@ def _youtube_download_profiles( music = f'https://music.youtube.com/watch?v={vid}' profiles: list[dict[str, Any]] = [] if ytdlp_cookies_configured(youtube_settings): - profiles.append( - { - 'label': 'cookies+web', - 'use_cookies': True, - 'urls': [www], - } - ) - profiles.append( - { - 'label': 'no-cookies', - 'use_cookies': False, - 'urls': [music, www], - } - ) + profiles.append({ + 'label': 'cookies+web', + 'use_cookies': True, + 'urls': [www], + }) + profiles.append({ + 'label': 'no-cookies', + 'use_cookies': False, + 'urls': [music, www], + }) return profiles @@ -387,7 +381,9 @@ def _fallback_video_ids_via_ytdlp( ) -> list[str]: """Ranked YouTube video ids from yt-dlp search (no cookies).""" title = str(song.get('name') or '').strip() - artists = [a for a in (song.get('artists') or []) if isinstance(a, str) and a] + artists = [ + a for a in (song.get('artists') or []) if isinstance(a, str) and a + ] query = ' '.join([*artists[:2], title]).strip() if not query: return [] @@ -501,10 +497,9 @@ def _ytdlp_download_video( 're-export from youtube.com (private window) ' 'and upload again' ) - if ( - fmt_index + 1 < len(_YTDLP_AUDIO_FORMATS) - and _ytdlp_format_unavailable_retry(exc) - ): + if fmt_index + 1 < len( + _YTDLP_AUDIO_FORMATS + ) and _ytdlp_format_unavailable_retry(exc): logger.info( 'yt-dlp: format {!r} unavailable for {} ' '({}), trying fallback', @@ -581,6 +576,7 @@ def _normalize_slskd_settings( settings: Optional[dict[str, Any]], ) -> dict[str, Any]: raw = settings if isinstance(settings, dict) else {} + def _int(raw_value: Any, default: int) -> int: try: return int(raw_value) @@ -596,7 +592,9 @@ def _int(raw_value: Any, default: int) -> int: 'source_dir': str(raw.get('source_dir') or download_dir).strip(), 'timeout_seconds': _int(raw.get('timeout_seconds') or 20, 20), 'search_retries': _int(raw.get('search_retries') or 5, 5), - 'search_poll_seconds': _int(raw.get('search_poll_seconds') or 15, 15), + 'search_poll_seconds': _int( + raw.get('search_poll_seconds') or 15, 15 + ), 'download_attempts': _int(raw.get('download_attempts') or 3, 3), 'poll_interval_seconds': _int( raw.get('poll_interval_seconds') or 5, 5 @@ -887,8 +885,8 @@ def download( local_source_path: Optional[Path] = None if not video_id: song = spotify_mod.enrich_track_from_spotify_if_sparse(song) - video_id, match, provider, local_source_path = self._resolve_video_id( - song, progress_cb=progress_cb + video_id, match, provider, local_source_path = ( + self._resolve_video_id(song, progress_cb=progress_cb) ) elif not song.get('album_name') or not song.get('cover_url'): # We already have a target video, but the metadata is incomplete. @@ -918,7 +916,9 @@ def download( target_dir.mkdir(parents=True, exist_ok=True) out_template = str(target_dir / f'{basename}.%(ext)s') - yt_provider = provider if provider in ('youtube', 'youtube-music') else 'youtube' + yt_provider = ( + provider if provider in ('youtube', 'youtube-music') else 'youtube' + ) if local_source_path is not None: if provider == 'slskd' and bool( @@ -938,7 +938,9 @@ def download( if progress_cb: label = _provider_display_name(provider) or 'slskd' progress_cb(95.0, f'Downloaded ({label})', provider) - self._finalize_downloaded_file(final_path, song, progress_cb, provider) + self._finalize_downloaded_file( + final_path, song, progress_cb, provider + ) return stored_name if progress_cb: @@ -1064,7 +1066,9 @@ def hook(data: dict[str, Any]) -> None: final_path = candidate break - self._finalize_downloaded_file(final_path, song, progress_cb, yt_provider) + self._finalize_downloaded_file( + final_path, song, progress_cb, yt_provider + ) return f'{rel_prefix}{final_path.name}' diff --git a/downtify/library_catalog.py b/downtify/library_catalog.py index 85230e6..19ac971 100644 --- a/downtify/library_catalog.py +++ b/downtify/library_catalog.py @@ -10,9 +10,15 @@ from .library_paths import library_stored_path, locate_library_file from .track_index import TrackIndex -AUDIO_EXTENSIONS = frozenset( - {'.mp3', '.m4a', '.flac', '.ogg', '.wav', '.aac', '.opus'} -) +AUDIO_EXTENSIONS = frozenset({ + '.mp3', + '.m4a', + '.flac', + '.ogg', + '.wav', + '.aac', + '.opus', +}) @dataclass(frozen=True) @@ -44,9 +50,7 @@ def _is_audio(path: Path) -> bool: return path.is_file() and path.suffix.lower() in AUDIO_EXTENSIONS -def resolve_library_file( - stored: str, ctx: LibraryContext -) -> Optional[Path]: +def resolve_library_file(stored: str, ctx: LibraryContext) -> Optional[Path]: """Resolve a library-relative path if it points to an allowed audio file.""" text = str(stored or '').strip().replace('\\', '/') @@ -101,9 +105,7 @@ def list_library_paths(ctx: LibraryContext) -> list[str]: if ctx.slskd_dir is not None and ctx.slskd_dir.is_dir(): try: - same_tree = ( - ctx.slskd_dir.resolve() == ctx.download_dir.resolve() - ) + same_tree = ctx.slskd_dir.resolve() == ctx.download_dir.resolve() except OSError: same_tree = False if not same_tree: diff --git a/downtify/library_metadata.py b/downtify/library_metadata.py index e14cace..d9bef4b 100644 --- a/downtify/library_metadata.py +++ b/downtify/library_metadata.py @@ -66,7 +66,9 @@ def read_audio_metadata(path: Path) -> dict[str, Any]: } -def library_entry_for_file(stored_path: str, full_path: Path) -> dict[str, str]: +def library_entry_for_file( + stored_path: str, full_path: Path +) -> dict[str, str]: """Build one ``/list`` row using tags, then filename fallbacks.""" fb_title, fb_artist = _fallback_title_from_filename(full_path) diff --git a/downtify/library_paths.py b/downtify/library_paths.py index 247ff9f..d5e4a77 100644 --- a/downtify/library_paths.py +++ b/downtify/library_paths.py @@ -17,7 +17,9 @@ def path_relative_to_anchor(file_path: Path, anchor: Path) -> str: try: return file_resolved.relative_to(anchor_resolved).as_posix() except ValueError: - return os.path.relpath(file_resolved, anchor_resolved).replace('\\', '/') + return os.path.relpath(file_resolved, anchor_resolved).replace( + '\\', '/' + ) def resolve_stored_path(stored: str, anchor: Path) -> Path: @@ -124,7 +126,9 @@ def locate_library_file( for root in default_slskd_source_roots(download_dir): candidates.append((root / rel).resolve()) candidates.append((download_dir / 'slskd' / rel).resolve()) - candidates.append(resolve_library_stored_path(text, download_dir, slskd_dir)) + candidates.append( + resolve_library_stored_path(text, download_dir, slskd_dir) + ) seen: set[str] = set() for path in candidates: diff --git a/downtify/monitor.py b/downtify/monitor.py index 3d9c3af..41efa71 100644 --- a/downtify/monitor.py +++ b/downtify/monitor.py @@ -13,9 +13,12 @@ from . import m3u, spotify from .downloader import Downloader -from .navidrome import _effective_navidrome_settings, sync_playlist_to_navidrome from .library_metadata import read_audio_metadata from .library_paths import locate_library_file, slskd_dir_from_downloader +from .navidrome import ( + _effective_navidrome_settings, + sync_playlist_to_navidrome, +) from .track_index import ( TrackIndex, normalize_spotify_track_id, @@ -397,7 +400,9 @@ def _resolve_monitored_track_filename( if tid: stored = known_tracks.get(tid) if stored and locate_library_file( - stored, downloader.download_dir, slskd_dir_from_downloader(downloader) + stored, + downloader.download_dir, + slskd_dir_from_downloader(downloader), ): return stored hit = resolve_existing_download( @@ -417,7 +422,9 @@ def _sync_navidrome_playlist( known_tracks: dict[str, Optional[str]], track_index: Optional[TrackIndex] = None, ) -> None: - if not settings or not _effective_navidrome_settings(settings).get('enabled'): + if not settings or not _effective_navidrome_settings(settings).get( + 'enabled' + ): return pl_subdir = m3u.sanitize_playlist_name(playlist.name) songs: list[dict[str, Any]] = [] @@ -430,7 +437,9 @@ def _sync_navidrome_playlist( row = dict(song) row['filename'] = filename path = locate_library_file( - filename, downloader.download_dir, slskd_dir_from_downloader(downloader) + filename, + downloader.download_dir, + slskd_dir_from_downloader(downloader), ) if path is not None: meta = read_audio_metadata(path) diff --git a/downtify/navidrome.py b/downtify/navidrome.py index 98537dc..cd6224e 100644 --- a/downtify/navidrome.py +++ b/downtify/navidrome.py @@ -89,8 +89,10 @@ def _effective_navidrome_settings(settings: dict[str, Any]) -> dict[str, Any]: 'scan_wait_seconds': scan_wait_seconds, 'scan_poll_seconds': scan_poll_seconds, 'scan_retry_seconds': scan_retry_seconds, - 'client_name': str(raw.get('client_name') or 'Downtify').strip() or 'Downtify', - 'api_version': str(raw.get('api_version') or '1.16.1').strip() or '1.16.1', + 'client_name': str(raw.get('client_name') or 'Downtify').strip() + or 'Downtify', + 'api_version': str(raw.get('api_version') or '1.16.1').strip() + or '1.16.1', } @@ -156,7 +158,9 @@ def _request( resp = requests.get(url, timeout=self.timeout) resp.raise_for_status() data = resp.json() - body = data.get('subsonic-response') if isinstance(data, dict) else None + body = ( + data.get('subsonic-response') if isinstance(data, dict) else None + ) if not isinstance(body, dict): raise ValueError('Invalid Subsonic response') if body.get('status') == 'failed': @@ -170,7 +174,9 @@ def ping(self) -> bool: self._request('ping') return True except Exception as exc: - logger.info('navidrome: ping failed url={!r} err={}', self.base_url, exc) + logger.info( + 'navidrome: ping failed url={!r} err={}', self.base_url, exc + ) return False def _scan_credentials(self) -> tuple[str, str]: @@ -211,7 +217,9 @@ def wait_scan_complete(self, max_wait_seconds: int) -> bool: def search_song_id(self, song: dict[str, Any]) -> Optional[str]: title = _search_title(str(song.get('name') or '')) - artists = [str(a) for a in (song.get('artists') or []) if str(a).strip()] + artists = [ + str(a) for a in (song.get('artists') or []) if str(a).strip() + ] artist = artists[0] if artists else '' path_keys = _path_match_keys(str(song.get('filename') or '')) query = f'{title} {artist}'.strip() @@ -243,7 +251,9 @@ def search_song_id(self, song: dict[str, Any]) -> Optional[str]: c_artist = str(candidate.get('artist') or '') c_title = str(candidate.get('title') or '') c_duration = int(candidate.get('duration') or 0) - c_path = str(candidate.get('path') or '').replace('\\', '/').casefold() + c_path = ( + str(candidate.get('path') or '').replace('\\', '/').casefold() + ) artist_match = artist and artist.casefold() in c_artist.casefold() title_match = ( @@ -312,10 +322,16 @@ def _create_or_replace_playlist( resp = requests.get(url, timeout=self.timeout) resp.raise_for_status() data = resp.json() - body = data.get('subsonic-response') if isinstance(data, dict) else None + body = ( + data.get('subsonic-response') if isinstance(data, dict) else None + ) if not isinstance(body, dict) or body.get('status') == 'failed': err = (body or {}).get('error') if isinstance(body, dict) else {} - message = err.get('message') if isinstance(err, dict) else 'create failed' + message = ( + err.get('message') + if isinstance(err, dict) + else 'create failed' + ) raise ValueError(str(message)) playlist = body.get('playlist') if isinstance(body, dict) else None if isinstance(playlist, dict): @@ -366,7 +382,7 @@ def _song_label(song: dict[str, Any]) -> str: label = str(song.get('name') or 'unknown') artists = song.get('artists') or [] if artists: - label = f"{', '.join(str(a) for a in artists)} - {label}" + label = f'{", ".join(str(a) for a in artists)} - {label}' fn = str(song.get('filename') or '').strip() return f'{label} ({fn})' if fn else label diff --git a/downtify/providers.py b/downtify/providers.py index 353d013..62f4219 100644 --- a/downtify/providers.py +++ b/downtify/providers.py @@ -255,35 +255,29 @@ def _search( ('match_all_unfiltered', query, None), ] if title_only and title_only.casefold() != query.casefold(): - attempts.extend( - [ - ('match_songs_title_only', title_only, 'songs'), - ('match_videos_title_only', title_only, 'videos'), - ('match_all_title_only', title_only, None), - ] - ) + attempts.extend([ + ('match_songs_title_only', title_only, 'songs'), + ('match_videos_title_only', title_only, 'videos'), + ('match_all_title_only', title_only, None), + ]) folded_query = _ascii_fold_query(query) folded_title = _ascii_fold_query(title_only) if folded_query and folded_query.casefold() != query.casefold(): - attempts.extend( - [ - ('match_songs_ascii_fold', folded_query, 'songs'), - ('match_videos_ascii_fold', folded_query, 'videos'), - ('match_all_ascii_fold', folded_query, None), - ] - ) + attempts.extend([ + ('match_songs_ascii_fold', folded_query, 'songs'), + ('match_videos_ascii_fold', folded_query, 'videos'), + ('match_all_ascii_fold', folded_query, None), + ]) if ( folded_title and title_only and folded_title.casefold() != title_only.casefold() ): - attempts.extend( - [ - ('match_songs_title_ascii_fold', folded_title, 'songs'), - ('match_videos_title_ascii_fold', folded_title, 'videos'), - ('match_all_title_ascii_fold', folded_title, None), - ] - ) + attempts.extend([ + ('match_songs_title_ascii_fold', folded_title, 'songs'), + ('match_videos_title_ascii_fold', folded_title, 'videos'), + ('match_all_title_ascii_fold', folded_title, None), + ]) seen_attempts: set[tuple[str, str]] = set() for phase, q, filt in attempts: key = (q.casefold(), filt or '') diff --git a/downtify/slskd_provider.py b/downtify/slskd_provider.py index 7584b74..d11b046 100644 --- a/downtify/slskd_provider.py +++ b/downtify/slskd_provider.py @@ -9,13 +9,13 @@ import unicodedata from pathlib import Path from typing import Any, Callable, Optional - -ProgressCallback = Callable[[float, str], None] from urllib.parse import quote import requests from loguru import logger +ProgressCallback = Callable[[float, str], None] + _SLSKD_SEM: Optional[threading.Semaphore] = None _SLSKD_SEM_LIMIT = 0 @@ -46,6 +46,7 @@ def _slskd_semaphore(settings: dict[str, Any]) -> threading.Semaphore: reset_slskd_parallelism(settings) return _SLSKD_SEM + _DEFAULT_DOWNLOAD_TIMEOUT_SECONDS = 600 _DEFAULT_QUEUED_TIMEOUT_SECONDS = 180 @@ -79,6 +80,7 @@ def _slskd_deadline(settings: dict[str, Any]) -> float: def _past_deadline(deadline: float) -> bool: return time.monotonic() >= deadline + _AUDIO_EXTENSIONS = frozenset({'mp3', 'flac', 'm4a', 'ogg', 'opus'}) _FILTER_KEYWORDS = ( 'live', @@ -107,7 +109,9 @@ def __init__(self, settings: dict[str, Any]): self.api_key = str(settings.get('api_key') or '').strip() self.timeout = int(settings.get('timeout_seconds') or 20) self.search_retries = int(settings.get('search_retries') or 5) - self.search_poll_seconds = int(settings.get('search_poll_seconds') or 15) + self.search_poll_seconds = int( + settings.get('search_poll_seconds') or 15 + ) self.download_attempts = int(settings.get('download_attempts') or 3) self.session = requests.Session() if self.api_key: @@ -156,7 +160,9 @@ def start_search(self, query: str) -> Optional[str]: try: data = self._request('POST', '/api/v0/searches', json_body=body) except Exception as exc: - logger.info('slskd: search POST failed q={!r} err={}', query[:120], exc) + logger.info( + 'slskd: search POST failed q={!r} err={}', query[:120], exc + ) return None if isinstance(data, dict): for key in ('id', 'searchId'): @@ -217,7 +223,9 @@ def wait_search_complete( def search_responses(self, search_id: str) -> list[dict[str, Any]]: try: - data = self._request('GET', f'/api/v0/searches/{search_id}/responses') + data = self._request( + 'GET', f'/api/v0/searches/{search_id}/responses' + ) except Exception: return [] if isinstance(data, list): @@ -275,7 +283,10 @@ def find_transfer( ) -> Optional[dict[str, Any]]: for peer_filter in (username, ''): for peer in self.list_download_transfers(): - if peer_filter and str(peer.get('username') or '') != peer_filter: + if ( + peer_filter + and str(peer.get('username') or '') != peer_filter + ): continue for directory in peer.get('directories') or []: if not isinstance(directory, dict): @@ -312,7 +323,10 @@ def _flatten_slskd_responses(data: Any) -> list[dict[str, Any]]: if not isinstance(resp, dict): continue username = str( - resp.get('username') or resp.get('userName') or resp.get('user') or '' + resp.get('username') + or resp.get('userName') + or resp.get('user') + or '' ).strip() for file_row in resp.get('files') or []: if not isinstance(file_row, dict): @@ -348,7 +362,9 @@ def _primary_title(title: str) -> str: def _slskd_search_queries(song: dict[str, Any]) -> list[str]: artists = [ - str(a).strip() for a in (song.get('artists') or [])[:2] if str(a).strip() + str(a).strip() + for a in (song.get('artists') or [])[:2] + if str(a).strip() ] artist = artists[0] if artists else '' title = str(song.get('name') or '').strip() @@ -473,7 +489,9 @@ def _title_is_ambiguous(title_alnum: str) -> bool: def _match_min_score(settings: dict[str, Any]) -> int: try: - value = int(settings.get('match_min_score') or _DEFAULT_MATCH_MIN_SCORE) + value = int( + settings.get('match_min_score') or _DEFAULT_MATCH_MIN_SCORE + ) except (TypeError, ValueError): value = _DEFAULT_MATCH_MIN_SCORE return max(0, value) @@ -546,7 +564,12 @@ def _score_slskd_candidate( segment_alnum = _alnum_only(segment) if not segment_alnum: continue - if artist and title and artist in segment_alnum and title in segment_alnum: + if ( + artist + and title + and artist in segment_alnum + and title in segment_alnum + ): score += 2 reasons.append('folder_segment') break @@ -637,15 +660,13 @@ def _rank_slskd_candidates( if scored is None: continue score, reasons = scored - ranked.append( - { - **file_row, - 'username': username, - 'filename': filename, - 'match_score': score, - 'match_reasons': reasons, - } - ) + ranked.append({ + **file_row, + 'username': username, + 'filename': filename, + 'match_score': score, + 'match_reasons': reasons, + }) ranked.sort( key=lambda row: ( @@ -669,9 +690,7 @@ def _select_download_candidates( """Pick up to download_attempts files, preferring extension order at equal score.""" raw_ext = settings.get('extensions') or ['mp3', 'flac'] extensions = [ - str(e).strip().lower().lstrip('.') - for e in raw_ext - if str(e).strip() + str(e).strip().lower().lstrip('.') for e in raw_ext if str(e).strip() ] or ['mp3', 'flac'] min_bitrate = int(settings.get('min_bitrate') or 0) max_files = int(settings.get('download_attempts') or 3) @@ -754,9 +773,7 @@ def walk(node: Any) -> None: return out -def _search_roots( - settings: dict[str, Any], client: SlskdClient -) -> list[Path]: +def _search_roots(settings: dict[str, Any], client: SlskdClient) -> list[Path]: roots: list[Path] = [] seen: set[str] = set() for raw in ( @@ -982,7 +999,9 @@ def _resolve_downloaded_file( return _copy_to_output(found, output_dir) -def _finalize_slskd_path(found: Path, output_dir: Path, leave_in_place: bool) -> Path: +def _finalize_slskd_path( + found: Path, output_dir: Path, leave_in_place: bool +) -> Path: if leave_in_place: return found return _copy_to_output(found, output_dir) @@ -1112,22 +1131,36 @@ def download_from_slskd( return None client = SlskdClient(settings) if not client.configured(): - logger.info('slskd: missing configuration title={!r}', song.get('name')) + logger.info( + 'slskd: missing configuration title={!r}', song.get('name') + ) return None if not client.can_connect(): - logger.info('slskd: connectivity check failed base_url={!r}', client.base_url) + logger.info( + 'slskd: connectivity check failed base_url={!r}', client.base_url + ) return None - output_dir = Path(str(settings.get('output_dir') or settings.get('download_dir') or '/downloads')) + output_dir = Path( + str( + settings.get('output_dir') + or settings.get('download_dir') + or '/downloads' + ) + ) source_dir = Path( - str(settings.get('source_dir') or settings.get('download_dir') or output_dir) + str( + settings.get('source_dir') + or settings.get('download_dir') + or output_dir + ) ) leave_in_place = bool(settings.get('leave_in_place', True)) queries = _slskd_search_queries(song) if not queries: return None - label = f"{song.get('name')} - {', '.join(song.get('artists') or [])}" + label = f'{song.get("name")} - {", ".join(song.get("artists") or [])}' def report(pct: float, message: str) -> None: if progress_cb is not None: @@ -1139,7 +1172,9 @@ def report(pct: float, message: str) -> None: ) progress_cb(pct, text, 'slskd') except Exception: - logger.opt(exception=True).debug('slskd progress callback error') + logger.opt(exception=True).debug( + 'slskd progress callback error' + ) deadline = _slskd_deadline(settings) report(2.0, 'searching') diff --git a/downtify/spotify.py b/downtify/spotify.py index 19d43e0..4fdb1aa 100644 --- a/downtify/spotify.py +++ b/downtify/spotify.py @@ -479,7 +479,7 @@ def _merge_full_track_metadata( 'album_track_total', ): value = full.get(key) - if value is None or value == '' or value == []: + if value is None or not value or value == []: continue if key in ('track_number', 'album_track_total'): if merged.get(key) is not None: @@ -502,7 +502,9 @@ def _merge_full_track_metadata( return merged -def enrich_track_from_spotify_if_sparse(song: dict[str, Any]) -> dict[str, Any]: +def enrich_track_from_spotify_if_sparse( + song: dict[str, Any], +) -> dict[str, Any]: """Fill missing Spotify tagging fields from the per-track embed. Playlist browse rows often omit ``year``, ``release_date``, and diff --git a/downtify/track_index.py b/downtify/track_index.py index 5e5f9c5..5701421 100644 --- a/downtify/track_index.py +++ b/downtify/track_index.py @@ -9,7 +9,6 @@ from typing import Any, Optional from .library_paths import ( - library_stored_path, locate_library_file, slskd_dir_from_downloader, ) diff --git a/main.py b/main.py index cf18d75..b813df3 100644 --- a/main.py +++ b/main.py @@ -34,13 +34,13 @@ from downtify import __version__, api from downtify.downloader import Downloader -from downtify.monitor import PlaylistMonitorDB, monitor_loop from downtify.library_catalog import ( LibraryContext, library_context_from_state, list_library_entries, resolve_library_file, ) +from downtify.monitor import PlaylistMonitorDB, monitor_loop from downtify.track_index import TrackIndex load_dotenv() @@ -277,7 +277,8 @@ def serve_media(file_path: str) -> FileResponse: raise HTTPException(status_code=404, detail='File not found') return FileResponse( full, - media_type=mimetypes.guess_type(str(full))[0] or 'application/octet-stream', + media_type=mimetypes.guess_type(str(full))[0] + or 'application/octet-stream', ) @app.delete('/delete') diff --git a/pyproject.toml b/pyproject.toml index 92bd56d..0c715f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ quote-style = 'single' "main.py" = ["E501", "PLR0915", "PLR2004", "PLR1702", "PLR0912", "PLR0911"] "downloader.py" = ["PLC1901"] "downtify/*.py" = ["E501", "PLR0913", "PLR0917", "PLR2004", "PLW0603", "PLR0911", "PLR0915", "PLR0912", "PLR0916"] -"tests/*.py" = ["PLR2004", "PLC2701", "E501"] +"tests/*.py" = ["PLR2004", "PLC2701", "E501", "PLR0913", "PLR0917"] [tool.codeflash] # All paths are relative to this pyproject.toml's directory. diff --git a/tests/test_api_queue.py b/tests/test_api_queue.py index ded8094..b92377f 100644 --- a/tests/test_api_queue.py +++ b/tests/test_api_queue.py @@ -2,15 +2,21 @@ from __future__ import annotations -import downtify.api as api +from downtify import api def test_clear_completed_queue_removes_only_done_jobs(): api.state.download_jobs.clear() try: - done_id = api._register_job({'song_id': 'done-1', 'name': 'A'}, status='done') - err_id = api._register_job({'song_id': 'err-1', 'name': 'B'}, status='error') - q_id = api._register_job({'song_id': 'q-1', 'name': 'C'}, status='queued') + done_id = api._register_job( + {'song_id': 'done-1', 'name': 'A'}, status='done' + ) + err_id = api._register_job( + {'song_id': 'err-1', 'name': 'B'}, status='error' + ) + q_id = api._register_job( + {'song_id': 'q-1', 'name': 'C'}, status='queued' + ) result = api.clear_completed_queue() diff --git a/tests/test_api_settings.py b/tests/test_api_settings.py index 093d845..ad41701 100644 --- a/tests/test_api_settings.py +++ b/tests/test_api_settings.py @@ -104,25 +104,23 @@ def test_effective_audio_providers_defaults_when_missing(): def test_effective_slskd_settings_defaults_when_missing(): out = _effective_slskd_settings({}) assert out['enabled'] is False - assert out['base_url'] == '' + assert not out['base_url'] assert out['download_dir'] == '/downloads' assert out['timeout_seconds'] == 20 def test_effective_slskd_settings_normalizes_values(): - out = _effective_slskd_settings( - { - 'slskd': { - 'enabled': True, - 'base_url': 'http://slskd.local:5030/', - 'api_key': ' key ', - 'download_dir': '/data/slskd', - 'timeout_seconds': '90', - 'poll_interval_seconds': '2', - 'poll_max_attempts': '99', - } + out = _effective_slskd_settings({ + 'slskd': { + 'enabled': True, + 'base_url': 'http://slskd.local:5030/', + 'api_key': ' key ', + 'download_dir': '/data/slskd', + 'timeout_seconds': '90', + 'poll_interval_seconds': '2', + 'poll_max_attempts': '99', } - ) + }) assert out['base_url'] == 'http://slskd.local:5030' assert out['enabled'] is True assert out['api_key'] == 'key' diff --git a/tests/test_api_skip_existing.py b/tests/test_api_skip_existing.py index 84865fe..5280411 100644 --- a/tests/test_api_skip_existing.py +++ b/tests/test_api_skip_existing.py @@ -5,7 +5,7 @@ import asyncio from unittest.mock import AsyncMock, MagicMock -import downtify.api as api +from downtify import api from downtify.downloader import Downloader from downtify.track_index import TrackIndex @@ -87,7 +87,9 @@ def test_run_download_skips_via_global_library(tmp_path): ) assert filename == 'Other Playlist/Artist - Track.mp3' - assert api.state.download_jobs[song_id]['message'] == 'Already in library' + assert ( + api.state.download_jobs[song_id]['message'] == 'Already in library' + ) d.download.assert_not_called() finally: api.state.download_jobs.clear() diff --git a/tests/test_downloader_extended.py b/tests/test_downloader_extended.py index 17f202a..a8e64ef 100644 --- a/tests/test_downloader_extended.py +++ b/tests/test_downloader_extended.py @@ -176,9 +176,10 @@ def extract_info(self, _query, download=False): return {'entries': [{'id': 'abc123def45'}]} monkeypatch.setattr(downloader_mod.yt_dlp, 'YoutubeDL', FakeYDL) - vid = downloader_mod._fallback_video_id_via_ytdlp( - {'name': 'Track', 'artists': ['Artist']} - ) + vid = downloader_mod._fallback_video_id_via_ytdlp({ + 'name': 'Track', + 'artists': ['Artist'], + }) assert vid == 'abc123def45' @@ -195,9 +196,10 @@ def should_not_run(_song): raise AssertionError('find_match should not run when youtube succeeds') monkeypatch.setattr(downloader_mod, 'find_match', should_not_run) - vid, match, provider, local_path = d._resolve_video_id( - {'name': 'Track', 'artists': []} - ) + vid, match, provider, local_path = d._resolve_video_id({ + 'name': 'Track', + 'artists': [], + }) assert vid == 'yt123' assert match is None assert provider == 'youtube' @@ -214,9 +216,10 @@ def test_resolve_video_id_uses_second_provider_on_first_failure(monkeypatch): 'find_match', lambda _song: ('ytm456', {'videoId': 'ytm456'}), ) - vid, match, provider, local_path = d._resolve_video_id( - {'name': 'Track', 'artists': []} - ) + vid, match, provider, local_path = d._resolve_video_id({ + 'name': 'Track', + 'artists': [], + }) assert vid == 'ytm456' assert isinstance(match, dict) assert provider == 'youtube-music' @@ -232,17 +235,22 @@ def test_resolve_video_id_ytdlp_fallback_when_only_youtube_music(monkeypatch): ) ytdlp_calls: list[str] = [] - monkeypatch.setattr(downloader_mod, 'download_from_slskd', lambda *_a, **_k: None) - monkeypatch.setattr(downloader_mod, 'find_match', lambda _song: (None, None)) + monkeypatch.setattr( + downloader_mod, 'download_from_slskd', lambda *_a, **_k: None + ) + monkeypatch.setattr( + downloader_mod, 'find_match', lambda _song: (None, None) + ) monkeypatch.setattr( downloader_mod, '_fallback_video_id_via_ytdlp', lambda _song: ytdlp_calls.append('ok') or 'yt-fallback', ) - vid, match, provider, local_path = d._resolve_video_id( - {'name': 'Seamans Underwear', 'artists': ['Artist']} - ) + vid, match, provider, local_path = d._resolve_video_id({ + 'name': 'Seamans Underwear', + 'artists': ['Artist'], + }) assert vid == 'yt-fallback' assert match is None assert provider == 'youtube' @@ -261,9 +269,10 @@ def test_resolve_video_id_supports_slskd_provider(monkeypatch, tmp_path): monkeypatch.setattr( downloader_mod, 'download_from_slskd', lambda *_args, **_kw: source ) - vid, match, provider, local_path = d._resolve_video_id( - {'name': 'Track', 'artists': []} - ) + vid, match, provider, local_path = d._resolve_video_id({ + 'name': 'Track', + 'artists': [], + }) assert vid is None assert match is None assert provider == 'slskd' @@ -286,9 +295,10 @@ def test_resolve_video_id_skips_slskd_when_disabled(monkeypatch): monkeypatch.setattr( downloader_mod, '_fallback_video_id_via_ytdlp', lambda _song: 'yt123' ) - vid, match, provider, local_path = d._resolve_video_id( - {'name': 'Track', 'artists': []} - ) + vid, match, provider, local_path = d._resolve_video_id({ + 'name': 'Track', + 'artists': [], + }) assert vid == 'yt123' assert match is None assert provider == 'youtube' diff --git a/tests/test_library_catalog.py b/tests/test_library_catalog.py index 396d039..c5b0c2b 100644 --- a/tests/test_library_catalog.py +++ b/tests/test_library_catalog.py @@ -2,14 +2,15 @@ from __future__ import annotations +from mutagen.easyid3 import EasyID3 +from mutagen.mp3 import MP3 + from downtify.library_catalog import ( LibraryContext, list_library_entries, list_library_paths, resolve_library_file, ) -from mutagen.easyid3 import EasyID3 -from mutagen.mp3 import MP3 from downtify.library_paths import library_stored_path diff --git a/tests/test_library_metadata.py b/tests/test_library_metadata.py index 010ba4a..92ccf27 100644 --- a/tests/test_library_metadata.py +++ b/tests/test_library_metadata.py @@ -2,13 +2,13 @@ from __future__ import annotations -from pathlib import Path - from mutagen.easyid3 import EasyID3 -from mutagen.id3 import ID3 from mutagen.mp3 import MP3 -from downtify.library_metadata import library_entry_for_file, read_audio_metadata +from downtify.library_metadata import ( + library_entry_for_file, + read_audio_metadata, +) def test_read_audio_metadata_from_mp3_tags(tmp_path): diff --git a/tests/test_library_paths.py b/tests/test_library_paths.py index e4c366a..d1f6d7f 100644 --- a/tests/test_library_paths.py +++ b/tests/test_library_paths.py @@ -2,9 +2,6 @@ from __future__ import annotations -import os -from pathlib import Path - from downtify import library_paths as lp @@ -36,7 +33,9 @@ def test_locate_prefers_configured_slskd_dir_over_legacy_copy(tmp_path): assert found == external.resolve() -def test_slskd_dir_from_downloader_falls_back_to_env_mount(tmp_path, monkeypatch): +def test_slskd_dir_from_downloader_falls_back_to_env_mount( + tmp_path, monkeypatch +): slskd_mount = tmp_path / 'slskd_vol' slskd_mount.mkdir() diff --git a/tests/test_navidrome.py b/tests/test_navidrome.py index c8fc290..ef35a3a 100644 --- a/tests/test_navidrome.py +++ b/tests/test_navidrome.py @@ -14,13 +14,11 @@ def test_effective_navidrome_settings_defaults(): def test_search_song_id_matches_title_and_artist(): - client = NavidromeClient( - { - 'url': 'https://navidrome.test', - 'username': 'u', - 'password': 'p', - } - ) + client = NavidromeClient({ + 'url': 'https://navidrome.test', + 'username': 'u', + 'password': 'p', + }) def fake_request(endpoint, extra=None, **kwargs): assert endpoint == 'search3' @@ -39,9 +37,11 @@ def fake_request(endpoint, extra=None, **kwargs): } client._request = fake_request # type: ignore[method-assign] - sid = client.search_song_id( - {'name': 'DRAMA KING', 'artists': ['Melxdie'], 'duration': 152} - ) + sid = client.search_song_id({ + 'name': 'DRAMA KING', + 'artists': ['Melxdie'], + 'duration': 152, + }) assert sid == 'song-1' @@ -53,7 +53,10 @@ def test_sync_playlist_creates_playlist(mock_get): scan_resp = MagicMock() scan_resp.json.return_value = { - 'subsonic-response': {'status': 'ok', 'scanStatus': {'scanning': False}} + 'subsonic-response': { + 'status': 'ok', + 'scanStatus': {'scanning': False}, + } } scan_resp.raise_for_status = MagicMock() @@ -168,7 +171,9 @@ def test_sync_playlist_updates_existing_by_id(mock_get): playlists_resp.json.return_value = { 'subsonic-response': { 'status': 'ok', - 'playlists': {'playlist': {'id': 'pl-existing', 'name': 'My List'}}, + 'playlists': { + 'playlist': {'id': 'pl-existing', 'name': 'My List'} + }, } } playlists_resp.raise_for_status = MagicMock() diff --git a/tests/test_providers.py b/tests/test_providers.py index cf18677..9562493 100644 --- a/tests/test_providers.py +++ b/tests/test_providers.py @@ -137,9 +137,11 @@ def search(self, query, filt, limit=10): return [] monkeypatch.setattr(providers, '_client', FakeYTM()) - video_id, match = providers.find_match( - {'name': 'Track', 'artists': ['Artist'], 'duration': 180} - ) + video_id, match = providers.find_match({ + 'name': 'Track', + 'artists': ['Artist'], + 'duration': 180, + }) assert video_id == 'abc123def45' assert isinstance(match, dict) assert match['videoId'] == 'abc123def45' @@ -155,9 +157,11 @@ def search(self, query, filt, limit=10): return [] monkeypatch.setattr(providers, '_client', FakeYTM()) - video_id, match = providers.find_match( - {'name': 'Missing Song', 'artists': ['Artist'], 'duration': 200} - ) + video_id, match = providers.find_match({ + 'name': 'Missing Song', + 'artists': ['Artist'], + 'duration': 200, + }) assert video_id == 'xyz987uvw65' assert isinstance(match, dict) assert match['videoId'] == 'xyz987uvw65' @@ -173,9 +177,11 @@ def search(self, query, filter=None, limit=10): return [] monkeypatch.setattr(providers, '_client', FakeYTM()) - video_id, match = providers.find_match( - {'name': 'Track', 'artists': ['Artist'], 'duration': 180} - ) + video_id, match = providers.find_match({ + 'name': 'Track', + 'artists': ['Artist'], + 'duration': 180, + }) assert video_id == 'qwe987rty65' assert isinstance(match, dict) assert match['videoId'] == 'qwe987rty65' diff --git a/tests/test_slskd_leave_in_place.py b/tests/test_slskd_leave_in_place.py index 162977e..fc1fdd0 100644 --- a/tests/test_slskd_leave_in_place.py +++ b/tests/test_slskd_leave_in_place.py @@ -2,7 +2,6 @@ from __future__ import annotations -from pathlib import Path from unittest.mock import patch from downtify.library_paths import library_stored_path diff --git a/tests/test_slskd_responses.py b/tests/test_slskd_responses.py index 45ce194..ce2b986 100644 --- a/tests/test_slskd_responses.py +++ b/tests/test_slskd_responses.py @@ -1,11 +1,10 @@ from typing import Any -from pathlib import Path from unittest.mock import MagicMock from downtify.slskd_provider import ( - _slskd_transfer_progress_pct, SlskdClient, _collect_matching_files, + _contains_keyword, _filter_slskd_responses, _find_on_disk, _flatten_slskd_responses, @@ -13,34 +12,31 @@ _paths_match, _rank_slskd_candidates, _slskd_search_queries, + _slskd_transfer_progress_pct, download_from_slskd, ) def test_flatten_slskd_responses_attaches_username_to_files(): - rows = _flatten_slskd_responses( - [ - { - 'username': 'peer1', - 'files': [ - {'filename': 'Artist - Track.mp3', 'size': 1}, - ], - } - ] - ) + rows = _flatten_slskd_responses([ + { + 'username': 'peer1', + 'files': [ + {'filename': 'Artist - Track.mp3', 'size': 1}, + ], + } + ]) assert len(rows) == 1 assert rows[0]['username'] == 'peer1' assert rows[0]['filename'] == 'Artist - Track.mp3' def test_slskd_search_queries_prefers_title_dash_artist(): - queries = _slskd_search_queries( - { - 'artists': ['4D4M'], - 'name': "YOU KNOW WHERE WE'RE GOING - Hardstyle Bass Bounce Edition", - 'album_name': "YOU KNOW WHERE WE'RE GOING", - } - ) + queries = _slskd_search_queries({ + 'artists': ['4D4M'], + 'name': "YOU KNOW WHERE WE'RE GOING - Hardstyle Bass Bounce Edition", + 'album_name': "YOU KNOW WHERE WE'RE GOING", + }) assert queries[0] == "YOU KNOW WHERE WE'RE GOING - 4D4M" assert 'YOU KNOW WHERE WERE GOING' in queries @@ -114,7 +110,6 @@ def test_contains_keyword_ignores_remix_in_distant_parent_folder(): 'album_name': 'Album', 'duration': 200, } - from downtify.slskd_provider import _contains_keyword assert not _contains_keyword( song, @@ -272,9 +267,11 @@ def test_filter_slskd_responses_hides_no_free_slot_and_locked_files(): def test_start_search_requests_filtered_responses(): - client = SlskdClient( - {'base_url': 'https://slskd.example', 'api_key': 'key', 'timeout_seconds': 5} - ) + client = SlskdClient({ + 'base_url': 'https://slskd.example', + 'api_key': 'key', + 'timeout_seconds': 5, + }) captured: dict[str, Any] = {} def fake_request(method, path, **kwargs): @@ -339,9 +336,11 @@ def test_slskd_transfer_progress_falls_back_when_no_stats(): def test_find_transfer_matches_basename_not_full_path(): - client = SlskdClient( - {'base_url': 'https://slskd.example', 'api_key': 'key', 'timeout_seconds': 5} - ) + client = SlskdClient({ + 'base_url': 'https://slskd.example', + 'api_key': 'key', + 'timeout_seconds': 5, + }) client.list_download_transfers = lambda: [ # type: ignore[method-assign] { 'username': 'peer1', @@ -364,9 +363,11 @@ def test_find_transfer_matches_basename_not_full_path(): def test_enqueue_download_uses_username_endpoint(): - client = SlskdClient( - {'base_url': 'https://slskd.example', 'api_key': 'key', 'timeout_seconds': 5} - ) + client = SlskdClient({ + 'base_url': 'https://slskd.example', + 'api_key': 'key', + 'timeout_seconds': 5, + }) captured: dict[str, Any] = {} def fake_request(method, path, **kwargs): @@ -380,13 +381,11 @@ def fake_request(method, path, **kwargs): return resp client._request = fake_request # type: ignore[method-assign] - ok = client.enqueue_download( - { - 'username': 'peer1', - 'filename': 'music\\Artist - Track.mp3', - 'size': 1234, - } - ) + ok = client.enqueue_download({ + 'username': 'peer1', + 'filename': 'music\\Artist - Track.mp3', + 'size': 1234, + }) assert ok is True assert captured['path'] == '/api/v0/transfers/downloads/peer1' assert captured['json'] == [ @@ -394,7 +393,9 @@ def fake_request(method, path, **kwargs): ] -def test_download_from_slskd_tries_next_candidate_on_failure(monkeypatch, tmp_path): +def test_download_from_slskd_tries_next_candidate_on_failure( + monkeypatch, tmp_path +): candidates = [ { 'username': 'peer1', @@ -430,7 +431,13 @@ def wait_search_complete(self, *args, **kwargs) -> bool: return True def search_responses(self, search_id: str) -> list[dict[str, Any]]: - return [{'username': 'peer1', 'hasFreeUploadSlot': True, 'fileCount': 1}] + return [ + { + 'username': 'peer1', + 'hasFreeUploadSlot': True, + 'fileCount': 1, + } + ] def delete_search(self, search_id: str) -> None: pass @@ -465,7 +472,9 @@ def fake_wait(client, song, username, filename, settings, roots, **kwargs): 'downtify.slskd_provider._search_roots', lambda settings, client: [tmp_path], ) - monkeypatch.setattr('downtify.slskd_provider._wait_for_slskd_file', fake_wait) + monkeypatch.setattr( + 'downtify.slskd_provider._wait_for_slskd_file', fake_wait + ) settings = { 'enabled': True, diff --git a/tests/test_slskd_timeout.py b/tests/test_slskd_timeout.py index b44f4bc..1a9602d 100644 --- a/tests/test_slskd_timeout.py +++ b/tests/test_slskd_timeout.py @@ -3,7 +3,7 @@ from __future__ import annotations from pathlib import Path -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock from downtify.downloader import Downloader from downtify.slskd_provider import _wait_for_slskd_file @@ -49,7 +49,9 @@ def tick() -> float: assert client.find_transfer.called -def test_resolve_video_id_falls_back_after_slskd_timeout(monkeypatch, tmp_path): +def test_resolve_video_id_falls_back_after_slskd_timeout( + monkeypatch, tmp_path +): d = Downloader( tmp_path, audio_format='mp3', @@ -64,9 +66,10 @@ def test_resolve_video_id_falls_back_after_slskd_timeout(monkeypatch, tmp_path): lambda song: ('yt123', {'name': song.get('name')}), ) - video_id, match, provider, local = d._resolve_video_id( - {'name': 'Track', 'artists': ['Artist']} - ) + video_id, match, provider, local = d._resolve_video_id({ + 'name': 'Track', + 'artists': ['Artist'], + }) assert provider == 'youtube-music' assert video_id == 'yt123' assert local is None diff --git a/tests/test_text_search_stub.py b/tests/test_text_search_stub.py index 44f16b8..deca493 100644 --- a/tests/test_text_search_stub.py +++ b/tests/test_text_search_stub.py @@ -1,4 +1,7 @@ -from downtify.providers import _parse_text_search_query, song_stub_from_text_query +from downtify.providers import ( + _parse_text_search_query, + song_stub_from_text_query, +) def test_parse_artist_dash_title(): diff --git a/tests/test_track_index.py b/tests/test_track_index.py index 21217b9..40cd800 100644 --- a/tests/test_track_index.py +++ b/tests/test_track_index.py @@ -3,6 +3,7 @@ from __future__ import annotations from downtify.downloader import Downloader +from downtify.library_paths import library_stored_path from downtify.track_index import ( TrackIndex, normalize_spotify_track_id, @@ -13,17 +14,12 @@ def test_normalize_spotify_track_id_from_song_id(): - assert ( - normalize_spotify_track_id({'song_id': SPOTIFY_ID}) - == SPOTIFY_ID - ) + assert normalize_spotify_track_id({'song_id': SPOTIFY_ID}) == SPOTIFY_ID def test_normalize_spotify_track_id_from_uri(): assert ( - normalize_spotify_track_id( - {'song_id': f'spotify:track:{SPOTIFY_ID}'} - ) + normalize_spotify_track_id({'song_id': f'spotify:track:{SPOTIFY_ID}'}) == SPOTIFY_ID ) @@ -40,8 +36,6 @@ def test_resolve_existing_prefers_global_library(tmp_path): slskd_dir.mkdir(parents=True) target.write_bytes(b'x' * 100) - from downtify.library_paths import library_stored_path - stored = library_stored_path(target, download_dir, slskd_dir) index = TrackIndex(tmp_path / 'library.db') index.register(SPOTIFY_ID, stored) diff --git a/tests/test_youtube_cookies.py b/tests/test_youtube_cookies.py index eee9905..f1032e6 100644 --- a/tests/test_youtube_cookies.py +++ b/tests/test_youtube_cookies.py @@ -4,6 +4,9 @@ from pathlib import Path +import pytest +from fastapi import HTTPException + from downtify.api import ( DEFAULT_SETTINGS, _effective_youtube_settings, @@ -17,8 +20,8 @@ _youtube_download_profiles, _youtube_extractor_args, _ytdlp_format_unavailable_retry, - _ytdlp_should_try_alternate_video, _ytdlp_should_retry_without_cookies, + _ytdlp_should_try_alternate_video, apply_ytdlp_cookie_opts, inspect_youtube_cookies, ytdlp_cookies_configured, @@ -27,7 +30,7 @@ def test_default_settings_includes_youtube(): assert 'youtube' in DEFAULT_SETTINGS - assert DEFAULT_SETTINGS['youtube']['cookies_file'] == '' + assert not DEFAULT_SETTINGS['youtube']['cookies_file'] def test_effective_youtube_settings_strips_paths(): @@ -183,9 +186,6 @@ def test_ytdlp_audio_formats_has_fallbacks(): def test_validate_youtube_cookies_bytes_rejects_empty(): - import pytest - from fastapi import HTTPException - with pytest.raises(HTTPException) as exc: _validate_youtube_cookies_bytes(b' ') assert exc.value.status_code == 400 diff --git a/uv.lock b/uv.lock index d21a3d3..26636fd 100644 --- a/uv.lock +++ b/uv.lock @@ -197,7 +197,7 @@ wheels = [ [[package]] name = "codeflash" -version = "0.20.5" +version = "0.20.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -216,6 +216,7 @@ dependencies = [ { name = "libcst" }, { name = "line-profiler" }, { name = "lxml" }, + { name = "memray", marker = "sys_platform != 'win32'" }, { name = "parameterized" }, { name = "platformdirs" }, { name = "posthog" }, @@ -223,12 +224,14 @@ dependencies = [ { name = "pygls" }, { name = "pytest" }, { name = "pytest-asyncio" }, + { name = "pytest-memray", marker = "sys_platform != 'win32'" }, { name = "pytest-timeout" }, { name = "requests" }, { name = "rich" }, { name = "sentry-sdk" }, { name = "tomlkit" }, { name = "tree-sitter" }, + { name = "tree-sitter-go" }, { name = "tree-sitter-groovy" }, { name = "tree-sitter-java" }, { name = "tree-sitter-javascript" }, @@ -236,9 +239,9 @@ dependencies = [ { name = "tree-sitter-typescript" }, { name = "unidiff" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/cf/8ce2ac7c3e9174e8eee3eae27b47fea506bb937e5ef5ea226316482485dd/codeflash-0.20.5.tar.gz", hash = "sha256:8f627416ac9f131a7d6893b1ae6984e0f46fa658aedc330e9990aeeaf461021b", size = 735006, upload-time = "2026-04-02T03:02:30.163Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/bc/d86b03b88cf254f4581162a33c8f296092d1f1c46bd7c3478802dd8b9c23/codeflash-0.20.6.tar.gz", hash = "sha256:411202748597aff5ebb3fd8bceb510da209b3253a86fe49783238113076bba55", size = 810714, upload-time = "2026-05-30T13:23:22.792Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/bf/965d80211eb0d87760f350bdd478aae1de78470586895e91dd84e932f062/codeflash-0.20.5-py3-none-any.whl", hash = "sha256:7345d789f8ca1971a0c0d0a8eef6562894eef2ffde43069fc3e35255af0195ea", size = 729289, upload-time = "2026-04-02T03:02:31.405Z" }, + { url = "https://files.pythonhosted.org/packages/40/3b/272cfa8a9ebe6c8d17cb8ca6d5efb0471cefbb7a9b5e5b8e5bd24d0b28e9/codeflash-0.20.6-py3-none-any.whl", hash = "sha256:f69146ff564a0d7e98c4122c6270c8ad92c422168430a2a66a1d8876efb14b5e", size = 782400, upload-time = "2026-05-30T13:23:21.364Z" }, ] [[package]] @@ -264,90 +267,90 @@ wheels = [ [[package]] name = "coverage" -version = "7.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/23/7f/d0720730a397a999ffc0fd3f5bebef347338e3a47b727da66fbb228e2ff2/coverage-7.14.0.tar.gz", hash = "sha256:057a6af2f160a85384cde4ab36f0d2777bae1057bae255f95413cdd382aa5c74", size = 919489, upload-time = "2026-05-10T18:02:31.397Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/59/9d/7c83ef51c3eb495f10010094e661833588b7709946da634c8b66520b97c7/coverage-7.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84c32d90bf4537f0e7b4dec9aaa9a938fb8205136b9d2ecf4d7629d5262dc075", size = 219668, upload-time = "2026-05-10T17:59:23.106Z" }, - { url = "https://files.pythonhosted.org/packages/24/34/898546aefbd28f0af131201d0dc852c9e976f817bd7d5bfb8dc4e02863bb/coverage-7.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7c843572c605ab51cfdb5c6b5f2586e2a8467c0d28eca4bdef4ec70c5fecbd82", size = 220192, upload-time = "2026-05-10T17:59:26.095Z" }, - { url = "https://files.pythonhosted.org/packages/df/4a/b457c88aca72b0df13a98167ebd5d947135ccd9881ea88ce6a570e13aa9b/coverage-7.14.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0c451757d3fa2603354fdc789b5e58a0e327a117c370a40e3476ba4eabab228c", size = 246932, upload-time = "2026-05-10T17:59:27.806Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d9/92600e89486fd074c50f0117422b2c9592c3e144e2f25bd5ac0bc62bc7a0/coverage-7.14.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3fd43f0616e765ab78d069cf8358def7363957a45cee446d65c502dcfeea7893", size = 248762, upload-time = "2026-05-10T17:59:29.479Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e1/9ea1eb9c311da7f15853559dc1d9d82bef88ecd3e59fbeb51f16bc2ffa91/coverage-7.14.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:731e535b1498b27d13594a0527a79b0510867b0ad891532be41cb883f2128e20", size = 250625, upload-time = "2026-05-10T17:59:31.33Z" }, - { url = "https://files.pythonhosted.org/packages/a5/03/57afca1b8106f8549a5329139315041fe166d6099bd9381346b9430dfbd1/coverage-7.14.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c7492f2d493b976941c7ca050f273cbda2f43c381124f7586a3e3c16d1804fec", size = 252539, upload-time = "2026-05-10T17:59:32.692Z" }, - { url = "https://files.pythonhosted.org/packages/57/5e/2e9fc63c9928119c1dbae02222be51407d3e7ebac5811ebbda4af3557795/coverage-7.14.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc38367eaa2abb1b766ac333142bce7655335a73537f5c8b75aaa89c2b987757", size = 247636, upload-time = "2026-05-10T17:59:34.599Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e2/0b7898cda21041cc67546e19b80ba66cbbb47cbece52a76a5904de6a3aaf/coverage-7.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0a951308cde22cf77f953955a754d04dccb57fe3bb8e345d685778ed9fc1632a", size = 248666, upload-time = "2026-05-10T17:59:36.232Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e3/d33662a2fdaef23229c15921f39c84ec38441f3069ba26e134ed402c833b/coverage-7.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fab3877e4ebb06bd9d4d4d00ee53309ee5478e66873c66a382272e3ee33eb7ea", size = 246670, upload-time = "2026-05-10T17:59:38.029Z" }, - { url = "https://files.pythonhosted.org/packages/99/b2/533942c3bfbf6770b5c32d7f2ff029fe013dba31f3fe8b45cabbb250365e/coverage-7.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b812eb847b19876ebf33fb6c4f11819af05ab6050b0bfa1bc53412ae81779adb", size = 250484, upload-time = "2026-05-10T17:59:39.974Z" }, - { url = "https://files.pythonhosted.org/packages/d8/00/15acbad83a96de13c73831486c7627bfed73dfaec53b04e4a6315edf3fd8/coverage-7.14.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d9c8ef6ed820c433de075657d72dda1f89a2984955e58b8a75feb3f184250218", size = 246942, upload-time = "2026-05-10T17:59:41.659Z" }, - { url = "https://files.pythonhosted.org/packages/70/db/cef0228de493f2c740c760a9057a61d00c6849480073b70a75b87c7d4bab/coverage-7.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d128b1bba9361fbaaf6a19e179e6cfd6a9103ce0c0555876f72780acc93efd85", size = 247544, upload-time = "2026-05-10T17:59:43.471Z" }, - { url = "https://files.pythonhosted.org/packages/77/a0/d9ef8e148f3025c2ae8401d77cda1502b6d2a4d8102603a8af31460aedb6/coverage-7.14.0-cp310-cp310-win32.whl", hash = "sha256:65f267ca1370726ec2c1aa38bbe4df9a71a740f22878d2d4bf59d71a4cd8d323", size = 222285, upload-time = "2026-05-10T17:59:44.908Z" }, - { url = "https://files.pythonhosted.org/packages/85/c0/30c454c7d3cf47b2805d4e06f12443f5eece8a5d030d3b0350e7b74ecb49/coverage-7.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:b34ece8065914f938ed7f2c5872bb865336977a52919149846eac3744327267a", size = 223215, upload-time = "2026-05-10T17:59:46.779Z" }, - { url = "https://files.pythonhosted.org/packages/fc/e4/649c8d4f7f1709b6dbfc474358aa1bba02f67bcd52e2fec291a5014006cd/coverage-7.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a78e2a9d9c5e3b8d4ab9b9d28c985ea66fced0a7d7c2aec1f216e03a2011480", size = 219795, upload-time = "2026-05-10T17:59:48.198Z" }, - { url = "https://files.pythonhosted.org/packages/7f/8d/46692d24b3f395d4cbf17bfcc57136b4f2f9c0c0df864b0bddfc1d71a014/coverage-7.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1816c505187592dcd1c5a5f226601a549f70365fbd00930ac88b0c225b76bb4", size = 220299, upload-time = "2026-05-10T17:59:49.683Z" }, - { url = "https://files.pythonhosted.org/packages/12/c2/a40f5cb295bbcbb697a76947a56081c494c61950366294ee426ffe261099/coverage-7.14.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d8e1762f0e9cbc26ec315471e7b47855218e833cd5a032d706fbf43845d878c7", size = 250721, upload-time = "2026-05-10T17:59:51.494Z" }, - { url = "https://files.pythonhosted.org/packages/fd/35/202235eb5c3c14c212462cd91d61b7386bf8fc44bc7a77f4742d2a69174b/coverage-7.14.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9336e23e8bb3a3925398261385e2a1533957d3e760e91070dcb0e98bfa514eed", size = 252633, upload-time = "2026-05-10T17:59:53.244Z" }, - { url = "https://files.pythonhosted.org/packages/bb/80/5f596e8995785124ee191c42535664c5e62c65995b66f4ca21e28ae04c81/coverage-7.14.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd1169b2230f9cbe9c638ba38022ed7a2b1e641cc07f7cea0365e4be2a74980", size = 254743, upload-time = "2026-05-10T17:59:55.021Z" }, - { url = "https://files.pythonhosted.org/packages/1e/6d/0d178825be2350f0adb27984d0aa7cf84bbdab201f6fb926b535d23a8f5f/coverage-7.14.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1bb3543b58fea74d2cd1abc4054cc927e4724687cb4560cd2ed88d2c7d820c0", size = 256700, upload-time = "2026-05-10T17:59:56.511Z" }, - { url = "https://files.pythonhosted.org/packages/19/5b/9e549c2f6e9dfea472adadba06c294e64735dabc2dd19015fac082095013/coverage-7.14.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a93bac2cb577ef60074999ed56d8a1535894398e2ed920d4185c3ec0c8864742", size = 250854, upload-time = "2026-05-10T17:59:57.94Z" }, - { url = "https://files.pythonhosted.org/packages/3d/1c/b94f9f5f36396021ee2f62c5834b12e6a3d31f0bed5d6fc6d1c3caec087c/coverage-7.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5904abf7e18cddc463219b17552229650c6b79e061d31a1059283051169cf7d5", size = 252433, upload-time = "2026-05-10T17:59:59.688Z" }, - { url = "https://files.pythonhosted.org/packages/b5/cb/d192cd8e1345eccabc32016f2d39072ecd10cb4f4b983ed8d0ebdeaf00dc/coverage-7.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:741f57cddc9004a8c81b084660215f33a6b597dbe62c31386b983ee26310e327", size = 250494, upload-time = "2026-05-10T18:00:01.953Z" }, - { url = "https://files.pythonhosted.org/packages/53/c5/aac9f460a41d835dbddef1d377f105f6ac2311d0f3c1588e9f51046d8813/coverage-7.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:664123feb0929d7affc135717dbd70d61d98688a08ab1e5ba464739620c6252d", size = 254261, upload-time = "2026-05-10T18:00:03.779Z" }, - { url = "https://files.pythonhosted.org/packages/23/aa/7af7c0081980a9cb3d289c5a435a4b7657dcecbd128e25c580e6a50389b5/coverage-7.14.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c83d2399a51bbec8429266905d33616f04bc5726b1138c35844d5fcd896b2e20", size = 250216, upload-time = "2026-05-10T18:00:05.262Z" }, - { url = "https://files.pythonhosted.org/packages/35/60/a4257538ce2f6b978aeb51870d6c4208c510928a03db7e0339bb625dccb7/coverage-7.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb2e855b87321259a037429288ae85216d191c74de3e79bf57cd2bc0761992c", size = 251125, upload-time = "2026-05-10T18:00:06.858Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ab/f91af47642ec1aa53490e835a95847168d9c77fc39aa58527604c051e145/coverage-7.14.0-cp311-cp311-win32.whl", hash = "sha256:731dc15b385ac52289743d476245b61e1a2927e803bef655b52bc3b2a75a21f3", size = 222300, upload-time = "2026-05-10T18:00:08.608Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f0/a71ddbd874431e7a7cd96071f0c331cfbbad07704833c765d24ffbab8a67/coverage-7.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:bfb0ed8ec5d25e93face268115d7964db9df8b9aae8edcde9ec6b16c726a7cc1", size = 223241, upload-time = "2026-05-10T18:00:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/d8/6e/d9d312a5151a96cd110efee32efc3fc97b01ebd86203fe618ccb29cf4c92/coverage-7.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:7ebb1c6df9f78046a1b1e0a89674cd4bf73b7c648914eebcf976a57fd99a5627", size = 221908, upload-time = "2026-05-10T18:00:12.242Z" }, - { url = "https://files.pythonhosted.org/packages/09/1e/2f996b2c8415cbb6f54b0f5ec1ee850c96d7911961afb4fc05f4a89d8c58/coverage-7.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7ffd19fc8aed057fd686a17a4935eef5f9859d69208f96310e893e64b9b6ccf5", size = 219967, upload-time = "2026-05-10T18:00:13.756Z" }, - { url = "https://files.pythonhosted.org/packages/34/23/35c7aea1274aef7525bdd2dc92f710bdde6d11652239d71d1ec450067939/coverage-7.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:829994cfe1aeb773ca27bf246d4badc1e764893e3bfb98fff820fcecd1ca4662", size = 220329, upload-time = "2026-05-10T18:00:15.264Z" }, - { url = "https://files.pythonhosted.org/packages/75/cf/a8f4b43a16e194b0261257ad28ded5853ec052570afef4a84e1d81189f3b/coverage-7.14.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b4f07cf7edcb7ec39431a5074d7ea83b29a9f71fcfc494f0f40af4e65180420f", size = 251839, upload-time = "2026-05-10T18:00:17.16Z" }, - { url = "https://files.pythonhosted.org/packages/69/ff/6699e7b71e60d3049eb2bdcbc95ee3f35707b2b0e48f32e9e63d3ce30c08/coverage-7.14.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca3d9cf2c32b521bd9518385608787fa86f38daf993695307531822c3430ed67", size = 254576, upload-time = "2026-05-10T18:00:18.829Z" }, - { url = "https://files.pythonhosted.org/packages/22/ec/c936d495fcd67f48f03a9c4ad3297ff80d1f222a5df3980f15b34c186c21/coverage-7.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92af52828e7f29d827346b0294e5a0853fa206db77db0395b282918d41e28db9", size = 255690, upload-time = "2026-05-10T18:00:20.648Z" }, - { url = "https://files.pythonhosted.org/packages/5c/42/5af63f636cc62a4a2b1b3ba9146f6ee6f53a35a50d5cefc54d5670f60999/coverage-7.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b2bb6c9d7e769360d0f20a0f219603fd64f0c8f97de17ab25853261602be0fb", size = 257949, upload-time = "2026-05-10T18:00:22.28Z" }, - { url = "https://files.pythonhosted.org/packages/26/d3/a225317bd2012132a27e1176d51660b826f99bb975876463c44ea0d7ee5a/coverage-7.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c9ed6ef99f88fb8c14aa8e2bf8eb0fe55fa2edfea68f8675d78741df1a5ac0e", size = 252242, upload-time = "2026-05-10T18:00:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/f1/7f/9e65495298c3ea414742998539c37d048b5e81cc818fb1828cc6b51d10bf/coverage-7.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8231ade007f37959fbf58acc677f26b922c02eda6f0428ea307da0fd39681bf3", size = 253608, upload-time = "2026-05-10T18:00:25.588Z" }, - { url = "https://files.pythonhosted.org/packages/94/46/1522b524a35bdad22b2b8c4f9d32d0a104b524726ec380b2db68db1746f5/coverage-7.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d8b013632cc1ce1d09dbe4f32667b4d320ec2f54fc326ebeffcd0b0bcc2bb6c4", size = 251753, upload-time = "2026-05-10T18:00:27.104Z" }, - { url = "https://files.pythonhosted.org/packages/f3/e9/cdf00d38817742c541ade405e115a3f7bf36e6f2a8b99d4f209861b85a2d/coverage-7.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1733198802d71ec4c524f322e2867ee05c62e9e75df86bdca545407a221827d1", size = 255823, upload-time = "2026-05-10T18:00:29.038Z" }, - { url = "https://files.pythonhosted.org/packages/38/fc/5e7877cf5f902d08a17ff1c532511476d87e1bea355bd5028cb97f902e79/coverage-7.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:72a305291fa8ee01332f1aaf38b348ca34097f6aa0b0ef627eef2837e57bbba5", size = 251323, upload-time = "2026-05-10T18:00:30.647Z" }, - { url = "https://files.pythonhosted.org/packages/18/9d/50f05a72dff8487464fdd4178dda5daed642a060e60afb644e3d45123559/coverage-7.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcaba850dd317c65423a9d63d88f9573c53b00354d6dd95724576cc98a131595", size = 253197, upload-time = "2026-05-10T18:00:32.211Z" }, - { url = "https://files.pythonhosted.org/packages/00/3f/6f61ffe6439df266c3cf60f5c99cfaa21103d0210d706a42fc6c30683ff8/coverage-7.14.0-cp312-cp312-win32.whl", hash = "sha256:5ac83957a80d0701310e96d8bec68cdcf4f90a7674b7d13f15a344315b41ab27", size = 222515, upload-time = "2026-05-10T18:00:33.717Z" }, - { url = "https://files.pythonhosted.org/packages/85/19/93853133df2cb371083285ef6a93982a0173e7a233b0f61373ba9fd30eb2/coverage-7.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:70390b0da32cb90b501953716302906e8bcce087cb283e70d8c97729f22e92b2", size = 223324, upload-time = "2026-05-10T18:00:35.172Z" }, - { url = "https://files.pythonhosted.org/packages/74/18/9f7fe62f659f24b7a82a0be56bf94c1bd0a89e0ae7ab4c668f6e82404294/coverage-7.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:91b993743d959b8be85b4abf9d5478216a69329c321efe5be0433c1a841d691d", size = 221944, upload-time = "2026-05-10T18:00:37.014Z" }, - { url = "https://files.pythonhosted.org/packages/6b/76/b7c66ee3c66e1b0f9d894c8125983aa0c03fb2336f2fd16559f9c966157f/coverage-7.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f2bbb8254370eb4c628ff3d6fa8a7f74ddc40565394d4f7ab791d1fe568e37ef", size = 219990, upload-time = "2026-05-10T18:00:38.887Z" }, - { url = "https://files.pythonhosted.org/packages/b3/af/e567cbad5ba69c013a50146dfa886dc7193361fda77521f51274ff620e1b/coverage-7.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23b81107f46d3f21d0cbce30664fcec0f5d9f585638a67081750f99738f6bf66", size = 220365, upload-time = "2026-05-10T18:00:40.864Z" }, - { url = "https://files.pythonhosted.org/packages/44/6f/9ad575d505b4d805b254febc8a5b338a2efe278f8786e56ff1cb8413f9c3/coverage-7.14.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:22a7e06a5f11a757cdfe79018e9095f9f69ae283c5cd8123774c788deec8717b", size = 251363, upload-time = "2026-05-10T18:00:42.489Z" }, - { url = "https://files.pythonhosted.org/packages/6f/5f/b5370068b2f57787454592ed7dcd1002f0f1703b7db1fa30f6a325a4ca6e/coverage-7.14.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9d1aa57a1dc8e05bdc42e81c5d671d849577aeedf279f4c449d6d286f9ed88ca", size = 253961, upload-time = "2026-05-10T18:00:44.079Z" }, - { url = "https://files.pythonhosted.org/packages/29/1e/51adf17738976e8f2b85ddef7b7aa12a0838b056c92f175941d8862767c1/coverage-7.14.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90c1a51bcfddf645b3bb7ec333d9e94393a8e94f55642380fa8a9a5a9e636cb7", size = 255193, upload-time = "2026-05-10T18:00:45.623Z" }, - { url = "https://files.pythonhosted.org/packages/9e/7b/5bfd7ac1df3b881c2ac7a5cbc99c7609e6296c402f5ef587cd81c6f355b3/coverage-7.14.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a841fae2fadcae4f438d43b6ccc4aac2ad609f47cdb6cfdce60cbb3fe5ca7bc2", size = 257326, upload-time = "2026-05-10T18:00:47.173Z" }, - { url = "https://files.pythonhosted.org/packages/7d/38/1d37d316b174fad3843a1d76dbdfe4398771c9ecd0515935dd9ece9cd627/coverage-7.14.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c79d2319cabef1fe8e86df73371126931550804738f78ad7d31e3aad85a67367", size = 251582, upload-time = "2026-05-10T18:00:49.152Z" }, - { url = "https://files.pythonhosted.org/packages/34/46/746704f95980ba220214e1a41e18cec5aea80a898eaa53c51bf2d645ff36/coverage-7.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b23b0c6f0b1db6ad769b7050c8b641c0bf215ded26c1816955b17b7f26edfa9", size = 253325, upload-time = "2026-05-10T18:00:51.252Z" }, - { url = "https://files.pythonhosted.org/packages/e1/b9/bbe87206d9687b192352f893797825b5f5b15ecd3aa9c68fbff0c074d77b/coverage-7.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:55d3089079ce181a4566b1065ab28d2575eb76d8ac8f81f4fcda2bf037fee087", size = 251291, upload-time = "2026-05-10T18:00:52.816Z" }, - { url = "https://files.pythonhosted.org/packages/46/57/b8cdb12ac0d73ef0243218bd5e22c9df8f92edab8018213a86aec67c5324/coverage-7.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:49c005cba1e2f9677fb2845dcdf9a2e72a52a17d63e8231aaaae35d9f50215ef", size = 255448, upload-time = "2026-05-10T18:00:54.548Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d4/5002019538b2036ce3c84340f54d2fd5100d55b0a6b0894eee56128d03c7/coverage-7.14.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9117377b823daa28aa8635fbb08cda1cd6be3d7143257345459559aeef852d52", size = 251110, upload-time = "2026-05-10T18:00:56.122Z" }, - { url = "https://files.pythonhosted.org/packages/37/53/20c5009477660f084e6ed60bc02a91894b8e234e617e86ecfd9aaf78e27b/coverage-7.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b79d646cf46d5cf9a9f40281d4441df5849e445726e369006d2b117710b33fe", size = 252885, upload-time = "2026-05-10T18:00:57.967Z" }, - { url = "https://files.pythonhosted.org/packages/ae/ab/3cf6427ac9c1f1db747dbb1ce71dde47984876d4c2cfd018a3fef0a78d4d/coverage-7.14.0-cp313-cp313-win32.whl", hash = "sha256:fb609b3658479e33f9516d46f1a89dbb9b6c261366e3a11844a96ec487533dae", size = 222539, upload-time = "2026-05-10T18:00:59.581Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b8/9228523e80321c2cb4880d1f589bc0171f2f71432c35118ad04dc01decce/coverage-7.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0773d8329cf32b6fd222e4b52622c61fe8d503eb966cfc8d3c3c10c96266d50e", size = 223344, upload-time = "2026-05-10T18:01:01.531Z" }, - { url = "https://files.pythonhosted.org/packages/a3/99/118daa192f95e3a6cb2740100fbf8797cda1734b4134ef0b5d501a7fa8f3/coverage-7.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:b4e26a0f1b696faf283bffe5b8569e44e336c582439df5d53281ab89ee0cba96", size = 221966, upload-time = "2026-05-10T18:01:03.16Z" }, - { url = "https://files.pythonhosted.org/packages/e6/f1/a46cc0c013be170216253184a32366d7cbdb9252feaec866b05c2d12a894/coverage-7.14.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:953f521ca9445300397e65fda3dca58b2dbd68fee983777420b57ac3c77e9f90", size = 220679, upload-time = "2026-05-10T18:01:05.058Z" }, - { url = "https://files.pythonhosted.org/packages/64/8c/9c30a3d311a34177fa432995be7fbfc64477d8bac5630bd38055b1c9b424/coverage-7.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:98af83fd65ae24b1fdd03aaead967a9f523bcd2f1aab2d4f3ffda65bb568a6f1", size = 221033, upload-time = "2026-05-10T18:01:07.002Z" }, - { url = "https://files.pythonhosted.org/packages/9a/cd/3fb5e06c3badefd0c1b47e2044fdca67f8220a4ec2e7fcfb476aa0a67c6c/coverage-7.14.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:668b92e6958c4db7cf92e81caac328dfbbdbb215db2850ad28f0cbe1eea0bfbd", size = 262333, upload-time = "2026-05-10T18:01:08.903Z" }, - { url = "https://files.pythonhosted.org/packages/a8/e6/fbc322325c7294d3e22c1ad6b79e45d0806b25228c8e5842aed6d8169aa7/coverage-7.14.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9fbd898551762dea00d3fef2b1c4f99afd2c6a3ff952ea07d60a9bd5ed4f34bc", size = 264410, upload-time = "2026-05-10T18:01:10.531Z" }, - { url = "https://files.pythonhosted.org/packages/08/92/c497b264bec1673c47cc77e26f760fcda4654cabf1f39546d1a23a3b8c35/coverage-7.14.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68af363c07ecd8d4b7d4043d85cb376d7d227eceb54e5323ee45da73dbd3e426", size = 266836, upload-time = "2026-05-10T18:01:12.19Z" }, - { url = "https://files.pythonhosted.org/packages/78/fc/045da320987f401af5d2815d351e8aa799aec859f60e29f445e3089eeedb/coverage-7.14.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e57054a583da8ac55edf24117ea4c9133032cfc4cf72aa2d48c1e5d4b52f899", size = 267974, upload-time = "2026-05-10T18:01:13.926Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ae/227b1e379497fb7a4fc3286e620f80c8a1e7cec66d45695a01639eb1af65/coverage-7.14.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3499459bbcdd51a65b64c35ab7ed2764eaf3cba826e0df3f1d7fe2e102b70b", size = 261578, upload-time = "2026-05-10T18:01:15.564Z" }, - { url = "https://files.pythonhosted.org/packages/a0/f5/3570342900f2acea31d33ff1590c5d8bac1a8e1a2e1c6d34a5d5e61de681/coverage-7.14.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:45899ec2138a4346ed34d601dedf5076fb74edf2d1dd9dc76a78e82397edee90", size = 264394, upload-time = "2026-05-10T18:01:17.607Z" }, - { url = "https://files.pythonhosted.org/packages/16/29/de1bbc01c935b28f89b1dc3db85b011c055e843a8e5e3b83141c3f80af7f/coverage-7.14.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8767486808c436f05b23ab98eb963fb29185e32a9357a166971685cb3459900f", size = 262022, upload-time = "2026-05-10T18:01:19.304Z" }, - { url = "https://files.pythonhosted.org/packages/35/95/f53890b0bf2fc10ab168e05d38869215e73ca24c4cb521c3bb0eb62fe16b/coverage-7.14.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a3b5ddfd6aa7ddad53ee3edb231e88a2151507a43229b7d71b953916deca127d", size = 265732, upload-time = "2026-05-10T18:01:21.494Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ea/c919e259081dd2bdf0e43b87209709ba7ec2e4117c2a7f5185379c43463c/coverage-7.14.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:63df0fe568e698e1045792399f8ab6da3a6c2dce3182813fb92afa2641087b47", size = 260921, upload-time = "2026-05-10T18:01:23.533Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2c/c2831889705a81dc5d1c6ca12e4d8e9b95dfc146d153488a6c0ea685d28e/coverage-7.14.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:827d6397dbd95144939b18f89edf31f63e1f99633e8d5f32f22ba8bdda567477", size = 263109, upload-time = "2026-05-10T18:01:25.165Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a9/2fcae5003cac3d63fe344d2166243c2756935f48420863c5272b240d550b/coverage-7.14.0-cp313-cp313t-win32.whl", hash = "sha256:7bf43e000d24012599b879791cff41589af90674722421ef11b11a5431920bab", size = 223212, upload-time = "2026-05-10T18:01:27.157Z" }, - { url = "https://files.pythonhosted.org/packages/3f/bb/18e94d7b14b9b398164197114a587a04ab7c9fdbe1d237eef57311c5e883/coverage-7.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3f5549365af25d770e06b1f8f5682d9a5637d06eb494db91c6fa75d3950cc917", size = 224272, upload-time = "2026-05-10T18:01:29.107Z" }, - { url = "https://files.pythonhosted.org/packages/db/56/4f14fad782b035c81c4ffd09159e7103d42bb1d93ac8496d04b90a11b7da/coverage-7.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6d160217ec6fe890f16ad3a9531761589443749e448f91986c972714fad361c8", size = 222530, upload-time = "2026-05-10T18:01:31.151Z" }, - { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" }, +version = "7.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/69/0d2ef01ff4b8fcecd4cba920d11e92fa4f96ae412441d3b56a90a258e69b/coverage-7.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e3680291c4a1d0dadfa84a2c459576a4af5133abb617905714339a0c73138cf", size = 219722, upload-time = "2026-05-26T20:38:14.002Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ae/9afdeaa31b9d9ce98124b6abf8bb49119bf71aecae04f8567c189d91299f/coverage-7.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5274669f37f2343635a347b91a60777621341ab3378e9c6ac9335eee704bddf", size = 220240, upload-time = "2026-05-26T20:38:17.424Z" }, + { url = "https://files.pythonhosted.org/packages/51/69/c998589871df7ea7dba865cc5ee32b5a3e1d47ba6c68ef91104c7c46fa5e/coverage-7.14.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfe5a5fec635799ef33428f1e5e61bafa45a92a96190ba731561ba558ccc214d", size = 246981, upload-time = "2026-05-26T20:38:19.266Z" }, + { url = "https://files.pythonhosted.org/packages/fc/10/1c7d04c13040dac531d21b712bbe08f902e6dd9b58f5d77875c4d030f8f2/coverage-7.14.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:62a9f70b52e0b5a95cfef4a5c5641b06983cadc5e538a3feeb5c00211f523ac2", size = 248812, upload-time = "2026-05-26T20:38:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/c1/65/2a38a4607ef27cadcfbcee034dba5830ae2569f90144a0f4c7dbf47d30b0/coverage-7.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c18ebc343e15be53049b3a2dce38fe82d58f37e20ab9094b3a39c0aa4f6bb47", size = 250675, upload-time = "2026-05-26T20:38:22.159Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a2/a446ed9752a4a59b79e0fb6cbb319f6facb2183045c0725462625e66f87e/coverage-7.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b84ffdf877644e7096aa936991efeed873f7f3df57b9cd001312b7668ab08550", size = 252590, upload-time = "2026-05-26T20:38:23.63Z" }, + { url = "https://files.pythonhosted.org/packages/9e/fd/e81fbd7ba752365546e9842b1cbdaad3d6919d2a522c590aef16a281ec5e/coverage-7.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e854312c4103f2ad4c0dc023b69b77ebfd2c89db5f86c4c94dc2353f9a92167e", size = 247691, upload-time = "2026-05-26T20:38:25.057Z" }, + { url = "https://files.pythonhosted.org/packages/53/35/f3c26fdaae9ea937d154ca4d372e5ea0a4167ff70d36c6074ac2eacb2f83/coverage-7.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c643734307300234fafa36bf2a040a7235f8f177ea1fd6ec1423aea6fb7b929f", size = 248716, upload-time = "2026-05-26T20:38:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/2e/14/940b6c49551fd343e8507ee2b0ba7af5d0aa04ed5bf768285cb7c72a9884/coverage-7.14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84ac9499e48700399a5dd0ea7085b5091961fec52c68d66b4ec0d3cf7f4441b1", size = 246721, upload-time = "2026-05-26T20:38:28.282Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2c/40fc0634186c28292a662dff578866b3913983d6c375a3c2a74020938719/coverage-7.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7f02d09f70776579b926d889a4c9c235070a1f47c40458aeaca563fae5acfdb5", size = 250533, upload-time = "2026-05-26T20:38:29.753Z" }, + { url = "https://files.pythonhosted.org/packages/de/e3/2c26bf1e811f9df991ff2a9bdddebdd13ee0665d564df7d05979f9146297/coverage-7.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ce66d8e46da2bb5ee313a745cbd2e391d319176c1f7a9451bfcd3a2fb920859b", size = 246990, upload-time = "2026-05-26T20:38:31.516Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b0/060260ef56bd92363ebdce0c7095ce422b06e69aae71828efeca473ab1ca/coverage-7.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c912c259304cfb5ee584481cfb7ce1ff932b4d61e6c9140b8f19cb7b5ed82332", size = 247593, upload-time = "2026-05-26T20:38:33.065Z" }, + { url = "https://files.pythonhosted.org/packages/63/f3/501502046efeb0d6d94b5ca54941d95f1184183dd6bdb7f283985783bb4a/coverage-7.14.1-cp310-cp310-win32.whl", hash = "sha256:1238cb94638e610e972c60dac68e813f868dc7d6e982535270558443058d9d59", size = 222330, upload-time = "2026-05-26T20:38:35.36Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5d/1bf99f2c558f128faf7906817ccbdb576ba815d3b41ce2ac1719b70a3663/coverage-7.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:fc459e5d73be2d6332fcfe8dbf3d8994671fe33c700f4565988ecfa511547253", size = 223261, upload-time = "2026-05-26T20:38:37.196Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d7/477ad149490e6cb849f28abea1dabb9c823cea72e7500c81b4240ce619c0/coverage-7.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:478b5bcd63c2e1357c5c7e16c070690df7b07f676b1c114d7b93e533c664309f", size = 219848, upload-time = "2026-05-26T20:38:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/91/82/a5eb47257c50601bb7b9a9d2857c67b7a3a85ad74180eb2c98bb1fbe0ce5/coverage-7.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a24a81f9715ee42ef59a316cc11611c98fe23920f7c81861315c9f3ff4a230f4", size = 220354, upload-time = "2026-05-26T20:38:40.232Z" }, + { url = "https://files.pythonhosted.org/packages/43/8b/78419b5391a5cb706b6544390507e469d83ffc9a8248b02c4011aceb9365/coverage-7.14.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:196a13319ad88d6d8ef5ab489ec4f44ddde2143c0c7d5b27786f6c3ffd56a7e1", size = 250771, upload-time = "2026-05-26T20:38:41.782Z" }, + { url = "https://files.pythonhosted.org/packages/77/63/e77aaacd491182210d639636b7a8bba23ffffa9b82aa3762da9431855fa9/coverage-7.14.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d452fd08b5c72c5167c93e6867b5c08500bd40f2a21e1e854a500550b6cc36f", size = 252683, upload-time = "2026-05-26T20:38:43.305Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/a022e3cfbec2ac241640003cb3a817e161d9c7f5aa9b49173756cdc03204/coverage-7.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23bf7fa51ac02e07fc7c96849b82946da47ae862dc8f86d183b2a4864fc38129", size = 254791, upload-time = "2026-05-26T20:38:45.361Z" }, + { url = "https://files.pythonhosted.org/packages/61/d6/967e408aca4c1ceb88cb0cc677169110ae7f5995fb5eaf5fb1f5a1bb8f5d/coverage-7.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcaa50684dcaadfa599ac48f81103c756d791cfd85c97203d2217c593d48b860", size = 256748, upload-time = "2026-05-26T20:38:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/b8/be/869188f7fe28638078ec479331ace6dc5f7b40b7153eb616f47ab79404d8/coverage-7.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ea1c034f95c9b056e856b794630b17f9fa3d57e4800ff1e503d3be0f9c9078c", size = 250907, upload-time = "2026-05-26T20:38:48.493Z" }, + { url = "https://files.pythonhosted.org/packages/07/aa/adb7d3b4278d690e68703abcd76ab1b948242e3668d921711551b78f9ddb/coverage-7.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e057326434e441306226fbeb5d1aaf14a2637efe97ba668306635835f32ad7", size = 252483, upload-time = "2026-05-26T20:38:50.074Z" }, + { url = "https://files.pythonhosted.org/packages/43/61/331c74103c62dcb0c4b9b3a0de9a61aca016208b0a90f109592a9f9ecc28/coverage-7.14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59baf88468dbc8d63b1887afd92bda52e40bb1561696e5819670601403810cec", size = 250545, upload-time = "2026-05-26T20:38:51.613Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b6/c5dae3c104d89be04828f61810e6b3473825482e4c288cc4ed04553e08ae/coverage-7.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d75f892b3ab73ba11cab5442cce7b3e168fd64162b16f0e1e0d09c508edef", size = 254310, upload-time = "2026-05-26T20:38:53.503Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a1/2b9d5863e3b83c01ad8199e3c597802fbb3a9dc90b058885804c20296d31/coverage-7.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3a56abc20a472baf0304c455721bc601477440d28ecfde8a03dde79ede07e0df", size = 250266, upload-time = "2026-05-26T20:38:55.414Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/0e511fbdb269359be26fe678a1c3fa1f2aa2a01573cc3f54268c8d6d4797/coverage-7.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a3cb83d1552c0cd1b4906655b6a33fd4a8473229633a901c6b73bf86914dee9", size = 251174, upload-time = "2026-05-26T20:38:57.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/10/e55307b622b3dd9671cb321824502dc10f93e72f2802b9946159a8edadeb/coverage-7.14.1-cp311-cp311-win32.whl", hash = "sha256:10274a1fbeb8ec5d72966e17bb198a3104257aca4ac09d98667c5f8aca8c8548", size = 222354, upload-time = "2026-05-26T20:38:58.727Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/107421693cfb71e4f1ca5bf70443f64d4161878068d07a3e51c7ad21d17b/coverage-7.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:87ebdf787d4888e3f3f2d523eadc6e18c6d18c6d0eb173801a189641627fb37e", size = 223290, upload-time = "2026-05-26T20:39:00.413Z" }, + { url = "https://files.pythonhosted.org/packages/b8/1d/3e3644585eb29e9dafefb19555078529a4d7cce12bd21929664eea989277/coverage-7.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:dd34767fa19848d35659ffc0a75314f58c7af3f1cd87ec521e8292a1238398a3", size = 221953, upload-time = "2026-05-26T20:39:02.159Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b7/bdbb725ba02c5b42825b200c940f38b7a54fcad24627b7192f78f8110d76/coverage-7.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a06c76364a9360e33d6d23769aefdf7f66f38e2ffb60ceb1baaa4989d83b695c", size = 220022, upload-time = "2026-05-26T20:39:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/de/72/de048c4a25e13bce59ac6a339351c10bdf2515e07459afcdaf04dc3143a2/coverage-7.14.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:84b535f00655ecafe1d929d1fb00ed5d6fa3051ea643ab2c161a3887b86f294b", size = 251888, upload-time = "2026-05-26T20:39:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, + { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, + { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/6f/ca6ad067364b337ef997802115e7ecad2abd2248b05471464b0dea02b4d4/coverage-7.14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e471bc5769ff073b058cfadb0d736b56ce067c8560eabeb0da88462df98c23e7", size = 251803, upload-time = "2026-05-26T20:39:17.537Z" }, + { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, + { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, + { url = "https://files.pythonhosted.org/packages/34/62/70a9024672a5f6910517d9628c52c9afbdd3cf8f46426af52bb148a56fff/coverage-7.14.1-cp312-cp312-win32.whl", hash = "sha256:4a28fd227808366b196a75476dced2eb35b351d6766ba9c858dc93319e87f4f1", size = 222567, upload-time = "2026-05-26T20:39:24.868Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e", size = 223372, upload-time = "2026-05-26T20:39:26.603Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ba/b44d472022f620d289d95fa830143235c0c36461c6f2437ea8d51e5481ed/coverage-7.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:99cd41ff91afd94896fea3bc002706b6ae4ce95727d06e4a0f39c0a8d8bd8b1a", size = 221989, upload-time = "2026-05-26T20:39:28.242Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9e/5f6d56327c62b185225d145191c607e07515294a0aa6338e58805cd4a5ac/coverage-7.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:be9f2c802dcfce3f71298303aa5dad0dce440a76c52f2f60dacd8656dab78793", size = 220044, upload-time = "2026-05-26T20:39:29.902Z" }, + { url = "https://files.pythonhosted.org/packages/75/92/e82aca356744cbbc0f77a0b623e38918c1872361963413a3bab5d0340393/coverage-7.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6223a72fd0e4c7156353ec0f08a5f93623e1d3034d0e2683b9bb8ea674131b1d", size = 220412, upload-time = "2026-05-26T20:39:31.561Z" }, + { url = "https://files.pythonhosted.org/packages/27/c9/385bde0bf7ed0f4bf3a7ee5367060a86b5d218718cfd6fb943c0f836b34f/coverage-7.14.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7279d2110a28cebc738b6459ecda2771735a4c18465fbbd36b3288fe5ed92247", size = 251412, upload-time = "2026-05-26T20:39:33.337Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/23faf6a2343a0d17f960a4bd56c43bc7eb4cf312f774dd6ceebd82c7d8fc/coverage-7.14.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9eeb3fcbc13ba40dfbdb22d01d196a28e9cef9ed4c29b60061a1e0e823a9929d", size = 254008, upload-time = "2026-05-26T20:39:35.009Z" }, + { url = "https://files.pythonhosted.org/packages/42/06/36f4aa9ca8a815e6036156e80706a67828bb97bd826948244f6996dda957/coverage-7.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f0cfc27c539f07cf5c0a4cfe211d0b6cae039f8f40526dbaa71944e64b50a7b", size = 255241, upload-time = "2026-05-26T20:39:36.71Z" }, + { url = "https://files.pythonhosted.org/packages/ca/79/95266316352f90f6b1c6736bb413302edfde2453fb32422d3911642691b3/coverage-7.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:221c70f316241a78e77e607c227cefc8808d4e08f28d99c04f35694690e940be", size = 257373, upload-time = "2026-05-26T20:39:38.412Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9c/58316d1f66c488b5fca8a0eb3e98348807813efa8a0d0833b9021be27488/coverage-7.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da028256b04ec30e5e0114b6f76172938c313991f0a2d3d894271315cf5d5e43", size = 251635, upload-time = "2026-05-26T20:39:40.268Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5a/ca2398a568e16fed7bb713e84ba3603a7164fb65779abe645c565ec890d5/coverage-7.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76a085d7005236a767e3426148b2c407e53ad61695c562f8a81da2d373324901", size = 253373, upload-time = "2026-05-26T20:39:42.145Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2c/0396562c32deaebe7be51d865b3a41e9a87d7561acafe1a28f53b07e019a/coverage-7.14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b553d04b5e778a8e56d57eb134aff42a92718ecba45e79c4764ecfa40efd92ff", size = 251341, upload-time = "2026-05-26T20:39:43.907Z" }, + { url = "https://files.pythonhosted.org/packages/fd/8f/a94f9221184c9cae1ee115820e3798e48b6b17777a9f19e46fb9a0c8dc74/coverage-7.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:46f714d2fb8ae2f4f29f23ada7f1e79b759fff5a70f94a1dac23af204c3ec9e4", size = 255497, upload-time = "2026-05-26T20:39:46.166Z" }, + { url = "https://files.pythonhosted.org/packages/71/69/505d70e47db1eaebcd002c39759707621ef184cd6b1ae084d9f41293f323/coverage-7.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1896f5e19ff3f0431c7ce2172adc54890fd97f86b59ced8ca1649145d9ffe35d", size = 251159, upload-time = "2026-05-26T20:39:48.03Z" }, + { url = "https://files.pythonhosted.org/packages/e0/aa/58681c383aa33a9d2ed40a02d7a22fbf780d1fa4d575396365777828198c/coverage-7.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:62fd185ef9df3c33d1c8178c5af105f762afbad96038de9a4ae100aa6297ca33", size = 252934, upload-time = "2026-05-26T20:39:49.872Z" }, + { url = "https://files.pythonhosted.org/packages/eb/fd/11c928cd6bdffc7074bb5965c173d9ebf517fb00205e1da524b98d29ef92/coverage-7.14.1-cp313-cp313-win32.whl", hash = "sha256:ab4af6352741a604c431c6072fce5bee33bf0f20dc7a56618d6bf6bb89e9810c", size = 222584, upload-time = "2026-05-26T20:39:51.68Z" }, + { url = "https://files.pythonhosted.org/packages/6f/92/fb416fc26d340dcba19518c418d6048e913186e17243982c5e435e41fa7a/coverage-7.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:7af486dabe8954d03b087f0021540897afe084f04e16ff5579e08cc46f871416", size = 223394, upload-time = "2026-05-26T20:39:53.472Z" }, + { url = "https://files.pythonhosted.org/packages/73/c6/02d56e3867972f77d5036de924643f26c056e848f00452cafb4dbc3c29b4/coverage-7.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:2224f89ffd0c5605ccce1ed7a584da162bc7c55f601ab1c946bc9de31a486b42", size = 222015, upload-time = "2026-05-26T20:39:55.374Z" }, + { url = "https://files.pythonhosted.org/packages/4d/9e/fcc77914050df73f7662fa1f00902774c79c075a8388ab334074574bf77e/coverage-7.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de286598cc65d2b489411174b1faec2f5a7775fb3201fd925db2a76b4030f37d", size = 220733, upload-time = "2026-05-26T20:39:57.189Z" }, + { url = "https://files.pythonhosted.org/packages/f7/67/2963cbdaf5cbadec44efa3a1e39eaa1f02df4079585f05387607a221e126/coverage-7.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:042c46ded7c288aeb07cf14a28b6c1e10b78fcba40171c3fa1e939377eeef0b5", size = 221086, upload-time = "2026-05-26T20:39:59.019Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/8701645574e11881f2f47d8930f98bc48b5d43b25eb5b4430dfc4a2f9f48/coverage-7.14.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f4ddbe407477f04c45115d1a4e5bc480f753553b534d338d4c3358b1cdd0ea52", size = 262381, upload-time = "2026-05-26T20:40:00.822Z" }, + { url = "https://files.pythonhosted.org/packages/7c/28/7a64d73598263e0c5abd5084211a8474488d31b3c552ff531c719dfcff62/coverage-7.14.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d13e6725992e2d2fd7d81d4f5241952d13740121dfd501da09201be39b2c003a", size = 264458, upload-time = "2026-05-26T20:40:02.506Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d8/4969179db9f7eb4df218e69540adf829d1c835f59452513d065d15446802/coverage-7.14.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f747dc8edcfe740130f28f32f3995e955494285717e86ee25af51db2219df08a", size = 266884, upload-time = "2026-05-26T20:40:04.421Z" }, + { url = "https://files.pythonhosted.org/packages/a6/78/a45d5794dbc9bafd97afc96a4377c86c7820d78b6cf51b89bc1d4e919275/coverage-7.14.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced2f09ef276fd58611a1ef502164ad266d2b75174e5a40cabbdb4033f9f6cf2", size = 268022, upload-time = "2026-05-26T20:40:06.298Z" }, + { url = "https://files.pythonhosted.org/packages/21/cb/4f5e354e9e3e67af96bd4e57113e6db6b22298c7168b13eec408a549903d/coverage-7.14.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b84800013769a78ccb9ef4659402e26d06867e337b61ec365f77ad008adea80e", size = 261631, upload-time = "2026-05-26T20:40:08.226Z" }, + { url = "https://files.pythonhosted.org/packages/ec/49/eced49af4cb996d5d8b7e94e736175c513e4facd3398507b89892b4326d8/coverage-7.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ea8cd6ca0ee9f616aaef3afc6882e32c2cbf18b00d96313ffd76af650574034d", size = 264443, upload-time = "2026-05-26T20:40:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/5603a88a7c5913a6b54f6cb1a8c46f7b39cbb30f27cd3f492908da09b2d7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:aa5e304a873fabddc11e484e9b6b738bd38bd7bed17b09aa84eecf5332e8b8bb", size = 262069, upload-time = "2026-05-26T20:40:11.999Z" }, + { url = "https://files.pythonhosted.org/packages/f0/59/2ae3cb79da554a06c8619d6c88ea19dd1e4aed4b834b6a83bb1fa243bdc5/coverage-7.14.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1c5215be81035e629d5bc756650634d0bf31991038db7a0eccb90f025ce16d", size = 265780, upload-time = "2026-05-26T20:40:13.858Z" }, + { url = "https://files.pythonhosted.org/packages/af/5f/b130c1dc999031f2648bd25317fbce505ad8d5562079b4ed81e736a84967/coverage-7.14.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:79058c47dae6788504b5effb319961bcd72d7240551464b91d474bc0ed186d69", size = 260970, upload-time = "2026-05-26T20:40:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/87/d1/ec13ccddeb48ec963bdfa72a11224bac2584bd045ba13beca82f8113e9c7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:370c5afae3fa0658e11694a32b24c2778f6bc2d17718121f94ee185e69f26b54", size = 263157, upload-time = "2026-05-26T20:40:18.382Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c2/cd91ead503045161092d3845f7bb95ea2f25131ce96d3e314dd835d91b9c/coverage-7.14.1-cp313-cp313t-win32.whl", hash = "sha256:3758dd0a7f1fa57365ef2e781df0f0731d38b6e3772259d13dae4bd8a958d4b1", size = 223259, upload-time = "2026-05-26T20:40:20.381Z" }, + { url = "https://files.pythonhosted.org/packages/71/9f/1e28d97e6bd2c76b07f38b7c02870f1371255ff6717f54eca578fcbbdd0e/coverage-7.14.1-cp313-cp313t-win_amd64.whl", hash = "sha256:6ff665fb023a77386fe11685190cee1f60a7d635994a30d9b0a061533d470fce", size = 224320, upload-time = "2026-05-26T20:40:22.316Z" }, + { url = "https://files.pythonhosted.org/packages/a9/e0/d936e908f0e1efa55e52b91e01b52f1055cef5e1ab2718493390ed8e2fb8/coverage-7.14.1-cp313-cp313t-win_arm64.whl", hash = "sha256:17a5a241e5997621a956a7f402a7433ef4221e5152809b785bec79e2323799f1", size = 222577, upload-time = "2026-05-26T20:40:24.894Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, ] [[package]] name = "crosshair-tool" -version = "0.0.104" +version = "0.0.105" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-metadata" }, @@ -358,36 +361,36 @@ dependencies = [ { name = "typing-inspect" }, { name = "z3-solver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/c7/ac2e7a78fa58d08b66919de9c9e13d45974976407e53ef8bfc64d62d11d5/crosshair_tool-0.0.104.tar.gz", hash = "sha256:c92cc8554ec1f35e079c041025cf0534d8ce83f6a8aedb7dec68d60c6d6989c2", size = 487964, upload-time = "2026-04-26T11:39:24.845Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/03/77c8e47a2e8b3622dbb96634f84b3366fbada89c23d2268fae464258eed4/crosshair_tool-0.0.104-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9c4e54f8def1f450b111819f7ccef3df2a9605d1fa500729e279da236f8e0629", size = 552469, upload-time = "2026-04-26T11:38:10.064Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3d/4f251fa77d0ef501496e6ca3c74b0a93db3b17b2161a83d865c5c70521d5/crosshair_tool-0.0.104-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cab5eb7c36cb7582252942a620be4a49207fc09838e31fc6cafc7360c8478b8", size = 544488, upload-time = "2026-04-26T11:38:11.683Z" }, - { url = "https://files.pythonhosted.org/packages/8a/a5/e6c70570260317a4557d520ed73ad65774568bbeb234a48535798d38e181/crosshair_tool-0.0.104-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dd90d1b5b7ee769cd3c2cbdd5c3e30072bca4500663696a95ecf3698bbb0aee0", size = 545244, upload-time = "2026-04-26T11:38:12.824Z" }, - { url = "https://files.pythonhosted.org/packages/ad/4e/75630ada8e56f666b6b496910c61d40b5070dd07f41f99a940a8f8e3b168/crosshair_tool-0.0.104-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ab958b0d5f5af991039452ef91f0392eb179a292f63d6f7900dcb938e58468a6", size = 568122, upload-time = "2026-04-26T11:38:14.767Z" }, - { url = "https://files.pythonhosted.org/packages/e3/0c/238d7b758f4b9ea8e1024f53a7d1d81f8f3b439fb2235f49afcc0574413f/crosshair_tool-0.0.104-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cae55bc97afc15ff96f02e609f677ca4903e62814a9e621216d182e64aad2bf1", size = 568102, upload-time = "2026-04-26T11:38:15.965Z" }, - { url = "https://files.pythonhosted.org/packages/85/21/e19de910a8aabd9dca505c880e035e0fee0e329dcedb6a2e2f04935a8b28/crosshair_tool-0.0.104-cp310-cp310-win32.whl", hash = "sha256:df178e93379e0a9d9c64c4900080017aa961595872ce8c5dac1edafcd7f9d744", size = 547609, upload-time = "2026-04-26T11:38:17.365Z" }, - { url = "https://files.pythonhosted.org/packages/09/57/1db86d10eed372c869032c5e40474a6b408e2be0fbc74c6166318bfb8165/crosshair_tool-0.0.104-cp310-cp310-win_amd64.whl", hash = "sha256:b8842abff5fd9f214ec0218b1f797c8a00fa42d8af7b06c8acb7f63f9201cf21", size = 548616, upload-time = "2026-04-26T11:38:19.285Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8b/e8571130e46c11893e83ef4987ed24fd3e0c874eeda69b28073503252560/crosshair_tool-0.0.104-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0fee67cef8472719f8cd4b38ff3d353ad50d1a318c1abf442e038de478fdcc1a", size = 552570, upload-time = "2026-04-26T11:38:21.06Z" }, - { url = "https://files.pythonhosted.org/packages/f4/36/2e4d178c03944daf3da205120a2a668865891a4d4e45cc3808ec107eece2/crosshair_tool-0.0.104-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58a813295b3fce061ac74f6e42dd40c745bc21ccf0af48b2f7a1e0b97e96d040", size = 544540, upload-time = "2026-04-26T11:38:22.837Z" }, - { url = "https://files.pythonhosted.org/packages/99/fa/6bf6c9850518835f5ee403dbea9f110ffd630c08d04c9cfe95dc495221c6/crosshair_tool-0.0.104-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:044a030de364a8418e71ac21eb878c3a782d439e85c79481fed4e6a64399f0a7", size = 545289, upload-time = "2026-04-26T11:38:24.556Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b2/0f49cb9c9c09770973247c7c8026dc242d455edcf7747f90c5d80d248098/crosshair_tool-0.0.104-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:482b097763d415dd6cf9a3f32cebe43ed1da7a2a5711fd9d7cd250f09ca723c0", size = 568540, upload-time = "2026-04-26T11:38:25.757Z" }, - { url = "https://files.pythonhosted.org/packages/31/b1/0744c244177fb41f19584dcfb9927aa10e68198d0e459f5145bf935da5fe/crosshair_tool-0.0.104-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:746547a6524f58e9ae37ea33a9d324009e9e5b89f9da5f70076637ac44ca8f41", size = 568537, upload-time = "2026-04-26T11:38:27.408Z" }, - { url = "https://files.pythonhosted.org/packages/c1/f3/fcebe7715f08be9520f186cc9a426389672cf4da433c7a6b56f9924e147a/crosshair_tool-0.0.104-cp311-cp311-win32.whl", hash = "sha256:a0ba5c5f823c1fd4f953d36ae08a9f56cba3464479c4ad12bf0a1387a184f6c4", size = 547642, upload-time = "2026-04-26T11:38:28.743Z" }, - { url = "https://files.pythonhosted.org/packages/3b/32/a13631ce4d43057c305904611e69d2d800c159bdad9aba6df7cad46f6644/crosshair_tool-0.0.104-cp311-cp311-win_amd64.whl", hash = "sha256:aa5b5892646d5a95191ea7182dbdf60561165ec75ebef5f24fad5bea9cd9dcff", size = 548644, upload-time = "2026-04-26T11:38:30.42Z" }, - { url = "https://files.pythonhosted.org/packages/f3/23/ec19144d79d09afef4042e5b8e464ddf8587941547a0b9abf2f42cd2a16a/crosshair_tool-0.0.104-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:aa131e3e486cd5b158399e939bd6e1231c26980a8006fa3162fa859bf34aecc0", size = 556457, upload-time = "2026-04-26T11:38:32.069Z" }, - { url = "https://files.pythonhosted.org/packages/68/aa/db67175ab75791384c4e0c55c359520611a73dcb927647d282b16c875cf1/crosshair_tool-0.0.104-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cceb359a046e94ac50d123cdb6b6e120c26ed0029e75230bae2210c21ca33434", size = 546979, upload-time = "2026-04-26T11:38:33.485Z" }, - { url = "https://files.pythonhosted.org/packages/c1/48/8351d3c3ad9a172d4ddf98a63c466b78537aa0ae69e561a4d8e672a3f9be/crosshair_tool-0.0.104-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:15003ef84efed7d17de342792dc304661c6c9a093b7c5bcbaaf327a4252a3747", size = 547571, upload-time = "2026-04-26T11:38:34.775Z" }, - { url = "https://files.pythonhosted.org/packages/ef/33/286fa2180a7d328c3d8f047e40527b348f4d62debbdfa729cb112bf223f3/crosshair_tool-0.0.104-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb3f5c4f4c39b78c68f0d52889cf127da18994f5177faae90c7aedb79dbe4df5", size = 578527, upload-time = "2026-04-26T11:38:36.529Z" }, - { url = "https://files.pythonhosted.org/packages/fc/a8/c8d0ed5a6b1e5889811c360b0e89028ef5d9d43caad62282b82b159fa444/crosshair_tool-0.0.104-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c2f33631751443c64f35d95daf44bcc262841acc22f24d0f1daa5edf49ced28", size = 577584, upload-time = "2026-04-26T11:38:38.04Z" }, - { url = "https://files.pythonhosted.org/packages/96/c6/b8f4e1465ba57652a033a9f5fe19d5dc3935523734a6e535e144ea932270/crosshair_tool-0.0.104-cp312-cp312-win32.whl", hash = "sha256:4a2f39792e76c9677b8fdc446d2ed3d43ddb37948f4e803de88d26fc0afeae8d", size = 549336, upload-time = "2026-04-26T11:38:39.242Z" }, - { url = "https://files.pythonhosted.org/packages/f4/60/c6bf30b1c65950afd622f2aa77f66a8a87c2934295ec9c3c0cbba158470c/crosshair_tool-0.0.104-cp312-cp312-win_amd64.whl", hash = "sha256:294e70a2c35b655d1214b99443e853844fa63fbf9d2d8ab658b842fb1575021d", size = 550451, upload-time = "2026-04-26T11:38:40.688Z" }, - { url = "https://files.pythonhosted.org/packages/af/52/66a5f834bd0c98558092f625cca1e06f22d2157e10a3ea68f664e5688710/crosshair_tool-0.0.104-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:946ab8b537ff35cde1c1e47582242f84cfbaec7a304438411b2cf399d32cfdd7", size = 565185, upload-time = "2026-04-26T11:38:42.16Z" }, - { url = "https://files.pythonhosted.org/packages/f9/08/db7ac3f0876937e3fb05d19343b757571a8d3095e6e4daab023b5307f5a2/crosshair_tool-0.0.104-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8ce233e4568b67bcf812413a7ffa20b807fd776551036aa98b3484bc26fa1914", size = 550775, upload-time = "2026-04-26T11:38:43.672Z" }, - { url = "https://files.pythonhosted.org/packages/b9/79/c09da37ce2f39fb24957ffd6b9afc8afa1797d797af8055cf01945b4802c/crosshair_tool-0.0.104-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82fb84d44d7fde08dba2e77771ec9adead0b4e6953694f49e745531c75f75779", size = 551440, upload-time = "2026-04-26T11:38:45.481Z" }, - { url = "https://files.pythonhosted.org/packages/05/ea/3a2db77a94941df6e0c0dbd312b5289bf55df0ba6f5ae52227304a0318bd/crosshair_tool-0.0.104-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c1c1cfe3fbb3054f1031ac3b2ca2cb268b6330efd4737e50a3b5d81e748002e4", size = 585256, upload-time = "2026-04-26T11:38:47.195Z" }, - { url = "https://files.pythonhosted.org/packages/c9/14/d1c6f7540fe474eacf8da1a8e0be3ffba03ed5b98de30a229dc16c2d1be2/crosshair_tool-0.0.104-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:299cd2748313d2adab0aa22c890212efacd20560e071c3c9890e42648e728a3b", size = 584271, upload-time = "2026-04-26T11:38:49.011Z" }, - { url = "https://files.pythonhosted.org/packages/59/29/e33a52d5e0d16c2e2ae6946c1cfa12b70042d20ff4fffc4c04af3938adba/crosshair_tool-0.0.104-cp313-cp313-win32.whl", hash = "sha256:86bcaa3378cdfed93be21a876e090282e4e4d0e23008dcc5853fae8ef99523a6", size = 549357, upload-time = "2026-04-26T11:38:50.893Z" }, - { url = "https://files.pythonhosted.org/packages/5a/9b/427700c38d9912993fc414c504c735a61e3c40f476fd3b3a3659e55276d0/crosshair_tool-0.0.104-cp313-cp313-win_amd64.whl", hash = "sha256:beecba3d1d306cc3a1ab551fe22777cd0c162e97d61b81fa01a57eaa3b00fa21", size = 550474, upload-time = "2026-04-26T11:38:52.428Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/7f/0f/04893a8700df79b126cc75c6df62cc2e093708fc5628825d786aa91c751d/crosshair_tool-0.0.105.tar.gz", hash = "sha256:22b869d0a9a50eda7132f07f2174eda89f640335796ba913f469ddc75ededf3e", size = 491536, upload-time = "2026-05-28T01:20:33.096Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/9c/2624db432999592e8d3f472416e33b7460e879cabb5e694b69b99e60b00d/crosshair_tool-0.0.105-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:14f44f907b9b66165f6b6bc0b9a019066cfa072b5ea34f807f2c2541f2c3e910", size = 557854, upload-time = "2026-05-28T01:19:36.601Z" }, + { url = "https://files.pythonhosted.org/packages/4f/2f/3a0de4a1de8eae9e401d94efbdb20284ae1be540f7384ec2c0c9698c7547/crosshair_tool-0.0.105-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:443512de717c3c008ffdb2627541ad3dff211da3da337df559c78b3754266aa4", size = 548220, upload-time = "2026-05-28T01:19:37.979Z" }, + { url = "https://files.pythonhosted.org/packages/d0/2c/61496ff86f57659d5f4df8c4646d58c45c8c872bb2ce4aa6f8f09b709444/crosshair_tool-0.0.105-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0a3cfe3a5da0b675396eaa50c41b1d462edb311ac4a6a0e9ca8b814bd380c058", size = 548914, upload-time = "2026-05-28T01:19:39.168Z" }, + { url = "https://files.pythonhosted.org/packages/ec/1a/9ac0a1cafb0a787e6a5fd528c057e45e77f827bd637bc2499cb341d90f5e/crosshair_tool-0.0.105-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e16b250f7f1f1eae7eb62a04791c8dd4c370d78df0d6b5c6f7244c3feacb41a1", size = 579790, upload-time = "2026-05-28T01:19:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a5/0100568e2233ef2081e564c1cc9a7698eefd501dcf94728119c59c41d588/crosshair_tool-0.0.105-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dca75a11df518e1034985e7d866daf86db934428c3452078ffaf01ffd6c5b287", size = 579036, upload-time = "2026-05-28T01:19:41.641Z" }, + { url = "https://files.pythonhosted.org/packages/a3/55/37f4ba478a38851afeed5dd7b895ccecee1182c8583b242545cc02e5e140/crosshair_tool-0.0.105-cp310-cp310-win32.whl", hash = "sha256:3a3da998ed36a7b8f41e409a9e990e4606a03161fa33d98df51b63cb1808dc43", size = 550702, upload-time = "2026-05-28T01:19:42.797Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8f/b68472d43fb2340c1740e6c3ebe13a4e20253426f81a6a431b88d1cc5be0/crosshair_tool-0.0.105-cp310-cp310-win_amd64.whl", hash = "sha256:9128050c73aad8f8f097cefff5bdc57a8f29e27f0ce7c204b29be0b09566dd73", size = 551937, upload-time = "2026-05-28T01:19:43.855Z" }, + { url = "https://files.pythonhosted.org/packages/a2/56/00046f22d2c83017826ee5c8b6de44ab1edb799a3258be6b7bbdb426a6e9/crosshair_tool-0.0.105-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fc44a1c80dfe7361e867262a0c8880ca872b90e6893397a794084c4b89105299", size = 557661, upload-time = "2026-05-28T01:19:45.176Z" }, + { url = "https://files.pythonhosted.org/packages/e9/0b/a98f4025ef8c2b9c02b0f8abcd903da80efcf9316f96013bf05103b7df79/crosshair_tool-0.0.105-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2098b9401d7d52f14c981ab94b0bc48a1beadf0e82dfdd2e8fcc2d61d7c9f3aa", size = 548105, upload-time = "2026-05-28T01:19:46.275Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c1/08fce15931b768fed3a413e3effacb1cab15c9147e0971b8aa3ca725381b/crosshair_tool-0.0.105-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb87804f0a0c513ccae6258d383812e1e88d1b7e3654398ca64ce5bbe5c9a37e", size = 548834, upload-time = "2026-05-28T01:19:47.548Z" }, + { url = "https://files.pythonhosted.org/packages/84/d6/a5c055281a3ba6856397cb4c67b134661c37d3fa37d27d5ef6a4da590c4d/crosshair_tool-0.0.105-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:93b2ca4d49b429d89f367644e93d34315fc7a8429ceea294a534fb0d9af24eca", size = 579471, upload-time = "2026-05-28T01:19:48.996Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ba/5aac79587c317204f4759b5a97fd8d06bee28e766364ab8072471ec4ed77/crosshair_tool-0.0.105-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85d371e88f5006cce1259047dc64bfb4d94543a399ebf00a69b33b11f34d1735", size = 578788, upload-time = "2026-05-28T01:19:50.216Z" }, + { url = "https://files.pythonhosted.org/packages/55/81/3d1d2f64842f1da807a1cde9b8a17a3606c892f2b66b83b67ad85a55bad0/crosshair_tool-0.0.105-cp311-cp311-win32.whl", hash = "sha256:fbba92e7247bcb971742715c7db7a5b1522b9f7008918de1dd96f911477baa9a", size = 550687, upload-time = "2026-05-28T01:19:51.327Z" }, + { url = "https://files.pythonhosted.org/packages/47/39/66f08945db7b117d35abd2872b64a0e678b4f891e541f28bf9366234ceaa/crosshair_tool-0.0.105-cp311-cp311-win_amd64.whl", hash = "sha256:c712bc92489ba653d9712220e624e5c37ac24ed2305607a8b4c4d445408523d2", size = 551920, upload-time = "2026-05-28T01:19:52.512Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b4/6a2d86a7f4978028a75b306ed398cd55bff4a6e6f13955b8f55cef3e2df5/crosshair_tool-0.0.105-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a879b8b0d365eee2e7a2cf12a2cfe4ccd8e71619a955710288e8cc13b736b149", size = 562918, upload-time = "2026-05-28T01:19:53.5Z" }, + { url = "https://files.pythonhosted.org/packages/8b/b4/3c8e1c1cacf1fe9dc4ff79cc5e94fa071043cb6b37ad74b5213305e4fcf1/crosshair_tool-0.0.105-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3cdb661271fa0f828781a1a5f4ae22aa9df58ac8c5818f3cefe86b719b1ab13", size = 550606, upload-time = "2026-05-28T01:19:54.459Z" }, + { url = "https://files.pythonhosted.org/packages/88/20/d6622522ba2dabcfcc5c54e1ec9f7fb9d8f3e1e9c8f23361bb629763cf1b/crosshair_tool-0.0.105-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd5cca2a9014ccc50748ab373a2685023705f740ddd06be34ffa3eb4c05005b8", size = 551238, upload-time = "2026-05-28T01:19:55.495Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bf/f60b60dd39ff0cc78bb1d0436136f245be90b2f8123ba0b6591435443fd0/crosshair_tool-0.0.105-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1bbe0ad1d97a51cadb5e95b6912b4b5a3863f3ff138e6bf477a20f0660fd3187", size = 588806, upload-time = "2026-05-28T01:19:56.464Z" }, + { url = "https://files.pythonhosted.org/packages/94/07/a3e33bbbfcfbccafe66fbc840551bf4bbc8ab8cdf07ecbd2fa4d21f6d93c/crosshair_tool-0.0.105-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b67b29e45320b4b590ed8228de615c4361c0a2f8ebeb19fb01e194d288cd01de", size = 587542, upload-time = "2026-05-28T01:19:57.527Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e2/2ae96df92fa9e6593a81edf363caad8d569283bbb2c925e81b8b563f3fd3/crosshair_tool-0.0.105-cp312-cp312-win32.whl", hash = "sha256:e00a307b9ca0b026123f7d1d646bda15b76336cec35c92ea60bd069c1748a141", size = 552449, upload-time = "2026-05-28T01:19:58.501Z" }, + { url = "https://files.pythonhosted.org/packages/b6/9e/dc9cf6b88f27bc2232f7f3fe17022e1e4d9fa656480dc4f99dff1c550872/crosshair_tool-0.0.105-cp312-cp312-win_amd64.whl", hash = "sha256:ffadb6ec00d0efb815558d8ca8461b061f1d1f941fdca820cde27ca5d4a34463", size = 553782, upload-time = "2026-05-28T01:19:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/23/9f/da7a10d51c55aacf24375ab6923fd4bd801a7e5564b72cabebb6c8948c73/crosshair_tool-0.0.105-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:38d15ebe6d31cdca702a6a989da4772ce75fd0ad419872ecbd97958089333f92", size = 570450, upload-time = "2026-05-28T01:20:00.614Z" }, + { url = "https://files.pythonhosted.org/packages/0f/74/4c9be46ca4c30af79f925255ca7c7d9c7aa6f62afdce1b71e5813f8b2d80/crosshair_tool-0.0.105-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a41f4040f0f6e0f80cfd46aee9e816ac55a2211a5b3c56d88df2c494d1f72cf7", size = 554429, upload-time = "2026-05-28T01:20:01.808Z" }, + { url = "https://files.pythonhosted.org/packages/c3/39/fe7c7165da74bfe62711dfe7139787b6f9fbef9762ff61bc0de4b7748049/crosshair_tool-0.0.105-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39623336eaf8c697021c108c66f930daf88486fa9df07a169051cfe88528a817", size = 555087, upload-time = "2026-05-28T01:20:02.883Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d4/30c28434540325c769ecaf3cfe382561b43a976cfb9b083a420830adef72/crosshair_tool-0.0.105-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2544d151d42cc41cbe2b2369c56436d4dc3cdf6093290885dde0b2f07ca8e8cc", size = 595286, upload-time = "2026-05-28T01:20:04.117Z" }, + { url = "https://files.pythonhosted.org/packages/86/61/cfd618cab6bf8f6da0202350443f3110a0d516e47a0a1f3d1d142f26c7d4/crosshair_tool-0.0.105-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c71d43e80436170897e8457c1a4f37f67a364dc66b9b7efb07594f19e70e0d2b", size = 594181, upload-time = "2026-05-28T01:20:05.209Z" }, + { url = "https://files.pythonhosted.org/packages/0e/43/0a41b5210c6c5164932b7c8f9ec5eacff1b5168f25afc1047ad6ab25fa79/crosshair_tool-0.0.105-cp313-cp313-win32.whl", hash = "sha256:01b338b947ebaafaf5b6c74f2f7c43de39ce9f31ace1e1b3f9b99a62dbcd502d", size = 552461, upload-time = "2026-05-28T01:20:06.306Z" }, + { url = "https://files.pythonhosted.org/packages/d3/34/87367378500d990d82e55a51a7d4c5af63e906dad72664437dee1316a34c/crosshair_tool-0.0.105-cp313-cp313-win_amd64.whl", hash = "sha256:6ba3e04b26b11fdc40356e303038bf228990bff0e145dac83859d30ac66d293c", size = 553790, upload-time = "2026-05-28T01:20:07.355Z" }, ] [[package]] @@ -419,13 +422,14 @@ wheels = [ [[package]] name = "downtify" -version = "2.7.0" +version = "2.7.10" source = { virtual = "." } dependencies = [ { name = "fastapi" }, { name = "load-dotenv" }, { name = "loguru" }, { name = "mutagen" }, + { name = "python-multipart" }, { name = "requests" }, { name = "uvicorn" }, { name = "websockets" }, @@ -447,6 +451,7 @@ requires-dist = [ { name = "load-dotenv", specifier = ">=0.1.0" }, { name = "loguru", specifier = ">=0.7.3" }, { name = "mutagen", specifier = ">=1.47" }, + { name = "python-multipart", specifier = ">=0.0.9" }, { name = "requests", specifier = ">=2.34.1" }, { name = "uvicorn", specifier = ">=0.48.0" }, { name = "websockets", specifier = ">=12.0" }, @@ -556,11 +561,11 @@ wheels = [ [[package]] name = "idna" -version = "3.16" +version = "3.17" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1a/88/bcf9709822fe69d02c2a6a77956c98ce6ea8ca8767a9aadcedc7eb6a2390/idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d", size = 203770, upload-time = "2026-05-22T00:16:18.781Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/28/99c51f664567218d824af024c0251650fb27e4ca066df188dab0769c5b91/idna-3.17.tar.gz", hash = "sha256:5eb0cb53bc467c12eadcf6de83163ad8527cec9416f44b9b61b19caedad2b87f", size = 196048, upload-time = "2026-05-28T14:32:38.55Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5", size = 74165, upload-time = "2026-05-22T00:16:16.698Z" }, + { url = "https://files.pythonhosted.org/packages/de/a7/f76514cc40ad6234098ecdebda08732d75964776c51a42845b7da10649e2/idna-3.17-py3-none-any.whl", hash = "sha256:466e48829084efe2548012b855df21540b96f2e20e51bd124c851536556a592c", size = 65316, upload-time = "2026-05-28T14:32:37.035Z" }, ] [[package]] @@ -760,6 +765,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/83/89f6ae52fa77960404ee88fc078ee680e504bf1ab8724ac01430cee0f5a5/line_profiler-5.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:abf755b020d91b639cbc563015eca381ca64e6bd27ee55ef9004a3a17b6d4dcf", size = 461960, upload-time = "2026-02-23T23:30:39.657Z" }, ] +[[package]] +name = "linkify-it-py" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "uc-micro-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/c9/06ea13676ef354f0af6169587ae292d3e2406e212876a413bf9eece4eb23/linkify_it_py-2.1.0.tar.gz", hash = "sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b", size = 29158, upload-time = "2026-03-01T07:48:47.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/de/88b3be5c31b22333b3ca2f6ff1de4e863d8fe45aaea7485f591970ec1d3e/linkify_it_py-2.1.0-py3-none-any.whl", hash = "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e", size = 19878, upload-time = "2026-03-01T07:48:46.098Z" }, +] + [[package]] name = "load-dotenv" version = "0.1.0" @@ -901,6 +918,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, ] +[package.optional-dependencies] +linkify = [ + { name = "linkify-it-py" }, +] + [[package]] name = "markupsafe" version = "3.0.3" @@ -964,6 +986,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, ] +[[package]] +name = "mdit-py-plugins" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl", hash = "sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d", size = 66663, upload-time = "2026-05-13T09:03:37.76Z" }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -973,6 +1007,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "memray" +version = "1.19.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "rich" }, + { name = "textual" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/04/5b886a36df947599e0f37cd46e6e44e565299815f044e2303ab2ae9f8870/memray-1.19.3.tar.gz", hash = "sha256:4e0fb29ff0a50c0ec9dc84294d8f2c83419feba561a37628b304c2ae4fe73d03", size = 2417089, upload-time = "2026-04-08T18:49:32.409Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/9a/262e81a1c5dba8c024049cc0d4b72bf695b5be38f92eaed0f3d6a720cf4e/memray-1.19.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:e4a7885ab920df180e40c6dd29b6ac09a0d58d92055a2861372a9d50f9e02ab3", size = 2182755, upload-time = "2026-04-08T18:47:39.098Z" }, + { url = "https://files.pythonhosted.org/packages/81/75/a4331a5ba7f545acfddd6ce8bf13493273adaf52a5b7356f83bac36449c5/memray-1.19.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82ec3b737207ba0185e9a2e1cec775e648839b9ccd9a38cb95256270ea33dd43", size = 2160580, upload-time = "2026-04-08T18:47:41.112Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c3/aacfb92ac6b6fd382c4a409c6c65008b8d80f009ff5f306de0df99c61672/memray-1.19.3-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8203b75c26117564a27b685317ad73cf82a335e643d254c60e0d20215f1461f2", size = 9722985, upload-time = "2026-04-08T18:47:43.244Z" }, + { url = "https://files.pythonhosted.org/packages/40/07/34625d678f9ec222e90fadebe7612b1914e9efcc8d1e7477fe5ed84c8e5e/memray-1.19.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d66e842814a762d022b04d620cfd0a4ba3c6ad5a09148f031c795396c258819b", size = 9954029, upload-time = "2026-04-08T18:47:45.591Z" }, + { url = "https://files.pythonhosted.org/packages/dd/59/cb70f0664f89e6dd30f28a1280c117fa8dd758f0a9adbeadb8cabde3733c/memray-1.19.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507d0f6b1041a9e9966242aa7529212a8053a5c3e3bd02997e5f50a0b6dff637", size = 9341828, upload-time = "2026-04-08T18:47:47.825Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c7/502f279872554bd5eaec4c024b2bafc50f9e22d6e3259850a365e34d7226/memray-1.19.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1e9b975aebae3e1712508971719e4186d1039eb1e0677453ef63d87396526d1b", size = 12176485, upload-time = "2026-04-08T18:47:50.823Z" }, + { url = "https://files.pythonhosted.org/packages/6e/42/20f595239918edb3fd967f47df7b89d1b728c1d04f34c616b78f17e85305/memray-1.19.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:7919d48b8e6df45a1b332fae484a14d427619c123a254ca23468ec232bb4152b", size = 2183379, upload-time = "2026-04-08T18:47:52.846Z" }, + { url = "https://files.pythonhosted.org/packages/53/e7/8371761d845e126bbd3230e0137fc147db5f6c35cd6b6150b86ed80fe34b/memray-1.19.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d5b1484dd32752dd9a194571dbfe8de175ca7159f4b0a24efc7e954710ea0b0", size = 2161168, upload-time = "2026-04-08T18:47:54.614Z" }, + { url = "https://files.pythonhosted.org/packages/cf/15/5f87e8a2f73c6e7e79c48efbc9d5dd570ffd74754412115b6cd32c43f138/memray-1.19.3-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c3e9d2c0172ff0419832a510ac6305504712bf268059cdfd6b4e948f6ba1ccf5", size = 9789479, upload-time = "2026-04-08T18:47:56.578Z" }, + { url = "https://files.pythonhosted.org/packages/76/09/32caf5915b487a705fb7c41bfca5dfe65486995615143493e6b43773da8d/memray-1.19.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:96de36ae809eaf8484bdbd937ce890b3b206269f66a7e1dea004fd115a712d24", size = 10035022, upload-time = "2026-04-08T18:47:58.739Z" }, + { url = "https://files.pythonhosted.org/packages/64/2a/e01de8c939018dd99dc61627c7a706f25bec6f1665f071a8482e888b3d76/memray-1.19.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:003bf98ffa7b022ddbac8b832a2c4e63e2a7f67d0c69d38b1712bc3347e7066b", size = 9414903, upload-time = "2026-04-08T18:48:00.888Z" }, + { url = "https://files.pythonhosted.org/packages/38/09/ca69127bba2ecd5d2a9b62de06846c91d46dacb814d329deaf09e601dd7f/memray-1.19.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b49362844937831dc0f324fbad28cfd1cd7006a1e8dc1e950891a3b9cc02dcc4", size = 12252069, upload-time = "2026-04-08T18:48:03.563Z" }, + { url = "https://files.pythonhosted.org/packages/fa/79/095c09f62f2ca527e4b5e71c38e7c9686f06c15a39f69f691428c45bae83/memray-1.19.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:dcbfa513332366544a2fdc74f0e385f3a11a2233ca9de5aac986e396ce0a2293", size = 2185040, upload-time = "2026-04-08T18:48:05.98Z" }, + { url = "https://files.pythonhosted.org/packages/2e/26/8328966c9b1cecbf43e8c96a210178f68fb1df8a62dd4f1735158aa6610b/memray-1.19.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4df9b00262fe48485c2afc4a52c88640d729d3bf999b3c633052d40c0ee970d1", size = 2163887, upload-time = "2026-04-08T18:48:07.455Z" }, + { url = "https://files.pythonhosted.org/packages/1a/eb/6ed7c46c2e6aec4d18926662114e88ba557f2e88c50fd5737b7989d67f3c/memray-1.19.3-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4a710509a5728a6f3b79eca615b538f9fa20452b21c0ba5265bdfb5fd4ff5f1d", size = 9743964, upload-time = "2026-04-08T18:48:09.213Z" }, + { url = "https://files.pythonhosted.org/packages/1c/60/668ad1dd30744564ef2d3e444bf39e10c41f1820240e949d0a3fadea9101/memray-1.19.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:578349f78268d2561275c4fb78c7ebe215f5264ad408d46207795ae58ec5d79e", size = 10013567, upload-time = "2026-04-08T18:48:11.513Z" }, + { url = "https://files.pythonhosted.org/packages/7a/aa/e5e969d50e57ef3ae41c6996626381afe3c9933d1924844d326f05240596/memray-1.19.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbbe64058ea329e7ff4f2c8067e6400b7db7d44a3f897a36c21f1a54e9b0c1ee", size = 9387646, upload-time = "2026-04-08T18:48:13.803Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ea/b23b30e31f365687004df304b9e46f19de4f5b860e78b363dd5d51f618f9/memray-1.19.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1a60d44b18ac5c1f6dde15e5d5f2dc75b5dfa55f450b5b682bbb1274564bcb41", size = 12237978, upload-time = "2026-04-08T18:48:16.478Z" }, + { url = "https://files.pythonhosted.org/packages/d7/fd/e5637a682cb0af3b9e79017b98b8db5f4bf65c24d9e9fea10dec2495ca13/memray-1.19.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:1c7474aa70145eb2be1479b5465022d41a01467dbe4f8487d4fb4c3d38fd6ba9", size = 2184361, upload-time = "2026-04-08T18:48:18.775Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/fcd190a9de788363856d475b595b8a831fefc5c0ee282d27e849dda57d1c/memray-1.19.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ee7f3f0e3f7ee4f5c82692f886ffbabddc885bc9ab3a507732a1aa2155e16ed1", size = 2162568, upload-time = "2026-04-08T18:48:20.691Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/72d70d93f911974652e19f50024142ca674cb19d4f34a91cb2b2b3e065af/memray-1.19.3-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c1842b2a0033ca44d11c40c9afd5b6a8a29f00e53ea151da4bb81f6dfd194b79", size = 9743474, upload-time = "2026-04-08T18:48:22.544Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ed/d2390f02d978e31666f2821574940f553f27fd1cf38003b592038441a9b8/memray-1.19.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51bea540d8a79c83720bc74d5f9508911572dd77b5fb0fc46d2fe287d96a2dc7", size = 10012845, upload-time = "2026-04-08T18:48:25.455Z" }, + { url = "https://files.pythonhosted.org/packages/34/0f/78eb8d0973e11d0780fabbd048cab184bd4f28788f211d6d7eb97aed7d04/memray-1.19.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:502b07e65a972c3d47e39b0c9f706189f8b667953f68f80672f0537d2ffd9633", size = 9391464, upload-time = "2026-04-08T18:48:28.192Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b7/e209d3fa09f096d7d4b7dd3be7948cc36879aa1ef75a349cf88a7ad74d00/memray-1.19.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e9dc493402446ff495edaa90c6b587a32ace14e2d4a022051458b535a029cada", size = 12244789, upload-time = "2026-04-08T18:48:30.418Z" }, +] + [[package]] name = "mutagen" version = "1.47.0" @@ -1020,11 +1091,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.9.6" +version = "4.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, ] [[package]] @@ -1038,7 +1109,7 @@ wheels = [ [[package]] name = "posthog" -version = "7.15.4" +version = "7.16.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backoff" }, @@ -1046,9 +1117,9 @@ dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/96/f6e63bdeb5a7809c25374872c6b59f03193c261eb029820e7d29c3aa8d07/posthog-7.15.4.tar.gz", hash = "sha256:9d7fe7bc0f03ed699e0608be0a6ef60267129a597651eb1c78c89c290c0a9b18", size = 218005, upload-time = "2026-05-25T06:33:09.727Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/d4/6e1c24823c515683cb6f74bd1dcc3fbe55f60a27743c1694bdc61c5db5d0/posthog-7.16.3.tar.gz", hash = "sha256:ff8972813c836ae4fcb634b499cf06d643bc3c4f49931218fe142e7aa8a39810", size = 226535, upload-time = "2026-06-01T13:24:07.781Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/b2/1108392d27c14139551cd2978bcc60c52c5fa0d52c8f639fb87b7b91d360/posthog-7.15.4-py3-none-any.whl", hash = "sha256:96f3a530a0dd709b91322212c61e161bf1e17a88d5202206870381222bc0fe2d", size = 255366, upload-time = "2026-05-25T06:33:07.427Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0b/562afe6f037ab3dde06d2bbe33f1de9f8516ac22f882ad263e4e0bfb665b/posthog-7.16.3-py3-none-any.whl", hash = "sha256:f0cbaf25ac06211b87c0a43500673fa2d8de86eb1edb75b8bf688f1b884878ce", size = 264300, upload-time = "2026-06-01T13:24:06.074Z" }, ] [[package]] @@ -1208,16 +1279,29 @@ wheels = [ [[package]] name = "pytest-asyncio" -version = "1.3.0" +version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" }, { name = "pytest" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, + { url = "https://files.pythonhosted.org/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930, upload-time = "2026-05-26T09:56:02.576Z" }, +] + +[[package]] +name = "pytest-memray" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "memray" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/28/f67963efed56d847d028d0bb939f26cdeb32c4de474b3befc9da43bf18f9/pytest_memray-1.8.0.tar.gz", hash = "sha256:c0c706ef81941a7aa7064f2b3b8b5cdc0cea72b5277c6a6a09b113ca9ab30bdb", size = 240608, upload-time = "2025-08-18T17:32:47.329Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/52/b8b8e126c176c5f405b307354e1722025063ea104dbd7d286e8b18a76e9f/pytest_memray-1.8.0-py3-none-any.whl", hash = "sha256:44da9fe0d98541abf4cc76acea6e4a9c525b3c8e604655e5537705f336c9b875", size = 17688, upload-time = "2025-08-18T17:32:45.476Z" }, ] [[package]] @@ -1241,6 +1325,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, ] +[[package]] +name = "python-multipart" +version = "0.0.30" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/82/c8cd43a6e0719bf5a3b034f6726dd701f75829c08944c83d4b95d02ed0e8/python_multipart-0.0.30.tar.gz", hash = "sha256:0edfe0475c1f46ddd3ff7785a626f6118af32bdcf359bb21260367313bb32118", size = 46316, upload-time = "2026-05-31T19:24:55.198Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/fd/0318007beb234790993d3ec5afd051d1dbceb733e81e3afe2b981ece3f37/python_multipart-0.0.30-py3-none-any.whl", hash = "sha256:830964def8c90607ac5daa00514e3987815865713ade8d20febc9177ac0c3c5b", size = 29730, upload-time = "2026-05-31T19:24:53.814Z" }, +] + [[package]] name = "pyyaml" version = "6.0.3" @@ -1350,27 +1443,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" }, - { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" }, - { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" }, - { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" }, - { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" }, - { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" }, - { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" }, - { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" }, - { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" }, - { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" }, - { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" }, - { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" }, - { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" }, +version = "0.15.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/6f/a76f7d96e5c962f5b69cee865e49c15c1116897c01990faa8a57edb62e7f/ruff-0.15.15.tar.gz", hash = "sha256:b8dff018130b46d8e5bf0f926ef6b60cf871d6d5ae45fc9334e09632daa741d6", size = 4706985, upload-time = "2026-05-28T14:16:57.784Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/9d/3a45c05b8ab04b4705989de70a79008e27c8003296a0feaee9edc18dd7e9/ruff-0.15.15-py3-none-linux_armv6l.whl", hash = "sha256:cf93e5388f412e1b108b1f8b34a6e036b70fe8aff89393befad96fe48670311b", size = 10710652, upload-time = "2026-05-28T14:16:06.701Z" }, + { url = "https://files.pythonhosted.org/packages/05/66/da974431624bf3b49f6ee1f9543c02d929ff1cba78b0d5a79c38cf21f744/ruff-0.15.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac5a646d1f6a7dadd5d50842dae2c1f9862ac887ef5d1b1375e02def791fde6e", size = 11096615, upload-time = "2026-05-28T14:16:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/8c/09/7443452e5d290230a712103f2fdceeef7184f3ec99a2bd01c8be78aaceb5/ruff-0.15.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:77d955a431430c66f72dd94e379ad38a16daea3d25094872ac4edf9e797be530", size = 10436683, upload-time = "2026-05-28T14:16:40.974Z" }, + { url = "https://files.pythonhosted.org/packages/53/01/d330c26a57fa4f3943a14424904027428315b700fe4d14a84bb123a649e5/ruff-0.15.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7614ee79c69788cf6cedd568069ade9cecc22a1ad20494efe8d0c9ebb4b622d4", size = 10769064, upload-time = "2026-05-28T14:16:28.905Z" }, + { url = "https://files.pythonhosted.org/packages/1d/85/cc8770f8bdff541b1da8392d1634141fe4a0e3f4ee596605959b7906c27f/ruff-0.15.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cdb1679e06a1f6b47bc384714ae96f6e2fb65ca441eb78c43d2ca554176ce1f", size = 10511987, upload-time = "2026-05-28T14:16:43.732Z" }, + { url = "https://files.pythonhosted.org/packages/7c/29/8c190c1472b63013583ba391f3342036e02010544c1270455ed8e519bdf3/ruff-0.15.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2728b93d7b23a603ea2c0ac6eb73d760bd38ec9de35f35fb41e18f7a3fee7622", size = 11275100, upload-time = "2026-05-28T14:16:55.244Z" }, + { url = "https://files.pythonhosted.org/packages/9f/6b/7e145ce2cc8e63d6834eca03d83a0e18d121def5c69f91b4cf4011ed4879/ruff-0.15.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be582fcc0db438902c7792b08d6ddf6c9b9e21addaa10092c2c741cfb09e5a45", size = 12176903, upload-time = "2026-05-28T14:16:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/80/a3/d5974637f68e451f7fadf015cf3101d1cd7d8ba5027cffe0b9e3826ebe6b/ruff-0.15.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7aa77465b8ecaf1a27bea098d696f7fed5e1eccbd10b321b682d6de586ae5627", size = 11404550, upload-time = "2026-05-28T14:16:20.138Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1c/e6e5e568f22be4fb05d6244234aba384c06b451252453b821e1a529263cf/ruff-0.15.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48decfa11d740de4889de623be1463308346312f2409a56e24aa280c86162dc4", size = 11382027, upload-time = "2026-05-28T14:16:46.615Z" }, + { url = "https://files.pythonhosted.org/packages/1d/01/170921b49fcd2e8858825593f91cf7146c3e40a5c3e6df763e4bb0484dde/ruff-0.15.15-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a5015088452ca0081387063649ec67f06d3d1d6b8b936a1f836b5e9657ecd48c", size = 11366041, upload-time = "2026-05-28T14:16:26.247Z" }, + { url = "https://files.pythonhosted.org/packages/87/54/a7bad711d7de93254e15e06a4c375b89a03d18de45d3e5dcc86a4472fb1a/ruff-0.15.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5294aab6356c81600fcdea3a62bb1b924dfd5e91767c12318d3f68f86af57cd", size = 10741795, upload-time = "2026-05-28T14:16:17.11Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/38c075963668f8b41c6914ee0f6f318727fbe30ab9145cb29e6df464c5fa/ruff-0.15.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db5bd4d802415cca656dc1616070b725952d6ae95eb5d4831e49fbd94a38f75f", size = 10511117, upload-time = "2026-05-28T14:16:31.767Z" }, + { url = "https://files.pythonhosted.org/packages/9d/96/6ff689e1f7e375d1d97075eca022f74c2bab59554a432fe4d2e6f091986a/ruff-0.15.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:587a6278ed42059191c1a466e490bd7930fb50bd2e255398bc29616c895a61cb", size = 10994867, upload-time = "2026-05-28T14:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c2/5dce0ab9f92a8d534fa62b9bf9caca3eddb8c1a81b616f5e195ada4f0d6e/ruff-0.15.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df0c1c084f5f4be9812f61518a45c440d3c30d69ce4bf6c5270e66d38338f02a", size = 11482101, upload-time = "2026-05-28T14:16:49.598Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c0/1003b60edd697c649faf61f1a34094b1abb38fb3d1181e3f895781250a08/ruff-0.15.15-py3-none-win32.whl", hash = "sha256:29428ea79694afbe756d45fd59b36f22b6b020dc0443cf7de0173046236964b9", size = 10716774, upload-time = "2026-05-28T14:16:52.337Z" }, + { url = "https://files.pythonhosted.org/packages/02/a8/1269eddd6945a06c23f055ef7848886e37cf9d6a8bebb386a3115f01470c/ruff-0.15.15-py3-none-win_amd64.whl", hash = "sha256:8df0323902e15e24bc4bf246da830573d3cf3352bd0b9a164eab335d111ff4a4", size = 11868463, upload-time = "2026-05-28T14:16:11.333Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b2/920464c907b191e37469d477a1aa8bc048b8f36c4c1610dfa4ab87b39e18/ruff-0.15.15-py3-none-win_arm64.whl", hash = "sha256:3c8ceca6792f38196b8f589bc92eccd03eef286602da92e5dc05cc42ef6441b7", size = 11138498, upload-time = "2026-05-28T14:16:38.425Z" }, ] [[package]] @@ -1387,15 +1480,15 @@ wheels = [ [[package]] name = "sentry-sdk" -version = "2.60.0" +version = "2.61.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/a2/2e6c090db384cc515069f4f85542bd5baf6786852073020ea73d4a76d3ea/sentry_sdk-2.60.0.tar.gz", hash = "sha256:0bd25e54e78ca02d0be512529fa644bbbf9e8470d7b26371294012d4ca93c978", size = 452946, upload-time = "2026-05-13T13:34:52.516Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/3b/4bc6b348bbd331daa14d4babe9f2b99bc854f4da41560eefb9488d78481d/sentry_sdk-2.61.1.tar.gz", hash = "sha256:9c6adccb3feefa9ba032c8d295ca477575c2f11896046a2b0ad686c47c4af555", size = 459429, upload-time = "2026-06-01T07:24:18.875Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/41/f2b800b7f12a05dd48c2a6280d4dd812d1425fc66ed3fe3fd99420c41d1a/sentry_sdk-2.60.0-py3-none-any.whl", hash = "sha256:28a536c03291c8bcb363cf35c611b32738ec118ff64d8d6383b096448ac4c803", size = 475616, upload-time = "2026-05-13T13:34:50.259Z" }, + { url = "https://files.pythonhosted.org/packages/df/54/c9218db183846e08efaf68534889ef42e499dde432778881104a42f7071b/sentry_sdk-2.61.1-py3-none-any.whl", hash = "sha256:fa36eaf4b8ad708f718500d4bdcc1532637526a22beb874d88cbc0a46458b5ae", size = 483735, upload-time = "2026-06-01T07:24:17.027Z" }, ] [[package]] @@ -1409,15 +1502,32 @@ wheels = [ [[package]] name = "starlette" -version = "1.1.0" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/66/4d20cdf39a8d6a51e663b7038e3b828ff211d3891a43a713fe7e4643f3a8/starlette-1.1.0.tar.gz", hash = "sha256:e83c7fe0ddecd8719c5b840080325aec0260acec86e9832899e377b91d65e90f", size = 2660060, upload-time = "2026-05-23T16:55:41.376Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/44/ec35f1b6e83094b997da438a02c8c9b0ade2b1e84cfc48bd4656780760a6/starlette-1.2.1.tar.gz", hash = "sha256:9b9b5ebb992e67d6093741e63c2f59e4f6fff986f81163c087867bd7b924b3f6", size = 2701854, upload-time = "2026-05-31T01:07:51.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/79/920b8e0a8b20f793e8d64855095cb8febabf6175b8550b6f7a547d813891/starlette-1.1.0-py3-none-any.whl", hash = "sha256:7f0dfd38e428aad5cb6f9f667f0ca1d2d8ca3f3385dccac8305f79ec98458382", size = 72899, upload-time = "2026-05-23T16:55:39.201Z" }, + { url = "https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl", hash = "sha256:4de0082d08c8f6764a85a54cf1120d6939507a19905c7768acad2a9f875d2b89", size = 73350, upload-time = "2026-05-31T01:07:50.09Z" }, +] + +[[package]] +name = "textual" +version = "8.2.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py", extra = ["linkify"] }, + { name = "mdit-py-plugins" }, + { name = "platformdirs" }, + { name = "pygments" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/7a/c519db0aba5024f86e71e9631810bfdd6866ed2c8695bd7fa34b90e7ef59/textual-8.2.7.tar.gz", hash = "sha256:658f568ff81e30ed43890c3e07520390e5cf1b4763822006e060656b0a88f105", size = 1859249, upload-time = "2026-05-19T10:52:49.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/f5/c1e18bc0707300a0e90204343abbf7d7acd6fb7ebe03a6d4893b99a234b8/textual-8.2.7-py3-none-any.whl", hash = "sha256:4caaa13a90bc4cf9c6c862c067ccd34fe84e9c161710a2a907a8026313b6bd73", size = 731129, upload-time = "2026-05-19T10:52:51.773Z" }, ] [[package]] @@ -1501,6 +1611,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d5/23/f8467b408b7988aff4ea40946a4bd1a2c1a73d17156a9d039bbaff1e2ceb/tree_sitter-0.25.2-cp313-cp313-win_arm64.whl", hash = "sha256:b3f63a1796886249bd22c559a5944d64d05d43f2be72961624278eff0dcc5cb8", size = 113975, upload-time = "2025-09-25T17:37:49.922Z" }, ] +[[package]] +name = "tree-sitter-go" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/05/727308adbbc79bcb1c92fc0ea10556a735f9d0f0a5435a18f59d40f7fd77/tree_sitter_go-0.25.0.tar.gz", hash = "sha256:a7466e9b8d94dda94cae8d91629f26edb2d26166fd454d4831c3bf6dfa2e8d68", size = 93890, upload-time = "2025-08-29T06:20:25.044Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/aa/0984707acc2b9bb461fe4a41e7e0fc5b2b1e245c32820f0c83b3c602957c/tree_sitter_go-0.25.0-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b852993063a3429a443e7bd0aa376dd7dd329d595819fabf56ac4cf9d7257b54", size = 47117, upload-time = "2025-08-29T06:20:14.286Z" }, + { url = "https://files.pythonhosted.org/packages/32/16/dd4cb124b35e99239ab3624225da07d4cb8da4d8564ed81d03fcb3a6ba9f/tree_sitter_go-0.25.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:503b81a2b4c31e302869a1de3a352ad0912ccab3df9ac9950197b0a9ceeabd8f", size = 48674, upload-time = "2025-08-29T06:20:17.557Z" }, + { url = "https://files.pythonhosted.org/packages/86/fb/b30d63a08044115d8b8bd196c6c2ab4325fb8db5757249a4ef0563966e2e/tree_sitter_go-0.25.0-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04b3b3cb4aff18e74e28d49b716c6f24cb71ddfdd66768987e26e4d0fa812f74", size = 66418, upload-time = "2025-08-29T06:20:18.345Z" }, + { url = "https://files.pythonhosted.org/packages/26/21/d3d88a30ad007419b2c97b3baeeef7431407faf9f686195b6f1cad0aedf9/tree_sitter_go-0.25.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:148255aca2f54b90d48c48a9dbb4c7faad6cad310a980b2c5a5a9822057ed145", size = 72006, upload-time = "2025-08-29T06:20:19.14Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d0/0dd6442353ced8a88bbda9e546f4ea29e381b59b5a40b122e5abb586bb6c/tree_sitter_go-0.25.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4d338116cdf8a6c6ff990d2441929b41323ef17c710407abe0993c13417d6aad", size = 70603, upload-time = "2025-08-29T06:20:21.544Z" }, + { url = "https://files.pythonhosted.org/packages/01/e2/ee5e09f63504fc286539535d374d2eaa0e7d489b80f8f744bb3962aff22a/tree_sitter_go-0.25.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5608e089d2a29fa8d2b327abeb2ad1cdb8e223c440a6b0ceab0d3fa80bdeebae", size = 66088, upload-time = "2025-08-29T06:20:22.336Z" }, + { url = "https://files.pythonhosted.org/packages/6e/b6/d9142583374720e79aca9ccb394b3795149a54c012e1dfd80738df2d984e/tree_sitter_go-0.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:30d4ada57a223dfc2c32d942f44d284d40f3d1215ddcf108f96807fd36d53022", size = 48152, upload-time = "2025-08-29T06:20:23.089Z" }, + { url = "https://files.pythonhosted.org/packages/9e/00/9a2638e7339236f5b01622952a4d71c1474dd3783d1982a89555fc1f03b1/tree_sitter_go-0.25.0-cp310-abi3-win_arm64.whl", hash = "sha256:d5d62362059bf79997340773d47cc7e7e002883b527a05cca829c46e40b70ded", size = 46752, upload-time = "2025-08-29T06:20:24.235Z" }, +] + [[package]] name = "tree-sitter-groovy" version = "0.1.2" @@ -1624,6 +1750,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] +[[package]] +name = "uc-micro-py" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/67/9a363818028526e2d4579334460df777115bdec1bb77c08f9db88f6389f2/uc_micro_py-2.0.0.tar.gz", hash = "sha256:c53691e495c8db60e16ffc4861a35469b0ba0821fe409a8a7a0a71864d33a811", size = 6611, upload-time = "2026-03-01T06:31:27.526Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/73/d21edf5b204d1467e06500080a50f79d49ef2b997c79123a536d4a17d97c/uc_micro_py-2.0.0-py3-none-any.whl", hash = "sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c", size = 6383, upload-time = "2026-03-01T06:31:26.257Z" }, +] + [[package]] name = "unidiff" version = "0.7.5" From 1942e5151b74f732dde2605e9b6e5347e94f10ac Mon Sep 17 00:00:00 2001 From: dx616b Date: Tue, 2 Jun 2026 22:38:09 +0200 Subject: [PATCH 27/58] Fix Navidrome large-playlist sync and align tests with upstream Use POST and batched updatePlaylist for createPlaylist so hundreds of songIds no longer hit HTTP 414. Restore CI with test fixes, ID3 metadata fallback for Soulseek MP3s, and slskd settings refactors. Co-authored-by: Cursor --- downtify/api.py | 155 +++++++++--------- downtify/downloader.py | 10 +- downtify/library_metadata.py | 42 +++-- downtify/navidrome.py | 101 ++++++++---- downtify/slskd_provider.py | 7 +- downtify/spotify.py | 2 +- .../{index-pD3TceX1.js => index-LDppyIJk.js} | 2 +- frontend/dist/index.html | 2 +- frontend/src/components/DownloadList.vue | 7 +- frontend/src/components/Settings.vue | 48 +++--- frontend/src/model/api.js | 6 +- frontend/src/model/download.js | 8 +- frontend/src/model/settings.js | 54 +++--- pyproject.toml | 2 +- requirements.txt | 4 +- scripts/docker-test.sh | 47 ++++++ tests/test_api_settings.py | 5 +- tests/test_api_skip_existing.py | 18 +- tests/test_downloader_extended.py | 17 +- tests/test_library_catalog.py | 16 +- tests/test_library_metadata.py | 17 +- tests/test_navidrome.py | 54 +++++- tests/test_providers.py | 26 +-- tests/test_slskd_responses.py | 64 ++++---- tests/test_slskd_timeout.py | 2 +- uv.lock | 17 +- 26 files changed, 461 insertions(+), 272 deletions(-) rename frontend/dist/assets/{index-pD3TceX1.js => index-LDppyIJk.js} (99%) create mode 100755 scripts/docker-test.sh diff --git a/downtify/api.py b/downtify/api.py index 91130fc..bfda9e5 100644 --- a/downtify/api.py +++ b/downtify/api.py @@ -172,67 +172,40 @@ def _effective_audio_providers(settings: dict[str, Any]) -> list[str]: return out -def _effective_slskd_settings(settings: dict[str, Any]) -> dict[str, Any]: - raw = settings.get('slskd') - if not isinstance(raw, dict): - raw = {} +def _setting_int( + data: dict[str, Any], + key: str, + default: int, + *, + minimum: int, + maximum: int, +) -> int: + try: + value = int(data.get(key) or default) + except (TypeError, ValueError): + value = default + return min(maximum, max(minimum, value)) + + +def _slskd_core_fields( + raw: dict[str, Any], +) -> tuple[str, str, str, str, bool]: base_url = str(raw.get('base_url') or '').strip().rstrip('/') download_dir = str(raw.get('download_dir') or '/downloads').strip() + api_key = str(raw.get('api_key') or '').strip() leave_in_place = raw.get('leave_in_place') - if leave_in_place is None: - leave_in_place_default = True - else: - leave_in_place_default = bool(leave_in_place) + leave_default = leave_in_place is None or bool(leave_in_place) source_dir = str(raw.get('source_dir') or '').strip() if not source_dir: - source_dir = '/slskd' if leave_in_place_default else download_dir - api_key = str(raw.get('api_key') or '').strip() - try: - timeout_seconds = int(raw.get('timeout_seconds') or 20) - except (TypeError, ValueError): - timeout_seconds = 20 - timeout_seconds = min(120, max(5, timeout_seconds)) - try: - search_retries = int(raw.get('search_retries') or 5) - except (TypeError, ValueError): - search_retries = 5 - search_retries = min(20, max(1, search_retries)) - try: - search_poll_seconds = int(raw.get('search_poll_seconds') or 15) - except (TypeError, ValueError): - search_poll_seconds = 15 - search_poll_seconds = min(60, max(3, search_poll_seconds)) - try: - download_attempts = int(raw.get('download_attempts') or 3) - except (TypeError, ValueError): - download_attempts = 3 - download_attempts = min(10, max(1, download_attempts)) - try: - poll_interval_seconds = int(raw.get('poll_interval_seconds') or 5) - except (TypeError, ValueError): - poll_interval_seconds = 5 - poll_interval_seconds = min(30, max(1, poll_interval_seconds)) - try: - poll_max_attempts = int(raw.get('poll_max_attempts') or 60) - except (TypeError, ValueError): - poll_max_attempts = 60 - poll_max_attempts = min(300, max(1, poll_max_attempts)) - try: - download_timeout_seconds = int( - raw.get('download_timeout_seconds') or 600 - ) - except (TypeError, ValueError): - download_timeout_seconds = 600 - download_timeout_seconds = min(3600, max(30, download_timeout_seconds)) - try: - queued_timeout_seconds = int(raw.get('queued_timeout_seconds') or 180) - except (TypeError, ValueError): - queued_timeout_seconds = 180 - queued_timeout_seconds = min(3600, max(15, queued_timeout_seconds)) - try: - min_bitrate = int(raw.get('min_bitrate') or 256) - except (TypeError, ValueError): - min_bitrate = 256 + source_dir = '/slskd' if leave_default else download_dir + if leave_in_place is None: + leave_in_place = True + else: + leave_in_place = bool(leave_in_place) + return base_url, download_dir, api_key, source_dir, leave_in_place + + +def _slskd_extensions(raw: dict[str, Any]) -> list[str]: raw_ext = raw.get('extensions') if isinstance(raw_ext, list): extensions = [ @@ -250,15 +223,56 @@ def _effective_slskd_settings(settings: dict[str, Any]) -> dict[str, Any]: extensions = ['mp3', 'flac'] if not extensions: extensions = ['mp3', 'flac'] - if leave_in_place is None: - leave_in_place = True - else: - leave_in_place = bool(leave_in_place) + return extensions + + +def _slskd_numeric_settings( + raw: dict[str, Any], settings: dict[str, Any] +) -> dict[str, int]: try: - max_parallel = int(settings.get('max_parallel_downloads') or 3) + min_bitrate = int(raw.get('min_bitrate') or 256) except (TypeError, ValueError): - max_parallel = 3 - max_parallel = min(8, max(1, max_parallel)) + min_bitrate = 256 + return { + 'timeout_seconds': _setting_int( + raw, 'timeout_seconds', 20, minimum=5, maximum=120 + ), + 'search_retries': _setting_int( + raw, 'search_retries', 5, minimum=1, maximum=20 + ), + 'search_poll_seconds': _setting_int( + raw, 'search_poll_seconds', 15, minimum=3, maximum=60 + ), + 'download_attempts': _setting_int( + raw, 'download_attempts', 3, minimum=1, maximum=10 + ), + 'poll_interval_seconds': _setting_int( + raw, 'poll_interval_seconds', 5, minimum=1, maximum=30 + ), + 'poll_max_attempts': _setting_int( + raw, 'poll_max_attempts', 60, minimum=1, maximum=300 + ), + 'download_timeout_seconds': _setting_int( + raw, 'download_timeout_seconds', 600, minimum=30, maximum=3600 + ), + 'queued_timeout_seconds': _setting_int( + raw, 'queued_timeout_seconds', 180, minimum=15, maximum=3600 + ), + 'min_bitrate': min_bitrate, + 'max_parallel_downloads': _setting_int( + settings, 'max_parallel_downloads', 3, minimum=1, maximum=8 + ), + } + + +def _effective_slskd_settings(settings: dict[str, Any]) -> dict[str, Any]: + raw = settings.get('slskd') + if not isinstance(raw, dict): + raw = {} + base_url, download_dir, api_key, source_dir, leave_in_place = ( + _slskd_core_fields(raw) + ) + nums = _slskd_numeric_settings(raw, settings) return { 'enabled': bool(raw.get('enabled', False)), @@ -267,17 +281,8 @@ def _effective_slskd_settings(settings: dict[str, Any]) -> dict[str, Any]: 'download_dir': download_dir, 'source_dir': source_dir, 'leave_in_place': leave_in_place, - 'max_parallel_downloads': max_parallel, - 'timeout_seconds': timeout_seconds, - 'search_retries': search_retries, - 'search_poll_seconds': search_poll_seconds, - 'download_attempts': download_attempts, - 'poll_interval_seconds': poll_interval_seconds, - 'poll_max_attempts': poll_max_attempts, - 'download_timeout_seconds': download_timeout_seconds, - 'queued_timeout_seconds': queued_timeout_seconds, - 'extensions': extensions, - 'min_bitrate': min_bitrate, + 'extensions': _slskd_extensions(raw), + **nums, } @@ -350,7 +355,7 @@ def _load_settings(path: Path) -> dict[str, Any]: for k, v in saved.items(): if k in DEFAULT_SETTINGS: if ( - k in ('slskd', 'navidrome', 'youtube') + k in {'slskd', 'navidrome', 'youtube'} and isinstance(v, dict) and isinstance(DEFAULT_SETTINGS.get(k), dict) ): diff --git a/downtify/downloader.py b/downtify/downloader.py index 0989674..635727d 100644 --- a/downtify/downloader.py +++ b/downtify/downloader.py @@ -208,8 +208,8 @@ def inspect_youtube_cookies(path: Path | str) -> dict[str, Any]: return out out['has_youtube_domain'] = True names: set[str] = set() - for line in text.splitlines(): - line = line.strip() + for raw_line in text.splitlines(): + line = raw_line.strip() if not line or line.startswith('#'): continue parts = line.split('\t') @@ -699,7 +699,7 @@ def _resolve_video_id( continue slskd_idx = self.audio_providers.index('slskd') has_fallback = any( - p in ('youtube-music', 'youtube') + p in {'youtube-music', 'youtube'} for p in self.audio_providers[slskd_idx + 1 :] ) local = download_from_slskd( @@ -873,7 +873,7 @@ def _finalize_downloaded_file( msg = f'{label} · done' if label else 'Done' progress_cb(100.0, msg, provider) - def download( # noqa: PLR0914 + def download( # noqa: PLR0914 # yt-dlp + slskd + tagging pipeline self, song: dict[str, Any], progress_cb: Optional[ProgressCallback] = None, @@ -928,7 +928,7 @@ def download( # noqa: PLR0914 out_template = str(target_dir / f'{basename}.%(ext)s') yt_provider = ( - provider if provider in ('youtube', 'youtube-music') else 'youtube' + provider if provider in {'youtube', 'youtube-music'} else 'youtube' ) if local_source_path is not None: diff --git a/downtify/library_metadata.py b/downtify/library_metadata.py index d9bef4b..8b22fec 100644 --- a/downtify/library_metadata.py +++ b/downtify/library_metadata.py @@ -6,6 +6,7 @@ from typing import Any from mutagen import File as MutagenFile +from mutagen.id3 import ID3 def _tag_text(value: Any) -> str: @@ -39,23 +40,36 @@ def read_audio_metadata(path: Path) -> dict[str, Any]: if not path.is_file(): return dict(empty) + title = '' + artist = '' + album = '' + try: audio = MutagenFile(str(path), easy=True) except Exception: - return dict(empty) - if audio is None: - return dict(empty) - - title = _tag_text(audio.get('title')) - artist = _tag_text(audio.get('artist')) - album = _tag_text(audio.get('album')) - - if not title and audio.tags is not None: - title = _tag_text(audio.tags.get('title')) - if not artist and audio.tags is not None: - artist = _tag_text(audio.tags.get('artist')) - if not album and audio.tags is not None: - album = _tag_text(audio.tags.get('album')) + audio = None + + if audio is not None: + title = _tag_text(audio.get('title')) + artist = _tag_text(audio.get('artist')) + album = _tag_text(audio.get('album')) + + if not title and audio.tags is not None: + title = _tag_text(audio.tags.get('title')) + if not artist and audio.tags is not None: + artist = _tag_text(audio.tags.get('artist')) + if not album and audio.tags is not None: + album = _tag_text(audio.tags.get('album')) + + if not title and not artist and not album: + try: + id3 = ID3(str(path)) + except Exception: + id3 = None + if id3 is not None: + title = _tag_text(id3.get('TIT2')) + artist = _tag_text(id3.get('TPE1')) + album = _tag_text(id3.get('TALB')) artists = _split_artists(artist) return { diff --git a/downtify/navidrome.py b/downtify/navidrome.py index cd6224e..580e2b9 100644 --- a/downtify/navidrome.py +++ b/downtify/navidrome.py @@ -7,11 +7,50 @@ import time from dataclasses import dataclass from typing import Any, Optional -from urllib.parse import quote, urlencode +from urllib.parse import urlencode import requests from loguru import logger +# Subsonic createPlaylist via GET appends every songId to the query string; large +# playlists hit HTTP 414. POST form bodies avoid that; we still batch adds. +_PLAYLIST_SONG_ID_BATCH = 80 + + +def _song_id_batches( + song_ids: list[str], batch_size: int = _PLAYLIST_SONG_ID_BATCH +) -> list[list[str]]: + batches: list[list[str]] = [] + for index in range(0, len(song_ids), batch_size): + batches.append(song_ids[index : index + batch_size]) + return batches + + +def _parse_subsonic_http_response(resp: requests.Response) -> dict[str, Any]: + resp.raise_for_status() + data = resp.json() + body = data.get('subsonic-response') if isinstance(data, dict) else None + if not isinstance(body, dict): + raise ValueError('Invalid Subsonic response') + if body.get('status') == 'failed': + err = body.get('error') or {} + message = err.get('message') if isinstance(err, dict) else str(err) + raise ValueError(str(message or 'Subsonic request failed')) + return body + + +def _playlist_id_from_body( + body: dict[str, Any], fallback: Optional[str] = None +) -> str: + playlist = body.get('playlist') + if isinstance(playlist, dict): + pid = str(playlist.get('id') or '').strip() + if pid: + return pid + if fallback: + return fallback + raise ValueError('createPlaylist returned no playlist id') + @dataclass class PlaylistSyncResult: @@ -215,7 +254,9 @@ def wait_scan_complete(self, max_wait_seconds: int) -> bool: ) return False - def search_song_id(self, song: dict[str, Any]) -> Optional[str]: + def search_song_id( # noqa: PLR0914 # Subsonic search + path/duration match + self, song: dict[str, Any] + ) -> Optional[str]: title = _search_title(str(song.get('name') or '')) artists = [ str(a) for a in (song.get('artists') or []) if str(a).strip() @@ -240,7 +281,7 @@ def search_song_id(self, song: dict[str, Any]) -> Optional[str]: target_duration = int(song.get('duration') or 0) if target_duration > 1000: - target_duration = target_duration // 1000 + target_duration //= 1000 for candidate in songs: if not isinstance(candidate, dict): @@ -301,6 +342,28 @@ def find_playlist_ids_by_name(self, name: str) -> list[str]: def delete_playlist(self, playlist_id: str) -> None: self._request('deletePlaylist', {'id': playlist_id}) + def _rest_post( + self, + endpoint: str, + query: dict[str, str], + form_pairs: list[tuple[str, str]], + ) -> dict[str, Any]: + url = f'{self.base_url}/rest/{endpoint}' + resp = requests.post( + url, params=query, data=form_pairs, timeout=self.timeout + ) + return _parse_subsonic_http_response(resp) + + def _add_songs_to_playlist( + self, playlist_id: str, song_ids: list[str] + ) -> None: + if not song_ids: + return + query = self._auth_query() + query['playlistId'] = playlist_id + form = [('songIdToAdd', sid) for sid in song_ids] + self._rest_post('updatePlaylist', query, form) + def _create_or_replace_playlist( self, name: str, @@ -312,35 +375,17 @@ def _create_or_replace_playlist( if not song_ids: raise ValueError('No songs matched in Navidrome library') + batches = _song_id_batches(song_ids) query = self._auth_query() query['name'] = name if playlist_id: query['playlistId'] = playlist_id - url = f'{self.base_url}/rest/createPlaylist?{urlencode(query)}' - for sid in song_ids: - url += f'&songId={quote(sid)}' - resp = requests.get(url, timeout=self.timeout) - resp.raise_for_status() - data = resp.json() - body = ( - data.get('subsonic-response') if isinstance(data, dict) else None - ) - if not isinstance(body, dict) or body.get('status') == 'failed': - err = (body or {}).get('error') if isinstance(body, dict) else {} - message = ( - err.get('message') - if isinstance(err, dict) - else 'create failed' - ) - raise ValueError(str(message)) - playlist = body.get('playlist') if isinstance(body, dict) else None - if isinstance(playlist, dict): - pid = str(playlist.get('id') or '').strip() - if pid: - return pid - if playlist_id: - return playlist_id - raise ValueError('createPlaylist returned no playlist id') + form = [('songId', sid) for sid in batches[0]] + body = self._rest_post('createPlaylist', query, form) + pid = _playlist_id_from_body(body, playlist_id) + for batch in batches[1:]: + self._add_songs_to_playlist(pid, batch) + return pid def create_playlist(self, name: str, song_ids: list[str]) -> str: return self._create_or_replace_playlist(name, song_ids) diff --git a/downtify/slskd_provider.py b/downtify/slskd_provider.py index d11b046..6db0e03 100644 --- a/downtify/slskd_provider.py +++ b/downtify/slskd_provider.py @@ -40,7 +40,6 @@ def reset_slskd_parallelism(settings: dict[str, Any]) -> None: def _slskd_semaphore(settings: dict[str, Any]) -> threading.Semaphore: """Match Downtify parallel download setting; do not serialize all slskd work.""" - global _SLSKD_SEM, _SLSKD_SEM_LIMIT limit = _slskd_parallel_limit(settings) if _SLSKD_SEM is None or _SLSKD_SEM_LIMIT != limit: reset_slskd_parallelism(settings) @@ -399,7 +398,7 @@ def _path_segments(filename: str) -> list[str]: """Parent folders in a Soulseek path (people often encode artist/album there).""" normalized = str(filename or '').replace('\\', '/') parent = Path(normalized).parent - return [part for part in parent.parts if part not in ('.', '/')] + return [part for part in parent.parts if part not in {'.', '/'}] def _contains_keyword(song: dict[str, Any], filename: str) -> bool: @@ -793,7 +792,7 @@ def _search_roots(settings: dict[str, Any], client: SlskdClient) -> list[Path]: def _parse_soulseek_path(filename: str) -> tuple[str, str]: normalized = filename.replace('\\', '/') parent = Path(normalized).parent - parent_name = '' if str(parent) in ('.', '/') else parent.name + parent_name = '' if str(parent) in {'.', '/'} else parent.name return Path(normalized).name, parent_name @@ -1122,7 +1121,7 @@ def _wait_for_slskd_file( ) -def download_from_slskd( +def download_from_slskd( # noqa: PLR0914 # search, rank, enqueue, poll, finalize song: dict[str, Any], settings: dict[str, Any], progress_cb: Optional[ProgressCallback] = None, diff --git a/downtify/spotify.py b/downtify/spotify.py index 4fdb1aa..a0d78fc 100644 --- a/downtify/spotify.py +++ b/downtify/spotify.py @@ -481,7 +481,7 @@ def _merge_full_track_metadata( value = full.get(key) if value is None or not value or value == []: continue - if key in ('track_number', 'album_track_total'): + if key in {'track_number', 'album_track_total'}: if merged.get(key) is not None: continue try: diff --git a/frontend/dist/assets/index-pD3TceX1.js b/frontend/dist/assets/index-LDppyIJk.js similarity index 99% rename from frontend/dist/assets/index-pD3TceX1.js rename to frontend/dist/assets/index-LDppyIJk.js index 15e906d..c3022f7 100644 --- a/frontend/dist/assets/index-pD3TceX1.js +++ b/frontend/dist/assets/index-LDppyIJk.js @@ -30,4 +30,4 @@ Downtify: /mnt/storage/music/slskd:/slskd → /slskd`,slskdSourceDirLabel:"Past * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT - */let fv=()=>location.protocol+"//"+location.host;function _u(e,t){const{pathname:n,search:s,hash:o}=t,r=e.indexOf("#");if(r>-1){let i=o.includes(e.slice(r))?e.slice(r).length:1,a=o.slice(i);return a[0]!=="/"&&(a="/"+a),Ja(a,"")}return Ja(n,e)+s+o}function pv(e,t,n,s){let o=[],r=[],i=null;const a=({state:h})=>{const g=_u(e,location),b=n.value,k=t.value;let v=0;if(h){if(n.value=g,t.value=h,i&&i===b){i=null;return}v=k?h.position-k.position:0}else s(g);o.forEach(R=>{R(n.value,b,{delta:v,type:Ur.pop,direction:v?v>0?cr.forward:cr.back:cr.unknown})})};function l(){i=n.value}function d(h){o.push(h);const g=()=>{const b=o.indexOf(h);b>-1&&o.splice(b,1)};return r.push(g),g}function c(){if(document.visibilityState==="hidden"){const{history:h}=window;if(!h.state)return;h.replaceState(ge({},h.state,{scroll:Mo()}),"")}}function p(){for(const h of r)h();r=[],window.removeEventListener("popstate",a),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",a),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:l,listen:d,destroy:p}}function nl(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Mo():null}}function hv(e){const{history:t,location:n}=window,s={value:_u(e,n)},o={value:t.state};o.value||r(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(l,d,c){const p=e.indexOf("#"),h=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+l:fv()+e+l;try{t[c?"replaceState":"pushState"](d,"",h),o.value=d}catch(g){console.error(g),n[c?"replace":"assign"](h)}}function i(l,d){r(l,ge({},t.state,nl(o.value.back,l,o.value.forward,!0),d,{position:o.value.position}),!0),s.value=l}function a(l,d){const c=ge({},o.value,t.state,{forward:l,scroll:Mo()});r(c.current,c,!0),r(l,ge({},nl(s.value,l,null),{position:c.position+1},d),!1),s.value=l}return{location:s,state:o,push:a,replace:i}}function mv(e){e=Xb(e);const t=hv(e),n=pv(e,t.state,t.location,t.replace);function s(r,i=!0){i||n.pauseListeners(),history.go(r)}const o=ge({location:"",base:e,go:s,createHref:ev.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let xn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Ne=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Ne||{});const gv={type:xn.Static,value:""},yv=/[a-zA-Z0-9_]/;function bv(e){if(!e)return[[]];if(e==="/")return[[gv]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${d}": ${g}`)}let n=Ne.Static,s=n;const o=[];let r;function i(){r&&o.push(r),r=[]}let a=0,l,d="",c="";function p(){d&&(n===Ne.Static?r.push({type:xn.Static,value:d}):n===Ne.Param||n===Ne.ParamRegExp||n===Ne.ParamRegExpEnd?(r.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),r.push({type:xn.Param,value:d,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),d="")}function h(){d+=l}for(;at.length?t.length===1&&t[0]===ze.Static+ze.Segment?1:-1:0}function xu(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const kv={strict:!1,end:!0,sensitive:!1};function Sv(e,t,n){const s=xv(bv(e.path),n),o=ge(s,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function Ev(e,t){const n=[],s=new Map;t=Ya(kv,t);function o(p){return s.get(p)}function r(p,h,g){const b=!g,k=il(p);k.aliasOf=g&&g.record;const v=Ya(t,p),R=[k];if("alias"in p){const P=typeof p.alias=="string"?[p.alias]:p.alias;for(const F of P)R.push(il(ge({},k,{components:g?g.record.components:k.components,path:F,aliasOf:g?g.record:k})))}let D,C;for(const P of R){const{path:F}=P;if(h&&F[0]!=="/"){const x=h.record.path,_=x[x.length-1]==="/"?"":"/";P.path=h.record.path+(F&&_+F)}if(D=Sv(P,h,v),g?g.alias.push(D):(C=C||D,C!==D&&C.alias.push(D),b&&p.name&&!al(D)&&i(p.name)),wu(D)&&l(D),k.children){const x=k.children;for(let _=0;_{i(C)}:hs}function i(p){if(bu(p)){const h=s.get(p);h&&(s.delete(p),n.splice(n.indexOf(h),1),h.children.forEach(i),h.alias.forEach(i))}else{const h=n.indexOf(p);h>-1&&(n.splice(h,1),p.record.name&&s.delete(p.record.name),p.children.forEach(i),p.alias.forEach(i))}}function a(){return n}function l(p){const h=Rv(p,n);n.splice(h,0,p),p.record.name&&!al(p)&&s.set(p.record.name,p)}function d(p,h){let g,b={},k,v;if("name"in p&&p.name){if(g=s.get(p.name),!g)throw qn(Re.MATCHER_NOT_FOUND,{location:p});v=g.record.name,b=ge(rl(h.params,g.keys.filter(C=>!C.optional).concat(g.parent?g.parent.keys.filter(C=>C.optional):[]).map(C=>C.name)),p.params&&rl(p.params,g.keys.map(C=>C.name))),k=g.stringify(b)}else if(p.path!=null)k=p.path,g=n.find(C=>C.re.test(k)),g&&(b=g.parse(k),v=g.record.name);else{if(g=h.name?s.get(h.name):n.find(C=>C.re.test(h.path)),!g)throw qn(Re.MATCHER_NOT_FOUND,{location:p,currentLocation:h});v=g.record.name,b=ge({},h.params,p.params),k=g.stringify(b)}const R=[];let D=g;for(;D;)R.unshift(D.record),D=D.parent;return{name:v,path:k,params:b,matched:R,meta:Cv(R)}}e.forEach(p=>r(p));function c(){n.length=0,s.clear()}return{addRoute:r,resolve:d,removeRoute:i,clearRoutes:c,getRoutes:a,getRecordMatcher:o}}function rl(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function il(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Av(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Av(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function al(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Cv(e){return e.reduce((t,n)=>ge(t,n.meta),{})}function Rv(e,t){let n=0,s=t.length;for(;n!==s;){const r=n+s>>1;xu(e,t[r])<0?s=r:n=r+1}const o=Tv(e);return o&&(s=t.lastIndexOf(o,s-1)),s}function Tv(e){let t=e;for(;t=t.parent;)if(wu(t)&&xu(e,t)===0)return t}function wu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function ll(e){const t=_t(Bo),n=_t(_i),s=me(()=>{const l=u(e.to);return t.resolve(l)}),o=me(()=>{const{matched:l}=s.value,{length:d}=l,c=l[d-1],p=n.matched;if(!c||!p.length)return-1;const h=p.findIndex(jn.bind(null,c));if(h>-1)return h;const g=cl(l[d-2]);return d>1&&cl(c)===g&&p[p.length-1].path!==g?p.findIndex(jn.bind(null,l[d-2])):h}),r=me(()=>o.value>-1&&Iv(n.params,s.value.params)),i=me(()=>o.value>-1&&o.value===n.matched.length-1&&yu(n.params,s.value.params));function a(l={}){if(Nv(l)){const d=t[u(e.replace)?"replace":"push"](u(e.to)).catch(hs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:me(()=>s.value.href),isActive:r,isExactActive:i,navigate:a}}function Pv(e){return e.length===1?e[0]:e}const Ov=si({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:ll,setup(e,{slots:t}){const n=Un(ll(e)),{options:s}=_t(Bo),o=me(()=>({[ul(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ul(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const r=t.default&&Pv(t.default(n));return e.custom?r:xs("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}}),Dv=Ov;function Nv(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Iv(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!kt(o)||o.length!==s.length||s.some((r,i)=>r.valueOf()!==o[i].valueOf()))return!1}return!0}function cl(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ul=(e,t,n)=>e??t??n,$v=si({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=_t(Mr),o=me(()=>e.route||s.value),r=_t(tl,0),i=me(()=>{let d=u(r);const{matched:c}=o.value;let p;for(;(p=c[d])&&!p.components;)d++;return d}),a=me(()=>o.value.matched[i.value]);Qs(tl,me(()=>i.value+1)),Qs(uv,a),Qs(Mr,o);const l=se();return Mt(()=>[l.value,a.value,e.name],([d,c,p],[h,g,b])=>{c&&(c.instances[p]=d,g&&g!==c&&d&&d===h&&(c.leaveGuards.size||(c.leaveGuards=g.leaveGuards),c.updateGuards.size||(c.updateGuards=g.updateGuards))),d&&c&&(!g||!jn(c,g)||!h)&&(c.enterCallbacks[p]||[]).forEach(k=>k(d))},{flush:"post"}),()=>{const d=o.value,c=e.name,p=a.value,h=p&&p.components[c];if(!h)return dl(n.default,{Component:h,route:d});const g=p.props[c],b=g?g===!0?d.params:typeof g=="function"?g(d):g:null,v=xs(h,ge({},b,t,{onVnodeUnmounted:R=>{R.component.isUnmounted&&(p.instances[c]=null)},ref:l}));return dl(n.default,{Component:v,route:d})||v}}});function dl(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Lv=$v;function Uv(e){const t=Ev(e.routes,e),n=e.parseQuery||lv,s=e.stringifyQuery||el,o=e.history,r=os(),i=os(),a=os(),l=fd(nn);let d=nn;Pn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=ar.bind(null,L=>""+L),p=ar.bind(null,Wb),h=ar.bind(null,As);function g(L,G){let z,J;return bu(L)?(z=t.getRecordMatcher(L),J=G):J=L,t.addRoute(J,z)}function b(L){const G=t.getRecordMatcher(L);G&&t.removeRoute(G)}function k(){return t.getRoutes().map(L=>L.record)}function v(L){return!!t.getRecordMatcher(L)}function R(L,G){if(G=ge({},G||l.value),typeof L=="string"){const S=lr(n,L,G.path),I=t.resolve({path:S.path},G),U=o.createHref(S.fullPath);return ge(S,I,{params:h(I.params),hash:As(S.hash),redirectedFrom:void 0,href:U})}let z;if(L.path!=null)z=ge({},L,{path:lr(n,L.path,G.path).path});else{const S=ge({},L.params);for(const I in S)S[I]==null&&delete S[I];z=ge({},L,{params:p(S)}),G.params=p(G.params)}const J=t.resolve(z,G),ue=L.hash||"";J.params=c(h(J.params));const m=Qb(s,ge({},L,{hash:jb(ue),path:J.path})),y=o.createHref(m);return ge({fullPath:m,hash:ue,query:s===el?cv(L.query):L.query||{}},J,{redirectedFrom:void 0,href:y})}function D(L){return typeof L=="string"?lr(n,L,l.value.path):ge({},L)}function C(L,G){if(d!==L)return qn(Re.NAVIGATION_CANCELLED,{from:G,to:L})}function P(L){return _(L)}function F(L){return P(ge(D(L),{replace:!0}))}function x(L,G){const z=L.matched[L.matched.length-1];if(z&&z.redirect){const{redirect:J}=z;let ue=typeof J=="function"?J(L,G):J;return typeof ue=="string"&&(ue=ue.includes("?")||ue.includes("#")?ue=D(ue):{path:ue},ue.params={}),ge({query:L.query,hash:L.hash,params:ue.path!=null?{}:L.params},ue)}}function _(L,G){const z=d=R(L),J=l.value,ue=L.state,m=L.force,y=L.replace===!0,S=x(z,J);if(S)return _(ge(D(S),{state:typeof S=="object"?ge({},ue,S.state):ue,force:m,replace:y}),G||z);const I=z;I.redirectedFrom=G;let U;return!m&&Gb(s,J,z)&&(U=qn(Re.NAVIGATION_DUPLICATED,{to:I,from:J}),De(J,J,!0,!1)),(U?Promise.resolve(U):M(I,J)).catch($=>Vt($)?Vt($,Re.NAVIGATION_GUARD_REDIRECT)?$:At($):ae($,I,J)).then($=>{if($){if(Vt($,Re.NAVIGATION_GUARD_REDIRECT))return _(ge({replace:y},D($.to),{state:typeof $.to=="object"?ge({},ue,$.to.state):ue,force:m}),G||I)}else $=N(I,J,!0,y,ue);return Q(I,J,$),$})}function E(L,G){const z=C(L,G);return z?Promise.reject(z):Promise.resolve()}function j(L){const G=gt.values().next().value;return G&&typeof G.runWithContext=="function"?G.runWithContext(L):L()}function M(L,G){let z;const[J,ue,m]=dv(L,G);z=ur(J.reverse(),"beforeRouteLeave",L,G);for(const S of J)S.leaveGuards.forEach(I=>{z.push(rn(I,L,G))});const y=E.bind(null,L,G);return z.push(y),dt(z).then(()=>{z=[];for(const S of r.list())z.push(rn(S,L,G));return z.push(y),dt(z)}).then(()=>{z=ur(ue,"beforeRouteUpdate",L,G);for(const S of ue)S.updateGuards.forEach(I=>{z.push(rn(I,L,G))});return z.push(y),dt(z)}).then(()=>{z=[];for(const S of m)if(S.beforeEnter)if(kt(S.beforeEnter))for(const I of S.beforeEnter)z.push(rn(I,L,G));else z.push(rn(S.beforeEnter,L,G));return z.push(y),dt(z)}).then(()=>(L.matched.forEach(S=>S.enterCallbacks={}),z=ur(m,"beforeRouteEnter",L,G,j),z.push(y),dt(z))).then(()=>{z=[];for(const S of i.list())z.push(rn(S,L,G));return z.push(y),dt(z)}).catch(S=>Vt(S,Re.NAVIGATION_CANCELLED)?S:Promise.reject(S))}function Q(L,G,z){a.list().forEach(J=>j(()=>J(L,G,z)))}function N(L,G,z,J,ue){const m=C(L,G);if(m)return m;const y=G===nn,S=Pn?history.state:{};z&&(J||y?o.replace(L.fullPath,ge({scroll:y&&S&&S.scroll},ue)):o.push(L.fullPath,ue)),l.value=L,De(L,G,z,y),At()}let te;function le(){te||(te=o.listen((L,G,z)=>{if(!Rt.listening)return;const J=R(L),ue=x(J,Rt.currentRoute.value);if(ue){_(ge(ue,{replace:!0,force:!0}),J).catch(hs);return}d=J;const m=l.value;Pn&&sv(Za(m.fullPath,z.delta),Mo()),M(J,m).catch(y=>Vt(y,Re.NAVIGATION_ABORTED|Re.NAVIGATION_CANCELLED)?y:Vt(y,Re.NAVIGATION_GUARD_REDIRECT)?(_(ge(D(y.to),{force:!0}),J).then(S=>{Vt(S,Re.NAVIGATION_ABORTED|Re.NAVIGATION_DUPLICATED)&&!z.delta&&z.type===Ur.pop&&o.go(-1,!1)}).catch(hs),Promise.reject()):(z.delta&&o.go(-z.delta,!1),ae(y,J,m))).then(y=>{y=y||N(J,m,!1),y&&(z.delta&&!Vt(y,Re.NAVIGATION_CANCELLED)?o.go(-z.delta,!1):z.type===Ur.pop&&Vt(y,Re.NAVIGATION_ABORTED|Re.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),Q(J,m,y)}).catch(hs)}))}let Me=os(),ce=os(),pe;function ae(L,G,z){At(L);const J=ce.list();return J.length?J.forEach(ue=>ue(L,G,z)):console.error(L),Promise.reject(L)}function ut(){return pe&&l.value!==nn?Promise.resolve():new Promise((L,G)=>{Me.add([L,G])})}function At(L){return pe||(pe=!L,le(),Me.list().forEach(([G,z])=>L?z(L):G()),Me.reset()),L}function De(L,G,z,J){const{scrollBehavior:ue}=e;if(!Pn||!ue)return Promise.resolve();const m=!z&&ov(Za(L.fullPath,0))||(J||!z)&&history.state&&history.state.scroll||null;return ei().then(()=>ue(L,G,m)).then(y=>y&&nv(y)).catch(y=>ae(y,L,G))}const Oe=L=>o.go(L);let Ct;const gt=new Set,Rt={currentRoute:l,listening:!0,addRoute:g,removeRoute:b,clearRoutes:t.clearRoutes,hasRoute:v,getRoutes:k,resolve:R,options:e,push:P,replace:F,go:Oe,back:()=>Oe(-1),forward:()=>Oe(1),beforeEach:r.add,beforeResolve:i.add,afterEach:a.add,onError:ce.add,isReady:ut,install(L){L.component("RouterLink",Dv),L.component("RouterView",Lv),L.config.globalProperties.$router=Rt,Object.defineProperty(L.config.globalProperties,"$route",{enumerable:!0,get:()=>u(l)}),Pn&&!Ct&&l.value===nn&&(Ct=!0,P(o.location).catch(J=>{}));const G={};for(const J in nn)Object.defineProperty(G,J,{get:()=>l.value[J],enumerable:!0});L.provide(Bo,Rt),L.provide(_i,Ll(G)),L.provide(Mr,l);const z=L.unmount;gt.add(L),L.unmount=function(){gt.delete(L),gt.size<1&&(d=nn,te&&te(),te=null,l.value=nn,Ct=!1,pe=!1),z()}}};function dt(L){return L.reduce((G,z)=>G.then(()=>j(z)),Promise.resolve())}return Rt}function Fv(){return _t(Bo)}function ku(e){return _t(_i)}const xi="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='256'%20height='256'%20viewBox='0%200%2067.733332%2067.733333'%20version='1.1'%20id='svg1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3cdefs%20id='defs1'%20/%3e%3cg%20id='layer1'%3e%3cg%20style='fill:%23040000;fill-opacity:1'%20id='g1'%20transform='matrix(0.06566918,0,0,0.06566918,17.061212,17.059932)'%3e%3cg%20id='g2'%3e%3ccircle%20style='fill:%231ad35d;fill-opacity:1;stroke-width:0.472667'%20id='path2'%20cx='33.866665'%20cy='33.866665'%20r='21.644735'%20transform='matrix(23.824636,0,0,23.824636,-550.95013,-550.93064)'%20/%3e%3cpath%20d='M%20480.6,111.5%20H%20406.5%20V%2035.6%20c%200,-10.7%20-8.3,-19.6%20-19,-20.4%20-104,-7.5%20-200.4,-3.7%20-263,0.8%20-10.7,0.8%20-19,9.8%20-19,20.5%20v%2074.9%20H%2031.4%20c%20-10.9,0%20-20.9,8.8%20-20.6,22%2040.6,166%20230.9,361.7%20230.9,361.7%209.8,10.8%2025.6,4%2028.6,0%200,0%20177.1,-165.8%20230.3,-359.4%201.6,-5.8%20-0.5,-24.3%20-20,-24.2%20z'%20id='path1'%20style='fill:%23040000;fill-opacity:1'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",fl=se(""),dr=se(),rs=se(!1),Ws=se(!1),zs=se("");function Ho(){function e(o){return t(o)||n(o)}function t(o){return!(o===""||o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")||o.includes("://open.spotify.com/show/")||o.includes("://open.spotify.com/artist/"))}function n(o){return o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")}function s(o){console.log("Searching for:",o),dr.value=[],rs.value=!0,fl.value=o,Ws.value=!1,zs.value="",be.search(o).then(r=>{console.log("Received Search Data:",r.data),r.status===200?(dr.value=r.data,rs.value=!1):(console.error("Error Searching:",r),rs.value=!1,Ws.value=!0,zs.value=r.toString())}).catch(r=>{console.error("Other Error Searching:",r.message),rs.value=!1,Ws.value=!0,zs.value=r.message})}return{searchTerm:fl,isSearching:rs,results:dr,error:Ws,errorValue:zs,searchFor:s,isValid:e,isValidSearch:t,isValidURL:n}}const yt={QUEUED:"In Queue",DOWNLOADING:"Downloading...",DOWNLOADED:"Done",ERROR:"Error"},Ke=se([]);class Su{constructor(t){this.song=t,this.web_status=yt.QUEUED,this.progress=0,this.message="",this.provider="",this.web_download_url=null,this.filename=null}setDownloading(){this.web_status=yt.DOWNLOADING}setDownloaded(){this.web_status=yt.DOWNLOADED}setError(){this.web_status=yt.ERROR}resetForRetry(){this.web_status=yt.QUEUED,this.progress=0,this.message="",this.provider="",this.web_download_url=null,this.filename=null}setWebURL(t){this.web_download_url=t}setFilename(t){this.filename=t}isQueued(){return this.web_status===yt.QUEUED}isDownloading(){return this.web_status===yt.DOWNLOADING}isDownloaded(){return this.web_status===yt.DOWNLOADED}isErrored(){return this.web_status===yt.ERROR}wsUpdate(t){this.progress=t.progress,this.message=t.message,t.provider&&(this.provider=t.provider)}}function $s(){function e(o){return Ke.value.findIndex(r=>r.song.song_id===o.song_id)}function t(o){let r=new Su(o);Ke.value.push(r)}function n(o){console.log("removing",o,o.song_id),Ke.value=Ke.value.filter(r=>r.song.song_id!==o.song_id),console.log(Ke.value)}function s(o){return e(o)===-1?null:Ke.value[e(o)]}return{appendSong:t,removeSong:n,getBySong:s,downloadQueue:Ke}}const Ue=$s();be.ws_onmessage(e=>{let t=JSON.parse(e.data),n=Ue.getBySong(t.song);!n&&(Ue.appendSong(t.song),n=Ue.getBySong(t.song),!n)||(t.status==="done"?(n.progress=100,t.filename&&(n.setWebURL(be.downloadFileURL(t.filename)),n.setFilename(t.filename)),n.setDownloaded()):t.status==="error"?(n.wsUpdate(t),n.setError()):t.status==="queued"?(n.web_status=yt.QUEUED,n.message=t.message||"",t.provider&&(n.provider=t.provider)):(n.wsUpdate(t),n.setDownloading()))});be.ws_onerror(e=>{console.log("websocket error:",e)});async function Mv(){try{const t=(await be.getQueue()).data||[];for(const n of t){if(Ke.value.some(o=>o.song.song_id===n.song.song_id))continue;const s=new Su(n.song);n.status==="done"?(s.setDownloaded(),n.filename&&(s.setWebURL(be.downloadFileURL(n.filename)),s.setFilename(n.filename)),s.progress=100):n.status==="error"?(s.setError(),s.message=n.message||""):n.status==="downloading"?(s.setDownloading(),s.progress=n.progress||0,s.message=n.message||"",s.provider=n.provider||""):(s.web_status=yt.QUEUED,s.message=n.message||"",s.provider=n.provider||""),Ke.value.push(s)}}catch(e){console.log("Failed to load queue from server:",e)}}Mv();function wi(){const e=se(!1),t=uu();async function n(){Ke.value=Ke.value.filter(h=>!h.isDownloaded());try{await be.clearCompletedQueue()}catch(h){console.log("Failed to clear completed queue on server:",h)}}function s(h){const g=(h||"").includes("://open.spotify.com/playlist/"),b=t.settings.value.generate_m3u!==!1;return e.value=!0,(g?n():Promise.resolve()).then(()=>be.open(h)).then(v=>{if(console.log("Received Response:",v),v.status!==200){console.log("Error:",v);return}const R=v.data;if(Array.isArray(R)){for(const D of R)Ue.getBySong(D)||Ue.appendSong(D);return be.downloadBatch({songs:R,playlist_url:g?h:"",generate_m3u:b}).catch(D=>{console.log("Batch submit failed:",D.message)})}else console.log("Opened Song:",R),r(R)}).catch(v=>{console.log("Other Error:",v.message)}).finally(()=>{e.value=!1})}function o(h){return console.log("Downloading",h),Ue.getBySong(h).setDownloading(),be.download(h).then(g=>{if(console.log("Received Response:",g),g.status===200){let b=g.data;return console.log("Download Complete:",b),Ue.getBySong(h).setWebURL(be.downloadFileURL(b)),Ue.getBySong(h).setFilename(b),Ue.getBySong(h).setDownloaded(),{song:h,filename:b}}else return console.log("Error:",g),Ue.getBySong(h).setError(),{song:h,filename:null}}).catch(g=>(console.log("Other Error:",g.message),Ue.getBySong(h).setError(),{song:h,filename:null}))}function r(h,g=!0){return Ue.appendSong(h),g?o(h):Promise.resolve({song:h,filename:null})}function i(h,g){const b={...h,youtube_id:g},k=Ue.getBySong(h);return k&&(k.song.youtube_id=g,k.setDownloading(),k.progress=0,k.message=""),be.download(b).then(v=>{const R=Ue.getBySong(b);if(v.status===200){const D=v.data;return R&&(R.setWebURL(be.downloadFileURL(D)),R.setFilename(D),R.setDownloaded()),{song:b,filename:D}}return R&&R.setError(),{song:b,filename:null}}).catch(v=>{console.error("retryWithAudio error:",v.message);const R=Ue.getBySong(b);return R&&R.setError(),{song:b,filename:null}})}function a(h){const g=String(h.song_id||h.url||"");Ue.removeSong(h),g&&be.removeQueueItem(g).catch(()=>{})}async function l(){await be.clearQueue(),Ke.value=[]}async function d(){await be.clearCompletedQueue(),Ke.value=Ke.value.filter(h=>!h.isDownloaded())}function c(h){const g=Ue.getBySong(h);return g&&g.resetForRetry(),o(h)}function p(){const h=Ke.value.filter(g=>g.isErrored());for(const g of h)c(g.song);return h.length}return{fromURL:s,download:o,queue:r,retry:c,retryWithAudio:i,retryAllFailed:p,remove:a,clearAll:l,clearCompleted:d,loading:e}}const Bv={class:"relative w-full"},Hv=["placeholder"],jv=["disabled"],Br={__name:"SearchInput",props:{compact:{type:Boolean,default:!1}},setup(e){const t=Ho(),n=wi(),{t:s,locale:o}=St(),r=["https://open.spotify.com/track/4vfN00PlILRXy5dcXHQE9M","drugs - EDEN","Não Gosto Eu Amo - Henrique e Juliano","Perfect - Ed Sheeran","Lightning Crashes - Live"],i=se(0),a=me(()=>(o.value,i.value===0?s("search.placeholder"):r[i.value-1])),l=setInterval(()=>{i.value=(i.value+1)%(r.length+1)},5e3);oi(()=>clearInterval(l));function d(c){!c||!c.trim()||(t.isValidURL(c)?(n.fromURL(c),it.push({name:"Download"})):t.isValidSearch(c)&&it.push({name:"Search",params:{query:c}}))}return(c,p)=>(A(),O("div",Bv,[xe(f("input",{type:"text",placeholder:a.value,class:Ae(["input-modern",e.compact?"h-11 text-sm":"h-14 text-base"]),"onUpdate:modelValue":p[0]||(p[0]=h=>u(t).searchTerm.value=h),onKeyup:p[1]||(p[1]=np(h=>d(u(t).searchTerm.value),["enter"]))},null,42,Hv),[[et,u(t).searchTerm.value]]),f("button",{class:Ae(["absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm transition hover:scale-105 active:scale-95 disabled:opacity-60",e.compact?"h-9 w-9":"h-11 w-11"]),disabled:u(n).loading.value,onClick:p[2]||(p[2]=h=>d(u(t).searchTerm.value))},[u(n).loading.value?(A(),O("span",{key:0,class:Ae(["loading loading-spinner",e.compact?"loading-xs":"loading-sm"])},null,2)):u(t).isValidURL(u(t).searchTerm.value)?(A(),ct(u(Y),{key:1,icon:"clarity:download-line",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},null,8,["class"])):(A(),O("svg",{key:2,xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"2",stroke:"currentColor",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},[...p[3]||(p[3]=[f("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"},null,-1)])],2))],10,jv)]))}},qv={class:"relative flex min-h-[calc(100dvh-4rem)] items-center justify-center px-6 pt-24 pb-16 overflow-hidden"},Vv={class:"relative w-full max-w-2xl text-center animate-slide-up"},Wv={class:"mt-3 flex items-center justify-center gap-2"},zv={class:"badge-soft"},Kv={class:"badge-neutral-soft"},Qv={class:"mx-auto mt-5 max-w-md text-balance text-base sm:text-lg text-base-content/70"},Gv={class:"mt-10"},Yv={class:"mt-4 flex flex-wrap items-center justify-center gap-2 text-xs text-base-content/60"},Jv={class:"pill bg-white/5 border border-white/10"},Xv={class:"pill bg-white/5 border border-white/10"},Zv={class:"pill bg-white/5 border border-white/10"},e_={__name:"Hero",setup(e){const{t}=St(),n=se(localStorage.getItem("version")||"2.7.0");return en(()=>{const s=localStorage.getItem("version");s&&(n.value=s)}),(s,o)=>(A(),O("section",qv,[o[4]||(o[4]=f("div",{"aria-hidden":"true",class:"pointer-events-none absolute inset-0 -z-10"},[f("div",{class:"absolute left-1/2 top-1/4 -translate-x-1/2 h-[420px] w-[420px] rounded-full bg-primary/25 blur-[120px]"}),f("div",{class:"absolute right-10 bottom-12 h-64 w-64 rounded-full bg-primary/10 blur-3xl"})],-1)),f("div",Vv,[o[3]||(o[3]=mf('

    Downtify

    ',2)),f("div",Wv,[f("span",zv,"v"+w(n.value),1),f("span",Kv,w(u(t)("hero.noAccount")),1)]),f("p",Qv,w(u(t)("hero.tagline")),1),f("div",Gv,[H(Br,{class:"w-full"}),f("div",Yv,[f("span",Jv,[o[0]||(o[0]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ce(" "+w(u(t)("hero.songs")),1)]),f("span",Xv,[o[1]||(o[1]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ce(" "+w(u(t)("hero.albums")),1)]),f("span",Zv,[o[2]||(o[2]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ce(" "+w(u(t)("hero.playlists")),1)])])])])]))}},t_={class:"absolute top-0 inset-x-0 z-30"},n_={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},s_={class:"ml-auto flex items-center gap-1 sm:gap-2"},o_=["title"],r_=["title"],i_=["title"],a_=["title"],l_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},c_=["title"],u_=["title"],d_={__name:"NavbarFront",setup(e){const t=bi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),n=$s(),{t:s}=St();return(o,r)=>(A(),O("header",t_,[f("div",n_,[r[5]||(r[5]=f("div",{class:"flex items-center gap-2"},[f("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"}),f("span",{class:"text-lg font-bold tracking-tight"},"Downtify")],-1)),f("div",s_,[f("button",{class:"icon-btn",onClick:r[0]||(r[0]=i=>u(it).push({name:"List"})),title:u(s)("nav.library")},[H(u(Y),{icon:"clarity:library-line",class:"h-5 w-5"})],8,o_),f("button",{class:"icon-btn",onClick:r[1]||(r[1]=i=>u(it).push({name:"Player"})),title:u(s)("nav.player")},[H(u(Y),{icon:"clarity:headphones-line",class:"h-5 w-5"})],8,r_),f("button",{class:"icon-btn",onClick:r[2]||(r[2]=i=>u(it).push({name:"Monitor"})),title:u(s)("nav.monitor")},[H(u(Y),{icon:"clarity:eye-line",class:"h-5 w-5"})],8,i_),f("button",{class:"icon-btn relative",onClick:r[3]||(r[3]=i=>u(it).push({name:"Download"})),title:u(s)("nav.queue")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"}),u(n).downloadQueue.value.length>0?(A(),O("span",l_,w(u(n).downloadQueue.value.length),1)):ie("",!0)],8,a_),f("button",{class:"icon-btn",onClick:r[4]||(r[4]=i=>u(t).setTheme(u(t).currentTheme.value==="dark"?"light":"dark")),title:u(t).currentTheme.value==="dark"?u(s)("nav.switchToLight"):u(s)("nav.switchToDark")},[u(t).currentTheme.value==="dark"?(A(),ct(u(Y),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(Y),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,c_),f("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(s)("nav.settings")},[H(u(Y),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,u_)])])]))}},Eu=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},f_={components:{NavbarFront:d_,Hero:e_},setup(){return en(()=>{window.scroll(0,0)}),{}}};function p_(e,t,n,s,o,r){const i=xr("NavbarFront"),a=xr("Hero");return A(),O("div",null,[H(i),H(a)])}const h_=Eu(f_,[["render",p_]]),m_={class:"sticky top-0 z-30 glass-nav"},g_={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},y_=["title"],b_={class:"hidden md:flex flex-1 justify-center"},v_={class:"ml-auto flex items-center gap-1 sm:gap-2"},__=["title"],x_=["title"],w_=["title"],k_=["title"],S_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},E_=["title"],A_=["title"],C_={class:"md:hidden px-4 pb-3"},Ls={__name:"Navbar",setup(e){const t=ku(),n=bi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),s=$s(),o=Ho(),{t:r}=St();return(i,a)=>(A(),O("header",m_,[f("div",g_,[f("button",{class:"flex items-center gap-2 shrink-0",onClick:a[0]||(a[0]=l=>u(it).push({name:"Home"})),title:u(r)("nav.home")},[...a[6]||(a[6]=[f("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"},null,-1),f("span",{class:"hidden sm:inline text-lg font-bold tracking-tight"}," Downtify ",-1)])],8,y_),f("div",b_,[H(Br,{class:"w-full max-w-md",compact:!0})]),f("div",v_,[f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="List"}]),onClick:a[1]||(a[1]=l=>u(it).push({name:"List"})),title:u(r)("nav.library")},[H(u(Y),{icon:"clarity:library-line",class:"h-5 w-5"})],10,__),f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Player"}]),onClick:a[2]||(a[2]=l=>u(it).push({name:"Player"})),title:u(r)("nav.player")},[H(u(Y),{icon:"clarity:headphones-line",class:"h-5 w-5"})],10,x_),f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Monitor"}]),onClick:a[3]||(a[3]=l=>u(it).push({name:"Monitor"})),title:u(r)("nav.monitor")},[H(u(Y),{icon:"clarity:eye-line",class:"h-5 w-5"})],10,w_),f("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(t).name==="Download"}]),onClick:a[4]||(a[4]=l=>u(t).name==="Download"?u(it).push({name:"Search",params:{query:u(o).searchTerm.value||" "}}):u(it).push({name:"Download"})),title:u(r)("nav.queue")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"}),u(s).downloadQueue.value.length>0?(A(),O("span",S_,w(u(s).downloadQueue.value.length),1)):ie("",!0)],10,k_),f("button",{class:"icon-btn",onClick:a[5]||(a[5]=l=>u(n).setTheme(u(n).currentTheme.value==="dark"?"light":"dark")),title:u(n).currentTheme.value==="dark"?u(r)("nav.switchToLight"):u(r)("nav.switchToDark")},[u(n).currentTheme.value==="dark"?(A(),ct(u(Y),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(Y),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,E_),f("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(r)("nav.settings")},[H(u(Y),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,A_)])]),f("div",C_,[H(Br,{compact:!0})])]))}},R_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},T_={class:"mb-8"},P_={class:"text-2xl font-bold tracking-tight"},O_={class:"mt-1 text-sm text-base-content/60"},D_={class:"text-base-content/90 font-medium"},N_={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},I_={key:1,class:"space-y-3"},$_={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},L_={class:"text-base-content/50 text-sm"},U_={class:"text-base-content/40 text-xs mt-1"},F_={key:3,class:"space-y-2"},M_={class:"track-cover"},B_=["src","alt"],H_={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},j_={class:"flex-1 min-w-0"},q_={class:"flex items-center gap-2 mb-0.5"},V_={class:"font-semibold truncate"},W_={key:0,class:"badge-error-soft shrink-0"},z_={class:"text-xs text-base-content/70 truncate"},K_={key:0,class:"text-xs text-base-content/40 truncate"},Q_={key:0,class:"text-base-content/30"},G_={class:"flex items-center gap-1 shrink-0"},Y_=["href","title"],J_=["title"],X_=["onClick","title"],Z_={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},e0=["disabled","title"],t0=["onClick"],n0=["disabled","title"],fr=5,s0={__name:"SearchList",props:["data","error"],emits:["download"],setup(e,{emit:t}){const n=e,s=t,o=Ho(),r=$s(),{t:i}=St(),a=se(1),l=me(()=>{var g;return Math.ceil((((g=n.data)==null?void 0:g.length)||0)/fr)}),d=me(()=>{if(!n.data)return[];const g=(a.value-1)*fr;return n.data.slice(g,g+fr)});Mt(()=>n.data,()=>{a.value=1});function c(g){return Array.isArray(g.artists)&&g.artists.length?g.artists.join(", "):g.artist||i("common.unknownArtist")}function p(g){const b=r.getBySong(g);return b?b.isErrored()?"error":(b.isDownloaded(),"queued"):"idle"}function h(g){s("download",g)}return(g,b)=>{var k;return A(),O("div",R_,[f("div",T_,[f("h1",P_,w(u(i)("search.title")),1),f("p",O_,[u(o).searchTerm.value?(A(),O(fe,{key:0},[Ce(w(u(i)("search.matchesFor"))+" ",1),f("span",D_,' "'+w(u(o).searchTerm.value)+'" ',1),!u(o).isSearching.value&&(((k=n.data)==null?void 0:k.length)||0)>0?(A(),O(fe,{key:0},[Ce(w(n.data.length===1?u(i)("search.songsCount",{count:n.data.length}):u(i)("search.songsCountPlural",{count:n.data.length})),1)],64)):ie("",!0)],64)):(A(),O(fe,{key:1},[Ce(w(u(i)("search.typeToBegin")),1)],64))])]),n.error?(A(),O("div",N_,[H(u(Y),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),f("span",null,w(u(o).errorValue.value?u(i)("search.errorWithDetail",{detail:u(o).errorValue.value}):u(i)("search.error")),1)])):ie("",!0),u(o).isSearching.value?(A(),O("div",I_,[(A(),O(fe,null,Ie(5,v=>f("div",{key:v,class:"skeleton h-24 rounded-2xl"})),64))])):!n.data||n.data.length===0?(A(),O("div",$_,[H(u(Y),{icon:"clarity:search-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",L_,w(u(i)("search.empty")),1),f("p",U_,w(u(i)("search.emptyHint")),1)])):(A(),O("ul",F_,[(A(!0),O(fe,null,Ie(d.value,(v,R)=>(A(),O("li",{key:v.song_id||R,class:"surface rounded-2xl track-card"},[f("div",M_,[v.cover_url?(A(),O("img",{key:0,src:v.cover_url,alt:v.name,class:"h-full w-full object-cover",loading:"lazy"},null,8,B_)):(A(),O("div",H_,[H(u(Y),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),f("div",j_,[f("div",q_,[f("span",V_,w(v.name),1),v.explicit?(A(),O("span",W_,"E")):ie("",!0)]),f("p",z_,w(c(v)),1),v.album_name?(A(),O("p",K_,[Ce(w(v.album_name)+" ",1),v.year?(A(),O("span",Q_," · "+w(v.year),1)):ie("",!0)])):ie("",!0)]),f("div",G_,[v.url?(A(),O("a",{key:0,class:"icon-btn",href:v.url,target:"_blank",rel:"noopener",title:u(i)("search.openOnSpotify")},[H(u(Y),{icon:"clarity:pop-out-line",class:"h-4 w-4"})],8,Y_)):ie("",!0),p(v)==="queued"?(A(),O("button",{key:1,class:"icon-btn text-primary cursor-default",title:u(i)("search.inQueue"),disabled:""},[H(u(Y),{icon:"clarity:check-circle-line",class:"h-5 w-5"})],8,J_)):(A(),O("button",{key:2,class:"icon-btn text-primary hover:bg-primary/10",onClick:D=>h(v),title:u(i)("search.download")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"})],8,X_))])]))),128))])),l.value>1?(A(),O("nav",Z_,[f("button",{class:"icon-btn",disabled:a.value===1,onClick:b[0]||(b[0]=v=>a.value--),title:u(i)("search.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,e0),(A(!0),O(fe,null,Ie(l.value,v=>(A(),O("button",{key:v,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",v===a.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:R=>a.value=v},w(v),11,t0))),128)),f("button",{class:"icon-btn",disabled:a.value===l.value,onClick:b[1]||(b[1]=v=>a.value++),title:u(i)("search.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,n0)])):ie("",!0)])}}},o0={class:"min-h-screen"},r0={__name:"Search",setup(e){en(()=>window.scroll(0,0));const t=ku(),n=Ho(),s=wi();return Mt(()=>t.params.query,()=>{t.params.query&&n.searchFor(t.params.query)},{deep:!0}),n.searchFor(t.params.query),(o,r)=>(A(),O("div",o0,[H(Ls),H(Qn),H(s0,{data:u(n).results.value,error:u(n).error.value,onDownload:r[0]||(r[0]=i=>u(s).queue(i))},null,8,["data","error"])]))}},i0={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},a0={class:"mb-6 flex flex-wrap items-end justify-between gap-4"},l0={class:"text-2xl font-bold tracking-tight"},c0={class:"mt-1 text-sm text-base-content/60"},u0={key:0,class:"flex flex-wrap gap-2 justify-end"},d0=["title"],f0={key:0,class:"mb-6 flex flex-wrap gap-2",role:"tablist"},p0=["onClick"],h0={key:0,class:"ml-1 opacity-80 tabular-nums"},m0={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},g0={class:"text-base-content/50 text-sm"},y0={class:"text-base-content/40 text-xs mt-1"},b0={key:2,class:"surface rounded-2xl p-8 text-center text-sm text-base-content/50"},v0={key:3,class:"space-y-3"},_0={class:"flex items-center gap-4"},x0={class:"track-cover h-16 w-16 sm:h-20 sm:w-20 shrink-0"},w0=["src","alt"],k0={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},S0={class:"flex-1 min-w-0"},E0={class:"flex items-center gap-2 mb-0.5 flex-wrap"},A0={class:"font-semibold truncate"},C0={key:0,class:"badge badge-xs badge-outline opacity-80 shrink-0"},R0={class:"text-xs text-base-content/60 truncate"},T0={key:0,class:"text-xs text-base-content/50 mt-0.5 line-clamp-2"},P0={key:1,class:"text-xs text-base-content/40 truncate"},O0={key:2,class:"text-xs text-error/80 mt-1 line-clamp-2"},D0={class:"flex items-center gap-2 shrink-0"},N0=["title","onClick"],I0=["onClick","title"],$0={class:"text-[10px] font-semibold"},L0=["onClick","title"],U0={key:0,class:"mt-3 pt-3 border-t border-white/10 flex flex-wrap gap-2 items-center"},F0=["onUpdate:modelValue","placeholder"],M0=["onClick"],B0=["onClick"],H0=["onClick"],j0={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},q0=["disabled","title"],V0=["onClick"],W0=["disabled","title"],pr=10,z0={__name:"DownloadList",setup(e){const t=$s(),n=wi(),{t:s}=St(),o=se("active"),r=se(1),i=Un({}),a=Un({});function l(M){return M.isErrored()?"failed":M.isDownloaded()?"done":M.isQueued()?"queued":"active"}const d=me(()=>t.downloadQueue.value.filter(M=>l(M)==="done").length),c=me(()=>t.downloadQueue.value.filter(M=>l(M)==="failed").length),p=me(()=>t.downloadQueue.value.filter(M=>l(M)==="active").length),h=me(()=>[{id:"active",label:s("queue.filterActive"),count:p.value},{id:"queued",label:s("queue.filterQueued"),count:t.downloadQueue.value.filter(M=>l(M)==="queued").length},{id:"all",label:s("queue.filterAll"),count:t.downloadQueue.value.length},{id:"done",label:s("queue.filterDone"),count:d.value},{id:"failed",label:s("queue.filterFailed"),count:c.value}]),g=me(()=>{const M=t.downloadQueue.value;switch(o.value){case"all":return M;case"active":return M.filter(Q=>l(Q)==="active");case"queued":return M.filter(Q=>l(Q)==="queued");case"done":return M.filter(Q=>l(Q)==="done");case"failed":return M.filter(Q=>l(Q)==="failed");default:return M}}),b=me(()=>Math.ceil(g.value.length/pr)),k=me(()=>{const M=(r.value-1)*pr;return g.value.slice(M,M+pr)});Mt(o,()=>{r.value=1}),Mt(()=>g.value.length,()=>{r.value>b.value&&b.value>0&&(r.value=b.value),r.value<1&&(r.value=1)}),Mt(()=>t.downloadQueue.value.length,M=>{M===0?o.value="active":o.value==="active"&&p.value===0&&c.value>0&&(o.value="failed")});async function v(){confirm(s("queue.clearAllPrompt"))&&await n.clearAll()}async function R(){await n.clearCompleted()}function D(){n.retryAllFailed()}function C(M){return Array.isArray(M.artists)&&M.artists.length?M.artists.join(", "):M.artist||s("common.unknownArtist")}function P(M){return M.isErrored()?"badge-error-soft":M.isDownloaded()||l(M)==="active"?"badge-soft":"badge-neutral-soft"}function F(M){const Q=l(M);return Q==="active"&&M.message?s("queue.statusActive"):M.isErrored()?s("queue.statusFailed"):M.isDownloaded()?s("queue.statusDone"):s(Q==="active"?"queue.statusActive":"queue.statusQueued")}function x(M){const Q=String(M.provider||"").trim();return Q==="youtube-music"?"YouTube Music":Q==="youtube"?"YouTube":Q==="slskd"?"slskd":""}function _(M){const Q=String(M||"").match(/(?:v=|youtu\.be\/)([A-Za-z0-9_-]{6,})/);return Q?Q[1]:null}function E(M){const Q=M.song.song_id,N=_(a[Q]);if(!N){alert(s("queue.invalidYouTubeURL"));return}i[Q]=!1,n.retryWithAudio(M.song,N)}function j(M){const Q=document.createElement("a");Q.href=M,Q.download=be.downloadSaveName(M),document.body.appendChild(Q),Q.click(),document.body.removeChild(Q)}return(M,Q)=>(A(),O("div",i0,[f("div",a0,[f("div",null,[f("h1",l0,w(u(s)("queue.title")),1),f("p",c0,w(u(s)("queue.subtitle")),1)]),u(t).downloadQueue.value.length>0?(A(),O("div",u0,[c.value>0?(A(),O("button",{key:0,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:D},[H(u(Y),{icon:"clarity:refresh-line",class:"h-4 w-4 mr-1.5"}),Ce(" "+w(u(s)("queue.retryAllFailed",{count:c.value})),1)])):ie("",!0),d.value>0?(A(),O("button",{key:1,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:R},w(u(s)("queue.clearCompleted",{count:d.value})),1)):ie("",!0),f("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 text-error/70 hover:text-error",onClick:v,title:u(s)("queue.clearAll")},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4 mr-1.5"}),Ce(" "+w(u(s)("queue.clearAll")),1)],8,d0)])):ie("",!0)]),u(t).downloadQueue.value.length>0?(A(),O("div",f0,[(A(!0),O(fe,null,Ie(h.value,N=>(A(),O("button",{key:N.id,type:"button",class:Ae(["btn btn-sm rounded-full border-white/10",o.value===N.id?"btn-primary":"bg-base-100/85 hover:bg-base-100"]),onClick:te=>o.value=N.id},[Ce(w(N.label)+" ",1),N.count>0?(A(),O("span",h0,"("+w(N.count)+")",1)):ie("",!0)],10,p0))),128))])):ie("",!0),u(t).downloadQueue.value.length===0?(A(),O("div",m0,[H(u(Y),{icon:"clarity:download-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",g0,w(u(s)("queue.empty")),1),f("p",y0,w(u(s)("queue.emptyHint")),1)])):g.value.length===0?(A(),O("div",b0,w(u(s)("queue.emptyFilter")),1)):(A(),O("ul",v0,[(A(!0),O(fe,null,Ie(k.value,(N,te)=>(A(),O("li",{key:N.song.song_id||N.song.url||te,class:"surface rounded-2xl p-3 sm:p-4"},[f("div",_0,[f("div",x0,[N.song.cover_url?(A(),O("img",{key:0,src:N.song.cover_url,alt:N.song.name,class:"h-full w-full object-cover"},null,8,w0)):(A(),O("div",k0,[H(u(Y),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),f("div",S0,[f("div",E0,[f("span",A0,w(N.song.name),1),x(N)?(A(),O("span",C0,w(x(N)),1)):ie("",!0),f("span",{class:Ae([P(N),"shrink-0"])},w(F(N)),3)]),f("p",R0,w(C(N.song)),1),l(N)==="active"&&N.message?(A(),O("p",T0,w(N.message),1)):ie("",!0),N.song.album_name?(A(),O("p",P0,w(N.song.album_name),1)):ie("",!0),N.isErrored()&&N.message?(A(),O("p",O0,w(N.message),1)):ie("",!0)]),f("div",D0,[N.isErrored()?(A(),O("button",{key:0,class:"icon-btn text-primary hover:bg-primary/10",title:u(s)("queue.retry"),onClick:le=>u(n).retry(N.song)},[H(u(Y),{icon:"clarity:refresh-line",class:"h-4 w-4"})],8,N0)):ie("",!0),N.isDownloaded()?(A(),O("a",{key:1,class:"icon-btn text-primary hover:bg-primary/10",href:"javascript:;",onClick:le=>j(N.web_download_url),title:u(s)("queue.saveToDevice")},[H(u(Y),{icon:"clarity:download-line",class:"h-4 w-4"})],8,I0)):l(N)==="active"?(A(),O("div",{key:2,class:"radial-progress text-primary",style:Ln(`--value:${Math.max(0,N.progress)}; --size:2.75rem; --thickness:3px`)},[f("span",$0,w(Math.round(N.progress))+"% ",1)],4)):ie("",!0),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",onClick:le=>u(n).remove(N.song),title:u(s)("queue.removeFromQueue")},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,L0)])]),N.isErrored()&&i[N.song.song_id]?(A(),O("div",U0,[xe(f("input",{"onUpdate:modelValue":le=>a[N.song.song_id]=le,type:"text",class:"input input-sm flex-1 min-w-[12rem] rounded-xl bg-base-100/80",placeholder:u(s)("queue.overridePlaceholder")},null,8,F0),[[et,a[N.song.song_id]]]),f("button",{class:"btn btn-sm btn-primary rounded-full",onClick:le=>E(N)},w(u(s)("queue.applyOverride")),9,M0),f("button",{class:"btn btn-sm btn-ghost rounded-full",onClick:le=>i[N.song.song_id]=!1},w(u(s)("common.cancel")),9,B0)])):N.isErrored()?(A(),O("button",{key:1,type:"button",class:"mt-2 text-xs text-primary/80 hover:text-primary",onClick:le=>i[N.song.song_id]=!0},w(u(s)("queue.forceAudio")),9,H0)):ie("",!0)]))),128))])),b.value>1?(A(),O("nav",j0,[f("button",{class:"icon-btn",disabled:r.value===1,onClick:Q[0]||(Q[0]=N=>r.value--),title:u(s)("common.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,q0),(A(!0),O(fe,null,Ie(b.value,N=>(A(),O("button",{key:N,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",N===r.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:te=>r.value=N},w(N),11,V0))),128)),f("button",{class:"icon-btn",disabled:r.value===b.value,onClick:Q[1]||(Q[1]=N=>r.value++),title:u(s)("common.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,W0)])):ie("",!0)]))}},K0={class:"min-h-screen"},Q0={__name:"Download",setup(e){return en(()=>window.scroll(0,0)),(t,n)=>(A(),O("div",K0,[H(Ls),H(Qn),H(z0)]))}},Au="downtify-player-volume",Ve=se([]),ot=se(-1),bo=se(!1),Us=se(0),un=se(0),ki=se(parseFloat(localStorage.getItem(Au)||"0.85")),$n=se(!1),Gn=se("off"),dn=se(!1);let we=null,bt=[],jo=0;function qo(){return we||(we=new Audio,we.preload="metadata",we.volume=ki.value,we.addEventListener("timeupdate",()=>{Us.value=we.currentTime}),we.addEventListener("loadedmetadata",()=>{un.value=isFinite(we.duration)?we.duration:0}),we.addEventListener("durationchange",()=>{un.value=isFinite(we.duration)?we.duration:0}),we.addEventListener("ended",sx),we.addEventListener("play",()=>{bo.value=!0}),we.addEventListener("pause",()=>{bo.value=!1}),we)}function Hr(e){const t=e.replace(/\.[^.]+$/,"");let n="",s=t;const o=t.indexOf(" - ");return o>0&&(n=t.slice(0,o).trim(),s=t.slice(o+3).trim()),{file:e,url:be.downloadFileURL(e),cover:be.coverFileURL(e),title:s,artist:n,album:""}}function Si(e){if(typeof e=="string")return Hr(e);const t=String((e==null?void 0:e.file)||""),n=Hr(t),s=String((e==null?void 0:e.title)||"").trim(),o=String((e==null?void 0:e.artist)||"").trim(),r=String((e==null?void 0:e.album)||"").trim();return{file:t,url:n.url,cover:n.cover,title:s||n.title,artist:o||n.artist,album:r||n.album}}function Fs(){const e=Ve.value.map((t,n)=>n);for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}bt=e,jo=ot.value>=0?Math.max(0,bt.indexOf(ot.value)):0}function G0(e,t={}){const n=(e||[]).map(s=>typeof s=="string"?Hr(s):Si(s));Ve.value=n,ot.value>=n.length&&(ot.value=-1),dn.value&&Fs(),typeof t.startIndex=="number"?Vn(t.startIndex):t.autoplay&&n.length>0&&ot.value<0&&Vn(0)}function Vn(e){if(e<0||e>=Ve.value.length)return;const t=qo();if(ot.value=e,dn.value){bt.length!==Ve.value.length&&Fs();const n=bt.indexOf(e);n>=0&&(jo=n)}t.src=Ve.value[e].url,t.currentTime=0,Us.value=0,t.play().catch(()=>{})}function Cu(){if(Ve.value.length===0)return;const e=qo();if(ot.value<0){Vn(0);return}e.src||(e.src=Ve.value[ot.value].url),e.play().catch(()=>{})}function Ei(){we&&we.pause()}function Y0(){bo.value?Ei():Cu()}function Vo(e){const t=qo(),n=un.value||0,s=Math.max(0,Math.min(n,e));t.currentTime=s,Us.value=s}function J0(e){un.value&&Vo(un.value*Math.max(0,Math.min(1,e)))}function X0(e){const t=Math.max(0,Math.min(1,e));ki.value=t,we&&(we.volume=t);try{localStorage.setItem(Au,String(t))}catch{}t>0&&$n.value&&($n.value=!1,we&&(we.muted=!1))}function Z0(){$n.value=!$n.value,we&&(we.muted=$n.value)}function ex(){if(Ve.value.length===0)return-1;if(dn.value){bt.length!==Ve.value.length&&Fs();const t=(jo+1)%bt.length;return bt[t]}const e=ot.value+1;return e>=Ve.value.length?Gn.value==="all"?0:-1:e}function tx(){if(Ve.value.length===0)return-1;if(dn.value){bt.length!==Ve.value.length&&Fs();const t=(jo-1+bt.length)%bt.length;return bt[t]}const e=ot.value-1;return e<0?Gn.value==="all"?Ve.value.length-1:0:e}function Ru(){const e=ex();if(e<0){Ei();return}Vn(e)}function nx(){if(qo().currentTime>3){Vo(0);return}const t=tx();t<0||Vn(t)}function sx(){if(Gn.value==="one"){Vo(0),we&&we.play().catch(()=>{});return}Ru()}function Tu(e){["off","all","one"].includes(e)&&(Gn.value=e)}function ox(){const e=["off","all","one"],t=e.indexOf(Gn.value);Tu(e[(t+1)%e.length])}function Pu(e){dn.value=!!e,dn.value&&Fs()}function rx(){Pu(!dn.value)}const ix=me(()=>ot.value>=0&&ot.valueun.value>0?Us.value/un.value*100:0);function pl(e){if(!isFinite(e)||e<0)return"0:00";const t=Math.floor(e),n=Math.floor(t/60),s=t%60;return`${n}:${s.toString().padStart(2,"0")}`}function Ou(){return{playlist:Ve,currentIndex:ot,currentTrack:ix,isPlaying:bo,currentTime:Us,duration:un,progressPct:ax,volume:ki,isMuted:$n,repeatMode:Gn,shuffle:dn,setPlaylist:G0,playAt:Vn,play:Cu,pause:Ei,toggle:Y0,seek:Vo,seekRatio:J0,setVolume:X0,toggleMute:Z0,next:Ru,prev:nx,setRepeat:Tu,cycleRepeat:ox,setShuffle:Pu,toggleShuffle:rx}}const lx={class:"min-h-screen"},cx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},ux={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},dx={class:"text-2xl font-bold tracking-tight"},fx={class:"mt-1 text-sm text-base-content/60"},px={class:"flex items-center gap-2"},hx=["title"],mx=["disabled"],gx={key:0,class:"loading loading-spinner loading-xs mr-2"},yx={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},bx={key:1,class:"space-y-3"},vx={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},_x={class:"text-base-content/50 text-sm"},xx={class:"text-base-content/40 text-xs mt-1"},wx={key:3,class:"space-y-2"},kx={class:"relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden"},Sx=["src","alt","onError"],Ex={class:"flex-1 min-w-0"},Ax={class:"text-sm font-medium truncate block"},Cx={key:0,class:"text-xs text-base-content/60 truncate"},Rx={class:"text-xs text-base-content/40"},Tx={key:0,class:"mr-2 text-primary/70"},Px={class:"flex items-center gap-1 shrink-0"},Ox=["onClick","title"],Dx=["href","download","title"],Nx=["disabled","onClick","title"],Ix={key:0,class:"loading loading-spinner loading-xs"},$x={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},Lx=["disabled","title"],Ux=["onClick"],Fx=["disabled","title"],Mx={key:5,class:"mt-6 text-xs text-base-content/40 text-center"},hr=10,Bx={__name:"Downloads",setup(e){const{t}=St(),n=Ou(),s=Fv(),o=se([]),r=se(!1),i=se(""),a=se({}),l=se({}),d=se(1),c=me(()=>Math.ceil(o.value.length/hr)),p=me(()=>{const P=(d.value-1)*hr;return o.value.slice(P,P+hr)});Mt(o,()=>{d.value=1});function h(P){return be.coverFileURL(P)}function g(P){l.value={...l.value,[P]:!0}}async function b(){r.value=!0,i.value="";try{const P=await be.listDownloads();o.value=(P.data||[]).map(Si)}catch{i.value=t("library.failedLoad")}finally{r.value=!1}}async function k(P){if(confirm(t("library.deletePrompt",{file:P}))){a.value={...a.value,[P]:!0};try{await be.deleteDownload(P),o.value=o.value.filter(F=>F!==P)}catch{i.value=t("library.failedDelete",{file:P})}finally{a.value={...a.value,[P]:!1}}}}function v(P){const F=P.lastIndexOf(".");return F>0?P.slice(F+1).toUpperCase():""}function R(P){const F=P.lastIndexOf("/");return F>=0?P.slice(0,F):""}function D(P){const F=o.value.findIndex(x=>x.file===P.file);F<0||(n.setPlaylist(o.value,{startIndex:F}),s.push({name:"Player"}))}function C(){o.value.length&&(n.setPlaylist(o.value,{startIndex:0}),s.push({name:"Player"}))}return en(b),(P,F)=>(A(),O("div",lx,[H(Ls),H(Qn),f("div",cx,[f("div",ux,[f("div",null,[f("h1",dx,w(u(t)("library.title")),1),f("p",fx,w(u(t)("library.subtitle")),1)]),f("div",px,[o.value.length>0?(A(),O("button",{key:0,class:"btn btn-primary btn-sm h-11 px-5 rounded-full",onClick:C,title:u(t)("library.play")},[H(u(Y),{icon:"clarity:play-line",class:"h-4 w-4 mr-1.5"}),Ce(" "+w(u(t)("library.play")),1)],8,hx)):ie("",!0),f("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:b,disabled:r.value},[r.value?(A(),O("span",gx)):(A(),ct(u(Y),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4 mr-2"})),Ce(" "+w(u(t)("common.refresh")),1)],8,mx)])]),i.value?(A(),O("div",yx,[H(u(Y),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),f("span",null,w(i.value),1)])):ie("",!0),r.value&&o.value.length===0?(A(),O("div",bx,[(A(),O(fe,null,Ie(4,x=>f("div",{key:x,class:"skeleton h-16 rounded-2xl"})),64))])):o.value.length===0?(A(),O("div",vx,[H(u(Y),{icon:"clarity:library-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",_x,w(u(t)("library.empty")),1),f("p",xx,w(u(t)("library.emptyHint")),1)])):(A(),O("ul",wx,[(A(!0),O(fe,null,Ie(p.value,x=>(A(),O("li",{key:x.file,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-3"},[f("div",kx,[l.value[x.file]?(A(),ct(u(Y),{key:1,icon:"clarity:music-note-line",class:"h-5 w-5"})):(A(),O("img",{key:0,src:h(x.file),alt:x.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:_=>g(x.file)},null,40,Sx))]),f("div",Ex,[f("span",Ax,w(x.title),1),x.artist?(A(),O("p",Cx,w(x.artist),1)):ie("",!0),f("span",Rx,[R(x.file)?(A(),O("span",Tx,[H(u(Y),{icon:"clarity:folder-line",class:"inline h-3 w-3 mr-0.5 align-text-top"}),Ce(w(R(x.file)),1)])):ie("",!0),Ce(" "+w(v(x.file)),1)])]),f("div",Px,[f("button",{class:"icon-btn text-primary hover:bg-primary/10",onClick:_=>D(x),title:u(t)("library.play")},[H(u(Y),{icon:"clarity:play-line",class:"h-4 w-4"})],8,Ox),f("a",{class:"icon-btn",href:u(be).downloadFileURL(x.file),download:u(be).downloadSaveName(x.file),title:u(t)("library.downloadToDevice")},[H(u(Y),{icon:"clarity:download-line",class:"h-4 w-4"})],8,Dx),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",disabled:a.value[x.file]===!0,onClick:_=>k(x.file),title:u(t)("library.deleteFile")},[a.value[x.file]===!0?(A(),O("span",Ix)):(A(),ct(u(Y),{key:1,icon:"clarity:trash-line",class:"h-4 w-4"}))],8,Nx)])]))),128))])),c.value>1?(A(),O("nav",$x,[f("button",{class:"icon-btn",disabled:d.value===1,onClick:F[0]||(F[0]=x=>d.value--),title:u(t)("common.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,Lx),(A(!0),O(fe,null,Ie(c.value,x=>(A(),O("button",{key:x,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",x===d.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:_=>d.value=x},w(x),11,Ux))),128)),f("button",{class:"icon-btn",disabled:d.value===c.value,onClick:F[1]||(F[1]=x=>d.value++),title:u(t)("common.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,Fx)])):ie("",!0),o.value.length>0?(A(),O("p",Mx,w(o.value.length===1?u(t)("library.countOne",{count:o.value.length}):u(t)("library.countMany",{count:o.value.length})),1)):ie("",!0)])]))}},Ms=Pe.create({baseURL:`${Ye.PROTOCOL}//${Ye.BACKEND}:${Ye.PORT}${Ye.BASEURL}`});function Hx(){return Ms.get("/api/monitor/playlists")}function jx(e,t=60){return Ms.post("/api/monitor/playlists",{url:e,interval_minutes:t})}function qx(e,t){return Ms.patch(`/api/monitor/playlists/${e}`,t)}function Vx(e){return Ms.delete(`/api/monitor/playlists/${e}`)}function Wx(e){return Ms.post(`/api/monitor/playlists/${e}/check`)}const yn={listMonitoredPlaylists:Hx,addMonitoredPlaylist:jx,updateMonitoredPlaylist:qx,deleteMonitoredPlaylist:Vx,checkMonitoredPlaylist:Wx},zx={class:"min-h-screen"},Kx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},Qx={class:"mb-8"},Gx={class:"text-2xl font-bold tracking-tight"},Yx={class:"mt-1 text-sm text-base-content/60"},Jx={class:"surface rounded-2xl p-5 mb-8"},Xx={class:"text-sm font-semibold uppercase tracking-wider text-base-content/50 mb-4"},Zx=["placeholder","disabled"],e1={class:"flex items-center gap-2 shrink-0"},t1=["disabled"],n1={value:15},s1={value:30},o1={value:60},r1={value:180},i1={value:360},a1={value:720},l1={value:1440},c1={value:10080},u1={value:20160},d1={value:43200},f1=["disabled"],p1={key:0,class:"loading loading-spinner loading-xs"},h1={key:1},m1={key:0,class:"mt-2 text-xs text-error"},g1={key:0,class:"space-y-3"},y1={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},b1={class:"text-base-content/50 text-sm"},v1={class:"text-base-content/40 text-xs mt-1"},_1={key:2,class:"space-y-3"},x1={class:"flex-1 min-w-0"},w1={class:"flex items-center gap-2 mb-1"},k1={class:"font-semibold truncate"},S1={class:"flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-base-content/50"},E1={key:0},A1={key:1,class:"italic"},C1={class:"flex items-center gap-2 shrink-0"},R1=["value","onChange"],T1={value:15},P1={value:30},O1={value:60},D1={value:180},N1={value:360},I1={value:720},$1={value:1440},L1={value:10080},U1={value:20160},F1={value:43200},M1=["title","onClick"],B1=["title","disabled","onClick"],H1={key:0,class:"loading loading-spinner loading-xs"},j1=["title","onClick"],q1={class:"mt-8 surface rounded-2xl p-4 flex gap-3 text-sm text-base-content/60"},V1={__name:"Monitor",setup(e){const{t}=St(),n=se([]),s=se(!1),o=se(!1),r=se(""),i=se(""),a=se(60),l=se({});async function d(){s.value=!0;try{const R=await yn.listMonitoredPlaylists();n.value=R.data||[]}finally{s.value=!1}}async function c(){var R,D;r.value="",o.value=!0;try{const C=await yn.addMonitoredPlaylist(i.value.trim(),a.value);n.value.unshift(C.data),i.value=""}catch(C){r.value=((D=(R=C==null?void 0:C.response)==null?void 0:R.data)==null?void 0:D.detail)||t("monitor.failedAdd")}finally{o.value=!1}}async function p(R){try{const D=await yn.updateMonitoredPlaylist(R.id,{enabled:!R.enabled});Object.assign(R,D.data)}catch{}}async function h(R,D){const C=parseInt(D.target.value,10);try{const P=await yn.updateMonitoredPlaylist(R.id,{interval_minutes:C});Object.assign(R,P.data)}catch{}}async function g(R){l.value={...l.value,[R.id]:!0};try{await yn.checkMonitoredPlaylist(R.id),setTimeout(async()=>{try{const D=await yn.listMonitoredPlaylists();n.value=D.data||[]}finally{l.value={...l.value,[R.id]:!1}}},3e3)}catch{l.value={...l.value,[R.id]:!1}}}async function b(R){if(confirm(t("monitor.deletePrompt",{name:R.name})))try{await yn.deleteMonitoredPlaylist(R.id),n.value=n.value.filter(D=>D.id!==R.id)}catch{}}function k(R){if(R<60)return`${R} ${t("monitor.minSuffix")}`;if(R<1440)return`${R/60} ${t("monitor.hourSuffix")}`;if(R<10080){const C=R/1440;return`${C} ${t(C===1?"monitor.daySuffix":"monitor.daysSuffix")}`}if(R<43200){const C=R/10080;return`${C} ${t(C===1?"monitor.weekSuffix":"monitor.weeksSuffix")}`}const D=Math.round(R/43200);return`${D} ${t(D===1?"monitor.monthSuffix":"monitor.monthsSuffix")}`}function v(R){try{const D=Date.now()-new Date(R).getTime(),C=Math.floor(D/6e4);if(C<1)return t("monitor.timeJustNow");if(C<60)return t("monitor.timeMinAgo",{n:C});const P=Math.floor(C/60);return P<24?t("monitor.timeHourAgo",{n:P}):t("monitor.timeDayAgo",{n:Math.floor(P/24)})}catch{return""}}return en(d),(R,D)=>(A(),O("div",zx,[H(Ls),H(Qn),f("div",Kx,[f("div",Qx,[f("h1",Gx,w(u(t)("monitor.title")),1),f("p",Yx,w(u(t)("monitor.subtitle")),1)]),f("div",Jx,[f("h2",Xx,w(u(t)("monitor.watchNew")),1),f("form",{onSubmit:ep(c,["prevent"]),class:"flex flex-col sm:flex-row gap-3"},[xe(f("input",{"onUpdate:modelValue":D[0]||(D[0]=C=>i.value=C),type:"text",placeholder:u(t)("monitor.urlPlaceholder"),class:"input-modern flex-1 h-11 text-sm",disabled:o.value},null,8,Zx),[[et,i.value]]),f("div",e1,[xe(f("select",{"onUpdate:modelValue":D[1]||(D[1]=C=>a.value=C),class:"select select-sm rounded-full border border-white/10 bg-base-100/85 focus:border-primary/60 h-11 px-3 text-sm",disabled:o.value},[f("option",n1,w(u(t)("monitor.every15")),1),f("option",s1,w(u(t)("monitor.every30")),1),f("option",o1,w(u(t)("monitor.every1h")),1),f("option",r1,w(u(t)("monitor.every3h")),1),f("option",i1,w(u(t)("monitor.every6h")),1),f("option",a1,w(u(t)("monitor.every12h")),1),f("option",l1,w(u(t)("monitor.every1d")),1),f("option",c1,w(u(t)("monitor.every1w")),1),f("option",u1,w(u(t)("monitor.every2w")),1),f("option",d1,w(u(t)("monitor.every1mo")),1)],8,t1),[[Xs,a.value]]),f("button",{type:"submit",class:"btn btn-primary btn-sm h-11 px-5 rounded-full",disabled:o.value||!i.value.trim()},[o.value?(A(),O("span",p1)):(A(),O("span",h1,w(u(t)("monitor.watch")),1))],8,f1)])],32),r.value?(A(),O("p",m1,w(r.value),1)):ie("",!0)]),s.value?(A(),O("div",g1,[(A(),O(fe,null,Ie(3,C=>f("div",{key:C,class:"skeleton h-24 rounded-2xl"})),64))])):n.value.length===0?(A(),O("div",y1,[H(u(Y),{icon:"clarity:music-note-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",b1,w(u(t)("monitor.empty")),1),f("p",v1,w(u(t)("monitor.emptyHint")),1)])):(A(),O("ul",_1,[(A(!0),O(fe,null,Ie(n.value,C=>(A(),O("li",{key:C.id,class:"surface rounded-2xl p-4 sm:p-5 flex flex-col sm:flex-row sm:items-center gap-4"},[f("div",x1,[f("div",w1,[f("span",k1,w(C.name),1),f("span",{class:Ae(["pill shrink-0",C.enabled?"badge-soft":"badge-neutral-soft"])},w(C.enabled?u(t)("monitor.active"):u(t)("monitor.paused")),3)]),f("div",S1,[f("span",null,[H(u(Y),{icon:"clarity:refresh-line",class:"inline h-3 w-3 mr-0.5"}),Ce(" "+w(u(t)("monitor.everyInterval",{interval:k(C.interval_minutes)})),1)]),f("span",null,[H(u(Y),{icon:"clarity:music-note-line",class:"inline h-3 w-3 mr-0.5"}),Ce(" "+w(C.last_track_count===1?u(t)("monitor.tracksOne",{count:C.last_track_count}):u(t)("monitor.tracksMany",{count:C.last_track_count})),1)]),C.last_checked?(A(),O("span",E1,[H(u(Y),{icon:"clarity:clock-line",class:"inline h-3 w-3 mr-0.5"}),Ce(" "+w(u(t)("monitor.checked",{when:v(C.last_checked)})),1)])):(A(),O("span",A1,w(u(t)("monitor.notChecked")),1))])]),f("div",C1,[f("select",{value:C.interval_minutes,onChange:P=>h(C,P),class:"select select-xs rounded-full border border-white/10 bg-base-100/60 text-xs focus:border-primary/60"},[f("option",T1,w(u(t)("monitor.short15")),1),f("option",P1,w(u(t)("monitor.short30")),1),f("option",O1,w(u(t)("monitor.short1h")),1),f("option",D1,w(u(t)("monitor.short3h")),1),f("option",N1,w(u(t)("monitor.short6h")),1),f("option",I1,w(u(t)("monitor.short12h")),1),f("option",$1,w(u(t)("monitor.short1d")),1),f("option",L1,w(u(t)("monitor.short1w")),1),f("option",U1,w(u(t)("monitor.short2w")),1),f("option",F1,w(u(t)("monitor.short1mo")),1)],40,R1),f("button",{class:"icon-btn",title:C.enabled?u(t)("monitor.pause"):u(t)("monitor.resume"),onClick:P=>p(C)},[H(u(Y),{icon:C.enabled?"clarity:pause-line":"clarity:play-line",class:"h-4 w-4"},null,8,["icon"])],8,M1),f("button",{class:"icon-btn",title:u(t)("monitor.checkNow"),disabled:l.value[C.id],onClick:P=>g(C)},[l.value[C.id]?(A(),O("span",H1)):(A(),ct(u(Y),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4"}))],8,B1),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",title:u(t)("monitor.stop"),onClick:P=>b(C)},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,j1)])]))),128))])),f("div",q1,[H(u(Y),{icon:"clarity:info-standard-line",class:"h-5 w-5 shrink-0 mt-0.5 text-primary/70"}),f("p",null,w(u(t)("monitor.info")),1)])])]))}},W1={class:"min-h-screen"},z1={class:"mx-auto max-w-5xl px-4 py-8 sm:px-6"},K1={class:"mb-8"},Q1={class:"text-2xl font-bold tracking-tight"},G1={class:"mt-1 text-sm text-base-content/60"},Y1={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},J1={class:"text-base-content/50 text-sm"},X1={class:"text-base-content/40 text-xs mt-1"},Z1={key:1,class:"space-y-3"},ew={key:2,class:"grid gap-6 lg:grid-cols-[1fr_360px]"},tw={class:"surface rounded-3xl p-6 sm:p-8 flex flex-col items-center text-center"},nw=["src","alt"],sw={key:2,class:"absolute bottom-3 right-3 equalizer h-5","aria-hidden":"true"},ow={class:"mt-6 w-full"},rw={class:"text-xl font-bold tracking-tight truncate"},iw={class:"text-sm text-base-content/60 truncate mt-0.5"},aw={class:"mt-6 w-full"},lw={class:"mt-2 flex items-center justify-between text-xs text-base-content/50 tabular-nums"},cw={class:"mt-5 flex items-center justify-center gap-3"},uw=["title"],dw=["title","disabled"],fw=["disabled","title"],pw=["title","disabled"],hw=["title"],mw={key:0,class:"absolute -bottom-0.5 -right-0.5 h-4 min-w-[1rem] px-1 rounded-full bg-primary text-primary-content text-[9px] font-bold flex items-center justify-center"},gw={class:"mt-6 w-full max-w-xs flex items-center gap-3"},yw=["title"],bw=["value","title"],vw={class:"surface rounded-3xl p-4 sm:p-5 lg:max-h-[640px] lg:overflow-y-auto"},_w={class:"flex items-center justify-between mb-3 px-1"},xw={class:"text-xs font-semibold uppercase tracking-wider text-base-content/50"},ww={class:"text-[11px] text-base-content/40"},kw={key:0,class:"space-y-1"},Sw=["onClick"],Ew=["src","alt","onError"],Aw={key:1,class:"relative equalizer h-3","aria-hidden":"true"},Cw={class:"flex-1 min-w-0"},Rw={class:"text-sm truncate font-medium"},Tw={class:"text-[11px] truncate text-base-content/50"},Pw={key:1,class:"text-center py-10"},Ow={class:"text-base-content/50 text-sm"},Dw={__name:"Player",setup(e){const{t}=St(),n=Ou(),s=se([]),o=se(!1),r=se(null),i=se({});let a=!1;function l(F){return be.coverFileURL(F)}function d(F){i.value={...i.value,[F]:!0}}async function c(){o.value=!0;try{const F=await be.listDownloads();s.value=(F.data||[]).map(Si),n.playlist.value.length===0&&s.value.length>0&&n.setPlaylist(s.value)}finally{o.value=!1}}function p(F){var x,_;n.playlist.value.length!==s.value.length||((x=n.playlist.value[F])==null?void 0:x.file)!==((_=s.value[F])==null?void 0:_.file)?n.setPlaylist(s.value,{startIndex:F}):n.playAt(F)}const h=me(()=>{const F=n.currentTrack.value;return F&&F.title?F.title:t("player.empty")}),g=me(()=>{const F=n.currentTrack.value;return F&&F.artist?F.artist:F?t("common.unknownArtist"):""}),b=me(()=>n.repeatMode.value==="one"?t("player.repeatOne"):n.repeatMode.value==="all"?t("player.repeatAll"):t("player.repeatOff"));function k(F){n.setVolume(parseFloat(F.target.value))}function v(F){const x=r.value;if(!x)return 0;const _=x.getBoundingClientRect(),E=(F.clientX||0)-_.left;return Math.max(0,Math.min(1,E/_.width))}function R(F){n.seekRatio(v(F))}function D(F){a=!0,n.seekRatio(v(F)),window.addEventListener("pointermove",C),window.addEventListener("pointerup",P,{once:!0})}function C(F){a&&n.seekRatio(v(F))}function P(){a=!1,window.removeEventListener("pointermove",C)}return en(()=>{window.scroll(0,0),c()}),ri(()=>{window.removeEventListener("pointermove",C)}),(F,x)=>(A(),O("div",W1,[H(Ls),H(Qn),f("div",z1,[f("div",K1,[f("h1",Q1,w(u(t)("player.title")),1),f("p",G1,w(u(t)("player.subtitle")),1)]),s.value.length===0&&!o.value?(A(),O("div",Y1,[H(u(Y),{icon:"clarity:headphones-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",J1,w(u(t)("player.empty")),1),f("p",X1,w(u(t)("player.emptyHint")),1)])):o.value&&!u(n).currentTrack.value?(A(),O("div",Z1,[...x[8]||(x[8]=[f("div",{class:"skeleton h-72 rounded-3xl"},null,-1),f("div",{class:"skeleton h-16 rounded-2xl"},null,-1),f("div",{class:"skeleton h-16 rounded-2xl"},null,-1)])])):(A(),O("div",ew,[f("section",tw,[f("div",{class:Ae(["relative h-56 w-56 sm:h-64 sm:w-64 rounded-3xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden shadow-glow",{"pulse-glow":u(n).isPlaying.value}])},[u(n).currentTrack.value&&u(n).currentTrack.value.cover&&!i.value[u(n).currentTrack.value.file]?(A(),O("img",{key:0,src:u(n).currentTrack.value.cover,alt:u(n).currentTrack.value.title,class:"absolute inset-0 h-full w-full object-cover",onError:x[0]||(x[0]=_=>d(u(n).currentTrack.value.file))},null,40,nw)):(A(),ct(u(Y),{key:1,icon:"clarity:music-note-line",class:"h-24 w-24"})),u(n).isPlaying.value?(A(),O("div",sw,[...x[9]||(x[9]=[f("span",null,null,-1),f("span",null,null,-1),f("span",null,null,-1)])])):ie("",!0)],2),f("div",ow,[f("p",rw,w(h.value),1),f("p",iw,w(g.value),1)]),f("div",aw,[f("div",{class:"relative h-2 rounded-full bg-white/10 overflow-hidden cursor-pointer group",ref_key:"progressBar",ref:r,onClick:R,onPointerdown:D},[f("div",{class:"h-full bg-primary transition-[width] duration-150",style:Ln(`width: ${u(n).progressPct.value}%`)},null,4),f("div",{class:"absolute top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded-full bg-primary shadow-glow-sm transition-all duration-150 opacity-0 group-hover:opacity-100",style:Ln(`left: calc(${u(n).progressPct.value}% - 7px)`)},null,4)],544),f("div",lw,[f("span",null,w(u(pl)(u(n).currentTime.value)),1),f("span",null,w(u(pl)(u(n).duration.value)),1)])]),f("div",cw,[f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(n).shuffle.value}]),onClick:x[1]||(x[1]=_=>u(n).toggleShuffle()),title:u(n).shuffle.value?u(t)("player.shuffleOn"):u(t)("player.shuffleOff")},[H(u(Y),{icon:"clarity:shuffle-line",class:"h-5 w-5"})],10,uw),f("button",{class:"icon-btn",onClick:x[2]||(x[2]=_=>u(n).prev()),title:u(t)("player.previous"),disabled:s.value.length===0},[H(u(Y),{icon:"clarity:step-forward-2-line",class:"h-5 w-5 -scale-x-100"})],8,dw),f("button",{class:"inline-flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm hover:scale-105 active:scale-95 transition disabled:opacity-50",onClick:x[3]||(x[3]=_=>u(n).toggle()),disabled:s.value.length===0,title:u(n).isPlaying.value?u(t)("player.pause"):u(t)("player.play")},[H(u(Y),{icon:u(n).isPlaying.value?"clarity:pause-solid":"clarity:play-solid",class:"h-6 w-6"},null,8,["icon"])],8,fw),f("button",{class:"icon-btn",onClick:x[4]||(x[4]=_=>u(n).next()),title:u(t)("player.next"),disabled:s.value.length===0},[H(u(Y),{icon:"clarity:step-forward-2-line",class:"h-5 w-5"})],8,pw),f("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(n).repeatMode.value!=="off"}]),onClick:x[5]||(x[5]=_=>u(n).cycleRepeat()),title:b.value},[H(u(Y),{icon:"clarity:refresh-line",class:"h-5 w-5"}),u(n).repeatMode.value==="one"?(A(),O("span",mw," 1 ")):ie("",!0)],10,hw)]),f("div",gw,[f("button",{class:"icon-btn",onClick:x[6]||(x[6]=_=>u(n).toggleMute()),title:u(n).isMuted.value?u(t)("player.unmute"):u(t)("player.mute")},[H(u(Y),{icon:u(n).isMuted.value||u(n).volume.value===0?"clarity:volume-mute-line":u(n).volume.value<.5?"clarity:volume-down-line":"clarity:volume-up-line",class:"h-5 w-5"},null,8,["icon"])],8,yw),f("input",{type:"range",min:"0",max:"1",step:"0.01",value:u(n).isMuted.value?0:u(n).volume.value,onInput:x[7]||(x[7]=_=>k(_)),class:"player-range flex-1",title:u(t)("player.volume")},null,40,bw)])]),f("aside",vw,[f("div",_w,[f("h2",xw,w(u(t)("player.queue")),1),f("span",ww,w(s.value.length===1?u(t)("player.countOne",{count:s.value.length}):u(t)("player.countMany",{count:s.value.length})),1)]),s.value.length>0?(A(),O("ul",kw,[(A(!0),O(fe,null,Ie(s.value,(_,E)=>(A(),O("li",{key:_.file,class:Ae(["rounded-xl px-2 py-2 flex items-center gap-3 cursor-pointer transition-colors",E===u(n).currentIndex.value?"bg-primary/10 text-primary":"hover:bg-white/5"]),onClick:j=>p(E)},[f("div",{class:Ae(["relative h-9 w-9 shrink-0 rounded-lg overflow-hidden flex items-center justify-center",E===u(n).currentIndex.value?"bg-primary/15":"bg-base-100/60"])},[i.value[_.file]?ie("",!0):(A(),O("img",{key:0,src:l(_.file),alt:_.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:j=>d(_.file)},null,40,Ew)),E===u(n).currentIndex.value&&u(n).isPlaying.value?(A(),O("span",Aw,[...x[10]||(x[10]=[f("span",null,null,-1),f("span",null,null,-1),f("span",null,null,-1)])])):i.value[_.file]?(A(),ct(u(Y),{key:2,icon:"clarity:music-note-line",class:"h-4 w-4 text-base-content/50"})):ie("",!0)],2),f("div",Cw,[f("p",Rw,w(_.title),1),f("p",Tw,w(_.artist||u(t)("common.unknownArtist")),1)])],10,Sw))),128))])):(A(),O("div",Pw,[f("p",Ow,w(u(t)("player.empty")),1)]))])]))])]))}},Nw=Eu(Dw,[["__scopeId","data-v-98956c70"]]),Iw=[{path:"/",name:"Home",component:h_},{path:"/search/:query",name:"Search",component:r0},{path:"/download",name:"Download",component:Q0},{path:"/list",name:"List",component:Bx},{path:"/monitor",name:"Monitor",component:V1},{path:"/player",name:"Player",component:Nw}],it=Uv({history:mv(Ye.BASEURL),routes:Iw}),Du=rp(Ob);Du.use(it);Du.mount("#app"); + */let fv=()=>location.protocol+"//"+location.host;function _u(e,t){const{pathname:n,search:s,hash:o}=t,r=e.indexOf("#");if(r>-1){let i=o.includes(e.slice(r))?e.slice(r).length:1,a=o.slice(i);return a[0]!=="/"&&(a="/"+a),Ja(a,"")}return Ja(n,e)+s+o}function pv(e,t,n,s){let o=[],r=[],i=null;const a=({state:h})=>{const g=_u(e,location),b=n.value,k=t.value;let v=0;if(h){if(n.value=g,t.value=h,i&&i===b){i=null;return}v=k?h.position-k.position:0}else s(g);o.forEach(R=>{R(n.value,b,{delta:v,type:Ur.pop,direction:v?v>0?cr.forward:cr.back:cr.unknown})})};function l(){i=n.value}function d(h){o.push(h);const g=()=>{const b=o.indexOf(h);b>-1&&o.splice(b,1)};return r.push(g),g}function c(){if(document.visibilityState==="hidden"){const{history:h}=window;if(!h.state)return;h.replaceState(ge({},h.state,{scroll:Mo()}),"")}}function p(){for(const h of r)h();r=[],window.removeEventListener("popstate",a),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",a),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:l,listen:d,destroy:p}}function nl(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Mo():null}}function hv(e){const{history:t,location:n}=window,s={value:_u(e,n)},o={value:t.state};o.value||r(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(l,d,c){const p=e.indexOf("#"),h=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+l:fv()+e+l;try{t[c?"replaceState":"pushState"](d,"",h),o.value=d}catch(g){console.error(g),n[c?"replace":"assign"](h)}}function i(l,d){r(l,ge({},t.state,nl(o.value.back,l,o.value.forward,!0),d,{position:o.value.position}),!0),s.value=l}function a(l,d){const c=ge({},o.value,t.state,{forward:l,scroll:Mo()});r(c.current,c,!0),r(l,ge({},nl(s.value,l,null),{position:c.position+1},d),!1),s.value=l}return{location:s,state:o,push:a,replace:i}}function mv(e){e=Xb(e);const t=hv(e),n=pv(e,t.state,t.location,t.replace);function s(r,i=!0){i||n.pauseListeners(),history.go(r)}const o=ge({location:"",base:e,go:s,createHref:ev.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let xn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Ne=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Ne||{});const gv={type:xn.Static,value:""},yv=/[a-zA-Z0-9_]/;function bv(e){if(!e)return[[]];if(e==="/")return[[gv]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${d}": ${g}`)}let n=Ne.Static,s=n;const o=[];let r;function i(){r&&o.push(r),r=[]}let a=0,l,d="",c="";function p(){d&&(n===Ne.Static?r.push({type:xn.Static,value:d}):n===Ne.Param||n===Ne.ParamRegExp||n===Ne.ParamRegExpEnd?(r.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),r.push({type:xn.Param,value:d,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),d="")}function h(){d+=l}for(;at.length?t.length===1&&t[0]===ze.Static+ze.Segment?1:-1:0}function xu(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const kv={strict:!1,end:!0,sensitive:!1};function Sv(e,t,n){const s=xv(bv(e.path),n),o=ge(s,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function Ev(e,t){const n=[],s=new Map;t=Ya(kv,t);function o(p){return s.get(p)}function r(p,h,g){const b=!g,k=il(p);k.aliasOf=g&&g.record;const v=Ya(t,p),R=[k];if("alias"in p){const P=typeof p.alias=="string"?[p.alias]:p.alias;for(const F of P)R.push(il(ge({},k,{components:g?g.record.components:k.components,path:F,aliasOf:g?g.record:k})))}let D,C;for(const P of R){const{path:F}=P;if(h&&F[0]!=="/"){const x=h.record.path,_=x[x.length-1]==="/"?"":"/";P.path=h.record.path+(F&&_+F)}if(D=Sv(P,h,v),g?g.alias.push(D):(C=C||D,C!==D&&C.alias.push(D),b&&p.name&&!al(D)&&i(p.name)),wu(D)&&l(D),k.children){const x=k.children;for(let _=0;_{i(C)}:hs}function i(p){if(bu(p)){const h=s.get(p);h&&(s.delete(p),n.splice(n.indexOf(h),1),h.children.forEach(i),h.alias.forEach(i))}else{const h=n.indexOf(p);h>-1&&(n.splice(h,1),p.record.name&&s.delete(p.record.name),p.children.forEach(i),p.alias.forEach(i))}}function a(){return n}function l(p){const h=Rv(p,n);n.splice(h,0,p),p.record.name&&!al(p)&&s.set(p.record.name,p)}function d(p,h){let g,b={},k,v;if("name"in p&&p.name){if(g=s.get(p.name),!g)throw qn(Re.MATCHER_NOT_FOUND,{location:p});v=g.record.name,b=ge(rl(h.params,g.keys.filter(C=>!C.optional).concat(g.parent?g.parent.keys.filter(C=>C.optional):[]).map(C=>C.name)),p.params&&rl(p.params,g.keys.map(C=>C.name))),k=g.stringify(b)}else if(p.path!=null)k=p.path,g=n.find(C=>C.re.test(k)),g&&(b=g.parse(k),v=g.record.name);else{if(g=h.name?s.get(h.name):n.find(C=>C.re.test(h.path)),!g)throw qn(Re.MATCHER_NOT_FOUND,{location:p,currentLocation:h});v=g.record.name,b=ge({},h.params,p.params),k=g.stringify(b)}const R=[];let D=g;for(;D;)R.unshift(D.record),D=D.parent;return{name:v,path:k,params:b,matched:R,meta:Cv(R)}}e.forEach(p=>r(p));function c(){n.length=0,s.clear()}return{addRoute:r,resolve:d,removeRoute:i,clearRoutes:c,getRoutes:a,getRecordMatcher:o}}function rl(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function il(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Av(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Av(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function al(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Cv(e){return e.reduce((t,n)=>ge(t,n.meta),{})}function Rv(e,t){let n=0,s=t.length;for(;n!==s;){const r=n+s>>1;xu(e,t[r])<0?s=r:n=r+1}const o=Tv(e);return o&&(s=t.lastIndexOf(o,s-1)),s}function Tv(e){let t=e;for(;t=t.parent;)if(wu(t)&&xu(e,t)===0)return t}function wu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function ll(e){const t=_t(Bo),n=_t(_i),s=me(()=>{const l=u(e.to);return t.resolve(l)}),o=me(()=>{const{matched:l}=s.value,{length:d}=l,c=l[d-1],p=n.matched;if(!c||!p.length)return-1;const h=p.findIndex(jn.bind(null,c));if(h>-1)return h;const g=cl(l[d-2]);return d>1&&cl(c)===g&&p[p.length-1].path!==g?p.findIndex(jn.bind(null,l[d-2])):h}),r=me(()=>o.value>-1&&Iv(n.params,s.value.params)),i=me(()=>o.value>-1&&o.value===n.matched.length-1&&yu(n.params,s.value.params));function a(l={}){if(Nv(l)){const d=t[u(e.replace)?"replace":"push"](u(e.to)).catch(hs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:me(()=>s.value.href),isActive:r,isExactActive:i,navigate:a}}function Pv(e){return e.length===1?e[0]:e}const Ov=si({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:ll,setup(e,{slots:t}){const n=Un(ll(e)),{options:s}=_t(Bo),o=me(()=>({[ul(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ul(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const r=t.default&&Pv(t.default(n));return e.custom?r:xs("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}}),Dv=Ov;function Nv(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Iv(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!kt(o)||o.length!==s.length||s.some((r,i)=>r.valueOf()!==o[i].valueOf()))return!1}return!0}function cl(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ul=(e,t,n)=>e??t??n,$v=si({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=_t(Mr),o=me(()=>e.route||s.value),r=_t(tl,0),i=me(()=>{let d=u(r);const{matched:c}=o.value;let p;for(;(p=c[d])&&!p.components;)d++;return d}),a=me(()=>o.value.matched[i.value]);Qs(tl,me(()=>i.value+1)),Qs(uv,a),Qs(Mr,o);const l=se();return Mt(()=>[l.value,a.value,e.name],([d,c,p],[h,g,b])=>{c&&(c.instances[p]=d,g&&g!==c&&d&&d===h&&(c.leaveGuards.size||(c.leaveGuards=g.leaveGuards),c.updateGuards.size||(c.updateGuards=g.updateGuards))),d&&c&&(!g||!jn(c,g)||!h)&&(c.enterCallbacks[p]||[]).forEach(k=>k(d))},{flush:"post"}),()=>{const d=o.value,c=e.name,p=a.value,h=p&&p.components[c];if(!h)return dl(n.default,{Component:h,route:d});const g=p.props[c],b=g?g===!0?d.params:typeof g=="function"?g(d):g:null,v=xs(h,ge({},b,t,{onVnodeUnmounted:R=>{R.component.isUnmounted&&(p.instances[c]=null)},ref:l}));return dl(n.default,{Component:v,route:d})||v}}});function dl(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Lv=$v;function Uv(e){const t=Ev(e.routes,e),n=e.parseQuery||lv,s=e.stringifyQuery||el,o=e.history,r=os(),i=os(),a=os(),l=fd(nn);let d=nn;Pn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=ar.bind(null,L=>""+L),p=ar.bind(null,Wb),h=ar.bind(null,As);function g(L,G){let z,J;return bu(L)?(z=t.getRecordMatcher(L),J=G):J=L,t.addRoute(J,z)}function b(L){const G=t.getRecordMatcher(L);G&&t.removeRoute(G)}function k(){return t.getRoutes().map(L=>L.record)}function v(L){return!!t.getRecordMatcher(L)}function R(L,G){if(G=ge({},G||l.value),typeof L=="string"){const S=lr(n,L,G.path),I=t.resolve({path:S.path},G),U=o.createHref(S.fullPath);return ge(S,I,{params:h(I.params),hash:As(S.hash),redirectedFrom:void 0,href:U})}let z;if(L.path!=null)z=ge({},L,{path:lr(n,L.path,G.path).path});else{const S=ge({},L.params);for(const I in S)S[I]==null&&delete S[I];z=ge({},L,{params:p(S)}),G.params=p(G.params)}const J=t.resolve(z,G),ue=L.hash||"";J.params=c(h(J.params));const m=Qb(s,ge({},L,{hash:jb(ue),path:J.path})),y=o.createHref(m);return ge({fullPath:m,hash:ue,query:s===el?cv(L.query):L.query||{}},J,{redirectedFrom:void 0,href:y})}function D(L){return typeof L=="string"?lr(n,L,l.value.path):ge({},L)}function C(L,G){if(d!==L)return qn(Re.NAVIGATION_CANCELLED,{from:G,to:L})}function P(L){return _(L)}function F(L){return P(ge(D(L),{replace:!0}))}function x(L,G){const z=L.matched[L.matched.length-1];if(z&&z.redirect){const{redirect:J}=z;let ue=typeof J=="function"?J(L,G):J;return typeof ue=="string"&&(ue=ue.includes("?")||ue.includes("#")?ue=D(ue):{path:ue},ue.params={}),ge({query:L.query,hash:L.hash,params:ue.path!=null?{}:L.params},ue)}}function _(L,G){const z=d=R(L),J=l.value,ue=L.state,m=L.force,y=L.replace===!0,S=x(z,J);if(S)return _(ge(D(S),{state:typeof S=="object"?ge({},ue,S.state):ue,force:m,replace:y}),G||z);const I=z;I.redirectedFrom=G;let U;return!m&&Gb(s,J,z)&&(U=qn(Re.NAVIGATION_DUPLICATED,{to:I,from:J}),De(J,J,!0,!1)),(U?Promise.resolve(U):M(I,J)).catch($=>Vt($)?Vt($,Re.NAVIGATION_GUARD_REDIRECT)?$:At($):ae($,I,J)).then($=>{if($){if(Vt($,Re.NAVIGATION_GUARD_REDIRECT))return _(ge({replace:y},D($.to),{state:typeof $.to=="object"?ge({},ue,$.to.state):ue,force:m}),G||I)}else $=N(I,J,!0,y,ue);return Q(I,J,$),$})}function E(L,G){const z=C(L,G);return z?Promise.reject(z):Promise.resolve()}function j(L){const G=gt.values().next().value;return G&&typeof G.runWithContext=="function"?G.runWithContext(L):L()}function M(L,G){let z;const[J,ue,m]=dv(L,G);z=ur(J.reverse(),"beforeRouteLeave",L,G);for(const S of J)S.leaveGuards.forEach(I=>{z.push(rn(I,L,G))});const y=E.bind(null,L,G);return z.push(y),dt(z).then(()=>{z=[];for(const S of r.list())z.push(rn(S,L,G));return z.push(y),dt(z)}).then(()=>{z=ur(ue,"beforeRouteUpdate",L,G);for(const S of ue)S.updateGuards.forEach(I=>{z.push(rn(I,L,G))});return z.push(y),dt(z)}).then(()=>{z=[];for(const S of m)if(S.beforeEnter)if(kt(S.beforeEnter))for(const I of S.beforeEnter)z.push(rn(I,L,G));else z.push(rn(S.beforeEnter,L,G));return z.push(y),dt(z)}).then(()=>(L.matched.forEach(S=>S.enterCallbacks={}),z=ur(m,"beforeRouteEnter",L,G,j),z.push(y),dt(z))).then(()=>{z=[];for(const S of i.list())z.push(rn(S,L,G));return z.push(y),dt(z)}).catch(S=>Vt(S,Re.NAVIGATION_CANCELLED)?S:Promise.reject(S))}function Q(L,G,z){a.list().forEach(J=>j(()=>J(L,G,z)))}function N(L,G,z,J,ue){const m=C(L,G);if(m)return m;const y=G===nn,S=Pn?history.state:{};z&&(J||y?o.replace(L.fullPath,ge({scroll:y&&S&&S.scroll},ue)):o.push(L.fullPath,ue)),l.value=L,De(L,G,z,y),At()}let te;function le(){te||(te=o.listen((L,G,z)=>{if(!Rt.listening)return;const J=R(L),ue=x(J,Rt.currentRoute.value);if(ue){_(ge(ue,{replace:!0,force:!0}),J).catch(hs);return}d=J;const m=l.value;Pn&&sv(Za(m.fullPath,z.delta),Mo()),M(J,m).catch(y=>Vt(y,Re.NAVIGATION_ABORTED|Re.NAVIGATION_CANCELLED)?y:Vt(y,Re.NAVIGATION_GUARD_REDIRECT)?(_(ge(D(y.to),{force:!0}),J).then(S=>{Vt(S,Re.NAVIGATION_ABORTED|Re.NAVIGATION_DUPLICATED)&&!z.delta&&z.type===Ur.pop&&o.go(-1,!1)}).catch(hs),Promise.reject()):(z.delta&&o.go(-z.delta,!1),ae(y,J,m))).then(y=>{y=y||N(J,m,!1),y&&(z.delta&&!Vt(y,Re.NAVIGATION_CANCELLED)?o.go(-z.delta,!1):z.type===Ur.pop&&Vt(y,Re.NAVIGATION_ABORTED|Re.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),Q(J,m,y)}).catch(hs)}))}let Me=os(),ce=os(),pe;function ae(L,G,z){At(L);const J=ce.list();return J.length?J.forEach(ue=>ue(L,G,z)):console.error(L),Promise.reject(L)}function ut(){return pe&&l.value!==nn?Promise.resolve():new Promise((L,G)=>{Me.add([L,G])})}function At(L){return pe||(pe=!L,le(),Me.list().forEach(([G,z])=>L?z(L):G()),Me.reset()),L}function De(L,G,z,J){const{scrollBehavior:ue}=e;if(!Pn||!ue)return Promise.resolve();const m=!z&&ov(Za(L.fullPath,0))||(J||!z)&&history.state&&history.state.scroll||null;return ei().then(()=>ue(L,G,m)).then(y=>y&&nv(y)).catch(y=>ae(y,L,G))}const Oe=L=>o.go(L);let Ct;const gt=new Set,Rt={currentRoute:l,listening:!0,addRoute:g,removeRoute:b,clearRoutes:t.clearRoutes,hasRoute:v,getRoutes:k,resolve:R,options:e,push:P,replace:F,go:Oe,back:()=>Oe(-1),forward:()=>Oe(1),beforeEach:r.add,beforeResolve:i.add,afterEach:a.add,onError:ce.add,isReady:ut,install(L){L.component("RouterLink",Dv),L.component("RouterView",Lv),L.config.globalProperties.$router=Rt,Object.defineProperty(L.config.globalProperties,"$route",{enumerable:!0,get:()=>u(l)}),Pn&&!Ct&&l.value===nn&&(Ct=!0,P(o.location).catch(J=>{}));const G={};for(const J in nn)Object.defineProperty(G,J,{get:()=>l.value[J],enumerable:!0});L.provide(Bo,Rt),L.provide(_i,Ll(G)),L.provide(Mr,l);const z=L.unmount;gt.add(L),L.unmount=function(){gt.delete(L),gt.size<1&&(d=nn,te&&te(),te=null,l.value=nn,Ct=!1,pe=!1),z()}}};function dt(L){return L.reduce((G,z)=>G.then(()=>j(z)),Promise.resolve())}return Rt}function Fv(){return _t(Bo)}function ku(e){return _t(_i)}const xi="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='256'%20height='256'%20viewBox='0%200%2067.733332%2067.733333'%20version='1.1'%20id='svg1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3cdefs%20id='defs1'%20/%3e%3cg%20id='layer1'%3e%3cg%20style='fill:%23040000;fill-opacity:1'%20id='g1'%20transform='matrix(0.06566918,0,0,0.06566918,17.061212,17.059932)'%3e%3cg%20id='g2'%3e%3ccircle%20style='fill:%231ad35d;fill-opacity:1;stroke-width:0.472667'%20id='path2'%20cx='33.866665'%20cy='33.866665'%20r='21.644735'%20transform='matrix(23.824636,0,0,23.824636,-550.95013,-550.93064)'%20/%3e%3cpath%20d='M%20480.6,111.5%20H%20406.5%20V%2035.6%20c%200,-10.7%20-8.3,-19.6%20-19,-20.4%20-104,-7.5%20-200.4,-3.7%20-263,0.8%20-10.7,0.8%20-19,9.8%20-19,20.5%20v%2074.9%20H%2031.4%20c%20-10.9,0%20-20.9,8.8%20-20.6,22%2040.6,166%20230.9,361.7%20230.9,361.7%209.8,10.8%2025.6,4%2028.6,0%200,0%20177.1,-165.8%20230.3,-359.4%201.6,-5.8%20-0.5,-24.3%20-20,-24.2%20z'%20id='path1'%20style='fill:%23040000;fill-opacity:1'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",fl=se(""),dr=se(),rs=se(!1),Ws=se(!1),zs=se("");function Ho(){function e(o){return t(o)||n(o)}function t(o){return!(o===""||o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")||o.includes("://open.spotify.com/show/")||o.includes("://open.spotify.com/artist/"))}function n(o){return o.includes("://open.spotify.com/track/")||o.includes("://open.spotify.com/album/")||o.includes("://open.spotify.com/playlist/")}function s(o){console.log("Searching for:",o),dr.value=[],rs.value=!0,fl.value=o,Ws.value=!1,zs.value="",be.search(o).then(r=>{console.log("Received Search Data:",r.data),r.status===200?(dr.value=r.data,rs.value=!1):(console.error("Error Searching:",r),rs.value=!1,Ws.value=!0,zs.value=r.toString())}).catch(r=>{console.error("Other Error Searching:",r.message),rs.value=!1,Ws.value=!0,zs.value=r.message})}return{searchTerm:fl,isSearching:rs,results:dr,error:Ws,errorValue:zs,searchFor:s,isValid:e,isValidSearch:t,isValidURL:n}}const yt={QUEUED:"In Queue",DOWNLOADING:"Downloading...",DOWNLOADED:"Done",ERROR:"Error"},Ke=se([]);class Su{constructor(t){this.song=t,this.web_status=yt.QUEUED,this.progress=0,this.message="",this.provider="",this.web_download_url=null,this.filename=null}setDownloading(){this.web_status=yt.DOWNLOADING}setDownloaded(){this.web_status=yt.DOWNLOADED}setError(){this.web_status=yt.ERROR}resetForRetry(){this.web_status=yt.QUEUED,this.progress=0,this.message="",this.provider="",this.web_download_url=null,this.filename=null}setWebURL(t){this.web_download_url=t}setFilename(t){this.filename=t}isQueued(){return this.web_status===yt.QUEUED}isDownloading(){return this.web_status===yt.DOWNLOADING}isDownloaded(){return this.web_status===yt.DOWNLOADED}isErrored(){return this.web_status===yt.ERROR}wsUpdate(t){this.progress=t.progress,this.message=t.message,t.provider&&(this.provider=t.provider)}}function $s(){function e(o){return Ke.value.findIndex(r=>r.song.song_id===o.song_id)}function t(o){let r=new Su(o);Ke.value.push(r)}function n(o){console.log("removing",o,o.song_id),Ke.value=Ke.value.filter(r=>r.song.song_id!==o.song_id),console.log(Ke.value)}function s(o){return e(o)===-1?null:Ke.value[e(o)]}return{appendSong:t,removeSong:n,getBySong:s,downloadQueue:Ke}}const Ue=$s();be.ws_onmessage(e=>{let t=JSON.parse(e.data),n=Ue.getBySong(t.song);!n&&(Ue.appendSong(t.song),n=Ue.getBySong(t.song),!n)||(t.status==="done"?(n.progress=100,t.filename&&(n.setWebURL(be.downloadFileURL(t.filename)),n.setFilename(t.filename)),n.setDownloaded()):t.status==="error"?(n.wsUpdate(t),n.setError()):t.status==="queued"?(n.web_status=yt.QUEUED,n.message=t.message||"",t.provider&&(n.provider=t.provider)):(n.wsUpdate(t),n.setDownloading()))});be.ws_onerror(e=>{console.log("websocket error:",e)});async function Mv(){try{const t=(await be.getQueue()).data||[];for(const n of t){if(Ke.value.some(o=>o.song.song_id===n.song.song_id))continue;const s=new Su(n.song);n.status==="done"?(s.setDownloaded(),n.filename&&(s.setWebURL(be.downloadFileURL(n.filename)),s.setFilename(n.filename)),s.progress=100):n.status==="error"?(s.setError(),s.message=n.message||""):n.status==="downloading"?(s.setDownloading(),s.progress=n.progress||0,s.message=n.message||"",s.provider=n.provider||""):(s.web_status=yt.QUEUED,s.message=n.message||"",s.provider=n.provider||""),Ke.value.push(s)}}catch(e){console.log("Failed to load queue from server:",e)}}Mv();function wi(){const e=se(!1),t=uu();async function n(){Ke.value=Ke.value.filter(h=>!h.isDownloaded());try{await be.clearCompletedQueue()}catch(h){console.log("Failed to clear completed queue on server:",h)}}function s(h){const g=(h||"").includes("://open.spotify.com/playlist/"),b=t.settings.value.generate_m3u!==!1;return e.value=!0,(g?n():Promise.resolve()).then(()=>be.open(h)).then(v=>{if(console.log("Received Response:",v),v.status!==200){console.log("Error:",v);return}const R=v.data;if(Array.isArray(R)){for(const D of R)Ue.getBySong(D)||Ue.appendSong(D);return be.downloadBatch({songs:R,playlist_url:g?h:"",generate_m3u:b}).catch(D=>{console.log("Batch submit failed:",D.message)})}else console.log("Opened Song:",R),r(R)}).catch(v=>{console.log("Other Error:",v.message)}).finally(()=>{e.value=!1})}function o(h){return console.log("Downloading",h),Ue.getBySong(h).setDownloading(),be.download(h).then(g=>{if(console.log("Received Response:",g),g.status===200){let b=g.data;return console.log("Download Complete:",b),Ue.getBySong(h).setWebURL(be.downloadFileURL(b)),Ue.getBySong(h).setFilename(b),Ue.getBySong(h).setDownloaded(),{song:h,filename:b}}else return console.log("Error:",g),Ue.getBySong(h).setError(),{song:h,filename:null}}).catch(g=>(console.log("Other Error:",g.message),Ue.getBySong(h).setError(),{song:h,filename:null}))}function r(h,g=!0){return Ue.appendSong(h),g?o(h):Promise.resolve({song:h,filename:null})}function i(h,g){const b={...h,youtube_id:g},k=Ue.getBySong(h);return k&&(k.song.youtube_id=g,k.setDownloading(),k.progress=0,k.message=""),be.download(b).then(v=>{const R=Ue.getBySong(b);if(v.status===200){const D=v.data;return R&&(R.setWebURL(be.downloadFileURL(D)),R.setFilename(D),R.setDownloaded()),{song:b,filename:D}}return R&&R.setError(),{song:b,filename:null}}).catch(v=>{console.error("retryWithAudio error:",v.message);const R=Ue.getBySong(b);return R&&R.setError(),{song:b,filename:null}})}function a(h){const g=String(h.song_id||h.url||"");Ue.removeSong(h),g&&be.removeQueueItem(g).catch(()=>{})}async function l(){await be.clearQueue(),Ke.value=[]}async function d(){await be.clearCompletedQueue(),Ke.value=Ke.value.filter(h=>!h.isDownloaded())}function c(h){const g=Ue.getBySong(h);return g&&g.resetForRetry(),o(h)}function p(){const h=Ke.value.filter(g=>g.isErrored());for(const g of h)c(g.song);return h.length}return{fromURL:s,download:o,queue:r,retry:c,retryWithAudio:i,retryAllFailed:p,remove:a,clearAll:l,clearCompleted:d,loading:e}}const Bv={class:"relative w-full"},Hv=["placeholder"],jv=["disabled"],Br={__name:"SearchInput",props:{compact:{type:Boolean,default:!1}},setup(e){const t=Ho(),n=wi(),{t:s,locale:o}=St(),r=["https://open.spotify.com/track/4vfN00PlILRXy5dcXHQE9M","drugs - EDEN","Não Gosto Eu Amo - Henrique e Juliano","Perfect - Ed Sheeran","Lightning Crashes - Live"],i=se(0),a=me(()=>(o.value,i.value===0?s("search.placeholder"):r[i.value-1])),l=setInterval(()=>{i.value=(i.value+1)%(r.length+1)},5e3);oi(()=>clearInterval(l));function d(c){!c||!c.trim()||(t.isValidURL(c)?(n.fromURL(c),it.push({name:"Download"})):t.isValidSearch(c)&&it.push({name:"Search",params:{query:c}}))}return(c,p)=>(A(),O("div",Bv,[xe(f("input",{type:"text",placeholder:a.value,class:Ae(["input-modern",e.compact?"h-11 text-sm":"h-14 text-base"]),"onUpdate:modelValue":p[0]||(p[0]=h=>u(t).searchTerm.value=h),onKeyup:p[1]||(p[1]=np(h=>d(u(t).searchTerm.value),["enter"]))},null,42,Hv),[[et,u(t).searchTerm.value]]),f("button",{class:Ae(["absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm transition hover:scale-105 active:scale-95 disabled:opacity-60",e.compact?"h-9 w-9":"h-11 w-11"]),disabled:u(n).loading.value,onClick:p[2]||(p[2]=h=>d(u(t).searchTerm.value))},[u(n).loading.value?(A(),O("span",{key:0,class:Ae(["loading loading-spinner",e.compact?"loading-xs":"loading-sm"])},null,2)):u(t).isValidURL(u(t).searchTerm.value)?(A(),ct(u(Y),{key:1,icon:"clarity:download-line",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},null,8,["class"])):(A(),O("svg",{key:2,xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"2",stroke:"currentColor",class:Ae(e.compact?"h-4 w-4":"h-5 w-5")},[...p[3]||(p[3]=[f("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"},null,-1)])],2))],10,jv)]))}},qv={class:"relative flex min-h-[calc(100dvh-4rem)] items-center justify-center px-6 pt-24 pb-16 overflow-hidden"},Vv={class:"relative w-full max-w-2xl text-center animate-slide-up"},Wv={class:"mt-3 flex items-center justify-center gap-2"},zv={class:"badge-soft"},Kv={class:"badge-neutral-soft"},Qv={class:"mx-auto mt-5 max-w-md text-balance text-base sm:text-lg text-base-content/70"},Gv={class:"mt-10"},Yv={class:"mt-4 flex flex-wrap items-center justify-center gap-2 text-xs text-base-content/60"},Jv={class:"pill bg-white/5 border border-white/10"},Xv={class:"pill bg-white/5 border border-white/10"},Zv={class:"pill bg-white/5 border border-white/10"},e_={__name:"Hero",setup(e){const{t}=St(),n=se(localStorage.getItem("version")||"2.8.0");return en(()=>{const s=localStorage.getItem("version");s&&(n.value=s)}),(s,o)=>(A(),O("section",qv,[o[4]||(o[4]=f("div",{"aria-hidden":"true",class:"pointer-events-none absolute inset-0 -z-10"},[f("div",{class:"absolute left-1/2 top-1/4 -translate-x-1/2 h-[420px] w-[420px] rounded-full bg-primary/25 blur-[120px]"}),f("div",{class:"absolute right-10 bottom-12 h-64 w-64 rounded-full bg-primary/10 blur-3xl"})],-1)),f("div",Vv,[o[3]||(o[3]=mf('

    Downtify

    ',2)),f("div",Wv,[f("span",zv,"v"+w(n.value),1),f("span",Kv,w(u(t)("hero.noAccount")),1)]),f("p",Qv,w(u(t)("hero.tagline")),1),f("div",Gv,[H(Br,{class:"w-full"}),f("div",Yv,[f("span",Jv,[o[0]||(o[0]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ce(" "+w(u(t)("hero.songs")),1)]),f("span",Xv,[o[1]||(o[1]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ce(" "+w(u(t)("hero.albums")),1)]),f("span",Zv,[o[2]||(o[2]=f("span",{class:"h-1.5 w-1.5 rounded-full bg-primary"},null,-1)),Ce(" "+w(u(t)("hero.playlists")),1)])])])])]))}},t_={class:"absolute top-0 inset-x-0 z-30"},n_={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},s_={class:"ml-auto flex items-center gap-1 sm:gap-2"},o_=["title"],r_=["title"],i_=["title"],a_=["title"],l_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},c_=["title"],u_=["title"],d_={__name:"NavbarFront",setup(e){const t=bi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),n=$s(),{t:s}=St();return(o,r)=>(A(),O("header",t_,[f("div",n_,[r[5]||(r[5]=f("div",{class:"flex items-center gap-2"},[f("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"}),f("span",{class:"text-lg font-bold tracking-tight"},"Downtify")],-1)),f("div",s_,[f("button",{class:"icon-btn",onClick:r[0]||(r[0]=i=>u(it).push({name:"List"})),title:u(s)("nav.library")},[H(u(Y),{icon:"clarity:library-line",class:"h-5 w-5"})],8,o_),f("button",{class:"icon-btn",onClick:r[1]||(r[1]=i=>u(it).push({name:"Player"})),title:u(s)("nav.player")},[H(u(Y),{icon:"clarity:headphones-line",class:"h-5 w-5"})],8,r_),f("button",{class:"icon-btn",onClick:r[2]||(r[2]=i=>u(it).push({name:"Monitor"})),title:u(s)("nav.monitor")},[H(u(Y),{icon:"clarity:eye-line",class:"h-5 w-5"})],8,i_),f("button",{class:"icon-btn relative",onClick:r[3]||(r[3]=i=>u(it).push({name:"Download"})),title:u(s)("nav.queue")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"}),u(n).downloadQueue.value.length>0?(A(),O("span",l_,w(u(n).downloadQueue.value.length),1)):ie("",!0)],8,a_),f("button",{class:"icon-btn",onClick:r[4]||(r[4]=i=>u(t).setTheme(u(t).currentTheme.value==="dark"?"light":"dark")),title:u(t).currentTheme.value==="dark"?u(s)("nav.switchToLight"):u(s)("nav.switchToDark")},[u(t).currentTheme.value==="dark"?(A(),ct(u(Y),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(Y),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,c_),f("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(s)("nav.settings")},[H(u(Y),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,u_)])])]))}},Eu=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},f_={components:{NavbarFront:d_,Hero:e_},setup(){return en(()=>{window.scroll(0,0)}),{}}};function p_(e,t,n,s,o,r){const i=xr("NavbarFront"),a=xr("Hero");return A(),O("div",null,[H(i),H(a)])}const h_=Eu(f_,[["render",p_]]),m_={class:"sticky top-0 z-30 glass-nav"},g_={class:"mx-auto flex h-16 w-full max-w-6xl items-center gap-3 px-4 sm:px-6"},y_=["title"],b_={class:"hidden md:flex flex-1 justify-center"},v_={class:"ml-auto flex items-center gap-1 sm:gap-2"},__=["title"],x_=["title"],w_=["title"],k_=["title"],S_={key:0,class:"absolute -top-1 -right-1 inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-content shadow-glow-sm"},E_=["title"],A_=["title"],C_={class:"md:hidden px-4 pb-3"},Ls={__name:"Navbar",setup(e){const t=ku(),n=bi({newLightAlias:"downtify-light",newDarkAlias:"downtify-dark"}),s=$s(),o=Ho(),{t:r}=St();return(i,a)=>(A(),O("header",m_,[f("div",g_,[f("button",{class:"flex items-center gap-2 shrink-0",onClick:a[0]||(a[0]=l=>u(it).push({name:"Home"})),title:u(r)("nav.home")},[...a[6]||(a[6]=[f("img",{src:xi,class:"h-8 w-8 drop-shadow-[0_0_8px_rgba(26,208,92,0.55)]"},null,-1),f("span",{class:"hidden sm:inline text-lg font-bold tracking-tight"}," Downtify ",-1)])],8,y_),f("div",b_,[H(Br,{class:"w-full max-w-md",compact:!0})]),f("div",v_,[f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="List"}]),onClick:a[1]||(a[1]=l=>u(it).push({name:"List"})),title:u(r)("nav.library")},[H(u(Y),{icon:"clarity:library-line",class:"h-5 w-5"})],10,__),f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Player"}]),onClick:a[2]||(a[2]=l=>u(it).push({name:"Player"})),title:u(r)("nav.player")},[H(u(Y),{icon:"clarity:headphones-line",class:"h-5 w-5"})],10,x_),f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(t).name==="Monitor"}]),onClick:a[3]||(a[3]=l=>u(it).push({name:"Monitor"})),title:u(r)("nav.monitor")},[H(u(Y),{icon:"clarity:eye-line",class:"h-5 w-5"})],10,w_),f("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(t).name==="Download"}]),onClick:a[4]||(a[4]=l=>u(t).name==="Download"?u(it).push({name:"Search",params:{query:u(o).searchTerm.value||" "}}):u(it).push({name:"Download"})),title:u(r)("nav.queue")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"}),u(s).downloadQueue.value.length>0?(A(),O("span",S_,w(u(s).downloadQueue.value.length),1)):ie("",!0)],10,k_),f("button",{class:"icon-btn",onClick:a[5]||(a[5]=l=>u(n).setTheme(u(n).currentTheme.value==="dark"?"light":"dark")),title:u(n).currentTheme.value==="dark"?u(r)("nav.switchToLight"):u(r)("nav.switchToDark")},[u(n).currentTheme.value==="dark"?(A(),ct(u(Y),{key:0,icon:"clarity:sun-line",class:"h-5 w-5"})):(A(),ct(u(Y),{key:1,icon:"clarity:moon-line",class:"h-5 w-5"}))],8,E_),f("label",{for:"settings-modal",class:"icon-btn cursor-pointer",title:u(r)("nav.settings")},[H(u(Y),{icon:"clarity:cog-line",class:"h-5 w-5"})],8,A_)])]),f("div",C_,[H(Br,{compact:!0})])]))}},R_={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},T_={class:"mb-8"},P_={class:"text-2xl font-bold tracking-tight"},O_={class:"mt-1 text-sm text-base-content/60"},D_={class:"text-base-content/90 font-medium"},N_={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},I_={key:1,class:"space-y-3"},$_={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},L_={class:"text-base-content/50 text-sm"},U_={class:"text-base-content/40 text-xs mt-1"},F_={key:3,class:"space-y-2"},M_={class:"track-cover"},B_=["src","alt"],H_={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},j_={class:"flex-1 min-w-0"},q_={class:"flex items-center gap-2 mb-0.5"},V_={class:"font-semibold truncate"},W_={key:0,class:"badge-error-soft shrink-0"},z_={class:"text-xs text-base-content/70 truncate"},K_={key:0,class:"text-xs text-base-content/40 truncate"},Q_={key:0,class:"text-base-content/30"},G_={class:"flex items-center gap-1 shrink-0"},Y_=["href","title"],J_=["title"],X_=["onClick","title"],Z_={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},e0=["disabled","title"],t0=["onClick"],n0=["disabled","title"],fr=5,s0={__name:"SearchList",props:["data","error"],emits:["download"],setup(e,{emit:t}){const n=e,s=t,o=Ho(),r=$s(),{t:i}=St(),a=se(1),l=me(()=>{var g;return Math.ceil((((g=n.data)==null?void 0:g.length)||0)/fr)}),d=me(()=>{if(!n.data)return[];const g=(a.value-1)*fr;return n.data.slice(g,g+fr)});Mt(()=>n.data,()=>{a.value=1});function c(g){return Array.isArray(g.artists)&&g.artists.length?g.artists.join(", "):g.artist||i("common.unknownArtist")}function p(g){const b=r.getBySong(g);return b?b.isErrored()?"error":(b.isDownloaded(),"queued"):"idle"}function h(g){s("download",g)}return(g,b)=>{var k;return A(),O("div",R_,[f("div",T_,[f("h1",P_,w(u(i)("search.title")),1),f("p",O_,[u(o).searchTerm.value?(A(),O(fe,{key:0},[Ce(w(u(i)("search.matchesFor"))+" ",1),f("span",D_,' "'+w(u(o).searchTerm.value)+'" ',1),!u(o).isSearching.value&&(((k=n.data)==null?void 0:k.length)||0)>0?(A(),O(fe,{key:0},[Ce(w(n.data.length===1?u(i)("search.songsCount",{count:n.data.length}):u(i)("search.songsCountPlural",{count:n.data.length})),1)],64)):ie("",!0)],64)):(A(),O(fe,{key:1},[Ce(w(u(i)("search.typeToBegin")),1)],64))])]),n.error?(A(),O("div",N_,[H(u(Y),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),f("span",null,w(u(o).errorValue.value?u(i)("search.errorWithDetail",{detail:u(o).errorValue.value}):u(i)("search.error")),1)])):ie("",!0),u(o).isSearching.value?(A(),O("div",I_,[(A(),O(fe,null,Ie(5,v=>f("div",{key:v,class:"skeleton h-24 rounded-2xl"})),64))])):!n.data||n.data.length===0?(A(),O("div",$_,[H(u(Y),{icon:"clarity:search-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",L_,w(u(i)("search.empty")),1),f("p",U_,w(u(i)("search.emptyHint")),1)])):(A(),O("ul",F_,[(A(!0),O(fe,null,Ie(d.value,(v,R)=>(A(),O("li",{key:v.song_id||R,class:"surface rounded-2xl track-card"},[f("div",M_,[v.cover_url?(A(),O("img",{key:0,src:v.cover_url,alt:v.name,class:"h-full w-full object-cover",loading:"lazy"},null,8,B_)):(A(),O("div",H_,[H(u(Y),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),f("div",j_,[f("div",q_,[f("span",V_,w(v.name),1),v.explicit?(A(),O("span",W_,"E")):ie("",!0)]),f("p",z_,w(c(v)),1),v.album_name?(A(),O("p",K_,[Ce(w(v.album_name)+" ",1),v.year?(A(),O("span",Q_," · "+w(v.year),1)):ie("",!0)])):ie("",!0)]),f("div",G_,[v.url?(A(),O("a",{key:0,class:"icon-btn",href:v.url,target:"_blank",rel:"noopener",title:u(i)("search.openOnSpotify")},[H(u(Y),{icon:"clarity:pop-out-line",class:"h-4 w-4"})],8,Y_)):ie("",!0),p(v)==="queued"?(A(),O("button",{key:1,class:"icon-btn text-primary cursor-default",title:u(i)("search.inQueue"),disabled:""},[H(u(Y),{icon:"clarity:check-circle-line",class:"h-5 w-5"})],8,J_)):(A(),O("button",{key:2,class:"icon-btn text-primary hover:bg-primary/10",onClick:D=>h(v),title:u(i)("search.download")},[H(u(Y),{icon:"clarity:download-line",class:"h-5 w-5"})],8,X_))])]))),128))])),l.value>1?(A(),O("nav",Z_,[f("button",{class:"icon-btn",disabled:a.value===1,onClick:b[0]||(b[0]=v=>a.value--),title:u(i)("search.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,e0),(A(!0),O(fe,null,Ie(l.value,v=>(A(),O("button",{key:v,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",v===a.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:R=>a.value=v},w(v),11,t0))),128)),f("button",{class:"icon-btn",disabled:a.value===l.value,onClick:b[1]||(b[1]=v=>a.value++),title:u(i)("search.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,n0)])):ie("",!0)])}}},o0={class:"min-h-screen"},r0={__name:"Search",setup(e){en(()=>window.scroll(0,0));const t=ku(),n=Ho(),s=wi();return Mt(()=>t.params.query,()=>{t.params.query&&n.searchFor(t.params.query)},{deep:!0}),n.searchFor(t.params.query),(o,r)=>(A(),O("div",o0,[H(Ls),H(Qn),H(s0,{data:u(n).results.value,error:u(n).error.value,onDownload:r[0]||(r[0]=i=>u(s).queue(i))},null,8,["data","error"])]))}},i0={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},a0={class:"mb-6 flex flex-wrap items-end justify-between gap-4"},l0={class:"text-2xl font-bold tracking-tight"},c0={class:"mt-1 text-sm text-base-content/60"},u0={key:0,class:"flex flex-wrap gap-2 justify-end"},d0=["title"],f0={key:0,class:"mb-6 flex flex-wrap gap-2",role:"tablist"},p0=["onClick"],h0={key:0,class:"ml-1 opacity-80 tabular-nums"},m0={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},g0={class:"text-base-content/50 text-sm"},y0={class:"text-base-content/40 text-xs mt-1"},b0={key:2,class:"surface rounded-2xl p-8 text-center text-sm text-base-content/50"},v0={key:3,class:"space-y-3"},_0={class:"flex items-center gap-4"},x0={class:"track-cover h-16 w-16 sm:h-20 sm:w-20 shrink-0"},w0=["src","alt"],k0={key:1,class:"h-full w-full flex items-center justify-center text-base-content/30"},S0={class:"flex-1 min-w-0"},E0={class:"flex items-center gap-2 mb-0.5 flex-wrap"},A0={class:"font-semibold truncate"},C0={key:0,class:"badge badge-xs badge-outline opacity-80 shrink-0"},R0={class:"text-xs text-base-content/60 truncate"},T0={key:0,class:"text-xs text-base-content/50 mt-0.5 line-clamp-2"},P0={key:1,class:"text-xs text-base-content/40 truncate"},O0={key:2,class:"text-xs text-error/80 mt-1 line-clamp-2"},D0={class:"flex items-center gap-2 shrink-0"},N0=["title","onClick"],I0=["onClick","title"],$0={class:"text-[10px] font-semibold"},L0=["onClick","title"],U0={key:0,class:"mt-3 pt-3 border-t border-white/10 flex flex-wrap gap-2 items-center"},F0=["onUpdate:modelValue","placeholder"],M0=["onClick"],B0=["onClick"],H0=["onClick"],j0={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},q0=["disabled","title"],V0=["onClick"],W0=["disabled","title"],pr=10,z0={__name:"DownloadList",setup(e){const t=$s(),n=wi(),{t:s}=St(),o=se("active"),r=se(1),i=Un({}),a=Un({});function l(M){return M.isErrored()?"failed":M.isDownloaded()?"done":M.isQueued()?"queued":"active"}const d=me(()=>t.downloadQueue.value.filter(M=>l(M)==="done").length),c=me(()=>t.downloadQueue.value.filter(M=>l(M)==="failed").length),p=me(()=>t.downloadQueue.value.filter(M=>l(M)==="active").length),h=me(()=>[{id:"active",label:s("queue.filterActive"),count:p.value},{id:"queued",label:s("queue.filterQueued"),count:t.downloadQueue.value.filter(M=>l(M)==="queued").length},{id:"all",label:s("queue.filterAll"),count:t.downloadQueue.value.length},{id:"done",label:s("queue.filterDone"),count:d.value},{id:"failed",label:s("queue.filterFailed"),count:c.value}]),g=me(()=>{const M=t.downloadQueue.value;switch(o.value){case"all":return M;case"active":return M.filter(Q=>l(Q)==="active");case"queued":return M.filter(Q=>l(Q)==="queued");case"done":return M.filter(Q=>l(Q)==="done");case"failed":return M.filter(Q=>l(Q)==="failed");default:return M}}),b=me(()=>Math.ceil(g.value.length/pr)),k=me(()=>{const M=(r.value-1)*pr;return g.value.slice(M,M+pr)});Mt(o,()=>{r.value=1}),Mt(()=>g.value.length,()=>{r.value>b.value&&b.value>0&&(r.value=b.value),r.value<1&&(r.value=1)}),Mt(()=>t.downloadQueue.value.length,M=>{M===0?o.value="active":o.value==="active"&&p.value===0&&c.value>0&&(o.value="failed")});async function v(){confirm(s("queue.clearAllPrompt"))&&await n.clearAll()}async function R(){await n.clearCompleted()}function D(){n.retryAllFailed()}function C(M){return Array.isArray(M.artists)&&M.artists.length?M.artists.join(", "):M.artist||s("common.unknownArtist")}function P(M){return M.isErrored()?"badge-error-soft":M.isDownloaded()||l(M)==="active"?"badge-soft":"badge-neutral-soft"}function F(M){const Q=l(M);return Q==="active"&&M.message?s("queue.statusActive"):M.isErrored()?s("queue.statusFailed"):M.isDownloaded()?s("queue.statusDone"):s(Q==="active"?"queue.statusActive":"queue.statusQueued")}function x(M){const Q=String(M.provider||"").trim();return Q==="youtube-music"?"YouTube Music":Q==="youtube"?"YouTube":Q==="slskd"?"slskd":""}function _(M){const Q=String(M||"").match(/(?:v=|youtu\.be\/)([A-Za-z0-9_-]{6,})/);return Q?Q[1]:null}function E(M){const Q=M.song.song_id,N=_(a[Q]);if(!N){alert(s("queue.invalidYouTubeURL"));return}i[Q]=!1,n.retryWithAudio(M.song,N)}function j(M){const Q=document.createElement("a");Q.href=M,Q.download=be.downloadSaveName(M),document.body.appendChild(Q),Q.click(),document.body.removeChild(Q)}return(M,Q)=>(A(),O("div",i0,[f("div",a0,[f("div",null,[f("h1",l0,w(u(s)("queue.title")),1),f("p",c0,w(u(s)("queue.subtitle")),1)]),u(t).downloadQueue.value.length>0?(A(),O("div",u0,[c.value>0?(A(),O("button",{key:0,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:D},[H(u(Y),{icon:"clarity:refresh-line",class:"h-4 w-4 mr-1.5"}),Ce(" "+w(u(s)("queue.retryAllFailed",{count:c.value})),1)])):ie("",!0),d.value>0?(A(),O("button",{key:1,class:"btn btn-sm h-11 px-4 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:R},w(u(s)("queue.clearCompleted",{count:d.value})),1)):ie("",!0),f("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100 text-error/70 hover:text-error",onClick:v,title:u(s)("queue.clearAll")},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4 mr-1.5"}),Ce(" "+w(u(s)("queue.clearAll")),1)],8,d0)])):ie("",!0)]),u(t).downloadQueue.value.length>0?(A(),O("div",f0,[(A(!0),O(fe,null,Ie(h.value,N=>(A(),O("button",{key:N.id,type:"button",class:Ae(["btn btn-sm rounded-full border-white/10",o.value===N.id?"btn-primary":"bg-base-100/85 hover:bg-base-100"]),onClick:te=>o.value=N.id},[Ce(w(N.label)+" ",1),N.count>0?(A(),O("span",h0,"("+w(N.count)+")",1)):ie("",!0)],10,p0))),128))])):ie("",!0),u(t).downloadQueue.value.length===0?(A(),O("div",m0,[H(u(Y),{icon:"clarity:download-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",g0,w(u(s)("queue.empty")),1),f("p",y0,w(u(s)("queue.emptyHint")),1)])):g.value.length===0?(A(),O("div",b0,w(u(s)("queue.emptyFilter")),1)):(A(),O("ul",v0,[(A(!0),O(fe,null,Ie(k.value,(N,te)=>(A(),O("li",{key:N.song.song_id||N.song.url||te,class:"surface rounded-2xl p-3 sm:p-4"},[f("div",_0,[f("div",x0,[N.song.cover_url?(A(),O("img",{key:0,src:N.song.cover_url,alt:N.song.name,class:"h-full w-full object-cover"},null,8,w0)):(A(),O("div",k0,[H(u(Y),{icon:"clarity:music-note-line",class:"h-6 w-6"})]))]),f("div",S0,[f("div",E0,[f("span",A0,w(N.song.name),1),x(N)?(A(),O("span",C0,w(x(N)),1)):ie("",!0),f("span",{class:Ae([P(N),"shrink-0"])},w(F(N)),3)]),f("p",R0,w(C(N.song)),1),l(N)==="active"&&N.message?(A(),O("p",T0,w(N.message),1)):ie("",!0),N.song.album_name?(A(),O("p",P0,w(N.song.album_name),1)):ie("",!0),N.isErrored()&&N.message?(A(),O("p",O0,w(N.message),1)):ie("",!0)]),f("div",D0,[N.isErrored()?(A(),O("button",{key:0,class:"icon-btn text-primary hover:bg-primary/10",title:u(s)("queue.retry"),onClick:le=>u(n).retry(N.song)},[H(u(Y),{icon:"clarity:refresh-line",class:"h-4 w-4"})],8,N0)):ie("",!0),N.isDownloaded()?(A(),O("a",{key:1,class:"icon-btn text-primary hover:bg-primary/10",href:"javascript:;",onClick:le=>j(N.web_download_url),title:u(s)("queue.saveToDevice")},[H(u(Y),{icon:"clarity:download-line",class:"h-4 w-4"})],8,I0)):l(N)==="active"?(A(),O("div",{key:2,class:"radial-progress text-primary",style:Ln(`--value:${Math.max(0,N.progress)}; --size:2.75rem; --thickness:3px`)},[f("span",$0,w(Math.round(N.progress))+"% ",1)],4)):ie("",!0),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",onClick:le=>u(n).remove(N.song),title:u(s)("queue.removeFromQueue")},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,L0)])]),N.isErrored()&&i[N.song.song_id]?(A(),O("div",U0,[xe(f("input",{"onUpdate:modelValue":le=>a[N.song.song_id]=le,type:"text",class:"input input-sm flex-1 min-w-[12rem] rounded-xl bg-base-100/80",placeholder:u(s)("queue.overridePlaceholder")},null,8,F0),[[et,a[N.song.song_id]]]),f("button",{class:"btn btn-sm btn-primary rounded-full",onClick:le=>E(N)},w(u(s)("queue.applyOverride")),9,M0),f("button",{class:"btn btn-sm btn-ghost rounded-full",onClick:le=>i[N.song.song_id]=!1},w(u(s)("common.cancel")),9,B0)])):N.isErrored()?(A(),O("button",{key:1,type:"button",class:"mt-2 text-xs text-primary/80 hover:text-primary",onClick:le=>i[N.song.song_id]=!0},w(u(s)("queue.forceAudio")),9,H0)):ie("",!0)]))),128))])),b.value>1?(A(),O("nav",j0,[f("button",{class:"icon-btn",disabled:r.value===1,onClick:Q[0]||(Q[0]=N=>r.value--),title:u(s)("common.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,q0),(A(!0),O(fe,null,Ie(b.value,N=>(A(),O("button",{key:N,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",N===r.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:te=>r.value=N},w(N),11,V0))),128)),f("button",{class:"icon-btn",disabled:r.value===b.value,onClick:Q[1]||(Q[1]=N=>r.value++),title:u(s)("common.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,W0)])):ie("",!0)]))}},K0={class:"min-h-screen"},Q0={__name:"Download",setup(e){return en(()=>window.scroll(0,0)),(t,n)=>(A(),O("div",K0,[H(Ls),H(Qn),H(z0)]))}},Au="downtify-player-volume",Ve=se([]),ot=se(-1),bo=se(!1),Us=se(0),un=se(0),ki=se(parseFloat(localStorage.getItem(Au)||"0.85")),$n=se(!1),Gn=se("off"),dn=se(!1);let we=null,bt=[],jo=0;function qo(){return we||(we=new Audio,we.preload="metadata",we.volume=ki.value,we.addEventListener("timeupdate",()=>{Us.value=we.currentTime}),we.addEventListener("loadedmetadata",()=>{un.value=isFinite(we.duration)?we.duration:0}),we.addEventListener("durationchange",()=>{un.value=isFinite(we.duration)?we.duration:0}),we.addEventListener("ended",sx),we.addEventListener("play",()=>{bo.value=!0}),we.addEventListener("pause",()=>{bo.value=!1}),we)}function Hr(e){const t=e.replace(/\.[^.]+$/,"");let n="",s=t;const o=t.indexOf(" - ");return o>0&&(n=t.slice(0,o).trim(),s=t.slice(o+3).trim()),{file:e,url:be.downloadFileURL(e),cover:be.coverFileURL(e),title:s,artist:n,album:""}}function Si(e){if(typeof e=="string")return Hr(e);const t=String((e==null?void 0:e.file)||""),n=Hr(t),s=String((e==null?void 0:e.title)||"").trim(),o=String((e==null?void 0:e.artist)||"").trim(),r=String((e==null?void 0:e.album)||"").trim();return{file:t,url:n.url,cover:n.cover,title:s||n.title,artist:o||n.artist,album:r||n.album}}function Fs(){const e=Ve.value.map((t,n)=>n);for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}bt=e,jo=ot.value>=0?Math.max(0,bt.indexOf(ot.value)):0}function G0(e,t={}){const n=(e||[]).map(s=>typeof s=="string"?Hr(s):Si(s));Ve.value=n,ot.value>=n.length&&(ot.value=-1),dn.value&&Fs(),typeof t.startIndex=="number"?Vn(t.startIndex):t.autoplay&&n.length>0&&ot.value<0&&Vn(0)}function Vn(e){if(e<0||e>=Ve.value.length)return;const t=qo();if(ot.value=e,dn.value){bt.length!==Ve.value.length&&Fs();const n=bt.indexOf(e);n>=0&&(jo=n)}t.src=Ve.value[e].url,t.currentTime=0,Us.value=0,t.play().catch(()=>{})}function Cu(){if(Ve.value.length===0)return;const e=qo();if(ot.value<0){Vn(0);return}e.src||(e.src=Ve.value[ot.value].url),e.play().catch(()=>{})}function Ei(){we&&we.pause()}function Y0(){bo.value?Ei():Cu()}function Vo(e){const t=qo(),n=un.value||0,s=Math.max(0,Math.min(n,e));t.currentTime=s,Us.value=s}function J0(e){un.value&&Vo(un.value*Math.max(0,Math.min(1,e)))}function X0(e){const t=Math.max(0,Math.min(1,e));ki.value=t,we&&(we.volume=t);try{localStorage.setItem(Au,String(t))}catch{}t>0&&$n.value&&($n.value=!1,we&&(we.muted=!1))}function Z0(){$n.value=!$n.value,we&&(we.muted=$n.value)}function ex(){if(Ve.value.length===0)return-1;if(dn.value){bt.length!==Ve.value.length&&Fs();const t=(jo+1)%bt.length;return bt[t]}const e=ot.value+1;return e>=Ve.value.length?Gn.value==="all"?0:-1:e}function tx(){if(Ve.value.length===0)return-1;if(dn.value){bt.length!==Ve.value.length&&Fs();const t=(jo-1+bt.length)%bt.length;return bt[t]}const e=ot.value-1;return e<0?Gn.value==="all"?Ve.value.length-1:0:e}function Ru(){const e=ex();if(e<0){Ei();return}Vn(e)}function nx(){if(qo().currentTime>3){Vo(0);return}const t=tx();t<0||Vn(t)}function sx(){if(Gn.value==="one"){Vo(0),we&&we.play().catch(()=>{});return}Ru()}function Tu(e){["off","all","one"].includes(e)&&(Gn.value=e)}function ox(){const e=["off","all","one"],t=e.indexOf(Gn.value);Tu(e[(t+1)%e.length])}function Pu(e){dn.value=!!e,dn.value&&Fs()}function rx(){Pu(!dn.value)}const ix=me(()=>ot.value>=0&&ot.valueun.value>0?Us.value/un.value*100:0);function pl(e){if(!isFinite(e)||e<0)return"0:00";const t=Math.floor(e),n=Math.floor(t/60),s=t%60;return`${n}:${s.toString().padStart(2,"0")}`}function Ou(){return{playlist:Ve,currentIndex:ot,currentTrack:ix,isPlaying:bo,currentTime:Us,duration:un,progressPct:ax,volume:ki,isMuted:$n,repeatMode:Gn,shuffle:dn,setPlaylist:G0,playAt:Vn,play:Cu,pause:Ei,toggle:Y0,seek:Vo,seekRatio:J0,setVolume:X0,toggleMute:Z0,next:Ru,prev:nx,setRepeat:Tu,cycleRepeat:ox,setShuffle:Pu,toggleShuffle:rx}}const lx={class:"min-h-screen"},cx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},ux={class:"mb-8 flex flex-wrap items-end justify-between gap-4"},dx={class:"text-2xl font-bold tracking-tight"},fx={class:"mt-1 text-sm text-base-content/60"},px={class:"flex items-center gap-2"},hx=["title"],mx=["disabled"],gx={key:0,class:"loading loading-spinner loading-xs mr-2"},yx={key:0,class:"surface rounded-2xl p-4 mb-4 flex gap-3 items-center text-sm text-error"},bx={key:1,class:"space-y-3"},vx={key:2,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},_x={class:"text-base-content/50 text-sm"},xx={class:"text-base-content/40 text-xs mt-1"},wx={key:3,class:"space-y-2"},kx={class:"relative h-11 w-11 shrink-0 rounded-xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden"},Sx=["src","alt","onError"],Ex={class:"flex-1 min-w-0"},Ax={class:"text-sm font-medium truncate block"},Cx={key:0,class:"text-xs text-base-content/60 truncate"},Rx={class:"text-xs text-base-content/40"},Tx={key:0,class:"mr-2 text-primary/70"},Px={class:"flex items-center gap-1 shrink-0"},Ox=["onClick","title"],Dx=["href","download","title"],Nx=["disabled","onClick","title"],Ix={key:0,class:"loading loading-spinner loading-xs"},$x={key:4,class:"mt-8 flex items-center justify-center gap-1 flex-wrap"},Lx=["disabled","title"],Ux=["onClick"],Fx=["disabled","title"],Mx={key:5,class:"mt-6 text-xs text-base-content/40 text-center"},hr=10,Bx={__name:"Downloads",setup(e){const{t}=St(),n=Ou(),s=Fv(),o=se([]),r=se(!1),i=se(""),a=se({}),l=se({}),d=se(1),c=me(()=>Math.ceil(o.value.length/hr)),p=me(()=>{const P=(d.value-1)*hr;return o.value.slice(P,P+hr)});Mt(o,()=>{d.value=1});function h(P){return be.coverFileURL(P)}function g(P){l.value={...l.value,[P]:!0}}async function b(){r.value=!0,i.value="";try{const P=await be.listDownloads();o.value=(P.data||[]).map(Si)}catch{i.value=t("library.failedLoad")}finally{r.value=!1}}async function k(P){if(confirm(t("library.deletePrompt",{file:P}))){a.value={...a.value,[P]:!0};try{await be.deleteDownload(P),o.value=o.value.filter(F=>F!==P)}catch{i.value=t("library.failedDelete",{file:P})}finally{a.value={...a.value,[P]:!1}}}}function v(P){const F=P.lastIndexOf(".");return F>0?P.slice(F+1).toUpperCase():""}function R(P){const F=P.lastIndexOf("/");return F>=0?P.slice(0,F):""}function D(P){const F=o.value.findIndex(x=>x.file===P.file);F<0||(n.setPlaylist(o.value,{startIndex:F}),s.push({name:"Player"}))}function C(){o.value.length&&(n.setPlaylist(o.value,{startIndex:0}),s.push({name:"Player"}))}return en(b),(P,F)=>(A(),O("div",lx,[H(Ls),H(Qn),f("div",cx,[f("div",ux,[f("div",null,[f("h1",dx,w(u(t)("library.title")),1),f("p",fx,w(u(t)("library.subtitle")),1)]),f("div",px,[o.value.length>0?(A(),O("button",{key:0,class:"btn btn-primary btn-sm h-11 px-5 rounded-full",onClick:C,title:u(t)("library.play")},[H(u(Y),{icon:"clarity:play-line",class:"h-4 w-4 mr-1.5"}),Ce(" "+w(u(t)("library.play")),1)],8,hx)):ie("",!0),f("button",{class:"btn btn-sm h-11 px-5 rounded-full border-white/10 bg-base-100/85 hover:bg-base-100",onClick:b,disabled:r.value},[r.value?(A(),O("span",gx)):(A(),ct(u(Y),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4 mr-2"})),Ce(" "+w(u(t)("common.refresh")),1)],8,mx)])]),i.value?(A(),O("div",yx,[H(u(Y),{icon:"clarity:exclamation-circle-line",class:"h-5 w-5 shrink-0"}),f("span",null,w(i.value),1)])):ie("",!0),r.value&&o.value.length===0?(A(),O("div",bx,[(A(),O(fe,null,Ie(4,x=>f("div",{key:x,class:"skeleton h-16 rounded-2xl"})),64))])):o.value.length===0?(A(),O("div",vx,[H(u(Y),{icon:"clarity:library-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",_x,w(u(t)("library.empty")),1),f("p",xx,w(u(t)("library.emptyHint")),1)])):(A(),O("ul",wx,[(A(!0),O(fe,null,Ie(p.value,x=>(A(),O("li",{key:x.file,class:"surface rounded-2xl p-3 sm:p-4 flex items-center gap-3"},[f("div",kx,[l.value[x.file]?(A(),ct(u(Y),{key:1,icon:"clarity:music-note-line",class:"h-5 w-5"})):(A(),O("img",{key:0,src:h(x.file),alt:x.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:_=>g(x.file)},null,40,Sx))]),f("div",Ex,[f("span",Ax,w(x.title),1),x.artist?(A(),O("p",Cx,w(x.artist),1)):ie("",!0),f("span",Rx,[R(x.file)?(A(),O("span",Tx,[H(u(Y),{icon:"clarity:folder-line",class:"inline h-3 w-3 mr-0.5 align-text-top"}),Ce(w(R(x.file)),1)])):ie("",!0),Ce(" "+w(v(x.file)),1)])]),f("div",Px,[f("button",{class:"icon-btn text-primary hover:bg-primary/10",onClick:_=>D(x),title:u(t)("library.play")},[H(u(Y),{icon:"clarity:play-line",class:"h-4 w-4"})],8,Ox),f("a",{class:"icon-btn",href:u(be).downloadFileURL(x.file),download:u(be).downloadSaveName(x.file),title:u(t)("library.downloadToDevice")},[H(u(Y),{icon:"clarity:download-line",class:"h-4 w-4"})],8,Dx),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",disabled:a.value[x.file]===!0,onClick:_=>k(x.file),title:u(t)("library.deleteFile")},[a.value[x.file]===!0?(A(),O("span",Ix)):(A(),ct(u(Y),{key:1,icon:"clarity:trash-line",class:"h-4 w-4"}))],8,Nx)])]))),128))])),c.value>1?(A(),O("nav",$x,[f("button",{class:"icon-btn",disabled:d.value===1,onClick:F[0]||(F[0]=x=>d.value--),title:u(t)("common.previousPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-[-90deg]"})],8,Lx),(A(!0),O(fe,null,Ie(c.value,x=>(A(),O("button",{key:x,class:Ae(["h-10 min-w-[2.5rem] rounded-full px-3 text-sm font-medium transition-colors",x===d.value?"bg-primary text-primary-content shadow-glow-sm":"text-base-content/70 hover:text-base-content hover:bg-white/10"]),onClick:_=>d.value=x},w(x),11,Ux))),128)),f("button",{class:"icon-btn",disabled:d.value===c.value,onClick:F[1]||(F[1]=x=>d.value++),title:u(t)("common.nextPage")},[H(u(Y),{icon:"clarity:angle-line",class:"h-4 w-4 rotate-90"})],8,Fx)])):ie("",!0),o.value.length>0?(A(),O("p",Mx,w(o.value.length===1?u(t)("library.countOne",{count:o.value.length}):u(t)("library.countMany",{count:o.value.length})),1)):ie("",!0)])]))}},Ms=Pe.create({baseURL:`${Ye.PROTOCOL}//${Ye.BACKEND}:${Ye.PORT}${Ye.BASEURL}`});function Hx(){return Ms.get("/api/monitor/playlists")}function jx(e,t=60){return Ms.post("/api/monitor/playlists",{url:e,interval_minutes:t})}function qx(e,t){return Ms.patch(`/api/monitor/playlists/${e}`,t)}function Vx(e){return Ms.delete(`/api/monitor/playlists/${e}`)}function Wx(e){return Ms.post(`/api/monitor/playlists/${e}/check`)}const yn={listMonitoredPlaylists:Hx,addMonitoredPlaylist:jx,updateMonitoredPlaylist:qx,deleteMonitoredPlaylist:Vx,checkMonitoredPlaylist:Wx},zx={class:"min-h-screen"},Kx={class:"mx-auto max-w-4xl px-4 py-8 sm:px-6"},Qx={class:"mb-8"},Gx={class:"text-2xl font-bold tracking-tight"},Yx={class:"mt-1 text-sm text-base-content/60"},Jx={class:"surface rounded-2xl p-5 mb-8"},Xx={class:"text-sm font-semibold uppercase tracking-wider text-base-content/50 mb-4"},Zx=["placeholder","disabled"],e1={class:"flex items-center gap-2 shrink-0"},t1=["disabled"],n1={value:15},s1={value:30},o1={value:60},r1={value:180},i1={value:360},a1={value:720},l1={value:1440},c1={value:10080},u1={value:20160},d1={value:43200},f1=["disabled"],p1={key:0,class:"loading loading-spinner loading-xs"},h1={key:1},m1={key:0,class:"mt-2 text-xs text-error"},g1={key:0,class:"space-y-3"},y1={key:1,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},b1={class:"text-base-content/50 text-sm"},v1={class:"text-base-content/40 text-xs mt-1"},_1={key:2,class:"space-y-3"},x1={class:"flex-1 min-w-0"},w1={class:"flex items-center gap-2 mb-1"},k1={class:"font-semibold truncate"},S1={class:"flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-base-content/50"},E1={key:0},A1={key:1,class:"italic"},C1={class:"flex items-center gap-2 shrink-0"},R1=["value","onChange"],T1={value:15},P1={value:30},O1={value:60},D1={value:180},N1={value:360},I1={value:720},$1={value:1440},L1={value:10080},U1={value:20160},F1={value:43200},M1=["title","onClick"],B1=["title","disabled","onClick"],H1={key:0,class:"loading loading-spinner loading-xs"},j1=["title","onClick"],q1={class:"mt-8 surface rounded-2xl p-4 flex gap-3 text-sm text-base-content/60"},V1={__name:"Monitor",setup(e){const{t}=St(),n=se([]),s=se(!1),o=se(!1),r=se(""),i=se(""),a=se(60),l=se({});async function d(){s.value=!0;try{const R=await yn.listMonitoredPlaylists();n.value=R.data||[]}finally{s.value=!1}}async function c(){var R,D;r.value="",o.value=!0;try{const C=await yn.addMonitoredPlaylist(i.value.trim(),a.value);n.value.unshift(C.data),i.value=""}catch(C){r.value=((D=(R=C==null?void 0:C.response)==null?void 0:R.data)==null?void 0:D.detail)||t("monitor.failedAdd")}finally{o.value=!1}}async function p(R){try{const D=await yn.updateMonitoredPlaylist(R.id,{enabled:!R.enabled});Object.assign(R,D.data)}catch{}}async function h(R,D){const C=parseInt(D.target.value,10);try{const P=await yn.updateMonitoredPlaylist(R.id,{interval_minutes:C});Object.assign(R,P.data)}catch{}}async function g(R){l.value={...l.value,[R.id]:!0};try{await yn.checkMonitoredPlaylist(R.id),setTimeout(async()=>{try{const D=await yn.listMonitoredPlaylists();n.value=D.data||[]}finally{l.value={...l.value,[R.id]:!1}}},3e3)}catch{l.value={...l.value,[R.id]:!1}}}async function b(R){if(confirm(t("monitor.deletePrompt",{name:R.name})))try{await yn.deleteMonitoredPlaylist(R.id),n.value=n.value.filter(D=>D.id!==R.id)}catch{}}function k(R){if(R<60)return`${R} ${t("monitor.minSuffix")}`;if(R<1440)return`${R/60} ${t("monitor.hourSuffix")}`;if(R<10080){const C=R/1440;return`${C} ${t(C===1?"monitor.daySuffix":"monitor.daysSuffix")}`}if(R<43200){const C=R/10080;return`${C} ${t(C===1?"monitor.weekSuffix":"monitor.weeksSuffix")}`}const D=Math.round(R/43200);return`${D} ${t(D===1?"monitor.monthSuffix":"monitor.monthsSuffix")}`}function v(R){try{const D=Date.now()-new Date(R).getTime(),C=Math.floor(D/6e4);if(C<1)return t("monitor.timeJustNow");if(C<60)return t("monitor.timeMinAgo",{n:C});const P=Math.floor(C/60);return P<24?t("monitor.timeHourAgo",{n:P}):t("monitor.timeDayAgo",{n:Math.floor(P/24)})}catch{return""}}return en(d),(R,D)=>(A(),O("div",zx,[H(Ls),H(Qn),f("div",Kx,[f("div",Qx,[f("h1",Gx,w(u(t)("monitor.title")),1),f("p",Yx,w(u(t)("monitor.subtitle")),1)]),f("div",Jx,[f("h2",Xx,w(u(t)("monitor.watchNew")),1),f("form",{onSubmit:ep(c,["prevent"]),class:"flex flex-col sm:flex-row gap-3"},[xe(f("input",{"onUpdate:modelValue":D[0]||(D[0]=C=>i.value=C),type:"text",placeholder:u(t)("monitor.urlPlaceholder"),class:"input-modern flex-1 h-11 text-sm",disabled:o.value},null,8,Zx),[[et,i.value]]),f("div",e1,[xe(f("select",{"onUpdate:modelValue":D[1]||(D[1]=C=>a.value=C),class:"select select-sm rounded-full border border-white/10 bg-base-100/85 focus:border-primary/60 h-11 px-3 text-sm",disabled:o.value},[f("option",n1,w(u(t)("monitor.every15")),1),f("option",s1,w(u(t)("monitor.every30")),1),f("option",o1,w(u(t)("monitor.every1h")),1),f("option",r1,w(u(t)("monitor.every3h")),1),f("option",i1,w(u(t)("monitor.every6h")),1),f("option",a1,w(u(t)("monitor.every12h")),1),f("option",l1,w(u(t)("monitor.every1d")),1),f("option",c1,w(u(t)("monitor.every1w")),1),f("option",u1,w(u(t)("monitor.every2w")),1),f("option",d1,w(u(t)("monitor.every1mo")),1)],8,t1),[[Xs,a.value]]),f("button",{type:"submit",class:"btn btn-primary btn-sm h-11 px-5 rounded-full",disabled:o.value||!i.value.trim()},[o.value?(A(),O("span",p1)):(A(),O("span",h1,w(u(t)("monitor.watch")),1))],8,f1)])],32),r.value?(A(),O("p",m1,w(r.value),1)):ie("",!0)]),s.value?(A(),O("div",g1,[(A(),O(fe,null,Ie(3,C=>f("div",{key:C,class:"skeleton h-24 rounded-2xl"})),64))])):n.value.length===0?(A(),O("div",y1,[H(u(Y),{icon:"clarity:music-note-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",b1,w(u(t)("monitor.empty")),1),f("p",v1,w(u(t)("monitor.emptyHint")),1)])):(A(),O("ul",_1,[(A(!0),O(fe,null,Ie(n.value,C=>(A(),O("li",{key:C.id,class:"surface rounded-2xl p-4 sm:p-5 flex flex-col sm:flex-row sm:items-center gap-4"},[f("div",x1,[f("div",w1,[f("span",k1,w(C.name),1),f("span",{class:Ae(["pill shrink-0",C.enabled?"badge-soft":"badge-neutral-soft"])},w(C.enabled?u(t)("monitor.active"):u(t)("monitor.paused")),3)]),f("div",S1,[f("span",null,[H(u(Y),{icon:"clarity:refresh-line",class:"inline h-3 w-3 mr-0.5"}),Ce(" "+w(u(t)("monitor.everyInterval",{interval:k(C.interval_minutes)})),1)]),f("span",null,[H(u(Y),{icon:"clarity:music-note-line",class:"inline h-3 w-3 mr-0.5"}),Ce(" "+w(C.last_track_count===1?u(t)("monitor.tracksOne",{count:C.last_track_count}):u(t)("monitor.tracksMany",{count:C.last_track_count})),1)]),C.last_checked?(A(),O("span",E1,[H(u(Y),{icon:"clarity:clock-line",class:"inline h-3 w-3 mr-0.5"}),Ce(" "+w(u(t)("monitor.checked",{when:v(C.last_checked)})),1)])):(A(),O("span",A1,w(u(t)("monitor.notChecked")),1))])]),f("div",C1,[f("select",{value:C.interval_minutes,onChange:P=>h(C,P),class:"select select-xs rounded-full border border-white/10 bg-base-100/60 text-xs focus:border-primary/60"},[f("option",T1,w(u(t)("monitor.short15")),1),f("option",P1,w(u(t)("monitor.short30")),1),f("option",O1,w(u(t)("monitor.short1h")),1),f("option",D1,w(u(t)("monitor.short3h")),1),f("option",N1,w(u(t)("monitor.short6h")),1),f("option",I1,w(u(t)("monitor.short12h")),1),f("option",$1,w(u(t)("monitor.short1d")),1),f("option",L1,w(u(t)("monitor.short1w")),1),f("option",U1,w(u(t)("monitor.short2w")),1),f("option",F1,w(u(t)("monitor.short1mo")),1)],40,R1),f("button",{class:"icon-btn",title:C.enabled?u(t)("monitor.pause"):u(t)("monitor.resume"),onClick:P=>p(C)},[H(u(Y),{icon:C.enabled?"clarity:pause-line":"clarity:play-line",class:"h-4 w-4"},null,8,["icon"])],8,M1),f("button",{class:"icon-btn",title:u(t)("monitor.checkNow"),disabled:l.value[C.id],onClick:P=>g(C)},[l.value[C.id]?(A(),O("span",H1)):(A(),ct(u(Y),{key:1,icon:"clarity:refresh-line",class:"h-4 w-4"}))],8,B1),f("button",{class:"icon-btn text-error/70 hover:text-error hover:bg-error/10",title:u(t)("monitor.stop"),onClick:P=>b(C)},[H(u(Y),{icon:"clarity:trash-line",class:"h-4 w-4"})],8,j1)])]))),128))])),f("div",q1,[H(u(Y),{icon:"clarity:info-standard-line",class:"h-5 w-5 shrink-0 mt-0.5 text-primary/70"}),f("p",null,w(u(t)("monitor.info")),1)])])]))}},W1={class:"min-h-screen"},z1={class:"mx-auto max-w-5xl px-4 py-8 sm:px-6"},K1={class:"mb-8"},Q1={class:"text-2xl font-bold tracking-tight"},G1={class:"mt-1 text-sm text-base-content/60"},Y1={key:0,class:"surface rounded-2xl p-12 flex flex-col items-center text-center"},J1={class:"text-base-content/50 text-sm"},X1={class:"text-base-content/40 text-xs mt-1"},Z1={key:1,class:"space-y-3"},ew={key:2,class:"grid gap-6 lg:grid-cols-[1fr_360px]"},tw={class:"surface rounded-3xl p-6 sm:p-8 flex flex-col items-center text-center"},nw=["src","alt"],sw={key:2,class:"absolute bottom-3 right-3 equalizer h-5","aria-hidden":"true"},ow={class:"mt-6 w-full"},rw={class:"text-xl font-bold tracking-tight truncate"},iw={class:"text-sm text-base-content/60 truncate mt-0.5"},aw={class:"mt-6 w-full"},lw={class:"mt-2 flex items-center justify-between text-xs text-base-content/50 tabular-nums"},cw={class:"mt-5 flex items-center justify-center gap-3"},uw=["title"],dw=["title","disabled"],fw=["disabled","title"],pw=["title","disabled"],hw=["title"],mw={key:0,class:"absolute -bottom-0.5 -right-0.5 h-4 min-w-[1rem] px-1 rounded-full bg-primary text-primary-content text-[9px] font-bold flex items-center justify-center"},gw={class:"mt-6 w-full max-w-xs flex items-center gap-3"},yw=["title"],bw=["value","title"],vw={class:"surface rounded-3xl p-4 sm:p-5 lg:max-h-[640px] lg:overflow-y-auto"},_w={class:"flex items-center justify-between mb-3 px-1"},xw={class:"text-xs font-semibold uppercase tracking-wider text-base-content/50"},ww={class:"text-[11px] text-base-content/40"},kw={key:0,class:"space-y-1"},Sw=["onClick"],Ew=["src","alt","onError"],Aw={key:1,class:"relative equalizer h-3","aria-hidden":"true"},Cw={class:"flex-1 min-w-0"},Rw={class:"text-sm truncate font-medium"},Tw={class:"text-[11px] truncate text-base-content/50"},Pw={key:1,class:"text-center py-10"},Ow={class:"text-base-content/50 text-sm"},Dw={__name:"Player",setup(e){const{t}=St(),n=Ou(),s=se([]),o=se(!1),r=se(null),i=se({});let a=!1;function l(F){return be.coverFileURL(F)}function d(F){i.value={...i.value,[F]:!0}}async function c(){o.value=!0;try{const F=await be.listDownloads();s.value=(F.data||[]).map(Si),n.playlist.value.length===0&&s.value.length>0&&n.setPlaylist(s.value)}finally{o.value=!1}}function p(F){var x,_;n.playlist.value.length!==s.value.length||((x=n.playlist.value[F])==null?void 0:x.file)!==((_=s.value[F])==null?void 0:_.file)?n.setPlaylist(s.value,{startIndex:F}):n.playAt(F)}const h=me(()=>{const F=n.currentTrack.value;return F&&F.title?F.title:t("player.empty")}),g=me(()=>{const F=n.currentTrack.value;return F&&F.artist?F.artist:F?t("common.unknownArtist"):""}),b=me(()=>n.repeatMode.value==="one"?t("player.repeatOne"):n.repeatMode.value==="all"?t("player.repeatAll"):t("player.repeatOff"));function k(F){n.setVolume(parseFloat(F.target.value))}function v(F){const x=r.value;if(!x)return 0;const _=x.getBoundingClientRect(),E=(F.clientX||0)-_.left;return Math.max(0,Math.min(1,E/_.width))}function R(F){n.seekRatio(v(F))}function D(F){a=!0,n.seekRatio(v(F)),window.addEventListener("pointermove",C),window.addEventListener("pointerup",P,{once:!0})}function C(F){a&&n.seekRatio(v(F))}function P(){a=!1,window.removeEventListener("pointermove",C)}return en(()=>{window.scroll(0,0),c()}),ri(()=>{window.removeEventListener("pointermove",C)}),(F,x)=>(A(),O("div",W1,[H(Ls),H(Qn),f("div",z1,[f("div",K1,[f("h1",Q1,w(u(t)("player.title")),1),f("p",G1,w(u(t)("player.subtitle")),1)]),s.value.length===0&&!o.value?(A(),O("div",Y1,[H(u(Y),{icon:"clarity:headphones-line",class:"h-12 w-12 text-base-content/20 mb-4"}),f("p",J1,w(u(t)("player.empty")),1),f("p",X1,w(u(t)("player.emptyHint")),1)])):o.value&&!u(n).currentTrack.value?(A(),O("div",Z1,[...x[8]||(x[8]=[f("div",{class:"skeleton h-72 rounded-3xl"},null,-1),f("div",{class:"skeleton h-16 rounded-2xl"},null,-1),f("div",{class:"skeleton h-16 rounded-2xl"},null,-1)])])):(A(),O("div",ew,[f("section",tw,[f("div",{class:Ae(["relative h-56 w-56 sm:h-64 sm:w-64 rounded-3xl bg-primary/10 text-primary flex items-center justify-center overflow-hidden shadow-glow",{"pulse-glow":u(n).isPlaying.value}])},[u(n).currentTrack.value&&u(n).currentTrack.value.cover&&!i.value[u(n).currentTrack.value.file]?(A(),O("img",{key:0,src:u(n).currentTrack.value.cover,alt:u(n).currentTrack.value.title,class:"absolute inset-0 h-full w-full object-cover",onError:x[0]||(x[0]=_=>d(u(n).currentTrack.value.file))},null,40,nw)):(A(),ct(u(Y),{key:1,icon:"clarity:music-note-line",class:"h-24 w-24"})),u(n).isPlaying.value?(A(),O("div",sw,[...x[9]||(x[9]=[f("span",null,null,-1),f("span",null,null,-1),f("span",null,null,-1)])])):ie("",!0)],2),f("div",ow,[f("p",rw,w(h.value),1),f("p",iw,w(g.value),1)]),f("div",aw,[f("div",{class:"relative h-2 rounded-full bg-white/10 overflow-hidden cursor-pointer group",ref_key:"progressBar",ref:r,onClick:R,onPointerdown:D},[f("div",{class:"h-full bg-primary transition-[width] duration-150",style:Ln(`width: ${u(n).progressPct.value}%`)},null,4),f("div",{class:"absolute top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded-full bg-primary shadow-glow-sm transition-all duration-150 opacity-0 group-hover:opacity-100",style:Ln(`left: calc(${u(n).progressPct.value}% - 7px)`)},null,4)],544),f("div",lw,[f("span",null,w(u(pl)(u(n).currentTime.value)),1),f("span",null,w(u(pl)(u(n).duration.value)),1)])]),f("div",cw,[f("button",{class:Ae(["icon-btn",{"icon-btn-active":u(n).shuffle.value}]),onClick:x[1]||(x[1]=_=>u(n).toggleShuffle()),title:u(n).shuffle.value?u(t)("player.shuffleOn"):u(t)("player.shuffleOff")},[H(u(Y),{icon:"clarity:shuffle-line",class:"h-5 w-5"})],10,uw),f("button",{class:"icon-btn",onClick:x[2]||(x[2]=_=>u(n).prev()),title:u(t)("player.previous"),disabled:s.value.length===0},[H(u(Y),{icon:"clarity:step-forward-2-line",class:"h-5 w-5 -scale-x-100"})],8,dw),f("button",{class:"inline-flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-content shadow-glow-sm hover:scale-105 active:scale-95 transition disabled:opacity-50",onClick:x[3]||(x[3]=_=>u(n).toggle()),disabled:s.value.length===0,title:u(n).isPlaying.value?u(t)("player.pause"):u(t)("player.play")},[H(u(Y),{icon:u(n).isPlaying.value?"clarity:pause-solid":"clarity:play-solid",class:"h-6 w-6"},null,8,["icon"])],8,fw),f("button",{class:"icon-btn",onClick:x[4]||(x[4]=_=>u(n).next()),title:u(t)("player.next"),disabled:s.value.length===0},[H(u(Y),{icon:"clarity:step-forward-2-line",class:"h-5 w-5"})],8,pw),f("button",{class:Ae(["icon-btn relative",{"icon-btn-active":u(n).repeatMode.value!=="off"}]),onClick:x[5]||(x[5]=_=>u(n).cycleRepeat()),title:b.value},[H(u(Y),{icon:"clarity:refresh-line",class:"h-5 w-5"}),u(n).repeatMode.value==="one"?(A(),O("span",mw," 1 ")):ie("",!0)],10,hw)]),f("div",gw,[f("button",{class:"icon-btn",onClick:x[6]||(x[6]=_=>u(n).toggleMute()),title:u(n).isMuted.value?u(t)("player.unmute"):u(t)("player.mute")},[H(u(Y),{icon:u(n).isMuted.value||u(n).volume.value===0?"clarity:volume-mute-line":u(n).volume.value<.5?"clarity:volume-down-line":"clarity:volume-up-line",class:"h-5 w-5"},null,8,["icon"])],8,yw),f("input",{type:"range",min:"0",max:"1",step:"0.01",value:u(n).isMuted.value?0:u(n).volume.value,onInput:x[7]||(x[7]=_=>k(_)),class:"player-range flex-1",title:u(t)("player.volume")},null,40,bw)])]),f("aside",vw,[f("div",_w,[f("h2",xw,w(u(t)("player.queue")),1),f("span",ww,w(s.value.length===1?u(t)("player.countOne",{count:s.value.length}):u(t)("player.countMany",{count:s.value.length})),1)]),s.value.length>0?(A(),O("ul",kw,[(A(!0),O(fe,null,Ie(s.value,(_,E)=>(A(),O("li",{key:_.file,class:Ae(["rounded-xl px-2 py-2 flex items-center gap-3 cursor-pointer transition-colors",E===u(n).currentIndex.value?"bg-primary/10 text-primary":"hover:bg-white/5"]),onClick:j=>p(E)},[f("div",{class:Ae(["relative h-9 w-9 shrink-0 rounded-lg overflow-hidden flex items-center justify-center",E===u(n).currentIndex.value?"bg-primary/15":"bg-base-100/60"])},[i.value[_.file]?ie("",!0):(A(),O("img",{key:0,src:l(_.file),alt:_.title,class:"absolute inset-0 h-full w-full object-cover",loading:"lazy",onError:j=>d(_.file)},null,40,Ew)),E===u(n).currentIndex.value&&u(n).isPlaying.value?(A(),O("span",Aw,[...x[10]||(x[10]=[f("span",null,null,-1),f("span",null,null,-1),f("span",null,null,-1)])])):i.value[_.file]?(A(),ct(u(Y),{key:2,icon:"clarity:music-note-line",class:"h-4 w-4 text-base-content/50"})):ie("",!0)],2),f("div",Cw,[f("p",Rw,w(_.title),1),f("p",Tw,w(_.artist||u(t)("common.unknownArtist")),1)])],10,Sw))),128))])):(A(),O("div",Pw,[f("p",Ow,w(u(t)("player.empty")),1)]))])]))])]))}},Nw=Eu(Dw,[["__scopeId","data-v-98956c70"]]),Iw=[{path:"/",name:"Home",component:h_},{path:"/search/:query",name:"Search",component:r0},{path:"/download",name:"Download",component:Q0},{path:"/list",name:"List",component:Bx},{path:"/monitor",name:"Monitor",component:V1},{path:"/player",name:"Player",component:Nw}],it=Uv({history:mv(Ye.BASEURL),routes:Iw}),Du=rp(Ob);Du.use(it);Du.mount("#app"); diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 67c6cf9..d371ed0 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -5,7 +5,7 @@ Downtify - + diff --git a/frontend/src/components/DownloadList.vue b/frontend/src/components/DownloadList.vue index 4cee200..e928127 100644 --- a/frontend/src/components/DownloadList.vue +++ b/frontend/src/components/DownloadList.vue @@ -59,10 +59,9 @@ @click="statusFilter = tab.id" > {{ tab.label }} - ({{ tab.count }}) + ({{ tab.count }}) diff --git a/frontend/src/components/Settings.vue b/frontend/src/components/Settings.vue index d3d478b..424ecb7 100644 --- a/frontend/src/components/Settings.vue +++ b/frontend/src/components/Settings.vue @@ -102,7 +102,9 @@ - -
    +
    diff --git a/frontend/src/components/SearchInput.vue b/frontend/src/components/SearchInput.vue index b405664..0054d4f 100644 --- a/frontend/src/components/SearchInput.vue +++ b/frontend/src/components/SearchInput.vue @@ -68,7 +68,6 @@ const placeHolderRotation = [ ] const rotationIndex = ref(0) const placeHolder = computed(() => { - // depend on locale to refresh translated default placeholder const _ = locale.value if (rotationIndex.value === 0) return t('search.placeholder') return placeHolderRotation[rotationIndex.value - 1] diff --git a/frontend/src/components/Settings.vue b/frontend/src/components/Settings.vue index 424ecb7..9006b18 100644 --- a/frontend/src/components/Settings.vue +++ b/frontend/src/components/Settings.vue @@ -527,6 +527,57 @@
    + +
    + + + +

    + {{ t('settings.reconcileIntro') }} +

    + +

    + {{ reconcileMessage }} +

    +
    +
    -
    +
    diff --git a/frontend/src/components/Settings.vue b/frontend/src/components/Settings.vue index 9006b18..6d247e3 100644 --- a/frontend/src/components/Settings.vue +++ b/frontend/src/components/Settings.vue @@ -741,7 +741,7 @@ const SLSKD_DEFAULTS = { timeout_seconds: 20, search_retries: 5, search_poll_seconds: 15, - download_attempts: 3, + download_attempts: 5, poll_interval_seconds: 5, poll_max_attempts: 60, download_timeout_seconds: 600, diff --git a/frontend/src/i18n/locales/en.js b/frontend/src/i18n/locales/en.js index e28488b..1fcbd16 100644 --- a/frontend/src/i18n/locales/en.js +++ b/frontend/src/i18n/locales/en.js @@ -234,7 +234,7 @@ export default { "Save songs in subfolders named after the artist. Playlist tracks are also placed in their artist's folder instead of a playlist folder.", parallelDownloads: 'Parallel downloads', parallelDownloadsHint: - 'Maximum songs at once (YouTube and slskd). Tap a number, then Save — applies to new work; a playlist already running keeps its current batch until you start another. With slskd on, prefer 2–3: slskd caps concurrent Soulseek searches; higher values mostly queue or fail, not faster downloads.', + 'Maximum songs downloading at once (YouTube and slskd), shared across all playlists in the queue. Tap a number, then Save. With slskd on, prefer 2–3.', saved: 'Changes saved', saveError: "Couldn't save settings.", language: 'Language', @@ -306,6 +306,9 @@ export default { nowPlaying: 'Now playing', upNext: 'Up next', playFromLibrary: 'Open in player', + selectAll: 'Select all', + selectedCount: '{selected} of {total} selected', + deleteTrack: 'Remove from library', countOne: '{count} track', countMany: '{count} tracks', }, diff --git a/frontend/src/i18n/locales/es.js b/frontend/src/i18n/locales/es.js index 5b1b695..f47a026 100644 --- a/frontend/src/i18n/locales/es.js +++ b/frontend/src/i18n/locales/es.js @@ -311,6 +311,9 @@ export default { nowPlaying: 'Sonando ahora', upNext: 'A continuación', playFromLibrary: 'Abrir en el reproductor', + selectAll: 'Seleccionar todo', + selectedCount: '{selected} de {total} seleccionados', + deleteTrack: 'Quitar de la biblioteca', countOne: '{count} pista', countMany: '{count} pistas', }, diff --git a/frontend/src/i18n/locales/pt-BR.js b/frontend/src/i18n/locales/pt-BR.js index 84374f0..a6a094d 100644 --- a/frontend/src/i18n/locales/pt-BR.js +++ b/frontend/src/i18n/locales/pt-BR.js @@ -310,6 +310,9 @@ export default { nowPlaying: 'Tocando agora', upNext: 'A seguir', playFromLibrary: 'Abrir no player', + selectAll: 'Selecionar tudo', + selectedCount: '{selected} de {total} selecionados', + deleteTrack: 'Remover da biblioteca', countOne: '{count} faixa', countMany: '{count} faixas', }, diff --git a/frontend/src/index.css b/frontend/src/index.css index 437303c..b1460fd 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -32,6 +32,13 @@ min-height: 100dvh; } + @media (max-width: 1023px) { + body { + /* Fixed backgrounds break scrolling/layout on many mobile browsers */ + background-attachment: scroll; + } + } + [data-theme='downtify-light'] body { background-image: radial-gradient( @@ -112,6 +119,27 @@ @apply bg-primary text-primary-content hover:bg-primary hover:text-primary-content shadow-glow-sm; } + .icon-btn-compact { + @apply h-9 w-9; + } + @media (min-width: 640px) { + .icon-btn-compact { + @apply h-10 w-10; + } + } + + .progress-thumb { + @apply opacity-100; + } + @media (hover: hover) and (pointer: fine) { + .progress-thumb { + @apply opacity-0; + } + .group:hover .progress-thumb { + @apply opacity-100; + } + } + .pill { @apply inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium; } @@ -119,6 +147,12 @@ .input-modern { @apply w-full h-12 rounded-full bg-base-100/85 border border-white/10 px-5 pr-14 text-base-content placeholder:text-base-content/40 outline-none transition focus:border-primary/60 focus:shadow-glow-sm; } + /* Avoid duplicate clear control when a custom clear button is used nearby */ + input[type='search']::-webkit-search-cancel-button, + input[type='search']::-webkit-search-decoration { + -webkit-appearance: none; + appearance: none; + } [data-theme='downtify-light'] .input-modern { @apply bg-white border-black/10; } diff --git a/frontend/src/model/api.js b/frontend/src/model/api.js index 0d6bbae..6cd1ff9 100644 --- a/frontend/src/model/api.js +++ b/frontend/src/model/api.js @@ -4,15 +4,19 @@ import config from '/src/config.js' import { v4 as uuidv4 } from 'uuid' -console.log('using env:', process.env) -console.log('using config: ', config) +if (import.meta.env.DEV) { + console.log('using env:', process.env) + console.log('using config: ', config) +} const API = axios.create({ baseURL: `${config.PROTOCOL}//${config.BACKEND}:${config.PORT}${config.BASEURL}`, }) const sessionID = uuidv4() -console.log('session ID: ', sessionID) +if (import.meta.env.DEV) { + console.log('session ID: ', sessionID) +} getVersion() @@ -23,14 +27,18 @@ const wsConnection = new WebSocket( ) wsConnection.onopen = (event) => { - console.log('websocket connection opened', event) + if (import.meta.env.DEV) { + console.log('websocket connection opened', event) + } } function getVersion() { API.get('/api/version') .then((res) => { const prevItem = localStorage.getItem('version') - console.log('Backend version: ', res.data) + if (import.meta.env.DEV) { + console.log('Backend version: ', res.data) + } localStorage.setItem('version', res.data) if (prevItem != res.data) { location.reload() diff --git a/frontend/src/model/player.js b/frontend/src/model/player.js index 5b2641f..92b79f2 100644 --- a/frontend/src/model/player.js +++ b/frontend/src/model/player.js @@ -82,6 +82,7 @@ export function normalizeLibraryEntry(raw) { artist: artist || base.artist, album: album || base.album, playlists, + has_cover: Boolean(raw?.has_cover), } } @@ -98,22 +99,58 @@ function buildShuffleOrder() { : 0 } +function storedPathFromMediaUrl(src) { + if (!src) return null + try { + const path = new URL(src, window.location.origin).pathname + const prefix = '/media/' + if (path.startsWith(prefix)) { + return decodeURIComponent(path.slice(prefix.length)) + } + } catch { + /* ignore */ + } + return null +} + function setPlaylist(files, options = {}) { + const prevFile = + currentIndex.value >= 0 && currentIndex.value < playlist.value.length + ? playlist.value[currentIndex.value]?.file + : null + const audioFile = audio?.src ? storedPathFromMediaUrl(audio.src) : null + const keepFile = prevFile || audioFile || null const tracks = (files || []).map((f) => typeof f === 'string' ? trackFromFile(f) : normalizeLibraryEntry(f) ) playlist.value = tracks - if (currentIndex.value >= tracks.length) currentIndex.value = -1 if (shuffle.value) buildShuffleOrder() + + if (options.preservePlayback) { + if (keepFile) { + const idx = tracks.findIndex((t) => t.file === keepFile) + currentIndex.value = idx + if (idx < 0 && audio && !audio.paused) { + audio.pause() + } + } else if (currentIndex.value >= tracks.length) { + currentIndex.value = -1 + } + return + } + + if (currentIndex.value >= tracks.length) currentIndex.value = -1 + const shouldAutoplay = options.autoplay === true if (typeof options.startIndex === 'number') { - playAt(options.startIndex) - } else if (options.autoplay && tracks.length > 0 && currentIndex.value < 0) { - playAt(0) + playAt(options.startIndex, { autoplay: shouldAutoplay }) + } else if (shouldAutoplay && tracks.length > 0 && currentIndex.value < 0) { + playAt(0, { autoplay: true }) } } -function playAt(index) { +function playAt(index, options = {}) { if (index < 0 || index >= playlist.value.length) return + const autoplay = options.autoplay !== false const a = ensureAudio() currentIndex.value = index if (shuffle.value) { @@ -124,7 +161,11 @@ function playAt(index) { a.src = playlist.value[index].url a.currentTime = 0 currentTime.value = 0 - a.play().catch(() => {}) + if (autoplay) { + a.play().catch(() => {}) + } else { + a.pause() + } } function play() { diff --git a/frontend/src/model/settings.js b/frontend/src/model/settings.js index 90fde9a..5cf3f5b 100644 --- a/frontend/src/model/settings.js +++ b/frontend/src/model/settings.js @@ -7,6 +7,7 @@ const settings = ref({ youtube: { cookies_file: '', cookies_from_browser: '', + download_timeout_seconds: 900, cookies_file_exists: false, cookies_looks_authenticated: false, cookies_auth_names: [], @@ -21,7 +22,7 @@ const settings = ref({ timeout_seconds: 20, search_retries: 5, search_poll_seconds: 15, - download_attempts: 3, + download_attempts: 5, poll_interval_seconds: 5, poll_max_attempts: 60, download_timeout_seconds: 600, @@ -66,7 +67,9 @@ const settingsOptions = { API.getSettings().then((res) => { if (res.status === 200) { - console.log('Received settings:', res.data) + if (import.meta.env.DEV) { + console.log('Received settings:', res.data) + } settings.value = { ...settings.value, ...res.data, diff --git a/frontend/src/views/Downloads.vue b/frontend/src/views/Downloads.vue index d8c0fe9..5183b96 100644 --- a/frontend/src/views/Downloads.vue +++ b/frontend/src/views/Downloads.vue @@ -1,5 +1,5 @@