Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Initialize a new expo app

+7077
+80
CLAUDE.md
··· 35 35 types/ Shared Rust types 36 36 traits/ Shared Rust traits 37 37 zig/ Zig build script and thin main.zig entry point 38 + gpui/ Desktop client (GPUI / Rust) — reference UI for the mobile app 39 + expo/ React Native / Expo mobile app (see `expo/CLAUDE.md` rules below) 38 40 ``` 39 41 40 42 ## Build system ··· 178 180 6. Add a `set_<name>_*` wrapper if configuration is needed. 179 181 7. Handle in `crates/settings/src/lib.rs:load_settings()`. 180 182 8. If the sink has a Rust implementation in a new crate: add a `_link_<name>()` dummy fn and reference it from `crates/cli/src/lib.rs` to force inclusion in the staticlib. 183 + 184 + ## Mobile app (`expo/`) 185 + 186 + A React Native client (Expo Router + NativeWind) lives in `expo/`. It mirrors 187 + the GPUI desktop layout (`gpui/src/ui/`) — same dark palette, same 188 + Spotify/Tidal-inspired information architecture: bottom-tab shell with a 189 + persistent miniplayer, full-screen player modal, queue modal, and detail 190 + screens for album / artist / playlist / genre. Most state is mock-only today; 191 + real data should plug into the rockboxd gRPC / GraphQL client (`crates/server/`). 192 + 193 + ### Stack 194 + - **Expo SDK 54** + **expo-router** for file-based routing (`app/`). 195 + - **NativeWind 4** with Tailwind 3 — class-based styling against a custom palette 196 + declared in both `expo/tailwind.config.js` and `expo/constants/theme.ts` 197 + (keep the two in sync). 198 + - `expo-image`, `expo-blur`, `expo-linear-gradient`, `@expo/vector-icons` 199 + (Ionicons + MaterialCommunityIcons), `react-native-safe-area-context`. 200 + 201 + ### Layout 202 + ``` 203 + expo/ 204 + ├── app/ 205 + │ ├── _layout.tsx root stack, fonts, PlayerProvider, modals 206 + │ ├── (tabs)/_layout.tsx custom tab bar with merged miniplayer dock 207 + │ ├── (tabs)/{index,search,library}.tsx 208 + │ ├── player.tsx, queue.tsx, settings.tsx 209 + │ ├── album/[id].tsx, artist/[id].tsx, playlist/[id].tsx, genre/[id].tsx 210 + │ └── playlist/new.tsx create regular OR smart (?mode=smart) 211 + ├── components/ mini-player, action-sheet, track-context-menu, … 212 + ├── lib/ 213 + │ ├── player-context.tsx single source of truth for playback state 214 + │ ├── mock-data.ts ALBUMS / ARTISTS / PLAYLISTS / GENRES + helpers 215 + │ └── nativewind-setup.ts cssInterop registrations (must be imported) 216 + ├── constants/theme.ts `Colors` palette consumed by inline styles 217 + ├── tailwind.config.js `Colors` palette mirrored as Tailwind tokens 218 + ├── babel.config.js babel-preset-expo + nativewind/babel 219 + └── metro.config.js withNativeWind({ input: './global.css' }) 220 + ``` 221 + 222 + ### Styling rules — NativeWind only 223 + 224 + - **Always use `className` for styling.** Inline `style={{...}}` is reserved for 225 + values className genuinely cannot express: `Animated.Value` bindings, 226 + runtime-computed widths (`` `${pct * 100}%` ``), per-instance shadow tokens, 227 + or colors derived from data (e.g. `genre.color`). 228 + - **Never combine a function `style={(state) => ({...})}` with `className` on 229 + the same element.** The function `style` overrides NativeWind's class output 230 + and silently drops every utility on that element. Use arbitrary-value classes 231 + (`w-[48.5%]`, `h-[100px]`, `aspect-square`) and the `active:` variant for 232 + press feedback instead. 233 + - Static `style={{...}}` objects (no callbacks) merge fine with `className`. 234 + - Color tokens live in `tailwind.config.js` under `bg.*`, `accent.*`, `text.*`, 235 + `border`, `divider`, `slider.*`, `danger`. Reach for these (`bg-bg-card`, 236 + `text-text-secondary`, `bg-accent`) instead of hard-coded hex values. 237 + - `expo-image`, `expo-blur`, `expo-linear-gradient`, and the safe-area 238 + `SafeAreaView` are wired up via `cssInterop` in `lib/nativewind-setup.ts` — 239 + any other third-party component needs to be registered there before it can 240 + accept `className`. 241 + - Fonts: `font-sans` → SpaceGrotesk (UI), `font-mono` → JetBrainsMono 242 + (durations / numerics). The TTFs are bundled via the `expo-font` plugin in 243 + `app.json` and copied from `gpui/assets/fonts/`. 244 + 245 + ### Player state 246 + `lib/player-context.tsx` holds queue, currentIdx, position (1 Hz tick), 247 + isPlaying, shuffle, repeat, liked, userPlaylists, and the global track / entity 248 + context-menu state. The mock advances `position` and auto-advances tracks; the 249 + real implementation should replace the action handlers with rockboxd RPC calls 250 + while keeping the same shape so the UI doesn't need to change. 251 + 252 + ### Useful commands 253 + ```sh 254 + cd expo 255 + bun install # or npm/yarn 256 + bun run start # iOS / Android / web via expo-router 257 + bunx tsc --noEmit # type check 258 + bunx expo lint # lint 259 + bunx expo export --platform web # smoke-test the bundle (catches NativeWind transform issues) 260 + ``` 181 261 182 262 ## Useful commands 183 263
+43
expo/.gitignore
··· 1 + # Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files 2 + 3 + # dependencies 4 + node_modules/ 5 + 6 + # Expo 7 + .expo/ 8 + dist/ 9 + web-build/ 10 + expo-env.d.ts 11 + 12 + # Native 13 + .kotlin/ 14 + *.orig.* 15 + *.jks 16 + *.p8 17 + *.p12 18 + *.key 19 + *.mobileprovision 20 + 21 + # Metro 22 + .metro-health-check* 23 + 24 + # debug 25 + npm-debug.* 26 + yarn-debug.* 27 + yarn-error.* 28 + 29 + # macOS 30 + .DS_Store 31 + *.pem 32 + 33 + # local env files 34 + .env*.local 35 + 36 + # typescript 37 + *.tsbuildinfo 38 + 39 + app-example 40 + 41 + # generated native folders 42 + /ios 43 + /android
+80
expo/README.md
··· 1 + # Rockbox Mobile 2 + 3 + A React Native / Expo client for Rockbox — the mobile companion to the 4 + [GPUI desktop app](../gpui). Designed with a Spotify / Tidal-inspired layout 5 + on top of the Rockbox dark theme (`#0F1117` background, `#6F00FF` accent). 6 + 7 + ## Stack 8 + 9 + - **Expo Router** — file-based routing (`app/`) 10 + - **NativeWind** — Tailwind utility classes for React Native 11 + - **expo-image** — fast image loading for album art 12 + - **expo-font** — bundles `SpaceGrotesk` (UI) and `JetBrainsMono` (numerals) 13 + - **@expo/vector-icons** — Ionicons for playback controls 14 + 15 + ## Layout 16 + 17 + ``` 18 + app/ 19 + ├─ _layout.tsx Root stack — fonts, PlayerProvider, modals 20 + ├─ (tabs)/ 21 + │ ├─ _layout.tsx Custom tab bar with persistent MiniPlayer 22 + │ ├─ index.tsx Home — greeting, quick picks, recently played, mixes 23 + │ ├─ search.tsx Search bar + genre tile grid + live results 24 + │ └─ library.tsx Playlists / Songs / Albums / Artists / Liked pills 25 + ├─ player.tsx Full-screen now playing (modal, slide-up) 26 + └─ queue.tsx Up-next queue (modal) 27 + 28 + components/ 29 + ├─ mini-player.tsx Pinned bottom miniplayer with progress bar 30 + ├─ seek-bar.tsx Tappable / draggable progress + volume slider 31 + ├─ card-row.tsx Horizontal scroll of square / circular tiles 32 + └─ section-header.tsx Section title + subtitle 33 + 34 + lib/ 35 + ├─ player-context.tsx Global playback state (queue, position, like, repeat…) 36 + ├─ mock-data.ts Albums / artists / playlists / tracks / genres 37 + └─ types.ts Shared types 38 + 39 + constants/theme.ts Rockbox dark palette (mirrors gpui/src/ui/theme.rs) 40 + tailwind.config.js Same palette exposed as Tailwind colors 41 + ``` 42 + 43 + ## Dark theme 44 + 45 + Mirrors [`gpui/src/ui/theme.rs`](../gpui/src/ui/theme.rs): 46 + 47 + | Token | Hex | 48 + | ------------ | -------------------- | 49 + | `appBg` | `#0F1117` | 50 + | `bgCard` | `#1A1D26` | 51 + | `accent` | `#6F00FF` | 52 + | `accentSoft` | `#1A0E3D` | 53 + | `text/primary` | `#FFFFFF` | 54 + | `text/secondary` | `#9898A8` | 55 + | `border` | `rgba(255,255,255,0.16)` | 56 + 57 + The app icon (`assets/images/icon.png`, splash, favicon, Android adaptive 58 + foreground) is rendered from [`gpui/assets/rockbox.svg`](../gpui/assets/rockbox.svg). 59 + 60 + ## Get started 61 + 62 + ```sh 63 + bun install # or npm install / yarn 64 + bun run start # or npx expo start 65 + ``` 66 + 67 + Then pick: 68 + 69 + - `i` — iOS Simulator 70 + - `a` — Android emulator 71 + - `w` — Web (works for layout review; native-only modules will degrade gracefully) 72 + 73 + ## Mock playback 74 + 75 + The `PlayerProvider` runs a 1 Hz tick that advances `position` while 76 + `isPlaying` is true, with auto-advance and repeat-one / repeat-all 77 + semantics that mirror the GPUI controller. There is no audio engine wired 78 + up yet — controls update the in-memory state only. To connect real 79 + playback, replace the action handlers in `lib/player-context.tsx` with 80 + calls to the rockboxd gRPC / GraphQL API.
+59
expo/app.json
··· 1 + { 2 + "expo": { 3 + "name": "Rockbox", 4 + "slug": "Rockbox", 5 + "version": "1.0.0", 6 + "orientation": "portrait", 7 + "icon": "./assets/images/icon.png", 8 + "scheme": "rockbox", 9 + "userInterfaceStyle": "dark", 10 + "newArchEnabled": true, 11 + "ios": { 12 + "supportsTablet": true 13 + }, 14 + "android": { 15 + "adaptiveIcon": { 16 + "backgroundColor": "#000000", 17 + "foregroundImage": "./assets/images/android-icon-foreground.png", 18 + "backgroundImage": "./assets/images/android-icon-background.png", 19 + "monochromeImage": "./assets/images/android-icon-monochrome.png" 20 + }, 21 + "edgeToEdgeEnabled": true, 22 + "predictiveBackGestureEnabled": false, 23 + "package": "com.tsirysndr.Rockbox" 24 + }, 25 + "web": { 26 + "output": "static", 27 + "favicon": "./assets/images/favicon.png", 28 + "bundler": "metro" 29 + }, 30 + "plugins": [ 31 + "expo-router", 32 + [ 33 + "expo-splash-screen", 34 + { 35 + "image": "./assets/images/splash-icon.png", 36 + "imageWidth": 200, 37 + "resizeMode": "contain", 38 + "backgroundColor": "#000000", 39 + "dark": { 40 + "backgroundColor": "#000000" 41 + } 42 + } 43 + ], 44 + [ 45 + "expo-font", 46 + { 47 + "fonts": [ 48 + "./assets/fonts/SpaceGrotesk.ttf", 49 + "./assets/fonts/JetBrainsMono.ttf" 50 + ] 51 + } 52 + ] 53 + ], 54 + "experiments": { 55 + "typedRoutes": true, 56 + "reactCompiler": true 57 + } 58 + } 59 + }
+116
expo/app/(tabs)/_layout.tsx
··· 1 + import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; 2 + import type { BottomTabBarProps } from "@react-navigation/bottom-tabs"; 3 + import { Tabs } from "expo-router"; 4 + import { Pressable, Text, View } from "react-native"; 5 + import * as Haptics from "expo-haptics"; 6 + 7 + import { MiniPlayer } from "@/components/mini-player"; 8 + import { Colors } from "@/constants/theme"; 9 + 10 + type IconFamily = "ion" | "mci"; 11 + 12 + const TAB_ICONS: Record< 13 + string, 14 + { family: IconFamily; active: string; inactive: string } 15 + > = { 16 + index: { family: "mci", active: "home-variant", inactive: "home-variant-outline" }, 17 + search: { family: "ion", active: "search", inactive: "search-outline" }, 18 + library: { family: "ion", active: "albums", inactive: "albums-outline" }, 19 + }; 20 + 21 + const TAB_LABELS: Record<string, string> = { 22 + index: "Home", 23 + search: "Search", 24 + library: "Your Library", 25 + }; 26 + 27 + function TabIcon({ 28 + family, 29 + name, 30 + size, 31 + color, 32 + }: { 33 + family: IconFamily; 34 + name: string; 35 + size: number; 36 + color: string; 37 + }) { 38 + if (family === "mci") { 39 + return ( 40 + <MaterialCommunityIcons name={name as any} size={size} color={color} /> 41 + ); 42 + } 43 + return <Ionicons name={name as any} size={size} color={color} />; 44 + } 45 + 46 + function CustomTabBar({ state, navigation }: BottomTabBarProps) { 47 + return ( 48 + <View className="bg-bg"> 49 + <View 50 + className="bg-bg-dock rounded-t-[20px] overflow-hidden" 51 + style={{ 52 + shadowColor: "#000", 53 + shadowOpacity: 0.5, 54 + shadowRadius: 12, 55 + shadowOffset: { width: 0, height: -6 }, 56 + }} 57 + > 58 + <MiniPlayer /> 59 + <View className="flex-row pt-1.5 pb-6 px-2"> 60 + {state.routes.map((route, idx) => { 61 + const isFocused = state.index === idx; 62 + const iconConfig = TAB_ICONS[route.name]; 63 + const label = TAB_LABELS[route.name] ?? route.name; 64 + if (!iconConfig) return null; 65 + 66 + return ( 67 + <Pressable 68 + key={route.key} 69 + accessibilityRole="button" 70 + onPress={() => { 71 + if (process.env.EXPO_OS === "ios") { 72 + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); 73 + } 74 + const event = navigation.emit({ 75 + type: "tabPress", 76 + target: route.key, 77 + canPreventDefault: true, 78 + }); 79 + if (!isFocused && !event.defaultPrevented) { 80 + navigation.navigate(route.name, route.params); 81 + } 82 + }} 83 + className="flex-1 items-center justify-center gap-0.5 py-1" 84 + > 85 + <TabIcon 86 + family={iconConfig.family} 87 + name={isFocused ? iconConfig.active : iconConfig.inactive} 88 + size={26} 89 + color={isFocused ? Colors.textPrimary : Colors.textMuted} 90 + /> 91 + <Text 92 + className={`text-[11px] font-medium ${isFocused ? "text-text-primary" : "text-text-muted"}`} 93 + > 94 + {label} 95 + </Text> 96 + </Pressable> 97 + ); 98 + })} 99 + </View> 100 + </View> 101 + </View> 102 + ); 103 + } 104 + 105 + export default function TabLayout() { 106 + return ( 107 + <Tabs 108 + tabBar={(props) => <CustomTabBar {...props} />} 109 + screenOptions={{ headerShown: false }} 110 + > 111 + <Tabs.Screen name="index" options={{ title: "Home" }} /> 112 + <Tabs.Screen name="search" options={{ title: "Search" }} /> 113 + <Tabs.Screen name="library" options={{ title: "Your Library" }} /> 114 + </Tabs> 115 + ); 116 + }
+124
expo/app/(tabs)/index.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Image } from "expo-image"; 3 + import { router } from "expo-router"; 4 + import { Pressable, ScrollView, Text, View } from "react-native"; 5 + import { SafeAreaView } from "react-native-safe-area-context"; 6 + 7 + import { CardRow } from "@/components/card-row"; 8 + import { SectionHeader } from "@/components/section-header"; 9 + import { Colors } from "@/constants/theme"; 10 + import { 11 + ALBUMS, 12 + MADE_FOR_YOU, 13 + PLAYLISTS, 14 + RECENTLY_PLAYED, 15 + TOP_ARTISTS, 16 + } from "@/lib/mock-data"; 17 + 18 + export default function HomeScreen() { 19 + const quickPicks = PLAYLISTS.slice(0, 6); 20 + 21 + return ( 22 + <SafeAreaView className="flex-1 bg-bg" edges={["top"]}> 23 + <ScrollView 24 + contentContainerStyle={{ paddingBottom: 24 }} 25 + showsVerticalScrollIndicator={false} 26 + > 27 + <View className="px-4 pt-2 pb-4 flex-row items-center justify-between"> 28 + <Text className="text-text-primary text-[26px] font-extrabold font-sans"> 29 + Home 30 + </Text> 31 + <Pressable 32 + hitSlop={8} 33 + onPress={() => router.push("/settings")} 34 + className="w-9 h-9 rounded-full bg-bg-card items-center justify-center" 35 + > 36 + <Ionicons 37 + name="settings-outline" 38 + size={20} 39 + color={Colors.textPrimary} 40 + /> 41 + </Pressable> 42 + </View> 43 + 44 + {/* Quick picks 2-column grid (Spotify-style) */} 45 + <View className="px-4 flex-row flex-wrap gap-2 mb-6"> 46 + {quickPicks.map((p) => ( 47 + <Pressable 48 + key={p.id} 49 + onPress={() => router.push(`/playlist/${p.id}`)} 50 + className="w-[48.5%] flex-row items-center bg-bg-card rounded-md overflow-hidden active:bg-bg-hover" 51 + > 52 + <Image 53 + source={p.artwork} 54 + className="w-14 h-14" 55 + contentFit="cover" 56 + /> 57 + <Text 58 + numberOfLines={2} 59 + className="flex-1 text-text-primary text-[13px] font-semibold px-2.5 font-sans" 60 + > 61 + {p.name} 62 + </Text> 63 + </Pressable> 64 + ))} 65 + </View> 66 + 67 + <SectionHeader title="Recently played" /> 68 + <View className="mb-7"> 69 + <CardRow 70 + data={RECENTLY_PLAYED.map((a) => ({ 71 + id: a.id, 72 + title: a.title, 73 + subtitle: a.artist, 74 + image: a.artwork, 75 + }))} 76 + onPress={(item) => router.push(`/album/${item.id}`)} 77 + /> 78 + </View> 79 + 80 + <SectionHeader 81 + title="Made for you" 82 + subtitle="Curated mixes refreshed daily" 83 + /> 84 + <View className="mb-7"> 85 + <CardRow 86 + data={MADE_FOR_YOU.map((p) => ({ 87 + id: p.id, 88 + title: p.name, 89 + subtitle: p.description, 90 + image: p.artwork, 91 + }))} 92 + onPress={(item) => router.push(`/playlist/${item.id}`)} 93 + /> 94 + </View> 95 + 96 + <SectionHeader title="Your top artists" /> 97 + <View className="mb-7"> 98 + <CardRow 99 + size={130} 100 + data={TOP_ARTISTS.map((a) => ({ 101 + id: a.id, 102 + title: a.name, 103 + subtitle: "Artist", 104 + image: a.image, 105 + rounded: "full" as const, 106 + }))} 107 + onPress={(item) => router.push(`/artist/${item.id}`)} 108 + /> 109 + </View> 110 + 111 + <SectionHeader title="Popular albums" /> 112 + <CardRow 113 + data={ALBUMS.map((a) => ({ 114 + id: a.id, 115 + title: a.title, 116 + subtitle: `${a.artist}${a.year ? ` • ${a.year}` : ""}`, 117 + image: a.artwork, 118 + }))} 119 + onPress={(item) => router.push(`/album/${item.id}`)} 120 + /> 121 + </ScrollView> 122 + </SafeAreaView> 123 + ); 124 + }
+440
expo/app/(tabs)/library.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Image } from "expo-image"; 3 + import { router } from "expo-router"; 4 + import { useMemo, useState } from "react"; 5 + import { 6 + FlatList, 7 + Modal, 8 + Pressable, 9 + ScrollView, 10 + Text, 11 + TextInput, 12 + View, 13 + } from "react-native"; 14 + import { SafeAreaView } from "react-native-safe-area-context"; 15 + 16 + import { TrackMenuButton } from "@/components/track-menu-button"; 17 + import { Colors } from "@/constants/theme"; 18 + import { 19 + ALBUMS, 20 + ALL_SONGS, 21 + ARTISTS, 22 + PLAYLISTS, 23 + formatDuration, 24 + } from "@/lib/mock-data"; 25 + import { usePlayer } from "@/lib/player-context"; 26 + import type { LibrarySection } from "@/lib/types"; 27 + 28 + const SECTIONS: { id: LibrarySection; label: string }[] = [ 29 + { id: "playlists", label: "Playlists" }, 30 + { id: "songs", label: "Songs" }, 31 + { id: "albums", label: "Albums" }, 32 + { id: "artists", label: "Artists" }, 33 + { id: "liked", label: "Liked" }, 34 + ]; 35 + 36 + export default function LibraryScreen() { 37 + const [section, setSection] = useState<LibrarySection>("playlists"); 38 + const [searchOpen, setSearchOpen] = useState(false); 39 + const [searchQuery, setSearchQuery] = useState(""); 40 + const [createOpen, setCreateOpen] = useState(false); 41 + const { liked, jumpTo, queue, userPlaylists } = usePlayer(); 42 + 43 + const q = searchQuery.trim().toLowerCase(); 44 + const allPlaylists = useMemo( 45 + () => [...userPlaylists, ...PLAYLISTS], 46 + [userPlaylists], 47 + ); 48 + const filteredPlaylists = useMemo( 49 + () => 50 + q 51 + ? allPlaylists.filter((p) => p.name.toLowerCase().includes(q)) 52 + : allPlaylists, 53 + [q, allPlaylists], 54 + ); 55 + const filteredSongs = useMemo( 56 + () => 57 + q 58 + ? ALL_SONGS.filter( 59 + (t) => 60 + t.title.toLowerCase().includes(q) || 61 + t.artist.toLowerCase().includes(q), 62 + ) 63 + : ALL_SONGS, 64 + [q], 65 + ); 66 + const filteredAlbums = useMemo( 67 + () => 68 + q 69 + ? ALBUMS.filter( 70 + (a) => 71 + a.title.toLowerCase().includes(q) || 72 + a.artist.toLowerCase().includes(q), 73 + ) 74 + : ALBUMS, 75 + [q], 76 + ); 77 + const filteredArtists = useMemo( 78 + () => (q ? ARTISTS.filter((a) => a.name.toLowerCase().includes(q)) : ARTISTS), 79 + [q], 80 + ); 81 + 82 + return ( 83 + <SafeAreaView className="flex-1 bg-bg" edges={["top"]}> 84 + <View className="px-4 pt-2 pb-3 flex-row items-center justify-between"> 85 + <Text className="text-text-primary text-[26px] font-extrabold font-sans"> 86 + Your Library 87 + </Text> 88 + <View className="flex-row gap-3"> 89 + <Pressable 90 + hitSlop={10} 91 + onPress={() => { 92 + setSearchOpen((v) => { 93 + if (v) setSearchQuery(""); 94 + return !v; 95 + }); 96 + }} 97 + > 98 + <Ionicons 99 + name={searchOpen ? "close" : "search-outline"} 100 + size={22} 101 + color={Colors.textPrimary} 102 + /> 103 + </Pressable> 104 + <Pressable hitSlop={10} onPress={() => setCreateOpen(true)}> 105 + <Ionicons name="add" size={26} color={Colors.textPrimary} /> 106 + </Pressable> 107 + </View> 108 + </View> 109 + 110 + {searchOpen ? ( 111 + <View className="px-4 pb-3"> 112 + <View className="flex-row items-center bg-bg-card rounded-md px-3 h-10 gap-2"> 113 + <Ionicons name="search" size={16} color={Colors.textMuted} /> 114 + <TextInput 115 + autoFocus 116 + value={searchQuery} 117 + onChangeText={setSearchQuery} 118 + placeholder="Search in library" 119 + placeholderTextColor={Colors.textMuted} 120 + className="flex-1 text-text-primary text-sm font-sans" 121 + /> 122 + {searchQuery.length > 0 ? ( 123 + <Pressable hitSlop={6} onPress={() => setSearchQuery("")}> 124 + <Ionicons 125 + name="close-circle" 126 + size={16} 127 + color={Colors.textMuted} 128 + /> 129 + </Pressable> 130 + ) : null} 131 + </View> 132 + </View> 133 + ) : null} 134 + 135 + <View className="h-12 mb-2"> 136 + <ScrollView 137 + horizontal 138 + showsHorizontalScrollIndicator={false} 139 + contentContainerStyle={{ 140 + paddingHorizontal: 16, 141 + alignItems: "center", 142 + gap: 8, 143 + }} 144 + > 145 + {SECTIONS.map((s) => { 146 + const active = s.id === section; 147 + return ( 148 + <Pressable 149 + key={s.id} 150 + onPress={() => setSection(s.id)} 151 + className={`h-8 px-3.5 rounded-full items-center justify-center ${active ? "bg-accent" : "bg-bg-card"}`} 152 + > 153 + <Text 154 + className={`text-text-primary text-[13px] font-sans ${active ? "font-bold" : "font-medium"}`} 155 + > 156 + {s.label} 157 + </Text> 158 + </Pressable> 159 + ); 160 + })} 161 + </ScrollView> 162 + </View> 163 + 164 + {section === "playlists" ? ( 165 + <FlatList 166 + key="list-playlists" 167 + data={filteredPlaylists} 168 + keyExtractor={(p) => p.id} 169 + contentContainerStyle={{ 170 + paddingHorizontal: 16, 171 + paddingBottom: 24, 172 + gap: 8, 173 + }} 174 + renderItem={({ item }) => ( 175 + <Pressable 176 + onPress={() => router.push(`/playlist/${item.id}`)} 177 + className="flex-row items-center gap-3 py-1.5 active:opacity-80" 178 + > 179 + <Image 180 + source={item.artwork} 181 + className="w-[60px] h-[60px] rounded-md" 182 + contentFit="cover" 183 + /> 184 + <View className="flex-1"> 185 + <Text 186 + numberOfLines={1} 187 + className="text-text-primary text-[15px] font-semibold font-sans" 188 + > 189 + {item.name} 190 + </Text> 191 + <Text 192 + numberOfLines={1} 193 + className="text-text-secondary text-[13px] mt-0.5 font-sans" 194 + > 195 + {item.isSmart ? "Smart playlist" : "Playlist"} •{" "} 196 + {item.trackCount} tracks 197 + </Text> 198 + </View> 199 + </Pressable> 200 + )} 201 + /> 202 + ) : section === "songs" ? ( 203 + <FlatList 204 + key="list-songs" 205 + data={filteredSongs} 206 + keyExtractor={(t) => t.id} 207 + contentContainerStyle={{ paddingBottom: 24 }} 208 + renderItem={({ item, index }) => ( 209 + <Pressable 210 + onPress={() => jumpTo(index)} 211 + className="flex-row items-center gap-3 px-4 py-2.5 active:bg-bg-hover" 212 + > 213 + {item.artwork ? ( 214 + <Image 215 + source={item.artwork} 216 + className="w-12 h-12 rounded" 217 + contentFit="cover" 218 + /> 219 + ) : ( 220 + <View className="w-12 h-12 bg-bg-card rounded items-center justify-center"> 221 + <Ionicons 222 + name="musical-note" 223 + size={18} 224 + color={Colors.textMuted} 225 + /> 226 + </View> 227 + )} 228 + <View className="flex-1"> 229 + <Text 230 + numberOfLines={1} 231 + className="text-text-primary text-sm font-medium font-sans" 232 + > 233 + {item.title} 234 + </Text> 235 + <Text 236 + numberOfLines={1} 237 + className="text-text-secondary text-xs font-sans" 238 + > 239 + {item.artist} 240 + </Text> 241 + </View> 242 + <Text className="text-text-muted text-xs font-mono"> 243 + {formatDuration(item.duration)} 244 + </Text> 245 + <TrackMenuButton track={item} /> 246 + </Pressable> 247 + )} 248 + /> 249 + ) : section === "albums" ? ( 250 + <FlatList 251 + key="list-albums" 252 + data={filteredAlbums} 253 + keyExtractor={(a) => a.id} 254 + numColumns={2} 255 + columnWrapperStyle={{ gap: 12, paddingHorizontal: 16 }} 256 + contentContainerStyle={{ paddingBottom: 24, gap: 16 }} 257 + renderItem={({ item }) => ( 258 + <Pressable 259 + onPress={() => router.push(`/album/${item.id}`)} 260 + className="flex-1 max-w-[48%] active:opacity-80" 261 + > 262 + <Image 263 + source={item.artwork} 264 + className="w-full aspect-square rounded-md" 265 + contentFit="cover" 266 + /> 267 + <Text 268 + numberOfLines={1} 269 + className="text-text-primary text-[13px] font-semibold mt-1.5 font-sans" 270 + > 271 + {item.title} 272 + </Text> 273 + <Text 274 + numberOfLines={1} 275 + className="text-text-secondary text-xs font-sans" 276 + > 277 + {item.artist} 278 + </Text> 279 + </Pressable> 280 + )} 281 + /> 282 + ) : section === "artists" ? ( 283 + <FlatList 284 + key="list-artists" 285 + data={filteredArtists} 286 + keyExtractor={(a) => a.id} 287 + contentContainerStyle={{ 288 + paddingHorizontal: 16, 289 + paddingBottom: 24, 290 + gap: 8, 291 + }} 292 + renderItem={({ item }) => ( 293 + <Pressable 294 + onPress={() => router.push(`/artist/${item.id}`)} 295 + className="flex-row items-center gap-3.5 py-1.5 active:opacity-80" 296 + > 297 + <Image 298 + source={item.image} 299 + className="w-14 h-14 rounded-full" 300 + contentFit="cover" 301 + /> 302 + <View className="flex-1"> 303 + <Text className="text-text-primary text-[15px] font-semibold font-sans"> 304 + {item.name} 305 + </Text> 306 + <Text className="text-text-secondary text-[13px] mt-0.5 font-sans"> 307 + Artist 308 + </Text> 309 + </View> 310 + </Pressable> 311 + )} 312 + /> 313 + ) : ( 314 + <FlatList 315 + key="list-liked" 316 + data={filteredSongs.filter((t) => liked.has(t.id))} 317 + keyExtractor={(t) => t.id} 318 + ListHeaderComponent={ 319 + <View className="px-4 pt-1 pb-4"> 320 + <View className="flex-row items-center gap-3.5"> 321 + <View className="w-20 h-20 rounded-md bg-accent items-center justify-center"> 322 + <Ionicons name="heart" size={36} color="#FFFFFF" /> 323 + </View> 324 + <View className="flex-1"> 325 + <Text className="text-text-primary text-[22px] font-extrabold font-sans"> 326 + Liked Songs 327 + </Text> 328 + <Text className="text-text-secondary text-[13px] mt-1 font-sans"> 329 + {liked.size} liked tracks 330 + </Text> 331 + </View> 332 + </View> 333 + </View> 334 + } 335 + ListEmptyComponent={ 336 + <Text className="text-text-secondary px-4 font-sans"> 337 + No liked songs yet. Tap the heart on any track. 338 + </Text> 339 + } 340 + renderItem={({ item }) => { 341 + const idx = queue.findIndex((t) => t.id === item.id); 342 + return ( 343 + <Pressable 344 + onPress={() => idx >= 0 && jumpTo(idx)} 345 + className="flex-row items-center gap-3 px-4 py-2.5 active:bg-bg-hover" 346 + > 347 + {item.artwork ? ( 348 + <Image 349 + source={item.artwork} 350 + className="w-11 h-11 rounded" 351 + contentFit="cover" 352 + /> 353 + ) : null} 354 + <View className="flex-1"> 355 + <Text 356 + numberOfLines={1} 357 + className="text-text-primary text-sm font-medium font-sans" 358 + > 359 + {item.title} 360 + </Text> 361 + <Text 362 + numberOfLines={1} 363 + className="text-text-secondary text-xs font-sans" 364 + > 365 + {item.artist} 366 + </Text> 367 + </View> 368 + <TrackMenuButton track={item} /> 369 + </Pressable> 370 + ); 371 + }} 372 + /> 373 + )} 374 + 375 + <Modal 376 + visible={createOpen} 377 + transparent 378 + animationType="fade" 379 + onRequestClose={() => setCreateOpen(false)} 380 + > 381 + <Pressable 382 + className="flex-1 bg-black/60" 383 + onPress={() => setCreateOpen(false)} 384 + > 385 + <Pressable 386 + onPress={(e) => e.stopPropagation()} 387 + className="mt-auto bg-bg-elevated rounded-t-2xl pt-2 pb-7" 388 + > 389 + <View className="self-center w-10 h-1 rounded-sm bg-border my-2" /> 390 + <Text className="text-text-primary text-base font-bold text-center py-2 font-sans"> 391 + Create new 392 + </Text> 393 + {[ 394 + { 395 + icon: "musical-notes-outline", 396 + label: "Playlist", 397 + desc: "Build a custom mix", 398 + href: "/playlist/new", 399 + }, 400 + { 401 + icon: "list-outline", 402 + label: "Smart playlist", 403 + desc: "Auto-updates from rules", 404 + href: "/playlist/new?mode=smart", 405 + }, 406 + ].map((item) => ( 407 + <Pressable 408 + key={item.label} 409 + onPress={() => { 410 + setCreateOpen(false); 411 + setTimeout(() => router.push(item.href as any), 50); 412 + }} 413 + android_ripple={{ color: Colors.bgHover }} 414 + className="flex-row items-center px-5 py-3.5 gap-4 active:bg-bg-hover" 415 + > 416 + <View className="w-11 h-11 rounded-full bg-bg-card items-center justify-center"> 417 + <Ionicons 418 + name={ 419 + item.icon as React.ComponentProps<typeof Ionicons>["name"] 420 + } 421 + size={22} 422 + color={Colors.textPrimary} 423 + /> 424 + </View> 425 + <View className="flex-1"> 426 + <Text className="text-text-primary text-[15px] font-semibold font-sans"> 427 + {item.label} 428 + </Text> 429 + <Text className="text-text-secondary text-xs mt-0.5 font-sans"> 430 + {item.desc} 431 + </Text> 432 + </View> 433 + </Pressable> 434 + ))} 435 + </Pressable> 436 + </Pressable> 437 + </Modal> 438 + </SafeAreaView> 439 + ); 440 + }
+127
expo/app/(tabs)/search.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { router } from "expo-router"; 3 + import { useMemo, useState } from "react"; 4 + import { Pressable, ScrollView, Text, TextInput, View } from "react-native"; 5 + import { SafeAreaView } from "react-native-safe-area-context"; 6 + 7 + import { TrackMenuButton } from "@/components/track-menu-button"; 8 + import { Colors } from "@/constants/theme"; 9 + import { ALL_SONGS, GENRES, formatDuration } from "@/lib/mock-data"; 10 + import { usePlayer } from "@/lib/player-context"; 11 + 12 + export default function SearchScreen() { 13 + const [query, setQuery] = useState(""); 14 + const { jumpTo, queue } = usePlayer(); 15 + 16 + const results = useMemo(() => { 17 + const q = query.trim().toLowerCase(); 18 + if (!q) return []; 19 + return ALL_SONGS.filter( 20 + (t) => 21 + t.title.toLowerCase().includes(q) || 22 + t.artist.toLowerCase().includes(q) || 23 + t.album.toLowerCase().includes(q), 24 + ); 25 + }, [query]); 26 + 27 + return ( 28 + <SafeAreaView className="flex-1 bg-bg" edges={["top"]}> 29 + <View className="px-4 pt-2 pb-4"> 30 + <Text className="text-text-primary text-[26px] font-extrabold mb-4 font-sans"> 31 + Search 32 + </Text> 33 + <View className="flex-row items-center bg-bg-card rounded-md px-3 h-11 gap-2"> 34 + <Ionicons name="search" size={18} color={Colors.textMuted} /> 35 + <TextInput 36 + value={query} 37 + onChangeText={setQuery} 38 + placeholder="Songs, artists, albums" 39 + placeholderTextColor={Colors.textMuted} 40 + className="flex-1 text-text-primary text-[15px] font-sans" 41 + autoCorrect={false} 42 + returnKeyType="search" 43 + /> 44 + {query.length > 0 ? ( 45 + <Pressable hitSlop={6} onPress={() => setQuery("")}> 46 + <Ionicons 47 + name="close-circle" 48 + size={18} 49 + color={Colors.textMuted} 50 + /> 51 + </Pressable> 52 + ) : null} 53 + </View> 54 + </View> 55 + 56 + {query.trim().length > 0 ? ( 57 + <ScrollView contentContainerStyle={{ paddingBottom: 24 }}> 58 + {results.length === 0 ? ( 59 + <Text className="text-text-secondary px-4 mt-6 font-sans"> 60 + No results for &ldquo;{query}&rdquo; 61 + </Text> 62 + ) : ( 63 + results.map((track) => { 64 + const idx = queue.findIndex((t) => t.id === track.id); 65 + return ( 66 + <Pressable 67 + key={track.id} 68 + onPress={() => idx >= 0 && jumpTo(idx)} 69 + className="flex-row items-center px-4 py-2.5 gap-3 active:bg-bg-hover" 70 + > 71 + <View className="w-11 h-11 bg-bg-card rounded-md items-center justify-center"> 72 + <Ionicons 73 + name="musical-note" 74 + size={18} 75 + color={Colors.textMuted} 76 + /> 77 + </View> 78 + <View className="flex-1"> 79 + <Text 80 + numberOfLines={1} 81 + className="text-text-primary text-sm font-semibold font-sans" 82 + > 83 + {track.title} 84 + </Text> 85 + <Text 86 + numberOfLines={1} 87 + className="text-text-secondary text-xs font-sans" 88 + > 89 + {track.artist} • {track.album} 90 + </Text> 91 + </View> 92 + <Text className="text-text-muted text-xs font-mono"> 93 + {formatDuration(track.duration)} 94 + </Text> 95 + <TrackMenuButton track={track} /> 96 + </Pressable> 97 + ); 98 + }) 99 + )} 100 + </ScrollView> 101 + ) : ( 102 + <ScrollView 103 + contentContainerStyle={{ paddingHorizontal: 16, paddingBottom: 24 }} 104 + showsVerticalScrollIndicator={false} 105 + > 106 + <Text className="text-text-primary text-lg font-bold mb-3 font-sans"> 107 + Browse all 108 + </Text> 109 + <View className="flex-row flex-wrap gap-2"> 110 + {GENRES.map((g) => ( 111 + <Pressable 112 + key={g.id} 113 + onPress={() => router.push(`/genre/${g.id}`)} 114 + style={{ backgroundColor: g.color }} 115 + className="w-[48.5%] h-[100px] rounded-md p-3 overflow-hidden active:opacity-80" 116 + > 117 + <Text className="text-white text-lg font-bold font-sans"> 118 + {g.name} 119 + </Text> 120 + </Pressable> 121 + ))} 122 + </View> 123 + </ScrollView> 124 + )} 125 + </SafeAreaView> 126 + ); 127 + }
+108
expo/app/_layout.tsx
··· 1 + import "../global.css"; 2 + import "@/lib/nativewind-setup"; 3 + import { ThemeProvider } from "@react-navigation/native"; 4 + import { useFonts } from "expo-font"; 5 + import { Stack } from "expo-router"; 6 + import * as SplashScreen from "expo-splash-screen"; 7 + import { StatusBar } from "expo-status-bar"; 8 + import { useEffect } from "react"; 9 + import "react-native-reanimated"; 10 + 11 + import { TrackContextMenu } from "@/components/track-context-menu"; 12 + import { Colors } from "@/constants/theme"; 13 + import { PlayerProvider } from "@/lib/player-context"; 14 + 15 + SplashScreen.preventAutoHideAsync().catch(() => {}); 16 + 17 + const navTheme = { 18 + dark: true, 19 + colors: { 20 + primary: Colors.accent, 21 + background: Colors.appBg, 22 + card: Colors.appBg, 23 + text: Colors.textPrimary, 24 + border: Colors.divider, 25 + notification: Colors.accent, 26 + }, 27 + fonts: { 28 + regular: { fontFamily: "SpaceGrotesk", fontWeight: "400" as const }, 29 + medium: { fontFamily: "SpaceGrotesk", fontWeight: "500" as const }, 30 + bold: { fontFamily: "SpaceGrotesk", fontWeight: "700" as const }, 31 + heavy: { fontFamily: "SpaceGrotesk", fontWeight: "800" as const }, 32 + }, 33 + }; 34 + 35 + export const unstable_settings = { 36 + anchor: "(tabs)", 37 + }; 38 + 39 + export default function RootLayout() { 40 + const [fontsLoaded] = useFonts({ 41 + SpaceGrotesk: require("@/assets/fonts/SpaceGrotesk.ttf"), 42 + JetBrainsMono: require("@/assets/fonts/JetBrainsMono.ttf"), 43 + }); 44 + 45 + useEffect(() => { 46 + if (fontsLoaded) SplashScreen.hideAsync().catch(() => {}); 47 + }, [fontsLoaded]); 48 + 49 + if (!fontsLoaded) return null; 50 + 51 + return ( 52 + <ThemeProvider value={navTheme}> 53 + <PlayerProvider> 54 + <Stack 55 + screenOptions={{ 56 + headerShown: false, 57 + contentStyle: { backgroundColor: Colors.appBg }, 58 + }} 59 + > 60 + <Stack.Screen name="(tabs)" /> 61 + <Stack.Screen 62 + name="player" 63 + options={{ 64 + presentation: "modal", 65 + animation: "slide_from_bottom", 66 + }} 67 + /> 68 + <Stack.Screen 69 + name="queue" 70 + options={{ 71 + presentation: "modal", 72 + animation: "slide_from_bottom", 73 + }} 74 + /> 75 + <Stack.Screen 76 + name="settings" 77 + options={{ animation: "slide_from_right" }} 78 + /> 79 + <Stack.Screen 80 + name="album/[id]" 81 + options={{ animation: "slide_from_right" }} 82 + /> 83 + <Stack.Screen 84 + name="artist/[id]" 85 + options={{ animation: "slide_from_right" }} 86 + /> 87 + <Stack.Screen 88 + name="playlist/[id]" 89 + options={{ animation: "slide_from_right" }} 90 + /> 91 + <Stack.Screen 92 + name="playlist/new" 93 + options={{ 94 + presentation: "modal", 95 + animation: "slide_from_bottom", 96 + }} 97 + /> 98 + <Stack.Screen 99 + name="genre/[id]" 100 + options={{ animation: "slide_from_right" }} 101 + /> 102 + </Stack> 103 + <TrackContextMenu /> 104 + <StatusBar style="light" /> 105 + </PlayerProvider> 106 + </ThemeProvider> 107 + ); 108 + }
+341
expo/app/album/[id].tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Image } from "expo-image"; 3 + import { LinearGradient } from "expo-linear-gradient"; 4 + import { router, useLocalSearchParams } from "expo-router"; 5 + import { useMemo, useState } from "react"; 6 + import { 7 + Animated, 8 + Dimensions, 9 + Pressable, 10 + Text, 11 + View, 12 + } from "react-native"; 13 + import { SafeAreaView } from "react-native-safe-area-context"; 14 + 15 + import { ActionSheet, type ActionItem } from "@/components/action-sheet"; 16 + import { TrackMenuButton } from "@/components/track-menu-button"; 17 + import { Colors } from "@/constants/theme"; 18 + import { 19 + ARTISTS, 20 + formatDuration, 21 + getAlbumById, 22 + getAlbumTracks, 23 + } from "@/lib/mock-data"; 24 + import { usePlayer } from "@/lib/player-context"; 25 + 26 + const { width } = Dimensions.get("window"); 27 + const ART_SIZE = Math.min(width * 0.62, 280); 28 + const HEADER_HEIGHT = 56; 29 + 30 + export default function AlbumScreen() { 31 + const { id } = useLocalSearchParams<{ id: string }>(); 32 + const album = id ? getAlbumById(id) : undefined; 33 + const tracks = useMemo(() => (id ? getAlbumTracks(id) : []), [id]); 34 + const { playQueue, currentTrack, isPlaying, playLast } = usePlayer(); 35 + const [menuOpen, setMenuOpen] = useState(false); 36 + 37 + const totalDuration = tracks.reduce((s, t) => s + t.duration, 0); 38 + const totalMinutes = Math.round(totalDuration / 60); 39 + 40 + const scrollY = useMemo(() => new Animated.Value(0), []); 41 + const headerBgOpacity = scrollY.interpolate({ 42 + inputRange: [0, 200, 280], 43 + outputRange: [0, 0, 1], 44 + extrapolate: "clamp", 45 + }); 46 + const titleOpacity = scrollY.interpolate({ 47 + inputRange: [0, 240, 320], 48 + outputRange: [0, 0, 1], 49 + extrapolate: "clamp", 50 + }); 51 + const artScale = scrollY.interpolate({ 52 + inputRange: [-100, 0, 200], 53 + outputRange: [1.1, 1, 0.85], 54 + extrapolate: "clamp", 55 + }); 56 + const artOpacity = scrollY.interpolate({ 57 + inputRange: [0, 200, 320], 58 + outputRange: [1, 1, 0], 59 + extrapolate: "clamp", 60 + }); 61 + 62 + if (!album) { 63 + return ( 64 + <SafeAreaView className="flex-1 bg-bg"> 65 + <View className="flex-1 items-center justify-center"> 66 + <Text className="text-text-secondary">Album not found</Text> 67 + </View> 68 + </SafeAreaView> 69 + ); 70 + } 71 + 72 + const onPlay = () => playQueue(tracks); 73 + const onShuffle = () => playQueue(tracks, { shuffle: true }); 74 + 75 + return ( 76 + <View className="flex-1 bg-bg"> 77 + <Animated.ScrollView 78 + showsVerticalScrollIndicator={false} 79 + scrollEventThrottle={16} 80 + onScroll={Animated.event( 81 + [{ nativeEvent: { contentOffset: { y: scrollY } } }], 82 + { useNativeDriver: true }, 83 + )} 84 + contentContainerStyle={{ paddingBottom: 32 }} 85 + > 86 + {/* Hero band: blurred album art behind, sharp art front-and-center */} 87 + <View 88 + className="items-center overflow-hidden pb-4" 89 + style={{ paddingTop: HEADER_HEIGHT + 16 }} 90 + > 91 + <Image 92 + source={album.artwork} 93 + className="absolute inset-0" 94 + contentFit="cover" 95 + blurRadius={40} 96 + /> 97 + <LinearGradient 98 + colors={[ 99 + "rgba(0,0,0,0.35)", 100 + "rgba(0,0,0,0.6)", 101 + "rgba(0,0,0,1)", 102 + ]} 103 + locations={[0, 0.55, 1]} 104 + className="absolute inset-0" 105 + /> 106 + <Animated.View 107 + style={{ 108 + transform: [{ scale: artScale }], 109 + opacity: artOpacity, 110 + shadowColor: "#000", 111 + shadowOpacity: 0.6, 112 + shadowRadius: 20, 113 + shadowOffset: { width: 0, height: 12 }, 114 + }} 115 + > 116 + <Image 117 + source={album.artwork} 118 + className="rounded-lg" 119 + style={{ width: ART_SIZE, height: ART_SIZE }} 120 + contentFit="cover" 121 + /> 122 + </Animated.View> 123 + </View> 124 + 125 + {/* Title block */} 126 + <View className="px-5 mt-3.5"> 127 + <Text className="text-text-primary text-[26px] font-extrabold font-sans"> 128 + {album.title} 129 + </Text> 130 + <Pressable 131 + hitSlop={6} 132 + onPress={() => { 133 + const ar = ARTISTS.find((a) => a.name === album.artist); 134 + if (ar) router.push(`/artist/${ar.id}`); 135 + }} 136 + className="mt-1.5" 137 + > 138 + <Text className="text-text-primary text-sm font-semibold font-sans"> 139 + {album.artist} 140 + </Text> 141 + </Pressable> 142 + <Text className="text-text-secondary text-xs mt-1 font-sans"> 143 + Album{album.year ? ` • ${album.year}` : ""} • {tracks.length}{" "} 144 + tracks • {totalMinutes} min 145 + </Text> 146 + </View> 147 + 148 + {/* Action row */} 149 + <View className="flex-row items-center px-5 mt-5 gap-4"> 150 + <Pressable 151 + hitSlop={6} 152 + onPress={onShuffle} 153 + className="w-11 h-11 rounded-full items-center justify-center" 154 + > 155 + <Ionicons name="shuffle" size={26} color={Colors.textPrimary} /> 156 + </Pressable> 157 + <Pressable hitSlop={6}> 158 + <Ionicons 159 + name="heart-outline" 160 + size={26} 161 + color={Colors.textPrimary} 162 + /> 163 + </Pressable> 164 + <Pressable hitSlop={6} onPress={() => setMenuOpen(true)}> 165 + <Ionicons 166 + name="ellipsis-horizontal" 167 + size={26} 168 + color={Colors.textPrimary} 169 + /> 170 + </Pressable> 171 + <View className="flex-1" /> 172 + <Pressable 173 + onPress={onPlay} 174 + className="w-14 h-14 rounded-full items-center justify-center bg-accent active:opacity-85" 175 + style={{ 176 + shadowColor: Colors.accent, 177 + shadowOpacity: 0.5, 178 + shadowRadius: 14, 179 + shadowOffset: { width: 0, height: 6 }, 180 + }} 181 + > 182 + <Ionicons 183 + name="play" 184 + size={26} 185 + color="#FFFFFF" 186 + style={{ marginLeft: 3 }} 187 + /> 188 + </Pressable> 189 + </View> 190 + 191 + {/* Track list */} 192 + <View className="mt-5"> 193 + {tracks.map((t, idx) => { 194 + const isCurrent = currentTrack?.id === t.id; 195 + return ( 196 + <Pressable 197 + key={t.id} 198 + onPress={() => playQueue(tracks, { startIdx: idx })} 199 + className="flex-row items-center px-5 py-2.5 gap-3.5 active:bg-bg-hover" 200 + > 201 + <View className="w-[22px] items-center"> 202 + {isCurrent ? ( 203 + <Ionicons 204 + name={isPlaying ? "musical-notes" : "pause"} 205 + size={14} 206 + color={Colors.accent} 207 + /> 208 + ) : ( 209 + <Text className="text-text-muted text-[13px] font-mono"> 210 + {idx + 1} 211 + </Text> 212 + )} 213 + </View> 214 + <View className="flex-1"> 215 + <Text 216 + numberOfLines={1} 217 + className={`text-[15px] font-medium font-sans ${isCurrent ? "text-accent" : "text-text-primary"}`} 218 + > 219 + {t.title} 220 + </Text> 221 + <Text 222 + numberOfLines={1} 223 + className="text-text-secondary text-xs mt-0.5 font-sans" 224 + > 225 + {t.artist} 226 + </Text> 227 + </View> 228 + <Text className="text-text-muted text-xs font-mono"> 229 + {formatDuration(t.duration)} 230 + </Text> 231 + <TrackMenuButton track={t} /> 232 + </Pressable> 233 + ); 234 + })} 235 + </View> 236 + </Animated.ScrollView> 237 + 238 + <ActionSheet 239 + visible={menuOpen} 240 + onClose={() => setMenuOpen(false)} 241 + header={{ 242 + title: album.title, 243 + subtitle: album.artist, 244 + image: album.artwork, 245 + }} 246 + actions={ 247 + [ 248 + { 249 + icon: "play-outline", 250 + label: "Play", 251 + onPress: () => { 252 + setMenuOpen(false); 253 + playQueue(tracks); 254 + }, 255 + }, 256 + { 257 + icon: "shuffle", 258 + label: "Shuffle Play", 259 + onPress: () => { 260 + setMenuOpen(false); 261 + playQueue(tracks, { shuffle: true }); 262 + }, 263 + }, 264 + { 265 + icon: "list-outline", 266 + label: "Add to Queue", 267 + onPress: () => { 268 + setMenuOpen(false); 269 + tracks.forEach((t) => playLast(t)); 270 + }, 271 + }, 272 + { 273 + icon: "heart-outline", 274 + label: "Save to Library", 275 + onPress: () => setMenuOpen(false), 276 + }, 277 + { 278 + icon: "add-circle-outline", 279 + label: "Add to Playlist", 280 + onPress: () => setMenuOpen(false), 281 + }, 282 + { 283 + icon: "person-outline", 284 + label: "Go to Artist", 285 + onPress: () => { 286 + const ar = ARTISTS.find((a) => a.name === album.artist); 287 + setMenuOpen(false); 288 + if (ar) router.push(`/artist/${ar.id}`); 289 + }, 290 + }, 291 + { 292 + icon: "share-outline", 293 + label: "Share", 294 + onPress: () => setMenuOpen(false), 295 + }, 296 + ] as ActionItem[] 297 + } 298 + /> 299 + 300 + {/* Sticky header */} 301 + <SafeAreaView 302 + edges={["top"]} 303 + className="absolute top-0 left-0 right-0" 304 + pointerEvents="box-none" 305 + > 306 + <Animated.View 307 + pointerEvents="none" 308 + className="absolute top-0 left-0 right-0 bg-bg" 309 + style={{ 310 + height: HEADER_HEIGHT + 64, 311 + opacity: headerBgOpacity, 312 + }} 313 + /> 314 + <View 315 + className="flex-row items-center px-3" 316 + style={{ height: HEADER_HEIGHT }} 317 + > 318 + <Pressable 319 + hitSlop={10} 320 + onPress={() => router.back()} 321 + className="w-10 h-10 rounded-full items-center justify-center bg-black/35" 322 + > 323 + <Ionicons 324 + name="chevron-back" 325 + size={22} 326 + color={Colors.textPrimary} 327 + /> 328 + </Pressable> 329 + <Animated.Text 330 + numberOfLines={1} 331 + className="flex-1 text-center text-text-primary text-[15px] font-bold px-3 font-sans" 332 + style={{ opacity: titleOpacity }} 333 + > 334 + {album.title} 335 + </Animated.Text> 336 + <View className="w-10" /> 337 + </View> 338 + </SafeAreaView> 339 + </View> 340 + ); 341 + }
+367
expo/app/artist/[id].tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Image } from "expo-image"; 3 + import { LinearGradient } from "expo-linear-gradient"; 4 + import { router, useLocalSearchParams } from "expo-router"; 5 + import { useMemo, useState } from "react"; 6 + import { 7 + Animated, 8 + Dimensions, 9 + FlatList, 10 + Pressable, 11 + Text, 12 + View, 13 + } from "react-native"; 14 + import { SafeAreaView } from "react-native-safe-area-context"; 15 + 16 + import { ActionSheet, type ActionItem } from "@/components/action-sheet"; 17 + import { TrackMenuButton } from "@/components/track-menu-button"; 18 + import { Colors } from "@/constants/theme"; 19 + import { 20 + formatDuration, 21 + getArtistAlbums, 22 + getArtistById, 23 + getArtistTracks, 24 + } from "@/lib/mock-data"; 25 + import { usePlayer } from "@/lib/player-context"; 26 + 27 + const { width } = Dimensions.get("window"); 28 + const HERO_HEIGHT = Math.min(width, 360); 29 + const HEADER_HEIGHT = 56; 30 + const TOP_TRACK_LIMIT = 5; 31 + 32 + export default function ArtistScreen() { 33 + const { id } = useLocalSearchParams<{ id: string }>(); 34 + const artist = id ? getArtistById(id) : undefined; 35 + const tracks = useMemo(() => (id ? getArtistTracks(id) : []), [id]); 36 + const albums = useMemo(() => (id ? getArtistAlbums(id) : []), [id]); 37 + const { playQueue, currentTrack, isPlaying, playLast } = usePlayer(); 38 + const topTracks = tracks.slice(0, TOP_TRACK_LIMIT); 39 + const [menuOpen, setMenuOpen] = useState(false); 40 + const [following, setFollowing] = useState(false); 41 + 42 + const scrollY = useMemo(() => new Animated.Value(0), []); 43 + const headerBgOpacity = scrollY.interpolate({ 44 + inputRange: [HERO_HEIGHT - 120, HERO_HEIGHT - 40], 45 + outputRange: [0, 1], 46 + extrapolate: "clamp", 47 + }); 48 + const titleOpacity = scrollY.interpolate({ 49 + inputRange: [HERO_HEIGHT - 80, HERO_HEIGHT - 30], 50 + outputRange: [0, 1], 51 + extrapolate: "clamp", 52 + }); 53 + const heroTranslate = scrollY.interpolate({ 54 + inputRange: [-200, 0, HERO_HEIGHT], 55 + outputRange: [-100, 0, HERO_HEIGHT * 0.5], 56 + extrapolate: "clamp", 57 + }); 58 + const heroScale = scrollY.interpolate({ 59 + inputRange: [-200, 0], 60 + outputRange: [1.4, 1], 61 + extrapolateRight: "clamp", 62 + }); 63 + 64 + if (!artist) { 65 + return ( 66 + <SafeAreaView className="flex-1 bg-bg"> 67 + <View className="flex-1 items-center justify-center"> 68 + <Text className="text-text-secondary">Artist not found</Text> 69 + </View> 70 + </SafeAreaView> 71 + ); 72 + } 73 + 74 + const onPlay = () => playQueue(tracks); 75 + const onShuffle = () => playQueue(tracks, { shuffle: true }); 76 + 77 + return ( 78 + <View className="flex-1 bg-bg"> 79 + {/* Parallax hero */} 80 + <Animated.View 81 + className="absolute top-0 left-0 right-0" 82 + style={{ 83 + height: HERO_HEIGHT, 84 + transform: [{ translateY: heroTranslate }, { scale: heroScale }], 85 + }} 86 + > 87 + <Image 88 + source={artist.image} 89 + className="w-full h-full" 90 + contentFit="cover" 91 + /> 92 + <LinearGradient 93 + colors={[ 94 + "rgba(0,0,0,0)", 95 + "rgba(0,0,0,0.25)", 96 + "rgba(0,0,0,0.7)", 97 + "rgba(0,0,0,1)", 98 + ]} 99 + locations={[0, 0.4, 0.75, 1]} 100 + className="absolute inset-0" 101 + /> 102 + </Animated.View> 103 + 104 + <Animated.ScrollView 105 + showsVerticalScrollIndicator={false} 106 + scrollEventThrottle={16} 107 + onScroll={Animated.event( 108 + [{ nativeEvent: { contentOffset: { y: scrollY } } }], 109 + { useNativeDriver: true }, 110 + )} 111 + contentContainerStyle={{ paddingBottom: 32 }} 112 + > 113 + <View 114 + className="justify-end" 115 + style={{ height: HERO_HEIGHT - 80 }} 116 + > 117 + <View className="px-5 pb-4"> 118 + <Text 119 + className="text-text-primary text-3xl font-extrabold font-sans" 120 + style={{ 121 + textShadowColor: "rgba(0,0,0,0.6)", 122 + textShadowRadius: 8, 123 + }} 124 + > 125 + {artist.name} 126 + </Text> 127 + </View> 128 + </View> 129 + 130 + <View className="bg-bg pt-4"> 131 + <View className="px-5 flex-row items-center gap-3"> 132 + <Text className="text-text-secondary text-[13px] flex-1 font-sans"> 133 + {artist.followers ? `${artist.followers} followers` : ""} 134 + </Text> 135 + <Pressable 136 + hitSlop={6} 137 + onPress={() => setFollowing((v) => !v)} 138 + className={`px-3.5 h-8 rounded-full border border-text-primary items-center justify-center ${following ? "bg-text-primary" : ""}`} 139 + > 140 + <Text 141 + className={`text-xs font-bold font-sans ${following ? "text-black" : "text-text-primary"}`} 142 + > 143 + {following ? "Following" : "Follow"} 144 + </Text> 145 + </Pressable> 146 + </View> 147 + 148 + <View className="flex-row items-center px-5 mt-4 gap-4"> 149 + <Pressable hitSlop={6} onPress={onShuffle}> 150 + <Ionicons name="shuffle" size={26} color={Colors.textPrimary} /> 151 + </Pressable> 152 + <Pressable hitSlop={6} onPress={() => setMenuOpen(true)}> 153 + <Ionicons 154 + name="ellipsis-horizontal" 155 + size={26} 156 + color={Colors.textPrimary} 157 + /> 158 + </Pressable> 159 + <View className="flex-1" /> 160 + <Pressable 161 + onPress={onPlay} 162 + className="w-14 h-14 rounded-full items-center justify-center bg-accent active:opacity-85" 163 + style={{ 164 + shadowColor: Colors.accent, 165 + shadowOpacity: 0.5, 166 + shadowRadius: 14, 167 + shadowOffset: { width: 0, height: 6 }, 168 + }} 169 + > 170 + <Ionicons 171 + name="play" 172 + size={26} 173 + color="#FFFFFF" 174 + style={{ marginLeft: 3 }} 175 + /> 176 + </Pressable> 177 + </View> 178 + 179 + {topTracks.length > 0 ? ( 180 + <View className="mt-7"> 181 + <Text className="text-text-primary text-lg font-bold px-5 mb-2 font-sans"> 182 + Popular 183 + </Text> 184 + {topTracks.map((t, idx) => { 185 + const isCurrent = currentTrack?.id === t.id; 186 + return ( 187 + <Pressable 188 + key={t.id} 189 + onPress={() => playQueue(tracks, { startIdx: idx })} 190 + className="flex-row items-center px-5 py-2 gap-3 active:bg-bg-hover" 191 + > 192 + <Text className="w-[18px] text-center text-text-muted text-sm font-mono"> 193 + {idx + 1} 194 + </Text> 195 + {t.artwork ? ( 196 + <Image 197 + source={t.artwork} 198 + className="w-11 h-11 rounded" 199 + contentFit="cover" 200 + /> 201 + ) : null} 202 + <View className="flex-1"> 203 + <Text 204 + numberOfLines={1} 205 + className={`text-sm font-semibold font-sans ${isCurrent ? "text-accent" : "text-text-primary"}`} 206 + > 207 + {t.title} 208 + </Text> 209 + <Text 210 + numberOfLines={1} 211 + className="text-text-secondary text-xs mt-0.5 font-sans" 212 + > 213 + {t.album} 214 + </Text> 215 + </View> 216 + <Text className="text-text-muted text-xs font-mono"> 217 + {formatDuration(t.duration)} 218 + </Text> 219 + {isCurrent && isPlaying ? ( 220 + <Ionicons 221 + name="musical-notes" 222 + size={14} 223 + color={Colors.accent} 224 + /> 225 + ) : null} 226 + <TrackMenuButton track={t} /> 227 + </Pressable> 228 + ); 229 + })} 230 + </View> 231 + ) : null} 232 + 233 + {albums.length > 0 ? ( 234 + <View className="mt-8"> 235 + <Text className="text-text-primary text-lg font-bold px-5 mb-3 font-sans"> 236 + Albums 237 + </Text> 238 + <FlatList 239 + horizontal 240 + data={albums} 241 + keyExtractor={(a) => a.id} 242 + showsHorizontalScrollIndicator={false} 243 + contentContainerStyle={{ paddingHorizontal: 20, gap: 14 }} 244 + renderItem={({ item }) => ( 245 + <Pressable 246 + onPress={() => router.push(`/album/${item.id}`)} 247 + className="w-[150px] active:opacity-85" 248 + > 249 + <Image 250 + source={item.artwork} 251 + className="w-[150px] h-[150px] rounded-md" 252 + contentFit="cover" 253 + /> 254 + <Text 255 + numberOfLines={1} 256 + className="text-text-primary text-sm font-semibold mt-2 font-sans" 257 + > 258 + {item.title} 259 + </Text> 260 + <Text className="text-text-secondary text-xs mt-0.5 font-sans"> 261 + Album{item.year ? ` • ${item.year}` : ""} 262 + </Text> 263 + </Pressable> 264 + )} 265 + /> 266 + </View> 267 + ) : null} 268 + </View> 269 + </Animated.ScrollView> 270 + 271 + <ActionSheet 272 + visible={menuOpen} 273 + onClose={() => setMenuOpen(false)} 274 + header={{ 275 + title: artist.name, 276 + subtitle: "Artist", 277 + image: artist.image, 278 + rounded: "full", 279 + }} 280 + actions={ 281 + [ 282 + { 283 + icon: "play-outline", 284 + label: "Play", 285 + onPress: () => { 286 + setMenuOpen(false); 287 + playQueue(tracks); 288 + }, 289 + disabled: tracks.length === 0, 290 + }, 291 + { 292 + icon: "shuffle", 293 + label: "Shuffle Play", 294 + onPress: () => { 295 + setMenuOpen(false); 296 + playQueue(tracks, { shuffle: true }); 297 + }, 298 + disabled: tracks.length === 0, 299 + }, 300 + { 301 + icon: "list-outline", 302 + label: "Add Top Songs to Queue", 303 + onPress: () => { 304 + setMenuOpen(false); 305 + topTracks.forEach((t) => playLast(t)); 306 + }, 307 + disabled: topTracks.length === 0, 308 + }, 309 + { 310 + icon: following ? "person-remove-outline" : "person-add-outline", 311 + label: following ? "Unfollow" : "Follow", 312 + onPress: () => { 313 + setFollowing((v) => !v); 314 + setMenuOpen(false); 315 + }, 316 + }, 317 + { 318 + icon: "share-outline", 319 + label: "Share", 320 + onPress: () => setMenuOpen(false), 321 + }, 322 + ] as ActionItem[] 323 + } 324 + /> 325 + 326 + {/* Sticky header */} 327 + <SafeAreaView 328 + edges={["top"]} 329 + className="absolute top-0 left-0 right-0" 330 + pointerEvents="box-none" 331 + > 332 + <Animated.View 333 + pointerEvents="none" 334 + className="absolute top-0 left-0 right-0 bg-bg" 335 + style={{ 336 + height: HEADER_HEIGHT + 64, 337 + opacity: headerBgOpacity, 338 + }} 339 + /> 340 + <View 341 + className="flex-row items-center px-3" 342 + style={{ height: HEADER_HEIGHT }} 343 + > 344 + <Pressable 345 + hitSlop={10} 346 + onPress={() => router.back()} 347 + className="w-10 h-10 rounded-full items-center justify-center bg-black/35" 348 + > 349 + <Ionicons 350 + name="chevron-back" 351 + size={22} 352 + color={Colors.textPrimary} 353 + /> 354 + </Pressable> 355 + <Animated.Text 356 + numberOfLines={1} 357 + className="flex-1 text-center text-text-primary text-[15px] font-bold px-3 font-sans" 358 + style={{ opacity: titleOpacity }} 359 + > 360 + {artist.name} 361 + </Animated.Text> 362 + <View className="w-10" /> 363 + </View> 364 + </SafeAreaView> 365 + </View> 366 + ); 367 + }
+347
expo/app/genre/[id].tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Image } from "expo-image"; 3 + import { LinearGradient } from "expo-linear-gradient"; 4 + import { router, useLocalSearchParams } from "expo-router"; 5 + import { useMemo } from "react"; 6 + import { 7 + Animated, 8 + FlatList, 9 + Pressable, 10 + Text, 11 + View, 12 + } from "react-native"; 13 + import { SafeAreaView } from "react-native-safe-area-context"; 14 + 15 + import { TrackMenuButton } from "@/components/track-menu-button"; 16 + import { Colors } from "@/constants/theme"; 17 + import { 18 + formatDuration, 19 + getGenreAlbums, 20 + getGenreArtists, 21 + getGenreById, 22 + getGenreTracks, 23 + } from "@/lib/mock-data"; 24 + import { usePlayer } from "@/lib/player-context"; 25 + 26 + const HEADER_HEIGHT = 56; 27 + const HERO_HEIGHT = 220; 28 + const TOP_TRACK_LIMIT = 5; 29 + 30 + export default function GenreScreen() { 31 + const { id } = useLocalSearchParams<{ id: string }>(); 32 + const genre = id ? getGenreById(id) : undefined; 33 + const tracks = useMemo(() => (id ? getGenreTracks(id) : []), [id]); 34 + const albums = useMemo(() => (id ? getGenreAlbums(id) : []), [id]); 35 + const artists = useMemo(() => (id ? getGenreArtists(id) : []), [id]); 36 + const { playQueue, currentTrack, isPlaying } = usePlayer(); 37 + const topTracks = tracks.slice(0, TOP_TRACK_LIMIT); 38 + 39 + const scrollY = useMemo(() => new Animated.Value(0), []); 40 + const headerBgOpacity = scrollY.interpolate({ 41 + inputRange: [HERO_HEIGHT - 100, HERO_HEIGHT - 20], 42 + outputRange: [0, 1], 43 + extrapolate: "clamp", 44 + }); 45 + const titleOpacity = scrollY.interpolate({ 46 + inputRange: [HERO_HEIGHT - 60, HERO_HEIGHT - 10], 47 + outputRange: [0, 1], 48 + extrapolate: "clamp", 49 + }); 50 + const heroTranslate = scrollY.interpolate({ 51 + inputRange: [-200, 0, HERO_HEIGHT], 52 + outputRange: [-100, 0, HERO_HEIGHT * 0.5], 53 + extrapolate: "clamp", 54 + }); 55 + 56 + if (!genre) { 57 + return ( 58 + <SafeAreaView className="flex-1 bg-bg"> 59 + <View className="flex-1 items-center justify-center"> 60 + <Text className="text-text-secondary">Genre not found</Text> 61 + </View> 62 + </SafeAreaView> 63 + ); 64 + } 65 + 66 + const onPlay = () => playQueue(tracks); 67 + const onShuffle = () => playQueue(tracks, { shuffle: true }); 68 + 69 + return ( 70 + <View className="flex-1 bg-bg"> 71 + {/* Parallax color hero */} 72 + <Animated.View 73 + className="absolute top-0 left-0 right-0 overflow-hidden" 74 + style={{ 75 + height: HERO_HEIGHT, 76 + backgroundColor: genre.color, 77 + transform: [{ translateY: heroTranslate }], 78 + }} 79 + > 80 + <Text 81 + className="absolute right-4 bottom-4 text-white/30 text-[80px] font-extrabold font-sans" 82 + style={{ transform: [{ rotate: "-12deg" }] }} 83 + numberOfLines={1} 84 + > 85 + {genre.name} 86 + </Text> 87 + <LinearGradient 88 + colors={[ 89 + "rgba(0,0,0,0)", 90 + "rgba(0,0,0,0.35)", 91 + "rgba(0,0,0,1)", 92 + ]} 93 + locations={[0, 0.55, 1]} 94 + className="absolute inset-0" 95 + /> 96 + </Animated.View> 97 + 98 + <Animated.ScrollView 99 + showsVerticalScrollIndicator={false} 100 + scrollEventThrottle={16} 101 + onScroll={Animated.event( 102 + [{ nativeEvent: { contentOffset: { y: scrollY } } }], 103 + { useNativeDriver: true }, 104 + )} 105 + contentContainerStyle={{ paddingBottom: 32 }} 106 + > 107 + <View 108 + className="justify-end" 109 + style={{ height: HERO_HEIGHT - 60 }} 110 + > 111 + <View className="px-5 pb-3"> 112 + <Text className="text-white/80 text-xs font-bold tracking-widest uppercase font-sans"> 113 + Genre 114 + </Text> 115 + <Text 116 + className="text-text-primary text-[34px] font-extrabold mt-1 font-sans" 117 + style={{ 118 + textShadowColor: "rgba(0,0,0,0.6)", 119 + textShadowRadius: 8, 120 + }} 121 + > 122 + {genre.name} 123 + </Text> 124 + </View> 125 + </View> 126 + 127 + <View className="bg-bg pt-4"> 128 + <View className="px-5 flex-row items-center gap-4"> 129 + <Text className="text-text-secondary text-[13px] flex-1 font-sans"> 130 + {tracks.length} tracks · {albums.length} albums ·{" "} 131 + {artists.length} artists 132 + </Text> 133 + <Pressable 134 + hitSlop={6} 135 + onPress={onShuffle} 136 + disabled={tracks.length === 0} 137 + > 138 + <Ionicons 139 + name="shuffle" 140 + size={26} 141 + color={ 142 + tracks.length === 0 ? Colors.textMuted : Colors.textPrimary 143 + } 144 + /> 145 + </Pressable> 146 + <Pressable 147 + onPress={onPlay} 148 + disabled={tracks.length === 0} 149 + className="w-14 h-14 rounded-full items-center justify-center bg-accent active:opacity-85 disabled:opacity-40" 150 + style={{ 151 + shadowColor: Colors.accent, 152 + shadowOpacity: 0.5, 153 + shadowRadius: 14, 154 + shadowOffset: { width: 0, height: 6 }, 155 + }} 156 + > 157 + <Ionicons 158 + name="play" 159 + size={26} 160 + color="#FFFFFF" 161 + style={{ marginLeft: 3 }} 162 + /> 163 + </Pressable> 164 + </View> 165 + 166 + {topTracks.length > 0 ? ( 167 + <View className="mt-7"> 168 + <Text className="text-text-primary text-lg font-bold px-5 mb-2 font-sans"> 169 + Popular tracks 170 + </Text> 171 + {topTracks.map((t, idx) => { 172 + const isCurrent = currentTrack?.id === t.id; 173 + return ( 174 + <Pressable 175 + key={t.id} 176 + onPress={() => playQueue(tracks, { startIdx: idx })} 177 + className="flex-row items-center px-5 py-2 gap-3 active:bg-bg-hover" 178 + > 179 + <Text className="w-[18px] text-center text-text-muted text-sm font-mono"> 180 + {idx + 1} 181 + </Text> 182 + {t.artwork ? ( 183 + <Image 184 + source={t.artwork} 185 + className="w-11 h-11 rounded" 186 + contentFit="cover" 187 + /> 188 + ) : null} 189 + <View className="flex-1"> 190 + <Text 191 + numberOfLines={1} 192 + className={`text-sm font-semibold font-sans ${isCurrent ? "text-accent" : "text-text-primary"}`} 193 + > 194 + {t.title} 195 + </Text> 196 + <Text 197 + numberOfLines={1} 198 + className="text-text-secondary text-xs mt-0.5 font-sans" 199 + > 200 + {t.artist} 201 + </Text> 202 + </View> 203 + <Text className="text-text-muted text-xs font-mono"> 204 + {formatDuration(t.duration)} 205 + </Text> 206 + {isCurrent && isPlaying ? ( 207 + <Ionicons 208 + name="musical-notes" 209 + size={14} 210 + color={Colors.accent} 211 + /> 212 + ) : null} 213 + <TrackMenuButton track={t} /> 214 + </Pressable> 215 + ); 216 + })} 217 + </View> 218 + ) : ( 219 + <View className="px-5 mt-8"> 220 + <Text className="text-text-secondary text-sm font-sans"> 221 + No content available in {genre.name} yet. 222 + </Text> 223 + </View> 224 + )} 225 + 226 + {albums.length > 0 ? ( 227 + <View className="mt-8"> 228 + <Text className="text-text-primary text-lg font-bold px-5 mb-3 font-sans"> 229 + Albums 230 + </Text> 231 + <FlatList 232 + horizontal 233 + data={albums} 234 + keyExtractor={(a) => a.id} 235 + showsHorizontalScrollIndicator={false} 236 + contentContainerStyle={{ paddingHorizontal: 20, gap: 14 }} 237 + renderItem={({ item }) => ( 238 + <Pressable 239 + onPress={() => router.push(`/album/${item.id}`)} 240 + className="w-[150px] active:opacity-85" 241 + > 242 + <Image 243 + source={item.artwork} 244 + className="w-[150px] h-[150px] rounded-md" 245 + contentFit="cover" 246 + /> 247 + <Text 248 + numberOfLines={1} 249 + className="text-text-primary text-sm font-semibold mt-2 font-sans" 250 + > 251 + {item.title} 252 + </Text> 253 + <Text 254 + numberOfLines={1} 255 + className="text-text-secondary text-xs mt-0.5 font-sans" 256 + > 257 + {item.artist} 258 + </Text> 259 + </Pressable> 260 + )} 261 + /> 262 + </View> 263 + ) : null} 264 + 265 + {artists.length > 0 ? ( 266 + <View className="mt-8"> 267 + <Text className="text-text-primary text-lg font-bold px-5 mb-3 font-sans"> 268 + Artists 269 + </Text> 270 + <FlatList 271 + horizontal 272 + data={artists} 273 + keyExtractor={(a) => a.id} 274 + showsHorizontalScrollIndicator={false} 275 + contentContainerStyle={{ paddingHorizontal: 20, gap: 14 }} 276 + renderItem={({ item }) => ( 277 + <Pressable 278 + onPress={() => router.push(`/artist/${item.id}`)} 279 + className="w-[120px] items-center active:opacity-85" 280 + > 281 + <Image 282 + source={item.image} 283 + className="w-[120px] h-[120px] rounded-full" 284 + contentFit="cover" 285 + /> 286 + <Text 287 + numberOfLines={1} 288 + className="text-text-primary text-sm font-semibold mt-2 font-sans" 289 + > 290 + {item.name} 291 + </Text> 292 + <Text 293 + numberOfLines={1} 294 + className="text-text-secondary text-xs mt-0.5 font-sans" 295 + > 296 + Artist 297 + </Text> 298 + </Pressable> 299 + )} 300 + /> 301 + </View> 302 + ) : null} 303 + </View> 304 + </Animated.ScrollView> 305 + 306 + {/* Sticky header */} 307 + <SafeAreaView 308 + edges={["top"]} 309 + className="absolute top-0 left-0 right-0" 310 + pointerEvents="box-none" 311 + > 312 + <Animated.View 313 + pointerEvents="none" 314 + className="absolute top-0 left-0 right-0 bg-bg" 315 + style={{ 316 + height: HEADER_HEIGHT + 64, 317 + opacity: headerBgOpacity, 318 + }} 319 + /> 320 + <View 321 + className="flex-row items-center px-3" 322 + style={{ height: HEADER_HEIGHT }} 323 + > 324 + <Pressable 325 + hitSlop={10} 326 + onPress={() => router.back()} 327 + className="w-10 h-10 rounded-full items-center justify-center bg-black/35" 328 + > 329 + <Ionicons 330 + name="chevron-back" 331 + size={22} 332 + color={Colors.textPrimary} 333 + /> 334 + </Pressable> 335 + <Animated.Text 336 + numberOfLines={1} 337 + className="flex-1 text-center text-text-primary text-[15px] font-bold px-3 font-sans" 338 + style={{ opacity: titleOpacity }} 339 + > 340 + {genre.name} 341 + </Animated.Text> 342 + <View className="w-10" /> 343 + </View> 344 + </SafeAreaView> 345 + </View> 346 + ); 347 + }
+230
expo/app/player.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { BlurView } from "expo-blur"; 3 + import { Image } from "expo-image"; 4 + import { router } from "expo-router"; 5 + import { Pressable, Text, View } from "react-native"; 6 + import { SafeAreaView } from "react-native-safe-area-context"; 7 + 8 + import { SeekBar } from "@/components/seek-bar"; 9 + import { Colors } from "@/constants/theme"; 10 + import { formatDuration } from "@/lib/mock-data"; 11 + import { usePlayer } from "@/lib/player-context"; 12 + 13 + export default function PlayerScreen() { 14 + const { 15 + currentTrack, 16 + currentIdx, 17 + queue, 18 + position, 19 + isPlaying, 20 + shuffle, 21 + repeat, 22 + liked, 23 + toggle, 24 + next, 25 + prev, 26 + seek, 27 + toggleShuffle, 28 + cycleRepeat, 29 + toggleLike, 30 + } = usePlayer(); 31 + 32 + if (!currentTrack) { 33 + return ( 34 + <SafeAreaView className="flex-1 bg-bg"> 35 + <View className="flex-1 items-center justify-center"> 36 + <Text className="text-text-secondary">No track loaded</Text> 37 + </View> 38 + </SafeAreaView> 39 + ); 40 + } 41 + 42 + const isLiked = liked.has(currentTrack.id); 43 + const repeatIcon = 44 + repeat === "one" ? "repeat" : repeat === "all" ? "repeat" : "repeat-outline"; 45 + 46 + return ( 47 + <View className="flex-1 bg-bg"> 48 + {/* Full-screen album art backdrop, heavily blurred */} 49 + {currentTrack.artwork ? ( 50 + <> 51 + <Image 52 + source={currentTrack.artwork} 53 + className="absolute inset-0" 54 + contentFit="cover" 55 + blurRadius={50} 56 + /> 57 + <BlurView 58 + intensity={80} 59 + tint="dark" 60 + className="absolute inset-0" 61 + /> 62 + {/* Bottom darken to keep controls readable */} 63 + <View 64 + className="absolute left-0 right-0 bottom-0 bg-black/55" 65 + style={{ height: "55%" }} 66 + /> 67 + </> 68 + ) : null} 69 + <SafeAreaView className="flex-1"> 70 + <View className="flex-row items-center justify-between px-5 py-3"> 71 + <Pressable hitSlop={10} onPress={() => router.back()}> 72 + <Ionicons name="chevron-down" size={28} color={Colors.textPrimary} /> 73 + </Pressable> 74 + <View className="items-center"> 75 + <Text className="text-text-secondary text-[11px]"> 76 + PLAYING FROM ALBUM 77 + </Text> 78 + <Text 79 + numberOfLines={1} 80 + className="text-text-primary text-[13px] font-semibold font-sans" 81 + > 82 + {currentTrack.album} 83 + </Text> 84 + </View> 85 + <Pressable hitSlop={10} onPress={() => router.push("/queue")}> 86 + <Ionicons name="list" size={26} color={Colors.textPrimary} /> 87 + </Pressable> 88 + </View> 89 + 90 + <View className="flex-1 items-center justify-center px-5"> 91 + {currentTrack.artwork ? ( 92 + <Image 93 + source={currentTrack.artwork} 94 + style={{ 95 + width: "94%", 96 + aspectRatio: 1, 97 + borderRadius: 8, 98 + shadowColor: "#000", 99 + shadowOpacity: 0.7, 100 + shadowRadius: 28, 101 + shadowOffset: { width: 0, height: 16 }, 102 + }} 103 + contentFit="cover" 104 + /> 105 + ) : ( 106 + <View 107 + className="bg-bg-card items-center justify-center rounded-lg" 108 + style={{ width: "94%", aspectRatio: 1 }} 109 + > 110 + <Ionicons 111 + name="musical-notes" 112 + size={92} 113 + color={Colors.textMuted} 114 + /> 115 + </View> 116 + )} 117 + </View> 118 + 119 + <View className="px-6 pb-4"> 120 + <View className="flex-row items-end justify-between mb-1.5"> 121 + <View className="flex-1 pr-3"> 122 + <Text 123 + numberOfLines={1} 124 + className="text-text-primary text-[22px] font-extrabold font-sans" 125 + > 126 + {currentTrack.title} 127 + </Text> 128 + <Text 129 + numberOfLines={1} 130 + className="text-text-secondary text-[15px] mt-0.5 font-sans" 131 + > 132 + {currentTrack.artist} 133 + </Text> 134 + </View> 135 + <Pressable hitSlop={10} onPress={() => toggleLike(currentTrack.id)}> 136 + <Ionicons 137 + name={isLiked ? "heart" : "heart-outline"} 138 + size={28} 139 + color={isLiked ? Colors.accent : Colors.textPrimary} 140 + /> 141 + </Pressable> 142 + </View> 143 + 144 + <View className="mt-3.5"> 145 + <SeekBar 146 + value={position} 147 + max={currentTrack.duration} 148 + onSeek={(v) => seek(v)} 149 + fill="#FFFFFF" 150 + /> 151 + <View className="flex-row justify-between mt-1"> 152 + <Text className="text-text-muted text-[11px] font-mono"> 153 + {formatDuration(position)} 154 + </Text> 155 + <Text className="text-text-muted text-[11px] font-mono"> 156 + {formatDuration(currentTrack.duration)} 157 + </Text> 158 + </View> 159 + </View> 160 + 161 + <View className="flex-row items-center justify-between mt-4 px-1"> 162 + <Pressable hitSlop={10} onPress={toggleShuffle}> 163 + <Ionicons 164 + name="shuffle" 165 + size={22} 166 + color={shuffle ? Colors.accent : Colors.textSecondary} 167 + /> 168 + </Pressable> 169 + <Pressable hitSlop={10} onPress={prev}> 170 + <Ionicons 171 + name="play-skip-back" 172 + size={32} 173 + color={Colors.textPrimary} 174 + /> 175 + </Pressable> 176 + <Pressable 177 + onPress={toggle} 178 + className="w-[68px] h-[68px] rounded-full bg-accent items-center justify-center" 179 + > 180 + <Ionicons 181 + name={isPlaying ? "pause" : "play"} 182 + size={32} 183 + color="#FFFFFF" 184 + style={{ marginLeft: isPlaying ? 0 : 3 }} 185 + /> 186 + </Pressable> 187 + <Pressable hitSlop={10} onPress={next}> 188 + <Ionicons 189 + name="play-skip-forward" 190 + size={32} 191 + color={Colors.textPrimary} 192 + /> 193 + </Pressable> 194 + <Pressable hitSlop={10} onPress={cycleRepeat}> 195 + <Ionicons 196 + name={repeatIcon as any} 197 + size={22} 198 + color={repeat === "off" ? Colors.textSecondary : Colors.accent} 199 + /> 200 + {repeat === "one" ? ( 201 + <Text className="absolute top-1.5 -right-1.5 text-accent text-[9px] font-extrabold font-mono"> 202 + 1 203 + </Text> 204 + ) : null} 205 + </Pressable> 206 + </View> 207 + 208 + <View className="flex-row items-center justify-between mt-4"> 209 + <Text className="text-text-muted text-[11px] font-sans"> 210 + {currentIdx + 1} / {queue.length} 211 + </Text> 212 + <Pressable 213 + hitSlop={8} 214 + className="flex-row items-center gap-1.5" 215 + > 216 + <Ionicons 217 + name="volume-medium-outline" 218 + size={16} 219 + color={Colors.textMuted} 220 + /> 221 + <Text className="text-text-muted text-[11px] font-sans"> 222 + This Phone 223 + </Text> 224 + </Pressable> 225 + </View> 226 + </View> 227 + </SafeAreaView> 228 + </View> 229 + ); 230 + }
+350
expo/app/playlist/[id].tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Image } from "expo-image"; 3 + import { LinearGradient } from "expo-linear-gradient"; 4 + import { router, useLocalSearchParams } from "expo-router"; 5 + import { useMemo, useState } from "react"; 6 + import { 7 + Animated, 8 + Dimensions, 9 + Pressable, 10 + Text, 11 + View, 12 + } from "react-native"; 13 + import { SafeAreaView } from "react-native-safe-area-context"; 14 + 15 + import { ActionSheet, type ActionItem } from "@/components/action-sheet"; 16 + import { TrackMenuButton } from "@/components/track-menu-button"; 17 + import { Colors } from "@/constants/theme"; 18 + import { 19 + formatDuration, 20 + getPlaylistById, 21 + getPlaylistTracks, 22 + } from "@/lib/mock-data"; 23 + import { usePlayer } from "@/lib/player-context"; 24 + 25 + const { width } = Dimensions.get("window"); 26 + const ART_SIZE = Math.min(width * 0.6, 260); 27 + const HEADER_HEIGHT = 56; 28 + 29 + export default function PlaylistScreen() { 30 + const { id } = useLocalSearchParams<{ id: string }>(); 31 + const { playQueue, currentTrack, isPlaying, userPlaylists, playLast } = 32 + usePlayer(); 33 + const playlist = id 34 + ? userPlaylists.find((p) => p.id === id) ?? getPlaylistById(id) 35 + : undefined; 36 + const tracks = useMemo(() => (id ? getPlaylistTracks(id) : []), [id]); 37 + const [menuOpen, setMenuOpen] = useState(false); 38 + const isUserPlaylist = !!userPlaylists.find((p) => p.id === id); 39 + 40 + const totalDuration = tracks.reduce((s, t) => s + t.duration, 0); 41 + const totalMinutes = Math.round(totalDuration / 60); 42 + 43 + const scrollY = useMemo(() => new Animated.Value(0), []); 44 + const headerBgOpacity = scrollY.interpolate({ 45 + inputRange: [0, 200, 280], 46 + outputRange: [0, 0, 1], 47 + extrapolate: "clamp", 48 + }); 49 + const titleOpacity = scrollY.interpolate({ 50 + inputRange: [0, 240, 320], 51 + outputRange: [0, 0, 1], 52 + extrapolate: "clamp", 53 + }); 54 + const artScale = scrollY.interpolate({ 55 + inputRange: [-100, 0, 200], 56 + outputRange: [1.1, 1, 0.85], 57 + extrapolate: "clamp", 58 + }); 59 + const artOpacity = scrollY.interpolate({ 60 + inputRange: [0, 200, 320], 61 + outputRange: [1, 1, 0], 62 + extrapolate: "clamp", 63 + }); 64 + 65 + if (!playlist) { 66 + return ( 67 + <SafeAreaView className="flex-1 bg-bg"> 68 + <View className="flex-1 items-center justify-center"> 69 + <Text className="text-text-secondary">Playlist not found</Text> 70 + </View> 71 + </SafeAreaView> 72 + ); 73 + } 74 + 75 + const onPlay = () => playQueue(tracks); 76 + const onShuffle = () => playQueue(tracks, { shuffle: true }); 77 + 78 + return ( 79 + <View className="flex-1 bg-bg"> 80 + <Animated.ScrollView 81 + showsVerticalScrollIndicator={false} 82 + scrollEventThrottle={16} 83 + onScroll={Animated.event( 84 + [{ nativeEvent: { contentOffset: { y: scrollY } } }], 85 + { useNativeDriver: true }, 86 + )} 87 + contentContainerStyle={{ paddingBottom: 32 }} 88 + > 89 + {/* Hero band: blurred art behind, sharp art front-and-center */} 90 + <View 91 + className="items-center overflow-hidden pb-4" 92 + style={{ paddingTop: HEADER_HEIGHT + 16 }} 93 + > 94 + <Image 95 + source={playlist.artwork} 96 + className="absolute inset-0" 97 + contentFit="cover" 98 + blurRadius={40} 99 + /> 100 + <LinearGradient 101 + colors={[ 102 + "rgba(0,0,0,0.35)", 103 + "rgba(0,0,0,0.6)", 104 + "rgba(0,0,0,1)", 105 + ]} 106 + locations={[0, 0.55, 1]} 107 + className="absolute inset-0" 108 + /> 109 + <Animated.View 110 + style={{ 111 + transform: [{ scale: artScale }], 112 + opacity: artOpacity, 113 + shadowColor: "#000", 114 + shadowOpacity: 0.6, 115 + shadowRadius: 20, 116 + shadowOffset: { width: 0, height: 12 }, 117 + }} 118 + > 119 + <Image 120 + source={playlist.artwork} 121 + className="rounded-lg" 122 + style={{ width: ART_SIZE, height: ART_SIZE }} 123 + contentFit="cover" 124 + /> 125 + </Animated.View> 126 + </View> 127 + 128 + {/* Title block */} 129 + <View className="px-5 mt-3.5"> 130 + <Text className="text-text-primary text-[26px] font-extrabold font-sans"> 131 + {playlist.name} 132 + </Text> 133 + {playlist.description ? ( 134 + <Text className="text-text-secondary text-[13px] mt-1.5 font-sans"> 135 + {playlist.description} 136 + </Text> 137 + ) : null} 138 + <Text className="text-text-muted text-xs mt-2 font-sans"> 139 + Playlist • {tracks.length} tracks • {totalMinutes} min 140 + </Text> 141 + </View> 142 + 143 + {/* Action row */} 144 + <View className="flex-row items-center px-5 mt-5 gap-4"> 145 + <Pressable 146 + hitSlop={6} 147 + onPress={onShuffle} 148 + className="w-11 h-11 rounded-full items-center justify-center" 149 + > 150 + <Ionicons name="shuffle" size={26} color={Colors.textPrimary} /> 151 + </Pressable> 152 + <Pressable hitSlop={6}> 153 + <Ionicons 154 + name="heart-outline" 155 + size={26} 156 + color={Colors.textPrimary} 157 + /> 158 + </Pressable> 159 + <Pressable hitSlop={6} onPress={() => setMenuOpen(true)}> 160 + <Ionicons 161 + name="ellipsis-horizontal" 162 + size={26} 163 + color={Colors.textPrimary} 164 + /> 165 + </Pressable> 166 + <View className="flex-1" /> 167 + <Pressable 168 + onPress={onPlay} 169 + className="w-14 h-14 rounded-full items-center justify-center bg-accent active:opacity-85" 170 + style={{ 171 + shadowColor: Colors.accent, 172 + shadowOpacity: 0.5, 173 + shadowRadius: 14, 174 + shadowOffset: { width: 0, height: 6 }, 175 + }} 176 + > 177 + <Ionicons 178 + name="play" 179 + size={26} 180 + color="#FFFFFF" 181 + style={{ marginLeft: 3 }} 182 + /> 183 + </Pressable> 184 + </View> 185 + 186 + {/* Track list */} 187 + <View className="mt-5"> 188 + {tracks.map((t, idx) => { 189 + const isCurrent = currentTrack?.id === t.id; 190 + return ( 191 + <Pressable 192 + key={`${t.id}-${idx}`} 193 + onPress={() => playQueue(tracks, { startIdx: idx })} 194 + className="flex-row items-center px-5 py-2 gap-3 active:bg-bg-hover" 195 + > 196 + {t.artwork ? ( 197 + <Image 198 + source={t.artwork} 199 + className="w-11 h-11 rounded" 200 + contentFit="cover" 201 + /> 202 + ) : ( 203 + <View className="w-11 h-11 rounded bg-bg-card items-center justify-center"> 204 + <Ionicons 205 + name="musical-note" 206 + size={18} 207 + color={Colors.textMuted} 208 + /> 209 + </View> 210 + )} 211 + <View className="flex-1"> 212 + <Text 213 + numberOfLines={1} 214 + className={`text-sm font-semibold font-sans ${isCurrent ? "text-accent" : "text-text-primary"}`} 215 + > 216 + {t.title} 217 + </Text> 218 + <Text 219 + numberOfLines={1} 220 + className="text-text-secondary text-xs mt-0.5 font-sans" 221 + > 222 + {t.artist} • {t.album} 223 + </Text> 224 + </View> 225 + <Text className="text-text-muted text-xs font-mono"> 226 + {formatDuration(t.duration)} 227 + </Text> 228 + {isCurrent && isPlaying ? ( 229 + <Ionicons 230 + name="musical-notes" 231 + size={14} 232 + color={Colors.accent} 233 + /> 234 + ) : null} 235 + <TrackMenuButton track={t} /> 236 + </Pressable> 237 + ); 238 + })} 239 + </View> 240 + </Animated.ScrollView> 241 + 242 + <ActionSheet 243 + visible={menuOpen} 244 + onClose={() => setMenuOpen(false)} 245 + header={{ 246 + title: playlist.name, 247 + subtitle: playlist.isSmart ? "Smart playlist" : "Playlist", 248 + image: playlist.artwork, 249 + }} 250 + actions={ 251 + [ 252 + { 253 + icon: "play-outline", 254 + label: "Play", 255 + onPress: () => { 256 + setMenuOpen(false); 257 + playQueue(tracks); 258 + }, 259 + disabled: tracks.length === 0, 260 + }, 261 + { 262 + icon: "shuffle", 263 + label: "Shuffle Play", 264 + onPress: () => { 265 + setMenuOpen(false); 266 + playQueue(tracks, { shuffle: true }); 267 + }, 268 + disabled: tracks.length === 0, 269 + }, 270 + { 271 + icon: "list-outline", 272 + label: "Add to Queue", 273 + onPress: () => { 274 + setMenuOpen(false); 275 + tracks.forEach((t) => playLast(t)); 276 + }, 277 + disabled: tracks.length === 0, 278 + }, 279 + ...(isUserPlaylist 280 + ? [ 281 + { 282 + icon: "create-outline", 283 + label: "Edit details", 284 + onPress: () => setMenuOpen(false), 285 + }, 286 + { 287 + icon: "trash-outline", 288 + label: "Delete playlist", 289 + destructive: true, 290 + onPress: () => setMenuOpen(false), 291 + }, 292 + ] 293 + : [ 294 + { 295 + icon: "heart-outline", 296 + label: "Save to Library", 297 + onPress: () => setMenuOpen(false), 298 + }, 299 + ]), 300 + { 301 + icon: "share-outline", 302 + label: "Share", 303 + onPress: () => setMenuOpen(false), 304 + }, 305 + ] as ActionItem[] 306 + } 307 + /> 308 + 309 + {/* Sticky header */} 310 + <SafeAreaView 311 + edges={["top"]} 312 + className="absolute top-0 left-0 right-0" 313 + pointerEvents="box-none" 314 + > 315 + <Animated.View 316 + pointerEvents="none" 317 + className="absolute top-0 left-0 right-0 bg-bg" 318 + style={{ 319 + height: HEADER_HEIGHT + 64, 320 + opacity: headerBgOpacity, 321 + }} 322 + /> 323 + <View 324 + className="flex-row items-center px-3" 325 + style={{ height: HEADER_HEIGHT }} 326 + > 327 + <Pressable 328 + hitSlop={10} 329 + onPress={() => router.back()} 330 + className="w-10 h-10 rounded-full items-center justify-center bg-black/35" 331 + > 332 + <Ionicons 333 + name="chevron-back" 334 + size={22} 335 + color={Colors.textPrimary} 336 + /> 337 + </Pressable> 338 + <Animated.Text 339 + numberOfLines={1} 340 + className="flex-1 text-center text-text-primary text-[15px] font-bold px-3 font-sans" 341 + style={{ opacity: titleOpacity }} 342 + > 343 + {playlist.name} 344 + </Animated.Text> 345 + <View className="w-10" /> 346 + </View> 347 + </SafeAreaView> 348 + </View> 349 + ); 350 + }
+184
expo/app/playlist/new.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { router, useLocalSearchParams } from "expo-router"; 3 + import { useState } from "react"; 4 + import { 5 + KeyboardAvoidingView, 6 + Platform, 7 + Pressable, 8 + ScrollView, 9 + Text, 10 + TextInput, 11 + View, 12 + } from "react-native"; 13 + import { SafeAreaView } from "react-native-safe-area-context"; 14 + 15 + import { Colors } from "@/constants/theme"; 16 + import { usePlayer } from "@/lib/player-context"; 17 + 18 + const RULE_PRESETS = [ 19 + 'genre = "Indie"', 20 + "year >= 2020", 21 + "play_count > 5", 22 + "liked = true", 23 + "duration < 240", 24 + "added_within 30d", 25 + ]; 26 + 27 + export default function NewPlaylistScreen() { 28 + const { mode } = useLocalSearchParams<{ mode?: string }>(); 29 + const isSmart = mode === "smart"; 30 + const { createPlaylist } = usePlayer(); 31 + 32 + const [name, setName] = useState(""); 33 + const [description, setDescription] = useState(""); 34 + const [rules, setRules] = useState(""); 35 + 36 + const canCreate = name.trim().length > 0; 37 + 38 + const onCreate = () => { 39 + if (!canCreate) return; 40 + const created = createPlaylist({ 41 + name, 42 + description, 43 + isSmart, 44 + rules: isSmart ? rules : undefined, 45 + }); 46 + router.back(); 47 + setTimeout(() => router.push(`/playlist/${created.id}`), 50); 48 + }; 49 + 50 + const insertRule = (snippet: string) => 51 + setRules((current) => (current ? `${current}\n${snippet}` : snippet)); 52 + 53 + return ( 54 + <SafeAreaView className="flex-1 bg-bg"> 55 + <KeyboardAvoidingView 56 + className="flex-1" 57 + behavior={Platform.OS === "ios" ? "padding" : undefined} 58 + > 59 + <View className="flex-row items-center justify-between px-4 py-3 border-b border-divider"> 60 + <Pressable hitSlop={10} onPress={() => router.back()}> 61 + <Text className="text-text-primary text-sm font-sans">Cancel</Text> 62 + </Pressable> 63 + <Text className="text-text-primary text-base font-bold font-sans"> 64 + {isSmart ? "New Smart Playlist" : "New Playlist"} 65 + </Text> 66 + <Pressable hitSlop={10} disabled={!canCreate} onPress={onCreate}> 67 + <Text 68 + className={`text-sm font-bold font-sans ${canCreate ? "text-accent" : "text-text-muted"}`} 69 + > 70 + Create 71 + </Text> 72 + </Pressable> 73 + </View> 74 + 75 + <ScrollView 76 + contentContainerStyle={{ paddingBottom: 32 }} 77 + keyboardShouldPersistTaps="handled" 78 + > 79 + <View className="items-center py-6"> 80 + <View 81 + className="w-[140px] h-[140px] rounded-lg bg-bg-card items-center justify-center" 82 + style={{ 83 + shadowColor: "#000", 84 + shadowOpacity: 0.5, 85 + shadowRadius: 16, 86 + shadowOffset: { width: 0, height: 8 }, 87 + }} 88 + > 89 + <Ionicons 90 + name={isSmart ? "flash" : "musical-notes"} 91 + size={56} 92 + color={Colors.textMuted} 93 + /> 94 + </View> 95 + </View> 96 + 97 + <Section label="Name"> 98 + <TextInput 99 + value={name} 100 + onChangeText={setName} 101 + placeholder={isSmart ? "Smart playlist name" : "My playlist"} 102 + placeholderTextColor={Colors.textMuted} 103 + autoFocus 104 + maxLength={64} 105 + className="bg-bg-card rounded-md text-text-primary text-[15px] px-3.5 py-3 font-sans" 106 + /> 107 + </Section> 108 + 109 + <Section label="Description"> 110 + <TextInput 111 + value={description} 112 + onChangeText={setDescription} 113 + placeholder="Optional description" 114 + placeholderTextColor={Colors.textMuted} 115 + multiline 116 + numberOfLines={3} 117 + maxLength={240} 118 + textAlignVertical="top" 119 + className="bg-bg-card rounded-md text-text-primary text-[15px] px-3.5 pt-3 pb-3 min-h-[76px] font-sans" 120 + /> 121 + </Section> 122 + 123 + {isSmart ? ( 124 + <> 125 + <Section label="Rules"> 126 + <TextInput 127 + value={rules} 128 + onChangeText={setRules} 129 + placeholder={`one rule per line, e.g.\ngenre = "Indie"\nyear >= 2020`} 130 + placeholderTextColor={Colors.textMuted} 131 + multiline 132 + numberOfLines={6} 133 + textAlignVertical="top" 134 + className="bg-bg-card rounded-md text-text-primary text-[13px] px-3.5 pt-3 pb-3 min-h-[140px] font-mono" 135 + /> 136 + </Section> 137 + 138 + <View className="px-4 mt-1"> 139 + <Text className="text-text-secondary text-xs font-bold mb-2 uppercase tracking-widest font-sans"> 140 + Suggestions 141 + </Text> 142 + <View className="flex-row flex-wrap gap-2"> 143 + {RULE_PRESETS.map((preset) => ( 144 + <Pressable 145 + key={preset} 146 + onPress={() => insertRule(preset)} 147 + className="px-3 h-[30px] rounded-full bg-bg-card items-center justify-center flex-row gap-1.5 active:opacity-70" 148 + > 149 + <Ionicons 150 + name="add" 151 + size={14} 152 + color={Colors.textSecondary} 153 + /> 154 + <Text className="text-text-secondary text-xs font-mono"> 155 + {preset} 156 + </Text> 157 + </Pressable> 158 + ))} 159 + </View> 160 + </View> 161 + </> 162 + ) : null} 163 + </ScrollView> 164 + </KeyboardAvoidingView> 165 + </SafeAreaView> 166 + ); 167 + } 168 + 169 + function Section({ 170 + label, 171 + children, 172 + }: { 173 + label: string; 174 + children: React.ReactNode; 175 + }) { 176 + return ( 177 + <View className="px-4 mb-4"> 178 + <Text className="text-text-secondary text-xs font-bold mb-2 uppercase tracking-widest font-sans"> 179 + {label} 180 + </Text> 181 + {children} 182 + </View> 183 + ); 184 + }
+90
expo/app/queue.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Image } from "expo-image"; 3 + import { router } from "expo-router"; 4 + import { FlatList, Pressable, Text, View } from "react-native"; 5 + import { SafeAreaView } from "react-native-safe-area-context"; 6 + 7 + import { TrackMenuButton } from "@/components/track-menu-button"; 8 + import { Colors } from "@/constants/theme"; 9 + import { formatDuration } from "@/lib/mock-data"; 10 + import { usePlayer } from "@/lib/player-context"; 11 + 12 + export default function QueueScreen() { 13 + const { queue, currentIdx, jumpTo, removeFromQueue, isPlaying } = usePlayer(); 14 + 15 + return ( 16 + <SafeAreaView className="flex-1 bg-bg"> 17 + <View className="flex-row items-center justify-between px-4 py-3 border-b border-divider"> 18 + <Pressable hitSlop={8} onPress={() => router.back()}> 19 + <Ionicons name="chevron-down" size={26} color={Colors.textPrimary} /> 20 + </Pressable> 21 + <Text className="text-text-primary text-base font-bold font-sans"> 22 + Queue 23 + </Text> 24 + <Text className="text-text-secondary text-xs font-sans"> 25 + {currentIdx + 1} / {queue.length} 26 + </Text> 27 + </View> 28 + 29 + <FlatList 30 + data={queue} 31 + keyExtractor={(t, i) => `${t.id}-${i}`} 32 + renderItem={({ item, index }) => { 33 + const isCurrent = index === currentIdx; 34 + return ( 35 + <Pressable 36 + onPress={() => jumpTo(index)} 37 + className={`flex-row items-center gap-3 px-4 py-2.5 ${isCurrent ? "bg-accent-soft border-l-[3px] border-accent" : "active:bg-bg-hover"}`} 38 + > 39 + <View className="w-7 items-center"> 40 + {isCurrent ? ( 41 + <Ionicons 42 + name={isPlaying ? "musical-notes" : "pause"} 43 + size={16} 44 + color={Colors.accent} 45 + /> 46 + ) : ( 47 + <Text className="text-text-muted text-xs font-mono"> 48 + {index + 1} 49 + </Text> 50 + )} 51 + </View> 52 + {item.artwork ? ( 53 + <Image 54 + source={item.artwork} 55 + className="w-11 h-11 rounded" 56 + contentFit="cover" 57 + /> 58 + ) : null} 59 + <View className="flex-1"> 60 + <Text 61 + numberOfLines={1} 62 + className={`text-text-primary text-sm font-sans ${isCurrent ? "font-bold" : "font-medium"}`} 63 + > 64 + {item.title} 65 + </Text> 66 + <Text 67 + numberOfLines={1} 68 + className="text-text-secondary text-xs font-sans" 69 + > 70 + {item.artist} 71 + </Text> 72 + </View> 73 + <Text className="text-text-muted text-xs font-mono"> 74 + {formatDuration(item.duration)} 75 + </Text> 76 + <TrackMenuButton track={item} /> 77 + <Pressable 78 + hitSlop={8} 79 + onPress={() => removeFromQueue(index)} 80 + className="p-1" 81 + > 82 + <Ionicons name="close" size={18} color={Colors.textMuted} /> 83 + </Pressable> 84 + </Pressable> 85 + ); 86 + }} 87 + /> 88 + </SafeAreaView> 89 + ); 90 + }
+232
expo/app/settings.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { router, Stack } from "expo-router"; 3 + import { useState } from "react"; 4 + import { Pressable, ScrollView, Switch, Text, View } from "react-native"; 5 + import { SafeAreaView } from "react-native-safe-area-context"; 6 + 7 + import { Colors } from "@/constants/theme"; 8 + 9 + type Section = { 10 + title: string; 11 + rows: Row[]; 12 + }; 13 + 14 + type Row = 15 + | { 16 + kind: "switch"; 17 + label: string; 18 + icon: React.ComponentProps<typeof Ionicons>["name"]; 19 + value: boolean; 20 + onChange: (v: boolean) => void; 21 + } 22 + | { 23 + kind: "link"; 24 + label: string; 25 + icon: React.ComponentProps<typeof Ionicons>["name"]; 26 + value?: string; 27 + onPress?: () => void; 28 + }; 29 + 30 + export default function SettingsScreen() { 31 + const [crossfade, setCrossfade] = useState(true); 32 + const [normalize, setNormalize] = useState(true); 33 + const [downloadOnWifi, setDownloadOnWifi] = useState(true); 34 + const [hapticFeedback, setHapticFeedback] = useState(true); 35 + 36 + const sections: Section[] = [ 37 + { 38 + title: "Account", 39 + rows: [ 40 + { 41 + kind: "link", 42 + label: "Profile", 43 + icon: "person-outline", 44 + value: "tsiry.sndr@gmail.com", 45 + }, 46 + { 47 + kind: "link", 48 + label: "Subscription", 49 + icon: "card-outline", 50 + value: "Free", 51 + }, 52 + { kind: "link", label: "Sign out", icon: "log-out-outline" }, 53 + ], 54 + }, 55 + { 56 + title: "Playback", 57 + rows: [ 58 + { 59 + kind: "switch", 60 + label: "Crossfade", 61 + icon: "swap-horizontal-outline", 62 + value: crossfade, 63 + onChange: setCrossfade, 64 + }, 65 + { 66 + kind: "switch", 67 + label: "Normalize volume", 68 + icon: "stats-chart-outline", 69 + value: normalize, 70 + onChange: setNormalize, 71 + }, 72 + { 73 + kind: "link", 74 + label: "Audio quality", 75 + icon: "musical-notes-outline", 76 + value: "High", 77 + }, 78 + { kind: "link", label: "Equalizer", icon: "options-outline" }, 79 + ], 80 + }, 81 + { 82 + title: "Storage", 83 + rows: [ 84 + { 85 + kind: "switch", 86 + label: "Download over Wi-Fi only", 87 + icon: "wifi-outline", 88 + value: downloadOnWifi, 89 + onChange: setDownloadOnWifi, 90 + }, 91 + { 92 + kind: "link", 93 + label: "Download quality", 94 + icon: "cloud-download-outline", 95 + value: "Very High", 96 + }, 97 + { 98 + kind: "link", 99 + label: "Storage location", 100 + icon: "folder-outline", 101 + value: "Internal", 102 + }, 103 + ], 104 + }, 105 + { 106 + title: "Devices", 107 + rows: [ 108 + { kind: "link", label: "Connect a device", icon: "bluetooth-outline" }, 109 + { kind: "link", label: "AirPlay & Cast", icon: "tv-outline" }, 110 + { 111 + kind: "link", 112 + label: "Rockbox server", 113 + icon: "server-outline", 114 + value: "localhost:6061", 115 + }, 116 + ], 117 + }, 118 + { 119 + title: "App", 120 + rows: [ 121 + { 122 + kind: "switch", 123 + label: "Haptic feedback", 124 + icon: "phone-portrait-outline", 125 + value: hapticFeedback, 126 + onChange: setHapticFeedback, 127 + }, 128 + { 129 + kind: "link", 130 + label: "Language", 131 + icon: "language-outline", 132 + value: "English", 133 + }, 134 + { 135 + kind: "link", 136 + label: "About", 137 + icon: "information-circle-outline", 138 + value: "1.0.0", 139 + }, 140 + ], 141 + }, 142 + ]; 143 + 144 + return ( 145 + <> 146 + <Stack.Screen options={{ headerShown: false }} /> 147 + <SafeAreaView className="flex-1 bg-bg" edges={["top"]}> 148 + <View className="flex-row items-center px-4 py-3 gap-3"> 149 + <Pressable hitSlop={10} onPress={() => router.back()}> 150 + <Ionicons 151 + name="chevron-back" 152 + size={26} 153 + color={Colors.textPrimary} 154 + /> 155 + </Pressable> 156 + <Text className="text-text-primary text-[22px] font-extrabold font-sans"> 157 + Settings 158 + </Text> 159 + </View> 160 + 161 + <ScrollView 162 + contentContainerStyle={{ paddingBottom: 32 }} 163 + showsVerticalScrollIndicator={false} 164 + > 165 + {sections.map((section) => ( 166 + <View key={section.title} className="mb-6"> 167 + <Text className="text-text-secondary text-xs font-bold tracking-widest px-4 pb-2 uppercase font-sans"> 168 + {section.title} 169 + </Text> 170 + <View className="mx-4 rounded-xl bg-bg-card overflow-hidden"> 171 + {section.rows.map((row, idx) => ( 172 + <View key={`${section.title}-${row.label}`}> 173 + {idx > 0 ? ( 174 + <View className="h-px bg-divider ml-[52px]" /> 175 + ) : null} 176 + <SettingsRow row={row} /> 177 + </View> 178 + ))} 179 + </View> 180 + </View> 181 + ))} 182 + </ScrollView> 183 + </SafeAreaView> 184 + </> 185 + ); 186 + } 187 + 188 + function SettingsRow({ row }: { row: Row }) { 189 + const content = ( 190 + <View className="flex-row items-center px-3.5 h-[52px] gap-3.5"> 191 + <Ionicons name={row.icon} size={20} color={Colors.textSecondary} /> 192 + <Text className="flex-1 text-text-primary text-[15px] font-sans"> 193 + {row.label} 194 + </Text> 195 + {row.kind === "switch" ? ( 196 + <Switch 197 + value={row.value} 198 + onValueChange={row.onChange} 199 + trackColor={{ false: Colors.bgHover, true: Colors.accent }} 200 + thumbColor="#FFFFFF" 201 + ios_backgroundColor={Colors.bgHover} 202 + /> 203 + ) : ( 204 + <> 205 + {row.value ? ( 206 + <Text className="text-text-secondary text-[13px] font-sans"> 207 + {row.value} 208 + </Text> 209 + ) : null} 210 + <Ionicons 211 + name="chevron-forward" 212 + size={18} 213 + color={Colors.textMuted} 214 + /> 215 + </> 216 + )} 217 + </View> 218 + ); 219 + 220 + if (row.kind === "link") { 221 + return ( 222 + <Pressable 223 + onPress={row.onPress} 224 + android_ripple={{ color: Colors.bgHover }} 225 + className="active:bg-bg-hover" 226 + > 227 + {content} 228 + </Pressable> 229 + ); 230 + } 231 + return content; 232 + }
expo/assets/fonts/JetBrainsMono.ttf

This is a binary file and will not be displayed.

expo/assets/fonts/SpaceGrotesk.ttf

This is a binary file and will not be displayed.

expo/assets/images/android-icon-background.png

This is a binary file and will not be displayed.

expo/assets/images/android-icon-foreground.png

This is a binary file and will not be displayed.

expo/assets/images/android-icon-monochrome.png

This is a binary file and will not be displayed.

expo/assets/images/favicon.png

This is a binary file and will not be displayed.

expo/assets/images/icon.png

This is a binary file and will not be displayed.

expo/assets/images/partial-react-logo.png

This is a binary file and will not be displayed.

expo/assets/images/react-logo.png

This is a binary file and will not be displayed.

expo/assets/images/react-logo@2x.png

This is a binary file and will not be displayed.

expo/assets/images/react-logo@3x.png

This is a binary file and will not be displayed.

+115
expo/assets/images/rockbox.svg
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 + <!-- Created with Inkscape (http://www.inkscape.org/) --> 3 + 4 + <svg 5 + xmlns:dc="http://purl.org/dc/elements/1.1/" 6 + xmlns:cc="http://creativecommons.org/ns#" 7 + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 8 + xmlns:svg="http://www.w3.org/2000/svg" 9 + xmlns="http://www.w3.org/2000/svg" 10 + xmlns:xlink="http://www.w3.org/1999/xlink" 11 + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" 12 + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" 13 + version="1.1" 14 + width="120" 15 + height="120" 16 + viewBox="0 0 3386.6665 3386.6666" 17 + id="svg2" 18 + xml:space="preserve" 19 + style="fill-rule:evenodd" 20 + inkscape:version="0.48.1 r9760" 21 + sodipodi:docname="rockbox-clef.svg"><metadata 22 + id="metadata18"><rdf:RDF><cc:Work 23 + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type 24 + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview 25 + pagecolor="#ffffff" 26 + bordercolor="#666666" 27 + borderopacity="1" 28 + objecttolerance="10" 29 + gridtolerance="10" 30 + guidetolerance="10" 31 + inkscape:pageopacity="0" 32 + inkscape:pageshadow="2" 33 + inkscape:window-width="864" 34 + inkscape:window-height="720" 35 + id="namedview16" 36 + showgrid="true" 37 + inkscape:zoom="4" 38 + inkscape:cx="82.5729" 39 + inkscape:cy="69.674808" 40 + inkscape:window-x="0" 41 + inkscape:window-y="24" 42 + inkscape:window-maximized="0" 43 + inkscape:current-layer="Ebene_x0020_1"><inkscape:grid 44 + type="xygrid" 45 + id="grid2993" 46 + empspacing="5" 47 + visible="true" 48 + enabled="true" 49 + snapvisiblegridlinesonly="true" /></sodipodi:namedview><defs 50 + id="defs38"><linearGradient 51 + id="linearGradient3657"><stop 52 + id="stop3659" 53 + style="stop-color:#aa8800;stop-opacity:1" 54 + offset="0" /><stop 55 + id="stop3661" 56 + style="stop-color:#aa8800;stop-opacity:0" 57 + offset="1" /></linearGradient><linearGradient 58 + x1="-89.260162" 59 + y1="-2.1270833" 60 + x2="-14.333748" 61 + y2="85.830009" 62 + id="linearGradient3663" 63 + xlink:href="#linearGradient3657" 64 + gradientUnits="userSpaceOnUse" /></defs> 65 + <g 66 + transform="matrix(0.90063697,0,0,0.88724946,748.25202,-1317.6084)" 67 + id="Ebene_x0020_1"> 68 + <defs 69 + id="defs5"> 70 + <linearGradient 71 + x1="17608" 72 + y1="4190.54" 73 + x2="17715.699" 74 + y2="4801.2798" 75 + id="id0" 76 + gradientUnits="userSpaceOnUse"> 77 + <stop 78 + id="stop8" 79 + style="stop-color:#a67d00;stop-opacity:1" 80 + offset="0" /> 81 + 82 + <stop 83 + id="stop12" 84 + style="stop-color:#ffffff;stop-opacity:1" 85 + offset="1" /> 86 + </linearGradient> 87 + </defs> 88 + 89 + 90 + 91 + 92 + 93 + <rect 94 + width="3133.5845" 95 + height="3180.8667" 96 + ry="302.44305" 97 + x="-517.4447" 98 + y="1803.135" 99 + id="rect3694" 100 + style="fill:#ffc001;fill-opacity:1;fill-rule:evenodd;stroke:none" /><path 101 + d="m 1133.6395,3200.4269 c 11.2559,18.2986 22.432,36.6011 33.5473,54.9487 60.3406,-16.5847 123.9814,-25.3702 188.4648,-26.059 126.1999,-1.316 246.2441,48.6846 317.2687,132.1614 64.2026,75.4539 101.1079,162.6951 106.6733,252.1193 2.3212,37.3762 -5.6502,74.466 -23.3869,108.7376 -43.5526,84.192 -117.9946,155.791 -214.1337,205.9842 45.7615,89.9291 90.0403,180.2716 132.8495,271.0265 81.8832,173.6387 132.6702,354.6655 150.8198,537.8489 4.676,47.2371 -2.5858,94.4734 -21.3927,138.9539 -19.2847,45.5742 -58.1673,84.1121 -110.1785,109.1541 -37.7378,18.1621 -83.751,23.2435 -127.4177,14.0995 -43.6802,-9.1436 -81.2498,-31.7365 -104.0476,-62.5664 -26.5203,-35.904 -42.2855,-75.8627 -46.0345,-116.7994 -2.1173,-23.0223 9.3653,-45.2202 31.1441,-60.2062 27.4567,-18.8993 62.7411,-29.5144 99.7917,-30.07 24.3266,-0.3368 47.3936,9.6188 60.3568,26.0881 12.9472,16.4494 13.7396,36.8489 2.1096,53.3337 -14.3314,20.3045 -37.0946,36.0653 -64.6429,44.7438 l 11.8035,16.1533 c 5.7557,9.2105 16.8132,15.7847 29.6363,17.5515 12.8112,1.7777 25.7362,-1.4481 34.5823,-8.6399 43.6788,-34.3792 67.7315,-81.3042 66.8875,-130.5556 -3.562,-84.7728 -16.3171,-169.3555 -38.1543,-252.8527 -55.7305,-177.8644 -127.5412,-352.777 -214.8999,-523.3512 -16.3737,5.1045 -33.0607,9.6178 -49.9908,13.5678 -49.5652,11.5132 -99.9157,21.0976 -150.8427,28.7217 l -100.813,-814.0936 z m 248.7771,672.5156 c -50.5142,19.7875 -104.412,34.1161 -160.2241,42.5737 l -50.7294,-409.6546 c 72.2514,121.1726 142.3288,243.0983 210.2123,365.7262 0.2567,0.458 0.4978,0.8959 0.7412,1.3547 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 m -150.076,-508.6879 c 17.5147,-4.8294 35.3415,-9.0782 53.3625,-12.729 56.5362,-11.4397 117.3362,-3.637 167.586,21.5055 45.7565,22.8959 80.8463,56.9138 99.7551,96.6234 42.1044,88.5079 47.194,184.4321 14.5179,273.6257 -6.8456,18.7164 -19.8851,35.5583 -37.8052,48.8537 -13.7547,10.2054 -28.1066,19.8974 -43.0038,29.0629 -80.5314,-153.6773 -165.3681,-306.0385 -254.4125,-456.9422 m -10.1481,551.2616 c -14.298,2.1559 -28.7086,3.9408 -43.196,5.3209 -157.9011,15.1267 -314.30239,-47.8917 -393.33817,-158.4708 -140.27886,-196.2782 -185.31029,-423.8857 -126.59762,-639.7364 20.62766,-75.767 42.25356,-151.3353 64.91887,-226.6963 6.26181,-20.8439 12.63094,-41.6829 19.09409,-62.5163 104.89649,154.512 206.20813,310.449 303.84503,467.7319 -104.88444,52.3821 -185.1784,129.7162 -229.58648,221.109 -7.33244,15.1065 -1.5786,32.4892 14.38626,43.3632 15.95163,10.8746 38.6339,12.8768 56.5858,5.0072 15.19318,-10.1136 29.0455,-21.3616 41.40015,-33.6098 49.89688,-51.7003 111.96607,-95.3657 183.00107,-128.7738 19.7486,32.4884 39.3155,65.0179 58.7576,97.6166 l -37.8236,-305.4347 c -92.6263,-150.6417 -189.46344,-299.7421 -290.47048,-447.1875 -16.73566,-24.4224 -33.73799,-48.7363 -51.00315,-72.9107 12.53936,-37.7911 25.36472,-75.5343 38.46801,-113.1874 18.72476,-53.759 31.27196,-108.8276 37.52831,-164.6129 7.04724,-63.0773 -7.52517,-127.0079 -42.2481,-185.2058 -79.1109,-132.6193 -213.39469,-241.1725 -380.18823,-307.3322 -73.37553,-29.1121 -155.31083,-41.0734 -235.85269,-34.4583 -67.48248,5.551 -116.971987,50.5243 -114.340324,103.8724 2.381016,48.4159 22.574124,95.696 58.086904,136.1456 32.88527,37.4341 67.82132,73.7652 104.71321,108.8721 113.82257,108.3303 214.95374,224.3585 302.12809,346.5898 17.13041,24.0557 34.19842,48.1462 51.17499,72.252 -15.99656,48.3246 -31.52841,96.7397 -46.59165,145.277 -69.85813,225.1541 -104.21032,456.9898 -102.24126,690.3515 0.92822,110.1406 26.98496,219.8501 76.97168,323.9736 68.55723,142.8242 245.98138,237.2059 438.57406,233.2775 86.18513,-1.7571 171.82603,-8.9862 256.10363,-21.6231 l -12.26,-99.0043" 102 + id="path24" 103 + style="fill:#000000;fill-opacity:1;fill-rule:evenodd" 104 + inkscape:connector-curvature="0" /> 105 + 106 + 107 + <path 108 + d="M 659.33533,2503.3767 C 573.5524,2394.5355 482.17708,2288.3563 385.43749,2185.1728 c -30.76545,-32.8099 -59.12968,-66.9092 -84.95666,-102.1687 -16.86386,-22.98 -28.28033,-48.07 -33.73308,-74.0078 -1.1599,-5.5966 0.71447,-11.2481 5.21013,-15.5497 4.45467,-4.3102 11.12647,-6.8716 18.3068,-7.0503 34.58075,-0.8971 69.10856,5.1026 100.42147,17.453 134.57561,53.071 237.34107,146.2148 284.58433,257.9109 13.77151,32.583 18.33147,66.9284 13.33714,100.5928 -7.04096,47.4029 -16.80734,94.4462 -29.27229,141.0237 l 0,0" 109 + id="path30" 110 + style="fill:#ffc000" 111 + inkscape:connector-curvature="0" /> 112 + 113 + 114 + </g> 115 + </svg>
expo/assets/images/splash-icon.png

This is a binary file and will not be displayed.

+9
expo/babel.config.js
··· 1 + module.exports = function (api) { 2 + api.cache(true); 3 + return { 4 + presets: [ 5 + ["babel-preset-expo", { jsxImportSource: "nativewind" }], 6 + "nativewind/babel", 7 + ], 8 + }; 9 + };
+2121
expo/bun.lock
··· 1 + { 2 + "lockfileVersion": 1, 3 + "configVersion": 1, 4 + "workspaces": { 5 + "": { 6 + "name": "rockbox", 7 + "dependencies": { 8 + "@expo/vector-icons": "^15.0.3", 9 + "@react-navigation/bottom-tabs": "^7.4.0", 10 + "@react-navigation/elements": "^2.6.3", 11 + "@react-navigation/native": "^7.1.8", 12 + "expo": "~54.0.33", 13 + "expo-blur": "^55.0.14", 14 + "expo-constants": "~18.0.13", 15 + "expo-font": "~14.0.11", 16 + "expo-haptics": "~15.0.8", 17 + "expo-image": "~3.0.11", 18 + "expo-linear-gradient": "^55.0.13", 19 + "expo-linking": "~8.0.11", 20 + "expo-router": "~6.0.23", 21 + "expo-splash-screen": "~31.0.13", 22 + "expo-status-bar": "~3.0.9", 23 + "expo-symbols": "~1.0.8", 24 + "expo-system-ui": "~6.0.9", 25 + "expo-web-browser": "~15.0.10", 26 + "nativewind": "^4.2.3", 27 + "react": "19.1.0", 28 + "react-dom": "19.1.0", 29 + "react-native": "0.81.5", 30 + "react-native-gesture-handler": "~2.28.0", 31 + "react-native-reanimated": "~4.1.1", 32 + "react-native-safe-area-context": "~5.6.0", 33 + "react-native-screens": "~4.16.0", 34 + "react-native-web": "~0.21.0", 35 + "react-native-worklets": "0.5.1", 36 + }, 37 + "devDependencies": { 38 + "@types/react": "~19.1.0", 39 + "babel-preset-expo": "~54.0.10", 40 + "eslint": "^9.25.0", 41 + "eslint-config-expo": "~10.0.0", 42 + "prettier-plugin-tailwindcss": "^0.5.11", 43 + "tailwindcss": "^3.4.17", 44 + "typescript": "~5.9.2", 45 + }, 46 + }, 47 + }, 48 + "packages": { 49 + "@0no-co/graphql.web": ["@0no-co/graphql.web@1.2.0", "", { "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, "optionalPeers": ["graphql"] }, "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw=="], 50 + 51 + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], 52 + 53 + "@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], 54 + 55 + "@babel/compat-data": ["@babel/compat-data@7.29.3", "", {}, "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg=="], 56 + 57 + "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="], 58 + 59 + "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], 60 + 61 + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], 62 + 63 + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], 64 + 65 + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.29.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.29.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA=="], 66 + 67 + "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw=="], 68 + 69 + "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.8", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "debug": "^4.4.3", "lodash.debounce": "^4.0.8", "resolve": "^1.22.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA=="], 70 + 71 + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], 72 + 73 + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], 74 + 75 + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], 76 + 77 + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], 78 + 79 + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], 80 + 81 + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], 82 + 83 + "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="], 84 + 85 + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="], 86 + 87 + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], 88 + 89 + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], 90 + 91 + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], 92 + 93 + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], 94 + 95 + "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ=="], 96 + 97 + "@babel/helpers": ["@babel/helpers@7.29.2", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.29.0" } }, "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw=="], 98 + 99 + "@babel/highlight": ["@babel/highlight@7.25.9", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw=="], 100 + 101 + "@babel/parser": ["@babel/parser@7.29.3", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA=="], 102 + 103 + "@babel/plugin-proposal-decorators": ["@babel/plugin-proposal-decorators@7.29.0", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/plugin-syntax-decorators": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA=="], 104 + 105 + "@babel/plugin-proposal-export-default-from": ["@babel/plugin-proposal-export-default-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw=="], 106 + 107 + "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], 108 + 109 + "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], 110 + 111 + "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], 112 + 113 + "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="], 114 + 115 + "@babel/plugin-syntax-decorators": ["@babel/plugin-syntax-decorators@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA=="], 116 + 117 + "@babel/plugin-syntax-dynamic-import": ["@babel/plugin-syntax-dynamic-import@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="], 118 + 119 + "@babel/plugin-syntax-export-default-from": ["@babel/plugin-syntax-export-default-from@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ=="], 120 + 121 + "@babel/plugin-syntax-flow": ["@babel/plugin-syntax-flow@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew=="], 122 + 123 + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw=="], 124 + 125 + "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], 126 + 127 + "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], 128 + 129 + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], 130 + 131 + "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], 132 + 133 + "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], 134 + 135 + "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="], 136 + 137 + "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="], 138 + 139 + "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="], 140 + 141 + "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], 142 + 143 + "@babel/plugin-syntax-private-property-in-object": ["@babel/plugin-syntax-private-property-in-object@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="], 144 + 145 + "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], 146 + 147 + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="], 148 + 149 + "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="], 150 + 151 + "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.29.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.29.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w=="], 152 + 153 + "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g=="], 154 + 155 + "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw=="], 156 + 157 + "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.28.6", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw=="], 158 + 159 + "@babel/plugin-transform-class-static-block": ["@babel/plugin-transform-class-static-block@7.28.6", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ=="], 160 + 161 + "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-replace-supers": "^7.28.6", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q=="], 162 + 163 + "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/template": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ=="], 164 + 165 + "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw=="], 166 + 167 + "@babel/plugin-transform-export-namespace-from": ["@babel/plugin-transform-export-namespace-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ=="], 168 + 169 + "@babel/plugin-transform-flow-strip-types": ["@babel/plugin-transform-flow-strip-types@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg=="], 170 + 171 + "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="], 172 + 173 + "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="], 174 + 175 + "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], 176 + 177 + "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A=="], 178 + 179 + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.28.6", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA=="], 180 + 181 + "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.29.0", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ=="], 182 + 183 + "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg=="], 184 + 185 + "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w=="], 186 + 187 + "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.6", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA=="], 188 + 189 + "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ=="], 190 + 191 + "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w=="], 192 + 193 + "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="], 194 + 195 + "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.28.6", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg=="], 196 + 197 + "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA=="], 198 + 199 + "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA=="], 200 + 201 + "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-module-imports": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/plugin-syntax-jsx": "^7.28.6", "@babel/types": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow=="], 202 + 203 + "@babel/plugin-transform-react-jsx-development": ["@babel/plugin-transform-react-jsx-development@7.27.1", "", { "dependencies": { "@babel/plugin-transform-react-jsx": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q=="], 204 + 205 + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], 206 + 207 + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], 208 + 209 + "@babel/plugin-transform-react-pure-annotations": ["@babel/plugin-transform-react-pure-annotations@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA=="], 210 + 211 + "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.29.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog=="], 212 + 213 + "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.29.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w=="], 214 + 215 + "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], 216 + 217 + "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA=="], 218 + 219 + "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="], 220 + 221 + "@babel/plugin-transform-template-literals": ["@babel/plugin-transform-template-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg=="], 222 + 223 + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw=="], 224 + 225 + "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="], 226 + 227 + "@babel/preset-react": ["@babel/preset-react@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-transform-react-display-name": "^7.28.0", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ=="], 228 + 229 + "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="], 230 + 231 + "@babel/runtime": ["@babel/runtime@7.29.2", "", {}, "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="], 232 + 233 + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], 234 + 235 + "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], 236 + 237 + "@babel/traverse--for-generate-function-map": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], 238 + 239 + "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], 240 + 241 + "@egjs/hammerjs": ["@egjs/hammerjs@2.0.17", "", { "dependencies": { "@types/hammerjs": "^2.0.36" } }, "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A=="], 242 + 243 + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], 244 + 245 + "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], 246 + 247 + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], 248 + 249 + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], 250 + 251 + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], 252 + 253 + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], 254 + 255 + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], 256 + 257 + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], 258 + 259 + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], 260 + 261 + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], 262 + 263 + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], 264 + 265 + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], 266 + 267 + "@expo/cli": ["@expo/cli@54.0.24", "", { "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", "@expo/devcert": "^1.2.1", "@expo/env": "~2.0.8", "@expo/image-utils": "^0.8.8", "@expo/json-file": "^10.0.8", "@expo/metro": "~54.2.0", "@expo/metro-config": "~54.0.15", "@expo/osascript": "^2.3.8", "@expo/package-manager": "^1.9.10", "@expo/plist": "^0.4.8", "@expo/prebuild-config": "^54.0.8", "@expo/schema-utils": "^0.1.8", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.3.0", "@react-native/dev-middleware": "0.81.5", "@urql/core": "^5.0.6", "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", "arg": "^5.0.2", "better-opn": "~3.0.2", "bplist-creator": "0.1.0", "bplist-parser": "^0.3.1", "chalk": "^4.0.0", "ci-info": "^3.3.0", "compression": "^1.7.4", "connect": "^3.7.0", "debug": "^4.3.4", "env-editor": "^0.4.1", "expo-server": "^1.0.6", "freeport-async": "^2.0.0", "getenv": "^2.0.0", "glob": "^13.0.0", "lan-network": "^0.2.1", "minimatch": "^9.0.0", "node-forge": "^1.3.3", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", "picomatch": "^4.0.3", "pretty-bytes": "^5.6.0", "pretty-format": "^29.7.0", "progress": "^2.0.3", "prompts": "^2.3.2", "qrcode-terminal": "0.11.0", "require-from-string": "^2.0.2", "requireg": "^0.2.2", "resolve": "^1.22.2", "resolve-from": "^5.0.0", "resolve.exports": "^2.0.3", "semver": "^7.6.0", "send": "^0.19.0", "slugify": "^1.3.4", "source-map-support": "~0.5.21", "stacktrace-parser": "^0.1.10", "structured-headers": "^0.4.1", "tar": "^7.5.2", "terminal-link": "^2.1.1", "undici": "^6.18.2", "wrap-ansi": "^7.0.0", "ws": "^8.12.1" }, "peerDependencies": { "expo": "*", "expo-router": "*", "react-native": "*" }, "optionalPeers": ["expo-router", "react-native"], "bin": { "expo-internal": "build/bin/cli" } }, "sha512-5xse1bEgnVUBhOrtttc6xTNJVvjyTRavpzuF0/0nuj+312vfSbk7EiRbG+xJ2pW/iZxnhLPJkFCrPYG0nmheAQ=="], 268 + 269 + "@expo/code-signing-certificates": ["@expo/code-signing-certificates@0.0.6", "", { "dependencies": { "node-forge": "^1.3.3" } }, "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w=="], 270 + 271 + "@expo/config": ["@expo/config@12.0.13", "", { "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~54.0.4", "@expo/config-types": "^54.0.10", "@expo/json-file": "^10.0.8", "deepmerge": "^4.3.1", "getenv": "^2.0.0", "glob": "^13.0.0", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0", "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", "slugify": "^1.3.4", "sucrase": "~3.35.1" } }, "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ=="], 272 + 273 + "@expo/config-plugins": ["@expo/config-plugins@54.0.4", "", { "dependencies": { "@expo/config-types": "^54.0.10", "@expo/json-file": "~10.0.8", "@expo/plist": "^0.4.8", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", "glob": "^13.0.0", "resolve-from": "^5.0.0", "semver": "^7.5.4", "slash": "^3.0.0", "slugify": "^1.6.6", "xcode": "^3.0.1", "xml2js": "0.6.0" } }, "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q=="], 274 + 275 + "@expo/config-types": ["@expo/config-types@54.0.10", "", {}, "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA=="], 276 + 277 + "@expo/devcert": ["@expo/devcert@1.2.1", "", { "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" } }, "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA=="], 278 + 279 + "@expo/devtools": ["@expo/devtools@0.1.8", "", { "dependencies": { "chalk": "^4.1.2" }, "peerDependencies": { "react": "*", "react-native": "*" }, "optionalPeers": ["react", "react-native"] }, "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ=="], 280 + 281 + "@expo/env": ["@expo/env@2.0.11", "", { "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", "dotenv": "~16.4.5", "dotenv-expand": "~11.0.6", "getenv": "^2.0.0" } }, "sha512-xV+ps6YCW7XIPVUwFVCRN2nox09dnRwy8uIjwHWTODu0zFw4kp4omnVkl0OOjuu2XOe7tdgAHxikrkJt9xB/7Q=="], 282 + 283 + "@expo/fingerprint": ["@expo/fingerprint@0.15.5", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", "chalk": "^4.1.2", "debug": "^4.3.4", "getenv": "^2.0.0", "glob": "^13.0.0", "ignore": "^5.3.1", "minimatch": "^10.2.2", "p-limit": "^3.1.0", "resolve-from": "^5.0.0", "semver": "^7.6.0" }, "bin": { "fingerprint": "bin/cli.js" } }, "sha512-mdVoAMcux1WlM6kd1RoWiHRNqKqS+J6mKmWQ/BKgeh937S/fcW58EE68O6nc4KDXtWi3PBeNHskOFcgyIuD4hw=="], 284 + 285 + "@expo/image-utils": ["@expo/image-utils@0.8.13", "", { "dependencies": { "@expo/require-utils": "^55.0.4", "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "getenv": "^2.0.0", "jimp-compact": "0.16.1", "parse-png": "^2.1.0", "semver": "^7.6.0" } }, "sha512-1I//yBQeTY6p0u1ihqGNDAr35EbSG8uFEupFrIF0jd++h9EWH33521yZJU1yE+mwGlzCb61g3ehu78siMhXBlA=="], 286 + 287 + "@expo/json-file": ["@expo/json-file@10.0.13", "", { "dependencies": { "@babel/code-frame": "^7.20.0", "json5": "^2.2.3" } }, "sha512-pX/XjQn7tgNw6zuuV2ikmegmwe/S7uiwhrs2wXrANMkq7ozrA+JcZwgW9Q/8WZgciBzfAhNp5hnackHcrmapQA=="], 288 + 289 + "@expo/metro": ["@expo/metro@54.2.0", "", { "dependencies": { "metro": "0.83.3", "metro-babel-transformer": "0.83.3", "metro-cache": "0.83.3", "metro-cache-key": "0.83.3", "metro-config": "0.83.3", "metro-core": "0.83.3", "metro-file-map": "0.83.3", "metro-minify-terser": "0.83.3", "metro-resolver": "0.83.3", "metro-runtime": "0.83.3", "metro-source-map": "0.83.3", "metro-symbolicate": "0.83.3", "metro-transform-plugins": "0.83.3", "metro-transform-worker": "0.83.3" } }, "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w=="], 290 + 291 + "@expo/metro-config": ["@expo/metro-config@54.0.15", "", { "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", "@expo/config": "~12.0.13", "@expo/env": "~2.0.8", "@expo/json-file": "~10.0.8", "@expo/metro": "~54.2.0", "@expo/spawn-async": "^1.7.2", "browserslist": "^4.25.0", "chalk": "^4.1.0", "debug": "^4.3.2", "dotenv": "~16.4.5", "dotenv-expand": "~11.0.6", "getenv": "^2.0.0", "glob": "^13.0.0", "hermes-parser": "^0.29.1", "jsc-safe-url": "^0.2.4", "lightningcss": "^1.30.1", "picomatch": "^4.0.3", "postcss": "~8.4.32", "resolve-from": "^5.0.0" }, "peerDependencies": { "expo": "*" }, "optionalPeers": ["expo"] }, "sha512-SqIya4VZ9KHM1S9g+xR0A+QKw1Tfs7Gacx6bQNJ98vs4+O7I5+QP5mHZIB0QSZLUV8opiXebHYTiTu+0OAsIUw=="], 292 + 293 + "@expo/metro-runtime": ["@expo/metro-runtime@6.1.2", "", { "dependencies": { "anser": "^1.4.9", "pretty-format": "^29.7.0", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0" }, "peerDependencies": { "expo": "*", "react": "*", "react-dom": "*", "react-native": "*" }, "optionalPeers": ["react-dom"] }, "sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g=="], 294 + 295 + "@expo/osascript": ["@expo/osascript@2.4.2", "", { "dependencies": { "@expo/spawn-async": "^1.7.2" } }, "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw=="], 296 + 297 + "@expo/package-manager": ["@expo/package-manager@1.10.4", "", { "dependencies": { "@expo/json-file": "^10.0.13", "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", "resolve-workspace-root": "^2.0.0" } }, "sha512-y9Mr4Kmpk4abAVZrNNPCdzOZr8nLLyi18p1SXr0RCVA8IfzqZX/eY4H+50a0HTmXqIsPZrQdcdb4I3ekMS9GvQ=="], 298 + 299 + "@expo/plist": ["@expo/plist@0.4.8", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", "xmlbuilder": "^15.1.1" } }, "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ=="], 300 + 301 + "@expo/prebuild-config": ["@expo/prebuild-config@54.0.8", "", { "dependencies": { "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", "@expo/config-types": "^54.0.10", "@expo/image-utils": "^0.8.8", "@expo/json-file": "^10.0.8", "@react-native/normalize-colors": "0.81.5", "debug": "^4.3.1", "resolve-from": "^5.0.0", "semver": "^7.6.0", "xml2js": "0.6.0" }, "peerDependencies": { "expo": "*" } }, "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg=="], 302 + 303 + "@expo/require-utils": ["@expo/require-utils@55.0.4", "", { "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.25.2", "@babel/plugin-transform-modules-commonjs": "^7.24.8" }, "peerDependencies": { "typescript": "^5.0.0 || ^5.0.0-0" }, "optionalPeers": ["typescript"] }, "sha512-JAANvXqV7MOysWeVWgaiDzikoyDjJWOV/ulOW60Zb3kXJfrx2oZOtGtDXDFKD1mXuahQgoM5QOjuZhF7gFRNjA=="], 304 + 305 + "@expo/schema-utils": ["@expo/schema-utils@0.1.8", "", {}, "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A=="], 306 + 307 + "@expo/sdk-runtime-versions": ["@expo/sdk-runtime-versions@1.0.0", "", {}, "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ=="], 308 + 309 + "@expo/spawn-async": ["@expo/spawn-async@1.7.2", "", { "dependencies": { "cross-spawn": "^7.0.3" } }, "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew=="], 310 + 311 + "@expo/sudo-prompt": ["@expo/sudo-prompt@9.3.2", "", {}, "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw=="], 312 + 313 + "@expo/vector-icons": ["@expo/vector-icons@15.1.1", "", { "peerDependencies": { "expo-font": ">=14.0.4", "react": "*", "react-native": "*" } }, "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw=="], 314 + 315 + "@expo/ws-tunnel": ["@expo/ws-tunnel@1.0.6", "", {}, "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q=="], 316 + 317 + "@expo/xcpretty": ["@expo/xcpretty@4.4.3", "", { "dependencies": { "@babel/code-frame": "^7.20.0", "chalk": "^4.1.0", "js-yaml": "^4.1.0" }, "bin": { "excpretty": "build/cli.js" } }, "sha512-wC562eD3gS6vO2tWHToFhlFnmHKfKHgF1oyvojeSkLK/ZYop1bMU+7cOMiF9Sq70CzcsLy/EMRy/uRc76QmNRw=="], 318 + 319 + "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], 320 + 321 + "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], 322 + 323 + "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], 324 + 325 + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], 326 + 327 + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], 328 + 329 + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], 330 + 331 + "@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="], 332 + 333 + "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], 334 + 335 + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.6", "", {}, "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw=="], 336 + 337 + "@jest/create-cache-key-function": ["@jest/create-cache-key-function@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3" } }, "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA=="], 338 + 339 + "@jest/environment": ["@jest/environment@29.7.0", "", { "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" } }, "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw=="], 340 + 341 + "@jest/fake-timers": ["@jest/fake-timers@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ=="], 342 + 343 + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], 344 + 345 + "@jest/transform": ["@jest/transform@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw=="], 346 + 347 + "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], 348 + 349 + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], 350 + 351 + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], 352 + 353 + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], 354 + 355 + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], 356 + 357 + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], 358 + 359 + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], 360 + 361 + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], 362 + 363 + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], 364 + 365 + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], 366 + 367 + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], 368 + 369 + "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], 370 + 371 + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], 372 + 373 + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], 374 + 375 + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], 376 + 377 + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], 378 + 379 + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="], 380 + 381 + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], 382 + 383 + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="], 384 + 385 + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="], 386 + 387 + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], 388 + 389 + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], 390 + 391 + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], 392 + 393 + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="], 394 + 395 + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 396 + 397 + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="], 398 + 399 + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], 400 + 401 + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="], 402 + 403 + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], 404 + 405 + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], 406 + 407 + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], 408 + 409 + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], 410 + 411 + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], 412 + 413 + "@react-native/assets-registry": ["@react-native/assets-registry@0.81.5", "", {}, "sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w=="], 414 + 415 + "@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.81.5", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.5" } }, "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ=="], 416 + 417 + "@react-native/babel-preset": ["@react-native/babel-preset@0.81.5", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-transform-arrow-functions": "^7.24.7", "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-for-of": "^7.24.7", "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", "@babel/plugin-transform-numeric-separator": "^7.24.7", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-react-display-name": "^7.24.7", "@babel/plugin-transform-react-jsx": "^7.25.2", "@babel/plugin-transform-react-jsx-self": "^7.24.7", "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-shorthand-properties": "^7.24.7", "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", "@react-native/babel-plugin-codegen": "0.81.5", "babel-plugin-syntax-hermes-parser": "0.29.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" } }, "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA=="], 418 + 419 + "@react-native/codegen": ["@react-native/codegen@0.81.5", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", "glob": "^7.1.1", "hermes-parser": "0.29.1", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" } }, "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g=="], 420 + 421 + "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.81.5", "", { "dependencies": { "@react-native/dev-middleware": "0.81.5", "debug": "^4.4.0", "invariant": "^2.2.4", "metro": "^0.83.1", "metro-config": "^0.83.1", "metro-core": "^0.83.1", "semver": "^7.1.3" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "*" }, "optionalPeers": ["@react-native-community/cli", "@react-native/metro-config"] }, "sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw=="], 422 + 423 + "@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.81.5", "", {}, "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w=="], 424 + 425 + "@react-native/dev-middleware": ["@react-native/dev-middleware@0.81.5", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.5", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^6.2.3" } }, "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA=="], 426 + 427 + "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.81.5", "", {}, "sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg=="], 428 + 429 + "@react-native/js-polyfills": ["@react-native/js-polyfills@0.81.5", "", {}, "sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w=="], 430 + 431 + "@react-native/normalize-colors": ["@react-native/normalize-colors@0.81.5", "", {}, "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g=="], 432 + 433 + "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.81.5", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw=="], 434 + 435 + "@react-navigation/bottom-tabs": ["@react-navigation/bottom-tabs@7.15.11", "", { "dependencies": { "@react-navigation/elements": "^2.9.15", "color": "^4.2.3", "sf-symbols-typescript": "^2.1.0" }, "peerDependencies": { "@react-navigation/native": "^7.2.2", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-+WtNbd6fJgbViDNjmBUUP7eTgGH+zBtrl3jHuNnfUfXTs9YGuI5q3SiHIc9a5gY3voBOxbOXEiHJyW4xea7nAw=="], 436 + 437 + "@react-navigation/core": ["@react-navigation/core@7.17.2", "", { "dependencies": { "@react-navigation/routers": "^7.5.3", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.3.11", "query-string": "^7.1.3", "react-is": "^19.1.0", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "react": ">= 18.2.0" } }, "sha512-Rt2OZwcgOmjv401uLGAKaRM6xo0fiBce/A7LfRHI1oe5FV+KooWcgAoZ2XOtgKj6UzVMuQWt3b2e6rxo/mDJRA=="], 438 + 439 + "@react-navigation/elements": ["@react-navigation/elements@2.9.15", "", { "dependencies": { "color": "^4.2.3", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", "@react-navigation/native": "^7.2.2", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" }, "optionalPeers": ["@react-native-masked-view/masked-view"] }, "sha512-cyz/pPiyyC6gaTVLsGFc1g0MYgrmuCFqklAWGXMWPscr5YU3ui94vPI4vnZwcsEy0T758TQWLzmS5XudZeRKcA=="], 440 + 441 + "@react-navigation/native": ["@react-navigation/native@7.2.2", "", { "dependencies": { "@react-navigation/core": "^7.17.2", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.3.11", "use-latest-callback": "^0.2.4" }, "peerDependencies": { "react": ">= 18.2.0", "react-native": "*" } }, "sha512-kem1Ko2BcbAjmbQIv66dNmr6EtfDut3QU0qjsVhMnLLhktwyXb6FzZYp8gTrUb6AvkAbaJoi+BF5Pl55pAUa5w=="], 442 + 443 + "@react-navigation/native-stack": ["@react-navigation/native-stack@7.14.12", "", { "dependencies": { "@react-navigation/elements": "^2.9.15", "color": "^4.2.3", "sf-symbols-typescript": "^2.1.0", "warn-once": "^0.1.1" }, "peerDependencies": { "@react-navigation/native": "^7.2.2", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-dUfpkrVeVKKV8iqXsmoUp3Rv0iH3YaB3eZwScru/FlcqAp/r3/qA6zEXkGX9hZK+/ziWAPFrf1frBSNbgOYSFQ=="], 444 + 445 + "@react-navigation/routers": ["@react-navigation/routers@7.5.3", "", { "dependencies": { "nanoid": "^3.3.11" } }, "sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg=="], 446 + 447 + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], 448 + 449 + "@sinclair/typebox": ["@sinclair/typebox@0.27.10", "", {}, "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA=="], 450 + 451 + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], 452 + 453 + "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.3.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA=="], 454 + 455 + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 456 + 457 + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], 458 + 459 + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], 460 + 461 + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], 462 + 463 + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], 464 + 465 + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], 466 + 467 + "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], 468 + 469 + "@types/hammerjs": ["@types/hammerjs@2.0.46", "", {}, "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw=="], 470 + 471 + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], 472 + 473 + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], 474 + 475 + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], 476 + 477 + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], 478 + 479 + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], 480 + 481 + "@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], 482 + 483 + "@types/react": ["@types/react@19.1.17", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA=="], 484 + 485 + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], 486 + 487 + "@types/yargs": ["@types/yargs@17.0.35", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg=="], 488 + 489 + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], 490 + 491 + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.59.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.59.1", "@typescript-eslint/type-utils": "8.59.1", "@typescript-eslint/utils": "8.59.1", "@typescript-eslint/visitor-keys": "8.59.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.59.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag=="], 492 + 493 + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.59.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.59.1", "@typescript-eslint/types": "8.59.1", "@typescript-eslint/typescript-estree": "8.59.1", "@typescript-eslint/visitor-keys": "8.59.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA=="], 494 + 495 + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.59.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.59.1", "@typescript-eslint/types": "^8.59.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg=="], 496 + 497 + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "@typescript-eslint/visitor-keys": "8.59.1" } }, "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg=="], 498 + 499 + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.59.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA=="], 500 + 501 + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "@typescript-eslint/typescript-estree": "8.59.1", "@typescript-eslint/utils": "8.59.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w=="], 502 + 503 + "@typescript-eslint/types": ["@typescript-eslint/types@8.59.1", "", {}, "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A=="], 504 + 505 + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.59.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.59.1", "@typescript-eslint/tsconfig-utils": "8.59.1", "@typescript-eslint/types": "8.59.1", "@typescript-eslint/visitor-keys": "8.59.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g=="], 506 + 507 + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.59.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.59.1", "@typescript-eslint/types": "8.59.1", "@typescript-eslint/typescript-estree": "8.59.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA=="], 508 + 509 + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg=="], 510 + 511 + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], 512 + 513 + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], 514 + 515 + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="], 516 + 517 + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="], 518 + 519 + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="], 520 + 521 + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="], 522 + 523 + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="], 524 + 525 + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="], 526 + 527 + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="], 528 + 529 + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="], 530 + 531 + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="], 532 + 533 + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="], 534 + 535 + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="], 536 + 537 + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="], 538 + 539 + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="], 540 + 541 + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="], 542 + 543 + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="], 544 + 545 + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="], 546 + 547 + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="], 548 + 549 + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], 550 + 551 + "@urql/core": ["@urql/core@5.2.0", "", { "dependencies": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" } }, "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A=="], 552 + 553 + "@urql/exchange-retry": ["@urql/exchange-retry@1.3.2", "", { "dependencies": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" } }, "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg=="], 554 + 555 + "@xmldom/xmldom": ["@xmldom/xmldom@0.8.13", "", {}, "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw=="], 556 + 557 + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], 558 + 559 + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], 560 + 561 + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], 562 + 563 + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], 564 + 565 + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], 566 + 567 + "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], 568 + 569 + "anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="], 570 + 571 + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], 572 + 573 + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 574 + 575 + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 576 + 577 + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], 578 + 579 + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], 580 + 581 + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], 582 + 583 + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 584 + 585 + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], 586 + 587 + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], 588 + 589 + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], 590 + 591 + "array-timsort": ["array-timsort@1.0.3", "", {}, "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ=="], 592 + 593 + "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], 594 + 595 + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], 596 + 597 + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], 598 + 599 + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], 600 + 601 + "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], 602 + 603 + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], 604 + 605 + "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], 606 + 607 + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], 608 + 609 + "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], 610 + 611 + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], 612 + 613 + "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="], 614 + 615 + "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], 616 + 617 + "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.6.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg=="], 618 + 619 + "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.17", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-define-polyfill-provider": "^0.6.8", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w=="], 620 + 621 + "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], 622 + 623 + "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.8", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg=="], 624 + 625 + "babel-plugin-react-compiler": ["babel-plugin-react-compiler@1.0.0", "", { "dependencies": { "@babel/types": "^7.26.0" } }, "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw=="], 626 + 627 + "babel-plugin-react-native-web": ["babel-plugin-react-native-web@0.21.2", "", {}, "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA=="], 628 + 629 + "babel-plugin-syntax-hermes-parser": ["babel-plugin-syntax-hermes-parser@0.29.1", "", { "dependencies": { "hermes-parser": "0.29.1" } }, "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA=="], 630 + 631 + "babel-plugin-transform-flow-enums": ["babel-plugin-transform-flow-enums@0.0.2", "", { "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } }, "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ=="], 632 + 633 + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.2.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg=="], 634 + 635 + "babel-preset-expo": ["babel-preset-expo@54.0.10", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.25.9", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", "@react-native/babel-preset": "0.81.5", "babel-plugin-react-compiler": "^1.0.0", "babel-plugin-react-native-web": "~0.21.0", "babel-plugin-syntax-hermes-parser": "^0.29.1", "babel-plugin-transform-flow-enums": "^0.0.2", "debug": "^4.3.4", "resolve-from": "^5.0.0" }, "peerDependencies": { "@babel/runtime": "^7.20.0", "expo": "*", "react-refresh": ">=0.14.0 <1.0.0" }, "optionalPeers": ["@babel/runtime", "expo"] }, "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw=="], 636 + 637 + "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], 638 + 639 + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 640 + 641 + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], 642 + 643 + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.25", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-QO/VHsXCQdnzADMfmkeOPvHdIAkoB7i0/rGjINPJEetLx75hNttVWGQ/jycHUDP9zZ9rupbm60WRxcwViB0MiA=="], 644 + 645 + "better-opn": ["better-opn@3.0.2", "", { "dependencies": { "open": "^8.0.4" } }, "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ=="], 646 + 647 + "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], 648 + 649 + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], 650 + 651 + "bplist-creator": ["bplist-creator@0.1.0", "", { "dependencies": { "stream-buffers": "2.2.x" } }, "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg=="], 652 + 653 + "bplist-parser": ["bplist-parser@0.3.2", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ=="], 654 + 655 + "brace-expansion": ["brace-expansion@1.1.14", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g=="], 656 + 657 + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 658 + 659 + "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], 660 + 661 + "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], 662 + 663 + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], 664 + 665 + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], 666 + 667 + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], 668 + 669 + "call-bind": ["call-bind@1.0.9", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" } }, "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ=="], 670 + 671 + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], 672 + 673 + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], 674 + 675 + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 676 + 677 + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], 678 + 679 + "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], 680 + 681 + "caniuse-lite": ["caniuse-lite@1.0.30001791", "", {}, "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ=="], 682 + 683 + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], 684 + 685 + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], 686 + 687 + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], 688 + 689 + "chrome-launcher": ["chrome-launcher@0.15.2", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" } }, "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ=="], 690 + 691 + "chromium-edge-launcher": ["chromium-edge-launcher@0.2.0", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg=="], 692 + 693 + "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], 694 + 695 + "cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], 696 + 697 + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], 698 + 699 + "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], 700 + 701 + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], 702 + 703 + "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], 704 + 705 + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], 706 + 707 + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], 708 + 709 + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 710 + 711 + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], 712 + 713 + "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], 714 + 715 + "comment-json": ["comment-json@4.6.2", "", { "dependencies": { "array-timsort": "^1.0.3", "esprima": "^4.0.1" } }, "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w=="], 716 + 717 + "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], 718 + 719 + "compression": ["compression@1.8.1", "", { "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], 720 + 721 + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], 722 + 723 + "connect": ["connect@3.7.0", "", { "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ=="], 724 + 725 + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], 726 + 727 + "core-js-compat": ["core-js-compat@3.49.0", "", { "dependencies": { "browserslist": "^4.28.1" } }, "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA=="], 728 + 729 + "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], 730 + 731 + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 732 + 733 + "css-in-js-utils": ["css-in-js-utils@3.1.0", "", { "dependencies": { "hyphenate-style-name": "^1.0.3" } }, "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A=="], 734 + 735 + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], 736 + 737 + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], 738 + 739 + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], 740 + 741 + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], 742 + 743 + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], 744 + 745 + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], 746 + 747 + "decode-uri-component": ["decode-uri-component@0.2.2", "", {}, "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="], 748 + 749 + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], 750 + 751 + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], 752 + 753 + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], 754 + 755 + "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], 756 + 757 + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], 758 + 759 + "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], 760 + 761 + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], 762 + 763 + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], 764 + 765 + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], 766 + 767 + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], 768 + 769 + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], 770 + 771 + "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], 772 + 773 + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], 774 + 775 + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], 776 + 777 + "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], 778 + 779 + "dotenv-expand": ["dotenv-expand@11.0.7", "", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA=="], 780 + 781 + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], 782 + 783 + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], 784 + 785 + "electron-to-chromium": ["electron-to-chromium@1.5.349", "", {}, "sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A=="], 786 + 787 + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 788 + 789 + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], 790 + 791 + "env-editor": ["env-editor@0.4.2", "", {}, "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA=="], 792 + 793 + "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], 794 + 795 + "es-abstract": ["es-abstract@1.24.2", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg=="], 796 + 797 + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], 798 + 799 + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], 800 + 801 + "es-iterator-helpers": ["es-iterator-helpers@1.3.2", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.2", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "math-intrinsics": "^1.1.0" } }, "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw=="], 802 + 803 + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], 804 + 805 + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], 806 + 807 + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], 808 + 809 + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], 810 + 811 + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], 812 + 813 + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], 814 + 815 + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], 816 + 817 + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], 818 + 819 + "eslint-config-expo": ["eslint-config-expo@10.0.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "^8.18.2", "@typescript-eslint/parser": "^8.18.2", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-expo": "^1.0.0", "eslint-plugin-import": "^2.30.0", "eslint-plugin-react": "^7.37.3", "eslint-plugin-react-hooks": "^5.1.0", "globals": "^16.0.0" }, "peerDependencies": { "eslint": ">=8.10" } }, "sha512-/XC/DvniUWTzU7Ypb/cLDhDD4DXqEio4lug1ObD/oQ9Hcx3OVOR8Mkp4u6U4iGoZSJyIQmIk3WVHe/P1NYUXKw=="], 820 + 821 + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.10", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.16.1", "resolve": "^2.0.0-next.6" } }, "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ=="], 822 + 823 + "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="], 824 + 825 + "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], 826 + 827 + "eslint-plugin-expo": ["eslint-plugin-expo@1.0.0", "", { "dependencies": { "@typescript-eslint/types": "^8.29.1", "@typescript-eslint/utils": "^8.29.1", "eslint": "^9.24.0" } }, "sha512-qLtunR+cNFtC+jwYCBia5c/PJurMjSLMOV78KrEOyQK02ohZapU4dCFFnS2hfrJuw0zxfsjVkjqg3QBqi933QA=="], 828 + 829 + "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], 830 + 831 + "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], 832 + 833 + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], 834 + 835 + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], 836 + 837 + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], 838 + 839 + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], 840 + 841 + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], 842 + 843 + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], 844 + 845 + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], 846 + 847 + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], 848 + 849 + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], 850 + 851 + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], 852 + 853 + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], 854 + 855 + "expo": ["expo@54.0.34", "", { "dependencies": { "@babel/runtime": "^7.20.0", "@expo/cli": "54.0.24", "@expo/config": "~12.0.13", "@expo/config-plugins": "~54.0.4", "@expo/devtools": "0.1.8", "@expo/fingerprint": "0.15.5", "@expo/metro": "~54.2.0", "@expo/metro-config": "54.0.15", "@expo/vector-icons": "^15.0.3", "@ungap/structured-clone": "^1.3.0", "babel-preset-expo": "~54.0.10", "expo-asset": "~12.0.13", "expo-constants": "~18.0.13", "expo-file-system": "~19.0.22", "expo-font": "~14.0.11", "expo-keep-awake": "~15.0.8", "expo-modules-autolinking": "3.0.25", "expo-modules-core": "3.0.30", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-without-unicode": "8.0.0-3" }, "peerDependencies": { "@expo/dom-webview": "*", "@expo/metro-runtime": "*", "react": "*", "react-native": "*", "react-native-webview": "*" }, "optionalPeers": ["@expo/dom-webview", "@expo/metro-runtime", "react-native-webview"], "bin": { "expo": "bin/cli", "fingerprint": "bin/fingerprint", "expo-modules-autolinking": "bin/autolinking" } }, "sha512-XkVHguZZDC8BcTQxHAd14/TQFbDp1Wt0Z/KApO9t68Ll5A127hLCPzU+a9gytfCIiyL/V1IpF1vIcOLKEVAoNQ=="], 856 + 857 + "expo-asset": ["expo-asset@12.0.13", "", { "dependencies": { "@expo/image-utils": "^0.8.8", "expo-constants": "~18.0.13" }, "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-x/p7WvQUnkn6K43b9eL6SPeq5Vnf1E8BDe9bDrWrvMqzyUvJnUFvl+ctg3034s/+UHe7Ne2pAmc0+yzbl8CrDQ=="], 858 + 859 + "expo-blur": ["expo-blur@55.0.14", "", { "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-NKyCKFWTNpX4CZSsiE1sgkqk/yvR1K0UTukuIbxVKoobB+yALLg1CFav0NqfdQqjhtoj5oEzP0Brlq92Z08Zfg=="], 860 + 861 + "expo-constants": ["expo-constants@18.0.13", "", { "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" }, "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ=="], 862 + 863 + "expo-file-system": ["expo-file-system@19.0.22", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-l9pgahSc7sJD0bP9vBNeXvZjy8QKDpVHVxWmei/ESQOrzmoj5BidziqLVsyZdxsi+PfdbTtttLTAmddH/JafYA=="], 864 + 865 + "expo-font": ["expo-font@14.0.11", "", { "dependencies": { "fontfaceobserver": "^2.1.0" }, "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg=="], 866 + 867 + "expo-haptics": ["expo-haptics@15.0.8", "", { "peerDependencies": { "expo": "*" } }, "sha512-lftutojy8Qs8zaDzzjwM3gKHFZ8bOOEZDCkmh2Ddpe95Ra6kt2izeOfOfKuP/QEh0MZ1j9TfqippyHdRd1ZM9g=="], 868 + 869 + "expo-image": ["expo-image@3.0.11", "", { "peerDependencies": { "expo": "*", "react": "*", "react-native": "*", "react-native-web": "*" }, "optionalPeers": ["react-native-web"] }, "sha512-4TudfUCLgYgENv+f48omnU8tjS2S0Pd9EaON5/s1ZUBRwZ7K8acEr4NfvLPSaeXvxW24iLAiyQ7sV7BXQH3RoA=="], 870 + 871 + "expo-keep-awake": ["expo-keep-awake@15.0.8", "", { "peerDependencies": { "expo": "*", "react": "*" } }, "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ=="], 872 + 873 + "expo-linear-gradient": ["expo-linear-gradient@55.0.13", "", { "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-Qz2T4jpkA15RIk29DBqI1TwW+8O9AN8MyC4TJPbh/5UnihH0yNNz3waplUO8Szh5OZ3czTGvtPQU4ysF3RDxwQ=="], 874 + 875 + "expo-linking": ["expo-linking@8.0.12", "", { "dependencies": { "expo-constants": "~18.0.13", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-FpXeIpFgZuxihwT9lBo86YD3y6LphBuAhN680MMxm/Y7fmsc57vimn2d3vFu68VI0+Z9w457t494mu2wvlgWTQ=="], 876 + 877 + "expo-modules-autolinking": ["expo-modules-autolinking@3.0.25", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "commander": "^7.2.0", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0" }, "bin": { "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, "sha512-YmHWctJlwvOuLZccg3cOXvSiXVJrPMKl7g2YR0YHWoGL9v2RvcmgaPJWPSLVW+voNEgEPsbo5UmUrAqbnYcBeg=="], 878 + 879 + "expo-modules-core": ["expo-modules-core@3.0.30", "", { "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-a6IrpAn/Jbmwxi9L+hMmXKpNqnkUpoF7WHOpn02rVLyax2J0gB1vvCVE5rNydplEnt41Q6WxQwvcOjZaIkcSUg=="], 880 + 881 + "expo-router": ["expo-router@6.0.23", "", { "dependencies": { "@expo/metro-runtime": "^6.1.2", "@expo/schema-utils": "^0.1.8", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-tabs": "^1.1.12", "@react-navigation/bottom-tabs": "^7.4.0", "@react-navigation/native": "^7.1.8", "@react-navigation/native-stack": "^7.3.16", "client-only": "^0.0.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "expo-server": "^1.0.5", "fast-deep-equal": "^3.1.3", "invariant": "^2.2.4", "nanoid": "^3.3.8", "query-string": "^7.1.3", "react-fast-compare": "^3.2.2", "react-native-is-edge-to-edge": "^1.1.6", "semver": "~7.6.3", "server-only": "^0.0.1", "sf-symbols-typescript": "^2.1.0", "shallowequal": "^1.1.0", "use-latest-callback": "^0.2.1", "vaul": "^1.1.2" }, "peerDependencies": { "@react-navigation/drawer": "^7.5.0", "@testing-library/react-native": ">= 12.0.0", "expo": "*", "expo-constants": "^18.0.13", "expo-linking": "^8.0.11", "react": "*", "react-dom": "*", "react-native": "*", "react-native-gesture-handler": "*", "react-native-reanimated": "*", "react-native-safe-area-context": ">= 5.4.0", "react-native-screens": "*", "react-native-web": "*", "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" }, "optionalPeers": ["@react-navigation/drawer", "@testing-library/react-native", "react-dom", "react-native-gesture-handler", "react-native-reanimated", "react-native-web", "react-server-dom-webpack"] }, "sha512-qCxVAiCrCyu0npky6azEZ6dJDMt77OmCzEbpF6RbUTlfkaCA417LvY14SBkk0xyGruSxy/7pvJOI6tuThaUVCA=="], 882 + 883 + "expo-server": ["expo-server@1.0.6", "", {}, "sha512-vb5TBtskvEdzYuW79lATXutOEBfW5m6U4EFpNjCVZTnI7S//SAsLQkYEpn+EDfn84m6VQfzSGkIVR6YPaScKFA=="], 884 + 885 + "expo-splash-screen": ["expo-splash-screen@31.0.13", "", { "dependencies": { "@expo/prebuild-config": "^54.0.8" }, "peerDependencies": { "expo": "*" } }, "sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA=="], 886 + 887 + "expo-status-bar": ["expo-status-bar@3.0.9", "", { "dependencies": { "react-native-is-edge-to-edge": "^1.2.1" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw=="], 888 + 889 + "expo-symbols": ["expo-symbols@1.0.8", "", { "dependencies": { "sf-symbols-typescript": "^2.0.0" }, "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-7bNjK350PaQgxBf0owpmSYkdZIpdYYmaPttDBb2WIp6rIKtcEtdzdfmhsc2fTmjBURHYkg36+eCxBFXO25/1hw=="], 890 + 891 + "expo-system-ui": ["expo-system-ui@6.0.9", "", { "dependencies": { "@react-native/normalize-colors": "0.81.5", "debug": "^4.3.2" }, "peerDependencies": { "expo": "*", "react-native": "*", "react-native-web": "*" }, "optionalPeers": ["react-native-web"] }, "sha512-eQTYGzw1V4RYiYHL9xDLYID3Wsec2aZS+ypEssmF64D38aDrqbDgz1a2MSlHLQp2jHXSs3FvojhZ9FVela1Zcg=="], 892 + 893 + "expo-web-browser": ["expo-web-browser@15.0.11", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-r2LS4Ro6DgUPZkcaEfgt8mp9eJuoA93x11Jh7S6utFe0FEzvUNn2yFhxg8XVwESaaHGt2k5V8LuK36rsp0BeIw=="], 894 + 895 + "exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="], 896 + 897 + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], 898 + 899 + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 900 + 901 + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], 902 + 903 + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], 904 + 905 + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], 906 + 907 + "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], 908 + 909 + "fbjs": ["fbjs@3.0.5", "", { "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^1.0.35" } }, "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg=="], 910 + 911 + "fbjs-css-vars": ["fbjs-css-vars@1.0.2", "", {}, "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="], 912 + 913 + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], 914 + 915 + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], 916 + 917 + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], 918 + 919 + "filter-obj": ["filter-obj@1.1.0", "", {}, "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ=="], 920 + 921 + "finalhandler": ["finalhandler@1.1.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="], 922 + 923 + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], 924 + 925 + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], 926 + 927 + "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], 928 + 929 + "flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="], 930 + 931 + "fontfaceobserver": ["fontfaceobserver@2.3.0", "", {}, "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg=="], 932 + 933 + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], 934 + 935 + "freeport-async": ["freeport-async@2.0.0", "", {}, "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ=="], 936 + 937 + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], 938 + 939 + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], 940 + 941 + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 942 + 943 + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], 944 + 945 + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], 946 + 947 + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], 948 + 949 + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], 950 + 951 + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], 952 + 953 + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], 954 + 955 + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], 956 + 957 + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], 958 + 959 + "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], 960 + 961 + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], 962 + 963 + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], 964 + 965 + "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], 966 + 967 + "getenv": ["getenv@2.0.0", "", {}, "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ=="], 968 + 969 + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], 970 + 971 + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], 972 + 973 + "globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="], 974 + 975 + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], 976 + 977 + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], 978 + 979 + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], 980 + 981 + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], 982 + 983 + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], 984 + 985 + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], 986 + 987 + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], 988 + 989 + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], 990 + 991 + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], 992 + 993 + "hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="], 994 + 995 + "hermes-estree": ["hermes-estree@0.29.1", "", {}, "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ=="], 996 + 997 + "hermes-parser": ["hermes-parser@0.29.1", "", { "dependencies": { "hermes-estree": "0.29.1" } }, "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA=="], 998 + 999 + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], 1000 + 1001 + "hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], 1002 + 1003 + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], 1004 + 1005 + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], 1006 + 1007 + "hyphenate-style-name": ["hyphenate-style-name@1.1.0", "", {}, "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw=="], 1008 + 1009 + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], 1010 + 1011 + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], 1012 + 1013 + "image-size": ["image-size@1.2.1", "", { "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" } }, "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw=="], 1014 + 1015 + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], 1016 + 1017 + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], 1018 + 1019 + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], 1020 + 1021 + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 1022 + 1023 + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], 1024 + 1025 + "inline-style-prefixer": ["inline-style-prefixer@7.0.1", "", { "dependencies": { "css-in-js-utils": "^3.1.0" } }, "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw=="], 1026 + 1027 + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], 1028 + 1029 + "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], 1030 + 1031 + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], 1032 + 1033 + "is-arrayish": ["is-arrayish@0.3.4", "", {}, "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="], 1034 + 1035 + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], 1036 + 1037 + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], 1038 + 1039 + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], 1040 + 1041 + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], 1042 + 1043 + "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="], 1044 + 1045 + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], 1046 + 1047 + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], 1048 + 1049 + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], 1050 + 1051 + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], 1052 + 1053 + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], 1054 + 1055 + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 1056 + 1057 + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], 1058 + 1059 + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], 1060 + 1061 + "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], 1062 + 1063 + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 1064 + 1065 + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], 1066 + 1067 + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], 1068 + 1069 + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 1070 + 1071 + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], 1072 + 1073 + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], 1074 + 1075 + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], 1076 + 1077 + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], 1078 + 1079 + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], 1080 + 1081 + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], 1082 + 1083 + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], 1084 + 1085 + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], 1086 + 1087 + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], 1088 + 1089 + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], 1090 + 1091 + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], 1092 + 1093 + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], 1094 + 1095 + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 1096 + 1097 + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], 1098 + 1099 + "istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], 1100 + 1101 + "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], 1102 + 1103 + "jest-environment-node": ["jest-environment-node@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw=="], 1104 + 1105 + "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="], 1106 + 1107 + "jest-haste-map": ["jest-haste-map@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA=="], 1108 + 1109 + "jest-message-util": ["jest-message-util@29.7.0", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w=="], 1110 + 1111 + "jest-mock": ["jest-mock@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" } }, "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw=="], 1112 + 1113 + "jest-regex-util": ["jest-regex-util@29.6.3", "", {}, "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg=="], 1114 + 1115 + "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], 1116 + 1117 + "jest-validate": ["jest-validate@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="], 1118 + 1119 + "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], 1120 + 1121 + "jimp-compact": ["jimp-compact@0.16.1", "", {}, "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww=="], 1122 + 1123 + "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], 1124 + 1125 + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], 1126 + 1127 + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], 1128 + 1129 + "jsc-safe-url": ["jsc-safe-url@0.2.4", "", {}, "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q=="], 1130 + 1131 + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], 1132 + 1133 + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], 1134 + 1135 + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], 1136 + 1137 + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], 1138 + 1139 + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], 1140 + 1141 + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], 1142 + 1143 + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], 1144 + 1145 + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], 1146 + 1147 + "lan-network": ["lan-network@0.2.1", "", { "bin": { "lan-network": "dist/lan-network-cli.js" } }, "sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A=="], 1148 + 1149 + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], 1150 + 1151 + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], 1152 + 1153 + "lighthouse-logger": ["lighthouse-logger@1.4.2", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g=="], 1154 + 1155 + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], 1156 + 1157 + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], 1158 + 1159 + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], 1160 + 1161 + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], 1162 + 1163 + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], 1164 + 1165 + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], 1166 + 1167 + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], 1168 + 1169 + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], 1170 + 1171 + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], 1172 + 1173 + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], 1174 + 1175 + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], 1176 + 1177 + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], 1178 + 1179 + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], 1180 + 1181 + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], 1182 + 1183 + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], 1184 + 1185 + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], 1186 + 1187 + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], 1188 + 1189 + "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="], 1190 + 1191 + "log-symbols": ["log-symbols@2.2.0", "", { "dependencies": { "chalk": "^2.0.1" } }, "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg=="], 1192 + 1193 + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], 1194 + 1195 + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 1196 + 1197 + "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], 1198 + 1199 + "marky": ["marky@1.3.0", "", {}, "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ=="], 1200 + 1201 + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], 1202 + 1203 + "memoize-one": ["memoize-one@5.2.1", "", {}, "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="], 1204 + 1205 + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], 1206 + 1207 + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 1208 + 1209 + "metro": ["metro@0.83.3", "", { "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.3", "@babel/types": "^7.25.2", "accepts": "^1.3.7", "chalk": "^4.0.0", "ci-info": "^2.0.0", "connect": "^3.6.5", "debug": "^4.4.0", "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "hermes-parser": "0.32.0", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", "metro-babel-transformer": "0.83.3", "metro-cache": "0.83.3", "metro-cache-key": "0.83.3", "metro-config": "0.83.3", "metro-core": "0.83.3", "metro-file-map": "0.83.3", "metro-resolver": "0.83.3", "metro-runtime": "0.83.3", "metro-source-map": "0.83.3", "metro-symbolicate": "0.83.3", "metro-transform-plugins": "0.83.3", "metro-transform-worker": "0.83.3", "mime-types": "^2.1.27", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", "source-map": "^0.5.6", "throat": "^5.0.0", "ws": "^7.5.10", "yargs": "^17.6.2" }, "bin": { "metro": "src/cli.js" } }, "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q=="], 1210 + 1211 + "metro-babel-transformer": ["metro-babel-transformer@0.83.3", "", { "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", "hermes-parser": "0.32.0", "nullthrows": "^1.1.1" } }, "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g=="], 1212 + 1213 + "metro-cache": ["metro-cache@0.83.3", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.83.3" } }, "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q=="], 1214 + 1215 + "metro-cache-key": ["metro-cache-key@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw=="], 1216 + 1217 + "metro-config": ["metro-config@0.83.3", "", { "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", "metro": "0.83.3", "metro-cache": "0.83.3", "metro-core": "0.83.3", "metro-runtime": "0.83.3", "yaml": "^2.6.1" } }, "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA=="], 1218 + 1219 + "metro-core": ["metro-core@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", "metro-resolver": "0.83.3" } }, "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw=="], 1220 + 1221 + "metro-file-map": ["metro-file-map@0.83.3", "", { "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "nullthrows": "^1.1.1", "walker": "^1.0.7" } }, "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA=="], 1222 + 1223 + "metro-minify-terser": ["metro-minify-terser@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" } }, "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ=="], 1224 + 1225 + "metro-resolver": ["metro-resolver@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ=="], 1226 + 1227 + "metro-runtime": ["metro-runtime@0.83.7", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-9GKkJURaB2iyYoEExKnedzAHzxmKtSi+k0tsZUvMoU27tBZJElchYt7JH/Ai/XzYAI9lCAaV7u5HZSI8J5Z+wQ=="], 1228 + 1229 + "metro-source-map": ["metro-source-map@0.83.7", "", { "dependencies": { "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.83.7", "nullthrows": "^1.1.1", "ob1": "0.83.7", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-JgA1h7oc1a1jydBe1GhVFsUoMYo3wLPk7oRA32rjlDsq+sP2JLt9x2p2lWbNSxTm/u8NV4VRid3hvEJgcX8tKw=="], 1230 + 1231 + "metro-symbolicate": ["metro-symbolicate@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.83.3", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw=="], 1232 + 1233 + "metro-transform-plugins": ["metro-transform-plugins@0.83.3", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.3", "flow-enums-runtime": "^0.0.6", "nullthrows": "^1.1.1" } }, "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A=="], 1234 + 1235 + "metro-transform-worker": ["metro-transform-worker@0.83.3", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "metro": "0.83.3", "metro-babel-transformer": "0.83.3", "metro-cache": "0.83.3", "metro-cache-key": "0.83.3", "metro-minify-terser": "0.83.3", "metro-source-map": "0.83.3", "metro-transform-plugins": "0.83.3", "nullthrows": "^1.1.1" } }, "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA=="], 1236 + 1237 + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], 1238 + 1239 + "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], 1240 + 1241 + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], 1242 + 1243 + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], 1244 + 1245 + "mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="], 1246 + 1247 + "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], 1248 + 1249 + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], 1250 + 1251 + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], 1252 + 1253 + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], 1254 + 1255 + "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], 1256 + 1257 + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 1258 + 1259 + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], 1260 + 1261 + "nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="], 1262 + 1263 + "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], 1264 + 1265 + "nativewind": ["nativewind@4.2.3", "", { "dependencies": { "comment-json": "^4.2.5", "debug": "^4.3.7", "react-native-css-interop": "0.2.3" }, "peerDependencies": { "tailwindcss": ">3.3.0" } }, "sha512-HglF1v6A8CqBFpXWs0d3yf4qQGurrreLuyE8FTRI/VDH8b0npZa2SDG5tviTkLiBg0s5j09mQALZOjxuocgMLA=="], 1266 + 1267 + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], 1268 + 1269 + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], 1270 + 1271 + "nested-error-stacks": ["nested-error-stacks@2.0.1", "", {}, "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A=="], 1272 + 1273 + "node-exports-info": ["node-exports-info@1.6.0", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw=="], 1274 + 1275 + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], 1276 + 1277 + "node-forge": ["node-forge@1.4.0", "", {}, "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ=="], 1278 + 1279 + "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], 1280 + 1281 + "node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], 1282 + 1283 + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], 1284 + 1285 + "npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], 1286 + 1287 + "nullthrows": ["nullthrows@1.1.1", "", {}, "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw=="], 1288 + 1289 + "ob1": ["ob1@0.83.7", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-9M5kpuOLyTPogMtZiQUIxdAZxl7Dxs6tVBbJErSumsqGMuhVSoUbkfeZ3XNPpLpwBBtqY5QDUzGwggLHX3slQg=="], 1290 + 1291 + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], 1292 + 1293 + "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], 1294 + 1295 + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], 1296 + 1297 + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], 1298 + 1299 + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], 1300 + 1301 + "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], 1302 + 1303 + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], 1304 + 1305 + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], 1306 + 1307 + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], 1308 + 1309 + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], 1310 + 1311 + "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], 1312 + 1313 + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], 1314 + 1315 + "onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], 1316 + 1317 + "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], 1318 + 1319 + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], 1320 + 1321 + "ora": ["ora@3.4.0", "", { "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-spinners": "^2.0.0", "log-symbols": "^2.2.0", "strip-ansi": "^5.2.0", "wcwidth": "^1.0.1" } }, "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg=="], 1322 + 1323 + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], 1324 + 1325 + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], 1326 + 1327 + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], 1328 + 1329 + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], 1330 + 1331 + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], 1332 + 1333 + "parse-png": ["parse-png@2.1.0", "", { "dependencies": { "pngjs": "^3.3.0" } }, "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ=="], 1334 + 1335 + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], 1336 + 1337 + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], 1338 + 1339 + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], 1340 + 1341 + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], 1342 + 1343 + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], 1344 + 1345 + "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], 1346 + 1347 + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], 1348 + 1349 + "picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], 1350 + 1351 + "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], 1352 + 1353 + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], 1354 + 1355 + "plist": ["plist@3.1.1", "", { "dependencies": { "@xmldom/xmldom": "^0.9.10", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA=="], 1356 + 1357 + "pngjs": ["pngjs@3.4.0", "", {}, "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="], 1358 + 1359 + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], 1360 + 1361 + "postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], 1362 + 1363 + "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], 1364 + 1365 + "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="], 1366 + 1367 + "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], 1368 + 1369 + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], 1370 + 1371 + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], 1372 + 1373 + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], 1374 + 1375 + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], 1376 + 1377 + "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], 1378 + 1379 + "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.5.14", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig-melody": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig-melody", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q=="], 1380 + 1381 + "pretty-bytes": ["pretty-bytes@5.6.0", "", {}, "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="], 1382 + 1383 + "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], 1384 + 1385 + "proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], 1386 + 1387 + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], 1388 + 1389 + "promise": ["promise@8.3.0", "", { "dependencies": { "asap": "~2.0.6" } }, "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg=="], 1390 + 1391 + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], 1392 + 1393 + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], 1394 + 1395 + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], 1396 + 1397 + "qrcode-terminal": ["qrcode-terminal@0.11.0", "", { "bin": { "qrcode-terminal": "./bin/qrcode-terminal.js" } }, "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ=="], 1398 + 1399 + "query-string": ["query-string@7.1.3", "", { "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", "split-on-first": "^1.0.0", "strict-uri-encode": "^2.0.0" } }, "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg=="], 1400 + 1401 + "queue": ["queue@6.0.2", "", { "dependencies": { "inherits": "~2.0.3" } }, "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA=="], 1402 + 1403 + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], 1404 + 1405 + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], 1406 + 1407 + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], 1408 + 1409 + "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], 1410 + 1411 + "react-devtools-core": ["react-devtools-core@6.1.5", "", { "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" } }, "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA=="], 1412 + 1413 + "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], 1414 + 1415 + "react-fast-compare": ["react-fast-compare@3.2.2", "", {}, "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="], 1416 + 1417 + "react-freeze": ["react-freeze@1.0.4", "", { "peerDependencies": { "react": ">=17.0.0" } }, "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA=="], 1418 + 1419 + "react-is": ["react-is@19.2.5", "", {}, "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ=="], 1420 + 1421 + "react-native": ["react-native@0.81.5", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.81.5", "@react-native/codegen": "0.81.5", "@react-native/community-cli-plugin": "0.81.5", "@react-native/gradle-plugin": "0.81.5", "@react-native/js-polyfills": "0.81.5", "@react-native/normalize-colors": "0.81.5", "@react-native/virtualized-lists": "0.81.5", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", "babel-plugin-syntax-hermes-parser": "0.29.1", "base64-js": "^1.5.1", "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", "metro-runtime": "^0.83.1", "metro-source-map": "^0.83.1", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.26.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", "ws": "^6.2.3", "yargs": "^17.6.2" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "^19.1.0" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw=="], 1422 + 1423 + "react-native-css-interop": ["react-native-css-interop@0.2.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", "debug": "^4.3.7", "lightningcss": "~1.27.0", "semver": "^7.6.3" }, "peerDependencies": { "react": ">=18", "react-native": "*", "react-native-reanimated": ">=3.6.2", "tailwindcss": "~3" } }, "sha512-wc+JI7iUfdFBqnE18HhMTtD0q9vkhuMczToA87UdHGWwMyxdT5sCcNy+i4KInPCE855IY0Ic8kLQqecAIBWz7w=="], 1424 + 1425 + "react-native-gesture-handler": ["react-native-gesture-handler@2.28.0", "", { "dependencies": { "@egjs/hammerjs": "^2.0.17", "hoist-non-react-statics": "^3.3.0", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A=="], 1426 + 1427 + "react-native-is-edge-to-edge": ["react-native-is-edge-to-edge@1.3.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA=="], 1428 + 1429 + "react-native-reanimated": ["react-native-reanimated@4.1.7", "", { "dependencies": { "react-native-is-edge-to-edge": "^1.2.1", "semver": "^7.7.2" }, "peerDependencies": { "react": "*", "react-native": "0.78 - 0.82", "react-native-worklets": "0.5 - 0.8" } }, "sha512-Q4H6xA3Tn7QL0/E/KjI86I1KK4tcf+ErRE04LH34Etka2oVQhW6oXQ+Q8ZcDCVxiWp5vgbBH6XcH8BOo4w/Rhg=="], 1430 + 1431 + "react-native-safe-area-context": ["react-native-safe-area-context@5.6.2", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg=="], 1432 + 1433 + "react-native-screens": ["react-native-screens@4.16.0", "", { "dependencies": { "react-freeze": "^1.0.0", "react-native-is-edge-to-edge": "^1.2.1", "warn-once": "^0.1.0" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q=="], 1434 + 1435 + "react-native-web": ["react-native-web@0.21.2", "", { "dependencies": { "@babel/runtime": "^7.18.6", "@react-native/normalize-colors": "^0.74.1", "fbjs": "^3.0.4", "inline-style-prefixer": "^7.0.1", "memoize-one": "^6.0.0", "nullthrows": "^1.1.1", "postcss-value-parser": "^4.2.0", "styleq": "^0.1.3" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg=="], 1436 + 1437 + "react-native-worklets": ["react-native-worklets@0.5.1", "", { "dependencies": { "@babel/plugin-transform-arrow-functions": "^7.0.0-0", "@babel/plugin-transform-class-properties": "^7.0.0-0", "@babel/plugin-transform-classes": "^7.0.0-0", "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", "@babel/plugin-transform-optional-chaining": "^7.0.0-0", "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", "@babel/plugin-transform-template-literals": "^7.0.0-0", "@babel/plugin-transform-unicode-regex": "^7.0.0-0", "@babel/preset-typescript": "^7.16.7", "convert-source-map": "^2.0.0", "semver": "7.7.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0", "react": "*", "react-native": "*" } }, "sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w=="], 1438 + 1439 + "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], 1440 + 1441 + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], 1442 + 1443 + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], 1444 + 1445 + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], 1446 + 1447 + "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], 1448 + 1449 + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], 1450 + 1451 + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], 1452 + 1453 + "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], 1454 + 1455 + "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.2", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g=="], 1456 + 1457 + "regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="], 1458 + 1459 + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], 1460 + 1461 + "regexpu-core": ["regexpu-core@6.4.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.2.1" } }, "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA=="], 1462 + 1463 + "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], 1464 + 1465 + "regjsparser": ["regjsparser@0.13.1", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw=="], 1466 + 1467 + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], 1468 + 1469 + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], 1470 + 1471 + "requireg": ["requireg@0.2.2", "", { "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", "resolve": "~1.7.1" } }, "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg=="], 1472 + 1473 + "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], 1474 + 1475 + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], 1476 + 1477 + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], 1478 + 1479 + "resolve-workspace-root": ["resolve-workspace-root@2.0.1", "", {}, "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w=="], 1480 + 1481 + "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="], 1482 + 1483 + "restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], 1484 + 1485 + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], 1486 + 1487 + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], 1488 + 1489 + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 1490 + 1491 + "safe-array-concat": ["safe-array-concat@1.1.4", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg=="], 1492 + 1493 + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], 1494 + 1495 + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], 1496 + 1497 + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], 1498 + 1499 + "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], 1500 + 1501 + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], 1502 + 1503 + "semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], 1504 + 1505 + "send": ["send@0.19.2", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], 1506 + 1507 + "serialize-error": ["serialize-error@2.1.0", "", {}, "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw=="], 1508 + 1509 + "serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], 1510 + 1511 + "server-only": ["server-only@0.0.1", "", {}, "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA=="], 1512 + 1513 + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], 1514 + 1515 + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], 1516 + 1517 + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], 1518 + 1519 + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], 1520 + 1521 + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], 1522 + 1523 + "sf-symbols-typescript": ["sf-symbols-typescript@2.2.0", "", {}, "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw=="], 1524 + 1525 + "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], 1526 + 1527 + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], 1528 + 1529 + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], 1530 + 1531 + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], 1532 + 1533 + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], 1534 + 1535 + "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], 1536 + 1537 + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], 1538 + 1539 + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], 1540 + 1541 + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], 1542 + 1543 + "simple-plist": ["simple-plist@1.3.1", "", { "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", "plist": "^3.0.5" } }, "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw=="], 1544 + 1545 + "simple-swizzle": ["simple-swizzle@0.2.4", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="], 1546 + 1547 + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], 1548 + 1549 + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], 1550 + 1551 + "slugify": ["slugify@1.6.9", "", {}, "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg=="], 1552 + 1553 + "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], 1554 + 1555 + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], 1556 + 1557 + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], 1558 + 1559 + "split-on-first": ["split-on-first@1.1.0", "", {}, "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="], 1560 + 1561 + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], 1562 + 1563 + "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], 1564 + 1565 + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], 1566 + 1567 + "stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="], 1568 + 1569 + "stacktrace-parser": ["stacktrace-parser@0.1.11", "", { "dependencies": { "type-fest": "^0.7.1" } }, "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg=="], 1570 + 1571 + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], 1572 + 1573 + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], 1574 + 1575 + "stream-buffers": ["stream-buffers@2.2.0", "", {}, "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg=="], 1576 + 1577 + "strict-uri-encode": ["strict-uri-encode@2.0.0", "", {}, "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ=="], 1578 + 1579 + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 1580 + 1581 + "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], 1582 + 1583 + "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], 1584 + 1585 + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], 1586 + 1587 + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], 1588 + 1589 + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], 1590 + 1591 + "strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], 1592 + 1593 + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], 1594 + 1595 + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], 1596 + 1597 + "structured-headers": ["structured-headers@0.4.1", "", {}, "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg=="], 1598 + 1599 + "styleq": ["styleq@0.1.3", "", {}, "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA=="], 1600 + 1601 + "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], 1602 + 1603 + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], 1604 + 1605 + "supports-hyperlinks": ["supports-hyperlinks@2.3.0", "", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA=="], 1606 + 1607 + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], 1608 + 1609 + "tailwindcss": ["tailwindcss@3.4.19", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ=="], 1610 + 1611 + "tar": ["tar@7.5.13", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng=="], 1612 + 1613 + "terminal-link": ["terminal-link@2.1.1", "", { "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" } }, "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ=="], 1614 + 1615 + "terser": ["terser@5.46.2", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw=="], 1616 + 1617 + "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], 1618 + 1619 + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], 1620 + 1621 + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], 1622 + 1623 + "throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="], 1624 + 1625 + "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], 1626 + 1627 + "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], 1628 + 1629 + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 1630 + 1631 + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], 1632 + 1633 + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], 1634 + 1635 + "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], 1636 + 1637 + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], 1638 + 1639 + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], 1640 + 1641 + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 1642 + 1643 + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], 1644 + 1645 + "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], 1646 + 1647 + "type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], 1648 + 1649 + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], 1650 + 1651 + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], 1652 + 1653 + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], 1654 + 1655 + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], 1656 + 1657 + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], 1658 + 1659 + "ua-parser-js": ["ua-parser-js@1.0.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug=="], 1660 + 1661 + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], 1662 + 1663 + "undici": ["undici@6.25.0", "", {}, "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg=="], 1664 + 1665 + "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], 1666 + 1667 + "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], 1668 + 1669 + "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="], 1670 + 1671 + "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.1", "", {}, "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg=="], 1672 + 1673 + "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.2.0", "", {}, "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ=="], 1674 + 1675 + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], 1676 + 1677 + "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="], 1678 + 1679 + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], 1680 + 1681 + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], 1682 + 1683 + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], 1684 + 1685 + "use-latest-callback": ["use-latest-callback@0.2.6", "", { "peerDependencies": { "react": ">=16.8" } }, "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg=="], 1686 + 1687 + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], 1688 + 1689 + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], 1690 + 1691 + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], 1692 + 1693 + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], 1694 + 1695 + "uuid": ["uuid@7.0.3", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="], 1696 + 1697 + "validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], 1698 + 1699 + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], 1700 + 1701 + "vaul": ["vaul@1.1.2", "", { "dependencies": { "@radix-ui/react-dialog": "^1.1.1" }, "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA=="], 1702 + 1703 + "vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], 1704 + 1705 + "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], 1706 + 1707 + "warn-once": ["warn-once@0.1.1", "", {}, "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q=="], 1708 + 1709 + "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], 1710 + 1711 + "webidl-conversions": ["webidl-conversions@5.0.0", "", {}, "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="], 1712 + 1713 + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], 1714 + 1715 + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], 1716 + 1717 + "whatwg-url-without-unicode": ["whatwg-url-without-unicode@8.0.0-3", "", { "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", "webidl-conversions": "^5.0.0" } }, "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig=="], 1718 + 1719 + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], 1720 + 1721 + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], 1722 + 1723 + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], 1724 + 1725 + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], 1726 + 1727 + "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], 1728 + 1729 + "wonka": ["wonka@6.3.6", "", {}, "sha512-MXH+6mDHAZ2GuMpgKS055FR6v0xVP3XwquxIMYXgiW+FejHQlMGlvVRZT4qMCxR+bEo/FCtIdKxwej9WV3YQag=="], 1730 + 1731 + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], 1732 + 1733 + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 1734 + 1735 + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], 1736 + 1737 + "write-file-atomic": ["write-file-atomic@4.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg=="], 1738 + 1739 + "ws": ["ws@6.2.3", "", { "dependencies": { "async-limiter": "~1.0.0" } }, "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA=="], 1740 + 1741 + "xcode": ["xcode@3.0.1", "", { "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" } }, "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA=="], 1742 + 1743 + "xml2js": ["xml2js@0.6.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w=="], 1744 + 1745 + "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], 1746 + 1747 + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], 1748 + 1749 + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], 1750 + 1751 + "yaml": ["yaml@2.8.4", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog=="], 1752 + 1753 + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], 1754 + 1755 + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], 1756 + 1757 + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], 1758 + 1759 + "@babel/core/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 1760 + 1761 + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1762 + 1763 + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1764 + 1765 + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1766 + 1767 + "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1768 + 1769 + "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], 1770 + 1771 + "@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1772 + 1773 + "@babel/template/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 1774 + 1775 + "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 1776 + 1777 + "@babel/traverse--for-generate-function-map/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 1778 + 1779 + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], 1780 + 1781 + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], 1782 + 1783 + "@expo/cli/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], 1784 + 1785 + "@expo/cli/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], 1786 + 1787 + "@expo/cli/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], 1788 + 1789 + "@expo/cli/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1790 + 1791 + "@expo/cli/ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="], 1792 + 1793 + "@expo/config/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], 1794 + 1795 + "@expo/config/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1796 + 1797 + "@expo/config-plugins/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], 1798 + 1799 + "@expo/config-plugins/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1800 + 1801 + "@expo/devcert/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], 1802 + 1803 + "@expo/fingerprint/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], 1804 + 1805 + "@expo/fingerprint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], 1806 + 1807 + "@expo/fingerprint/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1808 + 1809 + "@expo/image-utils/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1810 + 1811 + "@expo/json-file/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 1812 + 1813 + "@expo/metro/metro-runtime": ["metro-runtime@0.83.3", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw=="], 1814 + 1815 + "@expo/metro/metro-source-map": ["metro-source-map@0.83.3", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.83.3", "nullthrows": "^1.1.1", "ob1": "0.83.3", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], 1816 + 1817 + "@expo/metro-config/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 1818 + 1819 + "@expo/metro-config/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], 1820 + 1821 + "@expo/metro-config/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], 1822 + 1823 + "@expo/prebuild-config/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1824 + 1825 + "@expo/require-utils/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 1826 + 1827 + "@expo/xcpretty/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 1828 + 1829 + "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], 1830 + 1831 + "@istanbuljs/load-nyc-config/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], 1832 + 1833 + "@istanbuljs/load-nyc-config/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], 1834 + 1835 + "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 1836 + 1837 + "@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 1838 + 1839 + "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 1840 + 1841 + "@react-native/community-cli-plugin/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1842 + 1843 + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], 1844 + 1845 + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], 1846 + 1847 + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1848 + 1849 + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], 1850 + 1851 + "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], 1852 + 1853 + "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1854 + 1855 + "better-opn/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], 1856 + 1857 + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 1858 + 1859 + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1860 + 1861 + "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], 1862 + 1863 + "compression/negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], 1864 + 1865 + "connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], 1866 + 1867 + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], 1868 + 1869 + "eslint-import-resolver-node/resolve": ["resolve@2.0.0-next.6", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA=="], 1870 + 1871 + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], 1872 + 1873 + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], 1874 + 1875 + "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1876 + 1877 + "eslint-plugin-react/resolve": ["resolve@2.0.0-next.6", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA=="], 1878 + 1879 + "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1880 + 1881 + "expo-modules-autolinking/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], 1882 + 1883 + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 1884 + 1885 + "fbjs/promise": ["promise@7.3.1", "", { "dependencies": { "asap": "~2.0.3" } }, "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="], 1886 + 1887 + "fdir/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], 1888 + 1889 + "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], 1890 + 1891 + "finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], 1892 + 1893 + "finalhandler/on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="], 1894 + 1895 + "finalhandler/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], 1896 + 1897 + "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], 1898 + 1899 + "hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 1900 + 1901 + "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], 1902 + 1903 + "is-bun-module/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1904 + 1905 + "istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1906 + 1907 + "jest-message-util/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 1908 + 1909 + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], 1910 + 1911 + "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], 1912 + 1913 + "log-symbols/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], 1914 + 1915 + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], 1916 + 1917 + "metro/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 1918 + 1919 + "metro/ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], 1920 + 1921 + "metro/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], 1922 + 1923 + "metro/metro-runtime": ["metro-runtime@0.83.3", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw=="], 1924 + 1925 + "metro/metro-source-map": ["metro-source-map@0.83.3", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.83.3", "nullthrows": "^1.1.1", "ob1": "0.83.3", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], 1926 + 1927 + "metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], 1928 + 1929 + "metro-babel-transformer/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], 1930 + 1931 + "metro-config/metro-runtime": ["metro-runtime@0.83.3", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw=="], 1932 + 1933 + "metro-source-map/metro-symbolicate": ["metro-symbolicate@0.83.7", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.83.7", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-g4suyxw20WOHWI680c+Kq4wC/NF+Hx5pRH9afrMp+sMTxqLeKcPR1Xf4wMhsjlbvx7LbIREdke6q928jEjvJWw=="], 1934 + 1935 + "metro-symbolicate/metro-source-map": ["metro-source-map@0.83.3", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.83.3", "nullthrows": "^1.1.1", "ob1": "0.83.3", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], 1936 + 1937 + "metro-transform-worker/metro-source-map": ["metro-source-map@0.83.3", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.83.3", "nullthrows": "^1.1.1", "ob1": "0.83.3", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], 1938 + 1939 + "node-exports-info/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1940 + 1941 + "npm-package-arg/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1942 + 1943 + "ora/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], 1944 + 1945 + "path-scurry/lru-cache": ["lru-cache@11.3.5", "", {}, "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw=="], 1946 + 1947 + "plist/@xmldom/xmldom": ["@xmldom/xmldom@0.9.10", "", {}, "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw=="], 1948 + 1949 + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], 1950 + 1951 + "pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], 1952 + 1953 + "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], 1954 + 1955 + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], 1956 + 1957 + "react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], 1958 + 1959 + "react-native-css-interop/lightningcss": ["lightningcss@1.27.0", "", { "dependencies": { "detect-libc": "^1.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.27.0", "lightningcss-darwin-x64": "1.27.0", "lightningcss-freebsd-x64": "1.27.0", "lightningcss-linux-arm-gnueabihf": "1.27.0", "lightningcss-linux-arm64-gnu": "1.27.0", "lightningcss-linux-arm64-musl": "1.27.0", "lightningcss-linux-x64-gnu": "1.27.0", "lightningcss-linux-x64-musl": "1.27.0", "lightningcss-win32-arm64-msvc": "1.27.0", "lightningcss-win32-x64-msvc": "1.27.0" } }, "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ=="], 1960 + 1961 + "react-native-css-interop/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1962 + 1963 + "react-native-reanimated/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 1964 + 1965 + "react-native-web/@react-native/normalize-colors": ["@react-native/normalize-colors@0.74.89", "", {}, "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg=="], 1966 + 1967 + "react-native-web/memoize-one": ["memoize-one@6.0.0", "", {}, "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="], 1968 + 1969 + "react-native-worklets/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], 1970 + 1971 + "requireg/resolve": ["resolve@1.7.1", "", { "dependencies": { "path-parse": "^1.0.5" } }, "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw=="], 1972 + 1973 + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], 1974 + 1975 + "simple-plist/bplist-parser": ["bplist-parser@0.3.1", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA=="], 1976 + 1977 + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], 1978 + 1979 + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], 1980 + 1981 + "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1982 + 1983 + "strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], 1984 + 1985 + "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], 1986 + 1987 + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], 1988 + 1989 + "tinyglobby/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], 1990 + 1991 + "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], 1992 + 1993 + "whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], 1994 + 1995 + "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1996 + 1997 + "xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], 1998 + 1999 + "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], 2000 + 2001 + "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], 2002 + 2003 + "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], 2004 + 2005 + "@expo/cli/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], 2006 + 2007 + "@expo/cli/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="], 2008 + 2009 + "@expo/config-plugins/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], 2010 + 2011 + "@expo/config/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], 2012 + 2013 + "@expo/fingerprint/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], 2014 + 2015 + "@expo/metro-config/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], 2016 + 2017 + "@expo/metro/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], 2018 + 2019 + "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], 2020 + 2021 + "@istanbuljs/load-nyc-config/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], 2022 + 2023 + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], 2024 + 2025 + "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], 2026 + 2027 + "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], 2028 + 2029 + "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], 2030 + 2031 + "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], 2032 + 2033 + "log-symbols/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], 2034 + 2035 + "log-symbols/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], 2036 + 2037 + "log-symbols/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], 2038 + 2039 + "metro-babel-transformer/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], 2040 + 2041 + "metro-symbolicate/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], 2042 + 2043 + "metro-transform-worker/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], 2044 + 2045 + "metro/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], 2046 + 2047 + "metro/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], 2048 + 2049 + "ora/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], 2050 + 2051 + "ora/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], 2052 + 2053 + "ora/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], 2054 + 2055 + "react-native-css-interop/lightningcss/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], 2056 + 2057 + "react-native-css-interop/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.27.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ=="], 2058 + 2059 + "react-native-css-interop/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.27.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg=="], 2060 + 2061 + "react-native-css-interop/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.27.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA=="], 2062 + 2063 + "react-native-css-interop/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.27.0", "", { "os": "linux", "cpu": "arm" }, "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA=="], 2064 + 2065 + "react-native-css-interop/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A=="], 2066 + 2067 + "react-native-css-interop/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg=="], 2068 + 2069 + "react-native-css-interop/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A=="], 2070 + 2071 + "react-native-css-interop/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA=="], 2072 + 2073 + "react-native-css-interop/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.27.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ=="], 2074 + 2075 + "react-native-css-interop/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.27.0", "", { "os": "win32", "cpu": "x64" }, "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw=="], 2076 + 2077 + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], 2078 + 2079 + "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], 2080 + 2081 + "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], 2082 + 2083 + "@expo/cli/glob/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], 2084 + 2085 + "@expo/config-plugins/glob/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], 2086 + 2087 + "@expo/config/glob/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], 2088 + 2089 + "@expo/fingerprint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 2090 + 2091 + "@expo/metro-config/glob/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], 2092 + 2093 + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], 2094 + 2095 + "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 2096 + 2097 + "log-symbols/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], 2098 + 2099 + "log-symbols/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], 2100 + 2101 + "ora/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], 2102 + 2103 + "ora/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], 2104 + 2105 + "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], 2106 + 2107 + "@expo/cli/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 2108 + 2109 + "@expo/config-plugins/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 2110 + 2111 + "@expo/config/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 2112 + 2113 + "@expo/metro-config/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 2114 + 2115 + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], 2116 + 2117 + "log-symbols/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], 2118 + 2119 + "ora/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], 2120 + } 2121 + }
+111
expo/components/action-sheet.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Image } from "expo-image"; 3 + import { Modal, Pressable, Text, View } from "react-native"; 4 + 5 + import { Colors } from "@/constants/theme"; 6 + 7 + export type ActionItem = { 8 + icon: React.ComponentProps<typeof Ionicons>["name"]; 9 + label: string; 10 + onPress?: () => void; 11 + destructive?: boolean; 12 + disabled?: boolean; 13 + }; 14 + 15 + type Header = { 16 + title: string; 17 + subtitle?: string; 18 + image?: string; 19 + rounded?: "lg" | "full"; 20 + }; 21 + 22 + export function ActionSheet({ 23 + visible, 24 + onClose, 25 + header, 26 + actions, 27 + }: { 28 + visible: boolean; 29 + onClose: () => void; 30 + header?: Header; 31 + actions: ActionItem[]; 32 + }) { 33 + return ( 34 + <Modal 35 + visible={visible} 36 + transparent 37 + animationType="slide" 38 + onRequestClose={onClose} 39 + > 40 + <Pressable 41 + onPress={onClose} 42 + className="flex-1 bg-black/55" 43 + > 44 + <Pressable 45 + onPress={(e) => e.stopPropagation()} 46 + className="mt-auto bg-bg-elevated rounded-t-2xl pt-2 pb-7" 47 + > 48 + <View className="self-center w-10 h-1 rounded-sm bg-border my-2" /> 49 + 50 + {header ? ( 51 + <View className="flex-row items-center gap-3 px-4 py-3 border-b border-divider"> 52 + {header.image ? ( 53 + <Image 54 + source={header.image} 55 + className={`w-12 h-12 ${header.rounded === "full" ? "rounded-full" : "rounded-md"}`} 56 + contentFit="cover" 57 + /> 58 + ) : ( 59 + <View 60 + className={`w-12 h-12 bg-bg-card items-center justify-center ${header.rounded === "full" ? "rounded-full" : "rounded-md"}`} 61 + > 62 + <Ionicons 63 + name="musical-note" 64 + size={20} 65 + color={Colors.textMuted} 66 + /> 67 + </View> 68 + )} 69 + <View className="flex-1"> 70 + <Text 71 + numberOfLines={1} 72 + className="text-text-primary text-[15px] font-bold font-sans" 73 + > 74 + {header.title} 75 + </Text> 76 + {header.subtitle ? ( 77 + <Text 78 + numberOfLines={1} 79 + className="text-text-secondary text-xs mt-0.5 font-sans" 80 + > 81 + {header.subtitle} 82 + </Text> 83 + ) : null} 84 + </View> 85 + </View> 86 + ) : null} 87 + 88 + {actions.map((item) => ( 89 + <Pressable 90 + key={item.label} 91 + onPress={item.disabled ? undefined : item.onPress} 92 + android_ripple={{ color: Colors.bgHover }} 93 + className={`flex-row items-center gap-4 px-5 py-3.5 ${item.disabled ? "opacity-40" : ""}`} 94 + > 95 + <Ionicons 96 + name={item.icon} 97 + size={22} 98 + color={item.destructive ? "#FF6B6B" : Colors.textPrimary} 99 + /> 100 + <Text 101 + className={`text-[15px] font-sans ${item.destructive ? "text-danger" : "text-text-primary"}`} 102 + > 103 + {item.label} 104 + </Text> 105 + </Pressable> 106 + ))} 107 + </Pressable> 108 + </Pressable> 109 + </Modal> 110 + ); 111 + }
+73
expo/components/card-row.tsx
··· 1 + import { Image } from "expo-image"; 2 + import { FlatList, Pressable, Text, View } from "react-native"; 3 + 4 + export type CardItem = { 5 + id: string; 6 + title: string; 7 + subtitle?: string; 8 + image: string; 9 + rounded?: "lg" | "full"; 10 + }; 11 + 12 + export function CardRow({ 13 + data, 14 + onPress, 15 + size = 160, 16 + }: { 17 + data: CardItem[]; 18 + onPress?: (item: CardItem) => void; 19 + size?: number; 20 + }) { 21 + return ( 22 + <FlatList 23 + data={data} 24 + horizontal 25 + keyExtractor={(item) => item.id} 26 + showsHorizontalScrollIndicator={false} 27 + contentContainerStyle={{ paddingHorizontal: 16, gap: 14 }} 28 + renderItem={({ item }) => ( 29 + <Pressable 30 + onPress={() => onPress?.(item)} 31 + style={({ pressed }) => ({ 32 + width: size, 33 + opacity: pressed ? 0.85 : 1, 34 + })} 35 + > 36 + <View 37 + className="bg-bg-card overflow-hidden" 38 + style={{ 39 + width: size, 40 + height: size, 41 + borderRadius: item.rounded === "full" ? size / 2 : 8, 42 + shadowColor: "#000", 43 + shadowOffset: { width: 0, height: 6 }, 44 + shadowOpacity: 0.4, 45 + shadowRadius: 8, 46 + }} 47 + > 48 + <Image 49 + source={item.image} 50 + className="w-full h-full" 51 + contentFit="cover" 52 + transition={250} 53 + /> 54 + </View> 55 + <Text 56 + numberOfLines={1} 57 + className="text-text-primary text-sm font-semibold mt-2 font-sans" 58 + > 59 + {item.title} 60 + </Text> 61 + {item.subtitle ? ( 62 + <Text 63 + numberOfLines={2} 64 + className="text-text-secondary text-xs mt-0.5 font-sans" 65 + > 66 + {item.subtitle} 67 + </Text> 68 + ) : null} 69 + </Pressable> 70 + )} 71 + /> 72 + ); 73 + }
+75
expo/components/mini-player.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Image } from "expo-image"; 3 + import { router } from "expo-router"; 4 + import { Pressable, Text, View } from "react-native"; 5 + import { Colors } from "@/constants/theme"; 6 + import { usePlayer } from "@/lib/player-context"; 7 + 8 + export function MiniPlayer() { 9 + const { currentTrack, isPlaying, toggle, next } = usePlayer(); 10 + 11 + if (!currentTrack) return null; 12 + 13 + return ( 14 + <View> 15 + <Pressable 16 + onPress={() => router.push("/player")} 17 + className="flex-row items-center px-4 py-3.5 gap-3.5" 18 + > 19 + {currentTrack.artwork ? ( 20 + <Image 21 + source={currentTrack.artwork} 22 + className="w-11 h-11 rounded-md" 23 + contentFit="cover" 24 + /> 25 + ) : ( 26 + <View className="w-11 h-11 rounded-md bg-bg-card items-center justify-center"> 27 + <Ionicons name="musical-note" size={18} color={Colors.textMuted} /> 28 + </View> 29 + )} 30 + <View className="flex-1 min-w-0"> 31 + <Text 32 + numberOfLines={1} 33 + className="text-text-primary text-[13px] font-semibold font-sans" 34 + > 35 + {currentTrack.title} 36 + </Text> 37 + <Text 38 + numberOfLines={1} 39 + className="text-text-secondary text-[11px] font-sans" 40 + > 41 + {currentTrack.artist} 42 + </Text> 43 + </View> 44 + <Pressable 45 + hitSlop={10} 46 + onPress={(e) => { 47 + e.stopPropagation(); 48 + toggle(); 49 + }} 50 + className="px-1.5" 51 + > 52 + <Ionicons 53 + name={isPlaying ? "pause" : "play"} 54 + size={24} 55 + color={Colors.textPrimary} 56 + /> 57 + </Pressable> 58 + <Pressable 59 + hitSlop={10} 60 + onPress={(e) => { 61 + e.stopPropagation(); 62 + next(); 63 + }} 64 + className="px-1.5" 65 + > 66 + <Ionicons 67 + name="play-skip-forward" 68 + size={20} 69 + color={Colors.textPrimary} 70 + /> 71 + </Pressable> 72 + </Pressable> 73 + </View> 74 + ); 75 + }
+22
expo/components/section-header.tsx
··· 1 + import { Text, View } from "react-native"; 2 + 3 + export function SectionHeader({ 4 + title, 5 + subtitle, 6 + }: { 7 + title: string; 8 + subtitle?: string; 9 + }) { 10 + return ( 11 + <View className="px-4 mb-3"> 12 + <Text className="text-text-primary text-[22px] font-bold font-sans"> 13 + {title} 14 + </Text> 15 + {subtitle ? ( 16 + <Text className="text-text-secondary text-[13px] mt-0.5 font-sans"> 17 + {subtitle} 18 + </Text> 19 + ) : null} 20 + </View> 21 + ); 22 + }
+97
expo/components/seek-bar.tsx
··· 1 + import { useState } from "react"; 2 + import { 3 + GestureResponderEvent, 4 + LayoutChangeEvent, 5 + PanResponder, 6 + View, 7 + ViewStyle, 8 + } from "react-native"; 9 + import { Colors } from "@/constants/theme"; 10 + 11 + export function SeekBar({ 12 + value, 13 + max, 14 + onSeek, 15 + height = 4, 16 + thumb = true, 17 + track = Colors.sliderTrack, 18 + fill = Colors.sliderFill, 19 + style, 20 + }: { 21 + value: number; 22 + max: number; 23 + onSeek?: (newValue: number) => void; 24 + height?: number; 25 + thumb?: boolean; 26 + track?: string; 27 + fill?: string; 28 + style?: ViewStyle; 29 + }) { 30 + const [width, setWidth] = useState(0); 31 + const [drag, setDrag] = useState<number | null>(null); 32 + 33 + const fraction = 34 + drag !== null 35 + ? Math.min(1, Math.max(0, drag)) 36 + : max > 0 37 + ? Math.min(1, Math.max(0, value / max)) 38 + : 0; 39 + 40 + const compute = (event: GestureResponderEvent): number => { 41 + const x = event.nativeEvent.locationX; 42 + if (width <= 0) return 0; 43 + return Math.min(1, Math.max(0, x / width)); 44 + }; 45 + 46 + const responder = PanResponder.create({ 47 + onStartShouldSetPanResponder: () => true, 48 + onMoveShouldSetPanResponder: () => true, 49 + onPanResponderGrant: (e) => setDrag(compute(e)), 50 + onPanResponderMove: (e) => setDrag(compute(e)), 51 + onPanResponderRelease: (e) => { 52 + const final = compute(e); 53 + setDrag(null); 54 + onSeek?.(final * max); 55 + }, 56 + onPanResponderTerminate: () => setDrag(null), 57 + }); 58 + 59 + return ( 60 + <View 61 + onLayout={(e: LayoutChangeEvent) => setWidth(e.nativeEvent.layout.width)} 62 + {...responder.panHandlers} 63 + className="h-6 justify-center" 64 + style={style} 65 + > 66 + <View 67 + className="overflow-hidden" 68 + style={{ 69 + height, 70 + backgroundColor: track, 71 + borderRadius: height / 2, 72 + }} 73 + > 74 + <View 75 + className="h-full" 76 + style={{ 77 + width: `${fraction * 100}%`, 78 + backgroundColor: fill, 79 + }} 80 + /> 81 + </View> 82 + {thumb ? ( 83 + <View 84 + pointerEvents="none" 85 + className="absolute w-3 h-3 rounded-full bg-white -ml-1.5" 86 + style={{ 87 + left: `${fraction * 100}%`, 88 + shadowColor: "#000", 89 + shadowOpacity: 0.5, 90 + shadowRadius: 4, 91 + shadowOffset: { width: 0, height: 1 }, 92 + }} 93 + /> 94 + ) : null} 95 + </View> 96 + ); 97 + }
+174
expo/components/track-context-menu.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Image } from "expo-image"; 3 + import { router } from "expo-router"; 4 + import { Modal, Pressable, Text, View } from "react-native"; 5 + 6 + import { Colors } from "@/constants/theme"; 7 + import { ALBUMS, ARTISTS } from "@/lib/mock-data"; 8 + import { usePlayer } from "@/lib/player-context"; 9 + 10 + export function TrackContextMenu() { 11 + const { 12 + contextTrack, 13 + closeContextMenu, 14 + playNext, 15 + playLast, 16 + toggleLike, 17 + liked, 18 + } = usePlayer(); 19 + 20 + const open = contextTrack !== null; 21 + const track = contextTrack; 22 + 23 + if (!track) { 24 + return ( 25 + <Modal 26 + visible={open} 27 + transparent 28 + animationType="fade" 29 + onRequestClose={closeContextMenu} 30 + /> 31 + ); 32 + } 33 + 34 + const isLiked = liked.has(track.id); 35 + const album = ALBUMS.find((a) => a.title === track.album); 36 + const artist = ARTISTS.find((a) => a.name === track.artist); 37 + 38 + const items: { 39 + icon: React.ComponentProps<typeof Ionicons>["name"]; 40 + label: string; 41 + onPress?: () => void; 42 + disabled?: boolean; 43 + destructive?: boolean; 44 + }[] = [ 45 + { 46 + icon: isLiked ? "heart" : "heart-outline", 47 + label: isLiked ? "Remove from Liked" : "Add to Liked", 48 + onPress: () => { 49 + toggleLike(track.id); 50 + closeContextMenu(); 51 + }, 52 + }, 53 + { 54 + icon: "play-skip-forward-outline", 55 + label: "Play Next", 56 + onPress: () => { 57 + playNext(track); 58 + closeContextMenu(); 59 + }, 60 + }, 61 + { 62 + icon: "list-outline", 63 + label: "Play Last", 64 + onPress: () => { 65 + playLast(track); 66 + closeContextMenu(); 67 + }, 68 + }, 69 + { 70 + icon: "add-circle-outline", 71 + label: "Add to Playlist", 72 + onPress: () => { 73 + closeContextMenu(); 74 + }, 75 + }, 76 + { 77 + icon: "person-outline", 78 + label: "Go to Artist", 79 + disabled: !artist, 80 + onPress: () => { 81 + if (!artist) return; 82 + closeContextMenu(); 83 + router.push(`/artist/${artist.id}`); 84 + }, 85 + }, 86 + { 87 + icon: "disc-outline", 88 + label: "Go to Album", 89 + disabled: !album, 90 + onPress: () => { 91 + if (!album) return; 92 + closeContextMenu(); 93 + router.push(`/album/${album.id}`); 94 + }, 95 + }, 96 + { 97 + icon: "share-outline", 98 + label: "Share", 99 + onPress: closeContextMenu, 100 + }, 101 + ]; 102 + 103 + return ( 104 + <Modal 105 + visible={open} 106 + transparent 107 + animationType="slide" 108 + onRequestClose={closeContextMenu} 109 + > 110 + <Pressable 111 + onPress={closeContextMenu} 112 + className="flex-1 bg-black/55" 113 + > 114 + <Pressable 115 + onPress={(e) => e.stopPropagation()} 116 + className="mt-auto bg-bg-elevated rounded-t-2xl pt-2 pb-7" 117 + > 118 + <View className="self-center w-10 h-1 rounded-sm bg-border my-2" /> 119 + <View className="flex-row items-center gap-3 px-4 py-3 border-b border-divider"> 120 + {track.artwork ? ( 121 + <Image 122 + source={track.artwork} 123 + className="w-12 h-12 rounded-md" 124 + contentFit="cover" 125 + /> 126 + ) : ( 127 + <View className="w-12 h-12 rounded-md bg-bg-card items-center justify-center"> 128 + <Ionicons 129 + name="musical-note" 130 + size={20} 131 + color={Colors.textMuted} 132 + /> 133 + </View> 134 + )} 135 + <View className="flex-1"> 136 + <Text 137 + numberOfLines={1} 138 + className="text-text-primary text-[15px] font-bold font-sans" 139 + > 140 + {track.title} 141 + </Text> 142 + <Text 143 + numberOfLines={1} 144 + className="text-text-secondary text-xs mt-0.5 font-sans" 145 + > 146 + {track.artist} 147 + </Text> 148 + </View> 149 + </View> 150 + 151 + {items.map((item) => ( 152 + <Pressable 153 + key={item.label} 154 + onPress={item.disabled ? undefined : item.onPress} 155 + android_ripple={{ color: Colors.bgHover }} 156 + className={`flex-row items-center gap-4 px-5 py-3.5 ${item.disabled ? "opacity-40" : ""}`} 157 + > 158 + <Ionicons 159 + name={item.icon} 160 + size={22} 161 + color={item.destructive ? "#FF6B6B" : Colors.textPrimary} 162 + /> 163 + <Text 164 + className={`text-[15px] font-sans ${item.destructive ? "text-danger" : "text-text-primary"}`} 165 + > 166 + {item.label} 167 + </Text> 168 + </Pressable> 169 + ))} 170 + </Pressable> 171 + </Pressable> 172 + </Modal> 173 + ); 174 + }
+22
expo/components/track-menu-button.tsx
··· 1 + import { Ionicons } from "@expo/vector-icons"; 2 + import { Pressable } from "react-native"; 3 + 4 + import { Colors } from "@/constants/theme"; 5 + import { usePlayer } from "@/lib/player-context"; 6 + import type { Track } from "@/lib/types"; 7 + 8 + export function TrackMenuButton({ track }: { track: Track }) { 9 + const { openContextMenu } = usePlayer(); 10 + return ( 11 + <Pressable 12 + hitSlop={10} 13 + onPress={(e) => { 14 + e.stopPropagation(); 15 + openContextMenu(track); 16 + }} 17 + className="px-1 py-1" 18 + > 19 + <Ionicons name="ellipsis-vertical" size={18} color={Colors.textMuted} /> 20 + </Pressable> 21 + ); 22 + }
+52
expo/constants/theme.ts
··· 1 + /** 2 + * Rockbox theme — single dark palette mirroring gpui/src/ui/theme.rs, 3 + * tuned with a Spotify / Tidal aesthetic and the Rockbox accent purple (#6F00FF). 4 + */ 5 + 6 + export const Colors = { 7 + appBg: "#000000", 8 + bgElevated: "#15171F", 9 + bgCard: "#1A1D26", 10 + bgHover: "#22252F", 11 + bgDock: "#0F1014", 12 + 13 + accent: "#6F00FF", 14 + accentSoft: "#1A0E3D", 15 + accentHover: "rgba(111,0,255,0.9)", 16 + 17 + textPrimary: "#FFFFFF", 18 + textSecondary: "#9898A8", 19 + textMuted: "#9090A3", 20 + 21 + border: "rgba(255,255,255,0.16)", 22 + divider: "rgba(255,255,255,0.10)", 23 + 24 + sliderTrack: "rgba(255,255,255,0.10)", 25 + sliderFill: "#6F00FF", 26 + 27 + iconIdle: "#9090A3", 28 + iconActive: "#6F00FF", 29 + 30 + // Compatibility shape for components that still expect Colors[scheme].x 31 + light: { 32 + text: "#FFFFFF", 33 + background: "#0F1117", 34 + tint: "#6F00FF", 35 + icon: "#9090A3", 36 + tabIconDefault: "#9090A3", 37 + tabIconSelected: "#FFFFFF", 38 + }, 39 + dark: { 40 + text: "#FFFFFF", 41 + background: "#0F1117", 42 + tint: "#6F00FF", 43 + icon: "#9090A3", 44 + tabIconDefault: "#9090A3", 45 + tabIconSelected: "#FFFFFF", 46 + }, 47 + }; 48 + 49 + export const Fonts = { 50 + sans: "SpaceGrotesk", 51 + mono: "JetBrainsMono", 52 + };
+10
expo/eslint.config.js
··· 1 + // https://docs.expo.dev/guides/using-eslint/ 2 + const { defineConfig } = require('eslint/config'); 3 + const expoConfig = require('eslint-config-expo/flat'); 4 + 5 + module.exports = defineConfig([ 6 + expoConfig, 7 + { 8 + ignores: ['dist/*'], 9 + }, 10 + ]);
+3
expo/global.css
··· 1 + @tailwind base; 2 + @tailwind components; 3 + @tailwind utilities;
+241
expo/lib/mock-data.ts
··· 1 + import type { Album, Artist, Playlist, Track } from "./types"; 2 + 3 + const cover = (seed: string, size = 600) => 4 + `https://picsum.photos/seed/${encodeURIComponent(seed)}/${size}/${size}`; 5 + 6 + export const ALBUMS: Album[] = [ 7 + { id: "a1", title: "Neon Tides", artist: "Lumen", year: 2024, artwork: cover("neon-tides"), genre: "g5" }, 8 + { id: "a2", title: "Sapphire", artist: "Aerialist", year: 2023, artwork: cover("sapphire"), genre: "g4" }, 9 + { id: "a3", title: "After Hours", artist: "Midnight Bloom", year: 2022, artwork: cover("after-hours"), genre: "g8" }, 10 + { id: "a4", title: "Velvet Sky", artist: "Halo Drift", year: 2024, artwork: cover("velvet-sky"), genre: "g5" }, 11 + { id: "a5", title: "Polaris", artist: "Northern Lights", year: 2021, artwork: cover("polaris"), genre: "g4" }, 12 + { id: "a6", title: "Crystalline", artist: "Glasswave", year: 2023, artwork: cover("crystalline"), genre: "g5" }, 13 + { id: "a7", title: "Echoes", artist: "Hollow Rooms", year: 2022, artwork: cover("echoes"), genre: "g3" }, 14 + { id: "a8", title: "Solstice", artist: "Ember & Oak", year: 2024, artwork: cover("solstice"), genre: "g4" }, 15 + ]; 16 + 17 + export const ARTISTS: Artist[] = [ 18 + { id: "ar1", name: "Lumen", image: cover("lumen-artist"), followers: "1.2M" }, 19 + { id: "ar2", name: "Aerialist", image: cover("aerialist"), followers: "842K" }, 20 + { id: "ar3", name: "Midnight Bloom", image: cover("midnight-bloom"), followers: "560K" }, 21 + { id: "ar4", name: "Halo Drift", image: cover("halo-drift"), followers: "390K" }, 22 + { id: "ar5", name: "Northern Lights", image: cover("northern-lights"), followers: "1.4M" }, 23 + { id: "ar6", name: "Glasswave", image: cover("glasswave"), followers: "210K" }, 24 + ]; 25 + 26 + export const PLAYLISTS: Playlist[] = [ 27 + { 28 + id: "p1", 29 + name: "Daily Mix 1", 30 + description: "Lumen, Aerialist and more", 31 + artwork: cover("daily-mix-1"), 32 + trackCount: 50, 33 + }, 34 + { 35 + id: "p2", 36 + name: "Chill Late Night", 37 + description: "Wind down with mellow grooves", 38 + artwork: cover("chill-late-night"), 39 + trackCount: 42, 40 + }, 41 + { 42 + id: "p3", 43 + name: "Synthwave Drive", 44 + description: "Sunset cruising soundtrack", 45 + artwork: cover("synthwave-drive"), 46 + trackCount: 78, 47 + }, 48 + { 49 + id: "p4", 50 + name: "Focus Flow", 51 + description: "Uninterrupted instrumental focus", 52 + artwork: cover("focus-flow"), 53 + trackCount: 65, 54 + }, 55 + { 56 + id: "p5", 57 + name: "Indie Mornings", 58 + description: "Fresh starts and hot coffee", 59 + artwork: cover("indie-mornings"), 60 + trackCount: 38, 61 + }, 62 + { 63 + id: "p6", 64 + name: "Discover Weekly", 65 + description: "Your weekly mixtape", 66 + artwork: cover("discover-weekly"), 67 + trackCount: 30, 68 + }, 69 + ]; 70 + 71 + export const QUEUE: Track[] = [ 72 + { id: "t1", title: "Glass Cathedral", artist: "Lumen", album: "Neon Tides", duration: 224, artwork: cover("neon-tides") }, 73 + { id: "t2", title: "Aurora", artist: "Lumen", album: "Neon Tides", duration: 198, artwork: cover("neon-tides") }, 74 + { id: "t3", title: "Slow Burn", artist: "Aerialist", album: "Sapphire", duration: 245, artwork: cover("sapphire") }, 75 + { id: "t4", title: "Cobalt", artist: "Aerialist", album: "Sapphire", duration: 211, artwork: cover("sapphire") }, 76 + { id: "t5", title: "Silver Lining", artist: "Midnight Bloom", album: "After Hours", duration: 268, artwork: cover("after-hours") }, 77 + { id: "t6", title: "Drift", artist: "Halo Drift", album: "Velvet Sky", duration: 232, artwork: cover("velvet-sky") }, 78 + { id: "t7", title: "Stargazer", artist: "Northern Lights", album: "Polaris", duration: 312, artwork: cover("polaris") }, 79 + { id: "t8", title: "Refractions", artist: "Glasswave", album: "Crystalline", duration: 199, artwork: cover("crystalline") }, 80 + { id: "t9", title: "Hollow", artist: "Hollow Rooms", album: "Echoes", duration: 254, artwork: cover("echoes") }, 81 + { id: "t10", title: "Last Light", artist: "Ember & Oak", album: "Solstice", duration: 287, artwork: cover("solstice") }, 82 + { id: "t11", title: "Underneath", artist: "Lumen", album: "Neon Tides", duration: 201, artwork: cover("neon-tides") }, 83 + { id: "t12", title: "Indigo", artist: "Aerialist", album: "Sapphire", duration: 240, artwork: cover("sapphire") }, 84 + ]; 85 + 86 + export const ALL_SONGS: Track[] = QUEUE; 87 + 88 + const EXTRA_ALBUM_TRACK_TITLES: Record<string, string[]> = { 89 + a1: ["Tideline", "Phosphor", "Reverie", "Lighthouse"], 90 + a2: ["Marine Bloom", "Moonstone", "Distant Call", "Quiet Waves"], 91 + a3: ["Kerosene", "Postcards", "Embers", "Glass House"], 92 + a4: ["Cloudbank", "Sundown", "Pale Blue", "Soft Static"], 93 + a5: ["North", "Compass", "Solar Wind", "Ice Bloom"], 94 + a6: ["Prism", "Mosaic", "Quartz", "Lattice"], 95 + a7: ["Hollow", "Brick & Mortar", "Smoke", "Walls"], 96 + a8: ["First Frost", "Bonfire", "Long Night", "Daybreak"], 97 + }; 98 + 99 + const ALBUM_TRACKS: Record<string, Track[]> = {}; 100 + 101 + for (const album of ALBUMS) { 102 + const baseTracks = ALL_SONGS.filter((t) => t.album === album.title); 103 + const extras = (EXTRA_ALBUM_TRACK_TITLES[album.id] ?? []).map( 104 + (title, i): Track => ({ 105 + id: `${album.id}-x${i}`, 106 + title, 107 + artist: album.artist, 108 + album: album.title, 109 + duration: 180 + ((i * 47 + album.id.charCodeAt(1)) % 140), 110 + artwork: album.artwork, 111 + }), 112 + ); 113 + ALBUM_TRACKS[album.id] = [...baseTracks, ...extras]; 114 + } 115 + 116 + export function getAlbumById(id: string): Album | undefined { 117 + return ALBUMS.find((a) => a.id === id); 118 + } 119 + 120 + export function getAlbumTracks(id: string): Track[] { 121 + return ALBUM_TRACKS[id] ?? []; 122 + } 123 + 124 + export function getArtistById(id: string): Artist | undefined { 125 + return ARTISTS.find((a) => a.id === id); 126 + } 127 + 128 + export function getArtistAlbums(artistId: string): Album[] { 129 + const artist = getArtistById(artistId); 130 + if (!artist) return []; 131 + return ALBUMS.filter((a) => a.artist === artist.name); 132 + } 133 + 134 + export function getArtistTracks(artistId: string): Track[] { 135 + const artist = getArtistById(artistId); 136 + if (!artist) return []; 137 + const out: Track[] = []; 138 + for (const album of getArtistAlbums(artistId)) { 139 + out.push(...getAlbumTracks(album.id)); 140 + } 141 + return out; 142 + } 143 + 144 + const ALL_TRACKS_POOL: Track[] = (() => { 145 + const seen = new Set<string>(); 146 + const out: Track[] = []; 147 + for (const t of ALL_SONGS) { 148 + if (!seen.has(t.id)) { 149 + seen.add(t.id); 150 + out.push(t); 151 + } 152 + } 153 + for (const album of ALBUMS) { 154 + for (const t of getAlbumTracks(album.id)) { 155 + if (!seen.has(t.id)) { 156 + seen.add(t.id); 157 + out.push(t); 158 + } 159 + } 160 + } 161 + return out; 162 + })(); 163 + 164 + const PLAYLIST_TRACKS: Record<string, Track[]> = {}; 165 + 166 + for (const playlist of PLAYLISTS) { 167 + const seed = playlist.id 168 + .split("") 169 + .reduce((acc, ch) => (acc * 31 + ch.charCodeAt(0)) >>> 0, 7); 170 + const count = Math.min( 171 + ALL_TRACKS_POOL.length, 172 + Math.max(8, Math.min(playlist.trackCount, 14)), 173 + ); 174 + const ordered = [...ALL_TRACKS_POOL]; 175 + // Deterministic Fisher–Yates with the playlist seed 176 + let s = seed; 177 + const next = () => (s = (s * 1664525 + 1013904223) >>> 0); 178 + for (let i = ordered.length - 1; i > 0; i--) { 179 + const j = next() % (i + 1); 180 + [ordered[i], ordered[j]] = [ordered[j], ordered[i]]; 181 + } 182 + PLAYLIST_TRACKS[playlist.id] = ordered.slice(0, count); 183 + } 184 + 185 + export function getPlaylistById(id: string): Playlist | undefined { 186 + return PLAYLISTS.find((p) => p.id === id); 187 + } 188 + 189 + export function getPlaylistTracks(id: string): Track[] { 190 + return PLAYLIST_TRACKS[id] ?? []; 191 + } 192 + 193 + export function getGenreById(id: string) { 194 + return GENRES.find((g) => g.id === id); 195 + } 196 + 197 + export function getGenreAlbums(id: string): Album[] { 198 + return ALBUMS.filter((a) => a.genre === id); 199 + } 200 + 201 + export function getGenreArtists(id: string): Artist[] { 202 + const albums = getGenreAlbums(id); 203 + const names = new Set(albums.map((a) => a.artist)); 204 + return ARTISTS.filter((a) => names.has(a.name)); 205 + } 206 + 207 + export function getGenreTracks(id: string): Track[] { 208 + const albums = getGenreAlbums(id); 209 + const out: Track[] = []; 210 + for (const album of albums) { 211 + out.push(...getAlbumTracks(album.id)); 212 + } 213 + return out; 214 + } 215 + 216 + export const LIKED_TRACK_IDS = new Set(["t1", "t3", "t6", "t9"]); 217 + 218 + export const RECENTLY_PLAYED: Album[] = ALBUMS.slice(0, 6); 219 + export const MADE_FOR_YOU: Playlist[] = PLAYLISTS; 220 + export const TOP_ARTISTS: Artist[] = ARTISTS; 221 + 222 + export const GENRES = [ 223 + { id: "g1", name: "Pop", color: "#E13300" }, 224 + { id: "g2", name: "Hip-Hop", color: "#1E3264" }, 225 + { id: "g3", name: "Rock", color: "#8400E7" }, 226 + { id: "g4", name: "Indie", color: "#27856A" }, 227 + { id: "g5", name: "Electronic", color: "#1192AA" }, 228 + { id: "g6", name: "Jazz", color: "#A56752" }, 229 + { id: "g7", name: "Classical", color: "#477D95" }, 230 + { id: "g8", name: "R&B", color: "#DC148C" }, 231 + { id: "g9", name: "Country", color: "#777777" }, 232 + { id: "g10", name: "Latin", color: "#E91429" }, 233 + ]; 234 + 235 + export function formatDuration(secs: number): string { 236 + const m = Math.floor(secs / 60); 237 + const s = Math.floor(secs % 60) 238 + .toString() 239 + .padStart(2, "0"); 240 + return `${m}:${s}`; 241 + }
+10
expo/lib/nativewind-setup.ts
··· 1 + import { BlurView } from "expo-blur"; 2 + import { Image } from "expo-image"; 3 + import { LinearGradient } from "expo-linear-gradient"; 4 + import { cssInterop } from "nativewind"; 5 + import { SafeAreaView } from "react-native-safe-area-context"; 6 + 7 + cssInterop(Image, { className: "style" }); 8 + cssInterop(BlurView, { className: "style" }); 9 + cssInterop(LinearGradient, { className: "style" }); 10 + cssInterop(SafeAreaView, { className: "style" });
+337
expo/lib/player-context.tsx
··· 1 + import React, { 2 + createContext, 3 + useCallback, 4 + useContext, 5 + useEffect, 6 + useMemo, 7 + useRef, 8 + useState, 9 + } from "react"; 10 + import { LIKED_TRACK_IDS, QUEUE } from "./mock-data"; 11 + import type { Playlist, RepeatMode, Track } from "./types"; 12 + 13 + type PlayerState = { 14 + queue: Track[]; 15 + currentIdx: number; 16 + position: number; 17 + isPlaying: boolean; 18 + shuffle: boolean; 19 + repeat: RepeatMode; 20 + volume: number; 21 + liked: Set<string>; 22 + currentTrack: Track | undefined; 23 + }; 24 + 25 + type UserPlaylistInput = { 26 + name: string; 27 + description?: string; 28 + isSmart?: boolean; 29 + rules?: string; 30 + }; 31 + 32 + type PlayerActions = { 33 + play: () => void; 34 + pause: () => void; 35 + toggle: () => void; 36 + next: () => void; 37 + prev: () => void; 38 + seek: (secs: number) => void; 39 + setVolume: (vol: number) => void; 40 + toggleShuffle: () => void; 41 + cycleRepeat: () => void; 42 + toggleLike: (trackId: string) => void; 43 + jumpTo: (idx: number) => void; 44 + removeFromQueue: (idx: number) => void; 45 + playTrack: (track: Track) => void; 46 + playQueue: ( 47 + tracks: Track[], 48 + opts?: { startIdx?: number; shuffle?: boolean }, 49 + ) => void; 50 + playNext: (track: Track) => void; 51 + playLast: (track: Track) => void; 52 + openContextMenu: (track: Track) => void; 53 + closeContextMenu: () => void; 54 + createPlaylist: (input: UserPlaylistInput) => Playlist; 55 + }; 56 + 57 + type ContextState = { 58 + contextTrack: Track | null; 59 + userPlaylists: Playlist[]; 60 + }; 61 + 62 + type PlayerContextValue = PlayerState & ContextState & PlayerActions; 63 + 64 + const PlayerContext = createContext<PlayerContextValue | null>(null); 65 + 66 + export function PlayerProvider({ children }: { children: React.ReactNode }) { 67 + const [queue, setQueue] = useState<Track[]>(QUEUE); 68 + const [currentIdx, setCurrentIdx] = useState(0); 69 + const [position, setPosition] = useState(0); 70 + const [isPlaying, setIsPlaying] = useState(false); 71 + const [shuffle, setShuffle] = useState(false); 72 + const [repeat, setRepeat] = useState<RepeatMode>("off"); 73 + const [volume, setVolume] = useState(0.75); 74 + const [liked, setLiked] = useState<Set<string>>(new Set(LIKED_TRACK_IDS)); 75 + const [contextTrack, setContextTrack] = useState<Track | null>(null); 76 + const [userPlaylists, setUserPlaylists] = useState<Playlist[]>([]); 77 + 78 + const tickRef = useRef<ReturnType<typeof setInterval> | null>(null); 79 + const currentTrack = queue[currentIdx]; 80 + 81 + // Tick position once per second while playing. 82 + useEffect(() => { 83 + if (tickRef.current) { 84 + clearInterval(tickRef.current); 85 + tickRef.current = null; 86 + } 87 + if (isPlaying && currentTrack) { 88 + tickRef.current = setInterval(() => { 89 + setPosition((p) => { 90 + if (p + 1 >= currentTrack.duration) { 91 + // auto-advance 92 + setTimeout(() => { 93 + setCurrentIdx((idx) => { 94 + if (repeat === "one") return idx; 95 + if (idx + 1 < queue.length) return idx + 1; 96 + if (repeat === "all") return 0; 97 + return idx; 98 + }); 99 + setPosition(0); 100 + if (repeat === "off" && currentIdx + 1 >= queue.length) { 101 + setIsPlaying(false); 102 + } 103 + }, 0); 104 + return 0; 105 + } 106 + return p + 1; 107 + }); 108 + }, 1000); 109 + } 110 + return () => { 111 + if (tickRef.current) { 112 + clearInterval(tickRef.current); 113 + tickRef.current = null; 114 + } 115 + }; 116 + }, [isPlaying, currentTrack, queue.length, repeat, currentIdx]); 117 + 118 + const play = useCallback(() => setIsPlaying(true), []); 119 + const pause = useCallback(() => setIsPlaying(false), []); 120 + const toggle = useCallback(() => setIsPlaying((p) => !p), []); 121 + 122 + const next = useCallback(() => { 123 + setCurrentIdx((idx) => (idx + 1 < queue.length ? idx + 1 : repeat === "all" ? 0 : idx)); 124 + setPosition(0); 125 + }, [queue.length, repeat]); 126 + 127 + const prev = useCallback(() => { 128 + setPosition((p) => { 129 + if (p > 3) return 0; 130 + setCurrentIdx((idx) => Math.max(0, idx - 1)); 131 + return 0; 132 + }); 133 + }, []); 134 + 135 + const seek = useCallback((secs: number) => setPosition(Math.max(0, secs)), []); 136 + 137 + const toggleShuffle = useCallback(() => setShuffle((s) => !s), []); 138 + 139 + const cycleRepeat = useCallback( 140 + () => 141 + setRepeat((r) => (r === "off" ? "all" : r === "all" ? "one" : "off")), 142 + [], 143 + ); 144 + 145 + const toggleLike = useCallback( 146 + (trackId: string) => 147 + setLiked((s) => { 148 + const next = new Set(s); 149 + if (next.has(trackId)) next.delete(trackId); 150 + else next.add(trackId); 151 + return next; 152 + }), 153 + [], 154 + ); 155 + 156 + const jumpTo = useCallback((idx: number) => { 157 + setCurrentIdx(idx); 158 + setPosition(0); 159 + setIsPlaying(true); 160 + }, []); 161 + 162 + const removeFromQueue = useCallback( 163 + (idx: number) => 164 + setQueue((q) => { 165 + const next = q.filter((_, i) => i !== idx); 166 + if (idx < currentIdx) setCurrentIdx((c) => c - 1); 167 + else if (idx === currentIdx) { 168 + setPosition(0); 169 + if (idx >= next.length) setCurrentIdx(Math.max(0, next.length - 1)); 170 + } 171 + return next; 172 + }), 173 + [currentIdx], 174 + ); 175 + 176 + const playTrack = useCallback( 177 + (track: Track) => 178 + setQueue((q) => { 179 + const existing = q.findIndex((t) => t.id === track.id); 180 + if (existing >= 0) { 181 + setCurrentIdx(existing); 182 + setPosition(0); 183 + setIsPlaying(true); 184 + return q; 185 + } 186 + const next = [...q, track]; 187 + setCurrentIdx(next.length - 1); 188 + setPosition(0); 189 + setIsPlaying(true); 190 + return next; 191 + }), 192 + [], 193 + ); 194 + 195 + const playNext = useCallback( 196 + (track: Track) => 197 + setQueue((q) => { 198 + const stripped = q.filter((t) => t.id !== track.id); 199 + const insertIdx = currentIdx + 1; 200 + const next = [ 201 + ...stripped.slice(0, insertIdx), 202 + track, 203 + ...stripped.slice(insertIdx), 204 + ]; 205 + return next; 206 + }), 207 + [currentIdx], 208 + ); 209 + 210 + const playLast = useCallback( 211 + (track: Track) => 212 + setQueue((q) => { 213 + if (q.find((t) => t.id === track.id)) return q; 214 + return [...q, track]; 215 + }), 216 + [], 217 + ); 218 + 219 + const openContextMenu = useCallback( 220 + (track: Track) => setContextTrack(track), 221 + [], 222 + ); 223 + const closeContextMenu = useCallback(() => setContextTrack(null), []); 224 + 225 + const createPlaylist = useCallback((input: UserPlaylistInput) => { 226 + const id = `user-${Date.now().toString(36)}-${Math.floor(Math.random() * 1e6).toString(36)}`; 227 + const seed = encodeURIComponent(input.name || id); 228 + const playlist: Playlist = { 229 + id, 230 + name: input.name.trim() || "New Playlist", 231 + description: input.description?.trim() || undefined, 232 + isSmart: input.isSmart === true, 233 + rules: input.rules?.trim() || undefined, 234 + trackCount: 0, 235 + artwork: `https://picsum.photos/seed/${seed}/600/600`, 236 + }; 237 + setUserPlaylists((list) => [playlist, ...list]); 238 + return playlist; 239 + }, []); 240 + 241 + const playQueue = useCallback( 242 + (tracks: Track[], opts?: { startIdx?: number; shuffle?: boolean }) => { 243 + if (tracks.length === 0) return; 244 + let nextQueue = tracks; 245 + let startIdx = opts?.startIdx ?? 0; 246 + if (opts?.shuffle) { 247 + const shuffled = [...tracks]; 248 + for (let i = shuffled.length - 1; i > 0; i--) { 249 + const j = Math.floor(Math.random() * (i + 1)); 250 + [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; 251 + } 252 + nextQueue = shuffled; 253 + startIdx = 0; 254 + setShuffle(true); 255 + } 256 + setQueue(nextQueue); 257 + setCurrentIdx(Math.max(0, Math.min(startIdx, nextQueue.length - 1))); 258 + setPosition(0); 259 + setIsPlaying(true); 260 + }, 261 + [], 262 + ); 263 + 264 + const value = useMemo<PlayerContextValue>( 265 + () => ({ 266 + queue, 267 + currentIdx, 268 + position, 269 + isPlaying, 270 + shuffle, 271 + repeat, 272 + volume, 273 + liked, 274 + currentTrack, 275 + play, 276 + pause, 277 + toggle, 278 + next, 279 + prev, 280 + seek, 281 + setVolume, 282 + toggleShuffle, 283 + cycleRepeat, 284 + toggleLike, 285 + jumpTo, 286 + removeFromQueue, 287 + playTrack, 288 + playQueue, 289 + playNext, 290 + playLast, 291 + contextTrack, 292 + openContextMenu, 293 + closeContextMenu, 294 + userPlaylists, 295 + createPlaylist, 296 + }), 297 + [ 298 + queue, 299 + currentIdx, 300 + position, 301 + isPlaying, 302 + shuffle, 303 + repeat, 304 + volume, 305 + liked, 306 + currentTrack, 307 + play, 308 + pause, 309 + toggle, 310 + next, 311 + prev, 312 + seek, 313 + toggleShuffle, 314 + cycleRepeat, 315 + toggleLike, 316 + jumpTo, 317 + removeFromQueue, 318 + playTrack, 319 + playQueue, 320 + playNext, 321 + playLast, 322 + contextTrack, 323 + openContextMenu, 324 + closeContextMenu, 325 + userPlaylists, 326 + createPlaylist, 327 + ], 328 + ); 329 + 330 + return <PlayerContext.Provider value={value}>{children}</PlayerContext.Provider>; 331 + } 332 + 333 + export function usePlayer(): PlayerContextValue { 334 + const ctx = useContext(PlayerContext); 335 + if (!ctx) throw new Error("usePlayer must be used within PlayerProvider"); 336 + return ctx; 337 + }
+50
expo/lib/types.ts
··· 1 + export type Track = { 2 + id: string; 3 + title: string; 4 + artist: string; 5 + album: string; 6 + duration: number; 7 + artwork?: string; 8 + liked?: boolean; 9 + }; 10 + 11 + export type Album = { 12 + id: string; 13 + title: string; 14 + artist: string; 15 + artwork: string; 16 + year?: number; 17 + genre?: string; 18 + }; 19 + 20 + export type Genre = { 21 + id: string; 22 + name: string; 23 + color: string; 24 + }; 25 + 26 + export type Artist = { 27 + id: string; 28 + name: string; 29 + image: string; 30 + followers?: string; 31 + }; 32 + 33 + export type Playlist = { 34 + id: string; 35 + name: string; 36 + description?: string; 37 + artwork: string; 38 + trackCount: number; 39 + isSmart?: boolean; 40 + rules?: string; 41 + }; 42 + 43 + export type LibrarySection = 44 + | "songs" 45 + | "albums" 46 + | "artists" 47 + | "playlists" 48 + | "liked"; 49 + 50 + export type RepeatMode = "off" | "all" | "one";
+6
expo/metro.config.js
··· 1 + const { getDefaultConfig } = require("expo/metro-config"); 2 + const { withNativeWind } = require("nativewind/metro"); 3 + 4 + const config = getDefaultConfig(__dirname); 5 + 6 + module.exports = withNativeWind(config, { input: "./global.css" });
+2
expo/mise.toml
··· 1 + [tools] 2 + java = "temurin-17"
+1
expo/nativewind-env.d.ts
··· 1 + /// <reference types="nativewind/types" />
+54
expo/package.json
··· 1 + { 2 + "name": "rockbox", 3 + "main": "expo-router/entry", 4 + "version": "1.0.0", 5 + "scripts": { 6 + "start": "expo start", 7 + "reset-project": "node ./scripts/reset-project.js", 8 + "android": "expo run:android", 9 + "ios": "expo run:ios", 10 + "web": "expo start --web", 11 + "lint": "expo lint", 12 + "run:android": "expo run:android" 13 + }, 14 + "dependencies": { 15 + "@expo/vector-icons": "^15.0.3", 16 + "@react-navigation/bottom-tabs": "^7.4.0", 17 + "@react-navigation/elements": "^2.6.3", 18 + "@react-navigation/native": "^7.1.8", 19 + "expo": "~54.0.33", 20 + "expo-blur": "^55.0.14", 21 + "expo-constants": "~18.0.13", 22 + "expo-font": "~14.0.11", 23 + "expo-haptics": "~15.0.8", 24 + "expo-image": "~3.0.11", 25 + "expo-linear-gradient": "^55.0.13", 26 + "expo-linking": "~8.0.11", 27 + "expo-router": "~6.0.23", 28 + "expo-splash-screen": "~31.0.13", 29 + "expo-status-bar": "~3.0.9", 30 + "expo-symbols": "~1.0.8", 31 + "expo-system-ui": "~6.0.9", 32 + "expo-web-browser": "~15.0.10", 33 + "nativewind": "^4.2.3", 34 + "react": "19.1.0", 35 + "react-dom": "19.1.0", 36 + "react-native": "0.81.5", 37 + "react-native-gesture-handler": "~2.28.0", 38 + "react-native-reanimated": "~4.1.1", 39 + "react-native-safe-area-context": "~5.6.0", 40 + "react-native-screens": "~4.16.0", 41 + "react-native-web": "~0.21.0", 42 + "react-native-worklets": "0.5.1" 43 + }, 44 + "devDependencies": { 45 + "@types/react": "~19.1.0", 46 + "babel-preset-expo": "~54.0.10", 47 + "eslint": "^9.25.0", 48 + "eslint-config-expo": "~10.0.0", 49 + "prettier-plugin-tailwindcss": "^0.5.11", 50 + "tailwindcss": "^3.4.17", 51 + "typescript": "~5.9.2" 52 + }, 53 + "private": true 54 + }
+112
expo/scripts/reset-project.js
··· 1 + #!/usr/bin/env node 2 + 3 + /** 4 + * This script is used to reset the project to a blank state. 5 + * It deletes or moves the /app, /components, /hooks, /scripts, and /constants directories to /app-example based on user input and creates a new /app directory with an index.tsx and _layout.tsx file. 6 + * You can remove the `reset-project` script from package.json and safely delete this file after running it. 7 + */ 8 + 9 + const fs = require("fs"); 10 + const path = require("path"); 11 + const readline = require("readline"); 12 + 13 + const root = process.cwd(); 14 + const oldDirs = ["app", "components", "hooks", "constants", "scripts"]; 15 + const exampleDir = "app-example"; 16 + const newAppDir = "app"; 17 + const exampleDirPath = path.join(root, exampleDir); 18 + 19 + const indexContent = `import { Text, View } from "react-native"; 20 + 21 + export default function Index() { 22 + return ( 23 + <View 24 + style={{ 25 + flex: 1, 26 + justifyContent: "center", 27 + alignItems: "center", 28 + }} 29 + > 30 + <Text>Edit app/index.tsx to edit this screen.</Text> 31 + </View> 32 + ); 33 + } 34 + `; 35 + 36 + const layoutContent = `import { Stack } from "expo-router"; 37 + 38 + export default function RootLayout() { 39 + return <Stack />; 40 + } 41 + `; 42 + 43 + const rl = readline.createInterface({ 44 + input: process.stdin, 45 + output: process.stdout, 46 + }); 47 + 48 + const moveDirectories = async (userInput) => { 49 + try { 50 + if (userInput === "y") { 51 + // Create the app-example directory 52 + await fs.promises.mkdir(exampleDirPath, { recursive: true }); 53 + console.log(`📁 /${exampleDir} directory created.`); 54 + } 55 + 56 + // Move old directories to new app-example directory or delete them 57 + for (const dir of oldDirs) { 58 + const oldDirPath = path.join(root, dir); 59 + if (fs.existsSync(oldDirPath)) { 60 + if (userInput === "y") { 61 + const newDirPath = path.join(root, exampleDir, dir); 62 + await fs.promises.rename(oldDirPath, newDirPath); 63 + console.log(`➡️ /${dir} moved to /${exampleDir}/${dir}.`); 64 + } else { 65 + await fs.promises.rm(oldDirPath, { recursive: true, force: true }); 66 + console.log(`❌ /${dir} deleted.`); 67 + } 68 + } else { 69 + console.log(`➡️ /${dir} does not exist, skipping.`); 70 + } 71 + } 72 + 73 + // Create new /app directory 74 + const newAppDirPath = path.join(root, newAppDir); 75 + await fs.promises.mkdir(newAppDirPath, { recursive: true }); 76 + console.log("\n📁 New /app directory created."); 77 + 78 + // Create index.tsx 79 + const indexPath = path.join(newAppDirPath, "index.tsx"); 80 + await fs.promises.writeFile(indexPath, indexContent); 81 + console.log("📄 app/index.tsx created."); 82 + 83 + // Create _layout.tsx 84 + const layoutPath = path.join(newAppDirPath, "_layout.tsx"); 85 + await fs.promises.writeFile(layoutPath, layoutContent); 86 + console.log("📄 app/_layout.tsx created."); 87 + 88 + console.log("\n✅ Project reset complete. Next steps:"); 89 + console.log( 90 + `1. Run \`npx expo start\` to start a development server.\n2. Edit app/index.tsx to edit the main screen.${ 91 + userInput === "y" 92 + ? `\n3. Delete the /${exampleDir} directory when you're done referencing it.` 93 + : "" 94 + }` 95 + ); 96 + } catch (error) { 97 + console.error(`❌ Error during script execution: ${error.message}`); 98 + } 99 + }; 100 + 101 + rl.question( 102 + "Do you want to move existing files to /app-example instead of deleting them? (Y/n): ", 103 + (answer) => { 104 + const userInput = answer.trim().toLowerCase() || "y"; 105 + if (userInput === "y" || userInput === "n") { 106 + moveDirectories(userInput).finally(() => rl.close()); 107 + } else { 108 + console.log("❌ Invalid input. Please enter 'Y' or 'N'."); 109 + rl.close(); 110 + } 111 + } 112 + );
+44
expo/tailwind.config.js
··· 1 + /** @type {import('tailwindcss').Config} */ 2 + module.exports = { 3 + content: [ 4 + "./app/**/*.{js,jsx,ts,tsx}", 5 + "./components/**/*.{js,jsx,ts,tsx}", 6 + ], 7 + presets: [require("nativewind/preset")], 8 + theme: { 9 + extend: { 10 + colors: { 11 + // Rockbox dark palette — keep in sync with constants/theme.ts 12 + bg: { 13 + DEFAULT: "#000000", 14 + elevated: "#15171F", 15 + card: "#1A1D26", 16 + hover: "#22252F", 17 + dock: "#0F1014", 18 + }, 19 + accent: { 20 + DEFAULT: "#6F00FF", 21 + soft: "#1A0E3D", 22 + hover: "rgba(111,0,255,0.9)", 23 + }, 24 + text: { 25 + primary: "#FFFFFF", 26 + secondary: "#9898A8", 27 + muted: "#9090A3", 28 + }, 29 + divider: "rgba(255,255,255,0.10)", 30 + border: "rgba(255,255,255,0.16)", 31 + slider: { 32 + track: "rgba(255,255,255,0.10)", 33 + fill: "#6F00FF", 34 + }, 35 + danger: "#FF6B6B", 36 + }, 37 + fontFamily: { 38 + sans: ["SpaceGrotesk"], 39 + mono: ["JetBrainsMono"], 40 + }, 41 + }, 42 + }, 43 + plugins: [], 44 + };
+18
expo/tsconfig.json
··· 1 + { 2 + "extends": "expo/tsconfig.base", 3 + "compilerOptions": { 4 + "strict": true, 5 + "paths": { 6 + "@/*": [ 7 + "./*" 8 + ] 9 + } 10 + }, 11 + "include": [ 12 + "**/*.ts", 13 + "**/*.tsx", 14 + ".expo/types/**/*.ts", 15 + "expo-env.d.ts", 16 + "nativewind-env.d.ts" 17 + ] 18 + }