{"version":3,"sources":["../src/core/version.ts","../src/shared/browser-utils.ts","../src/geolocation/ciphertext.ts","../src/geolocation/hooks.ts","../src/compliance/hooks.ts","../src/risk-profile/hooks.ts","../src/kyc/images.ts","../src/kyc/FaceCaptureModal.tsx","../src/kyc/hooks.ts"],"names":["error","useState","useRef","useCallback","useEffect","fileToBase64"],"mappings":"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","file":"react.mjs","sourcesContent":["/**\n * Single source of truth for the SDK version.\n */\nexport const SDK_VERSION = '1.6.6';\n","/**\n * Shared browser utility functions.\n *\n * Extracted from ciphertext.ts and hooks.ts to avoid duplication.\n * All functions include SSR guards for safe server-side rendering.\n */\n\n/**\n * Generate a UUID v4\n */\nexport function generateUUID(): string {\n  if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n    return crypto.randomUUID();\n  }\n\n  // Fallback for older browsers\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n\n/**\n * Generate a unique device ID that persists across sessions.\n * Falls back to a random UUID when localStorage is unavailable (SSR).\n */\nexport function generateDeviceId(): string {\n  if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n    return generateUUID();\n  }\n\n  const storageKey = 'vesant_device_id';\n  let deviceId = localStorage.getItem(storageKey);\n\n  if (!deviceId) {\n    deviceId = generateUUID();\n    localStorage.setItem(storageKey, deviceId);\n  }\n\n  return deviceId;\n}\n\n/**\n * Detect browser information from user agent.\n * Returns safe defaults when running server-side.\n */\nexport function getBrowserInfo(): {\n  browser: string;\n  browser_version: string;\n  os: string;\n  os_version: string;\n} {\n  if (typeof navigator === 'undefined') {\n    return { browser: 'unknown', browser_version: '', os: 'unknown', os_version: '' };\n  }\n\n  const ua = navigator.userAgent;\n  let browser = 'unknown';\n  let browserVersion = '';\n  let os = 'unknown';\n  let osVersion = '';\n\n  // Detect browser\n  if (ua.includes('Firefox/')) {\n    browser = 'Firefox';\n    browserVersion = ua.match(/Firefox\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Edg/')) {\n    browser = 'Edge';\n    browserVersion = ua.match(/Edg\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Chrome/')) {\n    browser = 'Chrome';\n    browserVersion = ua.match(/Chrome\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n    browser = 'Safari';\n    browserVersion = ua.match(/Version\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Opera') || ua.includes('OPR/')) {\n    browser = 'Opera';\n    browserVersion = ua.match(/(?:Opera|OPR)\\/([\\d.]+)/)?.[1] || '';\n  }\n\n  // Detect OS\n  if (ua.includes('Windows')) {\n    os = 'Windows';\n    if (ua.includes('Windows NT 10.0')) osVersion = '10';\n    else if (ua.includes('Windows NT 6.3')) osVersion = '8.1';\n    else if (ua.includes('Windows NT 6.2')) osVersion = '8';\n    else if (ua.includes('Windows NT 6.1')) osVersion = '7';\n  } else if (ua.includes('Mac OS X')) {\n    os = 'macOS';\n    osVersion = ua.match(/Mac OS X ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n  } else if (ua.includes('Linux')) {\n    os = 'Linux';\n  } else if (ua.includes('Android')) {\n    os = 'Android';\n    osVersion = ua.match(/Android ([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) {\n    os = 'iOS';\n    osVersion = ua.match(/OS ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n  }\n\n  return { browser, browser_version: browserVersion, os, os_version: osVersion };\n}\n","/**\n * CipherText Generation Utility\n *\n * Collects device fingerprint and location data from the browser,\n * encrypts it into a cipherText that can be validated by the server.\n *\n * The cipherText is used for:\n * - Registration verification\n * - Login verification\n * - Transaction verification\n * - Periodic location checks\n */\n\nimport type {\n  CipherTextPayload,\n  CipherTextOptions,\n  CipherTextResult,\n  CipherTextReason,\n  GeolocationConfigResponse,\n} from './types';\nimport { SDK_VERSION } from '../core/version';\nimport { getBrowserInfo, generateDeviceId as getOrCreateDeviceId } from '../shared/browser-utils';\n\nconst CIPHER_TEXT_EXPIRY_MINUTES = 5;\n\n/**\n * Compute HMAC-SHA256 of a message using the given key.\n * Uses Web Crypto API (browser/modern Node) with node:crypto fallback.\n */\nasync function computeHMAC(key: string, message: string): Promise<string> {\n  // Try Web Crypto API first (works in browsers and Node 18+)\n  if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {\n    const encoder = new TextEncoder();\n    const keyData = encoder.encode(key);\n    const msgData = encoder.encode(message);\n\n    const cryptoKey = await globalThis.crypto.subtle.importKey(\n      'raw',\n      keyData,\n      { name: 'HMAC', hash: 'SHA-256' },\n      false,\n      ['sign'],\n    );\n\n    const signature = await globalThis.crypto.subtle.sign('HMAC', cryptoKey, msgData);\n    const bytes = new Uint8Array(signature);\n    return Array.from(bytes)\n      .map((b) => b.toString(16).padStart(2, '0'))\n      .join('');\n  }\n\n  // Fallback: Node.js crypto module\n  // eslint-disable-next-line @typescript-eslint/no-var-requires\n  const { createHmac } = await import('node:crypto');\n  return createHmac('sha256', key).update(message).digest('hex');\n}\n\n/**\n * Get WebGL renderer information for fingerprinting\n */\nfunction getWebGLInfo(): { vendor: string; renderer: string } | null {\n  if (typeof document === 'undefined') return null;\n\n  try {\n    const canvas = document.createElement('canvas');\n    const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\n    if (!gl) return null;\n\n    const debugInfo = (gl as WebGLRenderingContext).getExtension('WEBGL_debug_renderer_info');\n    if (!debugInfo) return null;\n\n    return {\n      vendor: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '',\n      renderer: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '',\n    };\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Get network information if available\n */\nfunction getNetworkInfo(): CipherTextPayload['network'] | undefined {\n  if (typeof navigator === 'undefined') return undefined;\n\n  const connection = (navigator as any).connection ||\n    (navigator as any).mozConnection ||\n    (navigator as any).webkitConnection;\n\n  if (!connection) return undefined;\n\n  return {\n    effective_type: connection.effectiveType,\n    downlink: connection.downlink,\n    rtt: connection.rtt,\n    save_data: connection.saveData,\n  };\n}\n\n/**\n * Request GPS location from the browser\n */\nasync function requestGPSLocation(\n  timeout: number = 10000,\n  highAccuracy: boolean = true\n): Promise<CipherTextPayload['location'] | null> {\n  if (typeof navigator === 'undefined' || !navigator.geolocation) {\n    return null;\n  }\n\n  return new Promise((resolve) => {\n    navigator.geolocation.getCurrentPosition(\n      (position) => {\n        const { latitude, longitude, accuracy } = position.coords;\n\n        // Validate coordinates\n        if (latitude < -90 || latitude > 90) {\n          resolve(null);\n          return;\n        }\n        if (longitude < -180 || longitude > 180) {\n          resolve(null);\n          return;\n        }\n        if (accuracy !== null && accuracy !== undefined && accuracy <= 0) {\n          resolve(null);\n          return;\n        }\n\n        resolve({\n          latitude,\n          longitude,\n          accuracy,\n          altitude: position.coords.altitude ?? undefined,\n          altitude_accuracy: position.coords.altitudeAccuracy ?? undefined,\n          heading: position.coords.heading ?? undefined,\n          speed: position.coords.speed ?? undefined,\n          timestamp: position.timestamp,\n        });\n      },\n      () => {\n        // Location denied or error - resolve with null (non-fatal)\n        resolve(null);\n      },\n      {\n        enableHighAccuracy: highAccuracy,\n        timeout: timeout,\n        maximumAge: 0,\n      }\n    );\n  });\n}\n\n/**\n * Collect device fingerprint data\n */\nfunction collectDeviceData(includeWebGL: boolean): CipherTextPayload['device'] {\n  const browserInfo = getBrowserInfo();\n  const webglInfo = includeWebGL ? getWebGLInfo() : null;\n\n  return {\n    device_id: getOrCreateDeviceId(),\n    user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n    platform: typeof navigator !== 'undefined' ? navigator.platform : '',\n    browser: browserInfo.browser,\n    browser_version: browserInfo.browser_version,\n    os: browserInfo.os,\n    os_version: browserInfo.os_version,\n    screen_resolution:\n      typeof screen !== 'undefined' ? `${screen.width}x${screen.height}` : undefined,\n    language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n    timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone,\n    color_depth: typeof screen !== 'undefined' ? screen.colorDepth : undefined,\n    hardware_concurrency:\n      typeof navigator !== 'undefined' ? navigator.hardwareConcurrency : undefined,\n    device_memory: typeof navigator !== 'undefined' ? (navigator as any).deviceMemory : undefined,\n    touch_support:\n      typeof navigator !== 'undefined' ? navigator.maxTouchPoints > 0 : undefined,\n    webgl_vendor: webglInfo?.vendor,\n    webgl_renderer: webglInfo?.renderer,\n  };\n}\n\n/**\n * Encode payload to base64\n */\nfunction encodePayload(payload: CipherTextPayload): string {\n  const json = JSON.stringify(payload);\n\n  if (typeof btoa !== 'undefined') {\n    // Browser\n    return btoa(unescape(encodeURIComponent(json)));\n  } else if (typeof Buffer !== 'undefined') {\n    // Node.js\n    return Buffer.from(json, 'utf-8').toString('base64');\n  }\n\n  throw new Error('No base64 encoding method available');\n}\n\n/**\n * Generate a cipherText containing encrypted device and location data\n *\n * @param options - Options for cipherText generation\n * @returns CipherText result with the encrypted string\n *\n * @example\n * ```typescript\n * // Basic usage for login\n * const result = await generateCipherText({ reason: 'login' });\n * console.log(result.cipherText);\n *\n * // With GPS location for registration\n * const result = await generateCipherText({\n *   reason: 'registration',\n *   requestLocation: true,\n *   locationTimeout: 15000\n * });\n *\n * if (result.locationCaptured) {\n *   console.log('GPS location included');\n * }\n * ```\n */\nexport async function generateCipherText(\n  options: CipherTextOptions,\n  config?: GeolocationConfigResponse\n): Promise<CipherTextResult> {\n  const warnings: string[] = [];\n\n  // Auto-enable GPS if tenant config requires it for this event type\n  let requestLocation = options.requestLocation ?? false;\n  let gpsRequiredByConfig = false;\n  if (config?.require_gps) {\n    const reason = options.reason;\n    if (\n      (reason === 'login' && config.require_gps.login) ||\n      (reason === 'registration' && config.require_gps.registration) ||\n      (reason === 'transaction' && config.require_gps.transaction)\n    ) {\n      if (!requestLocation) {\n        gpsRequiredByConfig = true;\n      }\n      requestLocation = true;\n    }\n  }\n\n  // Collect device data\n  const deviceData = collectDeviceData(options.includeWebGL !== false);\n\n  // Optionally request GPS location\n  let locationData: CipherTextPayload['location'] | undefined;\n  if (requestLocation) {\n    const location = await requestGPSLocation(\n      options.locationTimeout || 10000,\n      options.highAccuracy !== false\n    );\n\n    if (location) {\n      locationData = location;\n    } else if (gpsRequiredByConfig) {\n      throw new Error(\n        `GPS location is required for ${options.reason} by tenant configuration, but GPS was not available or permission was denied`\n      );\n    } else {\n      warnings.push('GPS location not available or permission denied');\n    }\n  }\n\n  // Collect network info\n  let networkData: CipherTextPayload['network'] | undefined;\n  if (options.includeNetworkInfo !== false) {\n    networkData = getNetworkInfo();\n  }\n\n  // Build payload\n  const now = new Date();\n  const expiry = new Date(now.getTime() + CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000);\n\n  const payload: CipherTextPayload = {\n    device: deviceData,\n    location: locationData,\n    network: networkData,\n    metadata: {\n      collected_at: now.toISOString(),\n      sdk_version: SDK_VERSION,\n      collection_reason: options.reason,\n      page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n      referrer: typeof document !== 'undefined' ? document.referrer || undefined : undefined,\n    },\n  };\n\n  // Encode payload (no obfuscation - HTTPS provides transport security)\n  const encoded = encodePayload(payload);\n\n  // Create final cipherText with version and timestamp prefix\n  const timestamp = now.getTime().toString(36); // Base36 timestamp\n\n  let cipherText: string;\n  const hmacKey = options.signingKey || options.apiKey;\n  if (hmacKey) {\n    // v02: HMAC-signed — format: 02.{timestamp}.{base64}.{hmac}\n    const message = `02.${timestamp}.${encoded}`;\n    const hmac = await computeHMAC(hmacKey, message);\n    cipherText = `${message}.${hmac}`;\n  } else {\n    // v01: unsigned (backwards compat)\n    cipherText = `01.${timestamp}.${encoded}`;\n  }\n\n  return {\n    cipherText,\n    locationCaptured: !!locationData,\n    warnings: warnings.length > 0 ? warnings : undefined,\n    generatedAt: now.toISOString(),\n    expiresAt: expiry.toISOString(),\n  };\n}\n\n/**\n * Decode a cipherText (for debugging/testing - not for production use)\n * In production, decryption happens on the server\n */\nexport function decodeCipherText(cipherText: string): CipherTextPayload | null {\n  try {\n    const parts = cipherText.split('.');\n    // v01: 3 parts, v02: 4 parts (4th is HMAC — ignored when decoding)\n    if (parts.length !== 3 && parts.length !== 4) return null;\n\n    const [version, , encodedB64] = parts;\n    if (version !== '01' && version !== '02') return null;\n\n    // Decode matches encode: just base64 decode (no obfuscation)\n    const json = decodeURIComponent(escape(atob(encodedB64)));\n\n    return JSON.parse(json) as CipherTextPayload;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Check if a cipherText is expired\n */\nexport function isCipherTextExpired(cipherText: string): boolean {\n  try {\n    const parts = cipherText.split('.');\n    if (parts.length !== 3 && parts.length !== 4) return true;\n\n    const timestampB36 = parts[1];\n    const timestamp = parseInt(timestampB36, 36);\n    const now = Date.now();\n    const expiryMs = CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000;\n\n    return now - timestamp > expiryMs;\n  } catch {\n    return true;\n  }\n}\n\n// Re-export types\nexport type { CipherTextPayload, CipherTextOptions, CipherTextResult, CipherTextReason, GeolocationConfigResponse };\n","/**\n * React Hooks for Vesant Geolocation SDK\n *\n * Provides convenient React hooks for using the geolocation service in Next.js applications.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { GeolocationClient } from './client';\nimport { generateCipherText } from './ciphertext';\nimport { getBrowserInfo as getBrowserInfoShared, generateDeviceId } from '../shared/browser-utils';\nimport type {\n  LocationVerification,\n  VerifyIPRequest,\n  ComplianceCheckResponse,\n  PaginationParams,\n  UseGeolocationOptions,\n  UseGeolocationResult,\n  DeviceFingerprintRequest,\n  CipherTextOptions,\n  CipherTextResult,\n  GeolocationConfigResponse,\n  // Location Request Types\n  LocationRequest,\n  LocationRequestFilters,\n  CreateLocationRequestRequest,\n  LocationRequestResult,\n  LocationRequestStatus,\n  LocationShareInfo,\n  LocationCaptureRequest,\n  LocationCaptureResponse,\n  UseLocationRequestsOptions,\n  UseLocationRequestsResult,\n  UseLocationCaptureOptions,\n  UseLocationCaptureResult,\n} from './types';\n\n// ============================================================================\n// useGeolocation Hook\n// ============================================================================\n\n/**\n * React hook for IP verification and compliance checking\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Geolocation verification state and methods\n *\n * @example\n * ```tsx\n * function LoginPage() {\n *   const { verification, loading, error, verifyIP } = useGeolocation(client, {\n *     autoVerify: true,\n *     eventType: \"login\",\n *     includeDeviceFingerprint: true\n *   });\n *\n *   useEffect(() => {\n *     if (verification?.is_blocked) {\n *       alert(\"Access blocked: \" + verification.risk_reasons.join(\", \"));\n *     }\n *   }, [verification]);\n *\n *   return <div>Risk Level: {verification?.risk_level}</div>;\n * }\n * ```\n */\nexport function useGeolocation(\n  client: GeolocationClient,\n  options: UseGeolocationOptions = {}\n): UseGeolocationResult {\n  const [verification, setVerification] = useState<LocationVerification | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const optionsRef = useRef(options);\n  optionsRef.current = options;\n\n  const verifyIP = useCallback(\n    async (request: VerifyIPRequest): Promise<LocationVerification> => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.verifyIP(request);\n        setVerification(result);\n        return result;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Verification failed');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client]\n  );\n\n  const checkCompliance = useCallback(\n    async (countryISO: string): Promise<ComplianceCheckResponse> => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.checkCompliance(countryISO);\n        return result;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Compliance check failed');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client]\n  );\n\n  const refresh = useCallback(async () => {\n    if (verification) {\n      await verifyIP({\n        ip_address: verification.ip_address,\n        user_id: optionsRef.current.userId || '',\n        event_type: optionsRef.current.eventType || 'api_access',\n      });\n    }\n  }, [verification, verifyIP]);\n\n  // Auto-verify on mount if enabled\n  useEffect(() => {\n    if (optionsRef.current.autoVerify) {\n      // Try to get user's IP from a service or use placeholder\n      const detectAndVerify = async () => {\n        try {\n          // In production, you'd use a service like ipify.org or get from server\n          const ipResponse = await fetch('https://api.ipify.org?format=json');\n          const { ip } = await ipResponse.json();\n\n          let deviceFingerprint: DeviceFingerprintRequest | undefined;\n\n          if (optionsRef.current.includeDeviceFingerprint && typeof window !== 'undefined') {\n            const deviceId = generateDeviceId();\n            deviceFingerprint = {\n              device_id: deviceId,\n              user_agent: navigator.userAgent,\n              platform: navigator.platform,\n              language: navigator.language,\n              timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n              screen_resolution: `${window.screen.width}x${window.screen.height}`,\n            };\n          }\n\n          await verifyIP({\n            ip_address: ip,\n            user_id: optionsRef.current.userId || '',\n            event_type: optionsRef.current.eventType || 'page_view',\n            device_fingerprint: deviceFingerprint,\n          });\n        } catch (err) {\n          console.error('[Vesant SDK] Auto-verification failed:', err instanceof Error ? err.message : 'Unknown error');\n        }\n      };\n\n      detectAndVerify();\n    }\n  }, [verifyIP]);\n\n  return {\n    verification,\n    loading,\n    error,\n    verifyIP,\n    checkCompliance,\n    refresh,\n  };\n}\n\n// ============================================================================\n// Helper Functions (re-export shared utils for backwards compatibility)\n// ============================================================================\n\nexport { getBrowserInfoShared as getBrowserInfo };\n\n/**\n * Create a complete device fingerprint for the current browser.\n * Returns safe defaults when running server-side.\n */\nexport function createDeviceFingerprint(): DeviceFingerprintRequest {\n  if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n    return {\n      device_id: generateDeviceId(),\n      user_agent: '',\n      platform: '',\n    };\n  }\n\n  const browserInfo = getBrowserInfoShared();\n  const deviceId = generateDeviceId();\n\n  return {\n    device_id: deviceId,\n    user_agent: navigator.userAgent,\n    platform: navigator.platform,\n    language: navigator.language,\n    timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n    screen_resolution: `${window.screen.width}x${window.screen.height}`,\n    ...browserInfo,\n  };\n}\n\n// ============================================================================\n// useCipherText Hook\n// ============================================================================\n\n/**\n * React hook for generating cipherText\n *\n * @example\n * ```tsx\n * function LoginForm() {\n *   const { generate, configLoading, configError } = useCipherText(geoClient);\n *\n *   const handleLogin = async () => {\n *     const result = await generate({ reason: 'login' });\n *     if (result) {\n *       await loginMutation({ email, password, cipherText: result.cipherText });\n *     }\n *   };\n * }\n * ```\n */\nexport function useCipherText(client?: GeolocationClient): {\n  generate: (options: CipherTextOptions) => Promise<CipherTextResult | null>;\n  configLoading: boolean;\n  configError: Error | null;\n} {\n  const [configLoading, setConfigLoading] = useState<boolean>(!!client);\n  const [configError, setConfigError] = useState<Error | null>(null);\n  const configRef = useRef<GeolocationConfigResponse | undefined>(undefined);\n  const configPromiseRef = useRef<Promise<GeolocationConfigResponse> | null>(null);\n\n  // Fetch GPS config once on mount if client is provided\n  useEffect(() => {\n    if (!client) return;\n\n    let cancelled = false;\n    setConfigLoading(true);\n\n    const promise = client.getGPSConfig();\n    configPromiseRef.current = promise;\n\n    promise.then((cfg: GeolocationConfigResponse) => {\n      if (!cancelled) {\n        configRef.current = cfg;\n        setConfigLoading(false);\n      }\n    }).catch((err: Error) => {\n      if (!cancelled) {\n        setConfigError(err);\n        setConfigLoading(false);\n      }\n    });\n\n    return () => { cancelled = true; };\n  }, [client]);\n\n  const generate = useCallback(\n    async (options: CipherTextOptions): Promise<CipherTextResult | null> => {\n      try {\n        // Ensure config is loaded before generating (avoids race condition)\n        if (configPromiseRef.current) {\n          try {\n            const cfg = await configPromiseRef.current;\n            configRef.current = cfg;\n          } catch {\n            // Config fetch error already tracked in configError state\n          }\n        }\n        return await generateCipherText(options, configRef.current);\n      } catch (error) {\n        console.error('[Vesant SDK] Failed to generate cipherText:', error instanceof Error ? error.message : 'Unknown error');\n        return null;\n      }\n    },\n    []\n  );\n\n  return { generate, configLoading, configError };\n}\n\n// ============================================================================\n// useLocationRequests Hook\n// ============================================================================\n\n/**\n * React hook for managing location requests (admin/compliance officer)\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Location request state and management methods\n */\nexport function useLocationRequests(\n  client: GeolocationClient,\n  options: UseLocationRequestsOptions = {}\n): UseLocationRequestsResult {\n  const [requests, setRequests] = useState<LocationRequest[]>([]);\n  const [total, setTotal] = useState(0);\n  const [page, setPage] = useState(1);\n  const [totalPages, setTotalPages] = useState(0);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const pollIntervalRef = useRef<ReturnType<typeof setInterval>>();\n  const optionsRef = useRef(options);\n  optionsRef.current = options;\n\n  const fetchRequests = useCallback(\n    async (filters?: LocationRequestFilters, pagination?: PaginationParams) => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.listLocationRequests(\n          filters || optionsRef.current.filters,\n          pagination || optionsRef.current.pagination\n        );\n        setRequests(result.requests);\n        setTotal(result.total);\n        setPage(result.page);\n        setTotalPages(result.total_pages);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to fetch location requests');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client]\n  );\n\n  const createRequest = useCallback(\n    async (request: CreateLocationRequestRequest): Promise<LocationRequestResult> => {\n      setError(null);\n\n      try {\n        const result = await client.createLocationRequest(request);\n        // Add to local state\n        setRequests((prev) => [result.request, ...prev]);\n        setTotal((prev) => prev + 1);\n        return result;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to create location request');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const getRequest = useCallback(\n    async (requestId: string): Promise<LocationRequest> => {\n      try {\n        return await client.getLocationRequest(requestId);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to get location request');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const cancelRequest = useCallback(\n    async (requestId: string): Promise<void> => {\n      try {\n        await client.cancelLocationRequest(requestId);\n        // Update local state\n        setRequests((prev) =>\n          prev.map((req) =>\n            req.id === requestId ? { ...req, status: 'cancelled' as LocationRequestStatus } : req\n          )\n        );\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to cancel location request');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const resendRequest = useCallback(\n    async (requestId: string, contact: { email?: string; phone?: string }): Promise<void> => {\n      try {\n        await client.resendLocationRequest(requestId, contact);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to resend location request');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const refresh = useCallback(async () => {\n    await fetchRequests();\n  }, [fetchRequests]);\n\n  // Auto-fetch on mount if enabled\n  useEffect(() => {\n    if (optionsRef.current.autoFetch) {\n      fetchRequests();\n    }\n  }, [fetchRequests]);\n\n  // Set up polling if enabled\n  useEffect(() => {\n    const pollInterval = optionsRef.current.pollInterval;\n    if (pollInterval && pollInterval > 0) {\n      pollIntervalRef.current = setInterval(() => {\n        fetchRequests();\n      }, pollInterval);\n\n      return () => {\n        if (pollIntervalRef.current) {\n          clearInterval(pollIntervalRef.current);\n        }\n      };\n    }\n    return undefined;\n  }, [fetchRequests]);\n\n  return {\n    requests,\n    total,\n    page,\n    totalPages,\n    loading,\n    error,\n    fetchRequests,\n    createRequest,\n    getRequest,\n    cancelRequest,\n    resendRequest,\n    refresh,\n  };\n}\n\n// ============================================================================\n// useLocationCapture Hook (Customer-facing)\n// ============================================================================\n\n/**\n * React hook for location capture (customer-facing)\n *\n * Use this hook in the customer's browser to capture and submit their location.\n * The token is obtained from the share link sent via SMS/email.\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options with token\n * @returns Location capture state and methods\n */\nexport function useLocationCapture(\n  client: GeolocationClient,\n  options: UseLocationCaptureOptions\n): UseLocationCaptureResult {\n  const [shareInfo, setShareInfo] = useState<LocationShareInfo | null>(null);\n  const [captureResponse, setCaptureResponse] = useState<LocationCaptureResponse | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [submitting, setSubmitting] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const isExpired = shareInfo?.is_expired ?? false;\n  const isCompleted = shareInfo?.is_completed ?? false;\n\n  const fetchShareInfo = useCallback(async (): Promise<LocationShareInfo> => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const info = await client.getLocationShareInfo(options.token);\n      setShareInfo(info);\n      return info;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error('Failed to fetch share info');\n      setError(error);\n      throw error;\n    } finally {\n      setLoading(false);\n    }\n  }, [client, options.token]);\n\n  const submitLocation = useCallback(\n    async (capture: LocationCaptureRequest): Promise<LocationCaptureResponse> => {\n      setSubmitting(true);\n      setError(null);\n\n      try {\n        const response = await client.captureLocation(options.token, capture);\n        setCaptureResponse(response);\n\n        // Update share info to reflect completion\n        if (response.success) {\n          setShareInfo((prev) =>\n            prev ? { ...prev, is_completed: true, status: 'completed' } : prev\n          );\n        }\n\n        return response;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to submit location');\n        setError(error);\n        throw error;\n      } finally {\n        setSubmitting(false);\n      }\n    },\n    [client, options.token]\n  );\n\n  const captureAndSubmitGPS = useCallback(async (): Promise<LocationCaptureResponse> => {\n    setSubmitting(true);\n    setError(null);\n\n    try {\n      // Build device info (always available, regardless of GPS)\n      const deviceInfo =\n        typeof navigator !== 'undefined'\n          ? {\n              platform: navigator.platform,\n              ...getBrowserInfoShared(),\n            }\n          : undefined;\n      const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : undefined;\n\n      // Try to get GPS position\n      let position: GeolocationPosition | null = null;\n      let gpsError: Error | null = null;\n\n      try {\n        position = await new Promise<GeolocationPosition>((resolve, reject) => {\n          if (!navigator.geolocation) {\n            reject(new Error('Geolocation is not supported by this browser'));\n            return;\n          }\n\n          navigator.geolocation.getCurrentPosition(resolve, reject, {\n            enableHighAccuracy: true,\n            timeout: 30000,\n            maximumAge: 0,\n          });\n        });\n      } catch (err) {\n        // Capture the GPS error but don't throw yet — we'll fall back to IP-based capture\n        if (err instanceof GeolocationPositionError) {\n          switch (err.code) {\n            case err.PERMISSION_DENIED:\n              gpsError = new Error('Location permission denied. Submitting with IP-based location.');\n              break;\n            case err.POSITION_UNAVAILABLE:\n              gpsError = new Error('GPS unavailable. Submitting with IP-based location.');\n              break;\n            case err.TIMEOUT:\n              gpsError = new Error('GPS timed out. Submitting with IP-based location.');\n              break;\n            default:\n              gpsError = new Error('GPS failed. Submitting with IP-based location.');\n          }\n        } else {\n          gpsError = err instanceof Error ? err : new Error('GPS failed. Submitting with IP-based location.');\n        }\n      }\n\n      // Build capture request\n      const capture: LocationCaptureRequest = {\n        user_agent: userAgent,\n        device_info: deviceInfo,\n      };\n\n      // Add GPS coordinates if available and valid\n      if (position) {\n        const { latitude, longitude, accuracy } = position.coords;\n        if (latitude >= -90 && latitude <= 90 && longitude >= -180 && longitude <= 180) {\n          capture.latitude = latitude;\n          capture.longitude = longitude;\n          if (accuracy !== null && accuracy !== undefined && accuracy > 0) {\n            capture.accuracy = accuracy;\n          }\n        }\n      }\n\n      // If GPS failed, set a non-fatal warning so the UI can show it\n      if (gpsError) {\n        setError(gpsError);\n      }\n\n      // Always submit — server handles GPS/WiFi/IP fallback chain\n      return await submitLocation(capture);\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error('Failed to capture location');\n      setError(error);\n      throw error;\n    } finally {\n      setSubmitting(false);\n    }\n  }, [submitLocation]);\n\n  // Auto-fetch share info on mount if enabled\n  useEffect(() => {\n    if (options.autoFetch && options.token) {\n      fetchShareInfo();\n    }\n  }, [options.autoFetch, options.token, fetchShareInfo]);\n\n  // Auto-request GPS if enabled and share info is loaded\n  useEffect(() => {\n    if (options.autoRequestGPS && shareInfo && !isExpired && !isCompleted) {\n      captureAndSubmitGPS().catch(() => {\n        // Error is already set in state, just catch to prevent unhandled rejection\n      });\n    }\n  }, [options.autoRequestGPS, shareInfo, isExpired, isCompleted, captureAndSubmitGPS]);\n\n  return {\n    shareInfo,\n    captureResponse,\n    loading,\n    submitting,\n    error,\n    isExpired,\n    isCompleted,\n    fetchShareInfo,\n    submitLocation,\n    captureAndSubmitGPS,\n  };\n}\n","/**\n * React hooks for compliance verification workflows\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ComplianceClient } from './client';\nimport type {\n  RegistrationVerificationRequest,\n  RegistrationVerificationResponse,\n  LoginVerificationRequest,\n  LoginVerificationResponse,\n  TransactionVerificationRequest,\n  TransactionVerificationResponse,\n} from './types';\n\n// ============================================================================\n// useRegistration Hook\n// ============================================================================\n\nexport interface UseRegistrationOptions {\n  onSuccess?: (result: RegistrationVerificationResponse) => void;\n  onBlocked?: (result: RegistrationVerificationResponse) => void;\n  onError?: (error: Error) => void;\n}\n\nexport interface UseRegistrationResult {\n  verification: RegistrationVerificationResponse | null;\n  loading: boolean;\n  error: Error | null;\n  verifyRegistration: (request: RegistrationVerificationRequest) => Promise<RegistrationVerificationResponse>;\n}\n\n/**\n * Hook for registration verification workflow\n *\n * @param client - ComplianceClient instance\n * @param options - Hook options with callbacks\n *\n * @example\n * ```typescript\n * const { verifyRegistration, loading, error } = useRegistration(sdk, {\n *   onSuccess: (result) => {\n *     console.log('Registration approved!', result.profile);\n *     navigate('/dashboard');\n *   },\n *   onBlocked: (result) => {\n *     alert(`Registration blocked: ${result.blockReasons.join(', ')}`);\n *   }\n * });\n *\n * const handleSubmit = async (formData) => {\n *   await verifyRegistration({\n *     customerId: formData.customerId,\n *     fullName: formData.fullName,\n *     emailAddress: formData.email,\n *     ipAddress: await getClientIP(),\n *     deviceFingerprint: getDeviceFingerprint()\n *   });\n * };\n * ```\n */\nexport function useRegistration(\n  client: ComplianceClient,\n  options: UseRegistrationOptions = {}\n): UseRegistrationResult {\n  const [verification, setVerification] = useState<RegistrationVerificationResponse | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const optionsRef = useRef(options);\n  optionsRef.current = options;\n\n  const verifyRegistration = useCallback(\n    async (request: RegistrationVerificationRequest) => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.verifyAtRegistration(request);\n        setVerification(result);\n\n        if (result.allowed && optionsRef.current.onSuccess) {\n          optionsRef.current.onSuccess(result);\n        }\n\n        if (!result.allowed && optionsRef.current.onBlocked) {\n          optionsRef.current.onBlocked(result);\n        }\n\n        return result;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Registration verification failed');\n        setError(error);\n\n        if (optionsRef.current.onError) {\n          optionsRef.current.onError(error);\n        }\n\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client]\n  );\n\n  return {\n    verification,\n    loading,\n    error,\n    verifyRegistration,\n  };\n}\n\n// ============================================================================\n// useLoginVerification Hook\n// ============================================================================\n\nexport interface UseLoginVerificationOptions {\n  onSuccess?: (result: LoginVerificationResponse) => void;\n  onBlocked?: (result: LoginVerificationResponse) => void;\n  onStepUpRequired?: (result: LoginVerificationResponse) => void;\n  onError?: (error: Error) => void;\n}\n\nexport interface UseLoginVerificationResult {\n  verification: LoginVerificationResponse | null;\n  loading: boolean;\n  error: Error | null;\n  verifyLogin: (request: LoginVerificationRequest) => Promise<LoginVerificationResponse>;\n}\n\n/**\n * Hook for login verification workflow\n *\n * @param client - ComplianceClient instance\n * @param options - Hook options with callbacks\n */\nexport function useLoginVerification(\n  client: ComplianceClient,\n  options: UseLoginVerificationOptions = {}\n): UseLoginVerificationResult {\n  const [verification, setVerification] = useState<LoginVerificationResponse | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const optionsRef = useRef(options);\n  optionsRef.current = options;\n\n  const verifyLogin = useCallback(\n    async (request: LoginVerificationRequest) => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.verifyAtLogin(request);\n        setVerification(result);\n\n        if (result.allowed) {\n          if (result.requiresStepUp && optionsRef.current.onStepUpRequired) {\n            optionsRef.current.onStepUpRequired(result);\n          } else if (optionsRef.current.onSuccess) {\n            optionsRef.current.onSuccess(result);\n          }\n        } else if (optionsRef.current.onBlocked) {\n          optionsRef.current.onBlocked(result);\n        }\n\n        return result;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Login verification failed');\n        setError(error);\n\n        if (optionsRef.current.onError) {\n          optionsRef.current.onError(error);\n        }\n\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client]\n  );\n\n  return {\n    verification,\n    loading,\n    error,\n    verifyLogin,\n  };\n}\n\n// ============================================================================\n// useTransactionVerification Hook\n// ============================================================================\n\nexport interface UseTransactionVerificationOptions {\n  onSuccess?: (result: TransactionVerificationResponse) => void;\n  onBlocked?: (result: TransactionVerificationResponse) => void;\n  onApprovalRequired?: (result: TransactionVerificationResponse) => void;\n  onError?: (error: Error) => void;\n}\n\nexport interface UseTransactionVerificationResult {\n  verification: TransactionVerificationResponse | null;\n  loading: boolean;\n  error: Error | null;\n  verifyTransaction: (request: TransactionVerificationRequest) => Promise<TransactionVerificationResponse>;\n}\n\n/**\n * Hook for transaction verification workflow\n *\n * @param client - ComplianceClient instance\n * @param options - Hook options with callbacks\n *\n * @example\n * ```typescript\n * const { verifyTransaction, loading } = useTransactionVerification(sdk, {\n *   onSuccess: (result) => {\n *     processTransaction(result);\n *   },\n *   onApprovalRequired: (result) => {\n *     queueForReview(result);\n *   },\n *   onBlocked: (result) => {\n *     alert(`Transaction blocked: ${result.blockReasons.join(', ')}`);\n *   }\n * });\n * ```\n */\nexport function useTransactionVerification(\n  client: ComplianceClient,\n  options: UseTransactionVerificationOptions = {}\n): UseTransactionVerificationResult {\n  const [verification, setVerification] = useState<TransactionVerificationResponse | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const optionsRef = useRef(options);\n  optionsRef.current = options;\n\n  const verifyTransaction = useCallback(\n    async (request: TransactionVerificationRequest) => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.verifyAtTransaction(request);\n        setVerification(result);\n\n        if (result.allowed && optionsRef.current.onSuccess) {\n          optionsRef.current.onSuccess(result);\n        } else if (result.requiresApproval && optionsRef.current.onApprovalRequired) {\n          optionsRef.current.onApprovalRequired(result);\n        } else if (!result.allowed && optionsRef.current.onBlocked) {\n          optionsRef.current.onBlocked(result);\n        }\n\n        return result;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Transaction verification failed');\n        setError(error);\n\n        if (optionsRef.current.onError) {\n          optionsRef.current.onError(error);\n        }\n\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client]\n  );\n\n  return {\n    verification,\n    loading,\n    error,\n    verifyTransaction,\n  };\n}\n","/**\n * React hooks for customer risk profile management\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport type { RiskProfileClient } from './client';\nimport type { CustomerProfile } from './types';\n\n// ============================================================================\n// useCustomerProfile Hook\n// ============================================================================\n\nexport interface UseCustomerProfileOptions {\n  autoFetch?: boolean;\n}\n\nexport interface UseCustomerProfileResult {\n  profile: CustomerProfile | null;\n  loading: boolean;\n  error: Error | null;\n  fetchProfile: () => Promise<CustomerProfile>;\n  updateProfile: (updates: Partial<CustomerProfile>) => Promise<CustomerProfile>;\n  refresh: () => Promise<CustomerProfile>;\n}\n\n/**\n * Hook for managing customer risk profiles\n *\n * @param client - RiskProfileClient instance\n * @param customerId - Customer ID to fetch profile for\n * @param options - Hook options\n *\n * @example\n * ```typescript\n * const { profile, loading, error, updateProfile } = useCustomerProfile(\n *   riskClient,\n *   'CUST-12345',\n *   { autoFetch: true }\n * );\n *\n * if (loading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n * if (!profile) return <NotFound />;\n *\n * return (\n *   <div>\n *     <h1>{profile.full_name}</h1>\n *     <RiskScore score={profile.risk_score} category={profile.risk_category} />\n *   </div>\n * );\n * ```\n */\nexport function useCustomerProfile(\n  client: RiskProfileClient,\n  customerId: string,\n  options: UseCustomerProfileOptions = {}\n): UseCustomerProfileResult {\n  const [profile, setProfile] = useState<CustomerProfile | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchProfile = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const result = await client.getProfile(customerId);\n      setProfile(result);\n      return result;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error('Failed to fetch profile');\n      setError(error);\n      throw error;\n    } finally {\n      setLoading(false);\n    }\n  }, [client, customerId]);\n\n  const profileRef = useRef(profile);\n  profileRef.current = profile;\n\n  const updateProfile = useCallback(\n    async (updates: Partial<CustomerProfile>) => {\n      if (!profileRef.current) throw new Error('Profile not loaded');\n\n      setLoading(true);\n      setError(null);\n\n      try {\n        const updated = await client.updateProfile(profileRef.current.id, updates);\n        setProfile(updated);\n        return updated;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to update profile');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client]\n  );\n\n  useEffect(() => {\n    if (options.autoFetch && customerId) {\n      fetchProfile();\n    }\n  }, [options.autoFetch, customerId, fetchProfile]);\n\n  return {\n    profile,\n    loading,\n    error,\n    fetchProfile,\n    updateProfile,\n    refresh: fetchProfile,\n  };\n}\n\n","export const Camera = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPg0KPCEtLSBVcGxvYWRlZCB0bzogU1ZHIFJlcG8sIHd3dy5zdmdyZXBvLmNvbSwgR2VuZXJhdG9yOiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4NCjxzdmcgdmVyc2lvbj0iMS4wIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgDQoJIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDY0IDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA2NCA2NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBmaWxsPSIjMjMxRjIwIiBkPSJNNjAsMTBINDkuNjU2bC02LjgyOC02LjgyOEM0Mi4wNzgsMi40MjIsNDEuMDYyLDIsNDAsMkgyNGMtMS4wNjIsMC0yLjA3OCwwLjQyMi0yLjgyOCwxLjE3MkwxNC4zNDQsMTBINA0KCQljLTIuMjExLDAtNCwxLjc4OS00LDR2NDRjMCwyLjIxMSwxLjc4OSw0LDQsNGg1NmMyLjIxMSwwLDQtMS43ODksNC00VjE0QzY0LDExLjc4OSw2Mi4yMTEsMTAsNjAsMTB6IE0zMiw1MA0KCQljLTguODM2LDAtMTYtNy4xNjQtMTYtMTZzNy4xNjQtMTYsMTYtMTZzMTYsNy4xNjQsMTYsMTZTNDAuODM2LDUwLDMyLDUweiIvPg0KCTxjaXJjbGUgZmlsbD0iIzIzMUYyMCIgY3g9IjMyIiBjeT0iMzQiIHI9IjgiLz4NCjwvZz4NCjwvc3ZnPg==\"\nexport const Done=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik04LjUgMTIuNUwxMC41IDE0LjVMMTUuNSA5LjUiIHN0cm9rZT0iIzFDMjc0QyIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTcgMy4zMzc4MkM4LjQ3MDg3IDIuNDg2OTcgMTAuMTc4NiAyIDEyIDJDMTcuNTIyOCAyIDIyIDYuNDc3MTUgMjIgMTJDMjIgMTcuNTIyOCAxNy41MjI4IDIyIDEyIDIyQzYuNDc3MTUgMjIgMiAxNy41MjI4IDIgMTJDMiAxMC4xNzg2IDIuNDg2OTcgOC40NzA4NyAzLjMzNzgyIDciIHN0cm9rZT0iIzFDMjc0QyIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPg0KPC9zdmc+\"\nexport const Close = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik0xNC41IDkuNTAwMDJMOS41IDE0LjVNOS40OTk5OCA5LjVMMTQuNSAxNC41IiBzdHJva2U9IiMxQzI3NEMiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4NCjxwYXRoIGQ9Ik03IDMuMzM3ODJDOC40NzA4NyAyLjQ4Njk3IDEwLjE3ODYgMiAxMiAyQzE3LjUyMjggMiAyMiA2LjQ3NzE1IDIyIDEyQzIyIDE3LjUyMjggMTcuNTIyOCAyMiAxMiAyMkM2LjQ3NzE1IDIyIDIgMTcuNTIyOCAyIDEyQzIgMTAuMTc4NiAyLjQ4Njk3IDguNDcwODcgMy4zMzc4MiA3IiBzdHJva2U9IiMxQzI3NEMiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4NCjwvc3ZnPg==\"\nexport const Upload=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik0xNyAxN0gxNy4wMU0xNS42IDE0SDE4QzE4LjkzMTkgMTQgMTkuMzk3OCAxNCAxOS43NjU0IDE0LjE1MjJDMjAuMjU1NCAxNC4zNTUyIDIwLjY0NDggMTQuNzQ0NiAyMC44NDc4IDE1LjIzNDZDMjEgMTUuNjAyMiAyMSAxNi4wNjgxIDIxIDE3QzIxIDE3LjkzMTkgMjEgMTguMzk3OCAyMC44NDc4IDE4Ljc2NTRDMjAuNjQ0OCAxOS4yNTU0IDIwLjI1NTQgMTkuNjQ0OCAxOS43NjU0IDE5Ljg0NzhDMTkuMzk3OCAyMCAxOC45MzE5IDIwIDE4IDIwSDZDNS4wNjgxMiAyMCA0LjYwMjE4IDIwIDQuMjM0NjMgMTkuODQ3OEMzLjc0NDU4IDE5LjY0NDggMy4zNTUyMyAxOS4yNTU0IDMuMTUyMjQgMTguNzY1NEMzIDE4LjM5NzggMyAxNy45MzE5IDMgMTdDMyAxNi4wNjgxIDMgMTUuNjAyMiAzLjE1MjI0IDE1LjIzNDZDMy4zNTUyMyAxNC43NDQ2IDMuNzQ0NTggMTQuMzU1MiA0LjIzNDYzIDE0LjE1MjJDNC42MDIxOCAxNCA1LjA2ODEyIDE0IDYgMTRIOC40TTEyIDE1VjRNMTIgNEwxNSA3TTEyIDRMOSA3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8L3N2Zz4=\"","import React, { useRef, useState } from \"react\"\nimport { Camera, Close, Done, Upload } from \"./images\"\n\ninterface FaceCaptureModalProps {\n  onCapture: (base64: string) => void\n  onCancel: () => void\n}\n\nconst fileToBase64 = (file: File): Promise<string> => {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader()\n    reader.readAsDataURL(file)\n    reader.onload = () => resolve(reader.result as string)\n    reader.onerror = error => reject(error)\n  })\n}\n\nfunction FaceCaptureModal({\n  onCapture,\n  onCancel\n}: FaceCaptureModalProps): React.ReactNode {\n  const inputRef = useRef<HTMLInputElement>(null)\n  const [isProcessing, setIsProcessing] = useState(false)\n  const [isHoveringPrimary, setIsHoveringPrimary] = useState(false)\n  const [isHoveringCancel, setIsHoveringCancel] = useState(false)\n  const [isHoveringClose, setIsHoveringClose] = useState(false)\n\n  const isMobile = /Mobi|Android/i.test(navigator.userAgent)\n\n  const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n    const file = e.target.files?.[0]\n    if (!file) return\n    \n    setIsProcessing(true)\n    try {\n      const base64 = await fileToBase64(file)\n      setTimeout(() => {\n        onCapture(base64)\n      }, 300)\n    } catch (error) {\n      console.error(\"[Vesant SDK] Error processing image:\", error instanceof Error ? error.message : \"Unknown error\")\n      setIsProcessing(false)\n    }\n  }\n\n  // Styles\n  const overlayStyle: React.CSSProperties = {\n    position: \"fixed\",\n    inset: 0,\n    background: \"rgba(0, 0, 0, 0.6)\",\n    backdropFilter: \"blur(4px)\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    zIndex: 999999,\n    padding: \"16px\",\n    animation: \"fadeIn 0.2s ease-out\"\n  }\n\n  const modalStyle: React.CSSProperties = {\n    background: \"#ffffff\",\n    borderRadius: \"16px\",\n    boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\",\n    width: \"100%\",\n    maxWidth: \"448px\",\n    animation: \"zoomIn 0.2s ease-out\"\n  }\n\n  const headerStyle: React.CSSProperties = {\n    position: \"relative\",\n    padding: \"24px 24px 16px\",\n    borderBottom: \"1px solid #f3f4f6\"\n  }\n\n  const closeButtonStyle: React.CSSProperties = {\n    position: \"absolute\",\n    top: \"16px\",\n    right: \"16px\",\n    padding: \"8px\",\n    background: isHoveringClose ? \"#f3f4f6\" : \"transparent\",\n    border: \"none\",\n    borderRadius: \"9999px\",\n    cursor: \"pointer\",\n    transition: \"background-color 0.2s\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\"\n  }\n\n  const titleStyle: React.CSSProperties = {\n    fontSize: \"24px\",\n    fontWeight: 600,\n    color: \"#111827\",\n    margin: 0\n  }\n\n  const subtitleStyle: React.CSSProperties = {\n    fontSize: \"14px\",\n    color: \"#6b7280\",\n    marginTop: \"4px\"\n  }\n\n  const contentStyle: React.CSSProperties = {\n    padding: \"32px 24px\"\n  }\n\n  const visualGuideContainerStyle: React.CSSProperties = {\n    marginBottom: \"32px\",\n    display: \"flex\",\n    justifyContent: \"center\"\n  }\n\n  const visualGuideStyle: React.CSSProperties = {\n    position: \"relative\"\n  }\n\n  const circleStyle: React.CSSProperties = {\n    width: \"128px\",\n    height: \"128px\",\n    borderRadius: \"50%\",\n    background: \"linear-gradient(135deg, rgba(0, 188, 125, 0.2) 0%, rgba(0, 188, 125, 0.05) 100%)\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\"\n  }\n\n  const badgeStyle: React.CSSProperties = {\n    position: \"absolute\",\n    top: \"-4px\",\n    right: \"-4px\",\n    width: \"32px\",\n    height: \"32px\",\n    background: \"#ffffff\",\n    borderRadius: \"50%\",\n    boxShadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\"\n  }\n\n  const instructionsBoxStyle: React.CSSProperties = {\n    background: \"linear-gradient(135deg, #f9fafb 0%, rgba(243, 244, 246, 0.5) 100%)\",\n    borderRadius: \"12px\",\n    padding: \"16px\",\n    marginBottom: \"24px\"\n  }\n\n  const instructionsTitleStyle: React.CSSProperties = {\n    fontSize: \"14px\",\n    fontWeight: 500,\n    color: \"#111827\",\n    marginBottom: \"8px\"\n  }\n\n  const instructionsListStyle: React.CSSProperties = {\n    fontSize: \"12px\",\n    color: \"#6b7280\",\n    listStyle: \"none\",\n    padding: 0,\n    margin: 0\n  }\n\n  const instructionItemStyle: React.CSSProperties = {\n    display: \"flex\",\n    alignItems: \"flex-start\",\n    marginBottom: \"6px\"\n  }\n\n  const bulletStyle: React.CSSProperties = {\n    color: \"#00bc7d\",\n    marginRight: \"8px\",\n    flexShrink: 0\n  }\n\n  const buttonsContainerStyle: React.CSSProperties = {\n    display: \"flex\",\n    flexDirection: \"column\",\n    gap: \"12px\"\n  }\n\n  const primaryButtonStyle: React.CSSProperties = {\n    width: \"100%\",\n    background: isProcessing ? \"#d1d5db\" : (isHoveringPrimary ? \"#00a86d\" : \"#00bc7d\"),\n    color: \"#ffffff\",\n    fontWeight: 500,\n    padding: \"14px 24px\",\n    borderRadius: \"12px\",\n    border: \"none\",\n    cursor: isProcessing ? \"not-allowed\" : \"pointer\",\n    transition: \"all 0.2s\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    gap: \"12px\",\n    boxShadow: isProcessing ? \"none\" : (isHoveringPrimary ? \"0 20px 25px -5px rgba(0, 188, 125, 0.3)\" : \"0 10px 15px -3px rgba(0, 188, 125, 0.2)\"),\n    fontSize: \"16px\"\n  }\n\n  const cancelButtonStyle: React.CSSProperties = {\n    width: \"100%\",\n    background: isProcessing ? \"#f3f4f6\" : (isHoveringCancel ? \"#f9fafb\" : \"#ffffff\"),\n    color: \"#374151\",\n    fontWeight: 500,\n    padding: \"14px 24px\",\n    borderRadius: \"12px\",\n    border: \"2px solid #e5e7eb\",\n    cursor: isProcessing ? \"not-allowed\" : \"pointer\",\n    transition: \"all 0.2s\",\n    fontSize: \"16px\"\n  }\n\n  const footerStyle: React.CSSProperties = {\n    padding: \"0 24px 24px\"\n  }\n\n  const footerTextStyle: React.CSSProperties = {\n    fontSize: \"12px\",\n    textAlign: \"center\",\n    color: \"#9ca3af\",\n    margin: 0\n  }\n\n  const spinnerStyle: React.CSSProperties = {\n    width: \"20px\",\n    height: \"20px\",\n    border: \"2px solid rgba(255, 255, 255, 0.3)\",\n    borderTopColor: \"#ffffff\",\n    borderRadius: \"50%\",\n    animation: \"spin 0.6s linear infinite\"\n  }\n\n  const hiddenInputStyle: React.CSSProperties = {\n    display: \"none\"\n  }\n\n  // Add keyframe animations via style tag\n  const styleTag = (\n    <style>\n      {`\n        @keyframes fadeIn {\n          from {\n            opacity: 0;\n          }\n          to {\n            opacity: 1;\n          }\n        }\n        \n        @keyframes zoomIn {\n          from {\n            opacity: 0;\n            transform: scale(0.95);\n          }\n          to {\n            opacity: 1;\n            transform: scale(1);\n          }\n        }\n        \n        @keyframes spin {\n          from {\n            transform: rotate(0deg);\n          }\n          to {\n            transform: rotate(360deg);\n          }\n        }\n      `}\n    </style>\n  )\n\n  return (\n    <>\n      {styleTag}\n      <div style={overlayStyle}>\n        <div style={modalStyle}>\n          {/* Header */}\n          <div style={headerStyle}>\n            <button\n              onClick={onCancel}\n              onMouseEnter={() => setIsHoveringClose(true)}\n              onMouseLeave={() => setIsHoveringClose(false)}\n              style={closeButtonStyle}\n              aria-label=\"Close\"\n            >\n              <img src={Close} alt=\"Close Icon\" width={16} height={16} />\n            </button>\n            <h2 style={titleStyle}>Face Verification</h2>\n            <p style={subtitleStyle}>Please capture or upload a clear photo of your face</p>\n          </div>\n\n          {/* Content */}\n          <div style={contentStyle}>\n            {/* Visual Guide */}\n            <div style={visualGuideContainerStyle}>\n              <div style={visualGuideStyle}>\n                <div style={circleStyle}>\n                  <img src={Camera} alt=\"Camera Icon\" width={48} height={48} />\n                </div>\n                <div style={badgeStyle}>\n                  <img src={Done} alt=\"Check Icon\" width={16} height={16} />\n                </div>\n              </div>\n            </div>\n\n            {/* Instructions */}\n            <div style={instructionsBoxStyle}>\n              <h3 style={instructionsTitleStyle}>Tips for best results:</h3>\n              <ul style={instructionsListStyle}>\n                <li style={instructionItemStyle}>\n                  <span style={bulletStyle}>•</span>\n                  <span>Ensure good lighting on your face</span>\n                </li>\n                <li style={instructionItemStyle}>\n                  <span style={bulletStyle}>•</span>\n                  <span>Remove glasses or accessories if possible</span>\n                </li>\n                <li style={instructionItemStyle}>\n                  <span style={bulletStyle}>•</span>\n                  <span>Look directly at the camera</span>\n                </li>\n              </ul>\n            </div>\n\n            {/* Hidden file input */}\n            <input\n              ref={inputRef}\n              type=\"file\"\n              accept=\"image/*\"\n              capture={isMobile ? \"user\" : undefined}\n              style={hiddenInputStyle}\n              onChange={handleFileChange}\n              disabled={isProcessing}\n            />\n\n            {/* Action Buttons */}\n            <div style={buttonsContainerStyle}>\n              <button\n                onClick={() => inputRef.current?.click()}\n                onMouseEnter={() => setIsHoveringPrimary(true)}\n                onMouseLeave={() => setIsHoveringPrimary(false)}\n                disabled={isProcessing}\n                style={primaryButtonStyle}\n              >\n                {isProcessing ? (\n                  <>\n                    <div style={spinnerStyle} />\n                    <span>Processing...</span>\n                  </>\n                ) : (\n                  <>\n                    {isMobile ? (\n                      <img src={Camera} alt=\"Camera Icon\" width={20} height={20} />\n                    ) : (\n                      <img src={Upload} alt=\"Upload Icon\" width={20} height={20} />\n                    )}\n                    <span>{isMobile ? \"Capture Photo\" : \"Upload Photo\"}</span>\n                  </>\n                )}\n              </button>\n\n              <button\n                onClick={onCancel}\n                onMouseEnter={() => setIsHoveringCancel(true)}\n                onMouseLeave={() => setIsHoveringCancel(false)}\n                disabled={isProcessing}\n                style={cancelButtonStyle}\n              >\n                Cancel\n              </button>\n            </div>\n          </div>\n\n          {/* Footer Note */}\n          <div style={footerStyle}>\n            <p style={footerTextStyle}>\n              Your photo will be securely processed and used only for verification purposes\n            </p>\n          </div>\n        </div>\n      </div>\n    </>\n  )\n}\n\nexport default FaceCaptureModal","/**\n * React Hooks for Vesant KYC SDK\n *\n * Provides convenient React hooks for using the KYC service in Next.js applications.\n */\n\nimport { useState, useEffect, useCallback, useRef, createElement } from 'react';\nimport { createRoot } from \"react-dom/client\"\nimport FaceCaptureModal from \"./FaceCaptureModal\"\nimport { KycClient } from './client';\nimport type {\n  KycRequest,\n  KycRequestFilters,\n  DocumentVerificationRequest,\n  DocumentVerificationResponse,\n  KycStatus,\n  KycAlert,\n  KycAlertFilters,\n  UpdateKycAlertRequest,\n  KycOverview,\n  KycPreferences,\n  UpdateKycPreferencesRequest,\n  PaginationParams,\n  UseKycSubmissionOptions,\n  UseKycSubmissionResult,\n  UseKycRequestsOptions,\n  UseKycRequestsResult,\n  UseKycAlertsOptions,\n  UseKycAlertsResult,\n  UseKycOverviewOptions,\n  UseKycOverviewResult,\n  UseKycPreferencesResult,\n  CheckKycStatusResponse,\n} from './types';\n\n// ============================================================================\n// Shared Hooks for Auto-fetch and Polling\n// ============================================================================\n\n/** Hook for auto-fetching on mount */\nfunction useAutoFetch(autoFetch: boolean | undefined, fetchFn: () => void): void {\n  useEffect(() => {\n    if (autoFetch) {\n      fetchFn();\n    }\n  }, [autoFetch, fetchFn]);\n}\n\n/** Hook for setting up polling intervals */\nfunction usePolling(pollInterval: number | undefined, fetchFn: () => void): void {\n  const pollIntervalRef = useRef<NodeJS.Timeout>();\n\n  useEffect(() => {\n    if (pollInterval && pollInterval > 0) {\n      pollIntervalRef.current = setInterval(fetchFn, pollInterval);\n      return () => {\n        if (pollIntervalRef.current) {\n          clearInterval(pollIntervalRef.current);\n        }\n      };\n    }\n    return undefined;\n  }, [pollInterval, fetchFn]);\n}\n\n// ============================================================================\n// useKycSubmission Hook\n// ============================================================================\n\n/**\n * React hook for submitting KYC document verification\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC submission state and methods\n *\n * @example\n * ```tsx\n * function KycForm() {\n *   const { submit, submission, loading, error, reset } = useKycSubmission(client, {\n *     onComplete: (result) => {\n *       console.log(\"Verification submitted:\", result.reference);\n *     },\n *     onError: (err) => {\n *       console.error(\"Submission failed:\", err.message);\n *     }\n *   });\n *\n *   const handleSubmit = async (formData: FormData) => {\n *     await submit({\n *       reference: formData.get(\"customerId\"),\n *       email: formData.get(\"email\"),\n *       document: {\n *         proof: formData.get(\"documentImage\"),\n *         selected_type: [\"id_card\", \"passport\"]\n *       }\n *     });\n *   };\n *\n *   return (\n *     <form onSubmit={handleSubmit}>\n *       {loading && <Spinner />}\n *       {error && <ErrorMessage>{error.message}</ErrorMessage>}\n *       {submission && <SuccessMessage>Submitted: {submission.reference}</SuccessMessage>}\n *     </form>\n *   );\n * }\n * ```\n */\nexport function useKycSubmission(\n  client: KycClient,\n  options: UseKycSubmissionOptions = {}\n): UseKycSubmissionResult {\n  const [submission, setSubmission] = useState<DocumentVerificationResponse | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const submit = useCallback(\n    async (request: DocumentVerificationRequest): Promise<DocumentVerificationResponse> => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.submitVerification(request);\n        setSubmission(result);\n        options.onComplete?.(result);\n        return result;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Verification submission failed');\n        setError(error);\n        options.onError?.(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client, options]\n  );\n\n  const reset = useCallback(() => {\n    setSubmission(null);\n    setError(null);\n    setLoading(false);\n  }, []);\n\n  return {\n    submit,\n    submission,\n    loading,\n    error,\n    reset,\n  };\n}\n\n// ============================================================================\n// useKycRequests Hook\n// ============================================================================\n\n/**\n * React hook for managing KYC requests\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC requests state and management methods\n *\n * @example\n * ```tsx\n * function KycDashboard() {\n *   const {\n *     requests,\n *     total,\n *     loading,\n *     fetchRequests,\n *     updateStatus\n *   } = useKycRequests(client, {\n *     autoFetch: true,\n *     filters: { status: \"pending\" },\n *     pagination: { page: 1, page_size: 20 }\n *   });\n *\n *   return (\n *     <div>\n *       <h2>{total} Pending KYC Requests</h2>\n *       {requests.map(req => (\n *         <KycCard\n *           key={req.id}\n *           request={req}\n *           onApprove={() => updateStatus(req.reference, \"accepted\", \"Verified\")}\n *           onReject={() => updateStatus(req.reference, \"declined\", \"Invalid document\")}\n *         />\n *       ))}\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useKycRequests(\n  client: KycClient,\n  options: UseKycRequestsOptions = {}\n): UseKycRequestsResult {\n  const [requests, setRequests] = useState<KycRequest[]>([]);\n  const [pagination, setPagination] = useState<{ total: number; page: number; limit: number; totalPages: number } | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchRequests = useCallback(\n    async (filters?: KycRequestFilters, paginationParams?: PaginationParams) => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.listKycRequests(\n          filters || options.filters,\n          paginationParams || options.pagination\n        );\n        setRequests(result.data);\n        setPagination(result.pagination);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to fetch KYC requests');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client, options.filters, options.pagination]\n  );\n\n  const getRequest = useCallback(\n    async (id: string): Promise<KycRequest> => {\n      try {\n        return await client.getKycRequest(id);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to get KYC request');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const updateStatus = useCallback(\n    async (reference: string, status: KycStatus, reason?: string) => {\n      try {\n        await client.updateKycStatus({ reference, status, reason });\n        setRequests((prev) =>\n          prev.map((req) =>\n            req.reference === reference\n              ? {\n                ...req,\n                status,\n                ...(status === 'accepted'\n                  ? { accepted_reason: reason }\n                  : { declined_reason: reason }),\n              }\n              : req\n          )\n        );\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to update KYC status');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const refresh = useCallback(async () => {\n    await fetchRequests();\n  }, [fetchRequests]);\n\n  useAutoFetch(options.autoFetch, fetchRequests);\n  usePolling(options.pollInterval, fetchRequests);\n\n  return {\n    requests,\n    pagination,\n    loading,\n    error,\n    fetchRequests,\n    getRequest,\n    updateStatus,\n    refresh,\n  };\n}\n\n// ============================================================================\n// useKycAlerts Hook\n// ============================================================================\n\n/**\n * React hook for managing KYC alerts\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC alerts state and management methods\n *\n * @example\n * ```tsx\n * function AlertsPanel() {\n *   const {\n *     alerts,\n *     total,\n *     loading,\n *     fetchAlerts,\n *     updateAlert\n *   } = useKycAlerts(client, {\n *     autoFetch: true,\n *     filters: { status: [\"pending\", \"in_progress\"], risk: \"critical\" },\n *     pollInterval: 30000\n *   });\n *\n *   return (\n *     <div>\n *       <h2>{total} Critical Alerts</h2>\n *       {alerts.map(alert => (\n *         <AlertCard\n *           key={alert.id}\n *           alert={alert}\n *           onAssign={(userId) => updateAlert(alert.id, { assigned_for: userId, status: \"in_progress\" })}\n *           onResolve={() => updateAlert(alert.id, { status: \"resolved\", reason: \"Verified\" })}\n *         />\n *       ))}\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useKycAlerts(\n  client: KycClient,\n  options: UseKycAlertsOptions = {}\n): UseKycAlertsResult {\n  const [alerts, setAlerts] = useState<KycAlert[]>([]);\n  const [pagination, setPagination] = useState<{ total: number; page: number; limit: number; totalPages: number } | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchAlerts = useCallback(\n    async (filters?: KycAlertFilters, paginationParams?: PaginationParams) => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.listAlerts(\n          filters || options.filters,\n          paginationParams || options.pagination\n        );\n        setAlerts(result.alerts);\n        setPagination(result.pagination);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to fetch KYC alerts');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client, options.filters, options.pagination]\n  );\n\n  const getAlert = useCallback(\n    async (id: string): Promise<KycAlert> => {\n      try {\n        return await client.getAlert(id);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to get KYC alert');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const updateAlert = useCallback(\n    async (id: string, update: UpdateKycAlertRequest) => {\n      try {\n        await client.updateAlert(id, update);\n        setAlerts((prev) =>\n          prev.map((alert) =>\n            alert.id === id ? { ...alert, ...update } : alert\n          )\n        );\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to update KYC alert');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const refresh = useCallback(async () => {\n    await fetchAlerts();\n  }, [fetchAlerts]);\n\n  useAutoFetch(options.autoFetch, fetchAlerts);\n  usePolling(options.pollInterval, fetchAlerts);\n\n  return {\n    alerts,\n    pagination,\n    loading,\n    error,\n    fetchAlerts,\n    getAlert,\n    updateAlert,\n    refresh,\n  };\n}\n\n// ============================================================================\n// useKycOverview Hook\n// ============================================================================\n\n/**\n * React hook for KYC overview statistics\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC overview state\n *\n * @example\n * ```tsx\n * function KycStats() {\n *   const { overview, loading, refresh } = useKycOverview(client, {\n *     autoFetch: true,\n *     fromDate: \"2024-01-01T00:00:00Z\",\n *     toDate: \"2024-12-31T23:59:59Z\"\n *   });\n *\n *   if (loading) return <Spinner />;\n *\n *   return (\n *     <div>\n *       <StatCard label=\"Total\" value={overview?.total} />\n *       <StatCard label=\"Pending\" value={overview?.pending} />\n *       <StatCard label=\"Approved\" value={overview?.approved} />\n *       <StatCard label=\"Rejected\" value={overview?.rejected} />\n *       <StatCard label=\"High Risk\" value={overview?.high_risk} />\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useKycOverview(\n  client: KycClient,\n  options: UseKycOverviewOptions = {}\n): UseKycOverviewResult {\n  const [overview, setOverview] = useState<KycOverview | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchOverview = useCallback(\n    async (fromDate?: string, toDate?: string) => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.getOverview(\n          fromDate || options.fromDate,\n          toDate || options.toDate\n        );\n        setOverview(result);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to fetch KYC overview');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client, options.fromDate, options.toDate]\n  );\n\n  useAutoFetch(options.autoFetch, fetchOverview);\n\n  return {\n    overview,\n    loading,\n    error,\n    refresh: fetchOverview,\n  };\n}\n\n// ============================================================================\n// useKycPreferences Hook\n// ============================================================================\n\n/**\n * React hook for managing KYC preferences\n *\n * @param client - KycClient instance\n * @param autoFetch - Auto-fetch preferences on mount (default: true)\n * @returns KYC preferences state and methods\n *\n * @example\n * ```tsx\n * function PreferencesForm() {\n *   const { preferences, loading, updatePreferences, refresh } = useKycPreferences(client);\n *\n *   const handleUpdate = async (e: FormEvent) => {\n *     e.preventDefault();\n *     await updatePreferences({\n *       is_face_verification_required: true,\n *       required_document_count: 2\n *     });\n *   };\n *\n *   if (loading) return <Spinner />;\n *\n *   return (\n *     <form onSubmit={handleUpdate}>\n *       <Checkbox\n *         label=\"Require Face Verification\"\n *         checked={preferences?.is_face_verification_required}\n *       />\n *       <NumberInput\n *         label=\"Required Documents\"\n *         value={preferences?.required_document_count}\n *       />\n *       <Button type=\"submit\">Save</Button>\n *     </form>\n *   );\n * }\n * ```\n */\nexport function useKycPreferences(\n  client: KycClient,\n  autoFetch: boolean = true\n): UseKycPreferencesResult {\n  const [preferences, setPreferences] = useState<KycPreferences | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchPreferences = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const result = await client.getPreferences();\n      setPreferences(result);\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error('Failed to fetch KYC preferences');\n      setError(error);\n      throw error;\n    } finally {\n      setLoading(false);\n    }\n  }, [client]);\n\n  const updatePreferences = useCallback(\n    async (update: UpdateKycPreferencesRequest) => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.updatePreferences(update);\n        setPreferences(result);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to update KYC preferences');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client]\n  );\n\n  useAutoFetch(autoFetch, fetchPreferences);\n\n  return {\n    preferences,\n    loading,\n    error,\n    updatePreferences,\n    refresh: fetchPreferences,\n  };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert a File to base64 string for document upload\n *\n * @param file - File object from input or drag-drop\n * @returns Base64 encoded string\n *\n * @example\n * ```typescript\n * const handleFileSelect = async (e: ChangeEvent<HTMLInputElement>) => {\n *   const file = e.target.files?.[0];\n *   if (file) {\n *     const base64 = await fileToBase64(file);\n *     setDocumentProof(base64);\n *   }\n * };\n * ```\n */\nexport function fileToBase64(file: File): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      const result = reader.result as string;\n      // Remove data URL prefix (e.g., \"data:image/png;base64,\")\n      const base64 = result.split(',')[1];\n      resolve(base64);\n    };\n    reader.onerror = reject;\n    reader.readAsDataURL(file);\n  });\n}\n\n/**\n * Validate file type for document upload\n *\n * @param file - File object to validate\n * @param allowedTypes - Array of allowed MIME types\n * @returns boolean indicating if file type is valid\n *\n * @example\n * ```typescript\n * const validTypes = ['image/jpeg', 'image/png', 'application/pdf'];\n * if (!isValidFileType(file, validTypes)) {\n *   alert('Invalid file type. Please upload a JPG, PNG, or PDF.');\n * }\n * ```\n */\nexport function isValidFileType(\n  file: File,\n  allowedTypes: string[] = ['image/jpeg', 'image/png', 'image/webp', 'application/pdf']\n): boolean {\n  return allowedTypes.includes(file.type);\n}\n\n/**\n * Validate file size for document upload\n *\n * @param file - File object to validate\n * @param maxSizeBytes - Maximum file size in bytes (default: 10MB)\n * @returns boolean indicating if file size is valid\n *\n * @example\n * ```typescript\n * const maxSize = 5 * 1024 * 1024; // 5MB\n * if (!isValidFileSize(file, maxSize)) {\n *   alert('File too large. Maximum size is 5MB.');\n * }\n * ```\n */\nexport function isValidFileSize(file: File, maxSizeBytes: number = 10 * 1024 * 1024): boolean {\n  return file.size <= maxSizeBytes;\n}\n\n/**\n * Format KYC status for display\n *\n * @param status - KYC status\n * @returns Human-readable status string\n */\nexport function formatKycStatus(status: string): string {\n  const statusMap: Record<string, string> = {\n    pending: 'Pending Review',\n    accepted: 'Approved',\n    declined: 'Rejected',\n    'review.pending': 'Under Review',\n    unknown: 'Unknown',\n  };\n  return statusMap[status] || status;\n}\n\n/**\n * Get status color for UI display\n *\n * @param status - KYC status\n * @returns CSS color class or hex color\n */\nexport function getStatusColor(status: string): string {\n  const colorMap: Record<string, string> = {\n    pending: '#f59e0b', // amber\n    accepted: '#10b981', // green\n    declined: '#ef4444', // red\n    'review.pending': '#3b82f6', // blue\n    unknown: '#6b7280', // gray\n  };\n  return colorMap[status] || '#6b7280';\n}\n\n/**\n * Get risk level color for UI display\n *\n * @param risk - Risk level\n * @returns CSS color class or hex color\n */\nexport function getRiskColor(risk: string): string {\n  const colorMap: Record<string, string> = {\n    low: '#10b981', // green\n    medium: '#f59e0b', // amber\n    high: '#f97316', // orange\n    critical: '#ef4444', // red\n  };\n  return colorMap[risk] || '#6b7280';\n}\n\n\n\nexport function useReuseKYCSubmission(client: KycClient) {\n  const verifyFace = (reference: string, token: string) => {\n    return new Promise<CheckKycStatusResponse | null>((resolve, reject) => {\n      const container = document.createElement(\"div\")\n      document.body.appendChild(container)\n      const root = createRoot(container)\n\n      const cleanup = () => {\n        root.unmount()\n        document.body.removeChild(container)\n      }\n\n      const modal = createElement(FaceCaptureModal, {\n        onCapture: async (base64: string) => {\n          try {\n            const resp = await client.submitReuseKycSession({\n              proof: base64,\n              reference,\n              token,\n            })\n            resolve(resp)\n          } catch (error) {\n            reject(error instanceof Error ? error : new Error('Face verification failed'))\n          }\n          finally {\n            cleanup()\n          }\n        },\n        onCancel: () => {\n          cleanup()\n          resolve(null)\n        },\n      })\n      root.render(modal)\n    })\n  }\n\n  return { verifyFace }\n}\n"]}