{"version":3,"file":"index.cjs","sources":["../src/components/ui.tsx","../src/components/OTPInput.tsx","../__vite-browser-external","../../../node_modules/crypto-js/core.js","../../../node_modules/crypto-js/x64-core.js","../../../node_modules/crypto-js/lib-typedarrays.js","../../../node_modules/crypto-js/enc-utf16.js","../../../node_modules/crypto-js/enc-base64.js","../../../node_modules/crypto-js/enc-base64url.js","../../../node_modules/crypto-js/md5.js","../../../node_modules/crypto-js/sha1.js","../../../node_modules/crypto-js/sha256.js","../../../node_modules/crypto-js/sha224.js","../../../node_modules/crypto-js/sha512.js","../../../node_modules/crypto-js/sha384.js","../../../node_modules/crypto-js/sha3.js","../../../node_modules/crypto-js/ripemd160.js","../../../node_modules/crypto-js/hmac.js","../../../node_modules/crypto-js/pbkdf2.js","../../../node_modules/crypto-js/evpkdf.js","../../../node_modules/crypto-js/cipher-core.js","../../../node_modules/crypto-js/mode-cfb.js","../../../node_modules/crypto-js/mode-ctr.js","../../../node_modules/crypto-js/mode-ctr-gladman.js","../../../node_modules/crypto-js/mode-ofb.js","../../../node_modules/crypto-js/mode-ecb.js","../../../node_modules/crypto-js/pad-ansix923.js","../../../node_modules/crypto-js/pad-iso10126.js","../../../node_modules/crypto-js/pad-iso97971.js","../../../node_modules/crypto-js/pad-zeropadding.js","../../../node_modules/crypto-js/pad-nopadding.js","../../../node_modules/crypto-js/format-hex.js","../../../node_modules/crypto-js/aes.js","../../../node_modules/crypto-js/tripledes.js","../../../node_modules/crypto-js/rc4.js","../../../node_modules/crypto-js/rabbit.js","../../../node_modules/crypto-js/rabbit-legacy.js","../../../node_modules/crypto-js/blowfish.js","../../../node_modules/crypto-js/index.js","../src/services/debugLogger.ts","../src/services/api.ts","../src/services/nativeAuth.ts","../src/services/mobilePassword.ts","../src/hooks/useMobilePassword.ts","../src/logo/favicon.png","../src/components/PasswordRecoveryModal.tsx","../src/hooks/useTokenHealthCheck.ts","../src/hooks/useNativeAuth.ts","../src/components/LoginModal.tsx","../src/utils/countries.ts","../src/components/PhoneInput.tsx","../src/components/AppsLogoSlider.tsx","../src/services/mobileRegistration.ts","../src/hooks/useMobileRegistration.ts","../src/components/SignupModal.tsx","../src/services/profileChange.ts","../src/components/AvatarCropModal.tsx","../src/services/profileMedia.ts","../src/services/profile.ts","../src/components/OnboardingModal.tsx","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/external-link.js","../../../node_modules/lucide-react/dist/esm/icons/loader-circle.js","../../../node_modules/lucide-react/dist/esm/icons/lock-keyhole.js","../../../node_modules/lucide-react/dist/esm/icons/shield-check.js","../src/components/PasswordRedirectModal.tsx","../src/components/DebugPanel.tsx","../src/logo/ollaid.png","../src/components/NativeSSOPage.tsx","../src/provider.tsx","../src/hooks/useLogout.ts","../src/services/iamAccount.ts"],"sourcesContent":["/**\n * Embedded UI primitives for @ollaid/native-sso\n * Lightweight replacements for shadcn/ui components + inline SVG icons\n * No external dependencies required\n * \n * @version 2.7.9\n */\n\nimport React, { forwardRef, createContext, useContext, useEffect } from 'react';\n\n// ============================================\n// SVG Icons (inline, no lucide dependency)\n// ============================================\n\nconst iconProps = { width: '100%', height: '100%', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round' as const, strokeLinejoin: 'round' as const };\n\nexport function IconShieldCheck(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n      <path d=\"m9 12 2 2 4-4\" />\n    </svg>\n  );\n}\n\nexport function IconMail(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n      <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n    </svg>\n  );\n}\n\nexport function IconPhone(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\" />\n    </svg>\n  );\n}\n\nexport function IconLock(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n      <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n    </svg>\n  );\n}\n\nexport function IconKeyRound(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\" />\n      <circle cx=\"16.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\n    </svg>\n  );\n}\n\nexport function IconLink(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M10 13a5 5 0 0 0 7.07 0l2.12-2.12a5 5 0 1 0-7.07-7.07L11 4.93\" />\n      <path d=\"M14 11a5 5 0 0 0-7.07 0L4.8 13.12a5 5 0 1 0 7.07 7.07L13 19.07\" />\n    </svg>\n  );\n}\n\nexport function BrandLinkRow({\n  icon,\n  faviconSrc,\n  faviconAlt = 'Ollaid SSO',\n  iconBg = '#f3f4f6',\n  iconColor = '#002147',\n}: {\n  icon: React.ReactNode;\n  faviconSrc: string;\n  faviconAlt?: string;\n  iconBg?: string;\n  iconColor?: string;\n}) {\n  return (\n    <div style={{\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: '0.65rem',\n      marginBottom: '0.9rem',\n    }}>\n      <div style={{\n        width: '2.9rem',\n        height: '2.9rem',\n        borderRadius: '9999px',\n        backgroundColor: iconBg,\n        border: '1px solid #e5e7eb',\n        boxShadow: '0 8px 18px rgba(0, 0, 0, 0.08)',\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        padding: '0.5rem',\n        boxSizing: 'border-box',\n        overflow: 'hidden',\n        flexShrink: 0,\n        color: iconColor,\n      }}>\n        {icon}\n      </div>\n      <div style={{\n        width: '2.1rem',\n        height: '2.1rem',\n        borderRadius: '9999px',\n        backgroundColor: '#f3f4f6',\n        border: '1px solid #e5e7eb',\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        flexShrink: 0,\n        boxShadow: '0 4px 10px rgba(0, 0, 0, 0.05)',\n      }} aria-hidden=\"true\">\n        <IconLink style={{ width: '1rem', height: '1rem', color: '#6b7280' }} />\n      </div>\n      <div style={{\n        width: '2.9rem',\n        height: '2.9rem',\n        borderRadius: '9999px',\n        backgroundColor: '#ffffff',\n        border: '1px solid #e5e7eb',\n        boxShadow: '0 8px 18px rgba(0, 0, 0, 0.08)',\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        padding: '0.5rem',\n        boxSizing: 'border-box',\n        overflow: 'hidden',\n        flexShrink: 0,\n      }}>\n        <img src={faviconSrc} alt={faviconAlt} style={{ width: '100%', height: '100%', objectFit: 'contain' }} />\n      </div>\n    </div>\n  );\n}\n\nexport function IconArrowLeft(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"m12 19-7-7 7-7\" />\n      <path d=\"M19 12H5\" />\n    </svg>\n  );\n}\n\nexport function IconEye(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n      <circle cx=\"12\" cy=\"12\" r=\"3\" />\n    </svg>\n  );\n}\n\nexport function IconEyeOff(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n      <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n      <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n      <path d=\"m2 2 20 20\" />\n    </svg>\n  );\n}\n\nexport function IconCheckCircle2(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <circle cx=\"12\" cy=\"12\" r=\"10\" />\n      <path d=\"m9 12 2 2 4-4\" />\n    </svg>\n  );\n}\n\nexport function IconLoader2(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props} style={{ animation: 'spin 1s linear infinite', ...(props.style || {}) }}>\n      <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n    </svg>\n  );\n}\n\nexport function IconAlertTriangle(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n      <path d=\"M12 9v4\" />\n      <path d=\"M12 17h.01\" />\n    </svg>\n  );\n}\n\nexport function IconSmartphone(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <rect width=\"14\" height=\"20\" x=\"5\" y=\"2\" rx=\"2\" ry=\"2\" />\n      <path d=\"M12 18h.01\" />\n    </svg>\n  );\n}\n\nexport function IconHome(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\" />\n      <path d=\"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n    </svg>\n  );\n}\n\nexport function IconCalendar(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M8 2v4\" /><path d=\"M16 2v4\" />\n      <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\n      <path d=\"M3 10h18\" />\n    </svg>\n  );\n}\n\nexport function IconBell(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\" />\n      <path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\" />\n    </svg>\n  );\n}\n\nexport function IconMessageCircle(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22z\" />\n    </svg>\n  );\n}\n\nexport function IconUsers(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n      <circle cx=\"9\" cy=\"7\" r=\"4\" />\n      <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n      <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n    </svg>\n  );\n}\n\nexport function IconSettings(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n      <circle cx=\"12\" cy=\"12\" r=\"3\" />\n    </svg>\n  );\n}\n\nexport function IconGlobe(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg {...iconProps} {...props}>\n      <circle cx=\"12\" cy=\"12\" r=\"10\" />\n      <path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\" />\n      <path d=\"M2 12h20\" />\n    </svg>\n  );\n}\n\n// ============================================\n// Dialog\n// ============================================\n\ninterface DialogContextValue {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n}\n\nconst DialogContext = createContext<DialogContextValue>({ open: false, onOpenChange: () => {} });\n\nexport function Dialog({ open, onOpenChange, children }: { open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }) {\n  useEffect(() => {\n    if (open) {\n      document.body.style.overflow = 'hidden';\n    } else {\n      document.body.style.overflow = '';\n    }\n    return () => { document.body.style.overflow = ''; };\n  }, [open]);\n\n  if (!open) return null;\n\n  return (\n    <DialogContext.Provider value={{ open, onOpenChange }}>\n      {children}\n    </DialogContext.Provider>\n  );\n}\n\nexport function DialogContent({ children, className = '', style, hideCloseButton = false }: { children: React.ReactNode; className?: string; style?: React.CSSProperties; hideCloseButton?: boolean }) {\n  const { onOpenChange } = useContext(DialogContext);\n\n  return (\n    <div style={{ position: 'fixed', inset: 0, zIndex: 50, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n      <div \n        style={{ \n          position: 'fixed', inset: 0, \n          backgroundColor: 'rgba(0,0,0,0.5)', \n          backdropFilter: 'blur(4px)',\n          animation: 'ollaid-overlay-in 0.25s ease-out',\n        }}\n      />\n      <div \n        className={className}\n        style={{ \n          position: 'relative', zIndex: 51, width: '100%', maxWidth: '28rem', \n          margin: '1rem', padding: '1rem', borderRadius: '0.75rem',\n          backgroundColor: 'white', boxShadow: '0 25px 50px -12px rgba(0,0,0,0.25)',\n          maxHeight: '90vh',\n          display: 'flex', flexDirection: 'column',\n          animation: 'ollaid-modal-in 0.3s ease-out',\n          ...style,\n        }}\n      >\n        {!hideCloseButton && (\n          <button\n            onClick={() => onOpenChange(false)}\n            style={{ position: 'absolute', right: '0.75rem', top: '0.75rem', background: 'none', border: 'none', cursor: 'pointer', fontSize: '1.25rem', color: '#9ca3af', lineHeight: 1, zIndex: 2 }}\n            aria-label=\"Close\"\n          >\n            ✕\n          </button>\n        )}\n        {children}\n      </div>\n    </div>\n  );\n}\n\nexport function DialogBody({ children, className = '', style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n  return (\n    <div className={className} style={{ flex: 1, overflowY: 'auto', paddingBottom: '0.5rem', minHeight: 0, ...style }}>\n      {children}\n    </div>\n  );\n}\n\nexport function DialogFooter({ children, className = '', style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n  return (\n    <div className={className} style={{ flexShrink: 0, paddingTop: '0.75rem', borderTop: '1px solid #e5e7eb', display: 'flex', flexDirection: 'column', gap: '0.5rem', ...style }}>\n      {children}\n    </div>\n  );\n}\n\nexport function DialogHeader({ children, className = '', style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n  return <div className={className} style={{ marginBottom: '0.5rem', flexShrink: 0, ...style }}>{children}</div>;\n}\n\nexport function DialogTitle({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n  return <h2 className={className} style={{ fontSize: '1.25rem', fontWeight: 600, color: '#111827' }}>{children}</h2>;\n}\n\nexport function DialogDescription({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n  return <p className={className} style={{ fontSize: '0.875rem', color: '#6b7280', marginTop: '0.25rem' }}>{children}</p>;\n}\n\n// ============================================\n// Button\n// ============================================\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  variant?: 'default' | 'outline' | 'ghost';\n  size?: 'default' | 'sm' | 'lg';\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(({ \n  variant = 'default', size = 'default', className = '', style, disabled, children, ...props \n}, ref) => {\n  const baseStyle: React.CSSProperties = {\n    display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n    borderRadius: '0.5rem', fontWeight: 500, cursor: disabled ? 'not-allowed' : 'pointer',\n    transition: 'all 0.15s', border: 'none', opacity: disabled ? 0.5 : 1,\n    fontSize: size === 'sm' ? '0.875rem' : '0.9375rem',\n    padding: size === 'sm' ? '0.375rem 0.75rem' : size === 'lg' ? '0.75rem 1.5rem' : '0.625rem 1rem',\n    height: size === 'sm' ? '2rem' : size === 'lg' ? '3rem' : '2.5rem',\n    ...(variant === 'default' ? { backgroundColor: '#002147', color: 'white' } : {}),\n    ...(variant === 'outline' ? { backgroundColor: 'transparent', border: '1px solid #d1d5db', color: '#374151' } : {}),\n    ...(variant === 'ghost' ? { backgroundColor: 'transparent', color: '#374151' } : {}),\n    ...style,\n  };\n\n  return (\n    <button ref={ref} className={className} style={baseStyle} disabled={disabled} {...props}>\n      {children}\n    </button>\n  );\n});\nButton.displayName = 'Button';\n\n// ============================================\n// Input\n// ============================================\n\nexport const Input = forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement> & { className?: string }>(\n  ({ className = '', style, ...props }, ref) => {\n    return (\n      <input\n        ref={ref}\n        className={className}\n        style={{\n          width: '100%', padding: '0.5rem 0.75rem', borderRadius: '0.375rem',\n          border: '1px solid #d1d5db', fontSize: '0.9375rem', outline: 'none',\n          transition: 'border-color 0.15s', backgroundColor: '#f9fafb', color: '#111827',\n          ...style,\n        }}\n        {...props}\n      />\n    );\n  }\n);\nInput.displayName = 'Input';\n\n// ============================================\n// Label\n// ============================================\n\nexport const Label = forwardRef<HTMLLabelElement, React.LabelHTMLAttributes<HTMLLabelElement>>(\n  ({ className = '', style, ...props }, ref) => {\n    return (\n      <label\n        ref={ref}\n        className={className}\n        style={{ fontSize: '0.875rem', fontWeight: 500, color: '#374151', ...style }}\n        {...props}\n      />\n    );\n  }\n);\nLabel.displayName = 'Label';\n\n// ============================================\n// RadioGroup (simplified)\n// ============================================\n\ninterface RadioGroupProps {\n  value: string;\n  onValueChange: (value: string) => void;\n  children: React.ReactNode;\n  className?: string;\n}\n\nconst RadioGroupContext = createContext<{ value: string; onValueChange: (v: string) => void }>({ value: '', onValueChange: () => {} });\n\nexport function RadioGroup({ value, onValueChange, children, className = '' }: RadioGroupProps) {\n  return (\n    <RadioGroupContext.Provider value={{ value, onValueChange }}>\n      <div className={className}>{children}</div>\n    </RadioGroupContext.Provider>\n  );\n}\n\nexport function RadioGroupItem({ value, id }: { value: string; id: string }) {\n  const { value: groupValue, onValueChange } = useContext(RadioGroupContext);\n  return (\n    <input\n      type=\"radio\"\n      id={id}\n      checked={groupValue === value}\n      onChange={() => onValueChange(value)}\n      style={{ width: '1rem', height: '1rem', accentColor: '#002147' }}\n    />\n  );\n}\n\n// Global keyframes for spinner\nif (typeof document !== 'undefined') {\n  const styleId = 'ollaid-sso-keyframes';\n  if (!document.getElementById(styleId)) {\n    const style = document.createElement('style');\n    style.id = styleId;\n    style.textContent = `@keyframes spin { to { transform: rotate(360deg); } } @keyframes ollaid-overlay-in { from { opacity: 0; } to { opacity: 1; } } @keyframes ollaid-modal-in { from { opacity: 0; transform: translateY(20px) scale(0.97); } to { opacity: 1; transform: translateY(0) scale(1); } }`;\n    document.head.appendChild(style);\n  }\n}\n","/**\n * OTP Input component for @ollaid/native-sso\n */\n\nimport { useRef, useState, useEffect, KeyboardEvent, ClipboardEvent } from 'react';\n\ninterface OTPInputProps {\n  length?: 6 | 8;\n  value: string;\n  onChange: (value: string) => void;\n  onComplete?: (value: string) => void;\n  disabled?: boolean;\n  autoFocus?: boolean;\n}\n\nexport function OTPInput({\n  length = 6, value, onChange, onComplete, disabled = false, autoFocus = true,\n}: OTPInputProps) {\n  const safeLength = Number.isFinite(length) ? Math.max(1, Math.min(12, Math.trunc(length))) : 6;\n  const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n  const [activeIndex, setActiveIndex] = useState(0);\n\n  useEffect(() => { inputRefs.current = inputRefs.current.slice(0, safeLength); }, [safeLength]);\n\n  useEffect(() => {\n    if (autoFocus && inputRefs.current[0]) inputRefs.current[0].focus();\n  }, [autoFocus]);\n\n  useEffect(() => {\n    if (value.length === safeLength && onComplete) onComplete(value);\n  }, [value, safeLength, onComplete]);\n\n  const handleChange = (index: number, char: string) => {\n    if (disabled) return;\n    const digit = char.replace(/[^0-9]/g, '');\n    if (!digit) return;\n    const newValue = value.split('');\n    newValue[index] = digit;\n    onChange(newValue.join('').slice(0, safeLength));\n    if (index < safeLength - 1) {\n      inputRefs.current[index + 1]?.focus();\n      setActiveIndex(index + 1);\n    }\n  };\n\n  const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n    if (disabled) return;\n    if (e.key === 'Backspace') {\n      e.preventDefault();\n      const newValue = value.split('');\n      if (value[index]) {\n        newValue[index] = '';\n        onChange(newValue.join(''));\n      } else if (index > 0) {\n        newValue[index - 1] = '';\n        onChange(newValue.join(''));\n        inputRefs.current[index - 1]?.focus();\n        setActiveIndex(index - 1);\n      }\n    } else if (e.key === 'ArrowLeft' && index > 0) {\n      inputRefs.current[index - 1]?.focus();\n      setActiveIndex(index - 1);\n    } else if (e.key === 'ArrowRight' && index < safeLength - 1) {\n      inputRefs.current[index + 1]?.focus();\n      setActiveIndex(index + 1);\n    }\n  };\n\n  const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n    if (disabled) return;\n    e.preventDefault();\n    const pasted = e.clipboardData.getData('text').replace(/[^0-9]/g, '');\n    if (pasted) {\n      const newValue = pasted.slice(0, safeLength);\n      onChange(newValue);\n      const focusIndex = Math.min(newValue.length, safeLength - 1);\n      inputRefs.current[focusIndex]?.focus();\n      setActiveIndex(focusIndex);\n    }\n  };\n\n  return (\n    <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem' }}>\n      {Array.from({ length: safeLength }).map((_, index) => (\n        <input\n          key={index}\n          ref={(el) => (inputRefs.current[index] = el)}\n          type=\"text\"\n          inputMode=\"numeric\"\n          maxLength={1}\n          value={value[index] || ''}\n          onChange={(e) => handleChange(index, e.target.value)}\n          onKeyDown={(e) => handleKeyDown(index, e)}\n          onPaste={handlePaste}\n          onFocus={() => setActiveIndex(index)}\n          disabled={disabled}\n          aria-label={`Digit ${index + 1}`}\n          style={{\n            width: '2.5rem', height: '3rem', textAlign: 'center', fontSize: '1.25rem',\n            fontWeight: 600, borderRadius: '0.375rem', border: '2px solid',\n            borderColor: activeIndex === index && !disabled ? 'hsl(var(--primary, 222 47% 11%))' : value[index] ? 'hsl(var(--primary, 222 47% 11%) / 0.5)' : '#d1d5db',\n            backgroundColor: value[index] ? 'hsl(var(--primary, 222 47% 11%) / 0.05)' : 'white',\n            outline: 'none', transition: 'all 0.2s',\n            opacity: disabled ? 0.5 : 1, cursor: disabled ? 'not-allowed' : 'text',\n          }}\n        />\n      ))}\n    </div>\n  );\n}\n\nexport default OTPInput;\n","export default {}",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/*globals window, global, require*/\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\n\t    var crypto;\n\n\t    // Native crypto from window (Browser)\n\t    if (typeof window !== 'undefined' && window.crypto) {\n\t        crypto = window.crypto;\n\t    }\n\n\t    // Native crypto in web worker (Browser)\n\t    if (typeof self !== 'undefined' && self.crypto) {\n\t        crypto = self.crypto;\n\t    }\n\n\t    // Native crypto from worker\n\t    if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n\t        crypto = globalThis.crypto;\n\t    }\n\n\t    // Native (experimental IE 11) crypto from window (Browser)\n\t    if (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n\t        crypto = window.msCrypto;\n\t    }\n\n\t    // Native crypto from global (NodeJS)\n\t    if (!crypto && typeof global !== 'undefined' && global.crypto) {\n\t        crypto = global.crypto;\n\t    }\n\n\t    // Native crypto import via require (NodeJS)\n\t    if (!crypto && typeof require === 'function') {\n\t        try {\n\t            crypto = require('crypto');\n\t        } catch (err) {}\n\t    }\n\n\t    /*\n\t     * Cryptographically secure pseudorandom number generator\n\t     *\n\t     * As Math.random() is cryptographically not safe to use\n\t     */\n\t    var cryptoSecureRandomInt = function () {\n\t        if (crypto) {\n\t            // Use getRandomValues method (Browser)\n\t            if (typeof crypto.getRandomValues === 'function') {\n\t                try {\n\t                    return crypto.getRandomValues(new Uint32Array(1))[0];\n\t                } catch (err) {}\n\t            }\n\n\t            // Use randomBytes method (NodeJS)\n\t            if (typeof crypto.randomBytes === 'function') {\n\t                try {\n\t                    return crypto.randomBytes(4).readInt32LE();\n\t                } catch (err) {}\n\t            }\n\t        }\n\n\t        throw new Error('Native crypto module could not be used to get secure random number.');\n\t    };\n\n\t    /*\n\t     * Local polyfill of Object.create\n\n\t     */\n\t    var create = Object.create || (function () {\n\t        function F() {}\n\n\t        return function (obj) {\n\t            var subtype;\n\n\t            F.prototype = obj;\n\n\t            subtype = new F();\n\n\t            F.prototype = null;\n\n\t            return subtype;\n\t        };\n\t    }());\n\n\t    /**\n\t     * CryptoJS namespace.\n\t     */\n\t    var C = {};\n\n\t    /**\n\t     * Library namespace.\n\t     */\n\t    var C_lib = C.lib = {};\n\n\t    /**\n\t     * Base object for prototypal inheritance.\n\t     */\n\t    var Base = C_lib.Base = (function () {\n\n\n\t        return {\n\t            /**\n\t             * Creates a new object that inherits from this object.\n\t             *\n\t             * @param {Object} overrides Properties to copy into the new object.\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         field: 'value',\n\t             *\n\t             *         method: function () {\n\t             *         }\n\t             *     });\n\t             */\n\t            extend: function (overrides) {\n\t                // Spawn\n\t                var subtype = create(this);\n\n\t                // Augment\n\t                if (overrides) {\n\t                    subtype.mixIn(overrides);\n\t                }\n\n\t                // Create default initializer\n\t                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t                    subtype.init = function () {\n\t                        subtype.$super.init.apply(this, arguments);\n\t                    };\n\t                }\n\n\t                // Initializer's prototype is the subtype object\n\t                subtype.init.prototype = subtype;\n\n\t                // Reference supertype\n\t                subtype.$super = this;\n\n\t                return subtype;\n\t            },\n\n\t            /**\n\t             * Extends this object and runs the init method.\n\t             * Arguments to create() will be passed to init().\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var instance = MyType.create();\n\t             */\n\t            create: function () {\n\t                var instance = this.extend();\n\t                instance.init.apply(instance, arguments);\n\n\t                return instance;\n\t            },\n\n\t            /**\n\t             * Initializes a newly created object.\n\t             * Override this method to add some logic when your objects are created.\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         init: function () {\n\t             *             // ...\n\t             *         }\n\t             *     });\n\t             */\n\t            init: function () {\n\t            },\n\n\t            /**\n\t             * Copies properties into this object.\n\t             *\n\t             * @param {Object} properties The properties to mix in.\n\t             *\n\t             * @example\n\t             *\n\t             *     MyType.mixIn({\n\t             *         field: 'value'\n\t             *     });\n\t             */\n\t            mixIn: function (properties) {\n\t                for (var propertyName in properties) {\n\t                    if (properties.hasOwnProperty(propertyName)) {\n\t                        this[propertyName] = properties[propertyName];\n\t                    }\n\t                }\n\n\t                // IE won't copy toString using the loop above\n\t                if (properties.hasOwnProperty('toString')) {\n\t                    this.toString = properties.toString;\n\t                }\n\t            },\n\n\t            /**\n\t             * Creates a copy of this object.\n\t             *\n\t             * @return {Object} The clone.\n\t             *\n\t             * @example\n\t             *\n\t             *     var clone = instance.clone();\n\t             */\n\t            clone: function () {\n\t                return this.init.prototype.extend(this);\n\t            }\n\t        };\n\t    }());\n\n\t    /**\n\t     * An array of 32-bit words.\n\t     *\n\t     * @property {Array} words The array of 32-bit words.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var WordArray = C_lib.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of 32-bit words.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.create();\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 4;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this word array to a string.\n\t         *\n\t         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t         *\n\t         * @return {string} The stringified word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = wordArray + '';\n\t         *     var string = wordArray.toString();\n\t         *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t         */\n\t        toString: function (encoder) {\n\t            return (encoder || Hex).stringify(this);\n\t        },\n\n\t        /**\n\t         * Concatenates a word array to this word array.\n\t         *\n\t         * @param {WordArray} wordArray The word array to append.\n\t         *\n\t         * @return {WordArray} This word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray1.concat(wordArray2);\n\t         */\n\t        concat: function (wordArray) {\n\t            // Shortcuts\n\t            var thisWords = this.words;\n\t            var thatWords = wordArray.words;\n\t            var thisSigBytes = this.sigBytes;\n\t            var thatSigBytes = wordArray.sigBytes;\n\n\t            // Clamp excess bits\n\t            this.clamp();\n\n\t            // Concat\n\t            if (thisSigBytes % 4) {\n\t                // Copy one byte at a time\n\t                for (var i = 0; i < thatSigBytes; i++) {\n\t                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t                }\n\t            } else {\n\t                // Copy one word at a time\n\t                for (var j = 0; j < thatSigBytes; j += 4) {\n\t                    thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];\n\t                }\n\t            }\n\t            this.sigBytes += thatSigBytes;\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Removes insignificant bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray.clamp();\n\t         */\n\t        clamp: function () {\n\t            // Shortcuts\n\t            var words = this.words;\n\t            var sigBytes = this.sigBytes;\n\n\t            // Clamp\n\t            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t            words.length = Math.ceil(sigBytes / 4);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = wordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone.words = this.words.slice(0);\n\n\t            return clone;\n\t        },\n\n\t        /**\n\t         * Creates a word array filled with random bytes.\n\t         *\n\t         * @param {number} nBytes The number of random bytes to generate.\n\t         *\n\t         * @return {WordArray} The random word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.random(16);\n\t         */\n\t        random: function (nBytes) {\n\t            var words = [];\n\n\t            for (var i = 0; i < nBytes; i += 4) {\n\t                words.push(cryptoSecureRandomInt());\n\t            }\n\n\t            return new WordArray.init(words, nBytes);\n\t        }\n\t    });\n\n\t    /**\n\t     * Encoder namespace.\n\t     */\n\t    var C_enc = C.enc = {};\n\n\t    /**\n\t     * Hex encoding strategy.\n\t     */\n\t    var Hex = C_enc.Hex = {\n\t        /**\n\t         * Converts a word array to a hex string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The hex string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var hexChars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                hexChars.push((bite >>> 4).toString(16));\n\t                hexChars.push((bite & 0x0f).toString(16));\n\t            }\n\n\t            return hexChars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a hex string to a word array.\n\t         *\n\t         * @param {string} hexStr The hex string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t         */\n\t        parse: function (hexStr) {\n\t            // Shortcut\n\t            var hexStrLength = hexStr.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < hexStrLength; i += 2) {\n\t                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t            }\n\n\t            return new WordArray.init(words, hexStrLength / 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * Latin1 encoding strategy.\n\t     */\n\t    var Latin1 = C_enc.Latin1 = {\n\t        /**\n\t         * Converts a word array to a Latin1 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Latin1 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var latin1Chars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                latin1Chars.push(String.fromCharCode(bite));\n\t            }\n\n\t            return latin1Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Latin1 string to a word array.\n\t         *\n\t         * @param {string} latin1Str The Latin1 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t         */\n\t        parse: function (latin1Str) {\n\t            // Shortcut\n\t            var latin1StrLength = latin1Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < latin1StrLength; i++) {\n\t                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t            }\n\n\t            return new WordArray.init(words, latin1StrLength);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-8 encoding strategy.\n\t     */\n\t    var Utf8 = C_enc.Utf8 = {\n\t        /**\n\t         * Converts a word array to a UTF-8 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-8 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            try {\n\t                return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t            } catch (e) {\n\t                throw new Error('Malformed UTF-8 data');\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts a UTF-8 string to a word array.\n\t         *\n\t         * @param {string} utf8Str The UTF-8 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t         */\n\t        parse: function (utf8Str) {\n\t            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract buffered block algorithm template.\n\t     *\n\t     * The property blockSize must be implemented in a concrete subtype.\n\t     *\n\t     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t     */\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t        /**\n\t         * Resets this block algorithm's data buffer to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm.reset();\n\t         */\n\t        reset: function () {\n\t            // Initial values\n\t            this._data = new WordArray.init();\n\t            this._nDataBytes = 0;\n\t        },\n\n\t        /**\n\t         * Adds new data to this block algorithm's buffer.\n\t         *\n\t         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm._append('data');\n\t         *     bufferedBlockAlgorithm._append(wordArray);\n\t         */\n\t        _append: function (data) {\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof data == 'string') {\n\t                data = Utf8.parse(data);\n\t            }\n\n\t            // Append\n\t            this._data.concat(data);\n\t            this._nDataBytes += data.sigBytes;\n\t        },\n\n\t        /**\n\t         * Processes available data blocks.\n\t         *\n\t         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t         *\n\t         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t         *\n\t         * @return {WordArray} The processed data.\n\t         *\n\t         * @example\n\t         *\n\t         *     var processedData = bufferedBlockAlgorithm._process();\n\t         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t         */\n\t        _process: function (doFlush) {\n\t            var processedWords;\n\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var dataSigBytes = data.sigBytes;\n\t            var blockSize = this.blockSize;\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count blocks ready\n\t            var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t            if (doFlush) {\n\t                // Round up to include partial blocks\n\t                nBlocksReady = Math.ceil(nBlocksReady);\n\t            } else {\n\t                // Round down to include only full blocks,\n\t                // less the number of blocks that must remain in the buffer\n\t                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t            }\n\n\t            // Count words ready\n\t            var nWordsReady = nBlocksReady * blockSize;\n\n\t            // Count bytes ready\n\t            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t            // Process blocks\n\t            if (nWordsReady) {\n\t                for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t                    // Perform concrete-algorithm logic\n\t                    this._doProcessBlock(dataWords, offset);\n\t                }\n\n\t                // Remove processed words\n\t                processedWords = dataWords.splice(0, nWordsReady);\n\t                data.sigBytes -= nBytesReady;\n\t            }\n\n\t            // Return processed words\n\t            return new WordArray.init(processedWords, nBytesReady);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this object.\n\t         *\n\t         * @return {Object} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = bufferedBlockAlgorithm.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone._data = this._data.clone();\n\n\t            return clone;\n\t        },\n\n\t        _minBufferSize: 0\n\t    });\n\n\t    /**\n\t     * Abstract hasher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t     */\n\t    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Initializes a newly created hasher.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hasher = CryptoJS.algo.SHA256.create();\n\t         */\n\t        init: function (cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this hasher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-hasher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Updates this hasher with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {Hasher} This hasher.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.update('message');\n\t         *     hasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            // Append\n\t            this._append(messageUpdate);\n\n\t            // Update the hash\n\t            this._process();\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the hash computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The hash.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hash = hasher.finalize();\n\t         *     var hash = hasher.finalize('message');\n\t         *     var hash = hasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Final message update\n\t            if (messageUpdate) {\n\t                this._append(messageUpdate);\n\t            }\n\n\t            // Perform concrete-hasher logic\n\t            var hash = this._doFinalize();\n\n\t            return hash;\n\t        },\n\n\t        blockSize: 512/32,\n\n\t        /**\n\t         * Creates a shortcut function to a hasher's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to create a helper for.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHelper: function (hasher) {\n\t            return function (message, cfg) {\n\t                return new hasher.init(cfg).finalize(message);\n\t            };\n\t        },\n\n\t        /**\n\t         * Creates a shortcut function to the HMAC's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHmacHelper: function (hasher) {\n\t            return function (message, key) {\n\t                return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t            };\n\t        }\n\t    });\n\n\t    /**\n\t     * Algorithm namespace.\n\t     */\n\t    var C_algo = C.algo = {};\n\n\t    return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var X32WordArray = C_lib.WordArray;\n\n\t    /**\n\t     * x64 namespace.\n\t     */\n\t    var C_x64 = C.x64 = {};\n\n\t    /**\n\t     * A 64-bit word.\n\t     */\n\t    var X64Word = C_x64.Word = Base.extend({\n\t        /**\n\t         * Initializes a newly created 64-bit word.\n\t         *\n\t         * @param {number} high The high 32 bits.\n\t         * @param {number} low The low 32 bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t         */\n\t        init: function (high, low) {\n\t            this.high = high;\n\t            this.low = low;\n\t        }\n\n\t        /**\n\t         * Bitwise NOTs this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after negating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var negated = x64Word.not();\n\t         */\n\t        // not: function () {\n\t            // var high = ~this.high;\n\t            // var low = ~this.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise ANDs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to AND with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after ANDing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var anded = x64Word.and(anotherX64Word);\n\t         */\n\t        // and: function (word) {\n\t            // var high = this.high & word.high;\n\t            // var low = this.low & word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise ORs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to OR with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after ORing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var ored = x64Word.or(anotherX64Word);\n\t         */\n\t        // or: function (word) {\n\t            // var high = this.high | word.high;\n\t            // var low = this.low | word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise XORs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to XOR with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after XORing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var xored = x64Word.xor(anotherX64Word);\n\t         */\n\t        // xor: function (word) {\n\t            // var high = this.high ^ word.high;\n\t            // var low = this.low ^ word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Shifts this word n bits to the left.\n\t         *\n\t         * @param {number} n The number of bits to shift.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after shifting.\n\t         *\n\t         * @example\n\t         *\n\t         *     var shifted = x64Word.shiftL(25);\n\t         */\n\t        // shiftL: function (n) {\n\t            // if (n < 32) {\n\t                // var high = (this.high << n) | (this.low >>> (32 - n));\n\t                // var low = this.low << n;\n\t            // } else {\n\t                // var high = this.low << (n - 32);\n\t                // var low = 0;\n\t            // }\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Shifts this word n bits to the right.\n\t         *\n\t         * @param {number} n The number of bits to shift.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after shifting.\n\t         *\n\t         * @example\n\t         *\n\t         *     var shifted = x64Word.shiftR(7);\n\t         */\n\t        // shiftR: function (n) {\n\t            // if (n < 32) {\n\t                // var low = (this.low >>> n) | (this.high << (32 - n));\n\t                // var high = this.high >>> n;\n\t            // } else {\n\t                // var low = this.high >>> (n - 32);\n\t                // var high = 0;\n\t            // }\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Rotates this word n bits to the left.\n\t         *\n\t         * @param {number} n The number of bits to rotate.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after rotating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var rotated = x64Word.rotL(25);\n\t         */\n\t        // rotL: function (n) {\n\t            // return this.shiftL(n).or(this.shiftR(64 - n));\n\t        // },\n\n\t        /**\n\t         * Rotates this word n bits to the right.\n\t         *\n\t         * @param {number} n The number of bits to rotate.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after rotating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var rotated = x64Word.rotR(7);\n\t         */\n\t        // rotR: function (n) {\n\t            // return this.shiftR(n).or(this.shiftL(64 - n));\n\t        // },\n\n\t        /**\n\t         * Adds this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to add with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after adding.\n\t         *\n\t         * @example\n\t         *\n\t         *     var added = x64Word.add(anotherX64Word);\n\t         */\n\t        // add: function (word) {\n\t            // var low = (this.low + word.low) | 0;\n\t            // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t            // var high = (this.high + word.high + carry) | 0;\n\n\t            // return X64Word.create(high, low);\n\t        // }\n\t    });\n\n\t    /**\n\t     * An array of 64-bit words.\n\t     *\n\t     * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var X64WordArray = C_x64.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create();\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create([\n\t         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t         *     ]);\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create([\n\t         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t         *     ], 10);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 8;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this 64-bit word array to a 32-bit word array.\n\t         *\n\t         * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var x32WordArray = x64WordArray.toX32();\n\t         */\n\t        toX32: function () {\n\t            // Shortcuts\n\t            var x64Words = this.words;\n\t            var x64WordsLength = x64Words.length;\n\n\t            // Convert\n\t            var x32Words = [];\n\t            for (var i = 0; i < x64WordsLength; i++) {\n\t                var x64Word = x64Words[i];\n\t                x32Words.push(x64Word.high);\n\t                x32Words.push(x64Word.low);\n\t            }\n\n\t            return X32WordArray.create(x32Words, this.sigBytes);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {X64WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = x64WordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\n\t            // Clone \"words\" array\n\t            var words = clone.words = this.words.slice(0);\n\n\t            // Clone each X64Word object\n\t            var wordsLength = words.length;\n\t            for (var i = 0; i < wordsLength; i++) {\n\t                words[i] = words[i].clone();\n\t            }\n\n\t            return clone;\n\t        }\n\t    });\n\t}());\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Check if typed arrays are supported\n\t    if (typeof ArrayBuffer != 'function') {\n\t        return;\n\t    }\n\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\n\t    // Reference original init\n\t    var superInit = WordArray.init;\n\n\t    // Augment WordArray.init to handle typed arrays\n\t    var subInit = WordArray.init = function (typedArray) {\n\t        // Convert buffers to uint8\n\t        if (typedArray instanceof ArrayBuffer) {\n\t            typedArray = new Uint8Array(typedArray);\n\t        }\n\n\t        // Convert other array views to uint8\n\t        if (\n\t            typedArray instanceof Int8Array ||\n\t            (typeof Uint8ClampedArray !== \"undefined\" && typedArray instanceof Uint8ClampedArray) ||\n\t            typedArray instanceof Int16Array ||\n\t            typedArray instanceof Uint16Array ||\n\t            typedArray instanceof Int32Array ||\n\t            typedArray instanceof Uint32Array ||\n\t            typedArray instanceof Float32Array ||\n\t            typedArray instanceof Float64Array\n\t        ) {\n\t            typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n\t        }\n\n\t        // Handle Uint8Array\n\t        if (typedArray instanceof Uint8Array) {\n\t            // Shortcut\n\t            var typedArrayByteLength = typedArray.byteLength;\n\n\t            // Extract bytes\n\t            var words = [];\n\t            for (var i = 0; i < typedArrayByteLength; i++) {\n\t                words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n\t            }\n\n\t            // Initialize this word array\n\t            superInit.call(this, words, typedArrayByteLength);\n\t        } else {\n\t            // Else call normal init\n\t            superInit.apply(this, arguments);\n\t        }\n\t    };\n\n\t    subInit.prototype = WordArray;\n\t}());\n\n\n\treturn CryptoJS.lib.WordArray;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * UTF-16 BE encoding strategy.\n\t     */\n\t    var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {\n\t        /**\n\t         * Converts a word array to a UTF-16 BE string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-16 BE string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var utf16Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 2) {\n\t                var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;\n\t                utf16Chars.push(String.fromCharCode(codePoint));\n\t            }\n\n\t            return utf16Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a UTF-16 BE string to a word array.\n\t         *\n\t         * @param {string} utf16Str The UTF-16 BE string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);\n\t         */\n\t        parse: function (utf16Str) {\n\t            // Shortcut\n\t            var utf16StrLength = utf16Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < utf16StrLength; i++) {\n\t                words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);\n\t            }\n\n\t            return WordArray.create(words, utf16StrLength * 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-16 LE encoding strategy.\n\t     */\n\t    C_enc.Utf16LE = {\n\t        /**\n\t         * Converts a word array to a UTF-16 LE string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-16 LE string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var utf16Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 2) {\n\t                var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);\n\t                utf16Chars.push(String.fromCharCode(codePoint));\n\t            }\n\n\t            return utf16Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a UTF-16 LE string to a word array.\n\t         *\n\t         * @param {string} utf16Str The UTF-16 LE string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);\n\t         */\n\t        parse: function (utf16Str) {\n\t            // Shortcut\n\t            var utf16StrLength = utf16Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < utf16StrLength; i++) {\n\t                words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));\n\t            }\n\n\t            return WordArray.create(words, utf16StrLength * 2);\n\t        }\n\t    };\n\n\t    function swapEndian(word) {\n\t        return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);\n\t    }\n\t}());\n\n\n\treturn CryptoJS.enc.Utf16;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * Base64 encoding strategy.\n\t     */\n\t    var Base64 = C_enc.Base64 = {\n\t        /**\n\t         * Converts a word array to a Base64 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Base64 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\t            var map = this._map;\n\n\t            // Clamp excess bits\n\t            wordArray.clamp();\n\n\t            // Convert\n\t            var base64Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 3) {\n\t                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;\n\t                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t                }\n\t            }\n\n\t            // Add padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                while (base64Chars.length % 4) {\n\t                    base64Chars.push(paddingChar);\n\t                }\n\t            }\n\n\t            return base64Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Base64 string to a word array.\n\t         *\n\t         * @param {string} base64Str The Base64 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);\n\t         */\n\t        parse: function (base64Str) {\n\t            // Shortcuts\n\t            var base64StrLength = base64Str.length;\n\t            var map = this._map;\n\t            var reverseMap = this._reverseMap;\n\n\t            if (!reverseMap) {\n\t                    reverseMap = this._reverseMap = [];\n\t                    for (var j = 0; j < map.length; j++) {\n\t                        reverseMap[map.charCodeAt(j)] = j;\n\t                    }\n\t            }\n\n\t            // Ignore padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                var paddingIndex = base64Str.indexOf(paddingChar);\n\t                if (paddingIndex !== -1) {\n\t                    base64StrLength = paddingIndex;\n\t                }\n\t            }\n\n\t            // Convert\n\t            return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t        },\n\n\t        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n\t    };\n\n\t    function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t      var words = [];\n\t      var nBytes = 0;\n\t      for (var i = 0; i < base64StrLength; i++) {\n\t          if (i % 4) {\n\t              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t              var bitsCombined = bits1 | bits2;\n\t              words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n\t              nBytes++;\n\t          }\n\t      }\n\t      return WordArray.create(words, nBytes);\n\t    }\n\t}());\n\n\n\treturn CryptoJS.enc.Base64;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * Base64url encoding strategy.\n\t     */\n\t    var Base64url = C_enc.Base64url = {\n\t        /**\n\t         * Converts a word array to a Base64url string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @param {boolean} urlSafe Whether to use url safe\n\t         *\n\t         * @return {string} The Base64url string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var base64String = CryptoJS.enc.Base64url.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray, urlSafe) {\n\t            if (urlSafe === undefined) {\n\t                urlSafe = true\n\t            }\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\t            var map = urlSafe ? this._safe_map : this._map;\n\n\t            // Clamp excess bits\n\t            wordArray.clamp();\n\n\t            // Convert\n\t            var base64Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 3) {\n\t                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;\n\t                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t                }\n\t            }\n\n\t            // Add padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                while (base64Chars.length % 4) {\n\t                    base64Chars.push(paddingChar);\n\t                }\n\t            }\n\n\t            return base64Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Base64url string to a word array.\n\t         *\n\t         * @param {string} base64Str The Base64url string.\n\t         *\n\t         * @param {boolean} urlSafe Whether to use url safe\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Base64url.parse(base64String);\n\t         */\n\t        parse: function (base64Str, urlSafe) {\n\t            if (urlSafe === undefined) {\n\t                urlSafe = true\n\t            }\n\n\t            // Shortcuts\n\t            var base64StrLength = base64Str.length;\n\t            var map = urlSafe ? this._safe_map : this._map;\n\t            var reverseMap = this._reverseMap;\n\n\t            if (!reverseMap) {\n\t                reverseMap = this._reverseMap = [];\n\t                for (var j = 0; j < map.length; j++) {\n\t                    reverseMap[map.charCodeAt(j)] = j;\n\t                }\n\t            }\n\n\t            // Ignore padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                var paddingIndex = base64Str.indexOf(paddingChar);\n\t                if (paddingIndex !== -1) {\n\t                    base64StrLength = paddingIndex;\n\t                }\n\t            }\n\n\t            // Convert\n\t            return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t        },\n\n\t        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n\t        _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n\t    };\n\n\t    function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t        var words = [];\n\t        var nBytes = 0;\n\t        for (var i = 0; i < base64StrLength; i++) {\n\t            if (i % 4) {\n\t                var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t                var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t                var bitsCombined = bits1 | bits2;\n\t                words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n\t                nBytes++;\n\t            }\n\t        }\n\t        return WordArray.create(words, nBytes);\n\t    }\n\t}());\n\n\n\treturn CryptoJS.enc.Base64url;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Constants table\n\t    var T = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        for (var i = 0; i < 64; i++) {\n\t            T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n\t        }\n\t    }());\n\n\t    /**\n\t     * MD5 hash algorithm.\n\t     */\n\t    var MD5 = C_algo.MD5 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0x67452301, 0xefcdab89,\n\t                0x98badcfe, 0x10325476\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Swap endian\n\t            for (var i = 0; i < 16; i++) {\n\t                // Shortcuts\n\t                var offset_i = offset + i;\n\t                var M_offset_i = M[offset_i];\n\n\t                M[offset_i] = (\n\t                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)\n\t                );\n\t            }\n\n\t            // Shortcuts\n\t            var H = this._hash.words;\n\n\t            var M_offset_0  = M[offset + 0];\n\t            var M_offset_1  = M[offset + 1];\n\t            var M_offset_2  = M[offset + 2];\n\t            var M_offset_3  = M[offset + 3];\n\t            var M_offset_4  = M[offset + 4];\n\t            var M_offset_5  = M[offset + 5];\n\t            var M_offset_6  = M[offset + 6];\n\t            var M_offset_7  = M[offset + 7];\n\t            var M_offset_8  = M[offset + 8];\n\t            var M_offset_9  = M[offset + 9];\n\t            var M_offset_10 = M[offset + 10];\n\t            var M_offset_11 = M[offset + 11];\n\t            var M_offset_12 = M[offset + 12];\n\t            var M_offset_13 = M[offset + 13];\n\t            var M_offset_14 = M[offset + 14];\n\t            var M_offset_15 = M[offset + 15];\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\n\t            // Computation\n\t            a = FF(a, b, c, d, M_offset_0,  7,  T[0]);\n\t            d = FF(d, a, b, c, M_offset_1,  12, T[1]);\n\t            c = FF(c, d, a, b, M_offset_2,  17, T[2]);\n\t            b = FF(b, c, d, a, M_offset_3,  22, T[3]);\n\t            a = FF(a, b, c, d, M_offset_4,  7,  T[4]);\n\t            d = FF(d, a, b, c, M_offset_5,  12, T[5]);\n\t            c = FF(c, d, a, b, M_offset_6,  17, T[6]);\n\t            b = FF(b, c, d, a, M_offset_7,  22, T[7]);\n\t            a = FF(a, b, c, d, M_offset_8,  7,  T[8]);\n\t            d = FF(d, a, b, c, M_offset_9,  12, T[9]);\n\t            c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n\t            b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n\t            a = FF(a, b, c, d, M_offset_12, 7,  T[12]);\n\t            d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n\t            c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n\t            b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n\t            a = GG(a, b, c, d, M_offset_1,  5,  T[16]);\n\t            d = GG(d, a, b, c, M_offset_6,  9,  T[17]);\n\t            c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n\t            b = GG(b, c, d, a, M_offset_0,  20, T[19]);\n\t            a = GG(a, b, c, d, M_offset_5,  5,  T[20]);\n\t            d = GG(d, a, b, c, M_offset_10, 9,  T[21]);\n\t            c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n\t            b = GG(b, c, d, a, M_offset_4,  20, T[23]);\n\t            a = GG(a, b, c, d, M_offset_9,  5,  T[24]);\n\t            d = GG(d, a, b, c, M_offset_14, 9,  T[25]);\n\t            c = GG(c, d, a, b, M_offset_3,  14, T[26]);\n\t            b = GG(b, c, d, a, M_offset_8,  20, T[27]);\n\t            a = GG(a, b, c, d, M_offset_13, 5,  T[28]);\n\t            d = GG(d, a, b, c, M_offset_2,  9,  T[29]);\n\t            c = GG(c, d, a, b, M_offset_7,  14, T[30]);\n\t            b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n\t            a = HH(a, b, c, d, M_offset_5,  4,  T[32]);\n\t            d = HH(d, a, b, c, M_offset_8,  11, T[33]);\n\t            c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n\t            b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n\t            a = HH(a, b, c, d, M_offset_1,  4,  T[36]);\n\t            d = HH(d, a, b, c, M_offset_4,  11, T[37]);\n\t            c = HH(c, d, a, b, M_offset_7,  16, T[38]);\n\t            b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n\t            a = HH(a, b, c, d, M_offset_13, 4,  T[40]);\n\t            d = HH(d, a, b, c, M_offset_0,  11, T[41]);\n\t            c = HH(c, d, a, b, M_offset_3,  16, T[42]);\n\t            b = HH(b, c, d, a, M_offset_6,  23, T[43]);\n\t            a = HH(a, b, c, d, M_offset_9,  4,  T[44]);\n\t            d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n\t            c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n\t            b = HH(b, c, d, a, M_offset_2,  23, T[47]);\n\n\t            a = II(a, b, c, d, M_offset_0,  6,  T[48]);\n\t            d = II(d, a, b, c, M_offset_7,  10, T[49]);\n\t            c = II(c, d, a, b, M_offset_14, 15, T[50]);\n\t            b = II(b, c, d, a, M_offset_5,  21, T[51]);\n\t            a = II(a, b, c, d, M_offset_12, 6,  T[52]);\n\t            d = II(d, a, b, c, M_offset_3,  10, T[53]);\n\t            c = II(c, d, a, b, M_offset_10, 15, T[54]);\n\t            b = II(b, c, d, a, M_offset_1,  21, T[55]);\n\t            a = II(a, b, c, d, M_offset_8,  6,  T[56]);\n\t            d = II(d, a, b, c, M_offset_15, 10, T[57]);\n\t            c = II(c, d, a, b, M_offset_6,  15, T[58]);\n\t            b = II(b, c, d, a, M_offset_13, 21, T[59]);\n\t            a = II(a, b, c, d, M_offset_4,  6,  T[60]);\n\t            d = II(d, a, b, c, M_offset_11, 10, T[61]);\n\t            c = II(c, d, a, b, M_offset_2,  15, T[62]);\n\t            b = II(b, c, d, a, M_offset_9,  21, T[63]);\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\n\t            var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n\t            var nBitsTotalL = nBitsTotal;\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n\t                (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)\n\t            );\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t                (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)\n\t            );\n\n\t            data.sigBytes = (dataWords.length + 1) * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var hash = this._hash;\n\t            var H = hash.words;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 4; i++) {\n\t                // Shortcut\n\t                var H_i = H[i];\n\n\t                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |\n\t                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    function FF(a, b, c, d, x, s, t) {\n\t        var n = a + ((b & c) | (~b & d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function GG(a, b, c, d, x, s, t) {\n\t        var n = a + ((b & d) | (c & ~d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function HH(a, b, c, d, x, s, t) {\n\t        var n = a + (b ^ c ^ d) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function II(a, b, c, d, x, s, t) {\n\t        var n = a + (c ^ (b | ~d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.MD5('message');\n\t     *     var hash = CryptoJS.MD5(wordArray);\n\t     */\n\t    C.MD5 = Hasher._createHelper(MD5);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacMD5(message, key);\n\t     */\n\t    C.HmacMD5 = Hasher._createHmacHelper(MD5);\n\t}(Math));\n\n\n\treturn CryptoJS.MD5;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-1 hash algorithm.\n\t     */\n\t    var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0x67452301, 0xefcdab89,\n\t                0x98badcfe, 0x10325476,\n\t                0xc3d2e1f0\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\n\t            // Computation\n\t            for (var i = 0; i < 80; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t                    W[i] = (n << 1) | (n >>> 31);\n\t                }\n\n\t                var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t                if (i < 20) {\n\t                    t += ((b & c) | (~b & d)) + 0x5a827999;\n\t                } else if (i < 40) {\n\t                    t += (b ^ c ^ d) + 0x6ed9eba1;\n\t                } else if (i < 60) {\n\t                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t                } else /* if (i < 80) */ {\n\t                    t += (b ^ c ^ d) - 0x359d3e2a;\n\t                }\n\n\t                e = d;\n\t                d = c;\n\t                c = (b << 30) | (b >>> 2);\n\t                b = a;\n\t                a = t;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA1('message');\n\t     *     var hash = CryptoJS.SHA1(wordArray);\n\t     */\n\t    C.SHA1 = Hasher._createHelper(SHA1);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA1(message, key);\n\t     */\n\t    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\treturn CryptoJS.SHA1;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Initialization and round constants tables\n\t    var H = [];\n\t    var K = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        function isPrime(n) {\n\t            var sqrtN = Math.sqrt(n);\n\t            for (var factor = 2; factor <= sqrtN; factor++) {\n\t                if (!(n % factor)) {\n\t                    return false;\n\t                }\n\t            }\n\n\t            return true;\n\t        }\n\n\t        function getFractionalBits(n) {\n\t            return ((n - (n | 0)) * 0x100000000) | 0;\n\t        }\n\n\t        var n = 2;\n\t        var nPrime = 0;\n\t        while (nPrime < 64) {\n\t            if (isPrime(n)) {\n\t                if (nPrime < 8) {\n\t                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t                }\n\t                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t                nPrime++;\n\t            }\n\n\t            n++;\n\t        }\n\t    }());\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-256 hash algorithm.\n\t     */\n\t    var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init(H.slice(0));\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\t            var f = H[5];\n\t            var g = H[6];\n\t            var h = H[7];\n\n\t            // Computation\n\t            for (var i = 0; i < 64; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var gamma0x = W[i - 15];\n\t                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^\n\t                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t                                   (gamma0x >>> 3);\n\n\t                    var gamma1x = W[i - 2];\n\t                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t                                   (gamma1x >>> 10);\n\n\t                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t                }\n\n\t                var ch  = (e & f) ^ (~e & g);\n\t                var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));\n\n\t                var t1 = h + sigma1 + ch + K[i] + W[i];\n\t                var t2 = sigma0 + maj;\n\n\t                h = g;\n\t                g = f;\n\t                f = e;\n\t                e = (d + t1) | 0;\n\t                d = c;\n\t                c = b;\n\t                b = a;\n\t                a = (t1 + t2) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t            H[5] = (H[5] + f) | 0;\n\t            H[6] = (H[6] + g) | 0;\n\t            H[7] = (H[7] + h) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA256('message');\n\t     *     var hash = CryptoJS.SHA256(wordArray);\n\t     */\n\t    C.SHA256 = Hasher._createHelper(SHA256);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA256(message, key);\n\t     */\n\t    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA256;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha256\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha256\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA256 = C_algo.SHA256;\n\n\t    /**\n\t     * SHA-224 hash algorithm.\n\t     */\n\t    var SHA224 = C_algo.SHA224 = SHA256.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n\t                0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4\n\t            ]);\n\t        },\n\n\t        _doFinalize: function () {\n\t            var hash = SHA256._doFinalize.call(this);\n\n\t            hash.sigBytes -= 4;\n\n\t            return hash;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA224('message');\n\t     *     var hash = CryptoJS.SHA224(wordArray);\n\t     */\n\t    C.SHA224 = SHA256._createHelper(SHA224);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA224(message, key);\n\t     */\n\t    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);\n\t}());\n\n\n\treturn CryptoJS.SHA224;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var X64WordArray = C_x64.WordArray;\n\t    var C_algo = C.algo;\n\n\t    function X64Word_create() {\n\t        return X64Word.create.apply(X64Word, arguments);\n\t    }\n\n\t    // Constants\n\t    var K = [\n\t        X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t        X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t        X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t        X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t        X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t        X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t        X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t        X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t        X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t        X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t        X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t        X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t        X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t        X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t        X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t        X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t        X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t        X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t        X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t        X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t        X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t        X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t        X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t        X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t        X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t        X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t        X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t        X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t        X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t        X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t        X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t        X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t        X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t        X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t        X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t        X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t        X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t        X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t        X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t        X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t    ];\n\n\t    // Reusable objects\n\t    var W = [];\n\t    (function () {\n\t        for (var i = 0; i < 80; i++) {\n\t            W[i] = X64Word_create();\n\t        }\n\t    }());\n\n\t    /**\n\t     * SHA-512 hash algorithm.\n\t     */\n\t    var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new X64WordArray.init([\n\t                new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t                new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t                new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t                new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcuts\n\t            var H = this._hash.words;\n\n\t            var H0 = H[0];\n\t            var H1 = H[1];\n\t            var H2 = H[2];\n\t            var H3 = H[3];\n\t            var H4 = H[4];\n\t            var H5 = H[5];\n\t            var H6 = H[6];\n\t            var H7 = H[7];\n\n\t            var H0h = H0.high;\n\t            var H0l = H0.low;\n\t            var H1h = H1.high;\n\t            var H1l = H1.low;\n\t            var H2h = H2.high;\n\t            var H2l = H2.low;\n\t            var H3h = H3.high;\n\t            var H3l = H3.low;\n\t            var H4h = H4.high;\n\t            var H4l = H4.low;\n\t            var H5h = H5.high;\n\t            var H5l = H5.low;\n\t            var H6h = H6.high;\n\t            var H6l = H6.low;\n\t            var H7h = H7.high;\n\t            var H7l = H7.low;\n\n\t            // Working variables\n\t            var ah = H0h;\n\t            var al = H0l;\n\t            var bh = H1h;\n\t            var bl = H1l;\n\t            var ch = H2h;\n\t            var cl = H2l;\n\t            var dh = H3h;\n\t            var dl = H3l;\n\t            var eh = H4h;\n\t            var el = H4l;\n\t            var fh = H5h;\n\t            var fl = H5l;\n\t            var gh = H6h;\n\t            var gl = H6l;\n\t            var hh = H7h;\n\t            var hl = H7l;\n\n\t            // Rounds\n\t            for (var i = 0; i < 80; i++) {\n\t                var Wil;\n\t                var Wih;\n\n\t                // Shortcut\n\t                var Wi = W[i];\n\n\t                // Extend message\n\t                if (i < 16) {\n\t                    Wih = Wi.high = M[offset + i * 2]     | 0;\n\t                    Wil = Wi.low  = M[offset + i * 2 + 1] | 0;\n\t                } else {\n\t                    // Gamma0\n\t                    var gamma0x  = W[i - 15];\n\t                    var gamma0xh = gamma0x.high;\n\t                    var gamma0xl = gamma0x.low;\n\t                    var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t                    var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t                    // Gamma1\n\t                    var gamma1x  = W[i - 2];\n\t                    var gamma1xh = gamma1x.high;\n\t                    var gamma1xl = gamma1x.low;\n\t                    var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t                    var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t                    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t                    var Wi7  = W[i - 7];\n\t                    var Wi7h = Wi7.high;\n\t                    var Wi7l = Wi7.low;\n\n\t                    var Wi16  = W[i - 16];\n\t                    var Wi16h = Wi16.high;\n\t                    var Wi16l = Wi16.low;\n\n\t                    Wil = gamma0l + Wi7l;\n\t                    Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t                    Wil = Wil + gamma1l;\n\t                    Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t                    Wil = Wil + Wi16l;\n\t                    Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t                    Wi.high = Wih;\n\t                    Wi.low  = Wil;\n\t                }\n\n\t                var chh  = (eh & fh) ^ (~eh & gh);\n\t                var chl  = (el & fl) ^ (~el & gl);\n\t                var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t                var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t                var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t                var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t                var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t                var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t                // t1 = h + sigma1 + ch + K[i] + W[i]\n\t                var Ki  = K[i];\n\t                var Kih = Ki.high;\n\t                var Kil = Ki.low;\n\n\t                var t1l = hl + sigma1l;\n\t                var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t                var t1l = t1l + chl;\n\t                var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t                var t1l = t1l + Kil;\n\t                var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t                var t1l = t1l + Wil;\n\t                var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t                // t2 = sigma0 + maj\n\t                var t2l = sigma0l + majl;\n\t                var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t                // Update working variables\n\t                hh = gh;\n\t                hl = gl;\n\t                gh = fh;\n\t                gl = fl;\n\t                fh = eh;\n\t                fl = el;\n\t                el = (dl + t1l) | 0;\n\t                eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t                dh = ch;\n\t                dl = cl;\n\t                ch = bh;\n\t                cl = bl;\n\t                bh = ah;\n\t                bl = al;\n\t                al = (t1l + t2l) | 0;\n\t                ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H0l = H0.low  = (H0l + al);\n\t            H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t            H1l = H1.low  = (H1l + bl);\n\t            H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t            H2l = H2.low  = (H2l + cl);\n\t            H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t            H3l = H3.low  = (H3l + dl);\n\t            H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t            H4l = H4.low  = (H4l + el);\n\t            H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t            H5l = H5.low  = (H5l + fl);\n\t            H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t            H6l = H6.low  = (H6l + gl);\n\t            H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t            H7l = H7.low  = (H7l + hl);\n\t            H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Convert hash to 32-bit word array before returning\n\t            var hash = this._hash.toX32();\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        },\n\n\t        blockSize: 1024/32\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA512('message');\n\t     *     var hash = CryptoJS.SHA512(wordArray);\n\t     */\n\t    C.SHA512 = Hasher._createHelper(SHA512);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA512(message, key);\n\t     */\n\t    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\treturn CryptoJS.SHA512;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./sha512\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\", \"./sha512\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var X64WordArray = C_x64.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA512 = C_algo.SHA512;\n\n\t    /**\n\t     * SHA-384 hash algorithm.\n\t     */\n\t    var SHA384 = C_algo.SHA384 = SHA512.extend({\n\t        _doReset: function () {\n\t            this._hash = new X64WordArray.init([\n\t                new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),\n\t                new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),\n\t                new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),\n\t                new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)\n\t            ]);\n\t        },\n\n\t        _doFinalize: function () {\n\t            var hash = SHA512._doFinalize.call(this);\n\n\t            hash.sigBytes -= 16;\n\n\t            return hash;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA384('message');\n\t     *     var hash = CryptoJS.SHA384(wordArray);\n\t     */\n\t    C.SHA384 = SHA512._createHelper(SHA384);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA384(message, key);\n\t     */\n\t    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);\n\t}());\n\n\n\treturn CryptoJS.SHA384;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var C_algo = C.algo;\n\n\t    // Constants tables\n\t    var RHO_OFFSETS = [];\n\t    var PI_INDEXES  = [];\n\t    var ROUND_CONSTANTS = [];\n\n\t    // Compute Constants\n\t    (function () {\n\t        // Compute rho offset constants\n\t        var x = 1, y = 0;\n\t        for (var t = 0; t < 24; t++) {\n\t            RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;\n\n\t            var newX = y % 5;\n\t            var newY = (2 * x + 3 * y) % 5;\n\t            x = newX;\n\t            y = newY;\n\t        }\n\n\t        // Compute pi index constants\n\t        for (var x = 0; x < 5; x++) {\n\t            for (var y = 0; y < 5; y++) {\n\t                PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;\n\t            }\n\t        }\n\n\t        // Compute round constants\n\t        var LFSR = 0x01;\n\t        for (var i = 0; i < 24; i++) {\n\t            var roundConstantMsw = 0;\n\t            var roundConstantLsw = 0;\n\n\t            for (var j = 0; j < 7; j++) {\n\t                if (LFSR & 0x01) {\n\t                    var bitPosition = (1 << j) - 1;\n\t                    if (bitPosition < 32) {\n\t                        roundConstantLsw ^= 1 << bitPosition;\n\t                    } else /* if (bitPosition >= 32) */ {\n\t                        roundConstantMsw ^= 1 << (bitPosition - 32);\n\t                    }\n\t                }\n\n\t                // Compute next LFSR\n\t                if (LFSR & 0x80) {\n\t                    // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1\n\t                    LFSR = (LFSR << 1) ^ 0x71;\n\t                } else {\n\t                    LFSR <<= 1;\n\t                }\n\t            }\n\n\t            ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);\n\t        }\n\t    }());\n\n\t    // Reusable objects for temporary values\n\t    var T = [];\n\t    (function () {\n\t        for (var i = 0; i < 25; i++) {\n\t            T[i] = X64Word.create();\n\t        }\n\t    }());\n\n\t    /**\n\t     * SHA-3 hash algorithm.\n\t     */\n\t    var SHA3 = C_algo.SHA3 = Hasher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} outputLength\n\t         *   The desired number of bits in the output hash.\n\t         *   Only values permitted are: 224, 256, 384, 512.\n\t         *   Default: 512\n\t         */\n\t        cfg: Hasher.cfg.extend({\n\t            outputLength: 512\n\t        }),\n\n\t        _doReset: function () {\n\t            var state = this._state = []\n\t            for (var i = 0; i < 25; i++) {\n\t                state[i] = new X64Word.init();\n\t            }\n\n\t            this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcuts\n\t            var state = this._state;\n\t            var nBlockSizeLanes = this.blockSize / 2;\n\n\t            // Absorb\n\t            for (var i = 0; i < nBlockSizeLanes; i++) {\n\t                // Shortcuts\n\t                var M2i  = M[offset + 2 * i];\n\t                var M2i1 = M[offset + 2 * i + 1];\n\n\t                // Swap endian\n\t                M2i = (\n\t                    (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |\n\t                    (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)\n\t                );\n\t                M2i1 = (\n\t                    (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |\n\t                    (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)\n\t                );\n\n\t                // Absorb message into state\n\t                var lane = state[i];\n\t                lane.high ^= M2i1;\n\t                lane.low  ^= M2i;\n\t            }\n\n\t            // Rounds\n\t            for (var round = 0; round < 24; round++) {\n\t                // Theta\n\t                for (var x = 0; x < 5; x++) {\n\t                    // Mix column lanes\n\t                    var tMsw = 0, tLsw = 0;\n\t                    for (var y = 0; y < 5; y++) {\n\t                        var lane = state[x + 5 * y];\n\t                        tMsw ^= lane.high;\n\t                        tLsw ^= lane.low;\n\t                    }\n\n\t                    // Temporary values\n\t                    var Tx = T[x];\n\t                    Tx.high = tMsw;\n\t                    Tx.low  = tLsw;\n\t                }\n\t                for (var x = 0; x < 5; x++) {\n\t                    // Shortcuts\n\t                    var Tx4 = T[(x + 4) % 5];\n\t                    var Tx1 = T[(x + 1) % 5];\n\t                    var Tx1Msw = Tx1.high;\n\t                    var Tx1Lsw = Tx1.low;\n\n\t                    // Mix surrounding columns\n\t                    var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));\n\t                    var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));\n\t                    for (var y = 0; y < 5; y++) {\n\t                        var lane = state[x + 5 * y];\n\t                        lane.high ^= tMsw;\n\t                        lane.low  ^= tLsw;\n\t                    }\n\t                }\n\n\t                // Rho Pi\n\t                for (var laneIndex = 1; laneIndex < 25; laneIndex++) {\n\t                    var tMsw;\n\t                    var tLsw;\n\n\t                    // Shortcuts\n\t                    var lane = state[laneIndex];\n\t                    var laneMsw = lane.high;\n\t                    var laneLsw = lane.low;\n\t                    var rhoOffset = RHO_OFFSETS[laneIndex];\n\n\t                    // Rotate lanes\n\t                    if (rhoOffset < 32) {\n\t                        tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));\n\t                        tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));\n\t                    } else /* if (rhoOffset >= 32) */ {\n\t                        tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));\n\t                        tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));\n\t                    }\n\n\t                    // Transpose lanes\n\t                    var TPiLane = T[PI_INDEXES[laneIndex]];\n\t                    TPiLane.high = tMsw;\n\t                    TPiLane.low  = tLsw;\n\t                }\n\n\t                // Rho pi at x = y = 0\n\t                var T0 = T[0];\n\t                var state0 = state[0];\n\t                T0.high = state0.high;\n\t                T0.low  = state0.low;\n\n\t                // Chi\n\t                for (var x = 0; x < 5; x++) {\n\t                    for (var y = 0; y < 5; y++) {\n\t                        // Shortcuts\n\t                        var laneIndex = x + 5 * y;\n\t                        var lane = state[laneIndex];\n\t                        var TLane = T[laneIndex];\n\t                        var Tx1Lane = T[((x + 1) % 5) + 5 * y];\n\t                        var Tx2Lane = T[((x + 2) % 5) + 5 * y];\n\n\t                        // Mix rows\n\t                        lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);\n\t                        lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);\n\t                    }\n\t                }\n\n\t                // Iota\n\t                var lane = state[0];\n\t                var roundConstant = ROUND_CONSTANTS[round];\n\t                lane.high ^= roundConstant.high;\n\t                lane.low  ^= roundConstant.low;\n\t            }\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\t            var blockSizeBits = this.blockSize * 32;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);\n\t            dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var state = this._state;\n\t            var outputLengthBytes = this.cfg.outputLength / 8;\n\t            var outputLengthLanes = outputLengthBytes / 8;\n\n\t            // Squeeze\n\t            var hashWords = [];\n\t            for (var i = 0; i < outputLengthLanes; i++) {\n\t                // Shortcuts\n\t                var lane = state[i];\n\t                var laneMsw = lane.high;\n\t                var laneLsw = lane.low;\n\n\t                // Swap endian\n\t                laneMsw = (\n\t                    (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |\n\t                    (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)\n\t                );\n\t                laneLsw = (\n\t                    (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |\n\t                    (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)\n\t                );\n\n\t                // Squeeze state to retrieve hash\n\t                hashWords.push(laneLsw);\n\t                hashWords.push(laneMsw);\n\t            }\n\n\t            // Return final computed hash\n\t            return new WordArray.init(hashWords, outputLengthBytes);\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\n\t            var state = clone._state = this._state.slice(0);\n\t            for (var i = 0; i < 25; i++) {\n\t                state[i] = state[i].clone();\n\t            }\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA3('message');\n\t     *     var hash = CryptoJS.SHA3(wordArray);\n\t     */\n\t    C.SHA3 = Hasher._createHelper(SHA3);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA3(message, key);\n\t     */\n\t    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA3;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/** @preserve\n\t(c) 2012 by Cédric Mesnil. All rights reserved.\n\n\tRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n\t    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\t    - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t*/\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Constants table\n\t    var _zl = WordArray.create([\n\t        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\n\t        7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,\n\t        3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,\n\t        1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,\n\t        4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);\n\t    var _zr = WordArray.create([\n\t        5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,\n\t        6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,\n\t        15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,\n\t        8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,\n\t        12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);\n\t    var _sl = WordArray.create([\n\t         11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,\n\t        7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,\n\t        11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,\n\t          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,\n\t        9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);\n\t    var _sr = WordArray.create([\n\t        8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,\n\t        9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,\n\t        9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,\n\t        15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,\n\t        8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);\n\n\t    var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);\n\t    var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);\n\n\t    /**\n\t     * RIPEMD160 hash algorithm.\n\t     */\n\t    var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\n\t            // Swap endian\n\t            for (var i = 0; i < 16; i++) {\n\t                // Shortcuts\n\t                var offset_i = offset + i;\n\t                var M_offset_i = M[offset_i];\n\n\t                // Swap\n\t                M[offset_i] = (\n\t                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)\n\t                );\n\t            }\n\t            // Shortcut\n\t            var H  = this._hash.words;\n\t            var hl = _hl.words;\n\t            var hr = _hr.words;\n\t            var zl = _zl.words;\n\t            var zr = _zr.words;\n\t            var sl = _sl.words;\n\t            var sr = _sr.words;\n\n\t            // Working variables\n\t            var al, bl, cl, dl, el;\n\t            var ar, br, cr, dr, er;\n\n\t            ar = al = H[0];\n\t            br = bl = H[1];\n\t            cr = cl = H[2];\n\t            dr = dl = H[3];\n\t            er = el = H[4];\n\t            // Computation\n\t            var t;\n\t            for (var i = 0; i < 80; i += 1) {\n\t                t = (al +  M[offset+zl[i]])|0;\n\t                if (i<16){\n\t\t            t +=  f1(bl,cl,dl) + hl[0];\n\t                } else if (i<32) {\n\t\t            t +=  f2(bl,cl,dl) + hl[1];\n\t                } else if (i<48) {\n\t\t            t +=  f3(bl,cl,dl) + hl[2];\n\t                } else if (i<64) {\n\t\t            t +=  f4(bl,cl,dl) + hl[3];\n\t                } else {// if (i<80) {\n\t\t            t +=  f5(bl,cl,dl) + hl[4];\n\t                }\n\t                t = t|0;\n\t                t =  rotl(t,sl[i]);\n\t                t = (t+el)|0;\n\t                al = el;\n\t                el = dl;\n\t                dl = rotl(cl, 10);\n\t                cl = bl;\n\t                bl = t;\n\n\t                t = (ar + M[offset+zr[i]])|0;\n\t                if (i<16){\n\t\t            t +=  f5(br,cr,dr) + hr[0];\n\t                } else if (i<32) {\n\t\t            t +=  f4(br,cr,dr) + hr[1];\n\t                } else if (i<48) {\n\t\t            t +=  f3(br,cr,dr) + hr[2];\n\t                } else if (i<64) {\n\t\t            t +=  f2(br,cr,dr) + hr[3];\n\t                } else {// if (i<80) {\n\t\t            t +=  f1(br,cr,dr) + hr[4];\n\t                }\n\t                t = t|0;\n\t                t =  rotl(t,sr[i]) ;\n\t                t = (t+er)|0;\n\t                ar = er;\n\t                er = dr;\n\t                dr = rotl(cr, 10);\n\t                cr = br;\n\t                br = t;\n\t            }\n\t            // Intermediate hash value\n\t            t    = (H[1] + cl + dr)|0;\n\t            H[1] = (H[2] + dl + er)|0;\n\t            H[2] = (H[3] + el + ar)|0;\n\t            H[3] = (H[4] + al + br)|0;\n\t            H[4] = (H[0] + bl + cr)|0;\n\t            H[0] =  t;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t                (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)\n\t            );\n\t            data.sigBytes = (dataWords.length + 1) * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var hash = this._hash;\n\t            var H = hash.words;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 5; i++) {\n\t                // Shortcut\n\t                var H_i = H[i];\n\n\t                // Swap\n\t                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |\n\t                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\n\t    function f1(x, y, z) {\n\t        return ((x) ^ (y) ^ (z));\n\n\t    }\n\n\t    function f2(x, y, z) {\n\t        return (((x)&(y)) | ((~x)&(z)));\n\t    }\n\n\t    function f3(x, y, z) {\n\t        return (((x) | (~(y))) ^ (z));\n\t    }\n\n\t    function f4(x, y, z) {\n\t        return (((x) & (z)) | ((y)&(~(z))));\n\t    }\n\n\t    function f5(x, y, z) {\n\t        return ((x) ^ ((y) |(~(z))));\n\n\t    }\n\n\t    function rotl(x,n) {\n\t        return (x<<n) | (x>>>(32-n));\n\t    }\n\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.RIPEMD160('message');\n\t     *     var hash = CryptoJS.RIPEMD160(wordArray);\n\t     */\n\t    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);\n\t     */\n\t    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);\n\t}(Math));\n\n\n\treturn CryptoJS.RIPEMD160;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var C_enc = C.enc;\n\t    var Utf8 = C_enc.Utf8;\n\t    var C_algo = C.algo;\n\n\t    /**\n\t     * HMAC algorithm.\n\t     */\n\t    var HMAC = C_algo.HMAC = Base.extend({\n\t        /**\n\t         * Initializes a newly created HMAC.\n\t         *\n\t         * @param {Hasher} hasher The hash algorithm to use.\n\t         * @param {WordArray|string} key The secret key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t         */\n\t        init: function (hasher, key) {\n\t            // Init hasher\n\t            hasher = this._hasher = new hasher.init();\n\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof key == 'string') {\n\t                key = Utf8.parse(key);\n\t            }\n\n\t            // Shortcuts\n\t            var hasherBlockSize = hasher.blockSize;\n\t            var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t            // Allow arbitrary length keys\n\t            if (key.sigBytes > hasherBlockSizeBytes) {\n\t                key = hasher.finalize(key);\n\t            }\n\n\t            // Clamp excess bits\n\t            key.clamp();\n\n\t            // Clone key for inner and outer pads\n\t            var oKey = this._oKey = key.clone();\n\t            var iKey = this._iKey = key.clone();\n\n\t            // Shortcuts\n\t            var oKeyWords = oKey.words;\n\t            var iKeyWords = iKey.words;\n\n\t            // XOR keys with pad constants\n\t            for (var i = 0; i < hasherBlockSize; i++) {\n\t                oKeyWords[i] ^= 0x5c5c5c5c;\n\t                iKeyWords[i] ^= 0x36363636;\n\t            }\n\t            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this HMAC to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Reset\n\t            hasher.reset();\n\t            hasher.update(this._iKey);\n\t        },\n\n\t        /**\n\t         * Updates this HMAC with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {HMAC} This HMAC instance.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.update('message');\n\t         *     hmacHasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            this._hasher.update(messageUpdate);\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the HMAC computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The HMAC.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmac = hmacHasher.finalize();\n\t         *     var hmac = hmacHasher.finalize('message');\n\t         *     var hmac = hmacHasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Compute HMAC\n\t            var innerHash = hasher.finalize(messageUpdate);\n\t            hasher.reset();\n\t            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t            return hmac;\n\t        }\n\t    });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha256\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha256\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA256 = C_algo.SHA256;\n\t    var HMAC = C_algo.HMAC;\n\n\t    /**\n\t     * Password-Based Key Derivation Function 2 algorithm.\n\t     */\n\t    var PBKDF2 = C_algo.PBKDF2 = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t         * @property {Hasher} hasher The hasher to use. Default: SHA256\n\t         * @property {number} iterations The number of iterations to perform. Default: 250000\n\t         */\n\t        cfg: Base.extend({\n\t            keySize: 128/32,\n\t            hasher: SHA256,\n\t            iterations: 250000\n\t        }),\n\n\t        /**\n\t         * Initializes a newly created key derivation function.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create();\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\n\t         */\n\t        init: function (cfg) {\n\t            this.cfg = this.cfg.extend(cfg);\n\t        },\n\n\t        /**\n\t         * Computes the Password-Based Key Derivation Function 2.\n\t         *\n\t         * @param {WordArray|string} password The password.\n\t         * @param {WordArray|string} salt A salt.\n\t         *\n\t         * @return {WordArray} The derived key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var key = kdf.compute(password, salt);\n\t         */\n\t        compute: function (password, salt) {\n\t            // Shortcut\n\t            var cfg = this.cfg;\n\n\t            // Init HMAC\n\t            var hmac = HMAC.create(cfg.hasher, password);\n\n\t            // Initial values\n\t            var derivedKey = WordArray.create();\n\t            var blockIndex = WordArray.create([0x00000001]);\n\n\t            // Shortcuts\n\t            var derivedKeyWords = derivedKey.words;\n\t            var blockIndexWords = blockIndex.words;\n\t            var keySize = cfg.keySize;\n\t            var iterations = cfg.iterations;\n\n\t            // Generate key\n\t            while (derivedKeyWords.length < keySize) {\n\t                var block = hmac.update(salt).finalize(blockIndex);\n\t                hmac.reset();\n\n\t                // Shortcuts\n\t                var blockWords = block.words;\n\t                var blockWordsLength = blockWords.length;\n\n\t                // Iterations\n\t                var intermediate = block;\n\t                for (var i = 1; i < iterations; i++) {\n\t                    intermediate = hmac.finalize(intermediate);\n\t                    hmac.reset();\n\n\t                    // Shortcut\n\t                    var intermediateWords = intermediate.words;\n\n\t                    // XOR intermediate with block\n\t                    for (var j = 0; j < blockWordsLength; j++) {\n\t                        blockWords[j] ^= intermediateWords[j];\n\t                    }\n\t                }\n\n\t                derivedKey.concat(block);\n\t                blockIndexWords[0]++;\n\t            }\n\t            derivedKey.sigBytes = keySize * 4;\n\n\t            return derivedKey;\n\t        }\n\t    });\n\n\t    /**\n\t     * Computes the Password-Based Key Derivation Function 2.\n\t     *\n\t     * @param {WordArray|string} password The password.\n\t     * @param {WordArray|string} salt A salt.\n\t     * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t     *\n\t     * @return {WordArray} The derived key.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var key = CryptoJS.PBKDF2(password, salt);\n\t     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\n\t     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\n\t     */\n\t    C.PBKDF2 = function (password, salt, cfg) {\n\t        return PBKDF2.create(cfg).compute(password, salt);\n\t    };\n\t}());\n\n\n\treturn CryptoJS.PBKDF2;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha1\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha1\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var MD5 = C_algo.MD5;\n\n\t    /**\n\t     * This key derivation function is meant to conform with EVP_BytesToKey.\n\t     * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n\t     */\n\t    var EvpKDF = C_algo.EvpKDF = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t         * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n\t         * @property {number} iterations The number of iterations to perform. Default: 1\n\t         */\n\t        cfg: Base.extend({\n\t            keySize: 128/32,\n\t            hasher: MD5,\n\t            iterations: 1\n\t        }),\n\n\t        /**\n\t         * Initializes a newly created key derivation function.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create();\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n\t         */\n\t        init: function (cfg) {\n\t            this.cfg = this.cfg.extend(cfg);\n\t        },\n\n\t        /**\n\t         * Derives a key from a password.\n\t         *\n\t         * @param {WordArray|string} password The password.\n\t         * @param {WordArray|string} salt A salt.\n\t         *\n\t         * @return {WordArray} The derived key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var key = kdf.compute(password, salt);\n\t         */\n\t        compute: function (password, salt) {\n\t            var block;\n\n\t            // Shortcut\n\t            var cfg = this.cfg;\n\n\t            // Init hasher\n\t            var hasher = cfg.hasher.create();\n\n\t            // Initial values\n\t            var derivedKey = WordArray.create();\n\n\t            // Shortcuts\n\t            var derivedKeyWords = derivedKey.words;\n\t            var keySize = cfg.keySize;\n\t            var iterations = cfg.iterations;\n\n\t            // Generate key\n\t            while (derivedKeyWords.length < keySize) {\n\t                if (block) {\n\t                    hasher.update(block);\n\t                }\n\t                block = hasher.update(password).finalize(salt);\n\t                hasher.reset();\n\n\t                // Iterations\n\t                for (var i = 1; i < iterations; i++) {\n\t                    block = hasher.finalize(block);\n\t                    hasher.reset();\n\t                }\n\n\t                derivedKey.concat(block);\n\t            }\n\t            derivedKey.sigBytes = keySize * 4;\n\n\t            return derivedKey;\n\t        }\n\t    });\n\n\t    /**\n\t     * Derives a key from a password.\n\t     *\n\t     * @param {WordArray|string} password The password.\n\t     * @param {WordArray|string} salt A salt.\n\t     * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t     *\n\t     * @return {WordArray} The derived key.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var key = CryptoJS.EvpKDF(password, salt);\n\t     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n\t     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n\t     */\n\t    C.EvpKDF = function (password, salt, cfg) {\n\t        return EvpKDF.create(cfg).compute(password, salt);\n\t    };\n\t}());\n\n\n\treturn CryptoJS.EvpKDF;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./evpkdf\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./evpkdf\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Cipher core components.\n\t */\n\tCryptoJS.lib.Cipher || (function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n\t    var C_enc = C.enc;\n\t    var Utf8 = C_enc.Utf8;\n\t    var Base64 = C_enc.Base64;\n\t    var C_algo = C.algo;\n\t    var EvpKDF = C_algo.EvpKDF;\n\n\t    /**\n\t     * Abstract base cipher template.\n\t     *\n\t     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n\t     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n\t     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n\t     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n\t     */\n\t    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {WordArray} iv The IV to use for this operation.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Creates this cipher in encryption mode.\n\t         *\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {Cipher} A cipher instance.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n\t         */\n\t        createEncryptor: function (key, cfg) {\n\t            return this.create(this._ENC_XFORM_MODE, key, cfg);\n\t        },\n\n\t        /**\n\t         * Creates this cipher in decryption mode.\n\t         *\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {Cipher} A cipher instance.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n\t         */\n\t        createDecryptor: function (key, cfg) {\n\t            return this.create(this._DEC_XFORM_MODE, key, cfg);\n\t        },\n\n\t        /**\n\t         * Initializes a newly created cipher.\n\t         *\n\t         * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n\t         */\n\t        init: function (xformMode, key, cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Store transform mode and key\n\t            this._xformMode = xformMode;\n\t            this._key = key;\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this cipher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     cipher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-cipher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Adds data to be encrypted or decrypted.\n\t         *\n\t         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n\t         *\n\t         * @return {WordArray} The data after processing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var encrypted = cipher.process('data');\n\t         *     var encrypted = cipher.process(wordArray);\n\t         */\n\t        process: function (dataUpdate) {\n\t            // Append\n\t            this._append(dataUpdate);\n\n\t            // Process available blocks\n\t            return this._process();\n\t        },\n\n\t        /**\n\t         * Finalizes the encryption or decryption process.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n\t         *\n\t         * @return {WordArray} The data after final processing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var encrypted = cipher.finalize();\n\t         *     var encrypted = cipher.finalize('data');\n\t         *     var encrypted = cipher.finalize(wordArray);\n\t         */\n\t        finalize: function (dataUpdate) {\n\t            // Final data update\n\t            if (dataUpdate) {\n\t                this._append(dataUpdate);\n\t            }\n\n\t            // Perform concrete-cipher logic\n\t            var finalProcessedData = this._doFinalize();\n\n\t            return finalProcessedData;\n\t        },\n\n\t        keySize: 128/32,\n\n\t        ivSize: 128/32,\n\n\t        _ENC_XFORM_MODE: 1,\n\n\t        _DEC_XFORM_MODE: 2,\n\n\t        /**\n\t         * Creates shortcut functions to a cipher's object interface.\n\t         *\n\t         * @param {Cipher} cipher The cipher to create a helper for.\n\t         *\n\t         * @return {Object} An object with encrypt and decrypt shortcut functions.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n\t         */\n\t        _createHelper: (function () {\n\t            function selectCipherStrategy(key) {\n\t                if (typeof key == 'string') {\n\t                    return PasswordBasedCipher;\n\t                } else {\n\t                    return SerializableCipher;\n\t                }\n\t            }\n\n\t            return function (cipher) {\n\t                return {\n\t                    encrypt: function (message, key, cfg) {\n\t                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n\t                    },\n\n\t                    decrypt: function (ciphertext, key, cfg) {\n\t                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n\t                    }\n\t                };\n\t            };\n\t        }())\n\t    });\n\n\t    /**\n\t     * Abstract base stream cipher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n\t     */\n\t    var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n\t        _doFinalize: function () {\n\t            // Process partial blocks\n\t            var finalProcessedBlocks = this._process(!!'flush');\n\n\t            return finalProcessedBlocks;\n\t        },\n\n\t        blockSize: 1\n\t    });\n\n\t    /**\n\t     * Mode namespace.\n\t     */\n\t    var C_mode = C.mode = {};\n\n\t    /**\n\t     * Abstract base block cipher mode template.\n\t     */\n\t    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n\t        /**\n\t         * Creates this mode for encryption.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n\t         */\n\t        createEncryptor: function (cipher, iv) {\n\t            return this.Encryptor.create(cipher, iv);\n\t        },\n\n\t        /**\n\t         * Creates this mode for decryption.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n\t         */\n\t        createDecryptor: function (cipher, iv) {\n\t            return this.Decryptor.create(cipher, iv);\n\t        },\n\n\t        /**\n\t         * Initializes a newly created mode.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n\t         */\n\t        init: function (cipher, iv) {\n\t            this._cipher = cipher;\n\t            this._iv = iv;\n\t        }\n\t    });\n\n\t    /**\n\t     * Cipher Block Chaining mode.\n\t     */\n\t    var CBC = C_mode.CBC = (function () {\n\t        /**\n\t         * Abstract base CBC mode.\n\t         */\n\t        var CBC = BlockCipherMode.extend();\n\n\t        /**\n\t         * CBC encryptor.\n\t         */\n\t        CBC.Encryptor = CBC.extend({\n\t            /**\n\t             * Processes the data block at offset.\n\t             *\n\t             * @param {Array} words The data words to operate on.\n\t             * @param {number} offset The offset where the block starts.\n\t             *\n\t             * @example\n\t             *\n\t             *     mode.processBlock(data.words, offset);\n\t             */\n\t            processBlock: function (words, offset) {\n\t                // Shortcuts\n\t                var cipher = this._cipher;\n\t                var blockSize = cipher.blockSize;\n\n\t                // XOR and encrypt\n\t                xorBlock.call(this, words, offset, blockSize);\n\t                cipher.encryptBlock(words, offset);\n\n\t                // Remember this block to use with next block\n\t                this._prevBlock = words.slice(offset, offset + blockSize);\n\t            }\n\t        });\n\n\t        /**\n\t         * CBC decryptor.\n\t         */\n\t        CBC.Decryptor = CBC.extend({\n\t            /**\n\t             * Processes the data block at offset.\n\t             *\n\t             * @param {Array} words The data words to operate on.\n\t             * @param {number} offset The offset where the block starts.\n\t             *\n\t             * @example\n\t             *\n\t             *     mode.processBlock(data.words, offset);\n\t             */\n\t            processBlock: function (words, offset) {\n\t                // Shortcuts\n\t                var cipher = this._cipher;\n\t                var blockSize = cipher.blockSize;\n\n\t                // Remember this block to use with next block\n\t                var thisBlock = words.slice(offset, offset + blockSize);\n\n\t                // Decrypt and XOR\n\t                cipher.decryptBlock(words, offset);\n\t                xorBlock.call(this, words, offset, blockSize);\n\n\t                // This block becomes the previous block\n\t                this._prevBlock = thisBlock;\n\t            }\n\t        });\n\n\t        function xorBlock(words, offset, blockSize) {\n\t            var block;\n\n\t            // Shortcut\n\t            var iv = this._iv;\n\n\t            // Choose mixing block\n\t            if (iv) {\n\t                block = iv;\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            } else {\n\t                block = this._prevBlock;\n\t            }\n\n\t            // XOR blocks\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= block[i];\n\t            }\n\t        }\n\n\t        return CBC;\n\t    }());\n\n\t    /**\n\t     * Padding namespace.\n\t     */\n\t    var C_pad = C.pad = {};\n\n\t    /**\n\t     * PKCS #5/7 padding strategy.\n\t     */\n\t    var Pkcs7 = C_pad.Pkcs7 = {\n\t        /**\n\t         * Pads data using the algorithm defined in PKCS #5/7.\n\t         *\n\t         * @param {WordArray} data The data to pad.\n\t         * @param {number} blockSize The multiple that the data should be padded to.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n\t         */\n\t        pad: function (data, blockSize) {\n\t            // Shortcut\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count padding bytes\n\t            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t            // Create padding word\n\t            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n\t            // Create padding\n\t            var paddingWords = [];\n\t            for (var i = 0; i < nPaddingBytes; i += 4) {\n\t                paddingWords.push(paddingWord);\n\t            }\n\t            var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n\t            // Add padding\n\t            data.concat(padding);\n\t        },\n\n\t        /**\n\t         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n\t         *\n\t         * @param {WordArray} data The data to unpad.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     CryptoJS.pad.Pkcs7.unpad(wordArray);\n\t         */\n\t        unpad: function (data) {\n\t            // Get number of padding bytes from last byte\n\t            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t            // Remove padding\n\t            data.sigBytes -= nPaddingBytes;\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract base block cipher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n\t     */\n\t    var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {Mode} mode The block mode to use. Default: CBC\n\t         * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n\t         */\n\t        cfg: Cipher.cfg.extend({\n\t            mode: CBC,\n\t            padding: Pkcs7\n\t        }),\n\n\t        reset: function () {\n\t            var modeCreator;\n\n\t            // Reset cipher\n\t            Cipher.reset.call(this);\n\n\t            // Shortcuts\n\t            var cfg = this.cfg;\n\t            var iv = cfg.iv;\n\t            var mode = cfg.mode;\n\n\t            // Reset block mode\n\t            if (this._xformMode == this._ENC_XFORM_MODE) {\n\t                modeCreator = mode.createEncryptor;\n\t            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t                modeCreator = mode.createDecryptor;\n\t                // Keep at least one block in the buffer for unpadding\n\t                this._minBufferSize = 1;\n\t            }\n\n\t            if (this._mode && this._mode.__creator == modeCreator) {\n\t                this._mode.init(this, iv && iv.words);\n\t            } else {\n\t                this._mode = modeCreator.call(mode, this, iv && iv.words);\n\t                this._mode.__creator = modeCreator;\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (words, offset) {\n\t            this._mode.processBlock(words, offset);\n\t        },\n\n\t        _doFinalize: function () {\n\t            var finalProcessedBlocks;\n\n\t            // Shortcut\n\t            var padding = this.cfg.padding;\n\n\t            // Finalize\n\t            if (this._xformMode == this._ENC_XFORM_MODE) {\n\t                // Pad data\n\t                padding.pad(this._data, this.blockSize);\n\n\t                // Process final blocks\n\t                finalProcessedBlocks = this._process(!!'flush');\n\t            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t                // Process final blocks\n\t                finalProcessedBlocks = this._process(!!'flush');\n\n\t                // Unpad data\n\t                padding.unpad(finalProcessedBlocks);\n\t            }\n\n\t            return finalProcessedBlocks;\n\t        },\n\n\t        blockSize: 128/32\n\t    });\n\n\t    /**\n\t     * A collection of cipher parameters.\n\t     *\n\t     * @property {WordArray} ciphertext The raw ciphertext.\n\t     * @property {WordArray} key The key to this ciphertext.\n\t     * @property {WordArray} iv The IV used in the ciphering operation.\n\t     * @property {WordArray} salt The salt used with a key derivation function.\n\t     * @property {Cipher} algorithm The cipher algorithm.\n\t     * @property {Mode} mode The block mode used in the ciphering operation.\n\t     * @property {Padding} padding The padding scheme used in the ciphering operation.\n\t     * @property {number} blockSize The block size of the cipher.\n\t     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n\t     */\n\t    var CipherParams = C_lib.CipherParams = Base.extend({\n\t        /**\n\t         * Initializes a newly created cipher params object.\n\t         *\n\t         * @param {Object} cipherParams An object with any of the possible cipher parameters.\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.lib.CipherParams.create({\n\t         *         ciphertext: ciphertextWordArray,\n\t         *         key: keyWordArray,\n\t         *         iv: ivWordArray,\n\t         *         salt: saltWordArray,\n\t         *         algorithm: CryptoJS.algo.AES,\n\t         *         mode: CryptoJS.mode.CBC,\n\t         *         padding: CryptoJS.pad.PKCS7,\n\t         *         blockSize: 4,\n\t         *         formatter: CryptoJS.format.OpenSSL\n\t         *     });\n\t         */\n\t        init: function (cipherParams) {\n\t            this.mixIn(cipherParams);\n\t        },\n\n\t        /**\n\t         * Converts this cipher params object to a string.\n\t         *\n\t         * @param {Format} formatter (Optional) The formatting strategy to use.\n\t         *\n\t         * @return {string} The stringified cipher params.\n\t         *\n\t         * @throws Error If neither the formatter nor the default formatter is set.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = cipherParams + '';\n\t         *     var string = cipherParams.toString();\n\t         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n\t         */\n\t        toString: function (formatter) {\n\t            return (formatter || this.formatter).stringify(this);\n\t        }\n\t    });\n\n\t    /**\n\t     * Format namespace.\n\t     */\n\t    var C_format = C.format = {};\n\n\t    /**\n\t     * OpenSSL formatting strategy.\n\t     */\n\t    var OpenSSLFormatter = C_format.OpenSSL = {\n\t        /**\n\t         * Converts a cipher params object to an OpenSSL-compatible string.\n\t         *\n\t         * @param {CipherParams} cipherParams The cipher params object.\n\t         *\n\t         * @return {string} The OpenSSL-compatible string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n\t         */\n\t        stringify: function (cipherParams) {\n\t            var wordArray;\n\n\t            // Shortcuts\n\t            var ciphertext = cipherParams.ciphertext;\n\t            var salt = cipherParams.salt;\n\n\t            // Format\n\t            if (salt) {\n\t                wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n\t            } else {\n\t                wordArray = ciphertext;\n\t            }\n\n\t            return wordArray.toString(Base64);\n\t        },\n\n\t        /**\n\t         * Converts an OpenSSL-compatible string to a cipher params object.\n\t         *\n\t         * @param {string} openSSLStr The OpenSSL-compatible string.\n\t         *\n\t         * @return {CipherParams} The cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n\t         */\n\t        parse: function (openSSLStr) {\n\t            var salt;\n\n\t            // Parse base64\n\t            var ciphertext = Base64.parse(openSSLStr);\n\n\t            // Shortcut\n\t            var ciphertextWords = ciphertext.words;\n\n\t            // Test for salt\n\t            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n\t                // Extract salt\n\t                salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n\t                // Remove salt from ciphertext\n\t                ciphertextWords.splice(0, 4);\n\t                ciphertext.sigBytes -= 16;\n\t            }\n\n\t            return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n\t        }\n\t    };\n\n\t    /**\n\t     * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n\t     */\n\t    var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n\t         */\n\t        cfg: Base.extend({\n\t            format: OpenSSLFormatter\n\t        }),\n\n\t        /**\n\t         * Encrypts a message.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {WordArray|string} message The message to encrypt.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {CipherParams} A cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         */\n\t        encrypt: function (cipher, message, key, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Encrypt\n\t            var encryptor = cipher.createEncryptor(key, cfg);\n\t            var ciphertext = encryptor.finalize(message);\n\n\t            // Shortcut\n\t            var cipherCfg = encryptor.cfg;\n\n\t            // Create and return serializable cipher params\n\t            return CipherParams.create({\n\t                ciphertext: ciphertext,\n\t                key: key,\n\t                iv: cipherCfg.iv,\n\t                algorithm: cipher,\n\t                mode: cipherCfg.mode,\n\t                padding: cipherCfg.padding,\n\t                blockSize: cipher.blockSize,\n\t                formatter: cfg.format\n\t            });\n\t        },\n\n\t        /**\n\t         * Decrypts serialized ciphertext.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {WordArray} The plaintext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         */\n\t        decrypt: function (cipher, ciphertext, key, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Convert string to CipherParams\n\t            ciphertext = this._parse(ciphertext, cfg.format);\n\n\t            // Decrypt\n\t            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n\t            return plaintext;\n\t        },\n\n\t        /**\n\t         * Converts serialized ciphertext to CipherParams,\n\t         * else assumed CipherParams already and returns ciphertext unchanged.\n\t         *\n\t         * @param {CipherParams|string} ciphertext The ciphertext.\n\t         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n\t         *\n\t         * @return {CipherParams} The unserialized ciphertext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n\t         */\n\t        _parse: function (ciphertext, format) {\n\t            if (typeof ciphertext == 'string') {\n\t                return format.parse(ciphertext, this);\n\t            } else {\n\t                return ciphertext;\n\t            }\n\t        }\n\t    });\n\n\t    /**\n\t     * Key derivation function namespace.\n\t     */\n\t    var C_kdf = C.kdf = {};\n\n\t    /**\n\t     * OpenSSL key derivation function.\n\t     */\n\t    var OpenSSLKdf = C_kdf.OpenSSL = {\n\t        /**\n\t         * Derives a key and IV from a password.\n\t         *\n\t         * @param {string} password The password to derive from.\n\t         * @param {number} keySize The size in words of the key to generate.\n\t         * @param {number} ivSize The size in words of the IV to generate.\n\t         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n\t         *\n\t         * @return {CipherParams} A cipher params object with the key, IV, and salt.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n\t         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n\t         */\n\t        execute: function (password, keySize, ivSize, salt, hasher) {\n\t            // Generate random salt\n\t            if (!salt) {\n\t                salt = WordArray.random(64/8);\n\t            }\n\n\t            // Derive key and IV\n\t            if (!hasher) {\n\t                var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\t            } else {\n\t                var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt);\n\t            }\n\n\n\t            // Separate key and IV\n\t            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n\t            key.sigBytes = keySize * 4;\n\n\t            // Return params\n\t            return CipherParams.create({ key: key, iv: iv, salt: salt });\n\t        }\n\t    };\n\n\t    /**\n\t     * A serializable cipher wrapper that derives the key from a password,\n\t     * and returns ciphertext as a serializable cipher params object.\n\t     */\n\t    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n\t         */\n\t        cfg: SerializableCipher.cfg.extend({\n\t            kdf: OpenSSLKdf\n\t        }),\n\n\t        /**\n\t         * Encrypts a message using a password.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {WordArray|string} message The message to encrypt.\n\t         * @param {string} password The password.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {CipherParams} A cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n\t         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n\t         */\n\t        encrypt: function (cipher, message, password, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Derive key and other params\n\t            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);\n\n\t            // Add IV to config\n\t            cfg.iv = derivedParams.iv;\n\n\t            // Encrypt\n\t            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n\t            // Mix in derived params\n\t            ciphertext.mixIn(derivedParams);\n\n\t            return ciphertext;\n\t        },\n\n\t        /**\n\t         * Decrypts serialized ciphertext using a password.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t         * @param {string} password The password.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {WordArray} The plaintext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n\t         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n\t         */\n\t        decrypt: function (cipher, ciphertext, password, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Convert string to CipherParams\n\t            ciphertext = this._parse(ciphertext, cfg.format);\n\n\t            // Derive key and other params\n\t            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);\n\n\t            // Add IV to config\n\t            cfg.iv = derivedParams.iv;\n\n\t            // Decrypt\n\t            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n\t            return plaintext;\n\t        }\n\t    });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Cipher Feedback block mode.\n\t */\n\tCryptoJS.mode.CFB = (function () {\n\t    var CFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    CFB.Encryptor = CFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher;\n\t            var blockSize = cipher.blockSize;\n\n\t            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t            // Remember this block to use with next block\n\t            this._prevBlock = words.slice(offset, offset + blockSize);\n\t        }\n\t    });\n\n\t    CFB.Decryptor = CFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher;\n\t            var blockSize = cipher.blockSize;\n\n\t            // Remember this block to use with next block\n\t            var thisBlock = words.slice(offset, offset + blockSize);\n\n\t            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t            // This block becomes the previous block\n\t            this._prevBlock = thisBlock;\n\t        }\n\t    });\n\n\t    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {\n\t        var keystream;\n\n\t        // Shortcut\n\t        var iv = this._iv;\n\n\t        // Generate keystream\n\t        if (iv) {\n\t            keystream = iv.slice(0);\n\n\t            // Remove IV for subsequent blocks\n\t            this._iv = undefined;\n\t        } else {\n\t            keystream = this._prevBlock;\n\t        }\n\t        cipher.encryptBlock(keystream, 0);\n\n\t        // Encrypt\n\t        for (var i = 0; i < blockSize; i++) {\n\t            words[offset + i] ^= keystream[i];\n\t        }\n\t    }\n\n\t    return CFB;\n\t}());\n\n\n\treturn CryptoJS.mode.CFB;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Counter block mode.\n\t */\n\tCryptoJS.mode.CTR = (function () {\n\t    var CTR = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    var Encryptor = CTR.Encryptor = CTR.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var counter = this._counter;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                counter = this._counter = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\t            var keystream = counter.slice(0);\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Increment counter\n\t            counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    CTR.Decryptor = Encryptor;\n\n\t    return CTR;\n\t}());\n\n\n\treturn CryptoJS.mode.CTR;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/** @preserve\n\t * Counter block mode compatible with  Dr Brian Gladman fileenc.c\n\t * derived from CryptoJS.mode.CTR\n\t * Jan Hruby jhruby.web@gmail.com\n\t */\n\tCryptoJS.mode.CTRGladman = (function () {\n\t    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();\n\n\t\tfunction incWord(word)\n\t\t{\n\t\t\tif (((word >> 24) & 0xff) === 0xff) { //overflow\n\t\t\tvar b1 = (word >> 16)&0xff;\n\t\t\tvar b2 = (word >> 8)&0xff;\n\t\t\tvar b3 = word & 0xff;\n\n\t\t\tif (b1 === 0xff) // overflow b1\n\t\t\t{\n\t\t\tb1 = 0;\n\t\t\tif (b2 === 0xff)\n\t\t\t{\n\t\t\t\tb2 = 0;\n\t\t\t\tif (b3 === 0xff)\n\t\t\t\t{\n\t\t\t\t\tb3 = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t++b3;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++b2;\n\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t++b1;\n\t\t\t}\n\n\t\t\tword = 0;\n\t\t\tword += (b1 << 16);\n\t\t\tword += (b2 << 8);\n\t\t\tword += b3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\tword += (0x01 << 24);\n\t\t\t}\n\t\t\treturn word;\n\t\t}\n\n\t\tfunction incCounter(counter)\n\t\t{\n\t\t\tif ((counter[0] = incWord(counter[0])) === 0)\n\t\t\t{\n\t\t\t\t// encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8\n\t\t\t\tcounter[1] = incWord(counter[1]);\n\t\t\t}\n\t\t\treturn counter;\n\t\t}\n\n\t    var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var counter = this._counter;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                counter = this._counter = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\n\t\t\t\tincCounter(counter);\n\n\t\t\t\tvar keystream = counter.slice(0);\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    CTRGladman.Decryptor = Encryptor;\n\n\t    return CTRGladman;\n\t}());\n\n\n\n\n\treturn CryptoJS.mode.CTRGladman;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Output Feedback block mode.\n\t */\n\tCryptoJS.mode.OFB = (function () {\n\t    var OFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    var Encryptor = OFB.Encryptor = OFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var keystream = this._keystream;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                keystream = this._keystream = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    OFB.Decryptor = Encryptor;\n\n\t    return OFB;\n\t}());\n\n\n\treturn CryptoJS.mode.OFB;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Electronic Codebook block mode.\n\t */\n\tCryptoJS.mode.ECB = (function () {\n\t    var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    ECB.Encryptor = ECB.extend({\n\t        processBlock: function (words, offset) {\n\t            this._cipher.encryptBlock(words, offset);\n\t        }\n\t    });\n\n\t    ECB.Decryptor = ECB.extend({\n\t        processBlock: function (words, offset) {\n\t            this._cipher.decryptBlock(words, offset);\n\t        }\n\t    });\n\n\t    return ECB;\n\t}());\n\n\n\treturn CryptoJS.mode.ECB;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ANSI X.923 padding strategy.\n\t */\n\tCryptoJS.pad.AnsiX923 = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcuts\n\t        var dataSigBytes = data.sigBytes;\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Count padding bytes\n\t        var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\n\n\t        // Compute last byte position\n\t        var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n\t        // Pad\n\t        data.clamp();\n\t        data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n\t        data.sigBytes += nPaddingBytes;\n\t    },\n\n\t    unpad: function (data) {\n\t        // Get number of padding bytes from last byte\n\t        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t        // Remove padding\n\t        data.sigBytes -= nPaddingBytes;\n\t    }\n\t};\n\n\n\treturn CryptoJS.pad.Ansix923;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ISO 10126 padding strategy.\n\t */\n\tCryptoJS.pad.Iso10126 = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcut\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Count padding bytes\n\t        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t        // Pad\n\t        data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\n\t             concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n\t    },\n\n\t    unpad: function (data) {\n\t        // Get number of padding bytes from last byte\n\t        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t        // Remove padding\n\t        data.sigBytes -= nPaddingBytes;\n\t    }\n\t};\n\n\n\treturn CryptoJS.pad.Iso10126;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ISO/IEC 9797-1 Padding Method 2.\n\t */\n\tCryptoJS.pad.Iso97971 = {\n\t    pad: function (data, blockSize) {\n\t        // Add 0x80 byte\n\t        data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));\n\n\t        // Zero pad the rest\n\t        CryptoJS.pad.ZeroPadding.pad(data, blockSize);\n\t    },\n\n\t    unpad: function (data) {\n\t        // Remove zero padding\n\t        CryptoJS.pad.ZeroPadding.unpad(data);\n\n\t        // Remove one more byte -- the 0x80 byte\n\t        data.sigBytes--;\n\t    }\n\t};\n\n\n\treturn CryptoJS.pad.Iso97971;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Zero padding strategy.\n\t */\n\tCryptoJS.pad.ZeroPadding = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcut\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Pad\n\t        data.clamp();\n\t        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n\t    },\n\n\t    unpad: function (data) {\n\t        // Shortcut\n\t        var dataWords = data.words;\n\n\t        // Unpad\n\t        var i = data.sigBytes - 1;\n\t        for (var i = data.sigBytes - 1; i >= 0; i--) {\n\t            if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\n\t                data.sigBytes = i + 1;\n\t                break;\n\t            }\n\t        }\n\t    }\n\t};\n\n\n\treturn CryptoJS.pad.ZeroPadding;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * A noop padding strategy.\n\t */\n\tCryptoJS.pad.NoPadding = {\n\t    pad: function () {\n\t    },\n\n\t    unpad: function () {\n\t    }\n\t};\n\n\n\treturn CryptoJS.pad.NoPadding;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var CipherParams = C_lib.CipherParams;\n\t    var C_enc = C.enc;\n\t    var Hex = C_enc.Hex;\n\t    var C_format = C.format;\n\n\t    var HexFormatter = C_format.Hex = {\n\t        /**\n\t         * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.\n\t         *\n\t         * @param {CipherParams} cipherParams The cipher params object.\n\t         *\n\t         * @return {string} The hexadecimally encoded string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);\n\t         */\n\t        stringify: function (cipherParams) {\n\t            return cipherParams.ciphertext.toString(Hex);\n\t        },\n\n\t        /**\n\t         * Converts a hexadecimally encoded ciphertext string to a cipher params object.\n\t         *\n\t         * @param {string} input The hexadecimally encoded string.\n\t         *\n\t         * @return {CipherParams} The cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.format.Hex.parse(hexString);\n\t         */\n\t        parse: function (input) {\n\t            var ciphertext = Hex.parse(input);\n\t            return CipherParams.create({ ciphertext: ciphertext });\n\t        }\n\t    };\n\t}());\n\n\n\treturn CryptoJS.format.Hex;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var BlockCipher = C_lib.BlockCipher;\n\t    var C_algo = C.algo;\n\n\t    // Lookup tables\n\t    var SBOX = [];\n\t    var INV_SBOX = [];\n\t    var SUB_MIX_0 = [];\n\t    var SUB_MIX_1 = [];\n\t    var SUB_MIX_2 = [];\n\t    var SUB_MIX_3 = [];\n\t    var INV_SUB_MIX_0 = [];\n\t    var INV_SUB_MIX_1 = [];\n\t    var INV_SUB_MIX_2 = [];\n\t    var INV_SUB_MIX_3 = [];\n\n\t    // Compute lookup tables\n\t    (function () {\n\t        // Compute double table\n\t        var d = [];\n\t        for (var i = 0; i < 256; i++) {\n\t            if (i < 128) {\n\t                d[i] = i << 1;\n\t            } else {\n\t                d[i] = (i << 1) ^ 0x11b;\n\t            }\n\t        }\n\n\t        // Walk GF(2^8)\n\t        var x = 0;\n\t        var xi = 0;\n\t        for (var i = 0; i < 256; i++) {\n\t            // Compute sbox\n\t            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n\t            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n\t            SBOX[x] = sx;\n\t            INV_SBOX[sx] = x;\n\n\t            // Compute multiplication\n\t            var x2 = d[x];\n\t            var x4 = d[x2];\n\t            var x8 = d[x4];\n\n\t            // Compute sub bytes, mix columns tables\n\t            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n\t            SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n\t            SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n\t            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);\n\t            SUB_MIX_3[x] = t;\n\n\t            // Compute inv sub bytes, inv mix columns tables\n\t            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n\t            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n\t            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n\t            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);\n\t            INV_SUB_MIX_3[sx] = t;\n\n\t            // Compute next counter\n\t            if (!x) {\n\t                x = xi = 1;\n\t            } else {\n\t                x = x2 ^ d[d[d[x8 ^ x2]]];\n\t                xi ^= d[d[xi]];\n\t            }\n\t        }\n\t    }());\n\n\t    // Precomputed Rcon lookup\n\t    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n\t    /**\n\t     * AES block cipher algorithm.\n\t     */\n\t    var AES = C_algo.AES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            var t;\n\n\t            // Skip reset of nRounds has been set before and key did not change\n\t            if (this._nRounds && this._keyPriorReset === this._key) {\n\t                return;\n\t            }\n\n\t            // Shortcuts\n\t            var key = this._keyPriorReset = this._key;\n\t            var keyWords = key.words;\n\t            var keySize = key.sigBytes / 4;\n\n\t            // Compute number of rounds\n\t            var nRounds = this._nRounds = keySize + 6;\n\n\t            // Compute number of key schedule rows\n\t            var ksRows = (nRounds + 1) * 4;\n\n\t            // Compute key schedule\n\t            var keySchedule = this._keySchedule = [];\n\t            for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n\t                if (ksRow < keySize) {\n\t                    keySchedule[ksRow] = keyWords[ksRow];\n\t                } else {\n\t                    t = keySchedule[ksRow - 1];\n\n\t                    if (!(ksRow % keySize)) {\n\t                        // Rot word\n\t                        t = (t << 8) | (t >>> 24);\n\n\t                        // Sub word\n\t                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n\t                        // Mix Rcon\n\t                        t ^= RCON[(ksRow / keySize) | 0] << 24;\n\t                    } else if (keySize > 6 && ksRow % keySize == 4) {\n\t                        // Sub word\n\t                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\t                    }\n\n\t                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n\t                }\n\t            }\n\n\t            // Compute inv key schedule\n\t            var invKeySchedule = this._invKeySchedule = [];\n\t            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n\t                var ksRow = ksRows - invKsRow;\n\n\t                if (invKsRow % 4) {\n\t                    var t = keySchedule[ksRow];\n\t                } else {\n\t                    var t = keySchedule[ksRow - 4];\n\t                }\n\n\t                if (invKsRow < 4 || ksRow <= 4) {\n\t                    invKeySchedule[invKsRow] = t;\n\t                } else {\n\t                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n\t                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n\t                }\n\t            }\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            // Swap 2nd and 4th rows\n\t            var t = M[offset + 1];\n\t            M[offset + 1] = M[offset + 3];\n\t            M[offset + 3] = t;\n\n\t            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n\t            // Inv swap 2nd and 4th rows\n\t            var t = M[offset + 1];\n\t            M[offset + 1] = M[offset + 3];\n\t            M[offset + 3] = t;\n\t        },\n\n\t        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n\t            // Shortcut\n\t            var nRounds = this._nRounds;\n\n\t            // Get input, add round key\n\t            var s0 = M[offset]     ^ keySchedule[0];\n\t            var s1 = M[offset + 1] ^ keySchedule[1];\n\t            var s2 = M[offset + 2] ^ keySchedule[2];\n\t            var s3 = M[offset + 3] ^ keySchedule[3];\n\n\t            // Key schedule row counter\n\t            var ksRow = 4;\n\n\t            // Rounds\n\t            for (var round = 1; round < nRounds; round++) {\n\t                // Shift rows, sub bytes, mix columns, add round key\n\t                var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n\t                var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n\t                var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n\t                var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n\t                // Update state\n\t                s0 = t0;\n\t                s1 = t1;\n\t                s2 = t2;\n\t                s3 = t3;\n\t            }\n\n\t            // Shift rows, sub bytes, add round key\n\t            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n\t            // Set output\n\t            M[offset]     = t0;\n\t            M[offset + 1] = t1;\n\t            M[offset + 2] = t2;\n\t            M[offset + 3] = t3;\n\t        },\n\n\t        keySize: 256/32\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.AES = BlockCipher._createHelper(AES);\n\t}());\n\n\n\treturn CryptoJS.AES;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var BlockCipher = C_lib.BlockCipher;\n\t    var C_algo = C.algo;\n\n\t    // Permuted Choice 1 constants\n\t    var PC1 = [\n\t        57, 49, 41, 33, 25, 17, 9,  1,\n\t        58, 50, 42, 34, 26, 18, 10, 2,\n\t        59, 51, 43, 35, 27, 19, 11, 3,\n\t        60, 52, 44, 36, 63, 55, 47, 39,\n\t        31, 23, 15, 7,  62, 54, 46, 38,\n\t        30, 22, 14, 6,  61, 53, 45, 37,\n\t        29, 21, 13, 5,  28, 20, 12, 4\n\t    ];\n\n\t    // Permuted Choice 2 constants\n\t    var PC2 = [\n\t        14, 17, 11, 24, 1,  5,\n\t        3,  28, 15, 6,  21, 10,\n\t        23, 19, 12, 4,  26, 8,\n\t        16, 7,  27, 20, 13, 2,\n\t        41, 52, 31, 37, 47, 55,\n\t        30, 40, 51, 45, 33, 48,\n\t        44, 49, 39, 56, 34, 53,\n\t        46, 42, 50, 36, 29, 32\n\t    ];\n\n\t    // Cumulative bit shift constants\n\t    var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];\n\n\t    // SBOXes and round permutation constants\n\t    var SBOX_P = [\n\t        {\n\t            0x0: 0x808200,\n\t            0x10000000: 0x8000,\n\t            0x20000000: 0x808002,\n\t            0x30000000: 0x2,\n\t            0x40000000: 0x200,\n\t            0x50000000: 0x808202,\n\t            0x60000000: 0x800202,\n\t            0x70000000: 0x800000,\n\t            0x80000000: 0x202,\n\t            0x90000000: 0x800200,\n\t            0xa0000000: 0x8200,\n\t            0xb0000000: 0x808000,\n\t            0xc0000000: 0x8002,\n\t            0xd0000000: 0x800002,\n\t            0xe0000000: 0x0,\n\t            0xf0000000: 0x8202,\n\t            0x8000000: 0x0,\n\t            0x18000000: 0x808202,\n\t            0x28000000: 0x8202,\n\t            0x38000000: 0x8000,\n\t            0x48000000: 0x808200,\n\t            0x58000000: 0x200,\n\t            0x68000000: 0x808002,\n\t            0x78000000: 0x2,\n\t            0x88000000: 0x800200,\n\t            0x98000000: 0x8200,\n\t            0xa8000000: 0x808000,\n\t            0xb8000000: 0x800202,\n\t            0xc8000000: 0x800002,\n\t            0xd8000000: 0x8002,\n\t            0xe8000000: 0x202,\n\t            0xf8000000: 0x800000,\n\t            0x1: 0x8000,\n\t            0x10000001: 0x2,\n\t            0x20000001: 0x808200,\n\t            0x30000001: 0x800000,\n\t            0x40000001: 0x808002,\n\t            0x50000001: 0x8200,\n\t            0x60000001: 0x200,\n\t            0x70000001: 0x800202,\n\t            0x80000001: 0x808202,\n\t            0x90000001: 0x808000,\n\t            0xa0000001: 0x800002,\n\t            0xb0000001: 0x8202,\n\t            0xc0000001: 0x202,\n\t            0xd0000001: 0x800200,\n\t            0xe0000001: 0x8002,\n\t            0xf0000001: 0x0,\n\t            0x8000001: 0x808202,\n\t            0x18000001: 0x808000,\n\t            0x28000001: 0x800000,\n\t            0x38000001: 0x200,\n\t            0x48000001: 0x8000,\n\t            0x58000001: 0x800002,\n\t            0x68000001: 0x2,\n\t            0x78000001: 0x8202,\n\t            0x88000001: 0x8002,\n\t            0x98000001: 0x800202,\n\t            0xa8000001: 0x202,\n\t            0xb8000001: 0x808200,\n\t            0xc8000001: 0x800200,\n\t            0xd8000001: 0x0,\n\t            0xe8000001: 0x8200,\n\t            0xf8000001: 0x808002\n\t        },\n\t        {\n\t            0x0: 0x40084010,\n\t            0x1000000: 0x4000,\n\t            0x2000000: 0x80000,\n\t            0x3000000: 0x40080010,\n\t            0x4000000: 0x40000010,\n\t            0x5000000: 0x40084000,\n\t            0x6000000: 0x40004000,\n\t            0x7000000: 0x10,\n\t            0x8000000: 0x84000,\n\t            0x9000000: 0x40004010,\n\t            0xa000000: 0x40000000,\n\t            0xb000000: 0x84010,\n\t            0xc000000: 0x80010,\n\t            0xd000000: 0x0,\n\t            0xe000000: 0x4010,\n\t            0xf000000: 0x40080000,\n\t            0x800000: 0x40004000,\n\t            0x1800000: 0x84010,\n\t            0x2800000: 0x10,\n\t            0x3800000: 0x40004010,\n\t            0x4800000: 0x40084010,\n\t            0x5800000: 0x40000000,\n\t            0x6800000: 0x80000,\n\t            0x7800000: 0x40080010,\n\t            0x8800000: 0x80010,\n\t            0x9800000: 0x0,\n\t            0xa800000: 0x4000,\n\t            0xb800000: 0x40080000,\n\t            0xc800000: 0x40000010,\n\t            0xd800000: 0x84000,\n\t            0xe800000: 0x40084000,\n\t            0xf800000: 0x4010,\n\t            0x10000000: 0x0,\n\t            0x11000000: 0x40080010,\n\t            0x12000000: 0x40004010,\n\t            0x13000000: 0x40084000,\n\t            0x14000000: 0x40080000,\n\t            0x15000000: 0x10,\n\t            0x16000000: 0x84010,\n\t            0x17000000: 0x4000,\n\t            0x18000000: 0x4010,\n\t            0x19000000: 0x80000,\n\t            0x1a000000: 0x80010,\n\t            0x1b000000: 0x40000010,\n\t            0x1c000000: 0x84000,\n\t            0x1d000000: 0x40004000,\n\t            0x1e000000: 0x40000000,\n\t            0x1f000000: 0x40084010,\n\t            0x10800000: 0x84010,\n\t            0x11800000: 0x80000,\n\t            0x12800000: 0x40080000,\n\t            0x13800000: 0x4000,\n\t            0x14800000: 0x40004000,\n\t            0x15800000: 0x40084010,\n\t            0x16800000: 0x10,\n\t            0x17800000: 0x40000000,\n\t            0x18800000: 0x40084000,\n\t            0x19800000: 0x40000010,\n\t            0x1a800000: 0x40004010,\n\t            0x1b800000: 0x80010,\n\t            0x1c800000: 0x0,\n\t            0x1d800000: 0x4010,\n\t            0x1e800000: 0x40080010,\n\t            0x1f800000: 0x84000\n\t        },\n\t        {\n\t            0x0: 0x104,\n\t            0x100000: 0x0,\n\t            0x200000: 0x4000100,\n\t            0x300000: 0x10104,\n\t            0x400000: 0x10004,\n\t            0x500000: 0x4000004,\n\t            0x600000: 0x4010104,\n\t            0x700000: 0x4010000,\n\t            0x800000: 0x4000000,\n\t            0x900000: 0x4010100,\n\t            0xa00000: 0x10100,\n\t            0xb00000: 0x4010004,\n\t            0xc00000: 0x4000104,\n\t            0xd00000: 0x10000,\n\t            0xe00000: 0x4,\n\t            0xf00000: 0x100,\n\t            0x80000: 0x4010100,\n\t            0x180000: 0x4010004,\n\t            0x280000: 0x0,\n\t            0x380000: 0x4000100,\n\t            0x480000: 0x4000004,\n\t            0x580000: 0x10000,\n\t            0x680000: 0x10004,\n\t            0x780000: 0x104,\n\t            0x880000: 0x4,\n\t            0x980000: 0x100,\n\t            0xa80000: 0x4010000,\n\t            0xb80000: 0x10104,\n\t            0xc80000: 0x10100,\n\t            0xd80000: 0x4000104,\n\t            0xe80000: 0x4010104,\n\t            0xf80000: 0x4000000,\n\t            0x1000000: 0x4010100,\n\t            0x1100000: 0x10004,\n\t            0x1200000: 0x10000,\n\t            0x1300000: 0x4000100,\n\t            0x1400000: 0x100,\n\t            0x1500000: 0x4010104,\n\t            0x1600000: 0x4000004,\n\t            0x1700000: 0x0,\n\t            0x1800000: 0x4000104,\n\t            0x1900000: 0x4000000,\n\t            0x1a00000: 0x4,\n\t            0x1b00000: 0x10100,\n\t            0x1c00000: 0x4010000,\n\t            0x1d00000: 0x104,\n\t            0x1e00000: 0x10104,\n\t            0x1f00000: 0x4010004,\n\t            0x1080000: 0x4000000,\n\t            0x1180000: 0x104,\n\t            0x1280000: 0x4010100,\n\t            0x1380000: 0x0,\n\t            0x1480000: 0x10004,\n\t            0x1580000: 0x4000100,\n\t            0x1680000: 0x100,\n\t            0x1780000: 0x4010004,\n\t            0x1880000: 0x10000,\n\t            0x1980000: 0x4010104,\n\t            0x1a80000: 0x10104,\n\t            0x1b80000: 0x4000004,\n\t            0x1c80000: 0x4000104,\n\t            0x1d80000: 0x4010000,\n\t            0x1e80000: 0x4,\n\t            0x1f80000: 0x10100\n\t        },\n\t        {\n\t            0x0: 0x80401000,\n\t            0x10000: 0x80001040,\n\t            0x20000: 0x401040,\n\t            0x30000: 0x80400000,\n\t            0x40000: 0x0,\n\t            0x50000: 0x401000,\n\t            0x60000: 0x80000040,\n\t            0x70000: 0x400040,\n\t            0x80000: 0x80000000,\n\t            0x90000: 0x400000,\n\t            0xa0000: 0x40,\n\t            0xb0000: 0x80001000,\n\t            0xc0000: 0x80400040,\n\t            0xd0000: 0x1040,\n\t            0xe0000: 0x1000,\n\t            0xf0000: 0x80401040,\n\t            0x8000: 0x80001040,\n\t            0x18000: 0x40,\n\t            0x28000: 0x80400040,\n\t            0x38000: 0x80001000,\n\t            0x48000: 0x401000,\n\t            0x58000: 0x80401040,\n\t            0x68000: 0x0,\n\t            0x78000: 0x80400000,\n\t            0x88000: 0x1000,\n\t            0x98000: 0x80401000,\n\t            0xa8000: 0x400000,\n\t            0xb8000: 0x1040,\n\t            0xc8000: 0x80000000,\n\t            0xd8000: 0x400040,\n\t            0xe8000: 0x401040,\n\t            0xf8000: 0x80000040,\n\t            0x100000: 0x400040,\n\t            0x110000: 0x401000,\n\t            0x120000: 0x80000040,\n\t            0x130000: 0x0,\n\t            0x140000: 0x1040,\n\t            0x150000: 0x80400040,\n\t            0x160000: 0x80401000,\n\t            0x170000: 0x80001040,\n\t            0x180000: 0x80401040,\n\t            0x190000: 0x80000000,\n\t            0x1a0000: 0x80400000,\n\t            0x1b0000: 0x401040,\n\t            0x1c0000: 0x80001000,\n\t            0x1d0000: 0x400000,\n\t            0x1e0000: 0x40,\n\t            0x1f0000: 0x1000,\n\t            0x108000: 0x80400000,\n\t            0x118000: 0x80401040,\n\t            0x128000: 0x0,\n\t            0x138000: 0x401000,\n\t            0x148000: 0x400040,\n\t            0x158000: 0x80000000,\n\t            0x168000: 0x80001040,\n\t            0x178000: 0x40,\n\t            0x188000: 0x80000040,\n\t            0x198000: 0x1000,\n\t            0x1a8000: 0x80001000,\n\t            0x1b8000: 0x80400040,\n\t            0x1c8000: 0x1040,\n\t            0x1d8000: 0x80401000,\n\t            0x1e8000: 0x400000,\n\t            0x1f8000: 0x401040\n\t        },\n\t        {\n\t            0x0: 0x80,\n\t            0x1000: 0x1040000,\n\t            0x2000: 0x40000,\n\t            0x3000: 0x20000000,\n\t            0x4000: 0x20040080,\n\t            0x5000: 0x1000080,\n\t            0x6000: 0x21000080,\n\t            0x7000: 0x40080,\n\t            0x8000: 0x1000000,\n\t            0x9000: 0x20040000,\n\t            0xa000: 0x20000080,\n\t            0xb000: 0x21040080,\n\t            0xc000: 0x21040000,\n\t            0xd000: 0x0,\n\t            0xe000: 0x1040080,\n\t            0xf000: 0x21000000,\n\t            0x800: 0x1040080,\n\t            0x1800: 0x21000080,\n\t            0x2800: 0x80,\n\t            0x3800: 0x1040000,\n\t            0x4800: 0x40000,\n\t            0x5800: 0x20040080,\n\t            0x6800: 0x21040000,\n\t            0x7800: 0x20000000,\n\t            0x8800: 0x20040000,\n\t            0x9800: 0x0,\n\t            0xa800: 0x21040080,\n\t            0xb800: 0x1000080,\n\t            0xc800: 0x20000080,\n\t            0xd800: 0x21000000,\n\t            0xe800: 0x1000000,\n\t            0xf800: 0x40080,\n\t            0x10000: 0x40000,\n\t            0x11000: 0x80,\n\t            0x12000: 0x20000000,\n\t            0x13000: 0x21000080,\n\t            0x14000: 0x1000080,\n\t            0x15000: 0x21040000,\n\t            0x16000: 0x20040080,\n\t            0x17000: 0x1000000,\n\t            0x18000: 0x21040080,\n\t            0x19000: 0x21000000,\n\t            0x1a000: 0x1040000,\n\t            0x1b000: 0x20040000,\n\t            0x1c000: 0x40080,\n\t            0x1d000: 0x20000080,\n\t            0x1e000: 0x0,\n\t            0x1f000: 0x1040080,\n\t            0x10800: 0x21000080,\n\t            0x11800: 0x1000000,\n\t            0x12800: 0x1040000,\n\t            0x13800: 0x20040080,\n\t            0x14800: 0x20000000,\n\t            0x15800: 0x1040080,\n\t            0x16800: 0x80,\n\t            0x17800: 0x21040000,\n\t            0x18800: 0x40080,\n\t            0x19800: 0x21040080,\n\t            0x1a800: 0x0,\n\t            0x1b800: 0x21000000,\n\t            0x1c800: 0x1000080,\n\t            0x1d800: 0x40000,\n\t            0x1e800: 0x20040000,\n\t            0x1f800: 0x20000080\n\t        },\n\t        {\n\t            0x0: 0x10000008,\n\t            0x100: 0x2000,\n\t            0x200: 0x10200000,\n\t            0x300: 0x10202008,\n\t            0x400: 0x10002000,\n\t            0x500: 0x200000,\n\t            0x600: 0x200008,\n\t            0x700: 0x10000000,\n\t            0x800: 0x0,\n\t            0x900: 0x10002008,\n\t            0xa00: 0x202000,\n\t            0xb00: 0x8,\n\t            0xc00: 0x10200008,\n\t            0xd00: 0x202008,\n\t            0xe00: 0x2008,\n\t            0xf00: 0x10202000,\n\t            0x80: 0x10200000,\n\t            0x180: 0x10202008,\n\t            0x280: 0x8,\n\t            0x380: 0x200000,\n\t            0x480: 0x202008,\n\t            0x580: 0x10000008,\n\t            0x680: 0x10002000,\n\t            0x780: 0x2008,\n\t            0x880: 0x200008,\n\t            0x980: 0x2000,\n\t            0xa80: 0x10002008,\n\t            0xb80: 0x10200008,\n\t            0xc80: 0x0,\n\t            0xd80: 0x10202000,\n\t            0xe80: 0x202000,\n\t            0xf80: 0x10000000,\n\t            0x1000: 0x10002000,\n\t            0x1100: 0x10200008,\n\t            0x1200: 0x10202008,\n\t            0x1300: 0x2008,\n\t            0x1400: 0x200000,\n\t            0x1500: 0x10000000,\n\t            0x1600: 0x10000008,\n\t            0x1700: 0x202000,\n\t            0x1800: 0x202008,\n\t            0x1900: 0x0,\n\t            0x1a00: 0x8,\n\t            0x1b00: 0x10200000,\n\t            0x1c00: 0x2000,\n\t            0x1d00: 0x10002008,\n\t            0x1e00: 0x10202000,\n\t            0x1f00: 0x200008,\n\t            0x1080: 0x8,\n\t            0x1180: 0x202000,\n\t            0x1280: 0x200000,\n\t            0x1380: 0x10000008,\n\t            0x1480: 0x10002000,\n\t            0x1580: 0x2008,\n\t            0x1680: 0x10202008,\n\t            0x1780: 0x10200000,\n\t            0x1880: 0x10202000,\n\t            0x1980: 0x10200008,\n\t            0x1a80: 0x2000,\n\t            0x1b80: 0x202008,\n\t            0x1c80: 0x200008,\n\t            0x1d80: 0x0,\n\t            0x1e80: 0x10000000,\n\t            0x1f80: 0x10002008\n\t        },\n\t        {\n\t            0x0: 0x100000,\n\t            0x10: 0x2000401,\n\t            0x20: 0x400,\n\t            0x30: 0x100401,\n\t            0x40: 0x2100401,\n\t            0x50: 0x0,\n\t            0x60: 0x1,\n\t            0x70: 0x2100001,\n\t            0x80: 0x2000400,\n\t            0x90: 0x100001,\n\t            0xa0: 0x2000001,\n\t            0xb0: 0x2100400,\n\t            0xc0: 0x2100000,\n\t            0xd0: 0x401,\n\t            0xe0: 0x100400,\n\t            0xf0: 0x2000000,\n\t            0x8: 0x2100001,\n\t            0x18: 0x0,\n\t            0x28: 0x2000401,\n\t            0x38: 0x2100400,\n\t            0x48: 0x100000,\n\t            0x58: 0x2000001,\n\t            0x68: 0x2000000,\n\t            0x78: 0x401,\n\t            0x88: 0x100401,\n\t            0x98: 0x2000400,\n\t            0xa8: 0x2100000,\n\t            0xb8: 0x100001,\n\t            0xc8: 0x400,\n\t            0xd8: 0x2100401,\n\t            0xe8: 0x1,\n\t            0xf8: 0x100400,\n\t            0x100: 0x2000000,\n\t            0x110: 0x100000,\n\t            0x120: 0x2000401,\n\t            0x130: 0x2100001,\n\t            0x140: 0x100001,\n\t            0x150: 0x2000400,\n\t            0x160: 0x2100400,\n\t            0x170: 0x100401,\n\t            0x180: 0x401,\n\t            0x190: 0x2100401,\n\t            0x1a0: 0x100400,\n\t            0x1b0: 0x1,\n\t            0x1c0: 0x0,\n\t            0x1d0: 0x2100000,\n\t            0x1e0: 0x2000001,\n\t            0x1f0: 0x400,\n\t            0x108: 0x100400,\n\t            0x118: 0x2000401,\n\t            0x128: 0x2100001,\n\t            0x138: 0x1,\n\t            0x148: 0x2000000,\n\t            0x158: 0x100000,\n\t            0x168: 0x401,\n\t            0x178: 0x2100400,\n\t            0x188: 0x2000001,\n\t            0x198: 0x2100000,\n\t            0x1a8: 0x0,\n\t            0x1b8: 0x2100401,\n\t            0x1c8: 0x100401,\n\t            0x1d8: 0x400,\n\t            0x1e8: 0x2000400,\n\t            0x1f8: 0x100001\n\t        },\n\t        {\n\t            0x0: 0x8000820,\n\t            0x1: 0x20000,\n\t            0x2: 0x8000000,\n\t            0x3: 0x20,\n\t            0x4: 0x20020,\n\t            0x5: 0x8020820,\n\t            0x6: 0x8020800,\n\t            0x7: 0x800,\n\t            0x8: 0x8020000,\n\t            0x9: 0x8000800,\n\t            0xa: 0x20800,\n\t            0xb: 0x8020020,\n\t            0xc: 0x820,\n\t            0xd: 0x0,\n\t            0xe: 0x8000020,\n\t            0xf: 0x20820,\n\t            0x80000000: 0x800,\n\t            0x80000001: 0x8020820,\n\t            0x80000002: 0x8000820,\n\t            0x80000003: 0x8000000,\n\t            0x80000004: 0x8020000,\n\t            0x80000005: 0x20800,\n\t            0x80000006: 0x20820,\n\t            0x80000007: 0x20,\n\t            0x80000008: 0x8000020,\n\t            0x80000009: 0x820,\n\t            0x8000000a: 0x20020,\n\t            0x8000000b: 0x8020800,\n\t            0x8000000c: 0x0,\n\t            0x8000000d: 0x8020020,\n\t            0x8000000e: 0x8000800,\n\t            0x8000000f: 0x20000,\n\t            0x10: 0x20820,\n\t            0x11: 0x8020800,\n\t            0x12: 0x20,\n\t            0x13: 0x800,\n\t            0x14: 0x8000800,\n\t            0x15: 0x8000020,\n\t            0x16: 0x8020020,\n\t            0x17: 0x20000,\n\t            0x18: 0x0,\n\t            0x19: 0x20020,\n\t            0x1a: 0x8020000,\n\t            0x1b: 0x8000820,\n\t            0x1c: 0x8020820,\n\t            0x1d: 0x20800,\n\t            0x1e: 0x820,\n\t            0x1f: 0x8000000,\n\t            0x80000010: 0x20000,\n\t            0x80000011: 0x800,\n\t            0x80000012: 0x8020020,\n\t            0x80000013: 0x20820,\n\t            0x80000014: 0x20,\n\t            0x80000015: 0x8020000,\n\t            0x80000016: 0x8000000,\n\t            0x80000017: 0x8000820,\n\t            0x80000018: 0x8020820,\n\t            0x80000019: 0x8000020,\n\t            0x8000001a: 0x8000800,\n\t            0x8000001b: 0x0,\n\t            0x8000001c: 0x20800,\n\t            0x8000001d: 0x820,\n\t            0x8000001e: 0x20020,\n\t            0x8000001f: 0x8020800\n\t        }\n\t    ];\n\n\t    // Masks that select the SBOX input\n\t    var SBOX_MASK = [\n\t        0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,\n\t        0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f\n\t    ];\n\n\t    /**\n\t     * DES block cipher algorithm.\n\t     */\n\t    var DES = C_algo.DES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\n\t            // Select 56 bits according to PC1\n\t            var keyBits = [];\n\t            for (var i = 0; i < 56; i++) {\n\t                var keyBitPos = PC1[i] - 1;\n\t                keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;\n\t            }\n\n\t            // Assemble 16 subkeys\n\t            var subKeys = this._subKeys = [];\n\t            for (var nSubKey = 0; nSubKey < 16; nSubKey++) {\n\t                // Create subkey\n\t                var subKey = subKeys[nSubKey] = [];\n\n\t                // Shortcut\n\t                var bitShift = BIT_SHIFTS[nSubKey];\n\n\t                // Select 48 bits according to PC2\n\t                for (var i = 0; i < 24; i++) {\n\t                    // Select from the left 28 key bits\n\t                    subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);\n\n\t                    // Select from the right 28 key bits\n\t                    subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);\n\t                }\n\n\t                // Since each subkey is applied to an expanded 32-bit input,\n\t                // the subkey can be broken into 8 values scaled to 32-bits,\n\t                // which allows the key to be used without expansion\n\t                subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);\n\t                for (var i = 1; i < 7; i++) {\n\t                    subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);\n\t                }\n\t                subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);\n\t            }\n\n\t            // Compute inverse subkeys\n\t            var invSubKeys = this._invSubKeys = [];\n\t            for (var i = 0; i < 16; i++) {\n\t                invSubKeys[i] = subKeys[15 - i];\n\t            }\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._subKeys);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._invSubKeys);\n\t        },\n\n\t        _doCryptBlock: function (M, offset, subKeys) {\n\t            // Get input\n\t            this._lBlock = M[offset];\n\t            this._rBlock = M[offset + 1];\n\n\t            // Initial permutation\n\t            exchangeLR.call(this, 4,  0x0f0f0f0f);\n\t            exchangeLR.call(this, 16, 0x0000ffff);\n\t            exchangeRL.call(this, 2,  0x33333333);\n\t            exchangeRL.call(this, 8,  0x00ff00ff);\n\t            exchangeLR.call(this, 1,  0x55555555);\n\n\t            // Rounds\n\t            for (var round = 0; round < 16; round++) {\n\t                // Shortcuts\n\t                var subKey = subKeys[round];\n\t                var lBlock = this._lBlock;\n\t                var rBlock = this._rBlock;\n\n\t                // Feistel function\n\t                var f = 0;\n\t                for (var i = 0; i < 8; i++) {\n\t                    f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];\n\t                }\n\t                this._lBlock = rBlock;\n\t                this._rBlock = lBlock ^ f;\n\t            }\n\n\t            // Undo swap from last round\n\t            var t = this._lBlock;\n\t            this._lBlock = this._rBlock;\n\t            this._rBlock = t;\n\n\t            // Final permutation\n\t            exchangeLR.call(this, 1,  0x55555555);\n\t            exchangeRL.call(this, 8,  0x00ff00ff);\n\t            exchangeRL.call(this, 2,  0x33333333);\n\t            exchangeLR.call(this, 16, 0x0000ffff);\n\t            exchangeLR.call(this, 4,  0x0f0f0f0f);\n\n\t            // Set output\n\t            M[offset] = this._lBlock;\n\t            M[offset + 1] = this._rBlock;\n\t        },\n\n\t        keySize: 64/32,\n\n\t        ivSize: 64/32,\n\n\t        blockSize: 64/32\n\t    });\n\n\t    // Swap bits across the left and right words\n\t    function exchangeLR(offset, mask) {\n\t        var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;\n\t        this._rBlock ^= t;\n\t        this._lBlock ^= t << offset;\n\t    }\n\n\t    function exchangeRL(offset, mask) {\n\t        var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;\n\t        this._lBlock ^= t;\n\t        this._rBlock ^= t << offset;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.DES = BlockCipher._createHelper(DES);\n\n\t    /**\n\t     * Triple-DES block cipher algorithm.\n\t     */\n\t    var TripleDES = C_algo.TripleDES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\t            // Make sure the key length is valid (64, 128 or >= 192 bit)\n\t            if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {\n\t                throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');\n\t            }\n\n\t            // Extend the key according to the keying options defined in 3DES standard\n\t            var key1 = keyWords.slice(0, 2);\n\t            var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);\n\t            var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);\n\n\t            // Create DES instances\n\t            this._des1 = DES.createEncryptor(WordArray.create(key1));\n\t            this._des2 = DES.createEncryptor(WordArray.create(key2));\n\t            this._des3 = DES.createEncryptor(WordArray.create(key3));\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._des1.encryptBlock(M, offset);\n\t            this._des2.decryptBlock(M, offset);\n\t            this._des3.encryptBlock(M, offset);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            this._des3.decryptBlock(M, offset);\n\t            this._des2.encryptBlock(M, offset);\n\t            this._des1.decryptBlock(M, offset);\n\t        },\n\n\t        keySize: 192/32,\n\n\t        ivSize: 64/32,\n\n\t        blockSize: 64/32\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.TripleDES = BlockCipher._createHelper(TripleDES);\n\t}());\n\n\n\treturn CryptoJS.TripleDES;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    /**\n\t     * RC4 stream cipher algorithm.\n\t     */\n\t    var RC4 = C_algo.RC4 = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\t            var keySigBytes = key.sigBytes;\n\n\t            // Init sbox\n\t            var S = this._S = [];\n\t            for (var i = 0; i < 256; i++) {\n\t                S[i] = i;\n\t            }\n\n\t            // Key setup\n\t            for (var i = 0, j = 0; i < 256; i++) {\n\t                var keyByteIndex = i % keySigBytes;\n\t                var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;\n\n\t                j = (j + S[i] + keyByte) % 256;\n\n\t                // Swap\n\t                var t = S[i];\n\t                S[i] = S[j];\n\t                S[j] = t;\n\t            }\n\n\t            // Counters\n\t            this._i = this._j = 0;\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            M[offset] ^= generateKeystreamWord.call(this);\n\t        },\n\n\t        keySize: 256/32,\n\n\t        ivSize: 0\n\t    });\n\n\t    function generateKeystreamWord() {\n\t        // Shortcuts\n\t        var S = this._S;\n\t        var i = this._i;\n\t        var j = this._j;\n\n\t        // Generate keystream word\n\t        var keystreamWord = 0;\n\t        for (var n = 0; n < 4; n++) {\n\t            i = (i + 1) % 256;\n\t            j = (j + S[i]) % 256;\n\n\t            // Swap\n\t            var t = S[i];\n\t            S[i] = S[j];\n\t            S[j] = t;\n\n\t            keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\n\t        }\n\n\t        // Update counters\n\t        this._i = i;\n\t        this._j = j;\n\n\t        return keystreamWord;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RC4 = StreamCipher._createHelper(RC4);\n\n\t    /**\n\t     * Modified RC4 stream cipher algorithm.\n\t     */\n\t    var RC4Drop = C_algo.RC4Drop = RC4.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} drop The number of keystream words to drop. Default 192\n\t         */\n\t        cfg: RC4.cfg.extend({\n\t            drop: 192\n\t        }),\n\n\t        _doReset: function () {\n\t            RC4._doReset.call(this);\n\n\t            // Drop\n\t            for (var i = this.cfg.drop; i > 0; i--) {\n\t                generateKeystreamWord.call(this);\n\t            }\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RC4Drop = StreamCipher._createHelper(RC4Drop);\n\t}());\n\n\n\treturn CryptoJS.RC4;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable objects\n\t    var S  = [];\n\t    var C_ = [];\n\t    var G  = [];\n\n\t    /**\n\t     * Rabbit stream cipher algorithm\n\t     */\n\t    var Rabbit = C_algo.Rabbit = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var K = this._key.words;\n\t            var iv = this.cfg.iv;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 4; i++) {\n\t                K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Generate initial state values\n\t            var X = this._X = [\n\t                K[0], (K[3] << 16) | (K[2] >>> 16),\n\t                K[1], (K[0] << 16) | (K[3] >>> 16),\n\t                K[2], (K[1] << 16) | (K[0] >>> 16),\n\t                K[3], (K[2] << 16) | (K[1] >>> 16)\n\t            ];\n\n\t            // Generate initial counter values\n\t            var C = this._C = [\n\t                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t            ];\n\n\t            // Carry bit\n\t            this._b = 0;\n\n\t            // Iterate the system four times\n\t            for (var i = 0; i < 4; i++) {\n\t                nextState.call(this);\n\t            }\n\n\t            // Modify the counters\n\t            for (var i = 0; i < 8; i++) {\n\t                C[i] ^= X[(i + 4) & 7];\n\t            }\n\n\t            // IV setup\n\t            if (iv) {\n\t                // Shortcuts\n\t                var IV = iv.words;\n\t                var IV_0 = IV[0];\n\t                var IV_1 = IV[1];\n\n\t                // Generate four subvectors\n\t                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);\n\n\t                // Modify counter values\n\t                C[0] ^= i0;\n\t                C[1] ^= i1;\n\t                C[2] ^= i2;\n\t                C[3] ^= i3;\n\t                C[4] ^= i0;\n\t                C[5] ^= i1;\n\t                C[6] ^= i2;\n\t                C[7] ^= i3;\n\n\t                // Iterate the system four times\n\t                for (var i = 0; i < 4; i++) {\n\t                    nextState.call(this);\n\t                }\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var X = this._X;\n\n\t            // Iterate the system\n\t            nextState.call(this);\n\n\t            // Generate four keystream words\n\t            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t            for (var i = 0; i < 4; i++) {\n\t                // Swap endian\n\t                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);\n\n\t                // Encrypt\n\t                M[offset + i] ^= S[i];\n\t            }\n\t        },\n\n\t        blockSize: 128/32,\n\n\t        ivSize: 64/32\n\t    });\n\n\t    function nextState() {\n\t        // Shortcuts\n\t        var X = this._X;\n\t        var C = this._C;\n\n\t        // Save old counter values\n\t        for (var i = 0; i < 8; i++) {\n\t            C_[i] = C[i];\n\t        }\n\n\t        // Calculate new counter values\n\t        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t        // Calculate the g-values\n\t        for (var i = 0; i < 8; i++) {\n\t            var gx = X[i] + C[i];\n\n\t            // Construct high and low argument for squaring\n\t            var ga = gx & 0xffff;\n\t            var gb = gx >>> 16;\n\n\t            // Calculate high and low result of squaring\n\t            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t            // High XOR low\n\t            G[i] = gh ^ gl;\n\t        }\n\n\t        // Calculate new state values\n\t        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;\n\t        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;\n\t        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;\n\t        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.Rabbit = StreamCipher._createHelper(Rabbit);\n\t}());\n\n\n\treturn CryptoJS.Rabbit;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable objects\n\t    var S  = [];\n\t    var C_ = [];\n\t    var G  = [];\n\n\t    /**\n\t     * Rabbit stream cipher algorithm.\n\t     *\n\t     * This is a legacy version that neglected to convert the key to little-endian.\n\t     * This error doesn't affect the cipher's security,\n\t     * but it does affect its compatibility with other implementations.\n\t     */\n\t    var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var K = this._key.words;\n\t            var iv = this.cfg.iv;\n\n\t            // Generate initial state values\n\t            var X = this._X = [\n\t                K[0], (K[3] << 16) | (K[2] >>> 16),\n\t                K[1], (K[0] << 16) | (K[3] >>> 16),\n\t                K[2], (K[1] << 16) | (K[0] >>> 16),\n\t                K[3], (K[2] << 16) | (K[1] >>> 16)\n\t            ];\n\n\t            // Generate initial counter values\n\t            var C = this._C = [\n\t                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t            ];\n\n\t            // Carry bit\n\t            this._b = 0;\n\n\t            // Iterate the system four times\n\t            for (var i = 0; i < 4; i++) {\n\t                nextState.call(this);\n\t            }\n\n\t            // Modify the counters\n\t            for (var i = 0; i < 8; i++) {\n\t                C[i] ^= X[(i + 4) & 7];\n\t            }\n\n\t            // IV setup\n\t            if (iv) {\n\t                // Shortcuts\n\t                var IV = iv.words;\n\t                var IV_0 = IV[0];\n\t                var IV_1 = IV[1];\n\n\t                // Generate four subvectors\n\t                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);\n\n\t                // Modify counter values\n\t                C[0] ^= i0;\n\t                C[1] ^= i1;\n\t                C[2] ^= i2;\n\t                C[3] ^= i3;\n\t                C[4] ^= i0;\n\t                C[5] ^= i1;\n\t                C[6] ^= i2;\n\t                C[7] ^= i3;\n\n\t                // Iterate the system four times\n\t                for (var i = 0; i < 4; i++) {\n\t                    nextState.call(this);\n\t                }\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var X = this._X;\n\n\t            // Iterate the system\n\t            nextState.call(this);\n\n\t            // Generate four keystream words\n\t            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t            for (var i = 0; i < 4; i++) {\n\t                // Swap endian\n\t                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);\n\n\t                // Encrypt\n\t                M[offset + i] ^= S[i];\n\t            }\n\t        },\n\n\t        blockSize: 128/32,\n\n\t        ivSize: 64/32\n\t    });\n\n\t    function nextState() {\n\t        // Shortcuts\n\t        var X = this._X;\n\t        var C = this._C;\n\n\t        // Save old counter values\n\t        for (var i = 0; i < 8; i++) {\n\t            C_[i] = C[i];\n\t        }\n\n\t        // Calculate new counter values\n\t        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t        // Calculate the g-values\n\t        for (var i = 0; i < 8; i++) {\n\t            var gx = X[i] + C[i];\n\n\t            // Construct high and low argument for squaring\n\t            var ga = gx & 0xffff;\n\t            var gb = gx >>> 16;\n\n\t            // Calculate high and low result of squaring\n\t            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t            // High XOR low\n\t            G[i] = gh ^ gl;\n\t        }\n\n\t        // Calculate new state values\n\t        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;\n\t        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;\n\t        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;\n\t        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);\n\t}());\n\n\n\treturn CryptoJS.RabbitLegacy;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var BlockCipher = C_lib.BlockCipher;\n\t    var C_algo = C.algo;\n\n\t    const N = 16;\n\n\t    //Origin pbox and sbox, derived from PI\n\t    const ORIG_P = [\n\t        0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,\n\t        0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,\n\t        0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,\n\t        0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,\n\t        0x9216D5D9, 0x8979FB1B\n\t    ];\n\n\t    const ORIG_S = [\n\t        [   0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,\n\t            0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,\n\t            0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,\n\t            0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,\n\t            0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,\n\t            0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,\n\t            0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,\n\t            0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,\n\t            0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,\n\t            0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,\n\t            0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,\n\t            0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,\n\t            0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,\n\t            0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,\n\t            0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,\n\t            0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,\n\t            0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,\n\t            0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,\n\t            0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,\n\t            0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,\n\t            0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,\n\t            0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,\n\t            0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,\n\t            0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,\n\t            0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,\n\t            0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,\n\t            0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,\n\t            0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,\n\t            0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,\n\t            0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,\n\t            0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,\n\t            0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,\n\t            0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,\n\t            0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,\n\t            0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,\n\t            0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,\n\t            0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,\n\t            0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,\n\t            0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,\n\t            0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,\n\t            0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,\n\t            0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,\n\t            0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,\n\t            0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,\n\t            0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,\n\t            0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,\n\t            0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,\n\t            0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,\n\t            0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,\n\t            0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,\n\t            0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,\n\t            0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,\n\t            0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,\n\t            0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,\n\t            0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,\n\t            0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,\n\t            0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,\n\t            0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,\n\t            0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,\n\t            0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,\n\t            0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,\n\t            0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,\n\t            0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,\n\t            0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A   ],\n\t        [   0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,\n\t            0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,\n\t            0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,\n\t            0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,\n\t            0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,\n\t            0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,\n\t            0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,\n\t            0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,\n\t            0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,\n\t            0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,\n\t            0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,\n\t            0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,\n\t            0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,\n\t            0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,\n\t            0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,\n\t            0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,\n\t            0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,\n\t            0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,\n\t            0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,\n\t            0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,\n\t            0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,\n\t            0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,\n\t            0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,\n\t            0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,\n\t            0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,\n\t            0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,\n\t            0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,\n\t            0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,\n\t            0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,\n\t            0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,\n\t            0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,\n\t            0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,\n\t            0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,\n\t            0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,\n\t            0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,\n\t            0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,\n\t            0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,\n\t            0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,\n\t            0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,\n\t            0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,\n\t            0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,\n\t            0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,\n\t            0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,\n\t            0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,\n\t            0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,\n\t            0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,\n\t            0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,\n\t            0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,\n\t            0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,\n\t            0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,\n\t            0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,\n\t            0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,\n\t            0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,\n\t            0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,\n\t            0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,\n\t            0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,\n\t            0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,\n\t            0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,\n\t            0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,\n\t            0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,\n\t            0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,\n\t            0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,\n\t            0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,\n\t            0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7   ],\n\t        [   0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,\n\t            0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,\n\t            0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,\n\t            0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,\n\t            0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,\n\t            0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,\n\t            0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,\n\t            0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,\n\t            0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,\n\t            0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,\n\t            0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,\n\t            0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,\n\t            0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,\n\t            0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,\n\t            0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,\n\t            0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,\n\t            0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,\n\t            0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,\n\t            0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,\n\t            0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,\n\t            0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,\n\t            0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,\n\t            0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,\n\t            0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,\n\t            0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,\n\t            0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,\n\t            0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,\n\t            0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,\n\t            0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,\n\t            0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,\n\t            0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,\n\t            0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,\n\t            0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,\n\t            0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,\n\t            0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,\n\t            0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,\n\t            0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,\n\t            0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,\n\t            0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,\n\t            0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,\n\t            0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,\n\t            0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,\n\t            0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,\n\t            0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,\n\t            0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,\n\t            0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,\n\t            0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,\n\t            0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,\n\t            0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,\n\t            0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,\n\t            0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,\n\t            0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,\n\t            0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,\n\t            0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,\n\t            0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,\n\t            0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,\n\t            0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,\n\t            0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,\n\t            0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,\n\t            0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,\n\t            0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,\n\t            0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,\n\t            0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,\n\t            0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0  ],\n\t        [   0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,\n\t            0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,\n\t            0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,\n\t            0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,\n\t            0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,\n\t            0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,\n\t            0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,\n\t            0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,\n\t            0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,\n\t            0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,\n\t            0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,\n\t            0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,\n\t            0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,\n\t            0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,\n\t            0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,\n\t            0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,\n\t            0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,\n\t            0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,\n\t            0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,\n\t            0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,\n\t            0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,\n\t            0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,\n\t            0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,\n\t            0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,\n\t            0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,\n\t            0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,\n\t            0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,\n\t            0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,\n\t            0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,\n\t            0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,\n\t            0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,\n\t            0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,\n\t            0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,\n\t            0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,\n\t            0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,\n\t            0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,\n\t            0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,\n\t            0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,\n\t            0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,\n\t            0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,\n\t            0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,\n\t            0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,\n\t            0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,\n\t            0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,\n\t            0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,\n\t            0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,\n\t            0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,\n\t            0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,\n\t            0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,\n\t            0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,\n\t            0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,\n\t            0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,\n\t            0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,\n\t            0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,\n\t            0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,\n\t            0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,\n\t            0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,\n\t            0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,\n\t            0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,\n\t            0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,\n\t            0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,\n\t            0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,\n\t            0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,\n\t            0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6  ]\n\t    ];\n\n\t    var BLOWFISH_CTX = {\n\t        pbox: [],\n\t        sbox: []\n\t    }\n\n\t    function F(ctx, x){\n\t        let a = (x >> 24) & 0xFF;\n\t        let b = (x >> 16) & 0xFF;\n\t        let c = (x >> 8) & 0xFF;\n\t        let d = x & 0xFF;\n\n\t        let y = ctx.sbox[0][a] + ctx.sbox[1][b];\n\t        y = y ^ ctx.sbox[2][c];\n\t        y = y + ctx.sbox[3][d];\n\n\t        return y;\n\t    }\n\n\t    function BlowFish_Encrypt(ctx, left, right){\n\t        let Xl = left;\n\t        let Xr = right;\n\t        let temp;\n\n\t        for(let i = 0; i < N; ++i){\n\t            Xl = Xl ^ ctx.pbox[i];\n\t            Xr = F(ctx, Xl) ^ Xr;\n\n\t            temp = Xl;\n\t            Xl = Xr;\n\t            Xr = temp;\n\t        }\n\n\t        temp = Xl;\n\t        Xl = Xr;\n\t        Xr = temp;\n\n\t        Xr = Xr ^ ctx.pbox[N];\n\t        Xl = Xl ^ ctx.pbox[N + 1];\n\n\t        return {left: Xl, right: Xr};\n\t    }\n\n\t    function BlowFish_Decrypt(ctx, left, right){\n\t        let Xl = left;\n\t        let Xr = right;\n\t        let temp;\n\n\t        for(let i = N + 1; i > 1; --i){\n\t            Xl = Xl ^ ctx.pbox[i];\n\t            Xr = F(ctx, Xl) ^ Xr;\n\n\t            temp = Xl;\n\t            Xl = Xr;\n\t            Xr = temp;\n\t        }\n\n\t        temp = Xl;\n\t        Xl = Xr;\n\t        Xr = temp;\n\n\t        Xr = Xr ^ ctx.pbox[1];\n\t        Xl = Xl ^ ctx.pbox[0];\n\n\t        return {left: Xl, right: Xr};\n\t    }\n\n\t    /**\n\t     * Initialization ctx's pbox and sbox.\n\t     *\n\t     * @param {Object} ctx The object has pbox and sbox.\n\t     * @param {Array} key An array of 32-bit words.\n\t     * @param {int} keysize The length of the key.\n\t     *\n\t     * @example\n\t     *\n\t     *     BlowFishInit(BLOWFISH_CTX, key, 128/32);\n\t     */\n\t    function BlowFishInit(ctx, key, keysize)\n\t    {\n\t        for(let Row = 0; Row < 4; Row++)\n\t        {\n\t            ctx.sbox[Row] = [];\n\t            for(let Col = 0; Col < 256; Col++)\n\t            {\n\t                ctx.sbox[Row][Col] = ORIG_S[Row][Col];\n\t            }\n\t        }\n\n\t        let keyIndex = 0;\n\t        for(let index = 0; index < N + 2; index++)\n\t        {\n\t            ctx.pbox[index] = ORIG_P[index] ^ key[keyIndex];\n\t            keyIndex++;\n\t            if(keyIndex >= keysize)\n\t            {\n\t                keyIndex = 0;\n\t            }\n\t        }\n\n\t        let Data1 = 0;\n\t        let Data2 = 0;\n\t        let res = 0;\n\t        for(let i = 0; i < N + 2; i += 2)\n\t        {\n\t            res = BlowFish_Encrypt(ctx, Data1, Data2);\n\t            Data1 = res.left;\n\t            Data2 = res.right;\n\t            ctx.pbox[i] = Data1;\n\t            ctx.pbox[i + 1] = Data2;\n\t        }\n\n\t        for(let i = 0; i < 4; i++)\n\t        {\n\t            for(let j = 0; j < 256; j += 2)\n\t            {\n\t                res = BlowFish_Encrypt(ctx, Data1, Data2);\n\t                Data1 = res.left;\n\t                Data2 = res.right;\n\t                ctx.sbox[i][j] = Data1;\n\t                ctx.sbox[i][j + 1] = Data2;\n\t            }\n\t        }\n\n\t        return true;\n\t    }\n\n\t    /**\n\t     * Blowfish block cipher algorithm.\n\t     */\n\t    var Blowfish = C_algo.Blowfish = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Skip reset of nRounds has been set before and key did not change\n\t            if (this._keyPriorReset === this._key) {\n\t                return;\n\t            }\n\n\t            // Shortcuts\n\t            var key = this._keyPriorReset = this._key;\n\t            var keyWords = key.words;\n\t            var keySize = key.sigBytes / 4;\n\n\t            //Initialization pbox and sbox\n\t            BlowFishInit(BLOWFISH_CTX, keyWords, keySize);\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            var res = BlowFish_Encrypt(BLOWFISH_CTX, M[offset], M[offset + 1]);\n\t            M[offset] = res.left;\n\t            M[offset + 1] = res.right;\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            var res = BlowFish_Decrypt(BLOWFISH_CTX, M[offset], M[offset + 1]);\n\t            M[offset] = res.left;\n\t            M[offset + 1] = res.right;\n\t        },\n\n\t        blockSize: 64/32,\n\n\t        keySize: 128/32,\n\n\t        ivSize: 64/32\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.Blowfish = BlockCipher._createHelper(Blowfish);\n\t}());\n\n\n\treturn CryptoJS.Blowfish;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./lib-typedarrays\"), require(\"./enc-utf16\"), require(\"./enc-base64\"), require(\"./enc-base64url\"), require(\"./md5\"), require(\"./sha1\"), require(\"./sha256\"), require(\"./sha224\"), require(\"./sha512\"), require(\"./sha384\"), require(\"./sha3\"), require(\"./ripemd160\"), require(\"./hmac\"), require(\"./pbkdf2\"), require(\"./evpkdf\"), require(\"./cipher-core\"), require(\"./mode-cfb\"), require(\"./mode-ctr\"), require(\"./mode-ctr-gladman\"), require(\"./mode-ofb\"), require(\"./mode-ecb\"), require(\"./pad-ansix923\"), require(\"./pad-iso10126\"), require(\"./pad-iso97971\"), require(\"./pad-zeropadding\"), require(\"./pad-nopadding\"), require(\"./format-hex\"), require(\"./aes\"), require(\"./tripledes\"), require(\"./rc4\"), require(\"./rabbit\"), require(\"./rabbit-legacy\"), require(\"./blowfish\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\", \"./lib-typedarrays\", \"./enc-utf16\", \"./enc-base64\", \"./enc-base64url\", \"./md5\", \"./sha1\", \"./sha256\", \"./sha224\", \"./sha512\", \"./sha384\", \"./sha3\", \"./ripemd160\", \"./hmac\", \"./pbkdf2\", \"./evpkdf\", \"./cipher-core\", \"./mode-cfb\", \"./mode-ctr\", \"./mode-ctr-gladman\", \"./mode-ofb\", \"./mode-ecb\", \"./pad-ansix923\", \"./pad-iso10126\", \"./pad-iso97971\", \"./pad-zeropadding\", \"./pad-nopadding\", \"./format-hex\", \"./aes\", \"./tripledes\", \"./rc4\", \"./rabbit\", \"./rabbit-legacy\", \"./blowfish\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS;\n\n}));","/**\n * Debug Logger pour @ollaid/native-sso\n * Stocke l'historique des appels API en mémoire pour le DebugPanel\n * @version 2.7.9\n */\n\nexport interface ApiCallLog {\n  id: string;\n  timestamp: string;\n  method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n  endpoint: string;\n  requestBody: unknown;\n  requestHeaders?: Record<string, string>;\n  responseStatus: number | null;\n  responseBody: unknown;\n  duration: number;\n  error?: string;\n}\n\nconst MAX_LOGS = 50;\nconst STORAGE_KEY = 'ollaid.native-sso.debug-logs.v1';\nlet apiLogs: ApiCallLog[] = [];\nlet listeners: ((logs: ApiCallLog[]) => void)[] = [];\n\nconst REDACTED = '[redacted]';\n\nfunction isSensitiveKey(key: string): boolean {\n  const normalized = key.toLowerCase();\n  return (\n    normalized.includes('token') ||\n    normalized.includes('password') ||\n    normalized.includes('secret') ||\n    normalized.includes('authorization') ||\n    normalized.includes('otp') ||\n    normalized.includes('code') ||\n    normalized.includes('cookie') ||\n    normalized.includes('credential') ||\n    normalized.includes('app_access') ||\n    normalized.includes('sanctum')\n  );\n}\n\nfunction sanitizeValue(value: unknown, keyHint = ''): unknown {\n  if (value === null || value === undefined) return value;\n  if (typeof value === 'string') {\n    if (keyHint && isSensitiveKey(keyHint)) return REDACTED;\n    if (/^Bearer\\s+/i.test(value)) return REDACTED;\n    if (/^[0-9]+\\|[A-Za-z0-9]/.test(value)) return REDACTED;\n    return value;\n  }\n  if (typeof value !== 'object') return value;\n  if (Array.isArray(value)) return value.map(item => sanitizeValue(item));\n\n  const input = value as Record<string, unknown>;\n  const output: Record<string, unknown> = {};\n  for (const [key, child] of Object.entries(input)) {\n    output[key] = isSensitiveKey(key) ? REDACTED : sanitizeValue(child, key);\n  }\n  return output;\n}\n\nfunction notifyListeners() {\n  listeners.forEach(fn => fn([...apiLogs]));\n}\n\nfunction getSessionStorage(): Storage | null {\n  if (typeof window === 'undefined') return null;\n\n  try {\n    return window.sessionStorage;\n  } catch {\n    return null;\n  }\n}\n\nfunction persistLogs(): void {\n  const storage = getSessionStorage();\n  if (!storage) return;\n\n  try {\n    storage.setItem(STORAGE_KEY, JSON.stringify(apiLogs));\n  } catch {\n    // ignore storage quota / security failures\n  }\n}\n\nfunction loadPersistedLogs(): ApiCallLog[] {\n  const storage = getSessionStorage();\n  if (!storage) return [];\n\n  try {\n    const raw = storage.getItem(STORAGE_KEY);\n    if (!raw) return [];\n\n    const parsed = JSON.parse(raw);\n    if (!Array.isArray(parsed)) return [];\n\n    return parsed\n      .filter(Boolean)\n      .slice(0, MAX_LOGS)\n      .map((item) => ({\n        id: String(item?.id ?? `${Date.now()}-${Math.random().toString(36).slice(2, 7)}`),\n        timestamp: String(item?.timestamp ?? new Date().toISOString()),\n        method: item?.method === 'GET' || item?.method === 'POST' || item?.method === 'PUT' || item?.method === 'DELETE'\n          ? item.method\n          : 'GET',\n        endpoint: String(item?.endpoint ?? ''),\n        requestBody: item?.requestBody ?? null,\n        requestHeaders: item?.requestHeaders && typeof item.requestHeaders === 'object'\n          ? item.requestHeaders\n          : undefined,\n        responseStatus: typeof item?.responseStatus === 'number' ? item.responseStatus : null,\n        responseBody: item?.responseBody ?? null,\n        duration: typeof item?.duration === 'number' ? item.duration : 0,\n        error: typeof item?.error === 'string' ? item.error : undefined,\n      }));\n  } catch {\n    return [];\n  }\n}\n\napiLogs = loadPersistedLogs();\n\nexport function logApiCall(\n  method: ApiCallLog['method'],\n  endpoint: string,\n  requestBody: unknown,\n  requestHeaders?: Record<string, string>\n): string {\n  const id = `${Date.now()}-${Math.random().toString(36).substring(2, 7)}`;\n  const log: ApiCallLog = {\n    id,\n    timestamp: new Date().toISOString(),\n    method,\n    endpoint,\n    requestBody: sanitizeValue(requestBody),\n    requestHeaders: requestHeaders ? (sanitizeValue(requestHeaders) as Record<string, string>) : undefined,\n    responseStatus: null,\n    responseBody: null,\n    duration: 0,\n  };\n\n  apiLogs.unshift(log);\n  if (apiLogs.length > MAX_LOGS) {\n    apiLogs = apiLogs.slice(0, MAX_LOGS);\n  }\n  persistLogs();\n  notifyListeners();\n  return id;\n}\n\nexport function logApiResponse(\n  logId: string,\n  responseStatus: number,\n  responseBody: unknown,\n  startTime: number,\n  error?: string\n): void {\n  const log = apiLogs.find(l => l.id === logId);\n  if (log) {\n    log.responseStatus = responseStatus;\n    log.responseBody = sanitizeValue(responseBody);\n    log.duration = Date.now() - startTime;\n    log.error = error;\n    persistLogs();\n    notifyListeners();\n  }\n}\n\nexport function getApiLogs(): ApiCallLog[] {\n  return [...apiLogs];\n}\n\nexport function clearApiLogs(): void {\n  apiLogs = [];\n  persistLogs();\n  notifyListeners();\n}\n\nexport function subscribeToLogs(callback: (logs: ApiCallLog[]) => void): () => void {\n  listeners.push(callback);\n  return () => {\n    listeners = listeners.filter(fn => fn !== callback);\n  };\n}\n\nexport function exportLogsAsText(): string {\n  if (apiLogs.length === 0) return 'Aucun appel API enregistré.';\n\n  const lines: string[] = [\n    '='.repeat(60),\n    'NATIVE SSO DEBUG LOGS',\n    `Exporté le: ${new Date().toISOString()}`,\n    '='.repeat(60),\n    '',\n  ];\n\n  apiLogs.slice().reverse().forEach((log, index) => {\n    const emoji = log.responseStatus === null ? '⏳' : (log.responseStatus >= 200 && log.responseStatus < 300 ? '✅' : '❌');\n    lines.push(`[${index + 1}] ${emoji} ${log.method} ${log.endpoint}`);\n    lines.push(`    Status: ${log.responseStatus ?? 'En cours...'} | Durée: ${log.duration}ms`);\n    if (log.requestBody) lines.push(`    Request: ${JSON.stringify(log.requestBody)}`);\n    if (log.responseBody) lines.push(`    Response: ${JSON.stringify(log.responseBody)}`);\n    if (log.error) lines.push(`    ⚠️ Error: ${log.error}`);\n    lines.push('');\n  });\n\n  return lines.join('\\n');\n}\n","/**\n * Client API pour @ollaid/native-sso\n * Gestion des requêtes HTTP avec timeout, device ID, token storage\n *\n * @version 2.7.9\n */\n\nimport * as CryptoJS from 'crypto-js';\nimport { logApiCall, logApiResponse } from './debugLogger';\n\n// ============================================\n// Types d'erreur\n// ============================================\n\nexport type ApiErrorType = 'network' | 'timeout' | 'server' | 'validation' | 'auth' | 'unknown';\n\nexport class ApiError extends Error {\n  type: ApiErrorType;\n  statusCode?: number;\n  errorType?: string;\n  response?: unknown;\n\n  constructor(\n    message: string,\n    type: ApiErrorType,\n    statusCode?: number,\n    errorType?: string,\n    response?: unknown\n  ) {\n    super(message);\n    this.name = 'ApiError';\n    this.type = type;\n    this.statusCode = statusCode;\n    this.errorType = errorType;\n    this.response = response;\n  }\n}\n\n// ============================================\n// Configuration\n// ============================================\n\nexport interface NativeAuthConfig {\n  /** URL du Backend SaaS (pour config et exchange) */\n  saasApiUrl: string;\n  /** URL du Backend IAM (pour encrypt, init, validate, etc.) */\n  iamApiUrl: string;\n  /** Timeout en ms (défaut: 30000) */\n  timeout?: number;\n  /** Mode debug (logs console) */\n  debug?: boolean;\n  /** Bypass du flux needs_access, déterminé par le backend */\n  bypass?: boolean;\n  /**\n   * Préfixe de configuration lu côté SaaS pour charger les credentials.\n   * Ne doit pas être envoyé au backend IAM natif.\n   */\n  configPrefix?: string;\n  /**\n   * Stockage session injectable.\n   * Défaut: storage navigateur chiffré, mémoire en fallback.\n   * Utile pour Capacitor ou des wrappers secure-storage côté app consommatrice.\n   */\n  storage?: NativeStorageAdapter;\n}\n\nlet config: NativeAuthConfig = {\n  saasApiUrl: '',\n  iamApiUrl: '',\n  timeout: 30000,\n  debug: false,\n  bypass: false,\n  configPrefix: 'iam',\n};\n\nexport interface NativeStorageAdapter {\n  getItem(key: string): string | null;\n  setItem(key: string, value: string): void;\n  removeItem(key: string): void;\n  clear(): void;\n}\n\nconst memoryStorage = (): NativeStorageAdapter => {\n  const state = new Map<string, string>();\n  return {\n    getItem: (key) => (state.has(key) ? state.get(key)! : null),\n    setItem: (key, value) => {\n      state.set(key, value);\n    },\n    removeItem: (key) => {\n      state.delete(key);\n    },\n    clear: () => {\n      state.clear();\n    },\n  };\n};\n\nconst STORAGE_ENCRYPTION_PREFIX = 'enc:v1:';\nconst STORAGE_ENCRYPTION_SECRET_PREFIX = 'ollaid-native-sso::storage::v1';\nconst DEBUG_REDACTED = '[redacted]';\n\nconst RAW_STORAGE_KEYS = new Set<string>([\n  'sso_storage_seed',\n]);\n\nconst STORAGE_PREFIX = 'sso_';\n\nfunction resolveBaseStorage(): NativeStorageAdapter {\n  if (typeof localStorage !== 'undefined') {\n    return {\n      getItem: (key) => localStorage.getItem(key),\n      setItem: (key, value) => localStorage.setItem(key, value),\n      removeItem: (key) => localStorage.removeItem(key),\n      clear: () => localStorage.clear(),\n    };\n  }\n  return memoryStorage();\n}\n\nlet rawStorageAdapter: NativeStorageAdapter = resolveBaseStorage();\nlet storageAdapter: NativeStorageAdapter = createEncryptedStorageAdapter(rawStorageAdapter);\n\nfunction isRawStorageKey(key: string): boolean {\n  return RAW_STORAGE_KEYS.has(key);\n}\n\nfunction normalizeStorageValue(value: unknown): string {\n  if (typeof value === 'string') return value;\n  if (value === null || value === undefined) return '';\n  if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {\n    return String(value);\n  }\n\n  try {\n    const serialized = JSON.stringify(value);\n    return serialized ?? '';\n  } catch {\n    return String(value);\n  }\n}\n\nfunction safeJSONStringify(value: unknown): string {\n  try {\n    const serialized = JSON.stringify(value);\n    return serialized ?? 'null';\n  } catch {\n    return 'null';\n  }\n}\n\nfunction isSensitiveDebugKey(key: string): boolean {\n  const normalized = key.toLowerCase();\n  return (\n    normalized.includes('token') ||\n    normalized.includes('password') ||\n    normalized.includes('secret') ||\n    normalized.includes('authorization') ||\n    normalized.includes('otp') ||\n    normalized.includes('code') ||\n    normalized.includes('cookie') ||\n    normalized.includes('credential') ||\n    normalized.includes('app_access') ||\n    normalized.includes('sanctum') ||\n    normalized.includes('refresh')\n  );\n}\n\nfunction sanitizeDebugValue(value: unknown, keyHint = ''): unknown {\n  if (value === null || value === undefined) return value;\n  if (typeof value === 'string') {\n    if (keyHint && isSensitiveDebugKey(keyHint)) return DEBUG_REDACTED;\n    if (/^Bearer\\s+/i.test(value)) return DEBUG_REDACTED;\n    if (/^[0-9]+\\|[A-Za-z0-9]/.test(value)) return DEBUG_REDACTED;\n    return value;\n  }\n  if (typeof value !== 'object') return value;\n  if (Array.isArray(value)) return value.map(item => sanitizeDebugValue(item));\n\n  const input = value as Record<string, unknown>;\n  const output: Record<string, unknown> = {};\n  for (const [key, child] of Object.entries(input)) {\n    output[key] = isSensitiveDebugKey(key) ? DEBUG_REDACTED : sanitizeDebugValue(child, key);\n  }\n  return output;\n}\n\nfunction buildDebugSummary(responseBody: unknown): Record<string, unknown> {\n  if (!responseBody || typeof responseBody !== 'object') {\n    return {};\n  }\n\n  const payload = responseBody as Record<string, unknown>;\n  const summary: Record<string, unknown> = {};\n\n  if (typeof payload.success === 'boolean') summary.success = payload.success;\n  if (typeof payload.status === 'string') summary.status = payload.status;\n  if (typeof payload.error_type === 'string') summary.error_type = payload.error_type;\n  if (typeof payload.message === 'string') summary.message = payload.message;\n  if (typeof payload.needs_access === 'boolean') summary.needs_access = payload.needs_access;\n  if (typeof payload.requires_2fa === 'boolean') summary.requires_2fa = payload.requires_2fa;\n  if (typeof payload.callback_token === 'string') summary.has_callback_token = true;\n  if (typeof payload.process_token === 'string') summary.has_process_token = true;\n  if (typeof payload.otp_code === 'string') summary.has_otp_code = true;\n  if (typeof payload.otp_method === 'string') summary.otp_method = payload.otp_method;\n  if (typeof payload.otp_sent_to === 'string') summary.otp_sent_to = payload.otp_sent_to;\n  if (typeof payload.cooldown_remaining === 'number') summary.cooldown_remaining = payload.cooldown_remaining;\n  if (typeof payload.wait_seconds === 'number') summary.wait_seconds = payload.wait_seconds;\n\n  return summary;\n}\n\nfunction logDebugApiResponse(\n  method: string,\n  url: string,\n  status: number,\n  responseBody: unknown,\n  duration: number,\n  requestBody?: unknown,\n  error?: string\n): void {\n  if (!isDebugMode()) return;\n\n  const title = `${status >= 200 && status < 300 ? '✅' : '❌'} [native-sso] ${method} ${url}`;\n  const summary = buildDebugSummary(responseBody);\n  const safeRequest = sanitizeDebugValue(requestBody);\n  const safeResponse = sanitizeDebugValue(responseBody);\n\n  try {\n    console.groupCollapsed(title);\n    console.log({\n      status,\n      duration: `${duration}ms`,\n      summary,\n      request: safeRequest,\n      response: safeResponse,\n      error: error || undefined,\n    });\n    console.groupEnd();\n  } catch {\n    // console unavailable or partially supported\n  }\n}\n\nfunction getStorageEncryptionSecret(): string {\n  const storage = rawStorageAdapter;\n  let seed = storage.getItem(STORAGE_SEED_KEY);\n\n  if (!seed) {\n    seed = `seed_${Date.now()}_${Math.random().toString(36).substring(2, 15)}_${Math.random().toString(36).substring(2, 15)}`;\n    storage.setItem(STORAGE_SEED_KEY, seed);\n  }\n\n  const origin = typeof window !== 'undefined' && window.location?.origin\n    ? window.location.origin\n    : 'unknown-origin';\n  const prefix = config.configPrefix || 'iam';\n  return `${STORAGE_ENCRYPTION_SECRET_PREFIX}::${origin}::${prefix}::${seed}`;\n}\n\nfunction encryptStorageValue(value: unknown): string {\n  const normalizedValue = normalizeStorageValue(value);\n\n  try {\n    const secret = getStorageEncryptionSecret();\n    const ciphertext = CryptoJS.AES.encrypt(normalizedValue, secret).toString();\n    return `${STORAGE_ENCRYPTION_PREFIX}${ciphertext}`;\n  } catch (error) {\n    if (isDebugMode()) {\n      console.warn('⚠️ [native-sso] Encryption storage fallback to plain value', error);\n    }\n    return normalizedValue;\n  }\n}\n\nfunction decryptStorageValue(value: unknown): string | null {\n  const normalizedValue = normalizeStorageValue(value);\n\n  if (!normalizedValue.startsWith(STORAGE_ENCRYPTION_PREFIX)) {\n    return normalizedValue;\n  }\n\n  const ciphertext = normalizedValue.slice(STORAGE_ENCRYPTION_PREFIX.length);\n  if (!ciphertext) return null;\n\n  try {\n    const secret = getStorageEncryptionSecret();\n    const bytes = CryptoJS.AES.decrypt(ciphertext, secret);\n    const plaintext = bytes.toString(CryptoJS.enc.Utf8);\n    return plaintext || null;\n  } catch (error) {\n    if (isDebugMode()) {\n      console.warn('⚠️ [native-sso] Failed to decrypt storage value, clearing corrupted entry', error);\n    }\n    return null;\n  }\n}\n\nfunction createEncryptedStorageAdapter(base: NativeStorageAdapter): NativeStorageAdapter {\n  return {\n    getItem: (key) => {\n      const rawValue = base.getItem(key);\n      if (rawValue !== null) {\n        if (isRawStorageKey(key)) {\n          return rawValue;\n        }\n\n        const decrypted = decryptStorageValue(rawValue);\n        if (decrypted !== null) {\n          return decrypted;\n        }\n\n        if (normalizeStorageValue(rawValue).startsWith(STORAGE_ENCRYPTION_PREFIX)) {\n          base.removeItem(key);\n          return null;\n        }\n\n        return rawValue;\n      }\n      return null;\n    },\n    setItem: (key, value) => {\n      if (isRawStorageKey(key)) {\n        base.setItem(key, normalizeStorageValue(value));\n        return;\n      }\n\n      base.setItem(key, encryptStorageValue(value));\n    },\n    removeItem: (key) => {\n      base.removeItem(key);\n    },\n    clear: () => {\n      base.clear();\n    },\n  };\n}\n\nexport function setNativeStorage(adapter?: NativeStorageAdapter): void {\n  rawStorageAdapter = adapter ?? resolveBaseStorage();\n  storageAdapter = createEncryptedStorageAdapter(rawStorageAdapter);\n}\n\nexport function getNativeStorage(): NativeStorageAdapter {\n  return storageAdapter;\n}\n\nexport const setNativeAuthConfig = (newConfig: Partial<NativeAuthConfig>): void => {\n  config = { ...config, ...newConfig };\n  if (newConfig.storage) {\n    setNativeStorage(newConfig.storage);\n  } else if (!config.storage) {\n    setNativeStorage();\n  }\n  \n  if (config.debug) {\n    console.log('🔐 @ollaid/native-sso Config:', {\n      saasApiUrl: config.saasApiUrl,\n      iamApiUrl: config.iamApiUrl,\n    });\n  }\n};\n\nexport const getNativeAuthConfig = (): NativeAuthConfig => ({ ...config });\n\nexport const isDebugMode = (): boolean => config.debug === true;\n\nexport const getSaasApiBaseUrl = (): string => {\n  if (!config.saasApiUrl) {\n    throw new ApiError('saasApiUrl non configurée', 'unknown');\n  }\n  return config.saasApiUrl;\n};\n\nexport const getIamApiBaseUrl = (): string => {\n  if (!config.iamApiUrl) {\n    throw new ApiError('iamApiUrl non configurée', 'unknown');\n  }\n  return config.iamApiUrl;\n};\n\n// ============================================\n// Device ID\n// ============================================\n\nconst DEVICE_ID_KEY = 'sso_device_id';\nconst SESSION_UUID_KEY = 'sso_session_uuid';\nconst STORAGE_SEED_KEY = 'native_sso_storage_seed';\n\nfunction generateUuid(): string {\n  // Prefer native UUID when available (modern browsers / webviews).\n  // Fallback is not cryptographically strong, but good enough as a stable instance id.\n  const globalCrypto = typeof globalThis !== 'undefined' ? globalThis.crypto : undefined;\n  if (globalCrypto && typeof globalCrypto.randomUUID === 'function') {\n    return globalCrypto.randomUUID();\n  }\n  return `uuid_${Date.now()}_${Math.random().toString(36).slice(2)}_${Math.random().toString(36).slice(2)}`;\n}\n\nexport const getDeviceId = (): string => {\n  const storage = getNativeStorage();\n  let deviceId = storage.getItem(DEVICE_ID_KEY);\n  if (!deviceId) {\n    deviceId = `nat_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n    storage.setItem(DEVICE_ID_KEY, deviceId);\n  }\n  return deviceId;\n};\n\n/**\n * Stable session UUID (instance id) persisted in storage.\n *\n * This is NOT a security token. It is used to disambiguate sessions across devices/webviews\n * and to help backends implement multi-session behavior safely.\n */\nexport const getSessionUuid = (): string => {\n  const storage = getNativeStorage();\n  let uuid = storage.getItem(SESSION_UUID_KEY);\n  if (!uuid) {\n    uuid = generateUuid();\n    storage.setItem(SESSION_UUID_KEY, uuid);\n  }\n  return uuid;\n};\n\n// ============================================\n// Device context (Capacitor)\n// ============================================\n\nexport interface NativeDeviceContext {\n  deviceName?: string | null;\n  deviceModel?: string | null;\n  deviceManufacturer?: string | null;\n  operatingSystem?: string | null;\n  osVersion?: string | null;\n  platform?: string | null;\n  browser?: string | null;\n  language?: string | null;\n  webviewVersion?: string | null;\n  isNative?: boolean | null;\n  label?: string | null;\n}\n\nlet deviceContext: NativeDeviceContext | null = null;\nlet deviceContextPromise: Promise<NativeDeviceContext | null> | null = null;\n\nfunction inferBrowserFromUserAgent(userAgent?: string | null): string | null {\n  if (!userAgent) return null;\n  if (userAgent.includes('Firefox')) return 'Firefox';\n  if (userAgent.includes('Edg')) return 'Edge';\n  if (userAgent.includes('Chrome')) return 'Chrome';\n  if (userAgent.includes('Safari')) return 'Safari';\n  if (userAgent.includes('Opera') || userAgent.includes('OPR')) return 'Opera';\n  return null;\n}\n\nfunction buildDeviceLabel(context: NativeDeviceContext): string {\n  const parts = [\n    context.deviceName,\n    context.deviceManufacturer,\n    context.deviceModel,\n    context.operatingSystem && context.osVersion\n      ? `${context.operatingSystem} ${context.osVersion}`\n      : context.operatingSystem,\n  ].filter(Boolean) as string[];\n\n  if (parts.length > 0) {\n    return parts.join(' ');\n  }\n\n  if (context.browser || context.platform) {\n    return `${context.browser || 'Appareil'} - ${context.platform || 'mobile'}`;\n  }\n\n  return 'Appareil mobile';\n}\n\nasync function loadDeviceContext(): Promise<NativeDeviceContext | null> {\n  if (typeof window === 'undefined') {\n    return null;\n  }\n\n  try {\n    const { Device } = await import('@capacitor/device');\n    const info = await Device.getInfo();\n    const languageResult = await Device.getLanguageCode().catch(() => null) as { value?: string } | null;\n    const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : null;\n    const context: NativeDeviceContext = {\n      deviceName: info.name ?? null,\n      deviceModel: info.model ?? null,\n      deviceManufacturer: info.manufacturer ?? null,\n      operatingSystem: info.operatingSystem ?? null,\n      osVersion: info.osVersion ?? null,\n      platform: info.platform ?? null,\n      browser: inferBrowserFromUserAgent(userAgent),\n      language: languageResult?.value ?? (typeof navigator !== 'undefined' ? navigator.language : null),\n      webviewVersion: (info as { webViewVersion?: string }).webViewVersion ?? null,\n      isNative: info.platform ? info.platform !== 'web' : null,\n      label: '',\n    };\n\n    context.label = buildDeviceLabel(context);\n    deviceContext = context;\n    return context;\n  } catch {\n    return null;\n  }\n}\n\nexport async function ensureDeviceContext(): Promise<NativeDeviceContext | null> {\n  if (deviceContext) {\n    return deviceContext;\n  }\n\n  if (!deviceContextPromise) {\n    deviceContextPromise = loadDeviceContext().finally(() => {\n      deviceContextPromise = null;\n    });\n  }\n\n  return deviceContextPromise;\n}\n\n// ============================================\n// Token storage (clés unifiées avec Web SSO)\n// ============================================\n\nconst STORAGE = {\n  AUTH_TOKEN: 'sso_auth_token',\n  TOKEN: 'sso_token',\n  USER: 'sso_user',\n  REGISTRATION_MODE: 'sso_registration_mode',\n  ALIAS_REFERENCE: 'sso_alias_reference',\n  REFRESH_TOKEN: 'sso_refresh_token',\n  TOKEN_EXPIRES_AT: 'sso_token_expires_at',\n  REFRESH_EXPIRES_AT: 'sso_refresh_expires_at',\n} as const;\n\nconst PROFILE_STORAGE = {\n  IMAGE_LAST_STATUS: 'sso_image_last_status',\n  IMAGE_LAST_CHECK: 'sso_image_last_check',\n  IMAGE_RECHECK_AT: 'sso_image_recheck_at',\n} as const;\n\nconst ALL_SESSION_STORAGE_KEYS = [\n  STORAGE.AUTH_TOKEN,\n  STORAGE.TOKEN,\n  STORAGE.USER,\n  STORAGE.REGISTRATION_MODE,\n  STORAGE.ALIAS_REFERENCE,\n  STORAGE.REFRESH_TOKEN,\n  STORAGE.TOKEN_EXPIRES_AT,\n  STORAGE.REFRESH_EXPIRES_AT,\n  PROFILE_STORAGE.IMAGE_LAST_STATUS,\n  PROFILE_STORAGE.IMAGE_LAST_CHECK,\n  PROFILE_STORAGE.IMAGE_RECHECK_AT,\n  DEVICE_ID_KEY,\n  SESSION_UUID_KEY,\n  STORAGE_SEED_KEY,\n] as const;\n\nexport interface SsoSessionSnapshot<TUser = unknown> {\n  authToken: string | null;\n  refreshToken: string | null;\n  refreshExpiresAt: string | null;\n  tokenExpiresAt: string | null;\n  iamToken: string | null;\n  aliasReference: string | null;\n  accountType: string | null;\n  deviceId: string | null;\n  sessionUuid: string | null;\n  user: TUser | null;\n}\n\nexport const setAuthToken = (token: string): void => {\n  const storage = getNativeStorage();\n  if (typeof token !== 'string' || token.length === 0) return;\n  storage.setItem(STORAGE.AUTH_TOKEN, token);\n};\n\nexport const getAuthToken = (): string | null => {\n  const storage = getNativeStorage();\n  return storage.getItem(STORAGE.AUTH_TOKEN) || storage.getItem(STORAGE.TOKEN);\n};\n\nexport const clearAuthToken = (): void => {\n  const storage = getNativeStorage();\n  [\n    STORAGE.AUTH_TOKEN,\n    STORAGE.TOKEN,\n    STORAGE.USER,\n    STORAGE.REGISTRATION_MODE,\n    STORAGE.ALIAS_REFERENCE,\n    STORAGE.REFRESH_TOKEN,\n    STORAGE.TOKEN_EXPIRES_AT,\n    STORAGE.REFRESH_EXPIRES_AT,\n  ].forEach((key) => {\n    try {\n      storage.removeItem(key);\n    } catch {\n      // best effort cleanup\n    }\n  });\n};\n\nexport interface NativeSsoStorageRepairResult {\n  cleaned: boolean;\n  reason: 'incomplete_session' | 'invalid_user_json' | null;\n}\n\n/**\n * Nettoyage complet du storage SSO.\n * \n * À utiliser quand la session est manifestement corrompue ou incohérente.\n * Par défaut, on retire aussi les identifiants d'instance (device/session UUID)\n * pour repartir sur une base totalement saine.\n */\nexport const clearNativeSsoStorage = (options?: {\n  preserveDeviceIdentity?: boolean;\n}): void => {\n  const storage = getNativeStorage();\n  const preserveDeviceIdentity = options?.preserveDeviceIdentity === true;\n\n  ALL_SESSION_STORAGE_KEYS.forEach((key) => {\n    if (preserveDeviceIdentity && (key === DEVICE_ID_KEY || key === SESSION_UUID_KEY || key === STORAGE_SEED_KEY)) {\n      return;\n    }\n    try {\n      storage.removeItem(key);\n    } catch {\n      // best effort cleanup\n    }\n  });\n};\n\n/**\n * Vérifie l'intégrité du storage SSO et purge les états manifestement incohérents.\n * \n * Retourne `cleaned=true` si une réparation a été effectuée.\n * Cette fonction est volontairement conservatrice: elle ne nettoie que les cas\n * où la session est objectivement inutilisable.\n */\nexport const repairNativeSsoStorage = (): NativeSsoStorageRepairResult => {\n  try {\n    const storage = getNativeStorage();\n    const authToken = getAuthToken();\n    const userRaw = storage.getItem(STORAGE.USER);\n\n    if (userRaw && !authToken) {\n      // User sans token = état partiel ou résiduel. On repart proprement.\n      clearNativeSsoStorage();\n      return { cleaned: true, reason: 'incomplete_session' };\n    }\n\n    if (authToken && !userRaw) {\n      clearNativeSsoStorage();\n      return { cleaned: true, reason: 'incomplete_session' };\n    }\n\n    if (userRaw) {\n      try {\n        JSON.parse(userRaw);\n      } catch {\n        clearNativeSsoStorage();\n        return { cleaned: true, reason: 'invalid_user_json' };\n      }\n    }\n\n    return { cleaned: false, reason: null };\n  } catch (error) {\n    if (isDebugMode()) {\n      console.warn('⚠️ [native-sso] Storage repair failed, forcing cleanup', error);\n    }\n    try {\n      clearNativeSsoStorage();\n    } catch {\n      // final fallback: do not throw\n    }\n    return { cleaned: true, reason: 'incomplete_session' };\n  }\n};\n\n/**\n * Déconnexion complète et sécurisée.\n * \n * Effectue la double revocation (SaaS + IAM) puis nettoie le storage.\n * **Toute déconnexion frontend DOIT passer par cette fonction** pour éviter\n * les sessions orphelines sur l'IAM.\n * \n * @example\n * ```tsx\n * import { logout } from '@ollaid/native-sso';\n * \n * const handleLogout = async () => {\n *   await logout();\n *   navigate('/auth/login');\n * };\n * ```\n */\nexport const logout = async (): Promise<{ success: boolean }> => {\n  // Import dynamique pour éviter les dépendances circulaires\n  const { nativeAuthService } = await import('./nativeAuth');\n  const token = getAuthToken();\n  return nativeAuthService.logout(token || undefined);\n};\n\nexport const setAuthUser = (user: unknown): void => {\n  getNativeStorage().setItem(STORAGE.USER, safeJSONStringify(user));\n};\n\nexport const getAuthUser = <T>(): T | null => {\n  const user = getNativeStorage().getItem(STORAGE.USER);\n  if (!user) return null;\n  try {\n    return JSON.parse(user);\n  } catch {\n    getNativeStorage().removeItem(STORAGE.USER);\n    return null;\n  }\n};\n\nexport const setAccountType = (type: string): void => {\n  if (typeof type !== 'string' || type.length === 0) return;\n  getNativeStorage().setItem(STORAGE.REGISTRATION_MODE, type);\n};\n\nexport const getAccountType = (): string | null => {\n  return getNativeStorage().getItem(STORAGE.REGISTRATION_MODE);\n};\n\nexport function getSsoSessionSnapshot<TUser = unknown>(): SsoSessionSnapshot<TUser> {\n  const storage = getNativeStorage();\n  const userRaw = storage.getItem(STORAGE.USER);\n  let user: TUser | null = null;\n\n  if (userRaw) {\n    try {\n      user = JSON.parse(userRaw) as TUser;\n    } catch {\n      user = null;\n    }\n  }\n\n  return {\n    authToken: getAuthToken(),\n    refreshToken: storage.getItem(STORAGE.REFRESH_TOKEN),\n    refreshExpiresAt: storage.getItem(STORAGE.REFRESH_EXPIRES_AT),\n    tokenExpiresAt: storage.getItem(STORAGE.TOKEN_EXPIRES_AT),\n    iamToken: getAuthToken(),\n    aliasReference: storage.getItem(STORAGE.ALIAS_REFERENCE),\n    accountType: storage.getItem(STORAGE.REGISTRATION_MODE),\n    deviceId: storage.getItem(DEVICE_ID_KEY),\n    sessionUuid: storage.getItem(SESSION_UUID_KEY),\n    user,\n  };\n}\n\nexport function hasSsoSession(): boolean {\n  const snapshot = getSsoSessionSnapshot();\n  return Boolean(snapshot.authToken && snapshot.user);\n}\n\nexport { STORAGE as STORAGE_KEYS };\nexport { PROFILE_STORAGE as PROFILE_PROMPT_KEYS };\n\nexport interface ProfilePromptState {\n  lastStatus: boolean | null;\n  lastCheckAt: number | null;\n  recheckAt: number | null;\n}\n\nexport function getProfilePromptState(): ProfilePromptState {\n  const storage = getNativeStorage();\n  const lastStatusRaw = storage.getItem(PROFILE_STORAGE.IMAGE_LAST_STATUS);\n  const lastCheckRaw = storage.getItem(PROFILE_STORAGE.IMAGE_LAST_CHECK);\n  const recheckRaw = storage.getItem(PROFILE_STORAGE.IMAGE_RECHECK_AT);\n\n  const parseTs = (value: string | null): number | null => {\n    if (!value) return null;\n    const parsed = Number(value);\n    return Number.isFinite(parsed) ? parsed : null;\n  };\n\n  return {\n    lastStatus: lastStatusRaw === null ? null : lastStatusRaw === 'true',\n    lastCheckAt: parseTs(lastCheckRaw),\n    recheckAt: parseTs(recheckRaw),\n  };\n}\n\nexport function setProfilePromptState(status: boolean, recheckAt: number | null = null): void {\n  const storage = getNativeStorage();\n  storage.setItem(PROFILE_STORAGE.IMAGE_LAST_STATUS, status ? 'true' : 'false');\n  storage.setItem(PROFILE_STORAGE.IMAGE_LAST_CHECK, String(Date.now()));\n\n  if (recheckAt && Number.isFinite(recheckAt)) {\n    storage.setItem(PROFILE_STORAGE.IMAGE_RECHECK_AT, String(recheckAt));\n  } else {\n    storage.removeItem(PROFILE_STORAGE.IMAGE_RECHECK_AT);\n  }\n}\n\nexport function markProfilePromptComplete(): void {\n  setProfilePromptState(true, null);\n}\n\nexport function snoozeProfilePrompt(hours = 8): void {\n  setProfilePromptState(false, Date.now() + hours * 60 * 60 * 1000);\n}\n\n// ============================================\n// Fetch helper\n// ============================================\n\nexport async function fetchWithTimeout<T>(\n  url: string,\n  options: RequestInit,\n  timeout: number\n): Promise<T> {\n  const controller = new AbortController();\n  const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n  const method = (options.method as 'GET' | 'POST' | 'PUT' | 'DELETE') || 'GET';\n  let parsedBody: unknown = undefined;\n  if (typeof options.body === 'string') {\n    try {\n      parsedBody = JSON.parse(options.body);\n    } catch {\n      parsedBody = options.body;\n    }\n  }\n  const logId = isDebugMode() ? logApiCall(method, url, parsedBody) : null;\n  const startTime = Date.now();\n\n  try {\n    const response = await fetch(url, {\n      ...options,\n      signal: controller.signal,\n    });\n\n    clearTimeout(timeoutId);\n\n    const contentType = response.headers.get('content-type');\n    if (!contentType?.includes('application/json')) {\n      await response.text();\n      if (isDebugMode()) {\n        console.error('❌ Réponse non-JSON:', response.status);\n        const duration = Date.now() - startTime;\n        if (logId) logApiResponse(logId, response.status, { raw: '[non-json response]' }, startTime, 'Non-JSON response');\n        logDebugApiResponse(method, url, response.status, { raw: '[non-json response]' }, duration, parsedBody, 'Non-JSON response');\n      }\n      throw new ApiError(`Erreur serveur (${response.status})`, 'server', response.status);\n    }\n\n    const data = await response.json();\n    const duration = Date.now() - startTime;\n\n    if (!response.ok) {\n      if (logId) logApiResponse(logId, response.status, data, startTime, data.message);\n      logDebugApiResponse(method, url, response.status, data, duration, parsedBody, data.message);\n      throw new ApiError(\n        data.message || `Erreur ${response.status}`,\n        response.status === 401 ? 'auth' : response.status >= 500 ? 'server' : 'validation',\n        response.status,\n        data.error_type,\n        data\n      );\n    }\n\n    if (logId) logApiResponse(logId, response.status, data, startTime);\n    logDebugApiResponse(method, url, response.status, data, duration, parsedBody);\n    return data;\n  } catch (error) {\n    clearTimeout(timeoutId);\n\n    if (error instanceof ApiError) throw error;\n\n    if (error instanceof Error) {\n      if (error.name === 'AbortError') {\n        if (logId) logApiResponse(logId, 0, null, startTime, 'Timeout');\n        logDebugApiResponse(method, url, 0, null, Date.now() - startTime, parsedBody, 'Timeout');\n        throw new ApiError('Délai d\\'attente dépassé', 'timeout');\n      }\n      if (error instanceof TypeError) {\n        if (logId) logApiResponse(logId, 0, null, startTime, 'Network error');\n        logDebugApiResponse(method, url, 0, null, Date.now() - startTime, parsedBody, 'Network error');\n        throw new ApiError('Impossible de contacter le serveur', 'network');\n      }\n    }\n\n    if (logId) logApiResponse(logId, 0, null, startTime, 'Unknown error');\n    logDebugApiResponse(method, url, 0, null, Date.now() - startTime, parsedBody, 'Unknown error');\n    throw new ApiError('Erreur inattendue', 'unknown');\n  }\n}\n\nexport function getHeaders(token?: string, includeConfigPrefix = false): HeadersInit {\n  const headers: HeadersInit = {\n    'Content-Type': 'application/json',\n    'Accept': 'application/json',\n  };\n\n  const deviceId = getDeviceId();\n  if (deviceId) {\n    headers['X-Device-Id'] = deviceId;\n  }\n\n  const sessionUuid = getSessionUuid();\n  if (sessionUuid) {\n    headers['X-Session-UUID'] = sessionUuid;\n  }\n\n  if (deviceContext?.label) {\n    headers['X-Device-Label'] = deviceContext.label;\n  }\n  if (deviceContext?.browser) {\n    headers['X-Device-Browser'] = deviceContext.browser;\n  }\n  if (deviceContext?.deviceName) {\n    headers['X-Device-Name'] = deviceContext.deviceName;\n  }\n  if (deviceContext?.deviceModel) {\n    headers['X-Device-Model'] = deviceContext.deviceModel;\n  }\n  if (deviceContext?.deviceManufacturer) {\n    headers['X-Device-Manufacturer'] = deviceContext.deviceManufacturer;\n  }\n  if (deviceContext?.operatingSystem) {\n    headers['X-Device-Operating-System'] = deviceContext.operatingSystem;\n  }\n  if (deviceContext?.osVersion) {\n    headers['X-Device-Os-Version'] = deviceContext.osVersion;\n  }\n  if (deviceContext?.platform) {\n    headers['X-Device-Platform'] = deviceContext.platform;\n  }\n  if (deviceContext?.language) {\n    headers['X-Device-Language'] = deviceContext.language;\n  }\n  if (deviceContext?.webviewVersion) {\n    headers['X-Device-WebView-Version'] = deviceContext.webviewVersion;\n  }\n  if (typeof deviceContext?.isNative === 'boolean') {\n    headers['X-Device-Is-Native'] = deviceContext.isNative ? 'true' : 'false';\n  }\n\n  // Le prefix ne sert qu'aux appels SaaS qui choisissent une config locale.\n  if (includeConfigPrefix && config.configPrefix) {\n    headers['X-IAM-Config-Prefix'] = config.configPrefix;\n  }\n\n  if (token) {\n    headers['Authorization'] = `Bearer ${token}`;\n  }\n\n  return headers;\n}\n\nexport default {\n  getConfig: getNativeAuthConfig,\n  setConfig: setNativeAuthConfig,\n};\n","/**\n * Service d'authentification Native Mobile SSO v1.0\n * Architecture Frontend-First : Direct IAM après encryption\n * \n * @version 2.7.9\n */\n\nimport { \n  ApiError, \n  fetchWithTimeout,\n  getHeaders,\n  getDeviceId,\n  getNativeStorage,\n  ensureDeviceContext,\n  setAuthToken,\n  setAuthUser,\n  clearAuthToken,\n  getNativeAuthConfig,\n  setNativeAuthConfig,\n  isDebugMode,\n  STORAGE_KEYS,\n  getAuthToken,\n} from './api';\n\nimport type {\n  NativeAuthType,\n  NativeEncryptRequest,\n  NativeEncryptResponse,\n  NativeInitResponse,\n  NativeValidateResponse,\n  NativeGrantAccessResponse,\n  NativeResendOtpResponse,\n  NativeExchangeResponse,\n  NativeConfigResponse,\n  NativeCredentials,\n  NativeRefreshResponse,\n} from '../types/native';\n\n// ============================================\n// Credentials en mémoire (jamais persistés)\n// ============================================\n\nlet credentials: NativeCredentials | null = null;\nlet credentialsLoadedAt: number = 0;\nlet credentialsTtl: number = 300; // Default 5 minutes\nlet refreshInFlight: Promise<NativeRefreshResponse> | null = null;\nlet lastSuccessfulRefreshAt = 0;\nlet lastSuccessfulRefreshResponse: NativeRefreshResponse | null = null;\n\nconst DEFAULT_TTL = 300;\nconst REFRESH_MARGIN = 30; // Refresh 30s before expiration\nconst REFRESH_COOLDOWN_MS = 60 * 1000;\n\n// ============================================\n// Service Native Auth\n// ============================================\n\nexport const nativeAuthService = {\n  hasCredentials(): boolean {\n    return credentials !== null;\n  },\n\n  getCredentials(): NativeCredentials | null {\n    return credentials ? { ...credentials } : null;\n  },\n\n  getCredentialsTtl(): number {\n    return credentialsTtl;\n  },\n\n  getCredentialsAge(): number {\n    if (!credentialsLoadedAt) return Infinity;\n    return (Date.now() - credentialsLoadedAt) / 1000;\n  },\n\n  areCredentialsExpiringSoon(): boolean {\n    if (!credentials || !credentialsLoadedAt) return true;\n    const age = this.getCredentialsAge();\n    return age >= (credentialsTtl - REFRESH_MARGIN);\n  },\n\n  async ensureFreshCredentials(): Promise<void> {\n    if (!credentials || this.areCredentialsExpiringSoon()) {\n      if (isDebugMode()) {\n        console.log('🔄 [Native] Credentials expirés ou proches — auto-refresh');\n      }\n      await this.loadCredentials();\n    }\n  },\n\n  async loadCredentials(): Promise<NativeCredentials> {\n    const config = getNativeAuthConfig();\n    if (!config.saasApiUrl) {\n      throw new ApiError('saasApiUrl non configurée', 'unknown');\n    }\n\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [SaaS] GET /sso/config');\n    }\n\n    const response = await fetchWithTimeout<NativeConfigResponse>(\n      `${config.saasApiUrl}/sso/config`,\n      { method: 'GET', headers: getHeaders(undefined, true) },\n      config.timeout || 30000\n    );\n\n    if (!response.success || !response.encrypted_credentials || !response.app_key) {\n      throw new ApiError('Configuration invalide reçue du SaaS (app_key ou encrypted_credentials manquant)', 'server');\n    }\n\n    credentials = {\n      appKey: response.app_key,\n      encryptedCredentials: response.encrypted_credentials,\n    };\n\n    credentialsLoadedAt = Date.now();\n    credentialsTtl = response.credentials_ttl || DEFAULT_TTL;\n\n    // Propager le debug mode depuis le backend (si défini)\n    const currentConfig = getNativeAuthConfig();\n    if (typeof response.debug === 'boolean') {\n      if (currentConfig.debug !== true) {\n        setNativeAuthConfig({ debug: response.debug });\n      }\n    }\n\n    if (typeof response.bypass === 'boolean') {\n      setNativeAuthConfig({ bypass: response.bypass });\n    }\n\n    if (isDebugMode()) {\n      console.log('✅ [SaaS] Credentials chargés (ttl:', credentialsTtl, 's, debug:', response.debug ?? 'non défini', ')');\n    }\n\n    return credentials;\n  },\n\n  async encrypt(\n    type: NativeAuthType,\n    data: Partial<NativeEncryptRequest>\n  ): Promise<NativeEncryptResponse> {\n    // Auto-refresh credentials if expiring soon\n    await this.ensureFreshCredentials();\n\n    if (!credentials) {\n      throw new ApiError('Credentials non chargés. Appelez loadCredentials() d\\'abord.', 'auth');\n    }\n\n    const config = getNativeAuthConfig();\n    if (!config.iamApiUrl) {\n      throw new ApiError('iamApiUrl non configurée', 'unknown');\n    }\n\n    await ensureDeviceContext();\n\n    const payload: NativeEncryptRequest = {\n      type,\n      app_key: credentials.appKey,\n      encrypted_credentials: credentials.encryptedCredentials,\n      ...data,\n    };\n\n    if (isDebugMode()) {\n      const safeData = {\n        ...data,\n      } as Partial<NativeEncryptRequest> & {\n        password?: string;\n        otp_code?: string;\n        email?: string;\n        phone?: string;\n        ccphone?: string;\n      };\n      if (typeof safeData.password === 'string') safeData.password = '[redacted]';\n      if (typeof safeData.otp_code === 'string') safeData.otp_code = '[redacted]';\n      if (typeof safeData.email === 'string') safeData.email = safeData.email.includes('@')\n        ? safeData.email.replace(/(^.).*(@.*$)/, '$1***$2')\n        : '[redacted]';\n      if (typeof safeData.ccphone === 'string') {\n        safeData.ccphone = '[redacted]';\n      }\n      if (typeof safeData.phone === 'string') {\n        safeData.phone = '[redacted]';\n      }\n      console.log('📤 [IAM] POST /sso/native/encrypt', { type, ...safeData });\n    }\n\n    const response = await fetchWithTimeout<NativeEncryptResponse>(\n      `${config.iamApiUrl}/sso/native/encrypt`,\n      {\n        method: 'POST',\n        headers: getHeaders(undefined, false),\n        body: JSON.stringify(payload),\n      },\n      config.timeout || 30000\n    );\n\n    if (isDebugMode()) {\n      console.log('✅ [IAM] native_token reçu, expire dans', response.expires_in, 's');\n    }\n\n    return response;\n  },\n\n  async init(nativeToken: string): Promise<NativeInitResponse> {\n    const config = getNativeAuthConfig();\n    if (!config.iamApiUrl) {\n      throw new ApiError('iamApiUrl non configurée', 'unknown');\n    }\n\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/init');\n    }\n\n    const response = await fetchWithTimeout<NativeInitResponse>(\n      `${config.iamApiUrl}/sso/native/init`,\n      {\n        method: 'POST',\n        headers: getHeaders(undefined, false),\n        body: JSON.stringify({ native_token: nativeToken }),\n      },\n      config.timeout || 30000\n    );\n\n    if (isDebugMode()) {\n      console.log('✅ [IAM] Init:', { status: response.status, hasProcessToken: !!response.process_token });\n    }\n\n    return response;\n  },\n\n  async validate(\n    processToken: string,\n    creds: { password?: string; otp_code?: string }\n  ): Promise<NativeValidateResponse> {\n    const config = getNativeAuthConfig();\n    if (!config.iamApiUrl) {\n      throw new ApiError('iamApiUrl non configurée', 'unknown');\n    }\n\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/validate');\n    }\n\n    const response = await fetchWithTimeout<NativeValidateResponse>(\n      `${config.iamApiUrl}/sso/native/validate`,\n      {\n        method: 'POST',\n        headers: getHeaders(undefined, false),\n        body: JSON.stringify({\n          process_token: processToken,\n          ...creds,\n        }),\n      },\n      config.timeout || 30000\n    );\n\n    if (isDebugMode()) {\n      console.log('✅ [IAM] Validate:', { \n        hasCallback: !!response.callback_token, \n        requires2fa: response.requires_2fa \n      });\n    }\n\n    return response;\n  },\n\n  async verifyTotp(\n    processToken: string,\n    totpCode: string\n  ): Promise<NativeValidateResponse> {\n    const config = getNativeAuthConfig();\n    if (!config.iamApiUrl) {\n      throw new ApiError('iamApiUrl non configurée', 'unknown');\n    }\n\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/verify-totp');\n    }\n\n    return fetchWithTimeout<NativeValidateResponse>(\n      `${config.iamApiUrl}/sso/native/verify-totp`,\n      {\n        method: 'POST',\n        headers: getHeaders(undefined, false),\n        body: JSON.stringify({\n          process_token: processToken,\n          totp_code: totpCode,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  async grantAccess(processToken: string): Promise<NativeGrantAccessResponse> {\n    const config = getNativeAuthConfig();\n    if (!config.iamApiUrl) {\n      throw new ApiError('iamApiUrl non configurée', 'unknown');\n    }\n\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/grant-access');\n    }\n\n    return fetchWithTimeout<NativeGrantAccessResponse>(\n      `${config.iamApiUrl}/sso/native/grant-access`,\n      {\n        method: 'POST',\n        headers: getHeaders(undefined, false),\n        body: JSON.stringify({ process_token: processToken }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  async resendOtp(processToken: string): Promise<NativeResendOtpResponse> {\n    const config = getNativeAuthConfig();\n    if (!config.iamApiUrl) {\n      throw new ApiError('iamApiUrl non configurée', 'unknown');\n    }\n\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/resend-otp');\n    }\n\n    return fetchWithTimeout<NativeResendOtpResponse>(\n      `${config.iamApiUrl}/sso/native/resend-otp`,\n      {\n        method: 'POST',\n        headers: getHeaders(undefined, false),\n        body: JSON.stringify({ process_token: processToken }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  async exchange(callbackToken: string): Promise<NativeExchangeResponse> {\n    const config = getNativeAuthConfig();\n    if (!config.saasApiUrl) {\n      throw new ApiError('saasApiUrl non configurée', 'unknown');\n    }\n\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [SaaS] POST /sso/exchange');\n    }\n\n    const response = await fetchWithTimeout<NativeExchangeResponse>(\n      `${config.saasApiUrl}/sso/exchange`,\n      {\n        method: 'POST',\n        headers: getHeaders(undefined, true),\n        body: JSON.stringify({ callback_token: callbackToken }),\n      },\n      config.timeout || 30000\n    );\n\n    if (response.iam_token && response.reference && response.alias_reference && response.user_infos) {\n      setAuthToken(response.iam_token);\n      setAuthUser({\n        reference: response.reference,\n        alias_reference: response.alias_reference,\n        ...response.user_infos,\n      });\n    // Persister les métadonnées de session si elles sont fournies\n      const storage = getNativeStorage();\n      if (response.expires_at) {\n        storage.setItem(STORAGE_KEYS.TOKEN_EXPIRES_AT, response.expires_at);\n      }\n      if (response.refresh_expires_at) {\n        storage.setItem(STORAGE_KEYS.REFRESH_EXPIRES_AT, response.refresh_expires_at);\n      }\n      // Persister alias_reference pour accès rapide\n      storage.setItem(STORAGE_KEYS.ALIAS_REFERENCE, response.alias_reference);\n    }\n\n    if (isDebugMode()) {\n      console.log('✅ [SaaS] Session établie:', { reference: response.reference });\n    }\n\n    return response;\n  },\n\n  async checkToken(token: string): Promise<{ valid: boolean; user?: import('../types/native').UserInfos }> {\n    const cfg = getNativeAuthConfig();\n    if (!cfg.saasApiUrl) {\n      throw new ApiError('saasApiUrl non configurée', 'unknown');\n    }\n\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [SaaS] POST /sso/check-token');\n    }\n\n    try {\n      const response = await fetchWithTimeout<{\n        status?: string;\n        reference?: string;\n        alias_reference?: string;\n        iam_token?: string;\n        user_infos?: import('../types/native').UserInfos;\n        success?: boolean;\n      }>(\n        `${cfg.saasApiUrl}/sso/check-token`,\n        {\n          method: 'POST',\n          headers: getHeaders(token, true),\n        },\n        10000\n      );\n\n      if (response.reference && response.alias_reference && response.iam_token && response.user_infos) {\n        return {\n          valid: true,\n          user: {\n            reference: response.reference,\n            name: response.user_infos?.name || '',\n            email: response.user_infos?.email,\n            ccphone: response.user_infos?.ccphone,\n            phone: response.user_infos?.phone,\n            address: response.user_infos?.address,\n            town: response.user_infos?.town,\n            country: response.user_infos?.country,\n            image_url: response.user_infos?.image_url,\n            auth_2fa: response.user_infos?.auth_2fa,\n            alias_reference: response.alias_reference,\n          },\n        };\n      }\n\n      return { valid: false };\n    } catch (err) {\n      if (err instanceof ApiError && err.statusCode === 401) {\n        return { valid: false };\n      }\n      throw err;\n    }\n  },\n\n  async refresh(): Promise<NativeRefreshResponse> {\n    const now = Date.now();\n\n    if (refreshInFlight) {\n      return refreshInFlight;\n    }\n\n    if (\n      lastSuccessfulRefreshResponse?.iam_token\n      && lastSuccessfulRefreshAt\n      && now - lastSuccessfulRefreshAt < REFRESH_COOLDOWN_MS\n    ) {\n      if (isDebugMode()) {\n        console.log('🔄 [SaaS] POST /sso/refresh — cooldown actif, réponse réutilisée');\n      }\n      return lastSuccessfulRefreshResponse;\n    }\n\n    const cfg = getNativeAuthConfig();\n    if (!cfg.saasApiUrl) {\n      throw new ApiError('saasApiUrl non configurée', 'unknown');\n    }\n\n    await ensureDeviceContext();\n\n    const refreshToken = getNativeStorage().getItem(STORAGE_KEYS.REFRESH_TOKEN);\n\n    if (!refreshToken) {\n      return { success: false, error_type: 'missing_refresh', message: 'Refresh token manquant' };\n    }\n\n    if (isDebugMode()) {\n      console.log('📤 [SaaS] POST /sso/refresh');\n    }\n\n    refreshInFlight = (async () => {\n      try {\n        let response: NativeRefreshResponse;\n        try {\n          response = await fetchWithTimeout<NativeRefreshResponse>(\n            `${cfg.saasApiUrl}/sso/refresh`,\n            {\n              method: 'POST',\n              headers: getHeaders(undefined, true),\n              body: JSON.stringify({ refresh_token: refreshToken }),\n            },\n            cfg.timeout || 30000\n          );\n        } catch (err) {\n          // Normalize common cases for callers (do not force logout on network errors).\n          if (err instanceof ApiError) {\n            if (err.statusCode === 401) {\n              response = {\n                success: false,\n                error_type: err.errorType || 'invalid_refresh',\n                message: err.message,\n              };\n            } else if (err.statusCode === 404) {\n              response = {\n                success: false,\n                error_type: 'not_supported',\n                message: 'Endpoint refresh non disponible sur ce SaaS',\n              };\n            } else {\n              throw err;\n            }\n          } else {\n            throw err;\n          }\n        }\n\n        // Backends can return {success:false,...} with 200 (not recommended),\n        // but we keep the contract tolerant and only update state on explicit success.\n        // Refresh contract:\n        // - conserver iam_token quand le SaaS le renvoie\n        // - mettre à jour expires_at / refresh_expires_at si le SaaS fait tourner les métadonnées\n        if (response.iam_token && response.reference && response.alias_reference && response.user_infos) {\n          setAuthToken(response.iam_token);\n\n          const storage = getNativeStorage();\n          if (response.expires_at) storage.setItem(STORAGE_KEYS.TOKEN_EXPIRES_AT, response.expires_at);\n          if (response.refresh_expires_at) storage.setItem(STORAGE_KEYS.REFRESH_EXPIRES_AT, response.refresh_expires_at);\n          storage.setItem(STORAGE_KEYS.ALIAS_REFERENCE, response.alias_reference);\n          setAuthUser({\n            reference: response.reference,\n            alias_reference: response.alias_reference,\n            ...response.user_infos,\n          });\n\n          lastSuccessfulRefreshAt = Date.now();\n          lastSuccessfulRefreshResponse = response;\n        }\n\n        return response;\n      } finally {\n        refreshInFlight = null;\n      }\n    })();\n\n    return refreshInFlight;\n  },\n\n  async logout(token?: string): Promise<{ success: boolean }> {\n    const config = getNativeAuthConfig();\n    await ensureDeviceContext();\n\n    // Récupérer les identifiants avant nettoyage\n    const storage = getNativeStorage();\n    const iamToken = getAuthToken();\n\n    // Double revocation : SaaS + IAM en parallèle (best-effort)\n    const promises: Promise<unknown>[] = [];\n\n    // ① Appel SaaS — révoque le Sanctum token\n    if (config.saasApiUrl && token) {\n      promises.push(\n        fetchWithTimeout<{ success: boolean }>(\n          `${config.saasApiUrl}/sso/logout`,\n          {\n            method: 'POST',\n            headers: getHeaders(token, true),\n          },\n          config.timeout || 30000\n        ).catch((err) => {\n          if (isDebugMode()) {\n            console.warn('⚠️ [SaaS] Échec logout (non-bloquant):', err instanceof Error ? err.message : err);\n          }\n        })\n      );\n    }\n\n    // ② Appel direct IAM — révoque le token de session via sa référence stable\n    if (config.iamApiUrl && iamToken) {\n      const payload: Record<string, string> = { iam_token: iamToken };\n\n      promises.push(\n        fetchWithTimeout<{ success: boolean }>(\n          `${config.iamApiUrl}/sso/disconnect`,\n          {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n            body: JSON.stringify(payload),\n          },\n          5000\n        ).catch((err) => {\n          if (isDebugMode()) {\n            console.warn('⚠️ [IAM] Échec disconnect (non-bloquant):', err instanceof Error ? err.message : err);\n          }\n        })\n      );\n    }\n\n    // Attendre les deux sans bloquer\n    await Promise.allSettled(promises);\n\n    if (isDebugMode()) {\n      console.log('✅ [Logout] Double revocation terminée — nettoyage local');\n    }\n\n    // Nettoyage local garanti (même si les deux appels échouent)\n    clearAuthToken();\n    credentials = null;\n    credentialsLoadedAt = 0;\n    refreshInFlight = null;\n    lastSuccessfulRefreshAt = 0;\n    lastSuccessfulRefreshResponse = null;\n    return { success: true };\n  },\n\n  clearCredentials(): void {\n    credentials = null;\n    credentialsLoadedAt = 0;\n    refreshInFlight = null;\n    lastSuccessfulRefreshAt = 0;\n    lastSuccessfulRefreshResponse = null;\n  },\n\n  // ============================================\n  // High-level methods\n  // ============================================\n\n  async loginEmail(\n    email: string\n  ): Promise<NativeInitResponse> {\n    const { native_token } = await this.encrypt('login_email', {\n      email,\n    });\n    return this.init(native_token);\n  },\n\n  async loginPhone(\n    ccphone: string,\n    phone: string\n  ): Promise<NativeInitResponse> {\n    const { native_token } = await this.encrypt('login_phone', {\n      ccphone,\n      phone,\n    });\n    return this.init(native_token);\n  },\n\n  async loginAccessOtp(otpCode: string): Promise<NativeInitResponse> {\n    const { native_token } = await this.encrypt('login_access_otp', {\n      otp_code: otpCode.replace(/[\\s-]/g, ''),\n    });\n    return this.init(native_token);\n  },\n\n  async register(data: {\n    name: string;\n    email?: string;\n    ccphone: string;\n    phone: string;\n    town?: string;\n    country?: string;\n    registration_type?: 'email' | 'phone';\n  }): Promise<NativeInitResponse> {\n    const { native_token } = await this.encrypt('register', {\n      ...data,\n      registration_type: data.registration_type || 'email',\n    });\n    return this.init(native_token);\n  },\n\n  async registerPhoneOnly(data: {\n    name: string;\n    ccphone: string;\n    phone: string;\n    town?: string;\n    country?: string;\n  }): Promise<NativeInitResponse> {\n    if (data.ccphone !== '+221') {\n      throw new ApiError(\n        \"L'inscription par téléphone est réservée aux numéros sénégalais (+221)\",\n        'validation',\n        422,\n        'invalid_country_code'\n      );\n    }\n\n    const { native_token } = await this.encrypt('register', {\n      ...data,\n      email: '',\n      registration_type: 'phone',\n    });\n    return this.init(native_token);\n  },\n\n  async recoverPassword(\n    method: 'email' | 'phone',\n    identifier: { email?: string; ccphone?: string; phone?: string }\n  ): Promise<NativeInitResponse> {\n    const { native_token } = await this.encrypt('recovery_password', {\n      method,\n      ...identifier,\n    });\n    return this.init(native_token);\n  },\n};\n\nexport default nativeAuthService;\n","/**\n * Service de récupération de mot de passe v1.0\n * Architecture Frontend-First : Appels directs à l'IAM\n * \n * @version 2.7.9\n */\n\nimport { \n  ApiError, \n  fetchWithTimeout, \n  getHeaders,\n  getNativeAuthConfig, \n  isDebugMode,\n} from './api';\nimport { nativeAuthService } from './nativeAuth';\n\nimport type {\n  MobilePasswordInitResponse,\n  MobilePasswordSelectMethodResponse,\n  MobilePasswordResetResponse,\n  MobilePasswordResendResponse,\n} from '../types/mobile';\n\n// ============================================\n// Credentials (shared with nativeAuth)\n// ============================================\n\nfunction getIAMHeaders(): HeadersInit {\n  const creds = nativeAuthService.getCredentials();\n  if (!creds) {\n    throw new ApiError('Credentials non chargés. Appelez loadCredentials() d\\'abord.', 'auth');\n  }\n\n  return {\n    ...getHeaders(undefined, false),\n    'X-IAM-App-Key': creds.appKey,\n  };\n}\n\n// ============================================\n// Service\n// ============================================\n\nexport const mobilePasswordService = {\n  hasCredentials(): boolean {\n    return nativeAuthService.hasCredentials();\n  },\n\n  async loadCredentials() {\n    return nativeAuthService.loadCredentials();\n  },\n\n  async initRecovery(email: string): Promise<MobilePasswordInitResponse> {\n    const config = getNativeAuthConfig();\n    if (!config.iamApiUrl) {\n      throw new ApiError('iamApiUrl non configurée', 'unknown');\n    }\n\n    if (!nativeAuthService.hasCredentials()) {\n      await nativeAuthService.loadCredentials();\n    }\n\n    if (isDebugMode()) {\n      const maskedEmail = email.includes('@') ? email.replace(/(^.).*(@.*$)/, '$1***$2') : '[redacted]';\n      console.log('📤 [IAM] POST /sso/native/password/init', { email: maskedEmail });\n    }\n\n    const response = await fetchWithTimeout<MobilePasswordInitResponse>(\n      `${config.iamApiUrl}/sso/native/password/init`,\n      {\n        method: 'POST',\n        headers: getIAMHeaders(),\n        body: JSON.stringify({ email }),\n      },\n      config.timeout || 30000\n    );\n\n    if (isDebugMode()) {\n      console.log('✅ [IAM] Init recovery:', { \n        status: response.status, \n        hasOtp: !!response.otp_code,\n      });\n    }\n\n    return response;\n  },\n\n  async selectMethod(\n    processToken: string, \n    receiveChoice: 'email' | 'phone'\n  ): Promise<MobilePasswordSelectMethodResponse> {\n    const config = getNativeAuthConfig();\n    if (!config.iamApiUrl) {\n      throw new ApiError('iamApiUrl non configurée', 'unknown');\n    }\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/password/select-method', { receiveChoice });\n    }\n\n    return fetchWithTimeout<MobilePasswordSelectMethodResponse>(\n      `${config.iamApiUrl}/sso/native/password/select-method`,\n      {\n        method: 'POST',\n        headers: getIAMHeaders(),\n        body: JSON.stringify({ \n          process_token: processToken, \n          receive_choice: receiveChoice,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  validateOtpLocally(inputCode: string, storedCode: string): boolean {\n    return inputCode === storedCode;\n  },\n\n  async reset(\n    processToken: string,\n    password: string\n  ): Promise<MobilePasswordResetResponse> {\n    const config = getNativeAuthConfig();\n    if (!config.iamApiUrl) {\n      throw new ApiError('iamApiUrl non configurée', 'unknown');\n    }\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/password/reset');\n    }\n\n    return fetchWithTimeout<MobilePasswordResetResponse>(\n      `${config.iamApiUrl}/sso/native/password/reset`,\n      {\n        method: 'POST',\n        headers: getIAMHeaders(),\n        body: JSON.stringify({\n          process_token: processToken,\n          password,\n          password_confirmation: password,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  async resendOtp(processToken: string): Promise<MobilePasswordResendResponse> {\n    const config = getNativeAuthConfig();\n    if (!config.iamApiUrl) {\n      throw new ApiError('iamApiUrl non configurée', 'unknown');\n    }\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/password/resend');\n    }\n\n    return fetchWithTimeout<MobilePasswordResendResponse>(\n      `${config.iamApiUrl}/sso/native/password/resend`,\n      {\n        method: 'POST',\n        headers: getIAMHeaders(),\n        body: JSON.stringify({ process_token: processToken }),\n      },\n      config.timeout || 30000\n    );\n  },\n};\n\nexport { ApiError };\nexport default mobilePasswordService;\n","/**\n * Hook de récupération de mot de passe v1.0\n * Architecture Frontend-First avec appels directs à l'IAM\n * \n * @version 2.7.9\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { mobilePasswordService } from '../services/mobilePassword';\nimport { setNativeAuthConfig, ApiError, repairNativeSsoStorage, isDebugMode } from '../services/api';\nimport type { MobilePasswordState } from '../types/mobile';\n\nexport interface UseMobilePasswordOptions {\n  saasApiUrl: string;\n  iamApiUrl: string;\n  autoLoadCredentials?: boolean;\n  \n}\n\ninterface MobilePasswordStateExtended extends MobilePasswordState {\n  credentialsLoaded: boolean;\n  errorType: string | null;\n}\n\nfunction getErrorMessage(err: unknown, context: string): { message: string; type: string } {\n  if (err instanceof ApiError) {\n    return { message: err.message, type: err.type };\n  }\n  if (err instanceof Error) {\n    if (err.message.includes('fetch') || err.message.includes('network')) {\n      return { message: 'Vérifiez votre connexion Internet', type: 'network' };\n    }\n    if (err.message.includes('timeout')) {\n      return { message: 'Le serveur met trop de temps à répondre', type: 'timeout' };\n    }\n    return { message: err.message, type: 'unknown' };\n  }\n  return { message: `Erreur lors de ${context}`, type: 'unknown' };\n}\n\nexport function useMobilePassword(options: UseMobilePasswordOptions) {\n  const { saasApiUrl, iamApiUrl, autoLoadCredentials = true } = options;\n\n  const configuredRef = useRef(false);\n\n  useEffect(() => {\n    const repairResult = repairNativeSsoStorage();\n    if (repairResult.cleaned && isDebugMode()) {\n      console.warn('🔧 [useMobilePassword] Storage SSO réparé', repairResult.reason);\n    }\n  }, []);\n\n  useEffect(() => {\n    if (!configuredRef.current) {\n      setNativeAuthConfig({ saasApiUrl, iamApiUrl });\n      configuredRef.current = true;\n    }\n  }, [saasApiUrl, iamApiUrl]);\n\n  const [state, setState] = useState<MobilePasswordStateExtended>({\n    credentialsLoaded: false,\n    processToken: null,\n    status: 'idle',\n    storedOtp: null,\n    receiveMode: null,\n    maskedEmail: null,\n    maskedPhone: null,\n    loading: false,\n    error: null,\n    errorType: null,\n  });\n\n  const loadCredentials = useCallback(async () => {\n    setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n    try {\n      await mobilePasswordService.loadCredentials();\n      setState(prev => ({ ...prev, credentialsLoaded: true, loading: false }));\n      return { success: true };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'le chargement');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, []);\n\n  useEffect(() => {\n    if (autoLoadCredentials && !state.credentialsLoaded) {\n      loadCredentials();\n    }\n  }, [autoLoadCredentials, state.credentialsLoaded, loadCredentials]);\n\n  const initRecovery = useCallback(async (email: string) => {\n    setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n    try {\n      if (!mobilePasswordService.hasCredentials()) {\n        await mobilePasswordService.loadCredentials();\n      }\n      const response = await mobilePasswordService.initRecovery(email);\n\n      if (response.success && response.process_token) {\n        if (response.status === 'choice_required') {\n          setState(prev => ({\n            ...prev,\n            credentialsLoaded: true,\n            processToken: response.process_token!,\n            status: 'choice_required',\n            maskedEmail: response.masked_email || null,\n            maskedPhone: response.masked_phone || null,\n            loading: false,\n          }));\n          return { success: true, status: 'choice_required' as const };\n        } else {\n          setState(prev => ({\n            ...prev,\n            credentialsLoaded: true,\n            processToken: response.process_token!,\n            status: 'pending_otp',\n            storedOtp: response.otp_code || null,\n            receiveMode: 'email',\n            maskedEmail: response.masked_email || null,\n            loading: false,\n          }));\n          return { success: true, status: 'pending_otp' as const };\n        }\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Aucun compte trouvé avec cet email',\n        errorType: response.error_type || 'unknown',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'la recherche du compte');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, []);\n\n  const selectMethod = useCallback(async (choice: 'email' | 'phone') => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n    try {\n      const response = await mobilePasswordService.selectMethod(state.processToken, choice);\n      if (response.success) {\n        setState(prev => ({\n          ...prev,\n          status: 'pending_otp',\n          storedOtp: response.otp_code || null,\n          receiveMode: response.receive_mode || choice,\n          loading: false,\n        }));\n        return { success: true };\n      }\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Impossible d\\'envoyer le code',\n        errorType: response.error_type || 'unknown',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'l\\'envoi du code');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, [state.processToken]);\n\n  const verifyOtp = useCallback((inputCode: string): boolean => {\n    if (!state.storedOtp) {\n      setState(prev => ({ ...prev, error: 'Session invalide', errorType: 'invalid_session' }));\n      return false;\n    }\n    const isValid = mobilePasswordService.validateOtpLocally(inputCode, state.storedOtp);\n    if (isValid) {\n      setState(prev => ({ ...prev, status: 'pending_password', error: null, errorType: null }));\n      return true;\n    }\n    setState(prev => ({ ...prev, error: 'Code incorrect', errorType: 'invalid_otp' }));\n    return false;\n  }, [state.storedOtp]);\n\n  const resetPassword = useCallback(async (password: string) => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n    try {\n      const response = await mobilePasswordService.reset(state.processToken, password);\n      if (response.success) {\n        setState(prev => ({ ...prev, status: 'completed', loading: false }));\n        return { success: true };\n      }\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Erreur lors de la réinitialisation',\n        errorType: response.error_type || 'unknown',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'la réinitialisation');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, [state.processToken]);\n\n  const resendOtp = useCallback(async () => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n    try {\n      const response = await mobilePasswordService.resendOtp(state.processToken);\n      if (response.success && response.otp_code) {\n        setState(prev => ({ ...prev, storedOtp: response.otp_code!, loading: false }));\n        return { success: true, cooldown: response.cooldown_remaining };\n      }\n      setState(prev => ({ ...prev, loading: false }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'le renvoi');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, [state.processToken]);\n\n  const reset = useCallback(() => {\n    setState({\n      credentialsLoaded: state.credentialsLoaded,\n      processToken: null,\n      status: 'idle',\n      storedOtp: null,\n      receiveMode: null,\n      maskedEmail: null,\n      maskedPhone: null,\n      loading: false,\n      error: null,\n      errorType: null,\n    });\n  }, [state.credentialsLoaded]);\n\n  const clearError = useCallback(() => {\n    setState(prev => ({ ...prev, error: null, errorType: null }));\n  }, []);\n\n  return {\n    credentialsLoaded: state.credentialsLoaded,\n    processToken: state.processToken,\n    status: state.status,\n    storedOtp: state.storedOtp,\n    receiveMode: state.receiveMode,\n    maskedEmail: state.maskedEmail,\n    maskedPhone: state.maskedPhone,\n    loading: state.loading,\n    error: state.error,\n    errorType: state.errorType,\n\n    isCompleted: state.status === 'completed',\n    isChoiceRequired: state.status === 'choice_required',\n    isPendingOtp: state.status === 'pending_otp',\n    isPendingPassword: state.status === 'pending_password',\n\n    loadCredentials,\n    initRecovery,\n    selectMethod,\n    verifyOtp,\n    resetPassword,\n    resendOtp,\n    reset,\n    clearError,\n  };\n}\n\nexport default useMobilePassword;\n","export default \"data:image/png;base64,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Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9nL2ltZy8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6aWxsdXN0cmF0b3I9Imh0dHA6Ly9ucy5hZG9iZS5jb20vaWxsdXN0cmF0b3IvMS4wLyIKICAgICAgICAgICAgeG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvIj4KICAgICAgICAgPGRjOmZvcm1hdD5KUEVHIGZpbGUgZm9ybWF0PC9kYzpmb3JtYXQ+CiAgICAgICAgIDxkYzp0aXRsZT4KICAgICAgICAgICAgPHJkZjpBbHQ+CiAgICAgICAgICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+UHJpbnQ8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6QWx0PgogICAgICAgICA8L2RjOnRpdGxlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDI1LTEwLTIxVDE1OjMzOjQ0WjwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMjUtMTAtMjFUMTU6MzM6NDRaPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMjUtMTAtMjFUMTU6MzM6NDRaPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBJbGx1c3RyYXRvciAyOS42IChNYWNpbnRvc2gpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6VGh1bWJuYWlscz4KICAgICAgICAgICAgPHJkZjpBbHQ+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8eG1wR0ltZzp3aWR0aD4yNTY8L3htcEdJbWc6d2lkdGg+CiAgICAgICAgICAgICAgICAgIDx4bXBHSW1nOmhlaWdodD4yNTY8L3htcEdJbWc6aGVpZ2h0PgogICAgICAgICAgICAgICAgICA8eG1wR0ltZzpmb3JtYXQ+SlBFRzwveG1wR0ltZzpmb3JtYXQ+CiAgICAgICAgICAgICAgICAgIDx4bXBHSW1nOmltYWdlPi85ai80QUFRU2taSlJnQUJBZ0VBQUFBQUFBRC83UUFzVUdodmRHOXphRzl3SURNdU1BQTRRa2xOQSswQUFBQUFBQkFBQUFBQUFBRUEmI3hBO0FRQUFBQUFBQVFBQi8rNEFEa0ZrYjJKbEFHVEFBQUFBQWYvYkFJUUFCZ1FFQkFVRUJnVUZCZ2tHQlFZSkN3Z0dCZ2dMREFvS0N3b0smI3hBO0RCQU1EQXdNREF3UURBNFBFQThPREJNVEZCUVRFeHdiR3hzY0h4OGZIeDhmSHg4Zkh3RUhCd2NOREEwWUVCQVlHaFVSRlJvZkh4OGYmI3hBO0h4OGZIeDhmSHg4Zkh4OGZIeDhmSHg4Zkh4OGZIeDhmSHg4Zkh4OGZIeDhmSHg4Zkh4OGZIeDhmSHg4Zi84QUFFUWdCQUFFQUF3RVImI3hBO0FBSVJBUU1SQWYvRUFhSUFBQUFIQVFFQkFRRUFBQUFBQUFBQUFBUUZBd0lHQVFBSENBa0tDd0VBQWdJREFRRUJBUUVBQUFBQUFBQUEmI3hBO0FRQUNBd1FGQmdjSUNRb0xFQUFDQVFNREFnUUNCZ2NEQkFJR0FuTUJBZ01SQkFBRklSSXhRVkVHRTJFaWNZRVVNcEdoQnhXeFFpUEImI3hBO1V0SGhNeFppOENSeWd2RWxRelJUa3FLeVkzUENOVVFuazZPek5oZFVaSFREMHVJSUpvTUpDaGdaaEpSRlJxUzBWdE5WS0JyeTQvUEUmI3hBOzFPVDBaWFdGbGFXMXhkWGw5V1oyaHBhbXRzYlc1dlkzUjFkbmQ0ZVhwN2ZIMStmM09FaFlhSGlJbUtpNHlOam8rQ2s1U1ZscGVZbVomI3hBO3FibkoyZW41S2pwS1dtcDZpcHFxdXNyYTZ2b1JBQUlDQVFJREJRVUVCUVlFQ0FNRGJRRUFBaEVEQkNFU01VRUZVUk5oSWdaeGdaRXkmI3hBO29iSHdGTUhSNFNOQ0ZWSmljdkV6SkRSRGdoYVNVeVdpWTdMQ0IzUFNOZUpFZ3hkVWt3Z0pDaGdaSmpaRkdpZGtkRlUzOHFPend5Z3AmI3hBOzArUHpoSlNrdE1UVTVQUmxkWVdWcGJYRjFlWDFSbFptZG9hV3ByYkcxdWIyUjFkbmQ0ZVhwN2ZIMStmM09FaFlhSGlJbUtpNHlOam8mI3hBOytEbEpXV2w1aVptcHVjblo2ZmtxT2twYWFucUttcXE2eXRycSt2L2FBQXdEQVFBQ0VRTVJBRDhBOVU0cTdGWFlxN0ZYWXE3RlhZcTcmI3hBO0ZYWXE3RlhZcTdGWFlxN0ZYQWcxQU5TTmo3ZDhWZGlyc1ZkVVZwWGNia2ZQRlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlgmI3hBO1lxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGVWg4MmVmUEovbEsxK3MrWXRWZzA5V0JhT0oyNVRTQWRmVGhYbEkvK3hYSlJnWmMmI3hBO2tHUUhONGI1dC81ekYwNkZuZzhxYUs5MFJVTGU2ZzNwSlVkeEJHV1poODNVKzJaVWRJZXBham03bmsydmY4NUgvbTdyRHQvdVovUjAmI3hBO0xWcEJZUkpBQlh3a28wMzN2bDhkUEFkR3M1Q1dDNmw1bzh6YW9TZFQxZTl2aTFReHViaVdhdGExcnpadkU1WUlnY2d4Skw3Qy93Q2MmI3hBO1UvOEF5VWR2L3dBeHQxL3hJWmdhbjYzSXhjbnNPWTdZN0ZYeVQvem1GTExGNTgwT1NKMmpkZE0yZFNRUldlVWRSbWZwZnBMajV1YnkmI3hBO2pSdnpUL01mUm1CMDd6SnFFU3J1SW11SGxpLzVGU0YwL0RMemlpZWpXSkVQUy9MUC9PWFg1Z2FlVWoxeTB0TmJnRk9jbkg2cmNIL1omI3hBO3hEMGgvd0Fpc3BscFlubHMyREtYdFBrdi9uSm44cy9NWmpndTdwdEJ2MzI5SFVLSkVUL2szQzFqcC9yOGZsbU5QVHlIbTJESUM5WWomI3hBO2tqa2pXU05nOGJnTWpxYWdnN2dnanFEbERZM2lyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWUUd1Ni8mI3hBO291Z2FaTnFtczNrVmhZUUNzbHhNM0ZmWUR1ekhzbzNQYkRHSkpvSUpwOHcvbVgvemxucXQ2MHVuZVJvanA5cDlrNnZjS3JYRGpvZlMmI3hBO2lQSkl4NEZxdC9xbk0zSHBRUHFhWlplNTgvNmpxZW82bmV5MzJvM1V0NWVUSGxOY3p1MGtqSHhabUpKektBcmswMmhzS3V4VjJLdnQmI3hBO1gvbkZQL3lVZHY4QTh4dDEvd0FTR2E3VS9XNU9MazloekhiSFlxK1Ivd0RuTWY4QTVUblJmKzJZUCtvaVhNL1NmU1hIemMzZ09aVFUmI3hBOzdGWFlxelg4di96Zzg5ZVJaMS9ROThaTlByV1hTcm1zdHExVFUwU29LRS96SVFjcm5pakxteWpNaDlZL2xaL3prQjVRODlDT3hrUDYmI3hBO0k4d2tVT216c0NzcmY4dTh2d2lUL1ZJRGV4RytZR1RBWSs1dmprQmVvWlMyT3hWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXgmI3hBO1YyS3V4VmhQNW8vbXo1YS9MM1NQcldvdjlZMUtjSDlINlZHd0VzekRhcDY4SXgrMDVIeXFkc3N4NGpNN01aVEFmRlA1aGZtWDVyOCsmI3hBO2FzYi9BRnk1ckZHVDlUc0lxcmJ3S2UwYVZPNTdzYXNlNTZac3NlTVJHempTa1N4WEpzWFlxN0ZYWXE3Rlgyci9BTTRwL3dEa283Zi8mI3hBO0FKamJyL2lRelhhbjYzSnhjbnNPWTdZN0ZYeVAvd0E1ai84QUtjNkwvd0Jzd2Y4QVVSTG1mcFBwTGo1dWJ3SE1wcWRpcnNWZGlyYU8mI3hBO3lNSFFsV1VncXdOQ0NPaEJ4VjlIL2tyL0FNNU8zRnM5djVlOCtUbWExTkk3VFhucVpJK3dXNlA3YS84QUZuVWZ0VjZqRHphZnJGdWgmI3hBO2s2RjlTUlN4VFJKTEU2eVJTS0hqa1FobFpXRlFRUnNRUm1FM3JzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVllGK2IvNXQmI3hBOzZSK1hlZ2ZXWlF0MXJOMkdUVE5PNVVMc0J2SkpUY1JKKzBlL1FlMXVMRVpueVlUblQ0YTh6ZVp0YTh6YTFjNjFyVnkxMXFGMDNLU1ImI3hBO3VnSDdLSXZSVlViS282WnNveEFGQnhpYlN2SklkaXJzVmRpcnNWZGlyN1YvNXhUL0FQSlIyLzhBekczWC9FaG11MVAxdVRpNVBZY3gmI3hBOzJ4Mkt2a2YvQUp6SC93Q1U1MFgvQUxaZy93Q29pWE0vU2ZTWEh6YzNnT1pUVTdGWFlxN0ZYWXE3Rlh1bi9PUDM1K1QrVjdtRHl2NWwmI3hBO21NbmxxZCtGcGR1YW14ZGo0bi9kSkorSWZzOVIzekd6NE9MY2MyM0hPdGkrd1k1STVJMWtqWVBHNERJNm1vSU80SUk2ZzVyM0lieFYmI3hBOzJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFZJdlBIbkxTUEozbG05OHdhcTFMZTBYNElsKzNMSzIwY1NmNVR0dDdkVHNNbENCa2FDSkcmI3hBO2crQlBQSG5UV3ZPWG1TNjE3VjVPZHhjR2tVUUo0UXdxVHdoakI2S3RmcE5TZHljMnNJQ0lvT0pJMlVoeVNIWXE3RlhZcTdGVlcxdEwmI3hBO3U4dUV0clNHUzR1SkRTT0dKUzdzZkJWVUVuRWxYb0doL3dET1BuNXZhd2l5dytYcGJXRnYyNzE0N1VpdmpIS3l5ZjhBQzVTYzhCMVomI3hBO2pHUytyL3lKOGs2NTVNL0wrSFJOYldOYjlibWVabGhmMUZDeU1PUHhBRGZiTUhOTVNsWWI0Um9QUXNxWnV4VjRSL3prUCtTUG5EejUmI3hBO3JtbjZ2b0Vsb1VzN1A2dEpiWEVqUlNzM3F1OVUrQmtwUis3RE1yQm1FUlJhc2tDWHpWNXIvS3o4d2ZLZ2FUWGREdWJhMlhyZHFvbXQmI3hBO3h2UVZtaUx4aXZ1Y3pJNUl5NUZwTVNHSzVOaTdGWFlxN0ZYWXE3RlgwOS96aTkrY3p5R0x5RnI5eHlZQWpRTHFRNzBBcWJSbVBoMWkmI3hBOy93Q0IvbEdZV3B4ZnhCdXhUNlBwak1OdmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZmRlAvT1NYNXBONXY4M05wR255OHRBME4yaGcmI3hBOzRuNFpybjdNMDIyeEFJNEo3Ymo3V2JIVDQrRVgxTGpaSldYaitaRFc3RlhZcTdGVzFWbVlLb0pZbWdBM0pKeFY3OStWbi9PSzJzYTEmI3hBO0hEcTNuT1NUU2RPY0I0dE1qRkx5UmV2N3prQ0lRZkNoYjJYTVhKcVFOZzJ4eFh6ZlRYbFR5TDVSOHAyZ3RmTCtsUVdDVW84aUxXWjYmI3hBO2Y3OGxibEkvK3liTUtVekxtM2lJSEpQY2lsMkt1eFYyS3V4VnBsVmxLc0FWSW9RZHdRY1ZlUmZtTi96alI1RjgxSkxkNlZFTkExcHEmI3hBO3NKN1ZSOVhrYi9pMjNGRjMvbVRpZTVybVJqMUVvODl3MXl4Z3ZrM3o1K1hQbXZ5TnFwMDdYclF4Y2lmcTE1SFY3ZWRSKzFGSlFWOXcmI3hBO2FNTzR6T2hrRWhzNDhva01aeWFIWXE3RlhZcXFXMXpjV3R4RmMyOGpRM0VEckpES2hLc2pvZVNzcEhRZ2lveFY5N2ZrdCtaRVBuM3kmI3hBO1RiYWxJd0dyV3RMWFY0aHRTNFJSOFlIOHNpMFlmU08yYXZOajRaVTVVSldHZVpVemRpcnNWZGlyc1ZkaXJzVmRpcnNWZWFmODVCL20mI3hBO0EzazM4dkxwN1NYMDlYMVVteDA4ZzBkVElwOVdVZC8zY2RhSHN4WExzRU9LVERKS2crRk0yYml1eFYyS3V4VmZERE5QTkhCQkcwczAmI3hBO3JCSW9rQlptWmpSVlZSdVNUMEdLdnNQOGlQOEFuSDJ4OHEyMXQ1ajh5UXJjK1o1RkVrRnU0RFIyUU5DQUFlczQ3dCt6MFh4T3Z6WismI3hBO0xZY25JaGpyY3ZjTXhtMTJLdXhWMkt1eFYyS3V4VjJLdXhWS1BOWGxQUVBOV2l6Nk5ydG90M1l6OVZiWmtZZlplTng4U092WWpKUmsmI3hBO1ltd2dpM3cvK2IvNVJheitYZXVDQ1VtNjBXN0xIUzlScFRtbzNNY2dIMlpFcnYyUFVlMnl4WlJNZWJpemhUQU10WXV4VjJLdXhWNnAmI3hBOy93QTQ1Zm1DM2xMOHdyYTN1Sk9Pa2E0VnNiMEUwVlhadjNFcHJ0OEVob1QyVm15alVRNG8rNW5qbFJmY1dhMXluWXE3RlhZcTdGWFkmI3hBO3E3RlhZcTdGWHhoL3psVDV5T3QvbU1kSGhmbFkrWG9oYktCOWszRW9FazdmUjhLSC9Welk2YUZSdnZjYktiTHhqTWhyZGlyc1ZkaXImI3hBOzZkLzV4WS9LQ1AwazgvNjNBR2RpeTZCYnlEN0lGVmU2SVBldFZqK2x2NVRtRnFjdjhJYnNVT3I2WnpEYjNZcTdGWFlxN0ZYWXE3RlgmI3hBO1lxN0ZYWXE3RlVqODYrVHRHODRlVzd2UWRYajUydDB2d1NEN2NVbyt4TEdleklmNkhZNUtFekUyRVNGaDhBZWMvS1dxK1VmTTE5NWYmI3hBOzFSYVhWbEp4NWo3TWlFY281VS95WFVnait1YldFaElXSEVJb3BKa2tPeFYyS3Rna0VFR2hHNEl4VitndjVSZWJ6NXUvTHZSZGJsZm4mI3hBO2R5UWVqZkh2OVlnSmlsSi8xbVhsOGptcXl3NFpFT1hBMkdZWld5ZGlyc1ZkaXJzVmRpcnNWUTJxYWpiNmJwbDNxTnllTnRaUXlYRXomI3hBO2VDUklYWS9jdUVDelNsK2Iyc2FwZGF0cTk3cWwyZVYxZnp5M003ZUx6T1hiOFd6YmdVS2NJbEI0VmRpcnNWWlArV25rcTU4NmVkZE0mI3hBOzh2UkVyRmN5Y3J5WWRZN2FNYzVuK2ZBRUwvbFVHUXlUNFkybUlzMC9RbXhzclN3c29MR3ppV0MwdFkwaHQ0RUZGU09OUXFxbzhBQlQmI3hBO05VVGJtSzJCWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcThCLzV5MC9MMlBVL0xOdjV3czR2OVAwWXJEZkZlcjJjclVCUGNtS1YmI3hBO2hUMlpzeXRMa28xM3RXV08xdmtmTTl4M1lxN0ZYWXErb3Y4QW5EYnpJWHN2TUhscVIvN21TUFVMVlBhUWVsTjl4U1A3OHd0WEhrVy8mI3hBO0NlajZVekRibllxN0ZYWXE3RlhZcTdGWG5YL09RdXN0cFA1UWVZWlViakxkUkpaSU9sUmRTckZJUCtSYk5sMkFYTU1NaDJmQjJiTngmI3hBO1hZcTdGWFlxK252K2NOL0txQ0hYZk5jcUF1ekxwbG94RzRDZ1RUNysvS0w3c3d0WExrRzdDT3I2WXpEYjNZcTdGWFlxN0ZYWXE3RlgmI3hBO1lxN0ZYWXE3RlhZcTdGVUhyV2syZXNhUmU2VGVyenRMK0NTMm5YeFNWQ2pmZ2NJTkcwRVcvT0RXTk11ZEsxZSswdTZGTG13dUpiV2MmI3hBO2VFa0xsRy9GYzI0TmkzRElRbUZYWXE3Rlhybi9BRGkxckIwLzgzYkczNWNVMVMydWJOOTZEYVA2d3RmOWxBTW8xSXVEWmlPNzdhelcmI3hBO3VTN0ZYWXE3RlhZcTdGWFlxOE4vNXkrdmpCK1dsamJLYUc3MVdGV0crNkpETTU2ZjVRWE1uU2oxTldYaytPODJEanV4VjJLdXhWOTAmI3hBOy93RE9OdWtycDM1UGFIdFNXOTllN2xQaVpaMzRIL2tXcTVyTlFibVhLeGpaNmJsTE4yS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMksmI3hBO3V4VjJLdmhIL25JblNrMDc4NHZNTWNZcEhjU1EzUys1bmdTUnoveU1MWnM4QnVBY1hJTjNtK1hNSFlxN0ZXWS9rNWVtei9OVHlwTU8mI3hBO3JhbmJRN2Y4WHlDSC9qZks4bzlKWlE1aCtndWFweTNZcTdGWFlxN0ZYWXE3Rlh6MS93QTVsU1NEeXA1ZmpCL2R0ZnlNd3ArMHNKQzcmI3hBOy93Q3lPWmVrNWxwemNueWRtYzBPeFYyS3V4VitndjVOb3EvbFY1VUNnS1AwWmJtZ0ZOeWdKUDBuTlZsK291WERrR1k1V3lkaXJzVmQmI3hBO2lyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcjRxLzV5cy84QUp1WEgvTUZhL3dERVRteDAzME9ObDV2SHN5R3QyS3V4VlA4QTh2cEgmI3hBO2k4KytXcEVQRjAxV3laVzhDTGhDRGtNbjBuM0pqemZvdm1wY3gyS3V4VjJLdXhWMkt1eFY0UDhBODVpV3p2OEFsNXBWd3RTc09yUnEmI3hBO3dBclFQYnpiazl0MXA5T1pXbCtyNE5XYmsrUWN6M0hkaXJzVmRpcjd5LzV4ODFGYi93REo3eTNLRFZvb1pMZGgzQmduZUlEdjJVWnEmI3hBOzg0cVpjckg5TDBUS21ic1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZmRFgvT1MrcExlL25IclNvZVNXaTIxc3A5MHQwWngmI3hBOzlEc3d6WmFjVkFPTGsrcDVkbDdCMkt1eFZsbjVTMjczSDVvZVU0MDZycTFsSWRxN1JUcElmd1hLOHYwbjNNb2N3L1FyTlU1YnNWZGkmI3hBO3JzVmRpcnNWZGlyeXovbkpyU1RxSDVQNnU2cnlrc0pMZTdRVXI5aVpVYysxSTVHT1g2YzFNTmVRYlBoek5rNHpzVmRpcnNWZldYL08mI3hBO0hmbVZMbnl0clBsMlJ2MzJuWFMzY0lKLzNUZElGSUE4RmVFay93Q3RtRHE0N2d0K0U3VStoTXhHNTJLdXhWMkt1eFYyS3V4VjJLdXgmI3hBO1YyS3V4VjJLdXhWVHVibUMxdHBibTRjUjI4Q05MTkkzUlVRY21ZL0lERUsvT0x6WnJzbXYrWjlXMXVTb2JVcnVhNkNucW9sa0xLdismI3hBO3hCcG0zakdnQTRaTmxLc2toMkt1eFY2aC93QTQxYVNkUi9PSFJXSzhvckZiaTdsNmJDT0IxUTcvQVBGanJsT29OUUxQR04zM05tc2MmI3hBO3AyS3V4VjJLdXhWMkt1eFZLdk5laHByM2xqVnRGZWdYVXJPZTE1SG9wbGpLQnY4QVlrMXlVVFJCUVJZZm5EUEJMQk5KQk1oam1pWXAmI3hBO0lqYkZXVTBJUHlPYmR3MW1LdXhWMkt2UWZ5SzgrTDVML01YVDcrNWs5UFM3eXRqcVpQUVF6RVVjKzBjZ1Z6N0E1Vm1oeFJaUWxSZmUmI3hBO29JSXFPbWF0eTNZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhrSC9PVDNueFBMZjVlUzZWYnljZFQ4eGNyT0pRZmlGc0FEY3YmI3hBOzh1QkVmK3p6STA4TGxmYzE1WlVIeFJteGNaMkt1eFYyS3ZwRC9uRFh5NlpOVjh3ZVluWDRiZUNQVDRHUFF0TTNxeTAvMVJFbjM1aDYmI3hBO3VXd0RkaEhWOVRaaE43c1ZkaXJzVmRpcnNWZGlyc1ZmQzMvT1JubEUrVy96VDFUMDA0MmVya2FuYW50L3BCUHJENkpsZmJ3cG16MDgmI3hBO3JpNHVRVVhtV1hNSFlxN0ZYWXErelA4QW5HZjgxMDgwK1dWOHVhbk5YWDlFakNJem1yWEZvdnd4eWI3bG85a2Y2RDN6WDZqRndteHkmI3hBO0xrWTVXS2UxWmpOcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXFIMUhVYkhUYkM0MUMvbVcyc3JTTnBybWVRMFZJMEZXWS9JWVFMVWwmI3hBOzhEL205K1kxMTU5ODZYV3NIa21uUmY2UHBWdTMrNjdkQ2VKSS9tYzFkdmMwNkFadE1XUGhqVGlUbFpZVGxqRjJLdXhWMkt2dTMvbkgmI3hBO255aWZMUDVXNlhGS25DODFNSFVyc0VVUEs1QU1ZUHVJVlFITlpubGNuS3hpZzlKeWxtN0ZYWXE3RlhZcTdGWFlxN0ZYaWY4QXpsVDUmI3hBO0NiWHZJeWEvYVJjOVE4dk0wMG5FZkUxbkpRVGozNEVLL3NBMlpPbW5VcTcyckxHdytOYzJEanV4VjJLdXhWTXZMbm1MVi9MbXQybXQmI3hBO2FSY0cyMUN5Y1NRU2pwNEZXSDdTc0toZ2Vvd1NpQ0tLZzArNlB5bC9OdlFmekMwTlo3ZDF0OWF0MEg2VDBzbjQ0MjZGMEIzYUpqOWwmI3hBO3ZvTythekxpTUQ1T1ZDZHM4eXBtN0ZYWXE3RlhZcTdGWFlxN0ZYWXFzbW1oZ2hrbm5rV0tHSlM4c3JrS3Fxb3F6TXgyQUE2bkZYeDcmI3hBOy93QTVDL252L2k2ZC9MUGx5WWp5emJ1RGMzUzhsTjdLcHFOalQ5MGpmWkJHNUhMd3pZWU1QRHVlYmo1SjNzSGgyWkxVN0ZYWXE3RlcmI3hBO2Evazc1RWs4N2VmOU4wZGtMV0NQOVoxUmgwVzFoSU1nSjdjelJCN3RsZVdmREcyVUkyWDZBS3Fxb1ZRQW9GQUJzQUJtcWN0dkZYWXEmI3hBOzdGWFlxN0ZYWXE3RlhZcXN1SUliaUNTM25SWllKbGFPV054VldSaFJsSVBVRUhGWHdMK2NmNWNYUGtMenJkYVdGWTZYT1RjNlRPYWsmI3hBO05idVRSQ3g2dEdmZ2I1Vjc1dE1XVGlqYmlUalJZTmxyRjJLdXhWMktwaG9IbURXZkwrclFhdG8xM0paYWhiTnlpbmpOQ1BFRUhabFAmI3hBO1FxUlE5OEVvZ2lpb05Qckw4cS8rY29mTG5tQ09MVFBOclI2SnJPeXJkc2VObE9hZGViZjNMZXpuai9sZHN3TXVtSTNHNGNpT1VIbTkmI3hBO3pqa2praldTTmc4YmdNanFhZ2c3Z2dqcURtTTJ0NHE3RlhZcTdGWFlxN0ZXUGVjL1AvbFB5WnB4dnZNR29SMmlFSDBZSzhwNVNQMlkmI3hBO29oOFRmUG9PNUdUaEF5NUlNZ0h5SitjSC9PUWZtRHoyMG1sNmVyNlY1WXIvQUx4aHYzMXhUbzF3NjdVNyttdndqdnkyT1orTEFJNzkmI3hBO1hIbmt0NUxsN1c3RlhZcTdGWFlxKzFQK2NaL3l5UGxQeWQrbU5RaTRhM3I0U2VSV0h4UTJvRllJdll0WG0zekFQMmMxMm95Y1Jyb0gmI3hBO0p4eG9QWXN4MngyS3V4VjJLdXhWMkt1eFYyS3V4VjJLc0IvT2o4cnJQOHdmS1Vsa29XUFdyTGxQcEYwMjNHV254UnNmNUpRT0xlQm8mI3hBOzNiTGNPVGdQa3duR3crRDlRMCs5MDYrdUxDK2hhM3ZMV1JvYmlDUVVaSkVQRmxJOFFSbXpCdHhVUGhWMkt1eFYyS3V4Vm1Ya3I4M3YmI3hBO3pCOG1jWXRFMWFSTElHcDArZWs5c2E3bWtiMTRWN2xLSEs1NG95NWhrSmtQYWZMdi9PWlo0cW5tVHk5VnYycmpUcGFBL0tHYi9xcm0mI3hBO05MU2R4YkJtNzN2SGtIejNvM25qeTdIcitrUnp4V2NranhDTzZWVWtEUm1qVkNOSXYvRFpqVGdZbWkyeGxZWkhrR1RzVmVhL214K2UmI3hBO3ZsNzh1YnEzc0x5d3VyL1VydUg2eEJGRHdTTGh6S2ZISXhxRFZUMFE1ZGl3bWJDYzZlQitidjhBbkxUei9xeVBCb2R0YjZCYnQvdXkmI3hBO1AvU2JrRHc5V1FCUHVqQjk4eW82V0k1N3RKeWw0enFlcTZucXQ3SmZhbmR6WDE1THZKYzNFalN5TjgyY2s1a0FBY21zbEM0VmRpcnMmI3hBO1ZkaXJzVmV6Zjg0NC9rKy9uRFh4cityd0UrV3RKa0RGWEh3M1Z5dEdXSGZZb3V6U2ZRdmZiSDFHWGhGRG0yWTRXKzBNMXprdXhWMksmI3hBO3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWNGQvemtSK1JmK0xMVi9NL2wySC9uWmJWQjladFVBSDEySkJRRC9qTWkvWi9tSHcveTVrNE0mI3hBOzNEc2VUVmtoZTRmSGtrY2tjalJ5S1VrUWxYUmhRZ2pZZ2c5Q00yRGpyY1ZkaXJzVmRpcnNWZGlyN1YvNXhULzhsSGIvQVBNYmRmOEEmI3hBO0VobXUxUDF1VGk1UFljeDJ4Mkt2a2Y4QTV6SC9BT1U1MFgvdG1EL3FJbHpQMG4wbHg4M040RG1VMU94VjJLdXhWMkt1eFZubjVSZmwmI3hBO1ByUDVoK1lGdFlROXZvMXNRMnFhbFQ0WTBPL0JLN0dSK2lqNlRzTXF5NVJBZWJLRWJMN3E4djZCcFBsL1JyVFJ0SnQxdGRQc2tFY0UmI3hBO0s5aDFKSjZsbUpxeE81TytheVVpVFpjb0Nrd3dKZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZUlmbmwvd0E0OFdmbTRUZVkmI3hBO1BMS1Iybm1ZQXZjVyt5UTNwL3lqMFNYd2JvMzdYOHd5Y09maDJQSnFuanZjUGtIVTlNMURTNytmVDlSdDVMUyt0bk1keGJUS1VkR0gmI3hBO1lnNW5nM3ljY2hEWVZkaXJzVmRpcnNWZmF2OEF6aW4vQU9TanQvOEFtTnV2K0pETmRxZnJjbkZ5ZXc1anRqc1ZmSS8vQURtUC93QXAmI3hBO3pvdi9BR3pCL3dCUkV1WitrK2t1UG01dkFjeW1wMkt1eFYyS3V4VjZUK1VQNUllWXZ6QnZWdUNHc1BMa0wwdTlVWmZ0VTZ4MjRPenYmI3hBOzRub3Zmc0RUbHpDSHZad2dTKzEvS3ZsVFFmS3VpVytpNkhhcmEyRnVOa0c3T3grMUpJeDNaMjdrNXJwU01qWmNrQ2syeUtYWXE3RlgmI3hBO1lxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGV0RmbWIrVHZsRDh3TE9tcHdtMjFXSkN0cHEwQUFuajdoVzdTSlg5bHZlaEIzeTMmI3hBO0hsTU9UQ1VBWHlEK1pQNUplZC9JYzBrdDliRzkwWUg5MXE5cUMwTkNhTDZvKzFFM1RadHE5Q2N6OGVhTXZlNDhvRU1BeTFpN0ZYWXEmI3hBOzdGWDJyL3ppbi81S08zLzVqYnIvQUlrTTEycCt0eWNYSjdEbU8yT3hWOGovQVBPWS93RHluT2kvOXN3ZjlSRXVaK2sra3VQbTV2QWMmI3hBO3ltcDJLdXhWRTZicG1vNnBleFdPbTJzdDVlem5qRGJRSTBrakh3VlZCSndFZ2MxcDlJZmxUL3ppaTVhTFZ2UDU0cUtQRm9VTDduL20mI3hBO0psUS84SWgrYmRzeE11cDZSYm80dTk5TDJkbFoyVnBGWjJjRWR0YVFLSTRMZUZRa2FJb29GVlZBQUE5c3dpYmIxYkZYWXE3RlhZcTcmI3hBO0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZXcEk0NUkyamtVUEc0S3VqQ29JT3hCQjZnNHE4ZTgrZjg0djhBNWZlWkdrdTkmI3hBO0tWdkx1cFNWSmUwVU5iRnZGcllsVkgvUE5seklocVpEbnUxeXhBdkEvTi8vQURqTithUGw5bmt0YkpkZHNoOW1mVG01eVU3Y29HNHkmI3hBOzEvMVF3OTh5b2FpSjhtazR5SGw5OXA5L1lYTFd0L2JTMmx5bjI0SjBhTng4MWNBakxnYllJZkNyN1YvNXhULzhsSGIvQVBNYmRmOEEmI3hBO0VobXUxUDF1VGk1UFljeDJ4Mkt2a2Y4QTV6SC9BT1U1MFgvdG1EL3FJbHpQMG4wbHg4M040RG1VMU1tOHNmbHA1OTh6c242RDBPN3YmI3hBO0lwTmx1ZlRNZHZ2NHp5Y0loL3dXUWxrakhtVWlKTDJyeVgvemg3cVV4anVmT0dxcmFSZFcwL1Q2U1NrZURUdU9Dbi9WVnZubU5QVmQmI3hBO3diUmg3MzBINU4vTHJ5WjVOdFRCNWQwdUt6WmhTVzUzZWVUL0FGNW5MT1JYZWxhRHNNeFo1RExtMmlJSEprZVFaT3hWMkt1eFYyS3UmI3hBO3hWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VkI2cG8yajZ0Yi9BRmJWYkczMUMzLzN6ZFJKTW0vK1RJR0cmI3hBO0VFamtnaGhHcS84QU9QbjVQNmtTMDNsdUNGejBhMWttdGdQa3NMb240WllNOHgxWW5HR1RlU3ZKV2hlVGRFWFJkRFNTT3dXUjVsU1YmI3hBO3pJd2FRMWI0anZUSVRtWkd5eWpHazl5S1hZcXhIemYrVS9rTHpocWx2cWZtUFRQcjkxYXhlaEFXbW5qVUlITDdyRTZCdDJQWExJNVomI3hBO1JGQmlZQTgwUm92NVpmbDVvaksrbCtYZFB0NVUrek9MZU41UjMvdlhEUDhBamdPU1I1bFJFQmsyUVpPeFYyS3V4VjJLdXhWMkt1eFYmI3hBOzJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VjImI3hBO0t1eFYyS3V4VjJLdXhWMkt1eFYyS3V4VkxkYzh4YU5vVnZIY2FyY2ZWNFpYOU9OdUR2VnFFMHBHckhvTXF6WjRZeGNqVGs2WFI1YzUmI3hBO01jWXNqM2ZwU2IvbGFua0wvcTZmOGtMai9xbm1QL0tPRCtkOWgvVTUzOGhhditaL3NvL3JkL3l0VHlGLzFkUCtTRngvMVR4L2xIQi8mI3hBO08rdy9xWCtRdFgvTS93QmxIOWJ2K1ZxZVF2OEFxNmY4a0xqL0FLcDQvd0FvNFA1MzJIOVMvd0FoYXY4QW1mN0tQNjNmOHJVOGhmOEEmI3hBO1YwLzVJWEgvQUZUeC9sSEIvTyt3L3FYK1F0WC9BRFA5bEg5YnYrVnFlUXYrcnAveVF1UCtxZVA4bzRQNTMySDlTL3lGcS81bit5aismI3hBO3QzL0sxUElYL1YwLzVJWEgvVlBIK1VjSDg3N0QrcGY1QzFmOHovWlIvVzcvQUpXcDVDLzZ1bi9KQzQvNnA0L3lqZy9uZllmMUwvSVcmI3hBO3IvbWY3S1A2M2Y4QUsxUElYL1YwL3dDU0Z4LzFUeC9sSEIvTyt3L3FYK1F0WC9NLzJVZjF1LzVXcDVDLzZ1bi9BQ1F1UCtxZVA4bzQmI3hBO1A1MzJIOVMveUZxLzVuK3lqK3QzL0sxUElYL1YwLzVJWEgvVlBIK1VjSDg3N0QrcGY1QzFmOHovQUdVZjF1LzVXcDVDL3dDcnAveVEmI3hBO3VQOEFxbmovQUNqZy9uZllmMUwvQUNGcS93Q1ovc28vcmQveXRUeUYvd0JYVC9raGNmOEFWUEgrVWNIODc3RCtwZjVDMWY4QU0vMlUmI3hBO2YxdS81V3A1Qy82dW4vSkM0LzZwNC95amcvbmZZZjFML0lXci9tZjdLUDYzZjhyVThoZjlYVC9raGNmOVU4ZjVSd2Z6dnNQNmwva0wmI3hBO1YvelA5bEg5YnY4QWxhbmtML3E2ZjhrTGovcW5qL0tPRCtkOWgvVXY4aGF2K1ovc28vcmQvd0FyVThoZjlYVC9BSklYSC9WUEgrVWMmI3hBO0g4NzdEK3BmNUMxZjh6L1pSL1c3L2xhbmtML3E2ZjhBSkM0LzZwNC95amcvbmZZZjFML0lXci9tZjdLUDYzZjhyVThoZjlYVC9raGMmI3hBO2Y5VThmNVJ3Znp2c1A2bC9rTFYvelA4QVpSL1c3L2xhbmtML0FLdW4vSkM0L3dDcWVQOEFLT0QrZDloL1V2OEFJV3IvQUpuK3lqK3QmI3hBOzMvSzFQSVgvQUZkUCtTRngvd0JVOGY1UndmenZzUDZsL2tMVi93QXovWlIvVzcvbGFua0wvcTZmOGtMai9xbmovS09EK2Q5aC9VdjgmI3hBO2hhditaL3NvL3JkL3l0VHlGLzFkUCtTRngvMVR4L2xIQi9PK3cvcVgrUXRYL00vMlVmMXUvd0NWcWVRditycC95UXVQK3FlUDhvNFAmI3hBOzUzMkg5Uy95RnEvNW4reWordFV0L3dBelBKRnhjUlc4T3BjcHBuV09OZlF1QlZtTkFLbU1EcWNNZGZoSm9TK3cvcVl6N0YxVVFaR0cmI3hBO3c4NC9yWlBtWTZwMkt1eFYyS3V4VjJLdXhWNXgrZUgvQUJ3TEQvbUwvd0NaYlpxZTEvb0h2ZWw5bVA3Nlg5WDlJZUw1b0h0bllxN0YmI3hBO1hZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGVXc4dmY4ZC9UUCtZdUQvazR1VzRmcmo3dzQmI3hBOzJzL3VaLzFaZmMrbjg3Qjh0ZGlyc1ZkaXJzVmRpcnNWZWNmbmgveHdMRC9tTC81bHRtcDdYK2dlOTZYMlkvdnBmMWYwaDR2bWdlMmQmI3hBO2lyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVlREeTkveDM5TS81aTRQK1RpNWJoK3UmI3hBO1B2RGpheis1bi9WbDl6NmZ6c0h5MTJLdXhWMkt1eFYyS3V4VjV4K2VIL0hBc1A4QW1MLzVsdG1wN1grZ2U5NlgyWS92cGYxZjBoNHYmI3hBO21nZTJkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWZGlyc1ZkaXJzVmRpcnNWVER5OS94MzlNL3dDWXVEL2smI3hBOzR1VzRmcmo3dzQycy91Wi8xWmZjK244N0I4dGRpcnNWZGlyc1ZkaXJzVmVjZm5oL3h3TEQvbUwvQU9aYlpxZTEvb0h2ZWw5bVA3NlgmI3hBOzlYOUllTDVvSHRuWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGWFlxN0ZYWXE3RlhZcTdGVXc4dmY4QUhmMHomI3hBOy9tTGcvd0NUaTViaCt1UHZEamF6KzVuL0FGWmZjK244N0I4dGRpcnNWZGlyc1ZkaXJzVld5UlJTQUNSRmNEY0JnRCt2QVFDa1NJNUsmI3hBO2YxT3ovd0I4Ui84QUFML1RCd0R1WmVKTHZMdnFkbi92aVA4QTRCZjZZOEE3bDhTWGVYZlU3UDhBM3hIL0FNQXY5TWVBZHkrSkx2THYmI3hBO3Fkbi9BTDRqL3dDQVgrbVBBTzVmRWwzbDMxT3ovd0I4Ui84QUFML1RIZ0hjdmlTN3k3Nm5aLzc0ai80QmY2WThBN2w4U1hlWGZVN1AmI3hBOy9mRWYvQUwvQUV4NEIzTDRrdTh1K3AyZisrSS8rQVgrbVBBTzVmRWwzbDMxT3ovM3hIL3dDLzB4NEIzTDRrdTh1K3AyZisrSS93RGcmI3hBO0YvcGp3RHVYeEpkNWQ5VHMvd0RmRWY4QXdDLzB4NEIzTDRrdTh1K3AyZjhBdmlQL0FJQmY2WThBN2w4U1hlWGZVN1AvQUh4SC93QUEmI3hBO3Y5TWVBZHkrSkx2THZxZG4vdmlQL2dGL3Bqd0R1WHhKZDVkOVRzLzk4Ui84QXY4QVRIZ0hjdmlTN3k3Nm5aLzc0ai80QmY2WThBN2wmI3hBOzhTWGVYZlU3UC9mRWYvQUwvVEhnSGN2aVM3eTc2blovNzRqL0FPQVgrbVBBTzVmRWwzbDMxT3ovQU44Ui93REFML1RIZ0hjdmlTN3kmI3hBOzc2blovd0MrSS84QWdGL3Bqd0R1WHhKZDVkOVRzLzhBZkVmL0FBQy8weDRCM0w0a3U4dStwMmYrK0kvK0FYK21QQU81ZkVsM2wzMU8mI3hBO3ovM3hIL3dDL3dCTWVBZHkrSkx2TFl0TFFFRVF4Z2pjRUtQNlk4STdsOFNYZVZYSk1IWXE3RlhZcS8vWjwveG1wR0ltZzppbWFnZT4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOkFsdD4KICAgICAgICAgPC94bXA6VGh1bWJuYWlscz4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+eG1wLmlpZDo3MmU5YTkxMi0yYjViLTQ3ZDctOTc3My1jNTg5NmU3Y2I4NGQ8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6NzJlOWE5MTItMmI1Yi00N2Q3LTk3NzMtYzU4OTZlN2NiODRkPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnV1aWQ6NUQyMDg5MjQ5M0JGREIxMTkxNEE4NTkwRDMxNTA4Qzg8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOlJlbmRpdGlvbkNsYXNzPnByb29mOnBkZjwveG1wTU06UmVuZGl0aW9uQ2xhc3M+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0YW5jZUlEPnhtcC5paWQ6OGJhMGJjMTYtNzlkYy00ZDM4LWEyNmUtYmQyM2I1OTY0ZDNmPC9zdFJlZjppbnN0YW5jZUlEPgogICAgICAgICAgICA8c3RSZWY6ZG9jdW1lbnRJRD54bXAuZGlkOjhiYTBiYzE2LTc5ZGMtNGQzOC1hMjZlLWJkMjNiNTk2NGQzZjwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD51dWlkOjVEMjA4OTI0OTNCRkRCMTE5MTRBODU5MEQzMTUwOEM4PC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgICAgIDxzdFJlZjpyZW5kaXRpb25DbGFzcz5wcm9vZjpwZGY8L3N0UmVmOnJlbmRpdGlvbkNsYXNzPgogICAgICAgICA8L3htcE1NOkRlcml2ZWRGcm9tPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MTc4NTZkN2EtMWNkZC00YzllLTk0ZmItODZiMDI4ZmM3NjdmPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDI1LTEwLTIxVDE1OjMzOjM4Wjwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgSWxsdXN0cmF0b3IgMjkuNiAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NzJlOWE5MTItMmI1Yi00N2Q3LTk3NzMtYzU4OTZlN2NiODRkPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDI1LTEwLTIxVDE1OjMzOjQ0Wjwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgSWxsdXN0cmF0b3IgMjkuNiAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8aWxsdXN0cmF0b3I6U3RhcnR1cFByb2ZpbGU+UHJpbnQ8L2lsbHVzdHJhdG9yOlN0YXJ0dXBQcm9maWxlPgogICAgICAgICA8aWxsdXN0cmF0b3I6Q3JlYXRvclN1YlRvb2w+QWRvYmUgSWxsdXN0cmF0b3I8L2lsbHVzdHJhdG9yOkNyZWF0b3JTdWJUb29sPgogICAgICAgICA8aWxsdXN0cmF0b3I6SXNGaWxlU2F2ZWRWaWFJbnN0YW50U2F2ZT5GYWxzZTwvaWxsdXN0cmF0b3I6SXNGaWxlU2F2ZWRWaWFJbnN0YW50U2F2ZT4KICAgICAgICAgPHBkZjpQcm9kdWNlcj5BZG9iZSBQREYgbGlicmFyeSAxNS4wMDwvcGRmOlByb2R1Y2VyPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+/+AAEEpGSUYAAQIBASwBLAAA/+0ALFBob3Rvc2hvcCAzLjAAOEJJTQPtAAAAAAAQASwAAAABAAEBLAAAAAEAAf/bAIQAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAwMDAwMDAwMDAwEBAQEBAQECAQECAgIBAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD/90ABAA1/+4ADkFkb2JlAGTAAAAAAf/AABEIAaEBoQMAEQABEQECEQH/xAGiAAEBAQACAgIDAAAAAAAAAAALAAoICQYHAQIDBAUBAQEBAAEFAQEBAAAAAAAAAAAHCAkDBAUGCgIBCxAAAQIFAQIE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\"","/**\n * Password Recovery Modal for @ollaid/native-sso\n * Flow: email → method-choice → OTP → new password → success\n * Design aligned with web SSO\n * \n * @version 2.7.9\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n  Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter,\n  Button, Input, Label, RadioGroup, RadioGroupItem,\n  IconLock, IconCheckCircle2, IconArrowLeft, IconKeyRound, IconLoader2,\n  BrandLinkRow,\n} from './ui';\nimport OTPInput from './OTPInput';\nimport { useMobilePassword } from '../hooks/useMobilePassword';\nimport packageFavicon from '../logo/favicon.png';\n\nexport interface PasswordRecoveryModalProps {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  onSuccess: () => void;\n  saasApiUrl: string;\n  iamApiUrl: string;\n  \n}\n\ntype RecoveryStep = 'email' | 'method-choice' | 'otp' | 'password' | 'success';\n\nconst C = {\n  primary: '#002147',\n  green: '#16a34a',\n  greenBg: '#dcfce7',\n  gray100: '#f3f4f6',\n  gray200: '#e5e7eb',\n  gray500: '#6b7280',\n  gray700: '#374151',\n  gray900: '#111827',\n  red: '#dc2626',\n  redBg: '#fef2f2',\n  white: '#ffffff',\n} as const;\n\nconst iconCircle = (bg: string, size = '3rem'): React.CSSProperties => ({\n  margin: '0 auto', width: size, height: size, backgroundColor: bg, borderRadius: '50%',\n  display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n  position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n  cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nexport function PasswordRecoveryModal({ open, onOpenChange, onSuccess, saasApiUrl, iamApiUrl }: PasswordRecoveryModalProps) {\n  const {\n    status, loading: pwLoading, error: pwError, receiveMode, maskedEmail, maskedPhone,\n    initRecovery, selectMethod, verifyOtp, resetPassword, resendOtp, reset: resetHook, clearError,\n  } = useMobilePassword({ saasApiUrl, iamApiUrl });\n\n  const [step, setStep] = useState<RecoveryStep>('email');\n  const [email, setEmail] = useState('');\n  const [otp, setOtp] = useState('');\n  const [password, setPassword] = useState('');\n  const [confirmPassword, setConfirmPassword] = useState('');\n  const [localError, setLocalError] = useState<string | null>(null);\n  const [selectedMethod, setSelectedMethod] = useState<'email' | 'phone'>('email');\n  const [resendCooldown, setResendCooldown] = useState(0);\n\n  const error = localError || pwError;\n\n  useEffect(() => {\n    if (status === 'choice_required') setStep('method-choice');\n    else if (status === 'pending_otp') { setStep('otp'); setResendCooldown(60); }\n    else if (status === 'pending_password') setStep('password');\n    else if (status === 'completed') setStep('success');\n  }, [status]);\n\n  useEffect(() => {\n    if (resendCooldown > 0) {\n      const timer = setTimeout(() => setResendCooldown(resendCooldown - 1), 1000);\n      return () => clearTimeout(timer);\n    }\n  }, [resendCooldown]);\n\n  const resetState = () => {\n    setStep('email'); setEmail(''); setOtp(''); setPassword(''); setConfirmPassword('');\n    setLocalError(null); setSelectedMethod('email'); setResendCooldown(0); resetHook();\n  };\n\n  const handleClose = () => { resetState(); onOpenChange(false); };\n  const handleBackToLogin = () => { resetState(); onSuccess(); };\n\n  const handleEmailSubmit = async () => {\n    setLocalError(null); clearError();\n    if (!email.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n    if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim())) { setLocalError('Veuillez entrer une adresse email valide'); return; }\n    await initRecovery(email.trim());\n  };\n\n  const handleMethodSubmit = async () => {\n    setLocalError(null); clearError();\n    await selectMethod(selectedMethod);\n  };\n\n  const handleOTPSubmit = () => {\n    if (otp.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n    setLocalError(null); clearError();\n    const isValid = verifyOtp(otp);\n    if (!isValid) setLocalError('Code incorrect');\n  };\n\n  const handleResendOTP = async () => {\n    if (resendCooldown > 0) return;\n    const result = await resendOtp();\n    if (result.success) { setResendCooldown(result.cooldown || 60); setOtp(''); setLocalError(null); }\n  };\n\n  const handlePasswordSubmit = async () => {\n    if (password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n    if (password !== confirmPassword) { setLocalError('Les mots de passe ne correspondent pas'); return; }\n    setLocalError(null); clearError();\n    await resetPassword(password);\n  };\n\n  const goBack = () => {\n    setLocalError(null); clearError();\n    if (step === 'method-choice') { setStep('email'); resetHook(); }\n    else if (step === 'otp') { setStep(maskedPhone ? 'method-choice' : 'email'); resetHook(); }\n    else if (step === 'password') setStep('otp');\n  };\n\n  // ===== SUCCESS =====\n  if (step === 'success') {\n    return (\n      <Dialog open={open} onOpenChange={handleClose}>\n        <DialogContent>\n          <DialogHeader style={{ textAlign: 'center' }}>\n            <div style={{ ...iconCircle(C.greenBg), width: '5rem', height: '5rem' }}>\n              <IconCheckCircle2 style={{ width: '3rem', height: '3rem', color: C.green }} />\n            </div>\n            <DialogTitle>Mot de passe modifié !</DialogTitle>\n            <DialogDescription>Votre mot de passe a été changé avec succès.</DialogDescription>\n          </DialogHeader>\n          <DialogFooter style={{ borderTop: 'none' }}>\n            <Button onClick={handleBackToLogin} style={{ width: '100%' }}>Retour à la connexion</Button>\n          </DialogFooter>\n        </DialogContent>\n      </Dialog>\n    );\n  }\n\n  return (\n    <Dialog open={open} onOpenChange={handleClose}>\n      <DialogContent>\n        {step !== 'email' && (\n          <button onClick={goBack} style={backBtnStyle} type=\"button\">\n            <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n          </button>\n        )}\n\n        <DialogHeader style={{ textAlign: 'center' }}>\n          <BrandLinkRow\n            icon={step === 'otp' ? <IconKeyRound style={{ width: '1.25rem', height: '1.25rem', color: C.primary }} /> : <IconLock style={{ width: '1.25rem', height: '1.25rem', color: C.primary }} />}\n            faviconSrc={packageFavicon}\n            faviconAlt=\"Ollaid SSO\"\n            iconBg={C.primary + '1a'}\n            iconColor={C.primary}\n          />\n          <DialogTitle>\n            {step === 'email' && 'Récupération de mot de passe'}\n            {step === 'method-choice' && 'Recevoir le code de vérification'}\n            {step === 'otp' && 'Vérification'}\n            {step === 'password' && 'Nouveau mot de passe'}\n          </DialogTitle>\n          <DialogDescription>\n            {step === 'email' && 'Veuillez entrer votre adresse email'}\n            {step === 'method-choice' && 'Comment souhaitez-vous recevoir le code ?'}\n            {step === 'otp' && (receiveMode === 'phone' ? `Code envoyé par SMS au ${maskedPhone}` : `Code envoyé par email à ${maskedEmail}`)}\n            {step === 'password' && 'Définissez votre nouveau mot de passe'}\n          </DialogDescription>\n        </DialogHeader>\n\n        <DialogBody>\n          <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n            {error && <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg, color: C.red, fontSize: '0.875rem' }}>{error}</div>}\n\n            {step === 'email' && (\n              <div><Label htmlFor=\"recovery-email\">Adresse email</Label><Input id=\"recovery-email\" type=\"email\" placeholder=\"vous@exemple.com\" value={email} onChange={e => setEmail(e.target.value)} disabled={pwLoading} /></div>\n            )}\n\n            {step === 'method-choice' && (\n              <RadioGroup value={selectedMethod} onValueChange={v => setSelectedMethod(v as 'email' | 'phone')}>\n                <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n                  <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', padding: '1rem', borderRadius: '0.5rem', border: `2px solid ${selectedMethod === 'email' ? C.primary : C.gray200}`, cursor: 'pointer' }} onClick={() => setSelectedMethod('email')}>\n                    <RadioGroupItem value=\"email\" id=\"method-email\" />\n                    <div><div style={{ fontWeight: 500 }}>Par email</div><div style={{ fontSize: '0.75rem', color: C.gray500 }}>{maskedEmail}</div></div>\n                  </div>\n                  <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', padding: '1rem', borderRadius: '0.5rem', border: `2px solid ${selectedMethod === 'phone' ? C.primary : C.gray200}`, cursor: 'pointer' }} onClick={() => setSelectedMethod('phone')}>\n                    <RadioGroupItem value=\"phone\" id=\"method-phone\" />\n                    <div><div style={{ fontWeight: 500 }}>Par SMS</div><div style={{ fontSize: '0.75rem', color: C.gray500 }}>{maskedPhone}</div></div>\n                  </div>\n                </div>\n              </RadioGroup>\n            )}\n\n            {step === 'otp' && (\n              <>\n                <OTPInput value={otp} onChange={setOtp} disabled={pwLoading} />\n                <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n                  {resendCooldown > 0 ? <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span> : (\n                    <button type=\"button\" style={{ color: C.primary, background: 'none', border: 'none', cursor: 'pointer', textDecoration: 'underline' }} onClick={handleResendOTP}>Code non reçu ? Renvoyer</button>\n                  )}\n                </div>\n              </>\n            )}\n\n            {step === 'password' && (\n              <>\n                <div><Label>Nouveau mot de passe</Label><Input type=\"password\" placeholder=\"Minimum 8 caractères\" value={password} onChange={e => setPassword(e.target.value)} disabled={pwLoading} /></div>\n                <div><Label>Confirmer le mot de passe</Label><Input type=\"password\" placeholder=\"Retapez votre mot de passe\" value={confirmPassword} onChange={e => setConfirmPassword(e.target.value)} disabled={pwLoading} /></div>\n              </>\n            )}\n          </div>\n        </DialogBody>\n\n        <DialogFooter>\n          {step === 'email' && (\n            <>\n              <Button onClick={handleEmailSubmit} disabled={pwLoading} style={{ width: '100%' }}>\n                {pwLoading ? (\n                  <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n                    <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n                  </span>\n                ) : 'Continuer'}\n              </Button>\n              <Button variant=\"ghost\" onClick={handleBackToLogin} style={{ width: '100%' }}>Retour à la connexion</Button>\n            </>\n          )}\n          {step === 'method-choice' && (\n            <Button onClick={handleMethodSubmit} disabled={pwLoading} style={{ width: '100%' }}>\n              {pwLoading ? (\n                <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n                  <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Envoi...\n                </span>\n              ) : 'Envoyer le code'}\n            </Button>\n          )}\n          {step === 'otp' && (\n            <Button onClick={handleOTPSubmit} disabled={otp.length !== 6} style={{ width: '100%' }}>Vérifier</Button>\n          )}\n          {step === 'password' && (\n            <Button onClick={handlePasswordSubmit} disabled={pwLoading || !password || !confirmPassword} style={{ width: '100%' }}>\n              {pwLoading ? (\n                <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n                  <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Modification...\n                </span>\n              ) : 'Modifier le mot de passe'}\n            </Button>\n          )}\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n}\n\nexport default PasswordRecoveryModal;\n","/**\n * Hook de vérification périodique du token Sanctum (Auth Check)\n * \n * Le package consulte l'endpoint POST /api/sso/check-token du SaaS\n * pour vérifier si l'utilisateur est toujours connecté.\n * \n * - Premier check 60s après login\n * - Checks suivants toutes les 2 min\n * - Si status === 'connected' → met à jour user_infos via le storage du package\n * - Si 401 → révoque l'IAM (POST /sso/disconnect) + nettoie le frontend\n * - Ne déconnecte PAS si offline ou serveur inaccessible\n * \n * @version 2.7.9\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { getHeaders, getAuthToken, getNativeStorage, STORAGE_KEYS, ensureDeviceContext } from '../services/api';\nimport type { UserInfos } from '../types/native';\n\nconst FIRST_CHECK_DELAY = 60 * 1000;       // 60 secondes\nconst INTERVAL_DELAY = 2 * 60 * 1000;      // 2 minutes\n\nexport interface UseTokenHealthCheckOptions {\n  /** Whether to enable health checks (true when authenticated) */\n  enabled: boolean;\n  /** SaaS API base URL */\n  saasApiUrl: string;\n  /** IAM API base URL (for revocation on 401) */\n  iamApiUrl: string;\n  /** Called when the backend explicitly invalidates the token (401) */\n  onTokenInvalid: () => void;\n  /**\n   * Optional handler for 401. If provided, it can attempt a refresh and decide\n   * whether the session was recovered.\n   *\n   * Return values:\n   * - 'recovered': session is valid again (do NOT call onTokenInvalid)\n   * - 'invalid': token is explicitly invalid (call onTokenInvalid)\n   * - 'noop': fall back to default behavior\n   */\n  onUnauthorized?: () => Promise<'recovered' | 'invalid' | 'noop'>;\n  /** Called when fresh user_infos are received */\n  onUserUpdated?: (userInfos: UserInfos) => void;\n  /** Debug mode */\n  debug?: boolean;\n}\n\n/**\n * Appelle POST /api/sso/check-token sur le SaaS.\n * \n * Le SaaS doit retourner :\n * - 200 { status: 'connected', user: { ...user_infos } }  → token valide\n * - 401 { status: 'disconnected', message: '...' }        → token invalide\n */\nasync function checkTokenValidity(\n  saasApiUrl: string,\n  token: string,\n  debug: boolean\n): Promise<{ valid: boolean; user?: UserInfos }> {\n  // 1. Check connectivity first\n  if (typeof navigator !== 'undefined' && !navigator.onLine) {\n    if (debug) console.log('🔄 [HealthCheck] Offline — skip');\n    throw new Error('offline');\n  }\n\n  await ensureDeviceContext();\n\n  const controller = new AbortController();\n  const timeoutId = setTimeout(() => controller.abort(), 10000); // 10s timeout\n\n  try {\n    const response = await fetch(`${saasApiUrl}/sso/check-token`, {\n      method: 'POST',\n      headers: getHeaders(token, true),\n      signal: controller.signal,\n    });\n\n    clearTimeout(timeoutId);\n\n    // 401 = seul signal explicite de déconnexion (Sanctum ou backend)\n    if (response.status === 401) {\n      if (debug) console.log('🔄 [HealthCheck] Token invalide (401) — déconnexion');\n      return { valid: false };\n    }\n\n    // Tout autre code non-OK = problème serveur, PAS un problème de token → session conservée\n    if (!response.ok) {\n      if (debug) console.log(`🔄 [HealthCheck] Erreur serveur ${response.status} — session conservée`);\n      throw new Error(`server_error_${response.status}`);\n    }\n\n    const data = await response.json();\n\n    // Format standard : { status: 'connected', user: {...} }\n    if (data.status === 'connected' && data.user) {\n      if (debug) console.log('🔄 [HealthCheck] Token valide ✅ — user_infos mis à jour');\n      return { valid: true, user: data.user };\n    }\n\n    // HTTP 200 = Sanctum a confirmé l'authentification, token valide\n    // On ne déconnecte JAMAIS sur un body ambigu : seul le 401 fait foi\n    if (debug) console.log('🔄 [HealthCheck] Token valide ✅');\n    return { valid: true, user: data.user };\n  } catch (error) {\n    clearTimeout(timeoutId);\n\n    if (error instanceof Error && error.message === 'offline') {\n      throw error;\n    }\n\n    // Network errors, timeouts, server unreachable → do NOT invalidate\n    if (debug) {\n      const msg = error instanceof Error ? error.message : 'unknown';\n      console.log(`🔄 [HealthCheck] Erreur réseau/serveur (${msg}) — session conservée`);\n    }\n    throw error;\n  }\n}\n\n/**\n * Révoque la session sur l'IAM (fire-and-forget).\n * Appelé quand le SaaS retourne 401 pour s'assurer que le token de session\n * IAM est aussi révoqué côté IAM.\n */\nfunction revokeOnIam(iamApiUrl: string, debug: boolean): void {\n  try {\n    const controller = new AbortController();\n    setTimeout(() => controller.abort(), 5000); // 5s timeout\n\n    const iamToken = getAuthToken();\n    if (!iamToken) return;\n\n    const payload: Record<string, string> = { iam_token: iamToken };\n\n    if (debug) {\n      console.log('🔄 [HealthCheck] Revocation IAM:', { hasRef: true });\n    }\n\n    fetch(`${iamApiUrl}/sso/disconnect`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json',\n      },\n      body: JSON.stringify(payload),\n      signal: controller.signal,\n    }).catch(() => {\n          if (debug) console.log('🔄 [HealthCheck] Échec revocation IAM (non-bloquant)');\n        });\n  } catch {\n    // Fire-and-forget — never block\n  }\n}\n\nexport function useTokenHealthCheck(options: UseTokenHealthCheckOptions): void {\n  const { enabled, saasApiUrl, iamApiUrl, onTokenInvalid, onUnauthorized, onUserUpdated, debug = false } = options;\n\n  const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n  const enabledRef = useRef(enabled);\n  const callbacksRef = useRef({ onTokenInvalid, onUserUpdated });\n\n  // Keep refs up to date\n  enabledRef.current = enabled;\n  callbacksRef.current = { onTokenInvalid, onUserUpdated };\n\n  const performCheck = useCallback(async () => {\n    if (!enabledRef.current) return;\n\n    const storage = getNativeStorage();\n    const token = storage.getItem(STORAGE_KEYS.AUTH_TOKEN) || storage.getItem(STORAGE_KEYS.TOKEN);\n\n    if (!token) {\n      if (debug) console.log('🔄 [HealthCheck] Pas de token — arrêt');\n      return;\n    }\n\n    try {\n      const result = await checkTokenValidity(saasApiUrl, token, debug);\n\n      if (!result.valid) {\n        // Token explicitly rejected by SaaS (401)\n        // Optional recovery path: try refresh before invalidating locally.\n        if (onUnauthorized) {\n          try {\n            const decision = await onUnauthorized();\n            if (decision === 'recovered') {\n              if (debug) console.log('🔄 [HealthCheck] Session récupérée via refresh ✅');\n              return;\n            }\n            if (decision === 'noop') {\n              // fall through\n            } else if (decision === 'invalid') {\n              // proceed to invalidation below\n            }\n          } catch {\n            // ignore, proceed to invalidation below\n          }\n        }\n\n        // 1. Revoke on IAM (fire-and-forget)\n        if (iamApiUrl) {\n          if (debug) console.log('🔄 [HealthCheck] Revocation IAM avec iam_token...');\n          revokeOnIam(iamApiUrl, debug);\n        }\n\n        // 2. Clear frontend session\n        callbacksRef.current.onTokenInvalid();\n        return;\n      }\n\n      // Token valid — update user_infos if provided\n      if (result.user && callbacksRef.current.onUserUpdated) {\n        callbacksRef.current.onUserUpdated(result.user);\n      }\n    } catch {\n      // Network/timeout/server error → silently keep session\n    }\n  }, [saasApiUrl, iamApiUrl, debug, onUnauthorized]);\n\n  useEffect(() => {\n    // Cleanup previous timers\n    if (timerRef.current) {\n      clearTimeout(timerRef.current);\n      timerRef.current = null;\n    }\n    if (intervalRef.current) {\n      clearInterval(intervalRef.current);\n      intervalRef.current = null;\n    }\n\n    if (!enabled || !saasApiUrl) return;\n\n    if (debug) console.log('🔄 [HealthCheck] Activé — premier check dans 60s, puis toutes les 2 min');\n\n    // First check after 60 seconds\n    timerRef.current = setTimeout(() => {\n      performCheck();\n\n      // Then every 2 minutes\n      intervalRef.current = setInterval(performCheck, INTERVAL_DELAY);\n    }, FIRST_CHECK_DELAY);\n\n    return () => {\n      if (timerRef.current) clearTimeout(timerRef.current);\n      if (intervalRef.current) clearInterval(intervalRef.current);\n    };\n  }, [enabled, saasApiUrl, performCheck, debug]);\n}\n\nexport default useTokenHealthCheck;\n","/**\n * Hook d'authentification Native SSO v1.0\n * Architecture Frontend-First avec appels directs à l'IAM\n * \n * @version 2.7.9\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { getNativeStorage, setNativeAuthConfig, setNativeStorage, STORAGE_KEYS, isDebugMode, repairNativeSsoStorage, getSsoSessionSnapshot, getNativeAuthConfig, type NativeStorageAdapter } from '../services/api';\nimport { useTokenHealthCheck } from './useTokenHealthCheck';\nimport type {\n  NativeAuthState,\n  NativeAuthStatus,\n  NativeExchangeResponse,\n  AccountType,\n  NativeUser,\n  UserInfos,\n} from '../types/native';\n\nconst FORCE_NEEDS_ACCESS_MODAL = true;\n\nfunction normalizeNativeUser(user: NativeUser | UserInfos | null | undefined): NativeUser | null {\n  if (!user) return null;\n  const input = user as Partial<NativeUser> & Partial<UserInfos>;\n\n  return {\n    reference: input.reference ?? input.alias_reference ?? '',\n    name: input.name ?? '',\n    email: input.email ?? undefined,\n    phone: input.phone,\n    ccphone: input.ccphone,\n    image_url: input.image_url ?? input.image,\n    town: input.town,\n    country: input.country,\n    address: input.address,\n    auth_2fa: input.auth_2fa,\n    alias_reference: input.alias_reference,\n  };\n}\n\n/** Helper: persist session via the package storage adapter (unified keys) */\nfunction saveSession(exchangeResult: NativeExchangeResponse, accountType: AccountType | 'user' | 'client') {\n  const storage = getNativeStorage();\n  const sanctumToken = exchangeResult.iam_token;\n  storage.setItem(STORAGE_KEYS.AUTH_TOKEN, sanctumToken);\n  if (exchangeResult.expires_at) {\n    storage.setItem(STORAGE_KEYS.TOKEN_EXPIRES_AT, exchangeResult.expires_at);\n  }\n  if (exchangeResult.refresh_expires_at) {\n    storage.setItem(STORAGE_KEYS.REFRESH_EXPIRES_AT, exchangeResult.refresh_expires_at);\n  }\n\n  const aliasRef = exchangeResult.alias_reference || '';\n  const userToStore = {\n    ...exchangeResult.user_infos,\n    reference: exchangeResult.reference,\n    alias_reference: aliasRef,\n  };\n  \n  // Store alias_reference separately for quick access\n  if (aliasRef) {\n    storage.setItem(STORAGE_KEYS.ALIAS_REFERENCE, aliasRef);\n  }\n  \n  storage.setItem(STORAGE_KEYS.USER, JSON.stringify(userToStore));\n  storage.setItem(STORAGE_KEYS.REGISTRATION_MODE, typeof accountType === 'string' ? accountType : 'user');\n  \n  return { token: sanctumToken, user: userToStore };\n}\n\n/** Helper: clear session via the package storage adapter */\nfunction clearSession() {\n  const storage = getNativeStorage();\n  storage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n  storage.removeItem(STORAGE_KEYS.TOKEN);\n  storage.removeItem(STORAGE_KEYS.USER);\n  storage.removeItem(STORAGE_KEYS.REGISTRATION_MODE);\n  storage.removeItem(STORAGE_KEYS.ALIAS_REFERENCE);\n  storage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);\n  storage.removeItem(STORAGE_KEYS.TOKEN_EXPIRES_AT);\n  storage.removeItem(STORAGE_KEYS.REFRESH_EXPIRES_AT);\n}\n\nfunction getErrorMessage(err: unknown, context: string): { message: string; type: string } {\n  if (err instanceof Error) {\n    if (err.message.includes('fetch') || err.message.includes('network')) {\n      return { message: 'Vérifiez votre connexion Internet', type: 'network' };\n    }\n    if (err.message.includes('timeout')) {\n      return { message: 'Le serveur met trop de temps à répondre', type: 'timeout' };\n    }\n    return { message: err.message, type: 'unknown' };\n  }\n  return { message: `Erreur lors de ${context}`, type: 'unknown' };\n}\n\nexport interface UseNativeAuthOptions {\n  /** URL du Backend SaaS */\n  saasApiUrl: string;\n  /** URL du Backend IAM */\n  iamApiUrl: string;\n  /** Charger les credentials automatiquement au montage */\n  autoLoadCredentials?: boolean;\n  /** Type de compte par défaut à persister (défaut: 'user') */\n  defaultAccountType?: 'user' | 'client';\n  /** Préfixe local utilisé pour sélectionner les credentials côté SaaS */\n  configPrefix?: string;\n  /** Stockage injecté pour les apps natives / Capacitor */\n  storage?: NativeStorageAdapter;\n}\n\nexport function useNativeAuth(options: UseNativeAuthOptions) {\n  const { saasApiUrl, iamApiUrl, autoLoadCredentials = true, defaultAccountType = 'user', configPrefix = 'iam', storage } = options;\n\n  if (storage) {\n    setNativeStorage(storage);\n  }\n  \n  const configuredRef = useRef(false);\n\n  useEffect(() => {\n    const repairResult = repairNativeSsoStorage();\n    if (repairResult.cleaned && isDebugMode()) {\n      console.warn('🔧 [useNativeAuth] Storage SSO réparé', repairResult.reason);\n    }\n  }, []);\n  \n  // Debug réactif : mis à jour après loadCredentials\n  const [isDebug, setIsDebug] = useState(isDebugMode());\n  \n  useEffect(() => {\n    if (!configuredRef.current) {\n      setNativeAuthConfig({ saasApiUrl, iamApiUrl, configPrefix, storage });\n      configuredRef.current = true;\n    }\n  }, [saasApiUrl, iamApiUrl, configPrefix, storage]);\n\n  const [state, setState] = useState<NativeAuthState & { otpMethod?: string | null; otpSentTo?: string | null }>({\n    credentialsLoaded: false,\n    processToken: null,\n    status: null,\n    user: null,\n    application: null,\n    prompt: null,\n    alternativeMethod: null,\n    conflict: null,\n    loading: false,\n    error: null,\n    errorType: null,\n    otpMethod: null,\n    otpSentTo: null,\n  });\n\n  const [accountType, setAccountType] = useState<AccountType>('email');\n\n  // --- Token Health Check ---\n  const handleTokenInvalid = useCallback(() => {\n    if (isDebug) console.log('🔐 [HealthCheck] Token invalide — déconnexion locale');\n    clearSession();\n    setState({\n      credentialsLoaded: false,\n      processToken: null,\n      status: null,\n      user: null,\n      application: null,\n      prompt: null,\n      alternativeMethod: null,\n      conflict: null,\n      loading: false,\n      error: null,\n      errorType: null,\n      otpMethod: null,\n      otpSentTo: null,\n    });\n  }, [isDebug]);\n\n  const handleUserUpdated = useCallback((userInfos: UserInfos) => {\n    // Merge fresh user_infos into stored user\n    const storedRaw = getNativeStorage().getItem(STORAGE_KEYS.USER);\n    if (storedRaw) {\n      try {\n        const stored = JSON.parse(storedRaw);\n        const merged = normalizeNativeUser({ ...stored, ...userInfos });\n        if (!merged) return;\n        getNativeStorage().setItem(STORAGE_KEYS.USER, JSON.stringify(merged));\n        setState(prev => ({ ...prev, user: merged }));\n      } catch { /* ignore */ }\n    }\n  }, []);\n\n  const refreshingRef = useRef(false);\n  const tryRefreshSession = useCallback(async (): Promise<'recovered' | 'invalid' | 'noop'> => {\n    // Avoid parallel refreshes\n    if (refreshingRef.current) return 'noop';\n    refreshingRef.current = true;\n    try {\n      const refreshToken = getNativeStorage().getItem(STORAGE_KEYS.REFRESH_TOKEN);\n      if (!refreshToken) {\n        if (isDebug) console.log('🔐 [Refresh] Pas de refresh_token — impossible de recuperer');\n        return 'noop';\n      }\n\n      // Offline: never logout and don't attempt refresh\n      if (typeof navigator !== 'undefined' && !navigator.onLine) {\n        if (isDebug) console.log('🔐 [Refresh] Offline — skip');\n        return 'noop';\n      }\n\n      const res = await nativeAuthService.refresh();\n      if (res.success) {\n        // Update in-memory state from the session snapshot\n        const snapshot = getSsoSessionSnapshot<UserInfos>();\n        const user = normalizeNativeUser(snapshot.user);\n        if (user) {\n          setState(prev => ({ ...prev, user, status: 'completed' }));\n        }\n        return 'recovered';\n      }\n\n      // If backend explicitly rejects refresh, treat as invalid session\n      if (res.success === false && res.error_type === 'invalid_refresh') {\n        if (isDebug) console.log('🔐 [Refresh] invalid_refresh — deconnexion autorisee');\n        return 'invalid';\n      }\n\n      return 'noop';\n    } catch (err) {\n      // Network/timeout/5xx => keep session\n      if (isDebug) console.log('🔐 [Refresh] Echec refresh (non-bloquant)');\n      return 'noop';\n    } finally {\n      refreshingRef.current = false;\n    }\n  }, [isDebug]);\n\n  useTokenHealthCheck({\n    enabled: state.status === 'completed' && state.user !== null,\n    saasApiUrl,\n    iamApiUrl,\n    onTokenInvalid: handleTokenInvalid,\n    onUnauthorized: tryRefreshSession,\n    onUserUpdated: handleUserUpdated,\n    debug: isDebug,\n  });\n\n  // Proactive refresh based on expires_at (best-effort)\n  useEffect(() => {\n    if (state.status !== 'completed' || !state.user) return;\n\n    const expiresAt = getNativeStorage().getItem(STORAGE_KEYS.TOKEN_EXPIRES_AT);\n    if (!expiresAt) return;\n\n    const ts = Date.parse(expiresAt);\n    if (Number.isNaN(ts)) return;\n\n    // Refresh 5 minutes before expiry (server time skew tolerant)\n    const marginMs = 5 * 60 * 1000;\n    const delay = Math.max(ts - Date.now() - marginMs, 30 * 1000); // at least 30s\n\n    const t = setTimeout(() => {\n      tryRefreshSession();\n    }, delay);\n\n    return () => clearTimeout(t);\n  }, [state.status, state.user, tryRefreshSession]);\n\n  // Check existing session\n  useEffect(() => {\n    const snapshot = getSsoSessionSnapshot<UserInfos>();\n    const user = normalizeNativeUser(snapshot.user);\n    if (snapshot.authToken && user) {\n      setState(prev => ({ ...prev, user, status: 'completed' }));\n    }\n  }, []);\n\n  // Background auto-refresh of credentials before TTL expiration\n  useEffect(() => {\n    // Only refresh while user is NOT authenticated and credentials are loaded\n    if (state.status === 'completed' || !state.credentialsLoaded) return;\n\n    const ttl = nativeAuthService.getCredentialsTtl();\n    const refreshInterval = Math.max((ttl - 30) * 1000, 30000); // At least 30s\n\n    if (isDebug) {\n      console.log(`🔄 [Native] Auto-refresh credentials every ${refreshInterval / 1000}s (TTL: ${ttl}s)`);\n    }\n\n    const timer = setInterval(async () => {\n      try {\n        await nativeAuthService.loadCredentials();\n        // Re-check debug après refresh (le backend peut changer la valeur)\n        setIsDebug(isDebugMode());\n        if (isDebugMode()) console.log('✅ [Native] Credentials auto-refreshed');\n      } catch (err) {\n        if (isDebugMode()) console.warn('⚠️ [Native] Auto-refresh failed:', err);\n      }\n    }, refreshInterval);\n\n    return () => clearInterval(timer);\n  }, [state.status, state.credentialsLoaded, isDebug]);\n\n  const loadCredentials = useCallback(async () => {\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      await nativeAuthService.loadCredentials();\n      // Mettre à jour le debug réactif après chargement des credentials\n      setIsDebug(isDebugMode());\n      setState(prev => ({ ...prev, credentialsLoaded: true, loading: false }));\n      return { success: true };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'le chargement');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, []);\n\n  // Auto-load credentials\n  useEffect(() => {\n    if (autoLoadCredentials && !state.credentialsLoaded && !state.user) {\n      loadCredentials();\n    }\n  }, [autoLoadCredentials, state.credentialsLoaded, state.user, loadCredentials]);\n\n  const loginWithEmail = useCallback(async (email: string) => {\n    setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n    try {\n      if (!nativeAuthService.hasCredentials()) {\n        await nativeAuthService.loadCredentials();\n      }\n      const response = await nativeAuthService.loginEmail(email);\n\n      // Garde: ancien backend peut retourner needs_access directement depuis init\n      if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n        const bypassResult = FORCE_NEEDS_ACCESS_MODAL ? null : await autoResolveNeedsAccess(response);\n        if (bypassResult) {\n          return { success: true, status: 'completed', callback_token: bypassResult.callback_token };\n        }\n\n        setState(prev => ({\n          ...prev,\n          processToken: response.process_token || null,\n          status: 'needs_access' as NativeAuthStatus,\n          application: response.application || null,\n          prompt: response.prompt || null,\n          otpMethod: response.otp_method || prev.otpMethod,\n          otpSentTo: response.otp_sent_to || prev.otpSentTo,\n          user: response.user ? {\n            reference: `USR-${response.user.id}`,\n            name: response.user.name,\n            email: response.user.email,\n          } : null,\n          loading: false,\n        }));\n        return { success: true, status: 'needs_access' };\n      }\n\n      if (response.success && response.process_token) {\n        setState(prev => ({\n          ...prev,\n          processToken: response.process_token!,\n          status: response.status as NativeAuthStatus,\n          application: response.application || null,\n          prompt: response.prompt || null,\n          otpMethod: response.otp_method || prev.otpMethod,\n          otpSentTo: response.otp_sent_to || prev.otpSentTo,\n          user: response.user ? {\n            reference: `USR-${response.user.id}`,\n            name: response.user.name,\n            email: response.user.email,\n          } : null,\n          loading: false,\n        }));\n        return { success: true, status: response.status };\n      }\n\n      if (response.error_type === 'alias_disabled' && response.alternative_method) {\n        setState(prev => ({\n          ...prev,\n          alternativeMethod: {\n            type: response.alternative_method!,\n            value: response.alternative_method === 'email' \n              ? response.alternative_email! \n              : response.alternative_phone!,\n          },\n          loading: false,\n          error: 'Cette méthode de connexion est désactivée',\n          errorType: 'alias_disabled',\n        }));\n        return { success: false, error_type: 'alias_disabled' };\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Erreur d\\'authentification',\n        errorType: response.error_type || 'unknown',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'l\\'authentification');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, []);\n\n  const loginWithPhone = useCallback(async (ccphone: string, phone: string) => {\n    setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n    try {\n      if (!nativeAuthService.hasCredentials()) {\n        await nativeAuthService.loadCredentials();\n      }\n      const response = await nativeAuthService.loginPhone(ccphone, phone);\n\n      // Garde: ancien backend peut retourner needs_access directement depuis init\n      if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n        const bypassResult = FORCE_NEEDS_ACCESS_MODAL ? null : await autoResolveNeedsAccess(response);\n        if (bypassResult) {\n          return { success: true, status: 'completed', callback_token: bypassResult.callback_token };\n        }\n\n        setState(prev => ({\n          ...prev,\n          processToken: response.process_token || null,\n          status: 'needs_access' as NativeAuthStatus,\n          application: response.application || null,\n          otpMethod: response.otp_method || prev.otpMethod,\n          otpSentTo: response.otp_sent_to || prev.otpSentTo,\n          user: response.user ? {\n            reference: `USR-${response.user.id}`,\n            name: response.user.name,\n            email: response.user.email,\n          } : null,\n          loading: false,\n        }));\n        return { success: true, status: 'needs_access' };\n      }\n\n      if (response.success && response.process_token) {\n        setState(prev => ({\n          ...prev,\n          processToken: response.process_token!,\n          status: response.status as NativeAuthStatus,\n          application: response.application || null,\n          otpMethod: response.otp_method || prev.otpMethod,\n          otpSentTo: response.otp_sent_to || prev.otpSentTo,\n          loading: false,\n        }));\n        return { success: true, status: response.status };\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Erreur d\\'authentification',\n        errorType: response.error_type || 'unknown',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'l\\'authentification');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, []);\n\n  const loginWithAccessOtp = useCallback(async (otpCode: string) => {\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      if (!nativeAuthService.hasCredentials()) {\n        await nativeAuthService.loadCredentials();\n      }\n      const response = await nativeAuthService.loginAccessOtp(otpCode);\n\n      // v4.5: Handle needs_access (user needs to confirm access)\n      // Tolère success:true ou success:false avec needs_access\n      if ((response.needs_access || response.status === 'needs_access') && response.process_token) {\n        const bypassResult = FORCE_NEEDS_ACCESS_MODAL ? null : await autoResolveNeedsAccess(response);\n        if (bypassResult) {\n          return { success: true, status: 'completed', callback_token: bypassResult.callback_token };\n        }\n\n        setState(prev => ({\n          ...prev,\n          processToken: response.process_token!,\n          status: 'needs_access' as NativeAuthStatus,\n          application: response.application || null,\n          user: response.user ? {\n            reference: `USR-${response.user.id}`,\n            name: response.user.name,\n            email: response.user.email,\n          } : null,\n          loading: false,\n        }));\n        return { success: true, status: 'needs_access' };\n      }\n\n      // v4.5: Handle direct callback_token (user already has access)\n      if (response.success && response.callback_token) {\n        setState(prev => ({ ...prev, loading: false }));\n        return { success: true, status: 'completed', callback_token: response.callback_token };\n      }\n\n      // Legacy: Handle process_token response\n      if (response.success && response.process_token) {\n        setState(prev => ({\n          ...prev,\n          processToken: response.process_token!,\n          status: response.status as NativeAuthStatus,\n          loading: false,\n        }));\n        return { success: true, status: response.status };\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Code invalide',\n        errorType: response.error_type || 'invalid_otp',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'l\\'authentification');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, []);\n\n  const register = useCallback(async (\n    data: {\n      name: string;\n      email?: string;\n      ccphone: string;\n      phone: string;\n      town?: string;\n      country?: string;\n    }\n  ) => {\n    setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n    try {\n      if (!nativeAuthService.hasCredentials()) {\n        await nativeAuthService.loadCredentials();\n      }\n      const registrationType = accountType === 'phone-only' ? 'phone' : 'email';\n      \n      const response = await nativeAuthService.register({\n        ...data,\n        email: registrationType === 'phone' ? '' : data.email,\n        registration_type: registrationType,\n      });\n\n      if (response.success && response.process_token) {\n        setState(prev => ({\n          ...prev,\n          processToken: response.process_token!,\n          status: response.status as NativeAuthStatus,\n          otpMethod: response.otp_method || null,\n          otpSentTo: response.otp_sent_to || null,\n          conflict: response.conflict ? {\n            type: response.conflict.type,\n            maskedIdentifier: response.conflict.masked_identifier,\n            options: {\n              canLogin: response.conflict.options.can_login,\n              canRecoverByEmail: response.conflict.options.can_recover_by_email,\n              canRecoverBySms: response.conflict.options.can_recover_by_sms,\n              maskedEmail: response.conflict.options.masked_email,\n              maskedPhone: response.conflict.options.masked_phone,\n            },\n          } : null,\n          loading: false,\n        }));\n        return { success: true, status: response.status };\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Erreur lors de l\\'inscription',\n        errorType: response.error_type || 'unknown',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'l\\'inscription');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, [accountType]);\n\n  const submitPassword = useCallback(async (password: string) => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      const response = await nativeAuthService.validate(state.processToken, { password });\n\n      if (response.success && response.callback_token) {\n        const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n        if (exchangeResult.success) {\n          const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n          setState(prev => ({\n            ...prev,\n            status: 'completed',\n            user: savedUser,\n            processToken: null,\n            loading: false,\n          }));\n          return { success: true, user: savedUser, callback_token: response.callback_token };\n        }\n        setState(prev => ({\n          ...prev,\n          loading: false,\n          error: exchangeResult.message || 'Erreur lors de l\\'échange',\n          errorType: 'exchange_failed',\n        }));\n        return { success: false, error_type: 'exchange_failed' };\n      }\n\n      if (response.requires_2fa) {\n        setState(prev => ({ ...prev, status: 'pending_2fa', loading: false }));\n        return { success: true, requires_2fa: true };\n      }\n\n      // needs_access after password validation — stocker le nouveau process_token\n      if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n        const bypassResult = FORCE_NEEDS_ACCESS_MODAL ? null : await autoResolveNeedsAccess(response);\n        if (bypassResult) {\n          return { success: true, user: bypassResult.user, callback_token: bypassResult.callback_token };\n        }\n\n        setState(prev => ({\n          ...prev,\n          status: 'needs_access' as NativeAuthStatus,\n          processToken: response.process_token || prev.processToken,\n          application: response.application || prev.application,\n          user: response.user ? {\n            reference: `USR-${response.user.id}`,\n            name: response.user.name,\n            email: response.user.email,\n          } : prev.user,\n          prompt: response.prompt || prev.prompt,\n          loading: false,\n        }));\n        return { success: true, status: 'needs_access' };\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Mot de passe incorrect',\n        errorType: response.error_type || 'invalid_password',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'la validation');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, [state.processToken, defaultAccountType]);\n\n  const submitOtp = useCallback(async (otpCode: string) => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      const response = await nativeAuthService.validate(state.processToken, { otp_code: otpCode });\n\n      if (response.success && response.callback_token) {\n        const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n        if (exchangeResult.success) {\n          const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n          setState(prev => ({\n            ...prev,\n            status: 'completed',\n            user: savedUser,\n            processToken: null,\n            loading: false,\n          }));\n          return { success: true, user: savedUser, callback_token: response.callback_token };\n        }\n        setState(prev => ({\n          ...prev,\n          loading: false,\n          error: exchangeResult.message || 'Erreur lors de l\\'échange',\n          errorType: 'exchange_failed',\n        }));\n        return { success: false, error_type: 'exchange_failed' };\n      }\n\n      if (response.success && response.status === 'pending_registration') {\n        setState(prev => ({ ...prev, status: 'pending_registration', loading: false }));\n        return { success: true, status: 'pending_registration' };\n      }\n\n      // needs_access after OTP validation — stocker le nouveau process_token\n      if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n        const bypassResult = FORCE_NEEDS_ACCESS_MODAL ? null : await autoResolveNeedsAccess(response);\n        if (bypassResult) {\n          return { success: true, user: bypassResult.user, callback_token: bypassResult.callback_token };\n        }\n\n        setState(prev => ({\n          ...prev,\n          status: 'needs_access' as NativeAuthStatus,\n          processToken: response.process_token || prev.processToken,\n          application: response.application || prev.application,\n          user: response.user ? {\n            reference: `USR-${response.user.id}`,\n            name: response.user.name,\n            email: response.user.email,\n          } : prev.user,\n          prompt: response.prompt || prev.prompt,\n          loading: false,\n        }));\n        return { success: true, status: 'needs_access' };\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Code incorrect',\n        errorType: response.error_type || 'invalid_otp',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'la vérification');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, [state.processToken, defaultAccountType]);\n\n  const submitTotp = useCallback(async (totpCode: string) => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      const response = await nativeAuthService.verifyTotp(state.processToken, totpCode);\n\n      if (response.success && response.callback_token) {\n        const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n        if (exchangeResult.success) {\n          const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n          setState(prev => ({\n            ...prev,\n            status: 'completed',\n            user: savedUser,\n            processToken: null,\n            loading: false,\n          }));\n          return { success: true, user: savedUser };\n        }\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Code 2FA incorrect',\n        errorType: response.error_type || 'invalid_totp',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'la vérification 2FA');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, [state.processToken, defaultAccountType]);\n\n  const grantAccess = useCallback(async () => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      const response = await nativeAuthService.grantAccess(state.processToken);\n\n      if (response.success && response.callback_token) {\n        const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n        if (exchangeResult.success) {\n          const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n          setState(prev => ({\n            ...prev,\n            status: 'completed',\n            user: savedUser,\n            processToken: null,\n            loading: false,\n          }));\n          return { success: true, user: savedUser, callback_token: response.callback_token };\n        }\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Erreur lors de l\\'accès',\n        errorType: response.error_type || 'unknown',\n      }));\n      return { success: false };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'l\\'accès');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false, error_type: type };\n    }\n  }, [state.processToken, defaultAccountType]);\n\n  const resendOtp = useCallback(async () => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      const response = await nativeAuthService.resendOtp(state.processToken);\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        otpMethod: response.otp_method || prev.otpMethod,\n        otpSentTo: response.otp_sent_to || prev.otpSentTo,\n      }));\n      return { \n        success: response.success, \n        cooldown: response.cooldown_remaining,\n        message: response.message,\n        otp_code_dev: response.otp_code_dev,\n        otp_method: response.otp_method,\n        otp_sent_to: response.otp_sent_to,\n      };\n    } catch (err) {\n      const { message, type } = getErrorMessage(err, 'le renvoi');\n      setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n      return { success: false };\n    }\n  }, [state.processToken]);\n\n  const setSession = useCallback((data: NativeExchangeResponse) => {\n    const { user: savedUser } = saveSession(data, defaultAccountType);\n    setState(prev => ({\n      ...prev,\n      user: savedUser,\n      status: 'completed',\n      processToken: null,\n    }));\n  }, [defaultAccountType]);\n\n  const logout = useCallback(async () => {\n    const storage = getNativeStorage();\n    const token = storage.getItem(STORAGE_KEYS.AUTH_TOKEN) || storage.getItem(STORAGE_KEYS.TOKEN);\n    try {\n      if (token) {\n        await nativeAuthService.logout(token);\n      }\n    } catch { /* ignore */ }\n\n    clearSession();\n    \n    setState({\n      credentialsLoaded: false,\n      processToken: null,\n      status: null,\n      user: null,\n      application: null,\n      prompt: null,\n      alternativeMethod: null,\n      conflict: null,\n      loading: false,\n      error: null,\n      errorType: null,\n      otpMethod: null,\n      otpSentTo: null,\n    });\n  }, []);\n\n  const reset = useCallback(() => {\n    setState(prev => ({\n      ...prev,\n      processToken: null,\n      status: null,\n      application: null,\n      prompt: null,\n      alternativeMethod: null,\n      conflict: null,\n      error: null,\n      errorType: null,\n    }));\n  }, []);\n\n  const clearError = useCallback(() => {\n    setState(prev => ({ ...prev, error: null, errorType: null }));\n  }, []);\n\n  const autoResolveNeedsAccess = useCallback(async (\n    response: {\n      process_token?: string | null;\n      application?: NativeAuthState['application'];\n      prompt?: NativeAuthState['prompt'];\n      user?: { id: number; name: string; email?: string | null; image_url?: string | null };\n    }\n  ): Promise<{ success: true; user: NativeUser; callback_token: string } | null> => {\n    if (!getNativeAuthConfig().bypass || !response.process_token) {\n      return null;\n    }\n\n    if (isDebug) {\n      console.log('⏩ [Native] bypass=true — auto grant access');\n    }\n\n    const grantResponse = await nativeAuthService.grantAccess(response.process_token);\n    if (!grantResponse.success || !grantResponse.callback_token) {\n      return null;\n    }\n\n    const exchangeResult = await nativeAuthService.exchange(grantResponse.callback_token);\n    if (!exchangeResult.success) {\n      return null;\n    }\n\n    const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n    setState(prev => ({\n      ...prev,\n      status: 'completed',\n      user: savedUser,\n      processToken: null,\n      application: response.application || prev.application,\n      prompt: response.prompt || prev.prompt,\n      loading: false,\n    }));\n\n    return { success: true, user: savedUser, callback_token: grantResponse.callback_token };\n  }, [defaultAccountType, isDebug]);\n\n  return {\n    // State\n    credentialsLoaded: state.credentialsLoaded,\n    processToken: state.processToken,\n    status: state.status,\n    user: state.user,\n    application: state.application,\n    prompt: state.prompt,\n    alternativeMethod: state.alternativeMethod,\n    conflict: state.conflict,\n    loading: state.loading,\n    error: state.error,\n    errorType: state.errorType,\n    isAuthenticated: state.status === 'completed' && state.user !== null,\n    \n    /** Debug réactif — mis à jour après loadCredentials */\n    isDebug,\n    \n    accountType,\n    isPhoneOnly: accountType === 'phone-only',\n    otpMethod: state.otpMethod,\n    otpSentTo: state.otpSentTo,\n\n    // Methods\n    loadCredentials,\n    loginWithEmail,\n    loginWithPhone,\n    loginWithAccessOtp,\n    submitPassword,\n    submitOtp,\n    submitTotp,\n    grantAccess,\n    resendOtp,\n    setSession,\n    logout,\n    reset,\n    clearError,\n    register,\n    setAccountType,\n  };\n}\n\nexport default useNativeAuth;\n","/**\n * Login Modal for @ollaid/native-sso\n * Complete login flow aligned with Native SSO design\n * \n * @version 2.7.9\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n  Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter,\n  Button, Input, Label,\n  IconShieldCheck, IconMail, IconPhone, IconLock, IconKeyRound, IconLink,\n  IconArrowLeft, IconEye, IconEyeOff, IconCheckCircle2, IconLoader2,\n  BrandLinkRow,\n} from './ui';\nimport OTPInput from './OTPInput';\nimport PasswordRecoveryModal from './PasswordRecoveryModal';\nimport { useNativeAuth } from '../hooks/useNativeAuth';\nimport { getAuthToken } from '../services/api';\nimport type { UserInfos } from '../types/native';\nimport packageFavicon from '../logo/favicon.png';\n\ntype LoginStep = 'choice' | 'email-check' | 'email-password' | 'email-otp' | 'email-create-password' | 'phone-input' | 'phone-otp' | 'access-otp';\n\nexport interface LoginModalProps {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  onSwitchToSignup: () => void;\n  onLoginSuccess?: (token: string, user: UserInfos) => void;\n  saasApiUrl: string;\n  iamApiUrl: string;\n  logoUrl?: string;\n  loading?: boolean;\n  showSwitchToSignup?: boolean;\n  homeUrl?: string;\n  /** Type de compte par défaut à persister dans le storage du package */\n  defaultAccountType?: 'user' | 'client';\n  /** Pre-fill phone number and go directly to phone-input step */\n  initialPhone?: string;\n}\n\ntype LoginResult = {\n  success: boolean;\n  user?: Partial<UserInfos> & Pick<UserInfos, 'name'>;\n  status?: string;\n  callback_token?: string;\n};\n\nconst SSO_VERSION = '2.8.2';\n\n// Design tokens\nconst C = {\n  primary: '#002147',\n  accent: '#e8430a',\n  green: '#16a34a',\n  greenBg: '#dcfce7',\n  amber: '#f59e0b',\n  amberBg: '#fef3c7',\n  gray100: '#f3f4f6',\n  gray200: '#e5e7eb',\n  gray500: '#6b7280',\n  gray700: '#374151',\n  gray900: '#111827',\n  red: '#dc2626',\n  redBg: '#fef2f2',\n  white: '#ffffff',\n} as const;\n\n// Reusable style helpers\nconst iconCircle = (bg: string): React.CSSProperties => ({\n  margin: '0 auto', width: '3rem', height: '3rem', backgroundColor: bg, borderRadius: '50%',\n  display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst appBadgeCircle = (bg: string): React.CSSProperties => ({\n  width: '2.9rem',\n  height: '2.9rem',\n  borderRadius: '9999px',\n  backgroundColor: bg,\n  border: `1px solid ${C.gray200}`,\n  boxShadow: '0 8px 18px rgba(0, 0, 0, 0.08)',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  padding: '0.5rem',\n  boxSizing: 'border-box',\n  overflow: 'hidden',\n  flexShrink: 0,\n});\n\nconst brandLinkPill: React.CSSProperties = {\n  width: '2.2rem',\n  height: '2.2rem',\n  borderRadius: '9999px',\n  backgroundColor: C.gray100,\n  border: `1px solid ${C.gray200}`,\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  flexShrink: 0,\n  boxShadow: '0 4px 10px rgba(0, 0, 0, 0.05)',\n};\n\nconst brandRowStyle: React.CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  gap: '0.65rem',\n  marginBottom: '0.9rem',\n};\n\nconst backBtnStyle: React.CSSProperties = {\n  position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n  cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nconst linkStyle: React.CSSProperties = {\n  color: C.primary, cursor: 'pointer', background: 'none', border: 'none',\n  fontWeight: 500, textDecoration: 'underline', fontSize: '0.875rem',\n};\n\nconst errorBoxStyle: React.CSSProperties = {\n  padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg,\n  color: C.red, fontSize: '0.875rem',\n};\n\nconst methodBtnStyle: React.CSSProperties = {\n  width: '100%', height: '3.5rem', justifyContent: 'flex-start', gap: '0.75rem',\n  textAlign: 'left' as const, backgroundColor: C.gray100, borderColor: C.gray200,\n};\n\nconst methodIconStyle = (bg: string): React.CSSProperties => ({\n  width: '2.5rem', height: '2.5rem', backgroundColor: bg, borderRadius: '0.5rem',\n  display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0,\n});\n\nexport function LoginModal({\n  open, onOpenChange, onSwitchToSignup, onLoginSuccess, saasApiUrl, iamApiUrl, logoUrl, loading, showSwitchToSignup = true, homeUrl, defaultAccountType, initialPhone,\n}: LoginModalProps) {\n  const {\n    status, user, application, alternativeMethod, loading: authLoading, error: authError,\n    loginWithEmail, loginWithPhone, submitPassword, submitOtp, grantAccess, loginWithAccessOtp,\n    resendOtp, reset: resetAuth, clearError, otpMethod, otpSentTo,\n  } = useNativeAuth({ saasApiUrl, iamApiUrl, defaultAccountType });\n\n  const [step, setStep] = useState<LoginStep>('choice');\n  const [email, setEmail] = useState('');\n  const [password, setPassword] = useState('');\n  const [showPassword, setShowPassword] = useState(false);\n  const [userName, setUserName] = useState<string | null>(null);\n  const [phone, setPhone] = useState('');\n  const [phoneOtpCode, setPhoneOtpCode] = useState('');\n  const [emailOtpCode, setEmailOtpCode] = useState('');\n  const [accessOtpCode, setAccessOtpCode] = useState('');\n  const [localError, setLocalError] = useState<string | null>(null);\n  const [resendCooldown, setResendCooldown] = useState(0);\n  const [loginSuccess, setLoginSuccess] = useState(false);\n  const [loginData, setLoginData] = useState<{ token: string; user: UserInfos } | null>(null);\n  const [showPasswordRecovery, setShowPasswordRecovery] = useState(false);\n  const [passwordSubmitting, setPasswordSubmitting] = useState(false);\n  const successCallbackTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  const CCPHONE = '+221';\n  const isSubmitting = authLoading || loading;\n  const error = localError || authError;\n  const applicationLogo = application?.logo || logoUrl || null;\n  const applicationName = application?.name || 'Application';\n  const showHomeLink = Boolean(homeUrl);\n  const getOtpDeliveryLabel = (method?: 'email' | 'sms' | null, sentTo?: string | null, fallback?: 'email' | 'phone') => {\n    if (method === 'sms') {\n      return sentTo ? `par SMS au ${sentTo}` : 'par SMS';\n    }\n    if (method === 'email') {\n      return sentTo ? `par email à ${sentTo}` : 'par email';\n    }\n\n    if (fallback === 'phone') {\n      return phone ? `par SMS au ${CCPHONE} ${phone}` : 'par SMS';\n    }\n\n    return email ? `par email à ${email}` : 'pour vérification';\n  };\n\n  useEffect(() => {\n    if (resendCooldown > 0) {\n      const timer = setTimeout(() => setResendCooldown(p => p - 1), 1000);\n      return () => clearTimeout(timer);\n    }\n  }, [resendCooldown]);\n\n  useEffect(() => {\n    if (status === 'pending_password') setStep('email-password');\n    else if (status === 'pending_otp') {\n      if (step === 'email-check' || step === 'email-password') setStep('email-otp');\n      else if (step === 'phone-input') setStep('phone-otp');\n      setResendCooldown(60);\n    }\n  }, [status, step]);\n\n  const resetState = useCallback(() => {\n    if (successCallbackTimerRef.current) {\n      clearTimeout(successCallbackTimerRef.current);\n      successCallbackTimerRef.current = null;\n    }\n    setStep('choice'); setEmail(''); setPassword('');\n    setShowPassword(false); setUserName(null); setPhone(''); setPhoneOtpCode(''); setEmailOtpCode('');\n    setAccessOtpCode(''); setLocalError(null); setLoginSuccess(false); setLoginData(null);\n    setResendCooldown(0); setPasswordSubmitting(false); resetAuth();\n  }, [resetAuth]);\n\n  useEffect(() => { if (!open) resetState(); }, [open, resetState]);\n\n  // Pre-fill phone from conflict resolution\n  useEffect(() => {\n    if (open && initialPhone) {\n      setStep('phone-input');\n      setPhone(initialPhone);\n    }\n  }, [open, initialPhone]);\n\n  /**\n   * Finalise la connexion après que useNativeAuth ait déjà fait l'exchange.\n   * Ne PAS re-appeler nativeAuthService.exchange() ici — le hook l'a déjà fait.\n   */\n  const finalizeLogin = (result: LoginResult) => {\n    if (result.success && (result.callback_token || result.status === 'completed')) {\n      const token = getAuthToken() || '';\n      const resolvedUser = result.user || user;\n\n      if (resolvedUser) {\n        setLoginData({ token, user: resolvedUser as UserInfos });\n        setLoginSuccess(true);\n      }\n      return;\n    }\n\n    if (result.status === 'needs_access') {\n      setLoginSuccess(false);\n      setLoginData(null);\n    }\n  };\n\n  useEffect(() => {\n    if (!loginSuccess || !loginData || !onLoginSuccess) return;\n\n    if (successCallbackTimerRef.current) {\n      clearTimeout(successCallbackTimerRef.current);\n    }\n\n    successCallbackTimerRef.current = setTimeout(() => {\n      try {\n        onLoginSuccess(loginData.token, loginData.user);\n      } catch (callbackError) {\n        console.error('Erreur dans onLoginSuccess', callbackError);\n      }\n    }, 900);\n\n    return () => {\n      if (successCallbackTimerRef.current) {\n        clearTimeout(successCallbackTimerRef.current);\n        successCallbackTimerRef.current = null;\n      }\n    };\n  }, [loginSuccess, loginData, onLoginSuccess]);\n\n  const handleEmailCheck = async () => {\n    setLocalError(null); clearError();\n    if (!email.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n    if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) { setLocalError('Adresse email invalide'); return; }\n    const result = await loginWithEmail(email.trim());\n    if (result.success && user?.name) setUserName(user.name);\n  };\n\n  const handleEmailPasswordSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    if (passwordSubmitting || isSubmitting) return;\n\n    setPasswordSubmitting(true);\n    setLocalError(null); clearError();\n    try {\n      if (!password) { setLocalError('Le mot de passe est requis'); return; }\n      if (password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n      const result = await submitPassword(password);\n      finalizeLogin(result);\n    } finally {\n      setPasswordSubmitting(false);\n    }\n  };\n\n  const handleEmailOtpVerify = async () => {\n    setLocalError(null); clearError();\n    if (emailOtpCode.length !== 6) { setLocalError('Le code doit contenir 6 chiffres'); return; }\n    const result = await submitOtp(emailOtpCode);\n    finalizeLogin(result);\n  };\n\n  const handlePhoneInit = async () => {\n    setLocalError(null); clearError();\n    const cleanPhone = phone.replace(/\\s/g, '');\n    if (cleanPhone.length !== 9) { setLocalError('Le numéro doit contenir exactement 9 chiffres'); return; }\n    await loginWithPhone(CCPHONE, cleanPhone);\n  };\n\n  const handlePhoneVerify = async () => {\n    setLocalError(null); clearError();\n    if (phoneOtpCode.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n    const result = await submitOtp(phoneOtpCode);\n    finalizeLogin(result);\n  };\n\n  const handleAccessOtpSubmit = async () => {\n    setLocalError(null); clearError();\n    if (accessOtpCode.length !== 8) { setLocalError('Veuillez entrer le code à 8 chiffres'); return; }\n    const result = await loginWithAccessOtp(accessOtpCode);\n    finalizeLogin(result);\n  };\n\n  const handleGrantAccess = async () => {\n    setLocalError(null); clearError();\n    const result = await grantAccess();\n    finalizeLogin(result);\n  };\n\n  const handleResendOTP = async () => {\n    if (resendCooldown > 0) return;\n    const result = await resendOtp();\n    if (result.success) setResendCooldown(result.cooldown || 60);\n  };\n\n  const goBack = () => {\n    setLocalError(null); clearError();\n    switch (step) {\n      case 'email-check': case 'phone-input': case 'access-otp': setStep('choice'); resetAuth(); break;\n      case 'email-password': case 'email-otp': setStep('email-check'); resetAuth(); break;\n      case 'phone-otp': setStep('phone-input'); resetAuth(); break;\n      default: setStep('choice'); resetAuth();\n    }\n  };\n\n  const handleDialogOpenChange = (nextOpen: boolean) => {\n    if (!nextOpen && status === 'needs_access') {\n      return;\n    }\n\n    onOpenChange(nextOpen);\n  };\n\n  const handleNeedsAccessCancel = () => {\n    setLocalError(null);\n    clearError();\n    resetAuth();\n    setStep('choice');\n    onOpenChange(false);\n  };\n\n  const showNeedsAccess = status === 'needs_access' && Boolean(user && application);\n  const showSuccess = loginSuccess && Boolean(loginData) && !showNeedsAccess;\n\n  // Render helpers\n  const renderError = () => error ? <div style={errorBoxStyle}>{error}</div> : null;\n\n  const renderBackBtn = () => (\n    <button onClick={goBack} style={backBtnStyle} type=\"button\">\n      <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n    </button>\n  );\n\n  const renderResendLink = () => (\n    <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n      {resendCooldown > 0 ? (\n        <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span>\n      ) : (\n        <button type=\"button\" style={linkStyle} onClick={handleResendOTP}>\n          Code non reçu ? Renvoyer\n        </button>\n      )}\n    </div>\n  );\n\n  const renderLoaderBtn = (text: string, loadingText: string, onClick: () => void, disabled: boolean, extraStyle?: React.CSSProperties) => (\n    <Button onClick={onClick} disabled={isSubmitting || disabled} style={{ width: '100%', ...extraStyle }}>\n      {isSubmitting ? (\n        <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n          <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n          {loadingText}\n        </span>\n      ) : text}\n    </Button>\n  );\n\n  return (\n    <>\n      <Dialog open={open} onOpenChange={handleDialogOpenChange}>\n        <DialogContent>\n\n          {/* ===================== SUCCESS ===================== */}\n          {showNeedsAccess ? (\n            <>\n              <DialogHeader style={{ textAlign: 'center' }}>\n                <div style={{ ...iconCircle(C.primary + '1a'), width: '4rem', height: '4rem' }}>\n                  {application?.logo ? (\n                    <img src={application.logo} alt={application.name || 'Application'} style={{ width: '2.5rem', height: '2.5rem', borderRadius: '0.5rem' }} />\n                  ) : (\n                    <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.primary }} />\n                  )}\n                </div>\n                <DialogTitle>Bienvenue sur {application?.name}</DialogTitle>\n                <DialogDescription>\n                  Bonjour <strong style={{ color: C.gray900 }}>{user?.name}</strong>, vous n'avez pas encore de compte sur <strong style={{ color: C.primary }}>{application?.name}</strong>.\n                </DialogDescription>\n              </DialogHeader>\n              <DialogBody>\n                <div style={{ padding: '1rem', backgroundColor: C.gray100, borderRadius: '0.5rem', fontSize: '0.875rem', color: C.gray500 }}>\n                  Votre compte <strong style={{ color: C.primary }}>iam.ollaid.com</strong> existe déjà. Cliquez sur Confirmer pour créer votre accès à <strong style={{ color: C.gray900 }}>{application?.name}</strong>.\n                </div>\n                {renderError()}\n              </DialogBody>\n              <DialogFooter>\n                <Button onClick={handleGrantAccess} disabled={isSubmitting} style={{ width: '100%' }}>\n                  {isSubmitting ? (\n                    <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n                      <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n                      Création en cours...\n                    </span>\n                  ) : 'Confirmer la création de mon compte'}\n                </Button>\n                <Button variant=\"outline\" onClick={() => { resetAuth(); setStep('choice'); onOpenChange(false); }} disabled={isSubmitting} style={{ width: '100%' }}>\n                  Annuler\n                </Button>\n              </DialogFooter>\n            </>\n          ) : showSuccess ? (\n            <DialogHeader style={{ textAlign: 'center' }}>\n              <div style={{ ...iconCircle(C.greenBg), width: '5rem', height: '5rem' }}>\n                <IconCheckCircle2 style={{ width: '3rem', height: '3rem', color: C.green }} />\n              </div>\n              <DialogTitle>Connexion réussie</DialogTitle>\n              <DialogDescription>\n                <span style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginTop: '0.5rem' }}>\n                  <IconLoader2 style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n                  Redirection en cours...\n                </span>\n              </DialogDescription>\n            </DialogHeader>\n\n          /* ===================== ALIAS DISABLED ===================== */\n          ) : alternativeMethod ? (\n            <>\n              <DialogHeader style={{ textAlign: 'center' }}>\n                <div style={{ ...iconCircle(C.amberBg), width: '4rem', height: '4rem' }}>\n                  {alternativeMethod.type === 'email' ? (\n                    <IconMail style={{ width: '2rem', height: '2rem', color: C.amber }} />\n                  ) : (\n                    <IconPhone style={{ width: '2rem', height: '2rem', color: C.amber }} />\n                  )}\n                </div>\n                <DialogTitle>Moyen de connexion désactivé</DialogTitle>\n                <DialogDescription>\n                  Vos identifiants sont corrects, mais vous avez désactivé ce moyen de connexion depuis votre compte IAM.\n                </DialogDescription>\n              </DialogHeader>\n              <DialogBody>\n                {alternativeMethod.value && (\n                  <div style={{ padding: '1rem', backgroundColor: C.gray100, borderRadius: '0.5rem' }}>\n                    <p style={{ fontSize: '0.875rem', color: C.gray500, marginBottom: '0.75rem' }}>Vous pouvez vous connecter avec :</p>\n                    <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', fontSize: '0.875rem', fontWeight: 500, color: C.gray900 }}>\n                      {alternativeMethod.type === 'phone' ? (\n                        <IconPhone style={{ width: '1rem', height: '1rem', color: C.primary }} />\n                      ) : (\n                        <IconMail style={{ width: '1rem', height: '1rem', color: C.primary }} />\n                      )}\n                      <span>{alternativeMethod.value}</span>\n                    </div>\n                  </div>\n                )}\n              </DialogBody>\n              <DialogFooter>\n                <Button onClick={() => {\n                  if (alternativeMethod.type === 'phone') setStep('phone-input');\n                  else setStep('email-check');\n                  resetAuth();\n                }} style={{ width: '100%' }}>\n                  {alternativeMethod.type === 'phone' ? 'Se connecter par téléphone' : 'Se connecter par email'}\n                </Button>\n                <Button variant=\"outline\" onClick={() => window.open('https://iam.ollaid.com', '_blank')} style={{ width: '100%' }}>\n                  Réactiver depuis iam.ollaid.com\n                </Button>\n                <Button variant=\"ghost\" onClick={handleNeedsAccessCancel} style={{ width: '100%' }}>\n                  Annuler\n                </Button>\n              </DialogFooter>\n            </>\n\n          /* ===================== MAIN STEPS ===================== */\n          ) : (\n            <>\n              {step !== 'choice' && renderBackBtn()}\n\n              {/* ===== CHOICE ===== */}\n              {step === 'choice' && (\n                <>\n                  <DialogHeader style={{ textAlign: 'center' }}>\n                    <div style={brandRowStyle}>\n                      <div style={appBadgeCircle(C.white)}>\n                        {applicationLogo ? (\n                          <img\n                            src={applicationLogo}\n                            alt={applicationName}\n                            style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n                          />\n                        ) : (\n                          <IconShieldCheck style={{ width: '1.4rem', height: '1.4rem', color: C.primary }} />\n                        )}\n                      </div>\n                      <div style={brandLinkPill} aria-hidden=\"true\">\n                        <IconLink style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n                      </div>\n                      <div style={appBadgeCircle(C.white)}>\n                        <img\n                          src={packageFavicon}\n                          alt=\"Ollaid SSO\"\n                          style={{ width: '100%', height: '100%', objectFit: 'contain' }}\n                        />\n                      </div>\n                    </div>\n                    <DialogTitle>Connexion</DialogTitle>\n                    <DialogDescription>Choisissez votre méthode de connexion</DialogDescription>\n                  </DialogHeader>\n                  <DialogBody>\n                    <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n                      {renderError()}\n                      <Button variant=\"outline\" onClick={() => setStep('email-check')} style={methodBtnStyle}>\n                        <div style={methodIconStyle(C.accent)}>\n                          <IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n                        </div>\n                        <div>\n                          <div style={{ fontWeight: 500, color: C.gray900 }}>Adresse email</div>\n                          <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Connexion avec email</div>\n                        </div>\n                      </Button>\n                      <Button variant=\"outline\" onClick={() => setStep('phone-input')} style={methodBtnStyle}>\n                        <div style={methodIconStyle(C.accent)}>\n                          <IconPhone style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n                        </div>\n                        <div>\n                          <div style={{ fontWeight: 500, color: C.gray900 }}>\n                            Numéro de téléphone <span style={{ color: C.gray500 }}>(Sénégal)</span>\n                          </div>\n                          <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Connexion avec code SMS</div>\n                        </div>\n                      </Button>\n                      {/* Accès OTP temporairement masqué. On le réactivera dans une version ultérieure.\n                      <Button variant=\"outline\" onClick={() => setStep('access-otp')} style={methodBtnStyle}>\n                        <div style={methodIconStyle(C.primary)}>\n                          <IconKeyRound style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n                        </div>\n                        <div>\n                          <div style={{ fontWeight: 500, color: C.gray900 }}>Accès OTP</div>\n                          <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Disponible sur le backoffice IAM</div>\n                        </div>\n                      </Button>\n                      */}\n                      <div style={{ textAlign: 'center', fontSize: '0.875rem', paddingTop: '0.5rem' }}>\n                        <span style={{ color: C.gray500 }}>Mot de passe oublié ? </span>\n                        <button type=\"button\" style={linkStyle} onClick={() => setShowPasswordRecovery(true)}>Récupérer</button>\n                      </div>\n                      <div style={{ position: 'relative', padding: '0.5rem 0' }}>\n                        <div style={{ position: 'absolute', inset: 0, display: 'flex', alignItems: 'center' }}>\n                          <span style={{ width: '100%', borderTop: `1px solid ${C.gray200}` }} />\n                        </div>\n                      </div>\n                      {showSwitchToSignup && (\n                        <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n                          <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n                          <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n                        </div>\n                      )}\n                      {showHomeLink && (\n                        <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n                          <button\n                            type=\"button\"\n                            style={linkStyle}\n                            onClick={() => { if (homeUrl) window.location.href = homeUrl; }}\n                          >\n                            Retourner à l'accueil\n                          </button>\n                        </div>\n                      )}\n                      <div style={{ textAlign: 'center', fontSize: '0.72rem', color: C.gray500, paddingTop: '0.25rem' }}>\n                        OLLAID SSO v{SSO_VERSION} · © 2026 OLLAID\n                      </div>\n                    </div>\n                  </DialogBody>\n                </>\n              )}\n\n              {/* ===== EMAIL CHECK ===== */}\n              {step === 'email-check' && (\n                <>\n                  <DialogHeader style={{ textAlign: 'center' }}>\n                    <BrandLinkRow\n                      icon={<IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.accent }} />}\n                      faviconSrc={packageFavicon}\n                      faviconAlt=\"Ollaid SSO\"\n                      iconBg={C.accent + '1a'}\n                      iconColor={C.accent}\n                    />\n                    <DialogTitle>Connexion par email</DialogTitle>\n                    <DialogDescription>Entrez votre adresse email</DialogDescription>\n                  </DialogHeader>\n                  <DialogBody>\n                    <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n                      {renderError()}\n                      <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n                        <Label htmlFor=\"email\">Adresse email</Label>\n                        <Input id=\"email\" type=\"email\" placeholder=\"vous@exemple.com\" value={email}\n                          onChange={e => setEmail(e.target.value)} disabled={isSubmitting}\n                          onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); handleEmailCheck(); } }}\n                        />\n                      </div>\n                      <div style={{ textAlign: 'right' }}>\n                        <button type=\"button\" style={{ ...linkStyle, fontSize: '0.75rem' }} onClick={() => setShowPasswordRecovery(true)}>\n                          Mot de passe oublié ?\n                        </button>\n                      </div>\n                    </div>\n                  </DialogBody>\n                  <DialogFooter>\n                    {renderLoaderBtn('Continuer', 'Vérification...', handleEmailCheck, !email.trim())}\n                    {showSwitchToSignup && (\n                      <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n                        <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n                        <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n                      </div>\n                    )}\n                  </DialogFooter>\n                </>\n              )}\n\n              {/* ===== EMAIL PASSWORD ===== */}\n              {step === 'email-password' && (\n                <>\n                  <DialogHeader style={{ textAlign: 'center' }}>\n                    <BrandLinkRow\n                      icon={<IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.accent }} />}\n                      faviconSrc={packageFavicon}\n                      faviconAlt=\"Ollaid SSO\"\n                      iconBg={C.accent + '1a'}\n                      iconColor={C.accent}\n                    />\n                    {userName && <DialogTitle>Bonjour {userName} 👋</DialogTitle>}\n                    <DialogDescription>{email}</DialogDescription>\n                  </DialogHeader>\n                  <form onSubmit={handleEmailPasswordSubmit} style={{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0 }}>\n                    <DialogBody>\n                      <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n                        {renderError()}\n                        <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n                          <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n                            <Label htmlFor=\"password\">Mot de passe</Label>\n                            <button type=\"button\" style={{ ...linkStyle, fontSize: '0.75rem' }} onClick={() => setShowPasswordRecovery(true)}>\n                              Mot de passe oublié ?\n                            </button>\n                          </div>\n                          <div style={{ position: 'relative' }}>\n                            <Input id=\"password\" type={showPassword ? 'text' : 'password'} placeholder=\"••••••••\" value={password}\n                              onChange={e => setPassword(e.target.value)} disabled={isSubmitting || passwordSubmitting}\n                              style={{ paddingRight: '2.5rem' }}\n                            />\n                            <button type=\"button\" onClick={() => setShowPassword(!showPassword)}\n                              style={{ position: 'absolute', right: 0, top: 0, height: '100%', padding: '0 0.75rem', background: 'none', border: 'none', cursor: 'pointer' }}>\n                              {showPassword ? (\n                                <IconEyeOff style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n                              ) : (\n                                <IconEye style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n                              )}\n                            </button>\n                          </div>\n                        </div>\n                      </div>\n                    </DialogBody>\n                    <DialogFooter>\n                      <Button type=\"submit\" disabled={isSubmitting || passwordSubmitting || !password} style={{ width: '100%' }}>\n                        {isSubmitting ? (\n                          <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n                            <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n                            Connexion...\n                          </span>\n                        ) : 'Se connecter'}\n                      </Button>\n                    </DialogFooter>\n                  </form>\n                </>\n              )}\n\n              {/* ===== EMAIL OTP ===== */}\n              {step === 'email-otp' && (\n                <>\n                  <DialogHeader style={{ textAlign: 'center' }}>\n                    <BrandLinkRow\n                      icon={<IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.accent }} />}\n                      faviconSrc={packageFavicon}\n                      faviconAlt=\"Ollaid SSO\"\n                      iconBg={C.accent + '1a'}\n                      iconColor={C.accent}\n                    />\n                    <DialogTitle>Vérification</DialogTitle>\n                    <DialogDescription>\n                      Un code de vérification a été envoyé {getOtpDeliveryLabel(otpMethod, otpSentTo, 'email')}\n                    </DialogDescription>\n                  </DialogHeader>\n                  <DialogBody>\n                    <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n                      {renderError()}\n                      <OTPInput value={emailOtpCode} onChange={setEmailOtpCode} disabled={isSubmitting} />\n                      {renderResendLink()}\n                    </div>\n                  </DialogBody>\n                  <DialogFooter>\n                    {renderLoaderBtn('Vérifier', 'Vérification...', handleEmailOtpVerify, emailOtpCode.length !== 6)}\n                  </DialogFooter>\n                </>\n              )}\n\n              {/* ===== PHONE INPUT ===== */}\n              {step === 'phone-input' && (\n                <>\n                  <DialogHeader style={{ textAlign: 'center' }}>\n                    <BrandLinkRow\n                      icon={<IconPhone style={{ width: '1.25rem', height: '1.25rem', color: C.accent }} />}\n                      faviconSrc={packageFavicon}\n                      faviconAlt=\"Ollaid SSO\"\n                      iconBg={C.accent + '1a'}\n                      iconColor={C.accent}\n                    />\n                    <DialogTitle>Connexion par téléphone</DialogTitle>\n                    <DialogDescription>Entrez votre numéro pour recevoir un code de vérification</DialogDescription>\n                  </DialogHeader>\n                  <DialogBody>\n                    <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n                      {renderError()}\n                      <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n                        <Label>Indicatif</Label>\n                        <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', padding: '0.75rem', backgroundColor: C.gray100, borderRadius: '0.375rem' }}>\n                          <span style={{ fontSize: '1.125rem' }}>🇸🇳</span>\n                          <span style={{ fontWeight: 500, color: C.gray900 }}>Sénégal (+221)</span>\n                        </div>\n                      </div>\n                      <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n                        <Label htmlFor=\"login-phone\">Numéro de téléphone</Label>\n                        <Input id=\"login-phone\" type=\"tel\" placeholder=\"77 123 45 67\" value={phone}\n                          onChange={e => { const val = e.target.value.replace(/\\D/g, '').slice(0, 9); setPhone(val); }}\n                          disabled={isSubmitting} maxLength={9}\n                          onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); handlePhoneInit(); } }}\n                        />\n                        <p style={{ fontSize: '0.75rem', color: C.gray500 }}>9 chiffres requis ({phone.replace(/\\D/g, '').length}/9)</p>\n                      </div>\n                    </div>\n                  </DialogBody>\n                  <DialogFooter>\n                    {renderLoaderBtn('Recevoir le code', 'Envoi en cours...', handlePhoneInit, phone.replace(/\\D/g, '').length !== 9)}\n                    {showSwitchToSignup && (\n                      <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n                        <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n                        <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n                      </div>\n                    )}\n                  </DialogFooter>\n                </>\n              )}\n\n              {/* ===== PHONE OTP ===== */}\n              {step === 'phone-otp' && (\n                <>\n                  <DialogHeader style={{ textAlign: 'center' }}>\n                    <BrandLinkRow\n                      icon={<IconPhone style={{ width: '1.25rem', height: '1.25rem', color: C.accent }} />}\n                      faviconSrc={packageFavicon}\n                      faviconAlt=\"Ollaid SSO\"\n                      iconBg={C.accent + '1a'}\n                      iconColor={C.accent}\n                    />\n                    <DialogTitle>Vérification</DialogTitle>\n                    <DialogDescription>\n                      Un code de vérification a été envoyé {getOtpDeliveryLabel(otpMethod, otpSentTo, 'phone')}\n                    </DialogDescription>\n                  </DialogHeader>\n                  <DialogBody>\n                    <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n                      {renderError()}\n                      <OTPInput value={phoneOtpCode} onChange={setPhoneOtpCode} disabled={isSubmitting} />\n                      {renderResendLink()}\n                    </div>\n                  </DialogBody>\n                  <DialogFooter>\n                    {renderLoaderBtn('Se connecter', 'Vérification...', handlePhoneVerify, phoneOtpCode.length !== 6)}\n                  </DialogFooter>\n                </>\n              )}\n\n              {/* ===== ACCESS OTP ===== */}\n              {step === 'access-otp' && (\n                <>\n                  <DialogHeader style={{ textAlign: 'center' }}>\n                    <div style={iconCircle(C.primary)}>\n                      <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n                    </div>\n                    <DialogTitle>Code d'accès</DialogTitle>\n                    <DialogDescription>Entrez le code d'accès à 8 chiffres</DialogDescription>\n                  </DialogHeader>\n                  <DialogBody>\n                    <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n                      {renderError()}\n                      <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n                        <Label>Code d'accès (8 chiffres)</Label>\n                        <Input type=\"text\" inputMode=\"numeric\" placeholder=\"0000-0000\" value={accessOtpCode}\n                          onChange={e => setAccessOtpCode(e.target.value.replace(/\\D/g, '').slice(0, 8))}\n                          disabled={isSubmitting}\n                          style={{ textAlign: 'center', fontSize: '1.5rem', letterSpacing: '0.15em', fontFamily: 'monospace' }}\n                          maxLength={8}\n                        />\n                      </div>\n                    </div>\n                  </DialogBody>\n                  <DialogFooter>\n                    {renderLoaderBtn('Se connecter', 'Vérification...', handleAccessOtpSubmit, accessOtpCode.length !== 8)}\n                  </DialogFooter>\n                </>\n              )}\n            </>\n          )}\n        </DialogContent>\n      </Dialog>\n\n      <PasswordRecoveryModal\n        open={showPasswordRecovery}\n        onOpenChange={setShowPasswordRecovery}\n        onSuccess={() => setShowPasswordRecovery(false)}\n        saasApiUrl={saasApiUrl}\n        iamApiUrl={iamApiUrl}\n        \n      />\n    </>\n  );\n}\n\nexport default LoginModal;\n","/**\n * Complete world countries list for @ollaid/native-sso\n * Default: Sénégal (+221, SN)\n */\n\nexport interface Country {\n  code: string;      // ISO 2-letter (e.g. \"SN\")\n  name: string;      // Display name\n  dialCode: string;  // Phone prefix (e.g. \"+221\")\n  flag: string;      // Emoji flag\n  digits: number;    // Expected phone number length (without prefix)\n}\n\n// West Africa prioritized at top, then rest of Africa, Europe, Americas, Asia, Oceania\nexport const COUNTRIES: Country[] = [\n  // ── Afrique de l'Ouest (prioritaires) ──\n  { code: \"SN\", name: \"Sénégal\", dialCode: \"+221\", flag: \"🇸🇳\", digits: 9 },\n  { code: \"CI\", name: \"Côte d'Ivoire\", dialCode: \"+225\", flag: \"🇨🇮\", digits: 10 },\n  { code: \"ML\", name: \"Mali\", dialCode: \"+223\", flag: \"🇲🇱\", digits: 8 },\n  { code: \"BF\", name: \"Burkina Faso\", dialCode: \"+226\", flag: \"🇧🇫\", digits: 8 },\n  { code: \"GN\", name: \"Guinée\", dialCode: \"+224\", flag: \"🇬🇳\", digits: 9 },\n  { code: \"TG\", name: \"Togo\", dialCode: \"+228\", flag: \"🇹🇬\", digits: 8 },\n  { code: \"BJ\", name: \"Bénin\", dialCode: \"+229\", flag: \"🇧🇯\", digits: 8 },\n  { code: \"NE\", name: \"Niger\", dialCode: \"+227\", flag: \"🇳🇪\", digits: 8 },\n  { code: \"MR\", name: \"Mauritanie\", dialCode: \"+222\", flag: \"🇲🇷\", digits: 8 },\n  { code: \"GW\", name: \"Guinée-Bissau\", dialCode: \"+245\", flag: \"🇬🇼\", digits: 7 },\n  { code: \"GM\", name: \"Gambie\", dialCode: \"+220\", flag: \"🇬🇲\", digits: 7 },\n  { code: \"CV\", name: \"Cap-Vert\", dialCode: \"+238\", flag: \"🇨🇻\", digits: 7 },\n  { code: \"SL\", name: \"Sierra Leone\", dialCode: \"+232\", flag: \"🇸🇱\", digits: 8 },\n  { code: \"LR\", name: \"Liberia\", dialCode: \"+231\", flag: \"🇱🇷\", digits: 7 },\n  { code: \"GH\", name: \"Ghana\", dialCode: \"+233\", flag: \"🇬🇭\", digits: 9 },\n  { code: \"NG\", name: \"Nigeria\", dialCode: \"+234\", flag: \"🇳🇬\", digits: 10 },\n\n  // ── Afrique Centrale ──\n  { code: \"CM\", name: \"Cameroun\", dialCode: \"+237\", flag: \"🇨🇲\", digits: 9 },\n  { code: \"GA\", name: \"Gabon\", dialCode: \"+241\", flag: \"🇬🇦\", digits: 7 },\n  { code: \"CG\", name: \"Congo\", dialCode: \"+242\", flag: \"🇨🇬\", digits: 9 },\n  { code: \"CD\", name: \"RD Congo\", dialCode: \"+243\", flag: \"🇨🇩\", digits: 9 },\n  { code: \"TD\", name: \"Tchad\", dialCode: \"+235\", flag: \"🇹🇩\", digits: 8 },\n  { code: \"CF\", name: \"Centrafrique\", dialCode: \"+236\", flag: \"🇨🇫\", digits: 8 },\n  { code: \"GQ\", name: \"Guinée équatoriale\", dialCode: \"+240\", flag: \"🇬🇶\", digits: 9 },\n  { code: \"ST\", name: \"São Tomé-et-Príncipe\", dialCode: \"+239\", flag: \"🇸🇹\", digits: 7 },\n  { code: \"BI\", name: \"Burundi\", dialCode: \"+257\", flag: \"🇧🇮\", digits: 8 },\n  { code: \"RW\", name: \"Rwanda\", dialCode: \"+250\", flag: \"🇷🇼\", digits: 9 },\n\n  // ── Afrique de l'Est ──\n  { code: \"KE\", name: \"Kenya\", dialCode: \"+254\", flag: \"🇰🇪\", digits: 9 },\n  { code: \"TZ\", name: \"Tanzanie\", dialCode: \"+255\", flag: \"🇹🇿\", digits: 9 },\n  { code: \"UG\", name: \"Ouganda\", dialCode: \"+256\", flag: \"🇺🇬\", digits: 9 },\n  { code: \"ET\", name: \"Éthiopie\", dialCode: \"+251\", flag: \"🇪🇹\", digits: 9 },\n  { code: \"SO\", name: \"Somalie\", dialCode: \"+252\", flag: \"🇸🇴\", digits: 8 },\n  { code: \"DJ\", name: \"Djibouti\", dialCode: \"+253\", flag: \"🇩🇯\", digits: 8 },\n  { code: \"ER\", name: \"Érythrée\", dialCode: \"+291\", flag: \"🇪🇷\", digits: 7 },\n  { code: \"SS\", name: \"Soudan du Sud\", dialCode: \"+211\", flag: \"🇸🇸\", digits: 9 },\n  { code: \"MG\", name: \"Madagascar\", dialCode: \"+261\", flag: \"🇲🇬\", digits: 9 },\n  { code: \"MU\", name: \"Maurice\", dialCode: \"+230\", flag: \"🇲🇺\", digits: 8 },\n  { code: \"SC\", name: \"Seychelles\", dialCode: \"+248\", flag: \"🇸🇨\", digits: 7 },\n  { code: \"KM\", name: \"Comores\", dialCode: \"+269\", flag: \"🇰🇲\", digits: 7 },\n\n  // ── Afrique Australe ──\n  { code: \"ZA\", name: \"Afrique du Sud\", dialCode: \"+27\", flag: \"🇿🇦\", digits: 9 },\n  { code: \"MZ\", name: \"Mozambique\", dialCode: \"+258\", flag: \"🇲🇿\", digits: 9 },\n  { code: \"ZW\", name: \"Zimbabwe\", dialCode: \"+263\", flag: \"🇿🇼\", digits: 9 },\n  { code: \"ZM\", name: \"Zambie\", dialCode: \"+260\", flag: \"🇿🇲\", digits: 9 },\n  { code: \"MW\", name: \"Malawi\", dialCode: \"+265\", flag: \"🇲🇼\", digits: 9 },\n  { code: \"BW\", name: \"Botswana\", dialCode: \"+267\", flag: \"🇧🇼\", digits: 8 },\n  { code: \"NA\", name: \"Namibie\", dialCode: \"+264\", flag: \"🇳🇦\", digits: 9 },\n  { code: \"AO\", name: \"Angola\", dialCode: \"+244\", flag: \"🇦🇴\", digits: 9 },\n  { code: \"SZ\", name: \"Eswatini\", dialCode: \"+268\", flag: \"🇸🇿\", digits: 8 },\n  { code: \"LS\", name: \"Lesotho\", dialCode: \"+266\", flag: \"🇱🇸\", digits: 8 },\n\n  // ── Afrique du Nord ──\n  { code: \"MA\", name: \"Maroc\", dialCode: \"+212\", flag: \"🇲🇦\", digits: 9 },\n  { code: \"DZ\", name: \"Algérie\", dialCode: \"+213\", flag: \"🇩🇿\", digits: 9 },\n  { code: \"TN\", name: \"Tunisie\", dialCode: \"+216\", flag: \"🇹🇳\", digits: 8 },\n  { code: \"LY\", name: \"Libye\", dialCode: \"+218\", flag: \"🇱🇾\", digits: 9 },\n  { code: \"EG\", name: \"Égypte\", dialCode: \"+20\", flag: \"🇪🇬\", digits: 10 },\n  { code: \"SD\", name: \"Soudan\", dialCode: \"+249\", flag: \"🇸🇩\", digits: 9 },\n\n  // ── Europe ──\n  { code: \"FR\", name: \"France\", dialCode: \"+33\", flag: \"🇫🇷\", digits: 9 },\n  { code: \"BE\", name: \"Belgique\", dialCode: \"+32\", flag: \"🇧🇪\", digits: 9 },\n  { code: \"CH\", name: \"Suisse\", dialCode: \"+41\", flag: \"🇨🇭\", digits: 9 },\n  { code: \"DE\", name: \"Allemagne\", dialCode: \"+49\", flag: \"🇩🇪\", digits: 10 },\n  { code: \"GB\", name: \"Royaume-Uni\", dialCode: \"+44\", flag: \"🇬🇧\", digits: 10 },\n  { code: \"ES\", name: \"Espagne\", dialCode: \"+34\", flag: \"🇪🇸\", digits: 9 },\n  { code: \"IT\", name: \"Italie\", dialCode: \"+39\", flag: \"🇮🇹\", digits: 10 },\n  { code: \"PT\", name: \"Portugal\", dialCode: \"+351\", flag: \"🇵🇹\", digits: 9 },\n  { code: \"NL\", name: \"Pays-Bas\", dialCode: \"+31\", flag: \"🇳🇱\", digits: 9 },\n  { code: \"SE\", name: \"Suède\", dialCode: \"+46\", flag: \"🇸🇪\", digits: 9 },\n  { code: \"NO\", name: \"Norvège\", dialCode: \"+47\", flag: \"🇳🇴\", digits: 8 },\n  { code: \"DK\", name: \"Danemark\", dialCode: \"+45\", flag: \"🇩🇰\", digits: 8 },\n  { code: \"FI\", name: \"Finlande\", dialCode: \"+358\", flag: \"🇫🇮\", digits: 10 },\n  { code: \"PL\", name: \"Pologne\", dialCode: \"+48\", flag: \"🇵🇱\", digits: 9 },\n  { code: \"AT\", name: \"Autriche\", dialCode: \"+43\", flag: \"🇦🇹\", digits: 10 },\n  { code: \"IE\", name: \"Irlande\", dialCode: \"+353\", flag: \"🇮🇪\", digits: 9 },\n  { code: \"GR\", name: \"Grèce\", dialCode: \"+30\", flag: \"🇬🇷\", digits: 10 },\n  { code: \"CZ\", name: \"Tchéquie\", dialCode: \"+420\", flag: \"🇨🇿\", digits: 9 },\n  { code: \"RO\", name: \"Roumanie\", dialCode: \"+40\", flag: \"🇷🇴\", digits: 9 },\n  { code: \"HU\", name: \"Hongrie\", dialCode: \"+36\", flag: \"🇭🇺\", digits: 9 },\n  { code: \"BG\", name: \"Bulgarie\", dialCode: \"+359\", flag: \"🇧🇬\", digits: 9 },\n  { code: \"HR\", name: \"Croatie\", dialCode: \"+385\", flag: \"🇭🇷\", digits: 9 },\n  { code: \"SK\", name: \"Slovaquie\", dialCode: \"+421\", flag: \"🇸🇰\", digits: 9 },\n  { code: \"SI\", name: \"Slovénie\", dialCode: \"+386\", flag: \"🇸🇮\", digits: 8 },\n  { code: \"RS\", name: \"Serbie\", dialCode: \"+381\", flag: \"🇷🇸\", digits: 9 },\n  { code: \"UA\", name: \"Ukraine\", dialCode: \"+380\", flag: \"🇺🇦\", digits: 9 },\n  { code: \"RU\", name: \"Russie\", dialCode: \"+7\", flag: \"🇷🇺\", digits: 10 },\n  { code: \"TR\", name: \"Turquie\", dialCode: \"+90\", flag: \"🇹🇷\", digits: 10 },\n  { code: \"LU\", name: \"Luxembourg\", dialCode: \"+352\", flag: \"🇱🇺\", digits: 9 },\n  { code: \"MC\", name: \"Monaco\", dialCode: \"+377\", flag: \"🇲🇨\", digits: 8 },\n  { code: \"IS\", name: \"Islande\", dialCode: \"+354\", flag: \"🇮🇸\", digits: 7 },\n  { code: \"AL\", name: \"Albanie\", dialCode: \"+355\", flag: \"🇦🇱\", digits: 9 },\n  { code: \"ME\", name: \"Monténégro\", dialCode: \"+382\", flag: \"🇲🇪\", digits: 8 },\n  { code: \"MK\", name: \"Macédoine du Nord\", dialCode: \"+389\", flag: \"🇲🇰\", digits: 8 },\n  { code: \"BA\", name: \"Bosnie-Herzégovine\", dialCode: \"+387\", flag: \"🇧🇦\", digits: 8 },\n  { code: \"LT\", name: \"Lituanie\", dialCode: \"+370\", flag: \"🇱🇹\", digits: 8 },\n  { code: \"LV\", name: \"Lettonie\", dialCode: \"+371\", flag: \"🇱🇻\", digits: 8 },\n  { code: \"EE\", name: \"Estonie\", dialCode: \"+372\", flag: \"🇪🇪\", digits: 8 },\n  { code: \"MT\", name: \"Malte\", dialCode: \"+356\", flag: \"🇲🇹\", digits: 8 },\n  { code: \"CY\", name: \"Chypre\", dialCode: \"+357\", flag: \"🇨🇾\", digits: 8 },\n  { code: \"MD\", name: \"Moldavie\", dialCode: \"+373\", flag: \"🇲🇩\", digits: 8 },\n  { code: \"GE\", name: \"Géorgie\", dialCode: \"+995\", flag: \"🇬🇪\", digits: 9 },\n  { code: \"AM\", name: \"Arménie\", dialCode: \"+374\", flag: \"🇦🇲\", digits: 8 },\n  { code: \"AZ\", name: \"Azerbaïdjan\", dialCode: \"+994\", flag: \"🇦🇿\", digits: 9 },\n  { code: \"BY\", name: \"Biélorussie\", dialCode: \"+375\", flag: \"🇧🇾\", digits: 9 },\n\n  // ── Amérique du Nord ──\n  { code: \"US\", name: \"États-Unis\", dialCode: \"+1\", flag: \"🇺🇸\", digits: 10 },\n  { code: \"CA\", name: \"Canada\", dialCode: \"+1\", flag: \"🇨🇦\", digits: 10 },\n  { code: \"MX\", name: \"Mexique\", dialCode: \"+52\", flag: \"🇲🇽\", digits: 10 },\n\n  // ── Amérique Centrale & Caraïbes ──\n  { code: \"HT\", name: \"Haïti\", dialCode: \"+509\", flag: \"🇭🇹\", digits: 8 },\n  { code: \"DO\", name: \"République dominicaine\", dialCode: \"+1809\", flag: \"🇩🇴\", digits: 10 },\n  { code: \"CU\", name: \"Cuba\", dialCode: \"+53\", flag: \"🇨🇺\", digits: 8 },\n  { code: \"JM\", name: \"Jamaïque\", dialCode: \"+1876\", flag: \"🇯🇲\", digits: 7 },\n  { code: \"GT\", name: \"Guatemala\", dialCode: \"+502\", flag: \"🇬🇹\", digits: 8 },\n  { code: \"HN\", name: \"Honduras\", dialCode: \"+504\", flag: \"🇭🇳\", digits: 8 },\n  { code: \"SV\", name: \"El Salvador\", dialCode: \"+503\", flag: \"🇸🇻\", digits: 8 },\n  { code: \"NI\", name: \"Nicaragua\", dialCode: \"+505\", flag: \"🇳🇮\", digits: 8 },\n  { code: \"CR\", name: \"Costa Rica\", dialCode: \"+506\", flag: \"🇨🇷\", digits: 8 },\n  { code: \"PA\", name: \"Panama\", dialCode: \"+507\", flag: \"🇵🇦\", digits: 8 },\n  { code: \"TT\", name: \"Trinité-et-Tobago\", dialCode: \"+1868\", flag: \"🇹🇹\", digits: 7 },\n\n  // ── Amérique du Sud ──\n  { code: \"BR\", name: \"Brésil\", dialCode: \"+55\", flag: \"🇧🇷\", digits: 11 },\n  { code: \"AR\", name: \"Argentine\", dialCode: \"+54\", flag: \"🇦🇷\", digits: 10 },\n  { code: \"CO\", name: \"Colombie\", dialCode: \"+57\", flag: \"🇨🇴\", digits: 10 },\n  { code: \"CL\", name: \"Chili\", dialCode: \"+56\", flag: \"🇨🇱\", digits: 9 },\n  { code: \"PE\", name: \"Pérou\", dialCode: \"+51\", flag: \"🇵🇪\", digits: 9 },\n  { code: \"VE\", name: \"Venezuela\", dialCode: \"+58\", flag: \"🇻🇪\", digits: 10 },\n  { code: \"EC\", name: \"Équateur\", dialCode: \"+593\", flag: \"🇪🇨\", digits: 9 },\n  { code: \"BO\", name: \"Bolivie\", dialCode: \"+591\", flag: \"🇧🇴\", digits: 8 },\n  { code: \"PY\", name: \"Paraguay\", dialCode: \"+595\", flag: \"🇵🇾\", digits: 9 },\n  { code: \"UY\", name: \"Uruguay\", dialCode: \"+598\", flag: \"🇺🇾\", digits: 8 },\n  { code: \"GY\", name: \"Guyana\", dialCode: \"+592\", flag: \"🇬🇾\", digits: 7 },\n  { code: \"SR\", name: \"Suriname\", dialCode: \"+597\", flag: \"🇸🇷\", digits: 7 },\n\n  // ── Moyen-Orient ──\n  { code: \"AE\", name: \"Émirats arabes unis\", dialCode: \"+971\", flag: \"🇦🇪\", digits: 9 },\n  { code: \"SA\", name: \"Arabie saoudite\", dialCode: \"+966\", flag: \"🇸🇦\", digits: 9 },\n  { code: \"QA\", name: \"Qatar\", dialCode: \"+974\", flag: \"🇶🇦\", digits: 8 },\n  { code: \"KW\", name: \"Koweït\", dialCode: \"+965\", flag: \"🇰🇼\", digits: 8 },\n  { code: \"BH\", name: \"Bahreïn\", dialCode: \"+973\", flag: \"🇧🇭\", digits: 8 },\n  { code: \"OM\", name: \"Oman\", dialCode: \"+968\", flag: \"🇴🇲\", digits: 8 },\n  { code: \"JO\", name: \"Jordanie\", dialCode: \"+962\", flag: \"🇯🇴\", digits: 9 },\n  { code: \"LB\", name: \"Liban\", dialCode: \"+961\", flag: \"🇱🇧\", digits: 8 },\n  { code: \"IQ\", name: \"Irak\", dialCode: \"+964\", flag: \"🇮🇶\", digits: 10 },\n  { code: \"IR\", name: \"Iran\", dialCode: \"+98\", flag: \"🇮🇷\", digits: 10 },\n  { code: \"IL\", name: \"Israël\", dialCode: \"+972\", flag: \"🇮🇱\", digits: 9 },\n  { code: \"PS\", name: \"Palestine\", dialCode: \"+970\", flag: \"🇵🇸\", digits: 9 },\n  { code: \"YE\", name: \"Yémen\", dialCode: \"+967\", flag: \"🇾🇪\", digits: 9 },\n  { code: \"SY\", name: \"Syrie\", dialCode: \"+963\", flag: \"🇸🇾\", digits: 9 },\n\n  // ── Asie ──\n  { code: \"CN\", name: \"Chine\", dialCode: \"+86\", flag: \"🇨🇳\", digits: 11 },\n  { code: \"JP\", name: \"Japon\", dialCode: \"+81\", flag: \"🇯🇵\", digits: 10 },\n  { code: \"KR\", name: \"Corée du Sud\", dialCode: \"+82\", flag: \"🇰🇷\", digits: 10 },\n  { code: \"IN\", name: \"Inde\", dialCode: \"+91\", flag: \"🇮🇳\", digits: 10 },\n  { code: \"PK\", name: \"Pakistan\", dialCode: \"+92\", flag: \"🇵🇰\", digits: 10 },\n  { code: \"BD\", name: \"Bangladesh\", dialCode: \"+880\", flag: \"🇧🇩\", digits: 10 },\n  { code: \"ID\", name: \"Indonésie\", dialCode: \"+62\", flag: \"🇮🇩\", digits: 10 },\n  { code: \"MY\", name: \"Malaisie\", dialCode: \"+60\", flag: \"🇲🇾\", digits: 10 },\n  { code: \"PH\", name: \"Philippines\", dialCode: \"+63\", flag: \"🇵🇭\", digits: 10 },\n  { code: \"TH\", name: \"Thaïlande\", dialCode: \"+66\", flag: \"🇹🇭\", digits: 9 },\n  { code: \"VN\", name: \"Vietnam\", dialCode: \"+84\", flag: \"🇻🇳\", digits: 9 },\n  { code: \"SG\", name: \"Singapour\", dialCode: \"+65\", flag: \"🇸🇬\", digits: 8 },\n  { code: \"HK\", name: \"Hong Kong\", dialCode: \"+852\", flag: \"🇭🇰\", digits: 8 },\n  { code: \"TW\", name: \"Taïwan\", dialCode: \"+886\", flag: \"🇹🇼\", digits: 9 },\n  { code: \"MM\", name: \"Myanmar\", dialCode: \"+95\", flag: \"🇲🇲\", digits: 9 },\n  { code: \"KH\", name: \"Cambodge\", dialCode: \"+855\", flag: \"🇰🇭\", digits: 9 },\n  { code: \"LA\", name: \"Laos\", dialCode: \"+856\", flag: \"🇱🇦\", digits: 10 },\n  { code: \"NP\", name: \"Népal\", dialCode: \"+977\", flag: \"🇳🇵\", digits: 10 },\n  { code: \"LK\", name: \"Sri Lanka\", dialCode: \"+94\", flag: \"🇱🇰\", digits: 9 },\n  { code: \"AF\", name: \"Afghanistan\", dialCode: \"+93\", flag: \"🇦🇫\", digits: 9 },\n  { code: \"UZ\", name: \"Ouzbékistan\", dialCode: \"+998\", flag: \"🇺🇿\", digits: 9 },\n  { code: \"KZ\", name: \"Kazakhstan\", dialCode: \"+7\", flag: \"🇰🇿\", digits: 10 },\n  { code: \"MN\", name: \"Mongolie\", dialCode: \"+976\", flag: \"🇲🇳\", digits: 8 },\n\n  // ── Océanie ──\n  { code: \"AU\", name: \"Australie\", dialCode: \"+61\", flag: \"🇦🇺\", digits: 9 },\n  { code: \"NZ\", name: \"Nouvelle-Zélande\", dialCode: \"+64\", flag: \"🇳🇿\", digits: 9 },\n  { code: \"FJ\", name: \"Fidji\", dialCode: \"+679\", flag: \"🇫🇯\", digits: 7 },\n  { code: \"PG\", name: \"Papouasie-Nouvelle-Guinée\", dialCode: \"+675\", flag: \"🇵🇬\", digits: 8 },\n];\n\n// ── Defaults ──\nexport const DEFAULT_COUNTRY_CODE = \"SN\";\nexport const DEFAULT_DIAL_CODE = \"+221\";\n\n// ── Sorted by ISO code (alphabetical) ──\nexport const COUNTRIES_SORTED_BY_CODE: Country[] = [...COUNTRIES].sort((a, b) => a.code.localeCompare(b.code));\n\n// ── Helpers ──\nexport const getCountryByCode = (code: string): Country | undefined =>\n  COUNTRIES.find(c => c.code.toLowerCase() === code.toLowerCase());\n\nexport const getCountryByDialCode = (dialCode: string): Country | undefined =>\n  COUNTRIES.find(c => c.dialCode === dialCode);\n\nexport const getDefaultCountry = (): Country =>\n  COUNTRIES.find(c => c.code === DEFAULT_COUNTRY_CODE)!;\n\nexport const searchCountries = (query: string): Country[] => {\n  const q = query.toLowerCase().trim();\n  if (!q) return COUNTRIES;\n  return COUNTRIES.filter(c =>\n    c.name.toLowerCase().includes(q) ||\n    c.dialCode.includes(q) ||\n    c.code.toLowerCase().includes(q)\n  );\n};\n","/**\n * Phone Input component for @ollaid/native-sso\n * Custom select overlay: dropdown shows ISO code, selected display shows only flag + dialCode\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { COUNTRIES_SORTED_BY_CODE, getCountryByDialCode, DEFAULT_DIAL_CODE } from '../utils/countries';\n\ninterface PhoneInputProps {\n  value: string;\n  onChange: (value: string) => void;\n  ccphone?: string;\n  onCcphoneChange?: (value: string) => void;\n  disabled?: boolean;\n  readOnly?: boolean;\n  error?: string;\n  placeholder?: string;\n  lockCcphone?: boolean;\n}\n\nexport function PhoneInput({\n  value, onChange, ccphone = DEFAULT_DIAL_CODE, onCcphoneChange, disabled = false, readOnly = false, error, placeholder = '77 123 45 67', lockCcphone = false,\n}: PhoneInputProps) {\n  const normalizedCcphone = ccphone || DEFAULT_DIAL_CODE;\n  const selectedCountry = getCountryByDialCode(normalizedCcphone) || COUNTRIES_SORTED_BY_CODE[0];\n  const [dropdownOpen, setDropdownOpen] = useState(false);\n  const dropdownRef = useRef<HTMLDivElement>(null);\n\n  // Close dropdown on outside click\n  useEffect(() => {\n    if (!dropdownOpen) return;\n    const handler = (e: MouseEvent) => {\n      if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) setDropdownOpen(false);\n    };\n    document.addEventListener('mousedown', handler);\n    return () => document.removeEventListener('mousedown', handler);\n  }, [dropdownOpen]);\n\n  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    if (disabled || readOnly) return;\n    const cleaned = e.target.value.replace(/\\D/g, '');\n    onChange(cleaned.slice(0, selectedCountry.digits));\n  };\n\n  const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n    if (disabled || readOnly) return;\n    e.preventDefault();\n    const pasted = e.clipboardData.getData('text').replace(/\\s+/g, '').replace(/\\D/g, '');\n    onChange(pasted.slice(0, selectedCountry.digits));\n  };\n\n  const handleSelect = (dialCode: string) => {\n    if (disabled || readOnly) return;\n    if (onCcphoneChange) onCcphoneChange(dialCode);\n    setDropdownOpen(false);\n  };\n\n  return (\n    <div>\n      <div style={{\n        display: 'flex', alignItems: 'center', border: `2px solid ${error ? '#ef4444' : '#d1d5db'}`,\n        borderRadius: '0.5rem', overflow: 'visible', opacity: (disabled || readOnly) ? 0.75 : 1,\n        backgroundColor: (disabled || readOnly) ? '#f9fafb' : 'white', position: 'relative',\n      }}>\n        {onCcphoneChange && !lockCcphone ? (\n          <div ref={dropdownRef} style={{ position: 'relative' }}>\n            {/* Display button: only flag + dialCode */}\n              <button\n              type=\"button\"\n              onClick={() => !(disabled || readOnly) && setDropdownOpen(!dropdownOpen)}\n              disabled={disabled || readOnly}\n              style={{\n                display: 'flex', alignItems: 'center', gap: '0.35rem', padding: '0.45rem 0.6rem',\n                backgroundColor: '#f9fafb', borderRight: '1px solid #e5e7eb', border: 'none',\n                cursor: (disabled || readOnly) ? 'not-allowed' : 'pointer', fontWeight: 500, color: '#374151',\n                fontSize: '0.85rem', whiteSpace: 'nowrap',\n              }}\n            >\n              <span style={{ fontSize: '1rem' }}>{selectedCountry.flag}</span>\n              <span>{selectedCountry.dialCode}</span>\n              <span style={{ fontSize: '0.625rem', marginLeft: '0.125rem' }}>▼</span>\n            </button>\n\n            {/* Dropdown list: shows CODE FLAG DIALCODE */}\n            {dropdownOpen && (\n              <div style={{\n                position: 'absolute', top: '100%', left: 0, zIndex: 50,\n                backgroundColor: 'white', border: '1px solid #d1d5db', borderRadius: '0.375rem',\n                boxShadow: '0 4px 12px rgba(0,0,0,0.15)', maxHeight: '15rem', overflowY: 'auto',\n                minWidth: '12rem', marginTop: '0.25rem',\n              }}>\n                {COUNTRIES_SORTED_BY_CODE.map((c) => (\n                  <button\n                    key={`${c.code}-${c.dialCode}`}\n                    type=\"button\"\n                      onClick={() => handleSelect(c.dialCode)}\n                      style={{\n                      display: 'flex', alignItems: 'center', gap: '0.5rem', width: '100%',\n                      padding: '0.45rem 0.75rem', border: 'none', cursor: 'pointer', fontSize: '0.85rem',\n                      backgroundColor: c.dialCode === normalizedCcphone ? '#f3f4f6' : 'transparent',\n                      textAlign: 'left',\n                    }}\n                    onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#f3f4f6')}\n                    onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = c.dialCode === normalizedCcphone ? '#f3f4f6' : 'transparent')}\n                  >\n                    <span style={{ fontWeight: 600, color: '#374151', minWidth: '1.75rem' }}>{c.code}</span>\n                    <span>{c.flag}</span>\n                    <span style={{ color: '#6b7280' }}>{c.dialCode}</span>\n                  </button>\n                ))}\n              </div>\n            )}\n          </div>\n        ) : (\n          /* Locked view: only flag + dialCode */\n          <div style={{ display: 'flex', alignItems: 'center', gap: '0.35rem', padding: '0.45rem 0.6rem', backgroundColor: '#f9fafb', borderRight: '1px solid #e5e7eb' }}>\n            <span style={{ fontSize: '1rem' }}>{selectedCountry.flag}</span>\n            <span style={{ fontWeight: 500, color: '#374151' }}>{selectedCountry.dialCode}</span>\n          </div>\n        )}\n          <input\n          type=\"tel\"\n          inputMode=\"numeric\"\n          value={value}\n          onChange={handleChange}\n          onPaste={handlePaste}\n          disabled={disabled}\n          readOnly={readOnly}\n          placeholder={placeholder}\n          style={{ flex: 1, padding: '0.45rem 0.6rem', fontSize: '0.95rem', border: 'none', outline: 'none', backgroundColor: 'transparent' }}\n        />\n      </div>\n      {error && <p style={{ fontSize: '0.875rem', color: '#ef4444', marginTop: '0.25rem' }}>{error}</p>}\n      <p style={{ fontSize: '0.75rem', color: '#6b7280', marginTop: '0.25rem' }}>\n        {selectedCountry.digits} chiffres requis ({value.length}/{selectedCountry.digits})\n      </p>\n    </div>\n  );\n}\n\nexport default PhoneInput;\n","/**\n * Apps Logo Slider for @ollaid/native-sso\n * Matches Web SSO badge style: horizontal marquee, small icons, no app names\n */\n\nimport { useEffect, useState } from 'react';\nimport { getNativeAuthConfig } from '../services/api';\n\ninterface AppsLogoSliderProps {\n  speed?: 'slow' | 'normal' | 'fast';\n  className?: string;\n  iamApiUrl?: string;\n}\n\ninterface AppInfo { id: number; name: string; logo: string | null; }\n\nexport function AppsLogoSlider({ className = '', iamApiUrl: iamApiUrlProp }: AppsLogoSliderProps) {\n  const [applications, setApplications] = useState<AppInfo[]>([]);\n  const [isLoading, setIsLoading] = useState(true);\n\n  useEffect(() => {\n    const resolvedIamApiUrl = iamApiUrlProp || getNativeAuthConfig().iamApiUrl;\n    if (!resolvedIamApiUrl) return;\n    const fetchApps = async () => {\n      try {\n        const iamBaseUrl = resolvedIamApiUrl.replace('/api', '');\n        const response = await fetch(`${iamBaseUrl}/api/public/applications`, { headers: { 'Accept': 'application/json' } });\n        if (response.ok) {\n          const data = await response.json();\n          if (data.success && Array.isArray(data.data)) setApplications(data.data);\n        }\n      } catch { /* ignore */ } finally { setIsLoading(false); }\n    };\n    fetchApps();\n  }, [iamApiUrlProp]);\n\n  const getLogoUrl = (logo: string | null): string | null => {\n    if (!logo) return null;\n    if (logo.startsWith('http')) return logo;\n    const resolvedUrl = iamApiUrlProp || getNativeAuthConfig().iamApiUrl;\n    return `${resolvedUrl.replace('/api', '')}/storage/applications/${logo}`;\n  };\n\n  if (isLoading) {\n    return (\n      <div className={className} style={{ width: '100%', height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n        <div style={{ display: 'flex', gap: '0.75rem', padding: '0 0.75rem' }}>\n          {[1, 2, 3, 4, 5].map((i) => (\n            <div key={i} style={{ width: '2rem', height: '2rem', borderRadius: '0.5rem', backgroundColor: '#e5e7eb', flexShrink: 0 }} />\n          ))}\n        </div>\n      </div>\n    );\n  }\n\n  if (applications.length === 0) return null;\n\n  // Triple for smooth infinite loop (same as web SSO)\n  const displayApps = [...applications, ...applications, ...applications];\n\n  return (\n    <div\n      className={className}\n      style={{ position: 'relative', width: '100%', height: '100%', overflow: 'hidden' }}\n    >\n      {/* Left gradient mask */}\n      <div style={{\n        position: 'absolute', left: 0, top: 0, bottom: 0, width: '1.5rem',\n        background: 'linear-gradient(to right, #ffffff, transparent)',\n        zIndex: 10, pointerEvents: 'none',\n      }} />\n\n      {/* Marquee content */}\n      <div style={{\n        display: 'flex',\n        animation: 'ollaid-marquee 20s linear infinite',\n        height: '100%',\n        alignItems: 'center',\n      }}>\n        {displayApps.map((app, index) => {\n          const logoUrl = getLogoUrl(app.logo);\n          return (\n            <div\n              key={`${app.id}-${index}`}\n              style={{ flexShrink: 0, padding: '0 0.75rem', display: 'flex', alignItems: 'center', height: '100%' }}\n            >\n              {logoUrl ? (\n                <img\n                  src={logoUrl}\n                  alt={app.name}\n                  style={{ width: '2rem', height: '2rem', objectFit: 'contain' }}\n                  onError={(e) => {\n                    const target = e.currentTarget;\n                    target.style.display = 'none';\n                    if (target.nextElementSibling) {\n                      (target.nextElementSibling as HTMLElement).style.display = 'flex';\n                    }\n                  }}\n                />\n              ) : null}\n              <div\n                style={{\n                  width: '2rem',\n                  height: '2rem',\n                  borderRadius: '0.5rem',\n                  backgroundColor: '#f3f4f6',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                  display: logoUrl ? 'none' : 'flex',\n                }}\n              >\n                <span style={{ fontSize: '0.75rem', fontWeight: 700, color: '#6b7280' }}>\n                  {app.name?.charAt(0)?.toUpperCase() || 'A'}\n                </span>\n              </div>\n            </div>\n          );\n        })}\n      </div>\n\n      {/* Right gradient mask */}\n      <div style={{\n        position: 'absolute', right: 0, top: 0, bottom: 0, width: '1.5rem',\n        background: 'linear-gradient(to left, #ffffff, transparent)',\n        zIndex: 10, pointerEvents: 'none',\n      }} />\n    </div>\n  );\n}\n\nexport default AppsLogoSlider;\n","/**\n * Service d'inscription Mobile SSO v1.0\n * Architecture Frontend-First : Appels directs à l'IAM via nativeAuth\n * \n * @version 2.7.9\n */\n\nimport { nativeAuthService } from './nativeAuth';\nimport { \n  ApiError, \n  fetchWithTimeout, \n  getHeaders,\n  getNativeAuthConfig, \n  isDebugMode,\n  ensureDeviceContext,\n} from './api';\n\nimport type {\n  MobileRegistrationFormData,\n  MobileVerifyOtpResponse,\n  MobileRegistrationCompleteResponse,\n  MobileResendOtpResponse,\n} from '../types/mobile';\nimport type { NativeInitResponse } from '../types/native';\n\nexport const mobileRegistrationService = {\n  /**\n   * Init registration via nativeAuth.register() (Frontend-First)\n   */\n  async init(\n    data: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'>\n  ): Promise<NativeInitResponse> {\n    if (!nativeAuthService.hasCredentials()) {\n      await nativeAuthService.loadCredentials();\n    }\n\n    return nativeAuthService.register({\n      name: data.name,\n      email: data.email,\n      ccphone: data.ccphone,\n      phone: data.phone,\n      town: data.town,\n      country: data.country,\n      registration_type: data.registration_type,\n    });\n  },\n\n  /**\n   * Verify OTP via nativeAuth.validate()\n   */\n  async verifyOtp(\n    processToken: string,\n    otpCode: string\n  ): Promise<MobileVerifyOtpResponse> {\n    const config = getNativeAuthConfig();\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/validate (registration OTP)');\n    }\n\n    return fetchWithTimeout<MobileVerifyOtpResponse>(\n      `${config.iamApiUrl}/sso/native/validate`,\n      {\n        method: 'POST',\n        headers: getHeaders(undefined, false),\n        body: JSON.stringify({\n          process_token: processToken,\n          otp_code: otpCode,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  /**\n   * Complete registration with password\n   */\n  async complete(\n    processToken: string,\n    password: string\n  ): Promise<MobileRegistrationCompleteResponse> {\n    const config = getNativeAuthConfig();\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/validate (registration complete)');\n    }\n\n    return fetchWithTimeout<MobileRegistrationCompleteResponse>(\n      `${config.iamApiUrl}/sso/native/validate`,\n      {\n        method: 'POST',\n        headers: getHeaders(undefined, false),\n        body: JSON.stringify({\n          process_token: processToken,\n          password,\n          password_confirmation: password,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  /**\n   * Complete phone-only registration (no password)\n   */\n  async completePhoneOnly(\n    processToken: string\n  ): Promise<MobileRegistrationCompleteResponse> {\n    const config = getNativeAuthConfig();\n    await ensureDeviceContext();\n\n    if (isDebugMode()) {\n      console.log('📤 [IAM] POST /sso/native/validate (phone-only complete)');\n    }\n\n    return fetchWithTimeout<MobileRegistrationCompleteResponse>(\n      `${config.iamApiUrl}/sso/native/validate`,\n      {\n        method: 'POST',\n        headers: getHeaders(undefined, false),\n        body: JSON.stringify({\n          process_token: processToken,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  /**\n   * Resend OTP\n   */\n  async resendOtp(processToken: string): Promise<MobileResendOtpResponse> {\n    return nativeAuthService.resendOtp(processToken) as unknown as MobileResendOtpResponse;\n  },\n};\n\nexport default mobileRegistrationService;\n","/**\n * Hook d'inscription Mobile SSO v1.0\n * Gère le flow: init → verify-otp → complete\n * \n * @version 2.7.9\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { mobileRegistrationService } from '../services/mobileRegistration';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { setNativeAuthConfig, ApiError } from '../services/api';\nimport type { \n  MobileRegistrationFormData,\n  AccountType,\n} from '../types/mobile';\n\ninterface RegistrationConflict {\n  type: 'email' | 'phone';\n  masked_identifier: string;\n  options: {\n    can_login: boolean;\n    can_recover_by_email: boolean;\n    can_recover_by_sms: boolean;\n    masked_email?: string;\n    masked_phone?: string;\n  };\n}\n\ninterface ApiConflictResponse {\n  conflict?: RegistrationConflict;\n  message?: string;\n  error_type?: string;\n}\n\ninterface RegistrationState {\n  processToken: string | null;\n  status: 'idle' | 'pending_otp' | 'pending_password' | 'pending_registration' | 'completed';\n  loading: boolean;\n  error: string | null;\n  conflict: RegistrationConflict | null;\n  otpMethod: 'email' | 'sms' | null;\n  otpSentTo: string | null;\n}\n\nfunction getErrorMessage(err: unknown, context: string): string {\n  if (err instanceof Error) {\n    if (err.message.includes('fetch') || err.message.includes('network')) {\n      return 'Vérifiez votre connexion Internet';\n    }\n    if (err.message.includes('timeout')) {\n      return 'Le serveur met trop de temps à répondre';\n    }\n    return err.message;\n  }\n  return `Erreur lors de ${context}`;\n}\n\nexport interface UseMobileRegistrationOptions {\n  saasApiUrl: string;\n  iamApiUrl: string;\n  \n}\n\nexport function useMobileRegistration(options?: UseMobileRegistrationOptions) {\n  const configuredRef = useRef(false);\n\n  useEffect(() => {\n    if (options && !configuredRef.current) {\n      setNativeAuthConfig({ \n        saasApiUrl: options.saasApiUrl, \n        iamApiUrl: options.iamApiUrl,\n      });\n      configuredRef.current = true;\n    }\n  }, [options]);\n\n  const [state, setState] = useState<RegistrationState>({\n    processToken: null,\n    status: 'idle',\n    loading: false,\n    error: null,\n    conflict: null,\n    otpMethod: null,\n    otpSentTo: null,\n  });\n\n  const [formData, setFormData] = useState<Partial<MobileRegistrationFormData>>({});\n  const [accountType, setAccountType] = useState<AccountType>('email');\n\n  const updateFormData = useCallback((data: Partial<MobileRegistrationFormData>) => {\n    setFormData(prev => ({ ...prev, ...data }));\n  }, []);\n\n  const initRegistration = useCallback(async (\n    data: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'>\n  ) => {\n    setState(prev => ({ ...prev, loading: true, error: null, conflict: null }));\n    \n    const enrichedData = {\n      ...data,\n      email: accountType === 'phone-only' ? '' : data.email,\n      registration_type: accountType === 'phone-only' ? 'phone' as const : 'email' as const,\n    };\n    \n    setFormData(enrichedData);\n\n    try {\n      if (!nativeAuthService.hasCredentials()) {\n        await nativeAuthService.loadCredentials();\n      }\n\n      const response = await mobileRegistrationService.init(enrichedData);\n\n      if (response.success && response.process_token) {\n        setState(prev => ({\n          ...prev,\n          processToken: response.process_token!,\n          status: 'pending_otp',\n          otpMethod: response.otp_method || prev.otpMethod,\n          otpSentTo: response.otp_sent_to || prev.otpSentTo,\n          loading: false,\n          conflict: null,\n        }));\n        return { \n          success: true, \n          otp_code_dev: response.otp_code_dev,\n          otp_method: response.otp_method,\n          otp_sent_to: response.otp_sent_to,\n        };\n      }\n\n      if (response.conflict) {\n        setState(prev => ({\n          ...prev,\n          loading: false,\n          error: response.message || 'Ce compte existe déjà',\n          conflict: response.conflict!,\n        }));\n        return { success: false, error_type: response.error_type };\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Erreur lors de l\\'inscription',\n        conflict: null,\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      // Extract conflict data from 409 responses\n      if (err instanceof ApiError && err.statusCode === 409 && err.response) {\n        const resp = err.response as ApiConflictResponse;\n        if (resp.conflict) {\n          setState(prev => ({\n            ...prev,\n            loading: false,\n            error: resp.message || 'Ce compte existe déjà',\n            conflict: resp.conflict ?? null,\n          }));\n          return { success: false, error_type: resp.error_type };\n        }\n      }\n\n      const message = getErrorMessage(err, 'l\\'inscription');\n      setState(prev => ({ ...prev, loading: false, error: message, conflict: null }));\n      return { success: false };\n    }\n  }, [accountType]);\n\n  const verifyOtp = useCallback(async (otpCode: string) => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      const response = await mobileRegistrationService.verifyOtp(state.processToken, otpCode);\n\n      if (response.success) {\n        if (response.status === 'completed' && response.callback_token) {\n          setState(prev => ({ ...prev, status: 'completed', loading: false }));\n          return { success: true, completed: true, callback_token: response.callback_token };\n        }\n\n        setState(prev => ({ ...prev, status: 'pending_password', loading: false }));\n        return { success: true, completed: false };\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Code incorrect',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const message = getErrorMessage(err, 'la vérification');\n      setState(prev => ({ ...prev, loading: false, error: message }));\n      return { success: false };\n    }\n  }, [state.processToken]);\n\n  const completeRegistration = useCallback(async (password: string) => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      const response = await mobileRegistrationService.complete(state.processToken, password);\n\n      if (response.success && response.callback_token) {\n        setState(prev => ({ ...prev, status: 'completed', loading: false }));\n        return { success: true, callback_token: response.callback_token };\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Erreur lors de la finalisation',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const message = getErrorMessage(err, 'la finalisation');\n      setState(prev => ({ ...prev, loading: false, error: message }));\n      return { success: false };\n    }\n  }, [state.processToken]);\n\n  const completePhoneOnlyRegistration = useCallback(async () => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      const response = await mobileRegistrationService.completePhoneOnly(state.processToken);\n\n      if (response.success && response.callback_token) {\n        setState(prev => ({ ...prev, status: 'completed', loading: false }));\n        return { success: true, callback_token: response.callback_token };\n      }\n\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error: response.message || 'Erreur lors de la finalisation',\n      }));\n      return { success: false, error_type: response.error_type };\n    } catch (err) {\n      const message = getErrorMessage(err, 'la finalisation');\n      setState(prev => ({ ...prev, loading: false, error: message }));\n      return { success: false };\n    }\n  }, [state.processToken]);\n\n  const resendOtp = useCallback(async () => {\n    if (!state.processToken) {\n      return { success: false, error: 'Session invalide' };\n    }\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    try {\n      const response = await mobileRegistrationService.resendOtp(state.processToken);\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        otpMethod: response.otp_method || prev.otpMethod,\n        otpSentTo: response.otp_sent_to || prev.otpSentTo,\n      }));\n      return { \n        success: response.success, \n        cooldown: response.cooldown_remaining,\n        otp_code_dev: response.otp_code_dev,\n        otp_method: response.otp_method,\n        otp_sent_to: response.otp_sent_to,\n      };\n    } catch (err) {\n      const message = getErrorMessage(err, 'le renvoi');\n      setState(prev => ({ ...prev, loading: false, error: message }));\n      return { success: false };\n    }\n  }, [state.processToken]);\n\n  const reset = useCallback(() => {\n    setState({\n      processToken: null,\n      status: 'idle',\n      loading: false,\n      error: null,\n      conflict: null,\n      otpMethod: null,\n      otpSentTo: null,\n    });\n    setFormData({});\n    setAccountType('email');\n  }, []);\n\n  const clearError = useCallback(() => {\n    setState(prev => ({ ...prev, error: null, conflict: null }));\n  }, []);\n\n  return {\n    processToken: state.processToken,\n    status: state.status,\n    formData,\n    loading: state.loading,\n    error: state.error,\n    conflict: state.conflict,\n    otpMethod: state.otpMethod,\n    otpSentTo: state.otpSentTo,\n    isCompleted: state.status === 'completed',\n    hasConflict: state.conflict !== null,\n    \n    accountType,\n    setAccountType,\n    isPhoneOnly: accountType === 'phone-only',\n\n    updateFormData,\n    initRegistration,\n    verifyOtp,\n    completeRegistration,\n    completePhoneOnlyRegistration,\n    resendOtp,\n    reset,\n    clearError,\n  };\n}\n\nexport default useMobileRegistration;\n","/**\n * Signup Modal for @ollaid/native-sso — Design aligned with web SSO\n * Full signup flow: intro → account-type → info → OTP → password → confirm → success\n * \n * @version 2.7.9\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n  Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter,\n  Button, Input, Label,\n  IconShieldCheck, IconCheckCircle2, IconMail, IconSmartphone, IconArrowLeft,\n  IconKeyRound, IconLock, IconLoader2,\n  IconHome, IconCalendar, IconBell, IconMessageCircle, IconUsers, IconSettings,\n  IconLink,\n} from './ui';\nimport PhoneInput from './PhoneInput';\nimport OTPInput from './OTPInput';\nimport AppsLogoSlider from './AppsLogoSlider';\nimport PasswordRecoveryModal from './PasswordRecoveryModal';\nimport { useMobileRegistration } from '../hooks/useMobileRegistration';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { COUNTRIES_SORTED_BY_CODE, getCountryByCode, DEFAULT_COUNTRY_CODE } from '../utils/countries';\nimport type { UserInfos } from '../types/native';\nimport type { MobileRegistrationFormData } from '../types/mobile';\nimport packageFavicon from '../logo/favicon.png';\n\ntype SignupStep = 'intro' | 'account-type' | 'info' | 'otp' | 'password' | 'confirm';\n\nconst SSO_VERSION = '2.8.2';\n\nexport interface SignupModalProps {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  onSwitchToLogin: () => void;\n  onSignupSuccess: (token: string, user: UserInfos) => void;\n  saasApiUrl: string;\n  iamApiUrl: string;\n  logoUrl?: string;\n  /** Type de compte par défaut à persister dans le storage du package */\n  defaultAccountType?: 'user' | 'client';\n  homeUrl?: string;\n  /** Called when conflict resolution wants to switch to login with a pre-filled phone */\n  onSwitchToLoginWithPhone?: (phone: string) => void;\n}\n\nconst C = {\n  primary: '#002147',\n  accent: '#e8430a',\n  green: '#16a34a',\n  greenBg: '#dcfce7',\n  gray100: '#f3f4f6',\n  gray200: '#e5e7eb',\n  gray500: '#6b7280',\n  gray700: '#374151',\n  gray900: '#111827',\n  red: '#dc2626',\n  redBg: '#fef2f2',\n  amber: '#f59e0b',\n  amberBg: '#fef3c7',\n  white: '#ffffff',\n} as const;\n\nconst iconCircle = (bg: string, size = '3rem'): React.CSSProperties => ({\n  margin: '0 auto', width: size, height: size, backgroundColor: bg, borderRadius: '50%',\n  display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst brandBadgeCircle = (bg: string): React.CSSProperties => ({\n  width: '2.9rem',\n  height: '2.9rem',\n  borderRadius: '9999px',\n  backgroundColor: bg,\n  border: `1px solid ${C.gray200}`,\n  boxShadow: '0 8px 18px rgba(0, 0, 0, 0.08)',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  padding: '0.5rem',\n  boxSizing: 'border-box',\n  overflow: 'hidden',\n  flexShrink: 0,\n});\n\nconst brandLinkPill: React.CSSProperties = {\n  width: '2.1rem',\n  height: '2.1rem',\n  borderRadius: '9999px',\n  backgroundColor: C.gray100,\n  border: `1px solid ${C.gray200}`,\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  flexShrink: 0,\n  boxShadow: '0 4px 10px rgba(0, 0, 0, 0.05)',\n};\n\nconst brandRowStyle: React.CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  gap: '0.65rem',\n  marginBottom: '0.9rem',\n};\n\nconst backBtnStyle: React.CSSProperties = {\n  position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n  cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nconst linkStyle: React.CSSProperties = {\n  color: C.primary, cursor: 'pointer', background: 'none', border: 'none',\n  fontWeight: 500, textDecoration: 'underline', fontSize: '0.875rem',\n};\n\nconst TOTAL_STEPS = 6;\n\nfunction StepIndicator({ current }: { current: number }) {\n  return (\n    <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginTop: '0.75rem' }}>\n      {Array.from({ length: TOTAL_STEPS }, (_, i) => (\n        <div key={i} style={{\n          width: i + 1 === current ? '1.5rem' : '0.5rem',\n          height: '0.5rem',\n          borderRadius: '9999px',\n          backgroundColor: i + 1 <= current ? C.accent : C.gray200,\n          transition: 'all 0.2s',\n        }} />\n      ))}\n      <span style={{ fontSize: '0.75rem', color: C.gray500, marginLeft: '0.5rem' }}>Étape {current}/{TOTAL_STEPS}</span>\n    </div>\n  );\n}\n\n// Orbit success animation\nfunction SuccessOrbit() {\n  const orbitIcons = [IconHome, IconCalendar, IconBell, IconMessageCircle, IconUsers, IconSettings];\n  return (\n    <div style={{ position: 'relative', width: '10rem', height: '10rem', margin: '0 auto' }}>\n      {/* Center brand link */}\n      <div style={{\n        position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)',\n        width: '4rem', height: '4rem', backgroundColor: C.greenBg, borderRadius: '50%',\n        display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 2,\n      }}>\n        <IconLink style={{ width: '1.7rem', height: '1.7rem', color: C.green }} />\n      </div>\n      {/* Orbiting icons */}\n      {orbitIcons.map((Icon, i) => {\n        const angle = (i * 360) / orbitIcons.length;\n        return (\n          <div key={i} style={{\n            position: 'absolute', top: '50%', left: '50%', width: '2rem', height: '2rem',\n            transform: `rotate(${angle}deg) translate(4rem) rotate(-${angle}deg)`,\n            transformOrigin: '0 0',\n            animation: `spin ${8 + i}s linear infinite`,\n          }}>\n            <div style={{\n              width: '2rem', height: '2rem', backgroundColor: C.gray100, borderRadius: '50%',\n              display: 'flex', alignItems: 'center', justifyContent: 'center',\n            }}>\n              <Icon style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n            </div>\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n\nexport function SignupModal({ open, onOpenChange, onSwitchToLogin, onSignupSuccess, saasApiUrl, iamApiUrl, logoUrl, defaultAccountType, homeUrl, onSwitchToLoginWithPhone }: SignupModalProps) {\n  const {\n    status, formData, loading: regLoading, error: regError, conflict, accountType, setAccountType, isPhoneOnly, otpMethod, otpSentTo,\n    updateFormData, initRegistration, verifyOtp, completeRegistration, resendOtp, reset: resetReg, clearError,\n  } = useMobileRegistration({ saasApiUrl, iamApiUrl });\n\n  const [showPasswordRecovery, setShowPasswordRecovery] = useState(false);\n\n  const [step, setStep] = useState<SignupStep>('intro');\n  const [otpCode, setOtpCode] = useState('');\n  const [password, setPassword] = useState('');\n  const [passwordConfirm, setPasswordConfirm] = useState('');\n  const [localError, setLocalError] = useState<string | null>(null);\n  const [resendCooldown, setResendCooldown] = useState(0);\n  const [signupSuccess, setSignupSuccess] = useState(false);\n  const [signupData, setSignupData] = useState<{ token: string; user: UserInfos } | null>(null);\n\n  const error = localError || regError;\n  const primaryLogo = logoUrl || null;\n  const showHomeLink = Boolean(homeUrl);\n\n  useEffect(() => { if (!open) { setStep('intro'); setOtpCode(''); setPassword(''); setPasswordConfirm(''); setLocalError(null); setSignupSuccess(false); setSignupData(null); setResendCooldown(0); resetReg(); } }, [open, resetReg]);\n  useEffect(() => { if (status === 'pending_otp') { setStep('otp'); setResendCooldown(60); } else if (status === 'pending_password') setStep('password'); }, [status]);\n  useEffect(() => { if (resendCooldown > 0) { const t = setTimeout(() => setResendCooldown(r => r - 1), 1000); return () => clearTimeout(t); } }, [resendCooldown]);\n  useEffect(() => { if (signupSuccess && signupData) { const t = setTimeout(() => onSignupSuccess(signupData.token, signupData.user), 2000); return () => clearTimeout(t); } }, [signupSuccess, signupData, onSignupSuccess]);\n\n  const exchangeCallbackToken = async (callbackToken: string) => {\n    try {\n      const response = await nativeAuthService.exchange(callbackToken);\n      if (response.iam_token && response.reference && response.alias_reference) {\n        setSignupData({\n          token: response.iam_token,\n          user: {\n            ...response.user_infos,\n            reference: response.reference,\n            alias_reference: response.alias_reference,\n          } as UserInfos,\n        });\n        setSignupSuccess(true);\n      } else setLocalError(\"Erreur lors de la finalisation de l'inscription\");\n    } catch { setLocalError('Erreur de connexion au serveur'); }\n  };\n\n  const handleInfoSubmit = async (e: React.FormEvent) => {\n    e.preventDefault(); setLocalError(null); clearError();\n    if (!formData.name?.trim()) { setLocalError('Le nom est requis'); return; }\n    if (!isPhoneOnly && !formData.email?.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n    if (!formData.phone?.trim() || (formData.phone?.length || 0) < 6) { setLocalError('Numéro de téléphone invalide'); return; }\n    if (formData.ccphone === '+221' && formData.phone?.length !== 9) { setLocalError('Le numéro sénégalais doit contenir exactement 9 chiffres'); return; }\n    if (isPhoneOnly && formData.ccphone !== '+221') { setLocalError(\"L'inscription par téléphone est réservée aux numéros sénégalais (+221)\"); return; }\n    if (!formData.town?.trim()) { setLocalError('La ville est requise'); return; }\n    if (!formData.country?.trim()) { setLocalError('Le pays est requis'); return; }\n    const registrationData: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'> = {\n      name: formData.name || '',\n      email: formData.email || '',\n      ccphone: formData.ccphone || '+221',\n      phone: formData.phone || '',\n      town: formData.town,\n      country: formData.country,\n    };\n    await initRegistration(registrationData);\n  };\n\n  const handleOTPSubmit = async () => {\n    if (otpCode.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n    setLocalError(null); clearError();\n    const result = await verifyOtp(otpCode);\n    if (result.success && result.completed && result.callback_token) await exchangeCallbackToken(result.callback_token);\n  };\n\n  const handlePasswordSubmit = (e: React.FormEvent) => {\n    e.preventDefault(); setLocalError(null);\n    if (!password || password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n    if (password !== passwordConfirm) { setLocalError('Les mots de passe ne correspondent pas'); return; }\n    setStep('confirm');\n  };\n\n  const handleConfirm = async () => {\n    setLocalError(null); clearError();\n    const result = await completeRegistration(password);\n    if (result.success && result.callback_token) await exchangeCallbackToken(result.callback_token);\n  };\n\n  const handleResendOTP = async () => { if (resendCooldown > 0) return; const r = await resendOtp(); if (r.success) setResendCooldown(r.cooldown || 60); };\n\n  const goToStep = (s: SignupStep) => { setLocalError(null); clearError(); setStep(s); };\n\n  const handleAccountTypeSelect = (type: 'email' | 'phone-only') => {\n    setAccountType(type);\n    if (type === 'phone-only') updateFormData({ ccphone: '+221', country: 'SN', email: '' });\n    else if (!formData.country) updateFormData({ country: DEFAULT_COUNTRY_CODE });\n    goToStep('info');\n  };\n\n  const stepNumber = { intro: 1, 'account-type': 2, info: 3, otp: 4, password: 5, confirm: 6 }[step];\n\n  const renderError = () => error ? <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg, color: C.red, fontSize: '0.875rem' }}>{error}</div> : null;\n  const getOtpDeliveryLabel = (method?: 'email' | 'sms' | null, sentTo?: string | null) => {\n    if (method === 'sms') {\n      return sentTo ? `par SMS au ${sentTo}` : 'par SMS';\n    }\n    if (method === 'email') {\n      return sentTo ? `par email à ${sentTo}` : 'par email';\n    }\n\n    return accountType === 'phone-only'\n      ? `par SMS au ${formData.ccphone || '+221'} ${formData.phone || ''}`.trim()\n      : formData.email\n        ? `par email à ${formData.email}`\n        : 'pour vérification';\n  };\n  const BrandHeader = ({ color = C.primary }: { color?: string }) => (\n    <div style={brandRowStyle}>\n      <div style={brandBadgeCircle(C.white)}>\n        {primaryLogo ? (\n          <img src={primaryLogo} alt=\"Application\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n        ) : (\n          <IconShieldCheck style={{ width: '1.4rem', height: '1.4rem', color }} />\n        )}\n      </div>\n      <div style={brandLinkPill} aria-hidden=\"true\">\n        <IconLink style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n      </div>\n      <div style={brandBadgeCircle(C.white)}>\n        <img src={packageFavicon} alt=\"Ollaid SSO\" style={{ width: '100%', height: '100%', objectFit: 'contain' }} />\n      </div>\n    </div>\n  );\n\n  return (\n    <>\n    <Dialog open={open} onOpenChange={onOpenChange}>\n      <DialogContent>\n\n        {/* ===================== SUCCESS ===================== */}\n        {signupSuccess && signupData ? (\n          <DialogHeader style={{ textAlign: 'center' }}>\n            <SuccessOrbit />\n            <DialogTitle>Félicitations !</DialogTitle>\n            <DialogDescription>\n              Votre compte a été créé avec succès. Bienvenue {formData.name} !\n            </DialogDescription>\n            <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', fontSize: '0.875rem', color: C.gray500, marginTop: '1rem' }}>\n              <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n              Connexion automatique en cours...\n            </div>\n          </DialogHeader>\n        ) : (\n          <>\n            {/* ===== INTRO ===== */}\n            {step === 'intro' && (\n              <>\n                <DialogHeader style={{ textAlign: 'center' }}>\n                  <BrandHeader color={C.accent} />\n                  <DialogTitle>Ouvrez un compte Ollaid</DialogTitle>\n                  <DialogDescription>Un compte unique qui vous donne accès à toutes les applications</DialogDescription>\n                </DialogHeader>\n                <DialogBody>\n                  <AppsLogoSlider iamApiUrl={iamApiUrl} />\n                  <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', fontSize: '0.875rem', color: C.gray500, margin: '0.75rem 0' }}>\n                    {['Un seul compte pour toutes les applications', 'Plus besoin de multiples mots de passe', 'Connexion simplifiée et sécurisée'].map(text => (\n                      <div key={text} style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n                        <IconCheckCircle2 style={{ width: '1.25rem', height: '1.25rem', color: C.green, flexShrink: 0 }} />\n                        {text}\n                      </div>\n                    ))}\n                  </div>\n                  <StepIndicator current={1} />\n                </DialogBody>\n                <DialogFooter>\n                  <Button onClick={() => goToStep('account-type')} style={{ width: '100%' }}>Suivant →</Button>\n                  <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n                    <span style={{ color: C.gray500 }}>Déjà un compte ? </span>\n                    <button type=\"button\" style={linkStyle} onClick={onSwitchToLogin}>Connectez-vous</button>\n                  </div>\n                  {showHomeLink && (\n                    <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n                      <button\n                        type=\"button\"\n                        style={linkStyle}\n                        onClick={() => { if (homeUrl) window.location.href = homeUrl; }}\n                      >\n                        Retourner à l'accueil\n                      </button>\n                    </div>\n                  )}\n                  <div style={{ textAlign: 'center', fontSize: '0.72rem', color: C.gray500, paddingTop: '0.25rem' }}>\n                    OLLAID SSO v{SSO_VERSION} · © 2026 OLLAID\n                  </div>\n                </DialogFooter>\n              </>\n            )}\n\n            {/* ===== ACCOUNT TYPE ===== */}\n            {step === 'account-type' && (\n              <>\n                <button onClick={() => goToStep('intro')} style={backBtnStyle} type=\"button\">\n                  <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n                </button>\n                <DialogHeader style={{ textAlign: 'center' }}>\n                  <BrandHeader color={C.primary} />\n                  <DialogTitle>Choisissez votre type de compte</DialogTitle>\n                </DialogHeader>\n                <DialogBody>\n                  <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n                    <button type=\"button\" onClick={() => handleAccountTypeSelect('email')}\n                      style={{ width: '100%', padding: '1rem', border: `2px solid ${C.gray200}`, borderRadius: '0.5rem', textAlign: 'left', cursor: 'pointer', background: C.white, display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n                      <div style={{ width: '2.5rem', height: '2.5rem', backgroundColor: C.accent, borderRadius: '0.5rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n                        <IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n                      </div>\n                      <div>\n                        <div style={{ fontWeight: 600, color: C.gray900 }}>Email + Téléphone</div>\n                        <div style={{ fontSize: '0.875rem', color: C.gray500 }}>Compte complet</div>\n                      </div>\n                    </button>\n                    <button type=\"button\" onClick={() => handleAccountTypeSelect('phone-only')}\n                      style={{ width: '100%', padding: '1rem', border: `2px solid ${C.gray200}`, borderRadius: '0.5rem', textAlign: 'left', cursor: 'pointer', background: C.white, display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n                      <div style={{ width: '2.5rem', height: '2.5rem', backgroundColor: C.accent, borderRadius: '0.5rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n                        <IconSmartphone style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n                      </div>\n                      <div>\n                        <div style={{ fontWeight: 600, color: C.gray900 }}>Téléphone uniquement</div>\n                        <div style={{ fontSize: '0.875rem', color: C.gray500 }}>🇸🇳 Sénégal uniquement</div>\n                      </div>\n                    </button>\n                  </div>\n                  <StepIndicator current={2} />\n                </DialogBody>\n              </>\n            )}\n\n            {/* ===== INFO (with conflict resolution) ===== */}\n            {step === 'info' && (\n              <>\n                <button onClick={() => goToStep('account-type')} style={backBtnStyle} type=\"button\">\n                  <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n                </button>\n\n                {/* ---- CONFLICT VIEW ---- */}\n                {conflict ? (\n                  <>\n                    <DialogHeader style={{ textAlign: 'center' }}>\n                      <BrandHeader color={C.amber} />\n                      <DialogTitle>\n                        {conflict.type === 'phone' ? 'Numéro déjà utilisé' : 'Email déjà utilisé'}\n                      </DialogTitle>\n                      <DialogDescription>\n                        {conflict.type === 'phone'\n                          ? `Le numéro ${formData.ccphone || ''} ${formData.phone || ''} est déjà associé à un compte.`\n                          : `L'adresse ${formData.email || ''} est déjà associée à un compte.`}\n                        {' '}S'il s'agit du vôtre, connectez-vous.\n                      </DialogDescription>\n                    </DialogHeader>\n                    <DialogFooter style={{ borderTop: 'none' }}>\n                      {conflict.type === 'phone' && formData.ccphone === '+221' && conflict.options?.can_login && (\n                        <Button\n                          onClick={() => {\n                            const fullPhone = formData.phone || '';\n                            if (onSwitchToLoginWithPhone) onSwitchToLoginWithPhone(fullPhone);\n                            else onSwitchToLogin();\n                          }}\n                          style={{ width: '100%' }}\n                        >\n                          <IconSmartphone style={{ width: '1rem', height: '1rem' }} />\n                          Se connecter par téléphone\n                        </Button>\n                      )}\n                      {(conflict.type === 'email' || (conflict.type === 'phone' && formData.ccphone !== '+221')) && conflict.options?.can_login && (\n                        <Button onClick={onSwitchToLogin} style={{ width: '100%' }}>\n                          Se connecter\n                        </Button>\n                      )}\n                      {!isPhoneOnly && (conflict.options?.can_recover_by_email || conflict.options?.can_recover_by_sms) && (\n                        <Button variant=\"outline\" onClick={() => setShowPasswordRecovery(true)} style={{ width: '100%' }}>\n                          Récupérer mon compte\n                        </Button>\n                      )}\n                      <Button variant=\"outline\" onClick={() => clearError()} style={{ width: '100%' }}>\n                        {conflict.type === 'phone' ? 'Changer le numéro' : \"Changer l'email\"}\n                      </Button>\n                      {conflict.options?.masked_email && (\n                        <div style={{ padding: '0.75rem', backgroundColor: C.gray100, borderRadius: '0.375rem', fontSize: '0.8125rem', color: C.gray500, textAlign: 'center' }}>\n                          Email lié : <strong style={{ color: C.gray900 }}>{conflict.options.masked_email}</strong>\n                        </div>\n                      )}\n                      {conflict.options?.masked_phone && (\n                        <div style={{ padding: '0.75rem', backgroundColor: C.gray100, borderRadius: '0.375rem', fontSize: '0.8125rem', color: C.gray500, textAlign: 'center' }}>\n                          Téléphone lié : <strong style={{ color: C.gray900 }}>{conflict.options.masked_phone}</strong>\n                        </div>\n                      )}\n                    </DialogFooter>\n                  </>\n                ) : (\n                  /* ---- NORMAL INFO FORM ---- */\n                  <>\n                    <DialogHeader style={{ textAlign: 'center' }}>\n                      <BrandHeader color={C.primary} />\n                      <DialogTitle>Créer votre compte</DialogTitle>\n                    </DialogHeader>\n                    <form onSubmit={handleInfoSubmit} style={{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0 }}>\n                      <DialogBody>\n                        {isPhoneOnly && (\n                          <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.accent + '1a', color: C.accent, fontSize: '0.8125rem', marginBottom: '0.5rem', textAlign: 'center' }}>\n                            📱 Inscription par téléphone — 🇸🇳 Sénégal uniquement\n                          </div>\n                        )}\n                        {!isPhoneOnly && (\n                          <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.amberBg, color: '#92400e', fontSize: '0.8125rem', marginBottom: '0.5rem', textAlign: 'center' }}>\n                            ⚠️ Un code OTP sera envoyé pour vérification\n                          </div>\n                        )}\n                        <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n                          {renderError()}\n                          <div><Label>Nom complet <span style={{ color: C.red }}>*</span></Label><Input placeholder=\"Jean Dupont\" value={formData.name || ''} onChange={e => updateFormData({ name: e.target.value })} disabled={regLoading} /></div>\n                          {!isPhoneOnly && <div><Label>Adresse email <span style={{ color: C.red }}>*</span></Label><Input type=\"email\" placeholder=\"vous@exemple.com\" value={formData.email || ''} onChange={e => updateFormData({ email: e.target.value })} disabled={regLoading} /></div>}\n                          <div><Label>Numéro de téléphone <span style={{ color: C.red }}>*</span></Label><PhoneInput value={formData.phone || ''} onChange={p => updateFormData({ phone: p })} ccphone={formData.ccphone || '+221'} onCcphoneChange={c => updateFormData({ ccphone: c })} disabled={regLoading} lockCcphone={isPhoneOnly} /></div>\n                          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '0.75rem' }}>\n                            <div><Label>Ville <span style={{ color: C.red }}>*</span></Label><Input placeholder=\"Dakar\" value={formData.town || ''} onChange={e => updateFormData({ town: e.target.value })} disabled={regLoading} /></div>\n                            <div>\n                              <Label>Pays <span style={{ color: C.red }}>*</span></Label>\n                              <select\n                                value={formData.country || DEFAULT_COUNTRY_CODE}\n                                onChange={e => {\n                                  const country = getCountryByCode(e.target.value);\n                                  updateFormData({ country: e.target.value, ccphone: country?.dialCode || '+221' });\n                                }}\n                                disabled={regLoading || isPhoneOnly}\n                                style={{ width: '100%', padding: '0.5rem', borderRadius: '0.375rem', border: '1px solid #d1d5db', backgroundColor: (regLoading || isPhoneOnly) ? '#f3f4f6' : 'white', fontSize: '0.875rem' }}\n                              >\n                                {COUNTRIES_SORTED_BY_CODE.map(c => (\n                                  <option key={c.code} value={c.code}>{c.code} {c.flag} {c.name}</option>\n                                ))}\n                              </select>\n                            </div>\n                          </div>\n                          <StepIndicator current={3} />\n                        </div>\n                      </DialogBody>\n                      <DialogFooter>\n                        <Button type=\"submit\" disabled={regLoading} style={{ width: '100%' }}>\n                          {regLoading ? (\n                            <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n                              <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n                            </span>\n                          ) : 'Continuer'}\n                        </Button>\n                      </DialogFooter>\n                    </form>\n                  </>\n                )}\n              </>\n            )}\n\n            {/* ===== OTP ===== */}\n            {step === 'otp' && (\n              <>\n                <button onClick={() => goToStep('info')} style={backBtnStyle} type=\"button\">\n                  <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n                </button>\n                <DialogHeader style={{ textAlign: 'center' }}>\n                  <div style={iconCircle(C.accent)}>\n                    <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n                  </div>\n                  <DialogTitle>Vérification</DialogTitle>\n                  <DialogDescription>\n                    Entrez le code envoyé {getOtpDeliveryLabel(otpMethod, otpSentTo)}\n                  </DialogDescription>\n                </DialogHeader>\n                <DialogBody>\n                  <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n                    {renderError()}\n                    <OTPInput value={otpCode} onChange={setOtpCode} disabled={regLoading} />\n                    <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n                      {resendCooldown > 0 ? <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span> : <button type=\"button\" onClick={handleResendOTP} style={linkStyle}>Code non reçu ? Renvoyer</button>}\n                    </div>\n                    <StepIndicator current={4} />\n                  </div>\n                </DialogBody>\n                <DialogFooter>\n                  <Button onClick={handleOTPSubmit} disabled={regLoading || otpCode.length !== 6} style={{ width: '100%' }}>\n                    {regLoading ? (\n                      <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n                        <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n                      </span>\n                    ) : 'Vérifier'}\n                  </Button>\n                </DialogFooter>\n              </>\n            )}\n\n            {/* ===== PASSWORD ===== */}\n            {step === 'password' && (\n              <>\n                <button onClick={() => goToStep('otp')} style={backBtnStyle} type=\"button\">\n                  <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n                </button>\n                <DialogHeader style={{ textAlign: 'center' }}>\n                  <div style={iconCircle(C.accent)}>\n                    <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n                  </div>\n                  <DialogTitle>Créer un mot de passe</DialogTitle>\n                </DialogHeader>\n                <form onSubmit={handlePasswordSubmit} style={{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0 }}>\n                  <DialogBody>\n                    <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n                      {renderError()}\n                      <div><Label>Mot de passe</Label><Input type=\"password\" placeholder=\"Minimum 8 caractères\" value={password} onChange={e => setPassword(e.target.value)} disabled={regLoading} /></div>\n                      <div><Label>Confirmer le mot de passe</Label><Input type=\"password\" placeholder=\"••••••••\" value={passwordConfirm} onChange={e => setPasswordConfirm(e.target.value)} disabled={regLoading} /></div>\n                      <StepIndicator current={5} />\n                    </div>\n                  </DialogBody>\n                  <DialogFooter>\n                    <Button type=\"submit\" disabled={regLoading} style={{ width: '100%' }}>Continuer</Button>\n                  </DialogFooter>\n                </form>\n              </>\n            )}\n\n            {/* ===== CONFIRM ===== */}\n            {step === 'confirm' && (\n              <>\n                <button onClick={() => goToStep('password')} style={backBtnStyle} type=\"button\">\n                  <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n                </button>\n                <DialogHeader style={{ textAlign: 'center' }}>\n                  <BrandHeader color={C.primary} />\n                  <DialogTitle>Confirmer votre inscription</DialogTitle>\n                </DialogHeader>\n                <DialogBody>\n                  <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n                    {renderError()}\n                    <div style={{ backgroundColor: C.gray100, borderRadius: '0.5rem', padding: '1rem' }}>\n                      {[['Nom', formData.name], ...(!isPhoneOnly ? [['Email', formData.email]] : []), ['Téléphone', `${formData.ccphone} ${formData.phone}`], ['Ville', formData.town], ['Pays', formData.country]].map(([label, value]) => (\n                        <div key={label as string} style={{ display: 'flex', justifyContent: 'space-between', padding: '0.375rem 0' }}>\n                          <span style={{ fontSize: '0.875rem', color: C.gray500 }}>{label}</span>\n                          <span style={{ fontSize: '0.875rem', fontWeight: 500 }}>{value as string}</span>\n                        </div>\n                      ))}\n                    </div>\n                    <StepIndicator current={6} />\n                  </div>\n                </DialogBody>\n                <DialogFooter>\n                  <Button onClick={handleConfirm} disabled={regLoading} style={{ width: '100%' }}>\n                    {regLoading ? (\n                      <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n                        <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Création du compte...\n                      </span>\n                    ) : 'Créer mon compte'}\n                  </Button>\n                </DialogFooter>\n              </>\n            )}\n          </>\n        )}\n      </DialogContent>\n    </Dialog>\n\n    <PasswordRecoveryModal\n      open={showPasswordRecovery}\n      onOpenChange={setShowPasswordRecovery}\n      onSuccess={() => setShowPasswordRecovery(false)}\n      saasApiUrl={saasApiUrl}\n      iamApiUrl={iamApiUrl}\n    />\n    </>\n  );\n}\n\nexport default SignupModal;\n","/**\n * Profile change service for @ollaid/native-sso\n * Uses authenticated IAM endpoints for email / phone change with OTP confirmation.\n *\n * @version 2.7.9\n */\n\nimport { fetchWithTimeout, getAuthToken, getHeaders, getIamApiBaseUrl, ensureDeviceContext } from './api';\n\nexport type ProfileChangeKind = 'email' | 'phone';\nexport type ProfileChangeMethod = 'email' | 'phone';\n\nexport interface ProfileChangeRequestResponse {\n  success: boolean;\n  message?: string;\n  request_id?: number;\n  method?: ProfileChangeMethod;\n  otp_dev?: string | null;\n}\n\nexport interface ProfileChangeVerifyResponse {\n  success: boolean;\n  message?: string;\n  step?: 'pending_new_otp' | 'completed' | string;\n  user?: unknown;\n}\n\nfunction getBaseUrl() {\n  return getIamApiBaseUrl();\n}\n\nasync function getAuthHeaders() {\n  const token = getAuthToken();\n  await ensureDeviceContext();\n  return getHeaders(token || undefined, false);\n}\n\nexport const profileChangeService = {\n  async requestEmailChange(newEmail: string, method: ProfileChangeMethod = 'phone'): Promise<ProfileChangeRequestResponse> {\n    const headers = await getAuthHeaders();\n    return fetchWithTimeout<ProfileChangeRequestResponse>(\n      `${getBaseUrl()}/backoffice/profile/email/request`,\n      {\n        method: 'POST',\n        headers,\n        body: JSON.stringify({ new_email: newEmail, method }),\n      },\n      30000\n    );\n  },\n\n  async requestPhoneChange(ccphone: string, phone: string, method: ProfileChangeMethod = 'email'): Promise<ProfileChangeRequestResponse> {\n    const headers = await getAuthHeaders();\n    return fetchWithTimeout<ProfileChangeRequestResponse>(\n      `${getBaseUrl()}/backoffice/profile/phone/request`,\n      {\n        method: 'POST',\n        headers,\n        body: JSON.stringify({ ccphone, phone, method }),\n      },\n      30000\n    );\n  },\n\n  async verifyOldOTP(requestId: number, otpCode: string): Promise<ProfileChangeVerifyResponse> {\n    const headers = await getAuthHeaders();\n    return fetchWithTimeout<ProfileChangeVerifyResponse>(\n      `${getBaseUrl()}/backoffice/profile/change/verify-old`,\n      {\n        method: 'POST',\n        headers,\n        body: JSON.stringify({ request_id: requestId, otp_code: otpCode }),\n      },\n      30000\n    );\n  },\n\n  async verifyNewOTP(requestId: number, otpCode: string): Promise<ProfileChangeVerifyResponse> {\n    const headers = await getAuthHeaders();\n    return fetchWithTimeout<ProfileChangeVerifyResponse>(\n      `${getBaseUrl()}/backoffice/profile/change/verify-new`,\n      {\n        method: 'POST',\n        headers,\n        body: JSON.stringify({ request_id: requestId, otp_code: otpCode }),\n      },\n      30000\n    );\n  },\n\n  async resendOTP(requestId: number): Promise<ProfileChangeRequestResponse> {\n    const headers = await getAuthHeaders();\n    return fetchWithTimeout<ProfileChangeRequestResponse>(\n      `${getBaseUrl()}/backoffice/profile/change/resend-otp`,\n      {\n        method: 'POST',\n        headers,\n        body: JSON.stringify({ request_id: requestId }),\n      },\n      30000\n    );\n  },\n\n  async switchMethod(requestId: number, method: ProfileChangeMethod): Promise<ProfileChangeRequestResponse> {\n    const headers = await getAuthHeaders();\n    return fetchWithTimeout<ProfileChangeRequestResponse>(\n      `${getBaseUrl()}/backoffice/profile/change/switch-method`,\n      {\n        method: 'POST',\n        headers,\n        body: JSON.stringify({ request_id: requestId, method }),\n      },\n      30000\n    );\n  },\n};\n\nexport default profileChangeService;\n","/**\n * AvatarCropModal — recadrage carré simple et déterministe\n *\n * Version réécrite from scratch pour éviter les états qui bloquent le bouton Valider.\n *\n * @version 2.7.9\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState, type PointerEvent as ReactPointerEvent } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter, Button } from './ui';\n\nexport interface AvatarCropModalProps {\n  open: boolean;\n  imageSrc: string | null;\n  onOpenChange: (open: boolean) => void;\n  onCancel: () => void;\n  onConfirm: (blob: Blob) => Promise<void> | void;\n}\n\ntype Point = { x: number; y: number };\ntype Size = { width: number; height: number };\ntype CropRect = { x: number; y: number; size: number };\ntype DragMode = 'move' | 'resize-nw' | 'resize-ne' | 'resize-sw' | 'resize-se' | null;\n\nconst MIN_SIZE = 88;\nconst HANDLE = 16;\nconst OUTPUT = 512;\n\nfunction clamp(value: number, min: number, max: number) {\n  return Math.max(min, Math.min(max, value));\n}\n\nfunction getContainRect(container: Size, natural: Size) {\n  if (!container.width || !container.height || !natural.width || !natural.height) {\n    return { x: 0, y: 0, width: 0, height: 0, scale: 1 };\n  }\n\n  const scale = Math.min(container.width / natural.width, container.height / natural.height);\n  const width = natural.width * scale;\n  const height = natural.height * scale;\n\n  return {\n    x: (container.width - width) / 2,\n    y: (container.height - height) / 2,\n    width,\n    height,\n    scale,\n  };\n}\n\nexport function AvatarCropModal({ open, imageSrc, onOpenChange, onCancel, onConfirm }: AvatarCropModalProps) {\n  const wrapRef = useRef<HTMLDivElement | null>(null);\n  const imgRef = useRef<HTMLImageElement | null>(null);\n  const dragRef = useRef<{\n    mode: DragMode;\n    pointerId: number;\n    start: Point;\n    startCrop: CropRect;\n  } | null>(null);\n\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState('');\n  const [natural, setNatural] = useState<Size>({ width: 0, height: 0 });\n  const [container, setContainer] = useState<Size>({ width: 0, height: 0 });\n  const [crop, setCrop] = useState<CropRect | null>(null);\n  const [dragMode, setDragMode] = useState<DragMode>(null);\n\n  const frame = useMemo(() => getContainRect(container, natural), [container, natural]);\n\n  useEffect(() => {\n    if (!open) return;\n    setLoading(false);\n    setError('');\n    setNatural({ width: 0, height: 0 });\n    setCrop(null);\n    setDragMode(null);\n    dragRef.current = null;\n  }, [open, imageSrc]);\n\n  useEffect(() => {\n    if (!open) return;\n\n    const measure = () => {\n      const el = wrapRef.current;\n      if (!el) return;\n      const rect = el.getBoundingClientRect();\n      setContainer({ width: rect.width, height: rect.width });\n    };\n\n    measure();\n    window.addEventListener('resize', measure);\n    return () => window.removeEventListener('resize', measure);\n  }, [open]);\n\n  useEffect(() => {\n    if (!open || !frame.width || !frame.height) return;\n    setCrop((current) => {\n      if (current) {\n        const maxSize = Math.min(frame.width, frame.height);\n        const size = clamp(current.size, MIN_SIZE, maxSize);\n        const x = clamp(current.x, frame.x, frame.x + frame.width - size);\n        const y = clamp(current.y, frame.y, frame.y + frame.height - size);\n        return { x, y, size };\n      }\n\n      const maxSize = Math.min(frame.width, frame.height);\n      const size = clamp(Math.round(maxSize * 0.7), MIN_SIZE, maxSize);\n      return {\n        x: frame.x + Math.round((frame.width - size) / 2),\n        y: frame.y + Math.round((frame.height - size) / 2),\n        size,\n      };\n    });\n  }, [open, frame]);\n\n  const startDrag = (mode: DragMode, event: ReactPointerEvent<HTMLDivElement>) => {\n    if (!crop || !mode) return;\n    event.preventDefault();\n    event.stopPropagation();\n    dragRef.current = {\n      mode,\n      pointerId: event.pointerId,\n      start: { x: event.clientX, y: event.clientY },\n      startCrop: crop,\n    };\n    setDragMode(mode);\n    try {\n      event.currentTarget.setPointerCapture(event.pointerId);\n    } catch {\n      // not supported in all webviews\n    }\n  };\n\n  const moveCrop = useCallback((clientX: number, clientY: number) => {\n    const state = dragRef.current;\n    if (!state || !crop || !frame.width || !frame.height) return;\n\n    const dx = clientX - state.start.x;\n    const dy = clientY - state.start.y;\n    const maxSize = Math.min(frame.width, frame.height);\n\n    if (state.mode === 'move') {\n      setCrop({\n        ...state.startCrop,\n        x: clamp(state.startCrop.x + dx, frame.x, frame.x + frame.width - state.startCrop.size),\n        y: clamp(state.startCrop.y + dy, frame.y, frame.y + frame.height - state.startCrop.size),\n      });\n      return;\n    }\n\n    let next = { ...state.startCrop };\n    const anchorLeft = state.startCrop.x;\n    const anchorTop = state.startCrop.y;\n    const anchorRight = state.startCrop.x + state.startCrop.size;\n    const anchorBottom = state.startCrop.y + state.startCrop.size;\n\n    if (state.mode === 'resize-se') {\n      const size = clamp(Math.max(state.startCrop.size + dx, state.startCrop.size + dy), MIN_SIZE, maxSize);\n      next = { x: anchorLeft, y: anchorTop, size };\n    } else if (state.mode === 'resize-sw') {\n      const size = clamp(Math.max(state.startCrop.size - dx, state.startCrop.size + dy), MIN_SIZE, maxSize);\n      next = { x: anchorRight - size, y: anchorTop, size };\n    } else if (state.mode === 'resize-ne') {\n      const size = clamp(Math.max(state.startCrop.size + dx, state.startCrop.size - dy), MIN_SIZE, maxSize);\n      next = { x: anchorLeft, y: anchorBottom - size, size };\n    } else if (state.mode === 'resize-nw') {\n      const size = clamp(Math.max(state.startCrop.size - dx, state.startCrop.size - dy), MIN_SIZE, maxSize);\n      next = { x: anchorRight - size, y: anchorBottom - size, size };\n    }\n\n    next.x = clamp(next.x, frame.x, frame.x + frame.width - next.size);\n    next.y = clamp(next.y, frame.y, frame.y + frame.height - next.size);\n    setCrop(next);\n  }, [crop, frame.height, frame.width, frame.x, frame.y]);\n\n  useEffect(() => {\n    if (!dragMode) return;\n\n    const onMove = (event: PointerEvent) => {\n      if (!dragRef.current || event.pointerId !== dragRef.current.pointerId) return;\n      moveCrop(event.clientX, event.clientY);\n    };\n\n    const onUp = (event: PointerEvent) => {\n      if (!dragRef.current || event.pointerId !== dragRef.current.pointerId) return;\n      dragRef.current = null;\n      setDragMode(null);\n      window.removeEventListener('pointermove', onMove);\n      window.removeEventListener('pointerup', onUp);\n      window.removeEventListener('pointercancel', onUp);\n    };\n\n    window.addEventListener('pointermove', onMove);\n    window.addEventListener('pointerup', onUp);\n    window.addEventListener('pointercancel', onUp);\n    return () => {\n      window.removeEventListener('pointermove', onMove);\n      window.removeEventListener('pointerup', onUp);\n      window.removeEventListener('pointercancel', onUp);\n    };\n  }, [dragMode, moveCrop]);\n\n  const handleConfirm = async () => {\n    if (!imageSrc || !imgRef.current || !crop || !natural.width || !natural.height) {\n      setError('L’image n’est pas encore prête.');\n      return;\n    }\n\n    const canvas = document.createElement('canvas');\n    canvas.width = OUTPUT;\n    canvas.height = OUTPUT;\n    const ctx = canvas.getContext('2d');\n    if (!ctx) {\n      setError('Impossible de préparer le recadrage.');\n      return;\n    }\n\n    const sx = (crop.x - frame.x) / frame.scale;\n    const sy = (crop.y - frame.y) / frame.scale;\n    const sSize = crop.size / frame.scale;\n\n    setLoading(true);\n    setError('');\n\n    try {\n      ctx.drawImage(imgRef.current, sx, sy, sSize, sSize, 0, 0, OUTPUT, OUTPUT);\n      const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, 'image/jpeg', 0.92));\n      if (!blob) {\n        throw new Error('Impossible de générer l’image recadrée.');\n      }\n\n      await onConfirm(blob);\n    } catch (err) {\n      setError(err instanceof Error ? err.message : 'Erreur lors de la validation.');\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const overlayStyle: React.CSSProperties = {\n    position: 'absolute',\n    inset: 0,\n    cursor: dragMode ? 'grabbing' : 'grab',\n    touchAction: 'none',\n  };\n\n  const cropStyle: React.CSSProperties = crop\n    ? {\n        position: 'absolute',\n        left: `${crop.x}px`,\n        top: `${crop.y}px`,\n        width: `${crop.size}px`,\n        height: `${crop.size}px`,\n        border: '2px solid #ffffff',\n        borderRadius: '0.5rem',\n        boxShadow: '0 0 0 9999px rgba(0, 0, 0, 0.40)',\n        boxSizing: 'border-box',\n        touchAction: 'none',\n      }\n    : { display: 'none' };\n\n  const handleOuter: React.CSSProperties = {\n    position: 'absolute',\n    width: `${HANDLE * 2}px`,\n    height: `${HANDLE * 2}px`,\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    zIndex: 2,\n    touchAction: 'none',\n    userSelect: 'none',\n  };\n\n  const handleInner: React.CSSProperties = {\n    width: `${HANDLE}px`,\n    height: `${HANDLE}px`,\n    borderRadius: '999px',\n    border: '2px solid #002147',\n    background: '#fff',\n    boxShadow: '0 1px 2px rgba(0,0,0,0.18)',\n  };\n\n  return (\n    <Dialog open={open} onOpenChange={(next) => { if (!next) onCancel(); onOpenChange(next); }}>\n      <DialogContent style={{ maxWidth: '28rem', padding: '0.8rem', maxHeight: '90vh' }}>\n        <DialogHeader>\n          <DialogTitle>Recadrer la photo</DialogTitle>\n          <DialogDescription>Déplacez le carré, puis validez pour enregistrer l’avatar.</DialogDescription>\n        </DialogHeader>\n\n        <DialogBody style={{ maxHeight: '64vh', overflowY: 'auto', paddingBottom: '0.25rem' }}>\n          <div\n            ref={wrapRef}\n            style={{\n              position: 'relative',\n              width: '100%',\n              aspectRatio: '1 / 1',\n              overflow: 'hidden',\n              borderRadius: '0.8rem',\n              border: '1px solid #e5e7eb',\n              background: '#0f172a',\n            }}\n          >\n            {imageSrc && (\n              <img\n                ref={imgRef}\n                src={imageSrc}\n                alt=\"Aperçu\"\n                onLoad={(e) => {\n                  setNatural({ width: e.currentTarget.naturalWidth, height: e.currentTarget.naturalHeight });\n                }}\n                style={{\n                  position: 'absolute',\n                  inset: 0,\n                  width: '100%',\n                  height: '100%',\n                  objectFit: 'contain',\n                  userSelect: 'none',\n                  pointerEvents: 'none',\n                }}\n              />\n            )}\n\n            {crop && (\n              <div style={overlayStyle}>\n                <div style={cropStyle} onPointerDown={(e) => startDrag('move', e)}>\n                  <div style={{ ...handleOuter, left: `-${HANDLE * 0.5}px`, top: `-${HANDLE * 0.5}px`, cursor: 'nwse-resize' }} onPointerDown={(e) => startDrag('resize-nw', e)}>\n                    <div style={handleInner} />\n                  </div>\n                  <div style={{ ...handleOuter, right: `-${HANDLE * 0.5}px`, top: `-${HANDLE * 0.5}px`, cursor: 'nesw-resize' }} onPointerDown={(e) => startDrag('resize-ne', e)}>\n                    <div style={handleInner} />\n                  </div>\n                  <div style={{ ...handleOuter, left: `-${HANDLE * 0.5}px`, bottom: `-${HANDLE * 0.5}px`, cursor: 'nesw-resize' }} onPointerDown={(e) => startDrag('resize-sw', e)}>\n                    <div style={handleInner} />\n                  </div>\n                  <div style={{ ...handleOuter, right: `-${HANDLE * 0.5}px`, bottom: `-${HANDLE * 0.5}px`, cursor: 'nwse-resize' }} onPointerDown={(e) => startDrag('resize-se', e)}>\n                    <div style={handleInner} />\n                  </div>\n                </div>\n              </div>\n            )}\n          </div>\n\n          <div style={{ marginTop: '0.9rem', display: 'grid', gap: '0.6rem' }}>\n            <div style={{ fontSize: '0.8rem', color: '#6b7280', lineHeight: 1.4 }}>\n              Faites glisser le carré pour cadrer l’image. Les coins redimensionnent le carré.\n            </div>\n            {error && (\n              <div style={{ padding: '0.65rem 0.75rem', borderRadius: '0.5rem', border: '1px solid #fecaca', background: '#fef2f2', color: '#b91c1c', fontSize: '0.85rem', lineHeight: 1.4 }}>\n                {error}\n              </div>\n            )}\n          </div>\n        </DialogBody>\n\n        <DialogFooter style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>\n          <Button variant=\"outline\" onClick={onCancel} disabled={loading} style={{ minWidth: '6.5rem', height: '2.35rem' }}>\n            Annuler\n          </Button>\n          <Button onClick={handleConfirm} disabled={!imageSrc || loading || !crop} style={{ minWidth: '7rem', height: '2.35rem' }}>\n            {loading ? 'Chargement...' : 'Valider'}\n          </Button>\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n}\n\nexport default AvatarCropModal;\n","/**\n * Profile media service for @ollaid/native-sso\n * Uploads the cropped avatar to the IAM authenticated profile endpoint.\n *\n * @version 2.7.9\n */\n\nimport { fetchWithTimeout, getAuthToken, getHeaders, getIamApiBaseUrl, ensureDeviceContext } from './api';\nimport type { UserInfos } from '../types/native';\n\nexport interface ProfileImageUploadResponse {\n  message?: string;\n  user?: UserInfos;\n  user_infos?: UserInfos;\n}\n\nexport const profileMediaService = {\n  async uploadProfileImage(image: Blob, filename = 'avatar.jpg'): Promise<ProfileImageUploadResponse> {\n    const baseUrl = getIamApiBaseUrl();\n    const token = getAuthToken();\n    if (!token) {\n      throw new Error('Token manquant');\n    }\n\n    await ensureDeviceContext();\n\n    const formData = new FormData();\n    formData.append('image', image, filename);\n\n    const headers = getHeaders(token, false);\n    delete (headers as Record<string, string>)['Content-Type'];\n\n    return fetchWithTimeout<ProfileImageUploadResponse>(\n      `${baseUrl}/backoffice/profile/image`,\n      {\n        method: 'POST',\n        headers,\n        body: formData,\n      },\n      30000\n    );\n  },\n};\n\nexport default profileMediaService;\n","/**\n * Profile service for @ollaid/native-sso\n * Updates the authenticated profile fields via IAM.\n *\n * @version 2.7.9\n */\n\nimport { fetchWithTimeout, getAuthToken, getHeaders, getIamApiBaseUrl, ensureDeviceContext } from './api';\nimport type { UserInfos } from '../types/native';\n\nexport interface ProfileUpdateRequest {\n  name?: string;\n  ccphone?: string;\n  phone?: string;\n  email?: string;\n  address?: string;\n  town?: string;\n  country?: string;\n}\n\nexport interface ProfileUpdateResponse {\n  message?: string;\n  user?: UserInfos;\n  user_infos?: UserInfos;\n}\n\nexport interface ProfileFetchResponse {\n  message?: string;\n  user?: UserInfos;\n  user_infos?: UserInfos;\n}\n\nexport const profileService = {\n  async getProfile(): Promise<ProfileFetchResponse> {\n    const baseUrl = getIamApiBaseUrl();\n    const token = getAuthToken();\n    if (!token) {\n      throw new Error('Token manquant');\n    }\n\n    await ensureDeviceContext();\n\n    return fetchWithTimeout<ProfileFetchResponse>(\n      `${baseUrl}/backoffice/profile`,\n      {\n        method: 'GET',\n        headers: getHeaders(token, false),\n      },\n      20000\n    );\n  },\n\n  async updateProfile(data: ProfileUpdateRequest): Promise<ProfileUpdateResponse> {\n    const baseUrl = getIamApiBaseUrl();\n    const token = getAuthToken();\n    if (!token) {\n      throw new Error('Token manquant');\n    }\n\n    await ensureDeviceContext();\n\n    return fetchWithTimeout<ProfileUpdateResponse>(\n      `${baseUrl}/backoffice/profile`,\n      {\n        method: 'PUT',\n        headers: getHeaders(token, false),\n        body: JSON.stringify(data),\n      },\n      30000\n    );\n  },\n};\n\nexport default profileService;\n","/**\n * OnboardingModal — Modal de profil unifiée\n * Mode `missing` : champs absents uniquement\n * Mode `edit` : édition complète du profil depuis le SaaS\n *\n * @version 2.7.9\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter, Button, Label, BrandLinkRow } from './ui';\nimport OTPInput from './OTPInput';\nimport { PhoneInput } from './PhoneInput';\nimport { profileChangeService } from '../services/profileChange';\nimport AvatarCropModal from './AvatarCropModal';\nimport { profileMediaService } from '../services/profileMedia';\nimport { profileService } from '../services/profile';\nimport type { NativeUser, UserInfos } from '../types/native';\nimport { COUNTRIES_SORTED_BY_CODE, DEFAULT_COUNTRY_CODE } from '../utils/countries';\nimport packageFavicon from '../logo/favicon.png';\n\nconst C = {\n  primary: '#002147',\n  accent: '#e8430a',\n  gray100: '#f3f4f6',\n  gray200: '#e5e7eb',\n  gray500: '#6b7280',\n  gray700: '#374151',\n  white: '#ffffff',\n} as const;\n\nexport interface OnboardingModalProps {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  onDismiss: () => void;\n  user: NativeUser;\n  variant?: 'missing' | 'edit';\n  profileHydrating?: boolean;\n  hydrateProfile?: boolean;\n  onUserInfosSync?: (payload: {\n    source: 'hydration' | 'update' | 'avatar' | 'contact';\n    user_infos: UserInfos;\n  }) => void;\n  onComplete: (data: {\n    name?: string;\n    image_url?: string;\n    ccphone?: string;\n    phone?: string;\n    email?: string;\n    address?: string;\n    town?: string;\n    country?: string;\n    user_infos?: UserInfos;\n  }) => void;\n  onSkip: () => void;\n}\n\ntype ContactKind = 'email' | 'phone';\ntype ContactPhase = 'request' | 'verify-old' | 'verify-new';\n\ninterface ContactFlowState {\n  kind: ContactKind;\n  phase: ContactPhase;\n  requestId: number | null;\n  method: 'email' | 'phone';\n  newEmail: string;\n  newCcphone: string;\n  newPhone: string;\n  oldOtp: string;\n  newOtp: string;\n  loading: boolean;\n  error: string;\n  resendAvailableAt: number | null;\n}\n\ntype SubmitState = 'idle' | 'submitting' | 'success' | 'error';\ntype ConfirmAction = 'back' | 'resend' | 'cancel-load' | null;\n\nexport function OnboardingModal({\n  open,\n  onOpenChange,\n  onDismiss,\n  user,\n  variant = 'missing',\n  profileHydrating = false,\n  hydrateProfile = true,\n  onUserInfosSync,\n  onComplete,\n  onSkip,\n}: OnboardingModalProps) {\n  const isEditMode = variant === 'edit';\n  const [hydratedUser, setHydratedUser] = useState<NativeUser | null>(null);\n  const [internalHydrating, setInternalHydrating] = useState(false);\n  const hydrationKeyRef = useRef<string | null>(null);\n  const profileUser = hydratedUser ?? user;\n  const hasCurrentPhone = Boolean(profileUser.phone);\n  const hasCurrentEmail = Boolean(profileUser.email);\n  const directPhoneEdit = !isEditMode || !hasCurrentPhone;\n  const directEmailEdit = !isEditMode || !hasCurrentEmail;\n  const needsName = !isEditMode ? !profileUser.name?.trim() : true;\n\n  const [name, setName] = useState(profileUser.name || '');\n  const [photoPreview, setPhotoPreview] = useState<string>('');\n  const [avatarPickerOpen, setAvatarPickerOpen] = useState(false);\n  const [pendingAvatarSrc, setPendingAvatarSrc] = useState<string | null>(null);\n  const [avatarUploading, setAvatarUploading] = useState(false);\n  const avatarFileInputRef = useRef<HTMLInputElement | null>(null);\n  const [ccphone, setCcphone] = useState(profileUser.ccphone || '+221');\n  const [phone, setPhone] = useState(profileUser.phone || '');\n  const [email, setEmail] = useState(profileUser.email || '');\n  const [address, setAddress] = useState(profileUser.address || '');\n  const [town, setTown] = useState(profileUser.town || '');\n  const [country, setCountry] = useState(profileUser.country || DEFAULT_COUNTRY_CODE);\n  const [submitting, setSubmitting] = useState(false);\n  const [fileError, setFileError] = useState('');\n  const [contactFlow, setContactFlow] = useState<ContactFlowState | null>(null);\n  const [submitState, setSubmitState] = useState<SubmitState>('idle');\n  const [submitMessage, setSubmitMessage] = useState('');\n  const [submitError, setSubmitError] = useState('');\n  const [confirmAction, setConfirmAction] = useState<ConfirmAction>(null);\n  const [nowTick, setNowTick] = useState(Date.now());\n  const userHydrationKey = [\n    profileUser.reference || '',\n    profileUser.name || '',\n    profileUser.email || '',\n    profileUser.ccphone || '',\n    profileUser.phone || '',\n    profileUser.address || '',\n    profileUser.town || '',\n    profileUser.country || '',\n    profileUser.image_url || '',\n    profileUser.auth_2fa ? '1' : '0',\n  ].join('|');\n  const currentDialCode = (profileUser.ccphone || ccphone || '+221').trim();\n  const baseSmsAllowed = currentDialCode === '+221';\n  const contactSmsAllowed = contactFlow\n    ? (contactFlow.kind === 'phone'\n      ? contactFlow.newCcphone.trim() === '+221'\n      : baseSmsAllowed)\n    : baseSmsAllowed;\n  const lockModalClose = profileHydrating || submitting || submitState === 'success' || avatarUploading || Boolean(contactFlow?.loading);\n\n  const syncFormFromUser = useCallback((nextUser: NativeUser) => {\n    setName(nextUser.name || '');\n    setPhotoPreview(isEditMode ? (nextUser.image_url || '') : '');\n    setCcphone(nextUser.ccphone || '+221');\n    setPhone(nextUser.phone || '');\n    setEmail(nextUser.email || '');\n    setAddress(nextUser.address || '');\n    setTown(nextUser.town || '');\n    setCountry(nextUser.country || DEFAULT_COUNTRY_CODE);\n  }, [isEditMode]);\n\n  const toUserInfos = useCallback((nextUser: NativeUser): UserInfos => ({\n    reference: nextUser.reference,\n    name: nextUser.name,\n    email: nextUser.email || null,\n    ccphone: nextUser.ccphone,\n    phone: nextUser.phone,\n    address: nextUser.address,\n    town: nextUser.town,\n    country: nextUser.country,\n    image_url: nextUser.image_url,\n    auth_2fa: nextUser.auth_2fa,\n    alias_reference: nextUser.alias_reference,\n  }), []);\n\n  useEffect(() => {\n    if (!open) {\n      setHydratedUser(null);\n      hydrationKeyRef.current = null;\n      return;\n    }\n\n    setPendingAvatarSrc(null);\n    setAvatarPickerOpen(false);\n    setAvatarUploading(false);\n    setSubmitting(false);\n    setFileError('');\n    setContactFlow(null);\n    setSubmitState('idle');\n    setSubmitMessage('');\n    setSubmitError('');\n    setConfirmAction(null);\n    syncFormFromUser(profileUser);\n  }, [open, userHydrationKey, profileUser, syncFormFromUser]);\n\n  useEffect(() => {\n    if (!open || !hydratedUser) return;\n    if (contactFlow || submitting || submitState !== 'idle') return;\n    syncFormFromUser(hydratedUser);\n  }, [open, hydratedUser, contactFlow, submitting, submitState, syncFormFromUser]);\n\n  useEffect(() => {\n    if (!open || !hydrateProfile || profileHydrating || internalHydrating || hydratedUser) return;\n\n    const key = userHydrationKey;\n    if (hydrationKeyRef.current === key) return;\n    hydrationKeyRef.current = key;\n\n    let cancelled = false;\n    setInternalHydrating(true);\n\n    (async () => {\n      try {\n        const response = await profileService.getProfile();\n        const payload = (response.user_infos || response.user || {}) as Partial<UserInfos>;\n        const nextUser: NativeUser = {\n          ...profileUser,\n          name: payload.name || profileUser.name,\n          email: payload.email ?? profileUser.email ?? null,\n          ccphone: payload.ccphone || profileUser.ccphone,\n          phone: payload.phone || profileUser.phone,\n          address: payload.address || profileUser.address,\n          town: payload.town || profileUser.town,\n          country: payload.country || profileUser.country,\n          image_url: payload.image_url || profileUser.image_url,\n          auth_2fa: payload.auth_2fa ?? profileUser.auth_2fa,\n          alias_reference: payload.alias_reference || profileUser.alias_reference,\n        };\n\n        if (cancelled) return;\n        setHydratedUser(nextUser);\n        syncFormFromUser(nextUser);\n        onUserInfosSync?.({ source: 'hydration', user_infos: toUserInfos(nextUser) });\n      } catch {\n        if (cancelled) return;\n      } finally {\n        if (!cancelled) {\n          setInternalHydrating(false);\n        }\n      }\n    })();\n\n    return () => {\n      cancelled = true;\n    };\n  }, [open, hydrateProfile, profileHydrating, internalHydrating, userHydrationKey, profileUser, onUserInfosSync, syncFormFromUser, toUserInfos]);\n\n  useEffect(() => {\n    if (!contactFlow?.resendAvailableAt) return;\n\n    const timer = window.setInterval(() => {\n      setNowTick(Date.now());\n    }, 1000);\n\n    return () => window.clearInterval(timer);\n  }, [contactFlow?.resendAvailableAt]);\n\n  const markSuccess = useCallback((message: string) => {\n    setSubmitting(false);\n    setSubmitState('success');\n    setSubmitMessage(message);\n    setSubmitError('');\n  }, []);\n\n  const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n    const file = e.target.files?.[0];\n    if (!file) return;\n\n    if (file.size > 2 * 1024 * 1024) {\n      setFileError('Le fichier dépasse 2 Mo. Veuillez choisir une image plus légère.');\n      e.target.value = '';\n      return;\n    }\n\n    setFileError('');\n    const reader = new FileReader();\n    reader.onload = () => setPhotoPreview(reader.result as string);\n    reader.readAsDataURL(file);\n  }, []);\n\n  const canSubmit = !avatarUploading && (\n    name.trim().length > 0 &&\n    (directPhoneEdit ? phone.length >= 7 : true) &&\n    (directEmailEdit ? email.trim().length > 0 : true) &&\n    town.trim().length > 0\n  );\n\n  const handleSubmit = useCallback(async () => {\n    if (!canSubmit) return;\n    setSubmitting(true);\n    setSubmitState('submitting');\n    setSubmitError('');\n\n    const data = {\n      name: name.trim(),\n      ccphone: directPhoneEdit ? ccphone : profileUser.ccphone || undefined,\n      phone: directPhoneEdit ? phone : profileUser.phone || undefined,\n      email: directEmailEdit ? email.trim() : profileUser.email || undefined,\n      ...(address.trim() ? { address: address.trim() } : {}),\n      ...(town.trim() ? { town: town.trim() } : {}),\n      ...(country ? { country } : {}),\n    };\n\n    try {\n      const response = await profileService.updateProfile(data);\n      const payload = (response.user_infos || response.user || {}) as Partial<UserInfos>;\n      const updatedUser: NativeUser = {\n        ...profileUser,\n        name: payload.name || data.name || profileUser.name,\n        email: payload.email ?? data.email ?? profileUser.email,\n        ccphone: payload.ccphone || data.ccphone || profileUser.ccphone,\n        phone: payload.phone || data.phone || profileUser.phone,\n        address: payload.address || data.address || profileUser.address,\n        town: payload.town || data.town || profileUser.town,\n        country: payload.country || data.country || profileUser.country,\n        image_url: payload.image_url || profileUser.image_url,\n        auth_2fa: payload.auth_2fa ?? profileUser.auth_2fa,\n        alias_reference: payload.alias_reference || profileUser.alias_reference,\n      };\n\n      setHydratedUser(updatedUser);\n      onUserInfosSync?.({ source: 'update', user_infos: toUserInfos(updatedUser) });\n\n      onComplete({\n        name: updatedUser.name,\n        image_url: updatedUser.image_url,\n        ccphone: updatedUser.ccphone,\n        phone: updatedUser.phone,\n        email: updatedUser.email || undefined,\n        address: updatedUser.address,\n        town: updatedUser.town,\n        country: updatedUser.country,\n        user_infos: {\n          reference: updatedUser.reference,\n          name: updatedUser.name,\n          email: updatedUser.email || null,\n          ccphone: updatedUser.ccphone,\n          phone: updatedUser.phone,\n          address: updatedUser.address,\n          town: updatedUser.town,\n          country: updatedUser.country,\n          image_url: updatedUser.image_url,\n          auth_2fa: updatedUser.auth_2fa,\n          alias_reference: updatedUser.alias_reference,\n        },\n      });\n      markSuccess(response.message || 'Mise à jour réussie');\n    } catch (error) {\n      setSubmitting(false);\n      setSubmitState('error');\n      setSubmitError(error instanceof Error ? error.message : 'Erreur lors de l’enregistrement');\n    }\n  }, [canSubmit, profileUser, name, directPhoneEdit, directEmailEdit, ccphone, phone, email, address, town, country, onComplete, onUserInfosSync, toUserInfos, markSuccess]);\n\n  const openAvatarPicker = useCallback(() => {\n    avatarFileInputRef.current?.click();\n  }, []);\n\n  const handleAvatarSelected = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n    const file = event.target.files?.[0];\n    if (!file) return;\n    const reader = new FileReader();\n    reader.onload = () => {\n      setPendingAvatarSrc(reader.result as string);\n      setAvatarPickerOpen(true);\n    };\n    reader.readAsDataURL(file);\n    event.target.value = '';\n  }, []);\n\n  const handleAvatarConfirm = useCallback(async (blob: Blob) => {\n    setAvatarUploading(true);\n    try {\n      const filename = `avatar-${Date.now()}.jpg`;\n      const response = await profileMediaService.uploadProfileImage(blob, filename);\n      const payload = (response.user_infos || response.user || {}) as Partial<NativeUser & { image?: string }>;\n      const nextImage = payload.image_url || payload.image;\n      if (nextImage) {\n        setPhotoPreview(nextImage);\n      } else {\n        setPhotoPreview(URL.createObjectURL(blob));\n      }\n      if (Object.keys(payload).length > 0) {\n        const updatedUser: NativeUser = {\n          ...profileUser,\n          reference: payload.reference || profileUser.reference,\n          name: payload.name || profileUser.name,\n          email: payload.email ?? profileUser.email ?? null,\n          ccphone: payload.ccphone || profileUser.ccphone,\n          phone: payload.phone || profileUser.phone,\n          address: payload.address || profileUser.address,\n          town: payload.town || profileUser.town,\n          country: payload.country || profileUser.country,\n          image_url: nextImage || profileUser.image_url,\n          auth_2fa: payload.auth_2fa ?? profileUser.auth_2fa,\n          alias_reference: payload.alias_reference || profileUser.alias_reference,\n        };\n        setHydratedUser(updatedUser);\n        onUserInfosSync?.({ source: 'avatar', user_infos: toUserInfos(updatedUser) });\n        onComplete({\n          name: payload.name,\n          image_url: nextImage || undefined,\n          ccphone: payload.ccphone || undefined,\n          phone: payload.phone || undefined,\n          email: payload.email || undefined,\n          address: payload.address || undefined,\n          town: payload.town || undefined,\n          country: payload.country || undefined,\n          user_infos: {\n            reference: payload.reference || profileUser.reference,\n            name: payload.name || profileUser.name,\n            email: payload.email ?? profileUser.email ?? null,\n            ccphone: payload.ccphone || profileUser.ccphone,\n            phone: payload.phone || profileUser.phone,\n            address: payload.address || profileUser.address,\n            town: payload.town || profileUser.town,\n            country: payload.country || profileUser.country,\n            image_url: nextImage || profileUser.image_url,\n            auth_2fa: payload.auth_2fa ?? profileUser.auth_2fa,\n            alias_reference: payload.alias_reference || profileUser.alias_reference,\n          },\n        });\n      }\n      markSuccess('Mise à jour réussie');\n      setPendingAvatarSrc(null);\n      setAvatarPickerOpen(false);\n    } finally {\n      setAvatarUploading(false);\n    }\n  }, [onComplete, onUserInfosSync, toUserInfos, markSuccess, profileUser.reference, profileUser.name, profileUser.email, profileUser.ccphone, profileUser.phone, profileUser.address, profileUser.town, profileUser.country, profileUser.image_url, profileUser.auth_2fa, profileUser.alias_reference]);\n\n  const openContactFlow = useCallback((kind: ContactKind) => {\n    setContactFlow({\n      kind,\n      phase: 'request',\n      requestId: null,\n      method: kind === 'email'\n        ? 'email'\n        : (currentDialCode === '+221' ? 'phone' : 'email'),\n      newEmail: '',\n      newCcphone: kind === 'phone' ? (profileUser.ccphone || '+221') : '+221',\n      newPhone: '',\n      oldOtp: '',\n      newOtp: '',\n      loading: false,\n      error: '',\n      resendAvailableAt: null,\n    });\n  }, [currentDialCode, profileUser.ccphone]);\n\n  const closeContactFlow = useCallback(() => {\n    setContactFlow(null);\n  }, []);\n\n  const updateFlow = useCallback((patch: Partial<ContactFlowState>) => {\n    setContactFlow((prev) => prev ? { ...prev, ...patch } : prev);\n  }, []);\n\n  const currentPhoneDialDisplay = profileUser.ccphone || ccphone || '+221';\n  const currentPhoneNumberDisplay = profileUser.phone || phone || '';\n  const currentEmailLabel = profileUser.email || email || '';\n  const currentPhoneDialCode = (currentPhoneDialDisplay || '+221').trim() || '+221';\n  const currentPhoneDigits = (profileUser.phone || phone || '').replace(/\\D/g, '');\n  const formatPhoneDisplay = useCallback((dial: string, digits: string) => {\n    const cleanDial = (dial || '+221').trim() || '+221';\n    const cleanDigits = (digits || '').replace(/\\D/g, '');\n    return cleanDigits ? `${cleanDial} ${cleanDigits}` : cleanDial;\n  }, []);\n  const currentEmailNormalized = currentEmailLabel.trim().toLowerCase();\n  const requestEmailNormalized = contactFlow?.kind === 'email' ? contactFlow.newEmail.trim().toLowerCase() : '';\n  const requestPhoneDialCode = contactFlow?.kind === 'phone' ? (contactFlow.newCcphone.trim() || '+221') : '';\n  const requestPhoneDigits = contactFlow?.kind === 'phone' ? contactFlow.newPhone.replace(/\\D/g, '') : '';\n  const emailIsCurrent = Boolean(contactFlow?.kind === 'email' && requestEmailNormalized && requestEmailNormalized === currentEmailNormalized);\n  const phoneIsCurrent = Boolean(\n    contactFlow?.kind === 'phone'\n    && requestPhoneDigits\n    && requestPhoneDialCode === currentPhoneDialCode\n    && requestPhoneDigits === currentPhoneDigits\n  );\n  const requestDuplicateMessage = emailIsCurrent\n    ? 'Vous ne pouvez pas écrire votre actuelle adresse email. Veuillez en choisir une autre.'\n    : phoneIsCurrent\n      ? 'Vous ne pouvez pas écrire votre actuel numéro de téléphone. Veuillez en choisir un autre.'\n      : '';\n\n  const requestChange = useCallback(async () => {\n    if (!contactFlow || contactFlow.loading) return;\n    const sameEmail = contactFlow.kind === 'email'\n      && contactFlow.newEmail.trim().toLowerCase() === currentEmailNormalized;\n    const samePhone = contactFlow.kind === 'phone'\n      && contactFlow.newCcphone.trim() === currentPhoneDialCode\n      && contactFlow.newPhone.replace(/\\D/g, '') === currentPhoneDigits;\n    if (sameEmail || samePhone) {\n      updateFlow({\n        loading: false,\n        error: sameEmail\n          ? 'Vous ne pouvez pas écrire votre actuelle adresse email. Veuillez en choisir une autre.'\n          : 'Vous ne pouvez pas écrire votre actuel numéro de téléphone. Veuillez en choisir un autre.',\n      });\n      return;\n    }\n    updateFlow({ loading: true, error: '' });\n\n    try {\n      const method = contactSmsAllowed ? contactFlow.method : 'email';\n      const response = contactFlow.kind === 'email'\n        ? await profileChangeService.requestEmailChange(contactFlow.newEmail.trim(), method)\n        : await profileChangeService.requestPhoneChange(contactFlow.newCcphone, contactFlow.newPhone.trim(), method);\n\n      if (!response.success || !response.request_id) {\n        throw new Error(response.message || 'Impossible de démarrer le changement');\n      }\n\n      updateFlow({ requestId: response.request_id, phase: 'verify-old', loading: false, error: '', resendAvailableAt: Date.now() + 120000 });\n    } catch (error) {\n      updateFlow({ loading: false, error: error instanceof Error ? error.message : 'Erreur inconnue' });\n    }\n  }, [contactFlow, updateFlow, contactSmsAllowed, currentEmailNormalized, currentPhoneDialCode, currentPhoneDigits]);\n\n  const verifyOld = useCallback(async () => {\n    if (!contactFlow?.requestId || contactFlow.loading) return;\n    updateFlow({ loading: true, error: '' });\n\n    try {\n      const response = await profileChangeService.verifyOldOTP(contactFlow.requestId, contactFlow.oldOtp);\n      if (!response.success) throw new Error(response.message || 'Code OTP incorrect');\n      updateFlow({ phase: 'verify-new', loading: false, error: '', resendAvailableAt: Date.now() + 120000 });\n    } catch (error) {\n      updateFlow({ loading: false, error: error instanceof Error ? error.message : 'Code OTP incorrect' });\n    }\n  }, [contactFlow, updateFlow]);\n\n  const verifyNew = useCallback(async () => {\n    if (!contactFlow?.requestId || contactFlow.loading) return;\n    updateFlow({ loading: true, error: '' });\n\n    try {\n      const response = await profileChangeService.verifyNewOTP(contactFlow.requestId, contactFlow.newOtp);\n      if (!response.success) throw new Error(response.message || 'Code OTP incorrect');\n\n      const updatedUser: NativeUser = {\n        ...profileUser,\n        ...(contactFlow.kind === 'email'\n          ? { email: contactFlow.newEmail.trim() }\n          : { ccphone: contactFlow.newCcphone, phone: contactFlow.newPhone.trim() }),\n      };\n\n      if (response.user && typeof response.user === 'object') {\n        Object.assign(updatedUser, response.user as Partial<NativeUser>);\n      }\n\n      setHydratedUser(updatedUser);\n      setContactFlow(null);\n      onUserInfosSync?.({ source: 'contact', user_infos: toUserInfos(updatedUser) });\n      onComplete({\n        name: updatedUser.name,\n        image_url: updatedUser.image_url,\n        ccphone: updatedUser.ccphone,\n        phone: updatedUser.phone,\n        email: updatedUser.email || undefined,\n        user_infos: {\n          reference: updatedUser.reference,\n          name: updatedUser.name,\n          email: updatedUser.email || null,\n          ccphone: updatedUser.ccphone,\n          phone: updatedUser.phone,\n          address: updatedUser.address,\n          town: updatedUser.town,\n          country: updatedUser.country,\n          image_url: updatedUser.image_url,\n          auth_2fa: updatedUser.auth_2fa,\n          alias_reference: updatedUser.alias_reference,\n        },\n      });\n      markSuccess(contactFlow.kind === 'email' ? 'Email mis à jour avec succès.' : 'Téléphone mis à jour avec succès.');\n    } catch (error) {\n      updateFlow({ loading: false, error: error instanceof Error ? error.message : 'Code OTP incorrect' });\n    }\n  }, [contactFlow, onComplete, onUserInfosSync, updateFlow, profileUser, toUserInfos, markSuccess]);\n\n  const resendFlowOtp = useCallback(async () => {\n    if (!contactFlow?.requestId || contactFlow.loading) return;\n    updateFlow({ loading: true, error: '' });\n\n    try {\n      const response = await profileChangeService.resendOTP(contactFlow.requestId);\n      if (!response.success) throw new Error(response.message || 'Impossible de renvoyer le code');\n      updateFlow({ loading: false, error: '', resendAvailableAt: Date.now() + 120000 });\n    } catch (error) {\n      updateFlow({ loading: false, error: error instanceof Error ? error.message : 'Erreur inconnue' });\n    }\n  }, [contactFlow, updateFlow]);\n\n  const switchFlowMethod = useCallback(async (method: 'email' | 'phone') => {\n    if (!contactFlow) return;\n\n    if (contactFlow.phase === 'request' || !contactFlow.requestId) {\n      updateFlow({ method, error: '' });\n      return;\n    }\n\n    if (contactFlow.loading) return;\n    updateFlow({ loading: true, error: '', method });\n\n    try {\n      const response = await profileChangeService.switchMethod(contactFlow.requestId, method);\n      if (!response.success) throw new Error(response.message || 'Impossible de changer la méthode');\n      updateFlow({ loading: false, error: '' });\n    } catch (error) {\n      updateFlow({ loading: false, error: error instanceof Error ? error.message : 'Erreur inconnue' });\n    }\n  }, [contactFlow, updateFlow]);\n\n  useEffect(() => {\n    if (!contactFlow || contactFlow.kind !== 'phone') return;\n    if (contactFlow.newCcphone.trim() !== '+221' && contactFlow.method !== 'email') {\n      updateFlow({ method: 'email' });\n    }\n  }, [contactFlow, updateFlow]);\n\n  const confirmBackToRequest = useCallback(() => {\n    if (!contactFlow) return;\n    updateFlow({\n      phase: 'request',\n      requestId: null,\n      oldOtp: '',\n      newOtp: '',\n      error: '',\n      loading: false,\n      resendAvailableAt: null,\n    });\n    setConfirmAction(null);\n  }, [contactFlow, updateFlow]);\n\n  const confirmResendOtp = useCallback(async () => {\n    if (!contactFlow) return;\n    setConfirmAction(null);\n    await resendFlowOtp();\n  }, [contactFlow, resendFlowOtp]);\n\n  const handleDialogOpenChange = useCallback((nextOpen: boolean) => {\n    if (nextOpen) {\n      onOpenChange(true);\n      return;\n    }\n\n    if (lockModalClose) return;\n    onOpenChange(false);\n  }, [lockModalClose, onOpenChange]);\n  const contactTargetLabel = contactFlow\n    ? (contactFlow.kind === 'email'\n      ? (contactFlow.newEmail.trim() || currentEmailLabel || 'votre adresse email')\n      : formatPhoneDisplay(contactFlow.newCcphone, contactFlow.newPhone))\n    : '';\n  const currentReceiveLabel = (contactFlow ? (contactSmsAllowed ? contactFlow.method : 'email') : 'email') === 'phone'\n    ? `SMS au ${contactFlow?.kind === 'phone' ? contactTargetLabel : formatPhoneDisplay(currentPhoneDialDisplay, currentPhoneNumberDisplay)}`\n    : `email à ${contactFlow?.kind === 'email' ? contactTargetLabel : (currentEmailLabel || 'votre adresse email')}`;\n  const resendCountdown = contactFlow?.resendAvailableAt\n    ? Math.max(0, Math.ceil((contactFlow.resendAvailableAt - nowTick) / 1000))\n    : 0;\n  const canResendOtp = Boolean(contactFlow?.requestId) && !contactFlow?.loading && resendCountdown === 0;\n\n  const ShieldIcon = () => (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.accent} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n      <path d=\"m9 12 2 2 4-4\" />\n    </svg>\n  );\n\n  const renderSuccess = () => (\n    <>\n      <DialogHeader>\n        <BrandLinkRow\n          icon={<ShieldIcon />}\n          faviconSrc={packageFavicon}\n          faviconAlt=\"Ollaid SSO\"\n          iconBg=\"rgba(232, 67, 10, 0.1)\"\n          iconColor={C.accent}\n        />\n        <DialogTitle>Profil enregistré</DialogTitle>\n        <DialogDescription>\n          {submitMessage || 'Vos informations ont été mises à jour.'}\n        </DialogDescription>\n      </DialogHeader>\n\n      <DialogBody style={{ maxHeight: '52vh', overflowY: 'auto', paddingBottom: '0.25rem' }}>\n        <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: '0.75rem', padding: '1.5rem 1rem', textAlign: 'center' }}>\n          <svg width=\"42\" height=\"42\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#16a34a\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n            <circle cx=\"12\" cy=\"12\" r=\"10\" />\n            <path d=\"m9 12 2 2 4-4\" />\n          </svg>\n          <div style={{ fontSize: '1rem', fontWeight: 700, color: C.gray700 }}>\n            Mise à jour réussie\n          </div>\n          <div style={{ fontSize: '0.875rem', color: C.gray500 }}>\n            Vous pouvez fermer cette fenêtre maintenant.\n          </div>\n        </div>\n      </DialogBody>\n      <DialogFooter style={{ flexDirection: 'row', alignItems: 'center' }}>\n        <Button\n          type=\"button\"\n          variant=\"outline\"\n          onClick={onDismiss}\n          style={{ width: '100%', height: '2.6rem' }}\n        >\n          Fermer\n        </Button>\n      </DialogFooter>\n    </>\n  );\n\n  const renderHydration = () => (\n    <>\n      <DialogHeader>\n        <BrandLinkRow\n          icon={<ShieldIcon />}\n          faviconSrc={packageFavicon}\n          faviconAlt=\"Ollaid SSO\"\n          iconBg=\"rgba(232, 67, 10, 0.1)\"\n          iconColor={C.accent}\n        />\n        <DialogTitle>{isEditMode ? 'Modifier votre profil' : 'Complétez votre profil'}</DialogTitle>\n        <DialogDescription>\n          Récupération de vos infos depuis iam.ollaid.com en cours. Le SSO synchronise vos données avant l’affichage du formulaire.\n        </DialogDescription>\n      </DialogHeader>\n\n      <DialogBody style={{ maxHeight: '52vh', overflowY: 'auto', paddingBottom: '0.25rem' }}>\n        <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: '0.9rem', padding: '2rem 1rem', textAlign: 'center' }}>\n          <svg width=\"42\" height=\"42\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.primary} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ animation: 'spin 1s linear infinite' }}>\n            <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n          </svg>\n          <div style={{ fontSize: '1rem', fontWeight: 700, color: C.gray700 }}>\n            Récupération de vos informations\n          </div>\n          <div style={{ fontSize: '0.875rem', color: C.gray500, lineHeight: 1.5 }}>\n            Le modal sera rempli automatiquement dès que les données IAM seront prêtes.\n          </div>\n        </div>\n      </DialogBody>\n\n      <DialogFooter style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>\n        <Button\n          type=\"button\"\n          variant=\"outline\"\n          onClick={() => setConfirmAction('cancel-load')}\n          style={{ minWidth: '6.5rem', height: '2.35rem' }}\n        >\n          Fermer\n        </Button>\n      </DialogFooter>\n    </>\n  );\n\n  const renderBase = () => (\n    <>\n      <DialogHeader>\n        <BrandLinkRow\n          icon={<ShieldIcon />}\n          faviconSrc={packageFavicon}\n          faviconAlt=\"Ollaid SSO\"\n          iconBg=\"rgba(232, 67, 10, 0.1)\"\n          iconColor={C.accent}\n        />\n        <DialogTitle>{isEditMode ? 'Modifier votre profil' : 'Complétez votre profil'}</DialogTitle>\n        <DialogDescription>\n          {isEditMode\n            ? 'Mettez à jour vos informations sans quitter le SaaS.'\n            : 'Ajoutez les informations manquantes pour finaliser votre compte.'}\n        </DialogDescription>\n      </DialogHeader>\n\n      <DialogBody style={{ maxHeight: '52vh', overflowY: 'auto', paddingBottom: '0.25rem' }}>\n        <div style={{ display: 'flex', flexDirection: 'column', gap: '0.85rem', marginTop: '0.25rem', paddingRight: '0.25rem' }}>\n          {submitError && (\n            <div style={{ padding: '0.75rem', borderRadius: '0.5rem', backgroundColor: '#fef2f2', border: '1px solid #fecaca', color: '#b91c1c', fontSize: '0.875rem' }}>\n              {submitError}\n            </div>\n          )}\n\n          {submitState === 'submitting' && (\n            <div style={{ padding: '0.75rem', borderRadius: '0.5rem', backgroundColor: '#eff6ff', border: '1px solid #bfdbfe', color: '#1d4ed8', fontSize: '0.875rem', display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n              <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ animation: 'spin 1s linear infinite' }}>\n                <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n              </svg>\n              Enregistrement en cours...\n            </div>\n          )}\n\n          <div style={{ display: 'grid', gridTemplateColumns: '4.25rem 1fr', gap: '0.75rem', alignItems: 'center' }}>\n            <div style={{ position: 'relative' }}>\n              <button\n                type=\"button\"\n                onClick={openAvatarPicker}\n                disabled={avatarUploading}\n                style={{\n                  width: '4.25rem',\n                  height: '4.25rem',\n                  borderRadius: '50%',\n                  border: `1px solid ${C.gray200}`,\n                  backgroundColor: C.gray100,\n                  overflow: 'hidden',\n                  position: 'relative',\n                  padding: 0,\n                  cursor: avatarUploading ? 'not-allowed' : 'pointer',\n                }}\n              >\n                {photoPreview || profileUser.image_url ? (\n                  <img src={photoPreview || profileUser.image_url} alt=\"Photo de profil\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n                ) : (\n                  <div style={{ width: '100%', height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center', color: C.gray500 }}>\n                    <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n                      <circle cx=\"12\" cy=\"8\" r=\"4\" />\n                      <path d=\"M5.5 21a8.38 8.38 0 0 1 13 0\" />\n                    </svg>\n                  </div>\n                )}\n                <div style={{\n                  position: 'absolute', inset: 0, display: 'flex', alignItems: 'center', justifyContent: 'center',\n                  background: avatarUploading ? 'rgba(255,255,255,0.55)' : 'rgba(0,0,0,0.08)',\n                }}>\n                  {avatarUploading ? (\n                    <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.primary} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ animation: 'spin 1s linear infinite' }}>\n                      <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n                    </svg>\n                  ) : (\n                    <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.white} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n                      <path d=\"M15 8h.01\" />\n                      <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n                      <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n                      <path d=\"m21 15-5-5L5 21\" />\n                    </svg>\n                  )}\n                </div>\n              </button>\n              <input ref={avatarFileInputRef} type=\"file\" accept=\"image/*\" onChange={handleAvatarSelected} style={{ display: 'none' }} />\n            </div>\n\n            <div>\n              <Label style={{ display: 'block', marginBottom: '0.35rem', color: C.gray700, fontWeight: 500, fontSize: '0.875rem' }}>\n                Nom complet\n              </Label>\n              <input\n                type=\"text\"\n                value={name}\n                onChange={(e) => setName(e.target.value)}\n                placeholder=\"Jean Dupont\"\n                style={{\n                  width: '100%',\n                  height: '2.25rem',\n                  padding: '0 0.75rem',\n                  border: `1px solid ${C.gray200}`,\n                  borderRadius: '0.375rem',\n                  fontSize: '0.875rem',\n                  color: C.gray700,\n                  backgroundColor: C.white,\n                  outline: 'none',\n                }}\n              />\n            </div>\n          </div>\n\n          {isEditMode && hasCurrentPhone && !contactFlow && (\n            <div>\n              <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '0.35rem' }}>\n                <Label style={{ color: C.gray700, fontWeight: 500, fontSize: '0.875rem' }}>\n                  Numéro de téléphone\n                </Label>\n                <button type=\"button\" onClick={() => openContactFlow('phone')} style={{ border: 'none', background: 'transparent', padding: 0, color: C.accent, fontWeight: 700, fontSize: '0.8rem', cursor: 'pointer' }}>\n                  Changer\n                </button>\n              </div>\n              <div style={{ display: 'grid', gridTemplateColumns: '6rem 1fr', gap: '0.5rem' }}>\n                <input\n                  type=\"text\"\n                  value={currentPhoneDialDisplay}\n                  readOnly\n                  style={{\n                    width: '100%',\n                    height: '2.25rem',\n                    padding: '0 0.65rem',\n                    border: `1px solid ${C.gray200}`,\n                    borderRadius: '0.375rem',\n                    fontSize: '0.875rem',\n                    color: C.gray700,\n                    backgroundColor: '#f9fafb',\n                    outline: 'none',\n                  }}\n                />\n                <input\n                  type=\"text\"\n                  value={currentPhoneNumberDisplay}\n                  readOnly\n                  style={{\n                    width: '100%',\n                    height: '2.25rem',\n                    padding: '0 0.75rem',\n                    border: `1px solid ${C.gray200}`,\n                    borderRadius: '0.375rem',\n                    fontSize: '0.875rem',\n                    color: C.gray700,\n                    backgroundColor: '#f9fafb',\n                    outline: 'none',\n                  }}\n                />\n              </div>\n            </div>\n          )}\n\n          {isEditMode && hasCurrentEmail && !contactFlow && (\n            <div>\n              <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '0.35rem' }}>\n                <Label style={{ color: C.gray700, fontWeight: 500, fontSize: '0.875rem' }}>\n                  Adresse email\n                </Label>\n                <button type=\"button\" onClick={() => openContactFlow('email')} style={{ border: 'none', background: 'transparent', padding: 0, color: C.accent, fontWeight: 700, fontSize: '0.8rem', cursor: 'pointer' }}>\n                  Changer\n                </button>\n              </div>\n              <input\n                type=\"email\"\n                value={currentEmailLabel}\n                readOnly\n                style={{\n                  width: '100%',\n                  height: '2.25rem',\n                  padding: '0 0.75rem',\n                  border: `1px solid ${C.gray200}`,\n                  borderRadius: '0.375rem',\n                  fontSize: '0.875rem',\n                  color: C.gray700,\n                  backgroundColor: '#f9fafb',\n                  outline: 'none',\n                }}\n              />\n            </div>\n          )}\n\n          {(!isEditMode || !hasCurrentPhone) && (\n            <div>\n              <Label style={{ display: 'block', marginBottom: '0.35rem', color: C.gray700, fontWeight: 500, fontSize: '0.875rem' }}>\n                Numéro de téléphone\n              </Label>\n              <PhoneInput value={phone} onChange={setPhone} ccphone={ccphone} onCcphoneChange={setCcphone} />\n            </div>\n          )}\n\n          {(!isEditMode || !hasCurrentEmail) && (\n            <div>\n              <Label style={{ display: 'block', marginBottom: '0.35rem', color: C.gray700, fontWeight: 500, fontSize: '0.875rem' }}>\n                Adresse email\n              </Label>\n              <input\n                type=\"email\"\n                value={email}\n                onChange={(e) => setEmail(e.target.value)}\n                placeholder=\"email@exemple.com\"\n                style={{\n                  width: '100%',\n                  height: '2.25rem',\n                  padding: '0 0.75rem',\n                  border: `1px solid ${C.gray200}`,\n                  borderRadius: '0.375rem',\n                  fontSize: '0.875rem',\n                  color: C.gray700,\n                  backgroundColor: C.white,\n                  outline: 'none',\n                }}\n              />\n            </div>\n          )}\n\n          <div style={{ display: 'grid', gap: '0.85rem' }}>\n            <div>\n              <Label style={{ display: 'block', marginBottom: '0.35rem', color: C.gray700, fontWeight: 500, fontSize: '0.875rem' }}>\n                Adresse\n              </Label>\n              <input\n                type=\"text\"\n                value={address}\n                onChange={(e) => setAddress(e.target.value)}\n                placeholder=\"Rue, quartier, numéro\"\n                style={{\n                  width: '100%',\n                  height: '2.25rem',\n                  padding: '0 0.75rem',\n                  border: `1px solid ${C.gray200}`,\n                  borderRadius: '0.375rem',\n                  fontSize: '0.875rem',\n                  color: C.gray700,\n                  backgroundColor: C.white,\n                  outline: 'none',\n                }}\n              />\n            </div>\n\n            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '0.75rem' }}>\n              <div>\n                <Label style={{ display: 'block', marginBottom: '0.35rem', color: C.gray700, fontWeight: 500, fontSize: '0.875rem' }}>\n                  Ville <span style={{ color: '#dc2626' }}>*</span>\n                </Label>\n                <input\n                  type=\"text\"\n                  value={town}\n                  onChange={(e) => setTown(e.target.value)}\n                  required\n                  placeholder=\"Dakar\"\n                  style={{\n                    width: '100%',\n                    height: '2.25rem',\n                    padding: '0 0.75rem',\n                    border: `1px solid ${C.gray200}`,\n                    borderRadius: '0.375rem',\n                    fontSize: '0.875rem',\n                    color: C.gray700,\n                    backgroundColor: C.white,\n                    outline: 'none',\n                  }}\n                />\n              </div>\n              <div>\n                <Label style={{ display: 'block', marginBottom: '0.35rem', color: C.gray700, fontWeight: 500, fontSize: '0.875rem' }}>\n                  Pays\n                </Label>\n                <select\n                  value={country}\n                  onChange={(e) => setCountry(e.target.value)}\n                  style={{\n                    width: '100%',\n                    height: '2.25rem',\n                    padding: '0 0.6rem',\n                    border: `1px solid ${C.gray200}`,\n                    borderRadius: '0.375rem',\n                    fontSize: '0.875rem',\n                    color: C.gray700,\n                    backgroundColor: C.white,\n                    outline: 'none',\n                  }}\n                >\n                  {COUNTRIES_SORTED_BY_CODE.map((c) => (\n                    <option key={c.code} value={c.code}>{c.flag} {c.name}</option>\n                  ))}\n                </select>\n              </div>\n            </div>\n          </div>\n\n        </div>\n      </DialogBody>\n\n      <DialogFooter style={{ flexDirection: 'row', justifyContent: submitState === 'success' ? 'center' : 'space-between', alignItems: 'center' }}>\n        {submitState === 'success' ? (\n          <Button\n            type=\"button\"\n            variant=\"outline\"\n            onClick={onDismiss}\n            style={{ width: '100%', height: '2.6rem' }}\n          >\n            Fermer\n          </Button>\n        ) : (\n          <>\n            <Button\n              type=\"button\"\n              variant=\"outline\"\n              onClick={() => onOpenChange(false)}\n              disabled={submitting}\n              style={{ minWidth: '6.5rem', height: '2.35rem' }}\n            >\n              Fermer\n            </Button>\n            <Button\n              type=\"button\"\n              onClick={isEditMode ? handleSubmit : onSkip}\n              disabled={isEditMode ? (!canSubmit || submitting) : submitting}\n              style={{ minWidth: '7.25rem', height: '2.35rem', opacity: (isEditMode ? (canSubmit && !submitting) : !submitting) ? 1 : 0.5 }}\n            >\n              {submitting ? (\n                <span style={{ display: 'inline-flex', alignItems: 'center', gap: '0.45rem' }}>\n                  <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ animation: 'spin 1s linear infinite' }}>\n                    <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n                  </svg>\n                  Enregistrement...\n                </span>\n              ) : (isEditMode ? 'Enregistrer' : 'Plus tard')}\n            </Button>\n          </>\n        )}\n      </DialogFooter>\n      <AvatarCropModal\n        open={avatarPickerOpen}\n        imageSrc={pendingAvatarSrc}\n        onOpenChange={setAvatarPickerOpen}\n        onCancel={() => {\n          setAvatarPickerOpen(false);\n          setPendingAvatarSrc(null);\n        }}\n        onConfirm={handleAvatarConfirm}\n      />\n    </>\n  );\n\n  const renderContactFlow = () => {\n    if (!contactFlow) return null;\n    const isEmail = contactFlow.kind === 'email';\n    const targetLabel = isEmail\n      ? (contactFlow.newEmail || 'la nouvelle adresse')\n      : `${contactFlow.newCcphone} ${contactFlow.newPhone}`.trim();\n    const sentToLabel = currentReceiveLabel;\n\n    return (\n      <>\n        <DialogHeader>\n          <BrandLinkRow\n            icon={<ShieldIcon />}\n            faviconSrc={packageFavicon}\n            faviconAlt=\"Ollaid SSO\"\n            iconBg=\"rgba(232, 67, 10, 0.1)\"\n            iconColor={C.accent}\n          />\n          <DialogTitle>{isEmail ? 'Changer l’email' : 'Changer le téléphone'}</DialogTitle>\n          <DialogDescription>\n            {contactFlow.phase === 'request'\n              ? `Veuillez renseigner le nouveau ${isEmail ? 'email' : 'numéro de téléphone'} pour lancer la vérification.`\n              : contactFlow.phase === 'verify-old'\n                ? `Le code OTP a été envoyé sur : ${sentToLabel}.`\n                : `Le second code OTP a été envoyé sur : ${sentToLabel}.`\n            }\n          </DialogDescription>\n        </DialogHeader>\n\n        <DialogBody style={{ maxHeight: '52vh', overflowY: 'auto', paddingBottom: '0.25rem' }}>\n          <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', marginTop: '0.75rem' }}>\n            {contactFlow.error && (\n              <div style={{ padding: '0.75rem', borderRadius: '0.5rem', backgroundColor: '#fef2f2', color: '#b91c1c', fontSize: '0.875rem' }}>\n                {contactFlow.error}\n              </div>\n            )}\n\n            {contactFlow.phase === 'request' && (\n              <>\n                {isEmail ? (\n                  <div>\n                    <div style={{ marginBottom: '0.5rem', padding: '0.7rem 0.75rem', borderRadius: '0.5rem', backgroundColor: '#f9fafb', border: '1px solid #e5e7eb', fontSize: '0.85rem', color: C.gray700, lineHeight: 1.45 }}>\n                      <div><strong>Email actuel :</strong> {currentEmailLabel || 'non renseigné'}</div>\n                      <div style={{ marginTop: '0.2rem', color: C.gray500 }}>\n                        Veuillez renseigner le nouveau email pour lancer la vérification.\n                      </div>\n                    </div>\n                    <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n                      Nouvel email\n                    </Label>\n                    <input\n                      type=\"email\"\n                      value={contactFlow.newEmail}\n                      onChange={(e) => updateFlow({ newEmail: e.target.value })}\n                      placeholder=\"nouvel@email.com\"\n                      style={{\n                        width: '100%',\n                        height: '2.5rem',\n                        padding: '0 0.75rem',\n                        border: `1px solid ${C.gray200}`,\n                        borderRadius: '0.375rem',\n                        fontSize: '0.875rem',\n                        color: C.gray700,\n                        backgroundColor: C.white,\n                        outline: 'none',\n                      }}\n                      />\n                    {emailIsCurrent && (\n                      <span style={{ display: 'block', marginTop: '0.35rem', color: '#b91c1c', fontSize: '0.8rem', lineHeight: 1.35 }}>\n                        {requestDuplicateMessage}\n                      </span>\n                    )}\n                  </div>\n                ) : (\n                  <div>\n                    <div style={{ marginBottom: '0.5rem', padding: '0.7rem 0.75rem', borderRadius: '0.5rem', backgroundColor: '#f9fafb', border: '1px solid #e5e7eb', fontSize: '0.85rem', color: C.gray700, lineHeight: 1.45 }}>\n                      <div><strong>Numéro actuel :</strong> {formatPhoneDisplay(currentPhoneDialDisplay, currentPhoneNumberDisplay) || 'non renseigné'}</div>\n                      <div style={{ marginTop: '0.2rem', color: C.gray500 }}>\n                        Veuillez renseigner le nouveau numéro de téléphone pour lancer la vérification.\n                      </div>\n                    </div>\n                    <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n                      Nouveau téléphone\n                    </Label>\n                    <PhoneInput\n                      value={contactFlow.newPhone}\n                      onChange={(value) => updateFlow({ newPhone: value })}\n                      ccphone={contactFlow.newCcphone}\n                      onCcphoneChange={(value) => updateFlow({ newCcphone: value, method: value.trim() === '+221' ? contactFlow.method : 'email' })}\n                    />\n                    {phoneIsCurrent && (\n                      <span style={{ display: 'block', marginTop: '0.35rem', color: '#b91c1c', fontSize: '0.8rem', lineHeight: 1.35 }}>\n                        {requestDuplicateMessage}\n                      </span>\n                    )}\n                  </div>\n                )}\n\n                {contactSmsAllowed ? (\n                  <div style={{ display: 'flex', gap: '0.5rem', flexWrap: 'wrap' }}>\n                    <Button\n                      type=\"button\"\n                      variant={contactFlow.method === 'email' ? 'default' : 'outline'}\n                      onClick={() => switchFlowMethod('email')}\n                      style={{ flex: 1 }}\n                    >\n                      Code par email\n                    </Button>\n                    <Button\n                      type=\"button\"\n                      variant={contactFlow.method === 'phone' ? 'default' : 'outline'}\n                      onClick={() => switchFlowMethod('phone')}\n                      style={{ flex: 1 }}\n                    >\n                      Code par téléphone\n                    </Button>\n                  </div>\n                ) : (\n                  <div style={{ padding: '0.75rem', borderRadius: '0.5rem', backgroundColor: '#f9fafb', border: '1px solid #e5e7eb', color: C.gray700, fontSize: '0.875rem', lineHeight: 1.45 }}>\n                    Le SMS est disponible uniquement pour les numéros sénégalais (+221). Le code sera envoyé par email.\n                  </div>\n                )}\n                <span style={{ color: C.gray500, fontSize: '0.8rem', lineHeight: 1.35 }}>\n                  Vous allez recevoir le code par {currentReceiveLabel}.\n                </span>\n              </>\n            )}\n\n            {contactFlow.phase === 'verify-old' && (\n              <>\n                <div style={{ padding: '0.75rem', borderRadius: '0.5rem', backgroundColor: '#f9fafb', border: '1px solid #e5e7eb', fontSize: '0.875rem', color: C.gray700 }}>\n                  <div><strong>{isEmail ? 'Email actuel' : 'Numéro de téléphone actuel'} :</strong> {isEmail ? currentEmailLabel : formatPhoneDisplay(currentPhoneDialDisplay, currentPhoneNumberDisplay)}</div>\n                  <div style={{ marginTop: '0.25rem' }}><strong>Nouveau :</strong> {targetLabel}</div>\n                  <div style={{ marginTop: '0.25rem' }}><strong>Envoi :</strong> {sentToLabel}</div>\n                </div>\n\n                <div>\n                  <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n                    Code reçu sur l'ancien contact\n                  </Label>\n                  <OTPInput\n                    value={contactFlow.oldOtp}\n                    onChange={(value) => updateFlow({ oldOtp: value })}\n                    disabled={contactFlow.loading}\n                  />\n                </div>\n                <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '0.75rem', flexWrap: 'wrap' }}>\n                  <div style={{ fontSize: '0.82rem', color: C.gray500 }}>\n                    {canResendOtp\n                      ? 'Vous pouvez renvoyer un nouveau code.'\n                      : `Renvoyer un code dans ${resendCountdown}s`}\n                  </div>\n                  {canResendOtp && (\n                    <Button\n                      type=\"button\"\n                      variant=\"outline\"\n                      onClick={() => setConfirmAction('resend')}\n                      disabled={contactFlow.loading}\n                      style={{ height: '2.35rem' }}\n                    >\n                      Renvoyer le code\n                    </Button>\n                  )}\n                </div>\n              </>\n            )}\n\n            {contactFlow.phase === 'verify-new' && (\n              <>\n                <div style={{ padding: '0.75rem', borderRadius: '0.5rem', backgroundColor: '#f9fafb', border: '1px solid #e5e7eb', fontSize: '0.875rem', color: C.gray700 }}>\n                  <div><strong>{isEmail ? 'Email actuel' : 'Numéro de téléphone actuel'} :</strong> {isEmail ? currentEmailLabel : formatPhoneDisplay(currentPhoneDialDisplay, currentPhoneNumberDisplay)}</div>\n                  <div style={{ marginTop: '0.25rem' }}><strong>Nouveau :</strong> {targetLabel}</div>\n                  <div style={{ marginTop: '0.25rem' }}><strong>Envoi :</strong> {sentToLabel}</div>\n                </div>\n\n                <div>\n                  <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n                    Code reçu sur le nouveau contact\n                  </Label>\n                  <OTPInput\n                    value={contactFlow.newOtp}\n                    onChange={(value) => updateFlow({ newOtp: value })}\n                    disabled={contactFlow.loading}\n                  />\n                </div>\n                <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '0.75rem', flexWrap: 'wrap' }}>\n                  <div style={{ fontSize: '0.82rem', color: C.gray500 }}>\n                    {canResendOtp\n                      ? 'Vous pouvez renvoyer un nouveau code.'\n                      : `Renvoyer un code dans ${resendCountdown}s`}\n                  </div>\n                  {canResendOtp && (\n                    <Button\n                      type=\"button\"\n                      variant=\"outline\"\n                      onClick={() => setConfirmAction('resend')}\n                      disabled={contactFlow.loading}\n                      style={{ height: '2.35rem' }}\n                    >\n                      Renvoyer le code\n                    </Button>\n                  )}\n                </div>\n              </>\n            )}\n          </div>\n        </DialogBody>\n        <DialogFooter style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>\n          {contactFlow.phase === 'request' ? (\n            <>\n              <Button\n                type=\"button\"\n                variant=\"outline\"\n                onClick={closeContactFlow}\n                disabled={contactFlow.loading}\n                style={{ minWidth: '6.5rem', height: '2.35rem' }}\n              >\n                Fermer\n              </Button>\n              <Button\n                type=\"button\"\n                onClick={requestChange}\n                disabled={\n                  contactFlow.loading ||\n                  (isEmail ? !contactFlow.newEmail.trim() : !contactFlow.newPhone.trim()) ||\n                  emailIsCurrent ||\n                  phoneIsCurrent\n                }\n                style={{ minWidth: '7.25rem', height: '2.35rem', opacity: contactFlow.loading ? 0.5 : 1 }}\n              >\n                {contactFlow.loading ? (\n                  <span style={{ display: 'inline-flex', alignItems: 'center', gap: '0.45rem' }}>\n                    <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ animation: 'spin 1s linear infinite' }}>\n                      <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n                    </svg>\n                    Envoi...\n                  </span>\n                ) : 'Envoyer'}\n              </Button>\n            </>\n          ) : (\n            <>\n              <Button\n                type=\"button\"\n                variant=\"outline\"\n                onClick={() => setConfirmAction('back')}\n                disabled={contactFlow.loading}\n                style={{ minWidth: '6.5rem', height: '2.35rem' }}\n              >\n                Retour\n              </Button>\n              <Button\n                type=\"button\"\n                onClick={contactFlow.phase === 'verify-old' ? verifyOld : verifyNew}\n                disabled={\n                  contactFlow.loading ||\n                  (contactFlow.phase === 'verify-old' && contactFlow.oldOtp.length !== 6) ||\n                  (contactFlow.phase === 'verify-new' && contactFlow.newOtp.length !== 6)\n                }\n                style={{ minWidth: '7.25rem', height: '2.35rem', opacity: contactFlow.loading ? 0.5 : 1 }}\n              >\n                {contactFlow.loading ? (\n                  <span style={{ display: 'inline-flex', alignItems: 'center', gap: '0.45rem' }}>\n                    <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ animation: 'spin 1s linear infinite' }}>\n                      <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n                    </svg>\n                    Vérification...\n                  </span>\n                ) : (contactFlow.phase === 'verify-old' ? 'Vérifier' : 'Confirmer')}\n              </Button>\n            </>\n          )}\n        </DialogFooter>\n      </>\n    );\n  };\n\n  const renderConfirmDialog = () => {\n    if (!confirmAction) return null;\n\n    const config = confirmAction === 'back'\n      ? {\n          title: 'Retourner à l’étape précédente ?',\n          description: 'La vérification en cours sera interrompue. Vous pourrez reprendre le changement depuis le début.',\n          confirmLabel: 'Retourner',\n        }\n      : confirmAction === 'resend'\n        ? {\n          title: 'Renvoyer un nouveau code OTP ?',\n          description: `Un nouveau code sera envoyé vers ${currentReceiveLabel}.`,\n          confirmLabel: 'Renvoyer',\n          }\n        : {\n          title: 'Annuler la récupération ?',\n          description: 'Les informations IAM ne seront pas récupérées maintenant. Vous pourrez relancer l’ouverture plus tard.',\n          confirmLabel: 'Annuler',\n        };\n\n    const confirm = async () => {\n      if (confirmAction === 'back') {\n        confirmBackToRequest();\n      } else if (confirmAction === 'resend') {\n        await confirmResendOtp();\n      } else {\n        setConfirmAction(null);\n        onDismiss();\n      }\n    };\n\n    return (\n      <Dialog open={Boolean(confirmAction)} onOpenChange={(open) => { if (!open) setConfirmAction(null); }}>\n          <DialogContent hideCloseButton={false} style={{ maxWidth: '22rem', padding: '0.9rem 1rem', borderRadius: '0.7rem' }}>\n          <DialogHeader>\n            <div style={{ fontSize: '1rem', fontWeight: 600, color: '#111827' }}>{config.title}</div>\n            <DialogDescription>{config.description}</DialogDescription>\n          </DialogHeader>\n          <DialogFooter style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>\n            <Button type=\"button\" variant=\"outline\" onClick={() => setConfirmAction(null)} style={{ minWidth: '6rem', height: '2.25rem' }}>\n              Annuler\n            </Button>\n            <Button type=\"button\" onClick={confirm} style={{ minWidth: '6.5rem', height: '2.25rem' }}>\n              {confirmAction === 'resend' && contactFlow?.loading ? 'Envoi...' : config.confirmLabel}\n            </Button>\n          </DialogFooter>\n        </DialogContent>\n      </Dialog>\n    );\n  };\n\n  return (\n    <Dialog open={open} onOpenChange={handleDialogOpenChange}>\n      <DialogContent\n        hideCloseButton={lockModalClose}\n        style={{ maxWidth: '26rem', padding: '0.75rem 0.8rem', borderRadius: '0.65rem', maxHeight: '88vh' }}\n      >\n        {profileHydrating && submitState === 'idle' && !contactFlow ? renderHydration() : contactFlow ? renderContactFlow() : submitState === 'success' ? renderSuccess() : renderBase()}\n      </DialogContent>\n      {renderConfirmDialog()}\n    </Dialog>\n  );\n}\n\nexport default OnboardingModal;\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n  return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n  xmlns: \"http://www.w3.org/2000/svg\",\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: 2,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n  ({\n    color = \"currentColor\",\n    size = 24,\n    strokeWidth = 2,\n    absoluteStrokeWidth,\n    className = \"\",\n    children,\n    iconNode,\n    ...rest\n  }, ref) => {\n    return createElement(\n      \"svg\",\n      {\n        ref,\n        ...defaultAttributes,\n        width: size,\n        height: size,\n        stroke: color,\n        strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n        className: mergeClasses(\"lucide\", className),\n        ...rest\n      },\n      [\n        ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n        ...Array.isArray(children) ? children : [children]\n      ]\n    );\n  }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n  const Component = forwardRef(\n    ({ className, ...props }, ref) => createElement(Icon, {\n      ref,\n      iconNode,\n      className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n      ...props\n    })\n  );\n  Component.displayName = `${iconName}`;\n  return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ExternalLink = createLucideIcon(\"ExternalLink\", [\n  [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n  [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n  [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n]);\n\nexport { ExternalLink as default };\n//# sourceMappingURL=external-link.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LoaderCircle = createLucideIcon(\"LoaderCircle\", [\n  [\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]\n]);\n\nexport { LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LockKeyhole = createLucideIcon(\"LockKeyhole\", [\n  [\"circle\", { cx: \"12\", cy: \"16\", r: \"1\", key: \"1au0dj\" }],\n  [\"rect\", { x: \"3\", y: \"10\", width: \"18\", height: \"12\", rx: \"2\", key: \"6s8ecr\" }],\n  [\"path\", { d: \"M7 10V7a5 5 0 0 1 10 0v3\", key: \"1pqi11\" }]\n]);\n\nexport { LockKeyhole as default };\n//# sourceMappingURL=lock-keyhole.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ShieldCheck = createLucideIcon(\"ShieldCheck\", [\n  [\n    \"path\",\n    {\n      d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n      key: \"oel41y\"\n    }\n  ],\n  [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { ShieldCheck as default };\n//# sourceMappingURL=shield-check.js.map\n","import { useMemo, useState } from 'react';\nimport { Loader2, LockKeyhole, ShieldCheck, ExternalLink } from 'lucide-react';\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Button, BrandLinkRow } from './ui';\nimport { ApiError, fetchWithTimeout, getAuthToken, getHeaders } from '../services/api';\nimport packageFavicon from '../logo/favicon.png';\n\ninterface PasswordRedirectModalProps {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  saasApiUrl?: string;\n}\n\nconst PasswordRedirectModal = ({ open, onOpenChange, saasApiUrl }: PasswordRedirectModalProps) => {\n  const [confirmOpen, setConfirmOpen] = useState(false);\n  const [loading, setLoading] = useState(false);\n  const [errorMessage, setErrorMessage] = useState<string | null>(null);\n  const apiBaseUrl = useMemo(() => {\n    if (!saasApiUrl) {\n      return '';\n    }\n\n    const normalized = saasApiUrl.replace(/\\/$/, '');\n    return normalized.endsWith('/api') ? normalized : `${normalized}/api`;\n  }, [saasApiUrl]);\n\n  const buildUrl = (redirectUrl: string, magicToken?: string) => {\n    if (redirectUrl) {\n      return redirectUrl;\n    }\n\n    if (magicToken) {\n      const fallbackUrl = new URL('/auth/sso-auto-connect', 'https://iam.ollaid.com');\n      fallbackUrl.searchParams.set('magic_token', magicToken);\n      return fallbackUrl.toString();\n    }\n\n    return '';\n  };\n\n  const handleRedirect = async () => {\n    if (loading) return;\n    setLoading(true);\n    setErrorMessage(null);\n\n    try {\n      const authToken = getAuthToken();\n      if (!authToken) {\n        throw new Error('Session Native SSO introuvable');\n      }\n\n      if (!apiBaseUrl) {\n        throw new Error('saasApiUrl non configurée');\n      }\n\n      const result = await fetchWithTimeout<{\n        success: boolean;\n        message?: string;\n        magic_token?: string;\n        sso_url?: string;\n        redirect_url?: string;\n      }>(\n        `${apiBaseUrl}/sso/password-link`,\n        {\n          method: 'POST',\n          headers: getHeaders(authToken || undefined, true),\n        },\n        20000\n      );\n\n      if (!result.success) {\n        throw new Error(result.message || 'Impossible de générer le lien');\n      }\n\n      const redirectUrl = buildUrl(\n        typeof result.redirect_url === 'string' && result.redirect_url.length > 0\n          ? result.redirect_url\n          : typeof result.sso_url === 'string' && result.sso_url.length > 0\n            ? result.sso_url\n            : '',\n        result.magic_token\n      );\n\n      if (!redirectUrl) {\n        throw new Error('URL de redirection manquante');\n      }\n\n      window.open(redirectUrl, '_blank', 'noopener,noreferrer');\n      onOpenChange(false);\n      setConfirmOpen(false);\n    } catch (error: any) {\n      const message = error instanceof ApiError\n        ? error.message\n        : error?.message || 'Impossible de lancer le flux de mot de passe';\n      setErrorMessage(message);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return (\n    <>\n      <Dialog open={open} onOpenChange={onOpenChange}>\n        <DialogContent style={{ maxWidth: '28rem', borderRadius: '16px', background: '#fff' }}>\n          <DialogHeader>\n            <BrandLinkRow\n              icon={<LockKeyhole size={18} />}\n              faviconSrc={packageFavicon}\n              faviconAlt=\"Ollaid SSO\"\n              iconBg=\"rgba(232, 67, 10, 0.1)\"\n              iconColor=\"#e8430a\"\n            />\n            <DialogTitle className=\"text-center\">Mot de passe géré par OLLAID SSO</DialogTitle>\n            <DialogDescription className=\"text-center\">\n              Ce bouton sert à tester la redirection vers IAM et l'ouverture du modal de changement de mot de passe.\n            </DialogDescription>\n          </DialogHeader>\n\n          <div style={{ border: '1px solid #e5e7eb', borderRadius: 12, padding: 16, background: '#f8fafc', color: '#475569', fontSize: 13, display: 'grid', gap: 8 }}>\n            <div style={{ display: 'flex', gap: 8, alignItems: 'flex-start' }}>\n              <ShieldCheck size={16} color=\"#e8430a\" />\n              <span>Le SaaS agit comme relais. Le backend SaaS appelle IAM côté serveur, puis renvoie l'URL de redirection.</span>\n            </div>\n            <div style={{ display: 'flex', gap: 8, alignItems: 'flex-start' }}>\n              <ExternalLink size={16} color=\"#e8430a\" />\n              <span>Une fenêtre IAM va s'ouvrir avec auto-connexion temporaire, sans appel direct du navigateur vers IAM.</span>\n            </div>\n          </div>\n\n          <DialogFooter style={{ gap: 12 }}>\n            <Button variant=\"outline\" onClick={() => onOpenChange(false)} style={{ flex: 1 }} disabled={loading}>\n              Fermer\n            </Button>\n            <Button onClick={() => setConfirmOpen(true)} disabled={loading} style={{ flex: 1 }}>\n              {loading ? (\n                <>\n                  <Loader2 size={16} style={{ marginRight: 8, animation: 'spin 1s linear infinite' }} />\n                  Préparation...\n                </>\n              ) : (\n                'Changer mon mot de passe'\n              )}\n            </Button>\n          </DialogFooter>\n        </DialogContent>\n      </Dialog>\n\n      <Dialog open={confirmOpen} onOpenChange={(nextOpen) => {\n        if (!loading) {\n          setConfirmOpen(nextOpen);\n        }\n      }}>\n        <DialogContent style={{ maxWidth: '26rem', borderRadius: '16px', background: '#fff' }}>\n          <DialogHeader>\n            <DialogTitle className=\"text-center\">Êtes-vous sûr de rediriger vers le SSO ?</DialogTitle>\n            <DialogDescription className=\"text-center\">\n              Cette action ouvre IAM dans un nouvel onglet et prépare l'auto-connexion pour tester le changement de mot de passe.\n            </DialogDescription>\n          </DialogHeader>\n          {errorMessage && (\n            <div style={{ border: '1px solid #fecaca', background: '#fef2f2', color: '#b91c1c', borderRadius: 12, padding: 12, fontSize: 13 }}>\n              {errorMessage}\n            </div>\n          )}\n          {loading && (\n            <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 10, padding: '8px 0 4px' }}>\n              <Loader2 size={26} style={{ animation: 'spin 1s linear infinite', color: '#e8430a' }} />\n              <div style={{ fontSize: 13, color: '#475569', textAlign: 'center' }}>\n                Création de la session en cours...\n              </div>\n            </div>\n          )}\n          <DialogFooter style={{ gap: 12 }}>\n            <Button variant=\"outline\" onClick={() => setConfirmOpen(false)} style={{ flex: 1 }} disabled={loading}>\n              Annuler\n            </Button>\n            <Button onClick={handleRedirect} style={{ flex: 1 }} disabled={loading}>\n              {loading ? (\n                <>\n                  <Loader2 size={16} style={{ marginRight: 8, animation: 'spin 1s linear infinite' }} />\n                  Confirmer...\n                </>\n              ) : (\n                'Confirmer'\n              )}\n            </Button>\n          </DialogFooter>\n        </DialogContent>\n      </Dialog>\n    </>\n  );\n};\n\nexport default PasswordRedirectModal;\n","/**\n * DebugPanel — Panneau de debug flottant pour @ollaid/native-sso\n * Affiche l'historique des appels API en temps réel (style terminal)\n * N'apparaît que quand debug=true\n * @version 2.7.9\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { subscribeToLogs, clearApiLogs, exportLogsAsText, getApiLogs, type ApiCallLog } from '../services/debugLogger';\n\nexport type DebugOnboardingPreset = 'current' | 'photo' | 'phone' | 'email' | 'all';\n\ninterface DebugPanelProps {\n  saasApiUrl: string;\n  iamApiUrl: string;\n  onOpenLogin?: () => void;\n  onOpenSignup?: () => void;\n  onOpenOnboarding?: (preset: DebugOnboardingPreset) => void;\n  onOpenPassword?: () => void;\n  onResetProfilePrompt?: () => void;\n}\n\nexport function DebugPanel({ saasApiUrl, iamApiUrl, onOpenLogin, onOpenSignup, onOpenOnboarding, onOpenPassword, onResetProfilePrompt }: DebugPanelProps) {\n  const [logs, setLogs] = useState<ApiCallLog[]>(() => getApiLogs());\n  const [expanded, setExpanded] = useState(true);\n  const [selectedLog, setSelectedLog] = useState<string | null>(null);\n\n  useEffect(() => {\n    setLogs(getApiLogs());\n    return subscribeToLogs(setLogs);\n  }, []);\n\n  const handleCopy = useCallback(() => {\n    const text = exportLogsAsText();\n    navigator.clipboard?.writeText(text).catch(() => {});\n  }, []);\n\n  const handleClear = useCallback(() => {\n    clearApiLogs();\n    setSelectedLog(null);\n  }, []);\n\n  const statusColor = (status: number | null) => {\n    if (status === null) return '#f59e0b';\n    if (status >= 200 && status < 300) return '#22c55e';\n    return '#ef4444';\n  };\n\n  const getResponseOutcome = (log: ApiCallLog): { isError: boolean; summary: string | null } => {\n    const body = log.responseBody;\n    if (!body || typeof body !== 'object') {\n      return { isError: log.responseStatus !== null && log.responseStatus >= 400, summary: null };\n    }\n\n    const payload = body as Record<string, unknown>;\n    const parts: string[] = [];\n    const isError = (typeof payload.success === 'boolean' && payload.success === false)\n      || (typeof log.responseStatus === 'number' && log.responseStatus >= 400);\n\n    if (typeof payload.status === 'string') parts.push(payload.status);\n    if (payload.needs_access === true) parts.push('needs_access');\n    if (payload.requires_2fa === true) parts.push('2fa');\n    if (typeof payload.error_type === 'string') parts.push(`error:${payload.error_type}`);\n    if (typeof payload.callback_token === 'string') parts.push('callback_token');\n    if (typeof payload.process_token === 'string') parts.push('process_token');\n    if (typeof payload.otp_method === 'string') parts.push(`otp:${payload.otp_method}`);\n    if (typeof payload.cooldown_remaining === 'number') parts.push(`cooldown:${payload.cooldown_remaining}s`);\n\n    return { isError, summary: parts.length ? parts.join(' · ') : null };\n  };\n\n  const statusEmoji = (status: number | null) => {\n    if (status === null) return '⏳';\n    if (status >= 200 && status < 300) return '✅';\n    return '❌';\n  };\n\n  const selected = selectedLog ? logs.find(l => l.id === selectedLog) : null;\n\n  return (\n    <div style={{\n      position: 'fixed',\n      bottom: 0,\n      left: 0,\n      right: 0,\n      zIndex: 99999,\n      fontFamily: 'monospace',\n      fontSize: '12px',\n    }}>\n      {/* Header bar */}\n      <div\n        onClick={() => setExpanded(!expanded)}\n        style={{\n          background: '#1a1a2e',\n          color: '#e2e8f0',\n          padding: '6px 12px',\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'space-between',\n          cursor: 'pointer',\n          borderTop: '2px solid #6366f1',\n        }}\n      >\n        <span>🔐 Debug SSO — {logs.length} appel{logs.length > 1 ? 's' : ''}</span>\n        <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n          {expanded && (\n            <>\n              <button onClick={(e) => { e.stopPropagation(); handleCopy(); }}\n                style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: 'pointer', fontSize: '11px' }}>\n                📋 Copier\n              </button>\n              <button onClick={(e) => { e.stopPropagation(); handleClear(); }}\n                style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: 'pointer', fontSize: '11px' }}>\n                🗑️ Effacer\n              </button>\n            </>\n          )}\n          <span>{expanded ? '▼' : '▲'}</span>\n        </div>\n      </div>\n\n      {/* Body */}\n      {expanded && (\n        <div style={{\n          background: '#0f0f23',\n          color: '#e2e8f0',\n          maxHeight: '300px',\n          overflowY: 'auto',\n        }}>\n          {/* Config bar */}\n          <div style={{ padding: '4px 12px', background: '#1e1e3f', fontSize: '10px', color: '#94a3b8', display: 'flex', gap: '16px', alignItems: 'center', flexWrap: 'wrap' }}>\n            <span>SaaS: <span style={{ color: '#6366f1' }}>{saasApiUrl}</span></span>\n            <span>IAM: <span style={{ color: '#6366f1' }}>{iamApiUrl}</span></span>\n            <div style={{ marginLeft: 'auto', display: 'flex', gap: '6px', flexWrap: 'wrap' }}>\n              <button\n                onClick={(e) => { e.stopPropagation(); onOpenLogin?.(); }}\n                disabled={!onOpenLogin}\n                style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: onOpenLogin ? 'pointer' : 'not-allowed', fontSize: '11px', opacity: onOpenLogin ? 1 : 0.5 }}\n              >\n                Connexion\n              </button>\n              <button\n                onClick={(e) => { e.stopPropagation(); onOpenSignup?.(); }}\n                disabled={!onOpenSignup}\n                style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: onOpenSignup ? 'pointer' : 'not-allowed', fontSize: '11px', opacity: onOpenSignup ? 1 : 0.5 }}\n              >\n                Inscription\n              </button>\n              <button\n                onClick={(e) => { e.stopPropagation(); onOpenOnboarding?.('current'); }}\n                disabled={!onOpenOnboarding}\n                style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: onOpenOnboarding ? 'pointer' : 'not-allowed', fontSize: '11px', opacity: onOpenOnboarding ? 1 : 0.5 }}\n              >\n                Infos profile\n              </button>\n              <button\n                onClick={(e) => { e.stopPropagation(); onOpenPassword?.(); }}\n                disabled={!onOpenPassword}\n                style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: onOpenPassword ? 'pointer' : 'not-allowed', fontSize: '11px', opacity: onOpenPassword ? 1 : 0.5 }}\n              >\n                Mot de passe\n              </button>\n              <button\n                onClick={(e) => { e.stopPropagation(); onResetProfilePrompt?.(); }}\n                disabled={!onResetProfilePrompt}\n                style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: onResetProfilePrompt ? 'pointer' : 'not-allowed', fontSize: '11px', opacity: onResetProfilePrompt ? 1 : 0.5 }}\n              >\n                Reset profil\n              </button>\n            </div>\n          </div>\n\n          {logs.length === 0 ? (\n            <div style={{ padding: '20px', textAlign: 'center', color: '#64748b' }}>\n              Aucun appel API. Tentez une connexion pour voir les logs.\n            </div>\n          ) : (\n            <div>\n              {logs.map(log => (\n                <div key={log.id}>\n                  {(() => {\n                    const outcome = getResponseOutcome(log);\n                    const displayStatus = outcome.isError ? '❌' : statusEmoji(log.responseStatus);\n                    const displayColor = outcome.isError ? '#ef4444' : statusColor(log.responseStatus);\n                    return (\n                      <>\n                  <div\n                    onClick={() => setSelectedLog(selectedLog === log.id ? null : log.id)}\n                    style={{\n                      padding: '4px 12px',\n                      borderBottom: '1px solid #1e293b',\n                      cursor: 'pointer',\n                      display: 'flex',\n                      alignItems: 'center',\n                      gap: '8px',\n                      background: selectedLog === log.id ? '#1e293b' : 'transparent',\n                    }}\n                  >\n                    <span>{displayStatus}</span>\n                    <span style={{\n                      background: log.method === 'GET' ? '#22c55e' : '#3b82f6',\n                      color: '#fff',\n                      padding: '0 4px',\n                      borderRadius: '2px',\n                      fontSize: '10px',\n                      fontWeight: 'bold',\n                    }}>{log.method}</span>\n                    <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n                      {log.endpoint}\n                    </span>\n                    <span style={{ color: displayColor, minWidth: '30px' }}>\n                      {log.responseStatus ?? '...'}\n                    </span>\n                    <span style={{ color: '#64748b', minWidth: '50px', textAlign: 'right' }}>\n                      {log.duration ? `${log.duration}ms` : '...'}\n                    </span>\n                  </div>\n\n                  {outcome.summary && (\n                    <div style={{\n                      padding: '0 12px 6px 32px',\n                      color: outcome.isError ? '#fca5a5' : '#94a3b8',\n                      fontSize: '10px',\n                      borderBottom: '1px solid #1e293b',\n                    }}>\n                      {outcome.summary}\n                    </div>\n                  )}\n\n                  {/* Detail view */}\n                  {selectedLog === log.id && selected && (\n                    <div style={{ padding: '8px 12px 8px 32px', background: '#111827', borderBottom: '1px solid #1e293b' }}>\n                      <div style={{ color: '#94a3b8', marginBottom: '4px' }}>\n                        ⏰ {new Date(log.timestamp).toLocaleTimeString()}\n                      </div>\n                      {log.requestBody ? (\n                        <div style={{ marginBottom: '4px' }}>\n                          <div style={{ color: '#6366f1', fontSize: '10px' }}>REQUEST:</div>\n                          <pre style={{ color: '#cbd5e1', whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0, maxHeight: '80px', overflow: 'auto' }}>\n                            {JSON.stringify(log.requestBody, null, 2)}\n                          </pre>\n                        </div>\n                      ) : null}\n                      {log.responseBody ? (\n                        <div>\n                          <div style={{ color: '#6366f1', fontSize: '10px' }}>RESPONSE:</div>\n                          <pre style={{ color: '#cbd5e1', whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0, maxHeight: '120px', overflow: 'auto' }}>\n                            {JSON.stringify(log.responseBody, null, 2)}\n                          </pre>\n                        </div>\n                      ) : null}\n                      {log.error && (\n                        <div style={{ color: '#ef4444', marginTop: '4px' }}>⚠️ {log.error}</div>\n                      )}\n                    </div>\n                  )}\n                      </>\n                    );\n                  })()}\n                </div>\n              ))}\n            </div>\n          )}\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport default DebugPanel;\n","export default \"data:image/png;base64,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\"","/**\n * NativeSSOPage — Page autonome complète pour @ollaid/native-sso\n * Design aligné sur le parcours Native SSO (fond primary, card blanche, ShieldCheck branding)\n * \n * @version 2.7.9\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { LoginModal } from './LoginModal';\nimport { SignupModal } from './SignupModal';\nimport { OnboardingModal } from './OnboardingModal';\nimport PasswordRedirectModal from './PasswordRedirectModal';\nimport AppsLogoSlider from './AppsLogoSlider';\nimport { DebugPanel, type DebugOnboardingPreset } from './DebugPanel';\nimport ollaidLogo from '../logo/ollaid.png';\nimport { Button } from './ui';\nimport {\n  getNativeStorage,\n  setNativeStorage,\n  STORAGE_KEYS,\n  logout,\n  repairNativeSsoStorage,\n  getProfilePromptState,\n  markProfilePromptComplete,\n  setProfilePromptState,\n  snoozeProfilePrompt,\n} from '../services/api';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { profileService } from '../services/profile';\nimport { useNativeAuth } from '../hooks/useNativeAuth';\nimport type { UserInfos, NativeUser } from '../types/native';\nimport type { NativeStorageAdapter } from '../services/api';\n\nexport interface NativeSSOPageProps {\n  saasApiUrl: string;\n  iamApiUrl: string;\n  onLoginSuccess?: (token: string, user: UserInfos) => void;\n  onLogout?: () => void;\n  onOnboardingComplete?: (data: {\n    name?: string;\n    image_url?: string;\n    ccphone?: string;\n    phone?: string;\n    email?: string;\n    address?: string;\n    town?: string;\n    country?: string;\n    user_infos?: UserInfos;\n  }) => void;\n  accountType?: 'user' | 'client';\n  configPrefix?: string;\n  title?: string;\n  description?: string;\n  logoUrl?: string;\n  hideFooter?: boolean;\n  homeUrl?: string;\n  redirectAfterLogin?: string;\n  redirectAfterLogout?: string;\n  storage?: NativeStorageAdapter;\n}\n\ntype ModalState = 'none' | 'login' | 'signup';\n\nconst PROFILE_PROMPT_DELAY_MS = 5 * 60 * 1000;\nconst PROFILE_PROMPT_SNOOZE_MS = 8 * 60 * 60 * 1000;\nconst PROFILE_SYNC_INTERVAL_MS = 30 * 60 * 1000;\nconst PROFILE_FETCH_RETRY_DELAY_MS = 1200;\nconst PROFILE_FETCH_MAX_ATTEMPTS = 3;\n\nconst COLORS = {\n  primary: '#002147',\n  primaryForeground: '#ffffff',\n  accent: '#e8430a',\n  card: '#ffffff',\n  cardForeground: '#1a2332',\n  muted: '#6b7280',\n  border: '#e5e7eb',\n  shadow: '0 10px 25px -5px rgba(0,0,0,0.2)',\n} as const;\n\nconst SSO_VERSION = '2.8.2';\n\nconst LIGHT_VARS: Record<string, string> = {\n  \"--background\": \"40 20% 96%\",\n  \"--foreground\": \"220 15% 15%\",\n  \"--card\": \"0 0% 100%\",\n  \"--card-foreground\": \"220 15% 15%\",\n  \"--popover\": \"0 0% 100%\",\n  \"--popover-foreground\": \"220 15% 15%\",\n  \"--primary\": \"209 100% 13%\",\n  \"--primary-foreground\": \"0 0% 100%\",\n  \"--secondary\": \"40 15% 92%\",\n  \"--secondary-foreground\": \"220 15% 25%\",\n  \"--muted\": \"40 10% 90%\",\n  \"--muted-foreground\": \"220 10% 50%\",\n  \"--accent\": \"16 99% 52%\",\n  \"--accent-foreground\": \"0 0% 100%\",\n  \"--destructive\": \"0 84.2% 60.2%\",\n  \"--destructive-foreground\": \"210 40% 98%\",\n  \"--border\": \"40 15% 88%\",\n  \"--input\": \"40 15% 88%\",\n  \"--ring\": \"209 100% 13%\",\n};\n\nfunction safeRedirect(target?: string): boolean {\n  if (!target) return false;\n\n  if (target.startsWith('/')) {\n    window.location.href = target;\n    return true;\n  }\n\n  try {\n    const url = new URL(target, window.location.origin);\n    if (url.origin === window.location.origin) {\n      window.location.href = url.toString();\n      return true;\n    }\n  } catch {\n    // ignore invalid URL\n  }\n\n  return false;\n}\n\n// Shield check SVG inline\nconst ShieldCheckIcon = ({ size = 24, color = COLORS.accent }: { size?: number; color?: string }) => (\n  <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n    <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n    <path d=\"m9 12 2 2 4-4\" />\n  </svg>\n);\n\nfunction needsOnboarding(user: NativeUser | UserInfos): boolean {\n  return !user.name?.trim() || !user.image_url || !user.phone || !user.email || !user.address?.trim() || !user.town?.trim() || !user.country?.trim();\n}\n\nfunction isProfileComplete(user: NativeUser | UserInfos): boolean {\n  return Boolean(\n    user.name?.trim()\n    && user.image_url\n    && user.phone\n    && user.email\n    && user.address?.trim()\n    && user.town?.trim()\n    && user.country?.trim()\n  );\n}\n\n// Gradient border animation keyframes (injected once)\nconst GRADIENT_STYLE_ID = 'ollaid-sso-gradient-anim';\nfunction injectGradientAnimation() {\n  if (document.getElementById(GRADIENT_STYLE_ID)) return;\n  const style = document.createElement('style');\n  style.id = GRADIENT_STYLE_ID;\n  style.textContent = `\n    @keyframes ollaid-border-gradient {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n    @keyframes ollaid-marquee {\n      0% { transform: translateX(0); }\n      100% { transform: translateX(-50%); }\n    }\n  `;\n  document.head.appendChild(style);\n}\n\n/** Top branding: ShieldCheck + iam.ollaid.com + subtitle */\nconst TopBranding = ({ subtitle }: { subtitle: string }) => (\n  <div style={{ textAlign: 'center', marginBottom: '1.5rem' }}>\n    <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginBottom: '0.5rem' }}>\n      <ShieldCheckIcon size={28} color={COLORS.accent} />\n      <span style={{ fontSize: '1.25rem', fontWeight: 700, color: COLORS.primaryForeground }}>\n        iam.<span style={{ color: COLORS.accent }}>ollaid</span>.com\n      </span>\n    </div>\n    <p style={{ fontSize: '1rem', fontWeight: 600, color: 'rgba(255,255,255,0.85)' }}>\n      {subtitle}\n    </p>\n  </div>\n);\n\n/** Footer: Ollaid logo + copyright */\nconst Footer = ({ hideFooter }: { hideFooter: boolean }) => (\n  <div style={{ marginTop: '1.5rem', textAlign: 'center' }}>\n    <img src={ollaidLogo} alt=\"Ollaid\" style={{ height: '28px', margin: '0 auto 0.5rem' }} />\n    {!hideFooter && (\n      <p style={{ fontSize: '0.75rem', color: 'rgba(255,255,255,0.5)' }}>\n        OLLAID SSO v{SSO_VERSION} · © 2026 iam.ollaid.com propulsé par <span style={{ fontWeight: 500 }}>ollaid</span>\n      </p>\n    )}\n  </div>\n);\n\nexport function NativeSSOPage({\n  saasApiUrl,\n  iamApiUrl,\n  onLoginSuccess,\n  onLogout,\n  onOnboardingComplete,\n  accountType = 'user',\n  configPrefix = 'iam',\n  title = 'Un compte pour toutes vos applications',\n  description = 'Connectez-vous avec votre compte Ollaid pour accéder à toutes les applications partenaires.',\n  logoUrl,\n  hideFooter = false,\n  homeUrl,\n  redirectAfterLogin,\n  redirectAfterLogout,\n  storage,\n}: NativeSSOPageProps) {\n  if (storage) {\n    setNativeStorage(storage);\n  }\n\n  const [modal, setModal] = useState<ModalState>('none');\n  const [loginInitialPhone, setLoginInitialPhone] = useState<string | undefined>();\n  const [showOnboarding, setShowOnboarding] = useState(false);\n  const [pendingSession, setPendingSession] = useState<{ token: string; user: NativeUser; sourceUser: NativeUser } | null>(null);\n  const [debugOnboardingState, setDebugOnboardingState] = useState<{\n    token: string;\n    user: NativeUser;\n    sourceUser: NativeUser;\n    preset: DebugOnboardingPreset;\n    variant: 'edit';\n  } | null>(null);\n  const [passwordRedirectOpen, setPasswordRedirectOpen] = useState(false);\n  const [redirectingTarget, setRedirectingTarget] = useState<string | null>(null);\n  const [redirectingReason, setRedirectingReason] = useState<'login' | 'logout' | 'already-authenticated' | null>(null);\n  const [session, setSession] = useState<{ token: string; user: NativeUser } | null>(() => {\n    try {\n      const storage = getNativeStorage();\n      const token = storage.getItem(STORAGE_KEYS.AUTH_TOKEN) || storage.getItem(STORAGE_KEYS.TOKEN);\n      const userStr = storage.getItem(STORAGE_KEYS.USER);\n      if (token && userStr) return { token, user: JSON.parse(userStr) };\n    } catch {\n      return null;\n    }\n    return null;\n  });\n\n  const { isDebug: resolvedDebug } = useNativeAuth({ saasApiUrl, iamApiUrl, configPrefix, autoLoadCredentials: true, storage });\n  const onboardingPromptTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const onboardingRecheckTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const profileSyncTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n  const profileHydrationRunningRef = useRef(false);\n  const profileHydrationRequestedRef = useRef<string | null>(null);\n  const sessionRef = useRef(session);\n  const [profileHydrating, setProfileHydrating] = useState(false);\n\n  useEffect(() => {\n    sessionRef.current = session;\n  }, [session]);\n\n  useEffect(() => {\n    const repairResult = repairNativeSsoStorage();\n    if (repairResult.cleaned) {\n      setSession(null);\n\n      const isDev = Boolean((import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV);\n      if (isDev) {\n        console.warn('🔧 [NativeSSOPage] Storage SSO réparé', repairResult.reason);\n      }\n    }\n  }, []);\n\n  useEffect(() => {\n    if (!redirectingTarget) return;\n\n    const timer = window.setTimeout(() => {\n      const redirected = safeRedirect(redirectingTarget);\n      if (!redirected) {\n        setRedirectingTarget(null);\n        setRedirectingReason(null);\n      }\n    }, 200);\n\n    return () => window.clearTimeout(timer);\n  }, [redirectingTarget]);\n\n  const clearOnboardingTimers = useCallback(() => {\n    if (onboardingPromptTimerRef.current) {\n      clearTimeout(onboardingPromptTimerRef.current);\n      onboardingPromptTimerRef.current = null;\n    }\n    if (onboardingRecheckTimerRef.current) {\n      clearTimeout(onboardingRecheckTimerRef.current);\n      onboardingRecheckTimerRef.current = null;\n    }\n  }, []);\n\n  const persistSessionUser = useCallback((token: string, user: NativeUser) => {\n    const storage = getNativeStorage();\n    setSession({ token, user });\n    storage.setItem(STORAGE_KEYS.USER, JSON.stringify(user));\n    storage.setItem(STORAGE_KEYS.AUTH_TOKEN, token);\n  }, []);\n\n  const extractUserInfos = useCallback((payload: unknown): Partial<NativeUser> | null => {\n    if (!payload || typeof payload !== 'object') return null;\n    const data = payload as Record<string, unknown>;\n    const candidate = (data.user_infos && typeof data.user_infos === 'object')\n      ? data.user_infos as Record<string, unknown>\n      : data.user && typeof data.user === 'object'\n        ? data.user as Record<string, unknown>\n        : data;\n\n    return {\n      reference: typeof candidate.reference === 'string' ? candidate.reference : undefined,\n      name: typeof candidate.name === 'string' ? candidate.name : undefined,\n      email: typeof candidate.email === 'string' ? candidate.email : undefined,\n      ccphone: typeof candidate.ccphone === 'string' ? candidate.ccphone : undefined,\n      phone: typeof candidate.phone === 'string' ? candidate.phone : undefined,\n      address: typeof candidate.address === 'string' ? candidate.address : undefined,\n      town: typeof candidate.town === 'string' ? candidate.town : undefined,\n      country: typeof candidate.country === 'string' ? candidate.country : undefined,\n      image_url: typeof candidate.image_url === 'string' ? candidate.image_url : undefined,\n      auth_2fa: typeof candidate.auth_2fa === 'boolean' ? candidate.auth_2fa : undefined,\n      alias_reference: typeof candidate.alias_reference === 'string' ? candidate.alias_reference : undefined,\n    };\n  }, []);\n\n  const refreshSessionProfile = useCallback(async (force = false): Promise<NativeUser | null> => {\n    const activeSession = sessionRef.current;\n    if (!activeSession?.token) return null;\n    if (profileHydrationRunningRef.current && !force) return activeSession.user;\n    if (profileHydrationRequestedRef.current === activeSession.token && !force) return activeSession.user;\n\n    profileHydrationRunningRef.current = true;\n    profileHydrationRequestedRef.current = activeSession.token;\n    setProfileHydrating(true);\n    try {\n      let lastError: unknown = null;\n      for (let attempt = 1; attempt <= PROFILE_FETCH_MAX_ATTEMPTS; attempt += 1) {\n        try {\n          const response = await profileService.getProfile();\n          const mergedInfos = extractUserInfos(response) || {};\n          const mergedUser = { ...activeSession.user, ...mergedInfos } as NativeUser;\n          persistSessionUser(activeSession.token, mergedUser);\n          return mergedUser;\n        } catch (error) {\n          lastError = error;\n          if (attempt < PROFILE_FETCH_MAX_ATTEMPTS) {\n            await new Promise((resolve) => setTimeout(resolve, PROFILE_FETCH_RETRY_DELAY_MS * attempt));\n          }\n        }\n      }\n\n      const isDev = Boolean((import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV);\n      if (isDev) {\n        console.warn('Profile hydration failed after retries', lastError);\n      }\n      return activeSession.user;\n    } finally {\n      profileHydrationRunningRef.current = false;\n      setProfileHydrating(false);\n    }\n  }, [persistSessionUser, extractUserInfos]);\n\n  const makeDebugOnboardingUser = useCallback((baseUser: NativeUser, preset: DebugOnboardingPreset): NativeUser => {\n    const normalized: NativeUser = { ...baseUser };\n\n    if (preset === 'current') return normalized;\n    if (preset === 'photo') return { ...normalized, image_url: '' };\n    if (preset === 'phone') return { ...normalized, phone: '', ccphone: '' };\n    if (preset === 'email') return { ...normalized, email: '' };\n    return { ...normalized, image_url: '', phone: '', ccphone: '', email: '' };\n  }, []);\n\n  const syncProfilePrompt = useCallback((currentSession: { token: string; user: NativeUser } | null) => {\n    clearOnboardingTimers();\n\n    if (!currentSession) {\n      setPendingSession(null);\n      setShowOnboarding(false);\n      return;\n    }\n\n    const promptState = getProfilePromptState();\n    const now = Date.now();\n    const onboardingVisible = showOnboarding || Boolean(pendingSession || debugOnboardingState);\n\n    if (promptState.lastStatus === true || isProfileComplete(currentSession.user)) {\n      markProfilePromptComplete();\n      if (!onboardingVisible) {\n        setPendingSession(null);\n        setShowOnboarding(false);\n      }\n      return;\n    }\n\n    setPendingSession({ ...currentSession, sourceUser: currentSession.user });\n\n    const scheduleOpen = () => {\n      onboardingPromptTimerRef.current = setTimeout(() => {\n        const latestPromptState = getProfilePromptState();\n        if (latestPromptState.lastStatus === true) return;\n        if (!currentSession) return;\n        if (!isProfileComplete(currentSession.user)) {\n          setShowOnboarding(true);\n        }\n      }, PROFILE_PROMPT_DELAY_MS);\n    };\n\n    if (promptState.recheckAt && promptState.recheckAt > now) {\n      onboardingRecheckTimerRef.current = setTimeout(() => {\n        const latestPromptState = getProfilePromptState();\n        if (latestPromptState.lastStatus === true) return;\n        if (!currentSession) return;\n        if (!isProfileComplete(currentSession.user)) {\n          scheduleOpen();\n        }\n      }, promptState.recheckAt - now);\n      return;\n    }\n\n    scheduleOpen();\n  }, [clearOnboardingTimers, showOnboarding, pendingSession, debugOnboardingState]);\n\n  // Force light mode + inject gradient animation\n  useEffect(() => {\n    injectGradientAnimation();\n    const root = document.documentElement;\n    const originalValues: Record<string, string> = {};\n    Object.keys(LIGHT_VARS).forEach((key) => { originalValues[key] = root.style.getPropertyValue(key); });\n    Object.entries(LIGHT_VARS).forEach(([key, value]) => { root.style.setProperty(key, value); });\n    root.classList.add('light');\n    root.classList.remove('dark');\n    root.style.colorScheme = 'light';\n    const meta = document.createElement('meta');\n    meta.name = 'color-scheme';\n    meta.content = 'light';\n    document.head.appendChild(meta);\n    return () => {\n      Object.entries(originalValues).forEach(([key, value]) => {\n        if (value) root.style.setProperty(key, value);\n        else root.style.removeProperty(key);\n      });\n      root.classList.remove('light');\n      root.style.colorScheme = '';\n      meta.remove();\n    };\n  }, []);\n\n  const openLogin = useCallback(() => setModal('login'), []);\n  const openSignup = useCallback(() => setModal('signup'), []);\n  const closeModal = useCallback(() => { setModal('none'); setLoginInitialPhone(undefined); }, []);\n  const switchToSignup = useCallback(() => { setModal('none'); setLoginInitialPhone(undefined); setTimeout(() => setModal('signup'), 150); }, []);\n  const switchToLogin = useCallback(() => { setModal('none'); setLoginInitialPhone(undefined); setTimeout(() => setModal('login'), 150); }, []);\n  const switchToLoginWithPhone = useCallback((phone: string) => {\n    setModal('none');\n    setLoginInitialPhone(phone);\n    setTimeout(() => setModal('login'), 150);\n  }, []);\n\n  const beginRedirect = useCallback((target?: string, reason: 'login' | 'logout' | 'already-authenticated' = 'login') => {\n    if (!target) return false;\n    setRedirectingReason(reason);\n    setRedirectingTarget(target);\n    return true;\n  }, []);\n\n  const handleLoginSuccess = useCallback((token: string, user: UserInfos) => {\n    const userObj: NativeUser = {\n      reference: '',\n      name: user.name,\n      email: user.email || undefined,\n      phone: user.phone,\n      ccphone: user.ccphone,\n      image_url: user.image_url,\n    };\n    setModal('none');\n    persistSessionUser(token, userObj);\n    syncProfilePrompt({ token, user: userObj });\n    void refreshSessionProfile(true);\n\n    if (!needsOnboarding(userObj)) {\n      markProfilePromptComplete();\n      try {\n        onLoginSuccess?.(token, user);\n      } catch (callbackError) {\n        console.error('Erreur dans le callback onLoginSuccess du wrapper SSO', callbackError);\n      }\n      beginRedirect(redirectAfterLogin, 'login');\n    }\n  }, [onLoginSuccess, redirectAfterLogin, persistSessionUser, syncProfilePrompt, refreshSessionProfile, beginRedirect]);\n\n  const handleOnboardingComplete = useCallback((data: {\n    name?: string;\n    image_url?: string;\n    ccphone?: string;\n    phone?: string;\n    email?: string;\n    address?: string;\n    town?: string;\n    country?: string;\n    user_infos?: UserInfos;\n  }) => {\n    const activeSession = debugOnboardingState || pendingSession;\n    if (!activeSession) return;\n    const updatedUser = { ...activeSession.sourceUser, ...(data.user_infos || data) } as NativeUser;\n    persistSessionUser(activeSession.token, updatedUser);\n    onOnboardingComplete?.({\n      name: updatedUser.name,\n      image_url: updatedUser.image_url,\n      ccphone: updatedUser.ccphone || undefined,\n      phone: updatedUser.phone || undefined,\n      email: updatedUser.email || undefined,\n      address: updatedUser.address || undefined,\n      town: updatedUser.town || undefined,\n      country: updatedUser.country || undefined,\n        user_infos: {\n          reference: updatedUser.reference,\n          name: updatedUser.name,\n          email: updatedUser.email || null,\n        ccphone: updatedUser.ccphone,\n        phone: updatedUser.phone,\n        address: updatedUser.address,\n        town: updatedUser.town,\n          country: updatedUser.country,\n          image_url: updatedUser.image_url,\n          auth_2fa: updatedUser.auth_2fa,\n          alias_reference: updatedUser.alias_reference,\n        },\n      });\n    if (!debugOnboardingState) {\n      markProfilePromptComplete();\n    }\n    void refreshSessionProfile(true);\n  }, [pendingSession, debugOnboardingState, onOnboardingComplete, persistSessionUser, refreshSessionProfile]);\n\n  const handleOnboardingUserInfosSync = useCallback((payload: {\n    source: 'hydration' | 'update' | 'avatar' | 'contact';\n    user_infos: UserInfos;\n  }) => {\n    const activeSession = debugOnboardingState || pendingSession;\n    if (!activeSession) return;\n\n    const syncedUser = {\n      ...activeSession.sourceUser,\n      ...payload.user_infos,\n    } as NativeUser;\n\n    persistSessionUser(activeSession.token, syncedUser);\n\n    if (debugOnboardingState) {\n      setDebugOnboardingState(prev => prev ? {\n        ...prev,\n        user: syncedUser,\n        sourceUser: syncedUser,\n      } : prev);\n    } else {\n      setPendingSession(prev => prev ? {\n        ...prev,\n        user: syncedUser,\n        sourceUser: syncedUser,\n      } : prev);\n    }\n  }, [debugOnboardingState, pendingSession, persistSessionUser]);\n\n  const handleOnboardingSkip = useCallback(() => {\n    const activeSession = debugOnboardingState || pendingSession;\n    if (!activeSession) return;\n    setShowOnboarding(false);\n    setPendingSession(null);\n    setDebugOnboardingState(null);\n    if (!debugOnboardingState) {\n      persistSessionUser(activeSession.token, activeSession.user);\n      snoozeProfilePrompt(PROFILE_PROMPT_SNOOZE_MS / (60 * 60 * 1000));\n      try {\n        onLoginSuccess?.(activeSession.token, activeSession.user as unknown as UserInfos);\n      } catch (callbackError) {\n        console.error('Erreur dans le callback onLoginSuccess du wrapper SSO', callbackError);\n      }\n      beginRedirect(redirectAfterLogin, 'login');\n      return;\n    }\n  }, [pendingSession, debugOnboardingState, onLoginSuccess, redirectAfterLogin, persistSessionUser, beginRedirect]);\n\n  const handleOnboardingDismiss = useCallback(() => {\n    setShowOnboarding(false);\n    setPendingSession(null);\n    setDebugOnboardingState(null);\n  }, []);\n\n  const handleLogout = useCallback(async () => {\n    await logout();\n    setSession(null);\n    setPendingSession(null);\n    setDebugOnboardingState(null);\n    clearOnboardingTimers();\n    onLogout?.();\n    beginRedirect(redirectAfterLogout, 'logout');\n  }, [onLogout, redirectAfterLogout, clearOnboardingTimers, beginRedirect]);\n\n  const openDebugLogin = useCallback(() => {\n    clearOnboardingTimers();\n    setShowOnboarding(false);\n    setPendingSession(null);\n    setDebugOnboardingState(null);\n    setModal('login');\n  }, [clearOnboardingTimers]);\n\n  const openDebugSignup = useCallback(() => {\n    clearOnboardingTimers();\n    setShowOnboarding(false);\n    setPendingSession(null);\n    setDebugOnboardingState(null);\n    setModal('signup');\n  }, [clearOnboardingTimers]);\n\n  useEffect(() => {\n    if (!session?.token || !redirectAfterLogin || redirectingTarget) return;\n    beginRedirect(redirectAfterLogin, 'already-authenticated');\n  }, [session?.token, redirectAfterLogin, redirectingTarget, beginRedirect]);\n\n  const openDebugOnboarding = useCallback((preset: DebugOnboardingPreset = 'current') => {\n    if (!session) return;\n    clearOnboardingTimers();\n    setModal('none');\n    const simulatedUser = makeDebugOnboardingUser(session.user, preset);\n    setDebugOnboardingState({\n      token: session.token,\n      user: simulatedUser,\n      sourceUser: session.user,\n      preset,\n      variant: 'edit',\n    });\n    setPendingSession(null);\n    setShowOnboarding(true);\n  }, [session, clearOnboardingTimers, makeDebugOnboardingUser]);\n\n  const resetDebugProfilePrompt = useCallback(() => {\n    setProfilePromptState(false, Date.now() + PROFILE_PROMPT_SNOOZE_MS);\n    if (session) {\n      clearOnboardingTimers();\n      setDebugOnboardingState(null);\n      setPendingSession({ ...session, sourceUser: session.user });\n      setShowOnboarding(true);\n    }\n  }, [session, clearOnboardingTimers]);\n\n  const openDebugPassword = useCallback(() => {\n    setPasswordRedirectOpen(true);\n  }, []);\n\n  useEffect(() => {\n    syncProfilePrompt(session);\n    return () => {\n      clearOnboardingTimers();\n    };\n  }, [session, syncProfilePrompt, clearOnboardingTimers]);\n\n  useEffect(() => {\n    if (!session?.token) return;\n    if (!showOnboarding && !debugOnboardingState) return;\n    void refreshSessionProfile();\n  }, [session?.token, showOnboarding, debugOnboardingState, refreshSessionProfile]);\n\n  useEffect(() => {\n    if (!session?.token) return;\n\n    const syncUserInfos = async () => {\n      try {\n        const response = await nativeAuthService.checkToken(session.token);\n        if (!response.valid || !response.user) {\n          await refreshSessionProfile(true);\n          return;\n        }\n\n        const storedRaw = getNativeStorage().getItem(STORAGE_KEYS.USER);\n\n        let storedUser: Record<string, unknown> = session.user as unknown as Record<string, unknown>;\n        if (storedRaw) {\n          try {\n            storedUser = JSON.parse(storedRaw);\n          } catch {\n            // keep current session user\n          }\n        }\n\n        const mergedUser = { ...storedUser, ...response.user } as NativeUser;\n        persistSessionUser(session.token, mergedUser);\n\n        if (isProfileComplete(mergedUser)) {\n          markProfilePromptComplete();\n          setShowOnboarding(false);\n          setPendingSession(null);\n        }\n      } catch {\n        await refreshSessionProfile(true);\n      }\n    };\n\n    if (profileSyncTimerRef.current) {\n      clearInterval(profileSyncTimerRef.current);\n      profileSyncTimerRef.current = null;\n    }\n\n    profileSyncTimerRef.current = setInterval(syncUserInfos, PROFILE_SYNC_INTERVAL_MS);\n    return () => {\n      if (profileSyncTimerRef.current) {\n        clearInterval(profileSyncTimerRef.current);\n        profileSyncTimerRef.current = null;\n      }\n    };\n  }, [session?.token, session?.user, persistSessionUser, refreshSessionProfile]);\n\n  // Styles\n  const containerStyle: React.CSSProperties = {\n    minHeight: '100vh',\n    backgroundColor: COLORS.primary,\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'center',\n    padding: '1.5rem 1rem',\n  };\n\n  const cardStyle: React.CSSProperties = {\n    width: '100%',\n    maxWidth: '28rem',\n    backgroundColor: COLORS.card,\n    border: `1px solid ${COLORS.border}`,\n    borderRadius: '0.75rem',\n    boxShadow: COLORS.shadow,\n    overflow: 'hidden',\n  };\n\n  // Badge-style slider wrapper (shield circle + animated gradient pill)\n  const SliderBadge = () => (\n    <div style={{ width: '100%', maxWidth: '28rem', marginBottom: '1.5rem' }}>\n      {logoUrl ? (\n        <img src={logoUrl} alt=\"Logo\" style={{ height: '3rem', margin: '0 auto' }} />\n      ) : (\n        <div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>\n          {/* Shield circle */}\n          <div style={{\n            width: '3rem',\n            height: '3rem',\n            borderRadius: '50%',\n            backgroundColor: '#ffffff',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            flexShrink: 0,\n            boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n            border: `1px solid ${COLORS.border}`,\n          }}>\n            <ShieldCheckIcon size={22} color={COLORS.accent} />\n          </div>\n          {/* Animated gradient pill with slider */}\n          <div style={{\n            flex: 1,\n            minWidth: 0,\n            position: 'relative',\n            borderRadius: '9999px',\n            padding: '2px',\n            background: `linear-gradient(90deg, ${COLORS.primary}, ${COLORS.accent}, ${COLORS.primary})`,\n            backgroundSize: '200% 100%',\n            animation: 'ollaid-border-gradient 3s ease infinite',\n          }}>\n            <div style={{\n              backgroundColor: '#ffffff',\n              borderRadius: '9999px',\n              height: '3rem',\n              overflow: 'hidden',\n            }}>\n              <AppsLogoSlider iamApiUrl={iamApiUrl} speed=\"normal\" />\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n\n  if (redirectingTarget) {\n    return (\n      <div style={containerStyle}>\n        <TopBranding subtitle={title} />\n        <SliderBadge />\n\n        <div style={cardStyle}>\n          <div style={{ padding: '2rem 1.5rem 1.5rem', textAlign: 'center' }}>\n            <h2 style={{ fontSize: '1.25rem', fontWeight: 600, color: COLORS.cardForeground }}>\n              {redirectingReason === 'logout'\n                ? 'Déconnexion réussie'\n                : redirectingReason === 'already-authenticated'\n                  ? 'Session déjà valide'\n                  : 'Connexion réussie'}\n            </h2>\n            <p style={{ fontSize: '0.875rem', color: COLORS.muted, marginTop: '0.5rem' }}>\n              Redirection en cours...\n            </p>\n          </div>\n        </div>\n\n        <Footer hideFooter={hideFooter} />\n      </div>\n    );\n  }\n\n  if (session) {\n    return (\n      <div style={containerStyle}>\n        <TopBranding subtitle={title} />\n        <SliderBadge />\n\n        <div style={cardStyle}>\n          <div style={{ padding: '2rem 1.5rem 1.5rem' }}>\n            <h2 style={{ fontSize: '1.25rem', fontWeight: 600, textAlign: 'center', color: COLORS.cardForeground }}>\n              Bienvenue, {session.user.name}\n            </h2>\n            <p style={{ fontSize: '0.875rem', color: COLORS.muted, textAlign: 'center', marginTop: '0.25rem' }}>\n              Vous êtes connecté à votre compte Ollaid SSO\n            </p>\n            <div style={{ marginTop: '1.5rem' }}>\n              <Button variant=\"outline\" onClick={handleLogout} style={{ width: '100%' }}>\n                Déconnexion\n              </Button>\n            </div>\n          </div>\n        </div>\n\n        <Footer hideFooter={hideFooter} />\n\n        {(pendingSession || debugOnboardingState) && (\n          <OnboardingModal\n            open={showOnboarding}\n            onOpenChange={(open) => { if (!open) handleOnboardingSkip(); }}\n            onDismiss={handleOnboardingDismiss}\n            user={(debugOnboardingState || pendingSession)!.user}\n            variant={debugOnboardingState ? 'edit' : 'missing'}\n            profileHydrating={profileHydrating}\n            hydrateProfile={false}\n            onUserInfosSync={handleOnboardingUserInfosSync}\n            onComplete={handleOnboardingComplete}\n            onSkip={handleOnboardingSkip}\n          />\n        )}\n\n        {resolvedDebug && (\n          <DebugPanel\n            saasApiUrl={saasApiUrl}\n            iamApiUrl={iamApiUrl}\n            onOpenLogin={openDebugLogin}\n            onOpenSignup={openDebugSignup}\n            onOpenOnboarding={openDebugOnboarding}\n            onOpenPassword={openDebugPassword}\n            onResetProfilePrompt={resetDebugProfilePrompt}\n          />\n        )}\n\n        <PasswordRedirectModal\n          open={passwordRedirectOpen}\n          onOpenChange={setPasswordRedirectOpen}\n          saasApiUrl={saasApiUrl}\n        />\n      </div>\n    );\n  }\n\n  // Unauthenticated view\n  return (\n    <div style={containerStyle}>\n      <TopBranding subtitle={title} />\n      <SliderBadge />\n\n      {/* Main card */}\n      <div style={cardStyle}>\n        <div style={{ padding: '2rem 1.5rem 1.5rem' }}>\n          <p style={{ fontSize: '0.875rem', color: COLORS.muted, textAlign: 'center', marginBottom: '1.5rem' }}>\n            {description}\n          </p>\n\n          <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n            <Button onClick={openLogin} style={{ width: '100%', height: '2.75rem' }}>\n              Connexion\n            </Button>\n            <Button\n              variant=\"outline\"\n              onClick={openSignup}\n              style={{ width: '100%', height: '2.75rem', borderColor: COLORS.cardForeground, color: COLORS.cardForeground }}\n            >\n              Inscription\n            </Button>\n          </div>\n        </div>\n      </div>\n\n      <Footer hideFooter={hideFooter} />\n\n      <LoginModal\n        open={modal === 'login'}\n        onOpenChange={open => { if (open) openLogin(); else closeModal(); }}\n        onSwitchToSignup={switchToSignup}\n        onLoginSuccess={handleLoginSuccess}\n        saasApiUrl={saasApiUrl}\n        iamApiUrl={iamApiUrl}\n        logoUrl={logoUrl}\n        homeUrl={homeUrl}\n        defaultAccountType={accountType}\n        initialPhone={loginInitialPhone}\n      />\n\n      <SignupModal\n        open={modal === 'signup'}\n        onOpenChange={open => { if (!open) closeModal(); }}\n        onSwitchToLogin={switchToLogin}\n        onSwitchToLoginWithPhone={switchToLoginWithPhone}\n        onSignupSuccess={handleLoginSuccess}\n        saasApiUrl={saasApiUrl}\n        iamApiUrl={iamApiUrl}\n        logoUrl={logoUrl}\n        homeUrl={homeUrl}\n        defaultAccountType={accountType}\n      />\n\n      {(pendingSession || debugOnboardingState) && (\n      <OnboardingModal\n        open={showOnboarding}\n        onOpenChange={(open) => { if (!open) handleOnboardingSkip(); }}\n        onDismiss={handleOnboardingDismiss}\n        user={(debugOnboardingState || pendingSession)!.user}\n        variant={debugOnboardingState ? 'edit' : 'missing'}\n        profileHydrating={profileHydrating}\n        hydrateProfile={false}\n        onUserInfosSync={handleOnboardingUserInfosSync}\n        onComplete={handleOnboardingComplete}\n        onSkip={handleOnboardingSkip}\n      />\n      )}\n\n      {resolvedDebug && (\n        <DebugPanel\n          saasApiUrl={saasApiUrl}\n          iamApiUrl={iamApiUrl}\n          onOpenLogin={openDebugLogin}\n          onOpenSignup={openDebugSignup}\n          onOpenOnboarding={openDebugOnboarding}\n          onOpenPassword={openDebugPassword}\n          onResetProfilePrompt={resetDebugProfilePrompt}\n        />\n      )}\n\n      <PasswordRedirectModal\n        open={passwordRedirectOpen}\n        onOpenChange={setPasswordRedirectOpen}\n        saasApiUrl={saasApiUrl}\n      />\n    </div>\n  );\n}\n\nexport default NativeSSOPage;\n","/* eslint-disable react-refresh/only-export-components */\n/**\n * NativeSSOProvider — React Context pour @ollaid/native-sso\n * Centralise la configuration pour les hooks et composants individuels\n * \n * @version 2.7.9\n */\n\nimport { createContext, useContext, useEffect, useRef, type ReactNode } from 'react';\nimport { setNativeAuthConfig, setNativeStorage, type NativeAuthConfig, type NativeStorageAdapter } from './services/api';\n\nexport interface NativeSSOConfig {\n  /** URL du Backend SaaS (ex: https://mon-saas.com/api) */\n  saasApiUrl: string;\n  /** URL du Backend IAM (ex: https://identityam.ollaid.com/api) */\n  iamApiUrl: string;\n  /** Timeout en ms (défaut: 30000) */\n  timeout?: number;\n  /** Mode debug (logs console) */\n  debug?: boolean;\n  /** Stockage injectable pour les apps natives / Capacitor */\n  storage?: NativeStorageAdapter;\n}\n\nconst NativeSSOContext = createContext<NativeSSOConfig | null>(null);\n\nexport interface NativeSSOProviderProps {\n  config: NativeSSOConfig;\n  children: ReactNode;\n}\n\n/**\n * Provider React pour centraliser la config SSO.\n * \n * Usage :\n * ```tsx\n * <NativeSSOProvider config={{ saasApiUrl: '...', iamApiUrl: '...' }}>\n *   <App />\n * </NativeSSOProvider>\n * ```\n */\nexport function NativeSSOProvider({ config, children }: NativeSSOProviderProps) {\n  const configuredRef = useRef(false);\n\n  if (config.storage) {\n    setNativeStorage(config.storage);\n  }\n\n  useEffect(() => {\n    if (!configuredRef.current) {\n      setNativeAuthConfig(config);\n      configuredRef.current = true;\n    }\n  }, [config]);\n\n  return (\n    <NativeSSOContext.Provider value={config}>\n      {children}\n    </NativeSSOContext.Provider>\n  );\n}\n\n/**\n * Hook pour accéder à la config SSO depuis le Provider.\n * Optionnel : les hooks acceptent aussi la config en paramètre.\n */\nexport function useNativeSSOConfig(): NativeSSOConfig {\n  const ctx = useContext(NativeSSOContext);\n  if (!ctx) {\n    throw new Error('useNativeSSOConfig doit être utilisé dans un <NativeSSOProvider>');\n  }\n  return ctx;\n}\n\nexport default NativeSSOProvider;\n","/**\n * Hook React pour la déconnexion sécurisée.\n * \n * Wrape `logout()` avec gestion d'état (loading, error)\n * et callbacks (onSuccess, onError) pour une intégration UX simple.\n * \n * @example\n * ```tsx\n * import { useLogout } from '@ollaid/native-sso';\n * \n * const LogoutButton = () => {\n *   const { logout, loading, error } = useLogout({\n *     onSuccess: () => navigate('/auth/login'),\n *     onError: (err) => toast.error(err.message),\n *   });\n * \n *   return (\n *     <button onClick={logout} disabled={loading}>\n *       {loading ? 'Déconnexion...' : 'Se déconnecter'}\n *     </button>\n *   );\n * };\n * ```\n * \n * @version 2.7.9\n */\n\nimport { useState, useCallback } from 'react';\nimport { logout } from '../services/api';\n\nexport interface UseLogoutOptions {\n  /** Callback appelé après une déconnexion réussie (redirection, toast, etc.) */\n  onSuccess?: () => void;\n  /** Callback appelé en cas d'erreur (notification, log, etc.) */\n  onError?: (error: Error) => void;\n}\n\nexport interface UseLogoutReturn {\n  /** Déclenche la déconnexion complète (double revocation SaaS + IAM) */\n  logout: () => Promise<void>;\n  /** `true` pendant l'appel de déconnexion */\n  loading: boolean;\n  /** Message d'erreur si la déconnexion a échoué, `null` sinon */\n  error: string | null;\n}\n\nexport const useLogout = (options?: UseLogoutOptions): UseLogoutReturn => {\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const handleLogout = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      await logout();\n      options?.onSuccess?.();\n    } catch (err) {\n      const message = err instanceof Error ? err.message : 'Erreur de déconnexion';\n      setError(message);\n      options?.onError?.(err instanceof Error ? err : new Error(message));\n    } finally {\n      setLoading(false);\n    }\n  }, [options]);\n\n  return { logout: handleLogout, loading, error };\n};\n","/**\n * Service IAM Account — APIs server-to-server\n * link-phone, link-email, refresh-user-info, update-avatar, reset-avatar\n * \n * ⚠️ ATTENTION — SERVER-TO-SERVER UNIQUEMENT\n * Ces APIs utilisent la `secret_key` de votre application IAM.\n * Elles doivent être appelées EXCLUSIVEMENT depuis un backend (Node.js, PHP, etc.).\n * Ne JAMAIS appeler ces méthodes depuis du code frontend/navigateur car la\n * secret_key serait exposée dans les DevTools réseau.\n * \n * @version 2.7.9\n */\n\nimport { fetchWithTimeout, getHeaders, getNativeAuthConfig } from './api';\nimport { nativeAuthService } from './nativeAuth';\n\nimport type {\n  LinkPhoneRequest,\n  LinkPhoneResponse,\n  LinkEmailRequest,\n  LinkEmailResponse,\n  RefreshUserInfoSingleRequest,\n  RefreshUserInfoSingleResponse,\n  RefreshUserInfoBulkRequest,\n  RefreshUserInfoBulkResponse,\n  UpdateAvatarRequest,\n  UpdateAvatarResponse,\n  ResetAvatarRequest,\n  ResetAvatarResponse,\n} from '../types/native';\n\n// ============================================\n// Helper — auto-fill credentials if available\n// ============================================\n\nfunction getCredentialsOrThrow(params: { app_key?: string; secret_key?: string }) {\n  const app_key = params.app_key;\n  const secret_key = params.secret_key;\n\n  if (!app_key || !secret_key) {\n    throw new Error('app_key et secret_key sont requis en paramètre. Ces APIs sont server-to-server et ne peuvent pas utiliser les encrypted_credentials.');\n  }\n\n  return { app_key, secret_key };\n}\n\n// ============================================\n// Service\n// ============================================\n\nexport const iamAccountService = {\n\n  /**\n   * Lier un numéro de téléphone à un compte utilisateur existant\n   * POST {iamApiUrl}/sso/link-phone\n   */\n  async linkPhone(params: Partial<Pick<LinkPhoneRequest, 'app_key' | 'secret_key'>> & Omit<LinkPhoneRequest, 'app_key' | 'secret_key'>): Promise<LinkPhoneResponse> {\n    const config = getNativeAuthConfig();\n    const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n    return fetchWithTimeout<LinkPhoneResponse>(\n      `${config.iamApiUrl}/sso/link-phone`,\n      {\n        method: 'POST',\n        headers: getHeaders(),\n        body: JSON.stringify({\n          app_key,\n          secret_key,\n          reference: params.reference,\n          ccphone: params.ccphone,\n          phone: params.phone,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  /**\n   * Lier une adresse email à un compte utilisateur existant\n   * POST {iamApiUrl}/sso/link-email\n   */\n  async linkEmail(params: Partial<Pick<LinkEmailRequest, 'app_key' | 'secret_key'>> & Omit<LinkEmailRequest, 'app_key' | 'secret_key'>): Promise<LinkEmailResponse> {\n    const config = getNativeAuthConfig();\n    const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n    return fetchWithTimeout<LinkEmailResponse>(\n      `${config.iamApiUrl}/sso/link-email`,\n      {\n        method: 'POST',\n        headers: getHeaders(),\n        body: JSON.stringify({\n          app_key,\n          secret_key,\n          reference: params.reference,\n          email: params.email,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  /**\n   * Récupérer les user_infos d'un utilisateur (mode single)\n   * POST {iamApiUrl}/sso/refresh-user-info\n   */\n  async refreshUserInfo(params: Partial<Pick<RefreshUserInfoSingleRequest, 'secret_key'>> & Omit<RefreshUserInfoSingleRequest, 'secret_key'>): Promise<RefreshUserInfoSingleResponse> {\n    const config = getNativeAuthConfig();\n    \n    const secret_key = params.secret_key;\n\n    if (!secret_key) {\n      throw new Error('secret_key est requis. Chargez les credentials ou passez-la en paramètre.');\n    }\n\n    return fetchWithTimeout<RefreshUserInfoSingleResponse>(\n      `${config.iamApiUrl}/sso/refresh-user-info`,\n      {\n        method: 'POST',\n        headers: getHeaders(),\n        body: JSON.stringify({\n          secret_key,\n          alias_reference: params.alias_reference,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  /**\n   * Récupérer les user_infos en bulk (max 100 alias_references)\n   * POST {iamApiUrl}/sso/refresh-user-info\n   */\n  async refreshUserInfoBulk(params: Partial<Pick<RefreshUserInfoBulkRequest, 'secret_key'>> & Omit<RefreshUserInfoBulkRequest, 'secret_key'>): Promise<RefreshUserInfoBulkResponse> {\n    const config = getNativeAuthConfig();\n    \n    const secret_key = params.secret_key;\n\n    if (!secret_key) {\n      throw new Error('secret_key est requis. Chargez les credentials ou passez-la en paramètre.');\n    }\n\n    if (params.alias_references.length > 100) {\n      throw new Error('Maximum 100 alias_references par requête bulk.');\n    }\n\n    return fetchWithTimeout<RefreshUserInfoBulkResponse>(\n      `${config.iamApiUrl}/sso/refresh-user-info`,\n      {\n        method: 'POST',\n        headers: getHeaders(),\n        body: JSON.stringify({\n          secret_key,\n          alias_references: params.alias_references,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  /**\n   * Mettre à jour l'avatar d'un utilisateur pour une application spécifique\n   * POST {iamApiUrl}/sso/update-avatar\n   */\n  async updateAvatar(params: Partial<Pick<UpdateAvatarRequest, 'app_key' | 'secret_key'>> & Omit<UpdateAvatarRequest, 'app_key' | 'secret_key'>): Promise<UpdateAvatarResponse> {\n    const config = getNativeAuthConfig();\n    const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n    return fetchWithTimeout<UpdateAvatarResponse>(\n      `${config.iamApiUrl}/sso/update-avatar`,\n      {\n        method: 'POST',\n        headers: getHeaders(),\n        body: JSON.stringify({\n          app_key,\n          secret_key,\n          alias_reference: params.alias_reference,\n          avatar_url: params.avatar_url,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n\n  /**\n   * Réinitialiser l'avatar d'un utilisateur (remettre à null pour utiliser l'image globale)\n   * POST {iamApiUrl}/sso/reset-avatar\n   */\n  async resetAvatar(params: Partial<Pick<ResetAvatarRequest, 'app_key' | 'secret_key'>> & Omit<ResetAvatarRequest, 'app_key' | 'secret_key'>): Promise<ResetAvatarResponse> {\n    const config = getNativeAuthConfig();\n    const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n    return fetchWithTimeout<ResetAvatarResponse>(\n      `${config.iamApiUrl}/sso/reset-avatar`,\n      {\n        method: 'POST',\n        headers: getHeaders(),\n        body: JSON.stringify({\n          app_key,\n          secret_key,\n          alias_reference: params.alias_reference,\n        }),\n      },\n      config.timeout || 30000\n    );\n  },\n};\n"],"names":["jsxs","jsx","createContext","useEffect","useContext","forwardRef","useRef","useState","module","this","Math","undefined","global","require","C","require$$0","n","H","require$$1","require$$2","hmac","CBC","require$$3","require$$4","SUB_MIX_0","SUB_MIX_1","SUB_MIX_2","SUB_MIX_3","SBOX","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","CryptoJS.AES","CryptoJS.enc","nativeAuthService","duration","config","STORAGE_KEYS","getErrorMessage","useCallback","iconCircle","backBtnStyle","Fragment","logout","storage","SSO_VERSION","brandLinkPill","brandRowStyle","linkStyle","Icon","_a","_b","_c","_d","_e","_f","useMemo","maxSize","size","open","createElement","Loader2"],"mappings":"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e,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,SAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,WAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,WAAY,UAAU;AAAA,UAC7E,eAAe,WAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,SAAU;AAAA,UAC7E,eAAe,YAAY,SAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,SAAU;AAAA,UAC7E,eAAe,WAAY,UAAU;AAAA,UAAG,eAAe,WAAY,UAAU;AAAA,UAC7E,eAAe,WAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,SAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,WAAY,UAAU;AAAA,UAAG,eAAe,WAAY,SAAU;AAAA,UAC7E,eAAe,WAAY,UAAU;AAAA,UAAG,eAAe,WAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,SAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,SAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,YAAY,UAAU;AAAA,UAC7E,eAAe,YAAY,UAAU;AAAA,UAAG,eAAe,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,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,UAAU;AAAA,UAClD;AAAA,YAAI;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,UAAU;AAAA,UAClD;AAAA,YAAI;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,UAAU;AAAA,UAClD;AAAA,YAAI;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;AAAA,YAAY;AAAA,YAAY;AAAA,YAAY;AAAA,YACpC;A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","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,60,61,62,63,64,65,66,67]}