@pol-studios/db 1.0.54 → 1.0.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/{DataLayerContext-C7cJtiO8.d.ts → DataLayerContext-BYZtDD0g.d.ts} +1 -1
  2. package/dist/auth/context.js +6 -4
  3. package/dist/auth/hooks.js +7 -5
  4. package/dist/auth/index.js +7 -5
  5. package/dist/{chunk-FIAXWEBK.js → chunk-4EO55YV2.js} +10 -7
  6. package/dist/chunk-4EO55YV2.js.map +1 -0
  7. package/dist/{chunk-DP3YEVSX.js → chunk-6SDH7M7J.js} +26 -10
  8. package/dist/chunk-6SDH7M7J.js.map +1 -0
  9. package/dist/{chunk-UJWETW36.js → chunk-AKIRHA4Q.js} +527 -418
  10. package/dist/chunk-AKIRHA4Q.js.map +1 -0
  11. package/dist/{chunk-2XS2PM62.js → chunk-DDL63KLQ.js} +388 -107
  12. package/dist/chunk-DDL63KLQ.js.map +1 -0
  13. package/dist/{chunk-YA6MUTA7.js → chunk-FI6JAD5G.js} +3 -3
  14. package/dist/{chunk-WQLIGVQR.js → chunk-GWYTROSD.js} +98 -1
  15. package/dist/chunk-GWYTROSD.js.map +1 -0
  16. package/dist/chunk-JOULSXOI.js +415 -0
  17. package/dist/chunk-JOULSXOI.js.map +1 -0
  18. package/dist/{chunk-OKYHI6JG.js → chunk-LF3V3ERS.js} +3 -3
  19. package/dist/{chunk-FMYXG4VN.js → chunk-MEBT5YHA.js} +2 -2
  20. package/dist/{chunk-BZSAPFFB.js → chunk-N4KK5G5T.js} +116 -18
  21. package/dist/chunk-N4KK5G5T.js.map +1 -0
  22. package/dist/chunk-QYAFI34Q.js +64 -0
  23. package/dist/chunk-QYAFI34Q.js.map +1 -0
  24. package/dist/{chunk-3Q74DK5K.js → chunk-VYFAMTHI.js} +2 -2
  25. package/dist/chunk-W7PERM66.js +215 -0
  26. package/dist/chunk-W7PERM66.js.map +1 -0
  27. package/dist/{chunk-ZGQ7Q4ZU.js → chunk-WM25QE7E.js} +2 -2
  28. package/dist/{chunk-HZIVE5AZ.js → chunk-YRIPM2AN.js} +253 -338
  29. package/dist/chunk-YRIPM2AN.js.map +1 -0
  30. package/dist/chunk-YUX6RGLZ.js +1858 -0
  31. package/dist/chunk-YUX6RGLZ.js.map +1 -0
  32. package/dist/{chunk-Z3EJX3VG.js → chunk-Z456IHCB.js} +3 -3
  33. package/dist/core/index.d.ts +24 -1
  34. package/dist/{executor-YJw4m7Q7.d.ts → executor-D15yjeMo.d.ts} +20 -0
  35. package/dist/hooks/index.d.ts +3 -3
  36. package/dist/hooks/index.js +4 -2
  37. package/dist/{index-jVYdTeWx.d.ts → index-CFUuTzXO.d.ts} +1 -1
  38. package/dist/index.d.ts +5 -5
  39. package/dist/index.js +16 -14
  40. package/dist/index.native.d.ts +62 -8
  41. package/dist/index.native.js +16 -14
  42. package/dist/index.web.d.ts +10 -9
  43. package/dist/index.web.js +30 -19
  44. package/dist/index.web.js.map +1 -1
  45. package/dist/mutation/index.js +3 -3
  46. package/dist/parser/index.js +3 -3
  47. package/dist/powersync-bridge/index.d.ts +1 -1
  48. package/dist/query/index.d.ts +4 -83
  49. package/dist/query/index.js +17 -7
  50. package/dist/realtime/index.d.ts +80 -1
  51. package/dist/realtime/index.js +14 -12
  52. package/dist/realtime/index.js.map +1 -1
  53. package/dist/select-parser-BAV7fOaM.d.ts +144 -0
  54. package/dist/types/index.d.ts +3 -3
  55. package/dist/types/index.js +4 -4
  56. package/dist/{useDbCount-DHLJzmkO.d.ts → useDbCount-Ckb-FhZk.d.ts} +1 -1
  57. package/dist/{useResolveFeedback-B0UcYWVI.d.ts → useResolveFeedback-CuUkdHoR.d.ts} +13 -29
  58. package/dist/with-auth/index.js +9 -7
  59. package/dist/with-auth/index.js.map +1 -1
  60. package/package.json +9 -4
  61. package/dist/chunk-2XS2PM62.js.map +0 -1
  62. package/dist/chunk-BZSAPFFB.js.map +0 -1
  63. package/dist/chunk-CTRY7JDP.js +0 -4112
  64. package/dist/chunk-CTRY7JDP.js.map +0 -1
  65. package/dist/chunk-DP3YEVSX.js.map +0 -1
  66. package/dist/chunk-FIAXWEBK.js.map +0 -1
  67. package/dist/chunk-HZIVE5AZ.js.map +0 -1
  68. package/dist/chunk-INEUG6MC.js +0 -521
  69. package/dist/chunk-INEUG6MC.js.map +0 -1
  70. package/dist/chunk-UJWETW36.js.map +0 -1
  71. package/dist/chunk-WQLIGVQR.js.map +0 -1
  72. /package/dist/{chunk-YA6MUTA7.js.map → chunk-FI6JAD5G.js.map} +0 -0
  73. /package/dist/{chunk-OKYHI6JG.js.map → chunk-LF3V3ERS.js.map} +0 -0
  74. /package/dist/{chunk-FMYXG4VN.js.map → chunk-MEBT5YHA.js.map} +0 -0
  75. /package/dist/{chunk-3Q74DK5K.js.map → chunk-VYFAMTHI.js.map} +0 -0
  76. /package/dist/{chunk-ZGQ7Q4ZU.js.map → chunk-WM25QE7E.js.map} +0 -0
  77. /package/dist/{chunk-Z3EJX3VG.js.map → chunk-Z456IHCB.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/errors/TimeoutError.ts","../src/useDbQuery.ts","../src/auth/context/setupAuthContext.tsx","../src/auth/context/AuthProvider.tsx","../src/auth/context/PermissionContext.tsx","../src/auth/context/UserMetadataContext.tsx","../src/useDbUpsert.ts"],"sourcesContent":["export const TIMEOUT_ERROR_MESSAGE = \"Request timed out\";\nexport const DEFAULT_QUERY_TIMEOUT = 15_000; // 15 seconds\n\nexport function isTimeoutError(error: Error | null | undefined): boolean {\n if (!error) return false;\n return error.name === \"AbortError\" || error.message === TIMEOUT_ERROR_MESSAGE || error.message.toLowerCase().includes(\"timed out\");\n}","import { PostgrestError, PostgrestSingleResponse } from \"@supabase/supabase-js\";\nimport { useMemo, useRef } from \"react\";\nimport { ItemType } from \"@pol-studios/utils\";\nimport { encode, UseQuerySingleReturn } from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { omit } from \"@pol-studios/utils\";\nimport { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { useDelayedValue } from \"@pol-studios/hooks/state\";\nimport { DEFAULT_QUERY_TIMEOUT, TIMEOUT_ERROR_MESSAGE } from \"./errors/TimeoutError\";\ntype ConfigurationOptions<T> = {\n crossOrganization?: boolean;\n filter?: (item: ItemType<T>) => boolean;\n timeout?: number;\n};\nexport type UseDbQuerySingleReturn<T> = UseQuerySingleReturn<T> & {\n data: T | null | undefined;\n count?: number | null;\n};\nexport function useDbQuery<Result>(query: PromiseLike<PostgrestSingleResponse<Result>> & {\n abortSignal?: (signal: AbortSignal) => PromiseLike<PostgrestSingleResponse<Result>>;\n}, config?: Omit<UseQueryOptions<Result, PostgrestError>, \"queryKey\" | \"queryFn\"> & ConfigurationOptions<Result>) {\n // Debounce query key to prevent rapid query churn during fast navigation\n const queryKey = encode(query, false);\n const queryKeyString = queryKey.join(\"-\");\n const debouncedKeyString = useDelayedValue(queryKeyString, 50);\n\n // Only enable query when key has stabilized (debounced matches current)\n const isKeyStable = queryKeyString === debouncedKeyString;\n const effectiveEnabled = config?.enabled !== false && isKeyStable;\n const timeoutMs = config?.timeout ?? DEFAULT_QUERY_TIMEOUT;\n\n // Track count from Supabase response (for queries with count: \"exact\")\n const countRef = useRef<number | null>(null);\n const request = useQuery(useMemo(() => ({\n queryKey,\n queryFn: async ({\n signal\n }) => {\n const controller = new AbortController();\n signal.addEventListener(\"abort\", () => controller.abort());\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n // Execute query with abort signal\n const queryWithSignal = query.abortSignal?.(controller.signal) ?? query;\n const result = await queryWithSignal;\n if (result.error) throw result.error;\n // Store count if available (from queries with count: \"exact\")\n countRef.current = result.count ?? null;\n return result.data;\n } catch (err: any) {\n if (err.name === \"AbortError\") {\n throw new Error(TIMEOUT_ERROR_MESSAGE);\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n },\n ...omit({\n retry: 1,\n ...config,\n enabled: effectiveEnabled\n }, [\"queryKey\", \"timeout\"])\n }), [queryKey, config, effectiveEnabled, timeoutMs, query]));\n\n // Return request with count property added\n return useMemo(() => ({\n ...request,\n count: countRef.current\n }), [request, countRef.current]) as UseDbQuerySingleReturn<Result>;\n}","/**\n * SetupAuthContext - Shared context for auth state\n *\n * This file is separate to avoid circular dependencies between\n * AuthProvider and PermissionContext.\n */\n\nimport { createContext, ReactNode } from \"react\";\nimport { AuthTokenResponsePassword, SignUpWithPasswordCredentials, User } from \"@supabase/supabase-js\";\nexport type ProfileStatus = \"active\" | \"archived\" | \"suspended\";\n\n/**\n * Represents an effective permission for a user on a specific resource.\n * These are eagerly loaded at login for fast permission checks.\n */\nexport interface EffectivePermission {\n /** The type of resource (e.g., 'project', 'client', 'database') */\n resourceType: string;\n /** The ID of the specific resource */\n resourceId: string;\n /** The permission action (e.g., 'view', 'edit', 'admin') */\n permission: string;\n /** Numeric level for comparison: view=1, edit=2, admin=3 */\n permissionLevel: number;\n /** How the permission was granted */\n source: \"direct\" | \"group\" | \"inherited\";\n /** If inherited, from which resource */\n inheritedFrom: string | null;\n /** When the permission expires, if applicable */\n expiresAt: string | null;\n}\nexport interface SetupAuthContext {\n user?: User | null | undefined;\n isLoading: boolean;\n profile: Profile | null | undefined;\n access: string[];\n /** Eagerly loaded effective permissions for the user */\n effectivePermissions: EffectivePermission[];\n /** Whether the profile is archived */\n isArchived: boolean;\n /** Whether the profile is suspended */\n isSuspended: boolean;\n /** The profile status (active, archived, suspended) */\n profileStatus: ProfileStatus | undefined;\n registerAsync: (register: SignUpWithPasswordCredentials) => Promise<any>;\n signInAsync: (username: string, password: string) => Promise<AuthTokenResponsePassword>;\n signOutAsync: () => Promise<any>;\n refreshAsync: () => Promise<void>;\n onSignOut: (action: () => any) => string;\n removeOnSignOut: (id: string) => any;\n hasAccess?: (key: string) => boolean;\n}\n\n// Profile type - simplified version, the full type is in AuthProvider\nexport interface Profile {\n id: string;\n email?: string;\n fullName?: string;\n status?: ProfileStatus;\n UserAccess?: Array<{\n accessKey: string;\n }>;\n [key: string]: any;\n}\nexport const setupAuthContext = createContext({} as SetupAuthContext);\n\n/**\n * Props for SetupAuthContextProvider\n * A simpler provider that takes pre-computed auth state\n */\nexport interface SetupAuthContextProviderProps {\n children: ReactNode;\n auth: SetupAuthContext;\n}","/**\n * AuthProvider - Unified auth provider for offline-first apps\n *\n * Features:\n * - Supabase auth with session timeout protection (3 second timeout)\n * - Profile and access data via useDbQuery (auto strategy: Supabase primary, PowerSync offline backup)\n * - Group-based access with permission levels (view=1, edit=2, admin=3)\n * - Wildcard matching (*:*:*, type:*:action, etc.)\n * - Works 100% offline once data is synced\n */\n\nimport { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { User, SignUpWithPasswordCredentials } from \"@supabase/supabase-js\";\nimport { isUsable, newUuid } from \"@pol-studios/utils\";\nimport { useDbQuery } from \"../../hooks/useDbQuery\";\nimport { useDbQueryById } from \"../../hooks/useDbQueryById\";\nimport useSupabase from \"../../useSupabase\";\nimport { setupAuthContext, type ProfileStatus, type EffectivePermission } from \"./setupAuthContext\";\n\n// Re-export from shared context for API compatibility\nexport { setupAuthContext, type SetupAuthContext, type SetupAuthContextProviderProps, type ProfileStatus, type EffectivePermission } from \"./setupAuthContext\";\n\n// Session fetch timeout - fail fast to avoid loading hangs\nconst SESSION_FETCH_TIMEOUT_MS = 3000;\n\n// ============================================================================\n// Types for access-related tables\n// ============================================================================\n\ninterface ProfileRow {\n id: string;\n email?: string | null;\n firstName?: string | null;\n lastName?: string | null;\n fullName?: string | null;\n status?: ProfileStatus | null;\n profilePath?: string | null;\n [key: string]: unknown;\n}\ninterface UserAccessRow {\n id: string;\n accessKey: string;\n effect: string;\n expiresAt: string | null;\n userId: string;\n}\ninterface UserGroupRow {\n id: string;\n userId: string;\n groupId: number;\n expiresAt: string | null;\n}\ninterface GroupRow {\n id: number;\n name: string;\n isActive: number; // PowerSync stores booleans as 0/1\n}\ninterface GroupAccessKeyRow {\n id: string;\n groupId: number;\n accessKey: string;\n effect: string;\n expiresAt?: string | null;\n}\nexport interface AuthProviderProps {\n children: ReactNode;\n}\n\n// ============================================================================\n// Permission Helpers\n// ============================================================================\n\n/** Maps permission action strings to numeric levels for comparison */\nfunction getPermissionLevel(action: string): number {\n switch (action.toLowerCase()) {\n case \"view\":\n case \"read\":\n return 1;\n case \"edit\":\n case \"write\":\n return 2;\n case \"admin\":\n case \"delete\":\n case \"share\":\n return 3;\n default:\n return 0;\n }\n}\n\n/** Check if a date string is not expired (null = never expires) */\nfunction isNotExpired(expiresAt: string | null | undefined): boolean {\n return !expiresAt || new Date(expiresAt) > new Date();\n}\n\n/**\n * Check if an access key pattern matches a requested key.\n * Supports wildcards (*) in any segment.\n *\n * Examples:\n * - \"*:*:*\" matches everything (super admin)\n * - \"project:*:read\" matches project:123:read\n * - \"project:123:*\" matches project:123:read, project:123:write\n */\nfunction matchesAccessPattern(pattern: string, requestedKey: string): boolean {\n if (pattern === requestedKey) return true;\n if (pattern === \"*:*:*\") return true;\n const patternParts = pattern.split(\":\");\n const keyParts = requestedKey.split(\":\");\n if (patternParts.length !== keyParts.length) return false;\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i] === \"*\") continue;\n if (patternParts[i] !== keyParts[i]) return false;\n }\n return true;\n}\n\n// ============================================================================\n// AuthProvider Component\n// ============================================================================\n\nexport function AuthProvider({\n children\n}: AuthProviderProps) {\n const supabase = useSupabase();\n\n // Auth state\n const [currentUser, setCurrentUser] = useState<User | null | undefined>(undefined);\n const [userNeedsChange, setUserNeedsChange] = useState(true);\n const [onSignOutCallbacks, setOnSignOutCallbacks] = useState(new Map<string, () => any>());\n\n // ─── Auth Actions ─────────────────────────────────────────────────────────\n\n async function registerAsync(register: SignUpWithPasswordCredentials) {\n const response = await supabase.auth.signUp(register);\n if (response.data.user) {\n setCurrentUser(prev => prev?.id === response.data.user?.id ? prev : response.data.user);\n }\n return response;\n }\n async function signInAsync(username: string, password: string) {\n const response_0 = await supabase.auth.signInWithPassword({\n email: username,\n password\n });\n if (response_0.data.user) {\n setCurrentUser(prev_0 => prev_0?.id === response_0.data.user?.id ? prev_0 : response_0.data.user);\n }\n return response_0;\n }\n const signOutAsync = useCallback(async () => {\n const response_1 = await supabase.auth.signOut();\n if (!response_1.error) {\n Array.from(onSignOutCallbacks.values()).forEach(cb => cb());\n }\n return response_1;\n }, [supabase.auth, onSignOutCallbacks]);\n function onSignOut(action: () => any) {\n const id = newUuid();\n setOnSignOutCallbacks(x => new Map(x).set(id, action));\n return id;\n }\n function removeOnSignOut(id_0: string) {\n setOnSignOutCallbacks(x_0 => {\n const map = new Map(x_0);\n map.delete(id_0);\n return map;\n });\n }\n async function refreshAsync() {}\n\n // ─── Session Management with Timeout ──────────────────────────────────────\n\n useEffect(() => {\n const {\n data: {\n subscription\n }\n } = supabase.auth.onAuthStateChange(event => {\n if (event === \"SIGNED_IN\" || event === \"SIGNED_OUT\") {\n setUserNeedsChange(true);\n }\n });\n return () => subscription.unsubscribe();\n }, [supabase.auth]);\n useEffect(() => {\n if (!userNeedsChange) return;\n let cancelled = false;\n async function fetchSessionWithTimeout() {\n try {\n // Race session fetch against timeout to prevent indefinite hangs\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Session fetch timed out after ${SESSION_FETCH_TIMEOUT_MS}ms`));\n }, SESSION_FETCH_TIMEOUT_MS);\n });\n const result = await Promise.race([supabase.auth.getSession(), timeoutPromise]);\n if (cancelled) return;\n const newUser = result?.data?.session?.user ?? null;\n setCurrentUser(prev_2 => {\n if (newUser === null) return null;\n if (prev_2?.id === newUser?.id) return prev_2;\n return newUser;\n });\n setUserNeedsChange(false);\n } catch (error) {\n if (cancelled) return;\n console.error(\"Failed to get session (timeout or error):\", error);\n setCurrentUser(prev_1 => prev_1 === null ? prev_1 : null);\n setUserNeedsChange(false);\n }\n }\n fetchSessionWithTimeout();\n return () => {\n cancelled = true;\n };\n }, [userNeedsChange, supabase.auth]);\n\n // ─── Query Profile and Access via useDbQuery ──────────────────────────────\n // Uses auto strategy: Supabase primary, PowerSync offline backup\n\n const isUserReady = isUsable(currentUser);\n\n // Profile query - useDbQueryById returns single object, not array\n const {\n data: profile,\n isLoading: profileLoading\n } = useDbQueryById<ProfileRow>(\"core.Profile\", currentUser?.id ?? \"\", {\n enabled: isUserReady\n });\n const {\n data: directAccess,\n isLoading: directAccessLoading\n } = useDbQuery<UserAccessRow>(\"core.UserAccess\", {\n where: {\n userId: currentUser?.id\n },\n enabled: isUserReady,\n realtime: true\n });\n const {\n data: userGroups,\n isLoading: userGroupsLoading\n } = useDbQuery<UserGroupRow>(\"core.UserGroup\", {\n where: {\n userId: currentUser?.id\n },\n enabled: isUserReady,\n realtime: true\n });\n const {\n data: groups,\n isLoading: groupsLoading\n } = useDbQuery<GroupRow>(\"core.Group\", {\n where: {\n isActive: 1\n },\n enabled: isUserReady,\n realtime: true\n });\n\n // Get group IDs user belongs to\n const groupIds = useMemo(() => userGroups?.map(ug => ug.groupId) ?? [], [userGroups]);\n\n // Map groups by ID for O(1) lookups\n const groupsMap = useMemo(() => new Map(groups?.map(g => [g.id, g]) ?? []), [groups]);\n const {\n data: groupAccess,\n isLoading: groupAccessLoading\n } = useDbQuery<GroupAccessKeyRow>(\"core.GroupAccessKey\", {\n where: groupIds.length > 0 ? {\n groupId: {\n in: groupIds\n }\n } : undefined,\n enabled: groupIds.length > 0,\n realtime: true\n });\n\n // Track previous profile status for signout logic\n const prevProfileStatusRef = useRef<string | null | undefined>(undefined);\n\n // Auto-signout if profile becomes archived/suspended\n useEffect(() => {\n const currentStatus = profile?.status;\n const prevStatus = prevProfileStatusRef.current;\n\n // Only trigger signout if status changed FROM active TO archived/suspended\n if (prevStatus === \"active\" && (currentStatus === \"archived\" || currentStatus === \"suspended\")) {\n signOutAsync();\n }\n prevProfileStatusRef.current = currentStatus;\n }, [profile?.status, signOutAsync]);\n\n // All access keys with metadata\n const allAccessKeys = useMemo(() => {\n const keys: Array<{\n accessKey: string;\n effect: string;\n source: \"direct\" | \"group\";\n expiresAt?: string | null;\n }> = [];\n\n // Add direct access keys (filter out expired)\n directAccess?.forEach(a => {\n if (isNotExpired(a.expiresAt)) {\n keys.push({\n accessKey: a.accessKey,\n effect: a.effect ?? \"allow\",\n source: \"direct\",\n expiresAt: a.expiresAt\n });\n }\n });\n\n // Add group access keys (only from active groups user belongs to)\n const activeGroupIds = new Set(userGroups?.filter(ug_0 => {\n const group = groupsMap.get(ug_0.groupId);\n return group?.isActive === 1 && isNotExpired(ug_0.expiresAt);\n }).map(ug_1 => ug_1.groupId) ?? []);\n groupAccess?.forEach(ga => {\n if (activeGroupIds.has(ga.groupId) && isNotExpired(ga.expiresAt)) {\n keys.push({\n accessKey: ga.accessKey,\n effect: ga.effect ?? \"allow\",\n source: \"group\",\n expiresAt: ga.expiresAt\n });\n }\n });\n return keys;\n }, [directAccess, userGroups, groupsMap, groupAccess]);\n\n // Combine access keys into a simple string array for hasAccess checks\n const combinedAccess: string[] = useMemo(() => {\n const uniqueKeys = new Set<string>();\n for (const item of allAccessKeys) {\n if (item.accessKey && item.effect === \"allow\") {\n uniqueKeys.add(item.accessKey);\n }\n }\n return Array.from(uniqueKeys);\n }, [allAccessKeys]);\n\n // Compute effective permissions\n const effectivePermissions: EffectivePermission[] = useMemo(() => {\n const permissions: EffectivePermission[] = [];\n for (const item_0 of allAccessKeys) {\n if (item_0.effect !== \"allow\") continue;\n const parts = item_0.accessKey.split(\":\");\n if (parts.length === 3) {\n const [resourceType, resourceId, permission] = parts;\n permissions.push({\n resourceType,\n resourceId,\n permission,\n permissionLevel: getPermissionLevel(permission),\n source: item_0.source,\n inheritedFrom: null,\n expiresAt: item_0.expiresAt ?? null\n });\n }\n }\n return permissions;\n }, [allAccessKeys]);\n\n // Profile status values\n const profileStatus = profile?.status as ProfileStatus | undefined;\n const isArchived = profileStatus === \"archived\";\n const isSuspended = profileStatus === \"suspended\";\n\n // ─── hasAccess Function ───────────────────────────────────────────────────\n\n const hasAccess = useCallback((key: string) => {\n // Archived/suspended users have no access\n if (isArchived || isSuspended) return false;\n if (!isUsable(combinedAccess)) return false;\n\n // Super-admin key bypasses all permission checks\n if (combinedAccess.includes(\"*:*:*\")) return true;\n\n // Check exact match\n if (combinedAccess.includes(key)) return true;\n\n // Empty key = no restriction\n if (!isUsable(key)) return true;\n\n // Check wildcard patterns\n for (const pattern of combinedAccess) {\n if (matchesAccessPattern(pattern, key)) return true;\n }\n\n // Check permission levels for type:id:action format\n const parts_0 = key.split(\":\");\n if (parts_0.length === 3) {\n const [type, id_1, action_0] = parts_0;\n const requiredLevel = getPermissionLevel(action_0);\n const hasPermission = effectivePermissions.some(p => p.resourceType === type && p.resourceId === id_1 && p.permissionLevel >= requiredLevel);\n if (hasPermission) return true;\n }\n return false;\n }, [combinedAccess, effectivePermissions, isArchived, isSuspended]);\n\n // ─── Loading State ────────────────────────────────────────────────────────\n\n const isAccessLoading = directAccessLoading || userGroupsLoading || groupsLoading || groupAccessLoading;\n const authState = useMemo(() => ({\n hasAccess,\n user: currentUser,\n profile,\n access: combinedAccess,\n effectivePermissions,\n profileStatus,\n isArchived,\n isSuspended,\n isLoading: currentUser === null ? false : profileLoading || isAccessLoading || currentUser === undefined,\n signInAsync,\n signOutAsync,\n onSignOut,\n removeOnSignOut,\n registerAsync,\n refreshAsync\n }), [hasAccess, currentUser, profile, combinedAccess, effectivePermissions, profileStatus, isArchived, isSuspended, profileLoading, isAccessLoading]);\n return <setupAuthContext.Provider value={authState}>\n {children}\n </setupAuthContext.Provider>;\n}\nexport type Profile = ProfileRow;","import { createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport useSupabase from \"../../useSupabase\";\nimport { setupAuthContext } from \"./setupAuthContext\";\nimport { EntityType, EntityPermissionLevel, EntityAction, EntityPermissionCheck } from \"../types/EntityPermissions\";\n\n// Cache entry with TTL\ninterface CacheEntry {\n permission: EntityPermissionCheck;\n expiresAt: number;\n}\n\n// Entity identifier for batch lookups\ninterface EntityIdentifier {\n entityType: EntityType;\n entityId: number;\n}\n\n// Cache key helper\nfunction getCacheKey(userId: string | undefined, entityType: EntityType, entityId: number): string {\n return `${userId || \"anon\"}:${entityType}:${entityId}`;\n}\n\n// Default loading state\nconst loadingPermission: EntityPermissionCheck = {\n canView: false,\n canAdminView: false,\n canEdit: false,\n canCreate: false,\n canDelete: false,\n canShare: false,\n permissionLevel: null,\n isLoading: true\n};\n\n// No permission state\nconst noPermission: EntityPermissionCheck = {\n canView: false,\n canAdminView: false,\n canEdit: false,\n canCreate: false,\n canDelete: false,\n canShare: false,\n permissionLevel: null,\n isLoading: false,\n isDenied: false\n};\n\n// Denied permission state - explicitly blocked access\nconst deniedPermission: EntityPermissionCheck = {\n canView: false,\n canAdminView: false,\n canEdit: false,\n canCreate: false,\n canDelete: false,\n canShare: false,\n permissionLevel: null,\n isLoading: false,\n isDenied: true\n};\n\n// Map permission level to permission check\n// If permission is 'denied', it means access was explicitly blocked\n// Handles both legacy formats (ReadOnly, AdminReadOnly, ReadWrite, Admin)\n// and new formats (view, edit, admin, denied)\nfunction mapPermissionLevel(level: EntityPermissionLevel | \"denied\" | string | null): EntityPermissionCheck {\n if (!level) {\n return noPermission;\n }\n\n // Normalize to lowercase for comparison to handle both legacy and new formats\n const normalizedLevel = level.toLowerCase();\n switch (normalizedLevel) {\n // Legacy format: ReadOnly, New format: view\n case \"readonly\":\n case \"view\":\n return {\n canView: true,\n canAdminView: false,\n canEdit: false,\n canCreate: false,\n canDelete: false,\n canShare: false,\n permissionLevel: \"ReadOnly\",\n isLoading: false,\n isDenied: false\n };\n // Legacy format: AdminReadOnly (no new equivalent, keep for backwards compatibility)\n case \"adminreadonly\":\n return {\n canView: true,\n canAdminView: true,\n canEdit: false,\n canCreate: false,\n canDelete: false,\n canShare: false,\n permissionLevel: \"AdminReadOnly\",\n isLoading: false,\n isDenied: false\n };\n // Legacy format: ReadWrite, New format: edit\n case \"readwrite\":\n case \"edit\":\n return {\n canView: true,\n canAdminView: false,\n canEdit: true,\n canCreate: true,\n canDelete: false,\n canShare: false,\n permissionLevel: \"ReadWrite\",\n isLoading: false,\n isDenied: false\n };\n // Legacy format: Admin, New format: admin\n case \"admin\":\n return {\n canView: true,\n canAdminView: true,\n canEdit: true,\n canCreate: true,\n canDelete: true,\n canShare: true,\n permissionLevel: \"Admin\",\n isLoading: false,\n isDenied: false\n };\n // New format: denied - explicit access denial\n case \"denied\":\n return deniedPermission;\n default:\n console.warn(`Unknown permission level: ${level}`);\n return noPermission;\n }\n}\n\n// Context interface\nexport interface PermissionContextValue {\n getPermission: (entityType: EntityType, entityId: number) => EntityPermissionCheck;\n checkPermission: (entityType: EntityType, entityId: number, action: EntityAction) => boolean;\n prefetchPermissions: (entities: EntityIdentifier[]) => Promise<void>;\n invalidatePermission: (entityType: EntityType, entityId: number) => void;\n isLoading: boolean;\n}\n\n/**\n * @deprecated Use permissionContext instead\n */\nexport interface EntityPermissionContextValue extends PermissionContextValue {}\nexport const permissionContext = createContext<PermissionContextValue>({} as PermissionContextValue);\n\n/**\n * @deprecated Use permissionContext instead\n */\nexport const entityPermissionContext = permissionContext;\n\n// TTL for cache entries (5 minutes)\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\n// TTL for error cache entries (30 seconds) - shorter to allow quick retry\nconst ERROR_CACHE_TTL_MS = 30 * 1000;\n\n// Batch collection delay (50ms)\nconst BATCH_DELAY_MS = 50;\nexport function PermissionProvider({\n children\n}: {\n children: ReactNode;\n}) {\n const supabase = useSupabase();\n const setupAuth = useContext(setupAuthContext);\n const user = setupAuth?.user;\n\n // Permission cache\n const cacheRef = useRef<Map<string, CacheEntry>>(new Map());\n\n // Pending lookups for batching\n const pendingLookupsRef = useRef<Set<string>>(new Set());\n\n // In-flight lookups to prevent duplicate requests during async RPC calls\n const inFlightRef = useRef<Set<string>>(new Set());\n\n // Batch timer ref\n const batchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Loading state\n const [isLoading, setIsLoading] = useState(false);\n\n // Force re-render trigger\n const [, forceUpdate] = useState(0);\n\n // Clean up expired cache entries\n const cleanupExpiredEntries = useCallback(() => {\n const now = Date.now();\n const cache = cacheRef.current;\n let hasExpired = false;\n for (const [key, entry] of cache.entries()) {\n if (entry.expiresAt < now) {\n cache.delete(key);\n hasExpired = true;\n }\n }\n if (hasExpired) {\n forceUpdate(prev => prev + 1);\n }\n }, []);\n\n // Periodic cleanup of expired entries\n useEffect(() => {\n const cleanupInterval = setInterval(cleanupExpiredEntries, 60 * 1000);\n return () => clearInterval(cleanupInterval);\n }, [cleanupExpiredEntries]);\n\n // Execute batch lookup\n const executeBatchLookup = useCallback(async () => {\n const pending = Array.from(pendingLookupsRef.current);\n pendingLookupsRef.current.clear();\n if (pending.length === 0 || !user?.id) {\n return;\n }\n\n // Move pending keys to in-flight to prevent duplicate requests\n pending.forEach(k => inFlightRef.current.add(k));\n setIsLoading(true);\n try {\n // Parse pending keys back to entities (format: userId:entityType:entityId)\n const entities = pending.map(key_0 => {\n const parts = key_0.split(\":\");\n // Skip the userId part (index 0), use entityType (index 1) and entityId (index 2)\n const entityType = parts[1];\n const entityIdStr = parts[2];\n return {\n entity_type: entityType as EntityType,\n entity_id: parseInt(entityIdStr, 10)\n };\n });\n\n // Call RPC for batch lookup\n // Using 'as any' because the RPC function type isn't in the generated database types\n const {\n data,\n error\n } = await (supabase.rpc as any)(\"get_user_entity_permissions\", {\n p_user_id: user.id,\n p_entities: entities\n });\n if (error) {\n console.error(\"Failed to fetch entity permissions:\", error);\n // Mark all pending as no permission with shorter TTL to allow quick retry\n const cache_0 = cacheRef.current;\n const now_0 = Date.now();\n for (const key_1 of pending) {\n cache_0.set(key_1, {\n permission: noPermission,\n expiresAt: now_0 + ERROR_CACHE_TTL_MS\n });\n }\n } else if (data) {\n // Update cache with results\n const cache_1 = cacheRef.current;\n const now_1 = Date.now();\n\n // Create a map of results for quick lookup\n // Permission can be a standard level or 'denied' for explicit deny\n const resultsMap = new Map<string, EntityPermissionLevel | \"denied\">();\n // Type the data as an array of permission results\n const results = data as Array<{\n entity_type: EntityType;\n entity_id: number;\n permission: EntityPermissionLevel | \"denied\";\n }>;\n for (const result of results) {\n const key_2 = getCacheKey(user?.id, result.entity_type, result.entity_id);\n resultsMap.set(key_2, result.permission);\n }\n\n // Update cache for all pending keys\n for (const key_3 of pending) {\n const permissionLevel = resultsMap.get(key_3) || null;\n cache_1.set(key_3, {\n permission: mapPermissionLevel(permissionLevel),\n expiresAt: now_1 + CACHE_TTL_MS\n });\n }\n }\n forceUpdate(prev_0 => prev_0 + 1);\n } catch (err) {\n console.error(\"Unexpected error fetching entity permissions:\", err);\n } finally {\n // Remove from in-flight after completion (success or error)\n pending.forEach(k => inFlightRef.current.delete(k));\n setIsLoading(false);\n }\n }, [supabase, user?.id]);\n\n // Schedule batch lookup\n const scheduleBatchLookup = useCallback(() => {\n if (batchTimerRef.current) {\n clearTimeout(batchTimerRef.current);\n }\n batchTimerRef.current = setTimeout(() => {\n batchTimerRef.current = null;\n executeBatchLookup();\n }, BATCH_DELAY_MS);\n }, [executeBatchLookup]);\n\n // Get permission for an entity\n const getPermission = useCallback((entityType_0: EntityType, entityId: number): EntityPermissionCheck => {\n const key_4 = getCacheKey(user?.id, entityType_0, entityId);\n const cache_2 = cacheRef.current;\n const cached = cache_2.get(key_4);\n const now_2 = Date.now();\n\n // Return cached if valid\n if (cached && cached.expiresAt > now_2) {\n return cached.permission;\n }\n\n // Don't add if already pending or in-flight to prevent duplicate requests\n if (!pendingLookupsRef.current.has(key_4) && !inFlightRef.current.has(key_4)) {\n pendingLookupsRef.current.add(key_4);\n scheduleBatchLookup();\n }\n return loadingPermission;\n }, [scheduleBatchLookup, user?.id]);\n\n // Check specific permission action\n const checkPermission = useCallback((entityType_1: EntityType, entityId_0: number, action: EntityAction): boolean => {\n const permission = getPermission(entityType_1, entityId_0);\n if (permission.isLoading) {\n return false;\n }\n switch (action) {\n case \"view\":\n return permission.canView;\n case \"adminView\":\n return permission.canAdminView;\n case \"edit\":\n return permission.canEdit;\n case \"create\":\n return permission.canCreate;\n case \"delete\":\n return permission.canDelete;\n case \"share\":\n return permission.canShare;\n default:\n return false;\n }\n }, [getPermission]);\n\n // Prefetch permissions for multiple entities\n const prefetchPermissions = useCallback(async (entities_0: EntityIdentifier[]): Promise<void> => {\n if (!user?.id || entities_0.length === 0) {\n return;\n }\n const cache_3 = cacheRef.current;\n const now_3 = Date.now();\n\n // Filter out already cached entries, items already pending, and items in-flight\n const toFetch = entities_0.filter(entity => {\n const key_5 = getCacheKey(user?.id, entity.entityType, entity.entityId);\n const cached_0 = cache_3.get(key_5);\n const isPending = pendingLookupsRef.current.has(key_5);\n const isInFlight = inFlightRef.current.has(key_5);\n return !isPending && !isInFlight && (!cached_0 || cached_0.expiresAt <= now_3);\n });\n if (toFetch.length === 0) {\n return;\n }\n setIsLoading(true);\n try {\n const entitiesParam = toFetch.map(e => ({\n entity_type: e.entityType,\n entity_id: e.entityId\n }));\n\n // Using 'as any' because the RPC function type isn't in the generated database types\n const {\n data: data_0,\n error: error_0\n } = await (supabase.rpc as any)(\"get_user_entity_permissions\", {\n p_user_id: user.id,\n p_entities: entitiesParam\n });\n if (error_0) {\n console.error(\"Failed to prefetch entity permissions:\", error_0);\n return;\n }\n if (data_0) {\n // Capture timestamp AFTER the RPC call completes\n const cacheTimestamp = Date.now();\n\n // Permission can be a standard level or 'denied' for explicit deny\n const resultsMap_0 = new Map<string, EntityPermissionLevel | \"denied\">();\n // Type the data as an array of permission results\n const results_0 = data_0 as Array<{\n entity_type: EntityType;\n entity_id: number;\n permission: EntityPermissionLevel | \"denied\";\n }>;\n for (const result_0 of results_0) {\n const key_6 = getCacheKey(user?.id, result_0.entity_type, result_0.entity_id);\n resultsMap_0.set(key_6, result_0.permission);\n }\n for (const entity_0 of toFetch) {\n const key_7 = getCacheKey(user?.id, entity_0.entityType, entity_0.entityId);\n const permissionLevel_0 = resultsMap_0.get(key_7) || null;\n cache_3.set(key_7, {\n permission: mapPermissionLevel(permissionLevel_0),\n expiresAt: cacheTimestamp + CACHE_TTL_MS\n });\n }\n forceUpdate(prev_1 => prev_1 + 1);\n }\n } catch (err_0) {\n console.error(\"Unexpected error prefetching entity permissions:\", err_0);\n } finally {\n setIsLoading(false);\n }\n }, [supabase, user?.id]);\n\n // Invalidate a specific permission\n const invalidatePermission = useCallback((entityType_2: EntityType, entityId_1: number): void => {\n const key_8 = getCacheKey(user?.id, entityType_2, entityId_1);\n cacheRef.current.delete(key_8);\n forceUpdate(prev_2 => prev_2 + 1);\n }, [user?.id]);\n\n // Parse scoped access key format: <entity_type>:<entity_id>:<permission_level>\n // Returns null if the key format is invalid\n const parseScopedAccessKey = useCallback((key_9: string): {\n entityType: EntityType;\n entityId: number;\n } | null => {\n if (!key_9 || typeof key_9 !== \"string\") {\n return null;\n }\n const parts_0 = key_9.split(\":\");\n if (parts_0.length < 2) {\n return null;\n }\n const entityType_3 = parts_0[0];\n const entityId_2 = parseInt(parts_0[1], 10);\n if (isNaN(entityId_2)) {\n return null;\n }\n // Use explicit mapping instead of string manipulation\n // This correctly handles \"database\" -> \"ProjectDatabase\" case\n const entityTypeMap: Record<string, EntityType> = {\n client: \"Client\",\n project: \"Project\",\n database: \"ProjectDatabase\",\n projectdatabase: \"ProjectDatabase\"\n };\n const normalizedEntityType = entityTypeMap[entityType_3.toLowerCase()];\n if (!normalizedEntityType) {\n return null;\n }\n return {\n entityType: normalizedEntityType,\n entityId: entityId_2\n };\n }, []);\n\n // Real-time subscription for permission changes\n useEffect(() => {\n if (!user?.id) {\n return;\n }\n\n // Subscribe to changes on UserAccess table for the current user\n // Use unique channel name per user to avoid collisions\n const channel = supabase.channel(`entity-permissions-${user.id}`).on(\"postgres_changes\", {\n event: \"*\",\n schema: \"core\",\n table: \"UserAccess\",\n filter: `userId=eq.${user.id}`\n }, payload => {\n // Parse the scoped access key from the new record\n if (payload.new && typeof payload.new === \"object\" && \"scopedAccessKey\" in payload.new && typeof payload.new.scopedAccessKey === \"string\") {\n const parsed = parseScopedAccessKey(payload.new.scopedAccessKey);\n if (parsed) {\n invalidatePermission(parsed.entityType, parsed.entityId);\n }\n }\n // Parse the scoped access key from the old record (for deletes/updates)\n if (payload.old && typeof payload.old === \"object\" && \"scopedAccessKey\" in payload.old && typeof payload.old.scopedAccessKey === \"string\") {\n const parsed_0 = parseScopedAccessKey(payload.old.scopedAccessKey);\n if (parsed_0) {\n invalidatePermission(parsed_0.entityType, parsed_0.entityId);\n }\n }\n }).subscribe();\n return () => {\n channel.unsubscribe();\n supabase.removeChannel(channel);\n };\n }, [supabase, user?.id, invalidatePermission, parseScopedAccessKey]);\n\n // Clear cache on user change\n useEffect(() => {\n cacheRef.current.clear();\n pendingLookupsRef.current.clear();\n inFlightRef.current.clear();\n if (batchTimerRef.current) {\n clearTimeout(batchTimerRef.current);\n batchTimerRef.current = null;\n }\n forceUpdate(prev_3 => prev_3 + 1);\n }, [user?.id]);\n\n // Cleanup batch timer on unmount\n useEffect(() => {\n return () => {\n if (batchTimerRef.current) {\n clearTimeout(batchTimerRef.current);\n }\n };\n }, []);\n const value = useMemo(() => ({\n getPermission,\n checkPermission,\n prefetchPermissions,\n invalidatePermission,\n isLoading\n }), [getPermission, checkPermission, prefetchPermissions, invalidatePermission, isLoading]);\n return <permissionContext.Provider value={value}>\n {children}\n </permissionContext.Provider>;\n}\nexport function usePermissions() {\n const context = useContext(permissionContext);\n if (!context || Object.keys(context).length === 0) {\n throw new Error(\"usePermissions must be used within a PermissionProvider\");\n }\n return context;\n}","import { c as _c } from \"react/compiler-runtime\";\nimport { ReactNode, createContext, useContext, useEffect, useMemo, useState, useCallback, useRef } from \"react\";\nimport { useDbQuery as useQuery } from \"../../useDbQuery\";\nimport { useDbUpsert as useUpsert } from \"../../useDbUpsert\";\nimport useSupabase, { Database } from \"../../useSupabase\";\nimport { isUsable } from \"@pol-studios/utils\";\nimport { setupAuthContext } from \"./AuthProvider\";\n\n// UserMetadata query constant\nconst UserMetadataQuery = {\n schema: \"core\",\n table: \"UserMetadata\",\n defaultQuery: \"key, userId, value\"\n} as const;\n\n// Type definitions for UserMetadata\nexport type UserMetadataRow = Database[\"core\"][\"Tables\"][\"UserMetadata\"][\"Row\"];\nexport type UserMetadataInsert = Database[\"core\"][\"Tables\"][\"UserMetadata\"][\"Insert\"];\nexport type UserMetadataUpdate = Database[\"core\"][\"Tables\"][\"UserMetadata\"][\"Update\"];\n\n// Context interface\nexport interface UserMetadataContextType {\n metadata: Record<string, string>;\n isLoading: boolean;\n error: Error | null;\n setMetadata: (key: string, value: string) => Promise<void>;\n getMetadata: (key: string) => string | undefined;\n removeMetadata: (key: string) => Promise<void>;\n refreshMetadata: () => Promise<void>;\n}\n\n// Create context\nexport const userMetadataContext = createContext<UserMetadataContextType | null>(null);\n\n// Provider component\nexport function UserMetadataProvider({\n children\n}: {\n children: ReactNode;\n}) {\n const supabase = useSupabase();\n const [metadata, setMetadataState] = useState<Record<string, string>>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Get current user ID from auth context\n const setupAuth = useContext(setupAuthContext);\n const userId = setupAuth?.user?.id;\n\n // Query to fetch all user metadata\n const metadataQuery = useQuery(supabase.schema(\"core\").from(\"UserMetadata\").select(UserMetadataQuery.defaultQuery).eq(\"userId\", userId!).order(\"key\"), {\n enabled: isUsable(userId),\n crossOrganization: true\n });\n\n // Upsert mutation for updating metadata\n const upsertMutation = useUpsert({\n table: \"UserMetadata\",\n schema: \"core\"\n }, [\"userId\", \"key\"] // composite primary keys\n );\n\n // Ref to hold mutation to avoid infinite loops in useCallback dependencies\n const upsertMutationRef = useRef(upsertMutation);\n upsertMutationRef.current = upsertMutation;\n\n // Update local state when query data changes\n useEffect(() => {\n if (metadataQuery.data && Array.isArray(metadataQuery.data)) {\n const metadataMap: Record<string, string> = {};\n metadataQuery.data.forEach((item: any) => {\n metadataMap[item.key] = item.value;\n });\n setMetadataState(metadataMap);\n setIsLoading(false);\n setError(null);\n } else if (metadataQuery.error) {\n setError(metadataQuery.error);\n setIsLoading(false);\n } else if (metadataQuery.isLoading) {\n setIsLoading(true);\n } else if (metadataQuery.data && !Array.isArray(metadataQuery.data)) {\n // Handle case where data is not an array (e.g., empty response or count)\n setMetadataState({});\n setIsLoading(false);\n }\n }, [metadataQuery.data, metadataQuery.error, metadataQuery.isLoading]);\n\n // Set metadata function\n const setMetadata = useCallback(async (key: string, value: string) => {\n if (!userId) {\n throw new Error(\"User not authenticated\");\n }\n try {\n await upsertMutationRef.current.mutateAsync({\n userId,\n key,\n value\n });\n\n // Update local state optimistically\n setMetadataState(prev => ({\n ...prev,\n [key]: value\n }));\n } catch (err) {\n setError(err as Error);\n throw err;\n }\n }, [userId]);\n\n // Get metadata function\n const getMetadata = useCallback((key_0: string): string | undefined => {\n return metadata[key_0];\n }, [metadata]);\n\n // Remove metadata function\n const removeMetadata = useCallback(async (key_1: string) => {\n if (!userId) {\n throw new Error(\"User not authenticated\");\n }\n try {\n await supabase.schema(\"core\").from(\"UserMetadata\").delete().eq(\"userId\", userId).eq(\"key\", key_1);\n\n // Update local state\n setMetadataState(prev_0 => {\n const newState = {\n ...prev_0\n };\n delete newState[key_1];\n return newState;\n });\n } catch (err_0) {\n setError(err_0 as Error);\n throw err_0;\n }\n }, [userId, supabase]);\n\n // Refresh metadata function\n const refreshMetadata = useCallback(async () => {\n await metadataQuery.refetch();\n }, [metadataQuery]);\n\n // Context value\n const contextValue = useMemo(() => ({\n metadata,\n isLoading,\n error,\n setMetadata,\n getMetadata,\n removeMetadata,\n refreshMetadata\n }), [metadata, isLoading, error, setMetadata, getMetadata, removeMetadata, refreshMetadata]);\n return <userMetadataContext.Provider value={contextValue}>\n {children}\n </userMetadataContext.Provider>;\n}\n\n// Hook to use the context\nexport function useUserMetadata() {\n const context = useContext(userMetadataContext);\n if (!context) {\n throw new Error(\"useUserMetadata must be used within a UserMetadataProvider\");\n }\n return context;\n}\n\n// Convenience hook for getting a specific metadata value\nexport function useUserMetadataValue(key) {\n const $ = _c(3);\n const {\n getMetadata\n } = useUserMetadata();\n let t0;\n if ($[0] !== getMetadata || $[1] !== key) {\n t0 = getMetadata(key);\n $[0] = getMetadata;\n $[1] = key;\n $[2] = t0;\n } else {\n t0 = $[2];\n }\n return t0;\n}\n\n// Convenience hook for setting a specific metadata value\nexport function useSetUserMetadata() {\n const $ = _c(3);\n const {\n setMetadata,\n removeMetadata\n } = useUserMetadata();\n let t0;\n if ($[0] !== removeMetadata || $[1] !== setMetadata) {\n t0 = {\n setMetadata,\n removeMetadata\n };\n $[0] = removeMetadata;\n $[1] = setMetadata;\n $[2] = t0;\n } else {\n t0 = $[2];\n }\n return t0;\n}\n\n// Advanced state-like hook with JSON serialization support\nexport function useUserMetadataState(key, defaultValue, options) {\n const $ = _c(11);\n const {\n metadata,\n setMetadata,\n isLoading\n } = useUserMetadata();\n const serialize = options?.serialize ?? _temp;\n const deserialize = options?.deserialize ?? _temp2;\n let t0;\n bb0: {\n const rawValue = metadata[key];\n if (!rawValue) {\n t0 = defaultValue;\n break bb0;\n }\n ;\n try {\n let t2;\n if ($[0] !== deserialize || $[1] !== rawValue) {\n t2 = deserialize(rawValue);\n $[0] = deserialize;\n $[1] = rawValue;\n $[2] = t2;\n } else {\n t2 = $[2];\n }\n t0 = t2;\n } catch (t1) {\n const error = t1;\n console.warn(`Failed to deserialize metadata for key \"${key}\":`, error);\n t0 = defaultValue;\n }\n }\n const currentValue = t0;\n let t1;\n if ($[3] !== key || $[4] !== serialize || $[5] !== setMetadata) {\n t1 = async value_1 => {\n const serializedValue = serialize(value_1);\n await setMetadata(key, serializedValue);\n };\n $[3] = key;\n $[4] = serialize;\n $[5] = setMetadata;\n $[6] = t1;\n } else {\n t1 = $[6];\n }\n const setValue = t1;\n let t2;\n if ($[7] !== currentValue || $[8] !== isLoading || $[9] !== setValue) {\n t2 = [currentValue, setValue, isLoading];\n $[7] = currentValue;\n $[8] = isLoading;\n $[9] = setValue;\n $[10] = t2;\n } else {\n t2 = $[10];\n }\n return t2;\n}\nfunction _temp2(value_0) {\n return JSON.parse(value_0);\n}\nfunction _temp(value) {\n return JSON.stringify(value);\n}","import { c as _c } from \"react/compiler-runtime\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport useSupabase, { Database } from \"./useSupabase\";\nimport { useQueriesForTableLoader, useUpdateMutation, useUpsertItem } from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { GetResult } from \"./parser/select-query-parser\";\nimport { GenericSchema } from \"./parser/types\";\nimport { isUsable } from \"@pol-studios/utils\";\nimport { omit } from \"@pol-studios/utils\";\nimport { buildNormalizedQuery } from \"@supabase-cache-helpers/postgrest-core\";\ntype ItemType<T> = T extends Array<infer U> ? U : T;\nexport type MutationOption = Parameters<typeof useUpdateMutation>[3];\nexport type useDbUpsertResponse = ReturnType<typeof useDbUpsert>;\nexport function useDbUpsert(relation, t0, query, mutationOption) {\n const $ = _c(16);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? [\"id\"] : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const primaryKeys = t1;\n const tableName = typeof relation === \"object\" ? relation.table : relation;\n const schemaName = typeof relation === \"object\" ? String(relation.schema) : \"public\";\n const supabase = useSupabase();\n let t2;\n if ($[2] !== primaryKeys) {\n t2 = primaryKeys.map(_temp);\n $[2] = primaryKeys;\n $[3] = t2;\n } else {\n t2 = $[3];\n }\n const primaryKeysAsStrings = t2 as string[];\n const t3 = primaryKeysAsStrings as any;\n const t4 = relation as any;\n let t5;\n if ($[4] !== t3 || $[5] !== t4) {\n t5 = {\n primaryKeys: t3,\n table: t4,\n schema: \"public\"\n };\n $[4] = t3;\n $[5] = t4;\n $[6] = t5;\n } else {\n t5 = $[6];\n }\n const upsertItem = useUpsertItem(t5);\n const queriesForTable = useQueriesForTableLoader(tableName);\n let t6;\n if ($[7] !== primaryKeys || $[8] !== primaryKeysAsStrings || $[9] !== queriesForTable || $[10] !== query || $[11] !== schemaName || $[12] !== supabase || $[13] !== tableName || $[14] !== upsertItem) {\n t6 = {\n mutationFn: async item => {\n let result = null;\n const selectQuery = buildNormalizedQuery({\n queriesForTable,\n query\n });\n const insert = async function insert() {\n const keysToFilter = primaryKeys.filter(x => isUsable((item as any)[x]) === false);\n const keysToFilterAsStrings = keysToFilter.map(_temp2) as string[];\n const response = await (supabase as any).schema(schemaName as \"public\" | \"core\").from(tableName).insert(omit(item as any, keysToFilterAsStrings as any) as any).select(query).single();\n if (response.error) {\n throw response.error;\n }\n result = response.data as any;\n if (result) {\n upsertItem(result as any);\n }\n };\n const isUpsertable = primaryKeys.every(x_0 => x_0 in item && isUsable((item as any)[x_0]));\n if (isUpsertable) {\n const query_0 = (supabase as any).schema(schemaName as \"public\" | \"core\").from(tableName).update(omit(item as any, primaryKeysAsStrings as any) as any);\n primaryKeys.forEach(x_1 => {\n query_0.eq(String(x_1), (item as any)[x_1]);\n });\n const queryResponse = await query_0.select(selectQuery?.selectQuery).single();\n console.log(\"queryResponse\", queryResponse, tableName);\n if (queryResponse.status === 406) {\n await insert();\n } else {\n if (queryResponse.error) {\n throw queryResponse.error;\n }\n if (queryResponse.data) {\n result = queryResponse.data as any;\n if (result) {\n upsertItem(result as any);\n }\n }\n }\n } else {\n await insert();\n }\n return result as any;\n }\n };\n $[7] = primaryKeys;\n $[8] = primaryKeysAsStrings;\n $[9] = queriesForTable;\n $[10] = query;\n $[11] = schemaName;\n $[12] = supabase;\n $[13] = tableName;\n $[14] = upsertItem;\n $[15] = t6;\n } else {\n t6 = $[15];\n }\n const mutation = useMutation(t6);\n return mutation;\n}\nfunction _temp2(k_0) {\n return String(k_0);\n}\nfunction _temp(k) {\n return String(k);\n}"],"mappings":"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","names":["useDbQuery","useMemo","useRef","useMemo","useRef","createContext","useCallback","useEffect","useMemo","useRef","useState","jsx","createContext","useRef","useState","useCallback","useEffect","useMemo","_c","createContext","useContext","useEffect","useMemo","useState","useCallback","useRef","isUsable","omit","insert","isUsable","omit","isUsable","jsx","createContext","useState","useContext","useDbQuery","isUsable","useRef","useEffect","useCallback","useMemo","_c","_temp","_temp2","t2","t1"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/contexts/LiveChangeContext.tsx","../src/useLiveChangesIndicator.tsx","../src/contexts/UserMetadataContext.tsx"],"sourcesContent":["import { c as _c } from \"react/compiler-runtime\";\nimport { isUsable } from \"@pol-studios/utils\";\nimport { ReactNode, createContext } from \"react\";\nimport { DbChangeLog } from \"../types\";\nimport { useDbQuery } from \"../useDbQuery\";\nimport useSupabase from \"../useSupabase\";\nexport interface AlertProps {\n title: string;\n description: string;\n}\ninterface Context {\n lastModifiedUserName: string;\n changeLog: DbChangeLog;\n}\ninterface AlertState {\n isOpen: boolean;\n title: string;\n description: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\nexport const LiveChangeContext = createContext({} as Context);\nexport const LiveChangeContextProvider = t0 => {\n const $ = _c(13);\n const {\n children,\n changeLog\n } = t0;\n const supabase = useSupabase();\n let t1;\n if ($[0] !== changeLog?.modifiedByUserId || $[1] !== supabase) {\n t1 = supabase.schema(\"core\").from(\"Profile\").select().eq(\"id\", changeLog?.modifiedByUserId).single();\n $[0] = changeLog?.modifiedByUserId;\n $[1] = supabase;\n $[2] = t1;\n } else {\n t1 = $[2];\n }\n const t2 = changeLog?.modifiedByUserId;\n let t3;\n if ($[3] !== t2) {\n t3 = isUsable(t2);\n $[3] = t2;\n $[4] = t3;\n } else {\n t3 = $[4];\n }\n let t4;\n if ($[5] !== t3) {\n t4 = {\n enabled: t3,\n crossOrganization: true\n };\n $[5] = t3;\n $[6] = t4;\n } else {\n t4 = $[6];\n }\n const userRequest = useDbQuery(t1, t4);\n const t5 = userRequest.data?.firstName + \" \" + userRequest.data?.lastName;\n let t6;\n if ($[7] !== changeLog || $[8] !== t5) {\n t6 = {\n changeLog,\n lastModifiedUserName: t5\n };\n $[7] = changeLog;\n $[8] = t5;\n $[9] = t6;\n } else {\n t6 = $[9];\n }\n let t7;\n if ($[10] !== children || $[11] !== t6) {\n t7 = <LiveChangeContext.Provider value={t6}>{children}</LiveChangeContext.Provider>;\n $[10] = children;\n $[11] = t6;\n $[12] = t7;\n } else {\n t7 = $[12];\n }\n return t7;\n};","import { isNullOrWhitespace } from \"@pol-studios/utils\";\nimport { useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { delay } from \"@pol-studios/utils\";\nimport { LiveChangeContext } from \"./contexts/LiveChangeContext\";\nimport { isUsable } from \"@pol-studios/utils\";\nimport { useSetupAuth } from \"./auth\";\nexport default function useLiveChangesIndicator(value: any, field: string | undefined): [boolean, string] {\n const liveChangesContext = useContext(LiveChangeContext);\n const [showModifiedByName, setShowModifiedByName] = useState(false);\n const isMounted = useRef(false);\n const {\n user\n } = useSetupAuth();\n const checkChanges = useCallback(async () => {\n try {\n const changeLog = liveChangesContext?.changeLog;\n if (isUsable(changeLog) === false) {\n return;\n }\n const changes = changeLog.changes;\n if (isUsable(changes) === false) {\n return;\n }\n const changeOccurredInChangeLog = Object.keys(changes).some(x => {\n return field ? x === field : changes[x] === value;\n });\n if (changeOccurredInChangeLog === false) {\n return;\n }\n setShowModifiedByName(changeLog.modifiedByUserId !== user?.id);\n await delay(isNullOrWhitespace(liveChangesContext?.lastModifiedUserName) ? 2000 : 1500);\n } finally {\n setShowModifiedByName(false);\n }\n }, [liveChangesContext?.changeLog]);\n useEffect(() => {\n if (isMounted.current === false) {\n delay(200).then(x => {\n isMounted.current = true;\n });\n return;\n }\n checkChanges();\n }, [liveChangesContext?.changeLog]);\n return [showModifiedByName, liveChangesContext?.lastModifiedUserName];\n}","import { c as _c } from \"react/compiler-runtime\";\nimport { ReactNode, createContext, useContext, useEffect, useMemo, useState, useCallback } from \"react\";\nimport { useDbQuery } from \"../useDbQuery\";\nimport { useDbUpsert } from \"../hooks\";\nimport useSupabase from \"../useSupabase\";\nimport { isUsable } from \"@pol-studios/utils\";\nimport { Database } from \"../useSupabase\";\nimport { useDbRealtimeQuery } from \"../useDbRealtimeQuery\";\nimport { UserMetadata } from \"../gen/public/UserMetadata/query\";\nimport { useSetupAuth } from \"../auth\";\n\n// Type definitions for UserMetadata\nexport type UserMetadataRow = Database[\"core\"][\"Tables\"][\"UserMetadata\"][\"Row\"];\nexport type UserMetadataInsert = Database[\"core\"][\"Tables\"][\"UserMetadata\"][\"Insert\"];\nexport type UserMetadataUpdate = Database[\"core\"][\"Tables\"][\"UserMetadata\"][\"Update\"];\n\n// Context interface\nexport interface UserMetadataContextType {\n metadata: Record<string, string>;\n isLoading: boolean;\n error: Error | null;\n setMetadata: (key: string, value: string) => Promise<void>;\n getMetadata: (key: string) => string | undefined;\n removeMetadata: (key: string) => Promise<void>;\n refreshMetadata: () => Promise<void>;\n}\n\n// Create context\nexport const userMetadataContext = createContext<UserMetadataContextType | null>(null);\n\n// Provider component\nexport function UserMetadataContextProvider(t0) {\n const $ = _c(35);\n const {\n children\n } = t0;\n const supabase = useSupabase();\n let t1;\n if ($[0] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t1 = {};\n $[0] = t1;\n } else {\n t1 = $[0];\n }\n const [metadata, setMetadataState] = useState(t1);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState(null);\n const {\n user\n } = useSetupAuth();\n const userId = user?.id;\n let t2;\n if ($[1] !== supabase || $[2] !== userId) {\n t2 = supabase.schema(\"core\").from(\"UserMetadata\").select(UserMetadata.defaultQuery).eq(\"userId\", userId).order(\"key\");\n $[1] = supabase;\n $[2] = userId;\n $[3] = t2;\n } else {\n t2 = $[3];\n }\n let t3;\n if ($[4] !== userId) {\n t3 = isUsable(userId);\n $[4] = userId;\n $[5] = t3;\n } else {\n t3 = $[5];\n }\n let t4;\n if ($[6] !== t3) {\n t4 = {\n enabled: t3,\n crossOrganization: true\n };\n $[6] = t3;\n $[7] = t4;\n } else {\n t4 = $[7];\n }\n const metadataQuery = useDbQuery(t2, t4);\n let t5;\n if ($[8] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t5 = {\n invalidateTables: [\"UserMetadata\"]\n };\n $[8] = t5;\n } else {\n t5 = $[8];\n }\n const upsertMutation = useDbUpsert(\"UserMetadata\", t5);\n let t6;\n let t7;\n if ($[9] !== metadataQuery.data || $[10] !== metadataQuery.error || $[11] !== metadataQuery.isLoading) {\n t6 = () => {\n if (metadataQuery.data && Array.isArray(metadataQuery.data)) {\n const metadataMap = {};\n metadataQuery.data.forEach(item => {\n metadataMap[item.key] = item.value;\n });\n setMetadataState(metadataMap);\n setIsLoading(false);\n setError(null);\n } else {\n if (metadataQuery.error) {\n setError(metadataQuery.error);\n setIsLoading(false);\n } else {\n if (metadataQuery.isLoading) {\n setIsLoading(true);\n } else {\n if (metadataQuery.data && !Array.isArray(metadataQuery.data)) {\n setMetadataState({});\n setIsLoading(false);\n }\n }\n }\n }\n };\n t7 = [metadataQuery.data, metadataQuery.error, metadataQuery.isLoading];\n $[9] = metadataQuery.data;\n $[10] = metadataQuery.error;\n $[11] = metadataQuery.isLoading;\n $[12] = t6;\n $[13] = t7;\n } else {\n t6 = $[12];\n t7 = $[13];\n }\n useEffect(t6, t7);\n let t8;\n if ($[14] !== upsertMutation || $[15] !== userId) {\n t8 = async (key, value) => {\n if (!userId) {\n throw new Error(\"User not authenticated\");\n }\n ;\n try {\n await upsertMutation.mutateAsync({\n userId,\n key,\n value\n });\n setMetadataState(prev => ({\n ...prev,\n [key]: value\n }));\n } catch (t9) {\n const err = t9;\n setError(err as Error);\n throw err;\n }\n };\n $[14] = upsertMutation;\n $[15] = userId;\n $[16] = t8;\n } else {\n t8 = $[16];\n }\n const setMetadata = t8;\n let t9;\n if ($[17] !== metadata) {\n t9 = key_0 => metadata[key_0];\n $[17] = metadata;\n $[18] = t9;\n } else {\n t9 = $[18];\n }\n const getMetadata = t9;\n let t10;\n if ($[19] !== supabase || $[20] !== userId) {\n t10 = async key_1 => {\n if (!userId) {\n throw new Error(\"User not authenticated\");\n }\n ;\n try {\n await supabase.schema(\"core\").from(\"UserMetadata\").delete().eq(\"userId\", userId).eq(\"key\", key_1);\n setMetadataState(prev_0 => {\n const newState = {\n ...prev_0\n };\n delete newState[key_1];\n return newState;\n });\n } catch (t11) {\n const err_0 = t11;\n setError(err_0 as Error);\n throw err_0;\n }\n };\n $[19] = supabase;\n $[20] = userId;\n $[21] = t10;\n } else {\n t10 = $[21];\n }\n const removeMetadata = t10;\n let t11;\n if ($[22] !== metadataQuery) {\n t11 = async () => {\n await metadataQuery.refetch();\n };\n $[22] = metadataQuery;\n $[23] = t11;\n } else {\n t11 = $[23];\n }\n const refreshMetadata = t11;\n let t12;\n if ($[24] !== error || $[25] !== getMetadata || $[26] !== isLoading || $[27] !== metadata || $[28] !== refreshMetadata || $[29] !== removeMetadata || $[30] !== setMetadata) {\n t12 = {\n metadata,\n isLoading,\n error,\n setMetadata,\n getMetadata,\n removeMetadata,\n refreshMetadata\n };\n $[24] = error;\n $[25] = getMetadata;\n $[26] = isLoading;\n $[27] = metadata;\n $[28] = refreshMetadata;\n $[29] = removeMetadata;\n $[30] = setMetadata;\n $[31] = t12;\n } else {\n t12 = $[31];\n }\n const contextValue = t12;\n let t13;\n if ($[32] !== children || $[33] !== contextValue) {\n t13 = <userMetadataContext.Provider value={contextValue}>{children}</userMetadataContext.Provider>;\n $[32] = children;\n $[33] = contextValue;\n $[34] = t13;\n } else {\n t13 = $[34];\n }\n return t13;\n}\n\n// Hook to use the context\nexport function useUserMetadata() {\n const context = useContext(userMetadataContext);\n if (!context) {\n throw new Error(\"useUserMetadata must be used within a UserMetadataContextProvider\");\n }\n return context;\n}\n\n// Convenience hook for getting a specific metadata value\nexport function useUserMetadataValue(key) {\n const $ = _c(3);\n const {\n getMetadata\n } = useUserMetadata();\n let t0;\n if ($[0] !== getMetadata || $[1] !== key) {\n t0 = getMetadata(key);\n $[0] = getMetadata;\n $[1] = key;\n $[2] = t0;\n } else {\n t0 = $[2];\n }\n return t0;\n}\n\n// Convenience hook for setting a specific metadata value\nexport function useSetUserMetadata() {\n const $ = _c(3);\n const {\n setMetadata,\n removeMetadata\n } = useUserMetadata();\n let t0;\n if ($[0] !== removeMetadata || $[1] !== setMetadata) {\n t0 = {\n setMetadata,\n removeMetadata\n };\n $[0] = removeMetadata;\n $[1] = setMetadata;\n $[2] = t0;\n } else {\n t0 = $[2];\n }\n return t0;\n}\n\n// Advanced state-like hook with JSON serialization support\nexport function useUserMetadataState(key, defaultValue, options) {\n const $ = _c(11);\n const {\n metadata,\n setMetadata,\n isLoading\n } = useUserMetadata();\n const serialize = options?.serialize ?? _temp;\n const deserialize = options?.deserialize ?? _temp2;\n let t0;\n bb0: {\n const rawValue = metadata[key];\n if (!rawValue) {\n t0 = defaultValue;\n break bb0;\n }\n ;\n try {\n let t2;\n if ($[0] !== deserialize || $[1] !== rawValue) {\n t2 = deserialize(rawValue);\n $[0] = deserialize;\n $[1] = rawValue;\n $[2] = t2;\n } else {\n t2 = $[2];\n }\n t0 = t2;\n } catch (t1) {\n const error = t1;\n console.warn(`Failed to deserialize metadata for key \"${key}\":`, error);\n t0 = defaultValue;\n }\n }\n const currentValue = t0;\n let t1;\n if ($[3] !== key || $[4] !== serialize || $[5] !== setMetadata) {\n t1 = async value_1 => {\n const serializedValue = serialize(value_1);\n await setMetadata(key, serializedValue);\n };\n $[3] = key;\n $[4] = serialize;\n $[5] = setMetadata;\n $[6] = t1;\n } else {\n t1 = $[6];\n }\n const setValue = t1;\n let t2;\n if ($[7] !== currentValue || $[8] !== isLoading || $[9] !== setValue) {\n t2 = [currentValue, setValue, isLoading];\n $[7] = currentValue;\n $[8] = isLoading;\n $[9] = setValue;\n $[10] = t2;\n } else {\n t2 = $[10];\n }\n return t2;\n}\nfunction _temp2(value_0) {\n return JSON.parse(value_0);\n}\nfunction _temp(value) {\n return JSON.stringify(value);\n}"],"mappings":"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","names":["isUsable","isUsable","_c","createContext","useContext","useEffect","useState","isUsable","jsx","createContext","_c","useState","isUsable","useEffect","t9","t11","useContext","t2","t1"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/query/select-parser.ts","../src/query/relationship-resolver.ts","../src/query/sql-builder.ts","../src/query/result-joiner.ts","../src/query/executor.ts"],"sourcesContent":["/**\n * Select String Parser\n *\n * Parses Supabase PostgREST select syntax into an AST for local SQLite processing.\n *\n * Supported Syntax:\n * - \"*\" -> All columns\n * - \"id, name, status\" -> Specific columns\n * - \"*, RelatedTable(*)\" -> All columns + relation\n * - \"id, RelatedTable(id, name)\" -> Specific + relation with specific columns\n * - \"*, Parent(*, Grandparent(name))\" -> Nested relations\n * - \"*, items:RelatedTable(*)\" -> Aliased relation\n * - \"aliasName:columnName\" -> Aliased column\n */\n\nimport type { ParsedSelect, SelectColumn, SelectRelation } from \"../core/types\";\n\n/**\n * Tokenize a string at the top level, respecting parentheses nesting.\n * Splits by comma but keeps nested parentheses intact.\n *\n * @example\n * tokenizeTopLevel(\"id, name, Parent(*, Child(name))\")\n * // Returns: [\"id\", \"name\", \"Parent(*, Child(name))\"]\n */\nfunction tokenizeTopLevel(input: string): string[] {\n const tokens: string[] = [];\n let current = \"\";\n let depth = 0;\n for (const char of input) {\n if (char === \"(\") {\n depth++;\n current += char;\n } else if (char === \")\") {\n depth--;\n current += char;\n } else if (char === \",\" && depth === 0) {\n const trimmed = current.trim();\n if (trimmed) {\n tokens.push(trimmed);\n }\n current = \"\";\n } else {\n current += char;\n }\n }\n\n // Add the last token\n const trimmed = current.trim();\n if (trimmed) {\n tokens.push(trimmed);\n }\n return tokens;\n}\n\n/**\n * Parse a single column token that may have an alias.\n *\n * @example\n * parseColumnToken(\"aliasName:columnName\") -> { name: \"columnName\", alias: \"aliasName\" }\n * parseColumnToken(\"columnName\") -> { name: \"columnName\" }\n */\nfunction parseColumnToken(token: string): SelectColumn {\n // Check for alias format: alias:column\n const aliasMatch = token.match(/^(\\w+):(\\w+)$/);\n if (aliasMatch) {\n return {\n name: aliasMatch[2],\n alias: aliasMatch[1]\n };\n }\n return {\n name: token\n };\n}\n\n/**\n * Parse a Supabase PostgREST select string into an AST.\n *\n * @param select - The select string (e.g., \"*, RelatedTable(*)\")\n * @returns Parsed select AST\n *\n * @example\n * parseSelect(\"*\")\n * // Returns: { columns: \"*\", relations: [] }\n *\n * parseSelect(\"id, name, status\")\n * // Returns: {\n * // columns: [{ name: \"id\" }, { name: \"name\" }, { name: \"status\" }],\n * // relations: []\n * // }\n *\n * parseSelect(\"*, EquipmentFixture(*)\")\n * // Returns: {\n * // columns: \"*\",\n * // relations: [{ name: \"EquipmentFixture\", columns: \"*\", relations: [] }]\n * // }\n *\n * parseSelect(\"id, name, ProjectDatabase(name, Organization(*))\")\n * // Returns: {\n * // columns: [{ name: \"id\" }, { name: \"name\" }],\n * // relations: [{\n * // name: \"ProjectDatabase\",\n * // columns: [{ name: \"name\" }],\n * // relations: [{ name: \"Organization\", columns: \"*\", relations: [] }]\n * // }]\n * // }\n */\nexport function parseSelect(select: string): ParsedSelect {\n const trimmed = select.trim();\n\n // Handle simple wildcard\n if (trimmed === \"*\") {\n return {\n columns: \"*\",\n relations: []\n };\n }\n\n // Handle empty string\n if (!trimmed) {\n return {\n columns: \"*\",\n relations: []\n };\n }\n const result: ParsedSelect = {\n columns: [],\n relations: []\n };\n\n // Tokenize at top level (respecting parentheses)\n const tokens = tokenizeTopLevel(trimmed);\n for (const token of tokens) {\n const trimmedToken = token.trim();\n if (!trimmedToken) {\n continue;\n }\n\n // Check if it's a relation: Name(...) or alias:Name(...)\n // Regex: optional alias followed by table name and parentheses with content\n const relationMatch = trimmedToken.match(/^(?:(\\w+):)?(\\w+)\\((.+)\\)$/);\n if (relationMatch) {\n const alias = relationMatch[1];\n const name = relationMatch[2];\n const innerSelect = relationMatch[3];\n\n // Recursively parse inner select\n const innerParsed = parseSelect(innerSelect);\n result.relations.push({\n name,\n alias,\n columns: innerParsed.columns,\n relations: innerParsed.relations\n });\n } else if (trimmedToken === \"*\") {\n // Wildcard - all columns\n result.columns = \"*\";\n } else {\n // It's a column, possibly with alias\n const column = parseColumnToken(trimmedToken);\n\n // Only add to columns array if we haven't set \"*\" already\n if (result.columns !== \"*\") {\n (result.columns as SelectColumn[]).push(column);\n }\n }\n }\n\n // If no explicit columns were added but we have relations, default to \"*\"\n if (Array.isArray(result.columns) && result.columns.length === 0) {\n result.columns = \"*\";\n }\n return result;\n}\n\n/**\n * Convert a parsed select back to a string representation (for debugging)\n */\nexport function stringifySelect(parsed: ParsedSelect): string {\n const parts: string[] = [];\n\n // Add columns\n if (parsed.columns === \"*\") {\n parts.push(\"*\");\n } else {\n for (const col of parsed.columns) {\n if (col.alias) {\n parts.push(`${col.alias}:${col.name}`);\n } else {\n parts.push(col.name);\n }\n }\n }\n\n // Add relations\n for (const rel of parsed.relations) {\n const innerStr = stringifySelect({\n columns: rel.columns,\n relations: rel.relations\n });\n if (rel.alias) {\n parts.push(`${rel.alias}:${rel.name}(${innerStr})`);\n } else {\n parts.push(`${rel.name}(${innerStr})`);\n }\n }\n return parts.join(\", \");\n}\n\n/**\n * Extract all column names from a parsed select (for building SQL queries)\n * Does not include relation names.\n */\nexport function extractColumnNames(parsed: ParsedSelect): string[] | \"*\" {\n if (parsed.columns === \"*\") {\n return \"*\";\n }\n return parsed.columns.map(col => col.name);\n}\n\n/**\n * Extract all relation names from a parsed select\n */\nexport function extractRelationNames(parsed: ParsedSelect): string[] {\n return parsed.relations.map(rel => rel.alias ?? rel.name);\n}\n\n/**\n * Check if a select string references a specific relation\n */\nexport function hasRelation(parsed: ParsedSelect, relationName: string): boolean {\n return parsed.relations.some(rel => rel.name === relationName || rel.alias === relationName);\n}\n\n/**\n * Get the select configuration for a specific relation\n */\nexport function getRelationSelect(parsed: ParsedSelect, relationName: string): SelectRelation | undefined {\n return parsed.relations.find(rel => rel.name === relationName || rel.alias === relationName);\n}\n\n// Export the helper function for testing\nexport { tokenizeTopLevel };","/**\n * Relationship Resolver\n *\n * Looks up relationships between tables from the database schema.\n * Used to determine how to join related data in queries.\n */\n\nimport type { DatabaseSchema, TableSchema, RelationshipInfo, RelationshipType, ResolvedRelationship } from \"../core/types\";\n\n/**\n * Resolves relationships between tables using the database schema.\n *\n * Given a table and a relation name (which could be another table),\n * this class determines:\n * 1. Whether a relationship exists\n * 2. The type of relationship (one-to-many or many-to-one)\n * 3. Which columns are used for the join\n */\nexport class RelationshipResolver {\n constructor(private schema: DatabaseSchema) {}\n\n /**\n * Resolve a relationship from one table to another.\n *\n * This handles both:\n * - Forward relationships: This table has a FK to the related table (many-to-one)\n * - Reverse relationships: Related table has a FK to this table (one-to-many)\n *\n * @param fromTable - The table we're querying from\n * @param relationName - The name of the related table\n * @returns The resolved relationship or null if not found\n *\n * @example\n * // Forward relationship (many-to-one)\n * // EquipmentUnit.projectDatabaseId -> ProjectDatabase.id\n * resolver.resolve(\"EquipmentUnit\", \"ProjectDatabase\")\n * // Returns: {\n * // type: \"many-to-one\",\n * // fromTable: \"EquipmentUnit\",\n * // toTable: \"ProjectDatabase\",\n * // foreignKey: \"projectDatabaseId\",\n * // referencedColumn: \"id\"\n * // }\n *\n * @example\n * // Reverse relationship (one-to-many)\n * // EquipmentUnit <- EquipmentFixture.equipmentUnitId\n * resolver.resolve(\"EquipmentUnit\", \"EquipmentFixture\")\n * // Returns: {\n * // type: \"one-to-many\",\n * // fromTable: \"EquipmentUnit\",\n * // toTable: \"EquipmentFixture\",\n * // foreignKey: \"equipmentUnitId\",\n * // referencedColumn: \"id\"\n * // }\n */\n resolve(fromTable: string, relationName: string): ResolvedRelationship | null {\n const tableSchema = this.getTableSchema(fromTable);\n if (!tableSchema) {\n return null;\n }\n\n // Check forward relationships (this table has the FK)\n // e.g., EquipmentUnit.projectDatabaseId -> ProjectDatabase\n for (const rel of tableSchema.relationships) {\n if (rel.referencedTable === relationName) {\n return {\n type: \"many-to-one\",\n fromTable,\n toTable: relationName,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n };\n }\n }\n\n // Check reverse relationships (other table has FK to this table)\n // e.g., EquipmentUnit <- EquipmentFixture.equipmentUnitId\n const relatedTableSchema = this.getTableSchema(relationName);\n if (relatedTableSchema) {\n for (const rel of relatedTableSchema.relationships) {\n if (rel.referencedTable === fromTable) {\n return {\n type: \"one-to-many\",\n fromTable,\n toTable: relationName,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n };\n }\n }\n }\n return null;\n }\n\n /**\n * Get all forward relationships for a table (many-to-one).\n * These are relationships where this table has a foreign key.\n */\n getForwardRelationships(tableName: string): ResolvedRelationship[] {\n const tableSchema = this.getTableSchema(tableName);\n if (!tableSchema) {\n return [];\n }\n return tableSchema.relationships.map(rel => ({\n type: \"many-to-one\" as RelationshipType,\n fromTable: tableName,\n toTable: rel.referencedTable,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n }));\n }\n\n /**\n * Get all reverse relationships for a table (one-to-many).\n * These are relationships where other tables have FKs pointing to this table.\n */\n getReverseRelationships(tableName: string): ResolvedRelationship[] {\n const results: ResolvedRelationship[] = [];\n\n // Search all tables for FKs pointing to this table\n for (const schemaName of Object.keys(this.schema.schemas)) {\n const schemaDefinition = this.schema.schemas[schemaName];\n if (!schemaDefinition) continue;\n for (const [otherTableName, otherTableSchema] of Object.entries(schemaDefinition.tables)) {\n if (otherTableName === tableName) continue;\n for (const rel of otherTableSchema.relationships) {\n if (rel.referencedTable === tableName) {\n results.push({\n type: \"one-to-many\",\n fromTable: tableName,\n toTable: otherTableName,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n });\n }\n }\n }\n }\n return results;\n }\n\n /**\n * Get all relationships for a table (both directions).\n */\n getAllRelationships(tableName: string): ResolvedRelationship[] {\n return [...this.getForwardRelationships(tableName), ...this.getReverseRelationships(tableName)];\n }\n\n /**\n * Check if a relationship exists between two tables.\n */\n hasRelationship(fromTable: string, toTable: string): boolean {\n return this.resolve(fromTable, toTable) !== null;\n }\n\n /**\n * Get the table schema from the database schema.\n * Searches across all schema namespaces (public, core, etc.).\n */\n getTableSchema(tableName: string): TableSchema | null {\n // Check each schema namespace\n for (const schemaName of Object.keys(this.schema.schemas)) {\n const schemaDefinition = this.schema.schemas[schemaName];\n if (!schemaDefinition) continue;\n\n // Check tables\n if (schemaDefinition.tables[tableName]) {\n return schemaDefinition.tables[tableName];\n }\n\n // Check views\n if (schemaDefinition.views && schemaDefinition.views[tableName]) {\n return schemaDefinition.views[tableName];\n }\n }\n return null;\n }\n\n /**\n * Get the primary key column for a table.\n * Defaults to \"id\" if not explicitly found.\n */\n getPrimaryKey(tableName: string): string {\n const tableSchema = this.getTableSchema(tableName);\n if (!tableSchema) {\n return \"id\";\n }\n\n // Look for an 'id' column (most common case)\n const idColumn = tableSchema.columns.find(col => col.name === \"id\");\n if (idColumn) {\n return \"id\";\n }\n\n // Fall back to first column (usually the primary key)\n if (tableSchema.columns.length > 0) {\n return tableSchema.columns[0].name;\n }\n return \"id\";\n }\n\n /**\n * Get all column names for a table.\n */\n getColumnNames(tableName: string): string[] {\n const tableSchema = this.getTableSchema(tableName);\n if (!tableSchema) {\n return [];\n }\n return tableSchema.columns.map(col => col.name);\n }\n\n /**\n * Check if a table exists in the schema.\n */\n hasTable(tableName: string): boolean {\n return this.getTableSchema(tableName) !== null;\n }\n\n /**\n * Get all table names in the schema.\n */\n getAllTableNames(): string[] {\n const tables: string[] = [];\n for (const schemaName of Object.keys(this.schema.schemas)) {\n const schemaDefinition = this.schema.schemas[schemaName];\n if (!schemaDefinition) continue;\n tables.push(...Object.keys(schemaDefinition.tables));\n }\n return tables;\n }\n}\n\n/**\n * Create a relationship resolver instance.\n * Convenience function for creating a resolver.\n */\nexport function createRelationshipResolver(schema: DatabaseSchema): RelationshipResolver {\n return new RelationshipResolver(schema);\n}","/**\n * SQL Builder\n *\n * Builds SQLite queries from parsed select statements and query options.\n * Produces parameterized queries for safe execution against PowerSync's local SQLite.\n *\n * Note: SQLite uses double quotes for identifiers (table/column names).\n * This builder only creates queries for single tables - relations are queried\n * separately and joined in code.\n */\n\nimport type { BuiltQuery, SelectColumn, WhereClause, WhereOperators, OrderBy } from \"../core/types\";\n\n/**\n * Check if a value is a where operator object\n */\nfunction isWhereOperator(value: unknown): value is WhereOperators {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const obj = value as Record<string, unknown>;\n return \"in\" in obj || \"gt\" in obj || \"gte\" in obj || \"lt\" in obj || \"lte\" in obj || \"like\" in obj || \"is\" in obj || \"neq\" in obj || \"notIn\" in obj;\n}\n\n/**\n * SQLite query builder.\n * Creates parameterized SQL queries for local SQLite execution.\n */\nexport class SQLBuilder {\n /**\n * Build a SELECT query for a single table.\n *\n * @param table - Table name\n * @param columns - Columns to select (\"*\" or array of column definitions)\n * @param options - Query options (where, orderBy, limit, offset)\n * @returns Built query with SQL and parameters\n *\n * @example\n * const builder = new SQLBuilder();\n * const query = builder.build(\"EquipmentUnit\", \"*\", {\n * where: { status: \"active\", projectDatabaseId: 123 },\n * orderBy: [{ field: \"name\", direction: \"asc\" }],\n * limit: 10\n * });\n * // query.sql: SELECT * FROM \"EquipmentUnit\" WHERE \"status\" = ? AND \"projectDatabaseId\" = ? ORDER BY \"name\" ASC LIMIT ?\n * // query.params: [\"active\", 123, 10]\n */\n build(table: string, columns: \"*\" | SelectColumn[], options: {\n where?: WhereClause;\n orderBy?: OrderBy[];\n limit?: number;\n offset?: number;\n } = {}): BuiltQuery {\n const params: (string | number | boolean | null)[] = [];\n\n // Build SELECT clause\n let columnList: string;\n if (columns === \"*\") {\n columnList = \"*\";\n } else if (columns.length === 0) {\n columnList = \"*\";\n } else {\n columnList = columns.map(c => {\n if (c.alias) {\n return `\"${c.name}\" AS \"${c.alias}\"`;\n }\n return `\"${c.name}\"`;\n }).join(\", \");\n }\n let sql = `SELECT ${columnList} FROM \"${table}\"`;\n\n // Build WHERE clause\n if (options.where && Object.keys(options.where).length > 0) {\n const whereClauses: string[] = [];\n for (const [field, value] of Object.entries(options.where)) {\n if (value === null) {\n // Direct null check\n whereClauses.push(`\"${field}\" IS NULL`);\n } else if (isWhereOperator(value)) {\n // Handle operator objects\n const operatorClauses = this.buildOperatorClauses(field, value, params);\n whereClauses.push(...operatorClauses);\n } else {\n // Simple equality\n whereClauses.push(`\"${field}\" = ?`);\n params.push(value as string | number | boolean);\n }\n }\n if (whereClauses.length > 0) {\n sql += ` WHERE ${whereClauses.join(\" AND \")}`;\n }\n }\n\n // Build ORDER BY clause\n if (options.orderBy && options.orderBy.length > 0) {\n const orderClauses = options.orderBy.map(o => `\"${o.field}\" ${o.direction.toUpperCase()}`);\n sql += ` ORDER BY ${orderClauses.join(\", \")}`;\n }\n\n // Build LIMIT clause\n if (options.limit !== undefined) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n\n // Build OFFSET clause\n if (options.offset !== undefined) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n return {\n sql,\n params\n };\n }\n\n /**\n * Build WHERE clauses from operator objects.\n */\n private buildOperatorClauses(field: string, operators: WhereOperators, params: (string | number | boolean | null)[]): string[] {\n const clauses: string[] = [];\n if (\"in\" in operators && operators.in !== undefined) {\n if (operators.in.length === 0) {\n // Empty IN clause - always false\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = operators.in.map(() => \"?\").join(\", \");\n clauses.push(`\"${field}\" IN (${placeholders})`);\n params.push(...operators.in);\n }\n }\n if (\"notIn\" in operators && operators.notIn !== undefined) {\n if (operators.notIn.length === 0) {\n // Empty NOT IN clause - always true, skip\n } else {\n const placeholders = operators.notIn.map(() => \"?\").join(\", \");\n clauses.push(`\"${field}\" NOT IN (${placeholders})`);\n params.push(...operators.notIn);\n }\n }\n if (\"gt\" in operators && operators.gt !== undefined) {\n clauses.push(`\"${field}\" > ?`);\n params.push(operators.gt);\n }\n if (\"gte\" in operators && operators.gte !== undefined) {\n clauses.push(`\"${field}\" >= ?`);\n params.push(operators.gte);\n }\n if (\"lt\" in operators && operators.lt !== undefined) {\n clauses.push(`\"${field}\" < ?`);\n params.push(operators.lt);\n }\n if (\"lte\" in operators && operators.lte !== undefined) {\n clauses.push(`\"${field}\" <= ?`);\n params.push(operators.lte);\n }\n if (\"like\" in operators && operators.like !== undefined) {\n clauses.push(`\"${field}\" LIKE ?`);\n // Add wildcards if not already present\n const pattern = operators.like.includes(\"%\") ? operators.like : `%${operators.like}%`;\n params.push(pattern);\n }\n if (\"is\" in operators && operators.is === null) {\n clauses.push(`\"${field}\" IS NULL`);\n }\n if (\"neq\" in operators && operators.neq !== undefined) {\n if (operators.neq === null) {\n clauses.push(`\"${field}\" IS NOT NULL`);\n } else {\n clauses.push(`\"${field}\" != ?`);\n params.push(operators.neq);\n }\n }\n return clauses;\n }\n\n /**\n * Build a query to fetch related records by foreign key.\n *\n * @param table - The related table name\n * @param foreignKey - The FK column to match against\n * @param parentIds - Array of parent IDs to fetch related records for\n * @param columns - Columns to select\n * @returns Built query\n *\n * @example\n * // Fetch all EquipmentFixtures for given EquipmentUnit IDs\n * const query = builder.buildRelationQuery(\n * \"EquipmentFixture\",\n * \"equipmentUnitId\",\n * [\"uuid-1\", \"uuid-2\"],\n * \"*\"\n * );\n * // query.sql: SELECT * FROM \"EquipmentFixture\" WHERE \"equipmentUnitId\" IN (?, ?)\n * // query.params: [\"uuid-1\", \"uuid-2\"]\n */\n buildRelationQuery(table: string, foreignKey: string, parentIds: (string | number)[], columns: \"*\" | SelectColumn[]): BuiltQuery {\n // Handle empty parent IDs\n if (parentIds.length === 0) {\n return {\n sql: `SELECT ${columns === \"*\" ? \"*\" : this.buildColumnList(columns, foreignKey)} FROM \"${table}\" WHERE 1 = 0`,\n params: []\n };\n }\n\n // Build column list, ensuring FK is included for joining\n let columnList: string;\n if (columns === \"*\") {\n columnList = \"*\";\n } else {\n columnList = this.buildColumnList(columns, foreignKey);\n }\n const placeholders = parentIds.map(() => \"?\").join(\", \");\n const sql = `SELECT ${columnList} FROM \"${table}\" WHERE \"${foreignKey}\" IN (${placeholders})`;\n return {\n sql,\n params: [...parentIds]\n };\n }\n\n /**\n * Build column list ensuring the foreign key is included.\n */\n private buildColumnList(columns: SelectColumn[], foreignKey: string): string {\n const colNames = columns.map(c => c.name);\n\n // Always include the foreign key for joining\n const columnList = columns.map(c => {\n if (c.alias) {\n return `\"${c.name}\" AS \"${c.alias}\"`;\n }\n return `\"${c.name}\"`;\n });\n\n // Add FK if not already present\n if (!colNames.includes(foreignKey)) {\n columnList.unshift(`\"${foreignKey}\"`);\n }\n return columnList.join(\", \");\n }\n\n /**\n * Build a SELECT query for a single record by ID.\n *\n * @param table - Table name\n * @param id - Record ID\n * @param columns - Columns to select\n * @param idColumn - Name of the ID column (defaults to \"id\")\n * @returns Built query\n */\n buildByIdQuery(table: string, id: string | number, columns: \"*\" | SelectColumn[] = \"*\", idColumn: string = \"id\"): BuiltQuery {\n let columnList: string;\n if (columns === \"*\") {\n columnList = \"*\";\n } else if (columns.length === 0) {\n columnList = \"*\";\n } else {\n columnList = columns.map(c => c.alias ? `\"${c.name}\" AS \"${c.alias}\"` : `\"${c.name}\"`).join(\", \");\n }\n const sql = `SELECT ${columnList} FROM \"${table}\" WHERE \"${idColumn}\" = ? LIMIT 1`;\n return {\n sql,\n params: [id]\n };\n }\n\n /**\n * Build an INSERT query.\n *\n * @param table - Table name\n * @param data - Record data to insert\n * @returns Built query\n */\n buildInsertQuery(table: string, data: Record<string, unknown>): BuiltQuery {\n const columns = Object.keys(data).filter(k => data[k] !== undefined);\n const values = columns.map(k => data[k]);\n if (columns.length === 0) {\n throw new Error(\"Cannot insert empty record\");\n }\n const columnList = columns.map(c => `\"${c}\"`).join(\", \");\n const placeholders = columns.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${table}\" (${columnList}) VALUES (${placeholders})`;\n return {\n sql,\n params: values as (string | number | boolean | null)[]\n };\n }\n\n /**\n * Build an UPDATE query.\n *\n * @param table - Table name\n * @param id - Record ID\n * @param data - Fields to update\n * @param idColumn - Name of the ID column (defaults to \"id\")\n * @returns Built query\n */\n buildUpdateQuery(table: string, id: string | number, data: Record<string, unknown>, idColumn: string = \"id\"): BuiltQuery {\n const columns = Object.keys(data).filter(k => k !== idColumn && data[k] !== undefined);\n if (columns.length === 0) {\n throw new Error(\"No fields to update\");\n }\n const setClauses = columns.map(c => `\"${c}\" = ?`).join(\", \");\n const values = columns.map(k => data[k]);\n const sql = `UPDATE \"${table}\" SET ${setClauses} WHERE \"${idColumn}\" = ?`;\n return {\n sql,\n params: [...(values as (string | number | boolean | null)[]), id]\n };\n }\n\n /**\n * Build a DELETE query.\n *\n * @param table - Table name\n * @param id - Record ID\n * @param idColumn - Name of the ID column (defaults to \"id\")\n * @returns Built query\n */\n buildDeleteQuery(table: string, id: string | number, idColumn: string = \"id\"): BuiltQuery {\n const sql = `DELETE FROM \"${table}\" WHERE \"${idColumn}\" = ?`;\n return {\n sql,\n params: [id]\n };\n }\n\n /**\n * Build an UPSERT query (INSERT OR REPLACE).\n *\n * @param table - Table name\n * @param data - Record data to upsert\n * @param idColumn - Name of the ID column (defaults to \"id\")\n * @returns Built query\n */\n buildUpsertQuery(table: string, data: Record<string, unknown>, idColumn: string = \"id\"): BuiltQuery {\n const columns = Object.keys(data).filter(k => data[k] !== undefined);\n const values = columns.map(k => data[k]);\n if (columns.length === 0) {\n throw new Error(\"Cannot upsert empty record\");\n }\n const columnList = columns.map(c => `\"${c}\"`).join(\", \");\n const placeholders = columns.map(() => \"?\").join(\", \");\n\n // SQLite INSERT OR REPLACE - replaces entire row on primary key conflict\n const sql = `INSERT OR REPLACE INTO \"${table}\" (${columnList}) VALUES (${placeholders})`;\n return {\n sql,\n params: values as (string | number | boolean | null)[]\n };\n }\n\n /**\n * Build a COUNT query.\n *\n * @param table - Table name\n * @param where - Optional where clause\n * @returns Built query\n */\n buildCountQuery(table: string, where?: WhereClause): BuiltQuery {\n const params: (string | number | boolean | null)[] = [];\n let sql = `SELECT COUNT(*) as count FROM \"${table}\"`;\n if (where && Object.keys(where).length > 0) {\n const whereClauses: string[] = [];\n for (const [field, value] of Object.entries(where)) {\n if (value === null) {\n whereClauses.push(`\"${field}\" IS NULL`);\n } else if (isWhereOperator(value)) {\n const operatorClauses = this.buildOperatorClauses(field, value, params);\n whereClauses.push(...operatorClauses);\n } else {\n whereClauses.push(`\"${field}\" = ?`);\n params.push(value as string | number | boolean);\n }\n }\n if (whereClauses.length > 0) {\n sql += ` WHERE ${whereClauses.join(\" AND \")}`;\n }\n }\n return {\n sql,\n params\n };\n }\n}\n\n/**\n * Create a new SQL builder instance.\n */\nexport function createSQLBuilder(): SQLBuilder {\n return new SQLBuilder();\n}","/**\n * Result Joiner\n *\n * After querying the base table and related tables separately,\n * this module joins them into a nested structure matching Supabase's format.\n */\n\nimport type { ResolvedRelationship } from \"../core/types\";\n\n/**\n * Data about a relation to be joined onto base records.\n */\nexport interface RelationJoinData {\n records: Record<string, unknown>[];\n relationship: ResolvedRelationship;\n nestedRelations: Map<string, RelationJoinData>;\n}\n\n/**\n * Result joiner for combining base records with related data.\n *\n * This class handles joining related data onto base records after\n * separate queries have been executed. It supports:\n * - One-to-many relationships (base gets array of related)\n * - Many-to-one relationships (base gets single related object or null)\n * - Nested relationships (recursive joining)\n */\nexport class ResultJoiner {\n /**\n * Join related data onto base records.\n *\n * @param baseRecords - The base table records\n * @param relatedRecords - Records from the related table\n * @param relationship - The relationship definition\n * @param relationName - The property name to use for the relation\n * @returns Base records with related data attached\n *\n * @example\n * // One-to-many: EquipmentUnit -> EquipmentFixture[]\n * const joiner = new ResultJoiner();\n * const result = joiner.join(\n * equipmentUnits,\n * equipmentFixtures,\n * { type: \"one-to-many\", foreignKey: \"equipmentUnitId\", referencedColumn: \"id\", ... },\n * \"EquipmentFixture\"\n * );\n * // Each equipmentUnit now has EquipmentFixture: [...]\n *\n * @example\n * // Many-to-one: EquipmentUnit -> ProjectDatabase\n * const result = joiner.join(\n * equipmentUnits,\n * projectDatabases,\n * { type: \"many-to-one\", foreignKey: \"projectDatabaseId\", referencedColumn: \"id\", ... },\n * \"ProjectDatabase\"\n * );\n * // Each equipmentUnit now has ProjectDatabase: {...} or null\n */\n join<T extends Record<string, unknown>>(baseRecords: T[], relatedRecords: Record<string, unknown>[], relationship: ResolvedRelationship, relationName: string): T[] {\n if (baseRecords.length === 0) {\n return baseRecords;\n }\n if (relationship.type === \"one-to-many\") {\n // Each base record gets an array of related records\n // The related table has a FK pointing to the base table\n // e.g., EquipmentFixture.equipmentUnitId -> EquipmentUnit.id\n\n // Pre-index related records by FK - O(m)\n const groupedByFK = new Map<unknown, Record<string, unknown>[]>();\n for (const r of relatedRecords) {\n const fkValue = r[relationship.foreignKey];\n if (!groupedByFK.has(fkValue)) groupedByFK.set(fkValue, []);\n groupedByFK.get(fkValue)!.push(r);\n }\n\n // Join in O(n) - mutate in place since records are already copies\n for (const base of baseRecords) {\n const baseId = base[relationship.referencedColumn];\n (base as Record<string, unknown>)[relationName] = groupedByFK.get(baseId) ?? [];\n }\n return baseRecords;\n } else {\n // Many-to-one: Each base record gets a single related object or null\n // The base table has a FK pointing to the related table\n // e.g., EquipmentUnit.projectDatabaseId -> ProjectDatabase.id\n\n // Build a lookup map for faster joining\n const relatedMap = new Map<unknown, Record<string, unknown>>();\n for (const r of relatedRecords) {\n const refValue = r[relationship.referencedColumn];\n if (refValue !== null && refValue !== undefined) {\n relatedMap.set(refValue, r);\n }\n }\n\n // Join in O(n) - mutate in place since records are already copies\n for (const base of baseRecords) {\n const fkValue = base[relationship.foreignKey];\n (base as Record<string, unknown>)[relationName] = fkValue != null ? relatedMap.get(fkValue) ?? null : null;\n }\n return baseRecords;\n }\n }\n\n /**\n * Recursively join nested relations onto records.\n *\n * @param baseRecords - The base records\n * @param relationData - Map of relation names to join data\n * @returns Base records with all nested relations attached\n *\n * @example\n * // Join EquipmentFixture and ProjectDatabase onto EquipmentUnit\n * // where EquipmentFixture has its own nested Organization relation\n * const result = joiner.joinNested(equipmentUnits, new Map([\n * [\"EquipmentFixture\", {\n * records: fixtures,\n * relationship: { type: \"one-to-many\", ... },\n * nestedRelations: new Map()\n * }],\n * [\"ProjectDatabase\", {\n * records: projects,\n * relationship: { type: \"many-to-one\", ... },\n * nestedRelations: new Map([\n * [\"Organization\", { records: orgs, relationship: ..., nestedRelations: new Map() }]\n * ])\n * }]\n * ]));\n */\n joinNested<T extends Record<string, unknown>>(baseRecords: T[], relationData: Map<string, RelationJoinData>): T[] {\n let result = [...baseRecords];\n const entries = Array.from(relationData.entries());\n for (const [relationName, data] of entries) {\n // First, recursively join nested relations onto the related records\n let relatedRecords = data.records;\n if (data.nestedRelations.size > 0) {\n relatedRecords = this.joinNested(relatedRecords, data.nestedRelations);\n }\n\n // Then join the related records onto the base records\n result = this.join(result, relatedRecords, data.relationship, relationName);\n }\n return result;\n }\n\n /**\n * Group records by a key field.\n * Useful for preparing data before joining.\n *\n * @param records - Records to group\n * @param keyField - Field to group by\n * @returns Map of key values to arrays of records\n */\n groupBy<T extends Record<string, unknown>>(records: T[], keyField: string): Map<unknown, T[]> {\n const groups = new Map<unknown, T[]>();\n for (const record of records) {\n const key = record[keyField];\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(record);\n }\n return groups;\n }\n\n /**\n * Index records by a unique key field.\n * Useful for many-to-one lookups.\n *\n * @param records - Records to index\n * @param keyField - Field to index by (should be unique)\n * @returns Map of key values to single records\n */\n indexBy<T extends Record<string, unknown>>(records: T[], keyField: string): Map<unknown, T> {\n const index = new Map<unknown, T>();\n for (const record of records) {\n const key = record[keyField];\n if (key !== null && key !== undefined) {\n index.set(key, record);\n }\n }\n return index;\n }\n\n /**\n * Extract unique values for a field from records.\n * Useful for building IN clauses for related queries.\n *\n * @param records - Records to extract from\n * @param field - Field to extract\n * @returns Array of unique non-null values\n */\n extractUniqueValues<T extends Record<string, unknown>>(records: T[], field: string): (string | number)[] {\n const values = new Set<string | number>();\n for (const record of records) {\n const value = record[field];\n if (value !== null && value !== undefined) {\n values.add(value as string | number);\n }\n }\n return Array.from(values);\n }\n\n /**\n * Remove a relation property from records (for cleanup).\n *\n * @param records - Records to process\n * @param relationName - Relation property to remove\n * @returns Records without the specified property\n */\n removeRelation<T extends Record<string, unknown>>(records: T[], relationName: string): Omit<T, typeof relationName>[] {\n return records.map(record => {\n const {\n [relationName]: _removed,\n ...rest\n } = record;\n return rest as Omit<T, typeof relationName>;\n });\n }\n\n /**\n * Flatten a nested relation into the parent record.\n * Useful for flattening many-to-one relations.\n *\n * @param records - Records with nested relation\n * @param relationName - Name of the relation to flatten\n * @param prefix - Prefix for flattened field names\n * @returns Records with flattened relation fields\n */\n flattenRelation<T extends Record<string, unknown>>(records: T[], relationName: string, prefix: string = \"\"): Record<string, unknown>[] {\n return records.map(record => {\n const relation = record[relationName] as Record<string, unknown> | null;\n const {\n [relationName]: _removed,\n ...rest\n } = record;\n if (!relation) {\n return rest;\n }\n const flattenedRelation: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(relation)) {\n const fieldName = prefix ? `${prefix}_${key}` : `${relationName}_${key}`;\n flattenedRelation[fieldName] = value;\n }\n return {\n ...rest,\n ...flattenedRelation\n };\n });\n }\n}\n\n/**\n * Create a new result joiner instance.\n */\nexport function createResultJoiner(): ResultJoiner {\n return new ResultJoiner();\n}","/**\n * Query Executor\n *\n * Orchestrates the full query execution pipeline:\n * 1. Parse select string\n * 2. Build SQL queries\n * 3. Execute against PowerSync database\n * 4. Join related data\n *\n * This provides a unified interface for executing Supabase-style queries\n * against the local SQLite database via PowerSync.\n */\n\nimport type { DatabaseSchema, QueryOptions, ResolvedRelationship, SelectRelation } from \"../core/types\";\nimport { parseSelect } from \"./select-parser\";\nimport { RelationshipResolver } from \"./relationship-resolver\";\nimport { SQLBuilder } from \"./sql-builder\";\nimport { RelationJoinData, ResultJoiner } from \"./result-joiner\";\n\n/**\n * Interface for PowerSync database.\n * This matches the getAll method signature from @powersync/react-native.\n */\nexport interface PowerSyncDatabase {\n getAll<T>(sql: string, params?: unknown[]): Promise<T[]>;\n get<T>(sql: string, params?: unknown[]): Promise<T | null>;\n execute(sql: string, params?: unknown[]): Promise<{\n rowsAffected: number;\n }>;\n}\n\n/**\n * Query executor that handles the full query lifecycle.\n *\n * @example\n * const executor = new QueryExecutor(db, databaseSchema);\n *\n * // Simple query\n * const units = await executor.execute<EquipmentUnit>(\"EquipmentUnit\", {\n * where: { status: \"active\" },\n * orderBy: [{ field: \"name\", direction: \"asc\" }],\n * limit: 10\n * });\n *\n * // Query with relations\n * const unitsWithRelations = await executor.execute<EquipmentUnitWithRelations>(\n * \"EquipmentUnit\",\n * {\n * select: \"*, EquipmentFixture(*), ProjectDatabase(name, Organization(*))\",\n * where: { status: \"active\" }\n * }\n * );\n */\nexport class QueryExecutor {\n private resolver: RelationshipResolver;\n private builder: SQLBuilder;\n private joiner: ResultJoiner;\n\n /**\n * Cache for resolved relationships to avoid repeated schema lookups\n */\n private relationCache = new Map<string, ResolvedRelationship | null>();\n constructor(private db: PowerSyncDatabase, private schema: DatabaseSchema) {\n this.resolver = new RelationshipResolver(schema);\n this.builder = new SQLBuilder();\n this.joiner = new ResultJoiner();\n }\n\n /**\n * Execute a query and return results.\n *\n * @param table - The table to query\n * @param options - Query options including select, where, orderBy, limit, offset\n * @returns Array of records with relations attached\n */\n async execute<T>(table: string, options: QueryOptions = {}): Promise<T[]> {\n // Parse the select string\n const parsed = parseSelect(options.select ?? \"*\");\n\n // Build and execute base query\n const baseQuery = this.builder.build(table, parsed.columns, {\n where: options.where,\n orderBy: options.orderBy,\n limit: options.limit,\n offset: options.offset\n });\n const baseRecords = await this.db.getAll<Record<string, unknown>>(baseQuery.sql, baseQuery.params);\n\n // If no records or no relations, return early\n if (baseRecords.length === 0 || parsed.relations.length === 0) {\n return baseRecords as T[];\n }\n\n // Query and join relations\n const result = await this.queryAndJoinRelations(table, baseRecords, parsed.relations);\n return result as T[];\n }\n\n /**\n * Execute a query for a single record by ID.\n *\n * @param table - The table to query\n * @param id - The record ID\n * @param options - Query options (only select is used)\n * @returns Single record or null\n */\n async executeById<T>(table: string, id: string | number, options: Pick<QueryOptions, \"select\"> = {}): Promise<T | null> {\n const parsed = parseSelect(options.select ?? \"*\");\n const idColumn = this.resolver.getPrimaryKey(table);\n\n // Build and execute base query\n const baseQuery = this.builder.buildByIdQuery(table, id, parsed.columns, idColumn);\n const records = await this.db.getAll<Record<string, unknown>>(baseQuery.sql, baseQuery.params);\n if (records.length === 0) {\n return null;\n }\n\n // If no relations, return early\n if (parsed.relations.length === 0) {\n return records[0] as T;\n }\n\n // Query and join relations\n const result = await this.queryAndJoinRelations(table, records, parsed.relations);\n return result[0] as T;\n }\n\n /**\n * Execute a count query.\n *\n * @param table - The table to count\n * @param options - Query options (only where is used)\n * @returns Count of matching records\n */\n async count(table: string, options: Pick<QueryOptions, \"where\"> = {}): Promise<number> {\n const query = this.builder.buildCountQuery(table, options.where);\n const result = await this.db.getAll<{\n count: number;\n }>(query.sql, query.params);\n return result[0]?.count ?? 0;\n }\n\n /**\n * Insert a record.\n *\n * @param table - The table to insert into\n * @param data - The record data\n * @returns The inserted record\n */\n async insert<T>(table: string, data: Record<string, unknown>): Promise<T> {\n if (__DEV__) {\n console.log(`[QueryExecutor] insert called:`, {\n table,\n dataKeys: Object.keys(data),\n hasId: \"id\" in data\n });\n }\n const idColumn = this.resolver.getPrimaryKey(table);\n\n // Generate UUID client-side if not provided\n // PowerSync provides uuid() function in SQLite\n if (!data[idColumn]) {\n const [{\n id\n }] = await this.db.getAll<{\n id: string;\n }>(\"SELECT uuid() as id\");\n data = {\n ...data,\n [idColumn]: id\n };\n if (__DEV__) {\n console.log(`[QueryExecutor] insert generated UUID:`, {\n table,\n id\n });\n }\n }\n const query = this.builder.buildInsertQuery(table, data);\n if (__DEV__) {\n // Find the index of the id column in the params\n const columns = Object.keys(data).filter(k => data[k] !== undefined);\n const idIndex = columns.indexOf(idColumn);\n console.log(`[QueryExecutor] insert executing SQL:`, {\n table,\n sql: query.sql,\n paramCount: query.params.length,\n idColumn,\n idValue: data[idColumn],\n idParamIndex: idIndex,\n idParamValue: idIndex >= 0 ? query.params[idIndex] : \"NOT_FOUND\"\n });\n }\n await this.db.execute(query.sql, query.params);\n if (__DEV__) {\n console.log(`[QueryExecutor] insert completed:`, {\n table,\n operation: \"insert\",\n id: data[idColumn]\n });\n }\n\n // Re-fetch to get complete record with DB defaults\n const result = await this.executeById<T>(table, data[idColumn] as string);\n if (!result) {\n // Fallback to input data if re-fetch fails (shouldn't happen)\n return data as T;\n }\n return result;\n }\n\n /**\n * Update a record.\n *\n * @param table - The table to update\n * @param id - The record ID\n * @param data - The fields to update\n * @returns The updated record\n */\n async update<T>(table: string, id: string | number, data: Record<string, unknown>): Promise<T> {\n if (__DEV__) {\n console.log(`[QueryExecutor] update called:`, {\n table,\n id,\n dataKeys: Object.keys(data)\n });\n }\n const idColumn = this.resolver.getPrimaryKey(table);\n const query = this.builder.buildUpdateQuery(table, id, data, idColumn);\n if (__DEV__) {\n console.log(`[QueryExecutor] update executing SQL:`, {\n table,\n id,\n sql: query.sql,\n paramCount: query.params.length\n });\n }\n await this.db.execute(query.sql, query.params);\n if (__DEV__) {\n console.log(`[QueryExecutor] update completed:`, {\n table,\n operation: \"update\",\n id\n });\n }\n\n // Re-fetch to get complete record\n const result = await this.executeById<T>(table, id);\n if (!result) {\n // Fallback to merged data if re-fetch fails\n return {\n ...data,\n [idColumn]: id\n } as T;\n }\n return result;\n }\n\n /**\n * Upsert a record (insert or update).\n *\n * PowerSync tables are SQLite VIEWs with INSTEAD OF INSERT triggers.\n * Using INSERT OR REPLACE causes the native extension to bypass provided UUIDs\n * and generate timestamp-based IDs (e.g., \"1772167324515-7xufitksy\").\n *\n * Logic:\n * - No ID provided → generate UUID → INSERT directly\n * - ID provided → try UPDATE first, if 0 rows affected → INSERT\n *\n * @param table - The table to upsert into\n * @param data - The record data (ID optional for new records)\n * @returns The upserted record\n */\n async upsert<T>(table: string, data: Record<string, unknown>): Promise<T> {\n if (__DEV__) {\n console.log(`[QueryExecutor] upsert called:`, {\n table,\n dataKeys: Object.keys(data),\n hasId: \"id\" in data,\n idValue: data.id ?? \"none\"\n });\n }\n const idColumn = this.resolver.getPrimaryKey(table);\n let id = data[idColumn];\n\n // No ID provided → generate UUID and INSERT directly\n if (!id) {\n // NOTE: Use getAll() for consistency - db.get() throws on empty results\n const [result] = await this.db.getAll<{\n id: string;\n }>(\"SELECT uuid() as id\");\n if (!result?.id) {\n throw new Error(`Failed to generate UUID for table \"${table}\"`);\n }\n id = result.id;\n data = {\n ...data,\n [idColumn]: id\n };\n if (__DEV__) {\n console.log(`[QueryExecutor] upsert: no ID, inserting with generated UUID:`, {\n table,\n id\n });\n }\n return this.insert<T>(table, data);\n }\n\n // ID provided → check if record exists first\n // This is more reliable than checking rowsAffected for PowerSync VIEWs\n // NOTE: Use getAll() instead of get() because PowerSync SDK's get() throws on empty results\n const existsQuery = this.builder.buildByIdQuery(table, id as string | number, \"*\", idColumn);\n const existingRows = await this.db.getAll<Record<string, unknown>>(existsQuery.sql, existsQuery.params);\n const existing = existingRows.length > 0 ? existingRows[0] : null;\n if (existing) {\n // Record exists → UPDATE (creates PATCH in ps_crud)\n if (__DEV__) {\n console.log(`[QueryExecutor] upsert: record exists, performing update:`, {\n table,\n id\n });\n }\n return this.update<T>(table, id as string | number, data);\n }\n\n // Record doesn't exist → INSERT (creates PUT in ps_crud)\n // Ensure the ID is explicitly set in data\n if (!data[idColumn]) {\n data = {\n ...data,\n [idColumn]: id\n };\n }\n if (__DEV__) {\n console.log(`[QueryExecutor] upsert: record does not exist, inserting:`, {\n table,\n id\n });\n }\n return this.insert<T>(table, data);\n }\n\n /**\n * Delete a record.\n *\n * @param table - The table to delete from\n * @param id - The record ID\n */\n async delete(table: string, id: string | number): Promise<void> {\n const idColumn = this.resolver.getPrimaryKey(table);\n const query = this.builder.buildDeleteQuery(table, id, idColumn);\n await this.db.execute(query.sql, query.params);\n }\n\n /**\n * Query and join relations onto parent records.\n *\n * @param parentTable - The parent table name\n * @param parentRecords - Parent records to add relations to\n * @param relations - Relations to query and join\n * @returns Parent records with relations attached\n */\n private async queryAndJoinRelations(parentTable: string, parentRecords: Record<string, unknown>[], relations: SelectRelation[]): Promise<Record<string, unknown>[]> {\n // Pre-extract unique IDs for each column to avoid duplicate iteration\n const idCache = new Map<string, (string | number)[]>();\n const getIdsForColumn = (column: string): (string | number)[] => {\n if (!idCache.has(column)) {\n idCache.set(column, this.joiner.extractUniqueValues(parentRecords, column));\n }\n return idCache.get(column)!;\n };\n\n // Execute all sibling relation queries in parallel\n const relationResults = await Promise.all(relations.map(async relation => {\n const resolved = this.resolveRelationCached(parentTable, relation.name);\n if (!resolved) {\n console.warn(`Could not resolve relationship: ${parentTable} -> ${relation.name}`);\n return {\n relation,\n resolved: null,\n records: []\n };\n }\n const idColumn = resolved.type === \"one-to-many\" ? resolved.referencedColumn : resolved.foreignKey;\n const parentIds = getIdsForColumn(idColumn);\n if (parentIds.length === 0) {\n return {\n relation,\n resolved,\n records: []\n };\n }\n const relQuery = this.buildRelatedQuery(relation, resolved, parentIds);\n let records = await this.db.getAll<Record<string, unknown>>(relQuery.sql, relQuery.params);\n\n // Recursively handle nested relations (still parallel within each branch)\n if (relation.relations.length > 0 && records.length > 0) {\n records = await this.queryAndJoinRelations(relation.name, records, relation.relations);\n }\n return {\n relation,\n resolved,\n records\n };\n }));\n\n // Join all results onto parent records\n let result = [...parentRecords];\n for (const {\n relation,\n resolved,\n records\n } of relationResults) {\n if (!resolved) {\n result = result.map(r => ({\n ...r,\n [relation.alias ?? relation.name]: null\n }));\n continue;\n }\n if (records.length === 0) {\n result = result.map(r => ({\n ...r,\n [relation.alias ?? relation.name]: resolved.type === \"one-to-many\" ? [] : null\n }));\n continue;\n }\n result = this.joiner.join(result, records, resolved, relation.alias ?? relation.name);\n }\n return result;\n }\n\n /**\n * Get parent IDs needed for a relation query.\n */\n private getParentIdsForRelation(parentRecords: Record<string, unknown>[], resolved: ResolvedRelationship): (string | number)[] {\n let parentIds: (string | number)[];\n if (resolved.type === \"one-to-many\") {\n // For one-to-many, we need the parent's referenced column (usually id)\n parentIds = this.joiner.extractUniqueValues(parentRecords, resolved.referencedColumn);\n } else {\n // For many-to-one, we need the parent's foreign key values\n parentIds = this.joiner.extractUniqueValues(parentRecords, resolved.foreignKey);\n }\n return parentIds;\n }\n\n /**\n * Build a query for related records.\n */\n private buildRelatedQuery(relation: SelectRelation, resolved: ResolvedRelationship, parentIds: (string | number)[]): {\n sql: string;\n params: (string | number | boolean | null)[];\n } {\n // Determine which column to filter on\n const filterColumn = resolved.type === \"one-to-many\" ? resolved.foreignKey // Filter by FK in the related table\n : resolved.referencedColumn; // Filter by PK in the related table\n\n // Dedupe parent IDs\n const uniqueIds = Array.from(new Set(parentIds));\n return this.builder.buildRelationQuery(relation.name, filterColumn, uniqueIds, relation.columns);\n }\n\n /**\n * Get the relationship resolver (for advanced use).\n */\n getResolver(): RelationshipResolver {\n return this.resolver;\n }\n\n /**\n * Get the SQL builder (for advanced use).\n */\n getBuilder(): SQLBuilder {\n return this.builder;\n }\n\n /**\n * Get the result joiner (for advanced use).\n */\n getJoiner(): ResultJoiner {\n return this.joiner;\n }\n\n /**\n * Resolve a relationship with caching.\n *\n * @param fromTable - The source table\n * @param toTable - The target table/relation name\n * @returns Resolved relationship or null\n */\n private resolveRelationCached(fromTable: string, toTable: string): ResolvedRelationship | null {\n const key = `${fromTable}:${toTable}`;\n if (!this.relationCache.has(key)) {\n this.relationCache.set(key, this.resolver.resolve(fromTable, toTable));\n }\n return this.relationCache.get(key)!;\n }\n}\n\n/**\n * Create a query executor instance.\n *\n * @param db - PowerSync database instance\n * @param schema - Database schema\n * @returns QueryExecutor instance\n */\nexport function createQueryExecutor(db: PowerSyncDatabase, schema: DatabaseSchema): QueryExecutor {\n return new QueryExecutor(db, schema);\n}"],"mappings":";AAyBA,SAAS,iBAAiB,OAAyB;AACjD,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AACd,MAAI,QAAQ;AACZ,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,KAAK;AAChB;AACA,iBAAW;AAAA,IACb,WAAW,SAAS,KAAK;AACvB;AACA,iBAAW;AAAA,IACb,WAAW,SAAS,OAAO,UAAU,GAAG;AACtC,YAAMA,WAAU,QAAQ,KAAK;AAC7B,UAAIA,UAAS;AACX,eAAO,KAAKA,QAAO;AAAA,MACrB;AACA,gBAAU;AAAA,IACZ,OAAO;AACL,iBAAW;AAAA,IACb;AAAA,EACF;AAGA,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,SAAS;AACX,WAAO,KAAK,OAAO;AAAA,EACrB;AACA,SAAO;AACT;AASA,SAAS,iBAAiB,OAA6B;AAErD,QAAM,aAAa,MAAM,MAAM,eAAe;AAC9C,MAAI,YAAY;AACd,WAAO;AAAA,MACL,MAAM,WAAW,CAAC;AAAA,MAClB,OAAO,WAAW,CAAC;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;AAkCO,SAAS,YAAY,QAA8B;AACxD,QAAM,UAAU,OAAO,KAAK;AAG5B,MAAI,YAAY,KAAK;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAGA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AACA,QAAM,SAAuB;AAAA,IAC3B,SAAS,CAAC;AAAA,IACV,WAAW,CAAC;AAAA,EACd;AAGA,QAAM,SAAS,iBAAiB,OAAO;AACvC,aAAW,SAAS,QAAQ;AAC1B,UAAM,eAAe,MAAM,KAAK;AAChC,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAIA,UAAM,gBAAgB,aAAa,MAAM,4BAA4B;AACrE,QAAI,eAAe;AACjB,YAAM,QAAQ,cAAc,CAAC;AAC7B,YAAM,OAAO,cAAc,CAAC;AAC5B,YAAM,cAAc,cAAc,CAAC;AAGnC,YAAM,cAAc,YAAY,WAAW;AAC3C,aAAO,UAAU,KAAK;AAAA,QACpB;AAAA,QACA;AAAA,QACA,SAAS,YAAY;AAAA,QACrB,WAAW,YAAY;AAAA,MACzB,CAAC;AAAA,IACH,WAAW,iBAAiB,KAAK;AAE/B,aAAO,UAAU;AAAA,IACnB,OAAO;AAEL,YAAM,SAAS,iBAAiB,YAAY;AAG5C,UAAI,OAAO,YAAY,KAAK;AAC1B,QAAC,OAAO,QAA2B,KAAK,MAAM;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,QAAQ,OAAO,OAAO,KAAK,OAAO,QAAQ,WAAW,GAAG;AAChE,WAAO,UAAU;AAAA,EACnB;AACA,SAAO;AACT;AAKO,SAAS,gBAAgB,QAA8B;AAC5D,QAAM,QAAkB,CAAC;AAGzB,MAAI,OAAO,YAAY,KAAK;AAC1B,UAAM,KAAK,GAAG;AAAA,EAChB,OAAO;AACL,eAAW,OAAO,OAAO,SAAS;AAChC,UAAI,IAAI,OAAO;AACb,cAAM,KAAK,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,EAAE;AAAA,MACvC,OAAO;AACL,cAAM,KAAK,IAAI,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAGA,aAAW,OAAO,OAAO,WAAW;AAClC,UAAM,WAAW,gBAAgB;AAAA,MAC/B,SAAS,IAAI;AAAA,MACb,WAAW,IAAI;AAAA,IACjB,CAAC;AACD,QAAI,IAAI,OAAO;AACb,YAAM,KAAK,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,QAAQ,GAAG;AAAA,IACpD,OAAO;AACL,YAAM,KAAK,GAAG,IAAI,IAAI,IAAI,QAAQ,GAAG;AAAA,IACvC;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,mBAAmB,QAAsC;AACvE,MAAI,OAAO,YAAY,KAAK;AAC1B,WAAO;AAAA,EACT;AACA,SAAO,OAAO,QAAQ,IAAI,SAAO,IAAI,IAAI;AAC3C;AAKO,SAAS,qBAAqB,QAAgC;AACnE,SAAO,OAAO,UAAU,IAAI,SAAO,IAAI,SAAS,IAAI,IAAI;AAC1D;AAKO,SAAS,YAAY,QAAsB,cAA+B;AAC/E,SAAO,OAAO,UAAU,KAAK,SAAO,IAAI,SAAS,gBAAgB,IAAI,UAAU,YAAY;AAC7F;AAKO,SAAS,kBAAkB,QAAsB,cAAkD;AACxG,SAAO,OAAO,UAAU,KAAK,SAAO,IAAI,SAAS,gBAAgB,IAAI,UAAU,YAAY;AAC7F;;;AC9NO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAAoB,QAAwB;AAAxB;AAAA,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqC7C,QAAQ,WAAmB,cAAmD;AAC5E,UAAM,cAAc,KAAK,eAAe,SAAS;AACjD,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAIA,eAAW,OAAO,YAAY,eAAe;AAC3C,UAAI,IAAI,oBAAoB,cAAc;AACxC,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,SAAS;AAAA,UACT,YAAY,IAAI;AAAA,UAChB,kBAAkB,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAIA,UAAM,qBAAqB,KAAK,eAAe,YAAY;AAC3D,QAAI,oBAAoB;AACtB,iBAAW,OAAO,mBAAmB,eAAe;AAClD,YAAI,IAAI,oBAAoB,WAAW;AACrC,iBAAO;AAAA,YACL,MAAM;AAAA,YACN;AAAA,YACA,SAAS;AAAA,YACT,YAAY,IAAI;AAAA,YAChB,kBAAkB,IAAI;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAwB,WAA2C;AACjE,UAAM,cAAc,KAAK,eAAe,SAAS;AACjD,QAAI,CAAC,aAAa;AAChB,aAAO,CAAC;AAAA,IACV;AACA,WAAO,YAAY,cAAc,IAAI,UAAQ;AAAA,MAC3C,MAAM;AAAA,MACN,WAAW;AAAA,MACX,SAAS,IAAI;AAAA,MACb,YAAY,IAAI;AAAA,MAChB,kBAAkB,IAAI;AAAA,IACxB,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAwB,WAA2C;AACjE,UAAM,UAAkC,CAAC;AAGzC,eAAW,cAAc,OAAO,KAAK,KAAK,OAAO,OAAO,GAAG;AACzD,YAAM,mBAAmB,KAAK,OAAO,QAAQ,UAAU;AACvD,UAAI,CAAC,iBAAkB;AACvB,iBAAW,CAAC,gBAAgB,gBAAgB,KAAK,OAAO,QAAQ,iBAAiB,MAAM,GAAG;AACxF,YAAI,mBAAmB,UAAW;AAClC,mBAAW,OAAO,iBAAiB,eAAe;AAChD,cAAI,IAAI,oBAAoB,WAAW;AACrC,oBAAQ,KAAK;AAAA,cACX,MAAM;AAAA,cACN,WAAW;AAAA,cACX,SAAS;AAAA,cACT,YAAY,IAAI;AAAA,cAChB,kBAAkB,IAAI;AAAA,YACxB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,WAA2C;AAC7D,WAAO,CAAC,GAAG,KAAK,wBAAwB,SAAS,GAAG,GAAG,KAAK,wBAAwB,SAAS,CAAC;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,WAAmB,SAA0B;AAC3D,WAAO,KAAK,QAAQ,WAAW,OAAO,MAAM;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,WAAuC;AAEpD,eAAW,cAAc,OAAO,KAAK,KAAK,OAAO,OAAO,GAAG;AACzD,YAAM,mBAAmB,KAAK,OAAO,QAAQ,UAAU;AACvD,UAAI,CAAC,iBAAkB;AAGvB,UAAI,iBAAiB,OAAO,SAAS,GAAG;AACtC,eAAO,iBAAiB,OAAO,SAAS;AAAA,MAC1C;AAGA,UAAI,iBAAiB,SAAS,iBAAiB,MAAM,SAAS,GAAG;AAC/D,eAAO,iBAAiB,MAAM,SAAS;AAAA,MACzC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,WAA2B;AACvC,UAAM,cAAc,KAAK,eAAe,SAAS;AACjD,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAGA,UAAM,WAAW,YAAY,QAAQ,KAAK,SAAO,IAAI,SAAS,IAAI;AAClE,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,YAAY,QAAQ,SAAS,GAAG;AAClC,aAAO,YAAY,QAAQ,CAAC,EAAE;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,WAA6B;AAC1C,UAAM,cAAc,KAAK,eAAe,SAAS;AACjD,QAAI,CAAC,aAAa;AAChB,aAAO,CAAC;AAAA,IACV;AACA,WAAO,YAAY,QAAQ,IAAI,SAAO,IAAI,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,WAA4B;AACnC,WAAO,KAAK,eAAe,SAAS,MAAM;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA6B;AAC3B,UAAM,SAAmB,CAAC;AAC1B,eAAW,cAAc,OAAO,KAAK,KAAK,OAAO,OAAO,GAAG;AACzD,YAAM,mBAAmB,KAAK,OAAO,QAAQ,UAAU;AACvD,UAAI,CAAC,iBAAkB;AACvB,aAAO,KAAK,GAAG,OAAO,KAAK,iBAAiB,MAAM,CAAC;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AACF;AAMO,SAAS,2BAA2B,QAA8C;AACvF,SAAO,IAAI,qBAAqB,MAAM;AACxC;;;AChOA,SAAS,gBAAgB,OAAyC;AAChE,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,MAAM;AACZ,SAAO,QAAQ,OAAO,QAAQ,OAAO,SAAS,OAAO,QAAQ,OAAO,SAAS,OAAO,UAAU,OAAO,QAAQ,OAAO,SAAS,OAAO,WAAW;AACjJ;AAMO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBtB,MAAM,OAAe,SAA+B,UAKhD,CAAC,GAAe;AAClB,UAAM,SAA+C,CAAC;AAGtD,QAAI;AACJ,QAAI,YAAY,KAAK;AACnB,mBAAa;AAAA,IACf,WAAW,QAAQ,WAAW,GAAG;AAC/B,mBAAa;AAAA,IACf,OAAO;AACL,mBAAa,QAAQ,IAAI,OAAK;AAC5B,YAAI,EAAE,OAAO;AACX,iBAAO,IAAI,EAAE,IAAI,SAAS,EAAE,KAAK;AAAA,QACnC;AACA,eAAO,IAAI,EAAE,IAAI;AAAA,MACnB,CAAC,EAAE,KAAK,IAAI;AAAA,IACd;AACA,QAAI,MAAM,UAAU,UAAU,UAAU,KAAK;AAG7C,QAAI,QAAQ,SAAS,OAAO,KAAK,QAAQ,KAAK,EAAE,SAAS,GAAG;AAC1D,YAAM,eAAyB,CAAC;AAChC,iBAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AAC1D,YAAI,UAAU,MAAM;AAElB,uBAAa,KAAK,IAAI,KAAK,WAAW;AAAA,QACxC,WAAW,gBAAgB,KAAK,GAAG;AAEjC,gBAAM,kBAAkB,KAAK,qBAAqB,OAAO,OAAO,MAAM;AACtE,uBAAa,KAAK,GAAG,eAAe;AAAA,QACtC,OAAO;AAEL,uBAAa,KAAK,IAAI,KAAK,OAAO;AAClC,iBAAO,KAAK,KAAkC;AAAA,QAChD;AAAA,MACF;AACA,UAAI,aAAa,SAAS,GAAG;AAC3B,eAAO,UAAU,aAAa,KAAK,OAAO,CAAC;AAAA,MAC7C;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,GAAG;AACjD,YAAM,eAAe,QAAQ,QAAQ,IAAI,OAAK,IAAI,EAAE,KAAK,KAAK,EAAE,UAAU,YAAY,CAAC,EAAE;AACzF,aAAO,aAAa,aAAa,KAAK,IAAI,CAAC;AAAA,IAC7C;AAGA,QAAI,QAAQ,UAAU,QAAW;AAC/B,aAAO;AACP,aAAO,KAAK,QAAQ,KAAK;AAAA,IAC3B;AAGA,QAAI,QAAQ,WAAW,QAAW;AAChC,aAAO;AACP,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAAe,WAA2B,QAAwD;AAC7H,UAAM,UAAoB,CAAC;AAC3B,QAAI,QAAQ,aAAa,UAAU,OAAO,QAAW;AACnD,UAAI,UAAU,GAAG,WAAW,GAAG;AAE7B,gBAAQ,KAAK,OAAO;AAAA,MACtB,OAAO;AACL,cAAM,eAAe,UAAU,GAAG,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AAC1D,gBAAQ,KAAK,IAAI,KAAK,SAAS,YAAY,GAAG;AAC9C,eAAO,KAAK,GAAG,UAAU,EAAE;AAAA,MAC7B;AAAA,IACF;AACA,QAAI,WAAW,aAAa,UAAU,UAAU,QAAW;AACzD,UAAI,UAAU,MAAM,WAAW,GAAG;AAAA,MAElC,OAAO;AACL,cAAM,eAAe,UAAU,MAAM,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AAC7D,gBAAQ,KAAK,IAAI,KAAK,aAAa,YAAY,GAAG;AAClD,eAAO,KAAK,GAAG,UAAU,KAAK;AAAA,MAChC;AAAA,IACF;AACA,QAAI,QAAQ,aAAa,UAAU,OAAO,QAAW;AACnD,cAAQ,KAAK,IAAI,KAAK,OAAO;AAC7B,aAAO,KAAK,UAAU,EAAE;AAAA,IAC1B;AACA,QAAI,SAAS,aAAa,UAAU,QAAQ,QAAW;AACrD,cAAQ,KAAK,IAAI,KAAK,QAAQ;AAC9B,aAAO,KAAK,UAAU,GAAG;AAAA,IAC3B;AACA,QAAI,QAAQ,aAAa,UAAU,OAAO,QAAW;AACnD,cAAQ,KAAK,IAAI,KAAK,OAAO;AAC7B,aAAO,KAAK,UAAU,EAAE;AAAA,IAC1B;AACA,QAAI,SAAS,aAAa,UAAU,QAAQ,QAAW;AACrD,cAAQ,KAAK,IAAI,KAAK,QAAQ;AAC9B,aAAO,KAAK,UAAU,GAAG;AAAA,IAC3B;AACA,QAAI,UAAU,aAAa,UAAU,SAAS,QAAW;AACvD,cAAQ,KAAK,IAAI,KAAK,UAAU;AAEhC,YAAM,UAAU,UAAU,KAAK,SAAS,GAAG,IAAI,UAAU,OAAO,IAAI,UAAU,IAAI;AAClF,aAAO,KAAK,OAAO;AAAA,IACrB;AACA,QAAI,QAAQ,aAAa,UAAU,OAAO,MAAM;AAC9C,cAAQ,KAAK,IAAI,KAAK,WAAW;AAAA,IACnC;AACA,QAAI,SAAS,aAAa,UAAU,QAAQ,QAAW;AACrD,UAAI,UAAU,QAAQ,MAAM;AAC1B,gBAAQ,KAAK,IAAI,KAAK,eAAe;AAAA,MACvC,OAAO;AACL,gBAAQ,KAAK,IAAI,KAAK,QAAQ;AAC9B,eAAO,KAAK,UAAU,GAAG;AAAA,MAC3B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,mBAAmB,OAAe,YAAoB,WAAgC,SAA2C;AAE/H,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO;AAAA,QACL,KAAK,UAAU,YAAY,MAAM,MAAM,KAAK,gBAAgB,SAAS,UAAU,CAAC,UAAU,KAAK;AAAA,QAC/F,QAAQ,CAAC;AAAA,MACX;AAAA,IACF;AAGA,QAAI;AACJ,QAAI,YAAY,KAAK;AACnB,mBAAa;AAAA,IACf,OAAO;AACL,mBAAa,KAAK,gBAAgB,SAAS,UAAU;AAAA,IACvD;AACA,UAAM,eAAe,UAAU,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AACvD,UAAM,MAAM,UAAU,UAAU,UAAU,KAAK,YAAY,UAAU,SAAS,YAAY;AAC1F,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,GAAG,SAAS;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,SAAyB,YAA4B;AAC3E,UAAM,WAAW,QAAQ,IAAI,OAAK,EAAE,IAAI;AAGxC,UAAM,aAAa,QAAQ,IAAI,OAAK;AAClC,UAAI,EAAE,OAAO;AACX,eAAO,IAAI,EAAE,IAAI,SAAS,EAAE,KAAK;AAAA,MACnC;AACA,aAAO,IAAI,EAAE,IAAI;AAAA,IACnB,CAAC;AAGD,QAAI,CAAC,SAAS,SAAS,UAAU,GAAG;AAClC,iBAAW,QAAQ,IAAI,UAAU,GAAG;AAAA,IACtC;AACA,WAAO,WAAW,KAAK,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,eAAe,OAAe,IAAqB,UAAgC,KAAK,WAAmB,MAAkB;AAC3H,QAAI;AACJ,QAAI,YAAY,KAAK;AACnB,mBAAa;AAAA,IACf,WAAW,QAAQ,WAAW,GAAG;AAC/B,mBAAa;AAAA,IACf,OAAO;AACL,mBAAa,QAAQ,IAAI,OAAK,EAAE,QAAQ,IAAI,EAAE,IAAI,SAAS,EAAE,KAAK,MAAM,IAAI,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI;AAAA,IAClG;AACA,UAAM,MAAM,UAAU,UAAU,UAAU,KAAK,YAAY,QAAQ;AACnE,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,EAAE;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAAiB,OAAe,MAA2C;AACzE,UAAM,UAAU,OAAO,KAAK,IAAI,EAAE,OAAO,OAAK,KAAK,CAAC,MAAM,MAAS;AACnE,UAAM,SAAS,QAAQ,IAAI,OAAK,KAAK,CAAC,CAAC;AACvC,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,UAAM,aAAa,QAAQ,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACvD,UAAM,eAAe,QAAQ,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AACrD,UAAM,MAAM,gBAAgB,KAAK,MAAM,UAAU,aAAa,YAAY;AAC1E,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,iBAAiB,OAAe,IAAqB,MAA+B,WAAmB,MAAkB;AACvH,UAAM,UAAU,OAAO,KAAK,IAAI,EAAE,OAAO,OAAK,MAAM,YAAY,KAAK,CAAC,MAAM,MAAS;AACrF,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,UAAM,aAAa,QAAQ,IAAI,OAAK,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI;AAC3D,UAAM,SAAS,QAAQ,IAAI,OAAK,KAAK,CAAC,CAAC;AACvC,UAAM,MAAM,WAAW,KAAK,SAAS,UAAU,WAAW,QAAQ;AAClE,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,GAAI,QAAiD,EAAE;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAiB,OAAe,IAAqB,WAAmB,MAAkB;AACxF,UAAM,MAAM,gBAAgB,KAAK,YAAY,QAAQ;AACrD,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,EAAE;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAiB,OAAe,MAA+B,WAAmB,MAAkB;AAClG,UAAM,UAAU,OAAO,KAAK,IAAI,EAAE,OAAO,OAAK,KAAK,CAAC,MAAM,MAAS;AACnE,UAAM,SAAS,QAAQ,IAAI,OAAK,KAAK,CAAC,CAAC;AACvC,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,UAAM,aAAa,QAAQ,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACvD,UAAM,eAAe,QAAQ,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AAGrD,UAAM,MAAM,2BAA2B,KAAK,MAAM,UAAU,aAAa,YAAY;AACrF,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAgB,OAAe,OAAiC;AAC9D,UAAM,SAA+C,CAAC;AACtD,QAAI,MAAM,kCAAkC,KAAK;AACjD,QAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AAC1C,YAAM,eAAyB,CAAC;AAChC,iBAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,YAAI,UAAU,MAAM;AAClB,uBAAa,KAAK,IAAI,KAAK,WAAW;AAAA,QACxC,WAAW,gBAAgB,KAAK,GAAG;AACjC,gBAAM,kBAAkB,KAAK,qBAAqB,OAAO,OAAO,MAAM;AACtE,uBAAa,KAAK,GAAG,eAAe;AAAA,QACtC,OAAO;AACL,uBAAa,KAAK,IAAI,KAAK,OAAO;AAClC,iBAAO,KAAK,KAAkC;AAAA,QAChD;AAAA,MACF;AACA,UAAI,aAAa,SAAS,GAAG;AAC3B,eAAO,UAAU,aAAa,KAAK,OAAO,CAAC;AAAA,MAC7C;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,mBAA+B;AAC7C,SAAO,IAAI,WAAW;AACxB;;;AC5WO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BxB,KAAwC,aAAkB,gBAA2C,cAAoC,cAA2B;AAClK,QAAI,YAAY,WAAW,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,QAAI,aAAa,SAAS,eAAe;AAMvC,YAAM,cAAc,oBAAI,IAAwC;AAChE,iBAAW,KAAK,gBAAgB;AAC9B,cAAM,UAAU,EAAE,aAAa,UAAU;AACzC,YAAI,CAAC,YAAY,IAAI,OAAO,EAAG,aAAY,IAAI,SAAS,CAAC,CAAC;AAC1D,oBAAY,IAAI,OAAO,EAAG,KAAK,CAAC;AAAA,MAClC;AAGA,iBAAW,QAAQ,aAAa;AAC9B,cAAM,SAAS,KAAK,aAAa,gBAAgB;AACjD,QAAC,KAAiC,YAAY,IAAI,YAAY,IAAI,MAAM,KAAK,CAAC;AAAA,MAChF;AACA,aAAO;AAAA,IACT,OAAO;AAML,YAAM,aAAa,oBAAI,IAAsC;AAC7D,iBAAW,KAAK,gBAAgB;AAC9B,cAAM,WAAW,EAAE,aAAa,gBAAgB;AAChD,YAAI,aAAa,QAAQ,aAAa,QAAW;AAC/C,qBAAW,IAAI,UAAU,CAAC;AAAA,QAC5B;AAAA,MACF;AAGA,iBAAW,QAAQ,aAAa;AAC9B,cAAM,UAAU,KAAK,aAAa,UAAU;AAC5C,QAAC,KAAiC,YAAY,IAAI,WAAW,OAAO,WAAW,IAAI,OAAO,KAAK,OAAO;AAAA,MACxG;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,WAA8C,aAAkB,cAAkD;AAChH,QAAI,SAAS,CAAC,GAAG,WAAW;AAC5B,UAAM,UAAU,MAAM,KAAK,aAAa,QAAQ,CAAC;AACjD,eAAW,CAAC,cAAc,IAAI,KAAK,SAAS;AAE1C,UAAI,iBAAiB,KAAK;AAC1B,UAAI,KAAK,gBAAgB,OAAO,GAAG;AACjC,yBAAiB,KAAK,WAAW,gBAAgB,KAAK,eAAe;AAAA,MACvE;AAGA,eAAS,KAAK,KAAK,QAAQ,gBAAgB,KAAK,cAAc,YAAY;AAAA,IAC5E;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAA2C,SAAc,UAAqC;AAC5F,UAAM,SAAS,oBAAI,IAAkB;AACrC,eAAW,UAAU,SAAS;AAC5B,YAAM,MAAM,OAAO,QAAQ;AAC3B,UAAI,CAAC,OAAO,IAAI,GAAG,GAAG;AACpB,eAAO,IAAI,KAAK,CAAC,CAAC;AAAA,MACpB;AACA,aAAO,IAAI,GAAG,EAAG,KAAK,MAAM;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAA2C,SAAc,UAAmC;AAC1F,UAAM,QAAQ,oBAAI,IAAgB;AAClC,eAAW,UAAU,SAAS;AAC5B,YAAM,MAAM,OAAO,QAAQ;AAC3B,UAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,cAAM,IAAI,KAAK,MAAM;AAAA,MACvB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,oBAAuD,SAAc,OAAoC;AACvG,UAAM,SAAS,oBAAI,IAAqB;AACxC,eAAW,UAAU,SAAS;AAC5B,YAAM,QAAQ,OAAO,KAAK;AAC1B,UAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,eAAO,IAAI,KAAwB;AAAA,MACrC;AAAA,IACF;AACA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAkD,SAAc,cAAsD;AACpH,WAAO,QAAQ,IAAI,YAAU;AAC3B,YAAM;AAAA,QACJ,CAAC,YAAY,GAAG;AAAA,QAChB,GAAG;AAAA,MACL,IAAI;AACJ,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,gBAAmD,SAAc,cAAsB,SAAiB,IAA+B;AACrI,WAAO,QAAQ,IAAI,YAAU;AAC3B,YAAM,WAAW,OAAO,YAAY;AACpC,YAAM;AAAA,QACJ,CAAC,YAAY,GAAG;AAAA,QAChB,GAAG;AAAA,MACL,IAAI;AACJ,UAAI,CAAC,UAAU;AACb,eAAO;AAAA,MACT;AACA,YAAM,oBAA6C,CAAC;AACpD,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,cAAM,YAAY,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK,GAAG,YAAY,IAAI,GAAG;AACtE,0BAAkB,SAAS,IAAI;AAAA,MACjC;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAKO,SAAS,qBAAmC;AACjD,SAAO,IAAI,aAAa;AAC1B;;;AC5MO,IAAM,gBAAN,MAAoB;AAAA,EASzB,YAAoB,IAA+B,QAAwB;AAAvD;AAA+B;AACjD,SAAK,WAAW,IAAI,qBAAqB,MAAM;AAC/C,SAAK,UAAU,IAAI,WAAW;AAC9B,SAAK,SAAS,IAAI,aAAa;AAAA,EACjC;AAAA,EAZQ;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,oBAAI,IAAyC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcrE,MAAM,QAAW,OAAe,UAAwB,CAAC,GAAiB;AAExE,UAAM,SAAS,YAAY,QAAQ,UAAU,GAAG;AAGhD,UAAM,YAAY,KAAK,QAAQ,MAAM,OAAO,OAAO,SAAS;AAAA,MAC1D,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,UAAM,cAAc,MAAM,KAAK,GAAG,OAAgC,UAAU,KAAK,UAAU,MAAM;AAGjG,QAAI,YAAY,WAAW,KAAK,OAAO,UAAU,WAAW,GAAG;AAC7D,aAAO;AAAA,IACT;AAGA,UAAM,SAAS,MAAM,KAAK,sBAAsB,OAAO,aAAa,OAAO,SAAS;AACpF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,YAAe,OAAe,IAAqB,UAAwC,CAAC,GAAsB;AACtH,UAAM,SAAS,YAAY,QAAQ,UAAU,GAAG;AAChD,UAAM,WAAW,KAAK,SAAS,cAAc,KAAK;AAGlD,UAAM,YAAY,KAAK,QAAQ,eAAe,OAAO,IAAI,OAAO,SAAS,QAAQ;AACjF,UAAM,UAAU,MAAM,KAAK,GAAG,OAAgC,UAAU,KAAK,UAAU,MAAM;AAC7F,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,UAAU,WAAW,GAAG;AACjC,aAAO,QAAQ,CAAC;AAAA,IAClB;AAGA,UAAM,SAAS,MAAM,KAAK,sBAAsB,OAAO,SAAS,OAAO,SAAS;AAChF,WAAO,OAAO,CAAC;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAM,OAAe,UAAuC,CAAC,GAAoB;AACrF,UAAM,QAAQ,KAAK,QAAQ,gBAAgB,OAAO,QAAQ,KAAK;AAC/D,UAAM,SAAS,MAAM,KAAK,GAAG,OAE1B,MAAM,KAAK,MAAM,MAAM;AAC1B,WAAO,OAAO,CAAC,GAAG,SAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAU,OAAe,MAA2C;AACxE,QAAI,SAAS;AACX,cAAQ,IAAI,kCAAkC;AAAA,QAC5C;AAAA,QACA,UAAU,OAAO,KAAK,IAAI;AAAA,QAC1B,OAAO,QAAQ;AAAA,MACjB,CAAC;AAAA,IACH;AACA,UAAM,WAAW,KAAK,SAAS,cAAc,KAAK;AAIlD,QAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,YAAM,CAAC;AAAA,QACL;AAAA,MACF,CAAC,IAAI,MAAM,KAAK,GAAG,OAEhB,qBAAqB;AACxB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,QAAQ,GAAG;AAAA,MACd;AACA,UAAI,SAAS;AACX,gBAAQ,IAAI,0CAA0C;AAAA,UACpD;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,QAAQ,iBAAiB,OAAO,IAAI;AACvD,QAAI,SAAS;AAEX,YAAM,UAAU,OAAO,KAAK,IAAI,EAAE,OAAO,OAAK,KAAK,CAAC,MAAM,MAAS;AACnE,YAAM,UAAU,QAAQ,QAAQ,QAAQ;AACxC,cAAQ,IAAI,yCAAyC;AAAA,QACnD;AAAA,QACA,KAAK,MAAM;AAAA,QACX,YAAY,MAAM,OAAO;AAAA,QACzB;AAAA,QACA,SAAS,KAAK,QAAQ;AAAA,QACtB,cAAc;AAAA,QACd,cAAc,WAAW,IAAI,MAAM,OAAO,OAAO,IAAI;AAAA,MACvD,CAAC;AAAA,IACH;AACA,UAAM,KAAK,GAAG,QAAQ,MAAM,KAAK,MAAM,MAAM;AAC7C,QAAI,SAAS;AACX,cAAQ,IAAI,qCAAqC;AAAA,QAC/C;AAAA,QACA,WAAW;AAAA,QACX,IAAI,KAAK,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH;AAGA,UAAM,SAAS,MAAM,KAAK,YAAe,OAAO,KAAK,QAAQ,CAAW;AACxE,QAAI,CAAC,QAAQ;AAEX,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OAAU,OAAe,IAAqB,MAA2C;AAC7F,QAAI,SAAS;AACX,cAAQ,IAAI,kCAAkC;AAAA,QAC5C;AAAA,QACA;AAAA,QACA,UAAU,OAAO,KAAK,IAAI;AAAA,MAC5B,CAAC;AAAA,IACH;AACA,UAAM,WAAW,KAAK,SAAS,cAAc,KAAK;AAClD,UAAM,QAAQ,KAAK,QAAQ,iBAAiB,OAAO,IAAI,MAAM,QAAQ;AACrE,QAAI,SAAS;AACX,cAAQ,IAAI,yCAAyC;AAAA,QACnD;AAAA,QACA;AAAA,QACA,KAAK,MAAM;AAAA,QACX,YAAY,MAAM,OAAO;AAAA,MAC3B,CAAC;AAAA,IACH;AACA,UAAM,KAAK,GAAG,QAAQ,MAAM,KAAK,MAAM,MAAM;AAC7C,QAAI,SAAS;AACX,cAAQ,IAAI,qCAAqC;AAAA,QAC/C;AAAA,QACA,WAAW;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAGA,UAAM,SAAS,MAAM,KAAK,YAAe,OAAO,EAAE;AAClD,QAAI,CAAC,QAAQ;AAEX,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,QAAQ,GAAG;AAAA,MACd;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,OAAU,OAAe,MAA2C;AACxE,QAAI,SAAS;AACX,cAAQ,IAAI,kCAAkC;AAAA,QAC5C;AAAA,QACA,UAAU,OAAO,KAAK,IAAI;AAAA,QAC1B,OAAO,QAAQ;AAAA,QACf,SAAS,KAAK,MAAM;AAAA,MACtB,CAAC;AAAA,IACH;AACA,UAAM,WAAW,KAAK,SAAS,cAAc,KAAK;AAClD,QAAI,KAAK,KAAK,QAAQ;AAGtB,QAAI,CAAC,IAAI;AAEP,YAAM,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,OAE5B,qBAAqB;AACxB,UAAI,CAAC,QAAQ,IAAI;AACf,cAAM,IAAI,MAAM,sCAAsC,KAAK,GAAG;AAAA,MAChE;AACA,WAAK,OAAO;AACZ,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,QAAQ,GAAG;AAAA,MACd;AACA,UAAI,SAAS;AACX,gBAAQ,IAAI,iEAAiE;AAAA,UAC3E;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO,KAAK,OAAU,OAAO,IAAI;AAAA,IACnC;AAKA,UAAM,cAAc,KAAK,QAAQ,eAAe,OAAO,IAAuB,KAAK,QAAQ;AAC3F,UAAM,eAAe,MAAM,KAAK,GAAG,OAAgC,YAAY,KAAK,YAAY,MAAM;AACtG,UAAM,WAAW,aAAa,SAAS,IAAI,aAAa,CAAC,IAAI;AAC7D,QAAI,UAAU;AAEZ,UAAI,SAAS;AACX,gBAAQ,IAAI,6DAA6D;AAAA,UACvE;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO,KAAK,OAAU,OAAO,IAAuB,IAAI;AAAA,IAC1D;AAIA,QAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,QAAQ,GAAG;AAAA,MACd;AAAA,IACF;AACA,QAAI,SAAS;AACX,cAAQ,IAAI,6DAA6D;AAAA,QACvE;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,KAAK,OAAU,OAAO,IAAI;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,OAAe,IAAoC;AAC9D,UAAM,WAAW,KAAK,SAAS,cAAc,KAAK;AAClD,UAAM,QAAQ,KAAK,QAAQ,iBAAiB,OAAO,IAAI,QAAQ;AAC/D,UAAM,KAAK,GAAG,QAAQ,MAAM,KAAK,MAAM,MAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,sBAAsB,aAAqB,eAA0C,WAAiE;AAElK,UAAM,UAAU,oBAAI,IAAiC;AACrD,UAAM,kBAAkB,CAAC,WAAwC;AAC/D,UAAI,CAAC,QAAQ,IAAI,MAAM,GAAG;AACxB,gBAAQ,IAAI,QAAQ,KAAK,OAAO,oBAAoB,eAAe,MAAM,CAAC;AAAA,MAC5E;AACA,aAAO,QAAQ,IAAI,MAAM;AAAA,IAC3B;AAGA,UAAM,kBAAkB,MAAM,QAAQ,IAAI,UAAU,IAAI,OAAM,aAAY;AACxE,YAAM,WAAW,KAAK,sBAAsB,aAAa,SAAS,IAAI;AACtE,UAAI,CAAC,UAAU;AACb,gBAAQ,KAAK,mCAAmC,WAAW,OAAO,SAAS,IAAI,EAAE;AACjF,eAAO;AAAA,UACL;AAAA,UACA,UAAU;AAAA,UACV,SAAS,CAAC;AAAA,QACZ;AAAA,MACF;AACA,YAAM,WAAW,SAAS,SAAS,gBAAgB,SAAS,mBAAmB,SAAS;AACxF,YAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAI,UAAU,WAAW,GAAG;AAC1B,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,SAAS,CAAC;AAAA,QACZ;AAAA,MACF;AACA,YAAM,WAAW,KAAK,kBAAkB,UAAU,UAAU,SAAS;AACrE,UAAI,UAAU,MAAM,KAAK,GAAG,OAAgC,SAAS,KAAK,SAAS,MAAM;AAGzF,UAAI,SAAS,UAAU,SAAS,KAAK,QAAQ,SAAS,GAAG;AACvD,kBAAU,MAAM,KAAK,sBAAsB,SAAS,MAAM,SAAS,SAAS,SAAS;AAAA,MACvF;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC,CAAC;AAGF,QAAI,SAAS,CAAC,GAAG,aAAa;AAC9B,eAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF,KAAK,iBAAiB;AACpB,UAAI,CAAC,UAAU;AACb,iBAAS,OAAO,IAAI,QAAM;AAAA,UACxB,GAAG;AAAA,UACH,CAAC,SAAS,SAAS,SAAS,IAAI,GAAG;AAAA,QACrC,EAAE;AACF;AAAA,MACF;AACA,UAAI,QAAQ,WAAW,GAAG;AACxB,iBAAS,OAAO,IAAI,QAAM;AAAA,UACxB,GAAG;AAAA,UACH,CAAC,SAAS,SAAS,SAAS,IAAI,GAAG,SAAS,SAAS,gBAAgB,CAAC,IAAI;AAAA,QAC5E,EAAE;AACF;AAAA,MACF;AACA,eAAS,KAAK,OAAO,KAAK,QAAQ,SAAS,UAAU,SAAS,SAAS,SAAS,IAAI;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,eAA0C,UAAqD;AAC7H,QAAI;AACJ,QAAI,SAAS,SAAS,eAAe;AAEnC,kBAAY,KAAK,OAAO,oBAAoB,eAAe,SAAS,gBAAgB;AAAA,IACtF,OAAO;AAEL,kBAAY,KAAK,OAAO,oBAAoB,eAAe,SAAS,UAAU;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,UAA0B,UAAgC,WAGlF;AAEA,UAAM,eAAe,SAAS,SAAS,gBAAgB,SAAS,aAC9D,SAAS;AAGX,UAAM,YAAY,MAAM,KAAK,IAAI,IAAI,SAAS,CAAC;AAC/C,WAAO,KAAK,QAAQ,mBAAmB,SAAS,MAAM,cAAc,WAAW,SAAS,OAAO;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA,EAKA,cAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,sBAAsB,WAAmB,SAA8C;AAC7F,UAAM,MAAM,GAAG,SAAS,IAAI,OAAO;AACnC,QAAI,CAAC,KAAK,cAAc,IAAI,GAAG,GAAG;AAChC,WAAK,cAAc,IAAI,KAAK,KAAK,SAAS,QAAQ,WAAW,OAAO,CAAC;AAAA,IACvE;AACA,WAAO,KAAK,cAAc,IAAI,GAAG;AAAA,EACnC;AACF;AASO,SAAS,oBAAoB,IAAuB,QAAuC;AAChG,SAAO,IAAI,cAAc,IAAI,MAAM;AACrC;","names":["trimmed"]}