@getcredify/credify-insurance-widget 1.7.0 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/components/Field.tsx","../src/components/TextInput.tsx","../src/components/NumericInput.tsx","../src/components/EmailInput.tsx","../src/components/TelInput.tsx","../src/components/UrlInput.tsx","../src/components/PasswordInput.tsx","../src/components/TextArea.tsx","../src/components/DateInput.tsx","../src/components/Checkbox.tsx","../src/components/Radio.tsx","../src/components/SelectInput.tsx","../src/components/AddressAutocomplete.tsx","../src/utils/form.ts","../src/components/FormRenderer.tsx","../src/utils/gtm.ts","../src/components/FormWizard.tsx","../src/utils/storage.ts","../src/utils/api.ts","../src/components/Rates.tsx","../src/utils/quoteToFormValues.ts","../src/components/Widget.tsx","../src/internal/WidgetController.tsx","../src/widget.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type FieldProps = {\n id: string;\n label: string;\n hint?: string;\n error?: string;\n required?: boolean;\n className?: string;\n children: ReactNode;\n};\n\nexport function Field({ id, label, hint, error, required, className, children }: FieldProps) {\n return (\n <div className={className}>\n <label htmlFor={id} className=\"form-label\">\n {label} {required && <span className=\"text-red-600\">*</span>}\n </label>\n {children}\n {hint && !error && (\n <p id={`${id}-hint`} className=\"mt-1 text-sm text-slate-500\">\n {hint}\n </p>\n )}\n {error && (\n <p id={`${id}-error`} className=\"mt-1 text-sm text-red-600\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id'>;\n\nexport function TextInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n type=\"text\"\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function NumericInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"number\"\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function EmailInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"email\"\n className={`form-input ${error ? 'input-error' : ''}`}\n inputMode=\"email\"\n autoComplete=\"email\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport type { InputHTMLAttributes, ChangeEvent } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type' | 'value' | 'onChange'> & {\n value?: string;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n };\n\n/**\n * Formats a phone number string to (XXX) XXX - XXXX format\n * Only formats if there are 10 digits (US phone number)\n */\nfunction formatPhoneNumber(value: string): string {\n // Remove all non-digit characters\n const digits = value.replace(/\\D/g, '');\n\n // If we have 10 digits, format as (XXX) XXX - XXXX\n if (digits.length === 10) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)} - ${digits.slice(6)}`;\n }\n\n // If we have more than 10 digits, format the first 10\n if (digits.length > 10) {\n const tenDigits = digits.slice(0, 10);\n return `(${tenDigits.slice(0, 3)}) ${tenDigits.slice(3, 6)} - ${tenDigits.slice(6)}`;\n }\n\n // Partial formatting as user types\n if (digits.length >= 6) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)} - ${digits.slice(6)}`;\n }\n if (digits.length >= 3) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3)}`;\n }\n if (digits.length > 0) {\n return `(${digits}`;\n }\n\n return digits;\n}\n\n/**\n * Extracts only digits from a phone number string\n */\nfunction extractDigits(value: string): string {\n return value.replace(/\\D/g, '');\n}\n\nexport function TelInput({ id, label, hint, error, required, className, value = '', onChange, ...rest }: Props) {\n const [displayValue, setDisplayValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef<number>(0);\n\n // Update display value when prop value changes\n useEffect(() => {\n if (!value) {\n setDisplayValue('');\n return;\n }\n\n // Extract digits, handling cases where value might include +1 or just be digits\n let digits = extractDigits(value);\n\n // If value starts with +1 or 1, remove the leading 1 (country code)\n if (digits.length === 11 && digits.startsWith('1')) {\n digits = digits.slice(1);\n }\n\n // Limit to 10 digits for US phone numbers\n const limitedDigits = digits.slice(0, 10);\n setDisplayValue(formatPhoneNumber(limitedDigits));\n }, [value]);\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const input = e.target;\n const inputValue = input.value;\n\n // Save cursor position before formatting\n cursorPositionRef.current = input.selectionStart || 0;\n\n // Extract digits from input\n const digits = extractDigits(inputValue);\n\n // Limit to 10 digits for US phone numbers\n const limitedDigits = digits.slice(0, 10);\n\n // Format the display value\n const formatted = formatPhoneNumber(limitedDigits);\n setDisplayValue(formatted);\n\n // Create a synthetic event with the unformatted digits (with +1 prefix)\n // The actual stored value will be +1 followed by the 10 digits\n const rawValue = limitedDigits.length === 10 ? `+1${limitedDigits}` : limitedDigits;\n\n // Create a new event with the raw value\n const syntheticEvent = {\n ...e,\n currentTarget: {\n ...e.currentTarget,\n value: rawValue\n },\n target: {\n ...e.target,\n value: rawValue\n }\n } as ChangeEvent<HTMLInputElement>;\n\n // Call the original onChange with the raw value\n onChange?.(syntheticEvent);\n\n // Restore cursor position after a short delay to allow React to update\n setTimeout(() => {\n if (inputRef.current) {\n // Calculate new cursor position based on formatting\n const beforeCursor = inputValue.slice(0, cursorPositionRef.current);\n const digitsBeforeCursor = extractDigits(beforeCursor);\n const formattedBeforeCursor = formatPhoneNumber(digitsBeforeCursor);\n // Position cursor at the end of the formatted text that corresponds to the digits before cursor\n const newPosition = Math.min(formattedBeforeCursor.length, formatted.length);\n inputRef.current.setSelectionRange(newPosition, newPosition);\n }\n }, 0);\n };\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <div\n className={`tel-input-wrapper flex items-center border rounded-lg transition-colors w-full relative ${\n error ? 'border-red-500 error' : 'border-[var(--accent-color)] focus-within:border-[var(--primary-color)]'\n }`}\n >\n <label\n htmlFor={id}\n className=\"px-3 py-3 text-slate-700 font-medium border-r border-[var(--accent-color)] bg-slate-50 flex-shrink-0 relative z-0 rounded-l-lg\"\n >\n +1\n </label>\n <input\n ref={inputRef}\n id={id}\n type=\"tel\"\n className={`flex-1 px-4 py-3 border-0 rounded-r-lg outline-none bg-transparent text-[var(--text-primary)] text-base ${\n error ? 'input-error' : ''\n }`}\n inputMode=\"tel\"\n autoComplete=\"tel\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n value={displayValue}\n onChange={handleChange}\n {...rest}\n />\n </div>\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function UrlInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"url\"\n className={`form-input ${error ? 'input-error' : ''}`}\n inputMode=\"url\"\n autoComplete=\"url\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function PasswordInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"password\"\n className={`form-input ${error ? 'input-error' : ''}`}\n autoComplete=\"current-password\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import type { TextareaHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'id'>;\n\nexport function TextArea({ id, label, hint, error, required, className, rows = 4, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <textarea\n id={id}\n rows={rows}\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function DateInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"date\"\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\n\ntype Props = {\n id: string;\n label: string;\n className?: string;\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'id'>;\n\nexport function Checkbox({ id, label, className, ...rest }: Props) {\n return (\n <label className={`checkbox-card ${className || ''}`} htmlFor={id}>\n <input id={id} type=\"checkbox\" className=\"checkbox-input\" {...rest} />\n <span className=\"checkbox-label\">{label}</span>\n </label>\n );\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react';\n\nexport function Radio({\n name,\n value,\n checked,\n onChange,\n children\n}: {\n name: string;\n value: string;\n checked?: boolean;\n onChange?: InputHTMLAttributes<HTMLInputElement>['onChange'];\n children: ReactNode;\n}) {\n return (\n <label className=\"radio-card\">\n <input className=\"radio-input\" type=\"radio\" name={name} value={value} checked={checked} onChange={onChange} />\n <span className=\"radio-label\">{children}</span>\n </label>\n );\n}\n\nexport function RadioGroup({\n legend,\n children,\n className,\n legendClassName // NEW\n}: {\n legend: string;\n className?: string; // still applies to <fieldset>\n legendClassName?: string; // NEW: applies to <legend>\n children: ReactNode;\n}) {\n return (\n <fieldset className={className}>\n <legend className={`mb-4 text-base font-medium ${legendClassName || ''}`} style={{ color: 'var(--text-primary)' }}>\n {legend}\n </legend>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">{children}</div>\n </fieldset>\n );\n}\n","import type { SelectHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\nexport type SelectOption = {\n value: string;\n label: string;\n disabled?: boolean;\n};\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<SelectHTMLAttributes<HTMLSelectElement>, 'id'> & {\n /** If provided, renders a disabled first option prompting selection */\n placeholder?: string;\n /** Provide options as data (or pass custom children instead) */\n options?: SelectOption[];\n };\n\nexport function SelectInput({ id, label, hint, error, required, className, placeholder, options, children, ...rest }: Props) {\n const describedBy = [hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined;\n\n const hasCustomChildren = !!children;\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <select\n id={id}\n className={`form-input select-caret ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={describedBy}\n required={required}\n {...rest}\n >\n {placeholder && (\n <option value=\"\" disabled selected={!('value' in rest)}>\n {placeholder}\n </option>\n )}\n\n {hasCustomChildren\n ? children\n : options?.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n </select>\n </Field>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\n// cspell:disable-next-line\nconst GOOGLE_MAPS_API_KEY = 'AIzaSyDjLdKLxoa-maLNGAyq_I_2r_Fe_TzFikw';\n\ntype AddressComponents = {\n streetNumber?: string;\n streetName?: string;\n city?: string;\n state?: string;\n zipCode?: string;\n country?: string;\n fullAddress?: string;\n};\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type' | 'onChange'> & {\n onChange?: (value: string, components?: AddressComponents) => void;\n onPlaceSelect?: (place: google.maps.places.PlaceResult) => void;\n };\n\n// Load Google Maps script dynamically\nfunction loadGoogleMapsScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script is already loaded\n if (window.google?.maps?.places) {\n resolve();\n return;\n }\n\n // Check if script is already being loaded\n const existingScript = document.querySelector('script[src*=\"maps.googleapis.com\"]');\n if (existingScript) {\n existingScript.addEventListener('load', () => resolve());\n existingScript.addEventListener('error', () => reject(new Error('Failed to load Google Maps script')));\n return;\n }\n\n // Create and load the script\n const script = document.createElement('script');\n script.src = `https://maps.googleapis.com/maps/api/js?key=${GOOGLE_MAPS_API_KEY}&libraries=places`;\n script.async = true;\n script.defer = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Google Maps script'));\n document.head.appendChild(script);\n });\n}\n\n// Extract address components from Google Places result\nfunction extractAddressComponents(place: google.maps.places.PlaceResult): AddressComponents {\n const components: AddressComponents = {\n fullAddress: place.formatted_address\n };\n\n if (place.address_components) {\n place.address_components.forEach((component) => {\n const types = component.types;\n\n if (types.includes('street_number')) {\n components.streetNumber = component.long_name;\n }\n if (types.includes('route')) {\n components.streetName = component.long_name;\n }\n if (types.includes('locality')) {\n components.city = component.long_name;\n }\n if (types.includes('administrative_area_level_1')) {\n components.state = component.short_name;\n }\n if (types.includes('postal_code')) {\n components.zipCode = component.long_name;\n }\n if (types.includes('country')) {\n components.country = component.short_name;\n }\n });\n }\n\n return components;\n}\n\nexport function AddressAutocomplete({ id, label, hint, error, required, className, onChange, onPlaceSelect, value, ...rest }: Props) {\n const inputRef = useRef<HTMLInputElement>(null);\n const autocompleteServiceRef = useRef<google.maps.places.AutocompleteService | null>(null);\n const placesServiceRef = useRef<google.maps.places.PlacesService | null>(null);\n const suggestionsContainerRef = useRef<HTMLDivElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [inputValue, setInputValue] = useState((value as string) || '');\n const [suggestions, setSuggestions] = useState<google.maps.places.AutocompletePrediction[]>([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n\n // Use refs for state values used in event handlers to avoid dependency issues\n const suggestionsRef = useRef<google.maps.places.AutocompletePrediction[]>([]);\n const showSuggestionsRef = useRef(false);\n const selectedIndexRef = useRef(-1);\n\n // Keep refs in sync with state\n useEffect(() => {\n suggestionsRef.current = suggestions;\n }, [suggestions]);\n\n useEffect(() => {\n showSuggestionsRef.current = showSuggestions;\n }, [showSuggestions]);\n\n useEffect(() => {\n selectedIndexRef.current = selectedIndex;\n }, [selectedIndex]);\n\n useEffect(() => {\n // Update input value when value prop changes\n if (value !== undefined) {\n setInputValue(String(value));\n }\n }, [value]);\n\n // Debounce timer ref\n const debounceTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n if (!inputRef.current) return;\n\n let isMounted = true;\n\n // Load Google Maps script and initialize services\n loadGoogleMapsScript()\n .then(() => {\n if (!isMounted || !inputRef.current) return;\n\n // Initialize services\n autocompleteServiceRef.current = new google.maps.places.AutocompleteService();\n placesServiceRef.current = new google.maps.places.PlacesService(document.createElement('div'));\n\n setIsLoading(false);\n })\n .catch((err) => {\n console.error('Error loading Google Maps:', err);\n setIsLoading(false);\n });\n\n return () => {\n isMounted = false;\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n // Handle input changes with debouncing\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setInputValue(query);\n onChange?.(query);\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n\n if (query.length < 3) {\n setSuggestions([]);\n setShowSuggestions(false);\n return;\n }\n\n // Debounce API calls\n debounceTimerRef.current = setTimeout(() => {\n if (!autocompleteServiceRef.current) return;\n\n autocompleteServiceRef.current.getPlacePredictions(\n {\n input: query,\n types: ['address']\n },\n (predictions, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK && predictions) {\n setSuggestions(predictions);\n setShowSuggestions(true);\n setSelectedIndex(-1);\n } else {\n setSuggestions([]);\n setShowSuggestions(false);\n }\n }\n );\n }, 300);\n };\n\n // Handle keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!showSuggestionsRef.current || suggestionsRef.current.length === 0) {\n if (e.key === 'Escape') {\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setSelectedIndex((prev) => {\n const newIndex = prev < suggestionsRef.current.length - 1 ? prev + 1 : prev;\n selectedIndexRef.current = newIndex;\n return newIndex;\n });\n break;\n case 'ArrowUp':\n e.preventDefault();\n setSelectedIndex((prev) => {\n const newIndex = prev > 0 ? prev - 1 : -1;\n selectedIndexRef.current = newIndex;\n return newIndex;\n });\n break;\n case 'Enter':\n e.preventDefault();\n if (selectedIndexRef.current >= 0 && selectedIndexRef.current < suggestionsRef.current.length) {\n handleSuggestionClick(suggestionsRef.current[selectedIndexRef.current]);\n }\n break;\n case 'Escape':\n e.preventDefault();\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n break;\n }\n };\n\n // Handle clicks outside to close suggestions\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n suggestionsContainerRef.current &&\n !suggestionsContainerRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n }\n };\n\n if (showSuggestions) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showSuggestions]);\n\n const handleSuggestionClick = (prediction: google.maps.places.AutocompletePrediction) => {\n if (!placesServiceRef.current) return;\n\n placesServiceRef.current.getDetails(\n {\n placeId: prediction.place_id,\n fields: ['address_components', 'formatted_address', 'geometry']\n },\n (place, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK && place) {\n const formattedAddress = place.formatted_address || '';\n setInputValue(formattedAddress);\n setShowSuggestions(false);\n setSuggestions([]);\n showSuggestionsRef.current = false;\n\n const addressComponents = extractAddressComponents(place);\n\n onChange?.(formattedAddress, addressComponents);\n onPlaceSelect?.(place);\n }\n }\n );\n };\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <div className=\"relative\">\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n className={`form-input ${error ? 'input-error' : ''}`}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n autoComplete=\"street-address\"\n placeholder={rest.placeholder || 'Enter an address'}\n disabled={isLoading || rest.disabled}\n {...rest}\n />\n {isLoading && <p className=\"mt-1 text-sm text-slate-500\">Loading address suggestions...</p>}\n\n {/* Suggestions dropdown */}\n {showSuggestions && suggestions.length > 0 && (\n <div\n ref={suggestionsContainerRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-slate-200 rounded-lg shadow-lg max-h-60 overflow-y-auto\"\n role=\"listbox\"\n >\n {suggestions.map((prediction, index) => (\n <div\n key={prediction.place_id}\n className={`px-4 py-3 cursor-pointer transition-colors ${\n index === selectedIndex ? 'bg-blue-50 text-slate-900' : 'bg-white text-slate-900 hover:bg-slate-50'\n } ${index < suggestions.length - 1 ? 'border-b border-slate-100' : ''}`}\n role=\"option\"\n aria-selected={index === selectedIndex}\n onClick={() => handleSuggestionClick(prediction)}\n onMouseEnter={() => setSelectedIndex(index)}\n >\n <div className=\"font-medium text-slate-900\">{prediction.structured_formatting.main_text}</div>\n {prediction.structured_formatting.secondary_text && (\n <div className=\"text-sm text-slate-500 mt-0.5\">{prediction.structured_formatting.secondary_text}</div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </Field>\n );\n}\n","import type { Question } from '@getcredify/credify-insurance-types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type FormValues = Record<string, any>;\n\n// A single stage (screen) in the wizard\nexport type StageMeta<K extends string = string> = {\n key: string; // stage id\n title: string; // progress header label\n loadQuestions: () => Promise<ReadonlyArray<Question<K>>>; // lazy loader\n};\n\nexport function slugify(s: string) {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n\nexport function ensureKey<KSelf extends string = string>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n q: Readonly<Question<KSelf, any, any>>,\n idx: number\n): string {\n return (q.key as string | undefined) ?? `${slugify(q.question)}-${idx}`;\n}\n\n// ----- per-stage validation (visible + required) -----\nexport function validateQuestions<KSelf extends string = string>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n questions: ReadonlyArray<Question<KSelf, any, any>>,\n values: Readonly<Record<string, unknown>>\n): Record<string, string | undefined> {\n const errors: Record<string, string | undefined> = {};\n\n const isBlank = (v: unknown) => v === undefined || v === null || (typeof v === 'string' && v.trim() === '');\n\n questions.forEach((q, i) => {\n const key = ensureKey(q, i);\n const val = values[key];\n\n if (!q.required) return;\n\n switch (q.inputType) {\n case 'checkbox':\n if (val !== true) errors[key] = 'Required';\n break;\n\n case 'radio':\n case 'select':\n if (isBlank(val)) errors[key] = 'Required';\n break;\n\n case 'number':\n // Treat '' / null / undefined as missing; 0 is valid\n if (val === undefined || val === null || (typeof val === 'string' && val.trim() === '')) {\n errors[key] = 'Required';\n }\n break;\n\n case 'date':\n case 'email':\n case 'tel':\n case 'url':\n case 'password':\n case 'text':\n case 'textarea':\n case 'address':\n default:\n if (isBlank(val)) errors[key] = 'Required';\n break;\n }\n });\n\n return errors;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function coerceNumber(v: any) {\n if (v === '' || v === null || v === undefined) return undefined;\n const n = Number(v);\n return Number.isNaN(n) ? undefined : n;\n}\n","import { useMemo, useState, useEffect } from 'react';\n\nimport type { Question } from '@getcredify/credify-insurance-types';\n\nimport {\n TextInput,\n NumericInput,\n EmailInput,\n TelInput,\n UrlInput,\n PasswordInput,\n TextArea,\n DateInput,\n Checkbox,\n Radio,\n RadioGroup,\n SelectInput,\n AddressAutocomplete\n} from './index';\n\nimport { slugify, validateQuestions, coerceNumber, type FormValues } from '../utils/form';\n\n/* ------------------------------------------------------------------ */\n/* Conditional evaluation utilities */\n/* ------------------------------------------------------------------ */\n\ntype ConditionalNode = NonNullable<Question['conditionals']>[number];\n\nfunction toNumber(x: unknown): number | null {\n if (typeof x === 'number' && Number.isFinite(x)) return x;\n if (typeof x === 'string' && x.trim() !== '' && !Number.isNaN(Number(x))) return Number(x);\n return null;\n}\nfunction toTime(x: unknown): number | null {\n if (x instanceof Date && !Number.isNaN(x.getTime())) return x.getTime();\n if (typeof x === 'string') {\n const t = Date.parse(x);\n return Number.isNaN(t) ? null : t;\n }\n return null;\n}\nfunction cmp(a: unknown, b: unknown): number | null {\n const na = toNumber(a),\n nb = toNumber(b);\n if (na != null && nb != null) return na - nb;\n const ta = toTime(a),\n tb = toTime(b);\n if (ta != null && tb != null) return ta - tb;\n if (a == null || b == null) return null;\n return String(a).localeCompare(String(b));\n}\nfunction contains(haystack: unknown, needle: unknown): boolean {\n if (Array.isArray(haystack)) return haystack.some((v) => v === needle);\n if (typeof haystack === 'string') return needle != null && haystack.includes(String(needle));\n return false;\n}\nfunction evalConditional(qValue: unknown, conditionalType: ConditionalNode['conditionalType'], conditionalValue: unknown): boolean {\n switch (conditionalType) {\n case 'equals':\n return qValue === conditionalValue;\n case 'lessThan': {\n const c = cmp(qValue, conditionalValue);\n return c != null && c < 0;\n }\n case 'greaterThan': {\n const c = cmp(qValue, conditionalValue);\n return c != null && c > 0;\n }\n case 'contains':\n return contains(qValue, conditionalValue);\n case 'startsWith':\n return qValue != null && conditionalValue != null && String(qValue).startsWith(String(conditionalValue));\n case 'endsWith':\n return qValue != null && conditionalValue != null && String(qValue).endsWith(String(conditionalValue));\n default:\n return false;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Path helpers (immutable) */\n/* ------------------------------------------------------------------ */\n\ntype ScopePath = Array<string | number>;\n\nfunction getIn(obj: unknown, path: ScopePath): unknown {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return path.reduce((acc: any, key) => (acc == null ? undefined : acc[key]), obj as any);\n}\nfunction setInImmutable<T extends object>(obj: T, path: ScopePath, value: unknown): T {\n if (path.length === 0) return obj;\n const [head, ...tail] = path;\n\n if (tail.length === 0) {\n if (typeof head === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const base = Array.isArray(obj) ? (obj as any[]) : [];\n const arr = base.slice();\n arr[head] = value;\n return arr as unknown as T;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...(obj as any), [head]: value } as T;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const current = (obj as any)?.[head];\n const nextContainer = typeof tail[0] === 'number' ? (Array.isArray(current) ? current : []) : current && typeof current === 'object' ? current : {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const next = setInImmutable(nextContainer as any, tail, value);\n\n if (typeof head === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const base = Array.isArray(obj) ? (obj as any[]) : [];\n const arr = base.slice();\n arr[head] = next;\n return arr as unknown as T;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...(obj as any), [head]: next } as T;\n}\n\n/** Read from a values object using a base scope plus a local key */\nfunction scopedRead(values: FormValues, scope: ScopePath | undefined, key: string) {\n return getIn(values, [...(scope ?? []), key]);\n}\n/** Write immutably to values at scope+key */\nfunction scopedWrite(values: FormValues, scope: ScopePath | undefined, key: string, v: unknown): FormValues {\n return setInImmutable(values, [...(scope ?? []), key], v);\n}\n\nconst ITEMS_SUFFIX = '__items';\nconst itemsKey = (k: string) => `${k}${ITEMS_SUFFIX}`;\n\n/* ------------------------------------------------------------------ */\n/* Key decoration (stable keys) */\n/* ------------------------------------------------------------------ */\n\nfunction decorateKeys(questions: Question[]): Question[] {\n const walk = (list: Question[], pathParts: string[]): Question[] =>\n list.map((q, qi) => {\n const parentPart = pathParts.length ? pathParts.join('__') : 'root';\n const baseKey = (q.key as string) ?? `${parentPart}__q${qi}_${String(q.question).slice(0, 24).replace(/\\W+/g, '-') || 'field'}`;\n\n const conds: readonly ConditionalNode[] = q.conditionals ?? [];\n const nextConds = conds.map((c, ci) => {\n const nested = c.conditionalQuestions\n ? walk(c.conditionalQuestions as unknown as Question[], [...pathParts, `${baseKey}__c${ci}`])\n : undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...c, conditionalQuestions: nested as any };\n });\n\n return { ...q, key: baseKey, conditionals: nextConds };\n });\n\n return walk(questions, []);\n}\n\n/** Coerce any unknown to a safe text input value */\nfunction asTextValue(v: unknown): string {\n if (v == null) return '';\n return typeof v === 'string' ? v : String(v);\n}\n\n/** Coerce to a number-control-safe value */\nfunction asNumberValue(v: unknown): string | number {\n if (v == null) return '';\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n if (typeof v === 'string') return v; // let the user type partial numbers like \"-\"\n return '';\n}\n\n/** Coerce to a select value (string/number/undefined) */\nfunction asSelectValue(v: unknown): string | number {\n if (v == null) return ''; // <-- force empty string, not undefined\n if (typeof v === 'string' || typeof v === 'number') return v;\n return String(v);\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function FormRenderer({\n questions,\n initialValues,\n controlledValues,\n onChangeValues,\n onSubmit\n}: {\n questions: Question[];\n initialValues?: Partial<FormValues>;\n controlledValues?: FormValues;\n onChangeValues?: (values: FormValues) => void;\n onSubmit: (values: FormValues) => void; // called on Enter key\n}) {\n const keyedQuestions = useMemo(() => decorateKeys(questions), [questions]);\n\n const initialUncontrolled: FormValues = useMemo(() => {\n const acc: FormValues = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (initialValues) Object.assign(acc, initialValues as any);\n return acc;\n }, [initialValues]);\n\n const [uncontrolled, setUncontrolled] = useState<FormValues>(initialUncontrolled);\n useEffect(() => {\n setUncontrolled(initialUncontrolled);\n }, [initialUncontrolled]);\n\n // HYBRID CONTROLLED SUPPORT\n const [localShadow, setLocalShadow] = useState<FormValues>({});\n const values: FormValues = useMemo(\n () => ({ ...localShadow, ...(controlledValues ?? uncontrolled) }),\n [localShadow, controlledValues, uncontrolled]\n );\n useEffect(() => {\n if (controlledValues) setLocalShadow((p) => ({ ...p, ...controlledValues }));\n }, [controlledValues]);\n\n const [errors, setErrors] = useState<Record<string, string | undefined>>({});\n\n // single field renderer (aware of scope)\n function renderOne(q: Question, scopePath?: ScopePath) {\n const key = q.key as string;\n const label = q.question;\n const val = scopedRead(values, scopePath, key);\n const error = errors[key];\n\n const set = (v: unknown) => {\n let nextAll = scopedWrite(values, scopePath, key, v);\n\n // If this is a radio button with conditionals, check if any array items need to be cleared\n if (q.inputType === 'radio' && q.conditionals) {\n const conds = q.conditionals ?? [];\n\n // Check each conditional to see if it will become false\n for (const cond of conds) {\n const currentValue = scopedRead(values, scopePath, key);\n const wasActive = evalConditional(currentValue, cond.conditionalType, cond.conditionalValue);\n const willBeActive = evalConditional(v, cond.conditionalType, cond.conditionalValue);\n\n // If this conditional was active but will become inactive, and it has repeatable questions, clear the array\n if (wasActive && !willBeActive && cond.conditionalQuestionsAllowMultiple) {\n const children = (cond.conditionalQuestions ?? []) as unknown as Question[];\n if (children.length > 0) {\n const arrStorageKey = itemsKey(key);\n\n nextAll = setInImmutable(nextAll, [...(scopePath ?? []), arrStorageKey], []);\n\n // Also clear any nested array items that might exist\n const clearNestedArrays = (questionList: Question[], currentScope: ScopePath) => {\n questionList.forEach((childQ) => {\n const childConds = childQ.conditionals ?? [];\n childConds.forEach((childCond) => {\n if (childCond.conditionalQuestionsAllowMultiple) {\n const nestedArrKey = itemsKey(childQ.key as string);\n nextAll = setInImmutable(nextAll, [...currentScope, nestedArrKey], []);\n }\n const grandChildren = (childCond.conditionalQuestions ?? []) as unknown as Question[];\n if (grandChildren.length > 0) {\n clearNestedArrays(grandChildren, currentScope);\n }\n });\n });\n };\n\n clearNestedArrays(children, [...(scopePath ?? []), arrStorageKey]);\n }\n }\n }\n }\n\n if (controlledValues && onChangeValues) onChangeValues(nextAll);\n else setUncontrolled(nextAll);\n setLocalShadow(nextAll);\n };\n\n switch (q.inputType) {\n case 'text':\n return (\n <TextInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'email':\n return (\n <EmailInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'password':\n return (\n <PasswordInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'tel':\n return (\n <>\n <TelInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n {key === 'phone' && (\n <div className=\"mt-3 text-xs text-slate-600 space-y-1\">\n <p>By entering your phone number, you agree to receive a one-time SMS from Credify Insurance with a verification code.</p>\n <p>Message & data rates may apply. One message per request.</p>\n {/* <p>Reply STOP to opt out, HELP for help.</p> */}\n <p>\n See our{' '}\n <a href=\"https://getcredify.com\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"credify-link-underline\">\n Privacy Policy\n </a>{' '}\n and{' '}\n <a href=\"https://getcredify.com\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"credify-link-underline\">\n Terms of Service\n </a>\n .\n </p>\n </div>\n )}\n </>\n );\n case 'url':\n return (\n <UrlInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'number':\n return (\n <NumericInput\n key={key}\n id={key}\n label={label}\n value={asNumberValue(val)}\n onChange={(e) => set(coerceNumber(e.currentTarget.value))}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'textarea':\n return (\n <TextArea\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n rows={4}\n />\n );\n case 'date':\n return (\n <DateInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n\n case 'checkbox': {\n if (q.options) {\n const current: string[] = Array.isArray(val) ? (val as string[]) : [];\n return (\n <div key={key} className=\"space-y-2\">\n <div className=\"form-label\">\n {label}\n {q.required && <span className=\"text-red-600 ml-1\">*</span>}\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {q.options.map((opt) => {\n const idOpt = `${key}-${slugify(opt)}`;\n const checked = current.includes(opt);\n return (\n <Checkbox\n key={idOpt}\n id={idOpt}\n label={opt}\n checked={checked}\n onChange={(e) => {\n const next = new Set(current);\n if (e.currentTarget.checked) next.add(opt);\n else next.delete(opt);\n set(Array.from(next));\n }}\n aria-required={q.required || undefined}\n />\n );\n })}\n </div>\n {error && <p className=\"mt-1 text-sm text-red-600\">{error}</p>}\n </div>\n );\n }\n return (\n <Checkbox\n key={key}\n id={key}\n label={q.required ? `${label} *` : label}\n checked={!!val}\n onChange={(e) => set(e.currentTarget.checked)}\n aria-required={q.required || undefined}\n />\n );\n }\n\n case 'radio': {\n const opts = q.options ?? [];\n // Create a scoped name to avoid conflicts between array items\n const scopedName = scopePath && scopePath.length > 0 ? `${key}__${scopePath.join('__')}` : key;\n return (\n <RadioGroup key={key} legend={label} legendClassName={q.required ? 'legend-required' : undefined}>\n {opts.map((opt) => (\n <Radio key={`${key}-${slugify(opt)}`} name={scopedName} value={opt} checked={val === opt} onChange={() => set(opt)}>\n {opt}\n </Radio>\n ))}\n </RadioGroup>\n );\n }\n\n case 'select': {\n let opts = q.options ?? [];\n // Add special case for `quote_vehicle_id` key\n if (key === 'quote_vehicle_id') {\n opts = controlledValues?.vehicles__items?.map((v: { vin: string }) => v.vin) ?? [];\n }\n return (\n <SelectInput\n key={key}\n id={key}\n label={label}\n aria-required={q.required || undefined}\n error={error}\n value={asSelectValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n placeholder=\"Select an option\"\n options={opts.map((o) => ({ value: o, label: o }))}\n />\n );\n }\n\n case 'address':\n return (\n <AddressAutocomplete\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(address) => set(address)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n\n default:\n return null;\n }\n }\n\n function renderRecursive(list: Question[], scopePath?: ScopePath) {\n return list.map((q, qIndex) => {\n const key = String(q.key);\n const elem = renderOne(q, scopePath);\n\n const conds = q.conditionals ?? [];\n if (!conds.length) return <div key={`wrap-${key}-${qIndex}`}>{elem}</div>;\n\n const v = scopedRead(values, scopePath, key);\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n return (\n <div key={`wrap-${key}-${qIndex}`}>\n {elem}\n\n {branches.map((branch, bi) => {\n const children = (branch.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return null;\n\n // NON-REPEATABLE child branch at current scope\n if (!branch.conditionalQuestionsAllowMultiple) {\n return (\n <div key={`branch-${key}-${bi}`} className=\"mt-3\">\n {renderRecursive(children, scopePath)}\n </div>\n );\n }\n\n // REPEATABLE child branch at current scope\n const arrStorageKey = itemsKey(key);\n const arr: unknown[] = (getIn(values, [...(scopePath ?? []), arrStorageKey]) as unknown[]) ?? [];\n const count = Math.max(1, arr.length || 1);\n\n const pushEmpty = () => {\n const next = setInImmutable(values, [...(scopePath ?? []), arrStorageKey, arr.length], {});\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n const popLast = () => {\n const nextArr = arr.slice(0, Math.max(0, arr.length - 1));\n const next = setInImmutable(values, [...(scopePath ?? []), arrStorageKey], nextArr);\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n const groupIdBase = `${key}__c${bi}`;\n\n return (\n <div key={`branch-${key}-${bi}`} className=\"mt-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-sm font-medium opacity-75\">Add one or more entries</div>\n <div className=\"space-x-2\">\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={pushEmpty}>\n Add another\n </button>\n {count > 1 && (\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={popLast}>\n Remove last\n </button>\n )}\n </div>\n </div>\n\n {Array.from({ length: count }).map((_, idx) => {\n const itemScope: ScopePath = [...(scopePath ?? []), arrStorageKey, idx];\n const groupId = `${groupIdBase}__i${idx}`;\n\n return (\n <div key={`group-${groupId}`} className=\"rounded-lg border p-3 mb-3\">\n <div className=\"text-sm font-semibold mb-2\">Entry #{idx + 1}</div>\n\n {children.map((childQ) => (\n <div key={`${groupId}-${String(childQ.key)}`} className=\"mt-3\">\n {renderOne(childQ, itemScope)}\n\n {/* Nested conditionals under childQ (supports nested repeatables too) */}\n {(() => {\n const childConds = childQ.conditionals ?? [];\n if (!childConds.length) return null;\n\n const childVal = scopedRead(values, itemScope, childQ.key as string);\n const childMatches = childConds.filter((c) => evalConditional(childVal, c.conditionalType, c.conditionalValue));\n const childBranches =\n childMatches.length > 1 && !childMatches.some((m) => m.conditionalQuestionsAllowMultiple)\n ? childMatches.slice(0, 1)\n : childMatches;\n\n return childBranches.map((bc, bci) => {\n const grandChildren = (bc.conditionalQuestions ?? []) as unknown as Question[];\n if (!grandChildren.length) return null;\n\n // NON-REPEATABLE nested branch: same item scope\n if (!bc.conditionalQuestionsAllowMultiple) {\n return (\n <div key={`nested-${groupId}-${bci}`} className=\"mt-3\">\n {renderRecursive(grandChildren, itemScope)}\n </div>\n );\n }\n\n // REPEATABLE nested branch: store under <itemScope> + itemsKey(childQ.key)\n const nestedArrKey = itemsKey(childQ.key as string);\n const nestedArr: unknown[] = (getIn(values, [...itemScope, nestedArrKey]) as unknown[]) ?? [];\n const nestedCount = Math.max(1, nestedArr.length || 1);\n\n const nestedPush = () => {\n const next = setInImmutable(values, [...itemScope, nestedArrKey, nestedArr.length], {});\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n const nestedPop = () => {\n const nextArr = nestedArr.slice(0, Math.max(0, nestedArr.length - 1));\n const next = setInImmutable(values, [...itemScope, nestedArrKey], nextArr);\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n return (\n <div key={`nested-repeat-${groupId}-${bci}`} className=\"mt-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-sm font-medium opacity-75\">Add one or more entries</div>\n <div className=\"space-x-2\">\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={nestedPush}>\n Add another\n </button>\n {nestedCount > 1 && (\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={nestedPop}>\n Remove last\n </button>\n )}\n </div>\n </div>\n\n {Array.from({ length: nestedCount }).map((__, nIdx) => {\n const nestedScope: ScopePath = [...itemScope, nestedArrKey, nIdx];\n return (\n <div key={`nested-item-${groupId}-${bci}-${nIdx}`} className=\"rounded-lg border p-3 mb-3\">\n <div className=\"text-sm font-semibold mb-2\">Entry #{nIdx + 1}</div>\n {renderRecursive(grandChildren, nestedScope)}\n </div>\n );\n })}\n </div>\n );\n });\n })()}\n </div>\n ))}\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n });\n }\n\n // Visible (non-repeatable) only — used for Enter-to-continue validation feedback\n const visibleFlat = useMemo(() => {\n const out: Question[] = [];\n const walk = (list: Question[], scopePath?: ScopePath) => {\n list.forEach((q) => {\n out.push(q);\n const key = String(q.key);\n const conds = q.conditionals ?? [];\n if (!conds.length) return;\n\n const v = scopedRead(values, scopePath, key);\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n branches.forEach((m) => {\n const children = (m.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return;\n if (m.conditionalQuestionsAllowMultiple) return; // item-level handled on wizard side\n walk(children, scopePath);\n });\n });\n };\n walk(keyedQuestions);\n return out;\n }, [keyedQuestions, values]);\n\n function handleSubmit(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault();\n const eMap = validateQuestions(visibleFlat as Question[], values);\n setErrors(eMap);\n\n if (Object.keys(eMap).length > 0) {\n const firstIdx = visibleFlat.findIndex((q) => eMap[q.key as string]);\n if (firstIdx >= 0) document.getElementById(visibleFlat[firstIdx].key as string)?.focus();\n return;\n }\n onSubmit(values);\n }\n\n return (\n <form className=\"space-y-6 px-1\" onSubmit={handleSubmit} noValidate>\n {renderRecursive(keyedQuestions)}\n </form>\n );\n}\n\nexport default FormRenderer;\n","/**\n * Google Tag Manager dataLayer helpers for the Credify Insurance Widget.\n * Pushes events at each step so GTM can trigger tags (e.g. GTM-NK8LGHTQ).\n */\n\nexport const GTM_CONTAINER_ID = 'GTM-NK8LGHTQ';\n\ndeclare global {\n interface Window {\n dataLayer?: Record<string, unknown>[];\n }\n}\n\nfunction getDataLayer(): Record<string, unknown>[] {\n if (typeof window === 'undefined') return [];\n window.dataLayer = window.dataLayer ?? [];\n return window.dataLayer;\n}\n\nexport function pushDataLayerEvent(eventName: string, payload: Record<string, unknown> = {}): void {\n const dataLayer = getDataLayer();\n dataLayer.push({\n event: eventName,\n credifyWidget: {\n ...payload,\n containerId: GTM_CONTAINER_ID\n }\n });\n}\n\n/** Widget was opened */\nexport function pushWidgetOpened(): void {\n pushDataLayerEvent('credify_widget_opened');\n}\n\n/** Widget was closed */\nexport function pushWidgetClosed(): void {\n pushDataLayerEvent('credify_widget_closed');\n}\n\n/** User viewed a form stage (step) */\nexport function pushStageViewed(payload: { stageKey: string; stageTitle: string; stepIndex: number; totalSteps: number }): void {\n pushDataLayerEvent('credify_widget_stage_viewed', payload);\n}\n\n/** User completed a form stage (clicked Next successfully) */\nexport function pushStageCompleted(payload: { stageKey: string; stageTitle: string; stepIndex: number; totalSteps: number }): void {\n pushDataLayerEvent('credify_widget_stage_completed', payload);\n}\n\n/** User completed all stages and rates were requested */\nexport function pushFlowCompleted(): void {\n pushDataLayerEvent('credify_widget_flow_completed');\n}\n\n/** User is viewing the rates screen */\nexport function pushRatesViewed(payload?: { rateCount?: number }): void {\n pushDataLayerEvent('credify_widget_rates_viewed', payload ?? {});\n}\n\n/** User clicked Back from the rates screen */\nexport function pushRatesBack(): void {\n pushDataLayerEvent('credify_widget_rates_back');\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { Question } from '@getcredify/credify-insurance-types';\n\nimport { FormRenderer } from './index';\n\nimport { ensureKey, validateQuestions, type StageMeta, type FormValues } from '../utils/form';\nimport { pushStageViewed } from '../utils/gtm';\n\n/* ---------- conditional helpers (mirrors renderer) ---------- */\ntype ConditionalNode = NonNullable<Question['conditionals']>[number];\n\nfunction toNumber(x: unknown): number | null {\n if (typeof x === 'number' && Number.isFinite(x)) return x;\n if (typeof x === 'string' && x.trim() !== '' && !Number.isNaN(Number(x))) return Number(x);\n return null;\n}\nfunction toTime(x: unknown): number | null {\n if (x instanceof Date && !Number.isNaN(x.getTime())) return x.getTime();\n if (typeof x === 'string') {\n const t = Date.parse(x);\n return Number.isNaN(t) ? null : t;\n }\n return null;\n}\nfunction cmp(a: unknown, b: unknown): number | null {\n const na = toNumber(a),\n nb = toNumber(b);\n if (na != null && nb != null) return na - nb;\n const ta = toTime(a),\n tb = toTime(b);\n if (ta != null && tb != null) return ta - tb;\n if (a == null || b == null) return null;\n return String(a).localeCompare(String(b));\n}\nfunction contains(haystack: unknown, needle: unknown): boolean {\n if (Array.isArray(haystack)) return haystack.some((v) => v === needle);\n if (typeof haystack === 'string') return needle != null && haystack.includes(String(needle));\n return false;\n}\nfunction evalConditional(v: unknown, type: ConditionalNode['conditionalType'], rhs: unknown): boolean {\n switch (type) {\n case 'equals':\n return v === rhs;\n case 'lessThan': {\n const c = cmp(v, rhs);\n return c != null && c < 0;\n }\n case 'greaterThan': {\n const c = cmp(v, rhs);\n return c != null && c > 0;\n }\n case 'contains':\n return contains(v, rhs);\n case 'startsWith':\n return v != null && rhs != null && String(v).startsWith(String(rhs));\n case 'endsWith':\n return v != null && rhs != null && String(v).endsWith(String(rhs));\n default:\n return false;\n }\n}\n\n/* ---------- visibility (non-repeatable) ---------- */\nfunction flattenVisibleQuestions(root: ReadonlyArray<Question>, values: FormValues): ReadonlyArray<Question> {\n const out: Question[] = [];\n const walk = (list: ReadonlyArray<Question>) => {\n list.forEach((q) => {\n out.push(q);\n const key = String(q.key);\n const v = values[key];\n const conds = q.conditionals ?? [];\n if (!conds.length) return;\n\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n branches.forEach((m) => {\n const children = (m.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return;\n if (m.conditionalQuestionsAllowMultiple) return; // handled per-item below\n children.forEach((child) => out.push(child));\n });\n });\n };\n walk(root);\n return out;\n}\n\n/* ---------- repeatable validation (any depth) ---------- */\nconst ITEMS_SUFFIX = '__items';\nconst itemsKey = (k: string) => `${k}${ITEMS_SUFFIX}`;\n\nfunction validateRepeatablesRecursive(questions: ReadonlyArray<Question>, valuesAtScope: FormValues): boolean {\n // returns true if any blocking error exists\n for (const q of questions) {\n const qKey = String(q.key);\n const qVal = valuesAtScope[qKey];\n const conds = q.conditionals ?? [];\n if (!conds.length) continue;\n\n const matches = conds.filter((c) => evalConditional(qVal, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n for (const b of branches) {\n const children = (b.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) continue;\n\n if (!b.conditionalQuestionsAllowMultiple) {\n // non-repeatable: keep walking for deeper repeats\n if (validateRepeatablesRecursive(children, valuesAtScope)) return true;\n continue;\n }\n\n // repeatable at this scope\n const arr = (valuesAtScope[itemsKey(qKey)] as unknown[]) ?? [];\n if (arr.length === 0) return true; // must have at least one entry\n\n for (const item of arr as Array<Record<string, unknown>>) {\n // 1) validate required fields for this item's children\n const itemErrors = validateQuestions(children, item as FormValues);\n if (Object.values(itemErrors).some(Boolean)) return true;\n\n // 2) recursively validate nested repeatables within this item\n if (validateRepeatablesRecursive(children, item as FormValues)) return true;\n }\n }\n }\n return false;\n}\n\n/** True when any visible repeatable branch (at any depth) is missing items or has invalid items */\nfunction hasRepeatableBlockingErrors(questions: ReadonlyArray<Question>, rootValues: FormValues): boolean {\n return validateRepeatablesRecursive(questions, rootValues);\n}\n\ntype CompleteCallback = (values: FormValues, stageKey: string) => Promise<{ success: boolean; error?: string }>;\n\n/* -------------------------------- component -------------------------------- */\nexport function FormWizard({\n stages,\n onStageComplete,\n onComplete,\n initialValues,\n initialActive\n}: {\n stages: StageMeta[];\n onStageComplete: CompleteCallback;\n onComplete: CompleteCallback;\n initialValues?: FormValues;\n initialActive?: number;\n}) {\n const [active, setActive] = useState(initialActive ?? 0);\n const [allValues, setAllValues] = useState<FormValues>(initialValues ?? {});\n const [perStageQuestions, setPerStageQuestions] = useState<Record<string, Question[]>>({});\n const [loading, setLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [stageError, setStageError] = useState<string | null>(null);\n const stepRefs = useRef<(HTMLLIElement | null)[]>([]);\n\n const hasStages = Array.isArray(stages) && stages.length > 0;\n const stage = hasStages ? stages[Math.min(active, stages.length - 1)] : null;\n const stageKey = stage?.key ?? null;\n\n // Update active stage when initialActive changes (e.g., when going back from rates)\n useEffect(() => {\n if (initialActive !== undefined) {\n setActive(initialActive);\n }\n }, [initialActive]);\n\n // Scroll active step into view\n useEffect(() => {\n const activeElement = stepRefs.current[active];\n if (activeElement) {\n activeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }, [active]);\n\n // Update form values when initialValues changes (e.g., when going back from rates)\n // Only update if initialValues is provided (not undefined/null)\n useEffect(() => {\n if (initialValues !== undefined) {\n setAllValues(initialValues);\n }\n }, [initialValues]);\n\n useEffect(() => {\n if (!stage || !stageKey) {\n setLoading(false);\n setStageError(null);\n return;\n }\n if (perStageQuestions[stageKey]) {\n setLoading(false);\n setStageError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setStageError(null);\n\n Promise.resolve(stage.loadQuestions())\n .then((qs) => {\n if (cancelled) return;\n if (!Array.isArray(qs)) throw new Error(`loadQuestions(\"${stageKey}\") did not return an array`);\n setPerStageQuestions((m) => ({ ...m, [stageKey]: qs }));\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((err: any) => {\n if (cancelled) return;\n setStageError(`Failed to load stage \"${stage?.title ?? ''}\": ${err?.message ?? 'Unknown error'}`);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [stage, stageKey, perStageQuestions]);\n\n const questions = stageKey ? perStageQuestions[stageKey] : undefined;\n\n // GTM: stage viewed (when questions for this stage have loaded)\n useEffect(() => {\n if (stage && stageKey && questions) {\n pushStageViewed({\n stageKey,\n stageTitle: stage.title ?? stageKey,\n stepIndex: active + 1,\n totalSteps: stages.length\n });\n }\n }, [stageKey, active, stages.length, stage, questions]);\n\n // Values slice for current stage (+ keep any __items arrays)\n const currentValues = useMemo(() => {\n if (!questions) return {};\n const slice: FormValues = {};\n\n // Helper function to recursively collect all nested question keys\n const collectAllQuestionKeys = (questionList: Question[]): string[] => {\n const keys: string[] = [];\n const walk = (list: Question[]) => {\n list.forEach((q, i) => {\n const k = ensureKey(q, i);\n keys.push(k);\n const kItems = itemsKey(k);\n keys.push(kItems);\n\n // Recursively collect keys from conditional questions\n const conds = q.conditionals ?? [];\n conds.forEach((c) => {\n const children = (c.conditionalQuestions ?? []) as unknown as Question[];\n if (children.length > 0) {\n walk(children);\n }\n });\n });\n };\n walk(questionList);\n return keys;\n };\n\n // Get all keys that could be relevant to this stage (including nested conditionals)\n const allRelevantKeys = collectAllQuestionKeys(questions);\n\n // Include values for all relevant keys\n allRelevantKeys.forEach((k) => {\n if (k in allValues) slice[k] = allValues[k];\n });\n // include any orphaned *_ _items keys to keep sub-arrays alive\n for (const [k, v] of Object.entries(allValues)) {\n if (k.endsWith(ITEMS_SUFFIX) && !(k in slice)) slice[k] = v;\n }\n return slice;\n }, [questions, allValues]);\n\n const updateCurrentValues = (next: FormValues) => {\n setAllValues((prev) => ({ ...prev, ...next }));\n };\n\n const goPrev = () => {\n setActive((i) => (i > 0 ? i - 1 : 0));\n document.querySelector<HTMLElement>('.panel-body')?.scrollTo({ top: 0, behavior: 'instant' as ScrollBehavior });\n };\n\n const goNext = async () => {\n if (!questions || !stage || loading || stageError || isSubmitting) return;\n\n // flat (visible, non-repeatable) validation\n const visible = flattenVisibleQuestions(questions, allValues);\n const flatErrors = validateQuestions(visible as Question[], allValues);\n const flatBlock = Object.values(flatErrors).some(Boolean);\n\n // repeatable validation (any depth)\n const repeatBlock = hasRepeatableBlockingErrors(questions, allValues);\n\n if (flatBlock || repeatBlock) return;\n\n setIsSubmitting(true);\n try {\n const nextIndex = Math.min(active + 1, stages.length - 1);\n const isComplete = active >= stages.length - 1;\n const { success, error } = isComplete ? await onComplete(allValues, stageKey ?? '') : await onStageComplete(currentValues, stageKey ?? '');\n if (!success) {\n setStageError(error ?? 'An error occurred');\n return;\n }\n if (!isComplete) setActive(nextIndex);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // LIVE disabled state for the Next button (always rendered)\n const disableNext = useMemo(() => {\n if (!questions || loading || !!stageError || isSubmitting) return true;\n const visible = flattenVisibleQuestions(questions, allValues);\n const flatErrors = validateQuestions(visible as Question[], allValues);\n const flatBlock = Object.values(flatErrors).some(Boolean);\n const repeatBlock = hasRepeatableBlockingErrors(questions, allValues);\n return flatBlock || repeatBlock;\n }, [questions, allValues, loading, stageError, isSubmitting]);\n\n if (!hasStages) return <div className=\"text-slate-600\">Loading...</div>;\n\n return (\n <div className=\"space-y-6\">\n {/* progress header */}\n <div className=\"form-wizard-steps-header flex items-center justify-between gap-4\">\n <ol\n className=\"form-wizard-steps flex gap-2 text-xs overflow-x-auto flex-1 pb-1 scrollbar-hide items-center\"\n style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}\n >\n {stages.flatMap((s, i) => [\n <li\n key={s.key ?? `stage-${i}`}\n ref={(el) => {\n stepRefs.current[i] = el;\n }}\n className={`form-wizard-step-pill px-2.5 py-1 rounded-full border whitespace-nowrap flex-shrink-0 ${\n i < active\n ? 'bg-blue-600 text-white border-blue-600'\n : i === active\n ? 'border-blue-600 text-blue-600 bg-white'\n : 'border-slate-200 text-slate-600'\n }`}\n >\n {s.title}\n </li>,\n ...(i < stages.length - 1\n ? [\n <li key={`arrow-${s.key ?? i}`} className=\"form-wizard-step-arrow text-slate-400 flex-shrink-0\">\n →\n </li>\n ]\n : [])\n ])}\n </ol>\n <div className=\"form-wizard-step-counter text-sm text-slate-500 flex-shrink-0\">\n {Math.min(active + 1, stages.length)} / {stages.length}\n </div>\n </div>\n\n {/* stage content */}\n <div>\n {loading && <div className=\"text-slate-500\">Loading…</div>}\n\n {stage && (\n <FormRenderer\n key={stage.key}\n questions={questions ?? []}\n controlledValues={currentValues}\n onChangeValues={updateCurrentValues}\n onSubmit={() => goNext()} // Enter key advances\n />\n )}\n </div>\n\n {/* error message */}\n {!loading && stageError && (\n <div className=\"text-red-600 text-sm -mt-4\">\n <div>{stageError}</div>\n {stage && (\n <button\n type=\"button\"\n className=\"credify-retry-btn underline mt-1 font-bold\"\n onClick={() => {\n setPerStageQuestions((m) => {\n if (!stageKey) return m;\n const copy = { ...m };\n delete copy[stageKey];\n return copy;\n });\n }}\n >\n Retry\n </button>\n )}\n </div>\n )}\n\n {/* footer (always visible) */}\n <div className={active > 0 ? 'grid grid-cols-2 gap-3' : ''}>\n {active > 0 && (\n <button\n type=\"button\"\n onClick={goPrev}\n disabled={loading}\n className=\"credify-btn-back h-12 rounded-full border border-gray-300 text-text-primary hover:bg-gray-50 transition\"\n >\n Back\n </button>\n )}\n\n <button\n type=\"button\"\n data-widget-ctrl=\"next\"\n onClick={goNext}\n disabled={disableNext}\n className={[\n 'form-wizard-next-btn',\n active > 0 ? '' : 'w-full',\n 'h-12 rounded-full text-white transition',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'flex items-center justify-center gap-2',\n disableNext\n ? 'bg-gray-300'\n : 'bg-blue-600 hover:bg-blue-600/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600/40 bg-primary hover:bg-primary/90 focus-visible:ring-primary/40'\n ].join(' ')}\n >\n {isSubmitting && (\n <svg className=\"animate-spin h-5 w-5 text-white\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n )}\n {active === stages.length - 1 ? 'Finish' : 'Next'}\n </button>\n </div>\n </div>\n );\n}\n\nexport default FormWizard;\n","const QUOTE_ID_KEY = 'credify_quote_id';\nconst AUTH_TOKEN_KEY = 'credify_auth_token';\n\n/**\n * Save quoteId to localStorage\n */\nexport function saveQuoteId(quoteId: string): void {\n try {\n localStorage.setItem(QUOTE_ID_KEY, quoteId);\n } catch (error) {\n console.error('Failed to save quoteId to localStorage:', error);\n }\n}\n\n/**\n * Load quoteId from localStorage\n */\nexport function loadQuoteId(): string | null {\n try {\n return localStorage.getItem(QUOTE_ID_KEY);\n } catch (error) {\n console.error('Failed to load quoteId from localStorage:', error);\n return null;\n }\n}\n\n/**\n * Clear quoteId from localStorage\n */\nexport function clearQuoteId(): void {\n try {\n localStorage.removeItem(QUOTE_ID_KEY);\n } catch (error) {\n console.error('Failed to clear quoteId from localStorage:', error);\n }\n}\n\n/**\n * Save authToken to localStorage\n */\nexport function saveAuthToken(token: string): void {\n try {\n localStorage.setItem(AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.error('Failed to save authToken to localStorage:', error);\n }\n}\n\n/**\n * Load authToken from localStorage\n */\nexport function loadAuthToken(): string | null {\n try {\n return localStorage.getItem(AUTH_TOKEN_KEY);\n } catch (error) {\n console.error('Failed to load authToken from localStorage:', error);\n return null;\n }\n}\n\n/**\n * Clear authToken from localStorage\n */\nexport function clearAuthToken(): void {\n try {\n localStorage.removeItem(AUTH_TOKEN_KEY);\n } catch (error) {\n console.error('Failed to clear authToken from localStorage:', error);\n }\n}\n\n/**\n * Clear all quote-related data from localStorage\n */\nexport function clearAllQuoteData(): void {\n clearQuoteId();\n clearAuthToken();\n}\n","import type { Stage, Question, GetRatesResponse } from '@getcredify/credify-insurance-types';\nimport type { Quote } from '@getcredify/credify-insurance-db';\nimport type { FormValues } from './form';\nimport { saveAuthToken, loadAuthToken, clearAuthToken as clearAuthTokenStorage } from './storage';\n\nconst BASE_URL = 'https://api.getcredify.com';\n\n// Store JWT token in memory\nlet authToken: string | null = null;\n\nexport function setAuthToken(token: string): void {\n authToken = token;\n saveAuthToken(token);\n}\n\nexport function getAuthToken(): string | null {\n return authToken;\n}\n\nexport function loadAuthTokenFromStorage(): void {\n const storedToken = loadAuthToken();\n if (storedToken) {\n authToken = storedToken;\n }\n}\n\nexport function clearAuthToken(): void {\n authToken = null;\n clearAuthTokenStorage();\n}\n\nasync function makeAuthenticatedRequest(url: string, body: object): Promise<Response> {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json'\n };\n\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n });\n\n if (!response.ok) {\n let errorMessage = `Request failed with status ${response.status}`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorMessage;\n } catch {\n // If response is not JSON, use status text\n errorMessage = response.statusText || errorMessage;\n }\n const error = new Error(errorMessage) as Error & { statusCode?: number };\n error.statusCode = response.status;\n throw error;\n }\n\n return response;\n}\n\nexport async function getQuestionsByStage(stage: Stage): Promise<{ questions: Question[] }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-questions-by-stage`, { stage });\n const data = await response.json();\n return data;\n}\n\nexport async function getStagesForQuote(): Promise<{ stages: Stage[] }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-stages-for-quote`, {});\n const data = await response.json();\n return data;\n}\n\nexport async function createQuote(phone: string): Promise<{ quoteId: string }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/create-quote`, { phone });\n const data = await response.json();\n if (!data || typeof data !== 'object' || !data.quoteId) {\n throw new Error(`Invalid createQuote response: ${JSON.stringify(data)}`);\n }\n return data;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport async function updateQuote(payload: FormValues & { current_stage?: string }, getRates: boolean, quoteId?: string): Promise<{}> {\n // If we have a token, use it. Otherwise, send quoteId in body (for pre-verification stage)\n // Only include quoteId if it's a valid non-empty string\n const body: { payload: FormValues & { current_stage?: string }; getRates: boolean; quoteId?: string } = { payload, getRates };\n if (quoteId && typeof quoteId === 'string' && quoteId.trim() !== '') {\n body.quoteId = quoteId;\n }\n const response = await makeAuthenticatedRequest(`${BASE_URL}/update-quote`, body);\n const data = await response.json();\n return data;\n}\n\nexport async function verifyQuote(quoteId: string, smsCode: string): Promise<{ isVerified: boolean; token: string | null }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/verify-quote`, { quoteId, smsCode });\n const data = await response.json();\n return data;\n}\n\nexport async function isSupportedState(state: string): Promise<{ isSupported: boolean }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/is-supported-state`, { state });\n const data = await response.json();\n return data;\n}\n\nexport async function getRates(): Promise<{ rates: GetRatesResponse }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-rates`, {});\n const data = await response.json();\n return data;\n}\n\nexport async function getQuote(quoteId?: string): Promise<{ quote: Quote }> {\n // If we have a token, use it. Otherwise, send quoteId in body (for pre-verification stage)\n const body = quoteId ? { quoteId } : {};\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-quote`, body);\n const data = await response.json();\n return data;\n}\n\nexport async function requestBind(quoteRateId: string): Promise<{ success?: boolean }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/request-bind`, { quoteRateId });\n const data = await response.json();\n // Backend returns {} on success, so return it with success: true\n return data && typeof data === 'object' && 'success' in data ? data : { success: true };\n}\n","import { useState, useEffect } from 'react';\n\nimport type { GetRatesResponse } from '@getcredify/credify-insurance-types';\n\nimport { requestBind, loadAuthTokenFromStorage, getAuthToken, clearAuthToken } from '../utils/api';\nimport { clearAllQuoteData } from '../utils/storage';\nimport { pushRatesBack } from '../utils/gtm';\n\nconst currencyFormatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD'\n});\n\ntype RequestStatus = 'idle' | 'loading' | 'success' | 'error';\n\nfunction BackButton({ onBack }: { onBack?: () => void }) {\n const handleBack = () => {\n pushRatesBack();\n onBack?.();\n };\n return (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"credify-btn-back credify-btn-back-rates h-12 rounded-full border border-gray-300 text-text-primary hover:bg-gray-50 transition w-full\"\n >\n Back\n </button>\n );\n}\n\nexport function Rates({ rates, onBack }: { rates: GetRatesResponse; onBack?: () => void }) {\n const hasRates = Array.isArray(rates) && rates.length > 0;\n const [requestStatuses, setRequestStatuses] = useState<Record<string, RequestStatus>>({});\n\n // Load auth token from localStorage when component mounts\n useEffect(() => {\n loadAuthTokenFromStorage();\n }, []);\n\n if (!hasRates) {\n return (\n <section className=\"mt-8\">\n <h3 className=\"text-lg font-semibold text-slate-900\">Rates</h3>\n <p className=\"mt-2 text-sm text-slate-500\">No rates are available at this time.</p>\n {onBack && <BackButton onBack={onBack} />}\n </section>\n );\n }\n\n return (\n <section className=\"mt-8\">\n <h3 className=\"text-lg font-semibold text-slate-900\">Rates</h3>\n <div className=\"mt-4 grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {rates.map((rate) => {\n const premiumDollars = rate.premium_cents / 100;\n const formattedPremium = currencyFormatter.format(premiumDollars);\n const cardKey = rate.quote_rate_id;\n const status = requestStatuses[cardKey] ?? 'idle';\n const isRequesting = status === 'loading';\n const isRequested = status === 'success';\n\n const handleRequestBind = async () => {\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'loading' }));\n try {\n // Ensure auth token is loaded from localStorage before making the request\n loadAuthTokenFromStorage();\n const token = getAuthToken();\n if (!token) {\n throw new Error('Authentication required. Please verify your phone number first.');\n }\n const result = await requestBind(rate.quote_rate_id);\n // Backend returns {} on success, so if we get here without an error, it's successful\n // Check for success property if present, otherwise assume success if no error\n const success = result?.success !== false;\n if (!success) throw new Error('Request failed');\n\n // Clear all quote data from localStorage and memory so user starts fresh on return\n clearAllQuoteData();\n clearAuthToken();\n\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'success' }));\n } catch {\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'error' }));\n }\n };\n\n return (\n <div key={cardKey} className=\"flex flex-col rounded-xl border border-slate-200 bg-white p-6 shadow-sm transition hover:shadow-md\">\n {/* Carrier Logo and Name */}\n <div className=\"mb-4 flex items-center gap-3\">\n {rate.carrier_logo_base64 ? (\n <img src={`data:image/png;base64,${rate.carrier_logo_base64}`} alt={rate.carrier_name} className=\"h-12 w-auto object-contain\" />\n ) : (\n <div className=\"flex h-12 w-12 items-center justify-center rounded-md bg-slate-100 text-sm font-semibold text-slate-500\">\n {rate.carrier_name.charAt(0).toUpperCase()}\n </div>\n )}\n <div className=\"flex-1\">\n <h4 className=\"font-semibold text-slate-900\">{rate.carrier_name}</h4>\n </div>\n </div>\n\n {/* Premium */}\n <div className=\"mb-2\">\n <p className=\"text-sm text-slate-500\">Premium</p>\n <p className=\"text-2xl font-bold text-slate-900\">{formattedPremium}</p>\n </div>\n\n {/* Term */}\n <div className=\"mb-4\">\n <p className=\"text-sm text-slate-500\">Term</p>\n <p className=\"font-medium text-slate-700\">{rate.term_months} months</p>\n </div>\n\n {/* Carrier Quote ID */}\n {rate.carrier_quote_id && (\n <div className=\"mb-4\">\n <p className=\"text-xs text-slate-400\">Quote ID: {rate.carrier_quote_id}</p>\n </div>\n )}\n\n {/* Request Bind Button */}\n <div className=\"mt-auto pt-4\">\n <button\n type=\"button\"\n onClick={handleRequestBind}\n disabled={isRequesting || isRequested}\n className={`rates-bind-btn w-full rounded-full px-4 py-2.5 text-sm font-semibold transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600/40 disabled:cursor-not-allowed ${\n isRequested ? 'rates-bind-btn-requested' : 'hover:bg-blue-600/90 disabled:bg-slate-300 disabled:text-slate-500'\n }`}\n >\n {isRequesting ? 'Requesting…' : isRequested ? 'Requested' : 'Request Bind'}\n </button>\n {status === 'error' && <p className=\"mt-2 text-xs text-red-600\">Something went wrong. Please try again.</p>}\n {status === 'success' && <p className=\"mt-2 text-xs text-emerald-600\">We received your bind request.</p>}\n </div>\n </div>\n );\n })}\n </div>\n {onBack && <BackButton onBack={onBack} />}\n </section>\n );\n}\n","import type { Quote } from '@getcredify/credify-insurance-db';\nimport type { FormValues } from './form';\n\n/**\n * Convert boolean to \"Yes\"/\"No\" string (reverse of transformFormValues)\n */\nexport function convertBooleanToYesNo(value: boolean | null | undefined): string | undefined {\n if (value === true) return 'Yes';\n if (value === false) return 'No';\n return undefined;\n}\n\n/**\n * Format date to YYYY-MM-DD string format\n */\nexport function formatDate(date: Date | string | null | undefined): string | undefined {\n if (!date) return undefined;\n try {\n const d = typeof date === 'string' ? new Date(date) : date;\n if (isNaN(d.getTime())) return undefined;\n return d.toISOString().split('T')[0];\n } catch {\n return undefined;\n }\n}\n\n/**\n * Transform quote data from database format to form values\n */\nexport function quoteToFormValues(quote: Quote): FormValues {\n const formValues: FormValues = {};\n\n // Root quote fields\n if (quote.phone) formValues.phone = quote.phone;\n if (quote.first_name) formValues.first_name = quote.first_name;\n if (quote.last_name) formValues.last_name = quote.last_name;\n if (quote.email) formValues.email = quote.email;\n if (quote.date_of_birth) formValues.date_of_birth = formatDate(quote.date_of_birth);\n if (quote.product) formValues.product = quote.product;\n if (quote.state) formValues.state = quote.state;\n\n // Combine address fields into a single address string\n const addressParts: string[] = [];\n if (quote.line_1) addressParts.push(quote.line_1);\n if (quote.line_2) addressParts.push(quote.line_2);\n if (quote.city) addressParts.push(quote.city);\n if (quote.state) addressParts.push(quote.state);\n if (quote.postal_code) addressParts.push(quote.postal_code);\n if (addressParts.length > 0) {\n formValues.address = addressParts.join(', ');\n }\n\n if (quote.years_at_address !== null && quote.years_at_address !== undefined) formValues.years_at_address = quote.years_at_address;\n if (quote.months_at_address !== null && quote.months_at_address !== undefined) formValues.months_at_address = quote.months_at_address;\n if (quote.move_in_date) formValues.move_in_date = formatDate(quote.move_in_date);\n\n // Combine prior address fields into a single prior_address string\n const priorAddressParts: string[] = [];\n if (quote.prior_line_1) priorAddressParts.push(quote.prior_line_1);\n if (quote.prior_line_2) priorAddressParts.push(quote.prior_line_2);\n if (quote.prior_city) priorAddressParts.push(quote.prior_city);\n if (quote.prior_state) priorAddressParts.push(quote.prior_state);\n if (quote.prior_postal_code) priorAddressParts.push(quote.prior_postal_code);\n if (priorAddressParts.length > 0) {\n formValues.prior_address = priorAddressParts.join(', ');\n }\n\n if (quote.years_at_prior_address !== null && quote.years_at_prior_address !== undefined)\n formValues.years_at_prior_address = quote.years_at_prior_address;\n\n // Auto prior insurance fields\n if (quote.auto_has_prior_insurance !== null && quote.auto_has_prior_insurance !== undefined) {\n formValues.auto_has_prior_insurance = convertBooleanToYesNo(quote.auto_has_prior_insurance);\n }\n if (quote.auto_prior_expiration_date) formValues.auto_prior_expiration_date = formatDate(quote.auto_prior_expiration_date);\n if (quote.auto_prior_carrier_name) formValues.auto_prior_carrier_name = quote.auto_prior_carrier_name;\n if (quote.auto_prior_liability_limit) formValues.auto_prior_liability_limit = quote.auto_prior_liability_limit;\n if (quote.auto_reason_for_no_insurance) formValues.auto_reason_for_no_insurance = quote.auto_reason_for_no_insurance;\n if (quote.auto_prior_years !== null && quote.auto_prior_years !== undefined) formValues.auto_prior_years = quote.auto_prior_years;\n if (quote.auto_prior_months !== null && quote.auto_prior_months !== undefined) formValues.auto_prior_months = quote.auto_prior_months;\n if (quote.auto_continuous_coverage_years !== null && quote.auto_continuous_coverage_years !== undefined) {\n formValues.auto_continuous_coverage_years = quote.auto_continuous_coverage_years;\n }\n if (quote.auto_cancelled_declined_refused_to_renew !== null && quote.auto_cancelled_declined_refused_to_renew !== undefined) {\n formValues.auto_cancelled_declined_refused_to_renew = convertBooleanToYesNo(quote.auto_cancelled_declined_refused_to_renew);\n }\n\n // Home prior insurance fields\n if (quote.home_has_prior_insurance !== null && quote.home_has_prior_insurance !== undefined) {\n formValues.home_has_prior_insurance = convertBooleanToYesNo(quote.home_has_prior_insurance);\n }\n if (quote.home_prior_expiration_date) formValues.home_prior_expiration_date = formatDate(quote.home_prior_expiration_date);\n if (quote.home_prior_carrier_name) formValues.home_prior_carrier_name = quote.home_prior_carrier_name;\n\n // Home property fields\n if (quote.year_built !== null && quote.year_built !== undefined) formValues.year_built = quote.year_built;\n if (quote.number_of_units !== null && quote.number_of_units !== undefined) formValues.number_of_units = quote.number_of_units;\n if (quote.number_of_stories !== null && quote.number_of_stories !== undefined) formValues.number_of_stories = quote.number_of_stories;\n if (quote.number_of_beds !== null && quote.number_of_beds !== undefined) formValues.number_of_beds = quote.number_of_beds;\n if (quote.number_of_full_baths !== null && quote.number_of_full_baths !== undefined) formValues.number_of_full_baths = quote.number_of_full_baths;\n if (quote.number_of_partial_baths !== null && quote.number_of_partial_baths !== undefined) {\n formValues.number_of_partial_baths = quote.number_of_partial_baths;\n }\n if (quote.under_construction !== null && quote.under_construction !== undefined) {\n formValues.under_construction = convertBooleanToYesNo(quote.under_construction);\n }\n if (quote.distance_from_fire_hydrant_ft) formValues.distance_from_fire_hydrant_ft = quote.distance_from_fire_hydrant_ft;\n if (quote.distance_from_fire_station_miles) formValues.distance_from_fire_station_miles = quote.distance_from_fire_station_miles;\n if (quote.architectural_style) formValues.architectural_style = quote.architectural_style;\n if (quote.dwelling_type) formValues.dwelling_type = quote.dwelling_type;\n if (quote.construction_quality) formValues.construction_quality = quote.construction_quality;\n if (quote.located_over_water !== null && quote.located_over_water !== undefined) {\n formValues.located_over_water = quote.located_over_water;\n }\n if (quote.construction_type) formValues.construction_type = quote.construction_type;\n if (quote.exterior_wall_type) formValues.exterior_wall_type = quote.exterior_wall_type;\n if (quote.foundation_type) formValues.foundation_type = quote.foundation_type;\n if (quote.roof_material_type) formValues.roof_material_type = quote.roof_material_type;\n if (quote.year_roof_updated !== null && quote.year_roof_updated !== undefined) formValues.year_roof_updated = quote.year_roof_updated;\n if (quote.heating_type) formValues.heating_type = quote.heating_type;\n if (quote.heating_fuel_type) formValues.heating_fuel_type = quote.heating_fuel_type;\n if (quote.number_of_fireplaces !== null && quote.number_of_fireplaces !== undefined) {\n formValues.number_of_fireplaces = quote.number_of_fireplaces;\n }\n if (quote.basement_type) formValues.basement_type = quote.basement_type;\n if (quote.parking_type) formValues.parking_type = quote.parking_type;\n if (quote.number_of_parking_spaces !== null && quote.number_of_parking_spaces !== undefined) {\n formValues.number_of_parking_spaces = quote.number_of_parking_spaces;\n }\n if (quote.plumbing_type) formValues.plumbing_type = quote.plumbing_type;\n if (quote.pool_type) formValues.pool_type = quote.pool_type;\n if (quote.total_area_sq_ft !== null && quote.total_area_sq_ft !== undefined) formValues.total_area_sq_ft = quote.total_area_sq_ft;\n if (quote.parcel_area_sq_ft !== null && quote.parcel_area_sq_ft !== undefined) formValues.parcel_area_sq_ft = quote.parcel_area_sq_ft;\n if (quote.residence_type) formValues.residence_type = quote.residence_type;\n if (quote.usage_type) formValues.usage_type = quote.usage_type;\n if (quote.household_size !== null && quote.household_size !== undefined) formValues.household_size = quote.household_size;\n if (quote.number_of_mortgagees !== null && quote.number_of_mortgagees !== undefined) {\n formValues.number_of_mortgagees = quote.number_of_mortgagees;\n }\n if (quote.has_dog !== null && quote.has_dog !== undefined) formValues.has_dog = convertBooleanToYesNo(quote.has_dog);\n if (quote.dog_breed_type) formValues.dog_breed_type = quote.dog_breed_type;\n if (quote.number_of_dogs !== null && quote.number_of_dogs !== undefined) formValues.number_of_dogs = quote.number_of_dogs;\n if (quote.has_business_on_premises !== null && quote.has_business_on_premises !== undefined) {\n formValues.has_business_on_premises = convertBooleanToYesNo(quote.has_business_on_premises);\n }\n if (quote.business_class) formValues.business_class = quote.business_class;\n\n // Discount fields\n if (quote.retiree_discount !== null && quote.retiree_discount !== undefined) {\n formValues.retiree_discount = convertBooleanToYesNo(quote.retiree_discount);\n }\n if (quote.gated_community_discount !== null && quote.gated_community_discount !== undefined) {\n formValues.gated_community_discount = convertBooleanToYesNo(quote.gated_community_discount);\n }\n if (quote.multi_policy_discount !== null && quote.multi_policy_discount !== undefined) {\n formValues.multi_policy_discount = convertBooleanToYesNo(quote.multi_policy_discount);\n }\n if (quote.non_smoker_discount !== null && quote.non_smoker_discount !== undefined) {\n formValues.non_smoker_discount = convertBooleanToYesNo(quote.non_smoker_discount);\n }\n if (quote.first_time_buyer_discount !== null && quote.first_time_buyer_discount !== undefined) {\n formValues.first_time_buyer_discount = convertBooleanToYesNo(quote.first_time_buyer_discount);\n }\n\n // Safety features\n if (quote.fire_detection_system !== null && quote.fire_detection_system !== undefined) {\n formValues.fire_detection_system = convertBooleanToYesNo(quote.fire_detection_system);\n }\n if (quote.burglar_alarm_system !== null && quote.burglar_alarm_system !== undefined) {\n formValues.burglar_alarm_system = convertBooleanToYesNo(quote.burglar_alarm_system);\n }\n if (quote.burglar_alarm_system_type) formValues.burglar_alarm_system_type = quote.burglar_alarm_system_type;\n if (quote.smoke_detectors !== null && quote.smoke_detectors !== undefined) {\n formValues.smoke_detectors = convertBooleanToYesNo(quote.smoke_detectors);\n }\n if (quote.sprinkler_system !== null && quote.sprinkler_system !== undefined) {\n formValues.sprinkler_system = convertBooleanToYesNo(quote.sprinkler_system);\n }\n if (quote.sprinkler_system_type) formValues.sprinkler_system_type = quote.sprinkler_system_type;\n if (quote.gas_leakage_detector !== null && quote.gas_leakage_detector !== undefined) {\n formValues.gas_leakage_detector = convertBooleanToYesNo(quote.gas_leakage_detector);\n }\n if (quote.deadbolt_locks !== null && quote.deadbolt_locks !== undefined) {\n formValues.deadbolt_locks = convertBooleanToYesNo(quote.deadbolt_locks);\n }\n if (quote.fire_extinguisher !== null && quote.fire_extinguisher !== undefined) {\n formValues.fire_extinguisher = convertBooleanToYesNo(quote.fire_extinguisher);\n }\n\n // Other boolean fields\n if (quote.order_credit_authorized !== null && quote.order_credit_authorized !== undefined) {\n formValues.order_credit_authorized = convertBooleanToYesNo(quote.order_credit_authorized);\n }\n if (quote.has_health_insurance_auto_accident !== null && quote.has_health_insurance_auto_accident !== undefined) {\n formValues.has_health_insurance_auto_accident = convertBooleanToYesNo(quote.has_health_insurance_auto_accident);\n }\n if (quote.named_insured_foreclosure_repo_bankruptcy !== null && quote.named_insured_foreclosure_repo_bankruptcy !== undefined) {\n formValues.named_insured_foreclosure_repo_bankruptcy = convertBooleanToYesNo(quote.named_insured_foreclosure_repo_bankruptcy);\n }\n if (quote.named_insured_convicted_insurance_fraud !== null && quote.named_insured_convicted_insurance_fraud !== undefined) {\n formValues.named_insured_convicted_insurance_fraud = convertBooleanToYesNo(quote.named_insured_convicted_insurance_fraud);\n }\n\n // Set \"Add Drivers\" checkbox based on whether drivers exist\n if (quote.drivers && quote.drivers.length > 0) {\n formValues.drivers = 'Yes';\n formValues.drivers__items = quote.drivers.map((driver) => {\n const driverValues: FormValues = {};\n if (driver.first_name) driverValues.first_name = driver.first_name;\n if (driver.last_name) driverValues.last_name = driver.last_name;\n if (driver.date_of_birth) driverValues.date_of_birth = formatDate(driver.date_of_birth);\n if (driver.gender) driverValues.gender = driver.gender;\n if (driver.marital_status) driverValues.marital_status = driver.marital_status;\n if (driver.relationship_to_insured) driverValues.relationship_to_insured = driver.relationship_to_insured;\n if (driver.license_state) driverValues.license_state = driver.license_state;\n if (driver.license_status) driverValues.license_status = driver.license_status;\n if (driver.license_number) driverValues.license_number = driver.license_number;\n if (driver.date_first_licensed) driverValues.date_first_licensed = formatDate(driver.date_first_licensed);\n if (driver.education_level) driverValues.education_level = driver.education_level;\n if (driver.occupation) driverValues.occupation = driver.occupation;\n if (driver.industry) driverValues.industry = driver.industry;\n\n // Driver violations\n if (driver.driver_violations && driver.driver_violations.length > 0) {\n driverValues.driver_violations__items = driver.driver_violations.map((violation) => {\n const violationValues: FormValues = {};\n if (violation.code) violationValues.code = violation.code;\n if (violation.occurred_at) violationValues.occurred_at = formatDate(violation.occurred_at);\n return violationValues;\n });\n }\n\n // Driver accidents\n if (driver.driver_accidents && driver.driver_accidents.length > 0) {\n driverValues.driver_accidents__items = driver.driver_accidents.map((accident) => {\n const accidentValues: FormValues = {};\n if (accident.occurred_at) accidentValues.occurred_at = formatDate(accident.occurred_at);\n if (accident.description) accidentValues.description = accident.description;\n if (accident.quote_vehicle_id) accidentValues.quote_vehicle_id = accident.quote_vehicle_id;\n if (accident.property_damage_amount_paid_cents !== null && accident.property_damage_amount_paid_cents !== undefined) {\n accidentValues.property_damage_amount_paid_cents = accident.property_damage_amount_paid_cents;\n }\n if (accident.personal_injury_amount_paid_cents !== null && accident.personal_injury_amount_paid_cents !== undefined) {\n accidentValues.personal_injury_amount_paid_cents = accident.personal_injury_amount_paid_cents;\n }\n return accidentValues;\n });\n }\n\n // Driver losses (nested under driver, using 'losses' association)\n if (driver.losses && driver.losses.length > 0) {\n driverValues.losses = driver.losses.map((loss) => {\n const lossValues: FormValues = {};\n if (loss.description) lossValues.description = loss.description;\n if (loss.date_of_incident) lossValues.date_of_incident = formatDate(loss.date_of_incident);\n if (loss.amount_paid_cents !== null && loss.amount_paid_cents !== undefined) {\n lossValues.amount_paid_cents = loss.amount_paid_cents;\n }\n if (loss.quote_vehicle_id) lossValues.quote_vehicle_id = loss.quote_vehicle_id;\n return lossValues;\n });\n }\n\n return driverValues;\n });\n } else {\n // No drivers exist, set checkbox to 'No'\n formValues.drivers = 'No';\n }\n\n // Set \"Add Vehicles\" checkbox based on whether vehicles exist\n if (quote.vehicles && quote.vehicles.length > 0) {\n formValues.vehicles = 'Yes';\n formValues.vehicles__items = quote.vehicles.map((vehicle) => {\n const vehicleValues: FormValues = {};\n if (vehicle.vin) vehicleValues.vin = vehicle.vin;\n if (vehicle.year !== null && vehicle.year !== undefined) vehicleValues.year = vehicle.year;\n if (vehicle.make) vehicleValues.make = vehicle.make;\n if (vehicle.model) vehicleValues.model = vehicle.model;\n if (vehicle.ownership_type) vehicleValues.ownership_type = vehicle.ownership_type;\n if (vehicle.usage) vehicleValues.usage = vehicle.usage;\n if (vehicle.annual_mileage !== null && vehicle.annual_mileage !== undefined) {\n vehicleValues.annual_mileage = vehicle.annual_mileage;\n }\n if (vehicle.miles_to_work !== null && vehicle.miles_to_work !== undefined) {\n vehicleValues.miles_to_work = vehicle.miles_to_work;\n }\n if (vehicle.percent_to_work !== null && vehicle.percent_to_work !== undefined) {\n vehicleValues.percent_to_work = vehicle.percent_to_work;\n }\n\n // Combine garaging address fields into a single garaging_address string\n const garagingAddressParts: string[] = [];\n if (vehicle.garaging_address_line_1) garagingAddressParts.push(vehicle.garaging_address_line_1);\n if (vehicle.garaging_address_line_2) garagingAddressParts.push(vehicle.garaging_address_line_2);\n if (vehicle.garaging_address_city) garagingAddressParts.push(vehicle.garaging_address_city);\n if (vehicle.garaging_address_state) garagingAddressParts.push(vehicle.garaging_address_state);\n if (vehicle.garaging_address_postal_code) garagingAddressParts.push(vehicle.garaging_address_postal_code);\n if (garagingAddressParts.length > 0) {\n vehicleValues.garaging_address = garagingAddressParts.join(', ');\n }\n\n if (vehicle.anti_theft_type) vehicleValues.anti_theft_type = vehicle.anti_theft_type;\n if (vehicle.passive_restraint_type) vehicleValues.passive_restraint_type = vehicle.passive_restraint_type;\n\n // Vehicle coverages\n if (vehicle.coverages && vehicle.coverages.length > 0) {\n vehicleValues.coverages__items = vehicle.coverages.map((coverage) => {\n const coverageValues: FormValues = {};\n if (coverage.type) coverageValues.type = coverage.type;\n if (coverage.per_person_limit_cents !== null && coverage.per_person_limit_cents !== undefined) {\n coverageValues.per_person_limit_cents = coverage.per_person_limit_cents;\n }\n if (coverage.per_incident_limit_cents !== null && coverage.per_incident_limit_cents !== undefined) {\n coverageValues.per_incident_limit_cents = coverage.per_incident_limit_cents;\n }\n if (coverage.per_incident_limit_percent !== null && coverage.per_incident_limit_percent !== undefined) {\n coverageValues.per_incident_limit_percent = coverage.per_incident_limit_percent;\n }\n if (coverage.per_day_limit_cents !== null && coverage.per_day_limit_cents !== undefined) {\n coverageValues.per_day_limit_cents = coverage.per_day_limit_cents;\n }\n if (coverage.deductible_cents !== null && coverage.deductible_cents !== undefined) {\n coverageValues.deductible_cents = coverage.deductible_cents;\n }\n if (coverage.is_declined !== null && coverage.is_declined !== undefined) {\n coverageValues.is_declined = convertBooleanToYesNo(coverage.is_declined);\n }\n return coverageValues;\n });\n }\n\n // Vehicle lienholders\n if (vehicle.vehicle_lienholders && vehicle.vehicle_lienholders.length > 0) {\n vehicleValues.vehicle_lienholders__items = vehicle.vehicle_lienholders.map((lienholder) => {\n const lienholderValues: FormValues = {};\n if (lienholder.name) lienholderValues.name = lienholder.name;\n if (lienholder.type) lienholderValues.type = lienholder.type;\n if (lienholder.line_1) lienholderValues.line_1 = lienholder.line_1;\n if (lienholder.line_2) lienholderValues.line_2 = lienholder.line_2;\n if (lienholder.city) lienholderValues.city = lienholder.city;\n if (lienholder.state) lienholderValues.state = lienholder.state;\n if (lienholder.postal_code) lienholderValues.postal_code = lienholder.postal_code;\n if (lienholder.phone) lienholderValues.phone = lienholder.phone;\n if (lienholder.fax) lienholderValues.fax = lienholder.fax;\n return lienholderValues;\n });\n }\n\n return vehicleValues;\n });\n } else {\n // No vehicles exist, set checkbox to 'No'\n formValues.vehicles = 'No';\n }\n\n // Home losses array -> home_losses__items\n if (quote.losses && quote.losses.length > 0) {\n formValues.home_losses__items = quote.losses.map((loss) => {\n const lossValues: FormValues = {};\n if (loss.description) lossValues.description = loss.description;\n if (loss.date_of_incident) lossValues.date_of_incident = formatDate(loss.date_of_incident);\n if (loss.amount_paid_cents !== null && loss.amount_paid_cents !== undefined) {\n lossValues.amount_paid_cents = loss.amount_paid_cents;\n }\n return lossValues;\n });\n }\n\n return formValues;\n}\n","import { useEffect, useCallback, useState } from 'react';\n\nimport type { GetRatesResponse, Stage } from '@getcredify/credify-insurance-types';\n\nimport { FormWizard, Rates } from './index';\n\nimport type { StageMeta, FormValues } from '../utils/form';\nimport {\n createQuote,\n getQuestionsByStage,\n getRates,\n getStagesForQuote,\n isSupportedState,\n setAuthToken,\n updateQuote,\n verifyQuote,\n getQuote,\n loadAuthTokenFromStorage,\n getAuthToken,\n clearAuthToken\n} from '../utils/api';\nimport { loadQuoteId, saveQuoteId, clearQuoteId } from '../utils/storage';\nimport { quoteToFormValues } from '../utils/quoteToFormValues';\nimport {\n pushWidgetOpened,\n pushWidgetClosed,\n pushFlowCompleted,\n pushRatesViewed,\n pushStageCompleted\n} from '../utils/gtm';\n\nfunction transformFormValues(values: FormValues): FormValues {\n const transformed: FormValues = {};\n\n // Helper function to convert \"Yes\"/\"No\" to boolean\n const convertYesNoToBoolean = (value: unknown): unknown => {\n if (typeof value === 'string') {\n if (value === 'Yes') return true;\n if (value === 'No') return false;\n }\n return value;\n };\n\n // Get all non-__items keys to determine which fields are in the current stage\n const nonItemsKeys = Object.keys(values).filter((key) => !key.includes('__items'));\n\n // Get all field names that exist within any __items arrays\n const fieldsInArrays = new Set<string>();\n for (const [key, value] of Object.entries(values)) {\n if (key.endsWith('__items') && Array.isArray(value)) {\n value.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n Object.keys(item).forEach((fieldName) => {\n fieldsInArrays.add(fieldName);\n });\n }\n });\n }\n }\n\n for (const [key, value] of Object.entries(values)) {\n if (key.endsWith('__items')) {\n // Convert \"drivers__items\" to \"drivers\" with the array value\n const baseKey = key.replace('__items', '');\n\n // Only include this array if there's a corresponding root-level field with the same name\n // This indicates the array is actively being used in the current stage\n const hasCorrespondingRootField = nonItemsKeys.includes(baseKey);\n\n if (hasCorrespondingRootField) {\n // Recursively transform each item in the array\n const transformedArray = Array.isArray(value) ? value.map((item) => transformFormValues(item as FormValues)) : value;\n transformed[baseKey] = transformedArray;\n }\n } else if (!key.includes('__items')) {\n // Include root-level fields that don't exist in any array items\n // This prevents including fields from previous stages that are now represented in arrays\n if (!fieldsInArrays.has(key)) {\n transformed[key] = convertYesNoToBoolean(value);\n }\n }\n // Skip any other __items related keys that we've already processed\n }\n\n return transformed;\n}\n\nexport default function Widget({ isOpen, onClose }: { isOpen: boolean; onClose: () => void }) {\n const [stages, setStages] = useState<StageMeta[]>([]);\n const [quoteId, setQuoteId] = useState<string | null>(null);\n const [rates, setRates] = useState<GetRatesResponse | null>(null);\n const [savedFormValues, setSavedFormValues] = useState<FormValues | null>(null);\n const [initialActiveStage, setInitialActiveStage] = useState<number | undefined>(undefined);\n const [isRestoringQuote, setIsRestoringQuote] = useState(false);\n\n function mapStagesToStageMetas(stages: Stage[]): StageMeta[] {\n // Map stage keys to human-friendly titles\n const stageTitleMap: Record<string, string> = {\n SMSVerification: 'Verify',\n AutoCurrentCarrier: 'Current Auto Policy',\n HomeCurrentCarrier: 'Current Home Policy'\n };\n\n return stages.map((stage) => ({\n key: stage,\n title: stageTitleMap[stage] || stage,\n loadQuestions: async () => {\n const data = await getQuestionsByStage(stage);\n const qs = data.questions;\n return qs;\n }\n }));\n }\n\n // Restore quote state on mount\n useEffect(() => {\n const restoreQuoteState = async () => {\n try {\n // Load quoteId and authToken from localStorage\n const storedQuoteId = loadQuoteId();\n loadAuthTokenFromStorage();\n\n if (storedQuoteId) {\n setIsRestoringQuote(true);\n setQuoteId(storedQuoteId);\n\n // Try to fetch quote data - use token if available, otherwise send quoteId in body\n try {\n const token = getAuthToken();\n const response = await getQuote(token ? undefined : storedQuoteId);\n\n if (!response || !response.quote) {\n throw new Error('Invalid response from getQuote: missing quote data');\n }\n\n const { quote } = response;\n\n // Find the stage index based on current_stage FIRST\n // This ensures we have the correct stages before setting form values\n const { stages: currentStages } = await getStagesForQuote();\n const stageMetas = mapStagesToStageMetas(currentStages);\n setStages(stageMetas);\n\n // Transform quote data to form values\n try {\n const formValues = quoteToFormValues(quote);\n setSavedFormValues(formValues);\n } catch (transformError) {\n throw new Error(`Failed to transform quote data: ${transformError instanceof Error ? transformError.message : 'Unknown error'}`);\n }\n\n // Set the initial active stage based on current_stage\n if (quote.current_stage) {\n const stageIndex = stageMetas.findIndex((s) => s.key === quote.current_stage);\n if (stageIndex >= 0) {\n setInitialActiveStage(stageIndex);\n } else {\n // If current_stage not found, default to last stage\n setInitialActiveStage(stageMetas.length - 1);\n }\n } else {\n // If no current_stage, default to last stage\n setInitialActiveStage(stageMetas.length - 1);\n }\n } catch (error) {\n // If quote fetch fails, check if it's a 404 (quote not found)\n const apiError = error as Error & { statusCode?: number };\n if (apiError.statusCode === 404) {\n // Quote doesn't exist - clear invalid quoteId and let user start fresh\n clearQuoteId();\n setQuoteId(null);\n } else {\n // Other errors (e.g., token expired) - clear token but keep quoteId\n clearAuthToken();\n // Don't clear quoteId - user can continue and verify SMS again\n }\n } finally {\n setIsRestoringQuote(false);\n }\n } else {\n // No quote to restore, fetch default stages\n const { stages: defaultStages } = await getStagesForQuote();\n setStages(mapStagesToStageMetas(defaultStages));\n }\n } catch {\n // Silently handle restore errors\n setIsRestoringQuote(false);\n }\n };\n\n if (isOpen) {\n restoreQuoteState();\n }\n }, [isOpen]);\n\n // Lock background scroll\n useEffect(() => {\n if (!isOpen) return;\n const { overflow } = document.body.style;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = overflow;\n };\n }, [isOpen]);\n\n // Close on Escape\n const onKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n pushWidgetClosed();\n onClose();\n }\n },\n [onClose]\n );\n useEffect(() => {\n if (!isOpen) return;\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [isOpen, onKeyDown]);\n\n // Clear saved form values and reset state when widget closes\n useEffect(() => {\n if (!isOpen) {\n setSavedFormValues(null);\n setInitialActiveStage(undefined);\n setIsRestoringQuote(false);\n }\n }, [isOpen]);\n\n // GTM: widget opened\n useEffect(() => {\n if (isOpen) pushWidgetOpened();\n }, [isOpen]);\n\n // GTM: rates viewed\n useEffect(() => {\n if (rates && Array.isArray(rates)) pushRatesViewed({ rateCount: rates.length });\n }, [rates]);\n\n if (!isOpen) return null;\n\n const handleClose = () => {\n pushWidgetClosed();\n onClose();\n };\n\n return (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"insurance-modal-title\">\n <div className=\"backdrop\" aria-hidden=\"true\" />\n\n <div className=\"modal-panel bg-white relative w-full max-w-2xl flex flex-col max-h-[90vh] overflow-hidden\" role=\"document\">\n <button\n onClick={handleClose}\n className=\"modal-close-btn absolute top-4 right-4 text-slate-400 hover:text-slate-600 text-xl\"\n aria-label=\"Close\"\n type=\"button\"\n >\n &times;\n </button>\n\n <div className=\"text-center mb-6\">\n <h2 id=\"insurance-modal-title\" className=\"h1-title\">\n Let's get you the best insurance rates.\n </h2>\n <p className=\"p-subtitle\">This should only take a few minutes.</p>\n </div>\n\n {/* The ONLY scrollable area */}\n <div className=\"panel-body flex-1 min-h-0 overflow-y-auto\">\n {!rates && (\n <>\n {isRestoringQuote || stages.length === 0 ? (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"text-slate-600\">Loading...</div>\n </div>\n ) : (\n <FormWizard\n stages={stages}\n initialValues={savedFormValues ?? undefined}\n initialActive={initialActiveStage}\n onStageComplete={async (stageValues, stageKey) => {\n try {\n const transformedValues = transformFormValues(stageValues);\n\n // Get the updated stages first to determine the next stage\n const { stages: newStages } = await getStagesForQuote();\n const stageMetas = mapStagesToStageMetas(newStages);\n setStages(stageMetas);\n\n // Find the next stage after the completed one\n const currentStageIndex = stageMetas.findIndex((s) => s.key === stageKey);\n const currentMeta = stageMetas[currentStageIndex];\n const nextStageIndex = currentStageIndex + 1;\n const nextStage = nextStageIndex < stageMetas.length ? stageMetas[nextStageIndex] : null;\n const nextStageKey = nextStage?.key || stageKey; // If it's the last stage, keep the current one\n\n if (!quoteId) {\n const createQuoteResponse = await createQuote(transformedValues.phone as string);\n const newQuoteId = createQuoteResponse?.quoteId;\n if (!newQuoteId || typeof newQuoteId !== 'string' || newQuoteId.trim() === '') {\n throw new Error(`Failed to create quote - invalid quoteId returned: ${newQuoteId}`);\n }\n setQuoteId(newQuoteId);\n saveQuoteId(newQuoteId);\n // Save next stage as current_stage after creating quote (no token yet, so pass quoteId)\n await updateQuote({ current_stage: nextStageKey }, false, newQuoteId);\n } else if (stageKey === 'SMSVerification') {\n const { isVerified, token } = await verifyQuote(quoteId, transformedValues.sms_code as string);\n if (!isVerified) {\n throw new Error('Invalid SMS code');\n }\n if (token) {\n setAuthToken(token);\n }\n // Save next stage as current_stage after SMS verification (now we have a token)\n await updateQuote({ current_stage: nextStageKey }, false);\n } else if (stageKey === 'State') {\n const { isSupported } = await isSupportedState(transformedValues.state as string);\n if (!isSupported) {\n throw new Error('State is not supported');\n }\n // Include next stage as current_stage in the payload\n // Pass quoteId if we have it but no token (for pre-verification stages)\n const token = getAuthToken();\n await updateQuote({ ...transformedValues, current_stage: nextStageKey }, false, token ? undefined : quoteId);\n } else {\n // Include next stage as current_stage in the payload\n // Pass quoteId if we have it but no token (for pre-verification stages)\n const token = getAuthToken();\n await updateQuote({ ...transformedValues, current_stage: nextStageKey }, false, token ? undefined : quoteId || undefined);\n }\n\n pushStageCompleted({\n stageKey,\n stageTitle: currentMeta?.title ?? stageKey,\n stepIndex: currentStageIndex + 1,\n totalSteps: stageMetas.length\n });\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'An error occurred' };\n }\n }}\n onComplete={async (allValues) => {\n try {\n const transformedValues = transformFormValues(allValues);\n\n if (!quoteId) {\n throw new Error('Quote ID is required');\n }\n await updateQuote(transformedValues, true);\n\n // Save form values so we can restore them when going back\n setSavedFormValues(allValues);\n\n const { rates } = await getRates();\n setRates(rates);\n\n const totalSteps = stages.length;\n const lastStage = stages[totalSteps - 1];\n pushStageCompleted({\n stageKey: lastStage?.key ?? 'unknown',\n stageTitle: lastStage?.title ?? 'unknown',\n stepIndex: totalSteps,\n totalSteps\n });\n pushFlowCompleted();\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'An error occurred' };\n }\n }}\n />\n )}\n </>\n )}{' '}\n {rates && quoteId && <Rates rates={rates} onBack={() => setRates(null)} />}\n </div>\n\n {/* Footer */}\n <div className=\"mt-4 pt-4 border-t border-slate-200\">\n <p className=\"text-center text-sm text-slate-500\">Insurance products offered through Credify Corporation, a licensed insurance agency.</p>\n </div>\n </div>\n </div>\n );\n}\n","import Widget from '../components/Widget';\nimport CredifyInsuranceWidget from '../widget';\n\nexport default function WidgetController({ isOpen }: { isOpen: boolean }) {\n return (\n <Widget\n isOpen={isOpen}\n onClose={() => {\n CredifyInsuranceWidget.close();\n }}\n />\n );\n}\n","/* @refresh skip */\nimport { createElement } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport WidgetController from './internal/WidgetController';\nimport './index.css';\n// CSS is injected at runtime by vite-plugin-css-injected-by-js so the widget always has its styles on any host.\n\ntype InitOptions = { autoOpen?: boolean };\n\nlet container: HTMLDivElement | null = null;\nlet root: Root | null = null;\nlet isOpen = false;\n\nfunction ensureRoot() {\n if (!container) {\n container = document.createElement('div');\n container.id = 'insurance-widget-root';\n // Mount on documentElement so host transforms/filters on body don't make\n // our fixed overlay position relative to body (which would look inline).\n document.documentElement.appendChild(container);\n }\n if (!root && container) {\n root = createRoot(container);\n }\n}\n\nfunction render() {\n ensureRoot();\n if (root) {\n root.render(createElement(WidgetController, { isOpen })); // ⬅️ controlled prop\n }\n}\n\nfunction destroy() {\n if (root && container) {\n root.unmount();\n container.remove();\n }\n root = null;\n container = null;\n}\n\nexport interface CredifyInsuranceWidgetAPI {\n init(options?: InitOptions): void;\n open(): void;\n close(): void;\n destroy(): void;\n}\n\nexport const CredifyInsuranceWidget: CredifyInsuranceWidgetAPI = {\n init: (options) => {\n isOpen = !!options?.autoOpen; // default false\n render();\n },\n open: () => {\n isOpen = true;\n render();\n },\n close: () => {\n isOpen = false;\n render();\n },\n destroy\n};\n\n// expose globally for script-tag usage\ndeclare global {\n interface Window {\n CredifyInsuranceWidget?: CredifyInsuranceWidgetAPI;\n }\n}\nif (typeof window !== 'undefined') window.CredifyInsuranceWidget = CredifyInsuranceWidget;\n\nexport default CredifyInsuranceWidget;\n"],"names":["Field","id","label","hint","error","required","className","children","jsxs","jsx","TextInput","rest","NumericInput","EmailInput","formatPhoneNumber","value","digits","tenDigits","extractDigits","TelInput","onChange","displayValue","setDisplayValue","useState","inputRef","useRef","cursorPositionRef","useEffect","limitedDigits","handleChange","e","input","inputValue","formatted","rawValue","syntheticEvent","beforeCursor","digitsBeforeCursor","formattedBeforeCursor","newPosition","UrlInput","PasswordInput","TextArea","rows","DateInput","Checkbox","Radio","name","checked","RadioGroup","legend","legendClassName","SelectInput","placeholder","options","describedBy","hasCustomChildren","opt","GOOGLE_MAPS_API_KEY","loadGoogleMapsScript","resolve","reject","existingScript","script","extractAddressComponents","place","components","component","types","AddressAutocomplete","onPlaceSelect","autocompleteServiceRef","placesServiceRef","suggestionsContainerRef","isLoading","setIsLoading","setInputValue","suggestions","setSuggestions","showSuggestions","setShowSuggestions","selectedIndex","setSelectedIndex","suggestionsRef","showSuggestionsRef","selectedIndexRef","debounceTimerRef","isMounted","err","handleInputChange","query","predictions","status","handleKeyDown","prev","newIndex","handleSuggestionClick","handleClickOutside","event","prediction","formattedAddress","addressComponents","index","slugify","s","ensureKey","q","idx","validateQuestions","questions","values","errors","isBlank","v","key","val","coerceNumber","n","toNumber","x","toTime","cmp","a","b","na","nb","ta","tb","contains","haystack","needle","evalConditional","qValue","conditionalType","conditionalValue","c","getIn","obj","path","acc","setInImmutable","head","tail","arr","current","nextContainer","next","scopedRead","scope","scopedWrite","ITEMS_SUFFIX","itemsKey","k","decorateKeys","walk","list","pathParts","qi","parentPart","baseKey","nextConds","ci","nested","asTextValue","asNumberValue","asSelectValue","FormRenderer","initialValues","controlledValues","onChangeValues","onSubmit","keyedQuestions","useMemo","initialUncontrolled","uncontrolled","setUncontrolled","localShadow","setLocalShadow","p","setErrors","renderOne","scopePath","set","nextAll","conds","cond","currentValue","wasActive","willBeActive","arrStorageKey","clearNestedArrays","questionList","currentScope","childQ","childCond","nestedArrKey","grandChildren","Fragment","idOpt","opts","scopedName","o","address","renderRecursive","qIndex","elem","matches","branches","branch","bi","count","pushEmpty","popLast","nextArr","groupIdBase","_","itemScope","groupId","childConds","childVal","childMatches","m","bc","bci","nestedArr","nestedCount","nestedPush","nestedPop","__","nIdx","nestedScope","visibleFlat","out","handleSubmit","eMap","firstIdx","GTM_CONTAINER_ID","getDataLayer","pushDataLayerEvent","eventName","payload","pushWidgetOpened","pushWidgetClosed","pushStageViewed","pushStageCompleted","pushFlowCompleted","pushRatesViewed","pushRatesBack","type","rhs","flattenVisibleQuestions","root","child","validateRepeatablesRecursive","valuesAtScope","qKey","qVal","item","itemErrors","hasRepeatableBlockingErrors","rootValues","FormWizard","stages","onStageComplete","onComplete","initialActive","active","setActive","allValues","setAllValues","perStageQuestions","setPerStageQuestions","loading","setLoading","isSubmitting","setIsSubmitting","stageError","setStageError","stepRefs","hasStages","stage","stageKey","activeElement","cancelled","qs","currentValues","slice","keys","i","kItems","updateCurrentValues","goPrev","goNext","visible","flatErrors","flatBlock","repeatBlock","nextIndex","isComplete","success","disableNext","el","copy","QUOTE_ID_KEY","AUTH_TOKEN_KEY","saveQuoteId","quoteId","loadQuoteId","clearQuoteId","saveAuthToken","token","loadAuthToken","clearAuthToken","clearAllQuoteData","BASE_URL","authToken","setAuthToken","getAuthToken","loadAuthTokenFromStorage","storedToken","clearAuthTokenStorage","makeAuthenticatedRequest","url","body","headers","response","errorMessage","getQuestionsByStage","getStagesForQuote","createQuote","phone","data","updateQuote","getRates","verifyQuote","smsCode","isSupportedState","state","getQuote","requestBind","quoteRateId","currencyFormatter","BackButton","onBack","Rates","rates","hasRates","requestStatuses","setRequestStatuses","rate","premiumDollars","formattedPremium","cardKey","isRequesting","isRequested","handleRequestBind","convertBooleanToYesNo","formatDate","date","d","quoteToFormValues","quote","formValues","addressParts","priorAddressParts","driver","driverValues","violation","violationValues","accident","accidentValues","loss","lossValues","vehicle","vehicleValues","garagingAddressParts","coverage","coverageValues","lienholder","lienholderValues","transformFormValues","transformed","convertYesNoToBoolean","nonItemsKeys","fieldsInArrays","fieldName","transformedArray","Widget","isOpen","onClose","setStages","setQuoteId","setRates","savedFormValues","setSavedFormValues","initialActiveStage","setInitialActiveStage","isRestoringQuote","setIsRestoringQuote","mapStagesToStageMetas","stageTitleMap","storedQuoteId","currentStages","stageMetas","transformError","stageIndex","defaultStages","overflow","onKeyDown","useCallback","stageValues","transformedValues","newStages","currentStageIndex","currentMeta","nextStageIndex","nextStageKey","isVerified","isSupported","newQuoteId","totalSteps","lastStage","WidgetController","CredifyInsuranceWidget","container","ensureRoot","createRoot","render","createElement","destroy"],"mappings":";;;;;;;AAYO,SAASA,EAAM,EAAE,IAAAC,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,UAAAC,KAAwB;AAC3F,SACE,gBAAAC,EAAC,SAAI,WAAAF,GACH,UAAA;AAAA,IAAA,gBAAAE,EAAC,SAAA,EAAM,SAASP,GAAI,WAAU,cAC3B,UAAA;AAAA,MAAAC;AAAA,MAAM;AAAA,MAAEG,KAAY,gBAAAI,EAAC,QAAA,EAAK,WAAU,gBAAe,UAAA,IAAA,CAAC;AAAA,IAAA,GACvD;AAAA,IACCF;AAAA,IACAJ,KAAQ,CAACC,KACR,gBAAAK,EAAC,KAAA,EAAE,IAAI,GAAGR,CAAE,SAAS,WAAU,+BAC5B,UAAAE,EAAA,CACH;AAAA,IAEDC,uBACE,KAAA,EAAE,IAAI,GAAGH,CAAE,UAAU,WAAU,6BAC7B,UAAAG,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AC1BO,SAASM,GAAU,EAAE,IAAAT,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AACzF,2BACGX,GAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,gBAAc,CAAC,CAACA;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MAC1G,UAAAI;AAAA,MACC,GAAGM;AAAA,MACJ,MAAK;AAAA,IAAA;AAAA,EAAA,GAET;AAEJ;ACdO,SAASC,GAAa,EAAE,IAAAX,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AAC5F,2BACGX,GAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAK;AAAA,MACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,gBAAc,CAAC,CAACA;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MAC1G,UAAAI;AAAA,MACC,GAAGM;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;ACdO,SAASE,GAAW,EAAE,IAAAZ,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AAC1F,2BACGX,GAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAK;AAAA,MACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,WAAU;AAAA,MACV,cAAa;AAAA,MACb,UAAAC;AAAA,MACA,gBAAc,CAAC,CAACD;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MACzG,GAAGU;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;ACPA,SAASG,GAAkBC,GAAuB;AAEhD,QAAMC,IAASD,EAAM,QAAQ,OAAO,EAAE;AAGtC,MAAIC,EAAO,WAAW;AACpB,WAAO,IAAIA,EAAO,MAAM,GAAG,CAAC,CAAC,KAAKA,EAAO,MAAM,GAAG,CAAC,CAAC,MAAMA,EAAO,MAAM,CAAC,CAAC;AAI3E,MAAIA,EAAO,SAAS,IAAI;AACtB,UAAMC,IAAYD,EAAO,MAAM,GAAG,EAAE;AACpC,WAAO,IAAIC,EAAU,MAAM,GAAG,CAAC,CAAC,KAAKA,EAAU,MAAM,GAAG,CAAC,CAAC,MAAMA,EAAU,MAAM,CAAC,CAAC;AAAA,EACpF;AAGA,SAAID,EAAO,UAAU,IACZ,IAAIA,EAAO,MAAM,GAAG,CAAC,CAAC,KAAKA,EAAO,MAAM,GAAG,CAAC,CAAC,MAAMA,EAAO,MAAM,CAAC,CAAC,KAEvEA,EAAO,UAAU,IACZ,IAAIA,EAAO,MAAM,GAAG,CAAC,CAAC,KAAKA,EAAO,MAAM,CAAC,CAAC,KAE/CA,EAAO,SAAS,IACX,IAAIA,CAAM,KAGZA;AACT;AAKA,SAASE,GAAcH,GAAuB;AAC5C,SAAOA,EAAM,QAAQ,OAAO,EAAE;AAChC;AAEO,SAASI,GAAS,EAAE,IAAAlB,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,OAAAS,IAAQ,IAAI,UAAAK,GAAU,GAAGT,KAAe;AAC9G,QAAM,CAACU,GAAcC,CAAe,IAAIC,EAAS,EAAE,GAC7CC,IAAWC,EAAyB,IAAI,GACxCC,IAAoBD,EAAe,CAAC;AAG1C,EAAAE,EAAU,MAAM;AACd,QAAI,CAACZ,GAAO;AACV,MAAAO,EAAgB,EAAE;AAClB;AAAA,IACF;AAGA,QAAIN,IAASE,GAAcH,CAAK;AAGhC,IAAIC,EAAO,WAAW,MAAMA,EAAO,WAAW,GAAG,MAC/CA,IAASA,EAAO,MAAM,CAAC;AAIzB,UAAMY,IAAgBZ,EAAO,MAAM,GAAG,EAAE;AACxC,IAAAM,EAAgBR,GAAkBc,CAAa,CAAC;AAAA,EAClD,GAAG,CAACb,CAAK,CAAC;AAEV,QAAMc,IAAe,CAACC,MAAqC;AACzD,UAAMC,IAAQD,EAAE,QACVE,IAAaD,EAAM;AAGzB,IAAAL,EAAkB,UAAUK,EAAM,kBAAkB;AAMpD,UAAMH,IAHSV,GAAcc,CAAU,EAGV,MAAM,GAAG,EAAE,GAGlCC,IAAYnB,GAAkBc,CAAa;AACjD,IAAAN,EAAgBW,CAAS;AAIzB,UAAMC,IAAWN,EAAc,WAAW,KAAK,KAAKA,CAAa,KAAKA,GAGhEO,IAAiB;AAAA,MACrB,GAAGL;AAAA,MACH,eAAe;AAAA,QACb,GAAGA,EAAE;AAAA,QACL,OAAOI;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,GAAGJ,EAAE;AAAA,QACL,OAAOI;AAAA,MAAA;AAAA,IACT;AAIF,IAAAd,IAAWe,CAAc,GAGzB,WAAW,MAAM;AACf,UAAIX,EAAS,SAAS;AAEpB,cAAMY,IAAeJ,EAAW,MAAM,GAAGN,EAAkB,OAAO,GAC5DW,IAAqBnB,GAAckB,CAAY,GAC/CE,IAAwBxB,GAAkBuB,CAAkB,GAE5DE,IAAc,KAAK,IAAID,EAAsB,QAAQL,EAAU,MAAM;AAC3E,QAAAT,EAAS,QAAQ,kBAAkBe,GAAaA,CAAW;AAAA,MAC7D;AAAA,IACF,GAAG,CAAC;AAAA,EACN;AAEA,2BACGvC,GAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,2FACTJ,IAAQ,yBAAyB,yEACnC;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAK;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASR;AAAA,YACT,WAAU;AAAA,YACX,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAQ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKe;AAAA,YACL,IAAAvB;AAAA,YACA,MAAK;AAAA,YACL,WAAW,2GACTG,IAAQ,gBAAgB,EAC1B;AAAA,YACA,WAAU;AAAA,YACV,cAAa;AAAA,YACb,UAAAC;AAAA,YACA,gBAAc,CAAC,CAACD;AAAA,YAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,YAC1G,OAAOoB;AAAA,YACP,UAAUQ;AAAA,YACT,GAAGlB;AAAA,UAAA;AAAA,QAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;ACzJO,SAAS6B,GAAS,EAAE,IAAAvC,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AACxF,2BACGX,GAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAK;AAAA,MACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,WAAU;AAAA,MACV,cAAa;AAAA,MACb,UAAAC;AAAA,MACA,gBAAc,CAAC,CAACD;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MACzG,GAAGU;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;AChBO,SAAS8B,GAAc,EAAE,IAAAxC,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AAC7F,2BACGX,GAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAK;AAAA,MACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,cAAa;AAAA,MACb,UAAAC;AAAA,MACA,gBAAc,CAAC,CAACD;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MACzG,GAAGU;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;ACfO,SAAS+B,GAAS,EAAE,IAAAzC,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,MAAAqC,IAAO,GAAG,GAAGhC,EAAA,GAAe;AAClG,2BACGX,GAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAA0C;AAAA,MACA,WAAW,cAAcvC,IAAQ,gBAAgB,EAAE;AAAA,MACnD,gBAAc,CAAC,CAACA;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MAC1G,UAAAI;AAAA,MACC,GAAGM;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;ACdO,SAASiC,GAAU,EAAE,IAAA3C,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AACzF,2BACGX,GAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAK;AAAA,MACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,gBAAc,CAAC,CAACA;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MAC1G,UAAAI;AAAA,MACC,GAAGM;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;ACXO,SAASkC,GAAS,EAAE,IAAA5C,GAAI,OAAAC,GAAO,WAAAI,GAAW,GAAGK,KAAe;AACjE,SACE,gBAAAH,EAAC,WAAM,WAAW,iBAAiBF,KAAa,EAAE,IAAI,SAASL,GAC7D,UAAA;AAAA,IAAA,gBAAAQ,EAAC,WAAM,IAAAR,GAAQ,MAAK,YAAW,WAAU,kBAAkB,GAAGU,GAAM;AAAA,IACpE,gBAAAF,EAAC,QAAA,EAAK,WAAU,kBAAkB,UAAAP,EAAA,CAAM;AAAA,EAAA,GAC1C;AAEJ;ACbO,SAAS4C,GAAM;AAAA,EACpB,MAAAC;AAAA,EACA,OAAAhC;AAAA,EACA,SAAAiC;AAAA,EACA,UAAA5B;AAAA,EACA,UAAAb;AACF,GAMG;AACD,SACE,gBAAAC,EAAC,SAAA,EAAM,WAAU,cACf,UAAA;AAAA,IAAA,gBAAAC,EAAC,SAAA,EAAM,WAAU,eAAc,MAAK,SAAQ,MAAAsC,GAAY,OAAAhC,GAAc,SAAAiC,GAAkB,UAAA5B,EAAA,CAAoB;AAAA,IAC5G,gBAAAX,EAAC,QAAA,EAAK,WAAU,eAAe,UAAAF,EAAA,CAAS;AAAA,EAAA,GAC1C;AAEJ;AAEO,SAAS0C,GAAW;AAAA,EACzB,QAAAC;AAAA,EACA,UAAA3C;AAAA,EACA,WAAAD;AAAA,EACA,iBAAA6C;AAAA;AACF,GAKG;AACD,SACE,gBAAA3C,EAAC,cAAS,WAAAF,GACR,UAAA;AAAA,IAAA,gBAAAG,EAAC,UAAA,EAAO,WAAW,8BAA8B0C,KAAmB,EAAE,IAAI,OAAO,EAAE,OAAO,sBAAA,GACvF,UAAAD,EAAA,CACH;AAAA,IACA,gBAAAzC,EAAC,OAAA,EAAI,WAAU,yCAAyC,UAAAF,EAAA,CAAS;AAAA,EAAA,GACnE;AAEJ;ACzBO,SAAS6C,GAAY,EAAE,IAAAnD,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,aAAA+C,GAAa,SAAAC,GAAS,UAAA/C,GAAU,GAAGI,KAAe;AAC3H,QAAM4C,IAAc,CAACpD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,QAEtGuD,IAAoB,CAAC,CAACjD;AAE5B,2BACGP,GAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAP;AAAA,MACA,WAAW,2BAA2BG,IAAQ,gBAAgB,EAAE;AAAA,MAChE,gBAAc,CAAC,CAACA;AAAA,MAChB,oBAAkBmD;AAAA,MAClB,UAAAlD;AAAA,MACC,GAAGM;AAAA,MAEH,UAAA;AAAA,QAAA0C,KACC,gBAAA5C,EAAC,UAAA,EAAO,OAAM,IAAG,UAAQ,IAAC,UAAU,EAAE,WAAWE,IAC9C,UAAA0C,EAAA,CACH;AAAA,QAGDG,IACGjD,IACA+C,GAAS,IAAI,CAACG,wBACX,UAAA,EAAuB,OAAOA,EAAI,OAAO,UAAUA,EAAI,UACrD,YAAI,MAAA,GADMA,EAAI,KAEjB,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAET;AAEJ;AC3CA,MAAMC,KAAsB;AAmB5B,SAASC,KAAsC;AAC7C,SAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AAEtC,QAAI,OAAO,QAAQ,MAAM,QAAQ;AAC/B,MAAAD,EAAA;AACA;AAAA,IACF;AAGA,UAAME,IAAiB,SAAS,cAAc,oCAAoC;AAClF,QAAIA,GAAgB;AAClB,MAAAA,EAAe,iBAAiB,QAAQ,MAAMF,EAAA,CAAS,GACvDE,EAAe,iBAAiB,SAAS,MAAMD,EAAO,IAAI,MAAM,mCAAmC,CAAC,CAAC;AACrG;AAAA,IACF;AAGA,UAAME,IAAS,SAAS,cAAc,QAAQ;AAC9C,IAAAA,EAAO,MAAM,+CAA+CL,EAAmB,qBAC/EK,EAAO,QAAQ,IACfA,EAAO,QAAQ,IACfA,EAAO,SAAS,MAAMH,EAAA,GACtBG,EAAO,UAAU,MAAMF,EAAO,IAAI,MAAM,mCAAmC,CAAC,GAC5E,SAAS,KAAK,YAAYE,CAAM;AAAA,EAClC,CAAC;AACH;AAGA,SAASC,GAAyBC,GAA0D;AAC1F,QAAMC,IAAgC;AAAA,IACpC,aAAaD,EAAM;AAAA,EAAA;AAGrB,SAAIA,EAAM,sBACRA,EAAM,mBAAmB,QAAQ,CAACE,MAAc;AAC9C,UAAMC,IAAQD,EAAU;AAExB,IAAIC,EAAM,SAAS,eAAe,MAChCF,EAAW,eAAeC,EAAU,YAElCC,EAAM,SAAS,OAAO,MACxBF,EAAW,aAAaC,EAAU,YAEhCC,EAAM,SAAS,UAAU,MAC3BF,EAAW,OAAOC,EAAU,YAE1BC,EAAM,SAAS,6BAA6B,MAC9CF,EAAW,QAAQC,EAAU,aAE3BC,EAAM,SAAS,aAAa,MAC9BF,EAAW,UAAUC,EAAU,YAE7BC,EAAM,SAAS,SAAS,MAC1BF,EAAW,UAAUC,EAAU;AAAA,EAEnC,CAAC,GAGID;AACT;AAEO,SAASG,GAAoB,EAAE,IAAApE,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,UAAAc,GAAU,eAAAkD,GAAe,OAAAvD,GAAO,GAAGJ,KAAe;AACnI,QAAMa,IAAWC,EAAyB,IAAI,GACxC8C,IAAyB9C,EAAsD,IAAI,GACnF+C,IAAmB/C,EAAgD,IAAI,GACvEgD,IAA0BhD,EAAuB,IAAI,GACrD,CAACiD,GAAWC,CAAY,IAAIpD,EAAS,EAAI,GACzC,CAACS,GAAY4C,CAAa,IAAIrD,EAAUR,KAAoB,EAAE,GAC9D,CAAC8D,GAAaC,CAAc,IAAIvD,EAAsD,CAAA,CAAE,GACxF,CAACwD,GAAiBC,CAAkB,IAAIzD,EAAS,EAAK,GACtD,CAAC0D,GAAeC,CAAgB,IAAI3D,EAAS,EAAE,GAG/C4D,IAAiB1D,EAAoD,EAAE,GACvE2D,IAAqB3D,EAAO,EAAK,GACjC4D,IAAmB5D,EAAO,EAAE;AAGlC,EAAAE,EAAU,MAAM;AACd,IAAAwD,EAAe,UAAUN;AAAA,EAC3B,GAAG,CAACA,CAAW,CAAC,GAEhBlD,EAAU,MAAM;AACd,IAAAyD,EAAmB,UAAUL;AAAA,EAC/B,GAAG,CAACA,CAAe,CAAC,GAEpBpD,EAAU,MAAM;AACd,IAAA0D,EAAiB,UAAUJ;AAAA,EAC7B,GAAG,CAACA,CAAa,CAAC,GAElBtD,EAAU,MAAM;AAEd,IAAIZ,MAAU,UACZ6D,EAAc,OAAO7D,CAAK,CAAC;AAAA,EAE/B,GAAG,CAACA,CAAK,CAAC;AAGV,QAAMuE,IAAmB7D,EAA8B,IAAI;AAE3D,EAAAE,EAAU,MAAM;AACd,QAAI,CAACH,EAAS,QAAS;AAEvB,QAAI+D,IAAY;AAGhB,WAAA5B,GAAA,EACG,KAAK,MAAM;AACV,MAAI,CAAC4B,KAAa,CAAC/D,EAAS,YAG5B+C,EAAuB,UAAU,IAAI,OAAO,KAAK,OAAO,oBAAA,GACxDC,EAAiB,UAAU,IAAI,OAAO,KAAK,OAAO,cAAc,SAAS,cAAc,KAAK,CAAC,GAE7FG,EAAa,EAAK;AAAA,IACpB,CAAC,EACA,MAAM,CAACa,MAAQ;AACd,cAAQ,MAAM,8BAA8BA,CAAG,GAC/Cb,EAAa,EAAK;AAAA,IACpB,CAAC,GAEI,MAAM;AACX,MAAAY,IAAY,IACRD,EAAiB,WACnB,aAAaA,EAAiB,OAAO;AAAA,IAEzC;AAAA,EACF,GAAG,CAAA,CAAE;AAGL,QAAMG,IAAoB,CAAC3D,MAA2C;AACpE,UAAM4D,IAAQ5D,EAAE,OAAO;AASvB,QARA8C,EAAcc,CAAK,GACnBtE,IAAWsE,CAAK,GAGZJ,EAAiB,WACnB,aAAaA,EAAiB,OAAO,GAGnCI,EAAM,SAAS,GAAG;AACpB,MAAAZ,EAAe,CAAA,CAAE,GACjBE,EAAmB,EAAK;AACxB;AAAA,IACF;AAGA,IAAAM,EAAiB,UAAU,WAAW,MAAM;AAC1C,MAAKf,EAAuB,WAE5BA,EAAuB,QAAQ;AAAA,QAC7B;AAAA,UACE,OAAOmB;AAAA,UACP,OAAO,CAAC,SAAS;AAAA,QAAA;AAAA,QAEnB,CAACC,GAAaC,MAAW;AACvB,UAAIA,MAAW,OAAO,KAAK,OAAO,oBAAoB,MAAMD,KAC1Db,EAAea,CAAW,GAC1BX,EAAmB,EAAI,GACvBE,EAAiB,EAAE,MAEnBJ,EAAe,CAAA,CAAE,GACjBE,EAAmB,EAAK;AAAA,QAE5B;AAAA,MAAA;AAAA,IAEJ,GAAG,GAAG;AAAA,EACR,GAGMa,IAAgB,CAAC/D,MAA6C;AAClE,QAAI,CAACsD,EAAmB,WAAWD,EAAe,QAAQ,WAAW,GAAG;AACtE,MAAIrD,EAAE,QAAQ,aACZkD,EAAmB,EAAK,GACxBI,EAAmB,UAAU;AAE/B;AAAA,IACF;AAEA,YAAQtD,EAAE,KAAA;AAAA,MACR,KAAK;AACH,QAAAA,EAAE,eAAA,GACFoD,EAAiB,CAACY,MAAS;AACzB,gBAAMC,IAAWD,IAAOX,EAAe,QAAQ,SAAS,IAAIW,IAAO,IAAIA;AACvE,iBAAAT,EAAiB,UAAUU,GACpBA;AAAA,QACT,CAAC;AACD;AAAA,MACF,KAAK;AACH,QAAAjE,EAAE,eAAA,GACFoD,EAAiB,CAACY,MAAS;AACzB,gBAAMC,IAAWD,IAAO,IAAIA,IAAO,IAAI;AACvC,iBAAAT,EAAiB,UAAUU,GACpBA;AAAA,QACT,CAAC;AACD;AAAA,MACF,KAAK;AACH,QAAAjE,EAAE,eAAA,GACEuD,EAAiB,WAAW,KAAKA,EAAiB,UAAUF,EAAe,QAAQ,UACrFa,EAAsBb,EAAe,QAAQE,EAAiB,OAAO,CAAC;AAExE;AAAA,MACF,KAAK;AACH,QAAAvD,EAAE,eAAA,GACFkD,EAAmB,EAAK,GACxBI,EAAmB,UAAU;AAC7B;AAAA,IAAA;AAAA,EAEN;AAGA,EAAAzD,EAAU,MAAM;AACd,UAAMsE,IAAqB,CAACC,MAAsB;AAChD,MACEzB,EAAwB,WACxB,CAACA,EAAwB,QAAQ,SAASyB,EAAM,MAAc,KAC9D1E,EAAS,WACT,CAACA,EAAS,QAAQ,SAAS0E,EAAM,MAAc,MAE/ClB,EAAmB,EAAK,GACxBI,EAAmB,UAAU;AAAA,IAEjC;AAEA,QAAIL;AACF,sBAAS,iBAAiB,aAAakB,CAAkB,GAClD,MAAM;AACX,iBAAS,oBAAoB,aAAaA,CAAkB;AAAA,MAC9D;AAAA,EAEJ,GAAG,CAAClB,CAAe,CAAC;AAEpB,QAAMiB,IAAwB,CAACG,MAA0D;AACvF,IAAK3B,EAAiB,WAEtBA,EAAiB,QAAQ;AAAA,MACvB;AAAA,QACE,SAAS2B,EAAW;AAAA,QACpB,QAAQ,CAAC,sBAAsB,qBAAqB,UAAU;AAAA,MAAA;AAAA,MAEhE,CAAClC,GAAO2B,MAAW;AACjB,YAAIA,MAAW,OAAO,KAAK,OAAO,oBAAoB,MAAM3B,GAAO;AACjE,gBAAMmC,IAAmBnC,EAAM,qBAAqB;AACpD,UAAAW,EAAcwB,CAAgB,GAC9BpB,EAAmB,EAAK,GACxBF,EAAe,CAAA,CAAE,GACjBM,EAAmB,UAAU;AAE7B,gBAAMiB,IAAoBrC,GAAyBC,CAAK;AAExD,UAAA7C,IAAWgF,GAAkBC,CAAiB,GAC9C/B,IAAgBL,CAAK;AAAA,QACvB;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAEA,SACE,gBAAAxD,EAACT,GAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAE,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKe;AAAA,QACL,IAAAvB;AAAA,QACA,MAAK;AAAA,QACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,QACnD,OAAO4B;AAAA,QACP,UAAUyD;AAAA,QACV,WAAWI;AAAA,QACX,gBAAc,CAAC,CAACzF;AAAA,QAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,QAC1G,UAAAI;AAAA,QACA,cAAa;AAAA,QACb,aAAaM,EAAK,eAAe;AAAA,QACjC,UAAU+D,KAAa/D,EAAK;AAAA,QAC3B,GAAGA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEL+D,KAAa,gBAAAjE,EAAC,KAAA,EAAE,WAAU,+BAA8B,UAAA,kCAA8B;AAAA,IAGtFsE,KAAmBF,EAAY,SAAS,KACvC,gBAAApE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKgE;AAAA,QACL,WAAU;AAAA,QACV,MAAK;AAAA,QAEJ,UAAAI,EAAY,IAAI,CAACsB,GAAYG,MAC5B,gBAAA9F;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW,8CACT8F,MAAUrB,IAAgB,8BAA8B,2CAC1D,IAAIqB,IAAQzB,EAAY,SAAS,IAAI,8BAA8B,EAAE;AAAA,YACrE,MAAK;AAAA,YACL,iBAAeyB,MAAUrB;AAAA,YACzB,SAAS,MAAMe,EAAsBG,CAAU;AAAA,YAC/C,cAAc,MAAMjB,EAAiBoB,CAAK;AAAA,YAE1C,UAAA;AAAA,cAAA,gBAAA7F,EAAC,OAAA,EAAI,WAAU,8BAA8B,UAAA0F,EAAW,sBAAsB,WAAU;AAAA,cACvFA,EAAW,sBAAsB,kBAChC,gBAAA1F,EAAC,SAAI,WAAU,iCAAiC,UAAA0F,EAAW,sBAAsB,eAAA,CAAe;AAAA,YAAA;AAAA,UAAA;AAAA,UAX7FA,EAAW;AAAA,QAAA,CAcnB;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,EAAA,CAEJ,EAAA,CACF;AAEJ;AC/TO,SAASI,GAAQC,GAAW;AACjC,SAAOA,EACJ,cACA,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEO,SAASC,GAEdC,GACAC,GACQ;AACR,SAAQD,EAAE,OAA8B,GAAGH,GAAQG,EAAE,QAAQ,CAAC,IAAIC,CAAG;AACvE;AAGO,SAASC,GAEdC,GACAC,GACoC;AACpC,QAAMC,IAA6C,CAAA,GAE7CC,IAAU,CAACC,MAAkCA,KAAM,QAAS,OAAOA,KAAM,YAAYA,EAAE,KAAA,MAAW;AAExG,SAAAJ,EAAU,QAAQ,CAACH,GAAG,MAAM;AAC1B,UAAMQ,IAAMT,GAAUC,GAAG,CAAC,GACpBS,IAAML,EAAOI,CAAG;AAEtB,QAAKR,EAAE;AAEP,cAAQA,EAAE,WAAA;AAAA,QACR,KAAK;AACH,UAAIS,MAAQ,OAAMJ,EAAOG,CAAG,IAAI;AAChC;AAAA,QAEF,KAAK;AAAA,QACL,KAAK;AACH,UAAIF,EAAQG,CAAG,MAAGJ,EAAOG,CAAG,IAAI;AAChC;AAAA,QAEF,KAAK;AAEH,WAAyBC,KAAQ,QAAS,OAAOA,KAAQ,YAAYA,EAAI,KAAA,MAAW,QAClFJ,EAAOG,CAAG,IAAI;AAEhB;AAAA,QAEF,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL;AACE,UAAIF,EAAQG,CAAG,MAAGJ,EAAOG,CAAG,IAAI;AAChC;AAAA,MAAA;AAAA,EAEN,CAAC,GAEMH;AACT;AAGO,SAASK,GAAaH,GAAQ;AACnC,MAAIA,MAAM,MAAMA,MAAM,QAAQA,MAAM,OAAW;AAC/C,QAAMI,IAAI,OAAOJ,CAAC;AAClB,SAAO,OAAO,MAAMI,CAAC,IAAI,SAAYA;AACvC;ACtDA,SAASC,GAASC,GAA2B;AAC3C,SAAI,OAAOA,KAAM,YAAY,OAAO,SAASA,CAAC,IAAUA,IACpD,OAAOA,KAAM,YAAYA,EAAE,KAAA,MAAW,MAAM,CAAC,OAAO,MAAM,OAAOA,CAAC,CAAC,IAAU,OAAOA,CAAC,IAClF;AACT;AACA,SAASC,GAAOD,GAA2B;AACzC,MAAIA,aAAa,QAAQ,CAAC,OAAO,MAAMA,EAAE,SAAS,EAAG,QAAOA,EAAE,QAAA;AAC9D,MAAI,OAAOA,KAAM,UAAU;AACzB,UAAM,IAAI,KAAK,MAAMA,CAAC;AACtB,WAAO,OAAO,MAAM,CAAC,IAAI,OAAO;AAAA,EAClC;AACA,SAAO;AACT;AACA,SAASE,GAAIC,GAAYC,GAA2B;AAClD,QAAMC,IAAKN,GAASI,CAAC,GACnBG,IAAKP,GAASK,CAAC;AACjB,MAAIC,KAAM,QAAQC,KAAM,aAAaD,IAAKC;AAC1C,QAAMC,IAAKN,GAAOE,CAAC,GACjBK,IAAKP,GAAOG,CAAC;AACf,SAAIG,KAAM,QAAQC,KAAM,OAAaD,IAAKC,IACtCL,KAAK,QAAQC,KAAK,OAAa,OAC5B,OAAOD,CAAC,EAAE,cAAc,OAAOC,CAAC,CAAC;AAC1C;AACA,SAASK,GAASC,GAAmBC,GAA0B;AAC7D,SAAI,MAAM,QAAQD,CAAQ,IAAUA,EAAS,KAAK,CAAChB,MAAMA,MAAMiB,CAAM,IACjE,OAAOD,KAAa,WAAiBC,KAAU,QAAQD,EAAS,SAAS,OAAOC,CAAM,CAAC,IACpF;AACT;AACA,SAASC,GAAgBC,GAAiBC,GAAqDC,GAAoC;AACjI,UAAQD,GAAA;AAAA,IACN,KAAK;AACH,aAAOD,MAAWE;AAAA,IACpB,KAAK,YAAY;AACf,YAAMC,IAAId,GAAIW,GAAQE,CAAgB;AACtC,aAAOC,KAAK,QAAQA,IAAI;AAAA,IAC1B;AAAA,IACA,KAAK,eAAe;AAClB,YAAMA,IAAId,GAAIW,GAAQE,CAAgB;AACtC,aAAOC,KAAK,QAAQA,IAAI;AAAA,IAC1B;AAAA,IACA,KAAK;AACH,aAAOP,GAASI,GAAQE,CAAgB;AAAA,IAC1C,KAAK;AACH,aAAOF,KAAU,QAAQE,KAAoB,QAAQ,OAAOF,CAAM,EAAE,WAAW,OAAOE,CAAgB,CAAC;AAAA,IACzG,KAAK;AACH,aAAOF,KAAU,QAAQE,KAAoB,QAAQ,OAAOF,CAAM,EAAE,SAAS,OAAOE,CAAgB,CAAC;AAAA,IACvG;AACE,aAAO;AAAA,EAAA;AAEb;AAQA,SAASE,GAAMC,GAAcC,GAA0B;AAErD,SAAOA,EAAK,OAAO,CAACC,GAAUzB,MAAmCyB,IAAIzB,CAAG,GAAIuB,CAAU;AACxF;AACA,SAASG,EAAiCH,GAAQC,GAAiB3H,GAAmB;AACpF,MAAI2H,EAAK,WAAW,EAAG,QAAOD;AAC9B,QAAM,CAACI,GAAM,GAAGC,CAAI,IAAIJ;AAExB,MAAII,EAAK,WAAW,GAAG;AACrB,QAAI,OAAOD,KAAS,UAAU;AAG5B,YAAME,KADO,MAAM,QAAQN,CAAG,IAAKA,IAAgB,CAAA,GAClC,MAAA;AACjB,aAAAM,EAAIF,CAAI,IAAI9H,GACLgI;AAAA,IACT;AAEA,WAAO,EAAE,GAAIN,GAAa,CAACI,CAAI,GAAG9H,EAAA;AAAA,EACpC;AAGA,QAAMiI,IAAWP,IAAcI,CAAI,GAC7BI,IAAgB,OAAOH,EAAK,CAAC,KAAM,WAAY,MAAM,QAAQE,CAAO,IAAIA,IAAU,CAAA,IAAMA,KAAW,OAAOA,KAAY,WAAWA,IAAU,CAAA,GAG3IE,IAAON,EAAeK,GAAsBH,GAAM/H,CAAK;AAE7D,MAAI,OAAO8H,KAAS,UAAU;AAG5B,UAAME,KADO,MAAM,QAAQN,CAAG,IAAKA,IAAgB,CAAA,GAClC,MAAA;AACjB,WAAAM,EAAIF,CAAI,IAAIK,GACLH;AAAA,EACT;AAEA,SAAO,EAAE,GAAIN,GAAa,CAACI,CAAI,GAAGK,EAAA;AACpC;AAGA,SAASC,GAAWrC,GAAoBsC,GAA8BlC,GAAa;AACjF,SAAOsB,GAAM1B,GAAQ,CAAC,GAAIsC,KAAS,CAAA,GAAKlC,CAAG,CAAC;AAC9C;AAEA,SAASmC,GAAYvC,GAAoBsC,GAA8BlC,GAAaD,GAAwB;AAC1G,SAAO2B,EAAe9B,GAAQ,CAAC,GAAIsC,KAAS,IAAKlC,CAAG,GAAGD,CAAC;AAC1D;AAEA,MAAMqC,KAAe,WACfC,KAAW,CAACC,MAAc,GAAGA,CAAC,GAAGF,EAAY;AAMnD,SAASG,GAAa5C,GAAmC;AACvD,QAAM6C,IAAO,CAACC,GAAkBC,MAC9BD,EAAK,IAAI,CAACjD,GAAGmD,MAAO;AAClB,UAAMC,IAAaF,EAAU,SAASA,EAAU,KAAK,IAAI,IAAI,QACvDG,IAAWrD,EAAE,OAAkB,GAAGoD,CAAU,MAAMD,CAAE,IAAI,OAAOnD,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,KAAK,OAAO,IAGvHsD,KADoCtD,EAAE,gBAAgB,CAAA,GACpC,IAAI,CAAC6B,GAAG0B,MAAO;AACrC,YAAMC,IAAS3B,EAAE,uBACbmB,EAAKnB,EAAE,sBAA+C,CAAC,GAAGqB,GAAW,GAAGG,CAAO,MAAME,CAAE,EAAE,CAAC,IAC1F;AAEJ,aAAO,EAAE,GAAG1B,GAAG,sBAAsB2B,EAAA;AAAA,IACvC,CAAC;AAED,WAAO,EAAE,GAAGxD,GAAG,KAAKqD,GAAS,cAAcC,EAAA;AAAA,EAC7C,CAAC;AAEH,SAAON,EAAK7C,GAAW,EAAE;AAC3B;AAGA,SAASsD,EAAYlD,GAAoB;AACvC,SAAIA,KAAK,OAAa,KACf,OAAOA,KAAM,WAAWA,IAAI,OAAOA,CAAC;AAC7C;AAGA,SAASmD,GAAcnD,GAA6B;AAClD,SAAIA,KAAK,OAAa,KAClB,OAAOA,KAAM,YAAY,OAAO,SAASA,CAAC,KAC1C,OAAOA,KAAM,WAAiBA,IAC3B;AACT;AAGA,SAASoD,GAAcpD,GAA6B;AAClD,SAAIA,KAAK,OAAa,KAClB,OAAOA,KAAM,YAAY,OAAOA,KAAM,WAAiBA,IACpD,OAAOA,CAAC;AACjB;AAMO,SAASqD,GAAa;AAAA,EAC3B,WAAAzD;AAAA,EACA,eAAA0D;AAAA,EACA,kBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAC;AACF,GAMG;AACD,QAAMC,IAAiBC,GAAQ,MAAMnB,GAAa5C,CAAS,GAAG,CAACA,CAAS,CAAC,GAEnEgE,IAAkCD,GAAQ,MAAM;AACpD,UAAMjC,IAAkB,CAAA;AAExB,WAAI4B,KAAe,OAAO,OAAO5B,GAAK4B,CAAoB,GACnD5B;AAAA,EACT,GAAG,CAAC4B,CAAa,CAAC,GAEZ,CAACO,GAAcC,CAAe,IAAIxJ,EAAqBsJ,CAAmB;AAChF,EAAAlJ,EAAU,MAAM;AACd,IAAAoJ,EAAgBF,CAAmB;AAAA,EACrC,GAAG,CAACA,CAAmB,CAAC;AAGxB,QAAM,CAACG,GAAaC,CAAc,IAAI1J,EAAqB,CAAA,CAAE,GACvDuF,IAAqB8D;AAAA,IACzB,OAAO,EAAE,GAAGI,GAAa,GAAIR,KAAoBM,EAAA;AAAA,IACjD,CAACE,GAAaR,GAAkBM,CAAY;AAAA,EAAA;AAE9C,EAAAnJ,EAAU,MAAM;AACd,IAAI6I,OAAiC,CAACU,OAAO,EAAE,GAAGA,GAAG,GAAGV,EAAA,EAAmB;AAAA,EAC7E,GAAG,CAACA,CAAgB,CAAC;AAErB,QAAM,CAACzD,GAAQoE,CAAS,IAAI5J,EAA6C,CAAA,CAAE;AAG3E,WAAS6J,EAAU1E,GAAa2E,GAAuB;AACrD,UAAMnE,IAAMR,EAAE,KACRxG,IAAQwG,EAAE,UACVS,IAAMgC,GAAWrC,GAAQuE,GAAWnE,CAAG,GACvC9G,IAAQ2G,EAAOG,CAAG,GAElBoE,IAAM,CAACrE,MAAe;AAC1B,UAAIsE,IAAUlC,GAAYvC,GAAQuE,GAAWnE,GAAKD,CAAC;AAGnD,UAAIP,EAAE,cAAc,WAAWA,EAAE,cAAc;AAC7C,cAAM8E,IAAQ9E,EAAE,gBAAgB,CAAA;AAGhC,mBAAW+E,KAAQD,GAAO;AACxB,gBAAME,IAAevC,GAAWrC,GAAQuE,GAAWnE,CAAG,GAChDyE,IAAYxD,GAAgBuD,GAAcD,EAAK,iBAAiBA,EAAK,gBAAgB,GACrFG,IAAezD,GAAgBlB,GAAGwE,EAAK,iBAAiBA,EAAK,gBAAgB;AAGnF,cAAIE,KAAa,CAACC,KAAgBH,EAAK,mCAAmC;AACxE,kBAAMlL,IAAYkL,EAAK,wBAAwB,CAAA;AAC/C,gBAAIlL,EAAS,SAAS,GAAG;AACvB,oBAAMsL,IAAgBtC,GAASrC,CAAG;AAElC,cAAAqE,IAAU3C,EAAe2C,GAAS,CAAC,GAAIF,KAAa,IAAKQ,CAAa,GAAG,EAAE;AAG3E,oBAAMC,IAAoB,CAACC,GAA0BC,MAA4B;AAC/E,gBAAAD,EAAa,QAAQ,CAACE,MAAW;AAE/B,mBADmBA,EAAO,gBAAgB,CAAA,GAC/B,QAAQ,CAACC,MAAc;AAChC,wBAAIA,EAAU,mCAAmC;AAC/C,4BAAMC,KAAe5C,GAAS0C,EAAO,GAAa;AAClD,sBAAAV,IAAU3C,EAAe2C,GAAS,CAAC,GAAGS,GAAcG,EAAY,GAAG,EAAE;AAAA,oBACvE;AACA,0BAAMC,IAAiBF,EAAU,wBAAwB,CAAA;AACzD,oBAAIE,EAAc,SAAS,KACzBN,EAAkBM,GAAeJ,CAAY;AAAA,kBAEjD,CAAC;AAAA,gBACH,CAAC;AAAA,cACH;AAEA,cAAAF,EAAkBvL,GAAU,CAAC,GAAI8K,KAAa,CAAA,GAAKQ,CAAa,CAAC;AAAA,YACnE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAIrB,KAAoBC,IAAgBA,EAAec,CAAO,MACzCA,CAAO,GAC5BN,EAAeM,CAAO;AAAA,IACxB;AAEA,YAAQ7E,EAAE,WAAA;AAAA,MACR,KAAK;AACH,eACE,gBAAAjG;AAAA,UAACC;AAAA,UAAA;AAAA,YAEC,IAAIwG;AAAA,YACJ,OAAAhH;AAAA,YACA,OAAOiK,EAAYhD,CAAG;AAAA,YACtB,UAAU,CAACrF,MAAMwJ,EAAIxJ,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAe4E,EAAE,YAAY;AAAA,YAC7B,OAAAtG;AAAA,UAAA;AAAA,UANK8G;AAAA,QAAA;AAAA,MASX,KAAK;AACH,eACE,gBAAAzG;AAAA,UAACI;AAAA,UAAA;AAAA,YAEC,IAAIqG;AAAA,YACJ,OAAAhH;AAAA,YACA,OAAOiK,EAAYhD,CAAG;AAAA,YACtB,UAAU,CAACrF,MAAMwJ,EAAIxJ,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAe4E,EAAE,YAAY;AAAA,YAC7B,OAAAtG;AAAA,UAAA;AAAA,UANK8G;AAAA,QAAA;AAAA,MASX,KAAK;AACH,eACE,gBAAAzG;AAAA,UAACgC;AAAA,UAAA;AAAA,YAEC,IAAIyE;AAAA,YACJ,OAAAhH;AAAA,YACA,OAAOiK,EAAYhD,CAAG;AAAA,YACtB,UAAU,CAACrF,MAAMwJ,EAAIxJ,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAe4E,EAAE,YAAY;AAAA,YAC7B,OAAAtG;AAAA,UAAA;AAAA,UANK8G;AAAA,QAAA;AAAA,MASX,KAAK;AACH,eACE,gBAAA1G,EAAA6L,IAAA,EACE,UAAA;AAAA,UAAA,gBAAA5L;AAAA,YAACU;AAAA,YAAA;AAAA,cAEC,IAAI+F;AAAA,cACJ,OAAAhH;AAAA,cACA,OAAOiK,EAAYhD,CAAG;AAAA,cACtB,UAAU,CAACrF,MAAMwJ,EAAIxJ,EAAE,cAAc,KAAK;AAAA,cAC1C,iBAAe4E,EAAE,YAAY;AAAA,cAC7B,OAAAtG;AAAA,YAAA;AAAA,YANK8G;AAAA,UAAA;AAAA,UAQNA,MAAQ,WACP,gBAAA1G,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,YAAA,gBAAAC,EAAC,OAAE,UAAA,sHAAA,CAAmH;AAAA,YACtH,gBAAAA,EAAC,OAAE,UAAA,2DAAA,CAAwD;AAAA,8BAE1D,KAAA,EAAE,UAAA;AAAA,cAAA;AAAA,cACO;AAAA,cACR,gBAAAA,EAAC,KAAA,EAAE,MAAK,0BAAyB,QAAO,UAAS,KAAI,uBAAsB,WAAU,0BAAyB,UAAA,iBAAA,CAE9G;AAAA,cAAK;AAAA,cAAI;AAAA,cACL;AAAA,cACJ,gBAAAA,EAAC,KAAA,EAAE,MAAK,0BAAyB,QAAO,UAAS,KAAI,uBAAsB,WAAU,0BAAyB,UAAA,mBAAA,CAE9G;AAAA,cAAI;AAAA,YAAA,EAAA,CAEN;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,GAEJ;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAA;AAAA,UAAC+B;AAAA,UAAA;AAAA,YAEC,IAAI0E;AAAA,YACJ,OAAAhH;AAAA,YACA,OAAOiK,EAAYhD,CAAG;AAAA,YACtB,UAAU,CAACrF,MAAMwJ,EAAIxJ,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAe4E,EAAE,YAAY;AAAA,YAC7B,OAAAtG;AAAA,UAAA;AAAA,UANK8G;AAAA,QAAA;AAAA,MASX,KAAK;AACH,eACE,gBAAAzG;AAAA,UAACG;AAAA,UAAA;AAAA,YAEC,IAAIsG;AAAA,YACJ,OAAAhH;AAAA,YACA,OAAOkK,GAAcjD,CAAG;AAAA,YACxB,UAAU,CAACrF,MAAMwJ,EAAIlE,GAAatF,EAAE,cAAc,KAAK,CAAC;AAAA,YACxD,iBAAe4E,EAAE,YAAY;AAAA,YAC7B,OAAAtG;AAAA,UAAA;AAAA,UANK8G;AAAA,QAAA;AAAA,MASX,KAAK;AACH,eACE,gBAAAzG;AAAA,UAACiC;AAAA,UAAA;AAAA,YAEC,IAAIwE;AAAA,YACJ,OAAAhH;AAAA,YACA,OAAOiK,EAAYhD,CAAG;AAAA,YACtB,UAAU,CAACrF,MAAMwJ,EAAIxJ,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAe4E,EAAE,YAAY;AAAA,YAC7B,OAAAtG;AAAA,YACA,MAAM;AAAA,UAAA;AAAA,UAPD8G;AAAA,QAAA;AAAA,MAUX,KAAK;AACH,eACE,gBAAAzG;AAAA,UAACmC;AAAA,UAAA;AAAA,YAEC,IAAIsE;AAAA,YACJ,OAAAhH;AAAA,YACA,OAAOiK,EAAYhD,CAAG;AAAA,YACtB,UAAU,CAACrF,MAAMwJ,EAAIxJ,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAe4E,EAAE,YAAY;AAAA,YAC7B,OAAAtG;AAAA,UAAA;AAAA,UANK8G;AAAA,QAAA;AAAA,MAUX,KAAK,YAAY;AACf,YAAIR,EAAE,SAAS;AACb,gBAAMsC,IAAoB,MAAM,QAAQ7B,CAAG,IAAKA,IAAmB,CAAA;AACnE,iBACE,gBAAA3G,EAAC,OAAA,EAAc,WAAU,aACvB,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,cACZ,UAAA;AAAA,cAAAN;AAAA,cACAwG,EAAE,YAAY,gBAAAjG,EAAC,QAAA,EAAK,WAAU,qBAAoB,UAAA,IAAA,CAAC;AAAA,YAAA,GACtD;AAAA,YACA,gBAAAA,EAAC,SAAI,WAAU,yCACZ,YAAE,QAAQ,IAAI,CAACgD,MAAQ;AACtB,oBAAM6I,IAAQ,GAAGpF,CAAG,IAAIX,GAAQ9C,CAAG,CAAC,IAC9BT,IAAUgG,EAAQ,SAASvF,CAAG;AACpC,qBACE,gBAAAhD;AAAA,gBAACoC;AAAA,gBAAA;AAAA,kBAEC,IAAIyJ;AAAA,kBACJ,OAAO7I;AAAA,kBACP,SAAAT;AAAA,kBACA,UAAU,CAAClB,MAAM;AACf,0BAAMoH,IAAO,IAAI,IAAIF,CAAO;AAC5B,oBAAIlH,EAAE,cAAc,UAASoH,EAAK,IAAIzF,CAAG,IACpCyF,EAAK,OAAOzF,CAAG,GACpB6H,EAAI,MAAM,KAAKpC,CAAI,CAAC;AAAA,kBACtB;AAAA,kBACA,iBAAexC,EAAE,YAAY;AAAA,gBAAA;AAAA,gBAVxB4F;AAAA,cAAA;AAAA,YAaX,CAAC,EAAA,CACH;AAAA,YACClM,KAAS,gBAAAK,EAAC,KAAA,EAAE,WAAU,6BAA6B,UAAAL,EAAA,CAAM;AAAA,UAAA,EAAA,GA1BlD8G,CA2BV;AAAA,QAEJ;AACA,eACE,gBAAAzG;AAAA,UAACoC;AAAA,UAAA;AAAA,YAEC,IAAIqE;AAAA,YACJ,OAAOR,EAAE,WAAW,GAAGxG,CAAK,OAAOA;AAAA,YACnC,SAAS,CAAC,CAACiH;AAAA,YACX,UAAU,CAACrF,MAAMwJ,EAAIxJ,EAAE,cAAc,OAAO;AAAA,YAC5C,iBAAe4E,EAAE,YAAY;AAAA,UAAA;AAAA,UALxBQ;AAAA,QAAA;AAAA,MAQX;AAAA,MAEA,KAAK,SAAS;AACZ,cAAMqF,IAAO7F,EAAE,WAAW,CAAA,GAEpB8F,IAAanB,KAAaA,EAAU,SAAS,IAAI,GAAGnE,CAAG,KAAKmE,EAAU,KAAK,IAAI,CAAC,KAAKnE;AAC3F,iCACGjE,IAAA,EAAqB,QAAQ/C,GAAO,iBAAiBwG,EAAE,WAAW,oBAAoB,QACpF,UAAA6F,EAAK,IAAI,CAAC9I,MACT,gBAAAhD,EAACqC,IAAA,EAAqC,MAAM0J,GAAY,OAAO/I,GAAK,SAAS0D,MAAQ1D,GAAK,UAAU,MAAM6H,EAAI7H,CAAG,GAC9G,UAAAA,EAAA,GADS,GAAGyD,CAAG,IAAIX,GAAQ9C,CAAG,CAAC,EAElC,CACD,KALcyD,CAMjB;AAAA,MAEJ;AAAA,MAEA,KAAK,UAAU;AACb,YAAIqF,IAAO7F,EAAE,WAAW,CAAA;AAExB,eAAIQ,MAAQ,uBACVqF,IAAO/B,GAAkB,iBAAiB,IAAI,CAACvD,MAAuBA,EAAE,GAAG,KAAK,CAAA,IAGhF,gBAAAxG;AAAA,UAAC2C;AAAA,UAAA;AAAA,YAEC,IAAI8D;AAAA,YACJ,OAAAhH;AAAA,YACA,iBAAewG,EAAE,YAAY;AAAA,YAC7B,OAAAtG;AAAA,YACA,OAAOiK,GAAclD,CAAG;AAAA,YACxB,UAAU,CAACrF,MAAMwJ,EAAIxJ,EAAE,cAAc,KAAK;AAAA,YAC1C,aAAY;AAAA,YACZ,SAASyK,EAAK,IAAI,CAACE,OAAO,EAAE,OAAOA,GAAG,OAAOA,IAAI;AAAA,UAAA;AAAA,UAR5CvF;AAAA,QAAA;AAAA,MAWX;AAAA,MAEA,KAAK;AACH,eACE,gBAAAzG;AAAA,UAAC4D;AAAA,UAAA;AAAA,YAEC,IAAI6C;AAAA,YACJ,OAAAhH;AAAA,YACA,OAAOiK,EAAYhD,CAAG;AAAA,YACtB,UAAU,CAACuF,MAAYpB,EAAIoB,CAAO;AAAA,YAClC,iBAAehG,EAAE,YAAY;AAAA,YAC7B,OAAAtG;AAAA,UAAA;AAAA,UANK8G;AAAA,QAAA;AAAA,MAUX;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAEA,WAASyF,EAAgBhD,GAAkB0B,GAAuB;AAChE,WAAO1B,EAAK,IAAI,CAACjD,GAAGkG,MAAW;AAC7B,YAAM1F,IAAM,OAAOR,EAAE,GAAG,GAClBmG,IAAOzB,EAAU1E,GAAG2E,CAAS,GAE7BG,IAAQ9E,EAAE,gBAAgB,CAAA;AAChC,UAAI,CAAC8E,EAAM,OAAQ,QAAO,gBAAA/K,EAAC,OAAA,EAAmC,UAAAoM,EAAA,GAA1B,QAAQ3F,CAAG,IAAI0F,CAAM,EAAU;AAEnE,YAAM3F,IAAIkC,GAAWrC,GAAQuE,GAAWnE,CAAG,GACrC4F,IAAUtB,EAAM,OAAO,CAACjD,MAAMJ,GAAgBlB,GAAGsB,EAAE,iBAAiBA,EAAE,gBAAgB,CAAC,GACvFwE,IAAWD,EAAQ,SAAS,KAAK,CAACA,EAAQ,KAAK,CAAC,MAAM,EAAE,iCAAiC,IAAIA,EAAQ,MAAM,GAAG,CAAC,IAAIA;AAEzH,+BACG,OAAA,EACE,UAAA;AAAA,QAAAD;AAAA,QAEAE,EAAS,IAAI,CAACC,GAAQC,MAAO;AAC5B,gBAAM1M,IAAYyM,EAAO,wBAAwB,CAAA;AACjD,cAAI,CAACzM,EAAS,OAAQ,QAAO;AAG7B,cAAI,CAACyM,EAAO;AACV,mBACE,gBAAAvM,EAAC,OAAA,EAAgC,WAAU,QACxC,UAAAkM,EAAgBpM,GAAU8K,CAAS,EAAA,GAD5B,UAAUnE,CAAG,IAAI+F,CAAE,EAE7B;AAKJ,gBAAMpB,IAAgBtC,GAASrC,CAAG,GAC5B6B,IAAkBP,GAAM1B,GAAQ,CAAC,GAAIuE,KAAa,CAAA,GAAKQ,CAAa,CAAC,KAAmB,CAAA,GACxFqB,IAAQ,KAAK,IAAI,GAAGnE,EAAI,UAAU,CAAC,GAEnCoE,IAAY,MAAM;AACtB,kBAAMjE,IAAON,EAAe9B,GAAQ,CAAC,GAAIuE,KAAa,CAAA,GAAKQ,GAAe9C,EAAI,MAAM,GAAG,CAAA,CAAE;AACzF,YAAIyB,KAAoBC,IAAgBA,EAAevB,CAAI,MACtCA,CAAI,GACzB+B,EAAe/B,CAAI;AAAA,UACrB,GAEMkE,IAAU,MAAM;AACpB,kBAAMC,IAAUtE,EAAI,MAAM,GAAG,KAAK,IAAI,GAAGA,EAAI,SAAS,CAAC,CAAC,GAClDG,IAAON,EAAe9B,GAAQ,CAAC,GAAIuE,KAAa,CAAA,GAAKQ,CAAa,GAAGwB,CAAO;AAClF,YAAI7C,KAAoBC,IAAgBA,EAAevB,CAAI,MACtCA,CAAI,GACzB+B,EAAe/B,CAAI;AAAA,UACrB,GAEMoE,IAAc,GAAGpG,CAAG,MAAM+F,CAAE;AAElC,iBACE,gBAAAzM,EAAC,OAAA,EAAgC,WAAU,QACzC,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,cAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,2BAAuB;AAAA,cACvE,gBAAAD,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,gBAAA,gBAAAC,EAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS0M,GAAW,UAAA,cAAA,CAE5E;AAAA,gBACCD,IAAQ,KACP,gBAAAzM,EAAC,UAAA,EAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS2M,GAAS,UAAA,cAAA,CAE1E;AAAA,cAAA,EAAA,CAEJ;AAAA,YAAA,GACF;AAAA,YAEC,MAAM,KAAK,EAAE,QAAQF,EAAA,CAAO,EAAE,IAAI,CAACK,GAAG5G,MAAQ;AAC7C,oBAAM6G,IAAuB,CAAC,GAAInC,KAAa,CAAA,GAAKQ,GAAelF,CAAG,GAChE8G,IAAU,GAAGH,CAAW,MAAM3G,CAAG;AAEvC,qBACE,gBAAAnG,EAAC,OAAA,EAA6B,WAAU,8BACtC,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA;AAAA,kBAAA;AAAA,kBAAQmG,IAAM;AAAA,gBAAA,GAAE;AAAA,gBAE3DpG,EAAS,IAAI,CAAC0L,OACb,gBAAAzL,EAAC,OAAA,EAA6C,WAAU,QACrD,UAAA;AAAA,kBAAA4K,EAAUa,IAAQuB,CAAS;AAAA,mBAG1B,MAAM;AACN,0BAAME,KAAazB,GAAO,gBAAgB,CAAA;AAC1C,wBAAI,CAACyB,GAAW,OAAQ,QAAO;AAE/B,0BAAMC,KAAWxE,GAAWrC,GAAQ0G,GAAWvB,GAAO,GAAa,GAC7D2B,KAAeF,GAAW,OAAO,CAACnF,OAAMJ,GAAgBwF,IAAUpF,GAAE,iBAAiBA,GAAE,gBAAgB,CAAC;AAM9G,4BAJEqF,GAAa,SAAS,KAAK,CAACA,GAAa,KAAK,CAACC,OAAMA,GAAE,iCAAiC,IACpFD,GAAa,MAAM,GAAG,CAAC,IACvBA,IAEe,IAAI,CAACE,IAAIC,OAAQ;AACpC,4BAAM3B,KAAiB0B,GAAG,wBAAwB,CAAA;AAClD,0BAAI,CAAC1B,GAAc,OAAQ,QAAO;AAGlC,0BAAI,CAAC0B,GAAG;AACN,+BACE,gBAAArN,EAAC,OAAA,EAAqC,WAAU,QAC7C,UAAAkM,EAAgBP,IAAeoB,CAAS,EAAA,GADjC,UAAUC,CAAO,IAAIM,EAAG,EAElC;AAKJ,4BAAM5B,KAAe5C,GAAS0C,GAAO,GAAa,GAC5C+B,KAAwBxF,GAAM1B,GAAQ,CAAC,GAAG0G,GAAWrB,EAAY,CAAC,KAAmB,CAAA,GACrF8B,KAAc,KAAK,IAAI,GAAGD,GAAU,UAAU,CAAC,GAE/CE,KAAa,MAAM;AACvB,8BAAMhF,KAAON,EAAe9B,GAAQ,CAAC,GAAG0G,GAAWrB,IAAc6B,GAAU,MAAM,GAAG,EAAE;AACtF,wBAAIxD,KAAoBC,IAAgBA,EAAevB,EAAI,MACtCA,EAAI,GACzB+B,EAAe/B,EAAI;AAAA,sBACrB,GACMiF,KAAY,MAAM;AACtB,8BAAMd,KAAUW,GAAU,MAAM,GAAG,KAAK,IAAI,GAAGA,GAAU,SAAS,CAAC,CAAC,GAC9D9E,KAAON,EAAe9B,GAAQ,CAAC,GAAG0G,GAAWrB,EAAY,GAAGkB,EAAO;AACzE,wBAAI7C,KAAoBC,IAAgBA,EAAevB,EAAI,MACtCA,EAAI,GACzB+B,EAAe/B,EAAI;AAAA,sBACrB;AAEA,6BACE,gBAAA1I,EAAC,OAAA,EAA4C,WAAU,QACrD,UAAA;AAAA,wBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,0BAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,2BAAuB;AAAA,0BACvE,gBAAAD,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,4BAAA,gBAAAC,EAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,SAASyN,IAAY,UAAA,cAAA,CAE7E;AAAA,4BACCD,KAAc,KACb,gBAAAxN,EAAC,UAAA,EAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS0N,IAAW,UAAA,cAAA,CAE5E;AAAA,0BAAA,EAAA,CAEJ;AAAA,wBAAA,GACF;AAAA,wBAEC,MAAM,KAAK,EAAE,QAAQF,GAAA,CAAa,EAAE,IAAI,CAACG,IAAIC,OAAS;AACrD,gCAAMC,KAAyB,CAAC,GAAGd,GAAWrB,IAAckC,EAAI;AAChE,iCACE,gBAAA7N,EAAC,OAAA,EAAkD,WAAU,8BAC3D,UAAA;AAAA,4BAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA;AAAA,8BAAA;AAAA,8BAAQ6N,KAAO;AAAA,4BAAA,GAAE;AAAA,4BAC5D1B,EAAgBP,IAAekC,EAAW;AAAA,0BAAA,KAFnC,eAAeb,CAAO,IAAIM,EAAG,IAAIM,EAAI,EAG/C;AAAA,wBAEJ,CAAC;AAAA,sBAAA,EAAA,GAvBO,iBAAiBZ,CAAO,IAAIM,EAAG,EAwBzC;AAAA,oBAEJ,CAAC;AAAA,kBACH,GAAA;AAAA,gBAAG,KA3EK,GAAGN,CAAO,IAAI,OAAOxB,GAAO,GAAG,CAAC,EA4E1C,CACD;AAAA,cAAA,EAAA,GAjFO,SAASwB,CAAO,EAkF1B;AAAA,YAEJ,CAAC;AAAA,UAAA,EAAA,GAxGO,UAAUvG,CAAG,IAAI+F,CAAE,EAyG7B;AAAA,QAEJ,CAAC;AAAA,MAAA,EAAA,GAlJO,QAAQ/F,CAAG,IAAI0F,CAAM,EAmJ/B;AAAA,IAEJ,CAAC;AAAA,EACH;AAGA,QAAM2B,IAAc3D,GAAQ,MAAM;AAChC,UAAM4D,IAAkB,CAAA,GAClB9E,IAAO,CAACC,GAAkB0B,MAA0B;AACxD,MAAA1B,EAAK,QAAQ,CAACjD,MAAM;AAClB,QAAA8H,EAAI,KAAK9H,CAAC;AACV,cAAMQ,IAAM,OAAOR,EAAE,GAAG,GAClB8E,IAAQ9E,EAAE,gBAAgB,CAAA;AAChC,YAAI,CAAC8E,EAAM,OAAQ;AAEnB,cAAMvE,IAAIkC,GAAWrC,GAAQuE,GAAWnE,CAAG,GACrC4F,IAAUtB,EAAM,OAAO,CAACjD,MAAMJ,GAAgBlB,GAAGsB,EAAE,iBAAiBA,EAAE,gBAAgB,CAAC;AAG7F,SAFiBuE,EAAQ,SAAS,KAAK,CAACA,EAAQ,KAAK,CAAC,MAAM,EAAE,iCAAiC,IAAIA,EAAQ,MAAM,GAAG,CAAC,IAAIA,GAEhH,QAAQ,CAAC,MAAM;AACtB,gBAAMvM,IAAY,EAAE,wBAAwB,CAAA;AAC5C,UAAKA,EAAS,WACV,EAAE,qCACNmJ,EAAKnJ,GAAU8K,CAAS;AAAA,QAC1B,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,WAAA3B,EAAKiB,CAAc,GACZ6D;AAAA,EACT,GAAG,CAAC7D,GAAgB7D,CAAM,CAAC;AAE3B,WAAS2H,EAAa3M,GAAqC;AACzD,IAAAA,EAAE,eAAA;AACF,UAAM4M,IAAO9H,GAAkB2H,GAA2BzH,CAAM;AAGhE,QAFAqE,EAAUuD,CAAI,GAEV,OAAO,KAAKA,CAAI,EAAE,SAAS,GAAG;AAChC,YAAMC,IAAWJ,EAAY,UAAU,CAAC7H,MAAMgI,EAAKhI,EAAE,GAAa,CAAC;AACnE,MAAIiI,KAAY,KAAG,SAAS,eAAeJ,EAAYI,CAAQ,EAAE,GAAa,GAAG,MAAA;AACjF;AAAA,IACF;AACA,IAAAjE,EAAS5D,CAAM;AAAA,EACjB;AAEA,SACE,gBAAArG,EAAC,QAAA,EAAK,WAAU,kBAAiB,UAAUgO,GAAc,YAAU,IAChE,UAAA9B,EAAgBhC,CAAc,EAAA,CACjC;AAEJ;AC/rBO,MAAMiE,KAAmB;AAQhC,SAASC,KAA0C;AACjD,SAAI,OAAO,SAAW,MAAoB,CAAA,KAC1C,OAAO,YAAY,OAAO,aAAa,CAAA,GAChC,OAAO;AAChB;AAEO,SAASC,GAAmBC,GAAmBC,IAAmC,IAAU;AAEjG,EADkBH,GAAA,EACR,KAAK;AAAA,IACb,OAAOE;AAAA,IACP,eAAe;AAAA,MACb,GAAGC;AAAA,MACH,aAAaJ;AAAA,IAAA;AAAA,EACf,CACD;AACH;AAGO,SAASK,KAAyB;AACvC,EAAAH,GAAmB,uBAAuB;AAC5C;AAGO,SAASI,KAAyB;AACvC,EAAAJ,GAAmB,uBAAuB;AAC5C;AAGO,SAASK,GAAgBH,GAAgG;AAC9H,EAAAF,GAAmB,+BAA+BE,CAAO;AAC3D;AAGO,SAASI,GAAmBJ,GAAgG;AACjI,EAAAF,GAAmB,kCAAkCE,CAAO;AAC9D;AAGO,SAASK,KAA0B;AACxC,EAAAP,GAAmB,+BAA+B;AACpD;AAGO,SAASQ,GAAgBN,GAAwC;AACtE,EAAAF,GAAmB,+BAA+BE,KAAW,EAAE;AACjE;AAGO,SAASO,KAAsB;AACpC,EAAAT,GAAmB,2BAA2B;AAChD;ACnDA,SAASxH,GAASC,GAA2B;AAC3C,SAAI,OAAOA,KAAM,YAAY,OAAO,SAASA,CAAC,IAAUA,IACpD,OAAOA,KAAM,YAAYA,EAAE,KAAA,MAAW,MAAM,CAAC,OAAO,MAAM,OAAOA,CAAC,CAAC,IAAU,OAAOA,CAAC,IAClF;AACT;AACA,SAASC,GAAOD,GAA2B;AACzC,MAAIA,aAAa,QAAQ,CAAC,OAAO,MAAMA,EAAE,SAAS,EAAG,QAAOA,EAAE,QAAA;AAC9D,MAAI,OAAOA,KAAM,UAAU;AACzB,UAAM,IAAI,KAAK,MAAMA,CAAC;AACtB,WAAO,OAAO,MAAM,CAAC,IAAI,OAAO;AAAA,EAClC;AACA,SAAO;AACT;AACA,SAASE,GAAIC,GAAYC,GAA2B;AAClD,QAAMC,IAAKN,GAASI,CAAC,GACnBG,IAAKP,GAASK,CAAC;AACjB,MAAIC,KAAM,QAAQC,KAAM,aAAaD,IAAKC;AAC1C,QAAMC,IAAKN,GAAOE,CAAC,GACjBK,IAAKP,GAAOG,CAAC;AACf,SAAIG,KAAM,QAAQC,KAAM,OAAaD,IAAKC,IACtCL,KAAK,QAAQC,KAAK,OAAa,OAC5B,OAAOD,CAAC,EAAE,cAAc,OAAOC,CAAC,CAAC;AAC1C;AACA,SAASK,GAASC,GAAmBC,GAA0B;AAC7D,SAAI,MAAM,QAAQD,CAAQ,IAAUA,EAAS,KAAK,CAAChB,MAAMA,MAAMiB,CAAM,IACjE,OAAOD,KAAa,WAAiBC,KAAU,QAAQD,EAAS,SAAS,OAAOC,CAAM,CAAC,IACpF;AACT;AACA,SAASC,GAAgBlB,GAAYuI,GAA0CC,GAAuB;AACpG,UAAQD,GAAA;AAAA,IACN,KAAK;AACH,aAAOvI,MAAMwI;AAAA,IACf,KAAK,YAAY;AACf,YAAMlH,IAAId,GAAIR,GAAGwI,CAAG;AACpB,aAAOlH,KAAK,QAAQA,IAAI;AAAA,IAC1B;AAAA,IACA,KAAK,eAAe;AAClB,YAAMA,IAAId,GAAIR,GAAGwI,CAAG;AACpB,aAAOlH,KAAK,QAAQA,IAAI;AAAA,IAC1B;AAAA,IACA,KAAK;AACH,aAAOP,GAASf,GAAGwI,CAAG;AAAA,IACxB,KAAK;AACH,aAAOxI,KAAK,QAAQwI,KAAO,QAAQ,OAAOxI,CAAC,EAAE,WAAW,OAAOwI,CAAG,CAAC;AAAA,IACrE,KAAK;AACH,aAAOxI,KAAK,QAAQwI,KAAO,QAAQ,OAAOxI,CAAC,EAAE,SAAS,OAAOwI,CAAG,CAAC;AAAA,IACnE;AACE,aAAO;AAAA,EAAA;AAEb;AAGA,SAASC,GAAwBC,GAA+B7I,GAA6C;AAC3G,QAAM0H,IAAkB,CAAA;AAoBxB,UAnBa,CAAC7E,MAAkC;AAC9C,IAAAA,EAAK,QAAQ,CAACjD,MAAM;AAClB,MAAA8H,EAAI,KAAK9H,CAAC;AACV,YAAMQ,IAAM,OAAOR,EAAE,GAAG,GAClBO,IAAIH,EAAOI,CAAG,GACdsE,IAAQ9E,EAAE,gBAAgB,CAAA;AAChC,UAAI,CAAC8E,EAAM,OAAQ;AAEnB,YAAMsB,IAAUtB,EAAM,OAAO,CAACjD,MAAMJ,GAAgBlB,GAAGsB,EAAE,iBAAiBA,EAAE,gBAAgB,CAAC;AAG7F,OAFiBuE,EAAQ,SAAS,KAAK,CAACA,EAAQ,KAAK,CAACe,MAAMA,EAAE,iCAAiC,IAAIf,EAAQ,MAAM,GAAG,CAAC,IAAIA,GAEhH,QAAQ,CAACe,MAAM;AACtB,cAAMtN,IAAYsN,EAAE,wBAAwB,CAAA;AAC5C,QAAKtN,EAAS,WACVsN,EAAE,qCACNtN,EAAS,QAAQ,CAACqP,MAAUpB,EAAI,KAAKoB,CAAK,CAAC;AAAA,MAC7C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,GACKD,CAAI,GACFnB;AACT;AAGA,MAAMlF,KAAe,WACfC,KAAW,CAACC,MAAc,GAAGA,CAAC,GAAGF,EAAY;AAEnD,SAASuG,GAA6BhJ,GAAoCiJ,GAAoC;AAE5G,aAAWpJ,KAAKG,GAAW;AACzB,UAAMkJ,IAAO,OAAOrJ,EAAE,GAAG,GACnBsJ,IAAOF,EAAcC,CAAI,GACzBvE,IAAQ9E,EAAE,gBAAgB,CAAA;AAChC,QAAI,CAAC8E,EAAM,OAAQ;AAEnB,UAAMsB,IAAUtB,EAAM,OAAO,CAACjD,MAAMJ,GAAgB6H,GAAMzH,EAAE,iBAAiBA,EAAE,gBAAgB,CAAC,GAC1FwE,IAAWD,EAAQ,SAAS,KAAK,CAACA,EAAQ,KAAK,CAACe,MAAMA,EAAE,iCAAiC,IAAIf,EAAQ,MAAM,GAAG,CAAC,IAAIA;AAEzH,eAAWnF,KAAKoF,GAAU;AACxB,YAAMxM,IAAYoH,EAAE,wBAAwB,CAAA;AAC5C,UAAI,CAACpH,EAAS,OAAQ;AAEtB,UAAI,CAACoH,EAAE,mCAAmC;AAExC,YAAIkI,GAA6BtP,GAAUuP,CAAa,EAAG,QAAO;AAClE;AAAA,MACF;AAGA,YAAM/G,IAAO+G,EAAcvG,GAASwG,CAAI,CAAC,KAAmB,CAAA;AAC5D,UAAIhH,EAAI,WAAW,EAAG,QAAO;AAE7B,iBAAWkH,KAAQlH,GAAuC;AAExD,cAAMmH,IAAatJ,GAAkBrG,GAAU0P,CAAkB;AAIjE,YAHI,OAAO,OAAOC,CAAU,EAAE,KAAK,OAAO,KAGtCL,GAA6BtP,GAAU0P,CAAkB,EAAG,QAAO;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAASE,GAA4BtJ,GAAoCuJ,GAAiC;AACxG,SAAOP,GAA6BhJ,GAAWuJ,CAAU;AAC3D;AAKO,SAASC,GAAW;AAAA,EACzB,QAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,eAAAjG;AAAA,EACA,eAAAkG;AACF,GAMG;AACD,QAAM,CAACC,GAAQC,CAAS,IAAIpP,EAASkP,KAAiB,CAAC,GACjD,CAACG,GAAWC,CAAY,IAAItP,EAAqBgJ,KAAiB,CAAA,CAAE,GACpE,CAACuG,GAAmBC,CAAoB,IAAIxP,EAAqC,CAAA,CAAE,GACnF,CAACyP,GAASC,CAAU,IAAI1P,EAAS,EAAK,GACtC,CAAC2P,GAAcC,CAAe,IAAI5P,EAAS,EAAK,GAChD,CAAC6P,GAAYC,CAAa,IAAI9P,EAAwB,IAAI,GAC1D+P,IAAW7P,EAAiC,EAAE,GAE9C8P,IAAY,MAAM,QAAQjB,CAAM,KAAKA,EAAO,SAAS,GACrDkB,IAAQD,IAAYjB,EAAO,KAAK,IAAII,GAAQJ,EAAO,SAAS,CAAC,CAAC,IAAI,MAClEmB,IAAWD,GAAO,OAAO;AAG/B,EAAA7P,EAAU,MAAM;AACd,IAAI8O,MAAkB,UACpBE,EAAUF,CAAa;AAAA,EAE3B,GAAG,CAACA,CAAa,CAAC,GAGlB9O,EAAU,MAAM;AACd,UAAM+P,IAAgBJ,EAAS,QAAQZ,CAAM;AAC7C,IAAIgB,KACFA,EAAc,eAAe,EAAE,UAAU,UAAU,OAAO,WAAW,QAAQ,UAAU;AAAA,EAE3F,GAAG,CAAChB,CAAM,CAAC,GAIX/O,EAAU,MAAM;AACd,IAAI4I,MAAkB,UACpBsG,EAAatG,CAAa;AAAA,EAE9B,GAAG,CAACA,CAAa,CAAC,GAElB5I,EAAU,MAAM;AACd,QAAI,CAAC6P,KAAS,CAACC,GAAU;AACvB,MAAAR,EAAW,EAAK,GAChBI,EAAc,IAAI;AAClB;AAAA,IACF;AACA,QAAIP,EAAkBW,CAAQ,GAAG;AAC/B,MAAAR,EAAW,EAAK,GAChBI,EAAc,IAAI;AAClB;AAAA,IACF;AAEA,QAAIM,IAAY;AAChB,WAAAV,EAAW,EAAI,GACfI,EAAc,IAAI,GAElB,QAAQ,QAAQG,EAAM,cAAA,CAAe,EAClC,KAAK,CAACI,MAAO;AACZ,UAAI,CAAAD,GACJ;AAAA,YAAI,CAAC,MAAM,QAAQC,CAAE,SAAS,IAAI,MAAM,kBAAkBH,CAAQ,4BAA4B;AAC9F,QAAAV,EAAqB,CAAClD,OAAO,EAAE,GAAGA,GAAG,CAAC4D,CAAQ,GAAGG,EAAA,EAAK;AAAA;AAAA,IACxD,CAAC,EAEA,MAAM,CAACpM,MAAa;AACnB,MAAImM,KACJN,EAAc,yBAAyBG,GAAO,SAAS,EAAE,MAAMhM,GAAK,WAAW,eAAe,EAAE;AAAA,IAClG,CAAC,EACA,QAAQ,MAAM;AACb,MAAKmM,KAAWV,EAAW,EAAK;AAAA,IAClC,CAAC,GAEI,MAAM;AACX,MAAAU,IAAY;AAAA,IACd;AAAA,EACF,GAAG,CAACH,GAAOC,GAAUX,CAAiB,CAAC;AAEvC,QAAMjK,IAAY4K,IAAWX,EAAkBW,CAAQ,IAAI;AAG3D,EAAA9P,EAAU,MAAM;AACd,IAAI6P,KAASC,KAAY5K,KACvBsI,GAAgB;AAAA,MACd,UAAAsC;AAAA,MACA,YAAYD,EAAM,SAASC;AAAA,MAC3B,WAAWf,IAAS;AAAA,MACpB,YAAYJ,EAAO;AAAA,IAAA,CACpB;AAAA,EAEL,GAAG,CAACmB,GAAUf,GAAQJ,EAAO,QAAQkB,GAAO3K,CAAS,CAAC;AAGtD,QAAMgL,IAAgBjH,GAAQ,MAAM;AAClC,QAAI,CAAC/D,EAAW,QAAO,CAAA;AACvB,UAAMiL,IAAoB,CAAA;AA8B1B,KA3B+B,CAAC/F,MAAuC;AACrE,YAAMgG,IAAiB,CAAA,GACjBrI,IAAO,CAACC,MAAqB;AACjC,QAAAA,EAAK,QAAQ,CAACjD,GAAGsL,MAAM;AACrB,gBAAMxI,IAAI/C,GAAUC,GAAGsL,CAAC;AACxB,UAAAD,EAAK,KAAKvI,CAAC;AACX,gBAAMyI,IAAS1I,GAASC,CAAC;AACzB,UAAAuI,EAAK,KAAKE,CAAM,IAGFvL,EAAE,gBAAgB,CAAA,GAC1B,QAAQ,CAAC6B,MAAM;AACnB,kBAAMhI,IAAYgI,EAAE,wBAAwB,CAAA;AAC5C,YAAIhI,EAAS,SAAS,KACpBmJ,EAAKnJ,CAAQ;AAAA,UAEjB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AACA,aAAAmJ,EAAKqC,CAAY,GACVgG;AAAA,IACT,GAG+ClL,CAAS,EAGxC,QAAQ,CAAC2C,MAAM;AAC7B,MAAIA,KAAKoH,MAAWkB,EAAMtI,CAAC,IAAIoH,EAAUpH,CAAC;AAAA,IAC5C,CAAC;AAED,eAAW,CAACA,GAAGvC,CAAC,KAAK,OAAO,QAAQ2J,CAAS;AAC3C,MAAIpH,EAAE,SAASF,EAAY,KAAK,EAAEE,KAAKsI,OAAQA,EAAMtI,CAAC,IAAIvC;AAE5D,WAAO6K;AAAA,EACT,GAAG,CAACjL,GAAW+J,CAAS,CAAC,GAEnBsB,IAAsB,CAAChJ,MAAqB;AAChD,IAAA2H,EAAa,CAAC/K,OAAU,EAAE,GAAGA,GAAM,GAAGoD,IAAO;AAAA,EAC/C,GAEMiJ,IAAS,MAAM;AACnB,IAAAxB,EAAU,CAACqB,MAAOA,IAAI,IAAIA,IAAI,IAAI,CAAE,GACpC,SAAS,cAA2B,aAAa,GAAG,SAAS,EAAE,KAAK,GAAG,UAAU,WAA6B;AAAA,EAChH,GAEMI,IAAS,YAAY;AACzB,QAAI,CAACvL,KAAa,CAAC2K,KAASR,KAAWI,KAAcF,EAAc;AAGnE,UAAMmB,IAAU3C,GAAwB7I,GAAW+J,CAAS,GACtD0B,IAAa1L,GAAkByL,GAAuBzB,CAAS,GAC/D2B,IAAY,OAAO,OAAOD,CAAU,EAAE,KAAK,OAAO,GAGlDE,IAAcrC,GAA4BtJ,GAAW+J,CAAS;AAEpE,QAAI,EAAA2B,KAAaC,IAEjB;AAAA,MAAArB,EAAgB,EAAI;AACpB,UAAI;AACF,cAAMsB,IAAY,KAAK,IAAI/B,IAAS,GAAGJ,EAAO,SAAS,CAAC,GAClDoC,IAAahC,KAAUJ,EAAO,SAAS,GACvC,EAAE,SAAAqC,GAAS,OAAAvS,EAAA,IAAUsS,IAAa,MAAMlC,EAAWI,GAAWa,KAAY,EAAE,IAAI,MAAMlB,EAAgBsB,GAAeJ,KAAY,EAAE;AACzI,YAAI,CAACkB,GAAS;AACZ,UAAAtB,EAAcjR,KAAS,mBAAmB;AAC1C;AAAA,QACF;AACA,QAAKsS,KAAY/B,EAAU8B,CAAS;AAAA,MACtC,UAAA;AACE,QAAAtB,EAAgB,EAAK;AAAA,MACvB;AAAA;AAAA,EACF,GAGMyB,IAAchI,GAAQ,MAAM;AAChC,QAAI,CAAC/D,KAAamK,KAAaI,KAAcF,EAAc,QAAO;AAClE,UAAMmB,IAAU3C,GAAwB7I,GAAW+J,CAAS,GACtD0B,IAAa1L,GAAkByL,GAAuBzB,CAAS,GAC/D2B,IAAY,OAAO,OAAOD,CAAU,EAAE,KAAK,OAAO,GAClDE,IAAcrC,GAA4BtJ,GAAW+J,CAAS;AACpE,WAAO2B,KAAaC;AAAA,EACtB,GAAG,CAAC3L,GAAW+J,GAAWI,GAASI,GAAYF,CAAY,CAAC;AAE5D,SAAKK,IAGH,gBAAA/Q,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oEACb,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,gBAAgB,QAAQ,iBAAiB,OAAA;AAAA,UAEjD,UAAA6P,EAAO,QAAQ,CAAC9J,GAAGwL,MAAM;AAAA,YACxB,gBAAAvR;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,KAAK,CAACoS,MAAO;AACX,kBAAAvB,EAAS,QAAQU,CAAC,IAAIa;AAAA,gBACxB;AAAA,gBACA,WAAW,yFACTb,IAAItB,IACA,2CACAsB,MAAMtB,IACJ,2CACA,iCACR;AAAA,gBAEC,UAAAlK,EAAE;AAAA,cAAA;AAAA,cAZEA,EAAE,OAAO,SAASwL,CAAC;AAAA,YAAA;AAAA,YAc1B,GAAIA,IAAI1B,EAAO,SAAS,IACpB;AAAA,cACE,gBAAA7P,EAAC,QAA+B,WAAU,uDAAsD,iBAAvF,SAAS+F,EAAE,OAAOwL,CAAC,EAE5B;AAAA,YAAA,IAEF,CAAA;AAAA,UAAC,CACN;AAAA,QAAA;AAAA,MAAA;AAAA,MAEH,gBAAAxR,EAAC,OAAA,EAAI,WAAU,iEACZ,UAAA;AAAA,QAAA,KAAK,IAAIkQ,IAAS,GAAGJ,EAAO,MAAM;AAAA,QAAE;AAAA,QAAIA,EAAO;AAAA,MAAA,EAAA,CAClD;AAAA,IAAA,GACF;AAAA,sBAGC,OAAA,EACE,UAAA;AAAA,MAAAU,KAAW,gBAAAvQ,EAAC,OAAA,EAAI,WAAU,kBAAiB,UAAA,YAAQ;AAAA,MAEnD+Q,KACC,gBAAA/Q;AAAA,QAAC6J;AAAA,QAAA;AAAA,UAEC,WAAWzD,KAAa,CAAA;AAAA,UACxB,kBAAkBgL;AAAA,UAClB,gBAAgBK;AAAA,UAChB,UAAU,MAAME,EAAA;AAAA,QAAO;AAAA,QAJlBZ,EAAM;AAAA,MAAA;AAAA,IAKb,GAEJ;AAAA,IAGC,CAACR,KAAWI,KACX,gBAAA5Q,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAK,UAAA2Q,EAAA,CAAW;AAAA,MAChBI,KACC,gBAAA/Q;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,YAAAsQ,EAAqB,CAAClD,MAAM;AAC1B,kBAAI,CAAC4D,EAAU,QAAO5D;AACtB,oBAAMiF,IAAO,EAAE,GAAGjF,EAAA;AAClB,4BAAOiF,EAAKrB,CAAQ,GACbqB;AAAA,YACT,CAAC;AAAA,UACH;AAAA,UACD,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,GAEJ;AAAA,sBAID,OAAA,EAAI,WAAWpC,IAAS,IAAI,2BAA2B,IACrD,UAAA;AAAA,MAAAA,IAAS,KACR,gBAAAjQ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS0R;AAAA,UACT,UAAUnB;AAAA,UACV,WAAU;AAAA,UACX,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAKH,gBAAAxQ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,oBAAiB;AAAA,UACjB,SAAS4R;AAAA,UACT,UAAUQ;AAAA,UACV,WAAW;AAAA,YACT;AAAA,YACAlC,IAAS,IAAI,KAAK;AAAA,YAClB;AAAA,YACA;AAAA,YACA;AAAA,YACAkC,IACI,gBACA;AAAA,UAAA,EACJ,KAAK,GAAG;AAAA,UAET,UAAA;AAAA,YAAA1B,KACC,gBAAA1Q,EAAC,SAAI,WAAU,mCAAkC,OAAM,8BAA6B,MAAK,QAAO,SAAQ,aACtG,UAAA;AAAA,cAAA,gBAAAC,EAAC,UAAA,EAAO,WAAU,cAAa,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,gBAAe,aAAY,KAAI;AAAA,cAC5F,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,GAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH,GACH;AAAA,YAEDiQ,MAAWJ,EAAO,SAAS,IAAI,WAAW;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7C,EAAA,CACF;AAAA,EAAA,GACF,sBAxHsB,OAAA,EAAI,WAAU,kBAAiB,UAAA,cAAU;AA0HnE;ACjcA,MAAMyC,KAAe,oBACfC,KAAiB;AAKhB,SAASC,GAAYC,GAAuB;AACjD,MAAI;AACF,iBAAa,QAAQH,IAAcG,CAAO;AAAA,EAC5C,SAAS9S,GAAO;AACd,YAAQ,MAAM,2CAA2CA,CAAK;AAAA,EAChE;AACF;AAKO,SAAS+S,KAA6B;AAC3C,MAAI;AACF,WAAO,aAAa,QAAQJ,EAAY;AAAA,EAC1C,SAAS3S,GAAO;AACd,mBAAQ,MAAM,6CAA6CA,CAAK,GACzD;AAAA,EACT;AACF;AAKO,SAASgT,KAAqB;AACnC,MAAI;AACF,iBAAa,WAAWL,EAAY;AAAA,EACtC,SAAS3S,GAAO;AACd,YAAQ,MAAM,8CAA8CA,CAAK;AAAA,EACnE;AACF;AAKO,SAASiT,GAAcC,GAAqB;AACjD,MAAI;AACF,iBAAa,QAAQN,IAAgBM,CAAK;AAAA,EAC5C,SAASlT,GAAO;AACd,YAAQ,MAAM,6CAA6CA,CAAK;AAAA,EAClE;AACF;AAKO,SAASmT,KAA+B;AAC7C,MAAI;AACF,WAAO,aAAa,QAAQP,EAAc;AAAA,EAC5C,SAAS5S,GAAO;AACd,mBAAQ,MAAM,+CAA+CA,CAAK,GAC3D;AAAA,EACT;AACF;AAKO,SAASoT,KAAuB;AACrC,MAAI;AACF,iBAAa,WAAWR,EAAc;AAAA,EACxC,SAAS5S,GAAO;AACd,YAAQ,MAAM,gDAAgDA,CAAK;AAAA,EACrE;AACF;AAKO,SAASqT,KAA0B;AACxC,EAAAL,GAAA,GACAI,GAAA;AACF;ACxEA,MAAME,IAAW;AAGjB,IAAIC,KAA2B;AAExB,SAASC,GAAaN,GAAqB;AAChD,EAAAK,KAAYL,GACZD,GAAcC,CAAK;AACrB;AAEO,SAASO,KAA8B;AAC5C,SAAOF;AACT;AAEO,SAASG,KAAiC;AAC/C,QAAMC,IAAcR,GAAA;AACpB,EAAIQ,MACFJ,KAAYI;AAEhB;AAEO,SAASP,KAAuB;AACrC,EAAAG,KAAY,MACZK,GAAA;AACF;AAEA,eAAeC,EAAyBC,GAAaC,GAAiC;AACpF,QAAMC,IAAuB;AAAA,IAC3B,gBAAgB;AAAA,EAAA;AAGlB,EAAIT,OACFS,EAAQ,gBAAmB,UAAUT,EAAS;AAGhD,QAAMU,IAAW,MAAM,MAAMH,GAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAAE;AAAA,IACA,MAAM,KAAK,UAAUD,CAAI;AAAA,EAAA,CAC1B;AAED,MAAI,CAACE,EAAS,IAAI;AAChB,QAAIC,IAAe,8BAA8BD,EAAS,MAAM;AAChE,QAAI;AAEF,MAAAC,KADkB,MAAMD,EAAS,KAAA,GACR,SAASC;AAAA,IACpC,QAAQ;AAEN,MAAAA,IAAeD,EAAS,cAAcC;AAAA,IACxC;AACA,UAAMlU,IAAQ,IAAI,MAAMkU,CAAY;AACpC,UAAAlU,EAAM,aAAaiU,EAAS,QACtBjU;AAAA,EACR;AAEA,SAAOiU;AACT;AAEA,eAAsBE,GAAoB/C,GAAkD;AAG1F,SADa,OADI,MAAMyC,EAAyB,GAAGP,CAAQ,2BAA2B,EAAE,OAAAlC,GAAO,GACnE,KAAA;AAE9B;AAEA,eAAsBgD,KAAkD;AAGtE,SADa,OADI,MAAMP,EAAyB,GAAGP,CAAQ,yBAAyB,EAAE,GAC1D,KAAA;AAE9B;AAEA,eAAsBe,GAAYC,GAA6C;AAE7E,QAAMC,IAAO,OADI,MAAMV,EAAyB,GAAGP,CAAQ,iBAAiB,EAAE,OAAAgB,GAAO,GACzD,KAAA;AAC5B,MAAI,CAACC,KAAQ,OAAOA,KAAS,YAAY,CAACA,EAAK;AAC7C,UAAM,IAAI,MAAM,iCAAiC,KAAK,UAAUA,CAAI,CAAC,EAAE;AAEzE,SAAOA;AACT;AAGA,eAAsBC,GAAY5F,GAAkD6F,GAAmB3B,GAA+B;AAGpI,QAAMiB,IAAkG,EAAE,SAAAnF,GAAS,UAAA6F,EAAAA;AACnH,SAAI3B,KAAW,OAAOA,KAAY,YAAYA,EAAQ,KAAA,MAAW,OAC/DiB,EAAK,UAAUjB,IAGJ,OADI,MAAMe,EAAyB,GAAGP,CAAQ,iBAAiBS,CAAI,GACpD,KAAA;AAE9B;AAEA,eAAsBW,GAAY5B,GAAiB6B,GAAyE;AAG1H,SADa,OADI,MAAMd,EAAyB,GAAGP,CAAQ,iBAAiB,EAAE,SAAAR,GAAS,SAAA6B,GAAS,GACpE,KAAA;AAE9B;AAEA,eAAsBC,GAAiBC,GAAkD;AAGvF,SADa,OADI,MAAMhB,EAAyB,GAAGP,CAAQ,uBAAuB,EAAE,OAAAuB,GAAO,GAC/D,KAAA;AAE9B;AAEA,eAAsBJ,KAAiD;AAGrE,SADa,OADI,MAAMZ,EAAyB,GAAGP,CAAQ,cAAc,EAAE,GAC/C,KAAA;AAE9B;AAEA,eAAsBwB,GAAShC,GAA6C;AAE1E,QAAMiB,IAAOjB,IAAU,EAAE,SAAAA,EAAA,IAAY,CAAA;AAGrC,SADa,OADI,MAAMe,EAAyB,GAAGP,CAAQ,cAAcS,CAAI,GACjD,KAAA;AAE9B;AAEA,eAAsBgB,GAAYC,GAAqD;AAErF,QAAMT,IAAO,OADI,MAAMV,EAAyB,GAAGP,CAAQ,iBAAiB,EAAE,aAAA0B,GAAa,GAC/D,KAAA;AAE5B,SAAOT,KAAQ,OAAOA,KAAS,YAAY,aAAaA,IAAOA,IAAO,EAAE,SAAS,GAAA;AACnF;ACxHA,MAAMU,KAAoB,IAAI,KAAK,aAAa,SAAS;AAAA,EACvD,OAAO;AAAA,EACP,UAAU;AACZ,CAAC;AAID,SAASC,GAAW,EAAE,QAAAC,KAAmC;AAKvD,SACE,gBAAA9U;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAPe,MAAM;AACvB,QAAA8O,GAAA,GACAgG,IAAA;AAAA,MACF;AAAA,MAKI,WAAU;AAAA,MACX,UAAA;AAAA,IAAA;AAAA,EAAA;AAIL;AAEO,SAASC,GAAM,EAAE,OAAAC,GAAO,QAAAF,KAA4D;AACzF,QAAMG,IAAW,MAAM,QAAQD,CAAK,KAAKA,EAAM,SAAS,GAClD,CAACE,GAAiBC,CAAkB,IAAIrU,EAAwC,CAAA,CAAE;AAOxF,SAJAI,EAAU,MAAM;AACd,IAAAmS,GAAA;AAAA,EACF,GAAG,CAAA,CAAE,GAEA4B,IAWH,gBAAAlV,EAAC,WAAA,EAAQ,WAAU,QACjB,UAAA;AAAA,IAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,wCAAuC,UAAA,SAAK;AAAA,sBACzD,OAAA,EAAI,WAAU,iDACZ,UAAAgV,EAAM,IAAI,CAACI,MAAS;AACnB,YAAMC,IAAiBD,EAAK,gBAAgB,KACtCE,IAAmBV,GAAkB,OAAOS,CAAc,GAC1DE,IAAUH,EAAK,eACfjQ,IAAS+P,EAAgBK,CAAO,KAAK,QACrCC,IAAerQ,MAAW,WAC1BsQ,IAActQ,MAAW,WAEzBuQ,IAAoB,YAAY;AACpC,QAAAP,EAAmB,CAAC9P,OAAU,EAAE,GAAGA,GAAM,CAACkQ,CAAO,GAAG,UAAA,EAAY;AAChE,YAAI;AAIF,cAFAlC,GAAA,GAEI,CADUD,GAAA;AAEZ,kBAAM,IAAI,MAAM,iEAAiE;AAMnF,cAAI,GAJW,MAAMsB,GAAYU,EAAK,aAAa,IAG3B,YAAY,IACtB,OAAM,IAAI,MAAM,gBAAgB;AAG9C,UAAApC,GAAA,GACAD,GAAA,GAEAoC,EAAmB,CAAC9P,OAAU,EAAE,GAAGA,GAAM,CAACkQ,CAAO,GAAG,UAAA,EAAY;AAAA,QAClE,QAAQ;AACN,UAAAJ,EAAmB,CAAC9P,OAAU,EAAE,GAAGA,GAAM,CAACkQ,CAAO,GAAG,QAAA,EAAU;AAAA,QAChE;AAAA,MACF;AAEA,aACE,gBAAAxV,EAAC,OAAA,EAAkB,WAAU,sGAE3B,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACZ,UAAA;AAAA,UAAAqV,EAAK,sBACJ,gBAAApV,EAAC,OAAA,EAAI,KAAK,yBAAyBoV,EAAK,mBAAmB,IAAI,KAAKA,EAAK,cAAc,WAAU,8BAA6B,IAE9H,gBAAApV,EAAC,OAAA,EAAI,WAAU,2GACZ,UAAAoV,EAAK,aAAa,OAAO,CAAC,EAAE,YAAA,EAAY,CAC3C;AAAA,UAEF,gBAAApV,EAAC,OAAA,EAAI,WAAU,UACb,UAAA,gBAAAA,EAAC,QAAG,WAAU,gCAAgC,UAAAoV,EAAK,aAAA,CAAa,EAAA,CAClE;AAAA,QAAA,GACF;AAAA,QAGA,gBAAArV,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,KAAA,EAAE,WAAU,0BAAyB,UAAA,WAAO;AAAA,UAC7C,gBAAAA,EAAC,KAAA,EAAE,WAAU,qCAAqC,UAAAsV,EAAA,CAAiB;AAAA,QAAA,GACrE;AAAA,QAGA,gBAAAvV,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,KAAA,EAAE,WAAU,0BAAyB,UAAA,QAAI;AAAA,UAC1C,gBAAAD,EAAC,KAAA,EAAE,WAAU,8BAA8B,UAAA;AAAA,YAAAqV,EAAK;AAAA,YAAY;AAAA,UAAA,EAAA,CAAO;AAAA,QAAA,GACrE;AAAA,QAGCA,EAAK,oBACJ,gBAAApV,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAD,EAAC,KAAA,EAAE,WAAU,0BAAyB,UAAA;AAAA,UAAA;AAAA,UAAWqV,EAAK;AAAA,QAAA,EAAA,CAAiB,EAAA,CACzE;AAAA,QAIF,gBAAArV,EAAC,OAAA,EAAI,WAAU,gBACb,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS0V;AAAA,cACT,UAAUF,KAAgBC;AAAA,cAC1B,WAAW,8LACTA,IAAc,6BAA6B,oEAC7C;AAAA,cAEC,UAAAD,IAAe,gBAAgBC,IAAc,cAAc;AAAA,YAAA;AAAA,UAAA;AAAA,UAE7DtQ,MAAW,WAAW,gBAAAnF,EAAC,KAAA,EAAE,WAAU,6BAA4B,UAAA,2CAAuC;AAAA,UACtGmF,MAAW,aAAa,gBAAAnF,EAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA,iCAAA,CAA8B;AAAA,QAAA,EAAA,CACtG;AAAA,MAAA,EAAA,GAhDQuV,CAiDV;AAAA,IAEJ,CAAC,EAAA,CACH;AAAA,IACCT,KAAU,gBAAA9U,EAAC6U,IAAA,EAAW,QAAAC,EAAA,CAAgB;AAAA,EAAA,GACzC,IApGE,gBAAA/U,EAAC,WAAA,EAAQ,WAAU,QACjB,UAAA;AAAA,IAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,wCAAuC,UAAA,SAAK;AAAA,IAC1D,gBAAAA,EAAC,KAAA,EAAE,WAAU,+BAA8B,UAAA,wCAAoC;AAAA,IAC9E8U,KAAU,gBAAA9U,EAAC6U,IAAA,EAAW,QAAAC,EAAA,CAAgB;AAAA,EAAA,GACzC;AAkGN;AC1IO,SAASa,EAAsBrV,GAAuD;AAC3F,MAAIA,MAAU,GAAM,QAAO;AAC3B,MAAIA,MAAU,GAAO,QAAO;AAE9B;AAKO,SAASsV,EAAWC,GAA4D;AACrF,MAAKA;AACL,QAAI;AACF,YAAMC,IAAI,OAAOD,KAAS,WAAW,IAAI,KAAKA,CAAI,IAAIA;AACtD,aAAI,MAAMC,EAAE,QAAA,CAAS,IAAG,SACjBA,EAAE,YAAA,EAAc,MAAM,GAAG,EAAE,CAAC;AAAA,IACrC,QAAQ;AACN;AAAA,IACF;AACF;AAKO,SAASC,GAAkBC,GAA0B;AAC1D,QAAMC,IAAyB,CAAA;AAG/B,EAAID,EAAM,UAAOC,EAAW,QAAQD,EAAM,QACtCA,EAAM,eAAYC,EAAW,aAAaD,EAAM,aAChDA,EAAM,cAAWC,EAAW,YAAYD,EAAM,YAC9CA,EAAM,UAAOC,EAAW,QAAQD,EAAM,QACtCA,EAAM,kBAAeC,EAAW,gBAAgBL,EAAWI,EAAM,aAAa,IAC9EA,EAAM,YAASC,EAAW,UAAUD,EAAM,UAC1CA,EAAM,UAAOC,EAAW,QAAQD,EAAM;AAG1C,QAAME,IAAyB,CAAA;AAC/B,EAAIF,EAAM,UAAQE,EAAa,KAAKF,EAAM,MAAM,GAC5CA,EAAM,UAAQE,EAAa,KAAKF,EAAM,MAAM,GAC5CA,EAAM,QAAME,EAAa,KAAKF,EAAM,IAAI,GACxCA,EAAM,SAAOE,EAAa,KAAKF,EAAM,KAAK,GAC1CA,EAAM,eAAaE,EAAa,KAAKF,EAAM,WAAW,GACtDE,EAAa,SAAS,MACxBD,EAAW,UAAUC,EAAa,KAAK,IAAI,IAGzCF,EAAM,qBAAqB,QAAQA,EAAM,qBAAqB,WAAWC,EAAW,mBAAmBD,EAAM,mBAC7GA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAAWC,EAAW,oBAAoBD,EAAM,oBAChHA,EAAM,iBAAcC,EAAW,eAAeL,EAAWI,EAAM,YAAY;AAG/E,QAAMG,IAA8B,CAAA;AACpC,SAAIH,EAAM,gBAAcG,EAAkB,KAAKH,EAAM,YAAY,GAC7DA,EAAM,gBAAcG,EAAkB,KAAKH,EAAM,YAAY,GAC7DA,EAAM,cAAYG,EAAkB,KAAKH,EAAM,UAAU,GACzDA,EAAM,eAAaG,EAAkB,KAAKH,EAAM,WAAW,GAC3DA,EAAM,qBAAmBG,EAAkB,KAAKH,EAAM,iBAAiB,GACvEG,EAAkB,SAAS,MAC7BF,EAAW,gBAAgBE,EAAkB,KAAK,IAAI,IAGpDH,EAAM,2BAA2B,QAAQA,EAAM,2BAA2B,WAC5EC,EAAW,yBAAyBD,EAAM,yBAGxCA,EAAM,6BAA6B,QAAQA,EAAM,6BAA6B,WAChFC,EAAW,2BAA2BN,EAAsBK,EAAM,wBAAwB,IAExFA,EAAM,+BAA4BC,EAAW,6BAA6BL,EAAWI,EAAM,0BAA0B,IACrHA,EAAM,4BAAyBC,EAAW,0BAA0BD,EAAM,0BAC1EA,EAAM,+BAA4BC,EAAW,6BAA6BD,EAAM,6BAChFA,EAAM,iCAA8BC,EAAW,+BAA+BD,EAAM,+BACpFA,EAAM,qBAAqB,QAAQA,EAAM,qBAAqB,WAAWC,EAAW,mBAAmBD,EAAM,mBAC7GA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAAWC,EAAW,oBAAoBD,EAAM,oBAChHA,EAAM,mCAAmC,QAAQA,EAAM,mCAAmC,WAC5FC,EAAW,iCAAiCD,EAAM,iCAEhDA,EAAM,6CAA6C,QAAQA,EAAM,6CAA6C,WAChHC,EAAW,2CAA2CN,EAAsBK,EAAM,wCAAwC,IAIxHA,EAAM,6BAA6B,QAAQA,EAAM,6BAA6B,WAChFC,EAAW,2BAA2BN,EAAsBK,EAAM,wBAAwB,IAExFA,EAAM,+BAA4BC,EAAW,6BAA6BL,EAAWI,EAAM,0BAA0B,IACrHA,EAAM,4BAAyBC,EAAW,0BAA0BD,EAAM,0BAG1EA,EAAM,eAAe,QAAQA,EAAM,eAAe,WAAWC,EAAW,aAAaD,EAAM,aAC3FA,EAAM,oBAAoB,QAAQA,EAAM,oBAAoB,WAAWC,EAAW,kBAAkBD,EAAM,kBAC1GA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAAWC,EAAW,oBAAoBD,EAAM,oBAChHA,EAAM,mBAAmB,QAAQA,EAAM,mBAAmB,WAAWC,EAAW,iBAAiBD,EAAM,iBACvGA,EAAM,yBAAyB,QAAQA,EAAM,yBAAyB,WAAWC,EAAW,uBAAuBD,EAAM,uBACzHA,EAAM,4BAA4B,QAAQA,EAAM,4BAA4B,WAC9EC,EAAW,0BAA0BD,EAAM,0BAEzCA,EAAM,uBAAuB,QAAQA,EAAM,uBAAuB,WACpEC,EAAW,qBAAqBN,EAAsBK,EAAM,kBAAkB,IAE5EA,EAAM,kCAA+BC,EAAW,gCAAgCD,EAAM,gCACtFA,EAAM,qCAAkCC,EAAW,mCAAmCD,EAAM,mCAC5FA,EAAM,wBAAqBC,EAAW,sBAAsBD,EAAM,sBAClEA,EAAM,kBAAeC,EAAW,gBAAgBD,EAAM,gBACtDA,EAAM,yBAAsBC,EAAW,uBAAuBD,EAAM,uBACpEA,EAAM,uBAAuB,QAAQA,EAAM,uBAAuB,WACpEC,EAAW,qBAAqBD,EAAM,qBAEpCA,EAAM,sBAAmBC,EAAW,oBAAoBD,EAAM,oBAC9DA,EAAM,uBAAoBC,EAAW,qBAAqBD,EAAM,qBAChEA,EAAM,oBAAiBC,EAAW,kBAAkBD,EAAM,kBAC1DA,EAAM,uBAAoBC,EAAW,qBAAqBD,EAAM,qBAChEA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAAWC,EAAW,oBAAoBD,EAAM,oBAChHA,EAAM,iBAAcC,EAAW,eAAeD,EAAM,eACpDA,EAAM,sBAAmBC,EAAW,oBAAoBD,EAAM,oBAC9DA,EAAM,yBAAyB,QAAQA,EAAM,yBAAyB,WACxEC,EAAW,uBAAuBD,EAAM,uBAEtCA,EAAM,kBAAeC,EAAW,gBAAgBD,EAAM,gBACtDA,EAAM,iBAAcC,EAAW,eAAeD,EAAM,eACpDA,EAAM,6BAA6B,QAAQA,EAAM,6BAA6B,WAChFC,EAAW,2BAA2BD,EAAM,2BAE1CA,EAAM,kBAAeC,EAAW,gBAAgBD,EAAM,gBACtDA,EAAM,cAAWC,EAAW,YAAYD,EAAM,YAC9CA,EAAM,qBAAqB,QAAQA,EAAM,qBAAqB,WAAWC,EAAW,mBAAmBD,EAAM,mBAC7GA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAAWC,EAAW,oBAAoBD,EAAM,oBAChHA,EAAM,mBAAgBC,EAAW,iBAAiBD,EAAM,iBACxDA,EAAM,eAAYC,EAAW,aAAaD,EAAM,aAChDA,EAAM,mBAAmB,QAAQA,EAAM,mBAAmB,WAAWC,EAAW,iBAAiBD,EAAM,iBACvGA,EAAM,yBAAyB,QAAQA,EAAM,yBAAyB,WACxEC,EAAW,uBAAuBD,EAAM,uBAEtCA,EAAM,YAAY,QAAQA,EAAM,YAAY,WAAWC,EAAW,UAAUN,EAAsBK,EAAM,OAAO,IAC/GA,EAAM,mBAAgBC,EAAW,iBAAiBD,EAAM,iBACxDA,EAAM,mBAAmB,QAAQA,EAAM,mBAAmB,WAAWC,EAAW,iBAAiBD,EAAM,iBACvGA,EAAM,6BAA6B,QAAQA,EAAM,6BAA6B,WAChFC,EAAW,2BAA2BN,EAAsBK,EAAM,wBAAwB,IAExFA,EAAM,mBAAgBC,EAAW,iBAAiBD,EAAM,iBAGxDA,EAAM,qBAAqB,QAAQA,EAAM,qBAAqB,WAChEC,EAAW,mBAAmBN,EAAsBK,EAAM,gBAAgB,IAExEA,EAAM,6BAA6B,QAAQA,EAAM,6BAA6B,WAChFC,EAAW,2BAA2BN,EAAsBK,EAAM,wBAAwB,IAExFA,EAAM,0BAA0B,QAAQA,EAAM,0BAA0B,WAC1EC,EAAW,wBAAwBN,EAAsBK,EAAM,qBAAqB,IAElFA,EAAM,wBAAwB,QAAQA,EAAM,wBAAwB,WACtEC,EAAW,sBAAsBN,EAAsBK,EAAM,mBAAmB,IAE9EA,EAAM,8BAA8B,QAAQA,EAAM,8BAA8B,WAClFC,EAAW,4BAA4BN,EAAsBK,EAAM,yBAAyB,IAI1FA,EAAM,0BAA0B,QAAQA,EAAM,0BAA0B,WAC1EC,EAAW,wBAAwBN,EAAsBK,EAAM,qBAAqB,IAElFA,EAAM,yBAAyB,QAAQA,EAAM,yBAAyB,WACxEC,EAAW,uBAAuBN,EAAsBK,EAAM,oBAAoB,IAEhFA,EAAM,8BAA2BC,EAAW,4BAA4BD,EAAM,4BAC9EA,EAAM,oBAAoB,QAAQA,EAAM,oBAAoB,WAC9DC,EAAW,kBAAkBN,EAAsBK,EAAM,eAAe,IAEtEA,EAAM,qBAAqB,QAAQA,EAAM,qBAAqB,WAChEC,EAAW,mBAAmBN,EAAsBK,EAAM,gBAAgB,IAExEA,EAAM,0BAAuBC,EAAW,wBAAwBD,EAAM,wBACtEA,EAAM,yBAAyB,QAAQA,EAAM,yBAAyB,WACxEC,EAAW,uBAAuBN,EAAsBK,EAAM,oBAAoB,IAEhFA,EAAM,mBAAmB,QAAQA,EAAM,mBAAmB,WAC5DC,EAAW,iBAAiBN,EAAsBK,EAAM,cAAc,IAEpEA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAClEC,EAAW,oBAAoBN,EAAsBK,EAAM,iBAAiB,IAI1EA,EAAM,4BAA4B,QAAQA,EAAM,4BAA4B,WAC9EC,EAAW,0BAA0BN,EAAsBK,EAAM,uBAAuB,IAEtFA,EAAM,uCAAuC,QAAQA,EAAM,uCAAuC,WACpGC,EAAW,qCAAqCN,EAAsBK,EAAM,kCAAkC,IAE5GA,EAAM,8CAA8C,QAAQA,EAAM,8CAA8C,WAClHC,EAAW,4CAA4CN,EAAsBK,EAAM,yCAAyC,IAE1HA,EAAM,4CAA4C,QAAQA,EAAM,4CAA4C,WAC9GC,EAAW,0CAA0CN,EAAsBK,EAAM,uCAAuC,IAItHA,EAAM,WAAWA,EAAM,QAAQ,SAAS,KAC1CC,EAAW,UAAU,OACrBA,EAAW,iBAAiBD,EAAM,QAAQ,IAAI,CAACI,MAAW;AACxD,UAAMC,IAA2B,CAAA;AACjC,WAAID,EAAO,eAAYC,EAAa,aAAaD,EAAO,aACpDA,EAAO,cAAWC,EAAa,YAAYD,EAAO,YAClDA,EAAO,kBAAeC,EAAa,gBAAgBT,EAAWQ,EAAO,aAAa,IAClFA,EAAO,WAAQC,EAAa,SAASD,EAAO,SAC5CA,EAAO,mBAAgBC,EAAa,iBAAiBD,EAAO,iBAC5DA,EAAO,4BAAyBC,EAAa,0BAA0BD,EAAO,0BAC9EA,EAAO,kBAAeC,EAAa,gBAAgBD,EAAO,gBAC1DA,EAAO,mBAAgBC,EAAa,iBAAiBD,EAAO,iBAC5DA,EAAO,mBAAgBC,EAAa,iBAAiBD,EAAO,iBAC5DA,EAAO,wBAAqBC,EAAa,sBAAsBT,EAAWQ,EAAO,mBAAmB,IACpGA,EAAO,oBAAiBC,EAAa,kBAAkBD,EAAO,kBAC9DA,EAAO,eAAYC,EAAa,aAAaD,EAAO,aACpDA,EAAO,aAAUC,EAAa,WAAWD,EAAO,WAGhDA,EAAO,qBAAqBA,EAAO,kBAAkB,SAAS,MAChEC,EAAa,2BAA2BD,EAAO,kBAAkB,IAAI,CAACE,MAAc;AAClF,YAAMC,IAA8B,CAAA;AACpC,aAAID,EAAU,SAAMC,EAAgB,OAAOD,EAAU,OACjDA,EAAU,gBAAaC,EAAgB,cAAcX,EAAWU,EAAU,WAAW,IAClFC;AAAA,IACT,CAAC,IAICH,EAAO,oBAAoBA,EAAO,iBAAiB,SAAS,MAC9DC,EAAa,0BAA0BD,EAAO,iBAAiB,IAAI,CAACI,MAAa;AAC/E,YAAMC,IAA6B,CAAA;AACnC,aAAID,EAAS,gBAAaC,EAAe,cAAcb,EAAWY,EAAS,WAAW,IAClFA,EAAS,gBAAaC,EAAe,cAAcD,EAAS,cAC5DA,EAAS,qBAAkBC,EAAe,mBAAmBD,EAAS,mBACtEA,EAAS,sCAAsC,QAAQA,EAAS,sCAAsC,WACxGC,EAAe,oCAAoCD,EAAS,oCAE1DA,EAAS,sCAAsC,QAAQA,EAAS,sCAAsC,WACxGC,EAAe,oCAAoCD,EAAS,oCAEvDC;AAAA,IACT,CAAC,IAICL,EAAO,UAAUA,EAAO,OAAO,SAAS,MAC1CC,EAAa,SAASD,EAAO,OAAO,IAAI,CAACM,MAAS;AAChD,YAAMC,IAAyB,CAAA;AAC/B,aAAID,EAAK,gBAAaC,EAAW,cAAcD,EAAK,cAChDA,EAAK,qBAAkBC,EAAW,mBAAmBf,EAAWc,EAAK,gBAAgB,IACrFA,EAAK,sBAAsB,QAAQA,EAAK,sBAAsB,WAChEC,EAAW,oBAAoBD,EAAK,oBAElCA,EAAK,qBAAkBC,EAAW,mBAAmBD,EAAK,mBACvDC;AAAA,IACT,CAAC,IAGIN;AAAA,EACT,CAAC,KAGDJ,EAAW,UAAU,MAInBD,EAAM,YAAYA,EAAM,SAAS,SAAS,KAC5CC,EAAW,WAAW,OACtBA,EAAW,kBAAkBD,EAAM,SAAS,IAAI,CAACY,MAAY;AAC3D,UAAMC,IAA4B,CAAA;AAClC,IAAID,EAAQ,QAAKC,EAAc,MAAMD,EAAQ,MACzCA,EAAQ,SAAS,QAAQA,EAAQ,SAAS,WAAWC,EAAc,OAAOD,EAAQ,OAClFA,EAAQ,SAAMC,EAAc,OAAOD,EAAQ,OAC3CA,EAAQ,UAAOC,EAAc,QAAQD,EAAQ,QAC7CA,EAAQ,mBAAgBC,EAAc,iBAAiBD,EAAQ,iBAC/DA,EAAQ,UAAOC,EAAc,QAAQD,EAAQ,QAC7CA,EAAQ,mBAAmB,QAAQA,EAAQ,mBAAmB,WAChEC,EAAc,iBAAiBD,EAAQ,iBAErCA,EAAQ,kBAAkB,QAAQA,EAAQ,kBAAkB,WAC9DC,EAAc,gBAAgBD,EAAQ,gBAEpCA,EAAQ,oBAAoB,QAAQA,EAAQ,oBAAoB,WAClEC,EAAc,kBAAkBD,EAAQ;AAI1C,UAAME,IAAiC,CAAA;AACvC,WAAIF,EAAQ,2BAAyBE,EAAqB,KAAKF,EAAQ,uBAAuB,GAC1FA,EAAQ,2BAAyBE,EAAqB,KAAKF,EAAQ,uBAAuB,GAC1FA,EAAQ,yBAAuBE,EAAqB,KAAKF,EAAQ,qBAAqB,GACtFA,EAAQ,0BAAwBE,EAAqB,KAAKF,EAAQ,sBAAsB,GACxFA,EAAQ,gCAA8BE,EAAqB,KAAKF,EAAQ,4BAA4B,GACpGE,EAAqB,SAAS,MAChCD,EAAc,mBAAmBC,EAAqB,KAAK,IAAI,IAG7DF,EAAQ,oBAAiBC,EAAc,kBAAkBD,EAAQ,kBACjEA,EAAQ,2BAAwBC,EAAc,yBAAyBD,EAAQ,yBAG/EA,EAAQ,aAAaA,EAAQ,UAAU,SAAS,MAClDC,EAAc,mBAAmBD,EAAQ,UAAU,IAAI,CAACG,MAAa;AACnE,YAAMC,IAA6B,CAAA;AACnC,aAAID,EAAS,SAAMC,EAAe,OAAOD,EAAS,OAC9CA,EAAS,2BAA2B,QAAQA,EAAS,2BAA2B,WAClFC,EAAe,yBAAyBD,EAAS,yBAE/CA,EAAS,6BAA6B,QAAQA,EAAS,6BAA6B,WACtFC,EAAe,2BAA2BD,EAAS,2BAEjDA,EAAS,+BAA+B,QAAQA,EAAS,+BAA+B,WAC1FC,EAAe,6BAA6BD,EAAS,6BAEnDA,EAAS,wBAAwB,QAAQA,EAAS,wBAAwB,WAC5EC,EAAe,sBAAsBD,EAAS,sBAE5CA,EAAS,qBAAqB,QAAQA,EAAS,qBAAqB,WACtEC,EAAe,mBAAmBD,EAAS,mBAEzCA,EAAS,gBAAgB,QAAQA,EAAS,gBAAgB,WAC5DC,EAAe,cAAcrB,EAAsBoB,EAAS,WAAW,IAElEC;AAAA,IACT,CAAC,IAICJ,EAAQ,uBAAuBA,EAAQ,oBAAoB,SAAS,MACtEC,EAAc,6BAA6BD,EAAQ,oBAAoB,IAAI,CAACK,MAAe;AACzF,YAAMC,IAA+B,CAAA;AACrC,aAAID,EAAW,SAAMC,EAAiB,OAAOD,EAAW,OACpDA,EAAW,SAAMC,EAAiB,OAAOD,EAAW,OACpDA,EAAW,WAAQC,EAAiB,SAASD,EAAW,SACxDA,EAAW,WAAQC,EAAiB,SAASD,EAAW,SACxDA,EAAW,SAAMC,EAAiB,OAAOD,EAAW,OACpDA,EAAW,UAAOC,EAAiB,QAAQD,EAAW,QACtDA,EAAW,gBAAaC,EAAiB,cAAcD,EAAW,cAClEA,EAAW,UAAOC,EAAiB,QAAQD,EAAW,QACtDA,EAAW,QAAKC,EAAiB,MAAMD,EAAW,MAC/CC;AAAA,IACT,CAAC,IAGIL;AAAA,EACT,CAAC,KAGDZ,EAAW,WAAW,MAIpBD,EAAM,UAAUA,EAAM,OAAO,SAAS,MACxCC,EAAW,qBAAqBD,EAAM,OAAO,IAAI,CAACU,MAAS;AACzD,UAAMC,IAAyB,CAAA;AAC/B,WAAID,EAAK,gBAAaC,EAAW,cAAcD,EAAK,cAChDA,EAAK,qBAAkBC,EAAW,mBAAmBf,EAAWc,EAAK,gBAAgB,IACrFA,EAAK,sBAAsB,QAAQA,EAAK,sBAAsB,WAChEC,EAAW,oBAAoBD,EAAK,oBAE/BC;AAAA,EACT,CAAC,IAGIV;AACT;ACnVA,SAASkB,GAAoB9Q,GAAgC;AAC3D,QAAM+Q,IAA0B,CAAA,GAG1BC,IAAwB,CAAC/W,MAA4B;AACzD,QAAI,OAAOA,KAAU,UAAU;AAC7B,UAAIA,MAAU,MAAO,QAAO;AAC5B,UAAIA,MAAU,KAAM,QAAO;AAAA,IAC7B;AACA,WAAOA;AAAA,EACT,GAGMgX,IAAe,OAAO,KAAKjR,CAAM,EAAE,OAAO,CAACI,MAAQ,CAACA,EAAI,SAAS,SAAS,CAAC,GAG3E8Q,wBAAqB,IAAA;AAC3B,aAAW,CAAC9Q,GAAKnG,CAAK,KAAK,OAAO,QAAQ+F,CAAM;AAC9C,IAAII,EAAI,SAAS,SAAS,KAAK,MAAM,QAAQnG,CAAK,KAChDA,EAAM,QAAQ,CAACkP,MAAS;AACtB,MAAI,OAAOA,KAAS,YAAYA,MAAS,QACvC,OAAO,KAAKA,CAAI,EAAE,QAAQ,CAACgI,MAAc;AACvC,QAAAD,EAAe,IAAIC,CAAS;AAAA,MAC9B,CAAC;AAAA,IAEL,CAAC;AAIL,aAAW,CAAC/Q,GAAKnG,CAAK,KAAK,OAAO,QAAQ+F,CAAM;AAC9C,QAAII,EAAI,SAAS,SAAS,GAAG;AAE3B,YAAM6C,IAAU7C,EAAI,QAAQ,WAAW,EAAE;AAMzC,UAFkC6Q,EAAa,SAAShO,CAAO,GAEhC;AAE7B,cAAMmO,IAAmB,MAAM,QAAQnX,CAAK,IAAIA,EAAM,IAAI,CAACkP,MAAS2H,GAAoB3H,CAAkB,CAAC,IAAIlP;AAC/G,QAAA8W,EAAY9N,CAAO,IAAImO;AAAA,MACzB;AAAA,IACF,MAAA,CAAYhR,EAAI,SAAS,SAAS,KAG3B8Q,EAAe,IAAI9Q,CAAG,MACzB2Q,EAAY3Q,CAAG,IAAI4Q,EAAsB/W,CAAK;AAMpD,SAAO8W;AACT;AAEA,SAAwBM,GAAO,EAAE,QAAAC,GAAQ,SAAAC,KAAqD;AAC5F,QAAM,CAAC/H,GAAQgI,CAAS,IAAI/W,EAAsB,CAAA,CAAE,GAC9C,CAAC2R,GAASqF,CAAU,IAAIhX,EAAwB,IAAI,GACpD,CAACkU,GAAO+C,CAAQ,IAAIjX,EAAkC,IAAI,GAC1D,CAACkX,GAAiBC,CAAkB,IAAInX,EAA4B,IAAI,GACxE,CAACoX,GAAoBC,CAAqB,IAAIrX,EAA6B,MAAS,GACpF,CAACsX,GAAkBC,CAAmB,IAAIvX,EAAS,EAAK;AAE9D,WAASwX,EAAsBzI,GAA8B;AAE3D,UAAM0I,IAAwC;AAAA,MAC5C,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,IAAA;AAGtB,WAAO1I,EAAO,IAAI,CAACkB,OAAW;AAAA,MAC5B,KAAKA;AAAA,MACL,OAAOwH,EAAcxH,CAAK,KAAKA;AAAA,MAC/B,eAAe,aACA,MAAM+C,GAAoB/C,CAAK,GAC5B;AAAA,IAElB,EACA;AAAA,EACJ;AAGA,EAAA7P,EAAU,MAAM;AA2Ed,IAAIyW,MA1EsB,YAAY;AACpC,UAAI;AAEF,cAAMa,IAAgB9F,GAAA;AAGtB,YAFAW,GAAA,GAEImF,GAAe;AACjB,UAAAH,EAAoB,EAAI,GACxBP,EAAWU,CAAa;AAGxB,cAAI;AACF,kBAAM3F,IAAQO,GAAA,GACRQ,IAAW,MAAMa,GAAS5B,IAAQ,SAAY2F,CAAa;AAEjE,gBAAI,CAAC5E,KAAY,CAACA,EAAS;AACzB,oBAAM,IAAI,MAAM,oDAAoD;AAGtE,kBAAM,EAAE,OAAAoC,MAAUpC,GAIZ,EAAE,QAAQ6E,EAAA,IAAkB,MAAM1E,GAAA,GAClC2E,IAAaJ,EAAsBG,CAAa;AACtD,YAAAZ,EAAUa,CAAU;AAGpB,gBAAI;AACF,oBAAMzC,IAAaF,GAAkBC,CAAK;AAC1C,cAAAiC,EAAmBhC,CAAU;AAAA,YAC/B,SAAS0C,GAAgB;AACvB,oBAAM,IAAI,MAAM,mCAAmCA,aAA0B,QAAQA,EAAe,UAAU,eAAe,EAAE;AAAA,YACjI;AAGA,gBAAI3C,EAAM,eAAe;AACvB,oBAAM4C,IAAaF,EAAW,UAAU,CAAC3S,MAAMA,EAAE,QAAQiQ,EAAM,aAAa;AAC5E,cAAI4C,KAAc,IAChBT,EAAsBS,CAAU,IAGhCT,EAAsBO,EAAW,SAAS,CAAC;AAAA,YAE/C;AAEE,cAAAP,EAAsBO,EAAW,SAAS,CAAC;AAAA,UAE/C,SAAS/Y,GAAO;AAGd,YADiBA,EACJ,eAAe,OAE1BgT,GAAA,GACAmF,EAAW,IAAI,KAGf/E,GAAA;AAAA,UAGJ,UAAA;AACE,YAAAsF,EAAoB,EAAK;AAAA,UAC3B;AAAA,QACF,OAAO;AAEL,gBAAM,EAAE,QAAQQ,EAAA,IAAkB,MAAM9E,GAAA;AACxC,UAAA8D,EAAUS,EAAsBO,CAAa,CAAC;AAAA,QAChD;AAAA,MACF,QAAQ;AAEN,QAAAR,EAAoB,EAAK;AAAA,MAC3B;AAAA,IACF,GAGE;AAAA,EAEJ,GAAG,CAACV,CAAM,CAAC,GAGXzW,EAAU,MAAM;AACd,QAAI,CAACyW,EAAQ;AACb,UAAM,EAAE,UAAAmB,EAAA,IAAa,SAAS,KAAK;AACnC,oBAAS,KAAK,MAAM,WAAW,UACxB,MAAM;AACX,eAAS,KAAK,MAAM,WAAWA;AAAA,IACjC;AAAA,EACF,GAAG,CAACnB,CAAM,CAAC;AAGX,QAAMoB,IAAYC;AAAA,IAChB,CAAC3X,MAAqB;AACpB,MAAIA,EAAE,QAAQ,aACZoN,GAAA,GACAmJ,EAAA;AAAA,IAEJ;AAAA,IACA,CAACA,CAAO;AAAA,EAAA;AA2BV,SAzBA1W,EAAU,MAAM;AACd,QAAKyW;AACL,oBAAO,iBAAiB,WAAWoB,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAAA,EAC9D,GAAG,CAACpB,GAAQoB,CAAS,CAAC,GAGtB7X,EAAU,MAAM;AACd,IAAKyW,MACHM,EAAmB,IAAI,GACvBE,EAAsB,MAAS,GAC/BE,EAAoB,EAAK;AAAA,EAE7B,GAAG,CAACV,CAAM,CAAC,GAGXzW,EAAU,MAAM;AACd,IAAIyW,KAAQnJ,GAAA;AAAA,EACd,GAAG,CAACmJ,CAAM,CAAC,GAGXzW,EAAU,MAAM;AACd,IAAI8T,KAAS,MAAM,QAAQA,CAAK,QAAmB,EAAE,WAAWA,EAAM,QAAQ;AAAA,EAChF,GAAG,CAACA,CAAK,CAAC,GAEL2C,IAQH,gBAAA5X,EAAC,SAAI,WAAU,2DAA0D,MAAK,UAAS,cAAW,QAAO,mBAAgB,yBACvH,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,YAAW,eAAY,QAAO;AAAA,IAE7C,gBAAAD,EAAC,OAAA,EAAI,WAAU,6FAA4F,MAAK,YAC9G,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAXY,MAAM;AACxB,YAAAyO,GAAA,GACAmJ,EAAA;AAAA,UACF;AAAA,UASQ,WAAU;AAAA,UACV,cAAW;AAAA,UACX,MAAK;AAAA,UACN,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAID,gBAAA7X,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,MAAA,EAAG,IAAG,yBAAwB,WAAU,YAAW,UAAA,2CAEpD;AAAA,QACA,gBAAAA,EAAC,KAAA,EAAE,WAAU,cAAa,UAAA,uCAAA,CAAoC;AAAA,MAAA,GAChE;AAAA,MAGA,gBAAAD,EAAC,OAAA,EAAI,WAAU,6CACZ,UAAA;AAAA,QAAA,CAACiV,KACA,gBAAAhV,EAAA4L,IAAA,EACG,UAAAwM,KAAoBvI,EAAO,WAAW,IACrC,gBAAA7P,EAAC,OAAA,EAAI,WAAU,0CACb,4BAAC,OAAA,EAAI,WAAU,kBAAiB,UAAA,cAAU,GAC5C,IAEA,gBAAAA;AAAA,UAAC4P;AAAA,UAAA;AAAA,YACC,QAAAC;AAAA,YACA,eAAemI,KAAmB;AAAA,YAClC,eAAeE;AAAA,YACf,iBAAiB,OAAOe,GAAajI,MAAa;AAChD,kBAAI;AACF,sBAAMkI,IAAoB/B,GAAoB8B,CAAW,GAGnD,EAAE,QAAQE,EAAA,IAAc,MAAMpF,GAAA,GAC9B2E,IAAaJ,EAAsBa,CAAS;AAClD,gBAAAtB,EAAUa,CAAU;AAGpB,sBAAMU,IAAoBV,EAAW,UAAU,CAAC3S,MAAMA,EAAE,QAAQiL,CAAQ,GAClEqI,IAAcX,EAAWU,CAAiB,GAC1CE,IAAiBF,IAAoB,GAErCG,KADYD,IAAiBZ,EAAW,SAASA,EAAWY,CAAc,IAAI,OACpD,OAAOtI;AAEvC,oBAAKyB;AAUL,sBAAWzB,MAAa,mBAAmB;AACzC,0BAAM,EAAE,YAAAwI,GAAY,OAAA3G,EAAA,IAAU,MAAMwB,GAAY5B,GAASyG,EAAkB,QAAkB;AAC7F,wBAAI,CAACM;AACH,4BAAM,IAAI,MAAM,kBAAkB;AAEpC,oBAAI3G,KACFM,GAAaN,CAAK,GAGpB,MAAMsB,GAAY,EAAE,eAAeoF,EAAA,GAAgB,EAAK;AAAA,kBAC1D,WAAWvI,MAAa,SAAS;AAC/B,0BAAM,EAAE,aAAAyI,EAAA,IAAgB,MAAMlF,GAAiB2E,EAAkB,KAAe;AAChF,wBAAI,CAACO;AACH,4BAAM,IAAI,MAAM,wBAAwB;AAI1C,0BAAM5G,IAAQO,GAAA;AACd,0BAAMe,GAAY,EAAE,GAAG+E,GAAmB,eAAeK,KAAgB,IAAO1G,IAAQ,SAAYJ,CAAO;AAAA,kBAC7G,OAAO;AAGL,0BAAMI,IAAQO,GAAA;AACd,0BAAMe,GAAY,EAAE,GAAG+E,GAAmB,eAAeK,EAAA,GAAgB,IAAO1G,IAAQ,SAAYJ,KAAW,MAAS;AAAA,kBAC1H;AAAA,qBAlCc;AAEZ,wBAAMiH,KADsB,MAAM1F,GAAYkF,EAAkB,KAAe,IACvC;AACxC,sBAAI,CAACQ,KAAc,OAAOA,KAAe,YAAYA,EAAW,KAAA,MAAW;AACzE,0BAAM,IAAI,MAAM,sDAAsDA,CAAU,EAAE;AAEpF,kBAAA5B,EAAW4B,CAAU,GACrBlH,GAAYkH,CAAU,GAEtB,MAAMvF,GAAY,EAAE,eAAeoF,EAAA,GAAgB,IAAOG,CAAU;AAAA,gBACtE;AA0BA,uBAAA/K,GAAmB;AAAA,kBACjB,UAAAqC;AAAA,kBACA,YAAYqI,GAAa,SAASrI;AAAA,kBAClC,WAAWoI,IAAoB;AAAA,kBAC/B,YAAYV,EAAW;AAAA,gBAAA,CACxB,GACM,EAAE,SAAS,GAAA;AAAA,cACpB,SAAS/Y,GAAO;AACd,uBAAO,EAAE,SAAS,IAAO,OAAOA,aAAiB,QAAQA,EAAM,UAAU,oBAAA;AAAA,cAC3E;AAAA,YACF;AAAA,YACA,YAAY,OAAOwQ,MAAc;AAC/B,kBAAI;AACF,sBAAM+I,IAAoB/B,GAAoBhH,CAAS;AAEvD,oBAAI,CAACsC;AACH,wBAAM,IAAI,MAAM,sBAAsB;AAExC,sBAAM0B,GAAY+E,GAAmB,EAAI,GAGzCjB,EAAmB9H,CAAS;AAE5B,sBAAM,EAAE,OAAA6E,EAAAA,IAAU,MAAMZ,GAAA;AACxB,gBAAA2D,EAAS/C,CAAK;AAEd,sBAAM2E,IAAa9J,EAAO,QACpB+J,IAAY/J,EAAO8J,IAAa,CAAC;AACvC,uBAAAhL,GAAmB;AAAA,kBACjB,UAAUiL,GAAW,OAAO;AAAA,kBAC5B,YAAYA,GAAW,SAAS;AAAA,kBAChC,WAAWD;AAAA,kBACX,YAAAA;AAAA,gBAAA,CACD,GACD/K,GAAA,GACO,EAAE,SAAS,GAAA;AAAA,cACpB,SAASjP,GAAO;AACd,uBAAO,EAAE,SAAS,IAAO,OAAOA,aAAiB,QAAQA,EAAM,UAAU,oBAAA;AAAA,cAC3E;AAAA,YACF;AAAA,UAAA;AAAA,QAAA,GAGN;AAAA,QACC;AAAA,QACFqV,KAASvC,KAAW,gBAAAzS,EAAC+U,IAAA,EAAM,OAAAC,GAAc,QAAQ,MAAM+C,EAAS,IAAI,EAAA,CAAG;AAAA,MAAA,GAC1E;AAAA,MAGA,gBAAA/X,EAAC,SAAI,WAAU,uCACb,4BAAC,KAAA,EAAE,WAAU,sCAAqC,UAAA,uFAAA,CAAoF,EAAA,CACxI;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF,IAjJkB;AAmJtB;AChYA,SAAwB6Z,GAAiB,EAAE,QAAAlC,KAA+B;AACxE,SACE,gBAAA3X;AAAA,IAAC0X;AAAA,IAAA;AAAA,MACC,QAAAC;AAAA,MACA,SAAS,MAAM;AACb,QAAAmC,GAAuB,MAAA;AAAA,MACzB;AAAA,IAAA;AAAA,EAAA;AAGN;ACHA,IAAIC,IAAmC,MACnC7K,KAAoB,MACpByI,KAAS;AAEb,SAASqC,KAAa;AACpB,EAAKD,MACHA,IAAY,SAAS,cAAc,KAAK,GACxCA,EAAU,KAAK,yBAGf,SAAS,gBAAgB,YAAYA,CAAS,IAE5C,CAAC7K,MAAQ6K,MACX7K,KAAO+K,GAAWF,CAAS;AAE/B;AAEA,SAASG,KAAS;AAChB,EAAAF,GAAA,GACI9K,MACFA,GAAK,OAAOiL,GAAcN,IAAkB,EAAE,QAAAlC,GAAA,CAAQ,CAAC;AAE3D;AAEA,SAASyC,KAAU;AACjB,EAAIlL,MAAQ6K,MACV7K,GAAK,QAAA,GACL6K,EAAU,OAAA,IAEZ7K,KAAO,MACP6K,IAAY;AACd;AASO,MAAMD,KAAoD;AAAA,EAC/D,MAAM,CAACjX,MAAY;AACjB,IAAA8U,KAAS,CAAC,CAAC9U,GAAS,UACpBqX,GAAA;AAAA,EACF;AAAA,EACA,MAAM,MAAM;AACV,IAAAvC,KAAS,IACTuC,GAAA;AAAA,EACF;AAAA,EACA,OAAO,MAAM;AACX,IAAAvC,KAAS,IACTuC,GAAA;AAAA,EACF;AAAA,EACA,SAAAE;AACF;AAQI,OAAO,SAAW,QAAa,OAAO,yBAAyBN;"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/components/Field.tsx","../src/components/TextInput.tsx","../src/components/NumericInput.tsx","../src/components/EmailInput.tsx","../src/components/TelInput.tsx","../src/components/UrlInput.tsx","../src/components/PasswordInput.tsx","../src/components/TextArea.tsx","../src/components/DateInput.tsx","../src/components/Checkbox.tsx","../src/components/Radio.tsx","../src/components/SelectInput.tsx","../src/components/AddressAutocomplete.tsx","../src/utils/form.ts","../src/components/FormRenderer.tsx","../src/utils/gtm.ts","../src/components/FormWizard.tsx","../src/utils/storage.ts","../src/utils/api.ts","../src/components/Rates.tsx","../src/utils/quoteToFormValues.ts","../src/components/Widget.tsx","../src/internal/WidgetController.tsx","../src/widget.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type FieldProps = {\n id: string;\n label: string;\n hint?: string;\n error?: string;\n required?: boolean;\n className?: string;\n children: ReactNode;\n};\n\nexport function Field({ id, label, hint, error, required, className, children }: FieldProps) {\n return (\n <div className={className}>\n <label htmlFor={id} className=\"form-label\">\n {label} {required && <span className=\"text-red-600\">*</span>}\n </label>\n {children}\n {hint && !error && (\n <p id={`${id}-hint`} className=\"mt-1 text-sm text-slate-500\">\n {hint}\n </p>\n )}\n {error && (\n <p id={`${id}-error`} className=\"mt-1 text-sm text-red-600\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id'>;\n\nexport function TextInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n type=\"text\"\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function NumericInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"number\"\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function EmailInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"email\"\n className={`form-input ${error ? 'input-error' : ''}`}\n inputMode=\"email\"\n autoComplete=\"email\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport type { InputHTMLAttributes, ChangeEvent } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type' | 'value' | 'onChange'> & {\n value?: string;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n };\n\n/**\n * Formats a phone number string to (XXX) XXX - XXXX format\n * Only formats if there are 10 digits (US phone number)\n */\nfunction formatPhoneNumber(value: string): string {\n // Remove all non-digit characters\n const digits = value.replace(/\\D/g, '');\n\n // If we have 10 digits, format as (XXX) XXX - XXXX\n if (digits.length === 10) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)} - ${digits.slice(6)}`;\n }\n\n // If we have more than 10 digits, format the first 10\n if (digits.length > 10) {\n const tenDigits = digits.slice(0, 10);\n return `(${tenDigits.slice(0, 3)}) ${tenDigits.slice(3, 6)} - ${tenDigits.slice(6)}`;\n }\n\n // Partial formatting as user types\n if (digits.length >= 6) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)} - ${digits.slice(6)}`;\n }\n if (digits.length >= 3) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3)}`;\n }\n if (digits.length > 0) {\n return `(${digits}`;\n }\n\n return digits;\n}\n\n/**\n * Extracts only digits from a phone number string\n */\nfunction extractDigits(value: string): string {\n return value.replace(/\\D/g, '');\n}\n\nexport function TelInput({ id, label, hint, error, required, className, value = '', onChange, ...rest }: Props) {\n const [displayValue, setDisplayValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef<number>(0);\n\n // Update display value when prop value changes\n useEffect(() => {\n if (!value) {\n setDisplayValue('');\n return;\n }\n\n // Extract digits, handling cases where value might include +1 or just be digits\n let digits = extractDigits(value);\n\n // If value starts with +1 or 1, remove the leading 1 (country code)\n if (digits.length === 11 && digits.startsWith('1')) {\n digits = digits.slice(1);\n }\n\n // Limit to 10 digits for US phone numbers\n const limitedDigits = digits.slice(0, 10);\n setDisplayValue(formatPhoneNumber(limitedDigits));\n }, [value]);\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const input = e.target;\n const inputValue = input.value;\n\n // Save cursor position before formatting\n cursorPositionRef.current = input.selectionStart || 0;\n\n // Extract digits from input\n const digits = extractDigits(inputValue);\n\n // Limit to 10 digits for US phone numbers\n const limitedDigits = digits.slice(0, 10);\n\n // Format the display value\n const formatted = formatPhoneNumber(limitedDigits);\n setDisplayValue(formatted);\n\n // Create a synthetic event with the unformatted digits (with +1 prefix)\n // The actual stored value will be +1 followed by the 10 digits\n const rawValue = limitedDigits.length === 10 ? `+1${limitedDigits}` : limitedDigits;\n\n // Create a new event with the raw value\n const syntheticEvent = {\n ...e,\n currentTarget: {\n ...e.currentTarget,\n value: rawValue\n },\n target: {\n ...e.target,\n value: rawValue\n }\n } as ChangeEvent<HTMLInputElement>;\n\n // Call the original onChange with the raw value\n onChange?.(syntheticEvent);\n\n // Restore cursor position after a short delay to allow React to update\n setTimeout(() => {\n if (inputRef.current) {\n // Calculate new cursor position based on formatting\n const beforeCursor = inputValue.slice(0, cursorPositionRef.current);\n const digitsBeforeCursor = extractDigits(beforeCursor);\n const formattedBeforeCursor = formatPhoneNumber(digitsBeforeCursor);\n // Position cursor at the end of the formatted text that corresponds to the digits before cursor\n const newPosition = Math.min(formattedBeforeCursor.length, formatted.length);\n inputRef.current.setSelectionRange(newPosition, newPosition);\n }\n }, 0);\n };\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <div\n className={`tel-input-wrapper flex items-center border rounded-lg transition-colors w-full relative ${\n error ? 'border-red-500 error' : 'border-[var(--accent-color)] focus-within:border-[var(--primary-color)]'\n }`}\n >\n <label\n htmlFor={id}\n className=\"px-3 py-3 text-slate-700 font-medium border-r border-[var(--accent-color)] bg-slate-50 flex-shrink-0 relative z-0 rounded-l-lg\"\n >\n +1\n </label>\n <input\n ref={inputRef}\n id={id}\n type=\"tel\"\n className={`flex-1 px-4 py-3 border-0 rounded-r-lg outline-none bg-transparent text-[var(--text-primary)] text-base ${\n error ? 'input-error' : ''\n }`}\n inputMode=\"tel\"\n autoComplete=\"tel\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n value={displayValue}\n onChange={handleChange}\n {...rest}\n />\n </div>\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function UrlInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"url\"\n className={`form-input ${error ? 'input-error' : ''}`}\n inputMode=\"url\"\n autoComplete=\"url\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function PasswordInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"password\"\n className={`form-input ${error ? 'input-error' : ''}`}\n autoComplete=\"current-password\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import type { TextareaHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'id'>;\n\nexport function TextArea({ id, label, hint, error, required, className, rows = 4, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <textarea\n id={id}\n rows={rows}\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function DateInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"date\"\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\n\ntype Props = {\n id: string;\n label: string;\n className?: string;\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'id'>;\n\nexport function Checkbox({ id, label, className, ...rest }: Props) {\n return (\n <label className={`checkbox-card ${className || ''}`} htmlFor={id}>\n <input id={id} type=\"checkbox\" className=\"checkbox-input\" {...rest} />\n <span className=\"checkbox-label\">{label}</span>\n </label>\n );\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react';\n\nexport function Radio({\n name,\n value,\n checked,\n onChange,\n children\n}: {\n name: string;\n value: string;\n checked?: boolean;\n onChange?: InputHTMLAttributes<HTMLInputElement>['onChange'];\n children: ReactNode;\n}) {\n return (\n <label className=\"radio-card\">\n <input className=\"radio-input\" type=\"radio\" name={name} value={value} checked={checked} onChange={onChange} />\n <span className=\"radio-label\">{children}</span>\n </label>\n );\n}\n\nexport function RadioGroup({\n legend,\n children,\n className,\n legendClassName // NEW\n}: {\n legend: string;\n className?: string; // still applies to <fieldset>\n legendClassName?: string; // NEW: applies to <legend>\n children: ReactNode;\n}) {\n return (\n <fieldset className={className}>\n <legend className={`mb-4 text-base font-medium ${legendClassName || ''}`} style={{ color: 'var(--text-primary)' }}>\n {legend}\n </legend>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">{children}</div>\n </fieldset>\n );\n}\n","import type { SelectHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\nexport type SelectOption = {\n value: string;\n label: string;\n disabled?: boolean;\n};\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<SelectHTMLAttributes<HTMLSelectElement>, 'id'> & {\n /** If provided, renders a disabled first option prompting selection */\n placeholder?: string;\n /** Provide options as data (or pass custom children instead) */\n options?: SelectOption[];\n };\n\nexport function SelectInput({ id, label, hint, error, required, className, placeholder, options, children, ...rest }: Props) {\n const describedBy = [hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined;\n\n const hasCustomChildren = !!children;\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <select\n id={id}\n className={`form-input select-caret ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={describedBy}\n required={required}\n {...rest}\n >\n {placeholder && (\n <option value=\"\" disabled selected={!('value' in rest)}>\n {placeholder}\n </option>\n )}\n\n {hasCustomChildren\n ? children\n : options?.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n </select>\n </Field>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\n// cspell:disable-next-line\nconst GOOGLE_MAPS_API_KEY = 'AIzaSyDjLdKLxoa-maLNGAyq_I_2r_Fe_TzFikw';\n\ntype AddressComponents = {\n streetNumber?: string;\n streetName?: string;\n city?: string;\n state?: string;\n zipCode?: string;\n country?: string;\n fullAddress?: string;\n};\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type' | 'onChange'> & {\n onChange?: (value: string, components?: AddressComponents) => void;\n onPlaceSelect?: (place: google.maps.places.PlaceResult) => void;\n };\n\n// Load Google Maps script dynamically\nfunction loadGoogleMapsScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script is already loaded\n if (window.google?.maps?.places) {\n resolve();\n return;\n }\n\n // Check if script is already being loaded\n const existingScript = document.querySelector('script[src*=\"maps.googleapis.com\"]');\n if (existingScript) {\n existingScript.addEventListener('load', () => resolve());\n existingScript.addEventListener('error', () => reject(new Error('Failed to load Google Maps script')));\n return;\n }\n\n // Create and load the script\n const script = document.createElement('script');\n script.src = `https://maps.googleapis.com/maps/api/js?key=${GOOGLE_MAPS_API_KEY}&libraries=places`;\n script.async = true;\n script.defer = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Google Maps script'));\n document.head.appendChild(script);\n });\n}\n\n// Extract address components from Google Places result\nfunction extractAddressComponents(place: google.maps.places.PlaceResult): AddressComponents {\n const components: AddressComponents = {\n fullAddress: place.formatted_address\n };\n\n if (place.address_components) {\n place.address_components.forEach((component) => {\n const types = component.types;\n\n if (types.includes('street_number')) {\n components.streetNumber = component.long_name;\n }\n if (types.includes('route')) {\n components.streetName = component.long_name;\n }\n if (types.includes('locality')) {\n components.city = component.long_name;\n }\n if (types.includes('administrative_area_level_1')) {\n components.state = component.short_name;\n }\n if (types.includes('postal_code')) {\n components.zipCode = component.long_name;\n }\n if (types.includes('country')) {\n components.country = component.short_name;\n }\n });\n }\n\n return components;\n}\n\nexport function AddressAutocomplete({ id, label, hint, error, required, className, onChange, onPlaceSelect, value, ...rest }: Props) {\n const inputRef = useRef<HTMLInputElement>(null);\n const autocompleteServiceRef = useRef<google.maps.places.AutocompleteService | null>(null);\n const placesServiceRef = useRef<google.maps.places.PlacesService | null>(null);\n const suggestionsContainerRef = useRef<HTMLDivElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [inputValue, setInputValue] = useState((value as string) || '');\n const [suggestions, setSuggestions] = useState<google.maps.places.AutocompletePrediction[]>([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n\n // Use refs for state values used in event handlers to avoid dependency issues\n const suggestionsRef = useRef<google.maps.places.AutocompletePrediction[]>([]);\n const showSuggestionsRef = useRef(false);\n const selectedIndexRef = useRef(-1);\n\n // Keep refs in sync with state\n useEffect(() => {\n suggestionsRef.current = suggestions;\n }, [suggestions]);\n\n useEffect(() => {\n showSuggestionsRef.current = showSuggestions;\n }, [showSuggestions]);\n\n useEffect(() => {\n selectedIndexRef.current = selectedIndex;\n }, [selectedIndex]);\n\n useEffect(() => {\n // Update input value when value prop changes\n if (value !== undefined) {\n setInputValue(String(value));\n }\n }, [value]);\n\n // Debounce timer ref\n const debounceTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n if (!inputRef.current) return;\n\n let isMounted = true;\n\n // Load Google Maps script and initialize services\n loadGoogleMapsScript()\n .then(() => {\n if (!isMounted || !inputRef.current) return;\n\n // Initialize services\n autocompleteServiceRef.current = new google.maps.places.AutocompleteService();\n placesServiceRef.current = new google.maps.places.PlacesService(document.createElement('div'));\n\n setIsLoading(false);\n })\n .catch((err) => {\n console.error('Error loading Google Maps:', err);\n setIsLoading(false);\n });\n\n return () => {\n isMounted = false;\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n // Handle input changes with debouncing\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setInputValue(query);\n onChange?.(query);\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n\n if (query.length < 3) {\n setSuggestions([]);\n setShowSuggestions(false);\n return;\n }\n\n // Debounce API calls\n debounceTimerRef.current = setTimeout(() => {\n if (!autocompleteServiceRef.current) return;\n\n autocompleteServiceRef.current.getPlacePredictions(\n {\n input: query,\n types: ['address']\n },\n (predictions, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK && predictions) {\n setSuggestions(predictions);\n setShowSuggestions(true);\n setSelectedIndex(-1);\n } else {\n setSuggestions([]);\n setShowSuggestions(false);\n }\n }\n );\n }, 300);\n };\n\n // Handle keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!showSuggestionsRef.current || suggestionsRef.current.length === 0) {\n if (e.key === 'Escape') {\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setSelectedIndex((prev) => {\n const newIndex = prev < suggestionsRef.current.length - 1 ? prev + 1 : prev;\n selectedIndexRef.current = newIndex;\n return newIndex;\n });\n break;\n case 'ArrowUp':\n e.preventDefault();\n setSelectedIndex((prev) => {\n const newIndex = prev > 0 ? prev - 1 : -1;\n selectedIndexRef.current = newIndex;\n return newIndex;\n });\n break;\n case 'Enter':\n e.preventDefault();\n if (selectedIndexRef.current >= 0 && selectedIndexRef.current < suggestionsRef.current.length) {\n handleSuggestionClick(suggestionsRef.current[selectedIndexRef.current]);\n }\n break;\n case 'Escape':\n e.preventDefault();\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n break;\n }\n };\n\n // Handle clicks outside to close suggestions\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n suggestionsContainerRef.current &&\n !suggestionsContainerRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n }\n };\n\n if (showSuggestions) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showSuggestions]);\n\n const handleSuggestionClick = (prediction: google.maps.places.AutocompletePrediction) => {\n if (!placesServiceRef.current) return;\n\n placesServiceRef.current.getDetails(\n {\n placeId: prediction.place_id,\n fields: ['address_components', 'formatted_address', 'geometry']\n },\n (place, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK && place) {\n const formattedAddress = place.formatted_address || '';\n setInputValue(formattedAddress);\n setShowSuggestions(false);\n setSuggestions([]);\n showSuggestionsRef.current = false;\n\n const addressComponents = extractAddressComponents(place);\n\n onChange?.(formattedAddress, addressComponents);\n onPlaceSelect?.(place);\n }\n }\n );\n };\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <div className=\"relative\">\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n className={`form-input ${error ? 'input-error' : ''}`}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n autoComplete=\"street-address\"\n placeholder={rest.placeholder || 'Enter an address'}\n disabled={isLoading || rest.disabled}\n {...rest}\n />\n {isLoading && <p className=\"mt-1 text-sm text-slate-500\">Loading address suggestions...</p>}\n\n {/* Suggestions dropdown */}\n {showSuggestions && suggestions.length > 0 && (\n <div\n ref={suggestionsContainerRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-slate-200 rounded-lg shadow-lg max-h-60 overflow-y-auto\"\n role=\"listbox\"\n >\n {suggestions.map((prediction, index) => (\n <div\n key={prediction.place_id}\n className={`px-4 py-3 cursor-pointer transition-colors ${\n index === selectedIndex ? 'bg-blue-50 text-slate-900' : 'bg-white text-slate-900 hover:bg-slate-50'\n } ${index < suggestions.length - 1 ? 'border-b border-slate-100' : ''}`}\n role=\"option\"\n aria-selected={index === selectedIndex}\n onClick={() => handleSuggestionClick(prediction)}\n onMouseEnter={() => setSelectedIndex(index)}\n >\n <div className=\"font-medium text-slate-900\">{prediction.structured_formatting.main_text}</div>\n {prediction.structured_formatting.secondary_text && (\n <div className=\"text-sm text-slate-500 mt-0.5\">{prediction.structured_formatting.secondary_text}</div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </Field>\n );\n}\n","import type { Question } from '@getcredify/credify-insurance-types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type FormValues = Record<string, any>;\n\n// A single stage (screen) in the wizard\nexport type StageMeta<K extends string = string> = {\n key: string; // stage id\n title: string; // progress header label\n loadQuestions: () => Promise<ReadonlyArray<Question<K>>>; // lazy loader\n};\n\nexport function slugify(s: string) {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n\nexport function ensureKey<KSelf extends string = string>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n q: Readonly<Question<KSelf, any, any>>,\n idx: number\n): string {\n return (q.key as string | undefined) ?? `${slugify(q.question)}-${idx}`;\n}\n\n// ----- per-stage validation (visible + required) -----\nexport function validateQuestions<KSelf extends string = string>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n questions: ReadonlyArray<Question<KSelf, any, any>>,\n values: Readonly<Record<string, unknown>>\n): Record<string, string | undefined> {\n const errors: Record<string, string | undefined> = {};\n\n const isBlank = (v: unknown) => v === undefined || v === null || (typeof v === 'string' && v.trim() === '');\n\n questions.forEach((q, i) => {\n const key = ensureKey(q, i);\n const val = values[key];\n\n if (!q.required) return;\n\n switch (q.inputType) {\n case 'checkbox':\n if (val !== true) errors[key] = 'Required';\n break;\n\n case 'radio':\n case 'select':\n if (isBlank(val)) errors[key] = 'Required';\n break;\n\n case 'number':\n // Treat '' / null / undefined as missing; 0 is valid\n if (val === undefined || val === null || (typeof val === 'string' && val.trim() === '')) {\n errors[key] = 'Required';\n }\n break;\n\n case 'date':\n case 'email':\n case 'tel':\n case 'url':\n case 'password':\n case 'text':\n case 'textarea':\n case 'address':\n default:\n if (isBlank(val)) errors[key] = 'Required';\n break;\n }\n });\n\n return errors;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function coerceNumber(v: any) {\n if (v === '' || v === null || v === undefined) return undefined;\n const n = Number(v);\n return Number.isNaN(n) ? undefined : n;\n}\n","import { useMemo, useState, useEffect } from 'react';\n\nimport type { Question } from '@getcredify/credify-insurance-types';\n\nimport {\n TextInput,\n NumericInput,\n EmailInput,\n TelInput,\n UrlInput,\n PasswordInput,\n TextArea,\n DateInput,\n Checkbox,\n Radio,\n RadioGroup,\n SelectInput,\n AddressAutocomplete\n} from './index';\n\nimport { slugify, validateQuestions, coerceNumber, type FormValues } from '../utils/form';\n\n/* ------------------------------------------------------------------ */\n/* Conditional evaluation utilities */\n/* ------------------------------------------------------------------ */\n\ntype ConditionalNode = NonNullable<Question['conditionals']>[number];\n\nfunction toNumber(x: unknown): number | null {\n if (typeof x === 'number' && Number.isFinite(x)) return x;\n if (typeof x === 'string' && x.trim() !== '' && !Number.isNaN(Number(x))) return Number(x);\n return null;\n}\nfunction toTime(x: unknown): number | null {\n if (x instanceof Date && !Number.isNaN(x.getTime())) return x.getTime();\n if (typeof x === 'string') {\n const t = Date.parse(x);\n return Number.isNaN(t) ? null : t;\n }\n return null;\n}\nfunction cmp(a: unknown, b: unknown): number | null {\n const na = toNumber(a),\n nb = toNumber(b);\n if (na != null && nb != null) return na - nb;\n const ta = toTime(a),\n tb = toTime(b);\n if (ta != null && tb != null) return ta - tb;\n if (a == null || b == null) return null;\n return String(a).localeCompare(String(b));\n}\nfunction contains(haystack: unknown, needle: unknown): boolean {\n if (Array.isArray(haystack)) return haystack.some((v) => v === needle);\n if (typeof haystack === 'string') return needle != null && haystack.includes(String(needle));\n return false;\n}\nfunction evalConditional(qValue: unknown, conditionalType: ConditionalNode['conditionalType'], conditionalValue: unknown): boolean {\n switch (conditionalType) {\n case 'equals':\n return qValue === conditionalValue;\n case 'lessThan': {\n const c = cmp(qValue, conditionalValue);\n return c != null && c < 0;\n }\n case 'greaterThan': {\n const c = cmp(qValue, conditionalValue);\n return c != null && c > 0;\n }\n case 'contains':\n return contains(qValue, conditionalValue);\n case 'startsWith':\n return qValue != null && conditionalValue != null && String(qValue).startsWith(String(conditionalValue));\n case 'endsWith':\n return qValue != null && conditionalValue != null && String(qValue).endsWith(String(conditionalValue));\n default:\n return false;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Path helpers (immutable) */\n/* ------------------------------------------------------------------ */\n\ntype ScopePath = Array<string | number>;\n\nfunction getIn(obj: unknown, path: ScopePath): unknown {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return path.reduce((acc: any, key) => (acc == null ? undefined : acc[key]), obj as any);\n}\nfunction setInImmutable<T extends object>(obj: T, path: ScopePath, value: unknown): T {\n if (path.length === 0) return obj;\n const [head, ...tail] = path;\n\n if (tail.length === 0) {\n if (typeof head === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const base = Array.isArray(obj) ? (obj as any[]) : [];\n const arr = base.slice();\n arr[head] = value;\n return arr as unknown as T;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...(obj as any), [head]: value } as T;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const current = (obj as any)?.[head];\n const nextContainer = typeof tail[0] === 'number' ? (Array.isArray(current) ? current : []) : current && typeof current === 'object' ? current : {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const next = setInImmutable(nextContainer as any, tail, value);\n\n if (typeof head === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const base = Array.isArray(obj) ? (obj as any[]) : [];\n const arr = base.slice();\n arr[head] = next;\n return arr as unknown as T;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...(obj as any), [head]: next } as T;\n}\n\n/** Read from a values object using a base scope plus a local key */\nfunction scopedRead(values: FormValues, scope: ScopePath | undefined, key: string) {\n return getIn(values, [...(scope ?? []), key]);\n}\n/** Write immutably to values at scope+key */\nfunction scopedWrite(values: FormValues, scope: ScopePath | undefined, key: string, v: unknown): FormValues {\n return setInImmutable(values, [...(scope ?? []), key], v);\n}\n\nconst ITEMS_SUFFIX = '__items';\nconst itemsKey = (k: string) => `${k}${ITEMS_SUFFIX}`;\n\n/* ------------------------------------------------------------------ */\n/* Key decoration (stable keys) */\n/* ------------------------------------------------------------------ */\n\nfunction decorateKeys(questions: Question[]): Question[] {\n const walk = (list: Question[], pathParts: string[]): Question[] =>\n list.map((q, qi) => {\n const parentPart = pathParts.length ? pathParts.join('__') : 'root';\n const baseKey = (q.key as string) ?? `${parentPart}__q${qi}_${String(q.question).slice(0, 24).replace(/\\W+/g, '-') || 'field'}`;\n\n const conds: readonly ConditionalNode[] = q.conditionals ?? [];\n const nextConds = conds.map((c, ci) => {\n const nested = c.conditionalQuestions\n ? walk(c.conditionalQuestions as unknown as Question[], [...pathParts, `${baseKey}__c${ci}`])\n : undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...c, conditionalQuestions: nested as any };\n });\n\n return { ...q, key: baseKey, conditionals: nextConds };\n });\n\n return walk(questions, []);\n}\n\n/** Coerce any unknown to a safe text input value */\nfunction asTextValue(v: unknown): string {\n if (v == null) return '';\n return typeof v === 'string' ? v : String(v);\n}\n\n/** Coerce to a number-control-safe value */\nfunction asNumberValue(v: unknown): string | number {\n if (v == null) return '';\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n if (typeof v === 'string') return v; // let the user type partial numbers like \"-\"\n return '';\n}\n\n/** Coerce to a select value (string/number/undefined) */\nfunction asSelectValue(v: unknown): string | number {\n if (v == null) return ''; // <-- force empty string, not undefined\n if (typeof v === 'string' || typeof v === 'number') return v;\n return String(v);\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function FormRenderer({\n questions,\n initialValues,\n controlledValues,\n onChangeValues,\n onSubmit\n}: {\n questions: Question[];\n initialValues?: Partial<FormValues>;\n controlledValues?: FormValues;\n onChangeValues?: (values: FormValues) => void;\n onSubmit: (values: FormValues) => void; // called on Enter key\n}) {\n const keyedQuestions = useMemo(() => decorateKeys(questions), [questions]);\n\n const initialUncontrolled: FormValues = useMemo(() => {\n const acc: FormValues = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (initialValues) Object.assign(acc, initialValues as any);\n return acc;\n }, [initialValues]);\n\n const [uncontrolled, setUncontrolled] = useState<FormValues>(initialUncontrolled);\n useEffect(() => {\n setUncontrolled(initialUncontrolled);\n }, [initialUncontrolled]);\n\n // HYBRID CONTROLLED SUPPORT\n const [localShadow, setLocalShadow] = useState<FormValues>({});\n const values: FormValues = useMemo(\n () => ({ ...localShadow, ...(controlledValues ?? uncontrolled) }),\n [localShadow, controlledValues, uncontrolled]\n );\n useEffect(() => {\n if (controlledValues) setLocalShadow((p) => ({ ...p, ...controlledValues }));\n }, [controlledValues]);\n\n const [errors, setErrors] = useState<Record<string, string | undefined>>({});\n\n // single field renderer (aware of scope)\n function renderOne(q: Question, scopePath?: ScopePath) {\n const key = q.key as string;\n const label = q.question;\n const val = scopedRead(values, scopePath, key);\n const error = errors[key];\n\n const set = (v: unknown) => {\n let nextAll = scopedWrite(values, scopePath, key, v);\n\n // If this is a radio button with conditionals, check if any array items need to be cleared\n if (q.inputType === 'radio' && q.conditionals) {\n const conds = q.conditionals ?? [];\n\n // Check each conditional to see if it will become false\n for (const cond of conds) {\n const currentValue = scopedRead(values, scopePath, key);\n const wasActive = evalConditional(currentValue, cond.conditionalType, cond.conditionalValue);\n const willBeActive = evalConditional(v, cond.conditionalType, cond.conditionalValue);\n\n // If this conditional was active but will become inactive, and it has repeatable questions, clear the array\n if (wasActive && !willBeActive && cond.conditionalQuestionsAllowMultiple) {\n const children = (cond.conditionalQuestions ?? []) as unknown as Question[];\n if (children.length > 0) {\n const arrStorageKey = itemsKey(key);\n\n nextAll = setInImmutable(nextAll, [...(scopePath ?? []), arrStorageKey], []);\n\n // Also clear any nested array items that might exist\n const clearNestedArrays = (questionList: Question[], currentScope: ScopePath) => {\n questionList.forEach((childQ) => {\n const childConds = childQ.conditionals ?? [];\n childConds.forEach((childCond) => {\n if (childCond.conditionalQuestionsAllowMultiple) {\n const nestedArrKey = itemsKey(childQ.key as string);\n nextAll = setInImmutable(nextAll, [...currentScope, nestedArrKey], []);\n }\n const grandChildren = (childCond.conditionalQuestions ?? []) as unknown as Question[];\n if (grandChildren.length > 0) {\n clearNestedArrays(grandChildren, currentScope);\n }\n });\n });\n };\n\n clearNestedArrays(children, [...(scopePath ?? []), arrStorageKey]);\n }\n }\n }\n }\n\n if (controlledValues && onChangeValues) onChangeValues(nextAll);\n else setUncontrolled(nextAll);\n setLocalShadow(nextAll);\n };\n\n switch (q.inputType) {\n case 'text':\n return (\n <TextInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'email':\n return (\n <EmailInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'password':\n return (\n <PasswordInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'tel':\n return (\n <>\n <TelInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n {key === 'phone' && (\n <div className=\"mt-3 text-xs text-slate-600 space-y-1\">\n <p>By entering your phone number, you agree to receive a one-time SMS from Credify Insurance with a verification code.</p>\n <p>Message & data rates may apply. One message per request.</p>\n {/* <p>Reply STOP to opt out, HELP for help.</p> */}\n <p>\n See our{' '}\n <a href=\"https://getcredify.com\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"credify-link-underline\">\n Privacy Policy\n </a>{' '}\n and{' '}\n <a href=\"https://getcredify.com\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"credify-link-underline\">\n Terms of Service\n </a>\n .\n </p>\n </div>\n )}\n </>\n );\n case 'url':\n return (\n <UrlInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'number':\n return (\n <NumericInput\n key={key}\n id={key}\n label={label}\n value={asNumberValue(val)}\n onChange={(e) => set(coerceNumber(e.currentTarget.value))}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'textarea':\n return (\n <TextArea\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n rows={4}\n />\n );\n case 'date':\n return (\n <DateInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n\n case 'checkbox': {\n if (q.options) {\n const current: string[] = Array.isArray(val) ? (val as string[]) : [];\n return (\n <div key={key} className=\"space-y-2\">\n <div className=\"form-label\">\n {label}\n {q.required && <span className=\"text-red-600 ml-1\">*</span>}\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {q.options.map((opt) => {\n const idOpt = `${key}-${slugify(opt)}`;\n const checked = current.includes(opt);\n return (\n <Checkbox\n key={idOpt}\n id={idOpt}\n label={opt}\n checked={checked}\n onChange={(e) => {\n const next = new Set(current);\n if (e.currentTarget.checked) next.add(opt);\n else next.delete(opt);\n set(Array.from(next));\n }}\n aria-required={q.required || undefined}\n />\n );\n })}\n </div>\n {error && <p className=\"mt-1 text-sm text-red-600\">{error}</p>}\n </div>\n );\n }\n return (\n <Checkbox\n key={key}\n id={key}\n label={q.required ? `${label} *` : label}\n checked={!!val}\n onChange={(e) => set(e.currentTarget.checked)}\n aria-required={q.required || undefined}\n />\n );\n }\n\n case 'radio': {\n const opts = q.options ?? [];\n // Create a scoped name to avoid conflicts between array items\n const scopedName = scopePath && scopePath.length > 0 ? `${key}__${scopePath.join('__')}` : key;\n return (\n <RadioGroup key={key} legend={label} legendClassName={q.required ? 'legend-required' : undefined}>\n {opts.map((opt) => (\n <Radio key={`${key}-${slugify(opt)}`} name={scopedName} value={opt} checked={val === opt} onChange={() => set(opt)}>\n {opt}\n </Radio>\n ))}\n </RadioGroup>\n );\n }\n\n case 'select': {\n let opts = q.options ?? [];\n // Add special case for `quote_vehicle_id` key\n if (key === 'quote_vehicle_id') {\n opts = controlledValues?.vehicles__items?.map((v: { vin: string }) => v.vin) ?? [];\n }\n return (\n <SelectInput\n key={key}\n id={key}\n label={label}\n aria-required={q.required || undefined}\n error={error}\n value={asSelectValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n placeholder=\"Select an option\"\n options={opts.map((o) => ({ value: o, label: o }))}\n />\n );\n }\n\n case 'address':\n return (\n <AddressAutocomplete\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(address) => set(address)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n\n default:\n return null;\n }\n }\n\n function renderRecursive(list: Question[], scopePath?: ScopePath) {\n return list.map((q, qIndex) => {\n const key = String(q.key);\n const elem = renderOne(q, scopePath);\n\n const conds = q.conditionals ?? [];\n if (!conds.length) return <div key={`wrap-${key}-${qIndex}`}>{elem}</div>;\n\n const v = scopedRead(values, scopePath, key);\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n return (\n <div key={`wrap-${key}-${qIndex}`}>\n {elem}\n\n {branches.map((branch, bi) => {\n const children = (branch.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return null;\n\n // NON-REPEATABLE child branch at current scope\n if (!branch.conditionalQuestionsAllowMultiple) {\n return (\n <div key={`branch-${key}-${bi}`} className=\"mt-3\">\n {renderRecursive(children, scopePath)}\n </div>\n );\n }\n\n // REPEATABLE child branch at current scope\n const arrStorageKey = itemsKey(key);\n const arr: unknown[] = (getIn(values, [...(scopePath ?? []), arrStorageKey]) as unknown[]) ?? [];\n const count = Math.max(1, arr.length || 1);\n\n const pushEmpty = () => {\n const next = setInImmutable(values, [...(scopePath ?? []), arrStorageKey, arr.length], {});\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n const popLast = () => {\n const nextArr = arr.slice(0, Math.max(0, arr.length - 1));\n const next = setInImmutable(values, [...(scopePath ?? []), arrStorageKey], nextArr);\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n const groupIdBase = `${key}__c${bi}`;\n\n return (\n <div key={`branch-${key}-${bi}`} className=\"mt-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-sm font-medium opacity-75\">Add one or more entries</div>\n <div className=\"space-x-2\">\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={pushEmpty}>\n Add another\n </button>\n {count > 1 && (\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={popLast}>\n Remove last\n </button>\n )}\n </div>\n </div>\n\n {Array.from({ length: count }).map((_, idx) => {\n const itemScope: ScopePath = [...(scopePath ?? []), arrStorageKey, idx];\n const groupId = `${groupIdBase}__i${idx}`;\n\n return (\n <div key={`group-${groupId}`} className=\"rounded-lg border p-3 mb-3\">\n <div className=\"text-sm font-semibold mb-2\">Entry #{idx + 1}</div>\n\n {children.map((childQ) => (\n <div key={`${groupId}-${String(childQ.key)}`} className=\"mt-3\">\n {renderOne(childQ, itemScope)}\n\n {/* Nested conditionals under childQ (supports nested repeatables too) */}\n {(() => {\n const childConds = childQ.conditionals ?? [];\n if (!childConds.length) return null;\n\n const childVal = scopedRead(values, itemScope, childQ.key as string);\n const childMatches = childConds.filter((c) => evalConditional(childVal, c.conditionalType, c.conditionalValue));\n const childBranches =\n childMatches.length > 1 && !childMatches.some((m) => m.conditionalQuestionsAllowMultiple)\n ? childMatches.slice(0, 1)\n : childMatches;\n\n return childBranches.map((bc, bci) => {\n const grandChildren = (bc.conditionalQuestions ?? []) as unknown as Question[];\n if (!grandChildren.length) return null;\n\n // NON-REPEATABLE nested branch: same item scope\n if (!bc.conditionalQuestionsAllowMultiple) {\n return (\n <div key={`nested-${groupId}-${bci}`} className=\"mt-3\">\n {renderRecursive(grandChildren, itemScope)}\n </div>\n );\n }\n\n // REPEATABLE nested branch: store under <itemScope> + itemsKey(childQ.key)\n const nestedArrKey = itemsKey(childQ.key as string);\n const nestedArr: unknown[] = (getIn(values, [...itemScope, nestedArrKey]) as unknown[]) ?? [];\n const nestedCount = Math.max(1, nestedArr.length || 1);\n\n const nestedPush = () => {\n const next = setInImmutable(values, [...itemScope, nestedArrKey, nestedArr.length], {});\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n const nestedPop = () => {\n const nextArr = nestedArr.slice(0, Math.max(0, nestedArr.length - 1));\n const next = setInImmutable(values, [...itemScope, nestedArrKey], nextArr);\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n return (\n <div key={`nested-repeat-${groupId}-${bci}`} className=\"mt-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-sm font-medium opacity-75\">Add one or more entries</div>\n <div className=\"space-x-2\">\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={nestedPush}>\n Add another\n </button>\n {nestedCount > 1 && (\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={nestedPop}>\n Remove last\n </button>\n )}\n </div>\n </div>\n\n {Array.from({ length: nestedCount }).map((__, nIdx) => {\n const nestedScope: ScopePath = [...itemScope, nestedArrKey, nIdx];\n return (\n <div key={`nested-item-${groupId}-${bci}-${nIdx}`} className=\"rounded-lg border p-3 mb-3\">\n <div className=\"text-sm font-semibold mb-2\">Entry #{nIdx + 1}</div>\n {renderRecursive(grandChildren, nestedScope)}\n </div>\n );\n })}\n </div>\n );\n });\n })()}\n </div>\n ))}\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n });\n }\n\n // Visible (non-repeatable) only — used for Enter-to-continue validation feedback\n const visibleFlat = useMemo(() => {\n const out: Question[] = [];\n const walk = (list: Question[], scopePath?: ScopePath) => {\n list.forEach((q) => {\n out.push(q);\n const key = String(q.key);\n const conds = q.conditionals ?? [];\n if (!conds.length) return;\n\n const v = scopedRead(values, scopePath, key);\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n branches.forEach((m) => {\n const children = (m.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return;\n if (m.conditionalQuestionsAllowMultiple) return; // item-level handled on wizard side\n walk(children, scopePath);\n });\n });\n };\n walk(keyedQuestions);\n return out;\n }, [keyedQuestions, values]);\n\n function handleSubmit(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault();\n const eMap = validateQuestions(visibleFlat as Question[], values);\n setErrors(eMap);\n\n if (Object.keys(eMap).length > 0) {\n const firstIdx = visibleFlat.findIndex((q) => eMap[q.key as string]);\n if (firstIdx >= 0) document.getElementById(visibleFlat[firstIdx].key as string)?.focus();\n return;\n }\n onSubmit(values);\n }\n\n return (\n <form className=\"space-y-6 px-1\" onSubmit={handleSubmit} noValidate>\n {renderRecursive(keyedQuestions)}\n </form>\n );\n}\n\nexport default FormRenderer;\n","/**\n * Google Tag Manager dataLayer helpers for the Credify Insurance Widget.\n * Pushes events at each step so GTM can trigger tags (e.g. GTM-NK8LGHTQ).\n */\n\nexport const GTM_CONTAINER_ID = 'GTM-NK8LGHTQ';\n\ndeclare global {\n interface Window {\n dataLayer?: Record<string, unknown>[];\n }\n}\n\nfunction getDataLayer(): Record<string, unknown>[] {\n if (typeof window === 'undefined') return [];\n window.dataLayer = window.dataLayer ?? [];\n return window.dataLayer;\n}\n\nexport function pushDataLayerEvent(eventName: string, payload: Record<string, unknown> = {}): void {\n const dataLayer = getDataLayer();\n dataLayer.push({\n event: eventName,\n credifyWidget: {\n ...payload,\n containerId: GTM_CONTAINER_ID\n }\n });\n}\n\n/** Widget was opened */\nexport function pushWidgetOpened(): void {\n pushDataLayerEvent('credify_widget_opened');\n}\n\n/** Widget was closed */\nexport function pushWidgetClosed(): void {\n pushDataLayerEvent('credify_widget_closed');\n}\n\n/** User viewed a form stage (step) */\nexport function pushStageViewed(payload: { stageKey: string; stageTitle: string; stepIndex: number; totalSteps: number }): void {\n pushDataLayerEvent('credify_widget_stage_viewed', payload);\n}\n\n/** User completed a form stage (clicked Next successfully) */\nexport function pushStageCompleted(payload: { stageKey: string; stageTitle: string; stepIndex: number; totalSteps: number }): void {\n pushDataLayerEvent('credify_widget_stage_completed', payload);\n}\n\n/** User completed all stages and rates were requested */\nexport function pushFlowCompleted(): void {\n pushDataLayerEvent('credify_widget_flow_completed');\n}\n\n/** User is viewing the rates screen */\nexport function pushRatesViewed(payload?: { rateCount?: number }): void {\n pushDataLayerEvent('credify_widget_rates_viewed', payload ?? {});\n}\n\n/** User clicked Back from the rates screen */\nexport function pushRatesBack(): void {\n pushDataLayerEvent('credify_widget_rates_back');\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { Question } from '@getcredify/credify-insurance-types';\n\nimport { FormRenderer } from './index';\n\nimport { ensureKey, validateQuestions, type StageMeta, type FormValues } from '../utils/form';\nimport { pushStageViewed } from '../utils/gtm';\n\n/* ---------- conditional helpers (mirrors renderer) ---------- */\ntype ConditionalNode = NonNullable<Question['conditionals']>[number];\n\nfunction toNumber(x: unknown): number | null {\n if (typeof x === 'number' && Number.isFinite(x)) return x;\n if (typeof x === 'string' && x.trim() !== '' && !Number.isNaN(Number(x))) return Number(x);\n return null;\n}\nfunction toTime(x: unknown): number | null {\n if (x instanceof Date && !Number.isNaN(x.getTime())) return x.getTime();\n if (typeof x === 'string') {\n const t = Date.parse(x);\n return Number.isNaN(t) ? null : t;\n }\n return null;\n}\nfunction cmp(a: unknown, b: unknown): number | null {\n const na = toNumber(a),\n nb = toNumber(b);\n if (na != null && nb != null) return na - nb;\n const ta = toTime(a),\n tb = toTime(b);\n if (ta != null && tb != null) return ta - tb;\n if (a == null || b == null) return null;\n return String(a).localeCompare(String(b));\n}\nfunction contains(haystack: unknown, needle: unknown): boolean {\n if (Array.isArray(haystack)) return haystack.some((v) => v === needle);\n if (typeof haystack === 'string') return needle != null && haystack.includes(String(needle));\n return false;\n}\nfunction evalConditional(v: unknown, type: ConditionalNode['conditionalType'], rhs: unknown): boolean {\n switch (type) {\n case 'equals':\n return v === rhs;\n case 'lessThan': {\n const c = cmp(v, rhs);\n return c != null && c < 0;\n }\n case 'greaterThan': {\n const c = cmp(v, rhs);\n return c != null && c > 0;\n }\n case 'contains':\n return contains(v, rhs);\n case 'startsWith':\n return v != null && rhs != null && String(v).startsWith(String(rhs));\n case 'endsWith':\n return v != null && rhs != null && String(v).endsWith(String(rhs));\n default:\n return false;\n }\n}\n\n/* ---------- visibility (non-repeatable) ---------- */\nfunction flattenVisibleQuestions(root: ReadonlyArray<Question>, values: FormValues): ReadonlyArray<Question> {\n const out: Question[] = [];\n const walk = (list: ReadonlyArray<Question>) => {\n list.forEach((q) => {\n out.push(q);\n const key = String(q.key);\n const v = values[key];\n const conds = q.conditionals ?? [];\n if (!conds.length) return;\n\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n branches.forEach((m) => {\n const children = (m.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return;\n if (m.conditionalQuestionsAllowMultiple) return; // handled per-item below\n children.forEach((child) => out.push(child));\n });\n });\n };\n walk(root);\n return out;\n}\n\n/* ---------- repeatable validation (any depth) ---------- */\nconst ITEMS_SUFFIX = '__items';\nconst itemsKey = (k: string) => `${k}${ITEMS_SUFFIX}`;\n\nfunction validateRepeatablesRecursive(questions: ReadonlyArray<Question>, valuesAtScope: FormValues): boolean {\n // returns true if any blocking error exists\n for (const q of questions) {\n const qKey = String(q.key);\n const qVal = valuesAtScope[qKey];\n const conds = q.conditionals ?? [];\n if (!conds.length) continue;\n\n const matches = conds.filter((c) => evalConditional(qVal, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n for (const b of branches) {\n const children = (b.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) continue;\n\n if (!b.conditionalQuestionsAllowMultiple) {\n // non-repeatable: keep walking for deeper repeats\n if (validateRepeatablesRecursive(children, valuesAtScope)) return true;\n continue;\n }\n\n // repeatable at this scope\n const arr = (valuesAtScope[itemsKey(qKey)] as unknown[]) ?? [];\n if (arr.length === 0) return true; // must have at least one entry\n\n for (const item of arr as Array<Record<string, unknown>>) {\n // 1) validate required fields for this item's children\n const itemErrors = validateQuestions(children, item as FormValues);\n if (Object.values(itemErrors).some(Boolean)) return true;\n\n // 2) recursively validate nested repeatables within this item\n if (validateRepeatablesRecursive(children, item as FormValues)) return true;\n }\n }\n }\n return false;\n}\n\n/** True when any visible repeatable branch (at any depth) is missing items or has invalid items */\nfunction hasRepeatableBlockingErrors(questions: ReadonlyArray<Question>, rootValues: FormValues): boolean {\n return validateRepeatablesRecursive(questions, rootValues);\n}\n\ntype CompleteCallback = (values: FormValues, stageKey: string) => Promise<{ success: boolean; error?: string }>;\n\n/* -------------------------------- component -------------------------------- */\nexport function FormWizard({\n stages,\n onStageComplete,\n onComplete,\n initialValues,\n initialActive\n}: {\n stages: StageMeta[];\n onStageComplete: CompleteCallback;\n onComplete: CompleteCallback;\n initialValues?: FormValues;\n initialActive?: number;\n}) {\n const [active, setActive] = useState(initialActive ?? 0);\n const [allValues, setAllValues] = useState<FormValues>(initialValues ?? {});\n const [perStageQuestions, setPerStageQuestions] = useState<Record<string, Question[]>>({});\n const [loading, setLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [stageError, setStageError] = useState<string | null>(null);\n const stepRefs = useRef<(HTMLLIElement | null)[]>([]);\n\n const hasStages = Array.isArray(stages) && stages.length > 0;\n const stage = hasStages ? stages[Math.min(active, stages.length - 1)] : null;\n const stageKey = stage?.key ?? null;\n\n // Update active stage when initialActive changes (e.g., when going back from rates)\n useEffect(() => {\n if (initialActive !== undefined) {\n setActive(initialActive);\n }\n }, [initialActive]);\n\n // Scroll active step into view\n useEffect(() => {\n const activeElement = stepRefs.current[active];\n if (activeElement) {\n activeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }, [active]);\n\n // Update form values when initialValues changes (e.g., when going back from rates)\n // Only update if initialValues is provided (not undefined/null)\n useEffect(() => {\n if (initialValues !== undefined) {\n setAllValues(initialValues);\n }\n }, [initialValues]);\n\n useEffect(() => {\n if (!stage || !stageKey) {\n setLoading(false);\n setStageError(null);\n return;\n }\n if (perStageQuestions[stageKey]) {\n setLoading(false);\n setStageError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setStageError(null);\n\n Promise.resolve(stage.loadQuestions())\n .then((qs) => {\n if (cancelled) return;\n if (!Array.isArray(qs)) throw new Error(`loadQuestions(\"${stageKey}\") did not return an array`);\n setPerStageQuestions((m) => ({ ...m, [stageKey]: qs }));\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((err: any) => {\n if (cancelled) return;\n setStageError(`Failed to load stage \"${stage?.title ?? ''}\": ${err?.message ?? 'Unknown error'}`);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [stage, stageKey, perStageQuestions]);\n\n const questions = stageKey ? perStageQuestions[stageKey] : undefined;\n\n // GTM: stage viewed (when questions for this stage have loaded)\n useEffect(() => {\n if (stage && stageKey && questions) {\n pushStageViewed({\n stageKey,\n stageTitle: stage.title ?? stageKey,\n stepIndex: active + 1,\n totalSteps: stages.length\n });\n }\n }, [stageKey, active, stages.length, stage, questions]);\n\n // Values slice for current stage (+ keep any __items arrays)\n const currentValues = useMemo(() => {\n if (!questions) return {};\n const slice: FormValues = {};\n\n // Helper function to recursively collect all nested question keys\n const collectAllQuestionKeys = (questionList: Question[]): string[] => {\n const keys: string[] = [];\n const walk = (list: Question[]) => {\n list.forEach((q, i) => {\n const k = ensureKey(q, i);\n keys.push(k);\n const kItems = itemsKey(k);\n keys.push(kItems);\n\n // Recursively collect keys from conditional questions\n const conds = q.conditionals ?? [];\n conds.forEach((c) => {\n const children = (c.conditionalQuestions ?? []) as unknown as Question[];\n if (children.length > 0) {\n walk(children);\n }\n });\n });\n };\n walk(questionList);\n return keys;\n };\n\n // Get all keys that could be relevant to this stage (including nested conditionals)\n const allRelevantKeys = collectAllQuestionKeys(questions);\n\n // Include values for all relevant keys\n allRelevantKeys.forEach((k) => {\n if (k in allValues) slice[k] = allValues[k];\n });\n // include any orphaned *_ _items keys to keep sub-arrays alive\n for (const [k, v] of Object.entries(allValues)) {\n if (k.endsWith(ITEMS_SUFFIX) && !(k in slice)) slice[k] = v;\n }\n return slice;\n }, [questions, allValues]);\n\n const updateCurrentValues = (next: FormValues) => {\n setAllValues((prev) => ({ ...prev, ...next }));\n };\n\n const goPrev = () => {\n setActive((i) => (i > 0 ? i - 1 : 0));\n document.querySelector<HTMLElement>('.panel-body')?.scrollTo({ top: 0, behavior: 'instant' as ScrollBehavior });\n };\n\n const goNext = async () => {\n if (!questions || !stage || loading || stageError || isSubmitting) return;\n\n // flat (visible, non-repeatable) validation\n const visible = flattenVisibleQuestions(questions, allValues);\n const flatErrors = validateQuestions(visible as Question[], allValues);\n const flatBlock = Object.values(flatErrors).some(Boolean);\n\n // repeatable validation (any depth)\n const repeatBlock = hasRepeatableBlockingErrors(questions, allValues);\n\n if (flatBlock || repeatBlock) return;\n\n setIsSubmitting(true);\n try {\n const nextIndex = Math.min(active + 1, stages.length - 1);\n const isComplete = active >= stages.length - 1;\n const { success, error } = isComplete ? await onComplete(allValues, stageKey ?? '') : await onStageComplete(currentValues, stageKey ?? '');\n if (!success) {\n setStageError(error ?? 'An error occurred');\n return;\n }\n if (!isComplete) setActive(nextIndex);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // LIVE disabled state for the Next button (always rendered)\n const disableNext = useMemo(() => {\n if (!questions || loading || !!stageError || isSubmitting) return true;\n const visible = flattenVisibleQuestions(questions, allValues);\n const flatErrors = validateQuestions(visible as Question[], allValues);\n const flatBlock = Object.values(flatErrors).some(Boolean);\n const repeatBlock = hasRepeatableBlockingErrors(questions, allValues);\n return flatBlock || repeatBlock;\n }, [questions, allValues, loading, stageError, isSubmitting]);\n\n if (!hasStages) return <div className=\"text-slate-600\">Loading...</div>;\n\n return (\n <div className=\"space-y-6\">\n {/* progress header */}\n <div className=\"form-wizard-steps-header flex items-center justify-between gap-4\">\n <ol\n className=\"form-wizard-steps flex gap-2 text-xs overflow-x-auto flex-1 pb-1 scrollbar-hide items-center\"\n style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}\n >\n {stages.flatMap((s, i) => [\n <li\n key={s.key ?? `stage-${i}`}\n ref={(el) => {\n stepRefs.current[i] = el;\n }}\n className={`form-wizard-step-pill px-2.5 py-1 rounded-full border whitespace-nowrap flex-shrink-0 ${\n i < active\n ? 'bg-blue-600 text-white border-blue-600'\n : i === active\n ? 'border-blue-600 text-blue-600 bg-white'\n : 'border-slate-200 text-slate-600'\n }`}\n >\n {s.title}\n </li>,\n ...(i < stages.length - 1\n ? [\n <li key={`arrow-${s.key ?? i}`} className=\"form-wizard-step-arrow text-slate-400 flex-shrink-0\">\n →\n </li>\n ]\n : [])\n ])}\n </ol>\n <div className=\"form-wizard-step-counter text-sm text-slate-500 flex-shrink-0\">\n {Math.min(active + 1, stages.length)} / {stages.length}\n </div>\n </div>\n\n {/* stage content */}\n <div>\n {loading && <div className=\"text-slate-500\">Loading…</div>}\n\n {stage && (\n <FormRenderer\n key={stage.key}\n questions={questions ?? []}\n controlledValues={currentValues}\n onChangeValues={updateCurrentValues}\n onSubmit={() => goNext()} // Enter key advances\n />\n )}\n </div>\n\n {/* error message */}\n {!loading && stageError && (\n <div className=\"text-red-600 text-sm -mt-4\">\n <div>{stageError}</div>\n {stage && (\n <button\n type=\"button\"\n className=\"credify-retry-btn underline mt-1 font-bold\"\n onClick={() => {\n setPerStageQuestions((m) => {\n if (!stageKey) return m;\n const copy = { ...m };\n delete copy[stageKey];\n return copy;\n });\n }}\n >\n Retry\n </button>\n )}\n </div>\n )}\n\n {/* footer (always visible) */}\n <div className={active > 0 ? 'grid grid-cols-2 gap-3' : ''}>\n {active > 0 && (\n <button\n type=\"button\"\n onClick={goPrev}\n disabled={loading}\n className=\"credify-btn-back h-12 rounded-full border border-gray-300 text-text-primary hover:bg-gray-50 transition\"\n >\n Back\n </button>\n )}\n\n <button\n type=\"button\"\n data-widget-ctrl=\"next\"\n onClick={goNext}\n disabled={disableNext}\n className={[\n 'form-wizard-next-btn',\n active > 0 ? '' : 'w-full',\n 'h-12 rounded-full text-white transition',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'flex items-center justify-center gap-2',\n disableNext\n ? 'bg-gray-300'\n : 'bg-blue-600 hover:bg-blue-600/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600/40 bg-primary hover:bg-primary/90 focus-visible:ring-primary/40'\n ].join(' ')}\n >\n {isSubmitting && (\n <svg className=\"animate-spin h-5 w-5 text-white\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n )}\n {active === stages.length - 1 ? 'Finish' : 'Next'}\n </button>\n </div>\n </div>\n );\n}\n\nexport default FormWizard;\n","const QUOTE_ID_KEY = 'credify_quote_id';\nconst AUTH_TOKEN_KEY = 'credify_auth_token';\n\n/**\n * Save quoteId to localStorage\n */\nexport function saveQuoteId(quoteId: string): void {\n try {\n localStorage.setItem(QUOTE_ID_KEY, quoteId);\n } catch (error) {\n console.error('Failed to save quoteId to localStorage:', error);\n }\n}\n\n/**\n * Load quoteId from localStorage\n */\nexport function loadQuoteId(): string | null {\n try {\n return localStorage.getItem(QUOTE_ID_KEY);\n } catch (error) {\n console.error('Failed to load quoteId from localStorage:', error);\n return null;\n }\n}\n\n/**\n * Clear quoteId from localStorage\n */\nexport function clearQuoteId(): void {\n try {\n localStorage.removeItem(QUOTE_ID_KEY);\n } catch (error) {\n console.error('Failed to clear quoteId from localStorage:', error);\n }\n}\n\n/**\n * Save authToken to localStorage\n */\nexport function saveAuthToken(token: string): void {\n try {\n localStorage.setItem(AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.error('Failed to save authToken to localStorage:', error);\n }\n}\n\n/**\n * Load authToken from localStorage\n */\nexport function loadAuthToken(): string | null {\n try {\n return localStorage.getItem(AUTH_TOKEN_KEY);\n } catch (error) {\n console.error('Failed to load authToken from localStorage:', error);\n return null;\n }\n}\n\n/**\n * Clear authToken from localStorage\n */\nexport function clearAuthToken(): void {\n try {\n localStorage.removeItem(AUTH_TOKEN_KEY);\n } catch (error) {\n console.error('Failed to clear authToken from localStorage:', error);\n }\n}\n\n/**\n * Clear all quote-related data from localStorage\n */\nexport function clearAllQuoteData(): void {\n clearQuoteId();\n clearAuthToken();\n}\n","import type { Stage, Question, GetRatesResponse } from '@getcredify/credify-insurance-types';\nimport type { Quote } from '@getcredify/credify-insurance-db';\nimport type { FormValues } from './form';\nimport { saveAuthToken, loadAuthToken, clearAuthToken as clearAuthTokenStorage } from './storage';\n\nconst BASE_URL = 'https://api.getcredify.com';\n\n// Store JWT token in memory\nlet authToken: string | null = null;\n\nexport function setAuthToken(token: string): void {\n authToken = token;\n saveAuthToken(token);\n}\n\nexport function getAuthToken(): string | null {\n return authToken;\n}\n\nexport function loadAuthTokenFromStorage(): void {\n const storedToken = loadAuthToken();\n if (storedToken) {\n authToken = storedToken;\n }\n}\n\nexport function clearAuthToken(): void {\n authToken = null;\n clearAuthTokenStorage();\n}\n\nasync function makeAuthenticatedRequest(url: string, body: object): Promise<Response> {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json'\n };\n\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n });\n\n if (!response.ok) {\n let errorMessage = `Request failed with status ${response.status}`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorMessage;\n } catch {\n // If response is not JSON, use status text\n errorMessage = response.statusText || errorMessage;\n }\n const error = new Error(errorMessage) as Error & { statusCode?: number };\n error.statusCode = response.status;\n throw error;\n }\n\n return response;\n}\n\nexport async function getQuestionsByStage(stage: Stage): Promise<{ questions: Question[] }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-questions-by-stage`, { stage });\n const data = await response.json();\n return data;\n}\n\nexport async function getStagesForQuote(): Promise<{ stages: Stage[] }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-stages-for-quote`, {});\n const data = await response.json();\n return data;\n}\n\nexport async function createQuote(phone: string): Promise<{ quoteId: string }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/create-quote`, { phone });\n const data = await response.json();\n if (!data || typeof data !== 'object' || !data.quoteId) {\n throw new Error(`Invalid createQuote response: ${JSON.stringify(data)}`);\n }\n return data;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport async function updateQuote(payload: FormValues & { current_stage?: string }, getRates: boolean, quoteId?: string): Promise<{}> {\n // If we have a token, use it. Otherwise, send quoteId in body (for pre-verification stage)\n // Only include quoteId if it's a valid non-empty string\n const body: { payload: FormValues & { current_stage?: string }; getRates: boolean; quoteId?: string } = { payload, getRates };\n if (quoteId && typeof quoteId === 'string' && quoteId.trim() !== '') {\n body.quoteId = quoteId;\n }\n const response = await makeAuthenticatedRequest(`${BASE_URL}/update-quote`, body);\n const data = await response.json();\n return data;\n}\n\nexport async function verifyQuote(quoteId: string, smsCode: string): Promise<{ isVerified: boolean; token: string | null }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/verify-quote`, { quoteId, smsCode });\n const data = await response.json();\n return data;\n}\n\nexport async function isSupportedState(state: string): Promise<{ isSupported: boolean }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/is-supported-state`, { state });\n const data = await response.json();\n return data;\n}\n\nexport async function getRates(): Promise<{ rates: GetRatesResponse }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-rates`, {});\n const data = await response.json();\n return data;\n}\n\nexport async function getQuote(quoteId?: string): Promise<{ quote: Quote }> {\n // If we have a token, use it. Otherwise, send quoteId in body (for pre-verification stage)\n const body = quoteId ? { quoteId } : {};\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-quote`, body);\n const data = await response.json();\n return data;\n}\n\nexport async function requestBind(quoteRateId: string): Promise<{ success?: boolean }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/request-bind`, { quoteRateId });\n const data = await response.json();\n // Backend returns {} on success, so return it with success: true\n return data && typeof data === 'object' && 'success' in data ? data : { success: true };\n}\n","import { useState, useEffect } from 'react';\n\nimport type { GetRatesResponse } from '@getcredify/credify-insurance-types';\n\nimport { requestBind, loadAuthTokenFromStorage, getAuthToken, clearAuthToken } from '../utils/api';\nimport { clearAllQuoteData } from '../utils/storage';\nimport { pushRatesBack } from '../utils/gtm';\n\nconst currencyFormatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD'\n});\n\ntype RequestStatus = 'idle' | 'loading' | 'success' | 'error';\n\nfunction BackButton({ onBack }: { onBack?: () => void }) {\n const handleBack = () => {\n pushRatesBack();\n onBack?.();\n };\n return (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"credify-btn-back credify-btn-back-rates h-12 rounded-full border border-gray-300 text-text-primary hover:bg-gray-50 transition w-full\"\n >\n Back\n </button>\n );\n}\n\nexport function Rates({ rates, onBack }: { rates: GetRatesResponse; onBack?: () => void }) {\n const hasRates = Array.isArray(rates) && rates.length > 0;\n const [requestStatuses, setRequestStatuses] = useState<Record<string, RequestStatus>>({});\n\n // Load auth token from localStorage when component mounts\n useEffect(() => {\n loadAuthTokenFromStorage();\n }, []);\n\n if (!hasRates) {\n return (\n <section className=\"mt-8\">\n <h3 className=\"text-lg font-semibold text-slate-900\">Rates</h3>\n <p className=\"mt-2 text-sm text-slate-500\">No rates are available at this time.</p>\n {onBack && <BackButton onBack={onBack} />}\n </section>\n );\n }\n\n return (\n <section className=\"mt-8\">\n <h3 className=\"text-lg font-semibold text-slate-900\">Rates</h3>\n <div className=\"mt-4 grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {rates.map((rate) => {\n const premiumDollars = rate.premium_cents / 100;\n const formattedPremium = currencyFormatter.format(premiumDollars);\n const cardKey = rate.quote_rate_id;\n const status = requestStatuses[cardKey] ?? 'idle';\n const isRequesting = status === 'loading';\n const isRequested = status === 'success';\n\n const handleRequestBind = async () => {\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'loading' }));\n try {\n // Ensure auth token is loaded from localStorage before making the request\n loadAuthTokenFromStorage();\n const token = getAuthToken();\n if (!token) {\n throw new Error('Authentication required. Please verify your phone number first.');\n }\n const result = await requestBind(rate.quote_rate_id);\n // Backend returns {} on success, so if we get here without an error, it's successful\n // Check for success property if present, otherwise assume success if no error\n const success = result?.success !== false;\n if (!success) throw new Error('Request failed');\n\n // Clear all quote data from localStorage and memory so user starts fresh on return\n clearAllQuoteData();\n clearAuthToken();\n\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'success' }));\n } catch {\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'error' }));\n }\n };\n\n return (\n <div key={cardKey} className=\"flex flex-col rounded-xl border border-slate-200 bg-white p-6 shadow-sm transition hover:shadow-md\">\n {/* Carrier Logo and Name */}\n <div className=\"mb-4 flex items-center gap-3\">\n {rate.carrier_logo_base64 ? (\n <img src={`data:image/png;base64,${rate.carrier_logo_base64}`} alt={rate.carrier_name} className=\"h-12 w-auto object-contain\" />\n ) : (\n <div className=\"flex h-12 w-12 items-center justify-center rounded-md bg-slate-100 text-sm font-semibold text-slate-500\">\n {rate.carrier_name.charAt(0).toUpperCase()}\n </div>\n )}\n <div className=\"flex-1\">\n <h4 className=\"font-semibold text-slate-900\">{rate.carrier_name}</h4>\n </div>\n </div>\n\n {/* Premium */}\n <div className=\"mb-2\">\n <p className=\"text-sm text-slate-500\">Premium</p>\n <p className=\"text-2xl font-bold text-slate-900\">{formattedPremium}</p>\n </div>\n\n {/* Term */}\n <div className=\"mb-4\">\n <p className=\"text-sm text-slate-500\">Term</p>\n <p className=\"font-medium text-slate-700\">{rate.term_months} months</p>\n </div>\n\n {/* Carrier Quote ID */}\n {rate.carrier_quote_id && (\n <div className=\"mb-4\">\n <p className=\"text-xs text-slate-400\">Quote ID: {rate.carrier_quote_id}</p>\n </div>\n )}\n\n {/* Request Bind Button */}\n <div className=\"mt-auto pt-4\">\n <button\n type=\"button\"\n onClick={handleRequestBind}\n disabled={isRequesting || isRequested}\n className={`rates-bind-btn w-full rounded-full px-4 py-2.5 text-sm font-semibold transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600/40 disabled:cursor-not-allowed ${\n isRequested ? 'rates-bind-btn-requested' : 'hover:bg-blue-600/90 disabled:bg-slate-300 disabled:text-slate-500'\n }`}\n >\n {isRequesting ? 'Requesting…' : isRequested ? 'Requested' : 'Request Bind'}\n </button>\n {status === 'error' && <p className=\"mt-2 text-xs text-red-600\">Something went wrong. Please try again.</p>}\n {status === 'success' && <p className=\"mt-2 text-xs text-emerald-600\">We received your bind request.</p>}\n </div>\n </div>\n );\n })}\n </div>\n {onBack && <BackButton onBack={onBack} />}\n </section>\n );\n}\n","import type { Quote } from '@getcredify/credify-insurance-db';\nimport type { FormValues } from './form';\n\n/**\n * Convert boolean to \"Yes\"/\"No\" string (reverse of transformFormValues)\n */\nexport function convertBooleanToYesNo(value: boolean | null | undefined): string | undefined {\n if (value === true) return 'Yes';\n if (value === false) return 'No';\n return undefined;\n}\n\n/**\n * Format date to YYYY-MM-DD string format\n */\nexport function formatDate(date: Date | string | null | undefined): string | undefined {\n if (!date) return undefined;\n try {\n const d = typeof date === 'string' ? new Date(date) : date;\n if (isNaN(d.getTime())) return undefined;\n return d.toISOString().split('T')[0];\n } catch {\n return undefined;\n }\n}\n\n/**\n * Transform quote data from database format to form values\n */\nexport function quoteToFormValues(quote: Quote): FormValues {\n const formValues: FormValues = {};\n\n // Root quote fields\n if (quote.phone) formValues.phone = quote.phone;\n if (quote.first_name) formValues.first_name = quote.first_name;\n if (quote.last_name) formValues.last_name = quote.last_name;\n if (quote.email) formValues.email = quote.email;\n if (quote.date_of_birth) formValues.date_of_birth = formatDate(quote.date_of_birth);\n if (quote.product) formValues.product = quote.product;\n if (quote.state) formValues.state = quote.state;\n\n // Combine address fields into a single address string\n const addressParts: string[] = [];\n if (quote.line_1) addressParts.push(quote.line_1);\n if (quote.line_2) addressParts.push(quote.line_2);\n if (quote.city) addressParts.push(quote.city);\n if (quote.state) addressParts.push(quote.state);\n if (quote.postal_code) addressParts.push(quote.postal_code);\n if (addressParts.length > 0) {\n formValues.address = addressParts.join(', ');\n }\n\n if (quote.years_at_address !== null && quote.years_at_address !== undefined) formValues.years_at_address = quote.years_at_address;\n if (quote.months_at_address !== null && quote.months_at_address !== undefined) formValues.months_at_address = quote.months_at_address;\n if (quote.move_in_date) formValues.move_in_date = formatDate(quote.move_in_date);\n\n // Combine prior address fields into a single prior_address string\n const priorAddressParts: string[] = [];\n if (quote.prior_line_1) priorAddressParts.push(quote.prior_line_1);\n if (quote.prior_line_2) priorAddressParts.push(quote.prior_line_2);\n if (quote.prior_city) priorAddressParts.push(quote.prior_city);\n if (quote.prior_state) priorAddressParts.push(quote.prior_state);\n if (quote.prior_postal_code) priorAddressParts.push(quote.prior_postal_code);\n if (priorAddressParts.length > 0) {\n formValues.prior_address = priorAddressParts.join(', ');\n }\n\n if (quote.years_at_prior_address !== null && quote.years_at_prior_address !== undefined)\n formValues.years_at_prior_address = quote.years_at_prior_address;\n\n // Auto prior insurance fields\n if (quote.auto_has_prior_insurance !== null && quote.auto_has_prior_insurance !== undefined) {\n formValues.auto_has_prior_insurance = convertBooleanToYesNo(quote.auto_has_prior_insurance);\n }\n if (quote.auto_prior_expiration_date) formValues.auto_prior_expiration_date = formatDate(quote.auto_prior_expiration_date);\n if (quote.auto_prior_carrier_name) formValues.auto_prior_carrier_name = quote.auto_prior_carrier_name;\n if (quote.auto_prior_liability_limit) formValues.auto_prior_liability_limit = quote.auto_prior_liability_limit;\n if (quote.auto_reason_for_no_insurance) formValues.auto_reason_for_no_insurance = quote.auto_reason_for_no_insurance;\n if (quote.auto_prior_years !== null && quote.auto_prior_years !== undefined) formValues.auto_prior_years = quote.auto_prior_years;\n if (quote.auto_prior_months !== null && quote.auto_prior_months !== undefined) formValues.auto_prior_months = quote.auto_prior_months;\n if (quote.auto_continuous_coverage_years !== null && quote.auto_continuous_coverage_years !== undefined) {\n formValues.auto_continuous_coverage_years = quote.auto_continuous_coverage_years;\n }\n if (quote.auto_cancelled_declined_refused_to_renew !== null && quote.auto_cancelled_declined_refused_to_renew !== undefined) {\n formValues.auto_cancelled_declined_refused_to_renew = convertBooleanToYesNo(quote.auto_cancelled_declined_refused_to_renew);\n }\n\n // Home prior insurance fields\n if (quote.home_has_prior_insurance !== null && quote.home_has_prior_insurance !== undefined) {\n formValues.home_has_prior_insurance = convertBooleanToYesNo(quote.home_has_prior_insurance);\n }\n if (quote.home_prior_expiration_date) formValues.home_prior_expiration_date = formatDate(quote.home_prior_expiration_date);\n if (quote.home_prior_carrier_name) formValues.home_prior_carrier_name = quote.home_prior_carrier_name;\n\n // Home property fields\n if (quote.year_built !== null && quote.year_built !== undefined) formValues.year_built = quote.year_built;\n if (quote.number_of_units !== null && quote.number_of_units !== undefined) formValues.number_of_units = quote.number_of_units;\n if (quote.number_of_stories !== null && quote.number_of_stories !== undefined) formValues.number_of_stories = quote.number_of_stories;\n if (quote.number_of_beds !== null && quote.number_of_beds !== undefined) formValues.number_of_beds = quote.number_of_beds;\n if (quote.number_of_full_baths !== null && quote.number_of_full_baths !== undefined) formValues.number_of_full_baths = quote.number_of_full_baths;\n if (quote.number_of_partial_baths !== null && quote.number_of_partial_baths !== undefined) {\n formValues.number_of_partial_baths = quote.number_of_partial_baths;\n }\n if (quote.under_construction !== null && quote.under_construction !== undefined) {\n formValues.under_construction = convertBooleanToYesNo(quote.under_construction);\n }\n if (quote.distance_from_fire_hydrant_ft) formValues.distance_from_fire_hydrant_ft = quote.distance_from_fire_hydrant_ft;\n if (quote.distance_from_fire_station_miles) formValues.distance_from_fire_station_miles = quote.distance_from_fire_station_miles;\n if (quote.architectural_style) formValues.architectural_style = quote.architectural_style;\n if (quote.dwelling_type) formValues.dwelling_type = quote.dwelling_type;\n if (quote.construction_quality) formValues.construction_quality = quote.construction_quality;\n if (quote.located_over_water !== null && quote.located_over_water !== undefined) {\n formValues.located_over_water = quote.located_over_water;\n }\n if (quote.construction_type) formValues.construction_type = quote.construction_type;\n if (quote.exterior_wall_type) formValues.exterior_wall_type = quote.exterior_wall_type;\n if (quote.foundation_type) formValues.foundation_type = quote.foundation_type;\n if (quote.roof_material_type) formValues.roof_material_type = quote.roof_material_type;\n if (quote.year_roof_updated !== null && quote.year_roof_updated !== undefined) formValues.year_roof_updated = quote.year_roof_updated;\n if (quote.heating_type) formValues.heating_type = quote.heating_type;\n if (quote.heating_fuel_type) formValues.heating_fuel_type = quote.heating_fuel_type;\n if (quote.number_of_fireplaces !== null && quote.number_of_fireplaces !== undefined) {\n formValues.number_of_fireplaces = quote.number_of_fireplaces;\n }\n if (quote.basement_type) formValues.basement_type = quote.basement_type;\n if (quote.parking_type) formValues.parking_type = quote.parking_type;\n if (quote.number_of_parking_spaces !== null && quote.number_of_parking_spaces !== undefined) {\n formValues.number_of_parking_spaces = quote.number_of_parking_spaces;\n }\n if (quote.plumbing_type) formValues.plumbing_type = quote.plumbing_type;\n if (quote.pool_type) formValues.pool_type = quote.pool_type;\n if (quote.total_area_sq_ft !== null && quote.total_area_sq_ft !== undefined) formValues.total_area_sq_ft = quote.total_area_sq_ft;\n if (quote.parcel_area_sq_ft !== null && quote.parcel_area_sq_ft !== undefined) formValues.parcel_area_sq_ft = quote.parcel_area_sq_ft;\n if (quote.residence_type) formValues.residence_type = quote.residence_type;\n if (quote.usage_type) formValues.usage_type = quote.usage_type;\n if (quote.household_size !== null && quote.household_size !== undefined) formValues.household_size = quote.household_size;\n if (quote.number_of_mortgagees !== null && quote.number_of_mortgagees !== undefined) {\n formValues.number_of_mortgagees = quote.number_of_mortgagees;\n }\n if (quote.has_dog !== null && quote.has_dog !== undefined) formValues.has_dog = convertBooleanToYesNo(quote.has_dog);\n if (quote.dog_breed_type) formValues.dog_breed_type = quote.dog_breed_type;\n if (quote.number_of_dogs !== null && quote.number_of_dogs !== undefined) formValues.number_of_dogs = quote.number_of_dogs;\n if (quote.has_business_on_premises !== null && quote.has_business_on_premises !== undefined) {\n formValues.has_business_on_premises = convertBooleanToYesNo(quote.has_business_on_premises);\n }\n if (quote.business_class) formValues.business_class = quote.business_class;\n\n // Discount fields\n if (quote.retiree_discount !== null && quote.retiree_discount !== undefined) {\n formValues.retiree_discount = convertBooleanToYesNo(quote.retiree_discount);\n }\n if (quote.gated_community_discount !== null && quote.gated_community_discount !== undefined) {\n formValues.gated_community_discount = convertBooleanToYesNo(quote.gated_community_discount);\n }\n if (quote.multi_policy_discount !== null && quote.multi_policy_discount !== undefined) {\n formValues.multi_policy_discount = convertBooleanToYesNo(quote.multi_policy_discount);\n }\n if (quote.non_smoker_discount !== null && quote.non_smoker_discount !== undefined) {\n formValues.non_smoker_discount = convertBooleanToYesNo(quote.non_smoker_discount);\n }\n if (quote.first_time_buyer_discount !== null && quote.first_time_buyer_discount !== undefined) {\n formValues.first_time_buyer_discount = convertBooleanToYesNo(quote.first_time_buyer_discount);\n }\n\n // Safety features\n if (quote.fire_detection_system !== null && quote.fire_detection_system !== undefined) {\n formValues.fire_detection_system = convertBooleanToYesNo(quote.fire_detection_system);\n }\n if (quote.burglar_alarm_system !== null && quote.burglar_alarm_system !== undefined) {\n formValues.burglar_alarm_system = convertBooleanToYesNo(quote.burglar_alarm_system);\n }\n if (quote.burglar_alarm_system_type) formValues.burglar_alarm_system_type = quote.burglar_alarm_system_type;\n if (quote.smoke_detectors !== null && quote.smoke_detectors !== undefined) {\n formValues.smoke_detectors = convertBooleanToYesNo(quote.smoke_detectors);\n }\n if (quote.sprinkler_system !== null && quote.sprinkler_system !== undefined) {\n formValues.sprinkler_system = convertBooleanToYesNo(quote.sprinkler_system);\n }\n if (quote.sprinkler_system_type) formValues.sprinkler_system_type = quote.sprinkler_system_type;\n if (quote.gas_leakage_detector !== null && quote.gas_leakage_detector !== undefined) {\n formValues.gas_leakage_detector = convertBooleanToYesNo(quote.gas_leakage_detector);\n }\n if (quote.deadbolt_locks !== null && quote.deadbolt_locks !== undefined) {\n formValues.deadbolt_locks = convertBooleanToYesNo(quote.deadbolt_locks);\n }\n if (quote.fire_extinguisher !== null && quote.fire_extinguisher !== undefined) {\n formValues.fire_extinguisher = convertBooleanToYesNo(quote.fire_extinguisher);\n }\n\n // Other boolean fields\n if (quote.order_credit_authorized !== null && quote.order_credit_authorized !== undefined) {\n formValues.order_credit_authorized = convertBooleanToYesNo(quote.order_credit_authorized);\n }\n if (quote.has_health_insurance_auto_accident !== null && quote.has_health_insurance_auto_accident !== undefined) {\n formValues.has_health_insurance_auto_accident = convertBooleanToYesNo(quote.has_health_insurance_auto_accident);\n }\n if (quote.named_insured_foreclosure_repo_bankruptcy !== null && quote.named_insured_foreclosure_repo_bankruptcy !== undefined) {\n formValues.named_insured_foreclosure_repo_bankruptcy = convertBooleanToYesNo(quote.named_insured_foreclosure_repo_bankruptcy);\n }\n if (quote.named_insured_convicted_insurance_fraud !== null && quote.named_insured_convicted_insurance_fraud !== undefined) {\n formValues.named_insured_convicted_insurance_fraud = convertBooleanToYesNo(quote.named_insured_convicted_insurance_fraud);\n }\n\n // Set \"Add Drivers\" checkbox based on whether drivers exist\n if (quote.drivers && quote.drivers.length > 0) {\n formValues.drivers = 'Yes';\n formValues.drivers__items = quote.drivers.map((driver) => {\n const driverValues: FormValues = {};\n if (driver.first_name) driverValues.first_name = driver.first_name;\n if (driver.last_name) driverValues.last_name = driver.last_name;\n if (driver.date_of_birth) driverValues.date_of_birth = formatDate(driver.date_of_birth);\n if (driver.gender) driverValues.gender = driver.gender;\n if (driver.marital_status) driverValues.marital_status = driver.marital_status;\n if (driver.relationship_to_insured) driverValues.relationship_to_insured = driver.relationship_to_insured;\n if (driver.license_state) driverValues.license_state = driver.license_state;\n if (driver.license_status) driverValues.license_status = driver.license_status;\n if (driver.license_number) driverValues.license_number = driver.license_number;\n if (driver.date_first_licensed) driverValues.date_first_licensed = formatDate(driver.date_first_licensed);\n if (driver.education_level) driverValues.education_level = driver.education_level;\n if (driver.occupation) driverValues.occupation = driver.occupation;\n if (driver.industry) driverValues.industry = driver.industry;\n\n // Driver violations\n if (driver.driver_violations && driver.driver_violations.length > 0) {\n driverValues.driver_violations__items = driver.driver_violations.map((violation) => {\n const violationValues: FormValues = {};\n if (violation.code) violationValues.code = violation.code;\n if (violation.occurred_at) violationValues.occurred_at = formatDate(violation.occurred_at);\n return violationValues;\n });\n }\n\n // Driver accidents\n if (driver.driver_accidents && driver.driver_accidents.length > 0) {\n driverValues.driver_accidents__items = driver.driver_accidents.map((accident) => {\n const accidentValues: FormValues = {};\n if (accident.occurred_at) accidentValues.occurred_at = formatDate(accident.occurred_at);\n if (accident.description) accidentValues.description = accident.description;\n if (accident.quote_vehicle_id) accidentValues.quote_vehicle_id = accident.quote_vehicle_id;\n if (accident.property_damage_amount_paid_cents !== null && accident.property_damage_amount_paid_cents !== undefined) {\n accidentValues.property_damage_amount_paid_cents = accident.property_damage_amount_paid_cents;\n }\n if (accident.personal_injury_amount_paid_cents !== null && accident.personal_injury_amount_paid_cents !== undefined) {\n accidentValues.personal_injury_amount_paid_cents = accident.personal_injury_amount_paid_cents;\n }\n return accidentValues;\n });\n }\n\n // Driver losses (nested under driver, using 'losses' association)\n if (driver.losses && driver.losses.length > 0) {\n driverValues.losses = driver.losses.map((loss) => {\n const lossValues: FormValues = {};\n if (loss.description) lossValues.description = loss.description;\n if (loss.date_of_incident) lossValues.date_of_incident = formatDate(loss.date_of_incident);\n if (loss.amount_paid_cents !== null && loss.amount_paid_cents !== undefined) {\n lossValues.amount_paid_cents = loss.amount_paid_cents;\n }\n if (loss.quote_vehicle_id) lossValues.quote_vehicle_id = loss.quote_vehicle_id;\n return lossValues;\n });\n }\n\n return driverValues;\n });\n } else {\n // No drivers exist, set checkbox to 'No'\n formValues.drivers = 'No';\n }\n\n // Set \"Add Vehicles\" checkbox based on whether vehicles exist\n if (quote.vehicles && quote.vehicles.length > 0) {\n formValues.vehicles = 'Yes';\n formValues.vehicles__items = quote.vehicles.map((vehicle) => {\n const vehicleValues: FormValues = {};\n if (vehicle.vin) vehicleValues.vin = vehicle.vin;\n if (vehicle.year !== null && vehicle.year !== undefined) vehicleValues.year = vehicle.year;\n if (vehicle.make) vehicleValues.make = vehicle.make;\n if (vehicle.model) vehicleValues.model = vehicle.model;\n if (vehicle.ownership_type) vehicleValues.ownership_type = vehicle.ownership_type;\n if (vehicle.usage) vehicleValues.usage = vehicle.usage;\n if (vehicle.annual_mileage !== null && vehicle.annual_mileage !== undefined) {\n vehicleValues.annual_mileage = vehicle.annual_mileage;\n }\n if (vehicle.miles_to_work !== null && vehicle.miles_to_work !== undefined) {\n vehicleValues.miles_to_work = vehicle.miles_to_work;\n }\n if (vehicle.percent_to_work !== null && vehicle.percent_to_work !== undefined) {\n vehicleValues.percent_to_work = vehicle.percent_to_work;\n }\n\n // Combine garaging address fields into a single garaging_address string\n const garagingAddressParts: string[] = [];\n if (vehicle.garaging_address_line_1) garagingAddressParts.push(vehicle.garaging_address_line_1);\n if (vehicle.garaging_address_line_2) garagingAddressParts.push(vehicle.garaging_address_line_2);\n if (vehicle.garaging_address_city) garagingAddressParts.push(vehicle.garaging_address_city);\n if (vehicle.garaging_address_state) garagingAddressParts.push(vehicle.garaging_address_state);\n if (vehicle.garaging_address_postal_code) garagingAddressParts.push(vehicle.garaging_address_postal_code);\n if (garagingAddressParts.length > 0) {\n vehicleValues.garaging_address = garagingAddressParts.join(', ');\n }\n\n if (vehicle.anti_theft_type) vehicleValues.anti_theft_type = vehicle.anti_theft_type;\n if (vehicle.passive_restraint_type) vehicleValues.passive_restraint_type = vehicle.passive_restraint_type;\n\n // Vehicle coverages\n if (vehicle.coverages && vehicle.coverages.length > 0) {\n vehicleValues.coverages__items = vehicle.coverages.map((coverage) => {\n const coverageValues: FormValues = {};\n if (coverage.type) coverageValues.type = coverage.type;\n if (coverage.per_person_limit_cents !== null && coverage.per_person_limit_cents !== undefined) {\n coverageValues.per_person_limit_cents = coverage.per_person_limit_cents;\n }\n if (coverage.per_incident_limit_cents !== null && coverage.per_incident_limit_cents !== undefined) {\n coverageValues.per_incident_limit_cents = coverage.per_incident_limit_cents;\n }\n if (coverage.per_incident_limit_percent !== null && coverage.per_incident_limit_percent !== undefined) {\n coverageValues.per_incident_limit_percent = coverage.per_incident_limit_percent;\n }\n if (coverage.per_day_limit_cents !== null && coverage.per_day_limit_cents !== undefined) {\n coverageValues.per_day_limit_cents = coverage.per_day_limit_cents;\n }\n if (coverage.deductible_cents !== null && coverage.deductible_cents !== undefined) {\n coverageValues.deductible_cents = coverage.deductible_cents;\n }\n if (coverage.is_declined !== null && coverage.is_declined !== undefined) {\n coverageValues.is_declined = convertBooleanToYesNo(coverage.is_declined);\n }\n return coverageValues;\n });\n }\n\n // Vehicle lienholders\n if (vehicle.vehicle_lienholders && vehicle.vehicle_lienholders.length > 0) {\n vehicleValues.vehicle_lienholders__items = vehicle.vehicle_lienholders.map((lienholder) => {\n const lienholderValues: FormValues = {};\n if (lienholder.name) lienholderValues.name = lienholder.name;\n if (lienholder.type) lienholderValues.type = lienholder.type;\n if (lienholder.line_1) lienholderValues.line_1 = lienholder.line_1;\n if (lienholder.line_2) lienholderValues.line_2 = lienholder.line_2;\n if (lienholder.city) lienholderValues.city = lienholder.city;\n if (lienholder.state) lienholderValues.state = lienholder.state;\n if (lienholder.postal_code) lienholderValues.postal_code = lienholder.postal_code;\n if (lienholder.phone) lienholderValues.phone = lienholder.phone;\n if (lienholder.fax) lienholderValues.fax = lienholder.fax;\n return lienholderValues;\n });\n }\n\n return vehicleValues;\n });\n } else {\n // No vehicles exist, set checkbox to 'No'\n formValues.vehicles = 'No';\n }\n\n // Home losses array -> home_losses__items\n if (quote.losses && quote.losses.length > 0) {\n formValues.home_losses__items = quote.losses.map((loss) => {\n const lossValues: FormValues = {};\n if (loss.description) lossValues.description = loss.description;\n if (loss.date_of_incident) lossValues.date_of_incident = formatDate(loss.date_of_incident);\n if (loss.amount_paid_cents !== null && loss.amount_paid_cents !== undefined) {\n lossValues.amount_paid_cents = loss.amount_paid_cents;\n }\n return lossValues;\n });\n }\n\n return formValues;\n}\n","import { useEffect, useCallback, useState } from 'react';\n\nimport type { GetRatesResponse, Stage } from '@getcredify/credify-insurance-types';\n\nimport { FormWizard, Rates } from './index';\n\nimport type { StageMeta, FormValues } from '../utils/form';\nimport {\n createQuote,\n getQuestionsByStage,\n getRates,\n getStagesForQuote,\n isSupportedState,\n setAuthToken,\n updateQuote,\n verifyQuote,\n getQuote,\n loadAuthTokenFromStorage,\n getAuthToken,\n clearAuthToken\n} from '../utils/api';\nimport { loadQuoteId, saveQuoteId, clearQuoteId } from '../utils/storage';\nimport { quoteToFormValues } from '../utils/quoteToFormValues';\nimport { pushWidgetOpened, pushWidgetClosed, pushFlowCompleted, pushRatesViewed, pushStageCompleted } from '../utils/gtm';\n\nfunction transformFormValues(values: FormValues): FormValues {\n const transformed: FormValues = {};\n\n // Helper function to convert \"Yes\"/\"No\" to boolean\n const convertYesNoToBoolean = (value: unknown): unknown => {\n if (typeof value === 'string') {\n if (value === 'Yes') return true;\n if (value === 'No') return false;\n }\n return value;\n };\n\n // Get all non-__items keys to determine which fields are in the current stage\n const nonItemsKeys = Object.keys(values).filter((key) => !key.includes('__items'));\n\n // Get all field names that exist within any __items arrays\n const fieldsInArrays = new Set<string>();\n for (const [key, value] of Object.entries(values)) {\n if (key.endsWith('__items') && Array.isArray(value)) {\n value.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n Object.keys(item).forEach((fieldName) => {\n fieldsInArrays.add(fieldName);\n });\n }\n });\n }\n }\n\n for (const [key, value] of Object.entries(values)) {\n if (key.endsWith('__items')) {\n // Convert \"drivers__items\" to \"drivers\" with the array value\n const baseKey = key.replace('__items', '');\n\n // Only include this array if there's a corresponding root-level field with the same name\n // This indicates the array is actively being used in the current stage\n const hasCorrespondingRootField = nonItemsKeys.includes(baseKey);\n\n if (hasCorrespondingRootField) {\n // Recursively transform each item in the array\n const transformedArray = Array.isArray(value) ? value.map((item) => transformFormValues(item as FormValues)) : value;\n transformed[baseKey] = transformedArray;\n }\n } else if (!key.includes('__items')) {\n // Include root-level fields that don't exist in any array items\n // This prevents including fields from previous stages that are now represented in arrays\n if (!fieldsInArrays.has(key)) {\n transformed[key] = convertYesNoToBoolean(value);\n }\n }\n // Skip any other __items related keys that we've already processed\n }\n\n return transformed;\n}\n\nexport default function Widget({ isOpen, onClose }: { isOpen: boolean; onClose: () => void }) {\n const [stages, setStages] = useState<StageMeta[]>([]);\n const [quoteId, setQuoteId] = useState<string | null>(null);\n const [rates, setRates] = useState<GetRatesResponse | null>(null);\n const [savedFormValues, setSavedFormValues] = useState<FormValues | null>(null);\n const [initialActiveStage, setInitialActiveStage] = useState<number | undefined>(undefined);\n const [isRestoringQuote, setIsRestoringQuote] = useState(false);\n\n function mapStagesToStageMetas(stages: Stage[]): StageMeta[] {\n // Map stage keys to human-friendly titles\n const stageTitleMap: Record<string, string> = {\n SMSVerification: 'Verify',\n AutoCurrentCarrier: 'Current Auto Policy',\n HomeCurrentCarrier: 'Current Home Policy'\n };\n\n return stages.map((stage) => ({\n key: stage,\n title: stageTitleMap[stage] || stage,\n loadQuestions: async () => {\n const data = await getQuestionsByStage(stage);\n const qs = data.questions;\n return qs;\n }\n }));\n }\n\n // Restore quote state on mount\n useEffect(() => {\n const restoreQuoteState = async () => {\n try {\n // Load quoteId and authToken from localStorage\n const storedQuoteId = loadQuoteId();\n loadAuthTokenFromStorage();\n\n if (storedQuoteId) {\n setIsRestoringQuote(true);\n setQuoteId(storedQuoteId);\n\n // Try to fetch quote data - use token if available, otherwise send quoteId in body\n try {\n const token = getAuthToken();\n const response = await getQuote(token ? undefined : storedQuoteId);\n\n if (!response || !response.quote) {\n throw new Error('Invalid response from getQuote: missing quote data');\n }\n\n const { quote } = response;\n\n // Find the stage index based on current_stage FIRST\n // This ensures we have the correct stages before setting form values\n const { stages: currentStages } = await getStagesForQuote();\n const stageMetas = mapStagesToStageMetas(currentStages);\n setStages(stageMetas);\n\n // Transform quote data to form values\n try {\n const formValues = quoteToFormValues(quote);\n setSavedFormValues(formValues);\n } catch (transformError) {\n throw new Error(`Failed to transform quote data: ${transformError instanceof Error ? transformError.message : 'Unknown error'}`);\n }\n\n // Set the initial active stage based on current_stage\n if (quote.current_stage) {\n const stageIndex = stageMetas.findIndex((s) => s.key === quote.current_stage);\n if (stageIndex >= 0) {\n setInitialActiveStage(stageIndex);\n } else {\n // If current_stage not found, default to last stage\n setInitialActiveStage(stageMetas.length - 1);\n }\n } else {\n // If no current_stage, default to last stage\n setInitialActiveStage(stageMetas.length - 1);\n }\n } catch (error) {\n // If quote fetch fails, check if it's a 404 (quote not found)\n const apiError = error as Error & { statusCode?: number };\n if (apiError.statusCode === 404) {\n // Quote doesn't exist - clear invalid quoteId and let user start fresh\n clearQuoteId();\n setQuoteId(null);\n } else {\n // Other errors (e.g., token expired) - clear token but keep quoteId\n clearAuthToken();\n // Don't clear quoteId - user can continue and verify SMS again\n }\n } finally {\n setIsRestoringQuote(false);\n }\n } else {\n // No quote to restore, fetch default stages\n const { stages: defaultStages } = await getStagesForQuote();\n setStages(mapStagesToStageMetas(defaultStages));\n }\n } catch {\n // Silently handle restore errors\n setIsRestoringQuote(false);\n }\n };\n\n if (isOpen) {\n restoreQuoteState();\n }\n }, [isOpen]);\n\n // Lock background scroll\n useEffect(() => {\n if (!isOpen) return;\n const { overflow } = document.body.style;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = overflow;\n };\n }, [isOpen]);\n\n // Close on Escape\n const onKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n pushWidgetClosed();\n onClose();\n }\n },\n [onClose]\n );\n useEffect(() => {\n if (!isOpen) return;\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [isOpen, onKeyDown]);\n\n // Clear saved form values and reset state when widget closes\n useEffect(() => {\n if (!isOpen) {\n setSavedFormValues(null);\n setInitialActiveStage(undefined);\n setIsRestoringQuote(false);\n }\n }, [isOpen]);\n\n // GTM: widget opened\n useEffect(() => {\n if (isOpen) pushWidgetOpened();\n }, [isOpen]);\n\n // GTM: rates viewed\n useEffect(() => {\n if (rates && Array.isArray(rates)) pushRatesViewed({ rateCount: rates.length });\n }, [rates]);\n\n if (!isOpen) return null;\n\n const handleClose = () => {\n pushWidgetClosed();\n onClose();\n };\n\n return (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"insurance-modal-title\">\n <div className=\"backdrop\" aria-hidden=\"true\" />\n\n <div className=\"modal-panel bg-white relative w-full max-w-2xl flex flex-col max-h-[90vh] overflow-hidden\" role=\"document\">\n <button\n onClick={handleClose}\n className=\"modal-close-btn absolute top-4 right-4 text-slate-400 hover:text-slate-600 text-xl\"\n aria-label=\"Close\"\n type=\"button\"\n >\n &times;\n </button>\n\n <div className=\"text-center mb-6\">\n <h2 id=\"insurance-modal-title\" className=\"h1-title\">\n Let's get you the best insurance rates.\n </h2>\n <p className=\"p-subtitle\">This should only take a few minutes.</p>\n </div>\n\n {/* The ONLY scrollable area */}\n <div className=\"panel-body flex-1 min-h-0 overflow-y-auto\">\n {!rates && (\n <>\n {isRestoringQuote || stages.length === 0 ? (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"text-slate-600\">Loading...</div>\n </div>\n ) : (\n <FormWizard\n stages={stages}\n initialValues={savedFormValues ?? undefined}\n initialActive={initialActiveStage}\n onStageComplete={async (stageValues, stageKey) => {\n try {\n const transformedValues = transformFormValues(stageValues);\n\n // Get the updated stages first to determine the next stage\n const { stages: newStages } = await getStagesForQuote();\n const stageMetas = mapStagesToStageMetas(newStages);\n setStages(stageMetas);\n\n // Find the next stage after the completed one\n const currentStageIndex = stageMetas.findIndex((s) => s.key === stageKey);\n const currentMeta = stageMetas[currentStageIndex];\n const nextStageIndex = currentStageIndex + 1;\n const nextStage = nextStageIndex < stageMetas.length ? stageMetas[nextStageIndex] : null;\n const nextStageKey = nextStage?.key || stageKey; // If it's the last stage, keep the current one\n\n if (!quoteId) {\n const createQuoteResponse = await createQuote(transformedValues.phone as string);\n const newQuoteId = createQuoteResponse?.quoteId;\n if (!newQuoteId || typeof newQuoteId !== 'string' || newQuoteId.trim() === '') {\n throw new Error(`Failed to create quote - invalid quoteId returned: ${newQuoteId}`);\n }\n setQuoteId(newQuoteId);\n saveQuoteId(newQuoteId);\n // Save next stage as current_stage after creating quote (no token yet, so pass quoteId)\n await updateQuote({ current_stage: nextStageKey }, false, newQuoteId);\n } else if (stageKey === 'SMSVerification') {\n const { isVerified, token } = await verifyQuote(quoteId, transformedValues.sms_code as string);\n if (!isVerified) {\n throw new Error('Invalid SMS code');\n }\n if (token) {\n setAuthToken(token);\n }\n // Save next stage as current_stage after SMS verification (now we have a token)\n await updateQuote({ current_stage: nextStageKey }, false);\n } else if (stageKey === 'State') {\n const { isSupported } = await isSupportedState(transformedValues.state as string);\n if (!isSupported) {\n throw new Error('State is not supported');\n }\n // Include next stage as current_stage in the payload\n // Pass quoteId if we have it but no token (for pre-verification stages)\n const token = getAuthToken();\n await updateQuote({ ...transformedValues, current_stage: nextStageKey }, false, token ? undefined : quoteId);\n } else {\n // Include next stage as current_stage in the payload\n // Pass quoteId if we have it but no token (for pre-verification stages)\n const token = getAuthToken();\n await updateQuote({ ...transformedValues, current_stage: nextStageKey }, false, token ? undefined : quoteId || undefined);\n }\n\n pushStageCompleted({\n stageKey,\n stageTitle: currentMeta?.title ?? stageKey,\n stepIndex: currentStageIndex + 1,\n totalSteps: stageMetas.length\n });\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'An error occurred' };\n }\n }}\n onComplete={async (allValues) => {\n try {\n const transformedValues = transformFormValues(allValues);\n\n if (!quoteId) {\n throw new Error('Quote ID is required');\n }\n await updateQuote(transformedValues, true);\n\n // Save form values so we can restore them when going back\n setSavedFormValues(allValues);\n\n const { rates } = await getRates();\n setRates(rates);\n\n const totalSteps = stages.length;\n const lastStage = stages[totalSteps - 1];\n pushStageCompleted({\n stageKey: lastStage?.key ?? 'unknown',\n stageTitle: lastStage?.title ?? 'unknown',\n stepIndex: totalSteps,\n totalSteps\n });\n pushFlowCompleted();\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'An error occurred' };\n }\n }}\n />\n )}\n </>\n )}{' '}\n {rates && quoteId && <Rates rates={rates} onBack={() => setRates(null)} />}\n </div>\n\n {/* Footer */}\n <div className=\"mt-4 pt-4 border-t border-slate-200\">\n <p className=\"text-center text-sm text-slate-500\">Insurance products offered through Credify Corporation, a licensed insurance agency.</p>\n </div>\n </div>\n </div>\n );\n}\n","import Widget from '../components/Widget';\nimport CredifyInsuranceWidget from '../widget';\n\nexport default function WidgetController({ isOpen }: { isOpen: boolean }) {\n return (\n <Widget\n isOpen={isOpen}\n onClose={() => {\n CredifyInsuranceWidget.close();\n }}\n />\n );\n}\n","/* @refresh skip */\nimport { createElement } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport WidgetController from './internal/WidgetController';\nimport './index.css';\n// CSS is injected at runtime by vite-plugin-css-injected-by-js so the widget always has its styles on any host.\n\ntype InitOptions = { autoOpen?: boolean };\n\nlet container: HTMLDivElement | null = null;\nlet root: Root | null = null;\nlet isOpen = false;\n\nfunction ensureRoot() {\n if (!container) {\n container = document.createElement('div');\n container.id = 'insurance-widget-root';\n // Mount on documentElement so host transforms/filters on body don't make\n // our fixed overlay position relative to body (which would look inline).\n document.documentElement.appendChild(container);\n }\n if (!root && container) {\n root = createRoot(container);\n }\n}\n\nfunction render() {\n ensureRoot();\n if (root) {\n root.render(createElement(WidgetController, { isOpen })); // ⬅️ controlled prop\n }\n}\n\nfunction destroy() {\n if (root && container) {\n root.unmount();\n container.remove();\n }\n root = null;\n container = null;\n}\n\nexport interface CredifyInsuranceWidgetAPI {\n init(options?: InitOptions): void;\n open(): void;\n close(): void;\n destroy(): void;\n}\n\nexport const CredifyInsuranceWidget: CredifyInsuranceWidgetAPI = {\n init: (options) => {\n isOpen = !!options?.autoOpen; // default false\n render();\n },\n open: () => {\n isOpen = true;\n render();\n },\n close: () => {\n isOpen = false;\n render();\n },\n destroy\n};\n\n// expose globally for script-tag usage\ndeclare global {\n interface Window {\n CredifyInsuranceWidget?: CredifyInsuranceWidgetAPI;\n }\n}\nif (typeof window !== 'undefined') window.CredifyInsuranceWidget = CredifyInsuranceWidget;\n\nexport default CredifyInsuranceWidget;\n"],"names":["Field","id","label","hint","error","required","className","children","jsxs","jsx","TextInput","rest","NumericInput","EmailInput","formatPhoneNumber","value","digits","tenDigits","extractDigits","TelInput","onChange","displayValue","setDisplayValue","useState","inputRef","useRef","cursorPositionRef","useEffect","limitedDigits","handleChange","e","input","inputValue","formatted","rawValue","syntheticEvent","beforeCursor","digitsBeforeCursor","formattedBeforeCursor","newPosition","UrlInput","PasswordInput","TextArea","rows","DateInput","Checkbox","Radio","name","checked","RadioGroup","legend","legendClassName","SelectInput","placeholder","options","describedBy","hasCustomChildren","opt","GOOGLE_MAPS_API_KEY","loadGoogleMapsScript","resolve","reject","existingScript","script","extractAddressComponents","place","components","component","types","AddressAutocomplete","onPlaceSelect","autocompleteServiceRef","placesServiceRef","suggestionsContainerRef","isLoading","setIsLoading","setInputValue","suggestions","setSuggestions","showSuggestions","setShowSuggestions","selectedIndex","setSelectedIndex","suggestionsRef","showSuggestionsRef","selectedIndexRef","debounceTimerRef","isMounted","err","handleInputChange","query","predictions","status","handleKeyDown","prev","newIndex","handleSuggestionClick","handleClickOutside","event","prediction","formattedAddress","addressComponents","index","slugify","s","ensureKey","q","idx","validateQuestions","questions","values","errors","isBlank","v","key","val","coerceNumber","n","toNumber","x","toTime","cmp","a","b","na","nb","ta","tb","contains","haystack","needle","evalConditional","qValue","conditionalType","conditionalValue","c","getIn","obj","path","acc","setInImmutable","head","tail","arr","current","nextContainer","next","scopedRead","scope","scopedWrite","ITEMS_SUFFIX","itemsKey","k","decorateKeys","walk","list","pathParts","qi","parentPart","baseKey","nextConds","ci","nested","asTextValue","asNumberValue","asSelectValue","FormRenderer","initialValues","controlledValues","onChangeValues","onSubmit","keyedQuestions","useMemo","initialUncontrolled","uncontrolled","setUncontrolled","localShadow","setLocalShadow","p","setErrors","renderOne","scopePath","set","nextAll","conds","cond","currentValue","wasActive","willBeActive","arrStorageKey","clearNestedArrays","questionList","currentScope","childQ","childCond","nestedArrKey","grandChildren","Fragment","idOpt","opts","scopedName","o","address","renderRecursive","qIndex","elem","matches","branches","branch","bi","count","pushEmpty","popLast","nextArr","groupIdBase","_","itemScope","groupId","childConds","childVal","childMatches","m","bc","bci","nestedArr","nestedCount","nestedPush","nestedPop","__","nIdx","nestedScope","visibleFlat","out","handleSubmit","eMap","firstIdx","GTM_CONTAINER_ID","getDataLayer","pushDataLayerEvent","eventName","payload","pushWidgetOpened","pushWidgetClosed","pushStageViewed","pushStageCompleted","pushFlowCompleted","pushRatesViewed","pushRatesBack","type","rhs","flattenVisibleQuestions","root","child","validateRepeatablesRecursive","valuesAtScope","qKey","qVal","item","itemErrors","hasRepeatableBlockingErrors","rootValues","FormWizard","stages","onStageComplete","onComplete","initialActive","active","setActive","allValues","setAllValues","perStageQuestions","setPerStageQuestions","loading","setLoading","isSubmitting","setIsSubmitting","stageError","setStageError","stepRefs","hasStages","stage","stageKey","activeElement","cancelled","qs","currentValues","slice","keys","i","kItems","updateCurrentValues","goPrev","goNext","visible","flatErrors","flatBlock","repeatBlock","nextIndex","isComplete","success","disableNext","el","copy","QUOTE_ID_KEY","AUTH_TOKEN_KEY","saveQuoteId","quoteId","loadQuoteId","clearQuoteId","saveAuthToken","token","loadAuthToken","clearAuthToken","clearAllQuoteData","BASE_URL","authToken","setAuthToken","getAuthToken","loadAuthTokenFromStorage","storedToken","clearAuthTokenStorage","makeAuthenticatedRequest","url","body","headers","response","errorMessage","getQuestionsByStage","getStagesForQuote","createQuote","phone","data","updateQuote","getRates","verifyQuote","smsCode","isSupportedState","state","getQuote","requestBind","quoteRateId","currencyFormatter","BackButton","onBack","Rates","rates","hasRates","requestStatuses","setRequestStatuses","rate","premiumDollars","formattedPremium","cardKey","isRequesting","isRequested","handleRequestBind","convertBooleanToYesNo","formatDate","date","d","quoteToFormValues","quote","formValues","addressParts","priorAddressParts","driver","driverValues","violation","violationValues","accident","accidentValues","loss","lossValues","vehicle","vehicleValues","garagingAddressParts","coverage","coverageValues","lienholder","lienholderValues","transformFormValues","transformed","convertYesNoToBoolean","nonItemsKeys","fieldsInArrays","fieldName","transformedArray","Widget","isOpen","onClose","setStages","setQuoteId","setRates","savedFormValues","setSavedFormValues","initialActiveStage","setInitialActiveStage","isRestoringQuote","setIsRestoringQuote","mapStagesToStageMetas","stageTitleMap","storedQuoteId","currentStages","stageMetas","transformError","stageIndex","defaultStages","overflow","onKeyDown","useCallback","stageValues","transformedValues","newStages","currentStageIndex","currentMeta","nextStageIndex","nextStageKey","isVerified","isSupported","newQuoteId","totalSteps","lastStage","WidgetController","CredifyInsuranceWidget","container","ensureRoot","createRoot","render","createElement","destroy"],"mappings":"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"}