@thetechfossil/auth2 1.2.1 → 1.2.3
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/README.NEW.md +365 -0
- package/dist/index.components.d.ts +112 -2
- package/dist/index.components.js +1996 -20
- package/dist/index.components.js.map +1 -1
- package/dist/index.components.mjs +1987 -22
- package/dist/index.components.mjs.map +1 -1
- package/dist/index.d.ts +252 -13
- package/dist/index.js +2393 -132
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2377 -134
- package/dist/index.mjs.map +1 -1
- package/dist/index.next.d.ts +219 -25
- package/dist/index.next.js +2362 -262
- package/dist/index.next.js.map +1 -1
- package/dist/index.next.mjs +2350 -262
- package/dist/index.next.mjs.map +1 -1
- package/dist/index.next.server.d.ts +107 -2
- package/dist/index.next.server.js +329 -20
- package/dist/index.next.server.js.map +1 -1
- package/dist/index.next.server.mjs +322 -21
- package/dist/index.next.server.mjs.map +1 -1
- package/dist/index.node.d.ts +70 -2
- package/dist/index.node.js +184 -18
- package/dist/index.node.js.map +1 -1
- package/dist/index.node.mjs +184 -18
- package/dist/index.node.mjs.map +1 -1
- package/next/index.js +2 -0
- package/next/index.mjs +2 -0
- package/next/package.json +5 -0
- package/next/server/package.json +5 -0
- package/next/server.js +2 -0
- package/next/server.mjs +2 -0
- package/package.json +34 -10
package/dist/index.next.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/http-client.ts","../src/core/auth-service.ts","../src/react/use-auth.ts","../src/react/components/LoginForm.tsx","../src/react/components/RegisterForm.tsx","../src/react/components/OtpForm.tsx","../src/react/components/AuthFlow.tsx","../src/react/components/EmailVerificationPage.tsx","../src/nextjs/use-next-auth.ts","../src/node/auth-client.ts","../src/nextjs/server-auth.ts"],"names":["useState","jsx","jsxs","email","useEffect","useCallback"],"mappings":"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","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';\r\n\r\nexport class HttpClient {\r\n private axiosInstance: AxiosInstance;\r\n private csrfToken: string | null = null;\r\n\r\n constructor(baseUrl: string, defaultHeaders: Record<string, string> = {}) {\r\n this.axiosInstance = axios.create({\r\n baseURL: baseUrl.replace(/\\/$/, ''),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...defaultHeaders\r\n },\r\n withCredentials: true, // Include cookies for CSRF\r\n timeout: 30000 // 30 second timeout\r\n });\r\n\r\n // Request interceptor to add CSRF token\r\n this.axiosInstance.interceptors.request.use(\r\n (config) => {\r\n // Add CSRF token to mutating requests\r\n if (this.csrfToken && ['post', 'put', 'delete', 'patch'].includes(config.method?.toLowerCase() || '')) {\r\n config.headers['x-csrf-token'] = this.csrfToken;\r\n }\r\n return config;\r\n },\r\n (error) => Promise.reject(error)\r\n );\r\n\r\n // Response interceptor for error handling and CSRF token refresh\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };\r\n\r\n // Handle CSRF token refresh on 403\r\n if (error.response?.status === 403 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n\r\n try {\r\n await this.refreshCsrfToken();\r\n if (originalRequest.headers) {\r\n originalRequest.headers['x-csrf-token'] = this.csrfToken!;\r\n }\r\n return this.axiosInstance(originalRequest);\r\n } catch (refreshError) {\r\n return Promise.reject(refreshError);\r\n }\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n public async get<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.get<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public async post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.post<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async put<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.put<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async delete<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.delete<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public setAuthToken(token: string): void {\r\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n public removeAuthToken(): void {\r\n delete this.axiosInstance.defaults.headers.common['Authorization'];\r\n }\r\n\r\n public setCsrfToken(token: string): void {\r\n this.csrfToken = token;\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.csrfToken;\r\n }\r\n\r\n public removeCsrfToken(): void {\r\n this.csrfToken = null;\r\n }\r\n\r\n private async refreshCsrfToken(): Promise<void> {\r\n try {\r\n const response = await this.axiosInstance.get<{ csrfToken: string }>('/api/v1/auth/csrf-token');\r\n this.csrfToken = response.data.csrfToken;\r\n } catch (error) {\r\n console.error('Failed to refresh CSRF token:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { HttpClient } from './http-client';\r\nimport {\r\n AuthResponse,\r\n LoginData,\r\n VerifyData,\r\n UpdateUserData,\r\n User,\r\n AuthConfig,\r\n RegisterData,\r\n OAuthProvider,\r\n CsrfTokenResponse\r\n} from '../types';\r\n\r\nexport class AuthService {\r\n private httpClient: HttpClient;\r\n private config: AuthConfig;\r\n private token: string | null = null;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n localStorageKey: 'auth_token',\r\n csrfEnabled: true,\r\n ...config\r\n };\r\n\r\n this.httpClient = new HttpClient(this.config.baseUrl);\r\n this.loadTokenFromStorage();\r\n\r\n // Initialize CSRF token if enabled\r\n if (this.config.csrfEnabled && typeof window !== 'undefined') {\r\n this.refreshCsrfToken();\r\n }\r\n }\r\n\r\n private loadTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n const token = localStorage.getItem(this.config.localStorageKey);\r\n if (token) {\r\n this.token = token;\r\n this.httpClient.setAuthToken(token);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private saveTokenToStorage(token: string): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.setItem(this.config.localStorageKey, token);\r\n } catch (error) {\r\n console.warn('Failed to save token to storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private removeTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.removeItem(this.config.localStorageKey);\r\n } catch (error) {\r\n console.warn('Failed to remove token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n public isAuthenticated(): boolean {\r\n return !!this.token;\r\n }\r\n\r\n public getToken(): string | null {\r\n return this.token;\r\n }\r\n\r\n public getCurrentUser(): User | null {\r\n if (!this.token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(atob(this.token.split('.')[1]));\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // CSRF Token Management\r\n public async refreshCsrfToken(): Promise<void> {\r\n if (!this.config.csrfEnabled) return;\r\n\r\n try {\r\n const response = await this.httpClient.get<CsrfTokenResponse>('/api/v1/auth/csrf-token');\r\n if (response.csrfToken) {\r\n this.httpClient.setCsrfToken(response.csrfToken);\r\n }\r\n } catch (error) {\r\n console.error('Failed to get CSRF token:', error);\r\n }\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.httpClient.getCsrfToken();\r\n }\r\n\r\n // OAuth Methods\r\n public loginWithOAuth(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth login is only available in browser environments');\r\n }\r\n\r\n const oauthUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}`;\r\n window.location.href = oauthUrl;\r\n }\r\n\r\n public linkOAuthProvider(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth linking is only available in browser environments');\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error('Must be authenticated to link OAuth provider');\r\n }\r\n\r\n const linkUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}/link`;\r\n window.location.href = linkUrl;\r\n }\r\n\r\n public async unlinkOAuthProvider(provider: OAuthProvider): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(\r\n `/api/v1/auth/oauth/${provider}/unlink`\r\n );\r\n return response;\r\n }\r\n\r\n // Standard Auth Methods\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/login', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n const registerData = { ...data };\r\n if (!registerData.frontendBaseUrl && typeof window !== 'undefined') {\r\n registerData.frontendBaseUrl =\r\n process.env.FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/register', registerData);\r\n\r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/verify', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async verifyEmailToken(token: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/auth/verify-email?token=${token}`);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.httpClient.removeCsrfToken();\r\n this.removeTokenFromStorage();\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/user', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this.httpClient.get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async forgotPassword(email: string): Promise<AuthResponse> {\r\n let frontendBaseUrl: string | undefined;\r\n if (typeof window !== 'undefined') {\r\n frontendBaseUrl =\r\n process.env.FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/forgot-password', { email });\r\n return response;\r\n }\r\n\r\n public async resetPassword(token: string, password: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/reset-password', { token, password });\r\n return response;\r\n }\r\n}","import { useState, useEffect, useCallback } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\ninterface UseAuthReturnBase {\r\n user: User | null;\r\n isAuthenticated: boolean;\r\n loading: boolean;\r\n register: (data: RegisterData) => Promise<AuthResponse>;\r\n login: (data: LoginData) => Promise<AuthResponse>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n logout: () => Promise<void>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n getAllUsers: () => Promise<User[]>;\r\n getUserById: (id: string) => Promise<User>;\r\n}\r\n\r\nexport const useAuth = (config: AuthConfig): UseAuthReturnBase => {\r\n const [authService] = useState<AuthService>(() => new AuthService(config));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isAuthenticated, setIsAuthenticated] = useState<boolean>(false);\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const checkAuthStatus = useCallback(() => {\r\n const authenticated = authService.isAuthenticated();\r\n setIsAuthenticated(authenticated);\r\n \r\n if (authenticated) {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setLoading(false);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const register = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n // Automatically add frontend base URL if not provided and we're on the client\r\n const registerData = { ...data };\r\n if (!registerData.frontendBaseUrl && typeof window !== 'undefined') {\r\n // Check for environment variable first, then fallback to window.location.origin\r\n registerData.frontendBaseUrl = \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.NEXT_PUBLIC_APP_URL || \r\n window.location.origin;\r\n }\r\n \r\n const response = await authService.register(registerData);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const login = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n // Update user state if login was successful and we have a user\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const logout = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n setIsAuthenticated(false);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getAllUsers = useCallback(async (): Promise<User[]> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getAllUsers();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getUserById = useCallback(async (id: string): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getUserById(id);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n return {\r\n user,\r\n isAuthenticated,\r\n loading,\r\n register,\r\n login,\r\n verify,\r\n verifyEmailToken,\r\n logout,\r\n updateProfile,\r\n getProfile,\r\n getAllUsers,\r\n getUserById\r\n };\r\n};","'use client';\n\nimport React, { useState } from 'react';\nimport { useAuth } from '../use-auth';\n// Removed CSS import - styles will be embedded directly\n\ninterface LoginFormProps {\n onSuccess?: (response: { message: string; email?: string; token?: string; success: boolean; user?: any }) => void;\n onLoginSuccess?: (email: string, needsOtpVerification: boolean) => void; // For backward compatibility\n onRegisterClick?: () => void;\n showRegisterLink?: boolean;\n config?: {\n baseUrl?: string;\n };\n oauthProviders?: Array<'google' | 'github'>;\n showOAuthButtons?: boolean;\n}\n\nexport const LoginForm: React.FC<LoginFormProps> = ({\n onSuccess,\n onLoginSuccess,\n onRegisterClick,\n showRegisterLink = true,\n config,\n oauthProviders = ['google', 'github'],\n showOAuthButtons = true\n}) => {\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [usePassword, setUsePassword] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [rememberMe, setRememberMe] = useState(false);\n\n const { login } = useAuth({\n baseUrl: config?.baseUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:7000')\n });\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsLoading(true);\n setError(null);\n\n try {\n let response;\n if (usePassword) {\n // Traditional email/password login\n response = await login({ email, password });\n } else {\n // OTP-based login\n response = await login({ email });\n }\n\n if (response.success) {\n // Call the new callback if provided\n onSuccess?.(response);\n\n // For backward compatibility, call the old callback if provided\n if (onLoginSuccess) {\n // Check if this is an OTP sent response or a successful login\n if (response.message === 'OTP sent to your email.') {\n // OTP was sent, need to verify\n onLoginSuccess(email, true);\n } else if (response.token) {\n // Direct login successful (email/password)\n onLoginSuccess(email, false);\n } else {\n // Default to needing OTP verification for safety\n onLoginSuccess(email, true);\n }\n }\n } else {\n setError(response.message || 'Login failed');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\n } finally {\n setIsLoading(false);\n }\n };\n\n const toggleAuthMethod = () => {\n setUsePassword(!usePassword);\n setError(null); // Clear error when switching methods\n };\n\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n\n return (\n <div style={{\n maxWidth: '400px',\n margin: '0 auto',\n padding: '30px',\n borderRadius: '12px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\n backgroundColor: '#ffffff',\n border: '1px solid #eaeaea'\n }}>\n <form onSubmit={handleSubmit} style={{\n display: 'flex',\n flexDirection: 'column'\n }}>\n <h2 style={{\n textAlign: 'center',\n marginBottom: '24px',\n color: '#1f2937',\n fontSize: '24px',\n fontWeight: 600\n }}>{usePassword ? 'Login with Password' : 'Login with OTP'}</h2>\n\n {error && (\n <div style={{\n padding: '12px 16px',\n marginBottom: '20px',\n backgroundColor: '#f8d7da',\n color: '#721c24',\n border: '1px solid #f5c6cb',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: 500\n }}>\n {error}\n </div>\n )}\n\n <div style={{\n marginBottom: '20px'\n }}>\n <label htmlFor=\"email\" style={{\n display: 'block',\n marginBottom: '8px',\n fontWeight: 500,\n color: '#374151',\n fontSize: '14px'\n }}>Email:</label>\n <input\n id=\"email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '12px 16px',\n border: '1px solid #ddd',\n borderRadius: '8px',\n fontSize: '16px',\n boxSizing: 'border-box',\n color: '#111827',\n transition: 'all 0.2s ease',\n backgroundColor: '#ffffff'\n }}\n placeholder=\"Enter your email\"\n />\n </div>\n\n {usePassword && (\n <div style={{\n marginBottom: '20px',\n position: 'relative'\n }}>\n <label htmlFor=\"login-password\" style={{\n display: 'block',\n marginBottom: '8px',\n fontWeight: 500,\n color: '#555',\n fontSize: '14px'\n }}>Password:</label>\n <input\n id=\"login-password\"\n type={showPassword ? \"text\" : \"password\"}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n required\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '12px 16px',\n border: '1px solid #ddd',\n borderRadius: '8px',\n fontSize: '16px',\n boxSizing: 'border-box',\n color: '#333',\n transition: 'all 0.2s ease',\n backgroundColor: '#fafafa'\n }}\n placeholder=\"Enter your password\"\n />\n <button\n type=\"button\"\n onClick={togglePasswordVisibility}\n disabled={isLoading}\n style={{\n position: 'absolute',\n right: '12px',\n top: '38px',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: '#666',\n fontSize: '14px'\n }}\n >\n {showPassword ? 'Hide' : 'Show'}\n </button>\n </div>\n )}\n\n {usePassword && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '16px',\n marginTop: '8px'\n }}>\n <input\n type=\"checkbox\"\n id=\"remember-me\"\n checked={rememberMe}\n onChange={(e) => setRememberMe(e.target.checked)}\n disabled={isLoading}\n style={{\n marginRight: '8px',\n cursor: 'pointer',\n width: '16px',\n height: '16px'\n }}\n />\n <label\n htmlFor=\"remember-me\"\n style={{\n fontSize: '14px',\n color: '#666',\n cursor: 'pointer',\n userSelect: 'none'\n }}\n >\n Remember me\n </label>\n </div>\n )}\n\n <button\n type=\"submit\"\n disabled={isLoading}\n style={{\n padding: '14px',\n backgroundColor: '#007bff',\n color: 'white',\n border: 'none',\n borderRadius: '8px',\n fontSize: '16px',\n fontWeight: 600,\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n marginTop: '8px'\n }}\n >\n {isLoading ? (usePassword ? 'Logging in...' : 'Sending OTP...') : (usePassword ? 'Login' : 'Send OTP')}\n </button>\n\n <div style={{\n textAlign: 'center',\n marginTop: '20px',\n paddingTop: '20px',\n borderTop: '1px solid #eee'\n }}>\n <button\n type=\"button\"\n onClick={toggleAuthMethod}\n disabled={isLoading}\n style={{\n background: 'none',\n border: 'none',\n color: '#007bff',\n textDecoration: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n padding: '0',\n transition: 'color 0.2s ease'\n }}\n >\n {usePassword ? 'Login with OTP instead' : 'Login with password instead'}\n </button>\n </div>\n\n {showOAuthButtons && oauthProviders.length > 0 && (\n <div style={{\n marginTop: '20px',\n paddingTop: '20px',\n borderTop: '1px solid #eee'\n }}>\n <div style={{\n position: 'relative',\n marginBottom: '16px'\n }}>\n <div style={{\n position: 'absolute',\n top: '50%',\n left: 0,\n right: 0,\n height: '1px',\n backgroundColor: '#eee'\n }} />\n <div style={{\n position: 'relative',\n textAlign: 'center'\n }}>\n <span style={{\n backgroundColor: '#ffffff',\n padding: '0 12px',\n color: '#666',\n fontSize: '14px'\n }}>Or continue with</span>\n </div>\n </div>\n\n <div style={{\n display: 'grid',\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\n gap: '12px'\n }}>\n {oauthProviders.includes('google') && (\n <a\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/google`}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '10px 16px',\n backgroundColor: '#ffffff',\n border: '1px solid #ddd',\n borderRadius: '8px',\n color: '#333',\n textDecoration: 'none',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'all 0.2s ease'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#f8f8f8';\n e.currentTarget.style.borderColor = '#007bff';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#ffffff';\n e.currentTarget.style.borderColor = '#ddd';\n }}\n >\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n Google\n </a>\n )}\n\n {oauthProviders.includes('github') && (\n <a\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/github`}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '10px 16px',\n backgroundColor: '#24292e',\n border: '1px solid #24292e',\n borderRadius: '8px',\n color: '#ffffff',\n textDecoration: 'none',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'all 0.2s ease'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#1b1f23';\n e.currentTarget.style.borderColor = '#1b1f23';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#24292e';\n e.currentTarget.style.borderColor = '#24292e';\n }}\n >\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n GitHub\n </a>\n )}\n </div>\n </div>\n )}\n\n {showRegisterLink && (\n <div style={{\n textAlign: 'center',\n marginTop: '20px',\n paddingTop: '20px',\n borderTop: '1px solid #eee'\n }}>\n <p style={{\n color: '#666',\n fontSize: '14px'\n }}>\n Don't have an account?{' '}\n <button\n type=\"button\"\n onClick={onRegisterClick}\n disabled={isLoading}\n style={{\n background: 'none',\n border: 'none',\n color: '#007bff',\n textDecoration: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n padding: '0',\n transition: 'color 0.2s ease'\n }}\n >\n Register\n </button>\n </p>\n </div>\n )}\n </form>\n </div>\n );\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\n// Removed CSS import - styles will be embedded directly\r\nimport { AuthConfig } from '../../types';\r\n\r\ninterface RegisterFormProps {\r\n onRegisterSuccess?: () => void;\r\n onLoginClick?: () => void;\r\n showLoginLink?: boolean;\r\n authConfig?: AuthConfig;\r\n oauthProviders?: Array<'google' | 'github'>;\r\n showOAuthButtons?: boolean;\r\n}\r\n\r\nexport const RegisterForm: React.FC<RegisterFormProps> = ({\r\n onRegisterSuccess,\r\n onLoginClick,\r\n showLoginLink = true,\r\n authConfig,\r\n oauthProviders = ['google', 'github'],\r\n showOAuthButtons = true\r\n}) => {\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; score: number; label: string } => {\r\n if (!pwd) return { strength: 'weak', score: 0, label: '' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', score, label: 'Weak' };\r\n if (score <= 3) return { strength: 'medium', score, label: 'Medium' };\r\n return { strength: 'strong', score, label: 'Strong' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n // Use the provided authConfig or a default one\r\n const config = authConfig || {\r\n baseUrl: typeof window !== 'undefined'\r\n ? (process.env.NEXT_PUBLIC_AUTH_API_URL || window.location.origin)\r\n : 'http://localhost:7000'\r\n };\r\n\r\n const { register } = useAuth(config);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Validate password confirmation\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n // Validate password strength\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters long');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n // Pass the frontend base URL to ensure correct verification links\r\n const registerData = {\r\n name,\r\n email,\r\n password,\r\n frontendBaseUrl: typeof window !== 'undefined'\r\n ? (process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL || window.location.origin)\r\n : undefined\r\n };\r\n\r\n const response = await register(registerData);\r\n if (response.success) {\r\n onRegisterSuccess?.();\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Register</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#f8d7da',\r\n color: '#721c24',\r\n border: '1px solid #f5c6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Name:</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: '#111827',\r\n transition: 'all 0.2s ease',\r\n backgroundColor: '#ffffff'\r\n }}\r\n placeholder=\"Enter your name\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"register-email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#555',\r\n fontSize: '14px'\r\n }}>Email:</label>\r\n <input\r\n id=\"register-email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: '#333',\r\n transition: 'all 0.2s ease',\r\n backgroundColor: '#fafafa'\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#555',\r\n fontSize: '14px'\r\n }}>Password:</label>\r\n <input\r\n id=\"password\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: '#333',\r\n transition: 'all 0.2s ease',\r\n backgroundColor: '#fafafa'\r\n }}\r\n placeholder=\"Enter your password\"\r\n minLength={6}\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"confirm-password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#555',\r\n fontSize: '14px'\r\n }}>Confirm Password:</label>\r\n <input\r\n id=\"confirm-password\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: '#333',\r\n transition: 'all 0.2s ease',\r\n backgroundColor: '#fafafa'\r\n }}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '8px'\r\n }}\r\n >\r\n {isLoading ? 'Registering...' : 'Register'}\r\n </button>\r\n\r\n {showOAuthButtons && oauthProviders.length > 0 && (\r\n <div style={{\r\n marginTop: '20px',\r\n paddingTop: '20px',\r\n borderTop: '1px solid #eee'\r\n }}>\r\n <div style={{\r\n position: 'relative',\r\n marginBottom: '16px'\r\n }}>\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: 0,\r\n right: 0,\r\n height: '1px',\r\n backgroundColor: '#eee'\r\n }} />\r\n <div style={{\r\n position: 'relative',\r\n textAlign: 'center'\r\n }}>\r\n <span style={{\r\n backgroundColor: '#ffffff',\r\n padding: '0 12px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>Or continue with</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{\r\n display: 'grid',\r\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\r\n gap: '12px'\r\n }}>\r\n {oauthProviders.includes('google') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/google`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n color: '#333',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#f8f8f8';\r\n e.currentTarget.style.borderColor = '#007bff';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#ffffff';\r\n e.currentTarget.style.borderColor = '#ddd';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"#4285F4\"\r\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\r\n />\r\n <path\r\n fill=\"#34A853\"\r\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\r\n />\r\n <path\r\n fill=\"#FBBC05\"\r\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\r\n />\r\n <path\r\n fill=\"#EA4335\"\r\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\r\n />\r\n </svg>\r\n Google\r\n </a>\r\n )}\r\n\r\n {oauthProviders.includes('github') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/github`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#24292e',\r\n border: '1px solid #24292e',\r\n borderRadius: '8px',\r\n color: '#ffffff',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#1b1f23';\r\n e.currentTarget.style.borderColor = '#1b1f23';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#24292e';\r\n e.currentTarget.style.borderColor = '#24292e';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\r\n </svg>\r\n GitHub\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showLoginLink && (\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '20px',\r\n paddingTop: '20px',\r\n borderTop: '1px solid #eee'\r\n }}>\r\n <p style={{\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Already have an account?{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onLoginClick}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Login\r\n </button>\r\n </p>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface OtpFormProps {\r\n email: string;\r\n onVerifySuccess?: () => void;\r\n onBackToLogin?: () => void;\r\n}\r\n\r\nexport const OtpForm: React.FC<OtpFormProps> = ({\r\n email,\r\n onVerifySuccess,\r\n onBackToLogin\r\n}) => {\r\n const [otp, setOtp] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [resendCooldown, setResendCooldown] = useState(0);\r\n const [resendLoading, setResendLoading] = useState(false);\r\n \r\n const { verify, login } = useAuth({\r\n baseUrl: typeof window !== 'undefined' ? window.location.origin : 'http://localhost:7000'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n \r\n // Validate OTP format\r\n if (!/^\\d{6}$/.test(otp)) {\r\n setError('Please enter a valid 6-digit OTP');\r\n setIsLoading(false);\r\n return;\r\n }\r\n \r\n try {\r\n const response = await verify({ email, otp });\r\n if (response.success) {\r\n onVerifySuccess?.();\r\n } else {\r\n setError(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleOtpChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n // Allow only digits and limit to 6 characters\r\n if (/^\\d{0,6}$/.test(value)) {\r\n setOtp(value);\r\n }\r\n };\r\n\r\n const handleResendOtp = async () => {\r\n if (resendCooldown > 0 || resendLoading) return;\r\n \r\n setResendLoading(true);\r\n setError(null);\r\n \r\n try {\r\n const response = await login({ email });\r\n if (response.success) {\r\n // Start 60 second cooldown\r\n setResendCooldown(60);\r\n const interval = setInterval(() => {\r\n setResendCooldown((prev) => {\r\n if (prev <= 1) {\r\n clearInterval(interval);\r\n return 0;\r\n }\r\n return prev - 1;\r\n });\r\n }, 1000);\r\n } else {\r\n setError(response.message || 'Failed to resend OTP');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to resend OTP');\r\n } finally {\r\n setResendLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Verify OTP</h2>\r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#4b5563',\r\n fontSize: '14px'\r\n }}>Enter the 6-digit code sent to <strong style={{ color: '#111827' }}>{email}</strong></p>\r\n \r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#f8d7da',\r\n color: '#721c24',\r\n border: '1px solid #f5c6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n \r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>OTP Code:</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={handleOtpChange}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '20px',\r\n boxSizing: 'border-box',\r\n color: '#111827',\r\n transition: 'all 0.2s ease',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n letterSpacing: '5px'\r\n }}\r\n maxLength={6}\r\n placeholder=\"123456\"\r\n autoFocus\r\n />\r\n </div>\r\n \r\n <button \r\n type=\"submit\" \r\n disabled={isLoading || otp.length !== 6}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '8px'\r\n }}\r\n >\r\n {isLoading ? 'Verifying...' : 'Verify OTP'}\r\n </button>\r\n \r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '20px',\r\n paddingTop: '20px',\r\n borderTop: '1px solid #eee'\r\n }}>\r\n <button \r\n type=\"button\" \r\n onClick={handleResendOtp}\r\n disabled={isLoading || resendLoading || resendCooldown > 0}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: resendCooldown > 0 ? '#999' : '#007bff',\r\n textDecoration: 'none',\r\n cursor: resendCooldown > 0 ? 'not-allowed' : 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n marginBottom: '12px',\r\n transition: 'color 0.2s ease',\r\n display: 'block',\r\n width: '100%'\r\n }}\r\n >\r\n {resendLoading ? 'Sending...' : resendCooldown > 0 ? `Resend OTP in ${resendCooldown}s` : 'Resend OTP'}\r\n </button>\r\n <button \r\n type=\"button\" \r\n onClick={onBackToLogin}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Back to Login\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { LoginForm } from './LoginForm';\r\nimport { RegisterForm } from './RegisterForm';\r\nimport { OtpForm } from './OtpForm';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ntype AuthStep = 'login' | 'register' | 'otp';\r\n\r\ninterface AuthFlowProps {\r\n onAuthComplete?: () => void;\r\n initialStep?: AuthStep;\r\n showTitle?: boolean;\r\n}\r\n\r\nexport const AuthFlow: React.FC<AuthFlowProps> = ({ \r\n onAuthComplete,\r\n initialStep = 'login',\r\n showTitle = true\r\n}) => {\r\n const [step, setStep] = useState<AuthStep>(initialStep);\r\n const [email, setEmail] = useState('');\r\n const [message, setMessage] = useState<string | null>(null);\r\n\r\n const handleLoginSuccess = (email: string, needsOtpVerification: boolean) => {\r\n // Set email\r\n setEmail(email);\r\n \r\n if (needsOtpVerification) {\r\n // Move to OTP verification step\r\n setStep('otp');\r\n setMessage(null);\r\n } else {\r\n // Login is complete, notify parent\r\n setMessage(null);\r\n onAuthComplete?.();\r\n }\r\n };\r\n\r\n const handleRegisterSuccess = () => {\r\n // Registration successful, show message and redirect to login\r\n setMessage('Registration successful! Please check your email for verification.');\r\n // Automatically switch to login after a short delay\r\n setTimeout(() => {\r\n setStep('login');\r\n setMessage(null);\r\n }, 3000);\r\n };\r\n\r\n const handleVerifySuccess = () => {\r\n // Authentication complete\r\n setMessage(null);\r\n onAuthComplete?.();\r\n };\r\n\r\n const handleBackToLogin = () => {\r\n setStep('login');\r\n setMessage(null);\r\n };\r\n\r\n const renderCurrentStep = () => {\r\n switch (step) {\r\n case 'login':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'register':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Create Account</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <RegisterForm\r\n onRegisterSuccess={handleRegisterSuccess}\r\n onLoginClick={() => setStep('login')}\r\n showLoginLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'otp':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Verify Your Email</h1>}\r\n <OtpForm\r\n email={email}\r\n onVerifySuccess={handleVerifySuccess}\r\n onBackToLogin={handleBackToLogin}\r\n />\r\n </>\r\n );\r\n \r\n default:\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n minHeight: '300px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n {renderCurrentStep()}\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../use-auth';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface EmailVerificationPageProps {\r\n token: string;\r\n onVerificationSuccess?: () => void;\r\n onVerificationError?: (error: string) => void;\r\n baseUrl?: string;\r\n}\r\n\r\nexport const EmailVerificationPage: React.FC<EmailVerificationPageProps> = ({\r\n token,\r\n onVerificationSuccess,\r\n onVerificationError,\r\n baseUrl\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [message, setMessage] = useState('');\r\n const [isSuccess, setIsSuccess] = useState(false);\r\n \r\n const { verifyEmailToken } = useAuth({\r\n baseUrl: baseUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:7000')\r\n });\r\n\r\n useEffect(() => {\r\n const verifyEmail = async () => {\r\n if (!token) {\r\n setIsLoading(false);\r\n setMessage('Invalid verification token');\r\n setIsSuccess(false);\r\n onVerificationError?.('Invalid verification token');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(token);\r\n \r\n if (response.success) {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verified successfully!');\r\n setIsSuccess(true);\r\n onVerificationSuccess?.();\r\n } else {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verification failed');\r\n setIsSuccess(false);\r\n onVerificationError?.(response.message || 'Email verification failed');\r\n }\r\n } catch (err) {\r\n setIsLoading(false);\r\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred';\r\n setMessage(errorMessage);\r\n setIsSuccess(false);\r\n onVerificationError?.(errorMessage);\r\n }\r\n };\r\n\r\n verifyEmail();\r\n }, [token, verifyEmailToken, onVerificationSuccess, onVerificationError]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Verifying your email...</h2>\r\n <div style={{\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n width: '40px',\r\n height: '40px',\r\n animation: 'spin 2s linear infinite',\r\n margin: '20px auto'\r\n }}></div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Email Verification</h2>\r\n <div style={{\r\n padding: '16px 20px',\r\n margin: '24px 0',\r\n borderRadius: '8px',\r\n fontSize: '15px',\r\n fontWeight: 500,\r\n backgroundColor: isSuccess ? '#d4edda' : '#f8d7da',\r\n color: isSuccess ? '#155724' : '#721c24',\r\n border: isSuccess ? '1px solid #c3e6cb' : '1px solid #f5c6cb'\r\n }}>\r\n {message}\r\n </div>\r\n {isSuccess && (\r\n <div style={{\r\n marginTop: '24px'\r\n }}>\r\n <p style={{ color: 'black' }}>Your email has been successfully verified!</p>\r\n <button \r\n onClick={() => window.location.href = '/login'}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};","import { useState, useEffect, useCallback } from 'react';\nimport { AuthService } from '../core/auth-service';\nimport { \n AuthResponse, \n LoginData, \n VerifyData, \n UpdateUserData, \n User,\n AuthConfig,\n RegisterData\n} from '../types';\n\ninterface UseNextAuthReturn {\n user: User | null;\n isAuthenticated: boolean;\n loading: boolean;\n register: (data: RegisterData) => Promise<AuthResponse>;\n login: (data: LoginData) => Promise<AuthResponse>;\n verify: (data: VerifyData) => Promise<AuthResponse>;\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\n logout: () => Promise<void>;\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\n getProfile: () => Promise<User>;\n getAllUsers: () => Promise<User[]>;\n getUserById: (id: string) => Promise<User>;\n forgotPassword: (email: string) => Promise<AuthResponse>;\n resetPassword: (token: string, password: string) => Promise<AuthResponse>;\n setToken: (token: string) => void;\n clearToken: () => void;\n}\n\n// Check if we're running on the server or client\nconst isServer = typeof window === 'undefined';\n\nexport const useNextAuth = (config: AuthConfig): UseNextAuthReturn => {\n const [authService] = useState<AuthService>(() => {\n // Create AuthService instance\n const service = new AuthService(config);\n \n // On the server, we need to manually set token if provided\n if (isServer && config.token) {\n (service as any)['token'] = config.token;\n (service as any)['httpClient'].setAuthToken(config.token);\n }\n \n return service;\n });\n \n const [user, setUser] = useState<User | null>(null);\n const [isAuthenticated, setIsAuthenticated] = useState<boolean>(false);\n const [loading, setLoading] = useState<boolean>(true);\n\n const checkAuthStatus = useCallback(() => {\n // On server, we can't access localStorage, so we rely on token in config\n if (isServer) {\n const token = config.token || (authService as any).getToken();\n const authenticated = !!token;\n setIsAuthenticated(authenticated);\n \n if (authenticated && token) {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n setUser(payload.user || null);\n } catch (error) {\n console.error('Failed to parse user from token:', error);\n setUser(null);\n }\n } else {\n setUser(null);\n }\n } else {\n // On client, use the existing logic\n const authenticated = authService.isAuthenticated();\n setIsAuthenticated(authenticated);\n \n if (authenticated) {\n const currentUser = authService.getCurrentUser();\n setUser(currentUser);\n } else {\n setUser(null);\n }\n }\n \n setLoading(false);\n }, [authService, config.token]);\n\n useEffect(() => {\n checkAuthStatus();\n }, [checkAuthStatus]);\n\n const register = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\n setLoading(true);\n try {\n // Automatically add frontend base URL if not provided and we're on the client\n const registerData = { ...data };\n if (!registerData.frontendBaseUrl && typeof window !== 'undefined') {\n // Check for environment variable first, then fallback to window.location.origin\n registerData.frontendBaseUrl = \n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \n process.env.NEXT_PUBLIC_APP_URL || \n process.env.REACT_APP_FRONTEND_BASE_URL ||\n window.location.origin;\n }\n \n const response = await authService.register(registerData);\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const login = useCallback(async (data: LoginData): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.login(data);\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.verify(data);\n if (response.success && response.user) {\n setUser(response.user);\n setIsAuthenticated(true);\n }\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.verifyEmailToken(token);\n if (response.success && response.user) {\n setUser(response.user);\n setIsAuthenticated(true);\n }\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const logout = useCallback(async (): Promise<void> => {\n setLoading(true);\n try {\n await authService.logout();\n setUser(null);\n setIsAuthenticated(false);\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.updateProfile(data);\n if (response.success && response.user) {\n setUser(response.user);\n }\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const getProfile = useCallback(async (): Promise<User> => {\n setLoading(true);\n try {\n const userData = await authService.getProfile();\n setUser(userData);\n return userData;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const getAllUsers = useCallback(async (): Promise<User[]> => {\n setLoading(true);\n try {\n return await authService.getAllUsers();\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const getUserById = useCallback(async (id: string): Promise<User> => {\n setLoading(true);\n try {\n return await authService.getUserById(id);\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const forgotPassword = useCallback(async (email: string): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.forgotPassword(email);\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const resetPassword = useCallback(async (token: string, password: string): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.resetPassword(token, password);\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n // Server-side methods for manually setting/clearing tokens\n const setToken = useCallback((token: string) => {\n (authService as any)['token'] = token;\n (authService as any)['httpClient'].setAuthToken(token);\n setIsAuthenticated(true);\n\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n setUser(payload.user || null);\n } catch (error) {\n console.error('Failed to parse user from token:', error);\n setUser(null);\n }\n }, [authService]);\n\n const clearToken = useCallback(() => {\n (authService as any)['token'] = null;\n (authService as any)['httpClient'].removeAuthToken();\n setIsAuthenticated(false);\n setUser(null);\n }, [authService]);\n\n return {\n user,\n isAuthenticated,\n loading,\n register,\n login,\n verify,\n verifyEmailToken,\n logout,\n updateProfile,\n getProfile,\n getAllUsers,\n getUserById,\n forgotPassword,\n resetPassword,\n setToken,\n clearToken\n };\n};","import { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\nexport class AuthClient extends AuthService {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Override methods that require browser-specific features\r\n // For Node.js, token persistence must be handled manually\r\n \r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // Automatically add frontend base URL if not provided\r\n const registerData = { ...data };\r\n if (!registerData.frontendBaseUrl) {\r\n // Check for environment variable\r\n registerData.frontendBaseUrl = \r\n process.env.FRONTEND_BASE_URL || \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL;\r\n }\r\n \r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/register', registerData);\r\n \r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/login', data);\r\n \r\n // Handle successful login with token\r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n // Handle OTP sent response\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n \r\n // Handle verification response\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/verify', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n this['token'] = null;\r\n this['httpClient'].removeAuthToken();\r\n // Note: In Node.js, you need to handle token removal manually\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this['httpClient'].get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/user/update/name', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n}","import { AuthClient } from '../node/auth-client';\r\nimport { AuthConfig, User, RegisterData } from '../types';\r\n\r\n// Server-side authentication utility for Next.js\r\nexport class NextServerAuth extends AuthClient {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Parse token from request headers\r\n public static parseTokenFromHeaders(headers: Headers): string | null {\r\n const authHeader = headers.get('authorization');\r\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\r\n return null;\r\n }\r\n return authHeader.substring(7); // Remove 'Bearer ' prefix\r\n }\r\n\r\n // Parse token from cookies\r\n public static parseTokenFromCookies(cookies: string): string | null {\r\n const cookieArray = cookies.split(';');\r\n for (const cookie of cookieArray) {\r\n const [name, value] = cookie.trim().split('=');\r\n if (name === 'auth_token') {\r\n return decodeURIComponent(value);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // Parse token from Next.js request object\r\n public static parseTokenFromRequest(req: any): string | null {\r\n // Try to get token from headers first\r\n if (req.headers) {\r\n const authHeader = req.headers.authorization || req.headers.Authorization;\r\n if (authHeader && authHeader.startsWith('Bearer ')) {\r\n return authHeader.substring(7);\r\n }\r\n }\r\n\r\n // Try to get token from cookies\r\n if (req.cookies) {\r\n return req.cookies.auth_token || null;\r\n }\r\n\r\n // Try to get token from cookie header\r\n if (req.headers && req.headers.cookie) {\r\n return this.parseTokenFromCookies(req.headers.cookie);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // Verify token and get user\r\n public async verifyToken(token: string): Promise<User | null> {\r\n try {\r\n // Set the token for this request\r\n (this as any)['httpClient'].setAuthToken(token);\r\n \r\n // Get user profile to verify token\r\n const user = await this.getProfile();\r\n return user;\r\n } catch (error) {\r\n console.error('Token verification failed:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // Create authenticated client with token\r\n public static createAuthenticatedClient(config: AuthConfig, token: string): NextServerAuth {\r\n const client = new NextServerAuth(config);\r\n (client as any)['httpClient'].setAuthToken(token);\r\n (client as any)['token'] = token;\r\n return client;\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/http-client.ts","../src/core/auth-service.ts","../src/react/use-auth.ts","../src/react/AuthProvider.tsx","../src/react/components/LoginForm.tsx","../src/react/components/RegisterForm.tsx","../src/react/components/OtpForm.tsx","../src/react/components/AuthFlow.tsx","../src/react/components/EmailVerificationPage.tsx","../src/react/components/SignIn.tsx","../src/react/components/SignUp.tsx","../src/react/components/SignOut.tsx","../src/react/components/UserButton.tsx","../src/react/components/ProtectedRoute.tsx","../src/react/components/PublicRoute.tsx","../src/react/components/VerifyEmail.tsx","../src/react/components/ForgotPassword.tsx","../src/react/components/ResetPassword.tsx","../src/react/components/ChangePassword.tsx","../src/react/components/UserProfile.tsx","../src/nextjs/use-next-auth.ts"],"names":["useState","useEffect","useCallback","useAuth","jsx","jsxs","email","Fragment"],"mappings":";AAAA,OAAO,WAA8D;AAE9D,IAAM,aAAN,MAAiB;AAAA,EAKtB,YAAY,SAAiB,iBAAyC,CAAC,GAAG;AAH1E,SAAQ,YAA2B;AACnC,SAAQ,kBAAiC;AAGvC,SAAK,gBAAgB,MAAM,OAAO;AAAA,MAChC,SAAS,QAAQ,QAAQ,OAAO,EAAE;AAAA,MAClC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG;AAAA,MACL;AAAA,MACA,iBAAiB;AAAA;AAAA,MACjB,SAAS;AAAA;AAAA,IACX,CAAC;AAGD,SAAK,cAAc,aAAa,QAAQ;AAAA,MACtC,CAAC,WAAW;AAEV,YAAI,KAAK,aAAa,CAAC,QAAQ,OAAO,UAAU,OAAO,EAAE,SAAS,OAAO,QAAQ,YAAY,KAAK,EAAE,GAAG;AACrG,iBAAO,QAAQ,cAAc,IAAI,KAAK;AAAA,QACxC;AAGA,YAAI,KAAK,iBAAiB;AACxB,iBAAO,QAAQ,gBAAgB,IAAI,KAAK;AAAA,QAC1C;AAEA,eAAO;AAAA,MACT;AAAA,MACA,CAAC,UAAU,QAAQ,OAAO,KAAK;AAAA,IACjC;AAGA,SAAK,cAAc,aAAa,SAAS;AAAA,MACvC,CAAC,aAAa;AAAA,MACd,OAAO,UAAsB;AAC3B,cAAM,kBAAkB,MAAM;AAG9B,YAAI,MAAM,UAAU,WAAW,OAAO,CAAC,gBAAgB,QAAQ;AAC7D,0BAAgB,SAAS;AAEzB,cAAI;AACF,kBAAM,KAAK,iBAAiB;AAC5B,gBAAI,gBAAgB,SAAS;AAC3B,8BAAgB,QAAQ,cAAc,IAAI,KAAK;AAAA,YACjD;AACA,mBAAO,KAAK,cAAc,eAAe;AAAA,UAC3C,SAAS,cAAP;AACA,mBAAO,QAAQ,OAAO,YAAY;AAAA,UACpC;AAAA,QACF;AAEA,eAAO,QAAQ,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,IAAO,UAAkB,SAA8C;AAClF,UAAM,WAAW,MAAM,KAAK,cAAc,IAAO,UAAU,EAAE,QAAQ,CAAC;AACtE,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,KAAQ,UAAkB,MAAY,SAA8C;AAC/F,UAAM,WAAW,MAAM,KAAK,cAAc,KAAQ,UAAU,MAAM,EAAE,QAAQ,CAAC;AAC7E,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,IAAO,UAAkB,MAAY,SAA8C;AAC9F,UAAM,WAAW,MAAM,KAAK,cAAc,IAAO,UAAU,MAAM,EAAE,QAAQ,CAAC;AAC5E,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,OAAU,UAAkB,SAA8C;AACrF,UAAM,WAAW,MAAM,KAAK,cAAc,OAAU,UAAU,EAAE,QAAQ,CAAC;AACzE,WAAO,SAAS;AAAA,EAClB;AAAA,EAEO,aAAa,OAAqB;AACvC,SAAK,cAAc,SAAS,QAAQ,OAAO,eAAe,IAAI,UAAU;AAAA,EAC1E;AAAA,EAEO,kBAAwB;AAC7B,WAAO,KAAK,cAAc,SAAS,QAAQ,OAAO,eAAe;AAAA,EACnE;AAAA,EAEO,aAAa,OAAqB;AACvC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEO,eAA8B;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,kBAAwB;AAC7B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEO,mBAAmB,KAAmB;AAC3C,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEO,qBAAoC;AACzC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,wBAA8B;AACnC,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,MAAc,mBAAkC;AAC9C,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,cAAc,IAA2B,yBAAyB;AAC9F,WAAK,YAAY,SAAS,KAAK;AAAA,IACjC,SAAS,OAAP;AACA,cAAQ,MAAM,iCAAiC,KAAK;AACpD,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AC9GO,IAAM,cAAN,MAAkB;AAAA,EAKvB,YAAY,QAAoB;AAFhC,SAAQ,QAAuB;AAG7B,SAAK,SAAS;AAAA,MACZ,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,GAAG;AAAA,IACL;AAEA,SAAK,aAAa,IAAI,WAAW,KAAK,OAAO,OAAO;AACpD,SAAK,qBAAqB;AAG1B,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,kBACJ,QAAQ,IAAI,iCACZ,QAAQ,IAAI,+BACZ,QAAQ,IAAI,uBACZ,OAAO,SAAS;AAElB,UAAI,iBAAiB;AACnB,aAAK,WAAW,mBAAmB,eAAe;AAAA,MACpD;AAAA,IACF;AAGA,QAAI,KAAK,OAAO,eAAe,OAAO,WAAW,aAAa;AAC5D,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,uBAA6B;AACnC,QAAI,OAAO,WAAW,eAAe,KAAK,OAAO,iBAAiB;AAChE,UAAI;AACF,cAAM,QAAQ,aAAa,QAAQ,KAAK,OAAO,eAAe;AAC9D,YAAI,OAAO;AACT,eAAK,QAAQ;AACb,eAAK,WAAW,aAAa,KAAK;AAAA,QACpC;AAAA,MACF,SAAS,OAAP;AACA,gBAAQ,KAAK,sCAAsC,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB,OAAqB;AAC9C,QAAI,OAAO,WAAW,eAAe,KAAK,OAAO,iBAAiB;AAChE,UAAI;AACF,qBAAa,QAAQ,KAAK,OAAO,iBAAiB,KAAK;AAAA,MACzD,SAAS,OAAP;AACA,gBAAQ,KAAK,oCAAoC,KAAK;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,yBAA+B;AACrC,QAAI,OAAO,WAAW,eAAe,KAAK,OAAO,iBAAiB;AAChE,UAAI;AACF,qBAAa,WAAW,KAAK,OAAO,eAAe;AAAA,MACrD,SAAS,OAAP;AACA,gBAAQ,KAAK,wCAAwC,KAAK;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA,EAEO,kBAA2B;AAChC,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA,EAEO,WAA0B;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,iBAA8B;AACnC,QAAI,CAAC,KAAK;AAAO,aAAO;AAExB,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACzD,aAAO,QAAQ,QAAQ;AAAA,IACzB,SAAS,OAAP;AACA,cAAQ,MAAM,oCAAoC,KAAK;AACvD,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAa,mBAAkC;AAC7C,QAAI,CAAC,KAAK,OAAO;AAAa;AAE9B,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,WAAW,IAAuB,yBAAyB;AACvF,UAAI,SAAS,WAAW;AACtB,aAAK,WAAW,aAAa,SAAS,SAAS;AAAA,MACjD;AAAA,IACF,SAAS,OAAP;AACA,cAAQ,MAAM,6BAA6B,KAAK;AAAA,IAClD;AAAA,EACF;AAAA,EAEO,eAA8B;AACnC,WAAO,KAAK,WAAW,aAAa;AAAA,EACtC;AAAA;AAAA,EAGO,eAAe,UAA+B;AACnD,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,UAAM,WAAW,GAAG,KAAK,OAAO,6BAA6B;AAC7D,WAAO,SAAS,OAAO;AAAA,EACzB;AAAA,EAEO,kBAAkB,UAA+B;AACtD,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAEA,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,UAAM,UAAU,GAAG,KAAK,OAAO,6BAA6B;AAC5D,WAAO,SAAS,OAAO;AAAA,EACzB;AAAA,EAEA,MAAa,oBAAoB,UAAgD;AAC/E,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW;AAAA,MACrC,sBAAsB;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,MAAM,MAAwC;AACzD,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,sBAAsB,IAAI;AAEpF,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AACtC,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,WAAW,SAAS,YAAY,2BAA2B;AACtE,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,WAAW,SAAS,YAAY,gCAAgC,SAAS,OAAO;AAC3F,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AACtC,aAAO;AAAA,IACT;AAEA,UAAM,IAAI,MAAM,SAAS,WAAW,cAAc;AAAA,EACpD;AAAA,EAEA,MAAa,SAAS,MAA2C;AAE/D,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,yBAAyB,IAAI;AAEvF,QAAI,SAAS,WAAW,SAAS,YAAY,8EAA8E;AACzH,aAAO;AAAA,IACT;AAEA,UAAM,IAAI,MAAM,SAAS,WAAW,qBAAqB;AAAA,EAC3D;AAAA,EAEA,MAAa,OAAO,MAAyC;AAC3D,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,uBAAuB,IAAI;AAErF,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,iBAAiB,OAAsC;AAClE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,WAAW,IAAkB,mCAAmC,OAAO;AAEnG,UAAI,SAAS,WAAW,SAAS,OAAO;AACtC,aAAK,QAAQ,SAAS;AACtB,aAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,aAAK,mBAAmB,SAAS,KAAK;AAAA,MACxC;AAEA,aAAO;AAAA,IACT,SAAS,OAAP;AAEA,UAAI,MAAM,UAAU,MAAM;AACxB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,MAAM,SAAS,KAAK,WAAW;AAAA,QAC1C;AAAA,MACF;AAGA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,MAAM,WAAW;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,SAAwB;AAEnC,QAAI;AACF,YAAM,KAAK,WAAW,KAAK,uBAAuB,CAAC,CAAC;AAAA,IACtD,SAAS,OAAP;AACA,cAAQ,KAAK,mCAAmC,KAAK;AAAA,IACvD;AAEA,SAAK,QAAQ;AACb,SAAK,WAAW,gBAAgB;AAChC,SAAK,WAAW,gBAAgB;AAChC,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEA,MAAa,aAA4B;AACvC,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,IAAoB,iBAAiB;AAC5E,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,cAAc,MAA6C;AACtE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,4BAA4B,IAAI;AAE1F,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,cAA+B;AAC1C,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,IAAuB,kBAAkB;AAChF,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,YAAY,IAA2B;AAClD,UAAM,WAAW,MAAM,KAAK,WAAW,IAAoB,gBAAgB,IAAI;AAC/E,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,eAAe,OAAsC;AAEhE,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,gCAAgC,EAAE,MAAM,CAAC;AACnG,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,cAAc,OAAe,UAAyC;AACjF,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,+BAA+B,EAAE,OAAO,SAAS,CAAC;AAC5G,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,eAAe,aAAqB,aAA4C;AAC3F,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,gCAAgC;AAAA,MACxF;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,aAAa,QAAuC;AAC/D,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,8BAA8B,EAAE,OAAO,CAAC;AAElG,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,mBAAmB,UAAyC;AACvE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,qCAAqC;AAAA,MAC7F;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,kBAAkB,OAAsC;AACnE,UAAM,WAAW,MAAM,KAAK,WAAW,IAAkB,0CAA0C,OAAO;AAE1G,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,cAAgG;AAC3G,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW;AAAA,MACrC;AAAA,MACA,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,UAAU,OAAsC;AAC3D,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,sBAAsB,EAAE,MAAM,CAAC;AACzF,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,WAAW,OAAsC;AAC5D,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,uBAAuB,EAAE,MAAM,CAAC;AAC1F,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,YAAY,OAAsC;AAC7D,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,wBAAwB,EAAE,MAAM,CAAC;AAC3F,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,cAA8D;AACzE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,IAA2C,kBAAkB;AACpG,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,cAAc,WAA0C;AACnE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,OAAqB,oBAAoB,WAAW;AAC3F,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,oBAA2C;AACtD,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,OAAqB,6BAA6B;AAGzF,SAAK,QAAQ;AACb,SAAK,WAAW,gBAAgB;AAChC,SAAK,uBAAuB;AAE5B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,aAAa,SAA2D;AACnF,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW;AAAA,MACrC;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,gBAAgB,QAAuC;AAClE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,6BAA6B,UAAU,CAAC,CAAC;AACnG,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,wBAAwB,QAAuC;AAC1E,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,sCAAsC,UAAU,CAAC,CAAC;AAC5G,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,iBAAiB,QAAuC;AACnE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,8BAA8B,UAAU,CAAC,CAAC;AACpG,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,kBAAkB,QAAuC;AACpE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,+BAA+B,UAAU,CAAC,CAAC;AACrG,WAAO;AAAA,EACT;AACF;;;ACldA,SAAS,UAAU,WAAW,mBAAmB;AA2B1C,IAAM,UAAU,CAAC,WAA0C;AAChE,QAAM,CAAC,WAAW,IAAI,SAAsB,MAAM,IAAI,YAAY,MAAM,CAAC;AACzE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAsB,IAAI;AAClD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAkB,KAAK;AACrE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB,IAAI;AAEpD,QAAM,kBAAkB,YAAY,MAAM;AACxC,UAAM,gBAAgB,YAAY,gBAAgB;AAClD,uBAAmB,aAAa;AAEhC,QAAI,eAAe;AACjB,YAAM,cAAc,YAAY,eAAe;AAC/C,cAAQ,WAAW;AAAA,IACrB,OAAO;AACL,cAAQ,IAAI;AAAA,IACd;AAEA,eAAW,KAAK;AAAA,EAClB,GAAG,CAAC,WAAW,CAAC;AAEhB,YAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,WAAW,YAAY,OAAO,SAA8C;AAChF,eAAW,IAAI;AACf,QAAI;AAEF,YAAM,WAAW,MAAM,YAAY,SAAS,IAAI;AAChD,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,QAAQ,YAAY,OAAO,SAA2C;AAC1E,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,MAAM,IAAI;AAE7C,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AACrB,2BAAmB,IAAI;AAAA,MACzB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,SAAS,YAAY,OAAO,SAA4C;AAC5E,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,OAAO,IAAI;AAC9C,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AACrB,2BAAmB,IAAI;AAAA,MACzB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,mBAAmB,YAAY,OAAO,UAAyC;AACnF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,iBAAiB,KAAK;AACzD,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AACrB,2BAAmB,IAAI;AAAA,MACzB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,SAAS,YAAY,YAA2B;AACpD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,YAAY,OAAO;AACzB,cAAQ,IAAI;AACZ,yBAAmB,KAAK;AAAA,IAC1B,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,gBAAgB,YAAY,OAAO,SAAgD;AACvF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,cAAc,IAAI;AACrD,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAa,YAAY,YAA2B;AACxD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,cAAQ,QAAQ;AAChB,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAc,YAAY,YAA6B;AAC3D,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,YAAY;AAAA,IACvC,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAc,YAAY,OAAO,OAA8B;AACnE,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,YAAY,EAAE;AAAA,IACzC,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC1KA,SAAgB,eAAe,YAAY,YAAAA,WAAU,aAAAC,YAAW,eAAAC,oBAA8B;AAkVrF;AA/ST,IAAM,cAAc,cAA4C,MAAS;AAOlE,IAAM,eAA4C,CAAC,EAAE,UAAU,OAAO,MAAM;AAEjF,QAAM,aAAyB;AAAA,IAC7B,SAAS,QAAQ,YACd,OAAO,WAAW,cACd,QAAQ,IAAI,4BAA4B,QAAQ,IAAI,0BAA0B,0BAC/E;AAAA,IACN,iBAAiB,QAAQ,mBAAmB;AAAA,IAC5C,aAAa,QAAQ,gBAAgB,SAAY,OAAO,cAAc;AAAA,EACxE;AAEA,QAAM,CAAC,WAAW,IAAIF,UAAS,MAAM,IAAI,YAAY,UAAU,CAAC;AAChE,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAsB,IAAI;AAClD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAE5C,QAAM,kBAAkBE,aAAY,YAAY;AAC9C,UAAM,gBAAgB,YAAY,gBAAgB;AAElD,QAAI,eAAe;AACjB,UAAI;AACF,cAAM,cAAc,YAAY,eAAe;AAC/C,gBAAQ,WAAW;AAAA,MACrB,SAAS,OAAP;AACA,gBAAQ,MAAM,+BAA+B,KAAK;AAClD,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF,OAAO;AACL,cAAQ,IAAI;AAAA,IACd;AAEA,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,WAAW,CAAC;AAEhB,EAAAD,WAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,SAASC,aAAY,OAAO,SAA2C;AAC3E,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,MAAM,IAAI;AAC7C,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,SAASA,aAAY,OAAO,SAA8C;AAC9E,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,SAAS,IAAI;AAChD,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,UAAUA,aAAY,YAA2B;AACrD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,YAAY,OAAO;AACzB,cAAQ,IAAI;AAAA,IACd,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,SAASA,aAAY,OAAO,SAA4C;AAC5E,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,OAAO,IAAI;AAC9C,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,mBAAmBA,aAAY,OAAO,UAAyC;AACnF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,iBAAiB,KAAK;AACzD,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,gBAAgBA,aAAY,OAAO,SAAgD;AACvF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,cAAc,IAAI;AACrD,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAaA,aAAY,YAA2B;AACxD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,cAAQ,QAAQ;AAChB,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,kBAAkBA,aAAY,CAAC,aAA4B;AAC/D,gBAAY,eAAe,QAAQ;AAAA,EACrC,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,oBAAoBA,aAAY,CAAC,aAA4B;AACjE,gBAAY,kBAAkB,QAAQ;AAAA,EACxC,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,sBAAsBA,aAAY,OAAO,aAAmD;AAChG,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,oBAAoB,QAAQ;AAAA,IACvD,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,iBAAiBA,aAAY,OAAO,UAAyC;AACjF,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,eAAe,KAAK;AAAA,IAC/C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,gBAAgBA,aAAY,OAAO,OAAe,aAA4C;AAClG,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,cAAc,OAAO,QAAQ;AAAA,IACxD,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,iBAAiBA,aAAY,OAAO,aAAqB,gBAA+C;AAC5G,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,eAAe,aAAa,WAAW;AAAA,IAClE,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,eAAeA,aAAY,OAAO,WAA0C;AAChF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,aAAa,MAAM;AACtD,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,qBAAqBA,aAAY,OAAO,aAA4C;AACxF,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,mBAAmB,QAAQ;AAAA,IACtD,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,oBAAoBA,aAAY,OAAO,UAAyC;AACpF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,kBAAkB,KAAK;AAC1D,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAcA,aAAY,YAAY;AAC1C,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,YAAY;AAAA,IACvC,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,YAAYA,aAAY,OAAO,UAAyC;AAC5E,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,UAAU,KAAK;AAAA,IAC1C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAaA,aAAY,OAAO,UAAyC;AAC7E,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,WAAW,KAAK;AAAA,IAC3C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAcA,aAAY,OAAO,UAAyC;AAC9E,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,YAAY,KAAK;AAAA,IAC5C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAcA,aAAY,YAAY;AAC1C,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,YAAY;AAAA,IACvC,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,gBAAgBA,aAAY,OAAO,cAA6C;AACpF,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,cAAc,SAAS;AAAA,IAClD,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,oBAAoBA,aAAY,YAAmC;AACvE,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,kBAAkB;AACrD,cAAQ,IAAI;AACZ,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,QAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,YAAY,CAAC,CAAC;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,oBAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACvD;AAEO,IAAMC,WAAU,MAAwB;AAC7C,QAAM,UAAU,WAAW,WAAW;AACtC,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,SAAO;AACT;;;AC3VA,SAAgB,YAAAH,iBAAgB;AAuGxB,gBAAAI,MAuBA,YAvBA;AAvFD,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA,iBAAiB,CAAC,UAAU,QAAQ;AAAA,EACpC,mBAAmB;AACrB,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAIJ,UAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAC3C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAElD,QAAM,EAAE,MAAM,IAAI,QAAQ;AAAA,IACxB,SAAS,QAAQ,YAAY,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAAA,EACxF,CAAC;AAED,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AAEb,QAAI;AACF,UAAI;AACJ,UAAI,aAAa;AAEf,mBAAW,MAAM,MAAM,EAAE,OAAO,SAAS,CAAC;AAAA,MAC5C,OAAO;AAEL,mBAAW,MAAM,MAAM,EAAE,MAAM,CAAC;AAAA,MAClC;AAEA,UAAI,SAAS,SAAS;AAEpB,oBAAY,QAAQ;AAGpB,YAAI,gBAAgB;AAElB,cAAI,SAAS,YAAY,2BAA2B;AAElD,2BAAe,OAAO,IAAI;AAAA,UAC5B,WAAW,SAAS,OAAO;AAEzB,2BAAe,OAAO,KAAK;AAAA,UAC7B,OAAO;AAEL,2BAAe,OAAO,IAAI;AAAA,UAC5B;AAAA,QACF;AAAA,MACF,OAAO;AACL,iBAAS,SAAS,WAAW,cAAc;AAAA,MAC7C;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,2BAA2B;AAAA,IAC3E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,mBAAe,CAAC,WAAW;AAC3B,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,2BAA2B,MAAM;AACrC,oBAAgB,CAAC,YAAY;AAAA,EAC/B;AAEA,SACE,gBAAAI,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,EACV,GACE,+BAAC,UAAK,UAAU,cAAc,OAAO;AAAA,IACnC,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,GACE;AAAA,oBAAAA,KAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GAAI,wBAAc,wBAAwB,kBAAiB;AAAA,IAE1D,SACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GACG,iBACH;AAAA,IAGF,qBAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAA,KAAC,WAAM,SAAQ,SAAQ,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,oBAAM;AAAA,MACT,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,iBAAiB;AAAA,UACnB;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEC,eACC,qBAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACE;AAAA,sBAAAA,KAAC,WAAM,SAAQ,kBAAiB,OAAO;AAAA,QACrC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,uBAAS;AAAA,MACZ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,iBAAiB;AAAA,UACnB;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,UAEC,yBAAe,SAAS;AAAA;AAAA,MAC3B;AAAA,OACF;AAAA,IAGD,eACC,qBAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,WAAW;AAAA,IACb,GACE;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,IAAG;AAAA,UACH,SAAS;AAAA,UACT,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,OAAO;AAAA,UAC/C,UAAU;AAAA,UACV,OAAO;AAAA,YACL,aAAa;AAAA,YACb,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,QAAQ;AAAA,UACV;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAGF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,QAEC,sBAAa,cAAc,kBAAkB,mBAAqB,cAAc,UAAU;AAAA;AAAA,IAC7F;AAAA,IAEA,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,GACE,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,QAEC,wBAAc,2BAA2B;AAAA;AAAA,IAC5C,GACF;AAAA,IAEC,oBAAoB,eAAe,SAAS,KAC3C,qBAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,GACE;AAAA,2BAAC,SAAI,OAAO;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,GACE;AAAA,wBAAAA,KAAC,SAAI,OAAO;AAAA,UACV,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,iBAAiB;AAAA,QACnB,GAAG;AAAA,QACH,gBAAAA,KAAC,SAAI,OAAO;AAAA,UACV,UAAU;AAAA,UACV,WAAW;AAAA,QACb,GACE,0BAAAA,KAAC,UAAK,OAAO;AAAA,UACX,iBAAiB;AAAA,UACjB,SAAS;AAAA,UACT,OAAO;AAAA,UACP,UAAU;AAAA,QACZ,GAAG,8BAAgB,GACrB;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,OAAO;AAAA,QACV,SAAS;AAAA,QACT,qBAAqB,eAAe,WAAW,IAAI,QAAQ;AAAA,QAC3D,KAAK;AAAA,MACP,GACG;AAAA,uBAAe,SAAS,QAAQ,KAC/B;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,QAAQ,WAAW;AAAA,YAC5B,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YAEA;AAAA,mCAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,SAAQ,aACrD;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,iBACF;AAAA,cAAM;AAAA;AAAA;AAAA,QAER;AAAA,QAGD,eAAe,SAAS,QAAQ,KAC/B;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,QAAQ,WAAW;AAAA,YAC5B,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YAEA;AAAA,8BAAAA,KAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,MAAK,gBAAe,SAAQ,aACzE,0BAAAA,KAAC,UAAK,GAAE,6sBAA4sB,GACttB;AAAA,cAAM;AAAA;AAAA;AAAA,QAER;AAAA,SAEJ;AAAA,OACF;AAAA,IAGD,oBACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,GACE,+BAAC,OAAE,OAAO;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,GAAG;AAAA;AAAA,MACsB;AAAA,MACvB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF,GACF;AAAA,KAEJ,GACF;AAEJ;;;ACjcA,SAAgB,YAAAJ,iBAAgB;AAkHxB,gBAAAI,MAuBA,QAAAC,aAvBA;AApGD,IAAM,eAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA,iBAAiB,CAAC,UAAU,QAAQ;AAAA,EACpC,mBAAmB;AACrB,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,IAAIL,UAAS,EAAE;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,EAAE;AACzD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,UAAS,KAAK;AAEpE,QAAM,sBAAsB,CAAC,QAA0F;AACrH,QAAI,CAAC;AAAK,aAAO,EAAE,UAAU,QAAQ,OAAO,GAAG,OAAO,GAAG;AAEzD,QAAI,QAAQ;AACZ,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;AAAG;AAC5C,QAAI,KAAK,KAAK,GAAG;AAAG;AACpB,QAAI,cAAc,KAAK,GAAG;AAAG;AAE7B,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,OAAO;AAChE,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,UAAU,OAAO,OAAO,SAAS;AACpE,WAAO,EAAE,UAAU,UAAU,OAAO,OAAO,SAAS;AAAA,EACtD;AAEA,QAAM,mBAAmB,oBAAoB,QAAQ;AAGrD,QAAM,SAAS,cAAc;AAAA,IAC3B,SAAS,OAAO,WAAW,cACtB,QAAQ,IAAI,4BAA4B,OAAO,SAAS,SACzD;AAAA,EACN;AAEA,QAAM,EAAE,SAAS,IAAI,QAAQ,MAAM;AAEnC,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AAGb,QAAI,aAAa,iBAAiB;AAChC,eAAS,wBAAwB;AACjC,mBAAa,KAAK;AAClB;AAAA,IACF;AAGA,QAAI,SAAS,SAAS,GAAG;AACvB,eAAS,6CAA6C;AACtD,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,eAAe;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,iBAAiB,OAAO,WAAW,cAC9B,QAAQ,IAAI,iCAAiC,QAAQ,IAAI,+BAA+B,OAAO,SAAS,SACzG;AAAA,MACN;AAEA,YAAM,WAAW,MAAM,SAAS,YAAY;AAC5C,UAAI,SAAS,SAAS;AACpB,4BAAoB;AAAA,MACtB,OAAO;AACL,iBAAS,SAAS,WAAW,qBAAqB;AAAA,MACpD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,2BAA2B;AAAA,IAC3E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE,gBAAAI,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,EACV,GACE,0BAAAC,MAAC,UAAK,UAAU,cAAc,OAAO;AAAA,IACnC,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,GACE;AAAA,oBAAAD,KAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GAAG,sBAAQ;AAAA,IAEV,SACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GACG,iBACH;AAAA,IAGF,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,QAAO,OAAO;AAAA,QAC3B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,mBAAK;AAAA,MACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,UACvC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,iBAAiB;AAAA,UACnB;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,kBAAiB,OAAO;AAAA,QACrC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,oBAAM;AAAA,MACT,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,iBAAiB;AAAA,UACnB;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,YAAW,OAAO;AAAA,QAC/B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,uBAAS;AAAA,MACZ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,iBAAiB;AAAA,UACnB;AAAA,UACA,aAAY;AAAA,UACZ,WAAW;AAAA;AAAA,MACb;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,oBAAmB,OAAO;AAAA,QACvC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,+BAAiB;AAAA,MACpB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,UAClD,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,iBAAiB;AAAA,UACnB;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,QAEC,sBAAY,mBAAmB;AAAA;AAAA,IAClC;AAAA,IAEC,oBAAoB,eAAe,SAAS,KAC3C,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,GACE;AAAA,sBAAAA,MAAC,SAAI,OAAO;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,GACE;AAAA,wBAAAD,KAAC,SAAI,OAAO;AAAA,UACV,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,iBAAiB;AAAA,QACnB,GAAG;AAAA,QACH,gBAAAA,KAAC,SAAI,OAAO;AAAA,UACV,UAAU;AAAA,UACV,WAAW;AAAA,QACb,GACE,0BAAAA,KAAC,UAAK,OAAO;AAAA,UACX,iBAAiB;AAAA,UACjB,SAAS;AAAA,UACT,OAAO;AAAA,UACP,UAAU;AAAA,QACZ,GAAG,8BAAgB,GACrB;AAAA,SACF;AAAA,MAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,QACV,SAAS;AAAA,QACT,qBAAqB,eAAe,WAAW,IAAI,QAAQ;AAAA,QAC3D,KAAK;AAAA,MACP,GACG;AAAA,uBAAe,SAAS,QAAQ,KAC/B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,OAAO;AAAA,YAChB,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YAEA;AAAA,8BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,SAAQ,aACrD;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,iBACF;AAAA,cAAM;AAAA;AAAA;AAAA,QAER;AAAA,QAGD,eAAe,SAAS,QAAQ,KAC/B,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,OAAO;AAAA,YAChB,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YAEA;AAAA,8BAAAD,KAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,MAAK,gBAAe,SAAQ,aACzE,0BAAAA,KAAC,UAAK,GAAE,6sBAA4sB,GACttB;AAAA,cAAM;AAAA;AAAA;AAAA,QAER;AAAA,SAEJ;AAAA,OACF;AAAA,IAGD,iBACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,GACE,0BAAAC,MAAC,OAAE,OAAO;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,GAAG;AAAA;AAAA,MACwB;AAAA,MACzB,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF,GACF;AAAA,KAEJ,GACF;AAEJ;;;AC7bA,SAAgB,YAAAJ,iBAAgB;AAuGxB,gBAAAI,MAOA,QAAAC,aAPA;AA7FD,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,KAAK,MAAM,IAAIL,UAAS,EAAE;AACjC,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,CAAC;AACtD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,KAAK;AAExD,QAAM,EAAE,QAAQ,MAAM,IAAI,QAAQ;AAAA,IAChC,SAAS,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAAA,EACpE,CAAC;AAED,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AAGb,QAAI,CAAC,UAAU,KAAK,GAAG,GAAG;AACxB,eAAS,kCAAkC;AAC3C,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,EAAE,OAAO,IAAI,CAAC;AAC5C,UAAI,SAAS,SAAS;AACpB,0BAAkB;AAAA,MACpB,OAAO;AACL,iBAAS,SAAS,WAAW,qBAAqB;AAAA,MACpD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,2BAA2B;AAAA,IAC3E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,MAA2C;AAClE,UAAM,QAAQ,EAAE,OAAO;AAEvB,QAAI,YAAY,KAAK,KAAK,GAAG;AAC3B,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAEA,QAAM,kBAAkB,YAAY;AAClC,QAAI,iBAAiB,KAAK;AAAe;AAEzC,qBAAiB,IAAI;AACrB,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,EAAE,MAAM,CAAC;AACtC,UAAI,SAAS,SAAS;AAEpB,0BAAkB,EAAE;AACpB,cAAM,WAAW,YAAY,MAAM;AACjC,4BAAkB,CAAC,SAAS;AAC1B,gBAAI,QAAQ,GAAG;AACb,4BAAc,QAAQ;AACtB,qBAAO;AAAA,YACT;AACA,mBAAO,OAAO;AAAA,UAChB,CAAC;AAAA,QACH,GAAG,GAAI;AAAA,MACT,OAAO;AACL,iBAAS,SAAS,WAAW,sBAAsB;AAAA,MACrD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,sBAAsB;AAAA,IACtE,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,SACE,gBAAAI,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,EACV,GACE,0BAAAC,MAAC,UAAK,UAAU,cAAc,OAAO;AAAA,IACnC,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,GACE;AAAA,oBAAAD,KAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GAAG,wBAAU;AAAA,IACb,gBAAAC,MAAC,OAAE,OAAO;AAAA,MACR,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,GAAG;AAAA;AAAA,MAA+B,gBAAAD,KAAC,YAAO,OAAO,EAAE,OAAO,UAAU,GAAI,iBAAM;AAAA,OAAS;AAAA,IAEtF,SACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GACG,iBACH;AAAA,IAGF,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,OAAM,OAAO;AAAA,QAC1B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,uBAAS;AAAA,MACZ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,iBAAiB;AAAA,YACjB,WAAW;AAAA,YACX,eAAe;AAAA,UACjB;AAAA,UACA,WAAW;AAAA,UACX,aAAY;AAAA,UACZ,WAAS;AAAA;AAAA,MACX;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU,aAAa,IAAI,WAAW;AAAA,QACtC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,QAEC,sBAAY,iBAAiB;AAAA;AAAA,IAChC;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,GACE;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU,aAAa,iBAAiB,iBAAiB;AAAA,UACzD,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,OAAO,iBAAiB,IAAI,SAAS;AAAA,YACrC,gBAAgB;AAAA,YAChB,QAAQ,iBAAiB,IAAI,gBAAgB;AAAA,YAC7C,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UAEC,0BAAgB,eAAe,iBAAiB,IAAI,iBAAiB,oBAAoB;AAAA;AAAA,MAC5F;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KACF,GACF;AAEJ;;;AC5OA,SAAgB,YAAAJ,iBAAgB;AA+DtB,mBACgB,OAAAI,MADhB,QAAAC,aAAA;AAjDH,IAAM,WAAoC,CAAC;AAAA,EAChD;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AACd,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,IAAIL,UAAmB,WAAW;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAwB,IAAI;AAE1D,QAAM,qBAAqB,CAACM,QAAe,yBAAkC;AAE3E,aAASA,MAAK;AAEd,QAAI,sBAAsB;AAExB,cAAQ,KAAK;AACb,iBAAW,IAAI;AAAA,IACjB,OAAO;AAEL,iBAAW,IAAI;AACf,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,wBAAwB,MAAM;AAElC,eAAW,oEAAoE;AAE/E,eAAW,MAAM;AACf,cAAQ,OAAO;AACf,iBAAW,IAAI;AAAA,IACjB,GAAG,GAAI;AAAA,EACT;AAEA,QAAM,sBAAsB,MAAM;AAEhC,eAAW,IAAI;AACf,qBAAiB;AAAA,EACnB;AAEA,QAAM,oBAAoB,MAAM;AAC9B,YAAQ,OAAO;AACf,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,oBAAoB,MAAM;AAC9B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eACE,gBAAAD,MAAA,YACG;AAAA,uBAAa,gBAAAD,KAAC,QAAG,OAAO;AAAA,YACvB,WAAW;AAAA,YACX,cAAc;AAAA,YACd,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GAAG,0BAAY;AAAA,UACd,WACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,YACV,SAAS;AAAA,YACT,cAAc;AAAA,YACd,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GACG,mBACH;AAAA,UAEF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,gBAAgB;AAAA,cAChB,iBAAiB,MAAM,QAAQ,UAAU;AAAA,cACzC,kBAAkB;AAAA;AAAA,UACpB;AAAA,WACF;AAAA,MAGJ,KAAK;AACH,eACE,gBAAAC,MAAA,YACG;AAAA,uBAAa,gBAAAD,KAAC,QAAG,OAAO;AAAA,YACvB,WAAW;AAAA,YACX,cAAc;AAAA,YACd,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GAAG,4BAAc;AAAA,UAChB,WACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,YACV,SAAS;AAAA,YACT,cAAc;AAAA,YACd,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GACG,mBACH;AAAA,UAEF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,mBAAmB;AAAA,cACnB,cAAc,MAAM,QAAQ,OAAO;AAAA,cACnC,eAAe;AAAA;AAAA,UACjB;AAAA,WACF;AAAA,MAGJ,KAAK;AACH,eACE,gBAAAC,MAAA,YACG;AAAA,uBAAa,gBAAAD,KAAC,QAAG,OAAO;AAAA,YACvB,WAAW;AAAA,YACX,cAAc;AAAA,YACd,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GAAG,+BAAiB;AAAA,UACpB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,iBAAiB;AAAA,cACjB,eAAe;AAAA;AAAA,UACjB;AAAA,WACF;AAAA,MAGJ;AACE,eACE,gBAAAC,MAAA,YACG;AAAA,uBAAa,gBAAAD,KAAC,QAAG,OAAO;AAAA,YACvB,WAAW;AAAA,YACX,cAAc;AAAA,YACd,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GAAG,0BAAY;AAAA,UACf,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,gBAAgB;AAAA,cAChB,iBAAiB,MAAM,QAAQ,UAAU;AAAA,cACzC,kBAAkB;AAAA;AAAA,UACpB;AAAA,WACF;AAAA,IAEN;AAAA,EACF;AAEA,SACE,gBAAAA,KAAC,SAAI,OAAO;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB,GACG,4BAAkB,GACrB;AAEJ;;;AC7KA,SAAgB,YAAAJ,WAAU,aAAAC,kBAAiB;AAyEnC,SAGE,OAAAG,MAHF,QAAAC,aAAA;AA9DD,IAAM,wBAA8D,CAAC;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,WAAW,YAAY,IAAIL,UAAS,IAAI;AAC/C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,EAAE;AACzC,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAEhD,QAAM,EAAE,iBAAiB,IAAI,QAAQ;AAAA,IACnC,SAAS,YAAY,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAAA,EAChF,CAAC;AAED,EAAAC,WAAU,MAAM;AACd,UAAM,cAAc,YAAY;AAC9B,UAAI,CAAC,OAAO;AACV,qBAAa,KAAK;AAClB,mBAAW,4BAA4B;AACvC,qBAAa,KAAK;AAClB,8BAAsB,4BAA4B;AAClD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,WAAW,MAAM,iBAAiB,KAAK;AAE7C,YAAI,SAAS,SAAS;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS,WAAW,8BAA8B;AAC7D,uBAAa,IAAI;AACjB,kCAAwB;AAAA,QAC1B,OAAO;AACL,uBAAa,KAAK;AAClB,qBAAW,SAAS,WAAW,2BAA2B;AAC1D,uBAAa,KAAK;AAClB,gCAAsB,SAAS,WAAW,2BAA2B;AAAA,QACvE;AAAA,MACF,SAAS,KAAP;AACA,qBAAa,KAAK;AAClB,cAAM,eAAe,eAAe,QAAQ,IAAI,UAAU;AAC1D,mBAAW,YAAY;AACvB,qBAAa,KAAK;AAClB,8BAAsB,YAAY;AAAA,MACpC;AAAA,IACF;AAEA,gBAAY;AAAA,EACd,GAAG,CAAC,OAAO,kBAAkB,uBAAuB,mBAAmB,CAAC;AAExE,MAAI,WAAW;AACb,WACE,gBAAAG,KAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,MACd,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,GACE,0BAAAC,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,IACX,GACE;AAAA,sBAAAD,KAAC,QAAG,OAAO,EAAE,OAAO,QAAQ,GAAG,qCAAuB;AAAA,MACtD,gBAAAA,KAAC,SAAI,OAAO;AAAA,QACV,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,cAAc;AAAA,QACd,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,QAAQ;AAAA,MACV,GAAG;AAAA,OACL,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,QAAQ;AAAA,EACV,GACE,0BAAAC,MAAC,SAAI,OAAO;AAAA,IACV,SAAS;AAAA,EACX,GACE;AAAA,oBAAAD,KAAC,QAAG,OAAO,EAAE,OAAO,QAAQ,GAAG,gCAAkB;AAAA,IACjD,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,iBAAiB,YAAY,YAAY;AAAA,MACzC,OAAO,YAAY,YAAY;AAAA,MAC/B,QAAQ,YAAY,sBAAsB;AAAA,IAC5C,GACG,mBACH;AAAA,IACC,aACC,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,IACb,GACE;AAAA,sBAAAD,KAAC,OAAE,OAAO,EAAE,OAAO,QAAQ,GAAG,wDAA0C;AAAA,MACxE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,SAAS,OAAO;AAAA,UACtC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KAEJ,GACF;AAEJ;;;AChJA,SAAgB,YAAAJ,WAAU,aAAAC,kBAAiB;AAiGnC,gBAAAG,MAyDE,QAAAC,aAzDF;AAhFD,IAAM,SAAgC,CAAC,EAAE,aAAa,WAAW,MAAM;AAC5E,QAAM,EAAE,QAAQ,YAAY,SAAS,YAAY,IAAIF,SAAQ;AAC7D,QAAM,CAAC,OAAO,QAAQ,IAAIH,UAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAC3C,QAAM,CAAC,KAAK,MAAM,IAAIA,UAAS,EAAE;AACjC,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAwB,IAAI;AAE1D,EAAAC,WAAU,MAAM;AACd,QAAI,cAAc,aAAa;AAC7B,YAAM,WAAW,eACf,QAAQ,IAAI,yCACZ,QAAQ,IAAI,uCACZ;AAEF,YAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,aAAO,SAAS,OAAO,GAAG,UAAU;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI;AACF,UAAI,UAAU;AAEZ,cAAM,WAAW,MAAM,OAAO,EAAE,OAAO,IAAI,CAAC;AAC5C,YAAI,SAAS,SAAS;AACpB,qBAAW,mBAAmB;AAAA,QAEhC,OAAO;AACL,mBAAS,SAAS,WAAW,yBAAyB;AAAA,QACxD;AAAA,MACF,WAAW,aAAa;AAEtB,cAAM,WAAW,MAAM,OAAO,EAAE,OAAO,SAAS,CAAC;AACjD,YAAI,SAAS,SAAS;AACpB,qBAAW,mBAAmB;AAAA,QAEhC,OAAO;AACL,mBAAS,SAAS,WAAW,cAAc;AAAA,QAC7C;AAAA,MACF,OAAO;AAEL,cAAM,WAAW,MAAM,OAAO,EAAE,MAAM,CAAC;AACvC,YAAI,SAAS,WAAW,SAAS,YAAY,2BAA2B;AACtE,sBAAY,IAAI;AAChB,qBAAW,kDAAkD;AAAA,QAC/D,OAAO;AACL,mBAAS,SAAS,WAAW,oBAAoB;AAAA,QACnD;AAAA,MACF;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,mBAAe,CAAC,WAAW;AAC3B,gBAAY,KAAK;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AACf,WAAO,EAAE;AAAA,EACX;AAEA,MAAI,aAAa;AACf,WACE,gBAAAG,KAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,OAAO,GACjD,0BAAAA,KAAC,SAAI,wBAAU,GACjB;AAAA,EAEJ;AAEA,SACE,gBAAAA,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,GAAG,YAAY,UAAU;AAAA,EAC3B,GACE,0BAAAC,MAAC,UAAK,UAAU,cACd;AAAA,oBAAAD,KAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,GAAG,YAAY,UAAU;AAAA,IAC3B,GACG,qBAAW,cAAc,cAAc,0BAA0B,WACpE;AAAA,IAEC,SACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGD,WACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,mBACH;AAAA,IAGD,CAAC,YACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,KAAC,WAAM,SAAQ,SAAQ,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,mBAAK;AAAA,MACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAGD,eAAe,CAAC,YACf,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,QAAQ,UAAU,WAAW,GACvD;AAAA,sBAAAD,KAAC,WAAM,SAAQ,YAAW,OAAO;AAAA,QAC/B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,sBAAQ;AAAA,MACX,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,UAC5C,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,UAEC,yBAAe,SAAS;AAAA;AAAA,MAC3B;AAAA,OACF;AAAA,IAGD,YACC,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,KAAC,WAAM,SAAQ,OAAM,OAAO;AAAA,QAC1B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,+BAAiB;AAAA,MACpB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,UACtC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,eAAe;AAAA,YACf,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAGF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QAEC,sBAAY,mBAAmB,WAAW,eAAe,cAAc,YAAY;AAAA;AAAA,IACtF;AAAA,IAEC,CAAC,YACA,gBAAAA,KAAC,SAAI,OAAO,EAAE,WAAW,UAAU,WAAW,OAAO,GACnD,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QAEC,wBAAc,2BAA2B;AAAA;AAAA,IAC5C,GACF;AAAA,IAGD,YACC,gBAAAA,KAAC,SAAI,OAAO,EAAE,WAAW,UAAU,WAAW,OAAO,GACnD,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM;AACb,sBAAY,KAAK;AACjB,iBAAO,EAAE;AACT,mBAAS,IAAI;AACb,qBAAW,IAAI;AAAA,QACjB;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QACD;AAAA;AAAA,IAED,GACF;AAAA,KAEJ,GACF;AAEJ;;;ACzUA,SAAgB,YAAAJ,WAAU,aAAAC,kBAAiB;AAsGnC,gBAAAG,MAuCA,QAAAC,aAvCA;AAvFD,IAAM,SAAgC,CAAC,EAAE,aAAa,WAAW,MAAM;AAC5E,QAAM,EAAE,QAAQ,WAAW,IAAIF,SAAQ;AACvC,QAAM,CAAC,MAAM,OAAO,IAAIH,UAAS,EAAE;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,EAAE;AACzD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAwB,IAAI;AAE1D,EAAAC,WAAU,MAAM;AACd,QAAI,cAAc,aAAa;AAC7B,YAAM,WAAW,eACf,QAAQ,IAAI,4CACZ,QAAQ,IAAI,0CACZ;AAEF,YAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,aAAO,SAAS,OAAO,GAAG,UAAU;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,QAAM,sBAAsB,CAAC,QAA2E;AACtG,QAAI,CAAC;AAAK,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AAEnD,QAAI,QAAQ;AACZ,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;AAAG;AAC5C,QAAI,KAAK,KAAK,GAAG;AAAG;AACpB,QAAI,cAAc,KAAK,GAAG;AAAG;AAE7B,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AACzD,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,UAAU,OAAO,OAAO;AAC3D,WAAO,EAAE,UAAU,UAAU,OAAO,OAAO;AAAA,EAC7C;AAEA,QAAM,mBAAmB,oBAAoB,QAAQ;AAErD,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI,aAAa,iBAAiB;AAChC,eAAS,wBAAwB;AACjC,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,eAAS,wCAAwC;AACjD,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,EAAE,MAAM,OAAO,SAAS,CAAC;AACvD,UAAI,SAAS,SAAS;AACpB,mBAAW,0EAA0E;AAAA,MACvF,OAAO;AACL,iBAAS,SAAS,WAAW,qBAAqB;AAAA,MACpD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE,gBAAAG,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,GAAG,YAAY,UAAU;AAAA,EAC3B,GACE,0BAAAC,MAAC,UAAK,UAAU,cACd;AAAA,oBAAAD,KAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,GAAG,YAAY,UAAU;AAAA,IAC3B,GAAG,iCAEH;AAAA,IAEC,SACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGD,WACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,mBACH;AAAA,IAGF,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,KAAC,WAAM,SAAQ,QAAO,OAAO;AAAA,QAC3B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,uBAAS;AAAA,MACZ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,UACvC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,KAAC,WAAM,SAAQ,SAAQ,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,mBAAK;AAAA,MACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,QAAQ,UAAU,WAAW,GACvD;AAAA,sBAAAD,KAAC,WAAM,SAAQ,YAAW,OAAO;AAAA,QAC/B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,sBAAQ;AAAA,MACX,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,UAC5C,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,UAEC,yBAAe,SAAS;AAAA;AAAA,MAC3B;AAAA,MACC,YACC,gBAAAC,MAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAC7B;AAAA,wBAAAD,KAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,UAAU;AAAA,QACZ,GACE,0BAAAA,KAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,OAAO,iBAAiB,aAAa,SAAS,QAAQ,iBAAiB,aAAa,WAAW,QAAQ;AAAA,UACvG,iBAAiB,iBAAiB;AAAA,UAClC,YAAY;AAAA,QACd,GAAG,GACL;AAAA,QACA,gBAAAC,MAAC,OAAE,OAAO;AAAA,UACR,UAAU;AAAA,UACV,OAAO,iBAAiB;AAAA,UACxB,WAAW;AAAA,UACX,eAAe;AAAA,QACjB,GACG;AAAA,2BAAiB;AAAA,UAAS;AAAA,WAC7B;AAAA,SACF;AAAA,OAEJ;AAAA,IAEA,gBAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,KAAC,WAAM,SAAQ,mBAAkB,OAAO;AAAA,QACtC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,8BAAgB;AAAA,MACnB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,UAClD,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QAEC,sBAAY,wBAAwB;AAAA;AAAA,IACvC;AAAA,KACF,GACF;AAEJ;;;AC7TA,SAAgB,aAAAH,kBAAiB;AA+B3B,gBAAAG,YAAA;AAxBC,IAAM,UAAkC,CAAC,EAAE,YAAY,MAAM;AAClE,QAAM,EAAE,QAAQ,IAAID,SAAQ;AAE5B,EAAAF,WAAU,MAAM;AACd,UAAM,iBAAiB,YAAY;AACjC,YAAM,QAAQ;AAEd,YAAM,WAAW,eACf,QAAQ,IAAI,0CACZ,QAAQ,IAAI,wCACZ;AAEF,YAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,aAAO,SAAS,OAAO,GAAG,UAAU;AAAA,IACtC;AAEA,mBAAe;AAAA,EACjB,GAAG,CAAC,SAAS,WAAW,CAAC;AAEzB,SACE,gBAAAG,KAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,OAAO,GACjD,0BAAAA,KAAC,SAAI,4BAAc,GACrB;AAEJ;;;AClCA,SAAgB,YAAAJ,YAAU,QAAQ,aAAAC,kBAAiB;AAwD7C,SAqBE,OAAAG,OArBF,QAAAC,aAAA;AA1CC,IAAM,aAAwC,CAAC,EAAE,WAAW,OAAO,WAAW,MAAM;AACzF,QAAM,EAAE,MAAM,QAAQ,IAAIF,SAAQ;AAClC,QAAM,CAAC,QAAQ,SAAS,IAAIH,WAAS,KAAK;AAC1C,QAAM,cAAc,OAAuB,IAAI;AAE/C,EAAAC,WAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UAAI,YAAY,WAAW,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC9E,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC;AAAM,WAAO;AAElB,QAAM,cAAc,CAAC,SAAiB;AACpC,WAAO,KACJ,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,CAAC,CAAC,EACb,KAAK,EAAE,EACP,YAAY,EACZ,MAAM,GAAG,CAAC;AAAA,EACf;AAEA,QAAM,gBAAgB,YAAY;AAChC,UAAM,QAAQ;AACd,UAAM,WAAW,QAAQ,IAAI,0CAC3B,QAAQ,IAAI,wCACZ;AAEF,UAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,WAAO,SAAS,OAAO,GAAG,UAAU;AAAA,EACtC;AAEA,SACE,gBAAAI,MAAC,SAAI,OAAO,EAAE,UAAU,YAAY,GAAG,YAAY,UAAU,cAAc,GAAG,KAAK,aACjF;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,UAAU,CAAC,MAAM;AAAA,QAChC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,kBAAkB;AAAA,QAC1C;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,kBAAkB;AAAA,QAC1C;AAAA,QAEA;AAAA,0BAAAD,MAAC,SAAI,OAAO;AAAA,YACV,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GACG,sBAAY,KAAK,IAAI,GACxB;AAAA,UACC,YACC,gBAAAA,MAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,YAAY,KAAK,OAAO,OAAO,GAC7D,eAAK,MACR;AAAA;AAAA;AAAA,IAEJ;AAAA,IAEC,UACC,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MACV,KAAK;AAAA,MACL,OAAO;AAAA,MACP,WAAW;AAAA,MACX,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,GAAG,YAAY,UAAU;AAAA,IAC3B,GACE;AAAA,sBAAAD,MAAC,SAAI,OAAO;AAAA,QACV,SAAS;AAAA,QACT,cAAc;AAAA,MAChB,GACE,0BAAAC,MAAC,SAAI,OAAO;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,MACP,GACE;AAAA,wBAAAD,MAAC,SAAI,OAAO;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,YAAY;AAAA,QACd,GACG,sBAAY,KAAK,IAAI,GACxB;AAAA,QACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,GACjC;AAAA,0BAAAD,MAAC,SAAI,OAAO;AAAA,YACV,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU;AAAA,YACV,cAAc;AAAA,YACd,YAAY;AAAA,UACd,GACG,eAAK,MACR;AAAA,UACA,gBAAAA,MAAC,SAAI,OAAO;AAAA,YACV,UAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU;AAAA,YACV,cAAc;AAAA,YACd,YAAY;AAAA,UACd,GACG,eAAK,OACR;AAAA,WACF;AAAA,SACF,GACF;AAAA,MAEA,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,MAAM,GAC3B,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,YAAY;AAAA,UACd;AAAA,UACA,cAAc,CAAC,MAAM;AACnB,cAAE,cAAc,MAAM,kBAAkB;AAAA,UAC1C;AAAA,UACA,cAAc,CAAC,MAAM;AACnB,cAAE,cAAc,MAAM,kBAAkB;AAAA,UAC1C;AAAA,UACD;AAAA;AAAA,MAED,GACF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AC7LA,SAA2B,aAAAH,kBAAiB;AAuCpC,SASC,YAAAM,WATD,OAAAH,aAAA;AA9BD,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,YAAY,SAAS,IAAID,SAAQ;AAEzC,EAAAF,WAAU,MAAM;AACd,QAAI,YAAY,CAAC,YAAY;AAC3B,YAAM,YAAY,cAChB,QAAQ,IAAI,sCACZ,QAAQ,IAAI,oCACZ;AAEF,YAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,aAAO,SAAS,OAAO,GAAG,UAAU;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,UAAU,CAAC;AAErC,MAAI,CAAC,UAAU;AACb,WAAO,YACL,gBAAAG,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,GACE,0BAAAA,MAAC,SAAI,wBAAU,GACjB;AAAA,EAEJ;AAEA,MAAI,CAAC,YAAY;AACf,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO,gBAAAA,MAAAG,WAAA,EAAG,UAAS;AACrB;;;ACjDA,SAA2B,aAAAN,kBAAiB;AAqCpC,SASC,YAAAM,WATD,OAAAH,aAAA;AA7BD,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,YAAY,SAAS,IAAID,SAAQ;AAEzC,EAAAF,WAAU,MAAM;AACd,QAAI,YAAY,YAAY;AAC1B,YAAM,gBAAgB,cACpB,QAAQ,IAAI,yCACZ,QAAQ,IAAI,uCACZ;AAEF,YAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,aAAO,SAAS,OAAO,GAAG,UAAU;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,UAAU,CAAC;AAErC,MAAI,CAAC,UAAU;AACb,WACE,gBAAAG,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,GACE,0BAAAA,MAAC,SAAI,wBAAU,GACjB;AAAA,EAEJ;AAEA,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAEA,SAAO,gBAAAA,MAAAG,WAAA,EAAG,UAAS;AACrB;;;AC/CA,SAAgB,aAAAN,aAAW,YAAAD,kBAAgB;AA2EnC,qBAAAO,WACE,OAAAH,OADF,QAAAC,aAAA;AAlED,IAAM,cAA0C,CAAC,EAAE,OAAO,WAAW,QAAQ,MAAM;AACxF,QAAM,EAAE,iBAAiB,IAAIF,SAAQ;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAIH,WAA0C,SAAS;AAC/E,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,EAAE;AAEzC,EAAAC,YAAU,MAAM;AACd,UAAM,SAAS,YAAY;AAEzB,YAAM,cAAc,UAAU,OAAO,WAAW,cAC5C,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,OAAO,IACvD;AAEJ,UAAI,CAAC,aAAa;AAChB,kBAAU,OAAO;AACjB,mBAAW,gCAAgC;AAC3C,kBAAU,gCAAgC;AAC1C;AAAA,MACF;AAEA,UAAI;AACF,cAAM,WAAW,MAAM,iBAAiB,WAAW;AACnD,YAAI,SAAS,SAAS;AACpB,oBAAU,SAAS;AACnB,qBAAW,6CAA6C;AACxD,sBAAY;AAGZ,qBAAW,MAAM;AACf,kBAAM,WAAW,QAAQ,IAAI,0CAC3B,QAAQ,IAAI,wCACZ;AAEF,kBAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,mBAAO,SAAS,OAAO,GAAG,UAAU;AAAA,UACtC,GAAG,GAAI;AAAA,QACT,OAAO;AACL,oBAAU,OAAO;AACjB,qBAAW,SAAS,WAAW,qBAAqB;AACpD,oBAAU,SAAS,WAAW,qBAAqB;AAAA,QACrD;AAAA,MACF,SAAS,KAAP;AACA,kBAAU,OAAO;AACjB,cAAM,WAAW,eAAe,QAAQ,IAAI,UAAU;AACtD,mBAAW,QAAQ;AACnB,kBAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,kBAAkB,WAAW,OAAO,CAAC;AAEhD,SACE,gBAAAI,MAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb,GACG;AAAA,eAAW,aACV,gBAAAA,MAAAE,WAAA,EACE;AAAA,sBAAAH,MAAC,SAAI,OAAO;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,cAAc;AAAA,QACd,WAAW;AAAA,MACb,GAAG;AAAA,MACH,gBAAAA,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,aAKN;AAAA,MACF,gBAAAA,MAAC,QAAG,OAAO;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,MAChB,GAAG,qCAEH;AAAA,MACA,gBAAAA,MAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,GAAG,6DAE/C;AAAA,OACF;AAAA,IAGD,WAAW,aACV,gBAAAC,MAAAE,WAAA,EACE;AAAA,sBAAAH,MAAC,SAAI,OAAO;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,MAClB,GACE,0BAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,SAAQ,aAAY,KACrF,0BAAAA,MAAC,cAAS,QAAO,kBAAiB,GACpC,GACF;AAAA,MACA,gBAAAA,MAAC,QAAG,OAAO;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,MAChB,GAAG,6BAEH;AAAA,MACA,gBAAAA,MAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,GACzC,mBACH;AAAA,OACF;AAAA,IAGD,WAAW,WACV,gBAAAC,MAAAE,WAAA,EACE;AAAA,sBAAAH,MAAC,SAAI,OAAO;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,MAClB,GACE,0BAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,SAAQ,aAAY,KACrF;AAAA,wBAAAD,MAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,QACpC,gBAAAA,MAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA,SACtC,GACF;AAAA,MACA,gBAAAA,MAAC,QAAG,OAAO;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,MAChB,GAAG,iCAEH;AAAA,MACA,gBAAAA,MAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,QAAQ,cAAc,OAAO,GAC/D,mBACH;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM;AACb,kBAAM,YAAY,QAAQ,IAAI,sCAC5B,QAAQ,IAAI,oCACZ;AAEF,kBAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,mBAAO,SAAS,OAAO,GAAG,UAAU;AAAA,UACtC;AAAA,UACA,OAAO;AAAA,YACL,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ;AAAA,UACV;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AChMA,SAAgB,YAAAJ,kBAAgB;AAsDxB,gBAAAI,OAgDA,QAAAC,cAhDA;AAxCD,IAAM,iBAAgD,CAAC,EAAE,WAAW,MAAM;AAC/E,QAAM,EAAE,eAAe,IAAIF,SAAQ;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIH,WAAS,EAAE;AACrC,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAwB,IAAI;AAE1D,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,WAAW,MAAM,eAAe,KAAK;AAC3C,UAAI,SAAS,SAAS;AACpB,mBAAW,oDAAoD;AAC/D,iBAAS,EAAE;AAAA,MACb,OAAO;AACL,iBAAS,SAAS,WAAW,2BAA2B;AAAA,MAC1D;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE,gBAAAI,MAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,GAAG,YAAY,UAAU;AAAA,EAC3B,GACE,0BAAAC,OAAC,UAAK,UAAU,cACd;AAAA,oBAAAD,MAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,GAAG,YAAY,UAAU;AAAA,IAC3B,GAAG,8BAEH;AAAA,IAEA,gBAAAA,MAAC,OAAE,OAAO;AAAA,MACR,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,GAAG,wFAEH;AAAA,IAEC,SACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGD,WACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,mBACH;AAAA,IAGF,gBAAAC,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,SAAQ,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,mBAAK;AAAA,MACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QAEC,sBAAY,eAAe;AAAA;AAAA,IAC9B;AAAA,IAEA,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,SAAS,GAChC,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM;AACb,gBAAM,YAAY,QAAQ,IAAI,sCAC5B,QAAQ,IAAI,oCACZ;AAEF,gBAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,iBAAO,SAAS,OAAO,GAAG,UAAU;AAAA,QACtC;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QACD;AAAA;AAAA,IAED,GACF;AAAA,KACF,GACF;AAEJ;;;ACrLA,SAAgB,YAAAJ,YAAU,aAAAC,mBAAiB;AAsGrC,SAqBM,OAAAG,OArBN,QAAAC,cAAA;AAvFC,IAAM,gBAA8C,CAAC,EAAE,OAAO,WAAW,MAAM;AACpF,QAAM,EAAE,cAAc,IAAIF,SAAQ;AAClC,QAAM,CAAC,YAAY,aAAa,IAAIH,WAAS,SAAS,EAAE;AACxD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,EAAE;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAS,EAAE;AACzD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAE5C,EAAAC,YAAU,MAAM;AAEd,QAAI,CAAC,cAAc,OAAO,WAAW,aAAa;AAChD,YAAM,WAAW,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,OAAO;AACxE,UAAI,UAAU;AACZ,sBAAc,QAAQ;AAAA,MACxB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,sBAAsB,CAAC,QAA2E;AACtG,QAAI,CAAC;AAAK,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AAEnD,QAAI,QAAQ;AACZ,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;AAAG;AAC5C,QAAI,KAAK,KAAK,GAAG;AAAG;AACpB,QAAI,cAAc,KAAK,GAAG;AAAG;AAE7B,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AACzD,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,UAAU,OAAO,OAAO;AAC3D,WAAO,EAAE,UAAU,UAAU,OAAO,OAAO;AAAA,EAC7C;AAEA,QAAM,mBAAmB,oBAAoB,QAAQ;AAErD,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AAEb,QAAI,aAAa,iBAAiB;AAChC,eAAS,wBAAwB;AACjC,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,eAAS,wCAAwC;AACjD,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,CAAC,YAAY;AACf,eAAS,qBAAqB;AAC9B,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,cAAc,YAAY,QAAQ;AACzD,UAAI,SAAS,SAAS;AACpB,mBAAW,IAAI;AACf,mBAAW,MAAM;AACf,gBAAM,YAAY,QAAQ,IAAI,sCAC5B,QAAQ,IAAI,oCACZ;AAEF,gBAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,iBAAO,SAAS,OAAO,GAAG,UAAU;AAAA,QACtC,GAAG,GAAI;AAAA,MACT,OAAO;AACL,iBAAS,SAAS,WAAW,0BAA0B;AAAA,MACzD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WACE,gBAAAI,OAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,MACd,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,WAAW;AAAA,IACb,GACE;AAAA,sBAAAD,MAAC,SAAI,OAAO;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,MAClB,GACE,0BAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,SAAQ,aAAY,KACrF,0BAAAA,MAAC,cAAS,QAAO,kBAAiB,GACpC,GACF;AAAA,MACA,gBAAAA,MAAC,QAAG,OAAO;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,MAChB,GAAG,wCAEH;AAAA,MACA,gBAAAA,MAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,GAAG,mEAE/C;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,GAAG,YAAY,UAAU;AAAA,EAC3B,GACE,0BAAAC,OAAC,UAAK,UAAU,cACd;AAAA,oBAAAD,MAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,GAAG,YAAY,UAAU;AAAA,IAC3B,GAAG,iCAEH;AAAA,IAEA,gBAAAA,MAAC,OAAE,OAAO;AAAA,MACR,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,GAAG,4CAEH;AAAA,IAEC,SACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGF,gBAAAC,OAAC,SAAI,OAAO,EAAE,cAAc,QAAQ,UAAU,WAAW,GACvD;AAAA,sBAAAD,MAAC,WAAM,SAAQ,YAAW,OAAO;AAAA,QAC/B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,0BAAY;AAAA,MACf,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,UAC5C,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,UAEC,yBAAe,SAAS;AAAA;AAAA,MAC3B;AAAA,MACC,YACC,gBAAAC,OAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAC7B;AAAA,wBAAAD,MAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,UAAU;AAAA,QACZ,GACE,0BAAAA,MAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,OAAO,iBAAiB,aAAa,SAAS,QAAQ,iBAAiB,aAAa,WAAW,QAAQ;AAAA,UACvG,iBAAiB,iBAAiB;AAAA,UAClC,YAAY;AAAA,QACd,GAAG,GACL;AAAA,QACA,gBAAAC,OAAC,OAAE,OAAO;AAAA,UACR,UAAU;AAAA,UACV,OAAO,iBAAiB;AAAA,UACxB,WAAW;AAAA,UACX,eAAe;AAAA,QACjB,GACG;AAAA,2BAAiB;AAAA,UAAS;AAAA,WAC7B;AAAA,SACF;AAAA,OAEJ;AAAA,IAEA,gBAAAA,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,mBAAkB,OAAO;AAAA,QACtC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,8BAAgB;AAAA,MACnB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,UAClD,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QAEC,sBAAY,iBAAiB;AAAA;AAAA,IAChC;AAAA,KACF,GACF;AAEJ;;;ACnTA,SAAgB,YAAAJ,kBAAgB;AA0FxB,gBAAAI,OAuCA,QAAAC,cAvCA;AA3ED,IAAM,iBAAgD,CAAC,EAAE,WAAW,WAAW,MAAM;AAC1F,QAAM,EAAE,eAAe,IAAIF,SAAQ;AACnC,QAAM,CAAC,aAAa,cAAc,IAAIH,WAAS,EAAE;AACjD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,EAAE;AACjD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAS,EAAE;AACzD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAE5C,QAAM,sBAAsB,CAAC,QAA2E;AACtG,QAAI,CAAC;AAAK,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AAEnD,QAAI,QAAQ;AACZ,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;AAAG;AAC5C,QAAI,KAAK,KAAK,GAAG;AAAG;AACpB,QAAI,cAAc,KAAK,GAAG;AAAG;AAE7B,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AACzD,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,UAAU,OAAO,OAAO;AAC3D,WAAO,EAAE,UAAU,UAAU,OAAO,OAAO;AAAA,EAC7C;AAEA,QAAM,mBAAmB,oBAAoB,WAAW;AAExD,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,KAAK;AAEhB,QAAI,gBAAgB,iBAAiB;AACnC,eAAS,4BAA4B;AACrC,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,YAAY,SAAS,GAAG;AAC1B,eAAS,4CAA4C;AACrD,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,eAAe,aAAa,WAAW;AAC9D,UAAI,SAAS,SAAS;AACpB,mBAAW,IAAI;AACf,uBAAe,EAAE;AACjB,uBAAe,EAAE;AACjB,2BAAmB,EAAE;AACrB,oBAAY;AAAA,MACd,OAAO;AACL,iBAAS,SAAS,WAAW,2BAA2B;AAAA,MAC1D;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE,gBAAAI,MAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,GAAG,YAAY,UAAU;AAAA,EAC3B,GACE,0BAAAC,OAAC,UAAK,UAAU,cACd;AAAA,oBAAAD,MAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,GAAG,YAAY,UAAU;AAAA,IAC3B,GAAG,6BAEH;AAAA,IAEC,SACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGD,WACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GAAG,4CAEH;AAAA,IAGF,gBAAAC,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,eAAc,OAAO;AAAA,QAClC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,8BAAgB;AAAA,MACnB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,gBAAgB,SAAS;AAAA,UAC/B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,UAC9C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,eAAc,OAAO;AAAA,QAClC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,0BAAY;AAAA,MACf,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,gBAAgB,SAAS;AAAA,UAC/B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,UAC9C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,MACC,eACC,gBAAAC,OAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAC7B;AAAA,wBAAAD,MAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,UAAU;AAAA,QACZ,GACE,0BAAAA,MAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,OAAO,iBAAiB,aAAa,SAAS,QAAQ,iBAAiB,aAAa,WAAW,QAAQ;AAAA,UACvG,iBAAiB,iBAAiB;AAAA,UAClC,YAAY;AAAA,QACd,GAAG,GACL;AAAA,QACA,gBAAAC,OAAC,OAAE,OAAO;AAAA,UACR,UAAU;AAAA,UACV,OAAO,iBAAiB;AAAA,UACxB,WAAW;AAAA,UACX,eAAe;AAAA,QACjB,GACG;AAAA,2BAAiB;AAAA,UAAS;AAAA,WAC7B;AAAA,SACF;AAAA,OAEJ;AAAA,IAEA,gBAAAA,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,mBAAkB,OAAO;AAAA,QACtC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,kCAAoB;AAAA,MACvB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,gBAAgB,SAAS;AAAA,UAC/B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,UAClD,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC,0BAAAC,OAAC,WAAM,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,QAAQ,UAAU,GACvE;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,OAAO;AAAA,UAClD,OAAO,EAAE,aAAa,MAAM;AAAA;AAAA,MAC9B;AAAA,MACA,gBAAAA,MAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,GAAG,4BAAc;AAAA,OAClE,GACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QAEC,sBAAY,yBAAyB;AAAA;AAAA,IACxC;AAAA,KACF,GACF;AAEJ;;;ACjRA,SAAgB,YAAAJ,kBAAgB;AAwF1B,gBAAAI,OAuCE,QAAAC,cAvCF;AA/EC,IAAM,cAA0C,CAAC;AAAA,EACtD,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,qBAAqB;AACvB,MAAM;AACJ,QAAM,EAAE,MAAM,eAAe,cAAc,mBAAmB,IAAIF,SAAQ;AAC1E,QAAM,CAAC,MAAM,OAAO,IAAIH,WAAS,MAAM,QAAQ,EAAE;AACjD,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,EAAE;AACvC,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,EAAE;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAwB,IAAI;AAE1D,QAAM,mBAAmB,OAAO,MAAuB;AACrD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,WAAW,MAAM,cAAc,EAAE,KAAK,CAAC;AAC7C,UAAI,SAAS,SAAS;AACpB,mBAAW,4BAA4B;AAAA,MACzC,OAAO;AACL,iBAAS,SAAS,WAAW,uBAAuB;AAAA,MACtD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,qBAAqB,OAAO,MAAuB;AACvD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,WAAW,MAAM,aAAa,MAAM;AAC1C,UAAI,SAAS,SAAS;AACpB,mBAAW,8BAA8B;AACzC,kBAAU,EAAE;AAAA,MACd,OAAO;AACL,iBAAS,SAAS,WAAW,yBAAyB;AAAA,MACxD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,2BAA2B,OAAO,MAAuB;AAC7D,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,WAAW,MAAM,mBAAmB,QAAQ;AAClD,UAAI,SAAS,SAAS;AACpB,mBAAW,mDAAmD;AAC9D,oBAAY,EAAE;AAAA,MAChB,OAAO;AACL,iBAAS,SAAS,WAAW,gCAAgC;AAAA,MAC/D;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,CAAC;AAAM,WAAO;AAElB,SACE,gBAAAK,OAAC,SAAI,OAAO,EAAE,UAAU,SAAS,QAAQ,UAAU,SAAS,OAAO,GACjE;AAAA,oBAAAD,MAAC,QAAG,OAAO,EAAE,cAAc,QAAQ,UAAU,QAAQ,YAAY,IAAI,GAAG,8BAAgB;AAAA,IAEvF,SACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGD,WACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,mBACH;AAAA,IAIF,gBAAAC,OAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,MAAC,QAAG,OAAO,EAAE,cAAc,QAAQ,UAAU,QAAQ,YAAY,IAAI,GAAG,yBAAW;AAAA,MACnF,gBAAAC,OAAC,UAAK,UAAU,kBACd;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,YACvC,UAAQ;AAAA,YACR,UAAU;AAAA,YACV,OAAO;AAAA,cACL,OAAO;AAAA,cACP,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,WAAW;AAAA,cACX,cAAc;AAAA,YAChB;AAAA,YACA,aAAY;AAAA;AAAA,QACd;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,YACV;AAAA,YACD;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,IAGC,cACC,gBAAAC,OAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,MAAC,QAAG,OAAO,EAAE,cAAc,QAAQ,UAAU,QAAQ,YAAY,IAAI,GAAG,2BAAa;AAAA,MACrF,gBAAAC,OAAC,UAAK,UAAU,oBACd;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,YACzC,UAAQ;AAAA,YACR,UAAU;AAAA,YACV,OAAO;AAAA,cACL,OAAO;AAAA,cACP,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,WAAW;AAAA,cACX,cAAc;AAAA,YAChB;AAAA,YACA,aAAY;AAAA;AAAA,QACd;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,YACV;AAAA,YACD;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,IAID,mBACC,gBAAAC,OAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,MAAC,QAAG,OAAO,EAAE,cAAc,QAAQ,UAAU,QAAQ,YAAY,IAAI,GAAG,0BAAY;AAAA,MACpF,gBAAAC,OAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,QAAQ,cAAc,OAAO,GAAG;AAAA;AAAA,QACpD,gBAAAD,MAAC,YAAQ,eAAK,OAAM;AAAA,SACrC;AAAA,MACA,gBAAAC,OAAC,UAAK,UAAU,0BACd;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,YAC3C,UAAQ;AAAA,YACR,UAAU;AAAA,YACV,OAAO;AAAA,cACL,OAAO;AAAA,cACP,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,WAAW;AAAA,cACX,cAAc;AAAA,YAChB;AAAA,YACA,aAAY;AAAA;AAAA,QACd;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,YACV;AAAA,YACD;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AC1QA,SAAS,YAAAJ,YAAU,aAAAC,aAAW,eAAAC,oBAAmB;AAgCjD,IAAM,WAAW,OAAO,WAAW;AAE5B,IAAM,cAAc,CAAC,WAA0C;AACpE,QAAM,CAAC,WAAW,IAAIF,WAAsB,MAAM;AAEhD,UAAM,UAAU,IAAI,YAAY,MAAM;AAGtC,QAAI,YAAY,OAAO,OAAO;AAC5B,MAAC,QAAgB,OAAO,IAAI,OAAO;AACnC,MAAC,QAAgB,YAAY,EAAE,aAAa,OAAO,KAAK;AAAA,IAC1D;AAEA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAsB,IAAI;AAClD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAkB,KAAK;AACrE,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAkB,IAAI;AAEpD,QAAM,kBAAkBE,aAAY,MAAM;AAExC,QAAI,UAAU;AACZ,YAAM,QAAQ,OAAO,SAAU,YAAoB,SAAS;AAC5D,YAAM,gBAAgB,CAAC,CAAC;AACxB,yBAAmB,aAAa;AAEhC,UAAI,iBAAiB,OAAO;AAC1B,YAAI;AACF,gBAAM,UAAU,KAAK,MAAM,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACpD,kBAAQ,QAAQ,QAAQ,IAAI;AAAA,QAC9B,SAAS,OAAP;AACA,kBAAQ,MAAM,oCAAoC,KAAK;AACvD,kBAAQ,IAAI;AAAA,QACd;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF,OAAO;AAEL,YAAM,gBAAgB,YAAY,gBAAgB;AAClD,yBAAmB,aAAa;AAEhC,UAAI,eAAe;AACjB,cAAM,cAAc,YAAY,eAAe;AAC/C,gBAAQ,WAAW;AAAA,MACrB,OAAO;AACL,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF;AAEA,eAAW,KAAK;AAAA,EAClB,GAAG,CAAC,aAAa,OAAO,KAAK,CAAC;AAE9B,EAAAD,YAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,WAAWC,aAAY,OAAO,SAA8C;AAChF,eAAW,IAAI;AACf,QAAI;AAEF,YAAM,WAAW,MAAM,YAAY,SAAS,IAAI;AAChD,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,QAAQA,aAAY,OAAO,SAA2C;AAC1E,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,MAAM,IAAI;AAC7C,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,SAASA,aAAY,OAAO,SAA4C;AAC5E,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,OAAO,IAAI;AAC9C,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AACrB,2BAAmB,IAAI;AAAA,MACzB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,mBAAmBA,aAAY,OAAO,UAAyC;AACnF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,iBAAiB,KAAK;AACzD,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AACrB,2BAAmB,IAAI;AAAA,MACzB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,SAASA,aAAY,YAA2B;AACpD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,YAAY,OAAO;AACzB,cAAQ,IAAI;AACZ,yBAAmB,KAAK;AAAA,IAC1B,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,gBAAgBA,aAAY,OAAO,SAAgD;AACvF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,cAAc,IAAI;AACrD,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAaA,aAAY,YAA2B;AACxD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,cAAQ,QAAQ;AAChB,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAcA,aAAY,YAA6B;AAC3D,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,YAAY;AAAA,IACvC,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAcA,aAAY,OAAO,OAA8B;AACnE,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,YAAY,EAAE;AAAA,IACzC,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,iBAAiBA,aAAY,OAAO,UAAyC;AACjF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,eAAe,KAAK;AACvD,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,gBAAgBA,aAAY,OAAO,OAAe,aAA4C;AAClG,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,cAAc,OAAO,QAAQ;AAChE,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAGhB,QAAM,WAAWA,aAAY,CAAC,UAAkB;AAC9C,IAAC,YAAoB,OAAO,IAAI;AAChC,IAAC,YAAoB,YAAY,EAAE,aAAa,KAAK;AACrD,uBAAmB,IAAI;AAEvB,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACpD,cAAQ,QAAQ,QAAQ,IAAI;AAAA,IAC9B,SAAS,OAAP;AACA,cAAQ,MAAM,oCAAoC,KAAK;AACvD,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAaA,aAAY,MAAM;AACnC,IAAC,YAAoB,OAAO,IAAI;AAChC,IAAC,YAAoB,YAAY,EAAE,gBAAgB;AACnD,uBAAmB,KAAK;AACxB,YAAQ,IAAI;AAAA,EACd,GAAG,CAAC,WAAW,CAAC;AAEhB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';\r\n\r\nexport class HttpClient {\r\n private axiosInstance: AxiosInstance;\r\n private csrfToken: string | null = null;\r\n private frontendBaseUrl: string | null = null;\r\n\r\n constructor(baseUrl: string, defaultHeaders: Record<string, string> = {}) {\r\n this.axiosInstance = axios.create({\r\n baseURL: baseUrl.replace(/\\/$/, ''),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...defaultHeaders\r\n },\r\n withCredentials: true, // Include cookies for CSRF\r\n timeout: 30000 // 30 second timeout\r\n });\r\n\r\n // Request interceptor to add CSRF token and frontend URL\r\n this.axiosInstance.interceptors.request.use(\r\n (config) => {\r\n // Add CSRF token to mutating requests\r\n if (this.csrfToken && ['post', 'put', 'delete', 'patch'].includes(config.method?.toLowerCase() || '')) {\r\n config.headers['x-csrf-token'] = this.csrfToken;\r\n }\r\n \r\n // Add frontend base URL header if available\r\n if (this.frontendBaseUrl) {\r\n config.headers['X-Frontend-URL'] = this.frontendBaseUrl;\r\n }\r\n \r\n return config;\r\n },\r\n (error) => Promise.reject(error)\r\n );\r\n\r\n // Response interceptor for error handling and CSRF token refresh\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };\r\n\r\n // Handle CSRF token refresh on 403\r\n if (error.response?.status === 403 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n\r\n try {\r\n await this.refreshCsrfToken();\r\n if (originalRequest.headers) {\r\n originalRequest.headers['x-csrf-token'] = this.csrfToken!;\r\n }\r\n return this.axiosInstance(originalRequest);\r\n } catch (refreshError) {\r\n return Promise.reject(refreshError);\r\n }\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n public async get<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.get<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public async post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.post<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async put<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.put<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async delete<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.delete<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public setAuthToken(token: string): void {\r\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n public removeAuthToken(): void {\r\n delete this.axiosInstance.defaults.headers.common['Authorization'];\r\n }\r\n\r\n public setCsrfToken(token: string): void {\r\n this.csrfToken = token;\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.csrfToken;\r\n }\r\n\r\n public removeCsrfToken(): void {\r\n this.csrfToken = null;\r\n }\r\n\r\n public setFrontendBaseUrl(url: string): void {\r\n this.frontendBaseUrl = url;\r\n }\r\n\r\n public getFrontendBaseUrl(): string | null {\r\n return this.frontendBaseUrl;\r\n }\r\n\r\n public removeFrontendBaseUrl(): void {\r\n this.frontendBaseUrl = null;\r\n }\r\n\r\n private async refreshCsrfToken(): Promise<void> {\r\n try {\r\n const response = await this.axiosInstance.get<{ csrfToken: string }>('/api/v1/auth/csrf-token');\r\n this.csrfToken = response.data.csrfToken;\r\n } catch (error) {\r\n console.error('Failed to refresh CSRF token:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { HttpClient } from './http-client';\r\nimport {\r\n AuthResponse,\r\n LoginData,\r\n VerifyData,\r\n UpdateUserData,\r\n User,\r\n AuthConfig,\r\n RegisterData,\r\n OAuthProvider,\r\n CsrfTokenResponse\r\n} from '../types';\r\n\r\nexport class AuthService {\r\n private httpClient: HttpClient;\r\n private config: AuthConfig;\r\n private token: string | null = null;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n localStorageKey: 'auth_token',\r\n csrfEnabled: true,\r\n ...config\r\n };\r\n\r\n this.httpClient = new HttpClient(this.config.baseUrl);\r\n this.loadTokenFromStorage();\r\n\r\n // Set frontend base URL if available\r\n if (typeof window !== 'undefined') {\r\n const frontendBaseUrl = \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n \r\n if (frontendBaseUrl) {\r\n this.httpClient.setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n }\r\n\r\n // Initialize CSRF token if enabled\r\n if (this.config.csrfEnabled && typeof window !== 'undefined') {\r\n this.refreshCsrfToken();\r\n }\r\n }\r\n\r\n private loadTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n const token = localStorage.getItem(this.config.localStorageKey);\r\n if (token) {\r\n this.token = token;\r\n this.httpClient.setAuthToken(token);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private saveTokenToStorage(token: string): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.setItem(this.config.localStorageKey, token);\r\n } catch (error) {\r\n console.warn('Failed to save token to storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private removeTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.removeItem(this.config.localStorageKey);\r\n } catch (error) {\r\n console.warn('Failed to remove token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n public isAuthenticated(): boolean {\r\n return !!this.token;\r\n }\r\n\r\n public getToken(): string | null {\r\n return this.token;\r\n }\r\n\r\n public getCurrentUser(): User | null {\r\n if (!this.token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(atob(this.token.split('.')[1]));\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // CSRF Token Management\r\n public async refreshCsrfToken(): Promise<void> {\r\n if (!this.config.csrfEnabled) return;\r\n\r\n try {\r\n const response = await this.httpClient.get<CsrfTokenResponse>('/api/v1/auth/csrf-token');\r\n if (response.csrfToken) {\r\n this.httpClient.setCsrfToken(response.csrfToken);\r\n }\r\n } catch (error) {\r\n console.error('Failed to get CSRF token:', error);\r\n }\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.httpClient.getCsrfToken();\r\n }\r\n\r\n // OAuth Methods\r\n public loginWithOAuth(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth login is only available in browser environments');\r\n }\r\n\r\n const oauthUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}`;\r\n window.location.href = oauthUrl;\r\n }\r\n\r\n public linkOAuthProvider(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth linking is only available in browser environments');\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error('Must be authenticated to link OAuth provider');\r\n }\r\n\r\n const linkUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}/link`;\r\n window.location.href = linkUrl;\r\n }\r\n\r\n public async unlinkOAuthProvider(provider: OAuthProvider): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(\r\n `/api/v1/auth/oauth/${provider}/unlink`\r\n );\r\n return response;\r\n }\r\n\r\n // Standard Auth Methods\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/login', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/register', data);\r\n\r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/verify', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async verifyEmailToken(token: string): Promise<AuthResponse> {\r\n try {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/auth/verify-email?token=${token}`);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n } catch (error: any) {\r\n // Handle axios error response\r\n if (error.response?.data) {\r\n return {\r\n success: false,\r\n message: error.response.data.message || 'Email verification failed',\r\n };\r\n }\r\n \r\n // Handle network or other errors\r\n return {\r\n success: false,\r\n message: error.message || 'Network error occurred',\r\n };\r\n }\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n // Call backend to clear cookie\r\n try {\r\n await this.httpClient.post('/api/v1/auth/logout', {});\r\n } catch (error) {\r\n console.warn('Failed to call logout endpoint:', error);\r\n }\r\n\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.httpClient.removeCsrfToken();\r\n this.removeTokenFromStorage();\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/user', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this.httpClient.get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async forgotPassword(email: string): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/forgot-password', { email });\r\n return response;\r\n }\r\n\r\n public async resetPassword(token: string, password: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/reset-password', { token, password });\r\n return response;\r\n }\r\n\r\n public async changePassword(oldPassword: string, newPassword: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/change-password', { \r\n oldPassword, \r\n newPassword \r\n });\r\n return response;\r\n }\r\n\r\n public async updateAvatar(avatar: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/avatar', { avatar });\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async requestEmailChange(newEmail: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/request-email-change', { \r\n newEmail \r\n });\r\n return response;\r\n }\r\n\r\n public async verifyEmailChange(token: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/user/verify-email-change?token=${token}`);\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n // 2FA / MFA Methods\r\n public async generate2FA(): Promise<{ success: boolean; qrCode?: string; secret?: string; message: string }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<{ success: boolean; qrCode?: string; secret?: string; message: string }>(\r\n '/api/v1/mfa/generate', \r\n {}\r\n );\r\n return response;\r\n }\r\n\r\n public async enable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/enable', { token });\r\n return response;\r\n }\r\n\r\n public async disable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/disable', { token });\r\n return response;\r\n }\r\n\r\n public async validate2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/validate', { token });\r\n return response;\r\n }\r\n\r\n // Session Management Methods\r\n public async getSessions(): Promise<{ success: boolean; sessions: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; sessions: any[] }>('/api/v1/sessions');\r\n return response;\r\n }\r\n\r\n public async revokeSession(sessionId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(`/api/v1/sessions/${sessionId}`);\r\n return response;\r\n }\r\n\r\n public async revokeAllSessions(): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>('/api/v1/sessions/revoke/all');\r\n \r\n // After revoking all sessions, current session is also revoked\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.removeTokenFromStorage();\r\n \r\n return response;\r\n }\r\n\r\n // Admin Methods\r\n public async getAuditLogs(filters?: any): Promise<{ success: boolean; logs: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; logs: any[] }>(\r\n '/api/v1/admin/audit-logs',\r\n filters\r\n );\r\n return response;\r\n }\r\n\r\n public async adminVerifyUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/verify-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminForcePasswordReset(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/force-password-reset/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminSuspendUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/suspend-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminActivateUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/activate-user/${userId}`, {});\r\n return response;\r\n }\r\n}","import { useState, useEffect, useCallback } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\ninterface UseAuthReturnBase {\r\n user: User | null;\r\n isAuthenticated: boolean;\r\n loading: boolean;\r\n register: (data: RegisterData) => Promise<AuthResponse>;\r\n login: (data: LoginData) => Promise<AuthResponse>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n logout: () => Promise<void>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n getAllUsers: () => Promise<User[]>;\r\n getUserById: (id: string) => Promise<User>;\r\n}\r\n\r\nexport const useAuth = (config: AuthConfig): UseAuthReturnBase => {\r\n const [authService] = useState<AuthService>(() => new AuthService(config));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isAuthenticated, setIsAuthenticated] = useState<boolean>(false);\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const checkAuthStatus = useCallback(() => {\r\n const authenticated = authService.isAuthenticated();\r\n setIsAuthenticated(authenticated);\r\n \r\n if (authenticated) {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setLoading(false);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const register = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await authService.register(data);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const login = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n // Update user state if login was successful and we have a user\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const logout = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n setIsAuthenticated(false);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getAllUsers = useCallback(async (): Promise<User[]> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getAllUsers();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getUserById = useCallback(async (id: string): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getUserById(id);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n return {\r\n user,\r\n isAuthenticated,\r\n loading,\r\n register,\r\n login,\r\n verify,\r\n verifyEmailToken,\r\n logout,\r\n updateProfile,\r\n getProfile,\r\n getAllUsers,\r\n getUserById\r\n };\r\n};","'use client';\r\n\r\nimport React, { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { User, AuthConfig, AuthResponse, LoginData, RegisterData, VerifyData, UpdateUserData, OAuthProvider } from '../types';\r\n\r\ninterface AuthContextValue {\r\n user: User | null;\r\n isLoaded: boolean;\r\n isSignedIn: boolean;\r\n loading: boolean;\r\n signIn: (data: LoginData) => Promise<AuthResponse>;\r\n signUp: (data: RegisterData) => Promise<AuthResponse>;\r\n signOut: () => Promise<void>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n signInWithOAuth: (provider: OAuthProvider) => void;\r\n linkOAuthProvider: (provider: OAuthProvider) => void;\r\n unlinkOAuthProvider: (provider: OAuthProvider) => Promise<AuthResponse>;\r\n forgotPassword: (email: string) => Promise<AuthResponse>;\r\n resetPassword: (token: string, password: string) => Promise<AuthResponse>;\r\n changePassword: (oldPassword: string, newPassword: string) => Promise<AuthResponse>;\r\n updateAvatar: (avatar: string) => Promise<AuthResponse>;\r\n requestEmailChange: (newEmail: string) => Promise<AuthResponse>;\r\n verifyEmailChange: (token: string) => Promise<AuthResponse>;\r\n generate2FA: () => Promise<any>;\r\n enable2FA: (token: string) => Promise<AuthResponse>;\r\n disable2FA: (token: string) => Promise<AuthResponse>;\r\n validate2FA: (token: string) => Promise<AuthResponse>;\r\n getSessions: () => Promise<any>;\r\n revokeSession: (sessionId: string) => Promise<AuthResponse>;\r\n revokeAllSessions: () => Promise<AuthResponse>;\r\n authService: AuthService;\r\n}\r\n\r\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\r\n\r\ninterface AuthProviderProps {\r\n children: ReactNode;\r\n config?: Partial<AuthConfig>;\r\n}\r\n\r\nexport const AuthProvider: React.FC<AuthProviderProps> = ({ children, config }) => {\r\n // Get configuration from environment variables or props\r\n const authConfig: AuthConfig = {\r\n baseUrl: config?.baseUrl || \r\n (typeof window !== 'undefined' \r\n ? (process.env.NEXT_PUBLIC_AUTH_API_URL || process.env.REACT_APP_AUTH_API_URL || 'http://localhost:7000')\r\n : 'http://localhost:7000'),\r\n localStorageKey: config?.localStorageKey || 'auth_token',\r\n csrfEnabled: config?.csrfEnabled !== undefined ? config.csrfEnabled : true,\r\n };\r\n\r\n const [authService] = useState(() => new AuthService(authConfig));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const checkAuthStatus = useCallback(async () => {\r\n const authenticated = authService.isAuthenticated();\r\n \r\n if (authenticated) {\r\n try {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } catch (error) {\r\n console.error('Failed to get current user:', error);\r\n setUser(null);\r\n }\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setIsLoaded(true);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const signIn = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signUp = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.register(data);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signOut = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signInWithOAuth = useCallback((provider: OAuthProvider) => {\r\n authService.loginWithOAuth(provider);\r\n }, [authService]);\r\n\r\n const linkOAuthProvider = useCallback((provider: OAuthProvider) => {\r\n authService.linkOAuthProvider(provider);\r\n }, [authService]);\r\n\r\n const unlinkOAuthProvider = useCallback(async (provider: OAuthProvider): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.unlinkOAuthProvider(provider);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const forgotPassword = useCallback(async (email: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.forgotPassword(email);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const resetPassword = useCallback(async (token: string, password: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.resetPassword(token, password);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const changePassword = useCallback(async (oldPassword: string, newPassword: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.changePassword(oldPassword, newPassword);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateAvatar = useCallback(async (avatar: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateAvatar(avatar);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const requestEmailChange = useCallback(async (newEmail: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.requestEmailChange(newEmail);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailChange = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailChange(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const generate2FA = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n return await authService.generate2FA();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const enable2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.enable2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const disable2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.disable2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const validate2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.validate2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getSessions = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n return await authService.getSessions();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const revokeSession = useCallback(async (sessionId: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.revokeSession(sessionId);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const revokeAllSessions = useCallback(async (): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.revokeAllSessions();\r\n setUser(null);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const value: AuthContextValue = {\r\n user,\r\n isLoaded,\r\n isSignedIn: !!user,\r\n loading,\r\n signIn,\r\n signUp,\r\n signOut,\r\n verify,\r\n verifyEmailToken,\r\n updateProfile,\r\n getProfile,\r\n signInWithOAuth,\r\n linkOAuthProvider,\r\n unlinkOAuthProvider,\r\n forgotPassword,\r\n resetPassword,\r\n changePassword,\r\n updateAvatar,\r\n requestEmailChange,\r\n verifyEmailChange,\r\n generate2FA,\r\n enable2FA,\r\n disable2FA,\r\n validate2FA,\r\n getSessions,\r\n revokeSession,\r\n revokeAllSessions,\r\n authService,\r\n };\r\n\r\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\r\n};\r\n\r\nexport const useAuth = (): AuthContextValue => {\r\n const context = useContext(AuthContext);\r\n if (context === undefined) {\r\n throw new Error('useAuth must be used within an AuthProvider');\r\n }\r\n return context;\r\n};\r\n","'use client';\n\nimport React, { useState } from 'react';\nimport { useAuth } from '../use-auth';\n// Removed CSS import - styles will be embedded directly\n\ninterface LoginFormProps {\n onSuccess?: (response: { message: string; email?: string; token?: string; success: boolean; user?: any }) => void;\n onLoginSuccess?: (email: string, needsOtpVerification: boolean) => void; // For backward compatibility\n onRegisterClick?: () => void;\n showRegisterLink?: boolean;\n config?: {\n baseUrl?: string;\n };\n oauthProviders?: Array<'google' | 'github'>;\n showOAuthButtons?: boolean;\n}\n\nexport const LoginForm: React.FC<LoginFormProps> = ({\n onSuccess,\n onLoginSuccess,\n onRegisterClick,\n showRegisterLink = true,\n config,\n oauthProviders = ['google', 'github'],\n showOAuthButtons = true\n}) => {\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [usePassword, setUsePassword] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [rememberMe, setRememberMe] = useState(false);\n\n const { login } = useAuth({\n baseUrl: config?.baseUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:7000')\n });\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsLoading(true);\n setError(null);\n\n try {\n let response;\n if (usePassword) {\n // Traditional email/password login\n response = await login({ email, password });\n } else {\n // OTP-based login\n response = await login({ email });\n }\n\n if (response.success) {\n // Call the new callback if provided\n onSuccess?.(response);\n\n // For backward compatibility, call the old callback if provided\n if (onLoginSuccess) {\n // Check if this is an OTP sent response or a successful login\n if (response.message === 'OTP sent to your email.') {\n // OTP was sent, need to verify\n onLoginSuccess(email, true);\n } else if (response.token) {\n // Direct login successful (email/password)\n onLoginSuccess(email, false);\n } else {\n // Default to needing OTP verification for safety\n onLoginSuccess(email, true);\n }\n }\n } else {\n setError(response.message || 'Login failed');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\n } finally {\n setIsLoading(false);\n }\n };\n\n const toggleAuthMethod = () => {\n setUsePassword(!usePassword);\n setError(null); // Clear error when switching methods\n };\n\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n\n return (\n <div style={{\n maxWidth: '400px',\n margin: '0 auto',\n padding: '30px',\n borderRadius: '12px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\n backgroundColor: '#ffffff',\n border: '1px solid #eaeaea'\n }}>\n <form onSubmit={handleSubmit} style={{\n display: 'flex',\n flexDirection: 'column'\n }}>\n <h2 style={{\n textAlign: 'center',\n marginBottom: '24px',\n color: '#1f2937',\n fontSize: '24px',\n fontWeight: 600\n }}>{usePassword ? 'Login with Password' : 'Login with OTP'}</h2>\n\n {error && (\n <div style={{\n padding: '12px 16px',\n marginBottom: '20px',\n backgroundColor: '#f8d7da',\n color: '#721c24',\n border: '1px solid #f5c6cb',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: 500\n }}>\n {error}\n </div>\n )}\n\n <div style={{\n marginBottom: '20px'\n }}>\n <label htmlFor=\"email\" style={{\n display: 'block',\n marginBottom: '8px',\n fontWeight: 500,\n color: '#374151',\n fontSize: '14px'\n }}>Email:</label>\n <input\n id=\"email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '12px 16px',\n border: '1px solid #ddd',\n borderRadius: '8px',\n fontSize: '16px',\n boxSizing: 'border-box',\n color: '#111827',\n transition: 'all 0.2s ease',\n backgroundColor: '#ffffff'\n }}\n placeholder=\"Enter your email\"\n />\n </div>\n\n {usePassword && (\n <div style={{\n marginBottom: '20px',\n position: 'relative'\n }}>\n <label htmlFor=\"login-password\" style={{\n display: 'block',\n marginBottom: '8px',\n fontWeight: 500,\n color: '#555',\n fontSize: '14px'\n }}>Password:</label>\n <input\n id=\"login-password\"\n type={showPassword ? \"text\" : \"password\"}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n required\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '12px 16px',\n border: '1px solid #ddd',\n borderRadius: '8px',\n fontSize: '16px',\n boxSizing: 'border-box',\n color: '#333',\n transition: 'all 0.2s ease',\n backgroundColor: '#fafafa'\n }}\n placeholder=\"Enter your password\"\n />\n <button\n type=\"button\"\n onClick={togglePasswordVisibility}\n disabled={isLoading}\n style={{\n position: 'absolute',\n right: '12px',\n top: '38px',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: '#666',\n fontSize: '14px'\n }}\n >\n {showPassword ? 'Hide' : 'Show'}\n </button>\n </div>\n )}\n\n {usePassword && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '16px',\n marginTop: '8px'\n }}>\n <input\n type=\"checkbox\"\n id=\"remember-me\"\n checked={rememberMe}\n onChange={(e) => setRememberMe(e.target.checked)}\n disabled={isLoading}\n style={{\n marginRight: '8px',\n cursor: 'pointer',\n width: '16px',\n height: '16px'\n }}\n />\n <label\n htmlFor=\"remember-me\"\n style={{\n fontSize: '14px',\n color: '#666',\n cursor: 'pointer',\n userSelect: 'none'\n }}\n >\n Remember me\n </label>\n </div>\n )}\n\n <button\n type=\"submit\"\n disabled={isLoading}\n style={{\n padding: '14px',\n backgroundColor: '#007bff',\n color: 'white',\n border: 'none',\n borderRadius: '8px',\n fontSize: '16px',\n fontWeight: 600,\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n marginTop: '8px'\n }}\n >\n {isLoading ? (usePassword ? 'Logging in...' : 'Sending OTP...') : (usePassword ? 'Login' : 'Send OTP')}\n </button>\n\n <div style={{\n textAlign: 'center',\n marginTop: '20px',\n paddingTop: '20px',\n borderTop: '1px solid #eee'\n }}>\n <button\n type=\"button\"\n onClick={toggleAuthMethod}\n disabled={isLoading}\n style={{\n background: 'none',\n border: 'none',\n color: '#007bff',\n textDecoration: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n padding: '0',\n transition: 'color 0.2s ease'\n }}\n >\n {usePassword ? 'Login with OTP instead' : 'Login with password instead'}\n </button>\n </div>\n\n {showOAuthButtons && oauthProviders.length > 0 && (\n <div style={{\n marginTop: '20px',\n paddingTop: '20px',\n borderTop: '1px solid #eee'\n }}>\n <div style={{\n position: 'relative',\n marginBottom: '16px'\n }}>\n <div style={{\n position: 'absolute',\n top: '50%',\n left: 0,\n right: 0,\n height: '1px',\n backgroundColor: '#eee'\n }} />\n <div style={{\n position: 'relative',\n textAlign: 'center'\n }}>\n <span style={{\n backgroundColor: '#ffffff',\n padding: '0 12px',\n color: '#666',\n fontSize: '14px'\n }}>Or continue with</span>\n </div>\n </div>\n\n <div style={{\n display: 'grid',\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\n gap: '12px'\n }}>\n {oauthProviders.includes('google') && (\n <a\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/google`}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '10px 16px',\n backgroundColor: '#ffffff',\n border: '1px solid #ddd',\n borderRadius: '8px',\n color: '#333',\n textDecoration: 'none',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'all 0.2s ease'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#f8f8f8';\n e.currentTarget.style.borderColor = '#007bff';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#ffffff';\n e.currentTarget.style.borderColor = '#ddd';\n }}\n >\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n Google\n </a>\n )}\n\n {oauthProviders.includes('github') && (\n <a\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/github`}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '10px 16px',\n backgroundColor: '#24292e',\n border: '1px solid #24292e',\n borderRadius: '8px',\n color: '#ffffff',\n textDecoration: 'none',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'all 0.2s ease'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#1b1f23';\n e.currentTarget.style.borderColor = '#1b1f23';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#24292e';\n e.currentTarget.style.borderColor = '#24292e';\n }}\n >\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n GitHub\n </a>\n )}\n </div>\n </div>\n )}\n\n {showRegisterLink && (\n <div style={{\n textAlign: 'center',\n marginTop: '20px',\n paddingTop: '20px',\n borderTop: '1px solid #eee'\n }}>\n <p style={{\n color: '#666',\n fontSize: '14px'\n }}>\n Don't have an account?{' '}\n <button\n type=\"button\"\n onClick={onRegisterClick}\n disabled={isLoading}\n style={{\n background: 'none',\n border: 'none',\n color: '#007bff',\n textDecoration: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n padding: '0',\n transition: 'color 0.2s ease'\n }}\n >\n Register\n </button>\n </p>\n </div>\n )}\n </form>\n </div>\n );\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\n// Removed CSS import - styles will be embedded directly\r\nimport { AuthConfig } from '../../types';\r\n\r\ninterface RegisterFormProps {\r\n onRegisterSuccess?: () => void;\r\n onLoginClick?: () => void;\r\n showLoginLink?: boolean;\r\n authConfig?: AuthConfig;\r\n oauthProviders?: Array<'google' | 'github'>;\r\n showOAuthButtons?: boolean;\r\n}\r\n\r\nexport const RegisterForm: React.FC<RegisterFormProps> = ({\r\n onRegisterSuccess,\r\n onLoginClick,\r\n showLoginLink = true,\r\n authConfig,\r\n oauthProviders = ['google', 'github'],\r\n showOAuthButtons = true\r\n}) => {\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; score: number; label: string } => {\r\n if (!pwd) return { strength: 'weak', score: 0, label: '' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', score, label: 'Weak' };\r\n if (score <= 3) return { strength: 'medium', score, label: 'Medium' };\r\n return { strength: 'strong', score, label: 'Strong' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n // Use the provided authConfig or a default one\r\n const config = authConfig || {\r\n baseUrl: typeof window !== 'undefined'\r\n ? (process.env.NEXT_PUBLIC_AUTH_API_URL || window.location.origin)\r\n : 'http://localhost:7000'\r\n };\r\n\r\n const { register } = useAuth(config);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Validate password confirmation\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n // Validate password strength\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters long');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n // Pass the frontend base URL to ensure correct verification links\r\n const registerData = {\r\n name,\r\n email,\r\n password,\r\n frontendBaseUrl: typeof window !== 'undefined'\r\n ? (process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL || window.location.origin)\r\n : undefined\r\n };\r\n\r\n const response = await register(registerData);\r\n if (response.success) {\r\n onRegisterSuccess?.();\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Register</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#f8d7da',\r\n color: '#721c24',\r\n border: '1px solid #f5c6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Name:</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: '#111827',\r\n transition: 'all 0.2s ease',\r\n backgroundColor: '#ffffff'\r\n }}\r\n placeholder=\"Enter your name\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"register-email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#555',\r\n fontSize: '14px'\r\n }}>Email:</label>\r\n <input\r\n id=\"register-email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: '#333',\r\n transition: 'all 0.2s ease',\r\n backgroundColor: '#fafafa'\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#555',\r\n fontSize: '14px'\r\n }}>Password:</label>\r\n <input\r\n id=\"password\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: '#333',\r\n transition: 'all 0.2s ease',\r\n backgroundColor: '#fafafa'\r\n }}\r\n placeholder=\"Enter your password\"\r\n minLength={6}\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"confirm-password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#555',\r\n fontSize: '14px'\r\n }}>Confirm Password:</label>\r\n <input\r\n id=\"confirm-password\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: '#333',\r\n transition: 'all 0.2s ease',\r\n backgroundColor: '#fafafa'\r\n }}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '8px'\r\n }}\r\n >\r\n {isLoading ? 'Registering...' : 'Register'}\r\n </button>\r\n\r\n {showOAuthButtons && oauthProviders.length > 0 && (\r\n <div style={{\r\n marginTop: '20px',\r\n paddingTop: '20px',\r\n borderTop: '1px solid #eee'\r\n }}>\r\n <div style={{\r\n position: 'relative',\r\n marginBottom: '16px'\r\n }}>\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: 0,\r\n right: 0,\r\n height: '1px',\r\n backgroundColor: '#eee'\r\n }} />\r\n <div style={{\r\n position: 'relative',\r\n textAlign: 'center'\r\n }}>\r\n <span style={{\r\n backgroundColor: '#ffffff',\r\n padding: '0 12px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>Or continue with</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{\r\n display: 'grid',\r\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\r\n gap: '12px'\r\n }}>\r\n {oauthProviders.includes('google') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/google`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n color: '#333',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#f8f8f8';\r\n e.currentTarget.style.borderColor = '#007bff';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#ffffff';\r\n e.currentTarget.style.borderColor = '#ddd';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"#4285F4\"\r\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\r\n />\r\n <path\r\n fill=\"#34A853\"\r\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\r\n />\r\n <path\r\n fill=\"#FBBC05\"\r\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\r\n />\r\n <path\r\n fill=\"#EA4335\"\r\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\r\n />\r\n </svg>\r\n Google\r\n </a>\r\n )}\r\n\r\n {oauthProviders.includes('github') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/github`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#24292e',\r\n border: '1px solid #24292e',\r\n borderRadius: '8px',\r\n color: '#ffffff',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#1b1f23';\r\n e.currentTarget.style.borderColor = '#1b1f23';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#24292e';\r\n e.currentTarget.style.borderColor = '#24292e';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\r\n </svg>\r\n GitHub\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showLoginLink && (\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '20px',\r\n paddingTop: '20px',\r\n borderTop: '1px solid #eee'\r\n }}>\r\n <p style={{\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Already have an account?{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onLoginClick}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Login\r\n </button>\r\n </p>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface OtpFormProps {\r\n email: string;\r\n onVerifySuccess?: () => void;\r\n onBackToLogin?: () => void;\r\n}\r\n\r\nexport const OtpForm: React.FC<OtpFormProps> = ({\r\n email,\r\n onVerifySuccess,\r\n onBackToLogin\r\n}) => {\r\n const [otp, setOtp] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [resendCooldown, setResendCooldown] = useState(0);\r\n const [resendLoading, setResendLoading] = useState(false);\r\n \r\n const { verify, login } = useAuth({\r\n baseUrl: typeof window !== 'undefined' ? window.location.origin : 'http://localhost:7000'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n \r\n // Validate OTP format\r\n if (!/^\\d{6}$/.test(otp)) {\r\n setError('Please enter a valid 6-digit OTP');\r\n setIsLoading(false);\r\n return;\r\n }\r\n \r\n try {\r\n const response = await verify({ email, otp });\r\n if (response.success) {\r\n onVerifySuccess?.();\r\n } else {\r\n setError(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleOtpChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n // Allow only digits and limit to 6 characters\r\n if (/^\\d{0,6}$/.test(value)) {\r\n setOtp(value);\r\n }\r\n };\r\n\r\n const handleResendOtp = async () => {\r\n if (resendCooldown > 0 || resendLoading) return;\r\n \r\n setResendLoading(true);\r\n setError(null);\r\n \r\n try {\r\n const response = await login({ email });\r\n if (response.success) {\r\n // Start 60 second cooldown\r\n setResendCooldown(60);\r\n const interval = setInterval(() => {\r\n setResendCooldown((prev) => {\r\n if (prev <= 1) {\r\n clearInterval(interval);\r\n return 0;\r\n }\r\n return prev - 1;\r\n });\r\n }, 1000);\r\n } else {\r\n setError(response.message || 'Failed to resend OTP');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to resend OTP');\r\n } finally {\r\n setResendLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Verify OTP</h2>\r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#4b5563',\r\n fontSize: '14px'\r\n }}>Enter the 6-digit code sent to <strong style={{ color: '#111827' }}>{email}</strong></p>\r\n \r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#f8d7da',\r\n color: '#721c24',\r\n border: '1px solid #f5c6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n \r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>OTP Code:</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={handleOtpChange}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '20px',\r\n boxSizing: 'border-box',\r\n color: '#111827',\r\n transition: 'all 0.2s ease',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n letterSpacing: '5px'\r\n }}\r\n maxLength={6}\r\n placeholder=\"123456\"\r\n autoFocus\r\n />\r\n </div>\r\n \r\n <button \r\n type=\"submit\" \r\n disabled={isLoading || otp.length !== 6}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '8px'\r\n }}\r\n >\r\n {isLoading ? 'Verifying...' : 'Verify OTP'}\r\n </button>\r\n \r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '20px',\r\n paddingTop: '20px',\r\n borderTop: '1px solid #eee'\r\n }}>\r\n <button \r\n type=\"button\" \r\n onClick={handleResendOtp}\r\n disabled={isLoading || resendLoading || resendCooldown > 0}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: resendCooldown > 0 ? '#999' : '#007bff',\r\n textDecoration: 'none',\r\n cursor: resendCooldown > 0 ? 'not-allowed' : 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n marginBottom: '12px',\r\n transition: 'color 0.2s ease',\r\n display: 'block',\r\n width: '100%'\r\n }}\r\n >\r\n {resendLoading ? 'Sending...' : resendCooldown > 0 ? `Resend OTP in ${resendCooldown}s` : 'Resend OTP'}\r\n </button>\r\n <button \r\n type=\"button\" \r\n onClick={onBackToLogin}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Back to Login\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { LoginForm } from './LoginForm';\r\nimport { RegisterForm } from './RegisterForm';\r\nimport { OtpForm } from './OtpForm';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ntype AuthStep = 'login' | 'register' | 'otp';\r\n\r\ninterface AuthFlowProps {\r\n onAuthComplete?: () => void;\r\n initialStep?: AuthStep;\r\n showTitle?: boolean;\r\n}\r\n\r\nexport const AuthFlow: React.FC<AuthFlowProps> = ({ \r\n onAuthComplete,\r\n initialStep = 'login',\r\n showTitle = true\r\n}) => {\r\n const [step, setStep] = useState<AuthStep>(initialStep);\r\n const [email, setEmail] = useState('');\r\n const [message, setMessage] = useState<string | null>(null);\r\n\r\n const handleLoginSuccess = (email: string, needsOtpVerification: boolean) => {\r\n // Set email\r\n setEmail(email);\r\n \r\n if (needsOtpVerification) {\r\n // Move to OTP verification step\r\n setStep('otp');\r\n setMessage(null);\r\n } else {\r\n // Login is complete, notify parent\r\n setMessage(null);\r\n onAuthComplete?.();\r\n }\r\n };\r\n\r\n const handleRegisterSuccess = () => {\r\n // Registration successful, show message and redirect to login\r\n setMessage('Registration successful! Please check your email for verification.');\r\n // Automatically switch to login after a short delay\r\n setTimeout(() => {\r\n setStep('login');\r\n setMessage(null);\r\n }, 3000);\r\n };\r\n\r\n const handleVerifySuccess = () => {\r\n // Authentication complete\r\n setMessage(null);\r\n onAuthComplete?.();\r\n };\r\n\r\n const handleBackToLogin = () => {\r\n setStep('login');\r\n setMessage(null);\r\n };\r\n\r\n const renderCurrentStep = () => {\r\n switch (step) {\r\n case 'login':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'register':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Create Account</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <RegisterForm\r\n onRegisterSuccess={handleRegisterSuccess}\r\n onLoginClick={() => setStep('login')}\r\n showLoginLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'otp':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Verify Your Email</h1>}\r\n <OtpForm\r\n email={email}\r\n onVerifySuccess={handleVerifySuccess}\r\n onBackToLogin={handleBackToLogin}\r\n />\r\n </>\r\n );\r\n \r\n default:\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n minHeight: '300px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n {renderCurrentStep()}\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../use-auth';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface EmailVerificationPageProps {\r\n token: string;\r\n onVerificationSuccess?: () => void;\r\n onVerificationError?: (error: string) => void;\r\n baseUrl?: string;\r\n}\r\n\r\nexport const EmailVerificationPage: React.FC<EmailVerificationPageProps> = ({\r\n token,\r\n onVerificationSuccess,\r\n onVerificationError,\r\n baseUrl\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [message, setMessage] = useState('');\r\n const [isSuccess, setIsSuccess] = useState(false);\r\n \r\n const { verifyEmailToken } = useAuth({\r\n baseUrl: baseUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:7000')\r\n });\r\n\r\n useEffect(() => {\r\n const verifyEmail = async () => {\r\n if (!token) {\r\n setIsLoading(false);\r\n setMessage('Invalid verification token');\r\n setIsSuccess(false);\r\n onVerificationError?.('Invalid verification token');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(token);\r\n \r\n if (response.success) {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verified successfully!');\r\n setIsSuccess(true);\r\n onVerificationSuccess?.();\r\n } else {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verification failed');\r\n setIsSuccess(false);\r\n onVerificationError?.(response.message || 'Email verification failed');\r\n }\r\n } catch (err) {\r\n setIsLoading(false);\r\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred';\r\n setMessage(errorMessage);\r\n setIsSuccess(false);\r\n onVerificationError?.(errorMessage);\r\n }\r\n };\r\n\r\n verifyEmail();\r\n }, [token, verifyEmailToken, onVerificationSuccess, onVerificationError]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Verifying your email...</h2>\r\n <div style={{\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n width: '40px',\r\n height: '40px',\r\n animation: 'spin 2s linear infinite',\r\n margin: '20px auto'\r\n }}></div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Email Verification</h2>\r\n <div style={{\r\n padding: '16px 20px',\r\n margin: '24px 0',\r\n borderRadius: '8px',\r\n fontSize: '15px',\r\n fontWeight: 500,\r\n backgroundColor: isSuccess ? '#d4edda' : '#f8d7da',\r\n color: isSuccess ? '#155724' : '#721c24',\r\n border: isSuccess ? '1px solid #c3e6cb' : '1px solid #f5c6cb'\r\n }}>\r\n {message}\r\n </div>\r\n {isSuccess && (\r\n <div style={{\r\n marginTop: '24px'\r\n }}>\r\n <p style={{ color: 'black' }}>Your email has been successfully verified!</p>\r\n <button \r\n onClick={() => window.location.href = '/login'}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface SignInProps {\r\n redirectUrl?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n routing?: 'path' | 'virtual';\r\n path?: string;\r\n}\r\n\r\nexport const SignIn: React.FC<SignInProps> = ({ redirectUrl, appearance }) => {\r\n const { signIn, isSignedIn, loading: authLoading } = useAuth();\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [otp, setOtp] = useState('');\r\n const [usePassword, setUsePassword] = useState(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [needsOtp, setNeedsOtp] = useState(false);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isSignedIn && redirectUrl) {\r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }\r\n }, [isSignedIn, redirectUrl]);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n if (needsOtp) {\r\n // Submit OTP\r\n const response = await signIn({ email, otp });\r\n if (response.success) {\r\n setSuccess('Login successful!');\r\n // Redirect will happen via useEffect\r\n } else {\r\n setError(response.message || 'OTP verification failed');\r\n }\r\n } else if (usePassword) {\r\n // Password login\r\n const response = await signIn({ email, password });\r\n if (response.success) {\r\n setSuccess('Login successful!');\r\n // Redirect will happen via useEffect\r\n } else {\r\n setError(response.message || 'Login failed');\r\n }\r\n } else {\r\n // Request OTP\r\n const response = await signIn({ email });\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n setNeedsOtp(true);\r\n setSuccess('OTP sent to your email. Please check your inbox.');\r\n } else {\r\n setError(response.message || 'Failed to send OTP');\r\n }\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const toggleAuthMethod = () => {\r\n setUsePassword(!usePassword);\r\n setNeedsOtp(false);\r\n setError(null);\r\n setSuccess(null);\r\n setOtp('');\r\n };\r\n\r\n if (authLoading) {\r\n return (\r\n <div style={{ textAlign: 'center', padding: '40px' }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n {needsOtp ? 'Enter OTP' : usePassword ? 'Sign in with password' : 'Sign in'}\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n {!needsOtp && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n )}\r\n\r\n {usePassword && !needsOtp && (\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter your password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {needsOtp && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>One-Time Password</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={(e) => setOtp(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n maxLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n letterSpacing: '0.5em',\r\n textAlign: 'center',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"000000\"\r\n />\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Please wait...' : needsOtp ? 'Verify OTP' : usePassword ? 'Sign in' : 'Continue with email'}\r\n </button>\r\n\r\n {!needsOtp && (\r\n <div style={{ textAlign: 'center', marginTop: '16px' }}>\r\n <button\r\n type=\"button\"\r\n onClick={toggleAuthMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n {usePassword ? 'Use email code instead' : 'Use password instead'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {needsOtp && (\r\n <div style={{ textAlign: 'center', marginTop: '16px' }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setNeedsOtp(false);\r\n setOtp('');\r\n setError(null);\r\n setSuccess(null);\r\n }}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n Back to sign in\r\n </button>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface SignUpProps {\r\n redirectUrl?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const SignUp: React.FC<SignUpProps> = ({ redirectUrl, appearance }) => {\r\n const { signUp, isSignedIn } = useAuth();\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isSignedIn && redirectUrl) {\r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_REGISTER || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_REGISTER || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }\r\n }, [isSignedIn, redirectUrl]);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await signUp({ name, email, password });\r\n if (response.success) {\r\n setSuccess('Registration successful! Please check your email to verify your account.');\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Create your account\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Full name</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter your full name\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Create a password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n {password && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Creating account...' : 'Sign up'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface SignOutProps {\r\n redirectUrl?: string;\r\n}\r\n\r\nexport const SignOut: React.FC<SignOutProps> = ({ redirectUrl }) => {\r\n const { signOut } = useAuth();\r\n\r\n useEffect(() => {\r\n const performSignOut = async () => {\r\n await signOut();\r\n \r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGOUT || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGOUT || \r\n '/';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n };\r\n\r\n performSignOut();\r\n }, [signOut, redirectUrl]);\r\n\r\n return (\r\n <div style={{ textAlign: 'center', padding: '40px' }}>\r\n <div>Signing out...</div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface UserButtonProps {\r\n showName?: boolean;\r\n appearance?: {\r\n elements?: {\r\n userButtonBox?: React.CSSProperties;\r\n userButtonTrigger?: React.CSSProperties;\r\n userButtonPopoverCard?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const UserButton: React.FC<UserButtonProps> = ({ showName = false, appearance }) => {\r\n const { user, signOut } = useAuth();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n if (!user) return null;\r\n\r\n const getInitials = (name: string) => {\r\n return name\r\n .split(' ')\r\n .map(n => n[0])\r\n .join('')\r\n .toUpperCase()\r\n .slice(0, 2);\r\n };\r\n\r\n const handleSignOut = async () => {\r\n await signOut();\r\n const redirect = process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGOUT || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGOUT || \r\n '/';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n };\r\n\r\n return (\r\n <div style={{ position: 'relative', ...appearance?.elements?.userButtonBox }} ref={dropdownRef}>\r\n <button\r\n onClick={() => setIsOpen(!isOpen)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n padding: '6px',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderRadius: '8px',\r\n cursor: 'pointer',\r\n transition: 'background-color 0.2s',\r\n ...appearance?.elements?.userButtonTrigger\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#f5f5f5';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n <div style={{\r\n width: '36px',\r\n height: '36px',\r\n borderRadius: '50%',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}>\r\n {getInitials(user.name)}\r\n </div>\r\n {showName && (\r\n <span style={{ fontSize: '14px', fontWeight: 500, color: '#333' }}>\r\n {user.name}\r\n </span>\r\n )}\r\n </button>\r\n\r\n {isOpen && (\r\n <div style={{\r\n position: 'absolute',\r\n top: '100%',\r\n right: 0,\r\n marginTop: '8px',\r\n width: '240px',\r\n backgroundColor: 'white',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\r\n border: '1px solid #eaeaea',\r\n zIndex: 1000,\r\n ...appearance?.elements?.userButtonPopoverCard\r\n }}>\r\n <div style={{\r\n padding: '16px',\r\n borderBottom: '1px solid #eee'\r\n }}>\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '12px'\r\n }}>\r\n <div style={{\r\n width: '48px',\r\n height: '48px',\r\n borderRadius: '50%',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '18px',\r\n fontWeight: 600\r\n }}>\r\n {getInitials(user.name)}\r\n </div>\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: '#333',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}>\r\n {user.name}\r\n </div>\r\n <div style={{\r\n fontSize: '12px',\r\n color: '#666',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}>\r\n {user.email}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div style={{ padding: '8px' }}>\r\n <button\r\n onClick={handleSignOut}\r\n style={{\r\n width: '100%',\r\n padding: '10px 16px',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderRadius: '8px',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n color: '#333',\r\n fontWeight: 500,\r\n transition: 'background-color 0.2s'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#f5f5f5';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n Sign out\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { ReactNode, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ProtectedRouteProps {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n redirectTo?: string;\r\n}\r\n\r\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ \r\n children, \r\n fallback,\r\n redirectTo \r\n}) => {\r\n const { isSignedIn, isLoaded } = useAuth();\r\n\r\n useEffect(() => {\r\n if (isLoaded && !isSignedIn) {\r\n const loginPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }\r\n }, [isSignedIn, isLoaded, redirectTo]);\r\n\r\n if (!isLoaded) {\r\n return fallback || (\r\n <div style={{ \r\n display: 'flex', \r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n minHeight: '100vh' \r\n }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!isSignedIn) {\r\n return fallback || null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","'use client';\r\n\r\nimport React, { ReactNode, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface PublicRouteProps {\r\n children: ReactNode;\r\n redirectTo?: string;\r\n}\r\n\r\nexport const PublicRoute: React.FC<PublicRouteProps> = ({ \r\n children, \r\n redirectTo \r\n}) => {\r\n const { isSignedIn, isLoaded } = useAuth();\r\n\r\n useEffect(() => {\r\n if (isLoaded && isSignedIn) {\r\n const dashboardPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${dashboardPath}`;\r\n }\r\n }, [isSignedIn, isLoaded, redirectTo]);\r\n\r\n if (!isLoaded) {\r\n return (\r\n <div style={{ \r\n display: 'flex', \r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n minHeight: '100vh' \r\n }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (isSignedIn) {\r\n return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface VerifyEmailProps {\r\n token?: string;\r\n onSuccess?: () => void;\r\n onError?: (error: string) => void;\r\n}\r\n\r\nexport const VerifyEmail: React.FC<VerifyEmailProps> = ({ token, onSuccess, onError }) => {\r\n const { verifyEmailToken } = useAuth();\r\n const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading');\r\n const [message, setMessage] = useState('');\r\n\r\n useEffect(() => {\r\n const verify = async () => {\r\n // Get token from URL if not provided\r\n const verifyToken = token || (typeof window !== 'undefined' \r\n ? new URLSearchParams(window.location.search).get('token') \r\n : null);\r\n\r\n if (!verifyToken) {\r\n setStatus('error');\r\n setMessage('No verification token provided');\r\n onError?.('No verification token provided');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(verifyToken);\r\n if (response.success) {\r\n setStatus('success');\r\n setMessage('Email verified successfully! Redirecting...');\r\n onSuccess?.();\r\n \r\n // Redirect after success\r\n setTimeout(() => {\r\n const redirect = process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_VERIFY || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_VERIFY || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }, 2000);\r\n } else {\r\n setStatus('error');\r\n setMessage(response.message || 'Verification failed');\r\n onError?.(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setStatus('error');\r\n const errorMsg = err instanceof Error ? err.message : 'An error occurred';\r\n setMessage(errorMsg);\r\n onError?.(errorMsg);\r\n }\r\n };\r\n\r\n verify();\r\n }, [token, verifyEmailToken, onSuccess, onError]);\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '40px auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n textAlign: 'center'\r\n }}>\r\n {status === 'loading' && (\r\n <>\r\n <div style={{\r\n width: '48px',\r\n height: '48px',\r\n margin: '0 auto 20px',\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n animation: 'spin 1s linear infinite'\r\n }} />\r\n <style>{`\r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `}</style>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Verifying your email...\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n Please wait while we verify your email address.\r\n </p>\r\n </>\r\n )}\r\n\r\n {status === 'success' && (\r\n <>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#4caf50',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Email Verified!\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n {message}\r\n </p>\r\n </>\r\n )}\r\n\r\n {status === 'error' && (\r\n <>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#f44336',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Verification Failed\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666', marginBottom: '20px' }}>\r\n {message}\r\n </p>\r\n <button\r\n onClick={() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }}\r\n style={{\r\n padding: '10px 20px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: 'pointer'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ForgotPasswordProps {\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ForgotPassword: React.FC<ForgotPasswordProps> = ({ appearance }) => {\r\n const { forgotPassword } = useAuth();\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await forgotPassword(email);\r\n if (response.success) {\r\n setSuccess('Password reset link sent! Please check your email.');\r\n setEmail('');\r\n } else {\r\n setError(response.message || 'Failed to send reset link');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '12px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Forgot password?\r\n </h2>\r\n \r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Enter your email address and we'll send you a link to reset your password.\r\n </p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginBottom: '16px',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Sending...' : 'Send reset link'}\r\n </button>\r\n\r\n <div style={{ textAlign: 'center' }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n Back to sign in\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ResetPasswordProps {\r\n token?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ResetPassword: React.FC<ResetPasswordProps> = ({ token, appearance }) => {\r\n const { resetPassword } = useAuth();\r\n const [resetToken, setResetToken] = useState(token || '');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n useEffect(() => {\r\n // Get token from URL if not provided as prop\r\n if (!resetToken && typeof window !== 'undefined') {\r\n const urlToken = new URLSearchParams(window.location.search).get('token');\r\n if (urlToken) {\r\n setResetToken(urlToken);\r\n }\r\n }\r\n }, [resetToken]);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (!resetToken) {\r\n setError('Invalid reset token');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await resetPassword(resetToken, password);\r\n if (response.success) {\r\n setSuccess(true);\r\n setTimeout(() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }, 2000);\r\n } else {\r\n setError(response.message || 'Failed to reset password');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '40px auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n textAlign: 'center'\r\n }}>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#4caf50',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Password Reset Successful!\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n Your password has been reset. Redirecting to login...\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '12px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Reset your password\r\n </h2>\r\n \r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Enter your new password below.\r\n </p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>New password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter new password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n {password && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm new password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Resetting...' : 'Reset password'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ChangePasswordProps {\r\n onSuccess?: () => void;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ChangePassword: React.FC<ChangePasswordProps> = ({ onSuccess, appearance }) => {\r\n const { changePassword } = useAuth();\r\n const [oldPassword, setOldPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPasswords, setShowPasswords] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(newPassword);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(false);\r\n\r\n if (newPassword !== confirmPassword) {\r\n setError('New passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (newPassword.length < 6) {\r\n setError('New password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await changePassword(oldPassword, newPassword);\r\n if (response.success) {\r\n setSuccess(true);\r\n setOldPassword('');\r\n setNewPassword('');\r\n setConfirmPassword('');\r\n onSuccess?.();\r\n } else {\r\n setError(response.message || 'Failed to change password');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Change Password\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n Password changed successfully!\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"oldPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Current password</label>\r\n <input\r\n id=\"oldPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={oldPassword}\r\n onChange={(e) => setOldPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter current password\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"newPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>New password</label>\r\n <input\r\n id=\"newPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={newPassword}\r\n onChange={(e) => setNewPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter new password\"\r\n />\r\n {newPassword && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm new password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm new password\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={showPasswords}\r\n onChange={(e) => setShowPasswords(e.target.checked)}\r\n style={{ marginRight: '8px' }}\r\n />\r\n <span style={{ fontSize: '14px', color: '#666' }}>Show passwords</span>\r\n </label>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Changing password...' : 'Change password'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface UserProfileProps {\r\n showAvatar?: boolean;\r\n showEmailChange?: boolean;\r\n showPasswordChange?: boolean;\r\n}\r\n\r\nexport const UserProfile: React.FC<UserProfileProps> = ({\r\n showAvatar = true,\r\n showEmailChange = true,\r\n showPasswordChange = true,\r\n}) => {\r\n const { user, updateProfile, updateAvatar, requestEmailChange } = useAuth();\r\n const [name, setName] = useState(user?.name || '');\r\n const [avatar, setAvatar] = useState('');\r\n const [newEmail, setNewEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const handleUpdateName = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await updateProfile({ name });\r\n if (response.success) {\r\n setSuccess('Name updated successfully!');\r\n } else {\r\n setError(response.message || 'Failed to update name');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleUpdateAvatar = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await updateAvatar(avatar);\r\n if (response.success) {\r\n setSuccess('Avatar updated successfully!');\r\n setAvatar('');\r\n } else {\r\n setError(response.message || 'Failed to update avatar');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleRequestEmailChange = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await requestEmailChange(newEmail);\r\n if (response.success) {\r\n setSuccess('Verification email sent! Please check your inbox.');\r\n setNewEmail('');\r\n } else {\r\n setError(response.message || 'Failed to request email change');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (!user) return null;\r\n\r\n return (\r\n <div style={{ maxWidth: '600px', margin: '0 auto', padding: '20px' }}>\r\n <h2 style={{ marginBottom: '24px', fontSize: '24px', fontWeight: 600 }}>Profile Settings</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* Update Name */}\r\n <div style={{\r\n padding: '20px',\r\n backgroundColor: '#fff',\r\n borderRadius: '8px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '20px'\r\n }}>\r\n <h3 style={{ marginBottom: '16px', fontSize: '18px', fontWeight: 600 }}>Update Name</h3>\r\n <form onSubmit={handleUpdateName}>\r\n <input\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n marginBottom: '12px'\r\n }}\r\n placeholder=\"Your name\"\r\n />\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '10px 20px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: 'pointer'\r\n }}\r\n >\r\n Update Name\r\n </button>\r\n </form>\r\n </div>\r\n\r\n {/* Update Avatar */}\r\n {showAvatar && (\r\n <div style={{\r\n padding: '20px',\r\n backgroundColor: '#fff',\r\n borderRadius: '8px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '20px'\r\n }}>\r\n <h3 style={{ marginBottom: '16px', fontSize: '18px', fontWeight: 600 }}>Update Avatar</h3>\r\n <form onSubmit={handleUpdateAvatar}>\r\n <input\r\n type=\"url\"\r\n value={avatar}\r\n onChange={(e) => setAvatar(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n marginBottom: '12px'\r\n }}\r\n placeholder=\"Avatar URL\"\r\n />\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '10px 20px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: 'pointer'\r\n }}\r\n >\r\n Update Avatar\r\n </button>\r\n </form>\r\n </div>\r\n )}\r\n\r\n {/* Change Email */}\r\n {showEmailChange && (\r\n <div style={{\r\n padding: '20px',\r\n backgroundColor: '#fff',\r\n borderRadius: '8px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '20px'\r\n }}>\r\n <h3 style={{ marginBottom: '16px', fontSize: '18px', fontWeight: 600 }}>Change Email</h3>\r\n <p style={{ fontSize: '14px', color: '#666', marginBottom: '12px' }}>\r\n Current email: <strong>{user.email}</strong>\r\n </p>\r\n <form onSubmit={handleRequestEmailChange}>\r\n <input\r\n type=\"email\"\r\n value={newEmail}\r\n onChange={(e) => setNewEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n marginBottom: '12px'\r\n }}\r\n placeholder=\"New email address\"\r\n />\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '10px 20px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: 'pointer'\r\n }}\r\n >\r\n Request Email Change\r\n </button>\r\n </form>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import { useState, useEffect, useCallback } from 'react';\nimport { AuthService } from '../core/auth-service';\nimport { \n AuthResponse, \n LoginData, \n VerifyData, \n UpdateUserData, \n User,\n AuthConfig,\n RegisterData\n} from '../types';\n\ninterface UseNextAuthReturn {\n user: User | null;\n isAuthenticated: boolean;\n loading: boolean;\n register: (data: RegisterData) => Promise<AuthResponse>;\n login: (data: LoginData) => Promise<AuthResponse>;\n verify: (data: VerifyData) => Promise<AuthResponse>;\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\n logout: () => Promise<void>;\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\n getProfile: () => Promise<User>;\n getAllUsers: () => Promise<User[]>;\n getUserById: (id: string) => Promise<User>;\n forgotPassword: (email: string) => Promise<AuthResponse>;\n resetPassword: (token: string, password: string) => Promise<AuthResponse>;\n setToken: (token: string) => void;\n clearToken: () => void;\n}\n\n// Check if we're running on the server or client\nconst isServer = typeof window === 'undefined';\n\nexport const useNextAuth = (config: AuthConfig): UseNextAuthReturn => {\n const [authService] = useState<AuthService>(() => {\n // Create AuthService instance\n const service = new AuthService(config);\n \n // On the server, we need to manually set token if provided\n if (isServer && config.token) {\n (service as any)['token'] = config.token;\n (service as any)['httpClient'].setAuthToken(config.token);\n }\n \n return service;\n });\n \n const [user, setUser] = useState<User | null>(null);\n const [isAuthenticated, setIsAuthenticated] = useState<boolean>(false);\n const [loading, setLoading] = useState<boolean>(true);\n\n const checkAuthStatus = useCallback(() => {\n // On server, we can't access localStorage, so we rely on token in config\n if (isServer) {\n const token = config.token || (authService as any).getToken();\n const authenticated = !!token;\n setIsAuthenticated(authenticated);\n \n if (authenticated && token) {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n setUser(payload.user || null);\n } catch (error) {\n console.error('Failed to parse user from token:', error);\n setUser(null);\n }\n } else {\n setUser(null);\n }\n } else {\n // On client, use the existing logic\n const authenticated = authService.isAuthenticated();\n setIsAuthenticated(authenticated);\n \n if (authenticated) {\n const currentUser = authService.getCurrentUser();\n setUser(currentUser);\n } else {\n setUser(null);\n }\n }\n \n setLoading(false);\n }, [authService, config.token]);\n\n useEffect(() => {\n checkAuthStatus();\n }, [checkAuthStatus]);\n\n const register = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\n setLoading(true);\n try {\n // Frontend base URL is now automatically sent via X-Frontend-URL header\n const response = await authService.register(data);\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const login = useCallback(async (data: LoginData): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.login(data);\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.verify(data);\n if (response.success && response.user) {\n setUser(response.user);\n setIsAuthenticated(true);\n }\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.verifyEmailToken(token);\n if (response.success && response.user) {\n setUser(response.user);\n setIsAuthenticated(true);\n }\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const logout = useCallback(async (): Promise<void> => {\n setLoading(true);\n try {\n await authService.logout();\n setUser(null);\n setIsAuthenticated(false);\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.updateProfile(data);\n if (response.success && response.user) {\n setUser(response.user);\n }\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const getProfile = useCallback(async (): Promise<User> => {\n setLoading(true);\n try {\n const userData = await authService.getProfile();\n setUser(userData);\n return userData;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const getAllUsers = useCallback(async (): Promise<User[]> => {\n setLoading(true);\n try {\n return await authService.getAllUsers();\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const getUserById = useCallback(async (id: string): Promise<User> => {\n setLoading(true);\n try {\n return await authService.getUserById(id);\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const forgotPassword = useCallback(async (email: string): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.forgotPassword(email);\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n const resetPassword = useCallback(async (token: string, password: string): Promise<AuthResponse> => {\n setLoading(true);\n try {\n const response = await authService.resetPassword(token, password);\n return response;\n } finally {\n setLoading(false);\n }\n }, [authService]);\n\n // Server-side methods for manually setting/clearing tokens\n const setToken = useCallback((token: string) => {\n (authService as any)['token'] = token;\n (authService as any)['httpClient'].setAuthToken(token);\n setIsAuthenticated(true);\n\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n setUser(payload.user || null);\n } catch (error) {\n console.error('Failed to parse user from token:', error);\n setUser(null);\n }\n }, [authService]);\n\n const clearToken = useCallback(() => {\n (authService as any)['token'] = null;\n (authService as any)['httpClient'].removeAuthToken();\n setIsAuthenticated(false);\n setUser(null);\n }, [authService]);\n\n return {\n user,\n isAuthenticated,\n loading,\n register,\n login,\n verify,\n verifyEmailToken,\n logout,\n updateProfile,\n getProfile,\n getAllUsers,\n getUserById,\n forgotPassword,\n resetPassword,\n setToken,\n clearToken\n };\n};"]}
|