@rebasepro/client-firebase 0.0.1-canary.d44c30b → 0.0.1-canary.dbf160a
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.
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/hooks/useFirebaseAuthController.ts","../src/hooks/useFirebaseStorageSource.ts","../src/hooks/useInitialiseFirebase.ts","../src/hooks/useAppCheck.ts","../src/utils/collections_firestore.ts","../src/utils/database.ts","../src/utils/algolia.ts","../src/utils/pinecone.ts","../src/utils/text_search_controller.ts","../src/utils/local_text_search_controller.ts","../src/utils/rebase_search_controller.ts","../src/hooks/useFirestoreDriver.ts","../src/hooks/useFirebaseRealTimeDBDelegate.ts","../src/hooks/useRecaptcha.tsx","../src/hooks/useBuildUserManagement.tsx","../src/components/social_icons.tsx","../src/components/FirebaseLoginView.tsx","../src/components/RebaseFirebaseApp.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { deepEqual as equal } from \"fast-equals\"\n\nimport {\n ApplicationVerifier,\n Auth,\n ConfirmationResult,\n createUserWithEmailAndPassword as createUserWithEmailAndPasswordFirebase,\n FacebookAuthProvider,\n fetchSignInMethodsForEmail as fetchSignInMethodsForEmailFirebase,\n getAuth,\n GithubAuthProvider,\n GoogleAuthProvider,\n OAuthProvider,\n onAuthStateChanged,\n sendPasswordResetEmail as sendPasswordResetEmailFirebase,\n signInAnonymously,\n signInWithEmailAndPassword,\n signInWithPhoneNumber,\n signInWithPopup,\n signOut,\n TwitterAuthProvider,\n User as FirebaseUser\n} from \"@firebase/auth\";\nimport { FirebaseApp } from \"@firebase/app\";\nimport { FirebaseAuthController, FirebaseSignInOption, FirebaseSignInProvider, FirebaseUserWrapper } from \"../types\";\nimport { Role, User } from \"@rebasepro/types\";\n\nexport interface FirebaseAuthControllerProps {\n loading?: boolean;\n firebaseApp?: FirebaseApp;\n signInOptions?: Array<FirebaseSignInProvider | FirebaseSignInOption>;\n onSignOut?: () => void;\n defineRolesFor?: (user: User) => Promise<Role[] | undefined> | Role[] | undefined;\n}\n\n/**\n * Use this hook to build an {@link AuthController} based on Firebase Auth\n * @group Firebase\n */\nexport const useFirebaseAuthController = <USER extends FirebaseUserWrapper = any, ExtraData = any>({\n loading,\n firebaseApp,\n signInOptions,\n onSignOut: onSignOutProp,\n defineRolesFor\n}: FirebaseAuthControllerProps): FirebaseAuthController<USER, ExtraData> => {\n\n const [loggedUser, setLoggedUser] = useState<FirebaseUser | null | undefined>(undefined); // logged user, anonymous or logged out\n const [authError, setAuthError] = useState<any>();\n const [authProviderError, setAuthProviderError] = useState<any>();\n const [initialLoading, setInitialLoading] = useState<boolean>(true);\n const [authLoading, setAuthLoading] = useState(true);\n const [loginSkipped, setLoginSkipped] = useState<boolean>(false);\n const [confirmationResult, setConfirmationResult] = useState<undefined | ConfirmationResult>();\n const [userRoles, _setUserRoles] = useState<Role[] | undefined>();\n const [extra, setExtra] = useState<any>();\n\n const setUserRoles = useCallback((roles: Role[] | undefined) => {\n const currentRoleIds = userRoles?.map(r => r.id);\n const newRoleIds = roles?.map(r => r.id);\n if (!equal(currentRoleIds, newRoleIds)) {\n _setUserRoles(roles);\n }\n }, [userRoles]);\n\n const authRef = useRef<Auth | null>(null);\n\n const updateUser = useCallback(async (user: FirebaseUser | null, initialize?: boolean) => {\n if (loading) return;\n if (defineRolesFor && user) {\n setUserRoles(await defineRolesFor(user));\n }\n setLoggedUser(user);\n setAuthLoading(false);\n if (initialize) {\n setInitialLoading(false);\n }\n }, [loading]);\n\n const updateRoles = useCallback(async (user: User | null) => {\n if (defineRolesFor && user) {\n const userRoles = await defineRolesFor(user);\n if (!equal(userRoles, userRoles)) {\n setUserRoles(userRoles);\n }\n }\n }, [defineRolesFor, userRoles]);\n\n useEffect(() => {\n if (updateRoles && loggedUser) {\n updateRoles(loggedUser);\n }\n }, [updateRoles, loggedUser]);\n\n useEffect(() => {\n if (!firebaseApp) return;\n try {\n const auth = getAuth(firebaseApp);\n authRef.current = auth;\n setAuthError(undefined);\n updateUser(auth.currentUser, false)\n return onAuthStateChanged(\n auth,\n async (user) => {\n console.debug(\"User state changed\", user);\n await updateUser(user, true);\n },\n error => setAuthProviderError(error)\n );\n } catch (e) {\n setAuthError(e);\n setInitialLoading(false);\n return () => {\n };\n }\n }, [firebaseApp, updateUser]);\n\n useEffect(() => {\n if (!loading && authRef.current) {\n updateUser(authRef.current.currentUser, false);\n }\n }, [loading, updateUser]);\n\n const getProviderOptions = useCallback((providerId: FirebaseSignInProvider): FirebaseSignInOption | undefined => {\n return signInOptions?.find((option) => {\n if (option === null) throw Error(\"useFirebaseAuthController\");\n if (typeof option === \"object\" && option.provider === providerId)\n return option as FirebaseSignInOption;\n return undefined;\n }) as FirebaseSignInOption | undefined;\n }, []);\n\n const googleLogin = useCallback(() => {\n const provider = new GoogleAuthProvider();\n const options = getProviderOptions(\"google.com\");\n if (options?.scopes)\n options.scopes.forEach((scope) => provider.addScope(scope));\n if (options?.customParameters) {\n provider.setCustomParameters(options.customParameters);\n } else {\n provider.setCustomParameters({\n prompt: \"select_account\"\n });\n }\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n signInWithPopup(auth, provider).catch(setAuthProviderError);\n }, [getProviderOptions]);\n\n const getAuthToken = useCallback(async (): Promise<string> => {\n if (!loggedUser)\n throw Error(\"No client user is logged in\");\n if (!loggedUser.getIdToken) {\n throw Error(\"No getIdToken method available\");\n }\n return loggedUser.getIdToken?.();\n }, [loggedUser]);\n\n const emailPasswordLogin = useCallback((email: string, password: string) => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n setAuthLoading(true);\n signInWithEmailAndPassword(auth, email, password)\n .catch(setAuthProviderError)\n .then(() => setAuthLoading(false));\n }, []);\n\n const createUserWithEmailAndPassword = useCallback((email: string, password: string) => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n setAuthLoading(true);\n createUserWithEmailAndPasswordFirebase(auth, email, password)\n .catch(setAuthProviderError)\n .then(() => setAuthLoading(false));\n }, []);\n\n const sendPasswordResetEmail = useCallback((email: string) => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n return sendPasswordResetEmailFirebase(auth, email)\n }, []);\n\n const fetchSignInMethodsForEmail = useCallback((email: string): Promise<string[]> => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n setAuthLoading(true);\n return fetchSignInMethodsForEmailFirebase(auth, email)\n .then((res) => {\n setAuthLoading(false);\n return res;\n });\n }, []);\n\n const onSignOut = useCallback(async () => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n await signOut(auth)\n .then(_ => {\n setLoggedUser(null);\n setUserRoles(undefined);\n setAuthProviderError(null);\n onSignOutProp?.();\n });\n setLoginSkipped(false);\n }, [onSignOutProp]);\n\n const doOauthLogin = useCallback((auth: Auth, provider: OAuthProvider | FacebookAuthProvider | GithubAuthProvider | TwitterAuthProvider) => {\n setAuthLoading(true);\n signInWithPopup(auth, provider)\n .catch(setAuthProviderError).then(() => setAuthLoading(false));\n }, []);\n\n const anonymousLogin = useCallback(() => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n setAuthLoading(true);\n signInAnonymously(auth)\n .catch(setAuthProviderError)\n .then(() => setAuthLoading(false));\n }, []);\n\n const phoneLogin = useCallback((phone: string, applicationVerifier: ApplicationVerifier) => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n setAuthLoading(true);\n return signInWithPhoneNumber(auth, phone, applicationVerifier)\n .catch(setAuthProviderError)\n .then((res) => {\n setAuthLoading(false);\n setConfirmationResult(res ?? undefined);\n });\n }, []);\n\n const appleLogin = useCallback(() => {\n const provider = new OAuthProvider(\"apple.com\");\n const options = getProviderOptions(\"apple.com\");\n if (options?.scopes)\n options.scopes.forEach((scope) => provider.addScope(scope));\n if (options?.customParameters)\n provider.setCustomParameters(options.customParameters);\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n doOauthLogin(auth, provider);\n }, [doOauthLogin, getProviderOptions]);\n\n const facebookLogin = useCallback(() => {\n const provider = new FacebookAuthProvider();\n const options = getProviderOptions(\"facebook.com\");\n if (options?.scopes)\n options.scopes.forEach((scope) => provider.addScope(scope));\n if (options?.customParameters)\n provider.setCustomParameters(options.customParameters);\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n doOauthLogin(auth, provider);\n }, [doOauthLogin, getProviderOptions]);\n\n const githubLogin = useCallback(() => {\n const provider = new GithubAuthProvider();\n const options = getProviderOptions(\"github.com\");\n if (options?.scopes)\n options.scopes.forEach((scope) => provider.addScope(scope));\n if (options?.customParameters)\n provider.setCustomParameters(options.customParameters);\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n doOauthLogin(auth, provider);\n }, [doOauthLogin, getProviderOptions]);\n\n const microsoftLogin = useCallback(() => {\n const provider = new OAuthProvider(\"microsoft.com\");\n const options = getProviderOptions(\"microsoft.com\");\n if (options?.scopes)\n options.scopes.forEach((scope) => provider.addScope(scope));\n if (options?.customParameters)\n provider.setCustomParameters(options.customParameters);\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n doOauthLogin(auth, provider);\n }, [doOauthLogin, getProviderOptions]);\n\n const twitterLogin = useCallback(() => {\n const provider = new TwitterAuthProvider();\n const options = getProviderOptions(\"twitter.com\");\n if (options?.customParameters)\n provider.setCustomParameters(options.customParameters);\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n doOauthLogin(auth, provider);\n }, [doOauthLogin, getProviderOptions]);\n\n const skipLogin = useCallback(() => {\n setLoginSkipped(true);\n setLoggedUser(null);\n setUserRoles(undefined);\n }, []);\n\n const firebaseUserWrapper: FirebaseUserWrapper | null = loggedUser\n ? {\n ...loggedUser,\n roles: userRoles?.map(r => r.id), // User.roles is string[], keep Role[] internally only\n firebaseUser: loggedUser\n }\n : null;\n\n return {\n user: firebaseUserWrapper as USER,\n setUser: updateUser,\n setUserRoles,\n authProviderError,\n authLoading,\n initialLoading: loading || initialLoading,\n signOut: onSignOut,\n getAuthToken,\n googleLogin,\n skipLogin,\n loginSkipped,\n emailPasswordLogin,\n createUserWithEmailAndPassword,\n sendPasswordResetEmail,\n fetchSignInMethodsForEmail,\n anonymousLogin,\n phoneLogin,\n appleLogin,\n facebookLogin,\n githubLogin,\n microsoftLogin,\n twitterLogin,\n confirmationResult,\n extra,\n setExtra\n };\n};\n","import { FirebaseApp } from \"@firebase/app\";\nimport {\n deleteObject,\n getDownloadURL,\n getMetadata,\n getStorage,\n list,\n ref,\n uploadBytesResumable\n} from \"@firebase/storage\";\nimport { DownloadConfig, DownloadMetadata, StorageListResult, StorageSource, UploadFileProps } from \"@rebasepro/types\";\n\n/**\n * @group Firebase\n */\nexport interface FirebaseStorageSourceProps {\n firebaseApp?: FirebaseApp\n bucketUrl?: string\n}\n\n/**\n * Use this hook to build an {@link StorageSource} based on Firebase storage\n * @group Firebase\n */\nexport function useFirebaseStorageSource({\n firebaseApp,\n bucketUrl\n}: FirebaseStorageSourceProps): StorageSource {\n const projectId = firebaseApp?.options?.projectId;\n const urlsCache: Record<string, DownloadConfig> = {};\n return {\n putObject({\n file,\n key,\n metadata,\n bucket\n }: UploadFileProps)\n : Promise<any> {\n try {\n if (!firebaseApp) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const storageBucketUrl = bucket ?? bucketUrl;\n const storage = getStorage(firebaseApp, storageBucketUrl);\n if (!storage) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n\n const storageRef = ref(storage, key);\n const uploadTask = uploadBytesResumable(storageRef, file, metadata);\n\n return new Promise((resolve, reject) => {\n let lastProgress = 0;\n let timeoutId: NodeJS.Timeout | null = null;\n\n const clearTimeoutIfExists = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n const setProgressTimeout = () => {\n clearTimeoutIfExists();\n timeoutId = setTimeout(() => {\n uploadTask.cancel();\n reject(new Error(\"Upload failed - This is likely a CORS configuration issue. \" +\n \"Make sure Firebase Storage is enabled in your project: \" + `https://console.firebase.google.com/u/0/project/${projectId}/storage` + \". \" +\n \"If it is, check Firebase Storage CORS settings.\"));\n }, 5000);\n };\n\n setProgressTimeout();\n\n uploadTask.on(\"state_changed\",\n (snapshot) => {\n const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\n\n if (progress > lastProgress) {\n lastProgress = progress;\n setProgressTimeout();\n }\n },\n (error) => {\n clearTimeoutIfExists();\n console.error(\"Firebase Storage upload error:\", error);\n\n let errorMessage = \"Unknown upload error\";\n\n if (error?.message) {\n errorMessage = error.message;\n } else if (typeof error === \"string\") {\n errorMessage = error;\n } else if (error?.code) {\n errorMessage = error.code;\n }\n\n if (error?.code === \"storage/unauthorized\") {\n reject(new Error(\"Unauthorized: Check Firebase Storage security rules\"));\n } else if (error?.code === \"storage/canceled\") {\n reject(new Error(\"Upload canceled\"));\n } else if (error?.code === \"storage/unknown\" || !error?.code) {\n reject(new Error(\"Upload failed - Check Firebase Storage CORS configuration or network connection\"));\n } else if (errorMessage.toLowerCase().includes(\"network\")) {\n reject(new Error(\"Network error: Check your internet connection\"));\n } else {\n const newError = Object.assign(new Error(errorMessage), { code: error?.code });\n reject(newError);\n }\n },\n () => {\n clearTimeoutIfExists();\n const fullPath = uploadTask.snapshot.ref.fullPath;\n const bucketName = uploadTask.snapshot.ref.bucket;\n resolve({\n key: fullPath,\n bucket: bucketName,\n storageUrl: `s3://${bucketName}/${fullPath}`\n });\n }\n );\n });\n } catch (error) {\n return Promise.reject(error);\n }\n },\n\n async getObject(path: string, bucket?: string): Promise<File | null> {\n try {\n if (!firebaseApp) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const storageBucketUrl = bucket ?? bucketUrl;\n const storage = getStorage(firebaseApp, storageBucketUrl);\n if (!storage) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const fileRef = ref(storage, path);\n const url = await getDownloadURL(fileRef);\n const response = await fetch(url);\n const blob = await response.blob();\n return new File([blob], path);\n } catch (e: any) {\n if (e?.code === \"storage/object-not-found\") return null;\n throw e;\n }\n },\n\n async getSignedUrl(storagePathOrUrl: string, bucket?: string): Promise<DownloadConfig> {\n if (!firebaseApp) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n\n // Support fully-qualified s3:// and gs:// URLs for backward compatibility\n let resolvedPathOrUrl = storagePathOrUrl;\n let resolvedBucket = bucket;\n const match = storagePathOrUrl.match(/^(s3|gs):\\/\\//);\n if (match) {\n const protocolLength = match[0].length;\n const withoutProtocol = storagePathOrUrl.substring(protocolLength);\n const firstSlash = withoutProtocol.indexOf(\"/\");\n if (firstSlash > 0) {\n resolvedBucket = withoutProtocol.substring(0, firstSlash);\n resolvedPathOrUrl = withoutProtocol.substring(firstSlash + 1);\n }\n }\n\n const storageBucketUrl = resolvedBucket ?? bucketUrl;\n const storage = getStorage(firebaseApp, storageBucketUrl);\n if (!storage) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n\n if (urlsCache[storagePathOrUrl])\n return urlsCache[storagePathOrUrl];\n try {\n const fileRef = ref(storage, resolvedPathOrUrl);\n const [url, metadata] = await Promise.all([getDownloadURL(fileRef), getMetadata(fileRef)]);\n const result: DownloadConfig = {\n url,\n metadata: metadata as DownloadMetadata\n }\n urlsCache[storagePathOrUrl] = result;\n return result;\n } catch (e: any) {\n if (e?.code === \"storage/object-not-found\") return {\n url: null,\n fileNotFound: true\n };\n throw e;\n }\n },\n\n async listObjects(prefix: string, options?: {\n bucket?: string,\n maxResults?: number,\n pageToken?: string\n }): Promise<StorageListResult> {\n if (!firebaseApp) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const storageBucketUrl = options?.bucket ?? bucketUrl;\n const storage = getStorage(firebaseApp, storageBucketUrl);\n if (!storage) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const folderRef = ref(storage, prefix);\n return await list(folderRef, {\n maxResults: options?.maxResults,\n pageToken: options?.pageToken\n });\n },\n\n async deleteObject(path: string, bucket?: string): Promise<void> {\n if (!firebaseApp) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const storageBucketUrl = bucket ?? bucketUrl;\n const storage = getStorage(firebaseApp, storageBucketUrl);\n if (!storage) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const fileRef = ref(storage, path);\n return deleteObject(fileRef);\n }\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { deleteApp, FirebaseApp, getApps, initializeApp } from \"@firebase/app\";\n\n/**\n * @group Firebase\n */\nexport interface InitialiseFirebaseResult {\n firebaseConfigLoading: boolean,\n firebaseApp?: FirebaseApp;\n configError?: string,\n firebaseConfigError?: Error\n}\n\nconst hostingError = \"It seems like the provided Firebase config is not correct. If you \\n\" +\n \"are using the credentials provided automatically by Firebase \\n\" +\n \"Hosting, make sure you link your Firebase app to Firebase Hosting. \\n\";\n\n/**\n * Function used to initialise Firebase, either by using the provided config,\n * or by fetching it by Firebase Hosting, if not specified.\n *\n * It works as a hook that gives you the loading state and the used\n * configuration.\n *\n * You most likely only need to use this if you are developing a custom app. You can also not use this component\n * and initialise Firebase yourself.\n *\n * @param onFirebaseInit\n * @param firebaseConfig\n * @param fromUrl\n * @param name\n * @param authDomain\n * @group Firebase\n */\nexport function useInitialiseFirebase({\n firebaseConfig,\n fromUrl,\n onFirebaseInit,\n name,\n authDomain\n }: {\n firebaseConfig?: Record<string, unknown>,\n fromUrl?: string | undefined,\n onFirebaseInit?: ((config: object, firebaseApp: FirebaseApp) => void) | undefined,\n name?: string;\n authDomain?: string;\n}): InitialiseFirebaseResult {\n\n const [firebaseApp, setFirebaseApp] = useState<FirebaseApp | undefined>();\n const [firebaseConfigLoading, setFirebaseConfigLoading] = useState<boolean>(false);\n const [configError, setConfigError] = useState<string>();\n\n const initFirebase = useCallback((config: Record<string, unknown>) => {\n\n if (config.projectId === firebaseApp?.options.projectId) {\n console.debug(\"Firebase app already initialised with the same project ID. This should happen only in development mode.\");\n setConfigError(undefined);\n setFirebaseConfigLoading(false);\n return;\n }\n\n try {\n const targetName = name ?? \"[DEFAULT]\";\n const currentApps = getApps();\n const existingApp = currentApps.find(app => app.name === targetName);\n if (existingApp) {\n deleteApp(existingApp);\n }\n const initialisedFirebaseApp = initializeApp(config, targetName);\n setConfigError(undefined);\n setFirebaseConfigLoading(false);\n setFirebaseApp(initialisedFirebaseApp);\n } catch (e: any) {\n console.error(\"Error initialising Firebase\", e);\n setConfigError(hostingError + \"\\n\" + (e.message ?? JSON.stringify(e)));\n }\n }, [name]);\n\n useEffect(() => {\n if (onFirebaseInit && firebaseConfig && firebaseApp) {\n onFirebaseInit(firebaseConfig, firebaseApp);\n }\n }, [firebaseApp]);\n\n useEffect(() => {\n\n setFirebaseConfigLoading(true);\n\n function fetchFromUrl(url: string) {\n fetch(url)\n .then(async response => {\n console.debug(\"Firebase init response\", response.status);\n if (response && response.status < 300) {\n const config = await response.json();\n if (authDomain) config.authDomain = authDomain;\n initFirebase(config);\n }\n })\n .catch(e => {\n setFirebaseConfigLoading(false);\n setConfigError(\n \"Could not load Firebase configuration from Firebase hosting. \" +\n \"If the app is not deployed in Firebase hosting, you need to specify the configuration manually\" +\n e.toString()\n );\n }\n );\n }\n\n if (firebaseConfig) {\n initFirebase(firebaseConfig);\n } else {\n if (fromUrl) {\n fetchFromUrl(fromUrl);\n } else if (process.env.NODE_ENV === \"production\") {\n fetchFromUrl(\"/__/firebase/init.json\");\n } else {\n setFirebaseConfigLoading(false);\n setConfigError(\n \"You need to deploy the app to Firebase hosting or specify a Firebase configuration object\"\n );\n }\n }\n }, []);\n\n return {\n firebaseApp,\n firebaseConfigLoading,\n configError\n };\n}\n","import React, { useCallback, useEffect, useRef } from \"react\";\n\nimport { AppCheck, getToken, initializeAppCheck } from \"@firebase/app-check\";\nimport { FirebaseApp } from \"@firebase/app\";\nimport { AppCheckOptions } from \"../types\";\n\n/**\n * @group Firebase\n */\nexport interface InitializeAppCheckProps {\n firebaseApp?: FirebaseApp;\n options?: AppCheckOptions;\n}\n\nexport interface InitializeAppCheckResult {\n loading: boolean;\n appCheckVerified?: boolean;\n error?: any;\n}\n\n/**\n * Function used to initialise Firebase App Check.\n *\n * @group Firebase\n */\nexport function useAppCheck({\n firebaseApp,\n options\n }: InitializeAppCheckProps): InitializeAppCheckResult {\n if (options?.debugToken) {\n Object.assign(window, {\n FIREBASE_APPCHECK_DEBUG_TOKEN: options?.debugToken\n });\n }\n\n const [appCheckLoading, setAppCheckLoading] = React.useState<boolean>(false);\n const [appCheckVerified, setAppCheckVerified] = React.useState<boolean | undefined>(undefined);\n const [error, setError] = React.useState<any>();\n\n const initialCheck = useRef<boolean>(false);\n\n const verifyToken = useCallback(async (appCheck: AppCheck) => {\n console.debug(\"Verifying App Check token...\", appCheck);\n try {\n const token = await getToken(appCheck, options?.forceRefresh);\n console.debug(\"App Check token:\", token);\n if (!token) {\n setError(\"App Check failed.\");\n setAppCheckVerified(false);\n } else {\n setAppCheckVerified(true);\n console.debug(\"App Check success.\");\n }\n } catch (e: any) {\n console.error(\"App Check error:\", e);\n setError(e.message);\n }\n }, [options?.forceRefresh]);\n\n useEffect(() => {\n if (!options) return;\n if (!firebaseApp) return;\n if (appCheckVerified !== undefined) return;\n if (initialCheck.current) return;\n\n setAppCheckLoading(true);\n\n const {\n provider,\n isTokenAutoRefreshEnabled\n } = options;\n\n removeCurrentAppCheckDiv();\n\n const appCheck = initializeAppCheck(firebaseApp, {\n provider,\n isTokenAutoRefreshEnabled\n });\n\n verifyToken(appCheck)\n .then(() => {\n setAppCheckLoading(false);\n });\n initialCheck.current = true;\n }, [appCheckVerified, firebaseApp, options, verifyToken]);\n\n return {\n loading: appCheckLoading,\n appCheckVerified,\n error\n };\n}\n\n\nfunction removeCurrentAppCheckDiv() {\n const div = document.getElementById(\"fire_app_check_[DEFAULT]\");\n if (div) {\n div.remove();\n }\n}\n\n","import { deleteField, DocumentSnapshot } from \"@firebase/firestore\";\nimport { EntityCollection, FirebaseCollection, Properties, Property } from \"@rebasepro/types\";\nimport { COLLECTION_PATH_SEPARATOR, sortProperties, stripCollectionPath } from \"@rebasepro/common\";\n\nexport function buildCollectionId(idOrPath: string, parentCollectionIds?: string[]): string {\n if (!parentCollectionIds)\n return stripCollectionPath(idOrPath);\n return [...parentCollectionIds.map(stripCollectionPath), stripCollectionPath(idOrPath)].join(COLLECTION_PATH_SEPARATOR);\n}\n\n\nexport const docsToCollectionTree = (docs: DocumentSnapshot[]): EntityCollection[] => {\n\n const collectionsMap = docs.map((doc) => {\n const id: string = doc.id;\n const collection = docToCollection(doc);\n return { [id]: collection };\n }).reduce((a, b) => ({ ...a,\n...b }), {});\n\n const orderedKeys = Object.keys(collectionsMap).sort((a, b) => b.split(COLLECTION_PATH_SEPARATOR).length - a.split(COLLECTION_PATH_SEPARATOR).length);\n\n orderedKeys.forEach((id) => {\n const collection = collectionsMap[id];\n if (id.includes(COLLECTION_PATH_SEPARATOR)) {\n const parentId = id.split(COLLECTION_PATH_SEPARATOR).slice(0, -1).join(COLLECTION_PATH_SEPARATOR);\n const parentCollection = collectionsMap[parentId];\n if (parentCollection)\n (parentCollection as FirebaseCollection).subcollections = () => [...((parentCollection as FirebaseCollection).subcollections?.() ?? []), collection];\n delete collectionsMap[id];\n }\n });\n\n return Object.values(collectionsMap);\n}\n\nexport const docToCollection = (doc: DocumentSnapshot): EntityCollection => {\n const data = doc.data();\n if (!data)\n throw Error(\"Entity collection has not been persisted correctly\");\n const propertiesOrder = data.propertiesOrder;\n const properties = data.properties as Properties ?? {};\n\n // Normalize enum values from object format to array format (sorted alphabetically)\n const normalizedProperties = normalizePropertiesEnumValues(properties, true);\n const sortedProperties = sortProperties(normalizedProperties, propertiesOrder);\n return {\n ...data,\n properties: sortedProperties,\n slug: data.id ?? data.alias ?? data.slug\n } as EntityCollection;\n}\n\n\n/**\n * Converts enum values from object format to array format.\n * Firestore doesn't preserve object key order, so we must use arrays.\n * When enum values are already stored as an array, their order is preserved\n * (this is intentional - users can reorder columns in Kanban view).\n * Only sort alphabetically when converting from legacy object format.\n * @param enumValues - The enum values (object or array format)\n * @param sortObjectFormat - If true, sort by id alphabetically when converting from object format\n * @returns Array of EnumValueConfig objects\n */\nfunction normalizeEnumValuesToArray(\n enumValues: unknown,\n sortObjectFormat = false\n): unknown[] {\n if (Array.isArray(enumValues)) {\n // Already an array - preserve order! This order is intentional\n // (e.g., user reordered Kanban columns)\n return enumValues;\n } else if (typeof enumValues === \"object\" && enumValues !== null) {\n // Convert object to array format\n // Object keys don't have guaranteed order in Firestore, so we sort alphabetically\n const entries = Object.entries(enumValues).map(([id, value]) =>\n typeof value === \"string\"\n ? {\n id,\n label: value\n }\n : {\n ...(value as object),\n id\n }\n );\n // Sort alphabetically by id when loading from Firestore object format\n // This is the only case where sorting makes sense, since object key order is not preserved\n if (sortObjectFormat) {\n entries.sort((a, b) => String(a.id).localeCompare(String(b.id)));\n }\n return entries;\n }\n return [];\n}\n\n/**\n * Normalizes all enum values in a properties object.\n * @param properties - The properties object to normalize\n * @param sortObjectFormat - If true, sort enum values alphabetically when converting from object format\n * @returns Properties with normalized enum values\n */\nfunction normalizePropertiesEnumValues(\n properties: Properties,\n sortObjectFormat = false\n): Properties {\n const result: Properties = {};\n Object.entries(properties).forEach(([key, property]) => {\n if (typeof property === \"object\" && property !== null) {\n const normalizedProperty = { ...property } as Record<string, unknown>;\n\n // Handle direct enum values\n if (normalizedProperty.enum) {\n normalizedProperty.enum = normalizeEnumValuesToArray(\n normalizedProperty.enum,\n sortObjectFormat\n );\n }\n\n // Handle array properties with enum values in \"of\"\n if (normalizedProperty.dataType === \"array\" && typeof normalizedProperty.of === \"object\" && normalizedProperty.of !== null) {\n const ofProp = normalizedProperty.of as Record<string, unknown>;\n if (ofProp.enum) {\n normalizedProperty.of = {\n ...ofProp,\n enum: normalizeEnumValuesToArray(\n ofProp.enum,\n sortObjectFormat\n )\n };\n }\n }\n\n // Handle map properties recursively\n if (normalizedProperty.dataType === \"map\" && normalizedProperty.properties) {\n normalizedProperty.properties = normalizePropertiesEnumValues(\n normalizedProperty.properties as Properties,\n sortObjectFormat\n );\n }\n\n result[key] = normalizedProperty as unknown as Property;\n } else {\n result[key] = property;\n }\n });\n return result;\n}\n","import { FirebaseApp } from \"@firebase/app\";\nimport {\n collection,\n getDocs,\n getFirestore,\n limit as limitClause,\n query,\n QueryDocumentSnapshot\n} from \"@firebase/firestore\";\n\nexport async function getFirestoreDataInPath(firebaseApp: FirebaseApp, path: string, parentPaths: string[], limit: number): Promise<object[]> {\n const firestore = getFirestore(firebaseApp);\n if (!parentPaths || parentPaths.length === 0) {\n const q = query(collection(firestore, path), limitClause(limit));\n return getDocs(q).then((querySnapshot) => {\n return querySnapshot.docs.map(doc => doc.data());\n });\n } else {\n let currentDocs: QueryDocumentSnapshot[] | undefined = undefined;\n let index = 0;\n const allPaths = parentPaths;\n allPaths.push(path);\n let parentPath: string | undefined = allPaths[0];\n while (parentPath) {\n if (currentDocs) {\n currentDocs = (await Promise.all(currentDocs.map(async (doc) => {\n const q = query(collection(firestore, doc.ref.path, parentPath as string), limitClause(5));\n return (await getDocs(q)).docs;\n }))).flat();\n } else {\n const q = query(collection(firestore, parentPath), limitClause(5));\n currentDocs = (await getDocs(q)).docs;\n }\n index++;\n parentPath = index < allPaths.length ? allPaths[index] : undefined;\n }\n return currentDocs ? currentDocs.map(doc => doc.data()) : [];\n }\n}\n","import { buildExternalSearchController } from \"./text_search_controller\";\n\n/**\n * Utility function to perform a text search in an algolia index,\n * returning the ids of the entities.\n * @param client The algolia client\n * @param indexName\n * @param query\n * @group Firebase\n */\nexport function performAlgoliaTextSearch(client: any, indexName: string, query: string): Promise<readonly string[]> {\n\n console.debug(\"Performing Algolia query\", client, query);\n\n return client.searchSingleIndex({\n indexName,\n searchParams: { query }\n }).then(({ hits }: any) => {\n return hits.map((hit: any) => hit.objectID as string);\n })\n .catch((err: any) => {\n console.error(err);\n return [];\n });\n}\n\n\n","import { User as FirebaseUser } from \"@firebase/auth\";\nimport { FirestoreTextSearchController, FirestoreTextSearchControllerBuilder } from \"../types\";\nimport { EntityCollection } from \"@rebasepro/types\";\n\nconst DEFAULT_SERVER = \"https://api.rebase.pro\";\n\n/**\n * Utility function to perform a text search in an algolia index,\n * returning the ids of the entities.\n * @param index\n * @param query\n * @group Firebase\n */\nexport async function performPineconeTextSearch({\n host = DEFAULT_SERVER,\n firebaseToken,\n projectId,\n collectionPath,\n query\n}: {\n host?: string,\n firebaseToken: string,\n collectionPath: string,\n projectId: string,\n query: string\n}): Promise<readonly string[]> {\n\n console.debug(\"Performing Pinecone query\", collectionPath, query);\n const response = await fetch((host ?? DEFAULT_SERVER) + `/projects/${projectId}/search/${collectionPath}`,\n {\n // mode: \"no-cors\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${firebaseToken}`\n // \"x-de-version\": version\n },\n body: JSON.stringify({\n query\n })\n });\n\n const promise = await response.json();\n return promise.data.ids;\n\n}\n\nexport function buildPineconeSearchController({\n isPathSupported,\n search\n}: {\n isPathSupported: (path: string) => boolean,\n search: (props: {\n searchString: string,\n path: string,\n currentUser?: FirebaseUser\n }) => Promise<readonly string[] | undefined>,\n}): FirestoreTextSearchControllerBuilder {\n return (props): FirestoreTextSearchController => {\n\n const init = (props: {\n path: string,\n collection?: EntityCollection\n }) => {\n // do nothing\n return Promise.resolve(isPathSupported(props.path));\n }\n\n return {\n init,\n search\n }\n }\n\n}\n","import { FirestoreTextSearchController, FirestoreTextSearchControllerBuilder } from \"../types\";\nimport { EntityCollection } from \"@rebasepro/types\";\n\n/**\n * Utility function to perform a text search in an external index,\n * returning the ids of the entities.\n * @group Firebase\n */\nexport function buildExternalSearchController({\n isPathSupported,\n search\n}: {\n isPathSupported: (path: string) => boolean,\n search: (props: {\n searchString: string,\n path: string\n }) => Promise<readonly string[] | undefined>,\n}): FirestoreTextSearchControllerBuilder {\n return (props): FirestoreTextSearchController => {\n\n const init = (props: {\n path: string,\n collection?: EntityCollection\n }) => {\n return Promise.resolve(isPathSupported(props.path));\n }\n\n return {\n init,\n search\n }\n }\n\n}\n","import { collection, getFirestore, onSnapshot, query } from \"@firebase/firestore\";\nimport Fuse from \"fuse.js\"\n\nimport { FirebaseApp } from \"@firebase/app\";\nimport { EntityCollection } from \"@rebasepro/types\";\nimport { FirestoreTextSearchController, FirestoreTextSearchControllerBuilder } from \"../types\";\n\nconst MAX_SEARCH_RESULTS = 80;\n\nexport const localSearchControllerBuilder: FirestoreTextSearchControllerBuilder = ({\n firebaseApp\n}: {\n\n firebaseApp: FirebaseApp,\n}): FirestoreTextSearchController => {\n\n let currentPath: string | undefined;\n const indexes: Record<string, Fuse<object & { id: string }>> = {};\n const listeners: Record<string, () => void> = {};\n\n const destroyListener = (path: string) => {\n if (listeners[path]) {\n listeners[path]();\n delete listeners[path];\n delete indexes[path];\n }\n }\n\n const init = ({\n path,\n collection: collectionProp,\n databaseId\n }: {\n path: string,\n collection?: EntityCollection,\n databaseId?: string\n }): Promise<boolean> => {\n\n if (currentPath && path !== currentPath) {\n destroyListener(currentPath)\n }\n\n currentPath = path;\n\n return new Promise(async (resolve, reject) => {\n if (collectionProp) {\n console.debug(\"Init local search controller\", path);\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n const col = collection(firestore, path);\n listeners[path] = onSnapshot(query(col),\n {\n next: (snapshot) => {\n if (snapshot.metadata.fromCache && snapshot.metadata.hasPendingWrites) {\n return;\n }\n const docs = snapshot.docs.map(doc => ({\n id: doc.id,\n ...doc.data()\n }));\n\n indexes[path] = buildIndex(docs, collectionProp);\n console.debug(\"Added docs to index\", path, docs.length);\n resolve(true);\n },\n error: (e) => {\n console.error(\"Error initializing local search controller\", path);\n console.error(e);\n reject(e);\n }\n }\n );\n }\n });\n }\n\n const search = async ({\n searchString,\n path\n }: {\n searchString: string,\n path: string,\n databaseId?: string\n }) => {\n console.debug(\"Searching local index\", path, searchString);\n const index = indexes[path];\n if (!index) {\n throw new Error(`Index not found for path ${path}`);\n }\n let searchResult = index.search(searchString);\n searchResult = searchResult.splice(0, MAX_SEARCH_RESULTS);\n searchResult = searchResult.sort((a, b) => {\n // Check if item A is an exact match\n const aExactMatch = a.item.id === searchString;\n // Check if item B is an exact match\n const bExactMatch = b.item.id === searchString;\n\n if (aExactMatch && !bExactMatch) {\n return -1; // Prioritize item A\n } else if (!aExactMatch && bExactMatch) {\n return 1; // Prioritize item B\n } else {\n // If both are exact matches or both are not, sort by Fuse's original score\n return (a.score ?? 0) - (b.score ?? 0);\n }\n });\n return searchResult.map((e: any) => e.item.id);\n };\n\n return {\n init,\n search\n }\n}\n\nfunction buildIndex(list: (object & { id: string })[], collection: EntityCollection) {\n\n const keys = [\"id\", ...Object.keys(collection.properties)];\n\n const fuseOptions = {\n // isCaseSensitive: false,\n // includeScore: false,\n // shouldSort: true,\n // includeMatches: false,\n // findAllMatches: false,\n // minMatchCharLength: 1,\n // location: 0,\n threshold: 0.6,\n // distance: 100,\n // useExtendedSearch: false,\n // ignoreLocation: false,\n // ignoreFieldNorm: false,\n // fieldNormWeight: 1,\n includeScore: true,\n keys: [{\n name: \"title\",\n weight: 1.0\n }, ...keys.map(key => ({\n name: key,\n weight: 0.5\n }))]\n };\n return new Fuse<object & { id: string }>(list, fuseOptions);\n}\n","import { FirestoreTextSearchController, FirestoreTextSearchControllerBuilder } from \"../types\";\nimport { FirebaseApp } from \"@firebase/app\";\nimport { getFunctions, httpsCallable } from \"@firebase/functions\";\nimport { EntityCollection } from \"@rebasepro/types\";\n\n/**\n * Configuration returned by the Rebase Search Extension\n */\ninterface SearchConfig {\n host: string;\n port: number;\n protocol: \"http\" | \"https\";\n apiKey: string;\n collectionsToIndex: string[];\n path?: string;\n}\n/**\n * Options for building the Rebase Search Controller\n */\nexport interface RebaseSearchControllerOptions {\n /**\n * The Firebase region where the extension is deployed.\n */\n region: string;\n\n /**\n * The extension instance ID. Defaults to \"rebase-search\".\n * Use this if you installed the extension with a custom instance ID.\n */\n extensionInstanceId?: string;\n\n /**\n * Custom Typesense configuration. If provided, skips fetching from extension.\n * Use this if you want to connect to your own Typesense instance.\n */\n customConfig?: {\n host: string;\n port?: number;\n protocol?: \"http\" | \"https\";\n apiKey: string;\n path?: string;\n };\n\n /**\n * Override the collections to index returned by the extension.\n * Use this if you want to restrict search to specific collections on the client side,\n * regardless of what is configured in the extension.\n */\n collections?: string[];\n}\n\n/**\n * Creates a text search controller that uses the Rebase Search Extension.\n *\n * This requires the `rebase-search` extension to be installed in the user's\n * Firebase project. The extension automatically deploys Typesense to Cloud Run\n * and syncs Firestore data.\n *\n * @example\n * ```typescript\n * import { buildRebaseSearchController } from \"@rebasepro/client-firebase\";\n *\n * // Using the extension (recommended)\n * const textSearchControllerBuilder = buildRebaseSearchController();\n *\n * // Or with custom Typesense instance\n * const textSearchControllerBuilder = buildRebaseSearchController({\n * customConfig: {\n * host: \"your-typesense-instance.com\",\n * apiKey: \"your-api-key\"\n * }\n * });\n *\n * <RebaseApp\n * textSearchControllerBuilder={textSearchControllerBuilder}\n * collections={[\n * {\n * path: \"products\",\n * name: \"Products\",\n * textSearchEnabled: true, // Enable search for this collection\n * properties: { ... }\n * }\n * ]}\n * />\n * ```\n *\n * @param options - Configuration options\n * @returns A FirestoreTextSearchControllerBuilder\n *\n * @group Firebase\n */\nexport function buildRebaseSearchController(\n options?: RebaseSearchControllerOptions\n): FirestoreTextSearchControllerBuilder {\n const region = options?.region || \"us-central1\";\n const extensionInstanceId = options?.extensionInstanceId || \"typesense-search\";\n\n let searchConfig: SearchConfig | null = null;\n let typesenseClient: any = null;\n let initPromise: Promise<void> | null = null;\n\n return ({ firebaseApp }: { firebaseApp: FirebaseApp }): FirestoreTextSearchController => {\n\n /**\n * Initializes the Typesense client\n */\n const initializeClient = async (): Promise<void> => {\n if (typesenseClient) return;\n\n // Use custom config if provided\n if (options?.customConfig) {\n searchConfig = {\n host: options.customConfig.host,\n port: options.customConfig.port || 443,\n protocol: options.customConfig.protocol || \"https\",\n apiKey: options.customConfig.apiKey,\n path: options.customConfig.path,\n collectionsToIndex: [\"*\"]\n };\n } else {\n // Fetch config from extension\n const functions = getFunctions(firebaseApp, region);\n const getConfig = httpsCallable<void, SearchConfig>(\n functions,\n `ext-${extensionInstanceId}-getSearchConfig`\n );\n\n try {\n const result = await getConfig();\n searchConfig = result.data;\n if (options?.collections && options.collections.length > 0) {\n searchConfig.collectionsToIndex = options.collections;\n }\n } catch (error: any) {\n console.error(\"Failed to get search config from extension:\", error);\n throw new Error(\n \"Failed to initialize Rebase Search. \" +\n \"Make sure the rebase-search extension is installed and configured. \" +\n `Error: ${error.message || error}`\n );\n }\n }\n\n if (!searchConfig) {\n throw new Error(\"Search config not available\");\n }\n\n // Dynamically import Typesense client to avoid bundling if not used\n const Typesense = (await import(\"typesense\")).default;\n\n typesenseClient = new Typesense.Client({\n nodes: [{\n host: searchConfig.host,\n port: searchConfig.port,\n protocol: searchConfig.protocol,\n path: searchConfig.path || \"\"\n }],\n apiKey: searchConfig.apiKey,\n connectionTimeoutSeconds: 5,\n retryIntervalSeconds: 0.5,\n numRetries: 2\n });\n };\n\n /**\n * Converts a Firestore path to Typesense collection name\n * e.g., \"users/123/orders\" -> \"users_orders\"\n */\n const getTypesenseCollectionName = (path: string): string => {\n const pathParts = path.split(\"/\");\n // Extract collection names (even indices) and join with underscore\n const collectionNames: string[] = [];\n for (let i = 0; i < pathParts.length; i += 2) {\n if (pathParts[i]) {\n collectionNames.push(pathParts[i]);\n }\n }\n return collectionNames.join(\"_\");\n };\n\n /**\n * Extracts parent filter for subcollection queries\n * e.g., \"users/123/orders\" -> { \"_parent_users_id\": \"123\" }\n */\n const getParentFilter = (path: string): string | null => {\n const pathParts = path.split(\"/\");\n if (pathParts.length <= 1) return null;\n\n // Build filter for parent IDs\n const filters: string[] = [];\n for (let i = 0; i < pathParts.length - 1; i += 2) {\n const collectionName = pathParts[i];\n const docId = pathParts[i + 1];\n if (collectionName && docId) {\n filters.push(`_parent_${collectionName}_id:=${docId}`);\n }\n }\n\n return filters.length > 0 ? filters.join(\" && \") : null;\n };\n\n /**\n * Initializes search for a specific collection path\n */\n const init = async (props: {\n path: string;\n collection?: EntityCollection;\n databaseId?: string;\n }): Promise<boolean> => {\n try {\n // Ensure client is initialized (only once)\n if (!initPromise) {\n initPromise = initializeClient();\n }\n await initPromise;\n\n if (!searchConfig) return false;\n\n // Get collection pattern (e.g., \"users/orders\" from \"users/123/orders\")\n const pathParts = props.path.split(\"/\");\n const collectionNames: string[] = [];\n for (let i = 0; i < pathParts.length; i += 2) {\n if (pathParts[i]) collectionNames.push(pathParts[i]);\n }\n const collectionPattern = collectionNames.join(\"/\");\n const rootCollection = collectionNames[0];\n\n // Check if this collection is indexed\n if (searchConfig.collectionsToIndex.includes(\"*\")) {\n return true;\n }\n\n // Check exact pattern or root collection\n return searchConfig.collectionsToIndex.includes(collectionPattern) ||\n searchConfig.collectionsToIndex.includes(rootCollection);\n } catch (error) {\n console.error(\"Failed to initialize Rebase Search:\", error);\n return false;\n }\n };\n\n // Cache for Typesense collection schemas (field names)\n const schemaCache: Map<string, string[]> = new Map();\n\n /**\n * Fetches the Typesense collection schema and returns searchable string field names.\n * Results are cached to avoid repeated API calls.\n */\n const getSearchableFieldsFromSchema = async (collectionName: string): Promise<string[]> => {\n // Check cache first\n if (schemaCache.has(collectionName)) {\n return schemaCache.get(collectionName)!;\n }\n\n try {\n const collection = await typesenseClient.collections(collectionName).retrieve();\n\n // Extract string fields from the schema\n const stringFields = collection.fields\n .filter((f: any) => {\n // Include string and string[] types, exclude internal fields\n const isStringType = f.type === \"string\" ||\n f.type === \"string[]\" ||\n f.type === \"string*\" ||\n f.type === \"auto\";\n const isNotInternal = !f.name.startsWith(\"_\") && f.name !== \".*\";\n return isStringType && isNotInternal;\n })\n .map((f: any) => f.name);\n\n schemaCache.set(collectionName, stringFields);\n return stringFields;\n } catch (error: any) {\n if (error.httpStatus === 404) {\n throw new Error(\n `Collection \"${collectionName}\" not found in Typesense. ` +\n \"Make sure the collection has been indexed. Try running the backfill function.\"\n );\n }\n throw error;\n }\n };\n\n /**\n * Performs a search and returns document IDs\n * Supports subcollections by filtering on parent IDs\n */\n const search = async (props: {\n searchString: string;\n path: string;\n databaseId?: string;\n collection?: EntityCollection;\n }): Promise<readonly string[] | undefined> => {\n if (!typesenseClient) {\n // Ensure client is initialized\n if (!initPromise) {\n initPromise = initializeClient();\n }\n await initPromise;\n }\n\n if (!typesenseClient) {\n throw new Error(\"Typesense client not initialized. Check extension configuration.\");\n }\n\n // Convert path to Typesense collection name\n const collectionName = getTypesenseCollectionName(props.path);\n\n // Get parent filter for subcollections\n const parentFilter = getParentFilter(props.path);\n\n // Get searchable fields from the actual Typesense schema\n const searchableFields = await getSearchableFieldsFromSchema(collectionName);\n\n if (searchableFields.length === 0) {\n throw new Error(\n `No searchable string fields found in Typesense collection \"${collectionName}\". ` +\n \"Make sure some documents have been indexed with string fields.\"\n );\n }\n\n const queryBy = searchableFields.join(\",\");\n\n try {\n const searchParams: any = {\n q: props.searchString,\n query_by: queryBy,\n per_page: 100,\n prefix: true, // Enable prefix matching\n typo_tokens_threshold: 1 // Allow some typos\n };\n\n // Add filter for subcollection queries\n if (parentFilter) {\n searchParams.filter_by = parentFilter;\n }\n\n const result = await typesenseClient\n .collections(collectionName)\n .documents()\n .search(searchParams);\n\n // Extract document IDs from hits\n const ids = result.hits?.map((hit: any) => hit.document.id) ?? [];\n\n return ids as readonly string[];\n } catch (error: any) {\n // Parse error message for user-friendly display\n const message = error.message || error.toString();\n throw new Error(`Search failed: ${message}`);\n }\n };\n\n return { init,\nsearch };\n };\n}\n","import { DataDriver, DeleteEntityProps, Entity, EntityCollection, EntityReference, FetchCollectionProps, FetchEntityProps, FilterCombination, FilterValues, GeoPoint, ListenCollectionProps, ListenEntityProps, SaveEntityProps, WhereFilterOp } from \"@rebasepro/types\";\nimport {\n collection as collectionClause,\n CollectionReference,\n deleteDoc,\n deleteField,\n doc,\n DocumentReference,\n DocumentSnapshot,\n Firestore,\n GeoPoint as FirestoreGeoPoint,\n getCountFromServer,\n getDoc,\n getDocs,\n getFirestore,\n limit as limitClause,\n onSnapshot,\n orderBy as orderByClause,\n Query,\n query,\n QueryConstraint,\n serverTimestamp,\n setDoc,\n startAfter as startAfterClause,\n Timestamp,\n VectorValue,\n vector,\n where as whereClause\n} from \"@firebase/firestore\";\nimport { FirebaseApp } from \"@firebase/app\";\nimport { FirestoreTextSearchController, FirestoreTextSearchControllerBuilder } from \"../types/text_search\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { localSearchControllerBuilder } from \"../utils\";\nimport { getAuth } from \"@firebase/auth\";\n\n/**\n * @group Firebase\n */\nexport interface FirestoreDataDriverProps {\n firebaseApp?: FirebaseApp,\n /**\n * You can use this controller to return a list of ids from a search index, given a\n * `path` and a `searchString`.\n */\n textSearchControllerBuilder?: FirestoreTextSearchControllerBuilder,\n\n /**\n * Fallback to local text search if no text search controller is specified,\n * or if the controller does not support the given path.\n */\n localTextSearchEnabled?: boolean,\n\n /**\n * Use this builder to indicate which indexes are available in your\n * Firestore database. This is used to allow filtering and sorting\n * for multiple fields in the CMS.\n */\n firestoreIndexesBuilder?: FirestoreIndexesBuilder;\n}\n\nexport type FirestoreIndexesBuilder = (params: {\n path: string,\n collection: EntityCollection<any>,\n}) => FilterCombination<string>[] | undefined\n\nexport type FirestoreDataDriver = DataDriver & {\n\n initTextSearch: (props: {\n path: string,\n databaseId?: string,\n collection?: EntityCollection\n }) => Promise<boolean>,\n}\n\n/**\n * Use this hook to build a {@link DataDriver} based on Firestore\n * @param firebaseApp\n * @param textSearchControllerBuilder\n * @group Firebase\n */\nexport function useFirestoreDriver({\n firebaseApp,\n textSearchControllerBuilder,\n firestoreIndexesBuilder,\n localTextSearchEnabled\n}: FirestoreDataDriverProps): FirestoreDataDriver {\n\n const searchControllerRef = useRef<FirestoreTextSearchController>(undefined);\n\n useEffect(() => {\n if (!searchControllerRef.current && firebaseApp) {\n if ((textSearchControllerBuilder || localTextSearchEnabled) && !searchControllerRef.current) {\n searchControllerRef.current = buildTextSearchControllerWithLocalSearch({\n firebaseApp,\n textSearchControllerBuilder,\n localTextSearchEnabled: localTextSearchEnabled ?? false\n });\n }\n }\n }, [firebaseApp, localTextSearchEnabled, textSearchControllerBuilder]);\n\n const buildQuery = useCallback(<M>(path: string,\n filter: FilterValues<Extract<keyof M, string>> | undefined,\n orderBy: string | undefined,\n order: \"desc\" | \"asc\" | undefined,\n startAfter: unknown[] | undefined,\n limit: number | undefined,\n databaseId?: string) => {\n\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n const collectionReference: Query = collectionClause(firestore, path);\n\n const queryParams: QueryConstraint[] = [];\n if (filter) {\n Object.entries(filter)\n .filter(([_, entry]) => !!entry)\n .forEach(([key, filterParameter]) => {\n const [op, value] = filterParameter as [WhereFilterOp, any];\n queryParams.push(whereClause(key, op, cmsToFirestoreModel(value, firestore)));\n });\n }\n\n if (orderBy && order) {\n queryParams.push(orderByClause(orderBy, order));\n }\n\n if (startAfter) {\n queryParams.push(startAfterClause(startAfter));\n }\n\n if (limit) {\n queryParams.push(limitClause(limit));\n }\n\n return query(collectionReference, ...queryParams);\n }, [firebaseApp]);\n\n const getAndBuildEntity = useCallback(<M extends Record<string, any>>(path: string,\n entityId: string | number,\n databaseId?: string\n ): Promise<Entity<M> | undefined> => {\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n\n return getDoc(doc(firestore, path, String(entityId)))\n .then((docSnapshot) => {\n if (!docSnapshot.exists()) {\n return undefined;\n }\n return createEntityFromDocument(docSnapshot, databaseId);\n });\n }, [firebaseApp]);\n\n const listenEntity = useCallback(<M extends Record<string, any>>(\n {\n path,\n entityId,\n collection,\n onUpdate,\n onError\n }: ListenEntityProps<M>): () => void => {\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const databaseId = collection?.databaseId;\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n const resolvedPath = path;\n\n return onSnapshot(\n doc(firestore, resolvedPath, String(entityId)),\n {\n next: (docSnapshot) => {\n onUpdate(createEntityFromDocument(docSnapshot, databaseId));\n },\n error: onError\n }\n );\n }, [firebaseApp]);\n\n const performTextSearch = useCallback(<M extends Record<string, any>>({\n path,\n databaseId,\n searchString,\n onUpdate\n }: {\n path: string,\n databaseId?: string,\n searchString: string;\n onUpdate: (entities: Entity<M>[]) => void,\n }): () => void => {\n\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const textSearchController = searchControllerRef.current;\n if (!textSearchController)\n throw Error(\"Trying to make text search without specifying a FirestoreTextSearchController\");\n\n let subscriptions: (() => void)[] = [];\n\n\n const auth = getAuth(firebaseApp);\n const currentUser = auth?.currentUser;\n\n const search = textSearchController.search({\n path,\n searchString,\n currentUser: currentUser ?? undefined,\n databaseId\n });\n\n if (!search) {\n throw Error(\"The current path is not supported by the specified FirestoreTextSearchController\");\n }\n\n search.then((ids) => {\n if (!ids || ids.length === 0) {\n subscriptions = [];\n onUpdate([]);\n }\n\n const entities: Entity<M>[] = [];\n const addedEntitiesSet = new Set<string | number>();\n subscriptions = (ids ?? [])\n .map((entityId) => {\n return listenEntity({\n path,\n entityId,\n onUpdate: (entity: Entity<any> | null) => {\n if (entity?.values) {\n if (entity.id && !addedEntitiesSet.has(entity.id)) {\n addedEntitiesSet.add(entity.id);\n entities.push(entity);\n onUpdate(entities);\n }\n } else if (entity?.id) {\n addedEntitiesSet.delete(entity.id);\n onUpdate([...entities.filter(e => e.id !== entityId)])\n }\n }\n })\n }\n );\n });\n\n return () => {\n subscriptions.forEach((p) => p());\n }\n\n }, [firebaseApp, listenEntity]);\n\n return {\n key: \"firestore\",\n\n currentTime,\n\n initialised: Boolean(firebaseApp),\n\n initTextSearch: useCallback(async (props: {\n path: string,\n databaseId?: string,\n collection?: EntityCollection\n }) => {\n console.debug(\"Init text search controller\", searchControllerRef.current, props.path);\n if (!searchControllerRef.current) {\n console.warn(\"You are trying to use text search, but have not provided a text search controller in `useFirestoreDriver`. You can also set the flag `localTextSearchEnabled` to use local search in `useFirestoreDriver`. Local text search can incur in performance issues and higher costs for large datasets.\");\n return false;\n }\n try {\n return searchControllerRef.current.init(props);\n } catch (e) {\n console.error(\"Error initializing text search controller\", e);\n return false;\n }\n }, []),\n\n /**\n * Fetch entities in a Firestore path\n * @param path\n * @param collection\n * @param filter\n * @param limit\n * @param startAfter\n * @param searchString\n * @param orderBy\n * @param order\n * @return Function to cancel subscription\n * @see useCollectionFetch if you need this functionality implemented as a hook\n * @group Firestore\n */\n fetchCollection: useCallback(async <M extends Record<string, any>>({\n path,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order,\n collection\n }: FetchCollectionProps<M>\n ): Promise<Entity<M>[]> => {\n\n const databaseId = collection?.databaseId;\n\n const resolvedPath = path;\n\n console.debug(\"Fetching collection\", {\n path,\n limit,\n filter,\n startAfter,\n orderBy,\n order\n });\n const query = buildQuery(resolvedPath, filter, orderBy, order, startAfter as unknown[] | undefined, limit, databaseId);\n\n const snapshot = await getDocs(query);\n return snapshot.docs.map((doc) => createEntityFromDocument(doc, databaseId));\n }, [buildQuery]),\n\n /**\n * Listen to a entities in a given path\n * @param path\n * @param collection\n * @param onError\n * @param filter\n * @param limit\n * @param startAfter\n * @param searchString\n * @param orderBy\n * @param order\n * @param onUpdate\n * @return Function to cancel subscription\n * @see useCollectionFetch if you need this functionality implemented as a hook\n * @group Firestore\n */\n listenCollection: useCallback(<M extends Record<string, any>>(\n {\n path,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order,\n onUpdate,\n onError,\n collection\n }: ListenCollectionProps<M>\n ): () => void => {\n\n console.debug(\"Listening collection\", {\n path,\n searchString,\n limit,\n filter,\n startAfter,\n orderBy,\n order,\n collection\n });\n\n if (!firebaseApp) {\n throw Error(\"useFirestoreDriver Firebase not initialised\");\n }\n\n const databaseId = collection?.databaseId;\n\n if (searchString) {\n return performTextSearch<M>({\n path,\n searchString,\n onUpdate,\n databaseId\n });\n }\n\n const resolvedPath = path;\n console.debug(\"Resolved path for listening\", {\n path,\n resolvedPath\n });\n const query = buildQuery(resolvedPath, filter, orderBy, order, startAfter as unknown[] | undefined, limit, databaseId);\n return onSnapshot(query,\n {\n next: (snapshot) => {\n if (!searchString)\n onUpdate(snapshot.docs.map((doc) => createEntityFromDocument(doc, databaseId)));\n },\n error: onError\n }\n );\n\n }, [buildQuery, firebaseApp, performTextSearch]),\n\n /**\n * Retrieve an entity given a path and a collection\n * @param path\n * @param entityId\n * @param collection\n * @group Firestore\n */\n fetchEntity: useCallback(<M extends Record<string, any>>({\n path,\n entityId,\n collection\n }: FetchEntityProps<M>\n ): Promise<Entity<M> | undefined> => {\n const resolvedPath = path;\n return getAndBuildEntity(resolvedPath, entityId, collection?.databaseId);\n }, [getAndBuildEntity]),\n\n /**\n *\n * @param path\n * @param entityId\n * @param collection\n * @param onUpdate\n * @param onError\n * @return Function to cancel subscription\n * @group Firestore\n */\n listenEntity,\n\n /**\n * Save entity to the specified path. Note that Firestore does not allow\n * undefined values.\n * @param path\n * @param entityId\n * @param values\n * @param schemaId\n * @param collection\n * @param status\n * @group Firestore\n */\n saveEntity: useCallback(<M extends Record<string, any>>(\n {\n path,\n entityId,\n values: valuesProp,\n collection,\n status\n }: SaveEntityProps<M>): Promise<Entity<M>> => {\n\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n console.debug(\"1\", {\n path,\n entityId,\n values: valuesProp,\n collection\n })\n const values = cmsToFirestoreModel(valuesProp, getFirestore(firebaseApp));\n\n console.debug(\"2\", {\n path,\n entityId,\n values: valuesProp,\n collection\n })\n const databaseId = collection?.databaseId;\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n const resolvedPath = path;\n\n const collectionReference: CollectionReference = collectionClause(firestore, path);\n console.debug(\"Saving entity\", {\n path,\n entityId,\n values,\n databaseId\n });\n\n let documentReference: DocumentReference;\n if (entityId) {\n documentReference = doc(collectionReference, String(entityId));\n } else {\n documentReference = doc(collectionReference);\n }\n return setDoc(documentReference, values, { merge: true })\n .then(() => {\n return {\n id: documentReference.id,\n path,\n values: firestoreToCMSModel(values)\n } as Entity<M>;\n })\n .catch((error) => {\n console.error(\"Error saving entity\", error);\n throw error;\n\n });\n }, [firebaseApp]),\n\n /**\n * Delete an entity\n * @param entity\n * @param collection\n * @group Firestore\n */\n deleteEntity: useCallback(<M extends Record<string, any>>(\n {\n entity\n }: DeleteEntityProps<M>\n ): Promise<void> => {\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const databaseId = entity.databaseId;\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n\n return deleteDoc(doc(firestore, entity.path, String(entity.id)));\n }, [firebaseApp]),\n\n /**\n * Check if the given property is unique in the given collection\n * @param path Collection path\n * @param name of the property\n * @param value\n * @param property\n * @param entityId\n * @return `true` if there are no other fields besides the given entity\n * @group Firestore\n */\n checkUniqueField: useCallback(async (\n path: string,\n name: string,\n value: any,\n entityId?: string | number,\n collection?: EntityCollection<any>\n ): Promise<boolean> => {\n\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const databaseId = collection?.databaseId;\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n\n if (value === undefined || value === null) {\n return Promise.resolve(true);\n }\n const q = query(collectionClause(firestore, path), whereClause(name, \"==\", cmsToFirestoreModel(value, firestore)));\n const snapshot = await getDocs(q);\n return snapshot.docs.filter(doc => doc.id !== entityId).length === 0;\n\n }, [firebaseApp]),\n\n countEntities: useCallback(async ({\n path,\n filter,\n order,\n orderBy,\n collection\n }: FetchCollectionProps<any>): Promise<number> => {\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n const databaseId = collection?.databaseId;\n const resolvedPath = path;\n const query = buildQuery(resolvedPath, filter, orderBy, order, undefined, undefined, databaseId);\n const snapshot = await getCountFromServer(query);\n return snapshot.data().count;\n }, [firebaseApp]),\n\n isFilterCombinationValid: useCallback(({\n path,\n collection,\n filterValues,\n sortBy\n }: {\n path: string,\n collection: EntityCollection<any>,\n filterValues: FilterValues<any>,\n sortBy?: [string, \"asc\" | \"desc\"],\n }): boolean => {\n\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n // If no indexes are defined, we assume the query is valid.\n // If there is no index in Firestore, and error message will be shown\n if (firestoreIndexesBuilder === undefined) return true;\n const resolvedPath = path;\n\n const indexes = firestoreIndexesBuilder?.({\n path: resolvedPath,\n collection\n });\n\n const sortKey = sortBy ? sortBy[0] : undefined;\n const sortDirection = sortBy ? sortBy[1] : undefined;\n\n // Order by clause cannot contain a field with an equality filter\n const values: [WhereFilterOp, any][] = Object.values(filterValues) as [WhereFilterOp, any][];\n\n const filterKeys = Object.keys(filterValues);\n const filtersCount = filterKeys.length;\n\n if (!sortKey && values.every((v) => v[0] === \"==\")) {\n return true;\n }\n\n if (filtersCount === 1 && (!sortKey || sortKey === filterKeys[0])) {\n return true;\n }\n\n if (!indexes && filtersCount > 1) {\n return false;\n }\n\n return !!indexes && indexes\n .filter((compositeIndex) => !sortKey || sortKey in compositeIndex)\n .find((compositeIndex) =>\n Object.entries(filterValues).every(([key, value]) => compositeIndex[key] !== undefined && (!sortDirection || compositeIndex[key] === sortDirection))\n ) !== undefined;\n }, [firebaseApp])\n\n };\n\n}\n\nconst createEntityFromDocument = <M extends Record<string, any>>(\n docSnap: DocumentSnapshot,\n databaseId?: string\n): Entity<M> => {\n const values = firestoreToCMSModel(docSnap.data());\n const path = getCMSPathFromFirestorePath(docSnap.ref.path);\n return {\n id: docSnap.id,\n path: path,\n values,\n databaseId\n };\n};\n\n/**\n * Recursive function that converts Firestore data types into CMS or plain\n * JS types.\n * Rebase uses Javascript dates internally instead of Firestore timestamps.\n * This makes it easier to interact with the rest of the libraries and\n * bindings.\n * Also, Firestore references are replaced with {@link EntityReference}\n * @param data\n * @group Firestore\n */\nexport function firestoreToCMSModel(data: any): any {\n if (data === null || data === undefined) return null;\n if (deleteField().isEqual(data)) {\n return undefined;\n }\n if (serverTimestamp().isEqual(data)) {\n return null;\n }\n if (data instanceof Timestamp || (typeof data.toDate === \"function\" && data.toDate() instanceof Date)) {\n return data.toDate();\n }\n if (data instanceof Date) {\n return data;\n }\n if (typeof data === \"object\" && \"__type__\" in data && data.__type__ === \"__vector__\") {\n return data; // already translated\n }\n if (data instanceof VectorValue || (typeof data === \"object\" && data !== null && typeof data.toArray === \"function\" && data.constructor?.name === \"VectorValue\")) {\n return { __type__: \"__vector__\",\nvalue: data.toArray() };\n }\n\n if (data instanceof FirestoreGeoPoint) {\n return new GeoPoint(data.latitude, data.longitude);\n }\n if (data instanceof DocumentReference) {\n // @ts-ignore\n const databaseId = data?.firestore?._databaseId?.database;\n return new EntityReference({ id: data.id,\npath: getCMSPathFromFirestorePath(data.path),\ndatabaseId });\n }\n if (Array.isArray(data)) {\n return data.map(firestoreToCMSModel).filter(v => v !== undefined);\n }\n if (typeof data === \"object\") {\n const result: Record<string, any> = {};\n for (const key of Object.keys(data)) {\n const childValue = firestoreToCMSModel(data[key]);\n if (childValue !== undefined)\n result[key] = childValue;\n }\n return result;\n }\n return data;\n}\n\n/**\n * Remove id from Firestore path\n * @param fsPath\n */\nfunction getCMSPathFromFirestorePath(fsPath: string): string {\n let to = fsPath.lastIndexOf(\"/\");\n to = to === -1 ? fsPath.length : to;\n return fsPath.substring(0, to);\n}\n\n\nexport function cmsToFirestoreModel(data: any, firestore: Firestore, inArray = false): any {\n if (data === undefined) {\n return deleteField();\n } else if (data === null) {\n return null;\n } else if (Array.isArray(data)) {\n return data.filter(v => v !== undefined).map(v => cmsToFirestoreModel(v, firestore, true));\n } else if (data.isEntityReference && data.isEntityReference()) {\n const targetFirestore = data.databaseId ? getFirestore(firestore.app, data.databaseId) : firestore;\n return doc(targetFirestore, data.path, data.id);\n } else if (data && typeof data === \"object\" && data.__type === \"relation\" && data.path && data.id) {\n return doc(firestore, data.path, String(data.id));\n } else if (data instanceof GeoPoint) {\n return new FirestoreGeoPoint(data.latitude, data.longitude);\n } else if (data instanceof Date) {\n return Timestamp.fromDate(data);\n } else if (data && typeof data === \"object\" && \"__type__\" in data && data.__type__ === \"__vector__\") {\n return vector(data.value || []);\n } else if (data && typeof data === \"object\") {\n return Object.entries(data)\n .map(([key, v]) => {\n const firestoreModel = cmsToFirestoreModel(v, firestore);\n if (firestoreModel !== undefined)\n return ({ [key]: firestoreModel });\n else\n return {};\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n }\n return data;\n}\n\nfunction currentTime(): any {\n return serverTimestamp();\n}\n\nfunction buildTextSearchControllerWithLocalSearch({\n textSearchControllerBuilder,\n firebaseApp,\n localTextSearchEnabled\n}: {\n textSearchControllerBuilder?: FirestoreTextSearchControllerBuilder,\n firebaseApp: FirebaseApp,\n localTextSearchEnabled: boolean\n}): FirestoreTextSearchController | undefined {\n if (!textSearchControllerBuilder && localTextSearchEnabled) {\n console.debug(\"Using local search only\");\n return localSearchControllerBuilder({ firebaseApp });\n }\n if (!localTextSearchEnabled && textSearchControllerBuilder) {\n console.debug(\"Using external text search only\");\n return textSearchControllerBuilder({ firebaseApp });\n }\n if (!textSearchControllerBuilder && !localTextSearchEnabled) {\n return undefined;\n }\n\n const localSearchController = localSearchControllerBuilder({ firebaseApp })\n const textSearchController = textSearchControllerBuilder!({ firebaseApp });\n return {\n init: async (props: {\n path: string,\n databaseId?: string,\n collection?: EntityCollection\n }) => {\n const b = await textSearchController.init(props);\n if (b) {\n console.debug(\"External Text search controller supports path\", props.path);\n return true;\n }\n if (localTextSearchEnabled)\n return localSearchController.init(props);\n return false;\n },\n search: async (props: {\n searchString: string,\n path: string,\n currentUser?: any,\n databaseId?: string\n }) => {\n const search = await textSearchController.search(props);\n return search ?? await localSearchController.search(props);\n }\n }\n}\n","import { FirebaseApp } from \"@firebase/app\";\nimport {\n Database,\n get,\n getDatabase,\n limitToFirst,\n onValue,\n orderByChild,\n orderByKey,\n push,\n query,\n ref,\n remove,\n set,\n startAt\n} from \"@firebase/database\";\nimport { useCallback } from \"react\";\nimport { DataDriver, DeleteEntityProps, Entity, FetchCollectionProps, FetchEntityProps, ListenCollectionProps, ListenEntityProps, SaveEntityProps } from \"@rebasepro/types\";\n\nexport function useFirebaseRTDBDelegate({ firebaseApp }: { firebaseApp?: FirebaseApp }): DataDriver {\n\n const fetchCollection = useCallback(async <M extends Record<string, any>>({\n path,\n filter,\n limit,\n startAfter,\n orderBy,\n order,\n searchString\n }: FetchCollectionProps<M>): Promise<Entity<M>[]> => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n let dbQuery = query(ref(database, path));\n\n // Example to apply \"limit\" and \"startAfter\"\n if (startAfter !== undefined) {\n dbQuery = query(dbQuery, orderByKey(), startAt(String(startAfter)));\n }\n if (limit !== undefined) {\n dbQuery = query(dbQuery, limitToFirst(limit));\n }\n\n const snapshot = await get(dbQuery);\n if (snapshot.exists()) {\n return Object.entries(snapshot.val()).map(([id, values]) => ({\n id,\n path: path,\n values: delegateToCMSModel(values) as M\n }));\n }\n return [];\n }, [firebaseApp]);\n\n const listenCollection = useCallback(<M extends Record<string, any>>({\n path,\n onUpdate\n // Realtime Database does not directly support onError in onValue\n }: ListenCollectionProps<M>): () => void => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n const dbRef = ref(database, path);\n const unsubscribe = onValue(dbRef, (snapshot) => {\n if (snapshot.exists()) {\n const result: Entity<M>[] = Object.entries(snapshot.val()).map(([id, values]) => ({\n id,\n path: path,\n values: delegateToCMSModel(values) as M\n }));\n onUpdate(result);\n } else {\n onUpdate([]);\n }\n });\n\n return () => unsubscribe();\n }, [firebaseApp]);\n\n const fetchEntity = useCallback(async <M extends Record<string, any>>({\n path,\n entityId\n }: FetchEntityProps<M>): Promise<Entity<M> | undefined> => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n const snapshot = await get(ref(database, `${path}/${entityId}`));\n if (snapshot.exists()) {\n return {\n id: entityId,\n path: path,\n values: delegateToCMSModel(snapshot.val()) as M\n };\n }\n return undefined;\n }, [firebaseApp]);\n\n const listenEntity = useCallback(<M extends Record<string, any>>({\n path,\n entityId,\n onUpdate,\n onError\n }: ListenEntityProps<M>): () => void => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n const dbRef = ref(database, `${path}/${entityId}`);\n const unsubscribe = onValue(dbRef, (snapshot) => {\n if (snapshot.exists()) {\n onUpdate({\n id: entityId,\n path,\n values: delegateToCMSModel(snapshot.val()) as M\n });\n } else {\n onError?.(new Error(\"Entity does not exist\"));\n }\n });\n\n return () => unsubscribe();\n }, [firebaseApp]);\n\n const saveEntity = useCallback(async <M extends Record<string, any>>({\n path,\n entityId,\n values\n }: SaveEntityProps<M>): Promise<Entity<M>> => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n // If entityId is not provided, a new entity will be created\n const finalId = entityId ?? push(ref(database, path)).key;\n if (!finalId) {\n throw new Error(\"Could not generate a new id\");\n }\n\n // Transform the data to RTDB format before saving\n const transformedValues = cmsToRTDBModel(values, database);\n await set(ref(database, `${path}/${finalId}`), transformedValues);\n\n return {\n id: finalId,\n path: path,\n values: values as M\n };\n }, [firebaseApp]);\n\n const deleteEntity = useCallback(async <M extends Record<string, any>>({\n entity\n }: DeleteEntityProps<M>): Promise<void> => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n await remove(ref(database, `${entity.path}/${entity.id}`));\n }, [firebaseApp]);\n\n // Implementing additional methods required by DataDriver\n const checkUniqueField = useCallback(async (slug: string, name: string, value: any, entityId?: string | number): Promise<boolean> => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n // Simplified example; the Realtime Database does not support querying with \"not equal\" conditions\n const dbRef = query(ref(database, slug), orderByChild(name), startAt(value), limitToFirst(1));\n const snapshot = await get(dbRef);\n\n if (!snapshot.exists()) {\n return true;\n }\n\n // Check if the found entity is the same as the one being checked\n const [key, entityValue] = Object.entries(snapshot.val())[0];\n if (entityValue && typeof entityValue === \"object\" && (entityValue as Record<string, unknown>)[name] === value && key === entityId) {\n return true;\n }\n\n return false;\n }, [firebaseApp]);\n\n const isFilterCombinationValid = useCallback(({\n path,\n filter,\n sortBy\n }: any): boolean => {\n return false;\n }, []);\n\n return {\n key: \"firebase_rtdb\",\n fetchCollection,\n listenCollection,\n fetchEntity,\n listenEntity,\n saveEntity,\n deleteEntity,\n checkUniqueField,\n isFilterCombinationValid,\n currentTime: () => new Date()\n };\n}\n\n\n/**\n * Transform data from RTDB format back to CMS format\n * This is used internally when fetching/listening to data\n */\nfunction delegateToCMSModel(data: any): any {\n if (data === null || data === undefined) return null;\n\n if (Array.isArray(data)) {\n return data.map(delegateToCMSModel).filter(v => v !== undefined);\n }\n\n if (typeof data === \"object\") {\n const result: Record<string, any> = {};\n for (const key of Object.keys(data)) {\n const childValue = delegateToCMSModel(data[key]);\n if (childValue !== undefined)\n result[key] = childValue;\n }\n return result;\n }\n\n return data;\n}\n\n/**\n * Transform data from CMS format to RTDB format\n * This is used internally when saving data\n */\nfunction cmsToRTDBModel(data: any, database: Database): any {\n if (data === undefined) {\n return null;\n } else if (data === null) {\n return null;\n } else if (Array.isArray(data)) {\n return data.filter(v => v !== undefined).map(v => cmsToRTDBModel(v, database));\n } else if (data.isEntityReference && data.isEntityReference()) {\n return ref(database, `${data.slug}/${data.id}`);\n } else if (data instanceof Date) {\n // For dates, convert to ISO string or timestamp.\n return data.toISOString();\n } else if (data && typeof data === \"object\") {\n return Object.entries(data)\n .map(([key, v]) => {\n const rtdbModel = cmsToRTDBModel(v, database);\n if (rtdbModel !== undefined)\n return { [key]: rtdbModel };\n else\n return {};\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n }\n return data;\n}\n","import { useEffect } from \"react\";\nimport { getAuth, RecaptchaVerifier } from \"@firebase/auth\";\n\ndeclare global {\n interface Window {\n recaptchaVerifier: RecaptchaVerifier;\n }\n}\n\nexport const RECAPTCHA_CONTAINER_ID = \"recaptcha-container\" as const;\n\nexport function useRecaptcha() {\n useEffect(() => {\n if (!window || window?.recaptchaVerifier) return;\n\n const auth = getAuth();\n\n window.recaptchaVerifier = new RecaptchaVerifier(\n auth,\n RECAPTCHA_CONTAINER_ID,\n {\n size: \"invisible\"\n }\n );\n }, []);\n\n return null;\n}\n","import React, { useCallback, useEffect } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { removeUndefined } from \"@rebasepro/utils\";\nimport {\n AuthController,\n Authenticator,\n DataDriver,\n Entity,\n Role,\n User,\n UserManagementDelegate\n} from \"@rebasepro/types\";\n\ntype UserWithRoleIds<USER extends User = any> = Omit<USER, \"roles\"> & { roles: string[] };\n\nexport interface UserManagementDelegateParams<CONTROLLER extends AuthController<any> = AuthController<any>> {\n\n authController: CONTROLLER;\n\n /**\n * The delegate in charge of persisting the data.\n */\n dataSourceDelegate?: DataDriver;\n\n /**\n * Path where the plugin users configuration is stored.\n * Default: __FIRECMS/config/users\n * You can specify a different path if you want to store the user management configuration in a different place.\n * Please keep in mind that the FireCMS users are not necessarily the same as the Firebase users (but they can be).\n * The path should be relative to the root of the database, and should always have an odd number of segments.\n */\n usersPath?: string;\n\n /**\n * Path where the plugin roles configuration is stored.\n * Default: __FIRECMS/config/roles\n */\n rolesPath?: string;\n\n /**\n * The roles that are available in the user management system.\n * If you provide this, the user management system will not fetch the roles from the database.\n */\n roles?: Role[];\n\n /**\n * If there are no roles in the database, provide a button to create the default roles.\n */\n allowDefaultRolesCreation?: boolean;\n\n /**\n * Include the collection config permissions in the user management system.\n */\n includeCollectionConfigPermissions?: boolean;\n\n}\n\n/**\n * This hook is used to build a user management object that can be used to\n * manage users and roles in a Firestore backend.\n * @param authController\n * @param dataSourceDelegate\n * @param usersPath\n * @param rolesPath\n * @param roles\n * @param allowDefaultRolesCreation\n * @param includeCollectionConfigPermissions\n */\nexport function useBuildUserManagement<CONTROLLER extends AuthController<any> = AuthController<any>,\n USER extends User = CONTROLLER extends AuthController<infer U> ? U : any>\n({\n authController,\n dataSourceDelegate,\n roles: rolesProp,\n usersPath = \"__FIRECMS/config/users\",\n rolesPath = \"__FIRECMS/config/roles\",\n allowDefaultRolesCreation,\n includeCollectionConfigPermissions\n }: UserManagementDelegateParams<CONTROLLER>): UserManagementDelegate<USER> & CONTROLLER {\n\n if (!authController) {\n throw Error(\"useBuildUserManagement: You need to provide an authController since version 3.0.0-beta.11. Check https://firecms.co/docs/pro/migrating_from_v3_beta\");\n }\n\n const rolesDefinedInCode = (rolesProp ?? [])?.length > 0;\n const [rolesLoading, setRolesLoading] = React.useState<boolean>(!rolesDefinedInCode);\n const [usersLoading, setUsersLoading] = React.useState<boolean>(true);\n const [roles, setRoles] = React.useState<Role[]>(rolesProp ?? []);\n const [usersWithRoleIds, setUsersWithRoleIds] = React.useState<UserWithRoleIds<USER>[]>([]);\n\n const users = usersWithRoleIds.map(u => ({\n ...u,\n }) as unknown as USER);\n\n const [rolesError, setRolesError] = React.useState<Error | undefined>();\n const [usersError, setUsersError] = React.useState<Error | undefined>();\n\n const _usersLoading = usersLoading;\n const _rolesLoading = rolesLoading;\n\n const loading = _rolesLoading || _usersLoading;\n\n useEffect(() => {\n if (rolesDefinedInCode) return;\n if (!dataSourceDelegate || !rolesPath) return;\n if (dataSourceDelegate.initialised !== undefined && !dataSourceDelegate.initialised) return;\n if (authController?.initialLoading) return;\n\n setRolesLoading(true);\n return dataSourceDelegate.listenCollection?.({\n path: rolesPath,\n onUpdate(entities: Entity<any>[]): void {\n setRolesError(undefined);\n console.debug(\"Updating roles\", entities);\n try {\n const newRoles = entityToRoles(entities);\n if (!equal(newRoles, roles)) {\n setRoles(newRoles);\n }\n } catch (e) {\n setRoles([]);\n console.error(\"Error loading roles\", e);\n setRolesError(e as Error);\n }\n setRolesLoading(false);\n },\n onError(e: any): void {\n setRoles([]);\n console.error(\"Error loading roles\", e);\n setRolesError(e);\n setRolesLoading(false);\n }\n });\n\n }, [rolesDefinedInCode, dataSourceDelegate?.initialised, authController?.initialLoading, authController?.user?.uid, rolesPath]);\n\n useEffect(() => {\n if (!dataSourceDelegate || !usersPath) return;\n if (dataSourceDelegate.initialised !== undefined && !dataSourceDelegate.initialised) {\n return;\n }\n if (authController?.initialLoading) {\n return;\n }\n\n setUsersLoading(true);\n return dataSourceDelegate.listenCollection?.({\n path: usersPath,\n onUpdate(entities: Entity<any>[]): void {\n console.debug(\"Updating users\", entities);\n setUsersError(undefined);\n try {\n const newUsers = entitiesToUsers(entities);\n // if (!equal(newUsers, usersWithRoleIds))\n setUsersWithRoleIds(newUsers);\n } catch (e) {\n setUsersWithRoleIds([]);\n console.error(\"Error loading users\", e);\n setUsersError(e as Error);\n }\n setUsersLoading(false);\n },\n onError(e: any): void {\n console.error(\"Error loading users\", e);\n setUsersWithRoleIds([]);\n setUsersError(e);\n setUsersLoading(false);\n }\n });\n\n }, [dataSourceDelegate?.initialised, authController?.initialLoading, authController?.user?.uid, usersPath]);\n\n const saveUser = useCallback(async (user: USER): Promise<USER> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!usersPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n\n console.debug(\"Persisting user\", user);\n\n const roleIds = user.roles;\n const email = user.email?.toLowerCase().trim();\n if (!email) throw Error(\"Email is required\");\n\n const userExists = users.find(u => u.email?.toLowerCase() === email);\n const data = {\n ...user,\n roles: roleIds ?? []\n };\n if (!userExists) {\n // @ts-ignore\n data.created_on = new Date();\n }\n // delete the previous user entry if it exists and the uid has changed\n if (userExists && userExists.uid !== user.uid) {\n const entity: Entity<any> = {\n values: {},\n path: usersPath,\n id: userExists.uid\n }\n await dataSourceDelegate.deleteEntity({ entity })\n .then(() => {\n console.debug(\"Deleted previous user\", userExists);\n })\n .catch(e => {\n console.error(\"Error deleting user\", e);\n });\n\n }\n\n return dataSourceDelegate.saveEntity({\n status: \"existing\",\n path: usersPath,\n entityId: email,\n values: removeUndefined(data) as Record<string, unknown>\n }).then(() => user);\n }, [usersPath, dataSourceDelegate?.initialised]);\n\n const saveRole = useCallback((role: Role): Promise<void> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!rolesPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n console.debug(\"Persisting role\", role);\n const {\n id,\n ...roleData\n } = role;\n return dataSourceDelegate.saveEntity({\n status: \"existing\",\n path: rolesPath,\n entityId: id,\n values: removeUndefined(roleData) as Record<string, unknown>\n }).then(() => {\n return;\n });\n }, [rolesPath, dataSourceDelegate?.initialised]);\n\n const deleteUser = useCallback(async (user: User): Promise<void> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!usersPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n console.debug(\"Deleting\", user);\n const { uid } = user;\n const entity: Entity<any> = {\n path: usersPath,\n id: uid,\n values: {}\n };\n await dataSourceDelegate.deleteEntity({ entity })\n }, [usersPath, dataSourceDelegate?.initialised]);\n\n const deleteRole = useCallback(async (role: Role): Promise<void> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!rolesPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n console.debug(\"Deleting\", role);\n const { id } = role;\n const entity: Entity<any> = {\n path: rolesPath,\n id: id,\n values: {}\n };\n await dataSourceDelegate.deleteEntity({ entity })\n }, [rolesPath, dataSourceDelegate?.initialised]);\n\n\n\n const defineRolesFor: ((user: User) => Role[] | undefined) = useCallback((user) => {\n if (!usersWithRoleIds) throw Error(\"Users not loaded\");\n const mgmtUser = usersWithRoleIds.find(u => u.email?.toLowerCase() === user?.email?.toLowerCase());\n if (!mgmtUser || !mgmtUser.roles) return undefined;\n return roles.filter(r => mgmtUser.roles.includes(r.id));\n }, [roles, usersWithRoleIds]);\n\n const authenticator: Authenticator<USER> = useCallback(({ user }) => {\n\n if (loading) {\n return false;\n }\n if (user === null) {\n console.warn(\"User is null, returning\");\n return false;\n }\n\n if (users.length === 0) {\n console.warn(\"No users created yet\");\n return true; // If there are no users created yet, we allow access to every user\n }\n\n const mgmtUser = users.find(u => u.email?.toLowerCase() === user?.email?.toLowerCase());\n if (mgmtUser) {\n // check if the uid or photoURL needs to be updated in the user management system\n const needsUidUpdate = mgmtUser.uid !== user.uid;\n const needsPhotoUpdate = user.photoURL && mgmtUser.photoURL !== user.photoURL;\n\n if (needsUidUpdate || needsPhotoUpdate) {\n const updateReason = needsUidUpdate ? \"uid\" : \"photoURL\";\n console.debug(`User ${updateReason} has changed, updating user in user management system`);\n saveUser({\n ...mgmtUser,\n uid: user.uid,\n ...(needsPhotoUpdate ? { photoURL: user.photoURL } : {})\n }).then(() => {\n console.debug(\"User updated in user management system\", mgmtUser);\n }).catch(e => {\n console.error(\"Error updating user in user management system\", e);\n });\n }\n console.debug(\"User found in user management system\", mgmtUser);\n return true;\n }\n\n throw Error(\"Could not find a user with the provided email in the user management system.\");\n }, [loading, users]);\n\n const userRoles = authController.user ? defineRolesFor(authController.user) : undefined;\n const isAdmin = (userRoles ?? []).some(r => r.id === \"admin\");\n\n const userRoleIds = userRoles?.map(r => r.id);\n useEffect(() => {\n console.debug(\"Setting user roles\", {\n userRoles,\n roles\n });\n authController.setUserRoles?.(userRoles ?? []);\n }, [userRoleIds]);\n\n const getUser = useCallback((uid: string): USER | null => {\n if (!users) return null;\n const user = users.find(u => u.uid === uid);\n return user ?? null;\n }, [users]);\n\n return {\n loading,\n roles,\n users,\n saveUser,\n saveRole,\n rolesError,\n deleteUser,\n deleteRole,\n usersError,\n isAdmin,\n allowDefaultRolesCreation: allowDefaultRolesCreation === undefined ? true : allowDefaultRolesCreation,\n includeCollectionConfigPermissions: Boolean(includeCollectionConfigPermissions),\n defineRolesFor,\n authenticator,\n ...authController,\n initialLoading: authController.initialLoading || loading,\n userRoles: userRoles,\n getUser,\n user: authController.user ? {\n ...authController.user,\n roles: userRoles\n } : null\n }\n}\n\nconst entitiesToUsers = (docs: Entity<Omit<UserWithRoleIds, \"id\">>[]): (UserWithRoleIds)[] => {\n return docs.map((doc) => {\n const data = doc.values as any;\n const newVar = {\n uid: doc.id,\n ...data,\n created_on: data?.created_on,\n updated_on: data?.updated_on\n };\n return newVar as (UserWithRoleIds);\n });\n}\n\nconst entityToRoles = (entities: Entity<Omit<Role, \"id\">>[]): Role[] => {\n return entities.map((doc) => ({\n id: doc.id,\n ...doc.values\n } as Role));\n}\n","export const googleIcon = (mode: \"light\" | \"dark\") => <>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 64 64\"\n width={24}\n height={24}\n >\n <linearGradient\n id=\"95yY7w43Oj6n2vH63j6HJb\"\n x1=\"29.401\"\n x2=\"29.401\"\n y1=\"4.064\"\n y2=\"106.734\"\n gradientTransform=\"matrix(1 0 0 -1 0 66)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#ff5840\"/>\n <stop offset=\".007\" stopColor=\"#ff5840\"/>\n <stop offset=\".989\" stopColor=\"#fa528c\"/>\n <stop offset=\"1\" stopColor=\"#fa528c\"/>\n </linearGradient>\n <path\n fill=\"url(#95yY7w43Oj6n2vH63j6HJb)\"\n d=\"M47.46,15.5l-1.37,1.48c-1.34,1.44-3.5,1.67-5.15,0.6c-2.71-1.75-6.43-3.13-11-2.37 c-4.94,0.83-9.17,3.85-11.64, 7.97l-8.03-6.08C14.99,9.82,23.2,5,32.5,5c5,0,9.94,1.56,14.27,4.46 C48.81,10.83,49.13,13.71,47.46,15.5z\"\n />\n <linearGradient\n id=\"95yY7w43Oj6n2vH63j6HJc\"\n x1=\"12.148\"\n x2=\"12.148\"\n y1=\".872\"\n y2=\"47.812\"\n gradientTransform=\"matrix(1 0 0 -1 0 66)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#feaa53\"/>\n <stop offset=\".612\" stopColor=\"#ffcd49\"/>\n <stop offset=\"1\" stopColor=\"#ffde44\"/>\n </linearGradient>\n <path\n fill=\"url(#95yY7w43Oj6n2vH63j6HJc)\"\n d=\"M16.01,30.91c-0.09,2.47,0.37,4.83,1.27,6.96l-8.21,6.05c-1.35-2.51-2.3-5.28-2.75-8.22 c-1.06-6.88,0.54-13.38, 3.95-18.6l8.03,6.08C16.93,25.47,16.1,28.11,16.01,30.91z\"\n />\n <linearGradient\n id=\"95yY7w43Oj6n2vH63j6HJd\"\n x1=\"29.76\"\n x2=\"29.76\"\n y1=\"32.149\"\n y2=\"-6.939\"\n gradientTransform=\"matrix(1 0 0 -1 0 66)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#42d778\"/>\n <stop offset=\".428\" stopColor=\"#3dca76\"/>\n <stop offset=\"1\" stopColor=\"#34b171\"/>\n </linearGradient>\n <path\n fill=\"url(#95yY7w43Oj6n2vH63j6HJd)\"\n d=\"M50.45,51.28c-4.55,4.07-10.61,6.57-17.36,6.71C22.91,58.2,13.66,52.53,9.07,43.92l8.21-6.05 C19.78,43.81, 25.67,48,32.5,48c3.94,0,7.52-1.28,10.33-3.44L50.45,51.28z\"\n />\n <linearGradient\n id=\"95yY7w43Oj6n2vH63j6HJe\"\n x1=\"46\"\n x2=\"46\"\n y1=\"3.638\"\n y2=\"35.593\"\n gradientTransform=\"matrix(1 0 0 -1 0 66)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#155cde\"/>\n <stop offset=\".278\" stopColor=\"#1f7fe5\"/>\n <stop offset=\".569\" stopColor=\"#279ceb\"/>\n <stop offset=\".82\" stopColor=\"#2cafef\"/>\n <stop offset=\"1\" stopColor=\"#2eb5f0\"/>\n </linearGradient>\n <path\n fill=\"url(#95yY7w43Oj6n2vH63j6HJe)\"\n d=\"M59,31.97c0.01,7.73-3.26,14.58-8.55,19.31l-7.62-6.72c2.1-1.61,3.77-3.71,4.84-6.15\n c0.29-0.66-0.2-1.41-0.92-1.41H37c-2.21,0-4-1.79-4-4v-2c0-2.21,1.79-4,4-4h17C56.75,27,59,29.22,59,31.97z\"\n />\n </svg>\n</>;\n\nexport const appleIcon = (mode: \"light\" | \"dark\") => <svg width={24} height={24}\n viewBox=\"0 0 56 56\"\n style={{ transform: \"scale(2.8)\" }}\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g stroke={mode === \"light\" ? \"#424245\" : \"white\"} strokeWidth=\"0.5\"\n fillRule=\"evenodd\">\n <path\n d=\"M28.2226562,20.3846154 C29.0546875,20.3846154 30.0976562,19.8048315 30.71875,19.0317864 C31.28125,18.3312142 31.6914062,17.352829 31.6914062,16.3744437 C31.6914062,16.2415766 31.6796875,16.1087095 31.65625,16 C30.7304687,16.0362365 29.6171875,16.640178 28.9492187,17.4494596 C28.421875,18.06548 27.9414062,19.0317864 27.9414062,20.0222505 C27.9414062,20.1671964 27.9648438,20.3121424 27.9765625,20.3604577 C28.0351562,20.3725366 28.1289062,20.3846154 28.2226562,20.3846154 Z M25.2929688,35 C26.4296875,35 26.9335938,34.214876 28.3515625,34.214876 C29.7929688,34.214876 30.109375,34.9758423 31.375,34.9758423 C32.6171875,34.9758423 33.4492188,33.792117 34.234375,32.6325493 C35.1132812,31.3038779 35.4765625,29.9993643 35.5,29.9389701 C35.4179688,29.9148125 33.0390625,28.9122695 33.0390625,26.0979021 C33.0390625,23.6579784 34.9140625,22.5588048 35.0195312,22.474253 C33.7773438,20.6382708 31.890625,20.5899555 31.375,20.5899555 C29.9804688,20.5899555 28.84375,21.4596313 28.1289062,21.4596313 C27.3554688,21.4596313 26.3359375,20.6382708 25.1289062,20.6382708 C22.8320312,20.6382708 20.5,22.5950413 20.5,26.2911634 C20.5,28.5861411 21.3671875,31.013986 22.4335938,32.5842339 C23.3476562,33.9129053 24.1445312,35 25.2929688,35 Z\"\n fill={mode === \"light\" ? \"#424245\" : \"white\"} fillRule=\"nonzero\"/>\n </g>\n</svg>;\n\nexport const githubIcon = (mode: \"light\" | \"dark\") => <svg\n fill={mode === \"light\" ? \"#1c1e21\" : \"white\"}\n role=\"img\"\n viewBox=\"0 0 24 24\"\n width={24}\n height={24}\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"/>\n</svg>;\n\n\nexport const facebookIcon = (mode: \"light\" | \"dark\") => <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={24} height={24}\n viewBox=\"0 0 90 90\">\n <g>\n <path\n d=\"M90,15.001C90,7.119,82.884,0,75,0H15C7.116,0,0,7.119,0,15.001v59.998 C0,82.881,7.116,90,15.001,90H45V56H34V41h11v-5.844C45,25.077,52.568,16,61.875,16H74v15H61.875C60.548,31,59,32.611,59,35.024V41 h15v15H59v34h16c7.884,0,15-7.119,15-15.001V15.001z\"\n fill={mode === \"light\" ? \"#39569c\" : \"white\"}/>\n </g>\n</svg>;\n\nexport const microsoftIcon = (mode: \"light\" | \"dark\") => <svg\n xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24}\n viewBox=\"0 0 480 480\">\n <g>\n <path\n d=\"M0.176,224L0.001,67.963l192-26.072V224H0.176z M224.001,37.241L479.937,0v224H224.001V37.241z M479.999,256l-0.062,224 l-255.936-36.008V256H479.999z M192.001,439.918L0.157,413.621L0.147,256h191.854V439.918z\"\n fill={mode === \"light\" ? \"#00a2ed\" : \"white\"}/>\n </g>\n</svg>;\n\nexport const twitterIcon = (mode: \"light\" | \"dark\") => <svg\n xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24}\n viewBox=\"0 0 24 24\">\n <path fill={mode === \"light\" ? \"#00acee\" : \"white\"}\n d=\"M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z\"/>\n</svg>;\n\n","\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { FirebaseApp, FirebaseError } from \"@firebase/app\";\nimport { ErrorView, RebaseLogo, useModeController, useSnackbarController } from \"@rebasepro/core\";\nimport { Button, CircularProgress, cls, IconButton, LoadingButton, TextField, Typography , iconSize } from \"@rebasepro/ui\";\nimport { ArrowLeftIcon, MailIcon, PhoneIcon, UserIcon } from \"lucide-react\";\nimport { appleIcon, facebookIcon, githubIcon, googleIcon, microsoftIcon, twitterIcon } from \"./social_icons\";\nimport {\n getAuth,\n getMultiFactorResolver,\n MultiFactorError,\n PhoneAuthProvider,\n PhoneMultiFactorGenerator,\n RecaptchaVerifier\n} from \"@firebase/auth\";\nimport {\n FirebaseAuthController,\n FirebaseSignInOption,\n FirebaseSignInProvider,\n RECAPTCHA_CONTAINER_ID,\n useRecaptcha\n} from \"../index\";\n\n/**\n * @category Firebase\n */\nexport interface FirebaseLoginViewProps {\n\n /**\n * Firebase app this login view is accessing\n */\n firebaseApp: FirebaseApp;\n\n /**\n * Delegate holding the auth state\n */\n authController: FirebaseAuthController;\n\n /**\n * Path to the logo displayed in the login screen\n */\n logo?: string;\n\n /**\n * Enable the skip login button\n */\n allowSkipLogin?: boolean;\n\n /**\n * Each of the sign in options that get a custom button\n */\n signInOptions: Array<FirebaseSignInProvider | FirebaseSignInOption>;\n\n /**\n * Disable the login buttons\n */\n disabled?: boolean;\n\n /**\n * Prevent users from creating new users in when the `signInOptions` value\n * is `password`. This does not apply to the rest of login providers.\n */\n disableSignupScreen?: boolean;\n\n /**\n * Prevent users from resetting their password when the `signInOptions` value\n * is `password`. This does not apply to the rest of login providers.\n */\n disableResetPassword?: boolean;\n\n /**\n * Display this component when no user is found a user tries to log in\n * when the `signInOptions` value is `password`.\n */\n noUserComponent?: ReactNode;\n\n /**\n * Include additional components in the login view, on top of the login buttons.\n */\n children?: ReactNode;\n\n /**\n * Display this component bellow the sign-in buttons.\n * Useful for adding checkboxes for privacy and terms and conditions.\n * You may want to use it in conjunction with the `disabled` prop.\n */\n additionalComponent?: ReactNode;\n\n notAllowedError?: any;\n\n className?: string;\n\n}\n\n/**\n * Use this component to render a login view, that updates\n * the state of the {@link FirebaseAuthController} based on the result\n\n * @category Firebase\n */\nexport function FirebaseLoginView({\n children,\n allowSkipLogin,\n logo,\n signInOptions,\n firebaseApp,\n authController,\n noUserComponent,\n disableSignupScreen = false,\n disableResetPassword = false,\n disabled = false,\n additionalComponent,\n notAllowedError,\n className\n}: FirebaseLoginViewProps) {\n\n const modeState = useModeController();\n\n const [passwordLoginSelected, setPasswordLoginSelected] = useState(false);\n\n const [phoneLoginSelected, setPhoneLoginSelected] = useState(false);\n\n const [fadeIn, setFadeIn] = useState(false);\n\n useEffect(() => {\n // Trigger the fade-in effect on component mount\n const timer = setTimeout(() => {\n setFadeIn(true);\n }, 50); // Small delay to ensure transition works properly\n\n return () => clearTimeout(timer);\n }, []);\n\n const resolvedSignInOptions: FirebaseSignInProvider[] = signInOptions.map((o) => {\n if (typeof o === \"object\") {\n return o.provider;\n } else return o as FirebaseSignInProvider;\n })\n\n const sendMFASms = useCallback(() => {\n const auth = getAuth(firebaseApp);\n const recaptchaVerifier = new RecaptchaVerifier(auth, \"recaptcha\", { size: \"invisible\" });\n\n const resolver = getMultiFactorResolver(auth, authController.authProviderError as MultiFactorError);\n\n if (resolver.hints[0].factorId === PhoneMultiFactorGenerator.FACTOR_ID) {\n\n const phoneInfoOptions = {\n multiFactorHint: resolver.hints[0],\n session: resolver.session\n };\n const phoneAuthProvider = new PhoneAuthProvider(auth);\n // Send SMS verification code\n phoneAuthProvider.verifyPhoneNumber(phoneInfoOptions, recaptchaVerifier)\n .then(function (verificationId) {\n\n // Ask user for the SMS verification code. Then:\n const verificationCode = String(window.prompt(\"Please enter the verification \" + \"code that was sent to your mobile device.\"));\n const cred = PhoneAuthProvider.credential(verificationId, verificationCode);\n const multiFactorAssertion = PhoneMultiFactorGenerator.assertion(cred);\n // // Complete sign-in.\n return resolver.resolveSignIn(multiFactorAssertion);\n\n })\n\n } else {\n // Unsupported second factor.\n console.warn(\"Unsupported second factor.\");\n }\n\n }, [authController.authProviderError]);\n\n function buildErrorView() {\n let errorView: any;\n if (authController.user != null) return errorView; // if the user is logged in via MFA\n const ignoredCodes = [\"auth/popup-closed-by-user\", \"auth/cancelled-popup-request\"];\n if (authController.authProviderError) {\n const authError = authController.authProviderError as FirebaseError;\n if (authError.code === \"auth/operation-not-allowed\" ||\n authError.code === \"auth/configuration-not-found\") {\n errorView =\n <>\n <div className=\"p-4\">\n <ErrorView\n title={\"Firebase Auth not enabled\"}\n error={\"You need to enable Firebase Auth and the corresponding login provider in your Firebase project\"}/>\n </div>\n {firebaseApp &&\n <div className=\"p-4\">\n <a href={`https://console.firebase.google.com/project/${firebaseApp.options.projectId}/authentication/providers`}\n rel=\"noopener noreferrer\"\n target=\"_blank\">\n <Button variant=\"text\"\n color=\"error\">\n Open Firebase configuration\n </Button>\n </a>\n </div>}\n </>;\n } else if (authError.code === \"auth/invalid-api-key\") {\n errorView = <div className=\"p-4\">\n <ErrorView\n title={\"Invalid API key\"}\n error={\"auth/invalid-api-key: Check that your Firebase config is set correctly in your `firebase_config.ts` file\"}/>\n </div>;\n } else if (authError.code === \"auth/email-already-in-use\") {\n errorView = <div className=\"p-4\">\n <ErrorView\n title={\"Email already in use\"}\n error={\"The selected email is already in use by another account\"}/>\n </div>;\n } else if (authError.code === \"auth/invalid-credential\") {\n errorView = <div className=\"p-4\">\n <ErrorView\n title={\"Invalid credential\"}\n error={\"The provided credential is not correct\"}/>\n </div>;\n } else if (!ignoredCodes.includes(authError.code)) {\n if (authError.code === \"auth/multi-factor-auth-required\") {\n sendMFASms();\n }\n errorView =\n <div className=\"p-4\">\n <ErrorView error={authController.authProviderError as Error}/>\n </div>;\n }\n }\n return errorView;\n }\n\n let logoComponent;\n if (logo) {\n logoComponent = <img src={logo}\n style={{\n height: \"100%\",\n width: \"100%\",\n objectFit: \"contain\"\n }}\n alt={\"Logo\"}/>;\n } else {\n logoComponent = <RebaseLogo/>;\n }\n\n let notAllowedMessage: string | undefined;\n if (notAllowedError) {\n if (typeof notAllowedError === \"string\") {\n notAllowedMessage = notAllowedError;\n } else if (notAllowedError instanceof Error) {\n notAllowedMessage = notAllowedError.message;\n } else {\n notAllowedMessage = \"It looks like you don't have access to the CMS, based on the specified Authenticator configuration\";\n }\n }\n\n const fadeStyle = {\n opacity: fadeIn ? 1 : 0,\n transition: \"opacity 0.6s ease-in-out\"\n };\n\n return (\n\n <div\n className={cls(\"flex flex-col items-center justify-center min-w-full p-4\", className)}\n style={fadeStyle}>\n <div id=\"recaptcha\"></div>\n <div\n className=\"flex flex-col items-center w-full max-w-[500px]\">\n\n <div className=\"p-1 w-64 h-64 m-4\">\n {logoComponent}\n </div>\n\n {children}\n\n {notAllowedMessage &&\n <div className=\"p-8\">\n <ErrorView error={notAllowedMessage}/>\n </div>}\n\n {buildErrorView()}\n\n {(!passwordLoginSelected && !phoneLoginSelected) && <div className={\"my-4 w-full\"}>\n\n {buildOauthLoginButtons(authController, resolvedSignInOptions, modeState.mode, disabled)}\n\n {resolvedSignInOptions.includes(\"password\") &&\n <LoginButton\n disabled={disabled}\n text={\"Email/password\"}\n icon={<MailIcon size={iconSize.medium}/>}\n onClick={() => setPasswordLoginSelected(true)}/>}\n\n {resolvedSignInOptions.includes(\"phone\") &&\n <LoginButton\n disabled={disabled}\n text={\"PhoneIcon number\"}\n icon={<PhoneIcon size={iconSize.medium}/>}\n onClick={() => setPhoneLoginSelected(true)}/>}\n\n {resolvedSignInOptions.includes(\"anonymous\") &&\n <LoginButton\n disabled={disabled}\n text={\"Log in anonymously\"}\n icon={<UserIcon\n size={\"medium\"}/>}\n onClick={authController.anonymousLogin}/>}\n\n {allowSkipLogin &&\n <Button\n className={\"m-1 mb-4\"}\n variant={\"text\"}\n disabled={disabled}\n onClick={authController.skipLogin}>\n Skip login\n </Button>\n }\n\n </div>}\n\n {passwordLoginSelected && <LoginForm\n authController={authController}\n onClose={() => setPasswordLoginSelected(false)}\n mode={modeState.mode}\n noUserComponent={noUserComponent}\n disableSignupScreen={disableSignupScreen}\n disableResetPassword={disableResetPassword}\n />}\n\n {phoneLoginSelected && <PhoneLoginForm\n authController={authController}\n onClose={() => setPhoneLoginSelected(false)}\n />}\n\n {!passwordLoginSelected && !phoneLoginSelected && additionalComponent}\n\n </div>\n </div>\n );\n}\n\nexport function LoginButton({\n icon,\n onClick,\n text,\n disabled\n}: {\n icon: React.ReactNode,\n onClick: () => void,\n text: string,\n disabled?: boolean\n}) {\n return (\n <div className=\"my-1 w-full\">\n <Button\n className={cls(\"w-full bg-white dark:bg-surface-950 text-surface-900 dark:text-surface-100\", disabled ? \"\" : \"hover:text-surface-950 hover:dark:text-white\")}\n style={{\n height: \"40px\",\n borderRadius: \"4px\",\n fontSize: \"14px\"\n }}\n\n disabled={disabled}\n onClick={onClick}>\n <div\n className=\"p-1 flex h-8 items-center justify-items-center\">\n <div\n className=\"flex flex-col w-8 items-center justify-items-center mr-4\">\n {icon}\n </div>\n <div className=\"grow pl-2 text-center\">{text}</div>\n </div>\n </Button>\n </div>\n )\n}\n\nfunction PhoneLoginForm({\n onClose,\n authController\n}: {\n onClose: () => void,\n authController: FirebaseAuthController,\n}) {\n useRecaptcha();\n\n const [phone, setPhone] = useState<string>();\n const [code, setCode] = useState<string>();\n const [isInvalidCode, setIsInvalidCode] = useState(false);\n\n const handleSubmit = async (event: any) => {\n event.preventDefault();\n\n if (code && authController.confirmationResult) {\n setIsInvalidCode(false);\n\n authController.confirmationResult.confirm(code).catch((e: FirebaseError) => {\n if (e.code === \"auth/invalid-verification-code\") {\n setIsInvalidCode(true)\n }\n });\n } else {\n if (phone) {\n authController.phoneLogin(phone, window.recaptchaVerifier);\n }\n }\n }\n\n return (\n <form onSubmit={handleSubmit}>\n {isInvalidCode &&\n <div className=\"p-8\">\n <ErrorView error={\"Invalid confirmation code\"}/>\n </div>}\n\n <div id={RECAPTCHA_CONTAINER_ID}/>\n\n <div className={\"flex flex-col gap-1\"}>\n <IconButton\n onClick={onClose}>\n <ArrowLeftIcon className=\"w-5 h-5\"/>\n </IconButton>\n <div className=\"p-1 flex\">\n <Typography align={\"center\"}\n variant={\"subtitle2\"}>{\"Please enter your phone number\"}</Typography>\n </div>\n <TextField placeholder=\"\"\n value={phone ?? \"\"}\n disabled={Boolean(phone && (authController.authLoading || authController.confirmationResult))}\n type=\"phone\"\n onChange={(event: any) => setPhone(event.target.value)}/>\n {Boolean(phone && authController.confirmationResult) &&\n <>\n <div className=\"mt-2 p-1 flex\">\n <Typography align={\"center\"}\n variant={\"subtitle2\"}>{\"Please enter the confirmation code\"}</Typography>\n </div>\n <TextField placeholder=\"\"\n value={code ?? \"\"}\n type=\"text\"\n onChange={(event: any) => setCode(event.target.value)}/>\n </>\n }\n\n <div className=\"flex justify-end items-center w-full\">\n\n {authController.authLoading &&\n <CircularProgress className=\"p-1\" size={\"small\"}/>\n }\n\n <Button type=\"submit\">\n {\"Ok\"}\n </Button>\n </div>\n\n </div>\n </form>\n );\n}\n\ntype LoginFormMode = \"email\" | \"password\" | \"registration\";\n\nfunction LoginForm({\n onClose,\n authController,\n mode,\n noUserComponent,\n disableSignupScreen,\n disableResetPassword\n}: {\n onClose: () => void,\n authController: FirebaseAuthController,\n mode: \"light\" | \"dark\",\n noUserComponent?: ReactNode,\n disableSignupScreen: boolean,\n disableResetPassword?: boolean\n}) {\n\n const passwordRef = useRef<HTMLInputElement | null>(null);\n\n const [loginState, setLoginState] = useState<LoginFormMode>(\"email\"); // [\"email\", \"password\", \"registration\"]\n const [email, setEmail] = useState<string>();\n const [password, setPassword] = useState<string>();\n const [previouslyUsedMethodsForUser, setPreviouslyUsedMethodsForUser] = useState<string[] | undefined>();\n const [resettingPassword, setResettingPassword] = useState(false);\n\n const snackbarController = useSnackbarController();\n\n useEffect(() => {\n if ((loginState === \"password\" || loginState === \"registration\") && passwordRef.current) {\n passwordRef.current.focus()\n }\n }, [loginState]);\n\n useEffect(() => {\n if (!document) return;\n const escFunction = (event: any) => {\n if (event.keyCode === 27) {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", escFunction, false);\n return () => {\n document.removeEventListener(\"keydown\", escFunction, false);\n };\n }, [onClose]);\n\n function handleEnterEmail() {\n if (email) {\n authController.fetchSignInMethodsForEmail(email).then((availableProviders) => {\n setPreviouslyUsedMethodsForUser(availableProviders.filter(p => p !== \"password\"));\n });\n setLoginState(\"password\");\n }\n }\n\n function handleEnterPassword() {\n if (email && password) {\n authController.emailPasswordLogin(email, password);\n }\n }\n\n function handleRegistration() {\n if (email && password) {\n authController.createUserWithEmailAndPassword(email, password);\n }\n }\n\n const onBackPressed = () => {\n if (loginState === \"email\") {\n onClose();\n } else if (loginState === \"password\" || loginState === \"registration\") {\n setLoginState(\"email\");\n } else {\n setPreviouslyUsedMethodsForUser(undefined);\n }\n }\n\n const handleSubmit = (event: any) => {\n event.preventDefault();\n if (loginState === \"email\") {\n handleEnterEmail();\n } else if (loginState === \"password\") {\n handleEnterPassword();\n } else if (loginState === \"registration\") {\n handleRegistration();\n }\n }\n\n const label = loginState === \"registration\"\n ? \"Please enter your email and password to create an account\"\n : (loginState === \"password\" ? \"Please enter your password\" : \"Please enter your email\");\n\n return (\n <form\n className={\"w-full\"}\n onSubmit={handleSubmit}>\n\n <div className={\"max-w-[480px] w-full flex flex-col gap-4\"}>\n <IconButton\n onClick={onBackPressed}>\n <ArrowLeftIcon className=\"w-5 h-5\"/>\n </IconButton>\n\n <div>\n {loginState === \"registration\" && noUserComponent}\n </div>\n\n <Typography\n className={`${loginState === \"registration\" && disableSignupScreen ? \"hidden\" : \"flex\"}`}\n variant={\"subtitle2\"}>{label}</Typography>\n\n {(loginState === \"email\" || loginState === \"registration\") && <TextField placeholder=\"Email\" autoFocus\n value={email ?? \"\"}\n disabled={authController.authLoading}\n type=\"email\"\n onChange={(event: any) => setEmail(event.target.value)}/>}\n\n <div\n className={`${loginState === \"password\" || (loginState === \"registration\" && !disableSignupScreen) ? \"block\" : \"hidden\"}`}>\n <TextField placeholder=\"Password\"\n value={password ?? \"\"}\n disabled={authController.authLoading}\n inputRef={passwordRef}\n type=\"password\"\n onChange={(event: any) => setPassword(event.target.value)}/>\n </div>\n\n <div\n className={`${loginState === \"registration\" && disableSignupScreen ? \"hidden\" : \"flex\"} justify-end items-center w-full flex gap-2`}>\n\n {authController.authLoading &&\n <CircularProgress className=\"p-1\" size={\"small\"}/>\n }\n\n {!disableResetPassword && <LoadingButton variant=\"text\"\n loading={resettingPassword}\n onClick={email\n ? async () => {\n setResettingPassword(true);\n try {\n try {\n await authController.sendPasswordResetEmail(email);\n snackbarController.open({\n message: \"Password reset email sent\",\n type: \"success\"\n });\n } catch (e: any) {\n snackbarController.open({\n message: e.message,\n type: \"error\"\n });\n }\n } finally {\n setResettingPassword(false);\n }\n }\n : undefined}>\n Reset password\n </LoadingButton>}\n\n {!disableSignupScreen && loginState === \"email\" &&\n <Button variant=\"text\" onClick={() => setLoginState(\"registration\")}>\n New user\n </Button>}\n\n <Button type=\"submit\">\n {loginState === \"registration\" ? \"Create account\" : (loginState === \"password\" ? \"Login\" : \"Login\")}\n </Button>\n </div>\n\n {previouslyUsedMethodsForUser && previouslyUsedMethodsForUser.length > 0 &&\n <div className={\"flex flex-col gap-4 p-4\"}>\n <div>\n <Typography variant={\"subtitle2\"}>\n You already have an account\n </Typography>\n <Typography variant={\"body2\"}>\n You can use one of these\n methods to login with {email}\n </Typography>\n </div>\n\n <div>\n {previouslyUsedMethodsForUser && buildOauthLoginButtons(authController, previouslyUsedMethodsForUser, mode, false)}\n </div>\n </div>\n }\n </div>\n </form>\n );\n\n}\n\nfunction buildOauthLoginButtons(authController: FirebaseAuthController, providers: string[], mode: \"light\" | \"dark\", disabled: boolean) {\n return <>\n {providers.includes(\"google.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Google\"}\n icon={googleIcon(mode)}\n onClick={authController.googleLogin}/>}\n\n {providers.includes(\"microsoft.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Microsoft\"}\n icon={microsoftIcon(mode)}\n onClick={authController.microsoftLogin}/>}\n\n {providers.includes(\"apple.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Apple\"}\n icon={appleIcon(mode)}\n onClick={authController.appleLogin}/>}\n\n {providers.includes(\"github.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Github\"}\n icon={githubIcon(mode)}\n onClick={authController.githubLogin}/>}\n\n {providers.includes(\"facebook.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Facebook\"}\n icon={facebookIcon(mode)}\n onClick={authController.facebookLogin}/>}\n\n {providers.includes(\"twitter.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Twitter\"}\n icon={twitterIcon(mode)}\n onClick={authController.twitterLogin}/>}\n </>\n}\n","import React from \"react\";\nimport { GoogleAuthProvider } from \"@firebase/auth\";\n\nimport {\n Rebase,\n ModeControllerProvider,\n SnackbarProvider,\n useBrowserTitleAndIcon,\n useBuildLocalConfigurationPersistence,\n useBuildModeController,\n useBuildAdminModeController,\n AdminModeControllerProvider,\n useValidateAuthenticator,\n RebaseRoutes\n} from \"@rebasepro/core\";\nimport {\n AppBar,\n Drawer,\n Scaffold,\n SideDialogs,\n useBuildCollectionRegistryController,\n useBuildUrlController,\n useBuildNavigationStateController,\n CollectionRegistryContext,\n UrlContext,\n NavigationStateContext,\n SideEntityProvider,\n RebaseRoute\n} from \"@rebasepro/admin\";\nimport { Entity, PropertyConfig } from \"@rebasepro/types\";\nimport { CenteredView, CircularProgressCenter } from \"@rebasepro/ui\";\nimport { buildRebaseData } from \"@rebasepro/common\";\nimport { Route, Outlet, Navigate } from \"react-router-dom\";\n\nimport { RebaseFirebaseAppProps } from \"./RebaseFirebaseAppProps\";\nimport { FirebaseLoginView } from \"./FirebaseLoginView\";\nimport {\n useAppCheck,\n useFirebaseAuthController,\n useFirebaseStorageSource,\n useFirestoreDriver,\n useInitialiseFirebase,\n useBuildUserManagement\n} from \"../hooks\";\n\nimport { FirebaseAuthController } from \"../types\";\n\nconst DEFAULT_SIGN_IN_OPTIONS = [\n GoogleAuthProvider.PROVIDER_ID\n];\n\n/**\n * This is the default implementation of a Rebase app using the Firebase services\n * as a backend.\n * You can use this component as a full app, by specifying collections and\n * entity collections.\n *\n * This component is in charge of initialising Firebase, with the given\n * configuration object.\n *\n * If you are building a larger app and need finer control, you can use\n * {@link Rebase}, {@link Scaffold}, {@link SideDialogs}\n * and {@link NavigationRoutes} instead.\n *\n * @param props\n\n * @category Firebase\n */\nexport function RebaseFirebaseApp({\n name,\n logo,\n logoDark,\n authenticator,\n collections,\n views,\n adminViews,\n textSearchControllerBuilder,\n allowSkipLogin,\n signInOptions = DEFAULT_SIGN_IN_OPTIONS,\n firebaseConfig,\n onFirebaseInit,\n appCheckOptions,\n dateTimeFormat,\n locale,\n basePath,\n baseCollectionPath,\n onAnalyticsEvent,\n propertyConfigs: propertyConfigsProp,\n plugins,\n autoOpenDrawer,\n firestoreIndexesBuilder,\n components,\n localTextSearchEnabled = false,\n userManagement\n}: RebaseFirebaseAppProps) {\n\n /**\n * Update the browser title and icon\n */\n useBrowserTitleAndIcon(name, logo);\n\n const propertyConfigs: Record<string, PropertyConfig> = (propertyConfigsProp ?? [])\n .map(pc => ({\n [pc.key]: pc\n }))\n .reduce((a, b) => ({ ...a,\n...b }), {});\n\n const {\n firebaseApp,\n firebaseConfigLoading,\n configError\n } = useInitialiseFirebase({\n onFirebaseInit,\n firebaseConfig\n });\n\n /**\n * Controller used to manage the dark or light color mode\n */\n const modeController = useBuildModeController();\n const adminModeController = useBuildAdminModeController();\n\n const {\n loading,\n appCheckVerified,\n error\n } = useAppCheck({\n firebaseApp,\n options: appCheckOptions\n });\n\n /**\n * Controller for managing authentication\n */\n const authController: FirebaseAuthController = useFirebaseAuthController({\n firebaseApp,\n signInOptions\n });\n\n /**\n * Controller for saving some user preferences locally.\n */\n const userConfigPersistence = useBuildLocalConfigurationPersistence();\n\n const firestoreDelegate = useFirestoreDriver({\n firebaseApp,\n textSearchControllerBuilder: textSearchControllerBuilder,\n firestoreIndexesBuilder: firestoreIndexesBuilder,\n localTextSearchEnabled\n })\n\n /**\n * Controller used for saving and fetching files in storage\n */\n const storageSource = useFirebaseStorageSource({\n firebaseApp\n });\n\n /**\n * Validate authenticator\n */\n const {\n authLoading,\n canAccessMainView,\n notAllowedError\n } = useValidateAuthenticator({\n authController,\n authenticator,\n data: buildRebaseData(firestoreDelegate),\n storageSource\n });\n\n const collectionRegistryController = useBuildCollectionRegistryController({\n userConfigPersistence\n });\n\n const urlController = useBuildUrlController({\n basePath: basePath ?? \"/\",\n baseCollectionPath: baseCollectionPath ?? \"/c\",\n collectionRegistryController\n });\n\n const defaultUserManagement = useBuildUserManagement({\n authController,\n dataSourceDelegate: firestoreDelegate\n });\n \n const activeUserManagement = userManagement ?? defaultUserManagement;\n\n const navigationStateController = useBuildNavigationStateController({\n collections,\n views,\n adminViews,\n authController,\n data: buildRebaseData(firestoreDelegate),\n plugins,\n collectionRegistryController,\n urlController,\n adminMode: adminModeController.mode,\n userManagement: activeUserManagement as any\n });\n\n if (firebaseConfigLoading || !firebaseApp || loading) {\n return <>\n <CircularProgressCenter/>\n </>;\n }\n\n if (configError) {\n return <CenteredView>{configError}</CenteredView>;\n }\n\n return (\n <SnackbarProvider>\n <ModeControllerProvider value={modeController}>\n <AdminModeControllerProvider value={adminModeController}>\n\n <CollectionRegistryContext.Provider value={collectionRegistryController}>\n <UrlContext.Provider value={urlController}>\n <NavigationStateContext.Provider value={navigationStateController}>\n <Rebase\n authController={authController}\n userConfigPersistence={userConfigPersistence}\n dateTimeFormat={dateTimeFormat}\n driver={firestoreDelegate}\n storageSource={storageSource}\n userManagement={activeUserManagement}\n entityLinkBuilder={({ entity }: { entity: Entity<any> }) => `https://console.firebase.google.com/project/${firebaseApp.options.projectId}/firestore/data/${entity.path}/${entity.id}`}\n locale={locale}\n onAnalyticsEvent={onAnalyticsEvent}\n plugins={plugins}\n propertyConfigs={propertyConfigs}>\n {({\n context,\n loading\n }) => {\n\n let component;\n if (loading || authLoading) {\n component = <CircularProgressCenter size={\"large\"}/>;\n } else {\n const usedLogo = modeController.mode === \"dark\" && logoDark ? logoDark : logo;\n if (!canAccessMainView) {\n const LoginViewUsed = components?.LoginView ?? FirebaseLoginView;\n component = (\n <LoginViewUsed\n logo={usedLogo}\n allowSkipLogin={allowSkipLogin}\n signInOptions={signInOptions ?? DEFAULT_SIGN_IN_OPTIONS}\n firebaseApp={firebaseApp}\n authController={authController}\n notAllowedError={notAllowedError}/>\n );\n } else {\n const firstCollectionEntry = navigationStateController.topLevelNavigation?.navigationEntries.find(e => e.type === \"collection\");\n const fallbackRoute = firstCollectionEntry ? <Navigate to={urlController.buildUrlCollectionPath(firstCollectionEntry.id)} replace /> : <CenteredView>No home page or collections provided.</CenteredView>;\n\n component = (\n <SideEntityProvider>\n <RebaseRoutes>\n <Route element={\n <Scaffold\n logo={usedLogo}\n autoOpenDrawer={autoOpenDrawer}>\n <AppBar title={name} logo={usedLogo}/>\n <Drawer/>\n <Outlet/>\n <SideDialogs/>\n </Scaffold>\n }>\n <Route path=\"/\" element={components?.HomePage ? <components.HomePage/> : fallbackRoute}/>\n <Route path=\"/c/*\" element={<RebaseRoute/>}/>\n </Route>\n </RebaseRoutes>\n </SideEntityProvider>\n );\n }\n }\n\n return component;\n }}\n </Rebase>\n </NavigationStateContext.Provider>\n </UrlContext.Provider>\n </CollectionRegistryContext.Provider>\n </AdminModeControllerProvider>\n </ModeControllerProvider>\n </SnackbarProvider>\n );\n}\n"],"names":["useFirebaseAuthController","loading","firebaseApp","signInOptions","onSignOut","onSignOutProp","defineRolesFor","loggedUser","setLoggedUser","useState","undefined","authError","setAuthError","authProviderError","setAuthProviderError","initialLoading","setInitialLoading","authLoading","setAuthLoading","loginSkipped","setLoginSkipped","confirmationResult","setConfirmationResult","userRoles","_setUserRoles","extra","setExtra","setUserRoles","useCallback","roles","currentRoleIds","map","r","id","newRoleIds","equal","authRef","useRef","updateUser","user","initialize","updateRoles","useEffect","auth","getAuth","current","currentUser","onAuthStateChanged","console","debug","error","e","getProviderOptions","providerId","find","option","Error","provider","googleLogin","GoogleAuthProvider","options","scopes","forEach","scope","addScope","customParameters","setCustomParameters","prompt","signInWithPopup","catch","getAuthToken","getIdToken","emailPasswordLogin","email","password","signInWithEmailAndPassword","then","createUserWithEmailAndPassword","createUserWithEmailAndPasswordFirebase","sendPasswordResetEmail","sendPasswordResetEmailFirebase","fetchSignInMethodsForEmail","fetchSignInMethodsForEmailFirebase","res","signOut","_","doOauthLogin","anonymousLogin","signInAnonymously","phoneLogin","phone","applicationVerifier","signInWithPhoneNumber","appleLogin","OAuthProvider","facebookLogin","FacebookAuthProvider","githubLogin","GithubAuthProvider","microsoftLogin","twitterLogin","TwitterAuthProvider","skipLogin","firebaseUserWrapper","firebaseUser","setUser","useFirebaseStorageSource","bucketUrl","projectId","urlsCache","putObject","file","key","metadata","bucket","storageBucketUrl","storage","getStorage","storageRef","ref","uploadTask","uploadBytesResumable","Promise","resolve","reject","lastProgress","timeoutId","clearTimeoutIfExists","clearTimeout","setProgressTimeout","setTimeout","cancel","on","snapshot","progress","bytesTransferred","totalBytes","errorMessage","message","code","toLowerCase","includes","newError","Object","assign","fullPath","bucketName","storageUrl","getObject","path","fileRef","url","getDownloadURL","response","fetch","blob","File","getSignedUrl","storagePathOrUrl","resolvedPathOrUrl","resolvedBucket","match","protocolLength","length","withoutProtocol","substring","firstSlash","indexOf","all","getMetadata","result","fileNotFound","listObjects","prefix","folderRef","list","maxResults","pageToken","deleteObject","hostingError","useInitialiseFirebase","firebaseConfig","fromUrl","onFirebaseInit","name","authDomain","setFirebaseApp","firebaseConfigLoading","setFirebaseConfigLoading","configError","setConfigError","initFirebase","config","targetName","currentApps","getApps","existingApp","app","deleteApp","initialisedFirebaseApp","initializeApp","JSON","stringify","fetchFromUrl","status","json","toString","process","env","NODE_ENV","useAppCheck","debugToken","window","FIREBASE_APPCHECK_DEBUG_TOKEN","appCheckLoading","setAppCheckLoading","React","appCheckVerified","setAppCheckVerified","setError","initialCheck","verifyToken","appCheck","token","getToken","forceRefresh","isTokenAutoRefreshEnabled","removeCurrentAppCheckDiv","initializeAppCheck","div","document","getElementById","remove","buildCollectionId","idOrPath","parentCollectionIds","stripCollectionPath","join","COLLECTION_PATH_SEPARATOR","docsToCollectionTree","docs","collectionsMap","doc","collection","docToCollection","reduce","a","b","orderedKeys","keys","sort","split","parentId","slice","parentCollection","subcollections","values","data","propertiesOrder","properties","normalizedProperties","normalizePropertiesEnumValues","sortedProperties","sortProperties","slug","alias","normalizeEnumValuesToArray","enumValues","sortObjectFormat","Array","isArray","entries","value","label","String","localeCompare","property","normalizedProperty","enum","dataType","of","ofProp","getFirestoreDataInPath","parentPaths","limit","firestore","getFirestore","q","query","limitClause","getDocs","querySnapshot","currentDocs","index","allPaths","push","parentPath","flat","performAlgoliaTextSearch","client","indexName","searchSingleIndex","searchParams","hits","hit","objectID","err","DEFAULT_SERVER","performPineconeTextSearch","host","firebaseToken","collectionPath","method","headers","Authorization","body","promise","ids","buildPineconeSearchController","isPathSupported","search","props","init","buildExternalSearchController","MAX_SEARCH_RESULTS","localSearchControllerBuilder","currentPath","indexes","listeners","destroyListener","collectionProp","databaseId","col","onSnapshot","next","fromCache","hasPendingWrites","buildIndex","searchString","searchResult","splice","aExactMatch","item","bExactMatch","score","fuseOptions","threshold","includeScore","weight","Fuse","buildRebaseSearchController","region","extensionInstanceId","searchConfig","typesenseClient","initPromise","initializeClient","customConfig","port","protocol","apiKey","collectionsToIndex","functions","getFunctions","getConfig","httpsCallable","collections","Typesense","default","Client","nodes","connectionTimeoutSeconds","retryIntervalSeconds","numRetries","getTypesenseCollectionName","pathParts","collectionNames","i","getParentFilter","filters","collectionName","docId","collectionPattern","rootCollection","schemaCache","Map","getSearchableFieldsFromSchema","has","get","retrieve","stringFields","fields","filter","f","isStringType","type","isNotInternal","startsWith","set","httpStatus","parentFilter","searchableFields","queryBy","query_by","per_page","typo_tokens_threshold","filter_by","documents","useFirestoreDriver","textSearchControllerBuilder","firestoreIndexesBuilder","localTextSearchEnabled","searchControllerRef","buildTextSearchControllerWithLocalSearch","buildQuery","orderBy","order","startAfter","collectionReference","collectionClause","queryParams","entry","filterParameter","op","whereClause","cmsToFirestoreModel","orderByClause","startAfterClause","getAndBuildEntity","entityId","getDoc","docSnapshot","exists","createEntityFromDocument","listenEntity","onUpdate","onError","resolvedPath","performTextSearch","textSearchController","subscriptions","entities","addedEntitiesSet","Set","entity","add","delete","p","currentTime","initialised","Boolean","initTextSearch","warn","fetchCollection","listenCollection","fetchEntity","saveEntity","valuesProp","documentReference","setDoc","merge","firestoreToCMSModel","deleteEntity","deleteDoc","checkUniqueField","countEntities","getCountFromServer","count","isFilterCombinationValid","filterValues","sortBy","sortKey","sortDirection","filterKeys","filtersCount","every","v","compositeIndex","docSnap","getCMSPathFromFirestorePath","deleteField","isEqual","serverTimestamp","Timestamp","toDate","Date","__type__","VectorValue","toArray","constructor","FirestoreGeoPoint","GeoPoint","latitude","longitude","DocumentReference","_databaseId","database","EntityReference","childValue","fsPath","to","lastIndexOf","inArray","isEntityReference","targetFirestore","__type","fromDate","vector","firestoreModel","localSearchController","useFirebaseRTDBDelegate","t0","$","_c","t1","t2","getDatabase","dbQuery","orderByKey","startAt","limitToFirst","val","t3","delegateToCMSModel","path_0","database_0","dbRef","unsubscribe","onValue","snapshot_0","t4","id_0","values_0","path_1","database_1","snapshot_1","t5","path_2","entityId_0","onUpdate_0","database_2","dbRef_0","unsubscribe_0","snapshot_2","t6","path_3","entityId_1","values_1","database_3","finalId","transformedValues","cmsToRTDBModel","t7","database_4","entityId_2","database_5","dbRef_1","orderByChild","snapshot_3","entityValue","_temp","t8","_temp2","toISOString","rtdbModel","RECAPTCHA_CONTAINER_ID","useRecaptcha","Symbol","for","recaptchaVerifier","RecaptchaVerifier","size","useBuildUserManagement","authController","dataSourceDelegate","rolesProp","usersPath","rolesPath","allowDefaultRolesCreation","includeCollectionConfigPermissions","rolesDefinedInCode","rolesLoading","setRolesLoading","usersLoading","setUsersLoading","setRoles","usersWithRoleIds","setUsersWithRoleIds","users","u","rolesError","setRolesError","usersError","setUsersError","_usersLoading","_rolesLoading","newRoles","entityToRoles","uid","newUsers","entitiesToUsers","saveUser","roleIds","trim","userExists","created_on","removeUndefined","saveRole","role","roleData","deleteUser","deleteRole","mgmtUser","authenticator","needsUidUpdate","needsPhotoUpdate","photoURL","updateReason","isAdmin","some","userRoleIds","getUser","newVar","updated_on","googleIcon","mode","appleIcon","transform","githubIcon","facebookIcon","microsoftIcon","twitterIcon","FirebaseLoginView","children","allowSkipLogin","logo","noUserComponent","disableSignupScreen","disableResetPassword","disabled","additionalComponent","notAllowedError","className","modeState","useModeController","passwordLoginSelected","setPasswordLoginSelected","phoneLoginSelected","setPhoneLoginSelected","fadeIn","setFadeIn","timer","resolvedSignInOptions","o","sendMFASms","resolver","getMultiFactorResolver","hints","factorId","PhoneMultiFactorGenerator","FACTOR_ID","phoneInfoOptions","multiFactorHint","session","phoneAuthProvider","PhoneAuthProvider","verifyPhoneNumber","verificationId","verificationCode","cred","credential","multiFactorAssertion","assertion","resolveSignIn","buildErrorView","errorView","ignoredCodes","logoComponent","height","width","objectFit","notAllowedMessage","fadeStyle","opacity","transition","cls","buildOauthLoginButtons","iconSize","medium","LoginButton","icon","onClick","text","borderRadius","fontSize","PhoneLoginForm","onClose","setPhone","setCode","isInvalidCode","setIsInvalidCode","event","preventDefault","confirm","handleSubmit","t9","event_0","target","t10","t11","event_1","t12","t13","t14","t15","t16","LoginForm","passwordRef","loginState","setLoginState","setEmail","setPassword","previouslyUsedMethodsForUser","setPreviouslyUsedMethodsForUser","resettingPassword","setResettingPassword","snackbarController","useSnackbarController","focus","escFunction","keyCode","addEventListener","removeEventListener","handleEnterEmail","availableProviders","handleEnterPassword","handleRegistration","onBackPressed","open","providers","DEFAULT_SIGN_IN_OPTIONS","PROVIDER_ID","RebaseFirebaseApp","logoDark","views","adminViews","appCheckOptions","dateTimeFormat","locale","basePath","baseCollectionPath","onAnalyticsEvent","propertyConfigs","propertyConfigsProp","plugins","autoOpenDrawer","components","userManagement","useBrowserTitleAndIcon","modeController","useBuildModeController","adminModeController","useBuildAdminModeController","userConfigPersistence","useBuildLocalConfigurationPersistence","firestoreDelegate","storageSource","buildRebaseData","canAccessMainView","useValidateAuthenticator","collectionRegistryController","useBuildCollectionRegistryController","urlController","useBuildUrlController","defaultUserManagement","activeUserManagement","t17","t18","t19","adminMode","navigationStateController","useBuildNavigationStateController","t20","t21","t22","loading_0","component","usedLogo","LoginViewUsed","LoginView","firstCollectionEntry","topLevelNavigation","navigationEntries","_temp3","fallbackRoute","buildUrlCollectionPath","HomePage","t23","t24","t25","t26","t27","pc"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/hooks/useFirebaseAuthController.ts","../src/hooks/useFirebaseStorageSource.ts","../src/hooks/useInitialiseFirebase.ts","../src/hooks/useAppCheck.ts","../src/utils/collections_firestore.ts","../src/utils/database.ts","../src/utils/algolia.ts","../src/utils/pinecone.ts","../src/utils/text_search_controller.ts","../src/utils/local_text_search_controller.ts","../src/utils/rebase_search_controller.ts","../src/hooks/useFirestoreDriver.ts","../src/hooks/useFirebaseRealTimeDBDelegate.ts","../src/hooks/useRecaptcha.tsx","../src/hooks/useBuildUserManagement.tsx","../src/components/social_icons.tsx","../src/components/FirebaseLoginView.tsx","../src/components/RebaseFirebaseApp.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { deepEqual as equal } from \"fast-equals\"\n\nimport {\n ApplicationVerifier,\n Auth,\n ConfirmationResult,\n createUserWithEmailAndPassword as createUserWithEmailAndPasswordFirebase,\n FacebookAuthProvider,\n fetchSignInMethodsForEmail as fetchSignInMethodsForEmailFirebase,\n getAuth,\n GithubAuthProvider,\n GoogleAuthProvider,\n OAuthProvider,\n onAuthStateChanged,\n sendPasswordResetEmail as sendPasswordResetEmailFirebase,\n signInAnonymously,\n signInWithEmailAndPassword,\n signInWithPhoneNumber,\n signInWithPopup,\n signOut,\n TwitterAuthProvider,\n User as FirebaseUser\n} from \"@firebase/auth\";\nimport { FirebaseApp } from \"@firebase/app\";\nimport { FirebaseAuthController, FirebaseSignInOption, FirebaseSignInProvider, FirebaseUserWrapper } from \"../types\";\nimport { Role, User } from \"@rebasepro/types\";\n\nexport interface FirebaseAuthControllerProps {\n loading?: boolean;\n firebaseApp?: FirebaseApp;\n signInOptions?: Array<FirebaseSignInProvider | FirebaseSignInOption>;\n onSignOut?: () => void;\n defineRolesFor?: (user: User) => Promise<Role[] | undefined> | Role[] | undefined;\n}\n\n/**\n * Use this hook to build an {@link AuthController} based on Firebase Auth\n * @group Firebase\n */\nexport const useFirebaseAuthController = <USER extends FirebaseUserWrapper = any, ExtraData = any>({\n loading,\n firebaseApp,\n signInOptions,\n onSignOut: onSignOutProp,\n defineRolesFor\n}: FirebaseAuthControllerProps): FirebaseAuthController<USER, ExtraData> => {\n\n const [loggedUser, setLoggedUser] = useState<FirebaseUser | null | undefined>(undefined); // logged user, anonymous or logged out\n const [authError, setAuthError] = useState<any>();\n const [authProviderError, setAuthProviderError] = useState<any>();\n const [initialLoading, setInitialLoading] = useState<boolean>(true);\n const [authLoading, setAuthLoading] = useState(true);\n const [loginSkipped, setLoginSkipped] = useState<boolean>(false);\n const [confirmationResult, setConfirmationResult] = useState<undefined | ConfirmationResult>();\n const [userRoles, _setUserRoles] = useState<Role[] | undefined>();\n const [extra, setExtra] = useState<any>();\n\n const setUserRoles = useCallback((roles: Role[] | undefined) => {\n const currentRoleIds = userRoles?.map(r => r.id);\n const newRoleIds = roles?.map(r => r.id);\n if (!equal(currentRoleIds, newRoleIds)) {\n _setUserRoles(roles);\n }\n }, [userRoles]);\n\n const authRef = useRef<Auth | null>(null);\n\n const updateUser = useCallback(async (user: FirebaseUser | null, initialize?: boolean) => {\n if (loading) return;\n if (defineRolesFor && user) {\n setUserRoles(await defineRolesFor(user));\n }\n setLoggedUser(user);\n setAuthLoading(false);\n if (initialize) {\n setInitialLoading(false);\n }\n }, [loading]);\n\n const updateRoles = useCallback(async (user: User | null) => {\n if (defineRolesFor && user) {\n const userRoles = await defineRolesFor(user);\n if (!equal(userRoles, userRoles)) {\n setUserRoles(userRoles);\n }\n }\n }, [defineRolesFor, userRoles]);\n\n useEffect(() => {\n if (updateRoles && loggedUser) {\n updateRoles(loggedUser);\n }\n }, [updateRoles, loggedUser]);\n\n useEffect(() => {\n if (!firebaseApp) return;\n try {\n const auth = getAuth(firebaseApp);\n authRef.current = auth;\n setAuthError(undefined);\n updateUser(auth.currentUser, false)\n return onAuthStateChanged(\n auth,\n async (user) => {\n console.debug(\"User state changed\", user);\n await updateUser(user, true);\n },\n error => setAuthProviderError(error)\n );\n } catch (e) {\n setAuthError(e);\n setInitialLoading(false);\n return () => {\n };\n }\n }, [firebaseApp, updateUser]);\n\n useEffect(() => {\n if (!loading && authRef.current) {\n updateUser(authRef.current.currentUser, false);\n }\n }, [loading, updateUser]);\n\n const getProviderOptions = useCallback((providerId: FirebaseSignInProvider): FirebaseSignInOption | undefined => {\n return signInOptions?.find((option) => {\n if (option === null) throw Error(\"useFirebaseAuthController\");\n if (typeof option === \"object\" && option.provider === providerId)\n return option as FirebaseSignInOption;\n return undefined;\n }) as FirebaseSignInOption | undefined;\n }, []);\n\n const googleLogin = useCallback(() => {\n const provider = new GoogleAuthProvider();\n const options = getProviderOptions(\"google.com\");\n if (options?.scopes)\n options.scopes.forEach((scope) => provider.addScope(scope));\n if (options?.customParameters) {\n provider.setCustomParameters(options.customParameters);\n } else {\n provider.setCustomParameters({\n prompt: \"select_account\"\n });\n }\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n signInWithPopup(auth, provider).catch(setAuthProviderError);\n }, [getProviderOptions]);\n\n const getAuthToken = useCallback(async (): Promise<string> => {\n if (!loggedUser)\n throw Error(\"No client user is logged in\");\n if (!loggedUser.getIdToken) {\n throw Error(\"No getIdToken method available\");\n }\n return loggedUser.getIdToken?.();\n }, [loggedUser]);\n\n const emailPasswordLogin = useCallback((email: string, password: string) => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n setAuthLoading(true);\n signInWithEmailAndPassword(auth, email, password)\n .catch(setAuthProviderError)\n .then(() => setAuthLoading(false));\n }, []);\n\n const createUserWithEmailAndPassword = useCallback((email: string, password: string) => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n setAuthLoading(true);\n createUserWithEmailAndPasswordFirebase(auth, email, password)\n .catch(setAuthProviderError)\n .then(() => setAuthLoading(false));\n }, []);\n\n const sendPasswordResetEmail = useCallback((email: string) => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n return sendPasswordResetEmailFirebase(auth, email)\n }, []);\n\n const fetchSignInMethodsForEmail = useCallback((email: string): Promise<string[]> => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n setAuthLoading(true);\n return fetchSignInMethodsForEmailFirebase(auth, email)\n .then((res) => {\n setAuthLoading(false);\n return res;\n });\n }, []);\n\n const onSignOut = useCallback(async () => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n await signOut(auth)\n .then(_ => {\n setLoggedUser(null);\n setUserRoles(undefined);\n setAuthProviderError(null);\n onSignOutProp?.();\n });\n setLoginSkipped(false);\n }, [onSignOutProp]);\n\n const doOauthLogin = useCallback((auth: Auth, provider: OAuthProvider | FacebookAuthProvider | GithubAuthProvider | TwitterAuthProvider) => {\n setAuthLoading(true);\n signInWithPopup(auth, provider)\n .catch(setAuthProviderError).then(() => setAuthLoading(false));\n }, []);\n\n const anonymousLogin = useCallback(() => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n setAuthLoading(true);\n signInAnonymously(auth)\n .catch(setAuthProviderError)\n .then(() => setAuthLoading(false));\n }, []);\n\n const phoneLogin = useCallback((phone: string, applicationVerifier: ApplicationVerifier) => {\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n setAuthLoading(true);\n return signInWithPhoneNumber(auth, phone, applicationVerifier)\n .catch(setAuthProviderError)\n .then((res) => {\n setAuthLoading(false);\n setConfirmationResult(res ?? undefined);\n });\n }, []);\n\n const appleLogin = useCallback(() => {\n const provider = new OAuthProvider(\"apple.com\");\n const options = getProviderOptions(\"apple.com\");\n if (options?.scopes)\n options.scopes.forEach((scope) => provider.addScope(scope));\n if (options?.customParameters)\n provider.setCustomParameters(options.customParameters);\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n doOauthLogin(auth, provider);\n }, [doOauthLogin, getProviderOptions]);\n\n const facebookLogin = useCallback(() => {\n const provider = new FacebookAuthProvider();\n const options = getProviderOptions(\"facebook.com\");\n if (options?.scopes)\n options.scopes.forEach((scope) => provider.addScope(scope));\n if (options?.customParameters)\n provider.setCustomParameters(options.customParameters);\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n doOauthLogin(auth, provider);\n }, [doOauthLogin, getProviderOptions]);\n\n const githubLogin = useCallback(() => {\n const provider = new GithubAuthProvider();\n const options = getProviderOptions(\"github.com\");\n if (options?.scopes)\n options.scopes.forEach((scope) => provider.addScope(scope));\n if (options?.customParameters)\n provider.setCustomParameters(options.customParameters);\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n doOauthLogin(auth, provider);\n }, [doOauthLogin, getProviderOptions]);\n\n const microsoftLogin = useCallback(() => {\n const provider = new OAuthProvider(\"microsoft.com\");\n const options = getProviderOptions(\"microsoft.com\");\n if (options?.scopes)\n options.scopes.forEach((scope) => provider.addScope(scope));\n if (options?.customParameters)\n provider.setCustomParameters(options.customParameters);\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n doOauthLogin(auth, provider);\n }, [doOauthLogin, getProviderOptions]);\n\n const twitterLogin = useCallback(() => {\n const provider = new TwitterAuthProvider();\n const options = getProviderOptions(\"twitter.com\");\n if (options?.customParameters)\n provider.setCustomParameters(options.customParameters);\n const auth = authRef.current;\n if (!auth) throw Error(\"No auth\");\n doOauthLogin(auth, provider);\n }, [doOauthLogin, getProviderOptions]);\n\n const skipLogin = useCallback(() => {\n setLoginSkipped(true);\n setLoggedUser(null);\n setUserRoles(undefined);\n }, []);\n\n const firebaseUserWrapper: FirebaseUserWrapper | null = loggedUser\n ? {\n ...loggedUser,\n roles: userRoles?.map(r => r.id), // User.roles is string[], keep Role[] internally only\n firebaseUser: loggedUser\n }\n : null;\n\n return {\n user: firebaseUserWrapper as USER,\n setUser: updateUser,\n setUserRoles,\n authProviderError,\n authLoading,\n initialLoading: loading || initialLoading,\n signOut: onSignOut,\n getAuthToken,\n googleLogin,\n skipLogin,\n loginSkipped,\n emailPasswordLogin,\n createUserWithEmailAndPassword,\n sendPasswordResetEmail,\n fetchSignInMethodsForEmail,\n anonymousLogin,\n phoneLogin,\n appleLogin,\n facebookLogin,\n githubLogin,\n microsoftLogin,\n twitterLogin,\n confirmationResult,\n extra,\n setExtra\n };\n};\n","import { FirebaseApp } from \"@firebase/app\";\nimport {\n deleteObject,\n getDownloadURL,\n getMetadata,\n getStorage,\n list,\n ref,\n uploadBytesResumable\n} from \"@firebase/storage\";\nimport { DownloadConfig, DownloadMetadata, StorageListResult, StorageSource, UploadFileProps } from \"@rebasepro/types\";\n\n/**\n * @group Firebase\n */\nexport interface FirebaseStorageSourceProps {\n firebaseApp?: FirebaseApp\n bucketUrl?: string\n}\n\n/**\n * Use this hook to build an {@link StorageSource} based on Firebase storage\n * @group Firebase\n */\nexport function useFirebaseStorageSource({\n firebaseApp,\n bucketUrl\n}: FirebaseStorageSourceProps): StorageSource {\n const projectId = firebaseApp?.options?.projectId;\n const urlsCache: Record<string, DownloadConfig> = {};\n return {\n putObject({\n file,\n key,\n metadata,\n bucket\n }: UploadFileProps)\n : Promise<any> {\n try {\n if (!firebaseApp) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const storageBucketUrl = bucket ?? bucketUrl;\n const storage = getStorage(firebaseApp, storageBucketUrl);\n if (!storage) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n\n const storageRef = ref(storage, key);\n const uploadTask = uploadBytesResumable(storageRef, file, metadata);\n\n return new Promise((resolve, reject) => {\n let lastProgress = 0;\n let timeoutId: NodeJS.Timeout | null = null;\n\n const clearTimeoutIfExists = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n const setProgressTimeout = () => {\n clearTimeoutIfExists();\n timeoutId = setTimeout(() => {\n uploadTask.cancel();\n reject(new Error(\"Upload failed - This is likely a CORS configuration issue. \" +\n \"Make sure Firebase Storage is enabled in your project: \" + `https://console.firebase.google.com/u/0/project/${projectId}/storage` + \". \" +\n \"If it is, check Firebase Storage CORS settings.\"));\n }, 5000);\n };\n\n setProgressTimeout();\n\n uploadTask.on(\"state_changed\",\n (snapshot) => {\n const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\n\n if (progress > lastProgress) {\n lastProgress = progress;\n setProgressTimeout();\n }\n },\n (error) => {\n clearTimeoutIfExists();\n console.error(\"Firebase Storage upload error:\", error);\n\n let errorMessage = \"Unknown upload error\";\n\n if (error?.message) {\n errorMessage = error.message;\n } else if (typeof error === \"string\") {\n errorMessage = error;\n } else if (error?.code) {\n errorMessage = error.code;\n }\n\n if (error?.code === \"storage/unauthorized\") {\n reject(new Error(\"Unauthorized: Check Firebase Storage security rules\"));\n } else if (error?.code === \"storage/canceled\") {\n reject(new Error(\"Upload canceled\"));\n } else if (error?.code === \"storage/unknown\" || !error?.code) {\n reject(new Error(\"Upload failed - Check Firebase Storage CORS configuration or network connection\"));\n } else if (errorMessage.toLowerCase().includes(\"network\")) {\n reject(new Error(\"Network error: Check your internet connection\"));\n } else {\n const newError = Object.assign(new Error(errorMessage), { code: error?.code });\n reject(newError);\n }\n },\n () => {\n clearTimeoutIfExists();\n const fullPath = uploadTask.snapshot.ref.fullPath;\n const bucketName = uploadTask.snapshot.ref.bucket;\n resolve({\n key: fullPath,\n bucket: bucketName,\n storageUrl: `s3://${bucketName}/${fullPath}`\n });\n }\n );\n });\n } catch (error) {\n return Promise.reject(error);\n }\n },\n\n async getObject(path: string, bucket?: string): Promise<File | null> {\n try {\n if (!firebaseApp) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const storageBucketUrl = bucket ?? bucketUrl;\n const storage = getStorage(firebaseApp, storageBucketUrl);\n if (!storage) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const fileRef = ref(storage, path);\n const url = await getDownloadURL(fileRef);\n const response = await fetch(url);\n const blob = await response.blob();\n return new File([blob], path);\n } catch (e: any) {\n if (e?.code === \"storage/object-not-found\") return null;\n throw e;\n }\n },\n\n async getSignedUrl(storagePathOrUrl: string, bucket?: string): Promise<DownloadConfig> {\n if (!firebaseApp) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n\n // Support fully-qualified s3:// and gs:// URLs for backward compatibility\n let resolvedPathOrUrl = storagePathOrUrl;\n let resolvedBucket = bucket;\n const match = storagePathOrUrl.match(/^(s3|gs):\\/\\//);\n if (match) {\n const protocolLength = match[0].length;\n const withoutProtocol = storagePathOrUrl.substring(protocolLength);\n const firstSlash = withoutProtocol.indexOf(\"/\");\n if (firstSlash > 0) {\n resolvedBucket = withoutProtocol.substring(0, firstSlash);\n resolvedPathOrUrl = withoutProtocol.substring(firstSlash + 1);\n }\n }\n\n const storageBucketUrl = resolvedBucket ?? bucketUrl;\n const storage = getStorage(firebaseApp, storageBucketUrl);\n if (!storage) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n\n if (urlsCache[storagePathOrUrl])\n return urlsCache[storagePathOrUrl];\n try {\n const fileRef = ref(storage, resolvedPathOrUrl);\n const [url, metadata] = await Promise.all([getDownloadURL(fileRef), getMetadata(fileRef)]);\n const result: DownloadConfig = {\n url,\n metadata: metadata as DownloadMetadata\n }\n urlsCache[storagePathOrUrl] = result;\n return result;\n } catch (e: any) {\n if (e?.code === \"storage/object-not-found\") return {\n url: null,\n fileNotFound: true\n };\n throw e;\n }\n },\n\n async listObjects(prefix: string, options?: {\n bucket?: string,\n maxResults?: number,\n pageToken?: string\n }): Promise<StorageListResult> {\n if (!firebaseApp) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const storageBucketUrl = options?.bucket ?? bucketUrl;\n const storage = getStorage(firebaseApp, storageBucketUrl);\n if (!storage) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const folderRef = ref(storage, prefix);\n return await list(folderRef, {\n maxResults: options?.maxResults,\n pageToken: options?.pageToken\n });\n },\n\n async deleteObject(path: string, bucket?: string): Promise<void> {\n if (!firebaseApp) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const storageBucketUrl = bucket ?? bucketUrl;\n const storage = getStorage(firebaseApp, storageBucketUrl);\n if (!storage) throw Error(\"useFirebaseStorageSource Firebase not initialised\");\n const fileRef = ref(storage, path);\n return deleteObject(fileRef);\n }\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { deleteApp, FirebaseApp, getApps, initializeApp } from \"@firebase/app\";\n\n/**\n * @group Firebase\n */\nexport interface InitialiseFirebaseResult {\n firebaseConfigLoading: boolean,\n firebaseApp?: FirebaseApp;\n configError?: string,\n firebaseConfigError?: Error\n}\n\nconst hostingError = \"It seems like the provided Firebase config is not correct. If you \\n\" +\n \"are using the credentials provided automatically by Firebase \\n\" +\n \"Hosting, make sure you link your Firebase app to Firebase Hosting. \\n\";\n\n/**\n * Function used to initialise Firebase, either by using the provided config,\n * or by fetching it by Firebase Hosting, if not specified.\n *\n * It works as a hook that gives you the loading state and the used\n * configuration.\n *\n * You most likely only need to use this if you are developing a custom app. You can also not use this component\n * and initialise Firebase yourself.\n *\n * @param onFirebaseInit\n * @param firebaseConfig\n * @param fromUrl\n * @param name\n * @param authDomain\n * @group Firebase\n */\nexport function useInitialiseFirebase({\n firebaseConfig,\n fromUrl,\n onFirebaseInit,\n name,\n authDomain\n }: {\n firebaseConfig?: Record<string, unknown>,\n fromUrl?: string | undefined,\n onFirebaseInit?: ((config: object, firebaseApp: FirebaseApp) => void) | undefined,\n name?: string;\n authDomain?: string;\n}): InitialiseFirebaseResult {\n\n const [firebaseApp, setFirebaseApp] = useState<FirebaseApp | undefined>();\n const [firebaseConfigLoading, setFirebaseConfigLoading] = useState<boolean>(false);\n const [configError, setConfigError] = useState<string>();\n\n const initFirebase = useCallback((config: Record<string, unknown>) => {\n\n if (config.projectId === firebaseApp?.options.projectId) {\n console.debug(\"Firebase app already initialised with the same project ID. This should happen only in development mode.\");\n setConfigError(undefined);\n setFirebaseConfigLoading(false);\n return;\n }\n\n try {\n const targetName = name ?? \"[DEFAULT]\";\n const currentApps = getApps();\n const existingApp = currentApps.find(app => app.name === targetName);\n if (existingApp) {\n deleteApp(existingApp);\n }\n const initialisedFirebaseApp = initializeApp(config, targetName);\n setConfigError(undefined);\n setFirebaseConfigLoading(false);\n setFirebaseApp(initialisedFirebaseApp);\n } catch (e: any) {\n console.error(\"Error initialising Firebase\", e);\n setConfigError(hostingError + \"\\n\" + (e.message ?? JSON.stringify(e)));\n }\n }, [name]);\n\n useEffect(() => {\n if (onFirebaseInit && firebaseConfig && firebaseApp) {\n onFirebaseInit(firebaseConfig, firebaseApp);\n }\n }, [firebaseApp]);\n\n useEffect(() => {\n\n setFirebaseConfigLoading(true);\n\n function fetchFromUrl(url: string) {\n fetch(url)\n .then(async response => {\n console.debug(\"Firebase init response\", response.status);\n if (response && response.status < 300) {\n const config = await response.json();\n if (authDomain) config.authDomain = authDomain;\n initFirebase(config);\n }\n })\n .catch(e => {\n setFirebaseConfigLoading(false);\n setConfigError(\n \"Could not load Firebase configuration from Firebase hosting. \" +\n \"If the app is not deployed in Firebase hosting, you need to specify the configuration manually\" +\n e.toString()\n );\n }\n );\n }\n\n if (firebaseConfig) {\n initFirebase(firebaseConfig);\n } else {\n if (fromUrl) {\n fetchFromUrl(fromUrl);\n } else if (process.env.NODE_ENV === \"production\") {\n fetchFromUrl(\"/__/firebase/init.json\");\n } else {\n setFirebaseConfigLoading(false);\n setConfigError(\n \"You need to deploy the app to Firebase hosting or specify a Firebase configuration object\"\n );\n }\n }\n }, []);\n\n return {\n firebaseApp,\n firebaseConfigLoading,\n configError\n };\n}\n","import React, { useCallback, useEffect, useRef } from \"react\";\n\nimport { AppCheck, getToken, initializeAppCheck } from \"@firebase/app-check\";\nimport { FirebaseApp } from \"@firebase/app\";\nimport { AppCheckOptions } from \"../types\";\n\n/**\n * @group Firebase\n */\nexport interface InitializeAppCheckProps {\n firebaseApp?: FirebaseApp;\n options?: AppCheckOptions;\n}\n\nexport interface InitializeAppCheckResult {\n loading: boolean;\n appCheckVerified?: boolean;\n error?: any;\n}\n\n/**\n * Function used to initialise Firebase App Check.\n *\n * @group Firebase\n */\nexport function useAppCheck({\n firebaseApp,\n options\n }: InitializeAppCheckProps): InitializeAppCheckResult {\n if (options?.debugToken) {\n Object.assign(window, {\n FIREBASE_APPCHECK_DEBUG_TOKEN: options?.debugToken\n });\n }\n\n const [appCheckLoading, setAppCheckLoading] = React.useState<boolean>(false);\n const [appCheckVerified, setAppCheckVerified] = React.useState<boolean | undefined>(undefined);\n const [error, setError] = React.useState<any>();\n\n const initialCheck = useRef<boolean>(false);\n\n const verifyToken = useCallback(async (appCheck: AppCheck) => {\n console.debug(\"Verifying App Check token...\", appCheck);\n try {\n const token = await getToken(appCheck, options?.forceRefresh);\n console.debug(\"App Check token:\", token);\n if (!token) {\n setError(\"App Check failed.\");\n setAppCheckVerified(false);\n } else {\n setAppCheckVerified(true);\n console.debug(\"App Check success.\");\n }\n } catch (e: any) {\n console.error(\"App Check error:\", e);\n setError(e.message);\n }\n }, [options?.forceRefresh]);\n\n useEffect(() => {\n if (!options) return;\n if (!firebaseApp) return;\n if (appCheckVerified !== undefined) return;\n if (initialCheck.current) return;\n\n setAppCheckLoading(true);\n\n const {\n provider,\n isTokenAutoRefreshEnabled\n } = options;\n\n removeCurrentAppCheckDiv();\n\n const appCheck = initializeAppCheck(firebaseApp, {\n provider,\n isTokenAutoRefreshEnabled\n });\n\n verifyToken(appCheck)\n .then(() => {\n setAppCheckLoading(false);\n });\n initialCheck.current = true;\n }, [appCheckVerified, firebaseApp, options, verifyToken]);\n\n return {\n loading: appCheckLoading,\n appCheckVerified,\n error\n };\n}\n\n\nfunction removeCurrentAppCheckDiv() {\n const div = document.getElementById(\"fire_app_check_[DEFAULT]\");\n if (div) {\n div.remove();\n }\n}\n\n","import { deleteField, DocumentSnapshot } from \"@firebase/firestore\";\nimport { EntityCollection, FirebaseCollection, Properties, Property } from \"@rebasepro/types\";\nimport { COLLECTION_PATH_SEPARATOR, sortProperties, stripCollectionPath } from \"@rebasepro/common\";\n\nexport function buildCollectionId(idOrPath: string, parentCollectionIds?: string[]): string {\n if (!parentCollectionIds)\n return stripCollectionPath(idOrPath);\n return [...parentCollectionIds.map(stripCollectionPath), stripCollectionPath(idOrPath)].join(COLLECTION_PATH_SEPARATOR);\n}\n\n\nexport const docsToCollectionTree = (docs: DocumentSnapshot[]): EntityCollection[] => {\n\n const collectionsMap = docs.map((doc) => {\n const id: string = doc.id;\n const collection = docToCollection(doc);\n return { [id]: collection };\n }).reduce((a, b) => ({ ...a,\n...b }), {});\n\n const orderedKeys = Object.keys(collectionsMap).sort((a, b) => b.split(COLLECTION_PATH_SEPARATOR).length - a.split(COLLECTION_PATH_SEPARATOR).length);\n\n orderedKeys.forEach((id) => {\n const collection = collectionsMap[id];\n if (id.includes(COLLECTION_PATH_SEPARATOR)) {\n const parentId = id.split(COLLECTION_PATH_SEPARATOR).slice(0, -1).join(COLLECTION_PATH_SEPARATOR);\n const parentCollection = collectionsMap[parentId];\n if (parentCollection)\n (parentCollection as FirebaseCollection).subcollections = () => [...((parentCollection as FirebaseCollection).subcollections?.() ?? []), collection];\n delete collectionsMap[id];\n }\n });\n\n return Object.values(collectionsMap);\n}\n\nexport const docToCollection = (doc: DocumentSnapshot): EntityCollection => {\n const data = doc.data();\n if (!data)\n throw Error(\"Entity collection has not been persisted correctly\");\n const propertiesOrder = data.propertiesOrder;\n const properties = data.properties as Properties ?? {};\n\n // Normalize enum values from object format to array format (sorted alphabetically)\n const normalizedProperties = normalizePropertiesEnumValues(properties, true);\n const sortedProperties = sortProperties(normalizedProperties, propertiesOrder);\n return {\n ...data,\n properties: sortedProperties,\n slug: data.id ?? data.alias ?? data.slug\n } as EntityCollection;\n}\n\n\n/**\n * Converts enum values from object format to array format.\n * Firestore doesn't preserve object key order, so we must use arrays.\n * When enum values are already stored as an array, their order is preserved\n * (this is intentional - users can reorder columns in Kanban view).\n * Only sort alphabetically when converting from legacy object format.\n * @param enumValues - The enum values (object or array format)\n * @param sortObjectFormat - If true, sort by id alphabetically when converting from object format\n * @returns Array of EnumValueConfig objects\n */\nfunction normalizeEnumValuesToArray(\n enumValues: unknown,\n sortObjectFormat = false\n): unknown[] {\n if (Array.isArray(enumValues)) {\n // Already an array - preserve order! This order is intentional\n // (e.g., user reordered Kanban columns)\n return enumValues;\n } else if (typeof enumValues === \"object\" && enumValues !== null) {\n // Convert object to array format\n // Object keys don't have guaranteed order in Firestore, so we sort alphabetically\n const entries = Object.entries(enumValues).map(([id, value]) =>\n typeof value === \"string\"\n ? {\n id,\n label: value\n }\n : {\n ...(value as object),\n id\n }\n );\n // Sort alphabetically by id when loading from Firestore object format\n // This is the only case where sorting makes sense, since object key order is not preserved\n if (sortObjectFormat) {\n entries.sort((a, b) => String(a.id).localeCompare(String(b.id)));\n }\n return entries;\n }\n return [];\n}\n\n/**\n * Normalizes all enum values in a properties object.\n * @param properties - The properties object to normalize\n * @param sortObjectFormat - If true, sort enum values alphabetically when converting from object format\n * @returns Properties with normalized enum values\n */\nfunction normalizePropertiesEnumValues(\n properties: Properties,\n sortObjectFormat = false\n): Properties {\n const result: Properties = {};\n Object.entries(properties).forEach(([key, property]) => {\n if (typeof property === \"object\" && property !== null) {\n const normalizedProperty = { ...property } as Record<string, unknown>;\n\n // Handle direct enum values\n if (normalizedProperty.enum) {\n normalizedProperty.enum = normalizeEnumValuesToArray(\n normalizedProperty.enum,\n sortObjectFormat\n );\n }\n\n // Handle array properties with enum values in \"of\"\n if (normalizedProperty.dataType === \"array\" && typeof normalizedProperty.of === \"object\" && normalizedProperty.of !== null) {\n const ofProp = normalizedProperty.of as Record<string, unknown>;\n if (ofProp.enum) {\n normalizedProperty.of = {\n ...ofProp,\n enum: normalizeEnumValuesToArray(\n ofProp.enum,\n sortObjectFormat\n )\n };\n }\n }\n\n // Handle map properties recursively\n if (normalizedProperty.dataType === \"map\" && normalizedProperty.properties) {\n normalizedProperty.properties = normalizePropertiesEnumValues(\n normalizedProperty.properties as Properties,\n sortObjectFormat\n );\n }\n\n result[key] = normalizedProperty as unknown as Property;\n } else {\n result[key] = property;\n }\n });\n return result;\n}\n","import { FirebaseApp } from \"@firebase/app\";\nimport {\n collection,\n getDocs,\n getFirestore,\n limit as limitClause,\n query,\n QueryDocumentSnapshot\n} from \"@firebase/firestore\";\n\nexport async function getFirestoreDataInPath(firebaseApp: FirebaseApp, path: string, parentPaths: string[], limit: number): Promise<object[]> {\n const firestore = getFirestore(firebaseApp);\n if (!parentPaths || parentPaths.length === 0) {\n const q = query(collection(firestore, path), limitClause(limit));\n return getDocs(q).then((querySnapshot) => {\n return querySnapshot.docs.map(doc => doc.data());\n });\n } else {\n let currentDocs: QueryDocumentSnapshot[] | undefined = undefined;\n let index = 0;\n const allPaths = parentPaths;\n allPaths.push(path);\n let parentPath: string | undefined = allPaths[0];\n while (parentPath) {\n if (currentDocs) {\n currentDocs = (await Promise.all(currentDocs.map(async (doc) => {\n const q = query(collection(firestore, doc.ref.path, parentPath as string), limitClause(5));\n return (await getDocs(q)).docs;\n }))).flat();\n } else {\n const q = query(collection(firestore, parentPath), limitClause(5));\n currentDocs = (await getDocs(q)).docs;\n }\n index++;\n parentPath = index < allPaths.length ? allPaths[index] : undefined;\n }\n return currentDocs ? currentDocs.map(doc => doc.data()) : [];\n }\n}\n","import { buildExternalSearchController } from \"./text_search_controller\";\n\n/**\n * Utility function to perform a text search in an algolia index,\n * returning the ids of the entities.\n * @param client The algolia client\n * @param indexName\n * @param query\n * @group Firebase\n */\nexport function performAlgoliaTextSearch(client: any, indexName: string, query: string): Promise<readonly string[]> {\n\n console.debug(\"Performing Algolia query\", client, query);\n\n return client.searchSingleIndex({\n indexName,\n searchParams: { query }\n }).then(({ hits }: any) => {\n return hits.map((hit: any) => hit.objectID as string);\n })\n .catch((err: any) => {\n console.error(err);\n return [];\n });\n}\n\n\n","import { User as FirebaseUser } from \"@firebase/auth\";\nimport { FirestoreTextSearchController, FirestoreTextSearchControllerBuilder } from \"../types\";\nimport { EntityCollection } from \"@rebasepro/types\";\n\nconst DEFAULT_SERVER = \"https://api.rebase.pro\";\n\n/**\n * Utility function to perform a text search in an algolia index,\n * returning the ids of the entities.\n * @param index\n * @param query\n * @group Firebase\n */\nexport async function performPineconeTextSearch({\n host = DEFAULT_SERVER,\n firebaseToken,\n projectId,\n collectionPath,\n query\n}: {\n host?: string,\n firebaseToken: string,\n collectionPath: string,\n projectId: string,\n query: string\n}): Promise<readonly string[]> {\n\n console.debug(\"Performing Pinecone query\", collectionPath, query);\n const response = await fetch((host ?? DEFAULT_SERVER) + `/projects/${projectId}/search/${collectionPath}`,\n {\n // mode: \"no-cors\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${firebaseToken}`\n // \"x-de-version\": version\n },\n body: JSON.stringify({\n query\n })\n });\n\n const promise = await response.json();\n return promise.data.ids;\n\n}\n\nexport function buildPineconeSearchController({\n isPathSupported,\n search\n}: {\n isPathSupported: (path: string) => boolean,\n search: (props: {\n searchString: string,\n path: string,\n currentUser?: FirebaseUser\n }) => Promise<readonly string[] | undefined>,\n}): FirestoreTextSearchControllerBuilder {\n return (props): FirestoreTextSearchController => {\n\n const init = (props: {\n path: string,\n collection?: EntityCollection\n }) => {\n // do nothing\n return Promise.resolve(isPathSupported(props.path));\n }\n\n return {\n init,\n search\n }\n }\n\n}\n","import { FirestoreTextSearchController, FirestoreTextSearchControllerBuilder } from \"../types\";\nimport { EntityCollection } from \"@rebasepro/types\";\n\n/**\n * Utility function to perform a text search in an external index,\n * returning the ids of the entities.\n * @group Firebase\n */\nexport function buildExternalSearchController({\n isPathSupported,\n search\n}: {\n isPathSupported: (path: string) => boolean,\n search: (props: {\n searchString: string,\n path: string\n }) => Promise<readonly string[] | undefined>,\n}): FirestoreTextSearchControllerBuilder {\n return (props): FirestoreTextSearchController => {\n\n const init = (props: {\n path: string,\n collection?: EntityCollection\n }) => {\n return Promise.resolve(isPathSupported(props.path));\n }\n\n return {\n init,\n search\n }\n }\n\n}\n","import { collection, getFirestore, onSnapshot, query } from \"@firebase/firestore\";\nimport Fuse from \"fuse.js\"\n\nimport { FirebaseApp } from \"@firebase/app\";\nimport { EntityCollection } from \"@rebasepro/types\";\nimport { FirestoreTextSearchController, FirestoreTextSearchControllerBuilder } from \"../types\";\n\nconst MAX_SEARCH_RESULTS = 80;\n\nexport const localSearchControllerBuilder: FirestoreTextSearchControllerBuilder = ({\n firebaseApp\n}: {\n\n firebaseApp: FirebaseApp,\n}): FirestoreTextSearchController => {\n\n let currentPath: string | undefined;\n const indexes: Record<string, Fuse<object & { id: string }>> = {};\n const listeners: Record<string, () => void> = {};\n\n const destroyListener = (path: string) => {\n if (listeners[path]) {\n listeners[path]();\n delete listeners[path];\n delete indexes[path];\n }\n }\n\n const init = ({\n path,\n collection: collectionProp,\n databaseId\n }: {\n path: string,\n collection?: EntityCollection,\n databaseId?: string\n }): Promise<boolean> => {\n\n if (currentPath && path !== currentPath) {\n destroyListener(currentPath)\n }\n\n currentPath = path;\n\n return new Promise(async (resolve, reject) => {\n if (collectionProp) {\n console.debug(\"Init local search controller\", path);\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n const col = collection(firestore, path);\n listeners[path] = onSnapshot(query(col),\n {\n next: (snapshot) => {\n if (snapshot.metadata.fromCache && snapshot.metadata.hasPendingWrites) {\n return;\n }\n const docs = snapshot.docs.map(doc => ({\n id: doc.id,\n ...doc.data()\n }));\n\n indexes[path] = buildIndex(docs, collectionProp);\n console.debug(\"Added docs to index\", path, docs.length);\n resolve(true);\n },\n error: (e) => {\n console.error(\"Error initializing local search controller\", path);\n console.error(e);\n reject(e);\n }\n }\n );\n }\n });\n }\n\n const search = async ({\n searchString,\n path\n }: {\n searchString: string,\n path: string,\n databaseId?: string\n }) => {\n console.debug(\"Searching local index\", path, searchString);\n const index = indexes[path];\n if (!index) {\n throw new Error(`Index not found for path ${path}`);\n }\n let searchResult = index.search(searchString);\n searchResult = searchResult.splice(0, MAX_SEARCH_RESULTS);\n searchResult = searchResult.sort((a, b) => {\n // Check if item A is an exact match\n const aExactMatch = a.item.id === searchString;\n // Check if item B is an exact match\n const bExactMatch = b.item.id === searchString;\n\n if (aExactMatch && !bExactMatch) {\n return -1; // Prioritize item A\n } else if (!aExactMatch && bExactMatch) {\n return 1; // Prioritize item B\n } else {\n // If both are exact matches or both are not, sort by Fuse's original score\n return (a.score ?? 0) - (b.score ?? 0);\n }\n });\n return searchResult.map((e: any) => e.item.id);\n };\n\n return {\n init,\n search\n }\n}\n\nfunction buildIndex(list: (object & { id: string })[], collection: EntityCollection) {\n\n const keys = [\"id\", ...Object.keys(collection.properties)];\n\n const fuseOptions = {\n // isCaseSensitive: false,\n // includeScore: false,\n // shouldSort: true,\n // includeMatches: false,\n // findAllMatches: false,\n // minMatchCharLength: 1,\n // location: 0,\n threshold: 0.6,\n // distance: 100,\n // useExtendedSearch: false,\n // ignoreLocation: false,\n // ignoreFieldNorm: false,\n // fieldNormWeight: 1,\n includeScore: true,\n keys: [{\n name: \"title\",\n weight: 1.0\n }, ...keys.map(key => ({\n name: key,\n weight: 0.5\n }))]\n };\n return new Fuse<object & { id: string }>(list, fuseOptions);\n}\n","import { FirestoreTextSearchController, FirestoreTextSearchControllerBuilder } from \"../types\";\nimport { FirebaseApp } from \"@firebase/app\";\nimport { getFunctions, httpsCallable } from \"@firebase/functions\";\nimport { EntityCollection } from \"@rebasepro/types\";\n\n/**\n * Configuration returned by the Rebase Search Extension\n */\ninterface SearchConfig {\n host: string;\n port: number;\n protocol: \"http\" | \"https\";\n apiKey: string;\n collectionsToIndex: string[];\n path?: string;\n}\n/**\n * Options for building the Rebase Search Controller\n */\nexport interface RebaseSearchControllerOptions {\n /**\n * The Firebase region where the extension is deployed.\n */\n region: string;\n\n /**\n * The extension instance ID. Defaults to \"rebase-search\".\n * Use this if you installed the extension with a custom instance ID.\n */\n extensionInstanceId?: string;\n\n /**\n * Custom Typesense configuration. If provided, skips fetching from extension.\n * Use this if you want to connect to your own Typesense instance.\n */\n customConfig?: {\n host: string;\n port?: number;\n protocol?: \"http\" | \"https\";\n apiKey: string;\n path?: string;\n };\n\n /**\n * Override the collections to index returned by the extension.\n * Use this if you want to restrict search to specific collections on the client side,\n * regardless of what is configured in the extension.\n */\n collections?: string[];\n}\n\n/**\n * Creates a text search controller that uses the Rebase Search Extension.\n *\n * This requires the `rebase-search` extension to be installed in the user's\n * Firebase project. The extension automatically deploys Typesense to Cloud Run\n * and syncs Firestore data.\n *\n * @example\n * ```typescript\n * import { buildRebaseSearchController } from \"@rebasepro/client-firebase\";\n *\n * // Using the extension (recommended)\n * const textSearchControllerBuilder = buildRebaseSearchController();\n *\n * // Or with custom Typesense instance\n * const textSearchControllerBuilder = buildRebaseSearchController({\n * customConfig: {\n * host: \"your-typesense-instance.com\",\n * apiKey: \"your-api-key\"\n * }\n * });\n *\n * <RebaseApp\n * textSearchControllerBuilder={textSearchControllerBuilder}\n * collections={[\n * {\n * path: \"products\",\n * name: \"Products\",\n * textSearchEnabled: true, // Enable search for this collection\n * properties: { ... }\n * }\n * ]}\n * />\n * ```\n *\n * @param options - Configuration options\n * @returns A FirestoreTextSearchControllerBuilder\n *\n * @group Firebase\n */\nexport function buildRebaseSearchController(\n options?: RebaseSearchControllerOptions\n): FirestoreTextSearchControllerBuilder {\n const region = options?.region || \"us-central1\";\n const extensionInstanceId = options?.extensionInstanceId || \"typesense-search\";\n\n let searchConfig: SearchConfig | null = null;\n let typesenseClient: any = null;\n let initPromise: Promise<void> | null = null;\n\n return ({ firebaseApp }: { firebaseApp: FirebaseApp }): FirestoreTextSearchController => {\n\n /**\n * Initializes the Typesense client\n */\n const initializeClient = async (): Promise<void> => {\n if (typesenseClient) return;\n\n // Use custom config if provided\n if (options?.customConfig) {\n searchConfig = {\n host: options.customConfig.host,\n port: options.customConfig.port || 443,\n protocol: options.customConfig.protocol || \"https\",\n apiKey: options.customConfig.apiKey,\n path: options.customConfig.path,\n collectionsToIndex: [\"*\"]\n };\n } else {\n // Fetch config from extension\n const functions = getFunctions(firebaseApp, region);\n const getConfig = httpsCallable<void, SearchConfig>(\n functions,\n `ext-${extensionInstanceId}-getSearchConfig`\n );\n\n try {\n const result = await getConfig();\n searchConfig = result.data;\n if (options?.collections && options.collections.length > 0) {\n searchConfig.collectionsToIndex = options.collections;\n }\n } catch (error: any) {\n console.error(\"Failed to get search config from extension:\", error);\n throw new Error(\n \"Failed to initialize Rebase Search. \" +\n \"Make sure the rebase-search extension is installed and configured. \" +\n `Error: ${error.message || error}`\n );\n }\n }\n\n if (!searchConfig) {\n throw new Error(\"Search config not available\");\n }\n\n // Dynamically import Typesense client to avoid bundling if not used\n const Typesense = (await import(\"typesense\")).default;\n\n typesenseClient = new Typesense.Client({\n nodes: [{\n host: searchConfig.host,\n port: searchConfig.port,\n protocol: searchConfig.protocol,\n path: searchConfig.path || \"\"\n }],\n apiKey: searchConfig.apiKey,\n connectionTimeoutSeconds: 5,\n retryIntervalSeconds: 0.5,\n numRetries: 2\n });\n };\n\n /**\n * Converts a Firestore path to Typesense collection name\n * e.g., \"users/123/orders\" -> \"users_orders\"\n */\n const getTypesenseCollectionName = (path: string): string => {\n const pathParts = path.split(\"/\");\n // Extract collection names (even indices) and join with underscore\n const collectionNames: string[] = [];\n for (let i = 0; i < pathParts.length; i += 2) {\n if (pathParts[i]) {\n collectionNames.push(pathParts[i]);\n }\n }\n return collectionNames.join(\"_\");\n };\n\n /**\n * Extracts parent filter for subcollection queries\n * e.g., \"users/123/orders\" -> { \"_parent_users_id\": \"123\" }\n */\n const getParentFilter = (path: string): string | null => {\n const pathParts = path.split(\"/\");\n if (pathParts.length <= 1) return null;\n\n // Build filter for parent IDs\n const filters: string[] = [];\n for (let i = 0; i < pathParts.length - 1; i += 2) {\n const collectionName = pathParts[i];\n const docId = pathParts[i + 1];\n if (collectionName && docId) {\n filters.push(`_parent_${collectionName}_id:=${docId}`);\n }\n }\n\n return filters.length > 0 ? filters.join(\" && \") : null;\n };\n\n /**\n * Initializes search for a specific collection path\n */\n const init = async (props: {\n path: string;\n collection?: EntityCollection;\n databaseId?: string;\n }): Promise<boolean> => {\n try {\n // Ensure client is initialized (only once)\n if (!initPromise) {\n initPromise = initializeClient();\n }\n await initPromise;\n\n if (!searchConfig) return false;\n\n // Get collection pattern (e.g., \"users/orders\" from \"users/123/orders\")\n const pathParts = props.path.split(\"/\");\n const collectionNames: string[] = [];\n for (let i = 0; i < pathParts.length; i += 2) {\n if (pathParts[i]) collectionNames.push(pathParts[i]);\n }\n const collectionPattern = collectionNames.join(\"/\");\n const rootCollection = collectionNames[0];\n\n // Check if this collection is indexed\n if (searchConfig.collectionsToIndex.includes(\"*\")) {\n return true;\n }\n\n // Check exact pattern or root collection\n return searchConfig.collectionsToIndex.includes(collectionPattern) ||\n searchConfig.collectionsToIndex.includes(rootCollection);\n } catch (error) {\n console.error(\"Failed to initialize Rebase Search:\", error);\n return false;\n }\n };\n\n // Cache for Typesense collection schemas (field names)\n const schemaCache: Map<string, string[]> = new Map();\n\n /**\n * Fetches the Typesense collection schema and returns searchable string field names.\n * Results are cached to avoid repeated API calls.\n */\n const getSearchableFieldsFromSchema = async (collectionName: string): Promise<string[]> => {\n // Check cache first\n if (schemaCache.has(collectionName)) {\n return schemaCache.get(collectionName)!;\n }\n\n try {\n const collection = await typesenseClient.collections(collectionName).retrieve();\n\n // Extract string fields from the schema\n const stringFields = collection.fields\n .filter((f: any) => {\n // Include string and string[] types, exclude internal fields\n const isStringType = f.type === \"string\" ||\n f.type === \"string[]\" ||\n f.type === \"string*\" ||\n f.type === \"auto\";\n const isNotInternal = !f.name.startsWith(\"_\") && f.name !== \".*\";\n return isStringType && isNotInternal;\n })\n .map((f: any) => f.name);\n\n schemaCache.set(collectionName, stringFields);\n return stringFields;\n } catch (error: any) {\n if (error.httpStatus === 404) {\n throw new Error(\n `Collection \"${collectionName}\" not found in Typesense. ` +\n \"Make sure the collection has been indexed. Try running the backfill function.\"\n );\n }\n throw error;\n }\n };\n\n /**\n * Performs a search and returns document IDs\n * Supports subcollections by filtering on parent IDs\n */\n const search = async (props: {\n searchString: string;\n path: string;\n databaseId?: string;\n collection?: EntityCollection;\n }): Promise<readonly string[] | undefined> => {\n if (!typesenseClient) {\n // Ensure client is initialized\n if (!initPromise) {\n initPromise = initializeClient();\n }\n await initPromise;\n }\n\n if (!typesenseClient) {\n throw new Error(\"Typesense client not initialized. Check extension configuration.\");\n }\n\n // Convert path to Typesense collection name\n const collectionName = getTypesenseCollectionName(props.path);\n\n // Get parent filter for subcollections\n const parentFilter = getParentFilter(props.path);\n\n // Get searchable fields from the actual Typesense schema\n const searchableFields = await getSearchableFieldsFromSchema(collectionName);\n\n if (searchableFields.length === 0) {\n throw new Error(\n `No searchable string fields found in Typesense collection \"${collectionName}\". ` +\n \"Make sure some documents have been indexed with string fields.\"\n );\n }\n\n const queryBy = searchableFields.join(\",\");\n\n try {\n const searchParams: any = {\n q: props.searchString,\n query_by: queryBy,\n per_page: 100,\n prefix: true, // Enable prefix matching\n typo_tokens_threshold: 1 // Allow some typos\n };\n\n // Add filter for subcollection queries\n if (parentFilter) {\n searchParams.filter_by = parentFilter;\n }\n\n const result = await typesenseClient\n .collections(collectionName)\n .documents()\n .search(searchParams);\n\n // Extract document IDs from hits\n const ids = result.hits?.map((hit: any) => hit.document.id) ?? [];\n\n return ids as readonly string[];\n } catch (error: any) {\n // Parse error message for user-friendly display\n const message = error.message || error.toString();\n throw new Error(`Search failed: ${message}`);\n }\n };\n\n return { init,\nsearch };\n };\n}\n","import { DataDriver, DeleteEntityProps, Entity, EntityCollection, EntityReference, FetchCollectionProps, FetchEntityProps, FilterCombination, FilterValues, GeoPoint, ListenCollectionProps, ListenEntityProps, SaveEntityProps, WhereFilterOp } from \"@rebasepro/types\";\nimport {\n collection as collectionClause,\n CollectionReference,\n deleteDoc,\n deleteField,\n doc,\n DocumentReference,\n DocumentSnapshot,\n Firestore,\n GeoPoint as FirestoreGeoPoint,\n getCountFromServer,\n getDoc,\n getDocs,\n getFirestore,\n limit as limitClause,\n onSnapshot,\n orderBy as orderByClause,\n Query,\n query,\n QueryConstraint,\n serverTimestamp,\n setDoc,\n startAfter as startAfterClause,\n Timestamp,\n VectorValue,\n vector,\n where as whereClause\n} from \"@firebase/firestore\";\nimport { FirebaseApp } from \"@firebase/app\";\nimport { FirestoreTextSearchController, FirestoreTextSearchControllerBuilder } from \"../types/text_search\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { localSearchControllerBuilder } from \"../utils\";\nimport { getAuth } from \"@firebase/auth\";\n\n/**\n * @group Firebase\n */\nexport interface FirestoreDataDriverProps {\n firebaseApp?: FirebaseApp,\n /**\n * You can use this controller to return a list of ids from a search index, given a\n * `path` and a `searchString`.\n */\n textSearchControllerBuilder?: FirestoreTextSearchControllerBuilder,\n\n /**\n * Fallback to local text search if no text search controller is specified,\n * or if the controller does not support the given path.\n */\n localTextSearchEnabled?: boolean,\n\n /**\n * Use this builder to indicate which indexes are available in your\n * Firestore database. This is used to allow filtering and sorting\n * for multiple fields in the CMS.\n */\n firestoreIndexesBuilder?: FirestoreIndexesBuilder;\n}\n\nexport type FirestoreIndexesBuilder = (params: {\n path: string,\n collection: EntityCollection<any>,\n}) => FilterCombination<string>[] | undefined\n\nexport type FirestoreDataDriver = DataDriver & {\n\n initTextSearch: (props: {\n path: string,\n databaseId?: string,\n collection?: EntityCollection\n }) => Promise<boolean>,\n}\n\n/**\n * Use this hook to build a {@link DataDriver} based on Firestore\n * @param firebaseApp\n * @param textSearchControllerBuilder\n * @group Firebase\n */\nexport function useFirestoreDriver({\n firebaseApp,\n textSearchControllerBuilder,\n firestoreIndexesBuilder,\n localTextSearchEnabled\n}: FirestoreDataDriverProps): FirestoreDataDriver {\n\n const searchControllerRef = useRef<FirestoreTextSearchController>(undefined);\n\n useEffect(() => {\n if (!searchControllerRef.current && firebaseApp) {\n if ((textSearchControllerBuilder || localTextSearchEnabled) && !searchControllerRef.current) {\n searchControllerRef.current = buildTextSearchControllerWithLocalSearch({\n firebaseApp,\n textSearchControllerBuilder,\n localTextSearchEnabled: localTextSearchEnabled ?? false\n });\n }\n }\n }, [firebaseApp, localTextSearchEnabled, textSearchControllerBuilder]);\n\n const buildQuery = useCallback(<M>(path: string,\n filter: FilterValues<Extract<keyof M, string>> | undefined,\n orderBy: string | undefined,\n order: \"desc\" | \"asc\" | undefined,\n startAfter: unknown[] | undefined,\n limit: number | undefined,\n databaseId?: string) => {\n\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n const collectionReference: Query = collectionClause(firestore, path);\n\n const queryParams: QueryConstraint[] = [];\n if (filter) {\n Object.entries(filter)\n .filter(([_, entry]) => !!entry)\n .forEach(([key, filterParameter]) => {\n const [op, value] = filterParameter as [WhereFilterOp, any];\n queryParams.push(whereClause(key, op, cmsToFirestoreModel(value, firestore)));\n });\n }\n\n if (orderBy && order) {\n queryParams.push(orderByClause(orderBy, order));\n }\n\n if (startAfter) {\n queryParams.push(startAfterClause(startAfter));\n }\n\n if (limit) {\n queryParams.push(limitClause(limit));\n }\n\n return query(collectionReference, ...queryParams);\n }, [firebaseApp]);\n\n const getAndBuildEntity = useCallback(<M extends Record<string, any>>(path: string,\n entityId: string | number,\n databaseId?: string\n ): Promise<Entity<M> | undefined> => {\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n\n return getDoc(doc(firestore, path, String(entityId)))\n .then((docSnapshot) => {\n if (!docSnapshot.exists()) {\n return undefined;\n }\n return createEntityFromDocument(docSnapshot, databaseId);\n });\n }, [firebaseApp]);\n\n const listenEntity = useCallback(<M extends Record<string, any>>(\n {\n path,\n entityId,\n collection,\n onUpdate,\n onError\n }: ListenEntityProps<M>): () => void => {\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const databaseId = collection?.databaseId;\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n const resolvedPath = path;\n\n return onSnapshot(\n doc(firestore, resolvedPath, String(entityId)),\n {\n next: (docSnapshot) => {\n onUpdate(createEntityFromDocument(docSnapshot, databaseId));\n },\n error: onError\n }\n );\n }, [firebaseApp]);\n\n const performTextSearch = useCallback(<M extends Record<string, any>>({\n path,\n databaseId,\n searchString,\n onUpdate\n }: {\n path: string,\n databaseId?: string,\n searchString: string;\n onUpdate: (entities: Entity<M>[]) => void,\n }): () => void => {\n\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const textSearchController = searchControllerRef.current;\n if (!textSearchController)\n throw Error(\"Trying to make text search without specifying a FirestoreTextSearchController\");\n\n let subscriptions: (() => void)[] = [];\n\n\n const auth = getAuth(firebaseApp);\n const currentUser = auth?.currentUser;\n\n const search = textSearchController.search({\n path,\n searchString,\n currentUser: currentUser ?? undefined,\n databaseId\n });\n\n if (!search) {\n throw Error(\"The current path is not supported by the specified FirestoreTextSearchController\");\n }\n\n search.then((ids) => {\n if (!ids || ids.length === 0) {\n subscriptions = [];\n onUpdate([]);\n }\n\n const entities: Entity<M>[] = [];\n const addedEntitiesSet = new Set<string | number>();\n subscriptions = (ids ?? [])\n .map((entityId) => {\n return listenEntity({\n path,\n entityId,\n onUpdate: (entity: Entity<any> | null) => {\n if (entity?.values) {\n if (entity.id && !addedEntitiesSet.has(entity.id)) {\n addedEntitiesSet.add(entity.id);\n entities.push(entity);\n onUpdate(entities);\n }\n } else if (entity?.id) {\n addedEntitiesSet.delete(entity.id);\n onUpdate([...entities.filter(e => e.id !== entityId)])\n }\n }\n })\n }\n );\n });\n\n return () => {\n subscriptions.forEach((p) => p());\n }\n\n }, [firebaseApp, listenEntity]);\n\n return {\n key: \"firestore\",\n\n currentTime,\n\n initialised: Boolean(firebaseApp),\n\n initTextSearch: useCallback(async (props: {\n path: string,\n databaseId?: string,\n collection?: EntityCollection\n }) => {\n console.debug(\"Init text search controller\", searchControllerRef.current, props.path);\n if (!searchControllerRef.current) {\n console.warn(\"You are trying to use text search, but have not provided a text search controller in `useFirestoreDriver`. You can also set the flag `localTextSearchEnabled` to use local search in `useFirestoreDriver`. Local text search can incur in performance issues and higher costs for large datasets.\");\n return false;\n }\n try {\n return searchControllerRef.current.init(props);\n } catch (e) {\n console.error(\"Error initializing text search controller\", e);\n return false;\n }\n }, []),\n\n /**\n * Fetch entities in a Firestore path\n * @param path\n * @param collection\n * @param filter\n * @param limit\n * @param startAfter\n * @param searchString\n * @param orderBy\n * @param order\n * @return Function to cancel subscription\n * @see useCollectionFetch if you need this functionality implemented as a hook\n * @group Firestore\n */\n fetchCollection: useCallback(async <M extends Record<string, any>>({\n path,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order,\n collection\n }: FetchCollectionProps<M>\n ): Promise<Entity<M>[]> => {\n\n const databaseId = collection?.databaseId;\n\n const resolvedPath = path;\n\n console.debug(\"Fetching collection\", {\n path,\n limit,\n filter,\n startAfter,\n orderBy,\n order\n });\n const query = buildQuery(resolvedPath, filter, orderBy, order, startAfter as unknown[] | undefined, limit, databaseId);\n\n const snapshot = await getDocs(query);\n return snapshot.docs.map((doc) => createEntityFromDocument(doc, databaseId));\n }, [buildQuery]),\n\n /**\n * Listen to a entities in a given path\n * @param path\n * @param collection\n * @param onError\n * @param filter\n * @param limit\n * @param startAfter\n * @param searchString\n * @param orderBy\n * @param order\n * @param onUpdate\n * @return Function to cancel subscription\n * @see useCollectionFetch if you need this functionality implemented as a hook\n * @group Firestore\n */\n listenCollection: useCallback(<M extends Record<string, any>>(\n {\n path,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order,\n onUpdate,\n onError,\n collection\n }: ListenCollectionProps<M>\n ): () => void => {\n\n console.debug(\"Listening collection\", {\n path,\n searchString,\n limit,\n filter,\n startAfter,\n orderBy,\n order,\n collection\n });\n\n if (!firebaseApp) {\n throw Error(\"useFirestoreDriver Firebase not initialised\");\n }\n\n const databaseId = collection?.databaseId;\n\n if (searchString) {\n return performTextSearch<M>({\n path,\n searchString,\n onUpdate,\n databaseId\n });\n }\n\n const resolvedPath = path;\n console.debug(\"Resolved path for listening\", {\n path,\n resolvedPath\n });\n const query = buildQuery(resolvedPath, filter, orderBy, order, startAfter as unknown[] | undefined, limit, databaseId);\n return onSnapshot(query,\n {\n next: (snapshot) => {\n if (!searchString)\n onUpdate(snapshot.docs.map((doc) => createEntityFromDocument(doc, databaseId)));\n },\n error: onError\n }\n );\n\n }, [buildQuery, firebaseApp, performTextSearch]),\n\n /**\n * Retrieve an entity given a path and a collection\n * @param path\n * @param entityId\n * @param collection\n * @group Firestore\n */\n fetchEntity: useCallback(<M extends Record<string, any>>({\n path,\n entityId,\n collection\n }: FetchEntityProps<M>\n ): Promise<Entity<M> | undefined> => {\n const resolvedPath = path;\n return getAndBuildEntity(resolvedPath, entityId, collection?.databaseId);\n }, [getAndBuildEntity]),\n\n /**\n *\n * @param path\n * @param entityId\n * @param collection\n * @param onUpdate\n * @param onError\n * @return Function to cancel subscription\n * @group Firestore\n */\n listenEntity,\n\n /**\n * Save entity to the specified path. Note that Firestore does not allow\n * undefined values.\n * @param path\n * @param entityId\n * @param values\n * @param schemaId\n * @param collection\n * @param status\n * @group Firestore\n */\n saveEntity: useCallback(<M extends Record<string, any>>(\n {\n path,\n entityId,\n values: valuesProp,\n collection,\n status\n }: SaveEntityProps<M>): Promise<Entity<M>> => {\n\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n console.debug(\"1\", {\n path,\n entityId,\n values: valuesProp,\n collection\n })\n const values = cmsToFirestoreModel(valuesProp, getFirestore(firebaseApp));\n\n console.debug(\"2\", {\n path,\n entityId,\n values: valuesProp,\n collection\n })\n const databaseId = collection?.databaseId;\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n const resolvedPath = path;\n\n const collectionReference: CollectionReference = collectionClause(firestore, path);\n console.debug(\"Saving entity\", {\n path,\n entityId,\n values,\n databaseId\n });\n\n let documentReference: DocumentReference;\n if (entityId) {\n documentReference = doc(collectionReference, String(entityId));\n } else {\n documentReference = doc(collectionReference);\n }\n return setDoc(documentReference, values, { merge: true })\n .then(() => {\n return {\n id: documentReference.id,\n path,\n values: firestoreToCMSModel(values)\n } as Entity<M>;\n })\n .catch((error) => {\n console.error(\"Error saving entity\", error);\n throw error;\n\n });\n }, [firebaseApp]),\n\n /**\n * Delete an entity\n * @param entity\n * @param collection\n * @group Firestore\n */\n deleteEntity: useCallback(<M extends Record<string, any>>(\n {\n entity\n }: DeleteEntityProps<M>\n ): Promise<void> => {\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const databaseId = entity.databaseId;\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n\n return deleteDoc(doc(firestore, entity.path, String(entity.id)));\n }, [firebaseApp]),\n\n /**\n * Check if the given property is unique in the given collection\n * @param path Collection path\n * @param name of the property\n * @param value\n * @param property\n * @param entityId\n * @return `true` if there are no other fields besides the given entity\n * @group Firestore\n */\n checkUniqueField: useCallback(async (\n path: string,\n name: string,\n value: any,\n entityId?: string | number,\n collection?: EntityCollection<any>\n ): Promise<boolean> => {\n\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n const databaseId = collection?.databaseId;\n const firestore = databaseId ? getFirestore(firebaseApp, databaseId) : getFirestore(firebaseApp);\n\n if (value === undefined || value === null) {\n return Promise.resolve(true);\n }\n const q = query(collectionClause(firestore, path), whereClause(name, \"==\", cmsToFirestoreModel(value, firestore)));\n const snapshot = await getDocs(q);\n return snapshot.docs.filter(doc => doc.id !== entityId).length === 0;\n\n }, [firebaseApp]),\n\n countEntities: useCallback(async ({\n path,\n filter,\n order,\n orderBy,\n collection\n }: FetchCollectionProps<any>): Promise<number> => {\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n const databaseId = collection?.databaseId;\n const resolvedPath = path;\n const query = buildQuery(resolvedPath, filter, orderBy, order, undefined, undefined, databaseId);\n const snapshot = await getCountFromServer(query);\n return snapshot.data().count;\n }, [firebaseApp]),\n\n isFilterCombinationValid: useCallback(({\n path,\n collection,\n filterValues,\n sortBy\n }: {\n path: string,\n collection: EntityCollection<any>,\n filterValues: FilterValues<any>,\n sortBy?: [string, \"asc\" | \"desc\"],\n }): boolean => {\n\n if (!firebaseApp) throw Error(\"useFirestoreDriver Firebase not initialised\");\n\n // If no indexes are defined, we assume the query is valid.\n // If there is no index in Firestore, and error message will be shown\n if (firestoreIndexesBuilder === undefined) return true;\n const resolvedPath = path;\n\n const indexes = firestoreIndexesBuilder?.({\n path: resolvedPath,\n collection\n });\n\n const sortKey = sortBy ? sortBy[0] : undefined;\n const sortDirection = sortBy ? sortBy[1] : undefined;\n\n // Order by clause cannot contain a field with an equality filter\n const values: [WhereFilterOp, any][] = Object.values(filterValues) as [WhereFilterOp, any][];\n\n const filterKeys = Object.keys(filterValues);\n const filtersCount = filterKeys.length;\n\n if (!sortKey && values.every((v) => v[0] === \"==\")) {\n return true;\n }\n\n if (filtersCount === 1 && (!sortKey || sortKey === filterKeys[0])) {\n return true;\n }\n\n if (!indexes && filtersCount > 1) {\n return false;\n }\n\n return !!indexes && indexes\n .filter((compositeIndex) => !sortKey || sortKey in compositeIndex)\n .find((compositeIndex) =>\n Object.entries(filterValues).every(([key, value]) => compositeIndex[key] !== undefined && (!sortDirection || compositeIndex[key] === sortDirection))\n ) !== undefined;\n }, [firebaseApp])\n\n };\n\n}\n\nconst createEntityFromDocument = <M extends Record<string, any>>(\n docSnap: DocumentSnapshot,\n databaseId?: string\n): Entity<M> => {\n const values = firestoreToCMSModel(docSnap.data());\n const path = getCMSPathFromFirestorePath(docSnap.ref.path);\n return {\n id: docSnap.id,\n path: path,\n values,\n databaseId\n };\n};\n\n/**\n * Recursive function that converts Firestore data types into CMS or plain\n * JS types.\n * Rebase uses Javascript dates internally instead of Firestore timestamps.\n * This makes it easier to interact with the rest of the libraries and\n * bindings.\n * Also, Firestore references are replaced with {@link EntityReference}\n * @param data\n * @group Firestore\n */\nexport function firestoreToCMSModel(data: any): any {\n if (data === null || data === undefined) return null;\n if (deleteField().isEqual(data)) {\n return undefined;\n }\n if (serverTimestamp().isEqual(data)) {\n return null;\n }\n if (data instanceof Timestamp || (typeof data.toDate === \"function\" && data.toDate() instanceof Date)) {\n return data.toDate();\n }\n if (data instanceof Date) {\n return data;\n }\n if (typeof data === \"object\" && \"__type__\" in data && data.__type__ === \"__vector__\") {\n return data; // already translated\n }\n if (data instanceof VectorValue || (typeof data === \"object\" && data !== null && typeof data.toArray === \"function\" && data.constructor?.name === \"VectorValue\")) {\n return { __type__: \"__vector__\",\nvalue: data.toArray() };\n }\n\n if (data instanceof FirestoreGeoPoint) {\n return new GeoPoint(data.latitude, data.longitude);\n }\n if (data instanceof DocumentReference) {\n // @ts-ignore\n const databaseId = data?.firestore?._databaseId?.database;\n return new EntityReference({ id: data.id,\npath: getCMSPathFromFirestorePath(data.path),\ndatabaseId });\n }\n if (Array.isArray(data)) {\n return data.map(firestoreToCMSModel).filter(v => v !== undefined);\n }\n if (typeof data === \"object\") {\n const result: Record<string, any> = {};\n for (const key of Object.keys(data)) {\n const childValue = firestoreToCMSModel(data[key]);\n if (childValue !== undefined)\n result[key] = childValue;\n }\n return result;\n }\n return data;\n}\n\n/**\n * Remove id from Firestore path\n * @param fsPath\n */\nfunction getCMSPathFromFirestorePath(fsPath: string): string {\n let to = fsPath.lastIndexOf(\"/\");\n to = to === -1 ? fsPath.length : to;\n return fsPath.substring(0, to);\n}\n\n\nexport function cmsToFirestoreModel(data: any, firestore: Firestore, inArray = false): any {\n if (data === undefined) {\n return deleteField();\n } else if (data === null) {\n return null;\n } else if (Array.isArray(data)) {\n return data.filter(v => v !== undefined).map(v => cmsToFirestoreModel(v, firestore, true));\n } else if (data.isEntityReference && data.isEntityReference()) {\n const targetFirestore = data.databaseId ? getFirestore(firestore.app, data.databaseId) : firestore;\n return doc(targetFirestore, data.path, data.id);\n } else if (data && typeof data === \"object\" && data.__type === \"relation\" && data.path && data.id) {\n return doc(firestore, data.path, String(data.id));\n } else if (data instanceof GeoPoint) {\n return new FirestoreGeoPoint(data.latitude, data.longitude);\n } else if (data instanceof Date) {\n return Timestamp.fromDate(data);\n } else if (data && typeof data === \"object\" && \"__type__\" in data && data.__type__ === \"__vector__\") {\n return vector(data.value || []);\n } else if (data && typeof data === \"object\") {\n return Object.entries(data)\n .map(([key, v]) => {\n const firestoreModel = cmsToFirestoreModel(v, firestore);\n if (firestoreModel !== undefined)\n return ({ [key]: firestoreModel });\n else\n return {};\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n }\n return data;\n}\n\nfunction currentTime(): any {\n return serverTimestamp();\n}\n\nfunction buildTextSearchControllerWithLocalSearch({\n textSearchControllerBuilder,\n firebaseApp,\n localTextSearchEnabled\n}: {\n textSearchControllerBuilder?: FirestoreTextSearchControllerBuilder,\n firebaseApp: FirebaseApp,\n localTextSearchEnabled: boolean\n}): FirestoreTextSearchController | undefined {\n if (!textSearchControllerBuilder && localTextSearchEnabled) {\n console.debug(\"Using local search only\");\n return localSearchControllerBuilder({ firebaseApp });\n }\n if (!localTextSearchEnabled && textSearchControllerBuilder) {\n console.debug(\"Using external text search only\");\n return textSearchControllerBuilder({ firebaseApp });\n }\n if (!textSearchControllerBuilder && !localTextSearchEnabled) {\n return undefined;\n }\n\n const localSearchController = localSearchControllerBuilder({ firebaseApp })\n const textSearchController = textSearchControllerBuilder!({ firebaseApp });\n return {\n init: async (props: {\n path: string,\n databaseId?: string,\n collection?: EntityCollection\n }) => {\n const b = await textSearchController.init(props);\n if (b) {\n console.debug(\"External Text search controller supports path\", props.path);\n return true;\n }\n if (localTextSearchEnabled)\n return localSearchController.init(props);\n return false;\n },\n search: async (props: {\n searchString: string,\n path: string,\n currentUser?: any,\n databaseId?: string\n }) => {\n const search = await textSearchController.search(props);\n return search ?? await localSearchController.search(props);\n }\n }\n}\n","import { FirebaseApp } from \"@firebase/app\";\nimport {\n Database,\n get,\n getDatabase,\n limitToFirst,\n onValue,\n orderByChild,\n orderByKey,\n push,\n query,\n ref,\n remove,\n set,\n startAt\n} from \"@firebase/database\";\nimport { useCallback } from \"react\";\nimport { DataDriver, DeleteEntityProps, Entity, FetchCollectionProps, FetchEntityProps, ListenCollectionProps, ListenEntityProps, SaveEntityProps } from \"@rebasepro/types\";\n\nexport function useFirebaseRTDBDelegate({ firebaseApp }: { firebaseApp?: FirebaseApp }): DataDriver {\n\n const fetchCollection = useCallback(async <M extends Record<string, any>>({\n path,\n filter,\n limit,\n startAfter,\n orderBy,\n order,\n searchString\n }: FetchCollectionProps<M>): Promise<Entity<M>[]> => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n let dbQuery = query(ref(database, path));\n\n // Example to apply \"limit\" and \"startAfter\"\n if (startAfter !== undefined) {\n dbQuery = query(dbQuery, orderByKey(), startAt(String(startAfter)));\n }\n if (limit !== undefined) {\n dbQuery = query(dbQuery, limitToFirst(limit));\n }\n\n const snapshot = await get(dbQuery);\n if (snapshot.exists()) {\n return Object.entries(snapshot.val()).map(([id, values]) => ({\n id,\n path: path,\n values: delegateToCMSModel(values) as M\n }));\n }\n return [];\n }, [firebaseApp]);\n\n const listenCollection = useCallback(<M extends Record<string, any>>({\n path,\n onUpdate\n // Realtime Database does not directly support onError in onValue\n }: ListenCollectionProps<M>): () => void => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n const dbRef = ref(database, path);\n const unsubscribe = onValue(dbRef, (snapshot) => {\n if (snapshot.exists()) {\n const result: Entity<M>[] = Object.entries(snapshot.val()).map(([id, values]) => ({\n id,\n path: path,\n values: delegateToCMSModel(values) as M\n }));\n onUpdate(result);\n } else {\n onUpdate([]);\n }\n });\n\n return () => unsubscribe();\n }, [firebaseApp]);\n\n const fetchEntity = useCallback(async <M extends Record<string, any>>({\n path,\n entityId\n }: FetchEntityProps<M>): Promise<Entity<M> | undefined> => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n const snapshot = await get(ref(database, `${path}/${entityId}`));\n if (snapshot.exists()) {\n return {\n id: entityId,\n path: path,\n values: delegateToCMSModel(snapshot.val()) as M\n };\n }\n return undefined;\n }, [firebaseApp]);\n\n const listenEntity = useCallback(<M extends Record<string, any>>({\n path,\n entityId,\n onUpdate,\n onError\n }: ListenEntityProps<M>): () => void => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n const dbRef = ref(database, `${path}/${entityId}`);\n const unsubscribe = onValue(dbRef, (snapshot) => {\n if (snapshot.exists()) {\n onUpdate({\n id: entityId,\n path,\n values: delegateToCMSModel(snapshot.val()) as M\n });\n } else {\n onError?.(new Error(\"Entity does not exist\"));\n }\n });\n\n return () => unsubscribe();\n }, [firebaseApp]);\n\n const saveEntity = useCallback(async <M extends Record<string, any>>({\n path,\n entityId,\n values\n }: SaveEntityProps<M>): Promise<Entity<M>> => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n // If entityId is not provided, a new entity will be created\n const finalId = entityId ?? push(ref(database, path)).key;\n if (!finalId) {\n throw new Error(\"Could not generate a new id\");\n }\n\n // Transform the data to RTDB format before saving\n const transformedValues = cmsToRTDBModel(values, database);\n await set(ref(database, `${path}/${finalId}`), transformedValues);\n\n return {\n id: finalId,\n path: path,\n values: values as M\n };\n }, [firebaseApp]);\n\n const deleteEntity = useCallback(async <M extends Record<string, any>>({\n entity\n }: DeleteEntityProps<M>): Promise<void> => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n await remove(ref(database, `${entity.path}/${entity.id}`));\n }, [firebaseApp]);\n\n // Implementing additional methods required by DataDriver\n const checkUniqueField = useCallback(async (slug: string, name: string, value: any, entityId?: string | number): Promise<boolean> => {\n if (!firebaseApp) {\n throw new Error(\"Firebase app not provided\");\n }\n const database = getDatabase(firebaseApp);\n\n // Simplified example; the Realtime Database does not support querying with \"not equal\" conditions\n const dbRef = query(ref(database, slug), orderByChild(name), startAt(value), limitToFirst(1));\n const snapshot = await get(dbRef);\n\n if (!snapshot.exists()) {\n return true;\n }\n\n // Check if the found entity is the same as the one being checked\n const [key, entityValue] = Object.entries(snapshot.val())[0];\n if (entityValue && typeof entityValue === \"object\" && (entityValue as Record<string, unknown>)[name] === value && key === entityId) {\n return true;\n }\n\n return false;\n }, [firebaseApp]);\n\n const isFilterCombinationValid = useCallback(({\n path,\n filter,\n sortBy\n }: any): boolean => {\n return false;\n }, []);\n\n return {\n key: \"firebase_rtdb\",\n fetchCollection,\n listenCollection,\n fetchEntity,\n listenEntity,\n saveEntity,\n deleteEntity,\n checkUniqueField,\n isFilterCombinationValid,\n currentTime: () => new Date()\n };\n}\n\n\n/**\n * Transform data from RTDB format back to CMS format\n * This is used internally when fetching/listening to data\n */\nfunction delegateToCMSModel(data: any): any {\n if (data === null || data === undefined) return null;\n\n if (Array.isArray(data)) {\n return data.map(delegateToCMSModel).filter(v => v !== undefined);\n }\n\n if (typeof data === \"object\") {\n const result: Record<string, any> = {};\n for (const key of Object.keys(data)) {\n const childValue = delegateToCMSModel(data[key]);\n if (childValue !== undefined)\n result[key] = childValue;\n }\n return result;\n }\n\n return data;\n}\n\n/**\n * Transform data from CMS format to RTDB format\n * This is used internally when saving data\n */\nfunction cmsToRTDBModel(data: any, database: Database): any {\n if (data === undefined) {\n return null;\n } else if (data === null) {\n return null;\n } else if (Array.isArray(data)) {\n return data.filter(v => v !== undefined).map(v => cmsToRTDBModel(v, database));\n } else if (data.isEntityReference && data.isEntityReference()) {\n return ref(database, `${data.slug}/${data.id}`);\n } else if (data instanceof Date) {\n // For dates, convert to ISO string or timestamp.\n return data.toISOString();\n } else if (data && typeof data === \"object\") {\n return Object.entries(data)\n .map(([key, v]) => {\n const rtdbModel = cmsToRTDBModel(v, database);\n if (rtdbModel !== undefined)\n return { [key]: rtdbModel };\n else\n return {};\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n }\n return data;\n}\n","import { useEffect } from \"react\";\nimport { getAuth, RecaptchaVerifier } from \"@firebase/auth\";\n\ndeclare global {\n interface Window {\n recaptchaVerifier: RecaptchaVerifier;\n }\n}\n\nexport const RECAPTCHA_CONTAINER_ID = \"recaptcha-container\" as const;\n\nexport function useRecaptcha() {\n useEffect(() => {\n if (!window || window?.recaptchaVerifier) return;\n\n const auth = getAuth();\n\n window.recaptchaVerifier = new RecaptchaVerifier(\n auth,\n RECAPTCHA_CONTAINER_ID,\n {\n size: \"invisible\"\n }\n );\n }, []);\n\n return null;\n}\n","import React, { useCallback, useEffect } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { removeUndefined } from \"@rebasepro/utils\";\nimport {\n AuthController,\n Authenticator,\n DataDriver,\n Entity,\n Role,\n User,\n UserManagementDelegate\n} from \"@rebasepro/types\";\n\ntype UserWithRoleIds<USER extends User = any> = Omit<USER, \"roles\"> & { roles: string[] };\n\nexport interface UserManagementDelegateParams<CONTROLLER extends AuthController<any> = AuthController<any>> {\n\n authController: CONTROLLER;\n\n /**\n * The delegate in charge of persisting the data.\n */\n dataSourceDelegate?: DataDriver;\n\n /**\n * Path where the plugin users configuration is stored.\n * Default: __FIRECMS/config/users\n * You can specify a different path if you want to store the user management configuration in a different place.\n * Please keep in mind that the FireCMS users are not necessarily the same as the Firebase users (but they can be).\n * The path should be relative to the root of the database, and should always have an odd number of segments.\n */\n usersPath?: string;\n\n /**\n * Path where the plugin roles configuration is stored.\n * Default: __FIRECMS/config/roles\n */\n rolesPath?: string;\n\n /**\n * The roles that are available in the user management system.\n * If you provide this, the user management system will not fetch the roles from the database.\n */\n roles?: Role[];\n\n /**\n * If there are no roles in the database, provide a button to create the default roles.\n */\n allowDefaultRolesCreation?: boolean;\n\n /**\n * Include the collection config permissions in the user management system.\n */\n includeCollectionConfigPermissions?: boolean;\n\n}\n\n/**\n * This hook is used to build a user management object that can be used to\n * manage users and roles in a Firestore backend.\n * @param authController\n * @param dataSourceDelegate\n * @param usersPath\n * @param rolesPath\n * @param roles\n * @param allowDefaultRolesCreation\n * @param includeCollectionConfigPermissions\n */\nexport function useBuildUserManagement<CONTROLLER extends AuthController<any> = AuthController<any>,\n USER extends User = CONTROLLER extends AuthController<infer U> ? U : any>\n({\n authController,\n dataSourceDelegate,\n roles: rolesProp,\n usersPath = \"__FIRECMS/config/users\",\n rolesPath = \"__FIRECMS/config/roles\",\n allowDefaultRolesCreation,\n includeCollectionConfigPermissions\n }: UserManagementDelegateParams<CONTROLLER>): UserManagementDelegate<USER> & CONTROLLER {\n\n if (!authController) {\n throw Error(\"useBuildUserManagement: You need to provide an authController since version 3.0.0-beta.11. Check https://firecms.co/docs/pro/migrating_from_v3_beta\");\n }\n\n const rolesDefinedInCode = (rolesProp ?? [])?.length > 0;\n const [rolesLoading, setRolesLoading] = React.useState<boolean>(!rolesDefinedInCode);\n const [usersLoading, setUsersLoading] = React.useState<boolean>(true);\n const [roles, setRoles] = React.useState<Role[]>(rolesProp ?? []);\n const [usersWithRoleIds, setUsersWithRoleIds] = React.useState<UserWithRoleIds<USER>[]>([]);\n\n const users = usersWithRoleIds.map(u => ({\n ...u,\n }) as unknown as USER);\n\n const [rolesError, setRolesError] = React.useState<Error | undefined>();\n const [usersError, setUsersError] = React.useState<Error | undefined>();\n\n const _usersLoading = usersLoading;\n const _rolesLoading = rolesLoading;\n\n const loading = _rolesLoading || _usersLoading;\n\n useEffect(() => {\n if (rolesDefinedInCode) return;\n if (!dataSourceDelegate || !rolesPath) return;\n if (dataSourceDelegate.initialised !== undefined && !dataSourceDelegate.initialised) return;\n if (authController?.initialLoading) return;\n\n setRolesLoading(true);\n return dataSourceDelegate.listenCollection?.({\n path: rolesPath,\n onUpdate(entities: Entity<any>[]): void {\n setRolesError(undefined);\n console.debug(\"Updating roles\", entities);\n try {\n const newRoles = entityToRoles(entities);\n if (!equal(newRoles, roles)) {\n setRoles(newRoles);\n }\n } catch (e) {\n setRoles([]);\n console.error(\"Error loading roles\", e);\n setRolesError(e as Error);\n }\n setRolesLoading(false);\n },\n onError(e: any): void {\n setRoles([]);\n console.error(\"Error loading roles\", e);\n setRolesError(e);\n setRolesLoading(false);\n }\n });\n\n }, [rolesDefinedInCode, dataSourceDelegate?.initialised, authController?.initialLoading, authController?.user?.uid, rolesPath]);\n\n useEffect(() => {\n if (!dataSourceDelegate || !usersPath) return;\n if (dataSourceDelegate.initialised !== undefined && !dataSourceDelegate.initialised) {\n return;\n }\n if (authController?.initialLoading) {\n return;\n }\n\n setUsersLoading(true);\n return dataSourceDelegate.listenCollection?.({\n path: usersPath,\n onUpdate(entities: Entity<any>[]): void {\n console.debug(\"Updating users\", entities);\n setUsersError(undefined);\n try {\n const newUsers = entitiesToUsers(entities);\n // if (!equal(newUsers, usersWithRoleIds))\n setUsersWithRoleIds(newUsers);\n } catch (e) {\n setUsersWithRoleIds([]);\n console.error(\"Error loading users\", e);\n setUsersError(e as Error);\n }\n setUsersLoading(false);\n },\n onError(e: any): void {\n console.error(\"Error loading users\", e);\n setUsersWithRoleIds([]);\n setUsersError(e);\n setUsersLoading(false);\n }\n });\n\n }, [dataSourceDelegate?.initialised, authController?.initialLoading, authController?.user?.uid, usersPath]);\n\n const saveUser = useCallback(async (user: USER): Promise<USER> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!usersPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n\n console.debug(\"Persisting user\", user);\n\n const roleIds = user.roles;\n const email = user.email?.toLowerCase().trim();\n if (!email) throw Error(\"Email is required\");\n\n const userExists = users.find(u => u.email?.toLowerCase() === email);\n const data = {\n ...user,\n roles: roleIds ?? []\n };\n if (!userExists) {\n // @ts-ignore\n data.created_on = new Date();\n }\n // delete the previous user entry if it exists and the uid has changed\n if (userExists && userExists.uid !== user.uid) {\n const entity: Entity<any> = {\n values: {},\n path: usersPath,\n id: userExists.uid\n }\n await dataSourceDelegate.deleteEntity({ entity })\n .then(() => {\n console.debug(\"Deleted previous user\", userExists);\n })\n .catch(e => {\n console.error(\"Error deleting user\", e);\n });\n\n }\n\n return dataSourceDelegate.saveEntity({\n status: \"existing\",\n path: usersPath,\n entityId: email,\n values: removeUndefined(data) as Record<string, unknown>\n }).then(() => user);\n }, [usersPath, dataSourceDelegate?.initialised]);\n\n const saveRole = useCallback((role: Role): Promise<void> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!rolesPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n console.debug(\"Persisting role\", role);\n const {\n id,\n ...roleData\n } = role;\n return dataSourceDelegate.saveEntity({\n status: \"existing\",\n path: rolesPath,\n entityId: id,\n values: removeUndefined(roleData) as Record<string, unknown>\n }).then(() => {\n return;\n });\n }, [rolesPath, dataSourceDelegate?.initialised]);\n\n const deleteUser = useCallback(async (user: User): Promise<void> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!usersPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n console.debug(\"Deleting\", user);\n const { uid } = user;\n const entity: Entity<any> = {\n path: usersPath,\n id: uid,\n values: {}\n };\n await dataSourceDelegate.deleteEntity({ entity })\n }, [usersPath, dataSourceDelegate?.initialised]);\n\n const deleteRole = useCallback(async (role: Role): Promise<void> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!rolesPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n console.debug(\"Deleting\", role);\n const { id } = role;\n const entity: Entity<any> = {\n path: rolesPath,\n id: id,\n values: {}\n };\n await dataSourceDelegate.deleteEntity({ entity })\n }, [rolesPath, dataSourceDelegate?.initialised]);\n\n\n\n const defineRolesFor: ((user: User) => Role[] | undefined) = useCallback((user) => {\n if (!usersWithRoleIds) throw Error(\"Users not loaded\");\n const mgmtUser = usersWithRoleIds.find(u => u.email?.toLowerCase() === user?.email?.toLowerCase());\n if (!mgmtUser || !mgmtUser.roles) return undefined;\n return roles.filter(r => mgmtUser.roles.includes(r.id));\n }, [roles, usersWithRoleIds]);\n\n const authenticator: Authenticator<USER> = useCallback(({ user }) => {\n\n if (loading) {\n return false;\n }\n if (user === null) {\n console.warn(\"User is null, returning\");\n return false;\n }\n\n if (users.length === 0) {\n console.warn(\"No users created yet\");\n return true; // If there are no users created yet, we allow access to every user\n }\n\n const mgmtUser = users.find(u => u.email?.toLowerCase() === user?.email?.toLowerCase());\n if (mgmtUser) {\n // check if the uid or photoURL needs to be updated in the user management system\n const needsUidUpdate = mgmtUser.uid !== user.uid;\n const needsPhotoUpdate = user.photoURL && mgmtUser.photoURL !== user.photoURL;\n\n if (needsUidUpdate || needsPhotoUpdate) {\n const updateReason = needsUidUpdate ? \"uid\" : \"photoURL\";\n console.debug(`User ${updateReason} has changed, updating user in user management system`);\n saveUser({\n ...mgmtUser,\n uid: user.uid,\n ...(needsPhotoUpdate ? { photoURL: user.photoURL } : {})\n }).then(() => {\n console.debug(\"User updated in user management system\", mgmtUser);\n }).catch(e => {\n console.error(\"Error updating user in user management system\", e);\n });\n }\n console.debug(\"User found in user management system\", mgmtUser);\n return true;\n }\n\n throw Error(\"Could not find a user with the provided email in the user management system.\");\n }, [loading, users]);\n\n const userRoles = authController.user ? defineRolesFor(authController.user) : undefined;\n const isAdmin = (userRoles ?? []).some(r => r.id === \"admin\");\n\n const userRoleIds = userRoles?.map(r => r.id);\n useEffect(() => {\n console.debug(\"Setting user roles\", {\n userRoles,\n roles\n });\n authController.setUserRoles?.(userRoles ?? []);\n }, [userRoleIds]);\n\n const getUser = useCallback((uid: string): USER | null => {\n if (!users) return null;\n const user = users.find(u => u.uid === uid);\n return user ?? null;\n }, [users]);\n\n return {\n loading,\n roles,\n users,\n saveUser,\n saveRole,\n rolesError,\n deleteUser,\n deleteRole,\n usersError,\n isAdmin,\n allowDefaultRolesCreation: allowDefaultRolesCreation === undefined ? true : allowDefaultRolesCreation,\n includeCollectionConfigPermissions: Boolean(includeCollectionConfigPermissions),\n defineRolesFor,\n authenticator,\n ...authController,\n initialLoading: authController.initialLoading || loading,\n userRoles: userRoles,\n getUser,\n user: authController.user ? {\n ...authController.user,\n roles: userRoles\n } : null\n }\n}\n\nconst entitiesToUsers = (docs: Entity<Omit<UserWithRoleIds, \"id\">>[]): (UserWithRoleIds)[] => {\n return docs.map((doc) => {\n const data = doc.values as any;\n const newVar = {\n uid: doc.id,\n ...data,\n created_on: data?.created_on,\n updated_on: data?.updated_on\n };\n return newVar as (UserWithRoleIds);\n });\n}\n\nconst entityToRoles = (entities: Entity<Omit<Role, \"id\">>[]): Role[] => {\n return entities.map((doc) => ({\n id: doc.id,\n ...doc.values\n } as Role));\n}\n","export const googleIcon = (mode: \"light\" | \"dark\") => <>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 64 64\"\n width={24}\n height={24}\n >\n <linearGradient\n id=\"95yY7w43Oj6n2vH63j6HJb\"\n x1=\"29.401\"\n x2=\"29.401\"\n y1=\"4.064\"\n y2=\"106.734\"\n gradientTransform=\"matrix(1 0 0 -1 0 66)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#ff5840\"/>\n <stop offset=\".007\" stopColor=\"#ff5840\"/>\n <stop offset=\".989\" stopColor=\"#fa528c\"/>\n <stop offset=\"1\" stopColor=\"#fa528c\"/>\n </linearGradient>\n <path\n fill=\"url(#95yY7w43Oj6n2vH63j6HJb)\"\n d=\"M47.46,15.5l-1.37,1.48c-1.34,1.44-3.5,1.67-5.15,0.6c-2.71-1.75-6.43-3.13-11-2.37 c-4.94,0.83-9.17,3.85-11.64, 7.97l-8.03-6.08C14.99,9.82,23.2,5,32.5,5c5,0,9.94,1.56,14.27,4.46 C48.81,10.83,49.13,13.71,47.46,15.5z\"\n />\n <linearGradient\n id=\"95yY7w43Oj6n2vH63j6HJc\"\n x1=\"12.148\"\n x2=\"12.148\"\n y1=\".872\"\n y2=\"47.812\"\n gradientTransform=\"matrix(1 0 0 -1 0 66)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#feaa53\"/>\n <stop offset=\".612\" stopColor=\"#ffcd49\"/>\n <stop offset=\"1\" stopColor=\"#ffde44\"/>\n </linearGradient>\n <path\n fill=\"url(#95yY7w43Oj6n2vH63j6HJc)\"\n d=\"M16.01,30.91c-0.09,2.47,0.37,4.83,1.27,6.96l-8.21,6.05c-1.35-2.51-2.3-5.28-2.75-8.22 c-1.06-6.88,0.54-13.38, 3.95-18.6l8.03,6.08C16.93,25.47,16.1,28.11,16.01,30.91z\"\n />\n <linearGradient\n id=\"95yY7w43Oj6n2vH63j6HJd\"\n x1=\"29.76\"\n x2=\"29.76\"\n y1=\"32.149\"\n y2=\"-6.939\"\n gradientTransform=\"matrix(1 0 0 -1 0 66)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#42d778\"/>\n <stop offset=\".428\" stopColor=\"#3dca76\"/>\n <stop offset=\"1\" stopColor=\"#34b171\"/>\n </linearGradient>\n <path\n fill=\"url(#95yY7w43Oj6n2vH63j6HJd)\"\n d=\"M50.45,51.28c-4.55,4.07-10.61,6.57-17.36,6.71C22.91,58.2,13.66,52.53,9.07,43.92l8.21-6.05 C19.78,43.81, 25.67,48,32.5,48c3.94,0,7.52-1.28,10.33-3.44L50.45,51.28z\"\n />\n <linearGradient\n id=\"95yY7w43Oj6n2vH63j6HJe\"\n x1=\"46\"\n x2=\"46\"\n y1=\"3.638\"\n y2=\"35.593\"\n gradientTransform=\"matrix(1 0 0 -1 0 66)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#155cde\"/>\n <stop offset=\".278\" stopColor=\"#1f7fe5\"/>\n <stop offset=\".569\" stopColor=\"#279ceb\"/>\n <stop offset=\".82\" stopColor=\"#2cafef\"/>\n <stop offset=\"1\" stopColor=\"#2eb5f0\"/>\n </linearGradient>\n <path\n fill=\"url(#95yY7w43Oj6n2vH63j6HJe)\"\n d=\"M59,31.97c0.01,7.73-3.26,14.58-8.55,19.31l-7.62-6.72c2.1-1.61,3.77-3.71,4.84-6.15\n c0.29-0.66-0.2-1.41-0.92-1.41H37c-2.21,0-4-1.79-4-4v-2c0-2.21,1.79-4,4-4h17C56.75,27,59,29.22,59,31.97z\"\n />\n </svg>\n</>;\n\nexport const appleIcon = (mode: \"light\" | \"dark\") => <svg width={24} height={24}\n viewBox=\"0 0 56 56\"\n style={{ transform: \"scale(2.8)\" }}\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g stroke={mode === \"light\" ? \"#424245\" : \"white\"} strokeWidth=\"0.5\"\n fillRule=\"evenodd\">\n <path\n d=\"M28.2226562,20.3846154 C29.0546875,20.3846154 30.0976562,19.8048315 30.71875,19.0317864 C31.28125,18.3312142 31.6914062,17.352829 31.6914062,16.3744437 C31.6914062,16.2415766 31.6796875,16.1087095 31.65625,16 C30.7304687,16.0362365 29.6171875,16.640178 28.9492187,17.4494596 C28.421875,18.06548 27.9414062,19.0317864 27.9414062,20.0222505 C27.9414062,20.1671964 27.9648438,20.3121424 27.9765625,20.3604577 C28.0351562,20.3725366 28.1289062,20.3846154 28.2226562,20.3846154 Z M25.2929688,35 C26.4296875,35 26.9335938,34.214876 28.3515625,34.214876 C29.7929688,34.214876 30.109375,34.9758423 31.375,34.9758423 C32.6171875,34.9758423 33.4492188,33.792117 34.234375,32.6325493 C35.1132812,31.3038779 35.4765625,29.9993643 35.5,29.9389701 C35.4179688,29.9148125 33.0390625,28.9122695 33.0390625,26.0979021 C33.0390625,23.6579784 34.9140625,22.5588048 35.0195312,22.474253 C33.7773438,20.6382708 31.890625,20.5899555 31.375,20.5899555 C29.9804688,20.5899555 28.84375,21.4596313 28.1289062,21.4596313 C27.3554688,21.4596313 26.3359375,20.6382708 25.1289062,20.6382708 C22.8320312,20.6382708 20.5,22.5950413 20.5,26.2911634 C20.5,28.5861411 21.3671875,31.013986 22.4335938,32.5842339 C23.3476562,33.9129053 24.1445312,35 25.2929688,35 Z\"\n fill={mode === \"light\" ? \"#424245\" : \"white\"} fillRule=\"nonzero\"/>\n </g>\n</svg>;\n\nexport const githubIcon = (mode: \"light\" | \"dark\") => <svg\n fill={mode === \"light\" ? \"#1c1e21\" : \"white\"}\n role=\"img\"\n viewBox=\"0 0 24 24\"\n width={24}\n height={24}\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"/>\n</svg>;\n\n\nexport const facebookIcon = (mode: \"light\" | \"dark\") => <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={24} height={24}\n viewBox=\"0 0 90 90\">\n <g>\n <path\n d=\"M90,15.001C90,7.119,82.884,0,75,0H15C7.116,0,0,7.119,0,15.001v59.998 C0,82.881,7.116,90,15.001,90H45V56H34V41h11v-5.844C45,25.077,52.568,16,61.875,16H74v15H61.875C60.548,31,59,32.611,59,35.024V41 h15v15H59v34h16c7.884,0,15-7.119,15-15.001V15.001z\"\n fill={mode === \"light\" ? \"#39569c\" : \"white\"}/>\n </g>\n</svg>;\n\nexport const microsoftIcon = (mode: \"light\" | \"dark\") => <svg\n xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24}\n viewBox=\"0 0 480 480\">\n <g>\n <path\n d=\"M0.176,224L0.001,67.963l192-26.072V224H0.176z M224.001,37.241L479.937,0v224H224.001V37.241z M479.999,256l-0.062,224 l-255.936-36.008V256H479.999z M192.001,439.918L0.157,413.621L0.147,256h191.854V439.918z\"\n fill={mode === \"light\" ? \"#00a2ed\" : \"white\"}/>\n </g>\n</svg>;\n\nexport const twitterIcon = (mode: \"light\" | \"dark\") => <svg\n xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24}\n viewBox=\"0 0 24 24\">\n <path fill={mode === \"light\" ? \"#00acee\" : \"white\"}\n d=\"M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z\"/>\n</svg>;\n\n","\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { FirebaseApp, FirebaseError } from \"@firebase/app\";\nimport { ErrorView, RebaseLogo, useModeController, useSnackbarController } from \"@rebasepro/core\";\nimport { Button, CircularProgress, cls, IconButton, LoadingButton, TextField, Typography , iconSize } from \"@rebasepro/ui\";\nimport { ArrowLeftIcon, MailIcon, PhoneIcon, UserIcon } from \"lucide-react\";\nimport { appleIcon, facebookIcon, githubIcon, googleIcon, microsoftIcon, twitterIcon } from \"./social_icons\";\nimport {\n getAuth,\n getMultiFactorResolver,\n MultiFactorError,\n PhoneAuthProvider,\n PhoneMultiFactorGenerator,\n RecaptchaVerifier\n} from \"@firebase/auth\";\nimport {\n FirebaseAuthController,\n FirebaseSignInOption,\n FirebaseSignInProvider,\n RECAPTCHA_CONTAINER_ID,\n useRecaptcha\n} from \"../index\";\n\n/**\n * @category Firebase\n */\nexport interface FirebaseLoginViewProps {\n\n /**\n * Firebase app this login view is accessing\n */\n firebaseApp: FirebaseApp;\n\n /**\n * Delegate holding the auth state\n */\n authController: FirebaseAuthController;\n\n /**\n * Path to the logo displayed in the login screen\n */\n logo?: string;\n\n /**\n * Enable the skip login button\n */\n allowSkipLogin?: boolean;\n\n /**\n * Each of the sign in options that get a custom button\n */\n signInOptions: Array<FirebaseSignInProvider | FirebaseSignInOption>;\n\n /**\n * Disable the login buttons\n */\n disabled?: boolean;\n\n /**\n * Prevent users from creating new users in when the `signInOptions` value\n * is `password`. This does not apply to the rest of login providers.\n */\n disableSignupScreen?: boolean;\n\n /**\n * Prevent users from resetting their password when the `signInOptions` value\n * is `password`. This does not apply to the rest of login providers.\n */\n disableResetPassword?: boolean;\n\n /**\n * Display this component when no user is found a user tries to log in\n * when the `signInOptions` value is `password`.\n */\n noUserComponent?: ReactNode;\n\n /**\n * Include additional components in the login view, on top of the login buttons.\n */\n children?: ReactNode;\n\n /**\n * Display this component bellow the sign-in buttons.\n * Useful for adding checkboxes for privacy and terms and conditions.\n * You may want to use it in conjunction with the `disabled` prop.\n */\n additionalComponent?: ReactNode;\n\n notAllowedError?: any;\n\n className?: string;\n\n}\n\n/**\n * Use this component to render a login view, that updates\n * the state of the {@link FirebaseAuthController} based on the result\n\n * @category Firebase\n */\nexport function FirebaseLoginView({\n children,\n allowSkipLogin,\n logo,\n signInOptions,\n firebaseApp,\n authController,\n noUserComponent,\n disableSignupScreen = false,\n disableResetPassword = false,\n disabled = false,\n additionalComponent,\n notAllowedError,\n className\n}: FirebaseLoginViewProps) {\n\n const modeState = useModeController();\n\n const [passwordLoginSelected, setPasswordLoginSelected] = useState(false);\n\n const [phoneLoginSelected, setPhoneLoginSelected] = useState(false);\n\n const [fadeIn, setFadeIn] = useState(false);\n\n useEffect(() => {\n // Trigger the fade-in effect on component mount\n const timer = setTimeout(() => {\n setFadeIn(true);\n }, 50); // Small delay to ensure transition works properly\n\n return () => clearTimeout(timer);\n }, []);\n\n const resolvedSignInOptions: FirebaseSignInProvider[] = signInOptions.map((o) => {\n if (typeof o === \"object\") {\n return o.provider;\n } else return o as FirebaseSignInProvider;\n })\n\n const sendMFASms = useCallback(() => {\n const auth = getAuth(firebaseApp);\n const recaptchaVerifier = new RecaptchaVerifier(auth, \"recaptcha\", { size: \"invisible\" });\n\n const resolver = getMultiFactorResolver(auth, authController.authProviderError as MultiFactorError);\n\n if (resolver.hints[0].factorId === PhoneMultiFactorGenerator.FACTOR_ID) {\n\n const phoneInfoOptions = {\n multiFactorHint: resolver.hints[0],\n session: resolver.session\n };\n const phoneAuthProvider = new PhoneAuthProvider(auth);\n // Send SMS verification code\n phoneAuthProvider.verifyPhoneNumber(phoneInfoOptions, recaptchaVerifier)\n .then(function (verificationId) {\n\n // Ask user for the SMS verification code. Then:\n const verificationCode = String(window.prompt(\"Please enter the verification \" + \"code that was sent to your mobile device.\"));\n const cred = PhoneAuthProvider.credential(verificationId, verificationCode);\n const multiFactorAssertion = PhoneMultiFactorGenerator.assertion(cred);\n // // Complete sign-in.\n return resolver.resolveSignIn(multiFactorAssertion);\n\n })\n\n } else {\n // Unsupported second factor.\n console.warn(\"Unsupported second factor.\");\n }\n\n }, [authController.authProviderError]);\n\n function buildErrorView() {\n let errorView: any;\n if (authController.user != null) return errorView; // if the user is logged in via MFA\n const ignoredCodes = [\"auth/popup-closed-by-user\", \"auth/cancelled-popup-request\"];\n if (authController.authProviderError) {\n const authError = authController.authProviderError as FirebaseError;\n if (authError.code === \"auth/operation-not-allowed\" ||\n authError.code === \"auth/configuration-not-found\") {\n errorView =\n <>\n <div className=\"p-4\">\n <ErrorView\n title={\"Firebase Auth not enabled\"}\n error={\"You need to enable Firebase Auth and the corresponding login provider in your Firebase project\"}/>\n </div>\n {firebaseApp &&\n <div className=\"p-4\">\n <a href={`https://console.firebase.google.com/project/${firebaseApp.options.projectId}/authentication/providers`}\n rel=\"noopener noreferrer\"\n target=\"_blank\">\n <Button variant=\"text\"\n color=\"error\">\n Open Firebase configuration\n </Button>\n </a>\n </div>}\n </>;\n } else if (authError.code === \"auth/invalid-api-key\") {\n errorView = <div className=\"p-4\">\n <ErrorView\n title={\"Invalid API key\"}\n error={\"auth/invalid-api-key: Check that your Firebase config is set correctly in your `firebase_config.ts` file\"}/>\n </div>;\n } else if (authError.code === \"auth/email-already-in-use\") {\n errorView = <div className=\"p-4\">\n <ErrorView\n title={\"Email already in use\"}\n error={\"The selected email is already in use by another account\"}/>\n </div>;\n } else if (authError.code === \"auth/invalid-credential\") {\n errorView = <div className=\"p-4\">\n <ErrorView\n title={\"Invalid credential\"}\n error={\"The provided credential is not correct\"}/>\n </div>;\n } else if (!ignoredCodes.includes(authError.code)) {\n if (authError.code === \"auth/multi-factor-auth-required\") {\n sendMFASms();\n }\n errorView =\n <div className=\"p-4\">\n <ErrorView error={authController.authProviderError as Error}/>\n </div>;\n }\n }\n return errorView;\n }\n\n let logoComponent;\n if (logo) {\n logoComponent = <img src={logo}\n style={{\n height: \"100%\",\n width: \"100%\",\n objectFit: \"contain\"\n }}\n alt={\"Logo\"}/>;\n } else {\n logoComponent = <RebaseLogo/>;\n }\n\n let notAllowedMessage: string | undefined;\n if (notAllowedError) {\n if (typeof notAllowedError === \"string\") {\n notAllowedMessage = notAllowedError;\n } else if (notAllowedError instanceof Error) {\n notAllowedMessage = notAllowedError.message;\n } else {\n notAllowedMessage = \"It looks like you don't have access to the CMS, based on the specified Authenticator configuration\";\n }\n }\n\n const fadeStyle = {\n opacity: fadeIn ? 1 : 0,\n transition: \"opacity 0.6s ease-in-out\"\n };\n\n return (\n\n <div\n className={cls(\"flex flex-col items-center justify-center min-w-full p-4\", className)}\n style={fadeStyle}>\n <div id=\"recaptcha\"></div>\n <div\n className=\"flex flex-col items-center w-full max-w-[500px]\">\n\n <div className=\"p-1 w-64 h-64 m-4\">\n {logoComponent}\n </div>\n\n {children}\n\n {notAllowedMessage &&\n <div className=\"p-8\">\n <ErrorView error={notAllowedMessage}/>\n </div>}\n\n {buildErrorView()}\n\n {(!passwordLoginSelected && !phoneLoginSelected) && <div className={\"my-4 w-full\"}>\n\n {buildOauthLoginButtons(authController, resolvedSignInOptions, modeState.mode as \"light\" | \"dark\", disabled)}\n\n {resolvedSignInOptions.includes(\"password\") &&\n <LoginButton\n disabled={disabled}\n text={\"Email/password\"}\n icon={<MailIcon size={iconSize.medium}/>}\n onClick={() => setPasswordLoginSelected(true)}/>}\n\n {resolvedSignInOptions.includes(\"phone\") &&\n <LoginButton\n disabled={disabled}\n text={\"PhoneIcon number\"}\n icon={<PhoneIcon size={iconSize.medium}/>}\n onClick={() => setPhoneLoginSelected(true)}/>}\n\n {resolvedSignInOptions.includes(\"anonymous\") &&\n <LoginButton\n disabled={disabled}\n text={\"Log in anonymously\"}\n icon={<UserIcon\n size={\"medium\"}/>}\n onClick={authController.anonymousLogin}/>}\n\n {allowSkipLogin &&\n <Button\n className={\"m-1 mb-4\"}\n variant={\"text\"}\n disabled={disabled}\n onClick={authController.skipLogin}>\n Skip login\n </Button>\n }\n\n </div>}\n\n {passwordLoginSelected && <LoginForm\n authController={authController}\n onClose={() => setPasswordLoginSelected(false)}\n mode={modeState.mode as \"light\" | \"dark\"}\n noUserComponent={noUserComponent}\n disableSignupScreen={disableSignupScreen}\n disableResetPassword={disableResetPassword}\n />}\n\n {phoneLoginSelected && <PhoneLoginForm\n authController={authController}\n onClose={() => setPhoneLoginSelected(false)}\n />}\n\n {!passwordLoginSelected && !phoneLoginSelected && additionalComponent}\n\n </div>\n </div>\n );\n}\n\nexport function LoginButton({\n icon,\n onClick,\n text,\n disabled\n}: {\n icon: React.ReactNode,\n onClick: () => void,\n text: string,\n disabled?: boolean\n}) {\n return (\n <div className=\"my-1 w-full\">\n <Button\n className={cls(\"w-full bg-white dark:bg-surface-950 text-surface-900 dark:text-surface-100\", disabled ? \"\" : \"hover:text-surface-950 hover:dark:text-white\")}\n style={{\n height: \"40px\",\n borderRadius: \"4px\",\n fontSize: \"14px\"\n }}\n\n disabled={disabled}\n onClick={onClick}>\n <div\n className=\"p-1 flex h-8 items-center justify-items-center\">\n <div\n className=\"flex flex-col w-8 items-center justify-items-center mr-4\">\n {icon}\n </div>\n <div className=\"grow pl-2 text-center\">{text}</div>\n </div>\n </Button>\n </div>\n )\n}\n\nfunction PhoneLoginForm({\n onClose,\n authController\n}: {\n onClose: () => void,\n authController: FirebaseAuthController,\n}) {\n useRecaptcha();\n\n const [phone, setPhone] = useState<string>();\n const [code, setCode] = useState<string>();\n const [isInvalidCode, setIsInvalidCode] = useState(false);\n\n const handleSubmit = async (event: any) => {\n event.preventDefault();\n\n if (code && authController.confirmationResult) {\n setIsInvalidCode(false);\n\n authController.confirmationResult.confirm(code).catch((e: FirebaseError) => {\n if (e.code === \"auth/invalid-verification-code\") {\n setIsInvalidCode(true)\n }\n });\n } else {\n if (phone) {\n authController.phoneLogin(phone, window.recaptchaVerifier);\n }\n }\n }\n\n return (\n <form onSubmit={handleSubmit}>\n {isInvalidCode &&\n <div className=\"p-8\">\n <ErrorView error={\"Invalid confirmation code\"}/>\n </div>}\n\n <div id={RECAPTCHA_CONTAINER_ID}/>\n\n <div className={\"flex flex-col gap-1\"}>\n <IconButton\n onClick={onClose}>\n <ArrowLeftIcon className=\"w-5 h-5\"/>\n </IconButton>\n <div className=\"p-1 flex\">\n <Typography align={\"center\"}\n variant={\"subtitle2\"}>{\"Please enter your phone number\"}</Typography>\n </div>\n <TextField placeholder=\"\"\n value={phone ?? \"\"}\n disabled={Boolean(phone && (authController.authLoading || authController.confirmationResult))}\n type=\"phone\"\n onChange={(event: any) => setPhone(event.target.value)}/>\n {Boolean(phone && authController.confirmationResult) &&\n <>\n <div className=\"mt-2 p-1 flex\">\n <Typography align={\"center\"}\n variant={\"subtitle2\"}>{\"Please enter the confirmation code\"}</Typography>\n </div>\n <TextField placeholder=\"\"\n value={code ?? \"\"}\n type=\"text\"\n onChange={(event: any) => setCode(event.target.value)}/>\n </>\n }\n\n <div className=\"flex justify-end items-center w-full\">\n\n {authController.authLoading &&\n <CircularProgress className=\"p-1\" size={\"small\"}/>\n }\n\n <Button type=\"submit\">\n {\"Ok\"}\n </Button>\n </div>\n\n </div>\n </form>\n );\n}\n\ntype LoginFormMode = \"email\" | \"password\" | \"registration\";\n\nfunction LoginForm({\n onClose,\n authController,\n mode,\n noUserComponent,\n disableSignupScreen,\n disableResetPassword\n}: {\n onClose: () => void,\n authController: FirebaseAuthController,\n mode: \"light\" | \"dark\",\n noUserComponent?: ReactNode,\n disableSignupScreen: boolean,\n disableResetPassword?: boolean\n}) {\n\n const passwordRef = useRef<HTMLInputElement | null>(null);\n\n const [loginState, setLoginState] = useState<LoginFormMode>(\"email\"); // [\"email\", \"password\", \"registration\"]\n const [email, setEmail] = useState<string>();\n const [password, setPassword] = useState<string>();\n const [previouslyUsedMethodsForUser, setPreviouslyUsedMethodsForUser] = useState<string[] | undefined>();\n const [resettingPassword, setResettingPassword] = useState(false);\n\n const snackbarController = useSnackbarController();\n\n useEffect(() => {\n if ((loginState === \"password\" || loginState === \"registration\") && passwordRef.current) {\n passwordRef.current.focus()\n }\n }, [loginState]);\n\n useEffect(() => {\n if (!document) return;\n const escFunction = (event: any) => {\n if (event.keyCode === 27) {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", escFunction, false);\n return () => {\n document.removeEventListener(\"keydown\", escFunction, false);\n };\n }, [onClose]);\n\n function handleEnterEmail() {\n if (email) {\n authController.fetchSignInMethodsForEmail(email).then((availableProviders) => {\n setPreviouslyUsedMethodsForUser(availableProviders.filter(p => p !== \"password\"));\n });\n setLoginState(\"password\");\n }\n }\n\n function handleEnterPassword() {\n if (email && password) {\n authController.emailPasswordLogin(email, password);\n }\n }\n\n function handleRegistration() {\n if (email && password) {\n authController.createUserWithEmailAndPassword(email, password);\n }\n }\n\n const onBackPressed = () => {\n if (loginState === \"email\") {\n onClose();\n } else if (loginState === \"password\" || loginState === \"registration\") {\n setLoginState(\"email\");\n } else {\n setPreviouslyUsedMethodsForUser(undefined);\n }\n }\n\n const handleSubmit = (event: any) => {\n event.preventDefault();\n if (loginState === \"email\") {\n handleEnterEmail();\n } else if (loginState === \"password\") {\n handleEnterPassword();\n } else if (loginState === \"registration\") {\n handleRegistration();\n }\n }\n\n const label = loginState === \"registration\"\n ? \"Please enter your email and password to create an account\"\n : (loginState === \"password\" ? \"Please enter your password\" : \"Please enter your email\");\n\n return (\n <form\n className={\"w-full\"}\n onSubmit={handleSubmit}>\n\n <div className={\"max-w-[480px] w-full flex flex-col gap-4\"}>\n <IconButton\n onClick={onBackPressed}>\n <ArrowLeftIcon className=\"w-5 h-5\"/>\n </IconButton>\n\n <div>\n {loginState === \"registration\" && noUserComponent}\n </div>\n\n <Typography\n className={`${loginState === \"registration\" && disableSignupScreen ? \"hidden\" : \"flex\"}`}\n variant={\"subtitle2\"}>{label}</Typography>\n\n {(loginState === \"email\" || loginState === \"registration\") && <TextField placeholder=\"Email\" autoFocus\n value={email ?? \"\"}\n disabled={authController.authLoading}\n type=\"email\"\n onChange={(event: any) => setEmail(event.target.value)}/>}\n\n <div\n className={`${loginState === \"password\" || (loginState === \"registration\" && !disableSignupScreen) ? \"block\" : \"hidden\"}`}>\n <TextField placeholder=\"Password\"\n value={password ?? \"\"}\n disabled={authController.authLoading}\n inputRef={passwordRef}\n type=\"password\"\n onChange={(event: any) => setPassword(event.target.value)}/>\n </div>\n\n <div\n className={`${loginState === \"registration\" && disableSignupScreen ? \"hidden\" : \"flex\"} justify-end items-center w-full flex gap-2`}>\n\n {authController.authLoading &&\n <CircularProgress className=\"p-1\" size={\"small\"}/>\n }\n\n {!disableResetPassword && <LoadingButton variant=\"text\"\n loading={resettingPassword}\n onClick={email\n ? async () => {\n setResettingPassword(true);\n try {\n try {\n await authController.sendPasswordResetEmail(email);\n snackbarController.open({\n message: \"Password reset email sent\",\n type: \"success\"\n });\n } catch (e: any) {\n snackbarController.open({\n message: e.message,\n type: \"error\"\n });\n }\n } finally {\n setResettingPassword(false);\n }\n }\n : undefined}>\n Reset password\n </LoadingButton>}\n\n {!disableSignupScreen && loginState === \"email\" &&\n <Button variant=\"text\" onClick={() => setLoginState(\"registration\")}>\n New user\n </Button>}\n\n <Button type=\"submit\">\n {loginState === \"registration\" ? \"Create account\" : (loginState === \"password\" ? \"Login\" : \"Login\")}\n </Button>\n </div>\n\n {previouslyUsedMethodsForUser && previouslyUsedMethodsForUser.length > 0 &&\n <div className={\"flex flex-col gap-4 p-4\"}>\n <div>\n <Typography variant={\"subtitle2\"}>\n You already have an account\n </Typography>\n <Typography variant={\"body2\"}>\n You can use one of these\n methods to login with {email}\n </Typography>\n </div>\n\n <div>\n {previouslyUsedMethodsForUser && buildOauthLoginButtons(authController, previouslyUsedMethodsForUser, mode, false)}\n </div>\n </div>\n }\n </div>\n </form>\n );\n\n}\n\nfunction buildOauthLoginButtons(authController: FirebaseAuthController, providers: string[], mode: \"light\" | \"dark\", disabled: boolean) {\n return <>\n {providers.includes(\"google.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Google\"}\n icon={googleIcon(mode)}\n onClick={authController.googleLogin}/>}\n\n {providers.includes(\"microsoft.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Microsoft\"}\n icon={microsoftIcon(mode)}\n onClick={authController.microsoftLogin}/>}\n\n {providers.includes(\"apple.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Apple\"}\n icon={appleIcon(mode)}\n onClick={authController.appleLogin}/>}\n\n {providers.includes(\"github.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Github\"}\n icon={githubIcon(mode)}\n onClick={authController.githubLogin}/>}\n\n {providers.includes(\"facebook.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Facebook\"}\n icon={facebookIcon(mode)}\n onClick={authController.facebookLogin}/>}\n\n {providers.includes(\"twitter.com\") && <LoginButton\n disabled={disabled}\n text={\"Sign in with Twitter\"}\n icon={twitterIcon(mode)}\n onClick={authController.twitterLogin}/>}\n </>\n}\n","import React from \"react\";\nimport { GoogleAuthProvider } from \"@firebase/auth\";\n\nimport {\n Rebase,\n ModeControllerProvider,\n SnackbarProvider,\n useBrowserTitleAndIcon,\n useBuildLocalConfigurationPersistence,\n useBuildModeController,\n useBuildAdminModeController,\n AdminModeControllerProvider,\n useValidateAuthenticator,\n RebaseRoutes\n} from \"@rebasepro/core\";\nimport {\n AppBar,\n Drawer,\n Scaffold,\n SideDialogs,\n useBuildCollectionRegistryController,\n useBuildUrlController,\n useBuildNavigationStateController,\n CollectionRegistryContext,\n UrlContext,\n NavigationStateContext,\n SideEntityProvider,\n RebaseRoute\n} from \"@rebasepro/admin\";\nimport { Entity, PropertyConfig } from \"@rebasepro/types\";\nimport { CenteredView, CircularProgressCenter } from \"@rebasepro/ui\";\nimport { buildRebaseData } from \"@rebasepro/common\";\nimport { Route, Outlet, Navigate } from \"react-router-dom\";\n\nimport { RebaseFirebaseAppProps } from \"./RebaseFirebaseAppProps\";\nimport { FirebaseLoginView } from \"./FirebaseLoginView\";\nimport {\n useAppCheck,\n useFirebaseAuthController,\n useFirebaseStorageSource,\n useFirestoreDriver,\n useInitialiseFirebase,\n useBuildUserManagement\n} from \"../hooks\";\n\nimport { FirebaseAuthController } from \"../types\";\n\nconst DEFAULT_SIGN_IN_OPTIONS = [\n GoogleAuthProvider.PROVIDER_ID\n];\n\n/**\n * This is the default implementation of a Rebase app using the Firebase services\n * as a backend.\n * You can use this component as a full app, by specifying collections and\n * entity collections.\n *\n * This component is in charge of initialising Firebase, with the given\n * configuration object.\n *\n * If you are building a larger app and need finer control, you can use\n * {@link Rebase}, {@link Scaffold}, {@link SideDialogs}\n * and {@link NavigationRoutes} instead.\n *\n * @param props\n\n * @category Firebase\n */\nexport function RebaseFirebaseApp({\n name,\n logo,\n logoDark,\n authenticator,\n collections,\n views,\n adminViews,\n textSearchControllerBuilder,\n allowSkipLogin,\n signInOptions = DEFAULT_SIGN_IN_OPTIONS,\n firebaseConfig,\n onFirebaseInit,\n appCheckOptions,\n dateTimeFormat,\n locale,\n basePath,\n baseCollectionPath,\n onAnalyticsEvent,\n propertyConfigs: propertyConfigsProp,\n plugins,\n autoOpenDrawer,\n firestoreIndexesBuilder,\n components,\n localTextSearchEnabled = false,\n userManagement\n}: RebaseFirebaseAppProps) {\n\n /**\n * Update the browser title and icon\n */\n useBrowserTitleAndIcon(name, logo);\n\n const propertyConfigs: Record<string, PropertyConfig> = (propertyConfigsProp ?? [])\n .map(pc => ({\n [pc.key]: pc\n }))\n .reduce((a, b) => ({ ...a,\n...b }), {});\n\n const {\n firebaseApp,\n firebaseConfigLoading,\n configError\n } = useInitialiseFirebase({\n onFirebaseInit,\n firebaseConfig\n });\n\n /**\n * Controller used to manage the dark or light color mode\n */\n const modeController = useBuildModeController();\n const adminModeController = useBuildAdminModeController();\n\n const {\n loading,\n appCheckVerified,\n error\n } = useAppCheck({\n firebaseApp,\n options: appCheckOptions\n });\n\n /**\n * Controller for managing authentication\n */\n const authController: FirebaseAuthController = useFirebaseAuthController({\n firebaseApp,\n signInOptions\n });\n\n /**\n * Controller for saving some user preferences locally.\n */\n const userConfigPersistence = useBuildLocalConfigurationPersistence();\n\n const firestoreDelegate = useFirestoreDriver({\n firebaseApp,\n textSearchControllerBuilder: textSearchControllerBuilder,\n firestoreIndexesBuilder: firestoreIndexesBuilder,\n localTextSearchEnabled\n })\n\n /**\n * Controller used for saving and fetching files in storage\n */\n const storageSource = useFirebaseStorageSource({\n firebaseApp\n });\n\n /**\n * Validate authenticator\n */\n const {\n authLoading,\n canAccessMainView,\n notAllowedError\n } = useValidateAuthenticator({\n authController,\n authenticator,\n data: buildRebaseData(firestoreDelegate),\n storageSource\n });\n\n const collectionRegistryController = useBuildCollectionRegistryController({\n userConfigPersistence\n });\n\n const urlController = useBuildUrlController({\n basePath: basePath ?? \"/\",\n baseCollectionPath: baseCollectionPath ?? \"/c\",\n collectionRegistryController\n });\n\n const defaultUserManagement = useBuildUserManagement({\n authController,\n dataSourceDelegate: firestoreDelegate\n });\n \n const activeUserManagement = userManagement ?? defaultUserManagement;\n\n const navigationStateController = useBuildNavigationStateController({\n collections,\n views,\n adminViews,\n authController,\n data: buildRebaseData(firestoreDelegate),\n plugins,\n collectionRegistryController,\n urlController,\n adminMode: adminModeController.mode,\n userManagement: activeUserManagement as any\n });\n\n if (firebaseConfigLoading || !firebaseApp || loading) {\n return <>\n <CircularProgressCenter/>\n </>;\n }\n\n if (configError) {\n return <CenteredView>{configError}</CenteredView>;\n }\n\n return (\n <SnackbarProvider>\n <ModeControllerProvider value={modeController}>\n <AdminModeControllerProvider value={adminModeController}>\n\n <CollectionRegistryContext.Provider value={collectionRegistryController}>\n <UrlContext.Provider value={urlController}>\n <NavigationStateContext.Provider value={navigationStateController}>\n <Rebase\n authController={authController}\n userConfigPersistence={userConfigPersistence}\n dateTimeFormat={dateTimeFormat}\n driver={firestoreDelegate}\n storageSource={storageSource}\n userManagement={activeUserManagement}\n entityLinkBuilder={({ entity }: { entity: Entity<any> }) => `https://console.firebase.google.com/project/${firebaseApp.options.projectId}/firestore/data/${entity.path}/${entity.id}`}\n locale={locale}\n onAnalyticsEvent={onAnalyticsEvent}\n plugins={plugins}\n propertyConfigs={propertyConfigs}>\n {({\n context,\n loading\n }: { context: any, loading: boolean }) => {\n\n let component;\n if (loading || authLoading) {\n component = <CircularProgressCenter size={\"large\"}/>;\n } else {\n const usedLogo = modeController.mode === \"dark\" && logoDark ? logoDark : logo;\n if (!canAccessMainView) {\n const LoginViewUsed = components?.LoginView ?? FirebaseLoginView;\n component = (\n <LoginViewUsed\n logo={usedLogo}\n allowSkipLogin={allowSkipLogin}\n signInOptions={signInOptions ?? DEFAULT_SIGN_IN_OPTIONS}\n firebaseApp={firebaseApp}\n authController={authController}\n notAllowedError={notAllowedError}/>\n );\n } else {\n const firstCollectionEntry = navigationStateController.topLevelNavigation?.navigationEntries.find(e => e.type === \"collection\");\n const fallbackRoute = firstCollectionEntry ? <Navigate to={urlController.buildUrlCollectionPath(firstCollectionEntry.id)} replace /> : <CenteredView>No home page or collections provided.</CenteredView>;\n\n component = (\n <SideEntityProvider>\n <RebaseRoutes>\n <Route element={\n <Scaffold\n logo={usedLogo}\n autoOpenDrawer={autoOpenDrawer}>\n <AppBar title={name} logo={usedLogo}/>\n <Drawer/>\n <Outlet/>\n <SideDialogs/>\n </Scaffold>\n }>\n <Route path=\"/\" element={components?.HomePage ? <components.HomePage/> : fallbackRoute}/>\n <Route path=\"/c/*\" element={<RebaseRoute/>}/>\n </Route>\n </RebaseRoutes>\n </SideEntityProvider>\n );\n }\n }\n\n return component;\n }}\n </Rebase>\n </NavigationStateContext.Provider>\n </UrlContext.Provider>\n </CollectionRegistryContext.Provider>\n </AdminModeControllerProvider>\n </ModeControllerProvider>\n </SnackbarProvider>\n );\n}\n"],"names":["useFirebaseAuthController","loading","firebaseApp","signInOptions","onSignOut","onSignOutProp","defineRolesFor","loggedUser","setLoggedUser","useState","undefined","authError","setAuthError","authProviderError","setAuthProviderError","initialLoading","setInitialLoading","authLoading","setAuthLoading","loginSkipped","setLoginSkipped","confirmationResult","setConfirmationResult","userRoles","_setUserRoles","extra","setExtra","setUserRoles","useCallback","roles","currentRoleIds","map","r","id","newRoleIds","equal","authRef","useRef","updateUser","user","initialize","updateRoles","useEffect","auth","getAuth","current","currentUser","onAuthStateChanged","console","debug","error","e","getProviderOptions","providerId","find","option","Error","provider","googleLogin","GoogleAuthProvider","options","scopes","forEach","scope","addScope","customParameters","setCustomParameters","prompt","signInWithPopup","catch","getAuthToken","getIdToken","emailPasswordLogin","email","password","signInWithEmailAndPassword","then","createUserWithEmailAndPassword","createUserWithEmailAndPasswordFirebase","sendPasswordResetEmail","sendPasswordResetEmailFirebase","fetchSignInMethodsForEmail","fetchSignInMethodsForEmailFirebase","res","signOut","_","doOauthLogin","anonymousLogin","signInAnonymously","phoneLogin","phone","applicationVerifier","signInWithPhoneNumber","appleLogin","OAuthProvider","facebookLogin","FacebookAuthProvider","githubLogin","GithubAuthProvider","microsoftLogin","twitterLogin","TwitterAuthProvider","skipLogin","firebaseUserWrapper","firebaseUser","setUser","useFirebaseStorageSource","bucketUrl","projectId","urlsCache","putObject","file","key","metadata","bucket","storageBucketUrl","storage","getStorage","storageRef","ref","uploadTask","uploadBytesResumable","Promise","resolve","reject","lastProgress","timeoutId","clearTimeoutIfExists","clearTimeout","setProgressTimeout","setTimeout","cancel","on","snapshot","progress","bytesTransferred","totalBytes","errorMessage","message","code","toLowerCase","includes","newError","Object","assign","fullPath","bucketName","storageUrl","getObject","path","fileRef","url","getDownloadURL","response","fetch","blob","File","getSignedUrl","storagePathOrUrl","resolvedPathOrUrl","resolvedBucket","match","protocolLength","length","withoutProtocol","substring","firstSlash","indexOf","all","getMetadata","result","fileNotFound","listObjects","prefix","folderRef","list","maxResults","pageToken","deleteObject","hostingError","useInitialiseFirebase","firebaseConfig","fromUrl","onFirebaseInit","name","authDomain","setFirebaseApp","firebaseConfigLoading","setFirebaseConfigLoading","configError","setConfigError","initFirebase","config","targetName","currentApps","getApps","existingApp","app","deleteApp","initialisedFirebaseApp","initializeApp","JSON","stringify","fetchFromUrl","status","json","toString","process","env","NODE_ENV","useAppCheck","debugToken","window","FIREBASE_APPCHECK_DEBUG_TOKEN","appCheckLoading","setAppCheckLoading","React","appCheckVerified","setAppCheckVerified","setError","initialCheck","verifyToken","appCheck","token","getToken","forceRefresh","isTokenAutoRefreshEnabled","removeCurrentAppCheckDiv","initializeAppCheck","div","document","getElementById","remove","buildCollectionId","idOrPath","parentCollectionIds","stripCollectionPath","join","COLLECTION_PATH_SEPARATOR","docsToCollectionTree","docs","collectionsMap","doc","collection","docToCollection","reduce","a","b","orderedKeys","keys","sort","split","parentId","slice","parentCollection","subcollections","values","data","propertiesOrder","properties","normalizedProperties","normalizePropertiesEnumValues","sortedProperties","sortProperties","slug","alias","normalizeEnumValuesToArray","enumValues","sortObjectFormat","Array","isArray","entries","value","label","String","localeCompare","property","normalizedProperty","enum","dataType","of","ofProp","getFirestoreDataInPath","parentPaths","limit","firestore","getFirestore","q","query","limitClause","getDocs","querySnapshot","currentDocs","index","allPaths","push","parentPath","flat","performAlgoliaTextSearch","client","indexName","searchSingleIndex","searchParams","hits","hit","objectID","err","DEFAULT_SERVER","performPineconeTextSearch","host","firebaseToken","collectionPath","method","headers","Authorization","body","promise","ids","buildPineconeSearchController","isPathSupported","search","props","init","buildExternalSearchController","MAX_SEARCH_RESULTS","localSearchControllerBuilder","currentPath","indexes","listeners","destroyListener","collectionProp","databaseId","col","onSnapshot","next","fromCache","hasPendingWrites","buildIndex","searchString","searchResult","splice","aExactMatch","item","bExactMatch","score","fuseOptions","threshold","includeScore","weight","Fuse","buildRebaseSearchController","region","extensionInstanceId","searchConfig","typesenseClient","initPromise","initializeClient","customConfig","port","protocol","apiKey","collectionsToIndex","functions","getFunctions","getConfig","httpsCallable","collections","Typesense","default","Client","nodes","connectionTimeoutSeconds","retryIntervalSeconds","numRetries","getTypesenseCollectionName","pathParts","collectionNames","i","getParentFilter","filters","collectionName","docId","collectionPattern","rootCollection","schemaCache","Map","getSearchableFieldsFromSchema","has","get","retrieve","stringFields","fields","filter","f","isStringType","type","isNotInternal","startsWith","set","httpStatus","parentFilter","searchableFields","queryBy","query_by","per_page","typo_tokens_threshold","filter_by","documents","useFirestoreDriver","textSearchControllerBuilder","firestoreIndexesBuilder","localTextSearchEnabled","searchControllerRef","buildTextSearchControllerWithLocalSearch","buildQuery","orderBy","order","startAfter","collectionReference","collectionClause","queryParams","entry","filterParameter","op","whereClause","cmsToFirestoreModel","orderByClause","startAfterClause","getAndBuildEntity","entityId","getDoc","docSnapshot","exists","createEntityFromDocument","listenEntity","onUpdate","onError","resolvedPath","performTextSearch","textSearchController","subscriptions","entities","addedEntitiesSet","Set","entity","add","delete","p","currentTime","initialised","Boolean","initTextSearch","warn","fetchCollection","listenCollection","fetchEntity","saveEntity","valuesProp","documentReference","setDoc","merge","firestoreToCMSModel","deleteEntity","deleteDoc","checkUniqueField","countEntities","getCountFromServer","count","isFilterCombinationValid","filterValues","sortBy","sortKey","sortDirection","filterKeys","filtersCount","every","v","compositeIndex","docSnap","getCMSPathFromFirestorePath","deleteField","isEqual","serverTimestamp","Timestamp","toDate","Date","__type__","VectorValue","toArray","constructor","FirestoreGeoPoint","GeoPoint","latitude","longitude","DocumentReference","_databaseId","database","EntityReference","childValue","fsPath","to","lastIndexOf","inArray","isEntityReference","targetFirestore","__type","fromDate","vector","firestoreModel","localSearchController","useFirebaseRTDBDelegate","t0","$","_c","t1","t2","getDatabase","dbQuery","orderByKey","startAt","limitToFirst","val","t3","delegateToCMSModel","path_0","database_0","dbRef","unsubscribe","onValue","snapshot_0","t4","id_0","values_0","path_1","database_1","snapshot_1","t5","path_2","entityId_0","onUpdate_0","database_2","dbRef_0","unsubscribe_0","snapshot_2","t6","path_3","entityId_1","values_1","database_3","finalId","transformedValues","cmsToRTDBModel","t7","database_4","entityId_2","database_5","dbRef_1","orderByChild","snapshot_3","entityValue","_temp","t8","_temp2","toISOString","rtdbModel","RECAPTCHA_CONTAINER_ID","useRecaptcha","Symbol","for","recaptchaVerifier","RecaptchaVerifier","size","useBuildUserManagement","authController","dataSourceDelegate","rolesProp","usersPath","rolesPath","allowDefaultRolesCreation","includeCollectionConfigPermissions","rolesDefinedInCode","rolesLoading","setRolesLoading","usersLoading","setUsersLoading","setRoles","usersWithRoleIds","setUsersWithRoleIds","users","u","rolesError","setRolesError","usersError","setUsersError","_usersLoading","_rolesLoading","newRoles","entityToRoles","uid","newUsers","entitiesToUsers","saveUser","roleIds","trim","userExists","created_on","removeUndefined","saveRole","role","roleData","deleteUser","deleteRole","mgmtUser","authenticator","needsUidUpdate","needsPhotoUpdate","photoURL","updateReason","isAdmin","some","userRoleIds","getUser","newVar","updated_on","googleIcon","mode","appleIcon","transform","githubIcon","facebookIcon","microsoftIcon","twitterIcon","FirebaseLoginView","children","allowSkipLogin","logo","noUserComponent","disableSignupScreen","disableResetPassword","disabled","additionalComponent","notAllowedError","className","modeState","useModeController","passwordLoginSelected","setPasswordLoginSelected","phoneLoginSelected","setPhoneLoginSelected","fadeIn","setFadeIn","timer","resolvedSignInOptions","o","sendMFASms","resolver","getMultiFactorResolver","hints","factorId","PhoneMultiFactorGenerator","FACTOR_ID","phoneInfoOptions","multiFactorHint","session","phoneAuthProvider","PhoneAuthProvider","verifyPhoneNumber","verificationId","verificationCode","cred","credential","multiFactorAssertion","assertion","resolveSignIn","buildErrorView","errorView","ignoredCodes","logoComponent","height","width","objectFit","notAllowedMessage","fadeStyle","opacity","transition","cls","buildOauthLoginButtons","iconSize","medium","LoginButton","icon","onClick","text","borderRadius","fontSize","PhoneLoginForm","onClose","setPhone","setCode","isInvalidCode","setIsInvalidCode","event","preventDefault","confirm","handleSubmit","t9","event_0","target","t10","t11","event_1","t12","t13","t14","t15","t16","LoginForm","passwordRef","loginState","setLoginState","setEmail","setPassword","previouslyUsedMethodsForUser","setPreviouslyUsedMethodsForUser","resettingPassword","setResettingPassword","snackbarController","useSnackbarController","focus","escFunction","keyCode","addEventListener","removeEventListener","handleEnterEmail","availableProviders","handleEnterPassword","handleRegistration","onBackPressed","open","providers","DEFAULT_SIGN_IN_OPTIONS","PROVIDER_ID","RebaseFirebaseApp","logoDark","views","adminViews","appCheckOptions","dateTimeFormat","locale","basePath","baseCollectionPath","onAnalyticsEvent","propertyConfigs","propertyConfigsProp","plugins","autoOpenDrawer","components","userManagement","useBrowserTitleAndIcon","modeController","useBuildModeController","adminModeController","useBuildAdminModeController","userConfigPersistence","useBuildLocalConfigurationPersistence","firestoreDelegate","storageSource","buildRebaseData","canAccessMainView","useValidateAuthenticator","collectionRegistryController","useBuildCollectionRegistryController","urlController","useBuildUrlController","defaultUserManagement","activeUserManagement","t17","t18","t19","adminMode","navigationStateController","useBuildNavigationStateController","t20","t21","t22","loading_0","component","usedLogo","LoginViewUsed","LoginView","firstCollectionEntry","topLevelNavigation","navigationEntries","_temp3","fallbackRoute","buildUrlCollectionPath","HomePage","t23","t24","t25","t26","t27","pc"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAwCO,MAAMA,4BAA4B,CAA0D;AAAA,EAC/FC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC,WAAWC;AAAAA,EACXC;AACyB,MAA+C;AAExE,QAAM,CAACC,YAAYC,aAAa,IAAIC,SAA0CC,MAAS;AACvF,QAAM,CAACC,WAAWC,YAAY,IAAIH,SAAAA;AAClC,QAAM,CAACI,mBAAmBC,oBAAoB,IAAIL,SAAAA;AAClD,QAAM,CAACM,gBAAgBC,iBAAiB,IAAIP,SAAkB,IAAI;AAClE,QAAM,CAACQ,aAAaC,cAAc,IAAIT,SAAS,IAAI;AACnD,QAAM,CAACU,cAAcC,eAAe,IAAIX,SAAkB,KAAK;AAC/D,QAAM,CAACY,oBAAoBC,qBAAqB,IAAIb,SAAAA;AACpD,QAAM,CAACc,WAAWC,aAAa,IAAIf,SAAAA;AACnC,QAAM,CAACgB,OAAOC,QAAQ,IAAIjB,SAAAA;AAE1B,QAAMkB,eAAeC,YAAY,CAACC,UAA8B;AAC5D,UAAMC,iBAAiBP,WAAWQ,IAAIC,CAAAA,MAAKA,EAAEC,EAAE;AAC/C,UAAMC,aAAaL,OAAOE,IAAIC,CAAAA,QAAKA,IAAEC,EAAE;AACvC,QAAI,CAACE,UAAML,gBAAgBI,UAAU,GAAG;AACpCV,oBAAcK,KAAK;AAAA,IACvB;AAAA,EACJ,GAAG,CAACN,SAAS,CAAC;AAEd,QAAMa,UAAUC,OAAoB,IAAI;AAExC,QAAMC,aAAaV,YAAY,OAAOW,MAA2BC,eAAyB;AACtF,QAAIvC,QAAS;AACb,QAAIK,kBAAkBiC,MAAM;AACxBZ,mBAAa,MAAMrB,eAAeiC,IAAI,CAAC;AAAA,IAC3C;AACA/B,kBAAc+B,IAAI;AAClBrB,mBAAe,KAAK;AACpB,QAAIsB,YAAY;AACZxB,wBAAkB,KAAK;AAAA,IAC3B;AAAA,EACJ,GAAG,CAACf,OAAO,CAAC;AAEZ,QAAMwC,cAAcb,YAAY,OAAOW,WAAsB;AACzD,QAAIjC,kBAAkBiC,QAAM;AACxB,YAAMhB,cAAY,MAAMjB,eAAeiC,MAAI;AAC3C,UAAI,CAACJ,UAAMZ,aAAWA,WAAS,GAAG;AAC9BI,qBAAaJ,WAAS;AAAA,MAC1B;AAAA,IACJ;AAAA,EACJ,GAAG,CAACjB,gBAAgBiB,SAAS,CAAC;AAE9BmB,YAAU,MAAM;AACZ,QAAID,eAAelC,YAAY;AAC3BkC,kBAAYlC,UAAU;AAAA,IAC1B;AAAA,EACJ,GAAG,CAACkC,aAAalC,UAAU,CAAC;AAE5BmC,YAAU,MAAM;AACZ,QAAI,CAACxC,YAAa;AAClB,QAAI;AACA,YAAMyC,OAAOC,QAAQ1C,WAAW;AAChCkC,cAAQS,UAAUF;AAClB/B,mBAAaF,MAAS;AACtB4B,iBAAWK,KAAKG,aAAa,KAAK;AAClC,aAAOC,mBACHJ,MACA,OAAOJ,WAAS;AACZS,gBAAQC,MAAM,sBAAsBV,MAAI;AACxC,cAAMD,WAAWC,QAAM,IAAI;AAAA,MAC/B,GACAW,CAAAA,UAASpC,qBAAqBoC,KAAK,CACvC;AAAA,IACJ,SAASC,GAAG;AACRvC,mBAAauC,CAAC;AACdnC,wBAAkB,KAAK;AACvB,aAAO,MAAM;AAAA,MACb;AAAA,IACJ;AAAA,EACJ,GAAG,CAACd,aAAaoC,UAAU,CAAC;AAE5BI,YAAU,MAAM;AACZ,QAAI,CAACzC,WAAWmC,QAAQS,SAAS;AAC7BP,iBAAWF,QAAQS,QAAQC,aAAa,KAAK;AAAA,IACjD;AAAA,EACJ,GAAG,CAAC7C,SAASqC,UAAU,CAAC;AAExB,QAAMc,qBAAqBxB,YAAY,CAACyB,eAAyE;AAC7G,WAAOlD,eAAemD,KAAMC,CAAAA,WAAW;AACnC,UAAIA,WAAW,KAAM,OAAMC,MAAM,2BAA2B;AAC5D,UAAI,OAAOD,WAAW,YAAYA,OAAOE,aAAaJ,WAClD,QAAOE;AACX,aAAO7C;AAAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAA,CAAE;AAEL,QAAMgD,cAAc9B,YAAY,MAAM;AAClC,UAAM6B,WAAW,IAAIE,mBAAAA;AACrB,UAAMC,UAAUR,mBAAmB,YAAY;AAC/C,QAAIQ,SAASC,OACTD,SAAQC,OAAOC,QAASC,CAAAA,UAAUN,SAASO,SAASD,KAAK,CAAC;AAC9D,QAAIH,SAASK,kBAAkB;AAC3BR,eAASS,oBAAoBN,QAAQK,gBAAgB;AAAA,IACzD,OAAO;AACHR,eAASS,oBAAoB;AAAA,QACzBC,QAAQ;AAAA,MAAA,CACX;AAAA,IACL;AACA,UAAMxB,SAAOP,QAAQS;AACrB,QAAI,CAACF,OAAM,OAAMa,MAAM,SAAS;AAChCY,oBAAgBzB,QAAMc,QAAQ,EAAEY,MAAMvD,oBAAoB;AAAA,EAC9D,GAAG,CAACsC,kBAAkB,CAAC;AAEvB,QAAMkB,eAAe1C,YAAY,YAA6B;AAC1D,QAAI,CAACrB,WACD,OAAMiD,MAAM,6BAA6B;AAC7C,QAAI,CAACjD,WAAWgE,YAAY;AACxB,YAAMf,MAAM,gCAAgC;AAAA,IAChD;AACA,WAAOjD,WAAWgE,aAAAA;AAAAA,EACtB,GAAG,CAAChE,UAAU,CAAC;AAEf,QAAMiE,qBAAqB5C,YAAY,CAAC6C,OAAeC,aAAqB;AACxE,UAAM/B,SAAOP,QAAQS;AACrB,QAAI,CAACF,OAAM,OAAMa,MAAM,SAAS;AAChCtC,mBAAe,IAAI;AACnByD,+BAA2BhC,QAAM8B,OAAOC,QAAQ,EAC3CL,MAAMvD,oBAAoB,EAC1B8D,KAAK,MAAM1D,eAAe,KAAK,CAAC;AAAA,EACzC,GAAG,CAAA,CAAE;AAEL,QAAM2D,mCAAiCjD,YAAY,CAAC6C,SAAeC,eAAqB;AACpF,UAAM/B,SAAOP,QAAQS;AACrB,QAAI,CAACF,OAAM,OAAMa,MAAM,SAAS;AAChCtC,mBAAe,IAAI;AACnB4D,mCAAuCnC,QAAM8B,SAAOC,UAAQ,EACvDL,MAAMvD,oBAAoB,EAC1B8D,KAAK,MAAM1D,eAAe,KAAK,CAAC;AAAA,EACzC,GAAG,CAAA,CAAE;AAEL,QAAM6D,2BAAyBnD,YAAY,CAAC6C,YAAkB;AAC1D,UAAM9B,SAAOP,QAAQS;AACrB,QAAI,CAACF,OAAM,OAAMa,MAAM,SAAS;AAChC,WAAOwB,uBAA+BrC,QAAM8B,OAAK;AAAA,EACrD,GAAG,CAAA,CAAE;AAEL,QAAMQ,+BAA6BrD,YAAY,CAAC6C,YAAqC;AACjF,UAAM9B,SAAOP,QAAQS;AACrB,QAAI,CAACF,OAAM,OAAMa,MAAM,SAAS;AAChCtC,mBAAe,IAAI;AACnB,WAAOgE,2BAAmCvC,QAAM8B,OAAK,EAChDG,KAAMO,CAAAA,QAAQ;AACXjE,qBAAe,KAAK;AACpB,aAAOiE;AAAAA,IACX,CAAC;AAAA,EACT,GAAG,CAAA,CAAE;AAEL,QAAM/E,YAAYwB,YAAY,YAAY;AACtC,UAAMe,SAAOP,QAAQS;AACrB,QAAI,CAACF,OAAM,OAAMa,MAAM,SAAS;AAChC,UAAM4B,QAAQzC,MAAI,EACbiC,KAAKS,CAAAA,MAAK;AACP7E,oBAAc,IAAI;AAClBmB,mBAAajB,MAAS;AACtBI,2BAAqB,IAAI;AACzBT,sBAAAA;AAAAA,IACJ,CAAC;AACLe,oBAAgB,KAAK;AAAA,EACzB,GAAG,CAACf,aAAa,CAAC;AAElB,QAAMiF,eAAe1D,YAAY,CAACe,QAAYc,eAA8F;AACxIvC,mBAAe,IAAI;AACnBkD,oBAAgBzB,QAAMc,UAAQ,EACzBY,MAAMvD,oBAAoB,EAAE8D,KAAK,MAAM1D,eAAe,KAAK,CAAC;AAAA,EACrE,GAAG,CAAA,CAAE;AAEL,QAAMqE,iBAAiB3D,YAAY,MAAM;AACrC,UAAMe,SAAOP,QAAQS;AACrB,QAAI,CAACF,OAAM,OAAMa,MAAM,SAAS;AAChCtC,mBAAe,IAAI;AACnBsE,sBAAkB7C,MAAI,EACjB0B,MAAMvD,oBAAoB,EAC1B8D,KAAK,MAAM1D,eAAe,KAAK,CAAC;AAAA,EACzC,GAAG,CAAA,CAAE;AAEL,QAAMuE,aAAa7D,YAAY,CAAC8D,OAAeC,wBAA6C;AACxF,UAAMhD,SAAOP,QAAQS;AACrB,QAAI,CAACF,OAAM,OAAMa,MAAM,SAAS;AAChCtC,mBAAe,IAAI;AACnB,WAAO0E,sBAAsBjD,QAAM+C,OAAOC,mBAAmB,EACxDtB,MAAMvD,oBAAoB,EAC1B8D,KAAMO,CAAAA,UAAQ;AACXjE,qBAAe,KAAK;AACpBI,4BAAsB6D,SAAOzE,MAAS;AAAA,IAC1C,CAAC;AAAA,EACT,GAAG,CAAA,CAAE;AAEL,QAAMmF,aAAajE,YAAY,MAAM;AACjC,UAAM6B,aAAW,IAAIqC,cAAc,WAAW;AAC9C,UAAMlC,YAAUR,mBAAmB,WAAW;AAC9C,QAAIQ,WAASC,OACTD,WAAQC,OAAOC,QAASC,CAAAA,YAAUN,WAASO,SAASD,OAAK,CAAC;AAC9D,QAAIH,WAASK,iBACTR,YAASS,oBAAoBN,UAAQK,gBAAgB;AACzD,UAAMtB,SAAOP,QAAQS;AACrB,QAAI,CAACF,OAAM,OAAMa,MAAM,SAAS;AAChC8B,iBAAa3C,QAAMc,UAAQ;AAAA,EAC/B,GAAG,CAAC6B,cAAclC,kBAAkB,CAAC;AAErC,QAAM2C,gBAAgBnE,YAAY,MAAM;AACpC,UAAM6B,aAAW,IAAIuC,qBAAAA;AACrB,UAAMpC,YAAUR,mBAAmB,cAAc;AACjD,QAAIQ,WAASC,OACTD,WAAQC,OAAOC,QAASC,CAAAA,YAAUN,WAASO,SAASD,OAAK,CAAC;AAC9D,QAAIH,WAASK,iBACTR,YAASS,oBAAoBN,UAAQK,gBAAgB;AACzD,UAAMtB,UAAOP,QAAQS;AACrB,QAAI,CAACF,QAAM,OAAMa,MAAM,SAAS;AAChC8B,iBAAa3C,SAAMc,UAAQ;AAAA,EAC/B,GAAG,CAAC6B,cAAclC,kBAAkB,CAAC;AAErC,QAAM6C,cAAcrE,YAAY,MAAM;AAClC,UAAM6B,aAAW,IAAIyC,mBAAAA;AACrB,UAAMtC,YAAUR,mBAAmB,YAAY;AAC/C,QAAIQ,WAASC,OACTD,WAAQC,OAAOC,QAASC,CAAAA,YAAUN,WAASO,SAASD,OAAK,CAAC;AAC9D,QAAIH,WAASK,iBACTR,YAASS,oBAAoBN,UAAQK,gBAAgB;AACzD,UAAMtB,UAAOP,QAAQS;AACrB,QAAI,CAACF,QAAM,OAAMa,MAAM,SAAS;AAChC8B,iBAAa3C,SAAMc,UAAQ;AAAA,EAC/B,GAAG,CAAC6B,cAAclC,kBAAkB,CAAC;AAErC,QAAM+C,iBAAiBvE,YAAY,MAAM;AACrC,UAAM6B,aAAW,IAAIqC,cAAc,eAAe;AAClD,UAAMlC,YAAUR,mBAAmB,eAAe;AAClD,QAAIQ,WAASC,OACTD,WAAQC,OAAOC,QAASC,CAAAA,YAAUN,WAASO,SAASD,OAAK,CAAC;AAC9D,QAAIH,WAASK,iBACTR,YAASS,oBAAoBN,UAAQK,gBAAgB;AACzD,UAAMtB,UAAOP,QAAQS;AACrB,QAAI,CAACF,QAAM,OAAMa,MAAM,SAAS;AAChC8B,iBAAa3C,SAAMc,UAAQ;AAAA,EAC/B,GAAG,CAAC6B,cAAclC,kBAAkB,CAAC;AAErC,QAAMgD,eAAexE,YAAY,MAAM;AACnC,UAAM6B,aAAW,IAAI4C,oBAAAA;AACrB,UAAMzC,YAAUR,mBAAmB,aAAa;AAChD,QAAIQ,WAASK,iBACTR,YAASS,oBAAoBN,UAAQK,gBAAgB;AACzD,UAAMtB,UAAOP,QAAQS;AACrB,QAAI,CAACF,QAAM,OAAMa,MAAM,SAAS;AAChC8B,iBAAa3C,SAAMc,UAAQ;AAAA,EAC/B,GAAG,CAAC6B,cAAclC,kBAAkB,CAAC;AAErC,QAAMkD,YAAY1E,YAAY,MAAM;AAChCR,oBAAgB,IAAI;AACpBZ,kBAAc,IAAI;AAClBmB,iBAAajB,MAAS;AAAA,EAC1B,GAAG,CAAA,CAAE;AAEL,QAAM6F,sBAAkDhG,aAClD;AAAA,IACE,GAAGA;AAAAA,IACHsB,OAAON,WAAWQ,IAAIC,CAAAA,QAAKA,IAAEC,EAAE;AAAA;AAAA,IAC/BuE,cAAcjG;AAAAA,EAAAA,IAEhB;AAEN,SAAO;AAAA,IACHgC,MAAMgE;AAAAA,IACNE,SAASnE;AAAAA,IACTX;AAAAA,IACAd;AAAAA,IACAI;AAAAA,IACAF,gBAAgBd,WAAWc;AAAAA,IAC3BqE,SAAShF;AAAAA,IACTkE;AAAAA,IACAZ;AAAAA,IACA4C;AAAAA,IACAnF;AAAAA,IACAqD;AAAAA,IAAAA,gCACAK;AAAAA,IAAAA,wBACAE;AAAAA,IAAAA,4BACAE;AAAAA,IACAM;AAAAA,IACAE;AAAAA,IACAI;AAAAA,IACAE;AAAAA,IACAE;AAAAA,IACAE;AAAAA,IACAC;AAAAA,IACA/E;AAAAA,IACAI;AAAAA,IACAC;AAAAA,EAAAA;AAER;ACrTO,SAASgF,yBAAyB;AAAA,EACrCxG;AAAAA,EACAyG;AACwB,GAAkB;AAC1C,QAAMC,YAAY1G,aAAa0D,SAASgD;AACxC,QAAMC,YAA4C,CAAA;AAClD,SAAO;AAAA,IACHC,UAAU;AAAA,MACNC;AAAAA,MACAC;AAAAA,MACAC;AAAAA,MACAC;AAAAA,IAAAA,GAEe;AACf,UAAI;AACA,YAAI,CAAChH,YAAa,OAAMsD,MAAM,mDAAmD;AACjF,cAAM2D,mBAAmBD,UAAUP;AACnC,cAAMS,UAAUC,WAAWnH,aAAaiH,gBAAgB;AACxD,YAAI,CAACC,QAAS,OAAM5D,MAAM,mDAAmD;AAE7E,cAAM8D,aAAaC,IAAIH,SAASJ,GAAG;AACnC,cAAMQ,aAAaC,qBAAqBH,YAAYP,MAAME,QAAQ;AAElE,eAAO,IAAIS,QAAQ,CAACC,SAASC,WAAW;AACpC,cAAIC,eAAe;AACnB,cAAIC,YAAmC;AAEvC,gBAAMC,uBAAuBA,MAAM;AAC/B,gBAAID,WAAW;AACXE,2BAAaF,SAAS;AACtBA,0BAAY;AAAA,YAChB;AAAA,UACJ;AAEA,gBAAMG,qBAAqBA,MAAM;AAC7BF,iCAAAA;AACAD,wBAAYI,WAAW,MAAM;AACzBV,yBAAWW,OAAAA;AACXP,qBAAO,IAAIpE,MAAM,qKACkGoD,SAAS,2DACvE,CAAC;AAAA,YAC1D,GAAG,GAAI;AAAA,UACX;AAEAqB,6BAAAA;AAEAT,qBAAWY,GAAG,iBACTC,CAAAA,aAAa;AACV,kBAAMC,WAAYD,SAASE,mBAAmBF,SAASG,aAAc;AAErE,gBAAIF,WAAWT,cAAc;AACzBA,6BAAeS;AACfL,iCAAAA;AAAAA,YACJ;AAAA,UACJ,GACC/E,CAAAA,UAAU;AACP6E,iCAAAA;AACA/E,oBAAQE,MAAM,kCAAkCA,KAAK;AAErD,gBAAIuF,eAAe;AAEnB,gBAAIvF,OAAOwF,SAAS;AAChBD,6BAAevF,MAAMwF;AAAAA,YACzB,WAAW,OAAOxF,UAAU,UAAU;AAClCuF,6BAAevF;AAAAA,YACnB,WAAWA,OAAOyF,MAAM;AACpBF,6BAAevF,MAAMyF;AAAAA,YACzB;AAEA,gBAAIzF,OAAOyF,SAAS,wBAAwB;AACxCf,qBAAO,IAAIpE,MAAM,qDAAqD,CAAC;AAAA,YAC3E,WAAWN,OAAOyF,SAAS,oBAAoB;AAC3Cf,qBAAO,IAAIpE,MAAM,iBAAiB,CAAC;AAAA,YACvC,WAAWN,OAAOyF,SAAS,qBAAqB,CAACzF,OAAOyF,MAAM;AAC1Df,qBAAO,IAAIpE,MAAM,iFAAiF,CAAC;AAAA,YACvG,WAAWiF,aAAaG,YAAAA,EAAcC,SAAS,SAAS,GAAG;AACvDjB,qBAAO,IAAIpE,MAAM,+CAA+C,CAAC;AAAA,YACrE,OAAO;AACH,oBAAMsF,WAAWC,OAAOC,OAAO,IAAIxF,MAAMiF,YAAY,GAAG;AAAA,gBAAEE,MAAMzF,OAAOyF;AAAAA,cAAAA,CAAM;AAC7Ef,qBAAOkB,QAAQ;AAAA,YACnB;AAAA,UACJ,GACA,MAAM;AACFf,iCAAAA;AACA,kBAAMkB,WAAWzB,WAAWa,SAASd,IAAI0B;AACzC,kBAAMC,aAAa1B,WAAWa,SAASd,IAAIL;AAC3CS,oBAAQ;AAAA,cACJX,KAAKiC;AAAAA,cACL/B,QAAQgC;AAAAA,cACRC,YAAY,QAAQD,UAAU,IAAID,QAAQ;AAAA,YAAA,CAC7C;AAAA,UACL,CACJ;AAAA,QACJ,CAAC;AAAA,MACL,SAAS/F,OAAO;AACZ,eAAOwE,QAAQE,OAAO1E,KAAK;AAAA,MAC/B;AAAA,IACJ;AAAA,IAEA,MAAMkG,UAAUC,MAAcnC,QAAuC;AACjE,UAAI;AACA,YAAI,CAAChH,YAAa,OAAMsD,MAAM,mDAAmD;AACjF,cAAM2D,mBAAmBD,UAAUP;AACnC,cAAMS,UAAUC,WAAWnH,aAAaiH,gBAAgB;AACxD,YAAI,CAACC,QAAS,OAAM5D,MAAM,mDAAmD;AAC7E,cAAM8F,UAAU/B,IAAIH,SAASiC,IAAI;AACjC,cAAME,MAAM,MAAMC,eAAeF,OAAO;AACxC,cAAMG,WAAW,MAAMC,MAAMH,GAAG;AAChC,cAAMI,OAAO,MAAMF,SAASE,KAAAA;AAC5B,eAAO,IAAIC,KAAK,CAACD,IAAI,GAAGN,IAAI;AAAA,MAChC,SAASlG,GAAQ;AACb,YAAIA,GAAGwF,SAAS,2BAA4B,QAAO;AACnD,cAAMxF;AAAAA,MACV;AAAA,IACJ;AAAA,IAEA,MAAM0G,aAAaC,kBAA0B5C,QAA0C;AACnF,UAAI,CAAChH,YAAa,OAAMsD,MAAM,mDAAmD;AAGjF,UAAIuG,oBAAoBD;AACxB,UAAIE,iBAAiB9C;AACrB,YAAM+C,QAAQH,iBAAiBG,MAAM,eAAe;AACpD,UAAIA,OAAO;AACP,cAAMC,iBAAiBD,MAAM,CAAC,EAAEE;AAChC,cAAMC,kBAAkBN,iBAAiBO,UAAUH,cAAc;AACjE,cAAMI,aAAaF,gBAAgBG,QAAQ,GAAG;AAC9C,YAAID,aAAa,GAAG;AAChBN,2BAAiBI,gBAAgBC,UAAU,GAAGC,UAAU;AACxDP,8BAAoBK,gBAAgBC,UAAUC,aAAa,CAAC;AAAA,QAChE;AAAA,MACJ;AAEA,YAAMnD,mBAAmB6C,kBAAkBrD;AAC3C,YAAMS,UAAUC,WAAWnH,aAAaiH,gBAAgB;AACxD,UAAI,CAACC,QAAS,OAAM5D,MAAM,mDAAmD;AAE7E,UAAIqD,UAAUiD,gBAAgB,EAC1B,QAAOjD,UAAUiD,gBAAgB;AACrC,UAAI;AACA,cAAMR,UAAU/B,IAAIH,SAAS2C,iBAAiB;AAC9C,cAAM,CAACR,KAAKtC,QAAQ,IAAI,MAAMS,QAAQ8C,IAAI,CAAChB,eAAeF,OAAO,GAAGmB,YAAYnB,OAAO,CAAC,CAAC;AACzF,cAAMoB,SAAyB;AAAA,UAC3BnB;AAAAA,UACAtC;AAAAA,QAAAA;AAEJJ,kBAAUiD,gBAAgB,IAAIY;AAC9B,eAAOA;AAAAA,MACX,SAASvH,GAAQ;AACb,YAAIA,GAAGwF,SAAS,2BAA4B,QAAO;AAAA,UAC/CY,KAAK;AAAA,UACLoB,cAAc;AAAA,QAAA;AAElB,cAAMxH;AAAAA,MACV;AAAA,IACJ;AAAA,IAEA,MAAMyH,YAAYC,QAAgBjH,SAIH;AAC3B,UAAI,CAAC1D,YAAa,OAAMsD,MAAM,mDAAmD;AACjF,YAAM2D,mBAAmBvD,SAASsD,UAAUP;AAC5C,YAAMS,UAAUC,WAAWnH,aAAaiH,gBAAgB;AACxD,UAAI,CAACC,QAAS,OAAM5D,MAAM,mDAAmD;AAC7E,YAAMsH,YAAYvD,IAAIH,SAASyD,MAAM;AACrC,aAAO,MAAME,KAAKD,WAAW;AAAA,QACzBE,YAAYpH,SAASoH;AAAAA,QACrBC,WAAWrH,SAASqH;AAAAA,MAAAA,CACvB;AAAA,IACL;AAAA,IAEA,MAAMC,aAAa7B,MAAcnC,QAAgC;AAC7D,UAAI,CAAChH,YAAa,OAAMsD,MAAM,mDAAmD;AACjF,YAAM2D,mBAAmBD,UAAUP;AACnC,YAAMS,UAAUC,WAAWnH,aAAaiH,gBAAgB;AACxD,UAAI,CAACC,QAAS,OAAM5D,MAAM,mDAAmD;AAC7E,YAAM8F,UAAU/B,IAAIH,SAASiC,IAAI;AACjC,aAAO6B,aAAa5B,OAAO;AAAA,IAC/B;AAAA,EAAA;AAER;AChMA,MAAM6B,eAAe;AAqBd,SAASC,sBAAsB;AAAA,EACIC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAO1C,GAA6B;AAEzB,QAAM,CAACvL,aAAawL,cAAc,IAAIjL,SAAAA;AACtC,QAAM,CAACkL,uBAAuBC,wBAAwB,IAAInL,SAAkB,KAAK;AACjF,QAAM,CAACoL,aAAaC,cAAc,IAAIrL,SAAAA;AAEtC,QAAMsL,eAAenK,YAAY,CAACoK,WAAoC;AAElE,QAAIA,OAAOpF,cAAc1G,aAAa0D,QAAQgD,WAAW;AACrD5D,cAAQC,MAAM,yGAAyG;AACvH6I,qBAAepL,MAAS;AACxBkL,+BAAyB,KAAK;AAC9B;AAAA,IACJ;AAEA,QAAI;AACA,YAAMK,aAAaT,QAAQ;AAC3B,YAAMU,cAAcC,QAAAA;AACpB,YAAMC,cAAcF,YAAY5I,KAAK+I,CAAAA,QAAOA,IAAIb,SAASS,UAAU;AACnE,UAAIG,aAAa;AACbE,kBAAUF,WAAW;AAAA,MACzB;AACA,YAAMG,yBAAyBC,cAAcR,QAAQC,UAAU;AAC/DH,qBAAepL,MAAS;AACxBkL,+BAAyB,KAAK;AAC9BF,qBAAea,sBAAsB;AAAA,IACzC,SAASpJ,GAAQ;AACbH,cAAQE,MAAM,+BAA+BC,CAAC;AAC9C2I,qBAAeX,eAAe,QAAQhI,EAAEuF,WAAW+D,KAAKC,UAAUvJ,CAAC,EAAE;AAAA,IACzE;AAAA,EACJ,GAAG,CAACqI,IAAI,CAAC;AAET9I,YAAU,MAAM;AACZ,QAAI6I,kBAAkBF,kBAAkBnL,aAAa;AACjDqL,qBAAeF,gBAAgBnL,WAAW;AAAA,IAC9C;AAAA,EACJ,GAAG,CAACA,WAAW,CAAC;AAEhBwC,YAAU,MAAM;AAEZkJ,6BAAyB,IAAI;AAE7B,aAASe,aAAapD,KAAa;AAC/BG,YAAMH,GAAG,EACJ3E,KAAK,OAAM6E,aAAY;AACpBzG,gBAAQC,MAAM,0BAA0BwG,SAASmD,MAAM;AACvD,YAAInD,YAAYA,SAASmD,SAAS,KAAK;AACnC,gBAAMZ,WAAS,MAAMvC,SAASoD,KAAAA;AAC9B,cAAIpB,qBAAmBA,aAAaA;AACpCM,uBAAaC,QAAM;AAAA,QACvB;AAAA,MACJ,CAAC,EACA3H,MAAMlB,CAAAA,QAAK;AACJyI,iCAAyB,KAAK;AAC9BE,uBACI,gKAEA3I,IAAE2J,UACN;AAAA,MACJ,CACJ;AAAA,IACR;AAEA,QAAIzB,gBAAgB;AAChBU,mBAAaV,cAAc;AAAA,IAC/B,OAAO;AACH,UAAIC,SAAS;AACTqB,qBAAarB,OAAO;AAAA,MACxB,WAAWyB,QAAQC,IAAIC,aAAa,cAAc;AAC9CN,qBAAa,wBAAwB;AAAA,MACzC,OAAO;AACHf,iCAAyB,KAAK;AAC9BE,uBACI,2FACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACH5L;AAAAA,IACAyL;AAAAA,IACAE;AAAAA,EAAAA;AAER;AC1GO,SAASqB,YAAY;AAAA,EACIhN;AAAAA,EACA0D;AACqB,GAA6B;AAC9E,MAAIA,SAASuJ,YAAY;AACrBpE,WAAOC,OAAOoE,QAAQ;AAAA,MAClBC,+BAA+BzJ,SAASuJ;AAAAA,IAAAA,CAC3C;AAAA,EACL;AAEA,QAAM,CAACG,iBAAiBC,kBAAkB,IAAIC,MAAM/M,SAAkB,KAAK;AAC3E,QAAM,CAACgN,kBAAkBC,mBAAmB,IAAIF,MAAM/M,SAA8BC,MAAS;AAC7F,QAAM,CAACwC,OAAOyK,QAAQ,IAAIH,MAAM/M,SAAAA;AAEhC,QAAMmN,eAAevL,OAAgB,KAAK;AAE1C,QAAMwL,cAAcjM,YAAY,OAAOkM,aAAuB;AAC1D9K,YAAQC,MAAM,gCAAgC6K,QAAQ;AACtD,QAAI;AACA,YAAMC,QAAQ,MAAMC,SAASF,UAAUlK,SAASqK,YAAY;AAC5DjL,cAAQC,MAAM,oBAAoB8K,KAAK;AACvC,UAAI,CAACA,OAAO;AACRJ,iBAAS,mBAAmB;AAC5BD,4BAAoB,KAAK;AAAA,MAC7B,OAAO;AACHA,4BAAoB,IAAI;AACxB1K,gBAAQC,MAAM,oBAAoB;AAAA,MACtC;AAAA,IACJ,SAASE,GAAQ;AACbH,cAAQE,MAAM,oBAAoBC,CAAC;AACnCwK,eAASxK,EAAEuF,OAAO;AAAA,IACtB;AAAA,EACJ,GAAG,CAAC9E,SAASqK,YAAY,CAAC;AAE1BvL,YAAU,MAAM;AACZ,QAAI,CAACkB,QAAS;AACd,QAAI,CAAC1D,YAAa;AAClB,QAAIuN,qBAAqB/M,OAAW;AACpC,QAAIkN,aAAa/K,QAAS;AAE1B0K,uBAAmB,IAAI;AAEvB,UAAM;AAAA,MACF9J;AAAAA,MACAyK;AAAAA,IAAAA,IACAtK;AAEJuK,6BAAAA;AAEA,UAAML,aAAWM,mBAAmBlO,aAAa;AAAA,MAC7CuD;AAAAA,MACAyK;AAAAA,IAAAA,CACH;AAEDL,gBAAYC,UAAQ,EACflJ,KAAK,MAAM;AACR2I,yBAAmB,KAAK;AAAA,IAC5B,CAAC;AACLK,iBAAa/K,UAAU;AAAA,EAC3B,GAAG,CAAC4K,kBAAkBvN,aAAa0D,SAASiK,WAAW,CAAC;AAExD,SAAO;AAAA,IACH5N,SAASqN;AAAAA,IACTG;AAAAA,IACAvK;AAAAA,EAAAA;AAER;AAGA,SAASiL,2BAA2B;AAChC,QAAME,MAAMC,SAASC,eAAe,0BAA0B;AAC9D,MAAIF,KAAK;AACLA,QAAIG,OAAAA;AAAAA,EACR;AACJ;AC/FO,SAASC,kBAAkBC,UAAkBC,qBAAwC;AACxF,MAAI,CAACA,oBACD,QAAOC,oBAAoBF,QAAQ;AACvC,SAAO,CAAC,GAAGC,oBAAoB5M,IAAI6M,mBAAmB,GAAGA,oBAAoBF,QAAQ,CAAC,EAAEG,KAAKC,yBAAyB;AAC1H;AAGO,MAAMC,uBAAuBA,CAACC,SAAiD;AAElF,QAAMC,iBAAiBD,KAAKjN,IAAKmN,CAAAA,SAAQ;AACrC,UAAMjN,KAAaiN,KAAIjN;AACvB,UAAMkN,cAAaC,gBAAgBF,IAAG;AACtC,WAAO;AAAA,MAAE,CAACjN,EAAE,GAAGkN;AAAAA,IAAAA;AAAAA,EACnB,CAAC,EAAEE,OAAO,CAACC,GAAGC,OAAO;AAAA,IAAE,GAAGD;AAAAA,IAC9B,GAAGC;AAAAA,EAAAA,IAAM,CAAA,CAAE;AAEP,QAAMC,cAAczG,OAAO0G,KAAKR,cAAc,EAAES,KAAK,CAACJ,GAAGC,MAAMA,EAAEI,MAAMb,yBAAyB,EAAE3E,SAASmF,EAAEK,MAAMb,yBAAyB,EAAE3E,MAAM;AAEpJqF,cAAY1L,QAAS7B,CAAAA,OAAO;AACxB,UAAMkN,cAAaF,eAAehN,EAAE;AACpC,QAAIA,GAAG4G,SAASiG,yBAAyB,GAAG;AACxC,YAAMc,WAAW3N,GAAG0N,MAAMb,yBAAyB,EAAEe,MAAM,GAAG,EAAE,EAAEhB,KAAKC,yBAAyB;AAChG,YAAMgB,mBAAmBb,eAAeW,QAAQ;AAChD,UAAIE,iBACCA,kBAAwCC,iBAAiB,MAAM,CAAC,GAAKD,iBAAwCC,iBAAAA,KAAsB,CAAA,GAAKZ,WAAU;AACvJ,aAAOF,eAAehN,EAAE;AAAA,IAC5B;AAAA,EACJ,CAAC;AAED,SAAO8G,OAAOiH,OAAOf,cAAc;AACvC;AAEO,MAAMG,kBAAkBA,CAACF,SAA4C;AACxE,QAAMe,OAAOf,KAAIe,KAAAA;AACjB,MAAI,CAACA,KACD,OAAMzM,MAAM,oDAAoD;AACpE,QAAM0M,kBAAkBD,KAAKC;AAC7B,QAAMC,aAAaF,KAAKE,cAA4B,CAAA;AAGpD,QAAMC,uBAAuBC,8BAA8BF,YAAY,IAAI;AAC3E,QAAMG,mBAAmBC,eAAeH,sBAAsBF,eAAe;AAC7E,SAAO;AAAA,IACH,GAAGD;AAAAA,IACHE,YAAYG;AAAAA,IACZE,MAAMP,KAAKhO,MAAMgO,KAAKQ,SAASR,KAAKO;AAAAA,EAAAA;AAE5C;AAaA,SAASE,2BACLC,YACAC,mBAAmB,OACV;AACT,MAAIC,MAAMC,QAAQH,UAAU,GAAG;AAG3B,WAAOA;AAAAA,EACX,WAAW,OAAOA,eAAe,YAAYA,eAAe,MAAM;AAG9D,UAAMI,UAAUhI,OAAOgI,QAAQJ,UAAU,EAAE5O,IAAI,CAAC,CAACE,IAAI+O,KAAK,MACtD,OAAOA,UAAU,WACX;AAAA,MACE/O;AAAAA,MACAgP,OAAOD;AAAAA,IAAAA,IAET;AAAA,MACE,GAAIA;AAAAA,MACJ/O;AAAAA,IAAAA,CAEZ;AAGA,QAAI2O,kBAAkB;AAClBG,cAAQrB,KAAK,CAACJ,GAAGC,MAAM2B,OAAO5B,EAAErN,EAAE,EAAEkP,cAAcD,OAAO3B,EAAEtN,EAAE,CAAC,CAAC;AAAA,IACnE;AACA,WAAO8O;AAAAA,EACX;AACA,SAAO,CAAA;AACX;AAQA,SAASV,8BACLF,YACAS,mBAAmB,OACT;AACV,QAAMlG,SAAqB,CAAA;AAC3B3B,SAAOgI,QAAQZ,UAAU,EAAErM,QAAQ,CAAC,CAACkD,KAAKoK,QAAQ,MAAM;AACpD,QAAI,OAAOA,aAAa,YAAYA,aAAa,MAAM;AACnD,YAAMC,qBAAqB;AAAA,QAAE,GAAGD;AAAAA,MAAAA;AAGhC,UAAIC,mBAAmBC,MAAM;AACzBD,2BAAmBC,OAAOZ,2BACtBW,mBAAmBC,MACnBV,gBACJ;AAAA,MACJ;AAGA,UAAIS,mBAAmBE,aAAa,WAAW,OAAOF,mBAAmBG,OAAO,YAAYH,mBAAmBG,OAAO,MAAM;AACxH,cAAMC,SAASJ,mBAAmBG;AAClC,YAAIC,OAAOH,MAAM;AACbD,6BAAmBG,KAAK;AAAA,YACpB,GAAGC;AAAAA,YACHH,MAAMZ,2BACFe,OAAOH,MACPV,gBACJ;AAAA,UAAA;AAAA,QAER;AAAA,MACJ;AAGA,UAAIS,mBAAmBE,aAAa,SAASF,mBAAmBlB,YAAY;AACxEkB,2BAAmBlB,aAAaE,8BAC5BgB,mBAAmBlB,YACnBS,gBACJ;AAAA,MACJ;AAEAlG,aAAO1D,GAAG,IAAIqK;AAAAA,IAClB,OAAO;AACH3G,aAAO1D,GAAG,IAAIoK;AAAAA,IAClB;AAAA,EACJ,CAAC;AACD,SAAO1G;AACX;ACzIA,eAAsBgH,uBAAuBxR,aAA0BmJ,MAAcsI,aAAuBC,SAAkC;AAC1I,QAAMC,YAAYC,aAAa5R,WAAW;AAC1C,MAAI,CAACyR,eAAeA,YAAYxH,WAAW,GAAG;AAC1C,UAAM4H,IAAIC,MAAM7C,WAAW0C,WAAWxI,IAAI,GAAG4I,MAAYL,OAAK,CAAC;AAC/D,WAAOM,QAAQH,CAAC,EAAEnN,KAAMuN,CAAAA,kBAAkB;AACtC,aAAOA,cAAcnD,KAAKjN,IAAImN,CAAAA,SAAOA,KAAIe,MAAM;AAAA,IACnD,CAAC;AAAA,EACL,OAAO;AACH,QAAImC,cAAmD1R;AACvD,QAAI2R,QAAQ;AACZ,UAAMC,WAAWX;AACjBW,aAASC,KAAKlJ,IAAI;AAClB,QAAImJ,aAAiCF,SAAS,CAAC;AAC/C,WAAOE,YAAY;AACf,UAAIJ,aAAa;AACbA,uBAAe,MAAM1K,QAAQ8C,IAAI4H,YAAYrQ,IAAI,OAAOmN,SAAQ;AAC5D,gBAAM6C,IAAIC,MAAM7C,WAAW0C,WAAW3C,KAAI3H,IAAI8B,MAAMmJ,UAAoB,GAAGP,MAAY,CAAC,CAAC;AACzF,kBAAQ,MAAMC,QAAQH,CAAC,GAAG/C;AAAAA,QAC9B,CAAC,CAAC,GAAGyD,KAAAA;AAAAA,MACT,OAAO;AACH,cAAMV,IAAIC,MAAM7C,WAAW0C,WAAWW,UAAU,GAAGP,MAAY,CAAC,CAAC;AACjEG,uBAAe,MAAMF,QAAQH,CAAC,GAAG/C;AAAAA,MACrC;AACAqD;AACAG,mBAAaH,QAAQC,SAASnI,SAASmI,SAASD,KAAK,IAAI3R;AAAAA,IAC7D;AACA,WAAO0R,cAAcA,YAAYrQ,IAAImN,CAAAA,SAAOA,KAAIe,KAAAA,CAAM,IAAI,CAAA;AAAA,EAC9D;AACJ;AC5BO,SAASyC,yBAAyBC,QAAaC,WAAmBZ,QAA2C;AAEhHhP,UAAQC,MAAM,4BAA4B0P,QAAQX,MAAK;AAEvD,SAAOW,OAAOE,kBAAkB;AAAA,IAC5BD;AAAAA,IACAE,cAAc;AAAA,MAAEd,OAAAA;AAAAA,IAAAA;AAAAA,EAAM,CACzB,EAAEpN,KAAK,CAAC;AAAA,IAAEmO;AAAAA,EAAAA,MAAgB;AACvB,WAAOA,KAAKhR,IAAI,CAACiR,QAAaA,IAAIC,QAAkB;AAAA,EACxD,CAAC,EACI5O,MAAM,CAAC6O,QAAa;AACjBlQ,YAAQE,MAAMgQ,GAAG;AACjB,WAAO,CAAA;AAAA,EACX,CAAC;AACT;ACpBA,MAAMC,iBAAiB;AASvB,eAAsBC,0BAA0B;AAAA,EAC5CC,OAAOF;AAAAA,EACPG;AAAAA,EACA1M;AAAAA,EACA2M;AAAAA,EACAvB,OAAAA;AAOJ,GAA+B;AAE3BhP,UAAQC,MAAM,6BAA6BsQ,gBAAgBvB,MAAK;AAChE,QAAMvI,WAAW,MAAMC,OAAO2J,QAAQF,kBAAkB,aAAavM,SAAS,WAAW2M,cAAc,IACnG;AAAA;AAAA,IAEIC,QAAQ;AAAA,IACRC,SAAS;AAAA,MACL,gBAAgB;AAAA,MAChBC,eAAe,SAASJ,aAAa;AAAA;AAAA,IAAA;AAAA,IAGzCK,MAAMlH,KAAKC,UAAU;AAAA,MACjBsF,OAAAA;AAAAA,IAAAA,CACH;AAAA,EAAA,CACJ;AAEL,QAAM4B,UAAU,MAAMnK,SAASoD,KAAAA;AAC/B,SAAO+G,QAAQ3D,KAAK4D;AAExB;AAEO,SAASC,8BAA8B;AAAA,EAC1CC;AAAAA,EACAC;AAQJ,GAAyC;AACrC,SAAO,CAACC,UAAyC;AAE7C,UAAMC,OAAOA,CAACD,WAGR;AAEF,aAAOvM,QAAQC,QAAQoM,gBAAgBE,OAAM5K,IAAI,CAAC;AAAA,IACtD;AAEA,WAAO;AAAA,MACH6K;AAAAA,MACAF;AAAAA,IAAAA;AAAAA,EAER;AAEJ;AClEO,SAASG,8BAA8B;AAAA,EAC1CJ;AAAAA,EACAC;AAOJ,GAAyC;AACrC,SAAO,CAACC,UAAyC;AAE7C,UAAMC,OAAOA,CAACD,WAGR;AACF,aAAOvM,QAAQC,QAAQoM,gBAAgBE,OAAM5K,IAAI,CAAC;AAAA,IACtD;AAEA,WAAO;AAAA,MACH6K;AAAAA,MACAF;AAAAA,IAAAA;AAAAA,EAER;AAEJ;AC1BA,MAAMI,qBAAqB;AAEpB,MAAMC,+BAAqEA,CAAC;AAAA,EAC/EnU;AAIJ,MAAqC;AAEjC,MAAIoU;AACJ,QAAMC,UAAyD,CAAA;AAC/D,QAAMC,YAAwC,CAAA;AAE9C,QAAMC,kBAAkBA,CAACpL,SAAiB;AACtC,QAAImL,UAAUnL,IAAI,GAAG;AACjBmL,gBAAUnL,IAAI,EAAA;AACd,aAAOmL,UAAUnL,IAAI;AACrB,aAAOkL,QAAQlL,IAAI;AAAA,IACvB;AAAA,EACJ;AAEA,QAAM6K,OAAOA,CAAC;AAAA,IACV7K;AAAAA,IACA8F,YAAYuF;AAAAA,IACZC;AAAAA,EAAAA,MAKoB;AAEpB,QAAIL,eAAejL,SAASiL,aAAa;AACrCG,sBAAgBH,WAAW;AAAA,IAC/B;AAEAA,kBAAcjL;AAEd,WAAO,IAAI3B,QAAQ,OAAOC,SAASC,WAAW;AAC1C,UAAI8M,gBAAgB;AAChB1R,gBAAQC,MAAM,gCAAgCoG,IAAI;AAClD,cAAMwI,YAAY8C,aAAa7C,aAAa5R,aAAayU,UAAU,IAAI7C,aAAa5R,WAAW;AAC/F,cAAM0U,MAAMzF,WAAW0C,WAAWxI,IAAI;AACtCmL,kBAAUnL,IAAI,IAAIwL,WAAW7C,MAAM4C,GAAG,GAClC;AAAA,UACIE,MAAOzM,CAAAA,aAAa;AAChB,gBAAIA,SAASpB,SAAS8N,aAAa1M,SAASpB,SAAS+N,kBAAkB;AACnE;AAAA,YACJ;AACA,kBAAMhG,OAAO3G,SAAS2G,KAAKjN,IAAImN,CAAAA,UAAQ;AAAA,cACnCjN,IAAIiN,KAAIjN;AAAAA,cACR,GAAGiN,KAAIe,KAAAA;AAAAA,YAAK,EACd;AAEFsE,oBAAQlL,IAAI,IAAI4L,WAAWjG,MAAM0F,cAAc;AAC/C1R,oBAAQC,MAAM,uBAAuBoG,MAAM2F,KAAK7E,MAAM;AACtDxC,oBAAQ,IAAI;AAAA,UAChB;AAAA,UACAzE,OAAQC,CAAAA,MAAM;AACVH,oBAAQE,MAAM,8CAA8CmG,IAAI;AAChErG,oBAAQE,MAAMC,CAAC;AACfyE,mBAAOzE,CAAC;AAAA,UACZ;AAAA,QAAA,CAER;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,QAAM6Q,SAAS,OAAO;AAAA,IAClBkB;AAAAA,IACA7L;AAAAA,EAAAA,MAKE;AACFrG,YAAQC,MAAM,yBAAyBoG,MAAM6L,YAAY;AACzD,UAAM7C,QAAQkC,QAAQlL,IAAI;AAC1B,QAAI,CAACgJ,OAAO;AACR,YAAM,IAAI7O,MAAM,4BAA4B6F,IAAI,EAAE;AAAA,IACtD;AACA,QAAI8L,eAAe9C,MAAM2B,OAAOkB,YAAY;AAC5CC,mBAAeA,aAAaC,OAAO,GAAGhB,kBAAkB;AACxDe,mBAAeA,aAAazF,KAAK,CAACJ,GAAGC,MAAM;AAEvC,YAAM8F,cAAc/F,EAAEgG,KAAKrT,OAAOiT;AAElC,YAAMK,cAAchG,EAAE+F,KAAKrT,OAAOiT;AAElC,UAAIG,eAAe,CAACE,aAAa;AAC7B,eAAO;AAAA,MACX,WAAW,CAACF,eAAeE,aAAa;AACpC,eAAO;AAAA,MACX,OAAO;AAEH,gBAAQjG,EAAEkG,SAAS,MAAMjG,EAAEiG,SAAS;AAAA,MACxC;AAAA,IACJ,CAAC;AACD,WAAOL,aAAapT,IAAI,CAACoB,MAAWA,EAAEmS,KAAKrT,EAAE;AAAA,EACjD;AAEA,SAAO;AAAA,IACHiS;AAAAA,IACAF;AAAAA,EAAAA;AAER;AAEA,SAASiB,WAAWlK,OAAmCoE,aAA8B;AAEjF,QAAMM,OAAO,CAAC,MAAM,GAAG1G,OAAO0G,KAAKN,YAAWgB,UAAU,CAAC;AAEzD,QAAMsF,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQhBC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMXC,cAAc;AAAA,IACdlG,MAAM,CAAC;AAAA,MACHjE,MAAM;AAAA,MACNoK,QAAQ;AAAA,IAAA,GACT,GAAGnG,KAAK1N,IAAIiF,CAAAA,SAAQ;AAAA,MACnBwE,MAAMxE;AAAAA,MACN4O,QAAQ;AAAA,IAAA,EACV,CAAC;AAAA,EAAA;AAEP,SAAO,IAAIC,KAA8B9K,OAAM0K,WAAW;AAC9D;ACnDO,SAASK,4BACZlS,SACoC;AACpC,QAAMmS,SAASnS,SAASmS,UAAU;AAClC,QAAMC,sBAAsBpS,SAASoS,uBAAuB;AAE5D,MAAIC,eAAoC;AACxC,MAAIC,kBAAuB;AAC3B,MAAIC,cAAoC;AAExC,SAAO,CAAC;AAAA,IAAEjW;AAAAA,EAAAA,MAA+E;AAKrF,UAAMkW,mBAAmB,YAA2B;AAChD,UAAIF,gBAAiB;AAGrB,UAAItS,SAASyS,cAAc;AACvBJ,uBAAe;AAAA,UACX5C,MAAMzP,QAAQyS,aAAahD;AAAAA,UAC3BiD,MAAM1S,QAAQyS,aAAaC,QAAQ;AAAA,UACnCC,UAAU3S,QAAQyS,aAAaE,YAAY;AAAA,UAC3CC,QAAQ5S,QAAQyS,aAAaG;AAAAA,UAC7BnN,MAAMzF,QAAQyS,aAAahN;AAAAA,UAC3BoN,oBAAoB,CAAC,GAAG;AAAA,QAAA;AAAA,MAEhC,OAAO;AAEH,cAAMC,YAAYC,aAAazW,aAAa6V,MAAM;AAClD,cAAMa,YAAYC,cACdH,WACA,OAAOV,mBAAmB,kBAC9B;AAEA,YAAI;AACA,gBAAMtL,SAAS,MAAMkM,UAAAA;AACrBX,yBAAevL,OAAOuF;AACtB,cAAIrM,SAASkT,eAAelT,QAAQkT,YAAY3M,SAAS,GAAG;AACxD8L,yBAAaQ,qBAAqB7S,QAAQkT;AAAAA,UAC9C;AAAA,QACJ,SAAS5T,OAAY;AACjBF,kBAAQE,MAAM,+CAA+CA,KAAK;AAClE,gBAAM,IAAIM,MACN,iHAEUN,MAAMwF,WAAWxF,KAAK,EACpC;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,CAAC+S,cAAc;AACf,cAAM,IAAIzS,MAAM,6BAA6B;AAAA,MACjD;AAGA,YAAMuT,aAAa,MAAM,OAAO,WAAW,GAAGC;AAE9Cd,wBAAkB,IAAIa,UAAUE,OAAO;AAAA,QACnCC,OAAO,CAAC;AAAA,UACJ7D,MAAM4C,aAAa5C;AAAAA,UACnBiD,MAAML,aAAaK;AAAAA,UACnBC,UAAUN,aAAaM;AAAAA,UACvBlN,MAAM4M,aAAa5M,QAAQ;AAAA,QAAA,CAC9B;AAAA,QACDmN,QAAQP,aAAaO;AAAAA,QACrBW,0BAA0B;AAAA,QAC1BC,sBAAsB;AAAA,QACtBC,YAAY;AAAA,MAAA,CACf;AAAA,IACL;AAMA,UAAMC,6BAA6BA,CAACjO,SAAyB;AACzD,YAAMkO,YAAYlO,KAAKsG,MAAM,GAAG;AAEhC,YAAM6H,kBAA4B,CAAA;AAClC,eAASC,IAAI,GAAGA,IAAIF,UAAUpN,QAAQsN,KAAK,GAAG;AAC1C,YAAIF,UAAUE,CAAC,GAAG;AACdD,0BAAgBjF,KAAKgF,UAAUE,CAAC,CAAC;AAAA,QACrC;AAAA,MACJ;AACA,aAAOD,gBAAgB3I,KAAK,GAAG;AAAA,IACnC;AAMA,UAAM6I,kBAAkBA,CAACrO,SAAgC;AACrD,YAAMkO,YAAYlO,KAAKsG,MAAM,GAAG;AAChC,UAAI4H,UAAUpN,UAAU,EAAG,QAAO;AAGlC,YAAMwN,UAAoB,CAAA;AAC1B,eAASF,IAAI,GAAGA,IAAIF,UAAUpN,SAAS,GAAGsN,KAAK,GAAG;AAC9C,cAAMG,iBAAiBL,UAAUE,CAAC;AAClC,cAAMI,QAAQN,UAAUE,IAAI,CAAC;AAC7B,YAAIG,kBAAkBC,OAAO;AACzBF,kBAAQpF,KAAK,WAAWqF,cAAc,QAAQC,KAAK,EAAE;AAAA,QACzD;AAAA,MACJ;AAEA,aAAOF,QAAQxN,SAAS,IAAIwN,QAAQ9I,KAAK,MAAM,IAAI;AAAA,IACvD;AAKA,UAAMqF,OAAO,OAAOD,UAII;AACpB,UAAI;AAEA,YAAI,CAACkC,aAAa;AACdA,wBAAcC,iBAAAA;AAAAA,QAClB;AACA,cAAMD;AAEN,YAAI,CAACF,aAAc,QAAO;AAG1B,cAAMsB,YAAYtD,MAAM5K,KAAKsG,MAAM,GAAG;AACtC,cAAM6H,kBAA4B,CAAA;AAClC,iBAASC,IAAI,GAAGA,IAAIF,UAAUpN,QAAQsN,KAAK,GAAG;AAC1C,cAAIF,UAAUE,CAAC,mBAAmBlF,KAAKgF,UAAUE,CAAC,CAAC;AAAA,QACvD;AACA,cAAMK,oBAAoBN,gBAAgB3I,KAAK,GAAG;AAClD,cAAMkJ,iBAAiBP,gBAAgB,CAAC;AAGxC,YAAIvB,aAAaQ,mBAAmB5N,SAAS,GAAG,GAAG;AAC/C,iBAAO;AAAA,QACX;AAGA,eAAOoN,aAAaQ,mBAAmB5N,SAASiP,iBAAiB,KAC7D7B,aAAaQ,mBAAmB5N,SAASkP,cAAc;AAAA,MAC/D,SAAS7U,OAAO;AACZF,gBAAQE,MAAM,uCAAuCA,KAAK;AAC1D,eAAO;AAAA,MACX;AAAA,IACJ;AAGA,UAAM8U,kCAAyCC,IAAAA;AAM/C,UAAMC,gCAAgC,OAAON,mBAA8C;AAEvF,UAAII,YAAYG,IAAIP,cAAc,GAAG;AACjC,eAAOI,YAAYI,IAAIR,cAAc;AAAA,MACzC;AAEA,UAAI;AACA,cAAMzI,cAAa,MAAM+G,gBAAgBY,YAAYc,cAAc,EAAES,SAAAA;AAGrE,cAAMC,eAAenJ,YAAWoJ,OAC3BC,OAAO,CAACC,MAAW;AAEhB,gBAAMC,eAAeD,EAAEE,SAAS,YAC5BF,EAAEE,SAAS,cACXF,EAAEE,SAAS,aACXF,EAAEE,SAAS;AACf,gBAAMC,gBAAgB,CAACH,EAAEjN,KAAKqN,WAAW,GAAG,KAAKJ,EAAEjN,SAAS;AAC5D,iBAAOkN,gBAAgBE;AAAAA,QAC3B,CAAC,EACA7W,IAAI,CAAC0W,MAAWA,EAAEjN,IAAI;AAE3BwM,oBAAYc,IAAIlB,gBAAgBU,YAAY;AAC5C,eAAOA;AAAAA,MACX,SAASpV,OAAY;AACjB,YAAIA,MAAM6V,eAAe,KAAK;AAC1B,gBAAM,IAAIvV,MACN,eAAeoU,cAAc,yGAEjC;AAAA,QACJ;AACA,cAAM1U;AAAAA,MACV;AAAA,IACJ;AAMA,UAAM8Q,SAAS,OAAOC,UAKwB;AAC1C,UAAI,CAACiC,iBAAiB;AAElB,YAAI,CAACC,aAAa;AACdA,wBAAcC,iBAAAA;AAAAA,QAClB;AACA,cAAMD;AAAAA,MACV;AAEA,UAAI,CAACD,iBAAiB;AAClB,cAAM,IAAI1S,MAAM,kEAAkE;AAAA,MACtF;AAGA,YAAMoU,iBAAiBN,2BAA2BrD,MAAM5K,IAAI;AAG5D,YAAM2P,eAAetB,gBAAgBzD,MAAM5K,IAAI;AAG/C,YAAM4P,mBAAmB,MAAMf,8BAA8BN,cAAc;AAE3E,UAAIqB,iBAAiB9O,WAAW,GAAG;AAC/B,cAAM,IAAI3G,MACN,8DAA8DoU,cAAc,mEAEhF;AAAA,MACJ;AAEA,YAAMsB,UAAUD,iBAAiBpK,KAAK,GAAG;AAEzC,UAAI;AACA,cAAMiE,eAAoB;AAAA,UACtBf,GAAGkC,MAAMiB;AAAAA,UACTiE,UAAUD;AAAAA,UACVE,UAAU;AAAA,UACVvO,QAAQ;AAAA;AAAA,UACRwO,uBAAuB;AAAA;AAAA,QAAA;AAI3B,YAAIL,cAAc;AACdlG,uBAAawG,YAAYN;AAAAA,QAC7B;AAEA,cAAMtO,SAAS,MAAMwL,gBAChBY,YAAYc,cAAc,EAC1B2B,UAAAA,EACAvF,OAAOlB,YAAY;AAGxB,cAAMe,MAAMnJ,OAAOqI,MAAMhR,IAAI,CAACiR,QAAaA,IAAI1E,SAASrM,EAAE,KAAK,CAAA;AAE/D,eAAO4R;AAAAA,MACX,SAAS3Q,OAAY;AAEjB,cAAMwF,UAAUxF,MAAMwF,WAAWxF,MAAM4J,SAAAA;AACvC,cAAM,IAAItJ,MAAM,kBAAkBkF,OAAO,EAAE;AAAA,MAC/C;AAAA,IACJ;AAEA,WAAO;AAAA,MAAEwL;AAAAA,MACjBF;AAAAA,IAAAA;AAAAA,EACI;AACJ;ACpRO,SAASwF,mBAAmB;AAAA,EAC/BtZ;AAAAA,EACAuZ;AAAAA,EACAC;AAAAA,EACAC;AACsB,GAAwB;AAE9C,QAAMC,sBAAsBvX,OAAsC3B,MAAS;AAE3EgC,YAAU,MAAM;AACZ,QAAI,CAACkX,oBAAoB/W,WAAW3C,aAAa;AAC7C,WAAKuZ,+BAA+BE,2BAA2B,CAACC,oBAAoB/W,SAAS;AACzF+W,4BAAoB/W,UAAUgX,yCAAyC;AAAA,UACnE3Z;AAAAA,UACAuZ;AAAAA,UACAE,wBAAwBA,0BAA0B;AAAA,QAAA,CACrD;AAAA,MACL;AAAA,IACJ;AAAA,EACJ,GAAG,CAACzZ,aAAayZ,wBAAwBF,2BAA2B,CAAC;AAErE,QAAMK,aAAalY,YAAY,CAAIyH,MAC/BmP,QACAuB,WACAC,OACAC,cACArI,SACA+C,eAAwB;AAExB,QAAI,CAACzU,YAAa,OAAMsD,MAAM,6CAA6C;AAE3E,UAAMqO,YAAY8C,aAAa7C,aAAa5R,aAAayU,UAAU,IAAI7C,aAAa5R,WAAW;AAC/F,UAAMga,sBAA6BC,WAAiBtI,WAAWxI,IAAI;AAEnE,UAAM+Q,cAAiC,CAAA;AACvC,QAAI5B,QAAQ;AACRzP,aAAOgI,QAAQyH,MAAM,EAChBA,OAAO,CAAC,CAACnT,GAAGgV,KAAK,MAAM,CAAC,CAACA,KAAK,EAC9BvW,QAAQ,CAAC,CAACkD,KAAKsT,eAAe,MAAM;AACjC,cAAM,CAACC,IAAIvJ,KAAK,IAAIsJ;AACpBF,oBAAY7H,KAAKiI,MAAYxT,KAAKuT,IAAIE,oBAAoBzJ,OAAOa,SAAS,CAAC,CAAC;AAAA,MAChF,CAAC;AAAA,IACT;AAEA,QAAIkI,aAAWC,OAAO;AAClBI,kBAAY7H,KAAKmI,QAAcX,WAASC,KAAK,CAAC;AAAA,IAClD;AAEA,QAAIC,cAAY;AACZG,kBAAY7H,KAAKoI,WAAiBV,YAAU,CAAC;AAAA,IACjD;AAEA,QAAIrI,SAAO;AACPwI,kBAAY7H,KAAKN,MAAYL,OAAK,CAAC;AAAA,IACvC;AAEA,WAAOI,MAAMkI,qBAAqB,GAAGE,WAAW;AAAA,EACpD,GAAG,CAACla,WAAW,CAAC;AAEhB,QAAM0a,oBAAoBhZ,YAAY,CAAgCyH,QAClEwR,UACAlG,iBACiC;AACjC,QAAI,CAACzU,YAAa,OAAMsD,MAAM,6CAA6C;AAE3E,UAAMqO,cAAY8C,eAAa7C,aAAa5R,aAAayU,YAAU,IAAI7C,aAAa5R,WAAW;AAE/F,WAAO4a,OAAO5L,IAAI2C,aAAWxI,QAAM6H,OAAO2J,QAAQ,CAAC,CAAC,EAC/CjW,KAAMmW,CAAAA,gBAAgB;AACnB,UAAI,CAACA,YAAYC,UAAU;AACvB,eAAOta;AAAAA,MACX;AACA,aAAOua,yBAAyBF,aAAapG,YAAU;AAAA,IAC3D,CAAC;AAAA,EACT,GAAG,CAACzU,WAAW,CAAC;AAEhB,QAAMgb,eAAetZ,YAAY,CAC7B;AAAA,IACIyH,MAAAA;AAAAA,IACAwR,UAAAA;AAAAA,IACA1L,YAAAA;AAAAA,IACAgM;AAAAA,IACAC;AAAAA,EAAAA,MACoC;AACxC,QAAI,CAAClb,YAAa,OAAMsD,MAAM,6CAA6C;AAE3E,UAAMmR,eAAaxF,aAAYwF;AAC/B,UAAM9C,cAAY8C,eAAa7C,aAAa5R,aAAayU,YAAU,IAAI7C,aAAa5R,WAAW;AAC/F,UAAMmb,eAAehS;AAErB,WAAOwL,WACH3F,IAAI2C,aAAWwJ,cAAcnK,OAAO2J,UAAQ,CAAC,GAC7C;AAAA,MACI/F,MAAOiG,CAAAA,kBAAgB;AACnBI,iBAASF,yBAAyBF,eAAapG,YAAU,CAAC;AAAA,MAC9D;AAAA,MACAzR,OAAOkY;AAAAA,IAAAA,CAEf;AAAA,EACJ,GAAG,CAAClb,WAAW,CAAC;AAEhB,QAAMob,oBAAoB1Z,YAAY,CAAgC;AAAA,IAClEyH,MAAAA;AAAAA,IACAsL,YAAAA;AAAAA,IACAO;AAAAA,IACAiG,UAAAA;AAAAA,EAAAA,MAMc;AAEd,QAAI,CAACjb,YAAa,OAAMsD,MAAM,6CAA6C;AAE3E,UAAM+X,uBAAuB3B,oBAAoB/W;AACjD,QAAI,CAAC0Y,qBACD,OAAM/X,MAAM,+EAA+E;AAE/F,QAAIgY,gBAAgC,CAAA;AAGpC,UAAM7Y,OAAOC,QAAQ1C,WAAW;AAChC,UAAM4C,cAAcH,MAAMG;AAE1B,UAAMkR,SAASuH,qBAAqBvH,OAAO;AAAA,MACvC3K,MAAAA;AAAAA,MACA6L;AAAAA,MACApS,aAAaA,eAAepC;AAAAA,MAC5BiU,YAAAA;AAAAA,IAAAA,CACH;AAED,QAAI,CAACX,QAAQ;AACT,YAAMxQ,MAAM,kFAAkF;AAAA,IAClG;AAEAwQ,WAAOpP,KAAMiP,CAAAA,QAAQ;AACjB,UAAI,CAACA,OAAOA,IAAI1J,WAAW,GAAG;AAC1BqR,wBAAgB,CAAA;AAChBL,mBAAS,CAAA,CAAE;AAAA,MACf;AAEA,YAAMM,WAAwB,CAAA;AAC9B,YAAMC,uCAAuBC,IAAAA;AAC7BH,uBAAiB3H,OAAO,CAAA,GACnB9R,IAAK8Y,CAAAA,eAAa;AACf,eAAOK,aAAa;AAAA,UAChB7R,MAAAA;AAAAA,UACAwR,UAAAA;AAAAA,UACAM,UAAUA,CAACS,WAA+B;AACtC,gBAAIA,QAAQ5L,QAAQ;AAChB,kBAAI4L,OAAO3Z,MAAM,CAACyZ,iBAAiBvD,IAAIyD,OAAO3Z,EAAE,GAAG;AAC/CyZ,iCAAiBG,IAAID,OAAO3Z,EAAE;AAC9BwZ,yBAASlJ,KAAKqJ,MAAM;AACpBT,2BAASM,QAAQ;AAAA,cACrB;AAAA,YACJ,WAAWG,QAAQ3Z,IAAI;AACnByZ,+BAAiBI,OAAOF,OAAO3Z,EAAE;AACjCkZ,yBAAS,CAAC,GAAGM,SAASjD,OAAOrV,OAAKA,EAAElB,OAAO4Y,UAAQ,CAAC,CAAC;AAAA,YACzD;AAAA,UACJ;AAAA,QAAA,CACH;AAAA,MACL,CACA;AAAA,IACR,CAAC;AAED,WAAO,MAAM;AACTW,oBAAc1X,QAASiY,CAAAA,MAAMA,EAAAA,CAAG;AAAA,IACpC;AAAA,EAEJ,GAAG,CAAC7b,aAAagb,YAAY,CAAC;AAE9B,SAAO;AAAA,IACHlU,KAAK;AAAA,IAELgV;AAAAA,IAEAC,aAAaC,QAAQhc,WAAW;AAAA,IAEhCic,gBAAgBva,YAAY,OAAOqS,UAI7B;AACFjR,cAAQC,MAAM,+BAA+B2W,oBAAoB/W,SAASoR,MAAM5K,IAAI;AACpF,UAAI,CAACuQ,oBAAoB/W,SAAS;AAC9BG,gBAAQoZ,KAAK,mSAAmS;AAChT,eAAO;AAAA,MACX;AACA,UAAI;AACA,eAAOxC,oBAAoB/W,QAAQqR,KAAKD,KAAK;AAAA,MACjD,SAAS9Q,KAAG;AACRH,gBAAQE,MAAM,6CAA6CC,GAAC;AAC5D,eAAO;AAAA,MACX;AAAA,IACJ,GAAG,CAAA,CAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBLkZ,iBAAiBza,YAAY,OAAsC;AAAA,MAC/DyH,MAAAA;AAAAA,MACAmP,QAAAA;AAAAA,MACA5G,OAAAA;AAAAA,MACAqI,YAAAA;AAAAA,MACA/E,cAAAA;AAAAA,MACA6E,SAAAA;AAAAA,MACAC,OAAAA;AAAAA,MACA7K,YAAAA;AAAAA,IAAAA,MAEuB;AAEvB,YAAMwF,eAAaxF,cAAYwF;AAE/B,YAAM0G,iBAAehS;AAErBrG,cAAQC,MAAM,uBAAuB;AAAA,QACjCoG,MAAAA;AAAAA,QACAuI,OAAAA;AAAAA,QACA4G,QAAAA;AAAAA,QACAyB,YAAAA;AAAAA,QACAF,SAAAA;AAAAA,QACAC,OAAAA;AAAAA,MAAAA,CACH;AACD,YAAMhI,SAAQ8H,WAAWuB,gBAAc7C,UAAQuB,WAASC,SAAOC,cAAqCrI,SAAO+C,YAAU;AAErH,YAAMtM,WAAW,MAAM6J,QAAQF,MAAK;AACpC,aAAO3J,SAAS2G,KAAKjN,IAAKmN,CAAAA,SAAQ+L,yBAAyB/L,MAAKyF,YAAU,CAAC;AAAA,IAC/E,GAAG,CAACmF,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkBfwC,kBAAkB1a,YAAY,CAC1B;AAAA,MACIyH,MAAAA;AAAAA,MACAmP,QAAAA;AAAAA,MACA5G,OAAAA;AAAAA,MACAqI,YAAAA;AAAAA,MACA/E,cAAAA;AAAAA,MACA6E,SAAAA;AAAAA,MACAC,OAAAA;AAAAA,MACAmB,UAAAA;AAAAA,MACAC,SAAAA;AAAAA,MACAjM,YAAAA;AAAAA,IAAAA,MAES;AAEbnM,cAAQC,MAAM,wBAAwB;AAAA,QAClCoG,MAAAA;AAAAA,QACA6L,cAAAA;AAAAA,QACAtD,OAAAA;AAAAA,QACA4G,QAAAA;AAAAA,QACAyB,YAAAA;AAAAA,QACAF,SAAAA;AAAAA,QACAC,OAAAA;AAAAA,QACA7K,YAAAA;AAAAA,MAAAA,CACH;AAED,UAAI,CAACjP,aAAa;AACd,cAAMsD,MAAM,6CAA6C;AAAA,MAC7D;AAEA,YAAMmR,eAAaxF,cAAYwF;AAE/B,UAAIO,gBAAc;AACd,eAAOoG,kBAAqB;AAAA,UACxBjS,MAAAA;AAAAA,UACA6L,cAAAA;AAAAA,UACAiG,UAAAA;AAAAA,UACAxG,YAAAA;AAAAA,QAAAA,CACH;AAAA,MACL;AAEA,YAAM0G,iBAAehS;AACrBrG,cAAQC,MAAM,+BAA+B;AAAA,QACzCoG,MAAAA;AAAAA,QACAgS,cAAAA;AAAAA,MAAAA,CACH;AACD,YAAMrJ,UAAQ8H,WAAWuB,gBAAc7C,UAAQuB,WAASC,SAAOC,cAAqCrI,SAAO+C,YAAU;AACrH,aAAOE,WAAW7C,SACd;AAAA,QACI8C,MAAOzM,CAAAA,eAAa;AAChB,cAAI,CAAC6M,eACDiG,YAAS9S,WAAS2G,KAAKjN,IAAKmN,CAAAA,UAAQ+L,yBAAyB/L,OAAKyF,YAAU,CAAC,CAAC;AAAA,QACtF;AAAA,QACAzR,OAAOkY;AAAAA,MAAAA,CAEf;AAAA,IAEJ,GAAG,CAACtB,YAAY5Z,aAAaob,iBAAiB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAS/CiB,aAAa3a,YAAY,CAAgC;AAAA,MACrDyH,MAAAA;AAAAA,MACAwR,UAAAA;AAAAA,MACA1L,YAAAA;AAAAA,IAAAA,MAEiC;AACjC,YAAMkM,iBAAehS;AACrB,aAAOuR,kBAAkBS,gBAAcR,YAAU1L,cAAYwF,UAAU;AAAA,IAC3E,GAAG,CAACiG,iBAAiB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYtBM;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAaAsB,YAAY5a,YAAY,CACpB;AAAA,MACIyH,MAAAA;AAAAA,MACAwR,UAAAA;AAAAA,MACA7K,QAAQyM;AAAAA,MACRtN,YAAAA;AAAAA,MACAvC;AAAAA,IAAAA,MAC0C;AAE9C,UAAI,CAAC1M,YAAa,OAAMsD,MAAM,6CAA6C;AAE3ER,cAAQC,MAAM,KAAK;AAAA,QACfoG,MAAAA;AAAAA,QACAwR,UAAAA;AAAAA,QACA7K,QAAQyM;AAAAA,QACRtN,YAAAA;AAAAA,MAAAA,CACH;AACD,YAAMa,SAASyK,oBAAoBgC,YAAY3K,aAAa5R,WAAW,CAAC;AAExE8C,cAAQC,MAAM,KAAK;AAAA,QACfoG,MAAAA;AAAAA,QACAwR,UAAAA;AAAAA,QACA7K,QAAQyM;AAAAA,QACRtN,YAAAA;AAAAA,MAAAA,CACH;AACD,YAAMwF,eAAaxF,cAAYwF;AAC/B,YAAM9C,cAAY8C,eAAa7C,aAAa5R,aAAayU,YAAU,IAAI7C,aAAa5R,WAAW;AAG/F,YAAMga,wBAA2CC,WAAiBtI,aAAWxI,MAAI;AACjFrG,cAAQC,MAAM,iBAAiB;AAAA,QAC3BoG,MAAAA;AAAAA,QACAwR,UAAAA;AAAAA,QACA7K;AAAAA,QACA2E,YAAAA;AAAAA,MAAAA,CACH;AAED,UAAI+H;AACJ,UAAI7B,YAAU;AACV6B,4BAAoBxN,IAAIgL,uBAAqBhJ,OAAO2J,UAAQ,CAAC;AAAA,MACjE,OAAO;AACH6B,4BAAoBxN,IAAIgL,qBAAmB;AAAA,MAC/C;AACA,aAAOyC,OAAOD,mBAAmB1M,QAAQ;AAAA,QAAE4M,OAAO;AAAA,MAAA,CAAM,EACnDhY,KAAK,MAAM;AACR,eAAO;AAAA,UACH3C,IAAIya,kBAAkBza;AAAAA,UACtBoH,MAAAA;AAAAA,UACA2G,QAAQ6M,oBAAoB7M,MAAM;AAAA,QAAA;AAAA,MAE1C,CAAC,EACA3L,MAAOnB,CAAAA,UAAU;AACdF,gBAAQE,MAAM,uBAAuBA,KAAK;AAC1C,cAAMA;AAAAA,MAEV,CAAC;AAAA,IACT,GAAG,CAAChD,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQhB4c,cAAclb,YAAY,CACtB;AAAA,MACIga,QAAAA;AAAAA,IAAAA,MAEY;AAChB,UAAI,CAAC1b,YAAa,OAAMsD,MAAM,6CAA6C;AAE3E,YAAMmR,eAAaiH,SAAOjH;AAC1B,YAAM9C,cAAY8C,eAAa7C,aAAa5R,aAAayU,YAAU,IAAI7C,aAAa5R,WAAW;AAE/F,aAAO6c,UAAU7N,IAAI2C,aAAW+J,SAAOvS,MAAM6H,OAAO0K,SAAO3Z,EAAE,CAAC,CAAC;AAAA,IACnE,GAAG,CAAC/B,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYhB8c,kBAAkBpb,YAAY,OAC1ByH,QACAmC,MACAwF,SACA6J,YACA1L,iBACmB;AAEnB,UAAI,CAACjP,YAAa,OAAMsD,MAAM,6CAA6C;AAE3E,YAAMmR,eAAaxF,cAAYwF;AAC/B,YAAM9C,cAAY8C,eAAa7C,aAAa5R,aAAayU,YAAU,IAAI7C,aAAa5R,WAAW;AAE/F,UAAI8Q,YAAUtQ,UAAasQ,YAAU,MAAM;AACvC,eAAOtJ,QAAQC,QAAQ,IAAI;AAAA,MAC/B;AACA,YAAMoK,IAAIC,MAAMmI,WAAiBtI,aAAWxI,MAAI,GAAGmR,MAAYhP,MAAM,MAAMiP,oBAAoBzJ,SAAOa,WAAS,CAAC,CAAC;AACjH,YAAMxJ,aAAW,MAAM6J,QAAQH,CAAC;AAChC,aAAO1J,WAAS2G,KAAKwJ,OAAOtJ,CAAAA,UAAOA,MAAIjN,OAAO4Y,UAAQ,EAAE1Q,WAAW;AAAA,IAEvE,GAAG,CAACjK,WAAW,CAAC;AAAA,IAEhB+c,eAAerb,YAAY,OAAO;AAAA,MAC9ByH,MAAAA;AAAAA,MACAmP,QAAAA;AAAAA,MACAwB,OAAAA;AAAAA,MACAD,SAAAA;AAAAA,MACA5K,YAAAA;AAAAA,IAAAA,MAC8C;AAC9C,UAAI,CAACjP,YAAa,OAAMsD,MAAM,6CAA6C;AAC3E,YAAMmR,eAAaxF,cAAYwF;AAC/B,YAAM0G,iBAAehS;AACrB,YAAM2I,UAAQ8H,WAAWuB,gBAAc7C,UAAQuB,WAASC,SAAOtZ,QAAWA,QAAWiU,YAAU;AAC/F,YAAMtM,aAAW,MAAM6U,mBAAmBlL,OAAK;AAC/C,aAAO3J,WAAS4H,OAAOkN;AAAAA,IAC3B,GAAG,CAACjd,WAAW,CAAC;AAAA,IAEhBkd,0BAA0Bxb,YAAY,CAAC;AAAA,MACnCyH,MAAAA;AAAAA,MACA8F,YAAAA;AAAAA,MACAkO;AAAAA,MACAC;AAAAA,IAAAA,MAMW;AAEX,UAAI,CAACpd,YAAa,OAAMsD,MAAM,6CAA6C;AAI3E,UAAIkW,4BAA4BhZ,OAAW,QAAO;AAClD,YAAM2a,iBAAehS;AAErB,YAAMkL,UAAUmF,0BAA0B;AAAA,QACtCrQ,MAAMgS;AAAAA,QACNlM,YAAAA;AAAAA,MAAAA,CACH;AAED,YAAMoO,UAAUD,SAASA,OAAO,CAAC,IAAI5c;AACrC,YAAM8c,gBAAgBF,SAASA,OAAO,CAAC,IAAI5c;AAG3C,YAAMsP,WAAiCjH,OAAOiH,OAAOqN,YAAY;AAEjE,YAAMI,aAAa1U,OAAO0G,KAAK4N,YAAY;AAC3C,YAAMK,eAAeD,WAAWtT;AAEhC,UAAI,CAACoT,WAAWvN,SAAO2N,MAAOC,OAAMA,EAAE,CAAC,MAAM,IAAI,GAAG;AAChD,eAAO;AAAA,MACX;AAEA,UAAIF,iBAAiB,MAAM,CAACH,WAAWA,YAAYE,WAAW,CAAC,IAAI;AAC/D,eAAO;AAAA,MACX;AAEA,UAAI,CAAClJ,WAAWmJ,eAAe,GAAG;AAC9B,eAAO;AAAA,MACX;AAEA,aAAO,CAAC,CAACnJ,WAAWA,QACfiE,OAAQqF,CAAAA,mBAAmB,CAACN,WAAWA,WAAWM,cAAc,EAChEva,KAAMua,CAAAA,qBACH9U,OAAOgI,QAAQsM,YAAY,EAAEM,MAAM,CAAC,CAAC3W,OAAKgK,OAAK,MAAM6M,iBAAe7W,KAAG,MAAMtG,WAAc,CAAC8c,iBAAiBK,iBAAe7W,KAAG,MAAMwW,cAAc,CACvJ,MAAM9c;AAAAA,IACd,GAAG,CAACR,WAAW,CAAC;AAAA,EAAA;AAIxB;AAEA,MAAM+a,2BAA2B,CAC7B6C,SACAnJ,eACY;AACZ,QAAM3E,SAAS6M,oBAAoBiB,QAAQ7N,KAAAA,CAAM;AACjD,QAAM5G,OAAO0U,4BAA4BD,QAAQvW,IAAI8B,IAAI;AACzD,SAAO;AAAA,IACHpH,IAAI6b,QAAQ7b;AAAAA,IACZoH;AAAAA,IACA2G;AAAAA,IACA2E;AAAAA,EAAAA;AAER;AAYO,SAASkI,oBAAoB5M,MAAgB;AAChD,MAAIA,SAAS,QAAQA,SAASvP,OAAW,QAAO;AAChD,MAAIsd,YAAAA,EAAcC,QAAQhO,IAAI,GAAG;AAC7B,WAAOvP;AAAAA,EACX;AACA,MAAIwd,gBAAAA,EAAkBD,QAAQhO,IAAI,GAAG;AACjC,WAAO;AAAA,EACX;AACA,MAAIA,gBAAgBkO,aAAc,OAAOlO,KAAKmO,WAAW,cAAcnO,KAAKmO,OAAAA,aAAoBC,MAAO;AACnG,WAAOpO,KAAKmO,OAAAA;AAAAA,EAChB;AACA,MAAInO,gBAAgBoO,MAAM;AACtB,WAAOpO;AAAAA,EACX;AACA,MAAI,OAAOA,SAAS,YAAY,cAAcA,QAAQA,KAAKqO,aAAa,cAAc;AAClF,WAAOrO;AAAAA,EACX;AACA,MAAIA,gBAAgBsO,eAAgB,OAAOtO,SAAS,YAAYA,SAAS,QAAQ,OAAOA,KAAKuO,YAAY,cAAcvO,KAAKwO,aAAajT,SAAS,eAAgB;AAC9J,WAAO;AAAA,MAAE8S,UAAU;AAAA,MAC3BtN,OAAOf,KAAKuO,QAAAA;AAAAA,IAAQ;AAAA,EAChB;AAEA,MAAIvO,gBAAgByO,YAAmB;AACnC,WAAO,IAAIC,SAAS1O,KAAK2O,UAAU3O,KAAK4O,SAAS;AAAA,EACrD;AACA,MAAI5O,gBAAgB6O,mBAAmB;AAEnC,UAAMnK,aAAa1E,MAAM4B,WAAWkN,aAAaC;AACjD,WAAO,IAAIC,gBAAgB;AAAA,MAAEhd,IAAIgO,KAAKhO;AAAAA,MAC9CoH,MAAM0U,4BAA4B9N,KAAK5G,IAAI;AAAA,MAC3CsL;AAAAA,IAAAA,CAAY;AAAA,EACR;AACA,MAAI9D,MAAMC,QAAQb,IAAI,GAAG;AACrB,WAAOA,KAAKlO,IAAI8a,mBAAmB,EAAErE,OAAOoF,CAAAA,MAAKA,MAAMld,MAAS;AAAA,EACpE;AACA,MAAI,OAAOuP,SAAS,UAAU;AAC1B,UAAMvF,SAA8B,CAAA;AACpC,eAAW1D,OAAO+B,OAAO0G,KAAKQ,IAAI,GAAG;AACjC,YAAMiP,aAAarC,oBAAoB5M,KAAKjJ,GAAG,CAAC;AAChD,UAAIkY,eAAexe,OACfgK,QAAO1D,GAAG,IAAIkY;AAAAA,IACtB;AACA,WAAOxU;AAAAA,EACX;AACA,SAAOuF;AACX;AAMA,SAAS8N,4BAA4BoB,QAAwB;AACzD,MAAIC,KAAKD,OAAOE,YAAY,GAAG;AAC/BD,OAAKA,OAAO,KAAKD,OAAOhV,SAASiV;AACjC,SAAOD,OAAO9U,UAAU,GAAG+U,EAAE;AACjC;AAGO,SAAS3E,oBAAoBxK,MAAW4B,WAAsByN,UAAU,OAAY;AACvF,MAAIrP,SAASvP,QAAW;AACpB,WAAOsd,YAAAA;AAAAA,EACX,WAAW/N,SAAS,MAAM;AACtB,WAAO;AAAA,EACX,WAAWY,MAAMC,QAAQb,IAAI,GAAG;AAC5B,WAAOA,KAAKuI,OAAOoF,CAAAA,MAAKA,MAAMld,MAAS,EAAEqB,IAAI6b,CAAAA,MAAKnD,oBAAoBmD,GAAG/L,WAAW,IAAI,CAAC;AAAA,EAC7F,WAAW5B,KAAKsP,qBAAqBtP,KAAKsP,qBAAqB;AAC3D,UAAMC,kBAAkBvP,KAAK0E,aAAa7C,aAAaD,UAAUxF,KAAK4D,KAAK0E,UAAU,IAAI9C;AACzF,WAAO3C,IAAIsQ,iBAAiBvP,KAAK5G,MAAM4G,KAAKhO,EAAE;AAAA,EAClD,WAAWgO,QAAQ,OAAOA,SAAS,YAAYA,KAAKwP,WAAW,cAAcxP,KAAK5G,QAAQ4G,KAAKhO,IAAI;AAC/F,WAAOiN,IAAI2C,WAAW5B,KAAK5G,MAAM6H,OAAOjB,KAAKhO,EAAE,CAAC;AAAA,EACpD,WAAWgO,gBAAgB0O,UAAU;AACjC,WAAO,IAAID,WAAkBzO,KAAK2O,UAAU3O,KAAK4O,SAAS;AAAA,EAC9D,WAAW5O,gBAAgBoO,MAAM;AAC7B,WAAOF,UAAUuB,SAASzP,IAAI;AAAA,EAClC,WAAWA,QAAQ,OAAOA,SAAS,YAAY,cAAcA,QAAQA,KAAKqO,aAAa,cAAc;AACjG,WAAOqB,OAAO1P,KAAKe,SAAS,EAAE;AAAA,EAClC,WAAWf,QAAQ,OAAOA,SAAS,UAAU;AACzC,WAAOlH,OAAOgI,QAAQd,IAAI,EACrBlO,IAAI,CAAC,CAACiF,KAAK4W,CAAC,MAAM;AACf,YAAMgC,iBAAiBnF,oBAAoBmD,GAAG/L,SAAS;AACvD,UAAI+N,mBAAmBlf,OACnB,QAAQ;AAAA,QAAE,CAACsG,GAAG,GAAG4Y;AAAAA,MAAAA;AAAAA,kBAEV,CAAA;AAAA,IACf,CAAC,EACAvQ,OAAO,CAACC,GAAGC,OAAO;AAAA,MAAE,GAAGD;AAAAA,MACpC,GAAGC;AAAAA,IAAAA,IAAM,CAAA,CAAE;AAAA,EACP;AACA,SAAOU;AACX;AAEA,SAAS+L,cAAmB;AACxB,SAAOkC,gBAAAA;AACX;AAEA,SAASrE,yCAAyC;AAAA,EAC9CJ;AAAAA,EACAvZ;AAAAA,EACAyZ;AAKJ,GAA8C;AAC1C,MAAI,CAACF,+BAA+BE,wBAAwB;AACxD3W,YAAQC,MAAM,yBAAyB;AACvC,WAAOoR,6BAA6B;AAAA,MAAEnU;AAAAA,IAAAA,CAAa;AAAA,EACvD;AACA,MAAI,CAACyZ,0BAA0BF,6BAA6B;AACxDzW,YAAQC,MAAM,iCAAiC;AAC/C,WAAOwW,4BAA4B;AAAA,MAAEvZ;AAAAA,IAAAA,CAAa;AAAA,EACtD;AACA,MAAI,CAACuZ,+BAA+B,CAACE,wBAAwB;AACzD,WAAOjZ;AAAAA,EACX;AAEA,QAAMmf,wBAAwBxL,6BAA6B;AAAA,IAAEnU;AAAAA,EAAAA,CAAa;AAC1E,QAAMqb,uBAAuB9B,4BAA6B;AAAA,IAAEvZ;AAAAA,EAAAA,CAAa;AACzE,SAAO;AAAA,IACHgU,MAAM,OAAOD,UAIP;AACF,YAAM1E,IAAI,MAAMgM,qBAAqBrH,KAAKD,KAAK;AAC/C,UAAI1E,GAAG;AACHvM,gBAAQC,MAAM,iDAAiDgR,MAAM5K,IAAI;AACzE,eAAO;AAAA,MACX;AACA,UAAIsQ,uBACA,QAAOkG,sBAAsB3L,KAAKD,KAAK;AAC3C,aAAO;AAAA,IACX;AAAA,IACAD,QAAQ,OAAOC,UAKT;AACF,YAAMD,SAAS,MAAMuH,qBAAqBvH,OAAOC,KAAK;AACtD,aAAOD,UAAU,MAAM6L,sBAAsB7L,OAAOC,KAAK;AAAA,IAC7D;AAAA,EAAA;AAER;AC5vBO,SAAA6L,wBAAAC,IAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAAiC,QAAA;AAAA,IAAA/f;AAAAA,EAAAA,IAAA6f;AAA8C,MAAAG;AAAA,MAAAF,SAAA9f,aAAA;AAE9CggB,gBAAAC,QAAA;AAAsC,YAAA;AAAA,QAAA9W;AAAAA,QAAAuI,OAAAA;AAAAA,QAAAqI,YAAAA;AAAAA,MAAAA,IAAAkG;AAQhD,UAAA,CACjBjgB,aAAW;AAAA,cAAA,IAAAsD,MACI,2BAA2B;AAAA,MAAA;AAE/C,YAAAwb,WAAiBoB,YAAYlgB,WAAW;AAExC,UAAAmgB,UAAcrO,QAAMzK,MAAIyX,UAAU3V,IAAI,CAAC;AAAE,UAGrC4Q,gBAAUvZ,QAAc;AACxB2f,kBAAUA,QAAMA,SAASC,WAAAA,GAAcC,QAAQrP,OAAO+I,WAAU,CAAC,CAAC;AAAA,MAA3D;AAAA,UAEPrI,WAAKlR,QAAc;AACnB2f,kBAAUA,QAAMA,SAASG,aAAa5O,MAAK,CAAC;AAAA,MAArC;AAGX,YAAAvJ,WAAA,MAAuB+P,IAAIiI,OAAO;AAAE,UAChChY,SAAQ2S,UAAS;AAAA,eACVjS,OAAAgI,QAAe1I,SAAQoY,IAAAA,CAAM,EAAC1e,IAAA2e,CAAAA,QAAA;AAAM,gBAAA,CAAAze,IAAA+N,MAAA,IAAA0Q;AAAY,iBAAA;AAAA,YAAAze;AAAAA,YAAAoH;AAAAA,YAAA2G,QAG3C2Q,mBAAmB3Q,MAAM;AAAA,UAAA;AAAA,QAAM,CACzC;AAAA,MAAC;AAAA,aAAA,CAAA;AAAA,IAAA;AAGVgQ,WAAA9f;AAAA8f,WAAAE;AAAAA,EAAA,OAAA;AAAAA,SAAAF,EAAA,CAAA;AAAA,EAAA;AAjCD,QAAA3D,kBAAwB6D;AAiCN,MAAAC;AAAA,MAAAH,SAAA9f,aAAA;AAEmBigB,SAAAO,CAAAA,QAAA;AAAgC,YAAA;AAAA,QAAArX,MAAAuX;AAAAA,QAAAzF;AAAAA,MAAAA,IAAAuF;AAI1C,UAAA,CAClBxgB,aAAW;AAAA,cAAA,IAAAsD,MACI,2BAA2B;AAAA,MAAA;AAE/C,YAAAqd,aAAiBT,YAAYlgB,WAAW;AAExC,YAAA4gB,QAAcvZ,MAAIyX,YAAU3V,MAAI;AAChC,YAAA0X,cAAoBC,QAAQF,OAAKG,CAAAA,eAAA;AAAA,YACzB5Y,WAAQ2S,UAAS;AACjB,gBAAAtQ,SAA4B3B,OAAAgI,QAAe1I,WAAQoY,KAAM,EAAC1e,IAAAmf,CAAAA,QAAA;AAAM,kBAAA,CAAAC,MAAAC,QAAA,IAAAF;AAAY,mBAAA;AAAA,cAAAjf,IACxEA;AAAAA,cAAEoH,MACIA;AAAAA,cAAI2G,QACF2Q,mBAAmB3Q,QAAM;AAAA,YAAA;AAAA,UAAM,CACzC;AACFmL,mBAASzQ,MAAM;AAAA,QAAC,OAAA;AAEhByQ,qBAAW;AAAA,QAAC;AAAA,MAAA,CAEnB;AAAE,aAAA,MAEU4F,YAAAA;AAAAA,IAAa;AAC7Bf,WAAA9f;AAAA8f,WAAAG;AAAAA,EAAA,OAAA;AAAAA,SAAAH,EAAA,CAAA;AAAA,EAAA;AAzBD,QAAA1D,mBAAyB6D;AAyBP,MAAAO;AAAA,MAAAV,SAAA9f,aAAA;AAEcwgB,gBAAAQ,QAAA;AAAsC,YAAA;AAAA,QAAA7X,MAAAgY;AAAAA,QAAAxG;AAAAA,MAAAA,IAAAqG;AAGhD,UAAA,CACbhhB,aAAW;AAAA,cAAA,IAAAsD,MACI,2BAA2B;AAAA,MAAA;AAE/C,YAAA8d,aAAiBlB,YAAYlgB,WAAW;AAExC,YAAAqhB,aAAA,MAAuBnJ,IAAI7Q,MAAIyX,YAAU,GAAG3V,MAAI,IAAIwR,QAAQ,EAAE,CAAC;AAAE,UAC7DxS,WAAQ2S,UAAS;AAAA,eAAA;AAAA,UAAA/Y,IAET4Y;AAAAA,UAAQxR,MACNA;AAAAA,UAAI2G,QACF2Q,mBAAmBtY,WAAQoY,IAAAA,CAAM;AAAA,QAAA;AAAA,MAAM;AAAA,IAAA;AAI1DT,WAAA9f;AAAA8f,WAAAU;AAAAA,EAAA,OAAA;AAAAA,SAAAV,EAAA,CAAA;AAAA,EAAA;AAlBD,QAAAzD,cAAoBmE;AAkBF,MAAAQ;AAAA,MAAAlB,SAAA9f,aAAA;AAEeghB,SAAAM,CAAAA,QAAA;AAAgC,YAAA;AAAA,QAAAnY,MAAAoY;AAAAA,QAAA5G,UAAA6G;AAAAA,QAAAvG,UAAAwG;AAAAA,QAAAvG;AAAAA,MAAAA,IAAAoG;AAK1C,UAAA,CACdthB,aAAW;AAAA,cAAA,IAAAsD,MACI,2BAA2B;AAAA,MAAA;AAE/C,YAAAoe,aAAiBxB,YAAYlgB,WAAW;AAExC,YAAA2hB,UAActa,MAAIyX,YAAU,GAAG3V,MAAI,IAAIwR,UAAQ,EAAE;AACjD,YAAAiH,gBAAoBd,QAAQF,SAAKiB,CAAAA,eAAA;AAAA,YACzB1Z,WAAQ2S,UAAS;AACjBG,qBAAQ;AAAA,YAAAlZ,IACA4Y;AAAAA,YAAQxR,MACZA;AAAAA,YAAI2G,QACI2Q,mBAAmBtY,WAAQoY,IAAAA,CAAM;AAAA,UAAA,CAC5C;AAAA,QAAC,OAAA;AAEFrF,oBAAO,IAAA5X,MAAa,uBAAuB,CAAA;AAAA,QAAA;AAAA,MAAA,CAElD;AAAE,aAAA,MAEUud,cAAAA;AAAAA,IAAa;AAC7Bf,WAAA9f;AAAA8f,WAAAkB;AAAAA,EAAA,OAAA;AAAAA,SAAAlB,EAAA,CAAA;AAAA,EAAA;AAzBD,QAAA9E,eAAqBgG;AAyBH,MAAAM;AAAA,MAAAxB,SAAA9f,aAAA;AAEashB,gBAAAQ,QAAA;AAAsC,YAAA;AAAA,QAAA3Y,MAAA4Y;AAAAA,QAAApH,UAAAqH;AAAAA,QAAAlS,QAAAmS;AAAAA,MAAAA,IAAAH;AAIhD,UAAA,CACZ9hB,aAAW;AAAA,cAAA,IAAAsD,MACI,2BAA2B;AAAA,MAAA;AAE/C,YAAA4e,aAAiBhC,YAAYlgB,WAAW;AAGxC,YAAAmiB,UAAgBxH,cAAYtI,KAAKhL,MAAIyX,YAAU3V,MAAI,CAAC,EAACrC;AAAK,UAAA,CACrDqb,SAAO;AAAA,cAAA,IAAA7e,MACQ,6BAA6B;AAAA,MAAA;AAIjD,YAAA8e,oBAA0BC,eAAevS,UAAQgP,UAAQ;AAAE,YACrDlG,IAAIvR,MAAIyX,YAAU,GAAG3V,MAAI,IAAIgZ,OAAO,EAAE,GAAGC,iBAAiB;AAAC,aAAA;AAAA,QAAArgB,IAGzDogB;AAAAA,QAAOhZ,MACLA;AAAAA,QAAI2G,QACFA;AAAAA,MAAAA;AAAAA,IAAW;AAE1BgQ,WAAA9f;AAAA8f,WAAAwB;AAAAA,EAAA,OAAA;AAAAA,SAAAxB,EAAA,CAAA;AAAA,EAAA;AAzBD,QAAAxD,aAAmBgF;AAyBD,MAAAQ;AAAA,MAAAhC,UAAA9f,aAAA;AAEe8hB,gBAAAQ,QAAA;AAAsC,YAAA;AAAA,QAAA5G;AAAAA,MAAAA,IAAA4G;AAEhD,UAAA,CACdtiB,aAAW;AAAA,cAAA,IAAAsD,MACI,2BAA2B;AAAA,MAAA;AAE/C,YAAAif,aAAiBrC,YAAYlgB,WAAW;AAAE,YAEpCsO,OAAOjH,MAAIyX,YAAU,GAAGpD,OAAMvS,IAAA,IAASuS,OAAM3Z,EAAA,EAAK,CAAC;AAAA,IAAC;AAC7D+d,YAAA9f;AAAA8f,YAAAgC;AAAAA,EAAA,OAAA;AAAAA,SAAAhC,EAAA,EAAA;AAAA,EAAA;AATD,QAAAlD,eAAqBkF;AASH,MAAAQ;AAAA,MAAAxC,UAAA9f,aAAA;AAGmBsiB,SAAA,OAAAhS,MAAAhF,MAAAwF,OAAA0R,eAAA;AAAA,UAAA,CAC5BxiB,aAAW;AAAA,cAAA,IAAAsD,MACI,2BAA2B;AAAA,MAAA;AAE/C,YAAAmf,aAAiBvC,YAAYlgB,WAAW;AAGxC,YAAA0iB,UAAc5Q,QAAMzK,MAAIyX,YAAUxO,IAAI,GAAGqS,aAAarX,IAAI,GAAG+U,QAAQvP,KAAK,GAAGwP,aAAA,CAAc,CAAC;AAC5F,YAAAsC,aAAA,MAAuB1K,IAAI0I,OAAK;AAAE,UAAA,CAE7BzY,WAAQ2S,UAAS;AAAA,eAAA;AAAA,MAAA;AAKtB,YAAA,CAAAhU,KAAA+b,WAAA,IAA2Bha,OAAAgI,QAAe1I,WAAQoY,KAAM,EAAC,CAAA;AAAI,UACzDsC,eAAe,OAAOA,gBAAgB,YAAaA,YAAwCvX,IAAI,MAAMwF,SAAShK,QAAQ6T,YAAQ;AAAA,eAAA;AAAA,MAAA;AAAA,aAAA;AAAA,IAAA;AAKrImF,YAAA9f;AAAA8f,YAAAwC;AAAAA,EAAA,OAAA;AAAAA,SAAAxC,EAAA,EAAA;AAAA,EAAA;AArBD,QAAAhD,mBAAyBwF;AAuBzB,QAAApF,2BAAA4F;AAMO,MAAAC;AAAA,MAAAjD,EAAA,EAAA,MAAAhD,oBAAAgD,EAAA,EAAA,MAAAlD,gBAAAkD,EAAA,EAAA,MAAA3D,mBAAA2D,UAAAzD,eAAAyD,EAAA,EAAA,MAAA1D,oBAAA0D,EAAA,EAAA,MAAA9E,gBAAA8E,EAAA,EAAA,MAAAxD,YAAA;AAEAyG,SAAA;AAAA,MAAAjc,KACE;AAAA,MAAeqV;AAAAA,MAAAC;AAAAA,MAAAC;AAAAA,MAAArB;AAAAA,MAAAsB;AAAAA,MAAAM;AAAAA,MAAAE;AAAAA,MAAAI;AAAAA,MAAApB,aAAAkH;AAAAA,IAAAA;AAUvBlD,YAAAhD;AAAAgD,YAAAlD;AAAAkD,YAAA3D;AAAA2D,YAAAzD;AAAAyD,YAAA1D;AAAA0D,YAAA9E;AAAA8E,YAAAxD;AAAAwD,YAAAiD;AAAAA,EAAA,OAAA;AAAAA,SAAAjD,EAAA,EAAA;AAAA,EAAA;AAAA,SAXMiD;AAWN;AAhME,SAAAC,WAAA;AAAA,6BAAA7E,KAAAA;AAAA;AAAA,SAAA2E,QAAAjD,IAAA;AAAA,SAAA;AAAA;AAwMP,SAASY,mBAAmB1Q,MAAgB;AACxC,MAAIA,SAAS,QAAQA,SAASvP,OAAW,QAAO;AAEhD,MAAImQ,MAAMC,QAAQb,IAAI,GAAG;AACrB,WAAOA,KAAKlO,IAAI4e,kBAAkB,EAAEnI,OAAOoF,CAAAA,MAAKA,MAAMld,MAAS;AAAA,EACnE;AAEA,MAAI,OAAOuP,SAAS,UAAU;AAC1B,UAAMvF,SAA8B,CAAA;AACpC,eAAW1D,OAAO+B,OAAO0G,KAAKQ,IAAI,GAAG;AACjC,YAAMiP,aAAayB,mBAAmB1Q,KAAKjJ,GAAG,CAAC;AAC/C,UAAIkY,eAAexe,OACfgK,QAAO1D,GAAG,IAAIkY;AAAAA,IACtB;AACA,WAAOxU;AAAAA,EACX;AAEA,SAAOuF;AACX;AAMA,SAASsS,eAAetS,MAAW+O,UAAyB;AACxD,MAAI/O,SAASvP,QAAW;AACpB,WAAO;AAAA,EACX,WAAWuP,SAAS,MAAM;AACtB,WAAO;AAAA,EACX,WAAWY,MAAMC,QAAQb,IAAI,GAAG;AAC5B,WAAOA,KAAKuI,OAAOoF,CAAAA,MAAKA,MAAMld,MAAS,EAAEqB,IAAI6b,CAAAA,MAAK2E,eAAe3E,GAAGoB,QAAQ,CAAC;AAAA,EACjF,WAAW/O,KAAKsP,qBAAqBtP,KAAKsP,qBAAqB;AAC3D,WAAOhY,MAAIyX,UAAU,GAAG/O,KAAKO,IAAI,IAAIP,KAAKhO,EAAE,EAAE;AAAA,EAClD,WAAWgO,gBAAgBoO,MAAM;AAE7B,WAAOpO,KAAKkT,YAAAA;AAAAA,EAChB,WAAWlT,QAAQ,OAAOA,SAAS,UAAU;AACzC,WAAOlH,OAAOgI,QAAQd,IAAI,EACrBlO,IAAI,CAAC,CAACiF,KAAK4W,CAAC,MAAM;AACf,YAAMwF,YAAYb,eAAe3E,GAAGoB,QAAQ;AAC5C,UAAIoE,cAAc1iB,OACd,QAAO;AAAA,QAAE,CAACsG,GAAG,GAAGoc;AAAAA,MAAAA;AAAAA,kBAET,CAAA;AAAA,IACf,CAAC,EACA/T,OAAO,CAACC,GAAGC,OAAO;AAAA,MAAE,GAAGD;AAAAA,MACpC,GAAGC;AAAAA,IAAAA,IAAM,CAAA,CAAE;AAAA,EACP;AACA,SAAOU;AACX;ACnQO,MAAMoT,yBAAyB;AAE/B,SAAAC,eAAA;AAAA,QAAAtD,IAAAC,EAAA,CAAA;AAAA,MAAAF;AAAA,MAAAC,EAAA,CAAA,MAAAuD,uBAAAC,IAAA,2BAAA,GAAA;AAaAzD,SAAA,CAAA;AAAEC,WAAAD;AAAAA,EAAA,OAAA;AAAAA,SAAAC,EAAA,CAAA;AAAA,EAAA;AAZLtd,YAAAsgB,SAYGjD,EAAE;AAAC,SAAA;AAAA;AAbH,SAAAiD,UAAA;AAAA,MAEK,CAAA5V,UAAAA,QAAAqW,mBAAoC;AAAA;AAAA,EAAA;AAExC,QAAA9gB,OAAaC,QAAAA;AAAUwK,SAAAqW,oBAAA,IAAAC,kBAGnB/gB,MAAI0gB,wBAAA;AAAA,IAAAM,MAGM;AAAA,EAAA,CAAW;AAAA;ACgD1B,SAASC,uBAEf;AAAA,EACIC;AAAAA,EACAC;AAAAA,EACAjiB,OAAOkiB;AAAAA,EACPC,YAAY;AAAA,EACZC,YAAY;AAAA,EACZC;AAAAA,EACAC;AACsC,GAA8C;AAErF,MAAI,CAACN,gBAAgB;AACjB,UAAMrgB,MAAM,qJAAqJ;AAAA,EACrK;AAEA,QAAM4gB,sBAAsBL,aAAa,CAAA,IAAK5Z,SAAS;AACvD,QAAM,CAACka,cAAcC,eAAe,IAAI9W,MAAM/M,SAAkB,CAAC2jB,kBAAkB;AACnF,QAAM,CAACG,cAAcC,eAAe,IAAIhX,MAAM/M,SAAkB,IAAI;AACpE,QAAM,CAACoB,OAAO4iB,QAAQ,IAAIjX,MAAM/M,SAAiBsjB,aAAa,EAAE;AAChE,QAAM,CAACW,kBAAkBC,mBAAmB,IAAInX,MAAM/M,SAAkC,CAAA,CAAE;AAE1F,QAAMmkB,QAAQF,iBAAiB3iB,IAAI8iB,CAAAA,OAAM;AAAA,IACrC,GAAGA;AAAAA,EAAAA,EACc;AAErB,QAAM,CAACC,YAAYC,aAAa,IAAIvX,MAAM/M,SAAAA;AAC1C,QAAM,CAACukB,YAAYC,aAAa,IAAIzX,MAAM/M,SAAAA;AAE1C,QAAMykB,gBAAgBX;AACtB,QAAMY,gBAAgBd;AAEtB,QAAMpkB,UAAUklB,iBAAiBD;AAEjCxiB,YAAU,MAAM;AACZ,QAAI0hB,mBAAoB;AACxB,QAAI,CAACN,sBAAsB,CAACG,UAAW;AACvC,QAAIH,mBAAmB7H,gBAAgBvb,UAAa,CAACojB,mBAAmB7H,YAAa;AACrF,QAAI4H,gBAAgB9iB,eAAgB;AAEpCujB,oBAAgB,IAAI;AACpB,WAAOR,mBAAmBxH,mBAAmB;AAAA,MACzCjT,MAAM4a;AAAAA,MACN9I,SAASM,UAA+B;AACpCsJ,sBAAcrkB,MAAS;AACvBsC,gBAAQC,MAAM,kBAAkBwY,QAAQ;AACxC,YAAI;AACA,gBAAM2J,WAAWC,cAAc5J,QAAQ;AACvC,cAAI,CAACtZ,MAAMijB,UAAUvjB,KAAK,GAAG;AACzB4iB,qBAASW,QAAQ;AAAA,UACrB;AAAA,QACJ,SAASjiB,GAAG;AACRshB,mBAAS,CAAA,CAAE;AACXzhB,kBAAQE,MAAM,uBAAuBC,CAAC;AACtC4hB,wBAAc5hB,CAAU;AAAA,QAC5B;AACAmhB,wBAAgB,KAAK;AAAA,MACzB;AAAA,MACAlJ,QAAQjY,KAAc;AAClBshB,iBAAS,CAAA,CAAE;AACXzhB,gBAAQE,MAAM,uBAAuBC,GAAC;AACtC4hB,sBAAc5hB,GAAC;AACfmhB,wBAAgB,KAAK;AAAA,MACzB;AAAA,IAAA,CACH;AAAA,EAEL,GAAG,CAACF,oBAAoBN,oBAAoB7H,aAAa4H,gBAAgB9iB,gBAAgB8iB,gBAAgBthB,MAAM+iB,KAAKrB,SAAS,CAAC;AAE9HvhB,YAAU,MAAM;AACZ,QAAI,CAACohB,sBAAsB,CAACE,UAAW;AACvC,QAAIF,mBAAmB7H,gBAAgBvb,UAAa,CAACojB,mBAAmB7H,aAAa;AACjF;AAAA,IACJ;AACA,QAAI4H,gBAAgB9iB,gBAAgB;AAChC;AAAA,IACJ;AAEAyjB,oBAAgB,IAAI;AACpB,WAAOV,mBAAmBxH,mBAAmB;AAAA,MACzCjT,MAAM2a;AAAAA,MACN7I,SAASM,YAA+B;AACpCzY,gBAAQC,MAAM,kBAAkBwY,UAAQ;AACxCwJ,sBAAcvkB,MAAS;AACvB,YAAI;AACA,gBAAM6kB,WAAWC,gBAAgB/J,UAAQ;AAEzCkJ,8BAAoBY,QAAQ;AAAA,QAChC,SAASpiB,KAAG;AACRwhB,8BAAoB,CAAA,CAAE;AACtB3hB,kBAAQE,MAAM,uBAAuBC,GAAC;AACtC8hB,wBAAc9hB,GAAU;AAAA,QAC5B;AACAqhB,wBAAgB,KAAK;AAAA,MACzB;AAAA,MACApJ,QAAQjY,KAAc;AAClBH,gBAAQE,MAAM,uBAAuBC,GAAC;AACtCwhB,4BAAoB,CAAA,CAAE;AACtBM,sBAAc9hB,GAAC;AACfqhB,wBAAgB,KAAK;AAAA,MACzB;AAAA,IAAA,CACH;AAAA,EAEL,GAAG,CAACV,oBAAoB7H,aAAa4H,gBAAgB9iB,gBAAgB8iB,gBAAgBthB,MAAM+iB,KAAKtB,SAAS,CAAC;AAE1G,QAAMyB,WAAW7jB,YAAY,OAAOW,SAA8B;AAC9D,QAAI,CAACuhB,mBAAoB,OAAMtgB,MAAM,iDAAiD;AACtF,QAAI,CAACwgB,UAAW,OAAMxgB,MAAM,kDAAkD;AAE9ER,YAAQC,MAAM,mBAAmBV,IAAI;AAErC,UAAMmjB,UAAUnjB,KAAKV;AACrB,UAAM4C,QAAQlC,KAAKkC,OAAOmE,YAAAA,EAAc+c,KAAAA;AACxC,QAAI,CAAClhB,MAAO,OAAMjB,MAAM,mBAAmB;AAE3C,UAAMoiB,aAAahB,MAAMthB,KAAKuhB,CAAAA,QAAKA,IAAEpgB,OAAOmE,YAAAA,MAAkBnE,KAAK;AACnE,UAAMwL,OAAO;AAAA,MACT,GAAG1N;AAAAA,MACHV,OAAO6jB,WAAW,CAAA;AAAA,IAAA;AAEtB,QAAI,CAACE,YAAY;AAEb3V,WAAK4V,iCAAiBxH,KAAAA;AAAAA,IAC1B;AAEA,QAAIuH,cAAcA,WAAWN,QAAQ/iB,KAAK+iB,KAAK;AAC3C,YAAM1J,SAAsB;AAAA,QACxB5L,QAAQ,CAAA;AAAA,QACR3G,MAAM2a;AAAAA,QACN/hB,IAAI2jB,WAAWN;AAAAA,MAAAA;AAEnB,YAAMxB,mBAAmBhH,aAAa;AAAA,QAAElB;AAAAA,MAAAA,CAAQ,EAC3ChX,KAAK,MAAM;AACR5B,gBAAQC,MAAM,yBAAyB2iB,UAAU;AAAA,MACrD,CAAC,EACAvhB,MAAMlB,CAAAA,QAAK;AACRH,gBAAQE,MAAM,uBAAuBC,GAAC;AAAA,MAC1C,CAAC;AAAA,IAET;AAEA,WAAO2gB,mBAAmBtH,WAAW;AAAA,MACjC5P,QAAQ;AAAA,MACRvD,MAAM2a;AAAAA,MACNnJ,UAAUpW;AAAAA,MACVuL,QAAQ8V,gBAAgB7V,IAAI;AAAA,IAAA,CAC/B,EAAErL,KAAK,MAAMrC,IAAI;AAAA,EACtB,GAAG,CAACyhB,WAAWF,oBAAoB7H,WAAW,CAAC;AAE/C,QAAM8J,WAAWnkB,YAAY,CAACokB,SAA8B;AACxD,QAAI,CAAClC,mBAAoB,OAAMtgB,MAAM,iDAAiD;AACtF,QAAI,CAACygB,UAAW,OAAMzgB,MAAM,kDAAkD;AAC9ER,YAAQC,MAAM,mBAAmB+iB,IAAI;AACrC,UAAM;AAAA,MACF/jB;AAAAA,MACA,GAAGgkB;AAAAA,IAAAA,IACHD;AACJ,WAAOlC,mBAAmBtH,WAAW;AAAA,MACjC5P,QAAQ;AAAA,MACRvD,MAAM4a;AAAAA,MACNpJ,UAAU5Y;AAAAA,MACV+N,QAAQ8V,gBAAgBG,QAAQ;AAAA,IAAA,CACnC,EAAErhB,KAAK,MAAM;AACV;AAAA,IACJ,CAAC;AAAA,EACL,GAAG,CAACqf,WAAWH,oBAAoB7H,WAAW,CAAC;AAE/C,QAAMiK,aAAatkB,YAAY,OAAOW,WAA8B;AAChE,QAAI,CAACuhB,mBAAoB,OAAMtgB,MAAM,iDAAiD;AACtF,QAAI,CAACwgB,UAAW,OAAMxgB,MAAM,kDAAkD;AAC9ER,YAAQC,MAAM,YAAYV,MAAI;AAC9B,UAAM;AAAA,MAAE+iB;AAAAA,IAAAA,IAAQ/iB;AAChB,UAAMqZ,WAAsB;AAAA,MACxBvS,MAAM2a;AAAAA,MACN/hB,IAAIqjB;AAAAA,MACJtV,QAAQ,CAAA;AAAA,IAAC;AAEb,UAAM8T,mBAAmBhH,aAAa;AAAA,MAAElB,QAAAA;AAAAA,IAAAA,CAAQ;AAAA,EACpD,GAAG,CAACoI,WAAWF,oBAAoB7H,WAAW,CAAC;AAE/C,QAAMkK,aAAavkB,YAAY,OAAOokB,WAA8B;AAChE,QAAI,CAAClC,mBAAoB,OAAMtgB,MAAM,iDAAiD;AACtF,QAAI,CAACygB,UAAW,OAAMzgB,MAAM,kDAAkD;AAC9ER,YAAQC,MAAM,YAAY+iB,MAAI;AAC9B,UAAM;AAAA,MAAE/jB,IAAAA;AAAAA,IAAAA,IAAO+jB;AACf,UAAMpK,WAAsB;AAAA,MACxBvS,MAAM4a;AAAAA,MACNhiB,IAAIA;AAAAA,MACJ+N,QAAQ,CAAA;AAAA,IAAC;AAEb,UAAM8T,mBAAmBhH,aAAa;AAAA,MAAElB,QAAAA;AAAAA,IAAAA,CAAQ;AAAA,EACpD,GAAG,CAACqI,WAAWH,oBAAoB7H,WAAW,CAAC;AAI/C,QAAM3b,iBAAuDsB,YAAaW,CAAAA,WAAS;AAC/E,QAAI,CAACmiB,iBAAkB,OAAMlhB,MAAM,kBAAkB;AACrD,UAAM4iB,WAAW1B,iBAAiBphB,KAAKuhB,CAAAA,QAAKA,IAAEpgB,OAAOmE,YAAAA,MAAkBrG,QAAMkC,OAAOmE,YAAAA,CAAa;AACjG,QAAI,CAACwd,YAAY,CAACA,SAASvkB,MAAO,QAAOnB;AACzC,WAAOmB,MAAM2W,OAAOxW,CAAAA,MAAKokB,SAASvkB,MAAMgH,SAAS7G,EAAEC,EAAE,CAAC;AAAA,EAC1D,GAAG,CAACJ,OAAO6iB,gBAAgB,CAAC;AAE5B,QAAM2B,gBAAqCzkB,YAAY,CAAC;AAAA,IAAEW,MAAAA;AAAAA,EAAAA,MAAW;AAEjE,QAAItC,SAAS;AACT,aAAO;AAAA,IACX;AACA,QAAIsC,WAAS,MAAM;AACfS,cAAQoZ,KAAK,yBAAyB;AACtC,aAAO;AAAA,IACX;AAEA,QAAIwI,MAAMza,WAAW,GAAG;AACpBnH,cAAQoZ,KAAK,sBAAsB;AACnC,aAAO;AAAA,IACX;AAEA,UAAMgK,aAAWxB,MAAMthB,KAAKuhB,CAAAA,QAAKA,IAAEpgB,OAAOmE,YAAAA,MAAkBrG,QAAMkC,OAAOmE,YAAAA,CAAa;AACtF,QAAIwd,YAAU;AAEV,YAAME,iBAAiBF,WAASd,QAAQ/iB,OAAK+iB;AAC7C,YAAMiB,mBAAmBhkB,OAAKikB,YAAYJ,WAASI,aAAajkB,OAAKikB;AAErE,UAAIF,kBAAkBC,kBAAkB;AACpC,cAAME,eAAeH,iBAAiB,QAAQ;AAC9CtjB,gBAAQC,MAAM,QAAQwjB,YAAY,uDAAuD;AACzFhB,iBAAS;AAAA,UACL,GAAGW;AAAAA,UACHd,KAAK/iB,OAAK+iB;AAAAA,UACV,GAAIiB,mBAAmB;AAAA,YAAEC,UAAUjkB,OAAKikB;AAAAA,UAAAA,IAAa,CAAA;AAAA,QAAC,CACzD,EAAE5hB,KAAK,MAAM;AACV5B,kBAAQC,MAAM,0CAA0CmjB,UAAQ;AAAA,QACpE,CAAC,EAAE/hB,MAAMlB,CAAAA,QAAK;AACVH,kBAAQE,MAAM,iDAAiDC,GAAC;AAAA,QACpE,CAAC;AAAA,MACL;AACAH,cAAQC,MAAM,wCAAwCmjB,UAAQ;AAC9D,aAAO;AAAA,IACX;AAEA,UAAM5iB,MAAM,8EAA8E;AAAA,EAC9F,GAAG,CAACvD,SAAS2kB,KAAK,CAAC;AAEnB,QAAMrjB,YAAYsiB,eAAethB,OAAOjC,eAAeujB,eAAethB,IAAI,IAAI7B;AAC9E,QAAMgmB,WAAWnlB,aAAa,IAAIolB,KAAK3kB,CAAAA,QAAKA,IAAEC,OAAO,OAAO;AAE5D,QAAM2kB,cAAcrlB,WAAWQ,IAAIC,CAAAA,QAAKA,IAAEC,EAAE;AAC5CS,YAAU,MAAM;AACZM,YAAQC,MAAM,sBAAsB;AAAA,MAChC1B;AAAAA,MACAM;AAAAA,IAAAA,CACH;AACDgiB,mBAAeliB,eAAeJ,aAAa,EAAE;AAAA,EACjD,GAAG,CAACqlB,WAAW,CAAC;AAEhB,QAAMC,UAAUjlB,YAAY,CAAC0jB,UAA6B;AACtD,QAAI,CAACV,MAAO,QAAO;AACnB,UAAMriB,SAAOqiB,MAAMthB,KAAKuhB,CAAAA,QAAKA,IAAES,QAAQA,KAAG;AAC1C,WAAO/iB,UAAQ;AAAA,EACnB,GAAG,CAACqiB,KAAK,CAAC;AAEV,SAAO;AAAA,IACH3kB;AAAAA,IACA4B;AAAAA,IACA+iB;AAAAA,IACAa;AAAAA,IACAM;AAAAA,IACAjB;AAAAA,IACAoB;AAAAA,IACAC;AAAAA,IACAnB;AAAAA,IACA0B;AAAAA,IACAxC,2BAA2BA,8BAA8BxjB,SAAY,OAAOwjB;AAAAA,IAC5EC,oCAAoCjI,QAAQiI,kCAAkC;AAAA,IAC9E7jB;AAAAA,IACA+lB;AAAAA,IACA,GAAGxC;AAAAA,IACH9iB,gBAAgB8iB,eAAe9iB,kBAAkBd;AAAAA,IACjDsB;AAAAA,IACAslB;AAAAA,IACAtkB,MAAMshB,eAAethB,OAAO;AAAA,MACxB,GAAGshB,eAAethB;AAAAA,MAClBV,OAAON;AAAAA,IAAAA,IACP;AAAA,EAAA;AAEZ;AAEA,MAAMikB,kBAAkBA,CAACxW,SAAqE;AAC1F,SAAOA,KAAKjN,IAAKmN,CAAAA,SAAQ;AACrB,UAAMe,OAAOf,KAAIc;AACjB,UAAM8W,SAAS;AAAA,MACXxB,KAAKpW,KAAIjN;AAAAA,MACT,GAAGgO;AAAAA,MACH4V,YAAY5V,MAAM4V;AAAAA,MAClBkB,YAAY9W,MAAM8W;AAAAA,IAAAA;AAEtB,WAAOD;AAAAA,EACX,CAAC;AACL;AAEA,MAAMzB,gBAAgBA,CAAC5J,aAAiD;AACpE,SAAOA,SAAS1Z,IAAKmN,CAAAA,UAAS;AAAA,IAC1BjN,IAAIiN,KAAIjN;AAAAA,IACR,GAAGiN,KAAIc;AAAAA,EAAAA,EACD;AACd;ACrXO,MAAMgX,aAAaA,CAACC,SAA2B,oBAAA,UAAA,EAClD,UAAA,qBAAC,OAAA,EACG,OAAM,8BACN,SAAQ,aACR,OAAO,IACP,QAAQ,IAER,UAAA;AAAA,EAAA,qBAAC,kBAAA,EACG,IAAG,0BACH,IAAG,UACH,IAAG,UACH,IAAG,SACH,IAAG,WACH,mBAAkB,yBAClB,eAAc,kBAEd,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAK,QAAO,KAAI,WAAU,WAAS;AAAA,IACpC,oBAAC,QAAA,EAAK,QAAO,QAAO,WAAU,WAAS;AAAA,IACvC,oBAAC,QAAA,EAAK,QAAO,QAAO,WAAU,WAAS;AAAA,IACvC,oBAAC,QAAA,EAAK,QAAO,KAAI,WAAU,UAAA,CAAS;AAAA,EAAA,GACxC;AAAA,EACA,oBAAC,QAAA,EACG,MAAK,gCACL,GAAE,wNAAsN;AAAA,EAE5N,qBAAC,kBAAA,EACG,IAAG,0BACH,IAAG,UACH,IAAG,UACH,IAAG,QACH,IAAG,UACH,mBAAkB,yBAClB,eAAc,kBAEd,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAK,QAAO,KAAI,WAAU,WAAS;AAAA,IACpC,oBAAC,QAAA,EAAK,QAAO,QAAO,WAAU,WAAS;AAAA,IACvC,oBAAC,QAAA,EAAK,QAAO,KAAI,WAAU,UAAA,CAAS;AAAA,EAAA,GACxC;AAAA,EACA,oBAAC,QAAA,EACG,MAAK,gCACL,GAAE,wKAAsK;AAAA,EAE5K,qBAAC,kBAAA,EACG,IAAG,0BACH,IAAG,SACH,IAAG,SACH,IAAG,UACH,IAAG,UACH,mBAAkB,yBAClB,eAAc,kBAEd,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAK,QAAO,KAAI,WAAU,WAAS;AAAA,IACpC,oBAAC,QAAA,EAAK,QAAO,QAAO,WAAU,WAAS;AAAA,IACvC,oBAAC,QAAA,EAAK,QAAO,KAAI,WAAU,UAAA,CAAS;AAAA,EAAA,GACxC;AAAA,EACA,oBAAC,QAAA,EACG,MAAK,gCACL,GAAE,qKAAmK;AAAA,EAEzK,qBAAC,kBAAA,EACG,IAAG,0BACH,IAAG,MACH,IAAG,MACH,IAAG,SACH,IAAG,UACH,mBAAkB,yBAClB,eAAc,kBAEd,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAK,QAAO,KAAI,WAAU,WAAS;AAAA,IACpC,oBAAC,QAAA,EAAK,QAAO,QAAO,WAAU,WAAS;AAAA,IACvC,oBAAC,QAAA,EAAK,QAAO,QAAO,WAAU,WAAS;AAAA,IACvC,oBAAC,QAAA,EAAK,QAAO,OAAM,WAAU,WAAS;AAAA,IACtC,oBAAC,QAAA,EAAK,QAAO,KAAI,WAAU,UAAA,CAAS;AAAA,EAAA,GACxC;AAAA,EACA,oBAAC,QAAA,EACG,MAAK,gCACL,GAAE,qMAAA,CACkG;AAAA,EAAA,CAE5G,EAAA,CACJ;AAEO,MAAMC,YAAYA,CAACD,SAA2B,oBAAC,OAAA,EAAI,OAAO,IAAI,QAAQ,IACnB,SAAQ,aACR,OAAO;AAAA,EAAEE,WAAW;AAAa,GACjC,SAAQ,OACR,OAAM,8BAC5D,UAAA,oBAAC,KAAA,EAAE,QAAQF,SAAS,UAAU,YAAY,SAAS,aAAY,OAC5D,UAAS,WACR,UAAA,oBAAC,QAAA,EACG,GAAE,gtCACF,MAAMA,SAAS,UAAU,YAAY,SAAS,UAAS,UAAA,CAAS,EAAA,CACxE,GACJ;AAEO,MAAMG,aAAaA,CAACH,SAA2B,oBAAC,OAAA,EACnD,MAAMA,SAAS,UAAU,YAAY,SACrC,MAAK,OACL,SAAQ,aACR,OAAO,IACP,QAAQ,IACR,OAAM,8BACN,UAAA,oBAAC,QAAA,EACG,GAAE,2sBAAA,CAA0sB,EAAA,CACptB;AAGO,MAAMI,eAAeA,CAACJ,SAA2B,oBAAC,OAAA,EACrD,OAAM,8BACN,OAAO,IAAI,QAAQ,IACnB,SAAQ,aACR,UAAA,oBAAC,KAAA,EACG,UAAA,oBAAC,QAAA,EACG,GAAE,8PACF,MAAMA,SAAS,UAAU,YAAY,QAAA,CAAQ,EAAA,CACrD,EAAA,CACJ;AAEO,MAAMK,gBAAgBA,CAACL,SAA2B,oBAAC,OAAA,EACtD,OAAM,8BAA6B,OAAO,IAAI,QAAQ,IACtD,SAAQ,eACR,UAAA,oBAAC,KAAA,EACG,UAAA,oBAAC,QAAA,EACG,GAAE,iNACF,MAAMA,SAAS,UAAU,YAAY,QAAA,CAAQ,EAAA,CACrD,EAAA,CACJ;AAEO,MAAMM,cAAcA,CAACN,SAA2B,oBAAC,SACpD,OAAM,8BAA6B,OAAO,IAAI,QAAQ,IACtD,SAAQ,aACR,UAAA,oBAAC,UAAK,MAAMA,SAAS,UAAU,YAAY,SACrC,GAAE,6fAAA,CAA4f,EAAA,CACxgB;AChCO,SAASO,kBAAkB;AAAA,EAC9BC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAxnB;AAAAA,EACAD;AAAAA,EACA2jB;AAAAA,EACA+D;AAAAA,EACAC,sBAAsB;AAAA,EACtBC,uBAAuB;AAAA,EACvBC,WAAW;AAAA,EACXC;AAAAA,EACAC;AAAAA,EACAC;AACoB,GAAG;AAEvB,QAAMC,YAAYC,kBAAAA;AAElB,QAAM,CAACC,uBAAuBC,wBAAwB,IAAI7nB,SAAS,KAAK;AAExE,QAAM,CAAC8nB,oBAAoBC,qBAAqB,IAAI/nB,SAAS,KAAK;AAElE,QAAM,CAACgoB,QAAQC,SAAS,IAAIjoB,SAAS,KAAK;AAE1CiC,YAAU,MAAM;AAEZ,UAAMimB,QAAQzgB,WAAW,MAAM;AAC3BwgB,gBAAU,IAAI;AAAA,IAClB,GAAG,EAAE;AAEL,WAAO,MAAM1gB,aAAa2gB,KAAK;AAAA,EACnC,GAAG,CAAA,CAAE;AAEL,QAAMC,wBAAkDzoB,cAAc4B,IAAK8mB,CAAAA,MAAM;AAC7E,QAAI,OAAOA,MAAM,UAAU;AACvB,aAAOA,EAAEplB;AAAAA,IACb,MAAO,QAAOolB;AAAAA,EAClB,CAAC;AAED,QAAMC,aAAalnB,YAAY,MAAM;AACjC,UAAMe,OAAOC,QAAQ1C,WAAW;AAChC,UAAMujB,oBAAoB,IAAIC,kBAAkB/gB,MAAM,aAAa;AAAA,MAAEghB,MAAM;AAAA,IAAA,CAAa;AAExF,UAAMoF,WAAWC,uBAAuBrmB,MAAMkhB,eAAehjB,iBAAqC;AAElG,QAAIkoB,SAASE,MAAM,CAAC,EAAEC,aAAaC,0BAA0BC,WAAW;AAEpE,YAAMC,mBAAmB;AAAA,QACrBC,iBAAiBP,SAASE,MAAM,CAAC;AAAA,QACjCM,SAASR,SAASQ;AAAAA,MAAAA;AAEtB,YAAMC,oBAAoB,IAAIC,kBAAkB9mB,IAAI;AAEpD6mB,wBAAkBE,kBAAkBL,kBAAkB5F,iBAAiB,EAClE7e,KAAK,SAAU+kB,gBAAgB;AAG5B,cAAMC,mBAAmB1Y,OAAO9D,OAAOjJ,OAAO,yEAA8E,CAAC;AAC7H,cAAM0lB,OAAOJ,kBAAkBK,WAAWH,gBAAgBC,gBAAgB;AAC1E,cAAMG,uBAAuBZ,0BAA0Ba,UAAUH,IAAI;AAErE,eAAOd,SAASkB,cAAcF,oBAAoB;AAAA,MAEtD,CAAC;AAAA,IAET,OAAO;AAEH/mB,cAAQoZ,KAAK,4BAA4B;AAAA,IAC7C;AAAA,EAEJ,GAAG,CAACyH,eAAehjB,iBAAiB,CAAC;AAErC,WAASqpB,iBAAiB;AACtB,QAAIC;AACJ,QAAItG,eAAethB,QAAQ,KAAM,QAAO4nB;AACxC,UAAMC,eAAe,CAAC,6BAA6B,8BAA8B;AACjF,QAAIvG,eAAehjB,mBAAmB;AAClC,YAAMF,YAAYkjB,eAAehjB;AACjC,UAAIF,UAAUgI,SAAS,gCACnBhI,UAAUgI,SAAS,gCAAgC;AACnDwhB,oBACI,qBAAA,UAAA,EACI,UAAA;AAAA,UAAA,oBAAC,OAAA,EAAI,WAAU,OACX,UAAA,oBAAC,aACG,OAAO,6BACP,OAAO,iGAAA,CAAiG,EAAA,CAChH;AAAA,UACCjqB,eACG,oBAAC,OAAA,EAAI,WAAU,OACX,8BAAC,KAAA,EAAE,MAAM,+CAA+CA,YAAY0D,QAAQgD,SAAS,6BACjF,KAAI,uBACJ,QAAO,UACP,UAAA,oBAAC,QAAA,EAAO,SAAQ,QACZ,OAAM,SAAO,UAAA,8BAAA,CAEjB,EAAA,CACJ,EAAA,CACJ;AAAA,QAAA,GACR;AAAA,MACR,WAAWjG,UAAUgI,SAAS,wBAAwB;AAClDwhB,oBAAY,oBAAC,OAAA,EAAI,WAAU,OACvB,UAAA,oBAAC,aACG,OAAO,mBACP,OAAO,2GAAA,CAA2G,EAAA,CAC1H;AAAA,MACJ,WAAWxpB,UAAUgI,SAAS,6BAA6B;AACvDwhB,oBAAY,oBAAC,OAAA,EAAI,WAAU,OACvB,UAAA,oBAAC,aACG,OAAO,wBACP,OAAO,0DAAA,CAA0D,EAAA,CACzE;AAAA,MACJ,WAAWxpB,UAAUgI,SAAS,2BAA2B;AACrDwhB,oBAAY,oBAAC,OAAA,EAAI,WAAU,OACvB,UAAA,oBAAC,aACG,OAAO,sBACP,OAAO,yCAAA,CAAyC,EAAA,CACxD;AAAA,MACJ,WAAW,CAACC,aAAavhB,SAASlI,UAAUgI,IAAI,GAAG;AAC/C,YAAIhI,UAAUgI,SAAS,mCAAmC;AACtDmgB,qBAAAA;AAAAA,QACJ;AACAqB,oBACI,oBAAC,SAAI,WAAU,OACX,8BAAC,WAAA,EAAU,OAAOtG,eAAehjB,kBAAAA,CAA2B,EAAA,CAChE;AAAA,MACR;AAAA,IACJ;AACA,WAAOspB;AAAAA,EACX;AAEA,MAAIE;AACJ,MAAI1C,MAAM;AACN0C,oBAAgB,oBAAC,OAAA,EAAI,KAAK1C,MACtB,OAAO;AAAA,MACH2C,QAAQ;AAAA,MACRC,OAAO;AAAA,MACPC,WAAW;AAAA,IAAA,GAEf,KAAK,QAAO;AAAA,EACpB,OAAO;AACHH,wCAAiB,YAAA,EAAU;AAAA,EAC/B;AAEA,MAAII;AACJ,MAAIxC,iBAAiB;AACjB,QAAI,OAAOA,oBAAoB,UAAU;AACrCwC,0BAAoBxC;AAAAA,IACxB,WAAWA,2BAA2BzkB,OAAO;AACzCinB,0BAAoBxC,gBAAgBvf;AAAAA,IACxC,OAAO;AACH+hB,0BAAoB;AAAA,IACxB;AAAA,EACJ;AAEA,QAAMC,YAAY;AAAA,IACdC,SAASlC,SAAS,IAAI;AAAA,IACtBmC,YAAY;AAAA,EAAA;AAGhB,SAEI,qBAAC,SACG,WAAWC,IAAI,4DAA4D3C,SAAS,GACpF,OAAOwC,WACP,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,IAAG,YAAA,CAAY;AAAA,IACpB,qBAAC,OAAA,EACG,WAAU,mDAEV,UAAA;AAAA,MAAA,oBAAC,OAAA,EAAI,WAAU,qBACVL,UAAAA,eACL;AAAA,MAEC5C;AAAAA,MAEAgD,yCACI,OAAA,EAAI,WAAU,OACX,UAAA,oBAAC,WAAA,EAAU,OAAOA,kBAAAA,CAAkB,EAAA,CACxC;AAAA,MAEHP,eAAAA;AAAAA,MAEC,CAAC7B,yBAAyB,CAACE,sBAAuB,qBAAC,OAAA,EAAI,WAAW,eAE/DuC,UAAAA;AAAAA,QAAAA,uBAAuBjH,gBAAgB+E,uBAAuBT,UAAUlB,MAA0Bc,QAAQ;AAAA,QAE1Ga,sBAAsB/f,SAAS,UAAU,yBACrC,aAAA,EACG,UACA,MAAM,kBACN,0BAAO,UAAA,EAAS,MAAMkiB,SAASC,OAAAA,CAAO,GACtC,SAAS,MAAM1C,yBAAyB,IAAI,GAAE;AAAA,QAErDM,sBAAsB/f,SAAS,OAAO,yBAClC,aAAA,EACG,UACA,MAAM,oBACN,0BAAO,WAAA,EAAU,MAAMkiB,SAASC,OAAAA,CAAO,GACvC,SAAS,MAAMxC,sBAAsB,IAAI,GAAE;AAAA,QAElDI,sBAAsB/f,SAAS,WAAW,KACvC,oBAAC,eACG,UACA,MAAM,sBACN,0BAAO,UAAA,EACH,MAAM,aACV,SAASgb,eAAete,gBAAe;AAAA,QAE9CmiB,kBACG,oBAAC,QAAA,EACG,WAAW,YACX,SAAS,QACT,UACA,SAAS7D,eAAevd,WAAU,UAAA,aAAA,CAEtC;AAAA,MAAA,GAGR;AAAA,MAEC+hB,yBAAyB,oBAAC,WAAA,EACvB,gBACA,SAAS,MAAMC,yBAAyB,KAAK,GAC7C,MAAMH,UAAUlB,MAChB,iBACA,qBACA,sBAA2C;AAAA,MAG9CsB,0CAAuB,gBAAA,EACpB,gBACA,SAAS,MAAMC,sBAAsB,KAAK,GAAE;AAAA,MAG/C,CAACH,yBAAyB,CAACE,sBAAsBP;AAAAA,IAAAA,EAAAA,CAEtD;AAAA,EAAA,GACJ;AAER;AAEO,SAAAiD,YAAAlL,IAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAAqB,QAAA;AAAA,IAAAiL;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAArD;AAAAA,EAAAA,IAAAhI;AAciF,QAAAG,KAAA6H,WAAW,KAAK;AAA8C,MAAA5H;AAAA,MAAAH,SAAAE,IAAA;AAAhJC,SAAA0K,IAAI,8EAA8E3K,EAA8D;AAACF,WAAAE;AAAAF,WAAAG;AAAAA,EAAA,OAAA;AAAAA,SAAAH,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAU;AAAA,MAAAV,EAAA,CAAA,MAAAuD,uBAAAC,IAAA,2BAAA,GAAA;AACrJ9C,SAAA;AAAA,MAAA4J,QACK;AAAA,MAAMe,cACA;AAAA,MAAKC,UACT;AAAA,IAAA;AACbtL,WAAAU;AAAAA,EAAA,OAAA;AAAAA,SAAAV,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAkB;AAAA,MAAAlB,SAAAkL,MAAA;AAMGhK,SAAA,oBAAA,OAAA,EACc,WAAA,4DACTgK,UAAAA,MACL;AAAMlL,WAAAkL;AAAAlL,WAAAkB;AAAAA,EAAA,OAAA;AAAAA,SAAAlB,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAwB;AAAA,MAAAxB,SAAAoL,MAAA;AACN5J,SAAA,oBAAA,OAAA,EAAe,WAAA,yBAAyB4J,UAAAA,MAAK;AAAMpL,WAAAoL;AAAApL,WAAAwB;AAAAA,EAAA,OAAA;AAAAA,SAAAxB,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAgC;AAAA,MAAAhC,EAAA,CAAA,MAAAkB,MAAAlB,SAAAwB,IAAA;AANvDQ,SAAA,qBAAA,OAAA,EACc,WAAA,kDACVd,UAAAA;AAAAA,MAAAA;AAAAA,MAIAM;AAAAA,IAAAA,GACJ;AAAMxB,WAAAkB;AAAAlB,WAAAwB;AAAAxB,WAAAgC;AAAAA,EAAA,OAAA;AAAAA,SAAAhC,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAwC;AAAA,MAAAxC,EAAA,EAAA,MAAA+H,YAAA/H,EAAA,EAAA,MAAAmL,WAAAnL,EAAA,EAAA,MAAAG,MAAAH,UAAAgC,IAAA;AAlBdQ,sCAAe,WAAA,eACX,UAAA,oBAAC,QAAA,EACc,WAAArC,IACJ,OAAAO,IAMGqH,UACDoD,SACTnJ,cAQJ,GACJ;AAAMhC,YAAA+H;AAAA/H,YAAAmL;AAAAnL,YAAAG;AAAAH,YAAAgC;AAAAhC,YAAAwC;AAAAA,EAAA,OAAA;AAAAA,SAAAxC,EAAA,EAAA;AAAA,EAAA;AAAA,SApBNwC;AAoBM;AAId,SAAA+I,eAAAxL,IAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAAwB,QAAA;AAAA,IAAAuL;AAAAA,IAAA3H;AAAAA,EAAAA,IAAA9D;AAOpBuD,eAAAA;AAEA,QAAA,CAAA5d,OAAA+lB,QAAA,IAA0BhrB,SAAAA;AAC1B,QAAA,CAAAkI,MAAA+iB,OAAA,IAAwBjrB,SAAAA;AACxB,QAAA,CAAAkrB,eAAAC,gBAAA,IAA0CnrB,cAAc;AAAE,MAAAyf;AAAA,MAAAF,EAAA,CAAA,MAAA6D,kBAAA7D,SAAArX,QAAAqX,EAAA,CAAA,MAAAta,OAAA;AAErCwa,gBAAA2L,UAAA;AACjBA,YAAKC,eAAAA;AAAiB,UAElBnjB,QAAQkb,eAAcxiB,oBAAmB;AACzCuqB,8BAAsB;AAEtB/H,uBAAcxiB,mBAAA0qB,QAA4BpjB,IAAI,EAACtE,MAAAlB,CAAAA,MAAA;AAAA,cACvCA,EAACwF,SAAU,kCAAgC;AAC3CijB,iCAAqB;AAAA,UAAC;AAAA,QAAA,CAE7B;AAAA,MAAC,OAAA;AAAA,YAEElmB,OAAK;AACLme,yBAAcpe,WAAYC,OAAK0H,OAAAqW,iBAA0B;AAAA,QAAC;AAAA,MAAA;AAAA,IAAA;AAGrEzD,WAAA6D;AAAA7D,WAAArX;AAAAqX,WAAAta;AAAAsa,WAAAE;AAAAA,EAAA,OAAA;AAAAA,SAAAF,EAAA,CAAA;AAAA,EAAA;AAhBD,QAAAgM,eAAqB9L;AAgBpB,MAAAC;AAAA,MAAAH,SAAA2L,eAAA;AAIQxL,SAAAwL,qCACG,OAAA,EAAe,WAAA,OACX,UAAA,oBAAC,WAAA,EAAiB,OAAA,4BAAA,CAA2B,EAAA,CACjD;AAAM3L,WAAA2L;AAAA3L,WAAAG;AAAAA,EAAA,OAAA;AAAAA,SAAAH,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAU;AAAA,MAAAV,EAAA,CAAA,MAAAuD,uBAAAC,IAAA,2BAAA,GAAA;AAEV9C,sCAAS2C,IAAAA,uBAAAA,CAAsB;AAAGrD,WAAAU;AAAAA,EAAA,OAAA;AAAAA,SAAAV,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAkB;AAAA,MAAAlB,EAAA,CAAA,MAAAuD,uBAAAC,IAAA,2BAAA,GAAA;AAK1BtC,6BAAC,eAAA,EAAwB,WAAA,UAAA,CAAS;AAAElB,WAAAkB;AAAAA,EAAA,OAAA;AAAAA,SAAAlB,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAwB;AAAA,MAAAxB,SAAAwL,SAAA;AAFxChK,SAAA,oBAAC,YAAA,EACYgK,SAAAA,SACTtK,UAAAA,IACJ;AAAalB,WAAAwL;AAAAxL,WAAAwB;AAAAA,EAAA,OAAA;AAAAA,SAAAxB,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAgC;AAAA,MAAAhC,EAAA,EAAA,MAAAuD,uBAAAC,IAAA,2BAAA,GAAA;AACbxB,SAAA,oBAAA,OAAA,EAAe,WAAA,YACX,UAAA,oBAAC,YAAA,EAAkB,OAAA,UACN,SAAA,aAAc,UAAA,iCAAA,CAAiC,GAChE;AAAMhC,YAAAgC;AAAAA,EAAA,OAAA;AAAAA,SAAAhC,EAAA,EAAA;AAAA,EAAA;AAEK,QAAAwC,KAAA9c,SAAS;AACN,QAAAud,KAAA/G,QAAQxW,UAAUme,eAAc5iB,eAAgB4iB,eAAcxiB,mBAAoB;AAAC,MAAA4qB;AAAA,MAAAjM,EAAA,EAAA,MAAAuD,uBAAAC,IAAA,2BAAA,GAAA;AAEnFyI,SAAAC,CAAAA,YAAgBT,SAASI,QAAKM,OAAAnb,KAAa;AAACgP,YAAAiM;AAAAA,EAAA,OAAA;AAAAA,SAAAjM,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAoM;AAAA,MAAApM,EAAA,EAAA,MAAAwC,MAAAxC,UAAAiD,IAAA;AAJ1DmJ,UAAA,oBAAC,WAAA,EAAsB,aAAA,IACZ,OAAA5J,IACG,UAAAS,IACL,MAAA,SACK,UAAAgJ,GAAAA,CAA4C;AAAGjM,YAAAwC;AAAAxC,YAAAiD;AAAAjD,YAAAoM;AAAAA,EAAA,OAAA;AAAAA,UAAApM,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAqM;AAAA,MAAArM,EAAA,EAAA,MAAA6D,eAAAxiB,sBAAA2e,EAAA,EAAA,MAAArX,QAAAqX,EAAA,EAAA,MAAAta,OAAA;AAC5D2mB,UAAAnQ,QAAQxW,SAASme,eAAcxiB,kBAAmB,KAAC,qBAAA,UAAA,EAE5C,UAAA;AAAA,MAAA,oBAAA,OAAA,EAAe,WAAA,iBACX,UAAA,oBAAC,YAAA,EAAkB,OAAA,UACN,SAAA,aAAc,UAAA,qCAAA,CAAqC,GACpE;AAAA,MACA,oBAAC,WAAA,EAAsB,aAAA,IACZ,OAAAsH,QAAQ,IACV,MAAA,QACK,UAAA2jB,CAAAA,YAAgBZ,QAAQG,QAAKM,OAAAnb,KAAa,EAAA;OAAI;AAC7DgP,MAAA,EAAA,IAAA6D,eAAAxiB;AAAA2e,YAAArX;AAAAqX,YAAAta;AAAAsa,YAAAqM;AAAAA,EAAA,OAAA;AAAAA,UAAArM,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAuM;AAAA,MAAAvM,EAAA,EAAA,MAAA6D,eAAA5iB,aAAA;AAKFsrB,UAAA1I,eAAc5iB,eACX,oBAAC,oBAA2B,WAAA,OAAY,MAAA,SAAO;AAAG+e,MAAA,EAAA,IAAA6D,eAAA5iB;AAAA+e,YAAAuM;AAAAA,EAAA,OAAA;AAAAA,UAAAvM,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAwM;AAAA,MAAAxM,EAAA,EAAA,MAAAuD,uBAAAC,IAAA,2BAAA,GAAA;AAGtDgJ,UAAA,oBAAC,QAAA,EAAY,MAAA,UACR,UAAA,MACL;AAASxM,YAAAwM;AAAAA,EAAA,OAAA;AAAAA,UAAAxM,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAyM;AAAA,MAAAzM,UAAAuM,KAAA;AARbE,UAAA,qBAAA,OAAA,EAAe,WAAA,wCAEVF,UAAAA;AAAAA,MAAAA;AAAAA,MAIDC;AAAAA,IAAAA,GAGJ;AAAMxM,YAAAuM;AAAAvM,YAAAyM;AAAAA,EAAA,OAAA;AAAAA,UAAAzM,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA0M;AAAA,MAAA1M,EAAA,EAAA,MAAAoM,OAAApM,EAAA,EAAA,MAAAqM,OAAArM,EAAA,EAAA,MAAAyM,OAAAzM,UAAAwB,IAAA;AApCVkL,UAAA,qBAAA,OAAA,EAAgB,WAAA,uBACZlL,UAAAA;AAAAA,MAAAA;AAAAA,MAIAQ;AAAAA,MAIAoK;AAAAA,MAKCC;AAAAA,MAaDI;AAAAA,IAAAA,GAWJ;AAAMzM,YAAAoM;AAAApM,YAAAqM;AAAArM,YAAAyM;AAAAzM,YAAAwB;AAAAxB,YAAA0M;AAAAA,EAAA,OAAA;AAAAA,UAAA1M,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA2M;AAAA,MAAA3M,EAAA,EAAA,MAAAgM,gBAAAhM,UAAA0M,OAAA1M,EAAA,EAAA,MAAAG,IAAA;AA9CVwM,yCAAgBX,UAAAA,cACX7L,UAAAA;AAAAA,MAAAA;AAAAA,MAKDO;AAAAA,MAEAgM;AAAAA,IAAAA,GAuCJ;AAAO1M,YAAAgM;AAAAhM,YAAA0M;AAAA1M,YAAAG;AAAAH,YAAA2M;AAAAA,EAAA,OAAA;AAAAA,UAAA3M,EAAA,EAAA;AAAA,EAAA;AAAA,SA/CP2M;AA+CO;AAMf,SAASC,UAAU;AAAA,EACfpB;AAAAA,EACA3H;AAAAA,EACAoD;AAAAA,EACAW;AAAAA,EACAC;AAAAA,EACAC;AAQJ,GAAG;AAEC,QAAM+E,cAAcxqB,OAAgC,IAAI;AAExD,QAAM,CAACyqB,YAAYC,aAAa,IAAItsB,SAAwB,OAAO;AACnE,QAAM,CAACgE,OAAOuoB,QAAQ,IAAIvsB,SAAAA;AAC1B,QAAM,CAACiE,UAAUuoB,WAAW,IAAIxsB,SAAAA;AAChC,QAAM,CAACysB,8BAA8BC,+BAA+B,IAAI1sB,SAAAA;AACxE,QAAM,CAAC2sB,mBAAmBC,oBAAoB,IAAI5sB,SAAS,KAAK;AAEhE,QAAM6sB,qBAAqBC,sBAAAA;AAE3B7qB,YAAU,MAAM;AACZ,SAAKoqB,eAAe,cAAcA,eAAe,mBAAmBD,YAAYhqB,SAAS;AACrFgqB,kBAAYhqB,QAAQ2qB,MAAAA;AAAAA,IACxB;AAAA,EACJ,GAAG,CAACV,UAAU,CAAC;AAEfpqB,YAAU,MAAM;AACZ,QAAI,CAAC4L,SAAU;AACf,UAAMmf,cAAcA,CAAC5B,UAAe;AAChC,UAAIA,MAAM6B,YAAY,IAAI;AACtBlC,gBAAAA;AAAAA,MACJ;AAAA,IACJ;AACAld,aAASqf,iBAAiB,WAAWF,aAAa,KAAK;AACvD,WAAO,MAAM;AACTnf,eAASsf,oBAAoB,WAAWH,aAAa,KAAK;AAAA,IAC9D;AAAA,EACJ,GAAG,CAACjC,OAAO,CAAC;AAEZ,WAASqC,mBAAmB;AACxB,QAAIppB,OAAO;AACPof,qBAAe5e,2BAA2BR,KAAK,EAAEG,KAAMkpB,CAAAA,uBAAuB;AAC1EX,wCAAgCW,mBAAmBtV,OAAOuD,CAAAA,MAAKA,MAAM,UAAU,CAAC;AAAA,MACpF,CAAC;AACDgR,oBAAc,UAAU;AAAA,IAC5B;AAAA,EACJ;AAEA,WAASgB,sBAAsB;AAC3B,QAAItpB,SAASC,UAAU;AACnBmf,qBAAerf,mBAAmBC,OAAOC,QAAQ;AAAA,IACrD;AAAA,EACJ;AAEA,WAASspB,qBAAqB;AAC1B,QAAIvpB,SAASC,UAAU;AACnBmf,qBAAehf,+BAA+BJ,OAAOC,QAAQ;AAAA,IACjE;AAAA,EACJ;AAEA,QAAMupB,gBAAgBA,MAAM;AACxB,QAAInB,eAAe,SAAS;AACxBtB,cAAAA;AAAAA,IACJ,WAAWsB,eAAe,cAAcA,eAAe,gBAAgB;AACnEC,oBAAc,OAAO;AAAA,IACzB,OAAO;AACHI,sCAAgCzsB,MAAS;AAAA,IAC7C;AAAA,EACJ;AAEA,QAAMsrB,eAAeA,CAACH,YAAe;AACjCA,YAAMC,eAAAA;AACN,QAAIgB,eAAe,SAAS;AACxBe,uBAAAA;AAAAA,IACJ,WAAWf,eAAe,YAAY;AAClCiB,0BAAAA;AAAAA,IACJ,WAAWjB,eAAe,gBAAgB;AACtCkB,yBAAAA;AAAAA,IACJ;AAAA,EACJ;AAEA,QAAM/c,QAAQ6b,eAAe,iBACvB,8DACCA,eAAe,aAAa,+BAA+B;AAElE,SACI,oBAAC,UACG,WAAW,UACX,UAAUd,cAEV,UAAA,qBAAC,OAAA,EAAI,WAAW,4CACZ,UAAA;AAAA,IAAA,oBAAC,cACG,SAASiC,eACT,8BAAC,eAAA,EAAc,WAAU,WAAS,EAAA,CACtC;AAAA,IAEA,oBAAC,OAAA,EACInB,UAAAA,eAAe,kBAAkBlF,iBACtC;AAAA,IAEA,oBAAC,YAAA,EACG,WAAW,GAAGkF,eAAe,kBAAkBjF,sBAAsB,WAAW,MAAM,IACtF,SAAS,aAAc5W,UAAAA,OAAM;AAAA,KAE/B6b,eAAe,WAAWA,eAAe,mBAAmB,oBAAC,aAAU,aAAY,SAAQ,WAAS,MAClG,OAAOroB,SAAS,IAChB,UAAUof,eAAe5iB,aACzB,MAAK,SACL,UAAU,CAAC4qB,YAAemB,SAASnB,QAAMM,OAAOnb,KAAK,EAAA,CAAE;AAAA,IAE3D,oBAAC,OAAA,EACG,WAAW,GAAG8b,eAAe,cAAeA,eAAe,kBAAkB,CAACjF,sBAAuB,UAAU,QAAQ,IACvH,UAAA,oBAAC,aAAU,aAAY,YACnB,OAAOnjB,YAAY,IACnB,UAAUmf,eAAe5iB,aACzB,UAAU4rB,aACV,MAAK,YACL,UAAU,CAAChB,YAAeoB,YAAYpB,QAAMM,OAAOnb,KAAK,GAAE,GAClE;AAAA,IAEA,qBAAC,SACG,WAAW,GAAG8b,eAAe,kBAAkBjF,sBAAsB,WAAW,MAAM,+CAErFhE,UAAAA;AAAAA,MAAAA,eAAe5iB,eACZ,oBAAC,kBAAA,EAAiB,WAAU,OAAM,MAAM,SAAQ;AAAA,MAGnD,CAAC6mB,wBAAwB,oBAAC,eAAA,EAAc,SAAQ,QAC7C,SAASsF,mBACT,SAAS3oB,QACH,YAAY;AACV4oB,6BAAqB,IAAI;AACzB,YAAI;AACA,cAAI;AACA,kBAAMxJ,eAAe9e,uBAAuBN,KAAK;AACjD6oB,+BAAmBY,KAAK;AAAA,cACpBxlB,SAAS;AAAA,cACTiQ,MAAM;AAAA,YAAA,CACT;AAAA,UACL,SAASxV,GAAQ;AACbmqB,+BAAmBY,KAAK;AAAA,cACpBxlB,SAASvF,EAAEuF;AAAAA,cACXiQ,MAAM;AAAA,YAAA,CACT;AAAA,UACL;AAAA,QACJ,UAAA;AACI0U,+BAAqB,KAAK;AAAA,QAC9B;AAAA,MACJ,IACE3sB,QAAU,UAAA,kBAEpB;AAAA,MAEC,CAACmnB,uBAAuBiF,eAAe,WACpC,oBAAC,QAAA,EAAO,SAAQ,QAAO,SAAS,MAAMC,cAAc,cAAc,GAAE,UAAA,WAAA,CAEpE;AAAA,MAEJ,oBAAC,QAAA,EAAO,MAAK,UACRD,UAAAA,eAAe,iBAAiB,mBAAoBA,eAAe,aAAa,UAAU,QAAA,CAC/F;AAAA,IAAA,GACJ;AAAA,IAECI,gCAAgCA,6BAA6B/iB,SAAS,KACnE,qBAAC,OAAA,EAAI,WAAW,2BACZ,UAAA;AAAA,MAAA,qBAAC,OAAA,EACG,UAAA;AAAA,QAAA,oBAAC,YAAA,EAAW,SAAS,aAAY,UAAA,+BAEjC;AAAA,QACA,qBAAC,YAAA,EAAW,SAAS,SAAQ,UAAA;AAAA,UAAA;AAAA,UAEF1F;AAAAA,QAAAA,EAAAA,CAC3B;AAAA,MAAA,GACJ;AAAA,MAEA,oBAAC,SACIyoB,UAAAA,gCAAgCpC,uBAAuBjH,gBAAgBqJ,8BAA8BjG,MAAM,KAAK,EAAA,CACrH;AAAA,IAAA,EAAA,CACJ;AAAA,EAAA,EAAA,CAER,EAAA,CACJ;AAGR;AAEA,SAAS6D,uBAAuBjH,gBAAwCsK,WAAqBlH,MAAwBc,UAAmB;AACpI,SAAO,qBAAA,UAAA,EACFoG,UAAAA;AAAAA,IAAAA,UAAUtlB,SAAS,YAAY,KAAK,oBAAC,eAClC,UACA,MAAM,uBACN,MAAMme,WAAe,GACrB,SAASnD,eAAengB,aAAY;AAAA,IAEvCyqB,UAAUtlB,SAAS,eAAe,yBAAM,aAAA,EACrC,UACA,MAAM,0BACN,MAAMye,cAAcL,IAAI,GACxB,SAASpD,eAAe1d,gBAAe;AAAA,IAE1CgoB,UAAUtlB,SAAS,WAAW,yBAAM,aAAA,EACjC,UACA,MAAM,sBACN,MAAMqe,UAAUD,IAAI,GACpB,SAASpD,eAAehe,YAAW;AAAA,IAEtCsoB,UAAUtlB,SAAS,YAAY,yBAAM,aAAA,EAClC,UACA,MAAM,uBACN,MAAMue,WAAWH,IAAI,GACrB,SAASpD,eAAe5d,aAAY;AAAA,IAEvCkoB,UAAUtlB,SAAS,cAAc,yBAAM,aAAA,EACpC,UACA,MAAM,yBACN,MAAMwe,aAAaJ,IAAI,GACvB,SAASpD,eAAe9d,eAAc;AAAA,IAEzCooB,UAAUtlB,SAAS,aAAa,yBAAM,aAAA,EACnC,UACA,MAAM,wBACN,MAAM0e,YAAYN,IAAI,GACtB,SAASpD,eAAezd,aAAAA,CAAa;AAAA,EAAA,GAC7C;AACJ;ACroBA,MAAMgoB,0BAA0B,CAC5BzqB,mBAAmB0qB,WAAW;AAoB3B,SAAAC,kBAAAvO,IAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAA2B,QAAA;AAAA,IAAAzU;AAAAA,IAAAmc;AAAAA,IAAA4G;AAAAA,IAAAlI;AAAAA,IAAAvP;AAAAA,IAAA0X;AAAAA,IAAAC;AAAAA,IAAAhV;AAAAA,IAAAiO;AAAAA,IAAAvnB,eAAA+f;AAAAA,IAAA7U;AAAAA,IAAAE;AAAAA,IAAAmjB;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC,iBAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAzV;AAAAA,IAAA0V;AAAAA,IAAAzV,wBAAAwG;AAAAA,IAAAkP;AAAAA,EAAAA,IAAAtP;AAU9B,QAAA5f,gBAAA+f,OAAuCxf,SAAA0tB,0BAAvClO;AAcA,QAAAvG,yBAAAwG,OAA8Bzf,iBAA9Byf;AAOAmP,yBAAuB9jB,MAAMmc,IAAI;AAAC,MAAAjH;AAAA,MAAAV,SAAAiP,qBAAA;AAEuBvO,SAAAuO,uBAAmB,CAAA;AAAMjP,WAAAiP;AAAAjP,WAAAU;AAAAA,EAAA,OAAA;AAAAA,SAAAV,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAkB;AAAA,MAAAlB,SAAAU,IAAA;AAA1BQ,SAACR,GAAyB3e,IAAAihB,KAG5E,EAAC3T,OAAA6T,QAAA,EAEA;AAAClD,WAAAU;AAAAV,WAAAkB;AAAAA,EAAA,OAAA;AAAAA,SAAAlB,EAAA,CAAA;AAAA,EAAA;AALR,QAAAgP,kBAAwD9N;AAK/C,MAAAM;AAAA,MAAAxB,EAAA,CAAA,MAAA3U,kBAAA2U,SAAAzU,gBAAA;AAMiBiW,SAAA;AAAA,MAAAjW;AAAAA,MAAAF;AAAAA,IAAAA;AAGzB2U,WAAA3U;AAAA2U,WAAAzU;AAAAyU,WAAAwB;AAAAA,EAAA,OAAA;AAAAA,SAAAxB,EAAA,CAAA;AAAA,EAAA;AAPD,QAAA;AAAA,IAAA9f;AAAAA,IAAAyL;AAAAA,IAAAE;AAAAA,EAAAA,IAIIT,sBAAsBoW,EAGzB;AAKD,QAAA+N,iBAAuBC,uBAAAA;AACvB,QAAAC,sBAA4BC,4BAAAA;AAA8B,MAAA1N;AAAA,MAAAhC,EAAA,CAAA,MAAA0O,mBAAA1O,SAAA9f,aAAA;AAM1C8hB,SAAA;AAAA,MAAA9hB;AAAAA,MAAA0D,SAEH8qB;AAAAA,IAAAA;AACZ1O,WAAA0O;AAAA1O,WAAA9f;AAAA8f,WAAAgC;AAAAA,EAAA,OAAA;AAAAA,SAAAhC,EAAA,CAAA;AAAA,EAAA;AAPD,QAAA;AAAA,IAAA/f;AAAAA,EAAAA,IAIIiN,YAAY8U,EAGf;AAAE,MAAAQ;AAAA,MAAAxC,EAAA,EAAA,MAAA9f,eAAA8f,UAAA7f,eAAA;AAKsEqiB,SAAA;AAAA,MAAAtiB;AAAAA,MAAAC;AAAAA,IAAAA;AAGxE6f,YAAA9f;AAAA8f,YAAA7f;AAAA6f,YAAAwC;AAAAA,EAAA,OAAA;AAAAA,SAAAxC,EAAA,EAAA;AAAA,EAAA;AAHD,QAAA6D,iBAA+C7jB,0BAA0BwiB,EAGxE;AAKD,QAAAmN,wBAA8BC,sCAAAA;AAAwC,MAAA3M;AAAA,MAAAjD,EAAA,EAAA,MAAA9f,eAAA8f,EAAA,EAAA,MAAAtG,2BAAAsG,EAAA,EAAA,MAAArG,0BAAAqG,UAAAvG,6BAAA;AAEzBwJ,SAAA;AAAA,MAAA/iB;AAAAA,MAAAuZ;AAAAA,MAAAC;AAAAA,MAAAC;AAAAA,IAAAA;AAK5CqG,YAAA9f;AAAA8f,YAAAtG;AAAAsG,YAAArG;AAAAqG,YAAAvG;AAAAuG,YAAAiD;AAAAA,EAAA,OAAA;AAAAA,SAAAjD,EAAA,EAAA;AAAA,EAAA;AALD,QAAA6P,oBAA0BrW,mBAAmByJ,EAK5C;AAAC,MAAAgJ;AAAA,MAAAjM,UAAA9f,aAAA;AAK6C+rB,SAAA;AAAA,MAAA/rB;AAAAA,IAAAA;AAE9C8f,YAAA9f;AAAA8f,YAAAiM;AAAAA,EAAA,OAAA;AAAAA,SAAAjM,EAAA,EAAA;AAAA,EAAA;AAFD,QAAA8P,gBAAsBppB,yBAAyBulB,EAE9C;AAAE,MAAAG;AAAA,MAAApM,UAAA6P,mBAAA;AAYOzD,UAAA2D,gBAAgBF,iBAAiB;AAAC7P,YAAA6P;AAAA7P,YAAAoM;AAAAA,EAAA,OAAA;AAAAA,UAAApM,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAqM;AAAA,MAAArM,EAAA,EAAA,MAAA6D,kBAAA7D,EAAA,EAAA,MAAAqG,iBAAArG,EAAA,EAAA,MAAA8P,iBAAA9P,UAAAoM,KAAA;AAHfC,UAAA;AAAA,MAAAxI;AAAAA,MAAAwC;AAAAA,MAAApW,MAGnBmc;AAAAA,MAAkC0D;AAAAA,IAAAA;AAE3C9P,YAAA6D;AAAA7D,YAAAqG;AAAArG,YAAA8P;AAAA9P,YAAAoM;AAAApM,YAAAqM;AAAAA,EAAA,OAAA;AAAAA,UAAArM,EAAA,EAAA;AAAA,EAAA;AATD,QAAA;AAAA,IAAA/e;AAAAA,IAAA+uB;AAAAA,IAAA/H;AAAAA,EAAAA,IAIIgI,yBAAyB5D,GAK5B;AAAE,MAAAE;AAAA,MAAAvM,UAAA2P,uBAAA;AAEuEpD,UAAA;AAAA,MAAAoD;AAAAA,IAAAA;AAEzE3P,YAAA2P;AAAA3P,YAAAuM;AAAAA,EAAA,OAAA;AAAAA,UAAAvM,EAAA,EAAA;AAAA,EAAA;AAFD,QAAAkQ,+BAAqCC,qCAAqC5D,GAEzE;AAGa,QAAAC,MAAAqC,YAAY;AACF,QAAApC,MAAAqC,sBAAsB;AAAI,MAAApC;AAAA,MAAA1M,EAAA,EAAA,MAAAkQ,gCAAAlQ,UAAAwM,OAAAxM,EAAA,EAAA,MAAAyM,KAAA;AAFNC,UAAA;AAAA,MAAAmC,UAC9BrC;AAAAA,MAAesC,oBACLrC;AAAAA,MAA0ByD;AAAAA,IAAAA;AAEjDlQ,YAAAkQ;AAAAlQ,YAAAwM;AAAAxM,YAAAyM;AAAAzM,YAAA0M;AAAAA,EAAA,OAAA;AAAAA,UAAA1M,EAAA,EAAA;AAAA,EAAA;AAJD,QAAAoQ,gBAAsBC,sBAAsB3D,GAI3C;AAAE,MAAAC;AAAA,MAAA3M,EAAA,EAAA,MAAA6D,kBAAA7D,UAAA6P,mBAAA;AAEkDlD,UAAA;AAAA,MAAA9I;AAAAA,MAAAC,oBAE7B+L;AAAAA,IAAAA;AACvB7P,YAAA6D;AAAA7D,YAAA6P;AAAA7P,YAAA2M;AAAAA,EAAA,OAAA;AAAAA,UAAA3M,EAAA,EAAA;AAAA,EAAA;AAHD,QAAAsQ,wBAA8B1M,uBAAuB+I,GAGpD;AAED,QAAA4D,uBAA6BlB,kBAAkBiB;AAAsB,MAAAE;AAAA,MAAAxQ,UAAA6P,mBAAA;AAO3DW,UAAAT,gBAAgBF,iBAAiB;AAAC7P,YAAA6P;AAAA7P,YAAAwQ;AAAAA,EAAA,OAAA;AAAAA,UAAAxQ,EAAA,EAAA;AAAA,EAAA;AAKxB,QAAAyQ,MAAAF;AAA2B,MAAAG;AAAA,MAAA1Q,EAAA,EAAA,MAAAyP,oBAAAxI,QAAAjH,EAAA,EAAA,MAAAyO,cAAAzO,UAAA6D,kBAAA7D,EAAA,EAAA,MAAAkQ,gCAAAlQ,EAAA,EAAA,MAAAlJ,eAAAkJ,EAAA,EAAA,MAAAkP,WAAAlP,EAAA,EAAA,MAAAwQ,OAAAxQ,EAAA,EAAA,MAAAyQ,OAAAzQ,EAAA,EAAA,MAAAoQ,iBAAApQ,UAAAwO,OAAA;AAVqBkC,UAAA;AAAA,MAAA5Z;AAAAA,MAAA0X;AAAAA,MAAAC;AAAAA,MAAA5K;AAAAA,MAAA5T,MAK1DugB;AAAAA,MAAkCtB;AAAAA,MAAAgB;AAAAA,MAAAE;AAAAA,MAAAO,WAI7BlB,oBAAmBxI;AAAAA,MAAAoI,gBACdoB;AAAAA,IAAAA;AACnBzQ,MAAA,EAAA,IAAAyP,oBAAAxI;AAAAjH,YAAAyO;AAAAzO,YAAA6D;AAAA7D,YAAAkQ;AAAAlQ,YAAAlJ;AAAAkJ,YAAAkP;AAAAlP,YAAAwQ;AAAAxQ,YAAAyQ;AAAAzQ,YAAAoQ;AAAApQ,YAAAwO;AAAAxO,YAAA0Q;AAAAA,EAAA,OAAA;AAAAA,UAAA1Q,EAAA,EAAA;AAAA,EAAA;AAXD,QAAA4Q,4BAAkCC,kCAAkCH,GAWnE;AAAE,MAEC/kB,yBAAqB,CAAKzL,eAAeD,SAAO;AAAA,QAAA6wB;AAAA,QAAA9Q,EAAA,EAAA,MAAAuD,uBAAAC,IAAA,2BAAA,GAAA;AACzCsN,aAAA,oBAAA,UAAA,EACH,UAAA,oBAAC,wBAAA,CAAA,CAAsB,GAAE;AAC1B9Q,cAAA8Q;AAAAA,IAAA,OAAA;AAAAA,aAAA9Q,EAAA,EAAA;AAAA,IAAA;AAAA,WAFI8Q;AAAAA,EAEJ;AAAA,MAGHjlB,aAAW;AAAA,QAAAilB;AAAA,QAAA9Q,UAAAnU,aAAA;AACJilB,iCAAC,cAAA,yBAA0B;AAAe9Q,cAAAnU;AAAAmU,cAAA8Q;AAAAA,IAAA,OAAA;AAAAA,aAAA9Q,EAAA,EAAA;AAAA,IAAA;AAAA,WAA1C8Q;AAAAA,EAA0C;AAAA,MAAAA;AAAA,MAAA9Q,EAAA,EAAA,MAAA9f,YAAA0D,QAAAgD,WAAA;AAkBdkqB,UAAAC,CAAAA,SAAA;AAAC,YAAA;AAAA,QAAAnV;AAAAA,MAAAA,IAAAmV;AAAmC,aAAK,+CAA+C7wB,YAAW0D,QAAAgD,SAAA,mBAAqCgV,OAAMvS,IAAA,IAASuS,OAAM3Z,EAAA;AAAA,IAAK;AAAA+d,MAAA,EAAA,IAAA9f,YAAA0D,QAAAgD;AAAAoZ,YAAA8Q;AAAAA,EAAA,OAAA;AAAAA,UAAA9Q,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA+Q;AAAA,MAAA/Q,EAAA,EAAA,MAAA0H,kBAAA1H,EAAA,EAAA,MAAA6D,kBAAA7D,EAAA,EAAA,MAAA/e,eAAA+e,EAAA,EAAA,MAAAmP,kBAAAnP,EAAA,EAAA,MAAAgQ,qBAAAhQ,EAAA,EAAA,MAAAoP,cAAApP,EAAA,EAAA,MAAA9f,eAAA8f,UAAA2H,QAAA3H,EAAA,EAAA,MAAAuO,YAAAvO,EAAA,EAAA,MAAAuP,kBAAAvP,EAAA,EAAA,MAAAxU,QAAAwU,EAAA,EAAA,MAAA4Q,6BAAA5Q,EAAA,EAAA,MAAAiI,mBAAAjI,EAAA,EAAA,MAAA7f,iBAAA6f,EAAA,EAAA,MAAAoQ,eAAA;AAKpLW,UAAAC,CAAAA,SAAA;AAAC,YAAA;AAAA,QAAA/wB,SAAAgxB;AAAAA,MAAAA,IAAAD;AAKME,UAAAA;AAAS,UACTjxB,aAAWgB,aAAW;AACtBiwB,oBAAYA,oBAACA,wBAAAA,EAA6BA,MAAAA,QAAAA,CAAOA;AAAAA,MAAxC,OAAA;AAET,cAAAC,WAAiB5B,eAActI,SAAU,UAAUsH,WAAWA,WAAW5G;AAAK,YAAA,CACzEqI,mBAAiB;AAClB,gBAAAoB,gBAAsBhC,YAAUiC,aAAA7J;AAChC0J,sBACIA,oBAACA,eAAAA,EACSC,MAAAA,UACUzJ,gBACD,eAAAvnB,iBAAaiuB,yBACfluB,aACG2jB,gBACCoE,gBAAAA,CAAe;AAAA,QAP/B,OAAA;AAUT,gBAAAqJ,uBAA6BV,0BAAyBW,oBAAAC,kBAAAluB,KAAAmuB,MAAA;AACtD,gBAAAC,gBAAsBJ,uBAAuB,oBAAC,UAAA,EAAa,IAAAlB,cAAauB,uBAAwBL,qBAAoBrvB,EAAG,GAAG,eAAO,IAAM,oBAAC,gBAAa,UAAA,yCAAqC;AAE1LivB,sBACIA,oBAACA,oBAAAA,EACGA,UAAAA,oBAACA,cAAAA,EACGA,UAAAA,qBAACA,OAAAA,EACGA,SAAAA,qBAACA,UAAAA,EACSC,gBACUhC,gBAChB,UAAA;AAAA,YAAA,oBAAC,QAAA,EAAc3jB,OAAAA,MAAY2lB,gBAAQ;AAAA,gCAClC,QAAA,EAAM;AAAA,gCACN,QAAA,EAAM;AAAA,gCACN,aAAA,CAAA,CAAW;AAAA,UAAA,EAAA,CAChB,GAEA,UAAA;AAAA,YAAA,oBAAC,OAAA,EAAW,MAAA,KAAa,SAAA/B,YAAUwC,WAAa,oBAAA,WAAA,UAAA,CAAA,CAAA,IAAyBF,cAAAA;gCACxE,OAAA,EAAW,MAAA,QAAgB,SAAA,oBAAC,kBAAa;AAAA,UAAA,EAAA,CAC9C,GACJ,GACJ;AAAA,QAjBK;AAAA,MAAA;AAAA,aAsBVR;AAAAA,IAAS;AACnBlR,YAAA0H;AAAA1H,YAAA6D;AAAA7D,YAAA/e;AAAA+e,YAAAmP;AAAAnP,YAAAgQ;AAAAhQ,YAAAoP;AAAApP,YAAA9f;AAAA8f,YAAA2H;AAAA3H,YAAAuO;AAAAvO,YAAAuP;AAAAvP,YAAAxU;AAAAwU,YAAA4Q;AAAA5Q,YAAAiI;AAAAjI,YAAA7f;AAAA6f,YAAAoQ;AAAApQ,YAAA+Q;AAAAA,EAAA,OAAA;AAAAA,UAAA/Q,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAgR;AAAA,MAAAhR,UAAAuQ,wBAAAvQ,EAAA,EAAA,MAAA6D,kBAAA7D,EAAA,EAAA,MAAA2O,kBAAA3O,UAAA6P,qBAAA7P,EAAA,EAAA,MAAA4O,UAAA5O,EAAA,EAAA,MAAA+O,oBAAA/O,EAAA,EAAA,MAAAkP,WAAAlP,UAAAgP,mBAAAhP,EAAA,EAAA,MAAA8P,iBAAA9P,EAAA,EAAA,MAAA8Q,OAAA9Q,UAAA+Q,OAAA/Q,EAAA,EAAA,MAAA2P,uBAAA;AA5DOqB,8BAAC,QAAA,EACmBnN,gBACO8L,uBACnBhB,gBACRkB,QAAAA,mBACOC,eACCS,gBAAAA,sBACG,mBAAAO,KACXlC,QACUG,kBACTG,SACQF,iBAChB+B,UAAAA,KAiDO;AAAS/Q,YAAAuQ;AAAAvQ,YAAA6D;AAAA7D,YAAA2O;AAAA3O,YAAA6P;AAAA7P,YAAA4O;AAAA5O,YAAA+O;AAAA/O,YAAAkP;AAAAlP,YAAAgP;AAAAhP,YAAA8P;AAAA9P,YAAA8Q;AAAA9Q,YAAA+Q;AAAA/Q,YAAA2P;AAAA3P,YAAAgR;AAAAA,EAAA,OAAA;AAAAA,UAAAhR,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA6R;AAAA,MAAA7R,EAAA,EAAA,MAAA4Q,6BAAA5Q,UAAAgR,KAAA;AA9Dba,8BAAA,uBAAA,UAAA,EAAwCjB,OAAAA,2BACpCI,UAAAA,KA8DJ;AAAkChR,YAAA4Q;AAAA5Q,YAAAgR;AAAAhR,YAAA6R;AAAAA,EAAA,OAAA;AAAAA,UAAA7R,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA8R;AAAA,MAAA9R,EAAA,EAAA,MAAA6R,OAAA7R,UAAAoQ,eAAA;AAhEtC0B,8BAAA,WAAA,UAAA,EAA4B1B,OAAAA,eACxByB,UAAAA,KAgEJ;AAAsB7R,YAAA6R;AAAA7R,YAAAoQ;AAAApQ,YAAA8R;AAAAA,EAAA,OAAA;AAAAA,UAAA9R,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA+R;AAAA,MAAA/R,EAAA,EAAA,MAAAkQ,gCAAAlQ,UAAA8R,KAAA;AAlE1BC,8BAAA,0BAAA,UAAA,EAA2C7B,OAAAA,8BACvC4B,UAAAA,KAkEJ;AAAqC9R,YAAAkQ;AAAAlQ,YAAA8R;AAAA9R,YAAA+R;AAAAA,EAAA,OAAA;AAAAA,UAAA/R,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAgS;AAAA,MAAAhS,EAAA,EAAA,MAAAyP,uBAAAzP,UAAA+R,KAAA;AArEzCC,UAAA,oBAAC,6BAAA,EAAmCvC,OAAAA,qBAEhCsC,UAAAA,KAoEJ;AAA8B/R,YAAAyP;AAAAzP,YAAA+R;AAAA/R,YAAAgS;AAAAA,EAAA,OAAA;AAAAA,UAAAhS,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAiS;AAAA,MAAAjS,EAAA,EAAA,MAAAuP,kBAAAvP,UAAAgS,KAAA;AAxEtCC,8BAAC,kBAAA,EACG,UAAA,oBAAC,0BAA8B1C,OAAAA,gBAC3ByC,eAuEJ,EAAA,CACJ;AAAmBhS,YAAAuP;AAAAvP,YAAAgS;AAAAhS,YAAAiS;AAAAA,EAAA,OAAA;AAAAA,UAAAjS,EAAA,EAAA;AAAA,EAAA;AAAA,SA1EnBiS;AA0EmB;AA5NpB,SAAAR,OAAAtuB,GAAA;AAAA,SA2LoIA,EAACwV,SAAU;AAAY;AA3L3J,SAAAuK,OAAA5T,GAAAC,GAAA;AAAA,SAAA;AAAA,IAAA,GAqCyBD;AAAAA,IAAC,GAC9BC;AAAAA,EAAAA;AAAC;AAtCG,SAAAyT,MAAAkP,IAAA;AAAA,SAAA;AAAA,IAAA,CAmCMA,GAAElrB,GAAA,GAAOkrB;AAAAA,EAAAA;AAAE;"}
|