@waypointjs/core 0.1.4 → 0.1.6

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,"sources":["../src/conditions.ts","../src/tree-resolver.ts","../src/runtime-store.ts","../src/zod-generator.ts","../src/validate-schema.ts","../src/url.ts"],"names":["createStore","persist","createJSONStorage","z"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ConditionGroup, ConditionOperator, ConditionRule } from \"./schema\";\n\n// ---------------------------------------------------------------------------\n// Data context\n// ---------------------------------------------------------------------------\n\n/**\n * All journey data, keyed by stepId then fieldId.\n * Example: { personal: { age: 25, name: \"Alice\" }, billing: { plan: \"pro\" } }\n */\nexport type JourneyData = Record<string, Record<string, unknown>>;\n\n/**\n * External variables injected at runtime.\n * Example: { isPremium: true, userId: \"abc-123\" }\n */\nexport type ExternalVars = Record<string, unknown>;\n\n// ---------------------------------------------------------------------------\n// Path resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves a field path to its value from the data context.\n * - \"stepId.fieldId\" → journey data\n * - \"$ext.varId\" → external variable\n */\nexport function resolveFieldValue(\n path: string,\n data: JourneyData,\n externalVars: ExternalVars\n): unknown {\n if (path.startsWith(\"$ext.\")) {\n const varId = path.slice(5);\n return externalVars[varId];\n }\n\n const dotIndex = path.indexOf(\".\");\n if (dotIndex === -1) return undefined;\n\n const stepId = path.slice(0, dotIndex);\n const fieldId = path.slice(dotIndex + 1);\n return data[stepId]?.[fieldId];\n}\n\n// ---------------------------------------------------------------------------\n// Operator evaluation\n// ---------------------------------------------------------------------------\n\nfunction evaluateOperator(\n operator: ConditionOperator,\n actual: unknown,\n expected: unknown\n): boolean {\n switch (operator) {\n case \"exists\":\n return actual !== undefined && actual !== null && actual !== \"\";\n\n case \"notExists\":\n return actual === undefined || actual === null || actual === \"\";\n\n case \"equals\":\n return actual === expected;\n\n case \"notEquals\":\n return actual !== expected;\n\n case \"greaterThan\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual > expected\n : Number(actual) > Number(expected);\n\n case \"greaterThanOrEqual\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual >= expected\n : Number(actual) >= Number(expected);\n\n case \"lessThan\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual < expected\n : Number(actual) < Number(expected);\n\n case \"lessThanOrEqual\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual <= expected\n : Number(actual) <= Number(expected);\n\n case \"contains\":\n if (typeof actual === \"string\" && typeof expected === \"string\") {\n return actual.includes(expected);\n }\n if (Array.isArray(actual)) {\n return actual.includes(expected);\n }\n return false;\n\n case \"notContains\":\n if (typeof actual === \"string\" && typeof expected === \"string\") {\n return !actual.includes(expected);\n }\n if (Array.isArray(actual)) {\n return !actual.includes(expected);\n }\n return true;\n\n case \"in\":\n return Array.isArray(expected) && expected.includes(actual);\n\n case \"notIn\":\n return Array.isArray(expected) && !expected.includes(actual);\n\n case \"matches\":\n if (typeof actual !== \"string\" || typeof expected !== \"string\") return false;\n try {\n return new RegExp(expected).test(actual);\n } catch {\n return false;\n }\n\n default:\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Rule & group evaluation\n// ---------------------------------------------------------------------------\n\nfunction evaluateRule(\n rule: ConditionRule,\n data: JourneyData,\n externalVars: ExternalVars\n): boolean {\n const actual = resolveFieldValue(rule.field, data, externalVars);\n return evaluateOperator(rule.operator, actual, rule.value);\n}\n\n/**\n * Evaluates a condition group against the current data context.\n * Returns true if the group's conditions are satisfied.\n */\nexport function evaluateConditionGroup(\n group: ConditionGroup,\n data: JourneyData,\n externalVars: ExternalVars\n): boolean {\n const ruleResults = group.rules.map((rule) =>\n evaluateRule(rule, data, externalVars)\n );\n\n const groupResults = (group.groups ?? []).map((subGroup) =>\n evaluateConditionGroup(subGroup, data, externalVars)\n );\n\n const allResults = [...ruleResults, ...groupResults];\n\n if (allResults.length === 0) return true;\n\n return group.combinator === \"and\"\n ? allResults.every(Boolean)\n : allResults.some(Boolean);\n}\n\n/**\n * Convenience: returns true if no condition is defined (always visible),\n * or if the condition group evaluates to true.\n */\nexport function isVisible(\n visibleWhen: ConditionGroup | undefined,\n data: JourneyData,\n externalVars: ExternalVars\n): boolean {\n if (!visibleWhen) return true;\n return evaluateConditionGroup(visibleWhen, data, externalVars);\n}\n","import type { ExternalVariable, FieldDefinition, StepDefinition, WaypointSchema } from \"./schema\";\nimport { type ExternalVars, type JourneyData, isVisible, resolveFieldValue } from \"./conditions\";\n\n// ---------------------------------------------------------------------------\n// Resolved types\n// ---------------------------------------------------------------------------\n\n/** A field after condition evaluation */\nexport interface ResolvedField {\n definition: FieldDefinition;\n /** Whether the field is currently visible */\n visible: boolean;\n /** Whether all dependsOn paths have a non-empty value */\n dependenciesMet: boolean;\n}\n\n/** A step after condition evaluation */\nexport interface ResolvedStep {\n definition: StepDefinition;\n /** Whether this step is currently in the active tree */\n visible: boolean;\n /** Visible fields for this step, in definition order */\n fields: ResolvedField[];\n}\n\n/** Result returned by resolveTree */\nexport interface ResolvedTree {\n /** Ordered list of visible steps */\n steps: ResolvedStep[];\n /** Steps hidden by conditions — data preserved in tmp store */\n hiddenSteps: ResolvedStep[];\n /** Errors: external variables required but missing */\n missingExternalVars: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Dependency check\n// ---------------------------------------------------------------------------\n\nfunction areDependenciesMet(\n dependsOn: string[] | undefined,\n data: JourneyData,\n externalVars: ExternalVars\n): boolean {\n if (!dependsOn || dependsOn.length === 0) return true;\n return dependsOn.every((path) => {\n const value = resolveFieldValue(path, data, externalVars);\n return value !== undefined && value !== null && value !== \"\";\n });\n}\n\n// ---------------------------------------------------------------------------\n// External variable validation\n// ---------------------------------------------------------------------------\n\nfunction findMissingBlockingVars(\n externalVariables: ExternalVariable[] | undefined,\n externalVars: ExternalVars,\n visibleSteps: StepDefinition[]\n): string[] {\n if (!externalVariables || externalVariables.length === 0) return [];\n\n const visibleStepIds = new Set(visibleSteps.map((s) => s.id));\n\n return externalVariables\n .filter((extVar) => {\n if (!extVar.blocking) return false;\n\n // Only check if this variable is actually used by a visible step\n const usedInVisibleStep = extVar.usedIn?.some(\n (ref) => visibleStepIds.has(ref.stepId)\n );\n if (!usedInVisibleStep) return false;\n\n const value = externalVars[extVar.id];\n return value === undefined || value === null;\n })\n .map((extVar) => extVar.id);\n}\n\n// ---------------------------------------------------------------------------\n// Core resolver\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves the journey tree against current data and external variables.\n *\n * - Steps with a falsy `visibleWhen` are moved to `hiddenSteps`\n * - Fields within each visible step are evaluated for visibility and dependencies\n * - Missing blocking external variables are reported\n *\n * This function is pure: same inputs always produce same outputs.\n */\nexport function resolveTree(\n schema: WaypointSchema,\n data: JourneyData,\n externalVars: ExternalVars\n): ResolvedTree {\n const visibleSteps: ResolvedStep[] = [];\n const hiddenSteps: ResolvedStep[] = [];\n\n for (const stepDef of schema.steps) {\n const stepVisible = isVisible(stepDef.visibleWhen, data, externalVars);\n\n const resolvedFields: ResolvedField[] = stepDef.fields.map((fieldDef) => ({\n definition: fieldDef,\n visible: isVisible(fieldDef.visibleWhen, data, externalVars),\n dependenciesMet: areDependenciesMet(fieldDef.dependsOn, data, externalVars),\n }));\n\n const resolvedStep: ResolvedStep = {\n definition: stepDef,\n visible: stepVisible,\n fields: resolvedFields,\n };\n\n if (stepVisible) {\n visibleSteps.push(resolvedStep);\n } else {\n hiddenSteps.push(resolvedStep);\n }\n }\n\n const missingExternalVars = findMissingBlockingVars(\n schema.externalVariables,\n externalVars,\n visibleSteps.map((s) => s.definition)\n );\n\n return {\n steps: visibleSteps,\n hiddenSteps,\n missingExternalVars,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Navigation helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the index of the step with the given id in the resolved (visible) tree.\n * Returns -1 if not found.\n */\nexport function findStepIndex(steps: ResolvedStep[], stepId: string): number {\n return steps.findIndex((s) => s.definition.id === stepId);\n}\n\n/**\n * Returns the next visible step after the given stepId, or undefined if last.\n */\nexport function getNextStep(\n steps: ResolvedStep[],\n currentStepId: string\n): ResolvedStep | undefined {\n const index = findStepIndex(steps, currentStepId);\n if (index === -1 || index === steps.length - 1) return undefined;\n return steps[index + 1];\n}\n\n/**\n * Returns the previous visible step before the given stepId, or undefined if first.\n */\nexport function getPreviousStep(\n steps: ResolvedStep[],\n currentStepId: string\n): ResolvedStep | undefined {\n const index = findStepIndex(steps, currentStepId);\n if (index <= 0) return undefined;\n return steps[index - 1];\n}\n\n/**\n * Calculates progress (0–100) based on the resolved visible tree.\n * Uses the index of the current step in the visible tree.\n */\nexport function calculateProgress(\n steps: ResolvedStep[],\n currentStepId: string\n): number {\n if (steps.length === 0) return 0;\n const index = findStepIndex(steps, currentStepId);\n if (index === -1) return 0;\n return Math.round(((index + 1) / (steps.length + 1)) * 100);\n}\n\n/**\n * Given journey data, finds the deepest step the user can access:\n * the last step in the visible tree for which all visible fields\n * have their dependencies met.\n */\nexport function findLastValidStep(\n steps: ResolvedStep[],\n data: JourneyData,\n _externalVars: ExternalVars\n): ResolvedStep | undefined {\n let lastValid: ResolvedStep | undefined;\n\n for (const step of steps) {\n const visibleFields = step.fields.filter((f) => f.visible);\n const allDepsMet = visibleFields.every((f) => f.dependenciesMet);\n\n // A step is \"reachable\" if all its visible required fields' deps are met\n if (allDepsMet) {\n // Check if the step itself has data filled\n const stepData = data[step.definition.id];\n const hasData =\n stepData !== undefined && Object.keys(stepData).length > 0;\n\n if (hasData || step === steps[0]) {\n lastValid = step;\n } else {\n break;\n }\n } else {\n break;\n }\n }\n\n return lastValid ?? steps[0];\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\n\nimport type { WaypointSchema } from \"./schema\";\nimport {\n resolveTree,\n calculateProgress,\n getNextStep,\n getPreviousStep,\n} from \"./tree-resolver\";\nimport type { ResolvedStep, ResolvedTree } from \"./tree-resolver\";\n\n// ---------------------------------------------------------------------------\n// State + Actions\n// ---------------------------------------------------------------------------\n\nexport interface WaypointRuntimeState {\n schema: WaypointSchema | null;\n /** { stepId: { fieldId: value } } */\n data: Record<string, Record<string, unknown>>;\n /** { varId: value } */\n externalVars: Record<string, unknown>;\n currentStepId: string | null;\n /** Step IDs visited in order */\n history: string[];\n isSubmitting: boolean;\n /** True once onComplete has been called (all steps validated) */\n completed: boolean;\n}\n\nexport interface WaypointRuntimeActions {\n /**\n * Fresh start: sets schema + data and navigates to the first step (or startStepId).\n * Always resets navigation state (currentStepId, history).\n */\n init(\n schema: WaypointSchema,\n options?: {\n data?: Record<string, Record<string, unknown>>;\n externalVars?: Record<string, unknown>;\n startStepId?: string;\n }\n ): void;\n\n /**\n * Resume a previously-started journey.\n * Updates schema + externalVars but preserves data, currentStepId and history\n * as they were persisted (e.g. from localStorage).\n */\n resume(schema: WaypointSchema, externalVars?: Record<string, unknown>): void;\n\n setFieldValue(stepId: string, fieldId: string, value: unknown): void;\n setStepData(stepId: string, data: Record<string, unknown>): void;\n setExternalVar(varId: string, value: unknown): void;\n setCurrentStep(stepId: string): void;\n setIsSubmitting(b: boolean): void;\n setCompleted(b: boolean): void;\n /**\n * Truncates history to include only steps up to and including stepId.\n * Called before navigating forward so stale steps from a previous path are removed.\n */\n truncateHistoryAt(stepId: string): void;\n reset(): void;\n}\n\nexport type WaypointRuntimeStore = WaypointRuntimeState & WaypointRuntimeActions;\n\n// ---------------------------------------------------------------------------\n// What the persist middleware saves to localStorage\n// ---------------------------------------------------------------------------\n\ninterface PersistedSlice {\n /** The schema id that was active — used to detect stale persisted data */\n schemaId: string | null;\n data: WaypointRuntimeState[\"data\"];\n currentStepId: WaypointRuntimeState[\"currentStepId\"];\n history: WaypointRuntimeState[\"history\"];\n completed: WaypointRuntimeState[\"completed\"];\n}\n\n// ---------------------------------------------------------------------------\n// Computed helpers (pure functions — no hooks)\n// ---------------------------------------------------------------------------\n\nexport function getResolvedTree(state: WaypointRuntimeState): ResolvedTree {\n if (!state.schema) {\n return { steps: [], hiddenSteps: [], missingExternalVars: [] };\n }\n return resolveTree(state.schema, state.data, state.externalVars);\n}\n\nexport function getCurrentStep(state: WaypointRuntimeState): ResolvedStep | undefined {\n if (!state.currentStepId) return undefined;\n return getResolvedTree(state).steps.find(\n (s) => s.definition.id === state.currentStepId\n );\n}\n\nexport function getNextStepFromState(state: WaypointRuntimeState): ResolvedStep | undefined {\n if (!state.currentStepId) return undefined;\n const tree = getResolvedTree(state);\n return getNextStep(tree.steps, state.currentStepId);\n}\n\nexport function getPreviousStepFromState(state: WaypointRuntimeState): ResolvedStep | undefined {\n if (!state.currentStepId) return undefined;\n const tree = getResolvedTree(state);\n return getPreviousStep(tree.steps, state.currentStepId);\n}\n\nexport function calculateProgressFromState(state: WaypointRuntimeState): number {\n if (!state.currentStepId) return 0;\n const tree = getResolvedTree(state);\n return calculateProgress(tree.steps, state.currentStepId);\n}\n\nexport function getMissingBlockingVars(state: WaypointRuntimeState): string[] {\n return getResolvedTree(state).missingExternalVars;\n}\n\n// ---------------------------------------------------------------------------\n// Initial state\n// ---------------------------------------------------------------------------\n\nconst initialState: WaypointRuntimeState = {\n schema: null,\n data: {},\n externalVars: {},\n currentStepId: null,\n history: [],\n isSubmitting: false,\n completed: false,\n};\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport interface CreateRuntimeStoreOptions {\n persistenceMode?: string;\n schemaId?: string;\n}\n\nfunction buildStateCreator() {\n return (\n set: (\n partial:\n | Partial<WaypointRuntimeStore>\n | ((state: WaypointRuntimeStore) => Partial<WaypointRuntimeStore>)\n ) => void,\n _get: () => WaypointRuntimeStore\n ): WaypointRuntimeStore => ({\n ...initialState,\n\n init(schema, options = {}) {\n const { data = {}, externalVars = {}, startStepId } = options;\n const firstStepId = startStepId ?? schema.steps[0]?.id ?? null;\n set({\n schema,\n data,\n externalVars,\n currentStepId: firstStepId,\n history: firstStepId ? [firstStepId] : [],\n isSubmitting: false,\n completed: false,\n });\n },\n\n resume(schema, externalVars = {}) {\n // Preserve data, currentStepId, history and completed — only update schema + externalVars.\n set((state) => ({\n schema,\n externalVars: { ...state.externalVars, ...externalVars },\n isSubmitting: false,\n }));\n },\n\n setFieldValue(stepId, fieldId, value) {\n set((state) => ({\n data: {\n ...state.data,\n [stepId]: { ...state.data[stepId], [fieldId]: value },\n },\n }));\n },\n\n setStepData(stepId, data) {\n set((state) => ({\n data: { ...state.data, [stepId]: data },\n }));\n },\n\n setExternalVar(varId, value) {\n set((state) => ({\n externalVars: { ...state.externalVars, [varId]: value },\n }));\n },\n\n setCurrentStep(stepId) {\n set((state) => ({\n currentStepId: stepId,\n history: state.history.includes(stepId)\n ? state.history\n : [...state.history, stepId],\n }));\n },\n\n setIsSubmitting(b) {\n set({ isSubmitting: b });\n },\n\n setCompleted(b) {\n set({ completed: b });\n },\n\n truncateHistoryAt(stepId) {\n set((state) => {\n const idx = state.history.indexOf(stepId);\n if (idx === -1 || idx === state.history.length - 1) return state;\n return { history: state.history.slice(0, idx + 1) };\n });\n },\n\n reset() {\n set(initialState);\n },\n });\n}\n\n/**\n * Creates a new runtime store instance (vanilla Zustand, no React dependency).\n *\n * Each schema gets its own isolated store — multiple `<WaypointRunner>` instances\n * with different schemas can coexist simultaneously without sharing state.\n *\n * @param options.persistenceMode - If \"zustand\", activates localStorage persistence\n * @param options.schemaId - Used to build the persistence key (and to validate resume)\n */\nexport function createRuntimeStore(options: CreateRuntimeStoreOptions = {}) {\n const { persistenceMode, schemaId } = options;\n\n if (persistenceMode === \"zustand\") {\n const storageKey = schemaId\n ? `waypoint-runtime-${schemaId}`\n : \"waypoint-runtime\";\n\n return createStore<WaypointRuntimeStore>()(\n persist(buildStateCreator(), {\n name: storageKey,\n storage: createJSONStorage(() => {\n // SSR-safe: fall back to an in-memory noop if localStorage is unavailable\n if (typeof window === \"undefined\") {\n return {\n getItem: () => null,\n setItem: () => {},\n removeItem: () => {},\n };\n }\n return window.localStorage;\n }),\n partialize: (state): PersistedSlice => ({\n // Persist the schema id so WaypointRunner can verify the saved data\n // belongs to this schema (guards against stale data from a renamed schema).\n schemaId: state.schema?.id ?? null,\n data: state.data,\n currentStepId: state.currentStepId,\n history: state.history,\n completed: state.completed,\n }),\n })\n );\n }\n\n return createStore<WaypointRuntimeStore>()(buildStateCreator());\n}\n\n// ---------------------------------------------------------------------------\n// Resume detection helper (used by WaypointRunner)\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true if the store has valid persisted state for the given schema id.\n * Used by WaypointRunner to decide whether to call `resume()` or `init()`.\n *\n * Relies on the fact that localStorage hydration is synchronous, so by the time\n * the first `useEffect` runs, the persisted slice is already merged into state.\n */\nexport function hasPersistedState(\n store: ReturnType<typeof createRuntimeStore>,\n schemaId: string\n): boolean {\n const state = store.getState();\n // The persist middleware merges the PersistedSlice fields directly onto the state object,\n // adding `schemaId` as an extra field not declared in WaypointRuntimeState.\n const persistedSchemaId = (state as unknown as Record<string, unknown>)[\"schemaId\"] as\n | string\n | null\n | undefined;\n return (\n persistedSchemaId === schemaId &&\n state.currentStepId !== null &&\n !state.completed\n );\n}\n\nexport type RuntimeStore = ReturnType<typeof createRuntimeStore>;\n","import { z } from \"zod\";\n\nimport type { FieldDefinition } from \"./schema\";\nimport type { ResolvedField } from \"./tree-resolver\";\n\n// ---------------------------------------------------------------------------\n// Custom validator registry\n// ---------------------------------------------------------------------------\n\nconst customValidatorRegistry: Record<string, (value: unknown) => boolean> = {};\n\n/**\n * Register a custom validator function by id.\n * Used for ValidationRule type=\"custom\" with a matching customValidatorId.\n */\nexport function registerCustomValidator(\n id: string,\n fn: (value: unknown) => boolean\n): void {\n customValidatorRegistry[id] = fn;\n}\n\n// ---------------------------------------------------------------------------\n// Field schema builder\n// ---------------------------------------------------------------------------\n\nfunction buildFieldSchema(field: FieldDefinition): z.ZodTypeAny {\n const rules = field.validation ?? [];\n const isRequired = rules.some((r) => r.type === \"required\");\n const isNumeric = field.type === \"number\";\n const isCheckbox = field.type === \"checkbox\";\n const isMultiSelect = field.type === \"multiselect\";\n\n if (isCheckbox) {\n const base = z.boolean();\n return isRequired ? base : base.optional();\n }\n\n if (isMultiSelect) {\n const base = z.array(z.string());\n return isRequired ? base.min(1, rules.find((r) => r.type === \"required\")?.message ?? \"Required\") : base.optional();\n }\n\n if (isNumeric) {\n let numSchema = z.coerce.number({\n invalid_type_error: \"Must be a number\",\n });\n\n for (const rule of rules) {\n if (rule.type === \"min\") {\n const n = Number(rule.value);\n if (!isNaN(n)) numSchema = numSchema.gte(n, rule.message) as typeof numSchema;\n } else if (rule.type === \"max\") {\n const n = Number(rule.value);\n if (!isNaN(n)) numSchema = numSchema.lte(n, rule.message) as typeof numSchema;\n }\n }\n\n return isRequired ? numSchema : numSchema.optional();\n }\n\n // String-based fields — build base schema first (ZodString methods only),\n // then apply .refine() transforms last (they return ZodEffects, not ZodString).\n let strSchema = z.string();\n\n const refineRules: Array<{ id: string; message: string }> = [];\n\n for (const rule of rules) {\n switch (rule.type) {\n case \"required\":\n strSchema = strSchema.min(1, rule.message);\n break;\n case \"minLength\": {\n const n = Number(rule.value);\n if (!isNaN(n)) strSchema = strSchema.min(n, rule.message);\n break;\n }\n case \"maxLength\": {\n const n = Number(rule.value);\n if (!isNaN(n)) strSchema = strSchema.max(n, rule.message);\n break;\n }\n case \"email\":\n strSchema = strSchema.email(rule.message);\n break;\n case \"url\":\n strSchema = strSchema.url(rule.message);\n break;\n case \"regex\":\n if (rule.value !== undefined && rule.value !== null) {\n strSchema = strSchema.regex(new RegExp(String(rule.value)), rule.message);\n }\n break;\n case \"custom\":\n if (rule.customValidatorId && customValidatorRegistry[rule.customValidatorId]) {\n refineRules.push({ id: rule.customValidatorId, message: rule.message });\n }\n break;\n }\n }\n\n // Apply optional before refines (ZodString → ZodOptional or keep as ZodString)\n let finalSchema: z.ZodTypeAny = isRequired ? strSchema : strSchema.optional();\n\n // Append custom .refine() calls (return ZodEffects, safe as ZodTypeAny)\n for (const { id, message } of refineRules) {\n finalSchema = finalSchema.refine(\n (val) => Boolean(customValidatorRegistry[id]?.(val)),\n message\n );\n }\n\n return finalSchema;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a Zod object schema from a list of resolved fields.\n *\n * - Only visible fields are included in the schema.\n * - Fields without a `required` validation rule are wrapped in `.optional()`.\n * - Numeric fields use `z.coerce.number()` so string inputs are coerced.\n */\nexport function buildZodSchema(\n fields: ResolvedField[]\n): z.ZodObject<z.ZodRawShape> {\n const shape: z.ZodRawShape = {};\n\n for (const resolvedField of fields) {\n if (!resolvedField.visible) continue;\n shape[resolvedField.definition.id] = buildFieldSchema(resolvedField.definition);\n }\n\n return z.object(shape);\n}\n","/**\n * Runtime validation for WaypointSchema JSON.\n *\n * Validates structure and basic constraints without relying on TypeScript types.\n * Designed to be used at import time (builder) and at boot time (runtime).\n */\n\nimport type { WaypointSchema } from \"./schema\";\n\n// ---------------------------------------------------------------------------\n// Result type\n// ---------------------------------------------------------------------------\n\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SUPPORTED_VERSIONS = [\"1\"] as const;\n\nconst VALID_PERSISTENCE_MODES = new Set([\"zustand\", \"backend-step\", \"backend-manual\"]);\n\nconst VALID_EXT_VAR_TYPES = new Set([\"string\", \"number\", \"boolean\", \"object\"]);\n\nconst VALID_CONDITION_OPERATORS = new Set([\n \"equals\", \"notEquals\",\n \"greaterThan\", \"greaterThanOrEqual\",\n \"lessThan\", \"lessThanOrEqual\",\n \"contains\", \"notContains\",\n \"in\", \"notIn\",\n \"exists\", \"notExists\",\n \"matches\",\n]);\n\nconst VALID_VALIDATION_TYPES = new Set([\n \"required\", \"min\", \"max\", \"minLength\", \"maxLength\", \"email\", \"url\", \"regex\", \"custom\",\n]);\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validates a raw parsed JSON value as a WaypointSchema.\n *\n * Returns `{ valid: true, errors: [] }` when the schema is acceptable.\n * Returns `{ valid: false, errors: [...] }` with a list of human-readable errors otherwise.\n */\nexport function validateSchema(raw: unknown): SchemaValidationResult {\n const errors: string[] = [];\n\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return { valid: false, errors: [\"Root must be a JSON object\"] };\n }\n\n const obj = raw as Record<string, unknown>;\n\n // ── Top-level required fields ────────────────────────────────────────────\n\n // version\n if (!(\"version\" in obj)) {\n errors.push('Missing required field \"version\"');\n } else if (!SUPPORTED_VERSIONS.includes(obj.version as typeof SUPPORTED_VERSIONS[number])) {\n errors.push(`Unsupported version \"${obj.version}\". Supported: ${SUPPORTED_VERSIONS.join(\", \")}`);\n }\n\n // id\n if (!(\"id\" in obj) || typeof obj.id !== \"string\" || !obj.id.trim()) {\n errors.push('Field \"id\" must be a non-empty string');\n }\n\n // name\n if (!(\"name\" in obj) || typeof obj.name !== \"string\" || !obj.name.trim()) {\n errors.push('Field \"name\" must be a non-empty string');\n }\n\n // steps\n if (!(\"steps\" in obj) || !Array.isArray(obj.steps)) {\n errors.push('Field \"steps\" must be an array');\n } else {\n validateSteps(obj.steps, errors);\n }\n\n // persistenceMode (optional)\n if (\"persistenceMode\" in obj && !VALID_PERSISTENCE_MODES.has(obj.persistenceMode as string)) {\n errors.push(\n `Invalid \"persistenceMode\" \"${obj.persistenceMode}\". Must be one of: ${[...VALID_PERSISTENCE_MODES].join(\", \")}`,\n );\n }\n\n // externalVariables (optional)\n if (\"externalVariables\" in obj) {\n if (!Array.isArray(obj.externalVariables)) {\n errors.push('\"externalVariables\" must be an array');\n } else {\n validateExternalVariables(obj.externalVariables, errors);\n }\n }\n\n // customTypes (optional)\n if (\"customTypes\" in obj && !Array.isArray(obj.customTypes)) {\n errors.push('\"customTypes\" must be an array');\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction validateSteps(steps: unknown[], errors: string[]) {\n const seenIds = new Set<string>();\n\n steps.forEach((step, i) => {\n const prefix = `steps[${i}]`;\n\n if (!step || typeof step !== \"object\" || Array.isArray(step)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const s = step as Record<string, unknown>;\n\n // id\n if (typeof s.id !== \"string\" || !s.id.trim()) {\n errors.push(`${prefix}: \"id\" must be a non-empty string`);\n } else if (seenIds.has(s.id)) {\n errors.push(`${prefix}: duplicate step id \"${s.id}\"`);\n } else {\n seenIds.add(s.id);\n }\n\n // title\n if (typeof s.title !== \"string\" || !s.title.trim()) {\n errors.push(`${prefix}: \"title\" must be a non-empty string`);\n }\n\n // url\n if (typeof s.url !== \"string\" || !s.url.trim()) {\n errors.push(`${prefix}: \"url\" must be a non-empty string`);\n }\n\n // fields\n if (!Array.isArray(s.fields)) {\n errors.push(`${prefix}: \"fields\" must be an array`);\n } else {\n validateFields(s.fields, s.id as string, prefix, errors);\n }\n\n // visibleWhen (optional)\n if (\"visibleWhen\" in s) {\n validateConditionGroup(s.visibleWhen, `${prefix}.visibleWhen`, errors);\n }\n });\n}\n\nfunction validateFields(\n fields: unknown[],\n stepId: string,\n parentPrefix: string,\n errors: string[],\n) {\n const seenIds = new Set<string>();\n\n fields.forEach((field, i) => {\n const prefix = `${parentPrefix}.fields[${i}]`;\n\n if (!field || typeof field !== \"object\" || Array.isArray(field)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const f = field as Record<string, unknown>;\n\n // id\n if (typeof f.id !== \"string\" || !f.id.trim()) {\n errors.push(`${prefix}: \"id\" must be a non-empty string`);\n } else if (seenIds.has(f.id)) {\n errors.push(`${prefix}: duplicate field id \"${f.id}\" in step \"${stepId}\"`);\n } else {\n seenIds.add(f.id as string);\n }\n\n // type\n if (typeof f.type !== \"string\" || !f.type.trim()) {\n errors.push(`${prefix}: \"type\" must be a non-empty string`);\n }\n\n // label\n if (typeof f.label !== \"string\" || !f.label.trim()) {\n errors.push(`${prefix}: \"label\" must be a non-empty string`);\n }\n\n // options (optional)\n if (\"options\" in f && !Array.isArray(f.options)) {\n errors.push(`${prefix}: \"options\" must be an array`);\n }\n\n // validation (optional)\n if (\"validation\" in f) {\n if (!Array.isArray(f.validation)) {\n errors.push(`${prefix}: \"validation\" must be an array`);\n } else {\n validateValidationRules(f.validation, prefix, errors);\n }\n }\n\n // dependsOn (optional)\n if (\"dependsOn\" in f) {\n if (!Array.isArray(f.dependsOn)) {\n errors.push(`${prefix}: \"dependsOn\" must be an array`);\n } else {\n for (const dep of f.dependsOn as unknown[]) {\n if (typeof dep !== \"string\") {\n errors.push(`${prefix}: each \"dependsOn\" entry must be a string`);\n }\n }\n }\n }\n\n // visibleWhen (optional)\n if (\"visibleWhen\" in f) {\n validateConditionGroup(f.visibleWhen, `${prefix}.visibleWhen`, errors);\n }\n });\n}\n\nfunction validateConditionGroup(group: unknown, prefix: string, errors: string[]) {\n if (!group || typeof group !== \"object\" || Array.isArray(group)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const g = group as Record<string, unknown>;\n\n if (g.combinator !== \"and\" && g.combinator !== \"or\") {\n errors.push(`${prefix}: \"combinator\" must be \"and\" or \"or\"`);\n }\n\n if (!Array.isArray(g.rules)) {\n errors.push(`${prefix}: \"rules\" must be an array`);\n } else {\n (g.rules as unknown[]).forEach((rule, i) => {\n validateConditionRule(rule, `${prefix}.rules[${i}]`, errors);\n });\n }\n\n if (\"groups\" in g && Array.isArray(g.groups)) {\n (g.groups as unknown[]).forEach((nested, i) => {\n validateConditionGroup(nested, `${prefix}.groups[${i}]`, errors);\n });\n }\n}\n\nfunction validateConditionRule(rule: unknown, prefix: string, errors: string[]) {\n if (!rule || typeof rule !== \"object\" || Array.isArray(rule)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const r = rule as Record<string, unknown>;\n\n if (typeof r.field !== \"string\" || !r.field.trim()) {\n errors.push(`${prefix}: \"field\" must be a non-empty string`);\n }\n\n if (!VALID_CONDITION_OPERATORS.has(r.operator as string)) {\n errors.push(\n `${prefix}: invalid operator \"${r.operator}\". Must be one of: ${[...VALID_CONDITION_OPERATORS].join(\", \")}`,\n );\n }\n}\n\nfunction validateValidationRules(rules: unknown[], parentPrefix: string, errors: string[]) {\n rules.forEach((rule, i) => {\n const prefix = `${parentPrefix}.validation[${i}]`;\n\n if (!rule || typeof rule !== \"object\" || Array.isArray(rule)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const r = rule as Record<string, unknown>;\n\n if (!VALID_VALIDATION_TYPES.has(r.type as string)) {\n errors.push(\n `${prefix}: invalid type \"${r.type}\". Must be one of: ${[...VALID_VALIDATION_TYPES].join(\", \")}`,\n );\n }\n\n if (typeof r.message !== \"string\" || !r.message.trim()) {\n errors.push(`${prefix}: \"message\" must be a non-empty string`);\n }\n });\n}\n\nfunction validateExternalVariables(vars: unknown[], errors: string[]) {\n const seenIds = new Set<string>();\n\n vars.forEach((v, i) => {\n const prefix = `externalVariables[${i}]`;\n\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const ev = v as Record<string, unknown>;\n\n if (typeof ev.id !== \"string\" || !ev.id.trim()) {\n errors.push(`${prefix}: \"id\" must be a non-empty string`);\n } else if (seenIds.has(ev.id)) {\n errors.push(`${prefix}: duplicate external variable id \"${ev.id}\"`);\n } else {\n seenIds.add(ev.id as string);\n }\n\n if (typeof ev.label !== \"string\" || !ev.label.trim()) {\n errors.push(`${prefix}: \"label\" must be a non-empty string`);\n }\n\n if (!VALID_EXT_VAR_TYPES.has(ev.type as string)) {\n errors.push(\n `${prefix}: invalid type \"${ev.type}\". Must be one of: ${[...VALID_EXT_VAR_TYPES].join(\", \")}`,\n );\n }\n\n if (typeof ev.blocking !== \"boolean\") {\n errors.push(`${prefix}: \"blocking\" must be a boolean`);\n }\n });\n}\n\n/**\n * Convenience: assert a schema is valid, throw with all errors if not.\n * Useful in tests or runtime boot checks.\n */\nexport function assertSchema(raw: unknown): asserts raw is WaypointSchema {\n const result = validateSchema(raw);\n if (!result.valid) {\n throw new Error(`Invalid WaypointSchema:\\n${result.errors.map((e) => ` - ${e}`).join(\"\\n\")}`);\n }\n}\n","import type { WaypointParams } from \"./types\";\n\ninterface StepDefinition {\n step: string;\n url: string;\n}\n\n/**\n * Utility class for URL template formatting and validation.\n * Templates use `{{PARAM_NAME}}` syntax.\n *\n * @example\n * URLTemplateEngine.format(\"/users/{{USER_ID}}/posts/{{POST_ID}}\", { USER_ID: \"42\", POST_ID: \"hello\" })\n * // => \"/users/42/posts/hello\"\n */\nexport class URLTemplateEngine {\n private static readonly PLACEHOLDER_PATTERN = /\\{\\{([^}]+)\\}\\}/g;\n\n /**\n * Replace all `{{PARAM}}` placeholders in a template with the provided values.\n * Missing params are left as-is.\n */\n static format(template: string, params: WaypointParams): string {\n return template.replace(this.PLACEHOLDER_PATTERN, (match, key) => {\n const value = params[key];\n if (value === undefined || value === null) {\n console.log(`Waypoint: missing parameter \"${key}\" in URL: ${template}`);\n return match;\n }\n return String(value);\n });\n }\n\n /**\n * Extract all placeholder names from a URL template.\n */\n static extractPlaceholders(template: string): string[] {\n const matches = template.match(this.PLACEHOLDER_PATTERN);\n return matches ? matches.map((m) => m.replace(/[{}]/g, \"\")) : [];\n }\n\n /**\n * Validate that all placeholders in the template have corresponding params.\n */\n static validate(\n template: string,\n params: WaypointParams\n ): { isValid: boolean; missingParams: string[] } {\n const placeholders = this.extractPlaceholders(template);\n const missingParams = placeholders.filter((key) => params[key] === undefined);\n return { isValid: missingParams.length === 0, missingParams };\n }\n}\n\n// ── Private URL matching helpers (used by hooks) ──────────────────────────────\n\nfunction doesPatternMatchURL(pathname: string, urlPattern: string): boolean {\n const regexPattern = urlPattern\n .replace(/\\{\\{([^}]+)\\}\\}/g, \"([^/]+)\")\n .replace(/\\//g, \"\\\\/\");\n return new RegExp(`^${regexPattern}$`).test(pathname);\n}\n\nfunction doesPatternPartiallyMatch(\n pathname: string,\n urlPattern: string\n): boolean {\n const patternBase = urlPattern\n .replace(/\\{\\{[^}]+\\}\\}/g, \"*\")\n .split(\"/\")\n .filter((segment) => segment !== \"*\" && segment !== \"\");\n\n const pathSegments = pathname.split(\"/\").filter((s) => s !== \"\");\n\n let patternIndex = 0;\n for (const seg of pathSegments) {\n if (\n patternIndex < patternBase.length &&\n seg === patternBase[patternIndex]\n ) {\n patternIndex++;\n }\n }\n return patternIndex === patternBase.length;\n}\n\nfunction extractParamsFromPattern(\n pathname: string,\n urlPattern: string\n): WaypointParams {\n const params: WaypointParams = {};\n const placeholders: string[] = [];\n\n const regexPattern = urlPattern.replace(\n /\\{\\{([^}]+)\\}\\}/g,\n (_match, paramName) => {\n placeholders.push(paramName);\n return \"([^/]+)\";\n }\n );\n\n const regex = new RegExp(`^${regexPattern.replace(/\\//g, \"\\\\/\")}$`);\n const matches = pathname.match(regex);\n\n if (matches) {\n for (let i = 1; i < matches.length; i++) {\n const paramName = placeholders[i - 1];\n const paramValue = matches[i];\n if (paramName.includes(\"_ID\") && /^\\d+$/.test(paramValue)) {\n params[paramName] = parseInt(paramValue, 10);\n } else {\n params[paramName] = paramValue;\n }\n }\n }\n\n return params;\n}\n\nexport function findMatchingStep(\n pathname: string,\n allSteps: StepDefinition[]\n): StepDefinition | null {\n for (const step of allSteps) {\n if (doesPatternMatchURL(pathname, step.url)) return step;\n }\n for (const step of allSteps) {\n if (doesPatternPartiallyMatch(pathname, step.url)) return step;\n }\n return null;\n}\n\nexport function extractURLParamsFromTree(\n pathname: string,\n allSteps: StepDefinition[]\n): WaypointParams {\n const matching = findMatchingStep(pathname, allSteps);\n if (!matching) return {};\n return extractParamsFromPattern(pathname, matching.url);\n}\n\nexport function extractOnlyMissingParams(\n pathname: string,\n allSteps: StepDefinition[],\n missingParamNames: string[]\n): WaypointParams {\n if (missingParamNames.length === 0) return {};\n const matching = findMatchingStep(pathname, allSteps);\n if (!matching) return {};\n\n const all = extractParamsFromPattern(pathname, matching.url);\n const filtered: WaypointParams = {};\n for (const name of missingParamNames) {\n if (all[name] !== undefined) filtered[name] = all[name];\n }\n return filtered;\n}\n\nexport function mergeContextParams(\n userParams: WaypointParams = {},\n pathname: string,\n allSteps: StepDefinition[],\n targetURL?: string\n): WaypointParams {\n let urlParams: WaypointParams = {};\n if (targetURL) {\n const required = URLTemplateEngine.extractPlaceholders(targetURL);\n const missing = required.filter((p) => userParams[p] === undefined);\n urlParams = extractOnlyMissingParams(pathname, allSteps, missing);\n } else {\n urlParams = extractURLParamsFromTree(pathname, allSteps);\n }\n return { ...urlParams, ...userParams };\n}\n"]}
1
+ {"version":3,"sources":["../src/conditions.ts","../src/tree-resolver.ts","../src/runtime-store.ts","../src/zod-generator.ts","../src/validate-schema.ts","../src/url.ts"],"names":["stepId","createStore","persist","createJSONStorage","z"],"mappings":";;;;;;;AA4BO,SAAS,iBAAA,CACd,IAAA,EACA,IAAA,EACA,YAAA,EACA,YAAA,EACS;AACT,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAC1B,IAAA,OAAO,aAAa,KAAK,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,KAAK,UAAA,CAAW,QAAQ,KAAK,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AAC1D,IAAA,MAAMA,OAAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC/B,IAAA,OAAO,YAAA,EAAc,QAAA,CAASA,OAAM,CAAA,IAAK,KAAA;AAAA,EAC3C;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACjC,EAAA,IAAI,QAAA,KAAa,IAAI,OAAO,MAAA;AAE5B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA;AACvC,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,GAAI,OAAO,CAAA;AAC/B;AAMA,SAAS,gBAAA,CACP,QAAA,EACA,MAAA,EACA,QAAA,EACS;AACT,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,QAAA;AACH,MAAA,OAAO,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,EAAA;AAAA,IAE/D,KAAK,WAAA;AACH,MAAA,OAAO,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,EAAA;AAAA,IAE/D,KAAK,QAAA;AACH,MAAA,OAAO,MAAA,KAAW,QAAA;AAAA,IAEpB,KAAK,WAAA;AACH,MAAA,OAAO,MAAA,KAAW,QAAA;AAAA,IAEpB,KAAK,aAAA;AACH,MAAA,OAAO,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,GACrD,MAAA,GAAS,QAAA,GACT,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA;AAAA,IAEtC,KAAK,oBAAA;AACH,MAAA,OAAO,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,GACrD,MAAA,IAAU,QAAA,GACV,MAAA,CAAO,MAAM,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,IAEvC,KAAK,UAAA;AACH,MAAA,OAAO,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,GACrD,MAAA,GAAS,QAAA,GACT,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA;AAAA,IAEtC,KAAK,iBAAA;AACH,MAAA,OAAO,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,GACrD,MAAA,IAAU,QAAA,GACV,MAAA,CAAO,MAAM,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,IAEvC,KAAK,UAAA;AACH,MAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,aAAa,QAAA,EAAU;AAC9D,QAAA,OAAO,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,MACjC;AACA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,QAAA,OAAO,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,MACjC;AACA,MAAA,OAAO,KAAA;AAAA,IAET,KAAK,aAAA;AACH,MAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,aAAa,QAAA,EAAU;AAC9D,QAAA,OAAO,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,MAClC;AACA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,QAAA,OAAO,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,MAClC;AACA,MAAA,OAAO,IAAA;AAAA,IAET,KAAK,IAAA;AACH,MAAA,OAAO,MAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,IAE5D,KAAK,OAAA;AACH,MAAA,OAAO,MAAM,OAAA,CAAQ,QAAQ,KAAK,CAAC,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,IAE7D,KAAK,SAAA;AACH,MAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,KAAa,UAAU,OAAO,KAAA;AACvE,MAAA,IAAI;AACF,QAAA,OAAO,IAAI,MAAA,CAAO,QAAQ,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IAEF;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAMA,SAAS,YAAA,CACP,IAAA,EACA,IAAA,EACA,YAAA,EACA,eACA,YAAA,EACS;AACT,EAAA,MAAM,SAAS,iBAAA,CAAkB,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,cAAc,YAAY,CAAA;AAE7E,EAAA,IAAA,CAAK,KAAK,QAAA,KAAa,QAAA,IAAY,IAAA,CAAK,QAAA,KAAa,gBAAgB,aAAA,EAAe;AAClF,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACrE,IAAA,MAAM,MAAA,GAAS,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,KAAK,CAAC,CAAA,IAAK,EAAC;AAC/D,IAAA,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GACrB,MAAA,CAAO,SAAS,MAAA,CAAO,MAAM,CAAC,CAAA,GAC9B,CAAC,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,QAAA,EAAU,MAAA,EAAQ,KAAK,KAAK,CAAA;AAC3D;AAMO,SAAS,sBAAA,CACd,KAAA,EACA,IAAA,EACA,YAAA,EACA,eACA,YAAA,EACS;AACT,EAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,IAAA,KACnC,YAAA,CAAa,MAAM,IAAA,EAAM,YAAA,EAAc,eAAe,YAAY;AAAA,GACpE;AAEA,EAAA,MAAM,YAAA,GAAA,CAAgB,KAAA,CAAM,MAAA,IAAU,EAAC,EAAG,GAAA;AAAA,IAAI,CAAC,QAAA,KAC7C,sBAAA,CAAuB,UAAU,IAAA,EAAM,YAAA,EAAc,eAAe,YAAY;AAAA,GAClF;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,WAAA,EAAa,GAAG,YAAY,CAAA;AAEnD,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,EAAA,OAAO,KAAA,CAAM,eAAe,KAAA,GACxB,UAAA,CAAW,MAAM,OAAO,CAAA,GACxB,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AAC7B;AAMO,SAAS,SAAA,CACd,WAAA,EACA,IAAA,EACA,YAAA,EACA,eACA,YAAA,EACS;AACT,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,EAAA,OAAO,sBAAA,CAAuB,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,eAAe,YAAY,CAAA;AAC5F;;;AClJA,SAAS,kBAAA,CACP,SAAA,EACA,IAAA,EACA,YAAA,EACS;AACT,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,IAAA;AACjD,EAAA,OAAO,SAAA,CAAU,KAAA,CAAM,CAAC,IAAA,KAAS;AAC/B,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,EAAM,IAAA,EAAM,YAAY,CAAA;AACxD,IAAA,OAAO,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,EAAA;AAAA,EAC5D,CAAC,CAAA;AACH;AAMA,SAAS,uBAAA,CACP,iBAAA,EACA,YAAA,EACA,YAAA,EACU;AACV,EAAA,IAAI,CAAC,iBAAA,IAAqB,iBAAA,CAAkB,MAAA,KAAW,CAAA,SAAU,EAAC;AAElE,EAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,YAAA,CAAa,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAE5D,EAAA,OAAO,iBAAA,CACJ,MAAA,CAAO,CAAC,MAAA,KAAW;AAClB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,EAAU,OAAO,KAAA;AAG7B,IAAA,MAAM,iBAAA,GAAoB,OAAO,MAAA,EAAQ,IAAA;AAAA,MACvC,CAAC,GAAA,KAAQ,cAAA,CAAe,GAAA,CAAI,IAAI,MAAM;AAAA,KACxC;AACA,IAAA,IAAI,CAAC,mBAAmB,OAAO,KAAA;AAE/B,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,EAAE,CAAA;AACpC,IAAA,OAAO,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA;AAAA,EAC1C,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,EAAE,CAAA;AAC9B;AAeO,SAAS,WAAA,CACd,MAAA,EACA,IAAA,EACA,YAAA,EACA,eACA,YAAA,EACc;AACd,EAAA,MAAM,eAA+B,EAAC;AACtC,EAAA,MAAM,cAA8B,EAAC;AAErC,EAAA,KAAA,MAAW,OAAA,IAAW,OAAO,KAAA,EAAO;AAClC,IAAA,MAAM,cAAc,SAAA,CAAU,OAAA,CAAQ,aAAa,IAAA,EAAM,YAAA,EAAc,eAAe,YAAY,CAAA;AAElG,IAAA,MAAM,cAAA,GAAkC,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,QAAA,KAAa;AACvE,MAAA,IAAI,eAAA;AACJ,MAAA,IAAI,QAAA,CAAS,kBAAkB,aAAA,EAAe;AAC5C,QAAA,MAAM,OAAA,GAAU,cAAc,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,SAAS,cAAc,CAAA;AAC1E,QAAA,eAAA,GAAkB,OAAA,EAAS,MAAA;AAAA,MAC7B;AAGA,MAAA,IAAI,oBAAA;AACJ,MAAA,IAAI,QAAA,CAAS,cAAA,IAAkB,QAAA,CAAS,cAAA,CAAe,SAAS,CAAA,EAAG;AACjE,QAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,cAAA,EAAgB;AAC1C,UAAA,IAAI,uBAAuB,IAAA,CAAK,IAAA,EAAM,MAAM,YAAA,EAAc,aAAA,EAAe,YAAY,CAAA,EAAG;AACtF,YAAA,oBAAA,GAAuB,IAAA,CAAK,KAAA;AAC5B,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,UAAA,EAAY,QAAA;AAAA,QACZ,SAAS,SAAA,CAAU,QAAA,CAAS,aAAa,IAAA,EAAM,YAAA,EAAc,eAAe,YAAY,CAAA;AAAA,QACxF,eAAA,EAAiB,kBAAA,CAAmB,QAAA,CAAS,SAAA,EAAW,MAAM,YAAY,CAAA;AAAA,QAC1E,eAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,UAAA,EAAY,OAAA;AAAA,MACZ,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,KAAK,YAAY,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,mBAAA,GAAsB,uBAAA;AAAA,IAC1B,MAAA,CAAO,iBAAA;AAAA,IACP,YAAA;AAAA,IACA,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,UAAU;AAAA,GACtC;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAUO,SAAS,aAAA,CAAc,OAAuB,MAAA,EAAwB;AAC3E,EAAA,OAAO,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,UAAA,CAAW,OAAO,MAAM,CAAA;AAC1D;AAKO,SAAS,WAAA,CACd,OACA,aAAA,EAC0B;AAC1B,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,aAAa,CAAA;AAChD,EAAA,IAAI,UAAU,EAAA,IAAM,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,GAAG,OAAO,MAAA;AACvD,EAAA,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AACxB;AAKO,SAAS,eAAA,CACd,OACA,aAAA,EAC0B;AAC1B,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,aAAa,CAAA;AAChD,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,MAAA;AACvB,EAAA,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AACxB;AAMO,SAAS,iBAAA,CACd,OACA,aAAA,EACQ;AACR,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,aAAa,CAAA;AAChD,EAAA,IAAI,KAAA,KAAU,IAAI,OAAO,CAAA;AACzB,EAAA,OAAO,KAAK,KAAA,CAAA,CAAQ,KAAA,GAAQ,MAAM,KAAA,CAAM,MAAA,GAAS,KAAM,GAAG,CAAA;AAC5D;AAOO,SAAS,iBAAA,CACd,KAAA,EACA,IAAA,EACA,aAAA,EAC0B;AAC1B,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,gBAAgB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACzD,IAAA,MAAM,aAAa,aAAA,CAAc,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AAG/D,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,EAAE,CAAA;AACxC,MAAA,MAAM,UACJ,QAAA,KAAa,MAAA,IAAa,OAAO,IAAA,CAAK,QAAQ,EAAE,MAAA,GAAS,CAAA;AAE3D,MAAA,IAAI,OAAA,IAAW,IAAA,KAAS,KAAA,CAAM,CAAC,CAAA,EAAG;AAChC,QAAA,SAAA,GAAY,IAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,SAAA,IAAa,MAAM,CAAC,CAAA;AAC7B;ACnKO,SAAS,gBAAgB,KAAA,EAA2C;AACzE,EAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,IAAA,OAAO,EAAE,OAAO,EAAC,EAAG,aAAa,EAAC,EAAG,mBAAA,EAAqB,EAAC,EAAE;AAAA,EAC/D;AACA,EAAA,OAAO,WAAA,CAAY,MAAM,MAAA,EAAQ,KAAA,CAAM,MAAM,KAAA,CAAM,YAAA,EAAc,MAAA,EAAW,KAAA,CAAM,YAAY,CAAA;AAChG;AAEO,SAAS,eAAe,KAAA,EAAuD;AACpF,EAAA,IAAI,CAAC,KAAA,CAAM,aAAA,EAAe,OAAO,MAAA;AACjC,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,CAAE,KAAA,CAAM,IAAA;AAAA,IAClC,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,OAAO,KAAA,CAAM;AAAA,GACnC;AACF;AAEO,SAAS,qBAAqB,KAAA,EAAuD;AAC1F,EAAA,IAAI,CAAC,KAAA,CAAM,aAAA,EAAe,OAAO,MAAA;AACjC,EAAA,MAAM,IAAA,GAAO,gBAAgB,KAAK,CAAA;AAClC,EAAA,OAAO,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,aAAa,CAAA;AACpD;AAEO,SAAS,yBAAyB,KAAA,EAAuD;AAC9F,EAAA,IAAI,CAAC,KAAA,CAAM,aAAA,EAAe,OAAO,MAAA;AACjC,EAAA,MAAM,IAAA,GAAO,gBAAgB,KAAK,CAAA;AAClC,EAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,aAAa,CAAA;AACxD;AAEO,SAAS,2BAA2B,KAAA,EAAqC;AAC9E,EAAA,IAAI,CAAC,KAAA,CAAM,aAAA,EAAe,OAAO,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,gBAAgB,KAAK,CAAA;AAClC,EAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,aAAa,CAAA;AAC1D;AAEO,SAAS,uBAAuB,KAAA,EAAuC;AAC5E,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,CAAE,mBAAA;AAChC;AAMA,IAAM,YAAA,GAAqC;AAAA,EACzC,MAAA,EAAQ,IAAA;AAAA,EACR,MAAM,EAAC;AAAA,EACP,cAAc,EAAC;AAAA,EACf,aAAA,EAAe,IAAA;AAAA,EACf,SAAS,EAAC;AAAA,EACV,cAAc,EAAC;AAAA,EACf,YAAA,EAAc,KAAA;AAAA,EACd,SAAA,EAAW;AACb,CAAA;AAWA,SAAS,iBAAA,GAAoB;AAC3B,EAAA,OAAO,CACL,KAKA,IAAA,MAC0B;AAAA,IAC1B,GAAG,YAAA;AAAA,IAEH,IAAA,CAAK,MAAA,EAAQ,OAAA,GAAU,EAAC,EAAG;AACzB,MAAA,MAAM,EAAE,OAAO,EAAC,EAAG,eAAe,EAAC,EAAG,aAAY,GAAI,OAAA;AACtD,MAAA,MAAM,cAAc,WAAA,IAAe,MAAA,CAAO,KAAA,CAAM,CAAC,GAAG,EAAA,IAAM,IAAA;AAC1D,MAAA,GAAA,CAAI;AAAA,QACF,MAAA;AAAA,QACA,IAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA,EAAe,WAAA;AAAA,QACf,OAAA,EAAS,WAAA,GAAc,CAAC,WAAW,IAAI,EAAC;AAAA,QACxC,cAAc,EAAC;AAAA,QACf,YAAA,EAAc,KAAA;AAAA,QACd,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAA,CAAO,MAAA,EAAQ,YAAA,GAAe,EAAC,EAAG;AAEhC,MAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACd,MAAA;AAAA,QACA,cAAc,EAAE,GAAG,KAAA,CAAM,YAAA,EAAc,GAAG,YAAA,EAAa;AAAA,QACvD,YAAA,EAAc;AAAA,OAChB,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO;AACpC,MAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACd,IAAA,EAAM;AAAA,UACJ,GAAG,KAAA,CAAM,IAAA;AAAA,UACT,CAAC,MAAM,GAAG,EAAE,GAAG,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,OAAO,GAAG,KAAA;AAAM;AACtD,OACF,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,WAAA,CAAY,QAAQ,IAAA,EAAM;AACxB,MAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACd,IAAA,EAAM,EAAE,GAAG,KAAA,CAAM,MAAM,CAAC,MAAM,GAAG,IAAA;AAAK,OACxC,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,cAAA,CAAe,OAAO,KAAA,EAAO;AAC3B,MAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACd,YAAA,EAAc,EAAE,GAAG,KAAA,CAAM,cAAc,CAAC,KAAK,GAAG,KAAA;AAAM,OACxD,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,eAAe,MAAA,EAAQ;AACrB,MAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACd,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,GAClC,KAAA,CAAM,OAAA,GACN,CAAC,GAAG,KAAA,CAAM,OAAA,EAAS,MAAM;AAAA,OAC/B,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,gBAAgB,CAAA,EAAG;AACjB,MAAA,GAAA,CAAI,EAAE,YAAA,EAAc,CAAA,EAAG,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,aAAa,CAAA,EAAG;AACd,MAAA,GAAA,CAAI,EAAE,SAAA,EAAW,CAAA,EAAG,CAAA;AAAA,IACtB,CAAA;AAAA,IAEA,SAAS,MAAA,EAAQ;AACf,MAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACd,YAAA,EAAc,KAAA,CAAM,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,GAC5C,KAAA,CAAM,YAAA,GACN,CAAC,GAAG,KAAA,CAAM,YAAA,EAAc,MAAM;AAAA,OACpC,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,WAAW,MAAA,EAAQ;AACjB,MAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACd,cAAc,KAAA,CAAM,YAAA,CAAa,OAAO,CAAC,EAAA,KAAO,OAAO,MAAM;AAAA,OAC/D,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,kBAAkB,MAAA,EAAQ;AACxB,MAAA,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AACxC,QAAA,IAAI,QAAQ,EAAA,IAAM,GAAA,KAAQ,MAAM,OAAA,CAAQ,MAAA,GAAS,GAAG,OAAO,KAAA;AAC3D,QAAA,OAAO,EAAE,SAAS,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA,EAAE;AAAA,MACpD,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,KAAA,GAAQ;AACN,MAAA,GAAA,CAAI,YAAY,CAAA;AAAA,IAClB;AAAA,GACF,CAAA;AACF;AAWO,SAAS,kBAAA,CAAmB,OAAA,GAAqC,EAAC,EAAG;AAC1E,EAAA,MAAM,EAAE,eAAA,EAAiB,QAAA,EAAS,GAAI,OAAA;AAEtC,EAAA,IAAI,oBAAoB,SAAA,EAAW;AACjC,IAAA,MAAM,UAAA,GAAa,QAAA,GACf,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,GAC5B,kBAAA;AAEJ,IAAA,OAAOC,mBAAA,EAAkC;AAAA,MACvCC,kBAAA,CAAQ,mBAAkB,EAAG;AAAA,QAC3B,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAASC,6BAAkB,MAAM;AAE/B,UAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,YAAA,OAAO;AAAA,cACL,SAAS,MAAM,IAAA;AAAA,cACf,SAAS,MAAM;AAAA,cAAC,CAAA;AAAA,cAChB,YAAY,MAAM;AAAA,cAAC;AAAA,aACrB;AAAA,UACF;AACA,UAAA,OAAO,MAAA,CAAO,YAAA;AAAA,QAChB,CAAC,CAAA;AAAA,QACD,UAAA,EAAY,CAAC,KAAA,MAA2B;AAAA;AAAA;AAAA,UAGtC,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,EAAA,IAAM,IAAA;AAAA,UAC9B,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,WAAW,KAAA,CAAM;AAAA,SACnB;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,OAAOF,mBAAA,EAAkC,CAAE,iBAAA,EAAmB,CAAA;AAChE;AAaO,SAAS,iBAAA,CACd,OACA,QAAA,EACS;AACT,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,EAAS;AAG7B,EAAA,MAAM,iBAAA,GAAqB,MAA6C,UAAU,CAAA;AAIlF,EAAA,OACE,sBAAsB,QAAA,IACtB,KAAA,CAAM,aAAA,KAAkB,IAAA,IACxB,CAAC,KAAA,CAAM,SAAA;AAEX;AC5TA,IAAM,0BAAuE,EAAC;AAMvE,SAAS,uBAAA,CACd,IACA,EAAA,EACM;AACN,EAAA,uBAAA,CAAwB,EAAE,CAAA,GAAI,EAAA;AAChC;AAUA,SAAS,gBAAA,CAAiB,MAAsB,IAAA,EAA6B;AAC3E,EAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACzB,IAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,QAAA,EAAU,IAAA,EAAM,EAAE,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,IAAA,CAAK,KAAA;AACd;AAEA,SAAS,gBAAA,CAAiB,KAAA,EAAwB,aAAA,EAAgC,IAAA,EAAkC;AAClH,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,IAAc,EAAC;AACnC,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAC1D,EAAA,MAAM,SAAA,GAAY,MAAM,IAAA,KAAS,QAAA;AACjC,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,KAAS,UAAA;AAClC,EAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,KAAS,aAAA;AAErC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,IAAA,GAAOG,MAAE,OAAA,EAAQ;AACvB,IAAA,OAAO,UAAA,GAAa,IAAA,GAAO,IAAA,CAAK,QAAA,EAAS;AAAA,EAC3C;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,IAAA,GAAOA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA;AAC/B,IAAA,OAAO,aAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,EAAG,OAAA,IAAW,UAAU,CAAA,GAAI,KAAK,QAAA,EAAS;AAAA,EACnH;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI,SAAA,GAAYA,KAAA,CAAE,MAAA,CAAO,MAAA,CAAO;AAAA,MAC9B,kBAAA,EAAoB;AAAA,KACrB,CAAA;AAED,IAAA,MAAM,iBAAyE,EAAC;AAEhF,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,IAAA,CAAK,QAAA;AAErB,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,KAAA,IAAS,IAAA,CAAK,SAAS,oBAAA,EAAsB;AAC7D,QAAA,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA;AACnB,QAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG;AACb,UAAA,IAAI,KAAA,EAAO,cAAA,CAAe,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAM,CAAA,IAAK,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,eACtE,SAAA,GAAY,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA;AAAA,QAChD;AAAA,MACF,WAAW,IAAA,CAAK,IAAA,KAAS,KAAA,IAAS,IAAA,CAAK,SAAS,iBAAA,EAAmB;AACjE,QAAA,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA;AACnB,QAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG;AACb,UAAA,IAAI,KAAA,EAAO,cAAA,CAAe,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAM,CAAA,IAAK,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,eACtE,SAAA,GAAY,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA;AAAA,QAChD;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,aAAA,EAAe;AACtC,QAAA,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA;AACnB,QAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG;AACb,UAAA,IAAI,KAAA,EAAO,cAAA,CAAe,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,eACrE,SAAA,GAAY,SAAA,CAAU,EAAA,CAAG,CAAA,EAAG,KAAK,OAAO,CAAA;AAAA,QAC/C;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,QAAA,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA;AACnB,QAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG;AACb,UAAA,IAAI,KAAA,EAAO,cAAA,CAAe,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,eACrE,SAAA,GAAY,SAAA,CAAU,EAAA,CAAG,CAAA,EAAG,KAAK,OAAO,CAAA;AAAA,QAC/C;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,QAAA,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA;AACnB,QAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,iBAAkB,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,MAAM,CAAA,KAAM,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,MAClF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AACpC,QAAA,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA;AACnB,QAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,iBAAkB,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,MAAM,CAAA,KAAM,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,MAClF;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,GAAyB,UAAA,GAAa,SAAA,GAAY,SAAA,CAAU,QAAA,EAAS;AACzE,IAAA,KAAA,MAAW,EAAE,EAAA,EAAI,OAAA,EAAQ,IAAK,cAAA,EAAgB;AAC5C,MAAA,QAAA,GAAW,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,KAAK,IAAA,IAAQ,EAAA,CAAG,CAAW,CAAA,EAAG,OAAO,CAAA;AAAA,IACzE;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAIA,EAAA,IAAI,SAAA,GAAYA,MAAE,MAAA,EAAO;AAEzB,EAAA,MAAM,cAAuE,EAAC;AAE9E,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,UAAA;AACH,QAAA,SAAA,GAAY,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,CAAA,cAAe,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA;AACxD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,CAAA,cAAe,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA;AACxD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA;AACH,QAAA,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,SAAA,GAAY,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,IAAa,IAAA,CAAK,UAAU,IAAA,EAAM;AACnD,UAAA,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,IAAI,MAAA,CAAO,MAAA,CAAO,KAAK,KAAK,CAAC,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA;AAAA,QAC1E;AACA,QAAA;AAAA,MACF,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AACtC,QAAA,IAAI,OAAO,MAAA,EAAW;AACpB,UAAA,MAAM,EAAA,GAAK,OAAO,EAAE,CAAA;AACpB,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAe,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,EAAI,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,QAClF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AACtC,QAAA,IAAI,OAAO,MAAA,EAAW;AACpB,UAAA,MAAM,GAAA,GAAM,OAAO,EAAE,CAAA;AACrB,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAe,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,EAAK,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,QACnF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AACtC,QAAA,IAAI,OAAO,MAAA,EAAW;AACpB,UAAA,MAAM,EAAA,GAAK,OAAO,EAAE,CAAA;AACpB,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAe,MAAA,CAAO,CAAC,CAAA,GAAI,EAAA,EAAI,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,QAChF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,oBAAA,EAAsB;AACzB,QAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AACtC,QAAA,IAAI,OAAO,MAAA,EAAW;AACpB,UAAA,MAAM,GAAA,GAAM,OAAO,EAAE,CAAA;AACrB,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAe,MAAA,CAAO,CAAC,CAAA,IAAK,GAAA,EAAK,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,QAClF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AACtC,QAAA,IAAI,OAAO,MAAA,EAAW;AACpB,UAAA,MAAM,EAAA,GAAK,OAAO,EAAE,CAAA;AACpB,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAe,MAAA,CAAO,CAAC,CAAA,GAAI,EAAA,EAAI,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,QAChF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,iBAAA,EAAmB;AACtB,QAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AACtC,QAAA,IAAI,OAAO,MAAA,EAAW;AACpB,UAAA,MAAM,GAAA,GAAM,OAAO,EAAE,CAAA;AACrB,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAe,MAAA,CAAO,CAAC,CAAA,IAAK,GAAA,EAAK,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,QAClF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AACtC,QAAA,IAAI,OAAO,MAAA,EAAW;AACpB,UAAA,MAAM,GAAA,GAAM,OAAO,EAAE,CAAA;AACrB,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,MAAe,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,QACzF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AACtC,QAAA,IAAI,OAAO,MAAA,EAAW;AACpB,UAAA,MAAM,IAAA,GAAO,OAAO,EAAE,CAAA;AACtB,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,MAAe,CAAC,MAAA,CAAO,CAAC,CAAA,CAAE,SAAS,IAAI,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,QAC3F;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,SAAA;AACH,QAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,IAAa,IAAA,CAAK,UAAU,IAAA,EAAM;AACnD,UAAA,MAAM,KAAK,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACxC,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,MAAe,EAAA,CAAG,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,QACpF;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC/B,UAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACrE,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACxD,YAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,MAAe,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,UAC5F;AAAA,QACF;AACA,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC/B,UAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACrE,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACxD,YAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAC,MAAe,CAAC,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,UAC7F;AAAA,QACF;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,uBAAA,CAAwB,IAAA,CAAK,iBAAiB,CAAA,EAAG;AAC7E,UAAA,WAAA,CAAY,KAAK,EAAE,EAAA,EAAI,CAAC,CAAA,KAAe,QAAQ,uBAAA,CAAwB,IAAA,CAAK,iBAAkB,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,QAChI;AACA,QAAA;AAAA;AACJ,EACF;AAGA,EAAA,IAAI,WAAA,GAA4B,UAAA,GAAa,SAAA,GAAY,SAAA,CAAU,QAAA,EAAS;AAG5E,EAAA,KAAA,MAAW,EAAE,EAAA,EAAI,OAAA,EAAQ,IAAK,WAAA,EAAa;AACzC,IAAA,WAAA,GAAc,WAAA,CAAY,MAAA,CAAO,EAAA,EAAI,OAAO,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,WAAA;AACT;AAaO,SAAS,cAAA,CACd,MAAA,EACA,aAAA,EACA,IAAA,EAC4B;AAC5B,EAAA,MAAM,QAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,iBAAiB,MAAA,EAAQ;AAClC,IAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC5B,IAAA,KAAA,CAAM,aAAA,CAAc,WAAW,EAAE,CAAA,GAAI,iBAAiB,aAAA,CAAc,UAAA,EAAY,eAAe,IAAI,CAAA;AAAA,EACrG;AAEA,EAAA,OAAOA,KAAA,CAAE,OAAO,KAAK,CAAA;AACvB;;;ACxPA,IAAM,kBAAA,GAAqB,CAAC,GAAG,CAAA;AAE/B,IAAM,0CAA0B,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,cAAA,EAAgB,gBAAgB,CAAC,CAAA;AAErF,IAAM,mBAAA,uBAA0B,GAAA,CAAI,CAAC,UAAU,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAC,CAAA;AAE7E,IAAM,yBAAA,uBAAgC,GAAA,CAAI;AAAA,EACxC,QAAA;AAAA,EAAU,WAAA;AAAA,EACV,aAAA;AAAA,EAAe,oBAAA;AAAA,EACf,UAAA;AAAA,EAAY,iBAAA;AAAA,EACZ,UAAA;AAAA,EAAY,aAAA;AAAA,EACZ,IAAA;AAAA,EAAM,OAAA;AAAA,EACN,QAAA;AAAA,EAAU,WAAA;AAAA,EACV;AACF,CAAC,CAAA;AAED,IAAM,sBAAA,uBAA6B,GAAA,CAAI;AAAA,EACrC,UAAA;AAAA,EAAY,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,WAAA;AAAA,EAAa,WAAA;AAAA,EAAa,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS;AAC/E,CAAC,CAAA;AAYM,SAAS,eAAe,GAAA,EAAsC;AACnE,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,CAAC,OAAO,OAAO,GAAA,KAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACzD,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,4BAA4B,CAAA,EAAE;AAAA,EAChE;AAEA,EAAA,MAAM,GAAA,GAAM,GAAA;AAKZ,EAAA,IAAI,EAAE,aAAa,GAAA,CAAA,EAAM;AACvB,IAAA,MAAA,CAAO,KAAK,kCAAkC,CAAA;AAAA,EAChD,WAAW,CAAC,kBAAA,CAAmB,QAAA,CAAS,GAAA,CAAI,OAA4C,CAAA,EAAG;AACzF,IAAA,MAAA,CAAO,IAAA,CAAK,wBAAwB,GAAA,CAAI,OAAO,iBAAiB,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACjG;AAGA,EAAA,IAAI,EAAE,IAAA,IAAQ,GAAA,CAAA,IAAQ,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,IAAY,CAAC,GAAA,CAAI,EAAA,CAAG,IAAA,EAAK,EAAG;AAClE,IAAA,MAAA,CAAO,KAAK,uCAAuC,CAAA;AAAA,EACrD;AAGA,EAAA,IAAI,EAAE,MAAA,IAAU,GAAA,CAAA,IAAQ,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,CAAC,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK,EAAG;AACxE,IAAA,MAAA,CAAO,KAAK,yCAAyC,CAAA;AAAA,EACvD;AAGA,EAAA,IAAI,EAAE,WAAW,GAAA,CAAA,IAAQ,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AAClD,IAAA,MAAA,CAAO,KAAK,gCAAgC,CAAA;AAAA,EAC9C,CAAA,MAAO;AACL,IAAA,aAAA,CAAc,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,EACjC;AAGA,EAAA,IAAI,qBAAqB,GAAA,IAAO,CAAC,wBAAwB,GAAA,CAAI,GAAA,CAAI,eAAyB,CAAA,EAAG;AAC3F,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,CAAA,2BAAA,EAA8B,GAAA,CAAI,eAAe,CAAA,mBAAA,EAAsB,CAAC,GAAG,uBAAuB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAChH;AAAA,EACF;AAGA,EAAA,IAAI,uBAAuB,GAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA,EAAG;AACzC,MAAA,MAAA,CAAO,KAAK,sCAAsC,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,yBAAA,CAA0B,GAAA,CAAI,mBAAmB,MAAM,CAAA;AAAA,IACzD;AAAA,EACF;AAGA,EAAA,IAAI,iBAAiB,GAAA,IAAO,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,EAAG;AAC3D,IAAA,MAAA,CAAO,KAAK,gCAAgC,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,MAAA,KAAW,GAAG,MAAA,EAAO;AAC9C;AAMA,SAAS,aAAA,CAAc,OAAkB,MAAA,EAAkB;AACzD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACzB,IAAA,MAAM,MAAA,GAAS,SAAS,CAAC,CAAA,CAAA,CAAA;AAEzB,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5D,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,IAAA;AAGV,IAAA,IAAI,OAAO,EAAE,EAAA,KAAO,QAAA,IAAY,CAAC,CAAA,CAAE,EAAA,CAAG,MAAK,EAAG;AAC5C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,iCAAA,CAAmC,CAAA;AAAA,IAC1D,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,MAAM,CAAA,qBAAA,EAAwB,CAAA,CAAE,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,IAClB;AAGA,IAAA,IAAI,OAAO,EAAE,KAAA,KAAU,QAAA,IAAY,CAAC,CAAA,CAAE,KAAA,CAAM,MAAK,EAAG;AAClD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAAA,IAC7D;AAGA,IAAA,IAAI,OAAO,EAAE,GAAA,KAAQ,QAAA,IAAY,CAAC,CAAA,CAAE,GAAA,CAAI,MAAK,EAAG;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,kCAAA,CAAoC,CAAA;AAAA,IAC3D;AAGA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,2BAAA,CAA6B,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,EAAA,EAAc,QAAQ,MAAM,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,sBAAA,CAAuB,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,MAAM,gBAAgB,MAAM,CAAA;AAAA,IACvE;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,cAAA,CACP,MAAA,EACA,MAAA,EACA,YAAA,EACA,MAAA,EACA;AACA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AAC3B,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,YAAY,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA,CAAA;AAE1C,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,KAAA;AAGV,IAAA,IAAI,OAAO,EAAE,EAAA,KAAO,QAAA,IAAY,CAAC,CAAA,CAAE,EAAA,CAAG,MAAK,EAAG;AAC5C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,iCAAA,CAAmC,CAAA;AAAA,IAC1D,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAM,CAAA,sBAAA,EAAyB,EAAE,EAAE,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3E,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAI,EAAE,EAAY,CAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,OAAO,EAAE,IAAA,KAAS,QAAA,IAAY,CAAC,CAAA,CAAE,IAAA,CAAK,MAAK,EAAG;AAChD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,mCAAA,CAAqC,CAAA;AAAA,IAC5D;AAGA,IAAA,IAAI,OAAO,EAAE,KAAA,KAAU,QAAA,IAAY,CAAC,CAAA,CAAE,KAAA,CAAM,MAAK,EAAG;AAClD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAAA,IAC7D;AAGA,IAAA,IAAI,aAAa,CAAA,IAAK,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AAC/C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,4BAAA,CAA8B,CAAA;AAAA,IACrD;AAGA,IAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,EAAG;AAChC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,+BAAA,CAAiC,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,uBAAA,CAAwB,CAAA,CAAE,UAAA,EAAY,MAAA,EAAQ,MAAM,CAAA;AAAA,MACtD;AAAA,IACF;AAGA,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,8BAAA,CAAgC,CAAA;AAAA,MACvD,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,GAAA,IAAO,EAAE,SAAA,EAAwB;AAC1C,UAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,yCAAA,CAA2C,CAAA;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,sBAAA,CAAuB,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,MAAM,gBAAgB,MAAM,CAAA;AAAA,IACvE;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,sBAAA,CAAuB,KAAA,EAAgB,MAAA,EAAgB,MAAA,EAAkB;AAChF,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAC1C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,CAAA,GAAI,KAAA;AAEV,EAAA,IAAI,CAAA,CAAE,UAAA,KAAe,KAAA,IAAS,CAAA,CAAE,eAAe,IAAA,EAAM;AACnD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,0BAAA,CAA4B,CAAA;AAAA,EACnD,CAAA,MAAO;AACL,IAAC,CAAA,CAAE,KAAA,CAAoB,OAAA,CAAQ,CAAC,MAAM,CAAA,KAAM;AAC1C,MAAA,qBAAA,CAAsB,MAAM,CAAA,EAAG,MAAM,CAAA,OAAA,EAAU,CAAC,KAAK,MAAM,CAAA;AAAA,IAC7D,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,YAAY,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,EAAG;AAC5C,IAAC,CAAA,CAAE,MAAA,CAAqB,OAAA,CAAQ,CAAC,QAAQ,CAAA,KAAM;AAC7C,MAAA,sBAAA,CAAuB,QAAQ,CAAA,EAAG,MAAM,CAAA,QAAA,EAAW,CAAC,KAAK,MAAM,CAAA;AAAA,IACjE,CAAC,CAAA;AAAA,EACH;AACF;AAEA,SAAS,qBAAA,CAAsB,IAAA,EAAe,MAAA,EAAgB,MAAA,EAAkB;AAC9E,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5D,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAC1C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,CAAA,GAAI,IAAA;AAEV,EAAA,IAAI,OAAO,EAAE,KAAA,KAAU,QAAA,IAAY,CAAC,CAAA,CAAE,KAAA,CAAM,MAAK,EAAG;AAClD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,CAAC,yBAAA,CAA0B,GAAA,CAAI,CAAA,CAAE,QAAkB,CAAA,EAAG;AACxD,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,CAAA,EAAG,MAAM,CAAA,oBAAA,EAAuB,CAAA,CAAE,QAAQ,CAAA,mBAAA,EAAsB,CAAC,GAAG,yBAAyB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC3G;AAAA,EACF;AACF;AAEA,SAAS,uBAAA,CAAwB,KAAA,EAAkB,YAAA,EAAsB,MAAA,EAAkB;AACzF,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACzB,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,YAAY,CAAA,YAAA,EAAe,CAAC,CAAA,CAAA,CAAA;AAE9C,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5D,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,IAAA;AAEV,IAAA,IAAI,CAAC,sBAAA,CAAuB,GAAA,CAAI,CAAA,CAAE,IAAc,CAAA,EAAG;AACjD,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,EAAG,MAAM,CAAA,gBAAA,EAAmB,CAAA,CAAE,IAAI,CAAA,mBAAA,EAAsB,CAAC,GAAG,sBAAsB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAChG;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,EAAE,OAAA,KAAY,QAAA,IAAY,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAK,EAAG;AACtD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,sCAAA,CAAwC,CAAA;AAAA,IAC/D;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,yBAAA,CAA0B,MAAiB,MAAA,EAAkB;AACpE,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,MAAM,MAAA,GAAS,qBAAqB,CAAC,CAAA,CAAA,CAAA;AAErC,IAAA,IAAI,CAAC,KAAK,OAAO,CAAA,KAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACnD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAK,CAAA;AAEX,IAAA,IAAI,OAAO,GAAG,EAAA,KAAO,QAAA,IAAY,CAAC,EAAA,CAAG,EAAA,CAAG,MAAK,EAAG;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,iCAAA,CAAmC,CAAA;AAAA,IAC1D,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,MAAM,CAAA,kCAAA,EAAqC,EAAA,CAAG,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IACpE,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,EAAY,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,OAAO,GAAG,KAAA,KAAU,QAAA,IAAY,CAAC,EAAA,CAAG,KAAA,CAAM,MAAK,EAAG;AACpD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,CAAC,mBAAA,CAAoB,GAAA,CAAI,EAAA,CAAG,IAAc,CAAA,EAAG;AAC/C,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,EAAG,MAAM,CAAA,gBAAA,EAAmB,EAAA,CAAG,IAAI,CAAA,mBAAA,EAAsB,CAAC,GAAG,mBAAmB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAC9F;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,EAAA,CAAG,QAAA,KAAa,SAAA,EAAW;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,8BAAA,CAAgC,CAAA;AAAA,IACvD;AAAA,EACF,CAAC,CAAA;AACH;AAMO,SAAS,aAAa,GAAA,EAA6C;AACxE,EAAA,MAAM,MAAA,GAAS,eAAe,GAAG,CAAA;AACjC,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA;AAAA,EAA4B,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/F;AACF;;;AC5UO,IAAM,oBAAN,MAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,OAAO,MAAA,CAAO,QAAA,EAAkB,MAAA,EAAgC;AAC9D,IAAA,OAAO,SAAS,OAAA,CAAQ,IAAA,CAAK,mBAAA,EAAqB,CAAC,OAAO,GAAA,KAAQ;AAChE,MAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,GAAG,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAE,CAAA;AACtE,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,oBAAoB,QAAA,EAA4B;AACrD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,mBAAmB,CAAA;AACvD,IAAA,OAAO,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA,GAAI,EAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAA,CACL,QAAA,EACA,MAAA,EAC+C;AAC/C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AACtD,IAAA,MAAM,aAAA,GAAgB,aAAa,MAAA,CAAO,CAAC,QAAQ,MAAA,CAAO,GAAG,MAAM,MAAS,CAAA;AAC5E,IAAA,OAAO,EAAE,OAAA,EAAS,aAAA,CAAc,MAAA,KAAW,GAAG,aAAA,EAAc;AAAA,EAC9D;AACF;AArCa,iBAAA,CACa,mBAAA,GAAsB,kBAAA;AAwChD,SAAS,mBAAA,CAAoB,UAAkB,UAAA,EAA6B;AAC1E,EAAA,MAAM,YAAA,GAAe,WAClB,OAAA,CAAQ,kBAAA,EAAoB,SAAS,CAAA,CACrC,OAAA,CAAQ,OAAO,KAAK,CAAA;AACvB,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,QAAQ,CAAA;AACtD;AAEA,SAAS,yBAAA,CACP,UACA,UAAA,EACS;AACT,EAAA,MAAM,WAAA,GAAc,UAAA,CACjB,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA,CAC7B,KAAA,CAAM,GAAG,CAAA,CACT,OAAO,CAAC,OAAA,KAAY,OAAA,KAAY,GAAA,IAAO,YAAY,EAAE,CAAA;AAExD,EAAA,MAAM,YAAA,GAAe,SAAS,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAA;AAE/D,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,IACE,eAAe,WAAA,CAAY,MAAA,IAC3B,GAAA,KAAQ,WAAA,CAAY,YAAY,CAAA,EAChC;AACA,MAAA,YAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,iBAAiB,WAAA,CAAY,MAAA;AACtC;AAEA,SAAS,wBAAA,CACP,UACA,UAAA,EACgB;AAChB,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,MAAM,eAAe,UAAA,CAAW,OAAA;AAAA,IAC9B,kBAAA;AAAA,IACA,CAAC,QAAQ,SAAA,KAAc;AACrB,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,aAAa,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAClE,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA;AAEpC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,CAAA,GAAI,CAAC,CAAA;AACpC,MAAA,MAAM,UAAA,GAAa,QAAQ,CAAC,CAAA;AAC5B,MAAA,IAAI,UAAU,QAAA,CAAS,KAAK,KAAK,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AACzD,QAAA,MAAA,CAAO,SAAS,CAAA,GAAI,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,SAAS,CAAA,GAAI,UAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,gBAAA,CACd,UACA,QAAA,EACuB;AACvB,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,GAAG,GAAG,OAAO,IAAA;AAAA,EACtD;AACA,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,yBAAA,CAA0B,QAAA,EAAU,IAAA,CAAK,GAAG,GAAG,OAAO,IAAA;AAAA,EAC5D;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,wBAAA,CACd,UACA,QAAA,EACgB;AAChB,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,EAAU,QAAQ,CAAA;AACpD,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,EAAA,OAAO,wBAAA,CAAyB,QAAA,EAAU,QAAA,CAAS,GAAG,CAAA;AACxD;AAEO,SAAS,wBAAA,CACd,QAAA,EACA,QAAA,EACA,iBAAA,EACgB;AAChB,EAAA,IAAI,iBAAA,CAAkB,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAC5C,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,EAAU,QAAQ,CAAA;AACpD,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,EAAA,MAAM,GAAA,GAAM,wBAAA,CAAyB,QAAA,EAAU,QAAA,CAAS,GAAG,CAAA;AAC3D,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,QAAQ,iBAAA,EAAmB;AACpC,IAAA,IAAI,GAAA,CAAI,IAAI,CAAA,KAAM,MAAA,WAAoB,IAAI,CAAA,GAAI,IAAI,IAAI,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,mBACd,UAAA,GAA6B,EAAC,EAC9B,QAAA,EACA,UACA,SAAA,EACgB;AAChB,EAAA,IAAI,YAA4B,EAAC;AACjC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,mBAAA,CAAoB,SAAS,CAAA;AAChE,IAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,MAAM,UAAA,CAAW,CAAC,MAAM,MAAS,CAAA;AAClE,IAAA,SAAA,GAAY,wBAAA,CAAyB,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA;AAAA,EAClE,CAAA,MAAO;AACL,IAAA,SAAA,GAAY,wBAAA,CAAyB,UAAU,QAAQ,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,EAAE,GAAG,SAAA,EAAW,GAAG,UAAA,EAAW;AACvC","file":"index.cjs","sourcesContent":["import type { ConditionGroup, ConditionOperator, ConditionRule, ExternalEnum } from \"./schema\";\n\n// ---------------------------------------------------------------------------\n// Data context\n// ---------------------------------------------------------------------------\n\n/**\n * All journey data, keyed by stepId then fieldId.\n * Example: { personal: { age: 25, name: \"Alice\" }, billing: { plan: \"pro\" } }\n */\nexport type JourneyData = Record<string, Record<string, unknown>>;\n\n/**\n * External variables injected at runtime.\n * Example: { isPremium: true, userId: \"abc-123\" }\n */\nexport type ExternalVars = Record<string, unknown>;\n\n// ---------------------------------------------------------------------------\n// Path resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves a field path to its value from the data context.\n * - \"stepId.fieldId\" → journey data\n * - \"$ext.varId\" → external variable\n * - \"$step.stepId.skipped\" → whether the step was skipped (boolean)\n */\nexport function resolveFieldValue(\n path: string,\n data: JourneyData,\n externalVars: ExternalVars,\n skippedSteps?: string[]\n): unknown {\n if (path.startsWith(\"$ext.\")) {\n const varId = path.slice(5);\n return externalVars[varId];\n }\n\n if (path.startsWith(\"$step.\") && path.endsWith(\".skipped\")) {\n const stepId = path.slice(6, -8); // \"$step.\".length=6, \".skipped\".length=8\n return skippedSteps?.includes(stepId) ?? false;\n }\n\n const dotIndex = path.indexOf(\".\");\n if (dotIndex === -1) return undefined;\n\n const stepId = path.slice(0, dotIndex);\n const fieldId = path.slice(dotIndex + 1);\n return data[stepId]?.[fieldId];\n}\n\n// ---------------------------------------------------------------------------\n// Operator evaluation\n// ---------------------------------------------------------------------------\n\nfunction evaluateOperator(\n operator: ConditionOperator,\n actual: unknown,\n expected: unknown\n): boolean {\n switch (operator) {\n case \"exists\":\n return actual !== undefined && actual !== null && actual !== \"\";\n\n case \"notExists\":\n return actual === undefined || actual === null || actual === \"\";\n\n case \"equals\":\n return actual === expected;\n\n case \"notEquals\":\n return actual !== expected;\n\n case \"greaterThan\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual > expected\n : Number(actual) > Number(expected);\n\n case \"greaterThanOrEqual\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual >= expected\n : Number(actual) >= Number(expected);\n\n case \"lessThan\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual < expected\n : Number(actual) < Number(expected);\n\n case \"lessThanOrEqual\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual <= expected\n : Number(actual) <= Number(expected);\n\n case \"contains\":\n if (typeof actual === \"string\" && typeof expected === \"string\") {\n return actual.includes(expected);\n }\n if (Array.isArray(actual)) {\n return actual.includes(expected);\n }\n return false;\n\n case \"notContains\":\n if (typeof actual === \"string\" && typeof expected === \"string\") {\n return !actual.includes(expected);\n }\n if (Array.isArray(actual)) {\n return !actual.includes(expected);\n }\n return true;\n\n case \"in\":\n return Array.isArray(expected) && expected.includes(actual);\n\n case \"notIn\":\n return Array.isArray(expected) && !expected.includes(actual);\n\n case \"matches\":\n if (typeof actual !== \"string\" || typeof expected !== \"string\") return false;\n try {\n return new RegExp(expected).test(actual);\n } catch {\n return false;\n }\n\n default:\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Rule & group evaluation\n// ---------------------------------------------------------------------------\n\nfunction evaluateRule(\n rule: ConditionRule,\n data: JourneyData,\n externalVars: ExternalVars,\n externalEnums?: ExternalEnum[],\n skippedSteps?: string[]\n): boolean {\n const actual = resolveFieldValue(rule.field, data, externalVars, skippedSteps);\n\n if ((rule.operator === \"inEnum\" || rule.operator === \"notInEnum\") && externalEnums) {\n const enumDef = externalEnums.find((e) => e.id === String(rule.value));\n const values = enumDef?.values.map((v) => String(v.value)) ?? [];\n return rule.operator === \"inEnum\"\n ? values.includes(String(actual))\n : !values.includes(String(actual));\n }\n\n return evaluateOperator(rule.operator, actual, rule.value);\n}\n\n/**\n * Evaluates a condition group against the current data context.\n * Returns true if the group's conditions are satisfied.\n */\nexport function evaluateConditionGroup(\n group: ConditionGroup,\n data: JourneyData,\n externalVars: ExternalVars,\n externalEnums?: ExternalEnum[],\n skippedSteps?: string[]\n): boolean {\n const ruleResults = group.rules.map((rule) =>\n evaluateRule(rule, data, externalVars, externalEnums, skippedSteps)\n );\n\n const groupResults = (group.groups ?? []).map((subGroup) =>\n evaluateConditionGroup(subGroup, data, externalVars, externalEnums, skippedSteps)\n );\n\n const allResults = [...ruleResults, ...groupResults];\n\n if (allResults.length === 0) return true;\n\n return group.combinator === \"and\"\n ? allResults.every(Boolean)\n : allResults.some(Boolean);\n}\n\n/**\n * Convenience: returns true if no condition is defined (always visible),\n * or if the condition group evaluates to true.\n */\nexport function isVisible(\n visibleWhen: ConditionGroup | undefined,\n data: JourneyData,\n externalVars: ExternalVars,\n externalEnums?: ExternalEnum[],\n skippedSteps?: string[]\n): boolean {\n if (!visibleWhen) return true;\n return evaluateConditionGroup(visibleWhen, data, externalVars, externalEnums, skippedSteps);\n}\n","import type { ExternalEnum, ExternalVariable, FieldDefinition, SelectOption, StepDefinition, WaypointSchema } from \"./schema\";\nimport { type ExternalVars, type JourneyData, evaluateConditionGroup, isVisible, resolveFieldValue } from \"./conditions\";\n\n// ---------------------------------------------------------------------------\n// Resolved types\n// ---------------------------------------------------------------------------\n\n/** A field after condition evaluation */\nexport interface ResolvedField {\n definition: FieldDefinition;\n /** Whether the field is currently visible */\n visible: boolean;\n /** Whether all dependsOn paths have a non-empty value */\n dependenciesMet: boolean;\n /**\n * Resolved options from an external enum.\n * Set when `definition.externalEnumId` matches an enum in the provided `externalEnums`.\n * Use `field.resolvedOptions ?? field.definition.options` when rendering.\n */\n resolvedOptions?: SelectOption[];\n /**\n * Resolved dynamic default value (first matching `dynamicDefault` rule).\n * Use `field.resolvedDefaultValue ?? field.definition.defaultValue` for initial form values.\n */\n resolvedDefaultValue?: unknown;\n}\n\n/** A step after condition evaluation */\nexport interface ResolvedStep {\n definition: StepDefinition;\n /** Whether this step is currently in the active tree */\n visible: boolean;\n /** Visible fields for this step, in definition order */\n fields: ResolvedField[];\n}\n\n/** Result returned by resolveTree */\nexport interface ResolvedTree {\n /** Ordered list of visible steps */\n steps: ResolvedStep[];\n /** Steps hidden by conditions — data preserved in tmp store */\n hiddenSteps: ResolvedStep[];\n /** Errors: external variables required but missing */\n missingExternalVars: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Dependency check\n// ---------------------------------------------------------------------------\n\nfunction areDependenciesMet(\n dependsOn: string[] | undefined,\n data: JourneyData,\n externalVars: ExternalVars\n): boolean {\n if (!dependsOn || dependsOn.length === 0) return true;\n return dependsOn.every((path) => {\n const value = resolveFieldValue(path, data, externalVars);\n return value !== undefined && value !== null && value !== \"\";\n });\n}\n\n// ---------------------------------------------------------------------------\n// External variable validation\n// ---------------------------------------------------------------------------\n\nfunction findMissingBlockingVars(\n externalVariables: ExternalVariable[] | undefined,\n externalVars: ExternalVars,\n visibleSteps: StepDefinition[]\n): string[] {\n if (!externalVariables || externalVariables.length === 0) return [];\n\n const visibleStepIds = new Set(visibleSteps.map((s) => s.id));\n\n return externalVariables\n .filter((extVar) => {\n if (!extVar.blocking) return false;\n\n // Only check if this variable is actually used by a visible step\n const usedInVisibleStep = extVar.usedIn?.some(\n (ref) => visibleStepIds.has(ref.stepId)\n );\n if (!usedInVisibleStep) return false;\n\n const value = externalVars[extVar.id];\n return value === undefined || value === null;\n })\n .map((extVar) => extVar.id);\n}\n\n// ---------------------------------------------------------------------------\n// Core resolver\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves the journey tree against current data and external variables.\n *\n * - Steps with a falsy `visibleWhen` are moved to `hiddenSteps`\n * - Fields within each visible step are evaluated for visibility and dependencies\n * - Missing blocking external variables are reported\n *\n * This function is pure: same inputs always produce same outputs.\n */\nexport function resolveTree(\n schema: WaypointSchema,\n data: JourneyData,\n externalVars: ExternalVars,\n externalEnums?: ExternalEnum[],\n skippedSteps?: string[]\n): ResolvedTree {\n const visibleSteps: ResolvedStep[] = [];\n const hiddenSteps: ResolvedStep[] = [];\n\n for (const stepDef of schema.steps) {\n const stepVisible = isVisible(stepDef.visibleWhen, data, externalVars, externalEnums, skippedSteps);\n\n const resolvedFields: ResolvedField[] = stepDef.fields.map((fieldDef) => {\n let resolvedOptions: SelectOption[] | undefined;\n if (fieldDef.externalEnumId && externalEnums) {\n const enumDef = externalEnums.find((e) => e.id === fieldDef.externalEnumId);\n resolvedOptions = enumDef?.values;\n }\n\n // Evaluate dynamic defaults — first matching rule wins\n let resolvedDefaultValue: unknown;\n if (fieldDef.dynamicDefault && fieldDef.dynamicDefault.length > 0) {\n for (const rule of fieldDef.dynamicDefault) {\n if (evaluateConditionGroup(rule.when, data, externalVars, externalEnums, skippedSteps)) {\n resolvedDefaultValue = rule.value;\n break;\n }\n }\n }\n\n return {\n definition: fieldDef,\n visible: isVisible(fieldDef.visibleWhen, data, externalVars, externalEnums, skippedSteps),\n dependenciesMet: areDependenciesMet(fieldDef.dependsOn, data, externalVars),\n resolvedOptions,\n resolvedDefaultValue,\n };\n });\n\n const resolvedStep: ResolvedStep = {\n definition: stepDef,\n visible: stepVisible,\n fields: resolvedFields,\n };\n\n if (stepVisible) {\n visibleSteps.push(resolvedStep);\n } else {\n hiddenSteps.push(resolvedStep);\n }\n }\n\n const missingExternalVars = findMissingBlockingVars(\n schema.externalVariables,\n externalVars,\n visibleSteps.map((s) => s.definition)\n );\n\n return {\n steps: visibleSteps,\n hiddenSteps,\n missingExternalVars,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Navigation helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the index of the step with the given id in the resolved (visible) tree.\n * Returns -1 if not found.\n */\nexport function findStepIndex(steps: ResolvedStep[], stepId: string): number {\n return steps.findIndex((s) => s.definition.id === stepId);\n}\n\n/**\n * Returns the next visible step after the given stepId, or undefined if last.\n */\nexport function getNextStep(\n steps: ResolvedStep[],\n currentStepId: string\n): ResolvedStep | undefined {\n const index = findStepIndex(steps, currentStepId);\n if (index === -1 || index === steps.length - 1) return undefined;\n return steps[index + 1];\n}\n\n/**\n * Returns the previous visible step before the given stepId, or undefined if first.\n */\nexport function getPreviousStep(\n steps: ResolvedStep[],\n currentStepId: string\n): ResolvedStep | undefined {\n const index = findStepIndex(steps, currentStepId);\n if (index <= 0) return undefined;\n return steps[index - 1];\n}\n\n/**\n * Calculates progress (0–100) based on the resolved visible tree.\n * Uses the index of the current step in the visible tree.\n */\nexport function calculateProgress(\n steps: ResolvedStep[],\n currentStepId: string\n): number {\n if (steps.length === 0) return 0;\n const index = findStepIndex(steps, currentStepId);\n if (index === -1) return 0;\n return Math.round(((index + 1) / (steps.length + 1)) * 100);\n}\n\n/**\n * Given journey data, finds the deepest step the user can access:\n * the last step in the visible tree for which all visible fields\n * have their dependencies met.\n */\nexport function findLastValidStep(\n steps: ResolvedStep[],\n data: JourneyData,\n _externalVars: ExternalVars\n): ResolvedStep | undefined {\n let lastValid: ResolvedStep | undefined;\n\n for (const step of steps) {\n const visibleFields = step.fields.filter((f) => f.visible);\n const allDepsMet = visibleFields.every((f) => f.dependenciesMet);\n\n // A step is \"reachable\" if all its visible required fields' deps are met\n if (allDepsMet) {\n // Check if the step itself has data filled\n const stepData = data[step.definition.id];\n const hasData =\n stepData !== undefined && Object.keys(stepData).length > 0;\n\n if (hasData || step === steps[0]) {\n lastValid = step;\n } else {\n break;\n }\n } else {\n break;\n }\n }\n\n return lastValid ?? steps[0];\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\n\nimport type { WaypointSchema } from \"./schema\";\nimport {\n resolveTree,\n calculateProgress,\n getNextStep,\n getPreviousStep,\n} from \"./tree-resolver\";\nimport type { ResolvedStep, ResolvedTree } from \"./tree-resolver\";\n\n// ---------------------------------------------------------------------------\n// State + Actions\n// ---------------------------------------------------------------------------\n\nexport interface WaypointRuntimeState {\n schema: WaypointSchema | null;\n /** { stepId: { fieldId: value } } */\n data: Record<string, Record<string, unknown>>;\n /** { varId: value } */\n externalVars: Record<string, unknown>;\n currentStepId: string | null;\n /** Step IDs visited in order */\n history: string[];\n /** Step IDs that have been skipped by the user */\n skippedSteps: string[];\n isSubmitting: boolean;\n /** True once onComplete has been called (all steps validated) */\n completed: boolean;\n}\n\nexport interface WaypointRuntimeActions {\n /**\n * Fresh start: sets schema + data and navigates to the first step (or startStepId).\n * Always resets navigation state (currentStepId, history).\n */\n init(\n schema: WaypointSchema,\n options?: {\n data?: Record<string, Record<string, unknown>>;\n externalVars?: Record<string, unknown>;\n startStepId?: string;\n }\n ): void;\n\n /**\n * Resume a previously-started journey.\n * Updates schema + externalVars but preserves data, currentStepId and history\n * as they were persisted (e.g. from localStorage).\n */\n resume(schema: WaypointSchema, externalVars?: Record<string, unknown>): void;\n\n setFieldValue(stepId: string, fieldId: string, value: unknown): void;\n setStepData(stepId: string, data: Record<string, unknown>): void;\n setExternalVar(varId: string, value: unknown): void;\n setCurrentStep(stepId: string): void;\n setIsSubmitting(b: boolean): void;\n setCompleted(b: boolean): void;\n /** Marks a step as skipped (user chose to bypass it) */\n skipStep(stepId: string): void;\n /** Removes a step from the skipped list (e.g. when user goes back and fills it) */\n unskipStep(stepId: string): void;\n /**\n * Truncates history to include only steps up to and including stepId.\n * Called before navigating forward so stale steps from a previous path are removed.\n */\n truncateHistoryAt(stepId: string): void;\n reset(): void;\n}\n\nexport type WaypointRuntimeStore = WaypointRuntimeState & WaypointRuntimeActions;\n\n// ---------------------------------------------------------------------------\n// What the persist middleware saves to localStorage\n// ---------------------------------------------------------------------------\n\ninterface PersistedSlice {\n /** The schema id that was active — used to detect stale persisted data */\n schemaId: string | null;\n data: WaypointRuntimeState[\"data\"];\n currentStepId: WaypointRuntimeState[\"currentStepId\"];\n history: WaypointRuntimeState[\"history\"];\n skippedSteps: WaypointRuntimeState[\"skippedSteps\"];\n completed: WaypointRuntimeState[\"completed\"];\n}\n\n// ---------------------------------------------------------------------------\n// Computed helpers (pure functions — no hooks)\n// ---------------------------------------------------------------------------\n\nexport function getResolvedTree(state: WaypointRuntimeState): ResolvedTree {\n if (!state.schema) {\n return { steps: [], hiddenSteps: [], missingExternalVars: [] };\n }\n return resolveTree(state.schema, state.data, state.externalVars, undefined, state.skippedSteps);\n}\n\nexport function getCurrentStep(state: WaypointRuntimeState): ResolvedStep | undefined {\n if (!state.currentStepId) return undefined;\n return getResolvedTree(state).steps.find(\n (s) => s.definition.id === state.currentStepId\n );\n}\n\nexport function getNextStepFromState(state: WaypointRuntimeState): ResolvedStep | undefined {\n if (!state.currentStepId) return undefined;\n const tree = getResolvedTree(state);\n return getNextStep(tree.steps, state.currentStepId);\n}\n\nexport function getPreviousStepFromState(state: WaypointRuntimeState): ResolvedStep | undefined {\n if (!state.currentStepId) return undefined;\n const tree = getResolvedTree(state);\n return getPreviousStep(tree.steps, state.currentStepId);\n}\n\nexport function calculateProgressFromState(state: WaypointRuntimeState): number {\n if (!state.currentStepId) return 0;\n const tree = getResolvedTree(state);\n return calculateProgress(tree.steps, state.currentStepId);\n}\n\nexport function getMissingBlockingVars(state: WaypointRuntimeState): string[] {\n return getResolvedTree(state).missingExternalVars;\n}\n\n// ---------------------------------------------------------------------------\n// Initial state\n// ---------------------------------------------------------------------------\n\nconst initialState: WaypointRuntimeState = {\n schema: null,\n data: {},\n externalVars: {},\n currentStepId: null,\n history: [],\n skippedSteps: [],\n isSubmitting: false,\n completed: false,\n};\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport interface CreateRuntimeStoreOptions {\n persistenceMode?: string;\n schemaId?: string;\n}\n\nfunction buildStateCreator() {\n return (\n set: (\n partial:\n | Partial<WaypointRuntimeStore>\n | ((state: WaypointRuntimeStore) => Partial<WaypointRuntimeStore>)\n ) => void,\n _get: () => WaypointRuntimeStore\n ): WaypointRuntimeStore => ({\n ...initialState,\n\n init(schema, options = {}) {\n const { data = {}, externalVars = {}, startStepId } = options;\n const firstStepId = startStepId ?? schema.steps[0]?.id ?? null;\n set({\n schema,\n data,\n externalVars,\n currentStepId: firstStepId,\n history: firstStepId ? [firstStepId] : [],\n skippedSteps: [],\n isSubmitting: false,\n completed: false,\n });\n },\n\n resume(schema, externalVars = {}) {\n // Preserve data, currentStepId, history and completed — only update schema + externalVars.\n set((state) => ({\n schema,\n externalVars: { ...state.externalVars, ...externalVars },\n isSubmitting: false,\n }));\n },\n\n setFieldValue(stepId, fieldId, value) {\n set((state) => ({\n data: {\n ...state.data,\n [stepId]: { ...state.data[stepId], [fieldId]: value },\n },\n }));\n },\n\n setStepData(stepId, data) {\n set((state) => ({\n data: { ...state.data, [stepId]: data },\n }));\n },\n\n setExternalVar(varId, value) {\n set((state) => ({\n externalVars: { ...state.externalVars, [varId]: value },\n }));\n },\n\n setCurrentStep(stepId) {\n set((state) => ({\n currentStepId: stepId,\n history: state.history.includes(stepId)\n ? state.history\n : [...state.history, stepId],\n }));\n },\n\n setIsSubmitting(b) {\n set({ isSubmitting: b });\n },\n\n setCompleted(b) {\n set({ completed: b });\n },\n\n skipStep(stepId) {\n set((state) => ({\n skippedSteps: state.skippedSteps.includes(stepId)\n ? state.skippedSteps\n : [...state.skippedSteps, stepId],\n }));\n },\n\n unskipStep(stepId) {\n set((state) => ({\n skippedSteps: state.skippedSteps.filter((id) => id !== stepId),\n }));\n },\n\n truncateHistoryAt(stepId) {\n set((state) => {\n const idx = state.history.indexOf(stepId);\n if (idx === -1 || idx === state.history.length - 1) return state;\n return { history: state.history.slice(0, idx + 1) };\n });\n },\n\n reset() {\n set(initialState);\n },\n });\n}\n\n/**\n * Creates a new runtime store instance (vanilla Zustand, no React dependency).\n *\n * Each schema gets its own isolated store — multiple `<WaypointRunner>` instances\n * with different schemas can coexist simultaneously without sharing state.\n *\n * @param options.persistenceMode - If \"zustand\", activates localStorage persistence\n * @param options.schemaId - Used to build the persistence key (and to validate resume)\n */\nexport function createRuntimeStore(options: CreateRuntimeStoreOptions = {}) {\n const { persistenceMode, schemaId } = options;\n\n if (persistenceMode === \"zustand\") {\n const storageKey = schemaId\n ? `waypoint-runtime-${schemaId}`\n : \"waypoint-runtime\";\n\n return createStore<WaypointRuntimeStore>()(\n persist(buildStateCreator(), {\n name: storageKey,\n storage: createJSONStorage(() => {\n // SSR-safe: fall back to an in-memory noop if localStorage is unavailable\n if (typeof window === \"undefined\") {\n return {\n getItem: () => null,\n setItem: () => {},\n removeItem: () => {},\n };\n }\n return window.localStorage;\n }),\n partialize: (state): PersistedSlice => ({\n // Persist the schema id so WaypointRunner can verify the saved data\n // belongs to this schema (guards against stale data from a renamed schema).\n schemaId: state.schema?.id ?? null,\n data: state.data,\n currentStepId: state.currentStepId,\n history: state.history,\n skippedSteps: state.skippedSteps,\n completed: state.completed,\n }),\n })\n );\n }\n\n return createStore<WaypointRuntimeStore>()(buildStateCreator());\n}\n\n// ---------------------------------------------------------------------------\n// Resume detection helper (used by WaypointRunner)\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true if the store has valid persisted state for the given schema id.\n * Used by WaypointRunner to decide whether to call `resume()` or `init()`.\n *\n * Relies on the fact that localStorage hydration is synchronous, so by the time\n * the first `useEffect` runs, the persisted slice is already merged into state.\n */\nexport function hasPersistedState(\n store: ReturnType<typeof createRuntimeStore>,\n schemaId: string\n): boolean {\n const state = store.getState();\n // The persist middleware merges the PersistedSlice fields directly onto the state object,\n // adding `schemaId` as an extra field not declared in WaypointRuntimeState.\n const persistedSchemaId = (state as unknown as Record<string, unknown>)[\"schemaId\"] as\n | string\n | null\n | undefined;\n return (\n persistedSchemaId === schemaId &&\n state.currentStepId !== null &&\n !state.completed\n );\n}\n\nexport type RuntimeStore = ReturnType<typeof createRuntimeStore>;\n","import { z } from \"zod\";\n\nimport type { ExternalEnum, FieldDefinition, ValidationRule } from \"./schema\";\nimport type { ResolvedField } from \"./tree-resolver\";\nimport type { JourneyData } from \"./conditions\";\nimport { resolveFieldValue } from \"./conditions\";\n\n// ---------------------------------------------------------------------------\n// Custom validator registry\n// ---------------------------------------------------------------------------\n\nconst customValidatorRegistry: Record<string, (value: unknown) => boolean> = {};\n\n/**\n * Register a custom validator function by id.\n * Used for ValidationRule type=\"custom\" with a matching customValidatorId.\n */\nexport function registerCustomValidator(\n id: string,\n fn: (value: unknown) => boolean\n): void {\n customValidatorRegistry[id] = fn;\n}\n\n// ---------------------------------------------------------------------------\n// Field schema builder\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the comparison value for a validation rule.\n * If `refField` is set, resolve from journey data; otherwise use static `value`.\n */\nfunction resolveRuleValue(rule: ValidationRule, data?: JourneyData): unknown {\n if (rule.refField && data) {\n return resolveFieldValue(rule.refField, data, {});\n }\n return rule.value;\n}\n\nfunction buildFieldSchema(field: FieldDefinition, externalEnums?: ExternalEnum[], data?: JourneyData): z.ZodTypeAny {\n const rules = field.validation ?? [];\n const isRequired = rules.some((r) => r.type === \"required\");\n const isNumeric = field.type === \"number\";\n const isCheckbox = field.type === \"checkbox\";\n const isMultiSelect = field.type === \"multiselect\";\n\n if (isCheckbox) {\n const base = z.boolean();\n return isRequired ? base : base.optional();\n }\n\n if (isMultiSelect) {\n const base = z.array(z.string());\n return isRequired ? base.min(1, rules.find((r) => r.type === \"required\")?.message ?? \"Required\") : base.optional();\n }\n\n if (isNumeric) {\n let numSchema = z.coerce.number({\n invalid_type_error: \"Must be a number\",\n });\n\n const numRefineRules: Array<{ fn: (v: number) => boolean; message: string }> = [];\n\n for (const rule of rules) {\n const rv = resolveRuleValue(rule, data);\n const isRef = !!rule.refField;\n\n if (rule.type === \"min\" || rule.type === \"greaterThanOrEqual\") {\n const n = Number(rv);\n if (!isNaN(n)) {\n if (isRef) numRefineRules.push({ fn: (v) => v >= n, message: rule.message });\n else numSchema = numSchema.gte(n, rule.message) as typeof numSchema;\n }\n } else if (rule.type === \"max\" || rule.type === \"lessThanOrEqual\") {\n const n = Number(rv);\n if (!isNaN(n)) {\n if (isRef) numRefineRules.push({ fn: (v) => v <= n, message: rule.message });\n else numSchema = numSchema.lte(n, rule.message) as typeof numSchema;\n }\n } else if (rule.type === \"greaterThan\") {\n const n = Number(rv);\n if (!isNaN(n)) {\n if (isRef) numRefineRules.push({ fn: (v) => v > n, message: rule.message });\n else numSchema = numSchema.gt(n, rule.message) as typeof numSchema;\n }\n } else if (rule.type === \"lessThan\") {\n const n = Number(rv);\n if (!isNaN(n)) {\n if (isRef) numRefineRules.push({ fn: (v) => v < n, message: rule.message });\n else numSchema = numSchema.lt(n, rule.message) as typeof numSchema;\n }\n } else if (rule.type === \"equals\") {\n const n = Number(rv);\n if (!isNaN(n)) numRefineRules.push({ fn: (v) => v === n, message: rule.message });\n } else if (rule.type === \"notEquals\") {\n const n = Number(rv);\n if (!isNaN(n)) numRefineRules.push({ fn: (v) => v !== n, message: rule.message });\n }\n }\n\n let numFinal: z.ZodTypeAny = isRequired ? numSchema : numSchema.optional();\n for (const { fn, message } of numRefineRules) {\n numFinal = numFinal.refine((v) => v == null || fn(v as number), message);\n }\n return numFinal;\n }\n\n // String-based fields — build base schema first (ZodString methods only),\n // then apply .refine() transforms last (they return ZodEffects, not ZodString).\n let strSchema = z.string();\n\n const refineRules: Array<{ fn: (v: unknown) => boolean; message: string }> = [];\n\n for (const rule of rules) {\n switch (rule.type) {\n case \"required\":\n strSchema = strSchema.min(1, rule.message);\n break;\n case \"minLength\": {\n const n = Number(rule.value);\n if (!isNaN(n)) strSchema = strSchema.min(n, rule.message);\n break;\n }\n case \"maxLength\": {\n const n = Number(rule.value);\n if (!isNaN(n)) strSchema = strSchema.max(n, rule.message);\n break;\n }\n case \"email\":\n strSchema = strSchema.email(rule.message);\n break;\n case \"url\":\n strSchema = strSchema.url(rule.message);\n break;\n case \"regex\":\n if (rule.value !== undefined && rule.value !== null) {\n strSchema = strSchema.regex(new RegExp(String(rule.value)), rule.message);\n }\n break;\n case \"equals\": {\n const rv = resolveRuleValue(rule, data);\n if (rv !== undefined) {\n const eq = String(rv);\n refineRules.push({ fn: (v: unknown) => String(v) === eq, message: rule.message });\n }\n break;\n }\n case \"notEquals\": {\n const rv = resolveRuleValue(rule, data);\n if (rv !== undefined) {\n const neq = String(rv);\n refineRules.push({ fn: (v: unknown) => String(v) !== neq, message: rule.message });\n }\n break;\n }\n case \"greaterThan\": {\n const rv = resolveRuleValue(rule, data);\n if (rv !== undefined) {\n const gt = Number(rv);\n refineRules.push({ fn: (v: unknown) => Number(v) > gt, message: rule.message });\n }\n break;\n }\n case \"greaterThanOrEqual\": {\n const rv = resolveRuleValue(rule, data);\n if (rv !== undefined) {\n const gte = Number(rv);\n refineRules.push({ fn: (v: unknown) => Number(v) >= gte, message: rule.message });\n }\n break;\n }\n case \"lessThan\": {\n const rv = resolveRuleValue(rule, data);\n if (rv !== undefined) {\n const lt = Number(rv);\n refineRules.push({ fn: (v: unknown) => Number(v) < lt, message: rule.message });\n }\n break;\n }\n case \"lessThanOrEqual\": {\n const rv = resolveRuleValue(rule, data);\n if (rv !== undefined) {\n const lte = Number(rv);\n refineRules.push({ fn: (v: unknown) => Number(v) <= lte, message: rule.message });\n }\n break;\n }\n case \"contains\": {\n const rv = resolveRuleValue(rule, data);\n if (rv !== undefined) {\n const sub = String(rv);\n refineRules.push({ fn: (v: unknown) => String(v).includes(sub), message: rule.message });\n }\n break;\n }\n case \"notContains\": {\n const rv = resolveRuleValue(rule, data);\n if (rv !== undefined) {\n const nsub = String(rv);\n refineRules.push({ fn: (v: unknown) => !String(v).includes(nsub), message: rule.message });\n }\n break;\n }\n case \"matches\":\n if (rule.value !== undefined && rule.value !== null) {\n const rx = new RegExp(String(rule.value));\n refineRules.push({ fn: (v: unknown) => rx.test(String(v)), message: rule.message });\n }\n break;\n case \"inEnum\":\n if (rule.value && externalEnums) {\n const enumDef = externalEnums.find((e) => e.id === String(rule.value));\n if (enumDef) {\n const values = enumDef.values.map((v) => String(v.value));\n refineRules.push({ fn: (v: unknown) => values.includes(String(v)), message: rule.message });\n }\n }\n break;\n case \"notInEnum\":\n if (rule.value && externalEnums) {\n const enumDef = externalEnums.find((e) => e.id === String(rule.value));\n if (enumDef) {\n const values = enumDef.values.map((v) => String(v.value));\n refineRules.push({ fn: (v: unknown) => !values.includes(String(v)), message: rule.message });\n }\n }\n break;\n case \"custom\":\n if (rule.customValidatorId && customValidatorRegistry[rule.customValidatorId]) {\n refineRules.push({ fn: (v: unknown) => Boolean(customValidatorRegistry[rule.customValidatorId!]?.(v)), message: rule.message });\n }\n break;\n }\n }\n\n // Apply optional before refines (ZodString → ZodOptional or keep as ZodString)\n let finalSchema: z.ZodTypeAny = isRequired ? strSchema : strSchema.optional();\n\n // Append custom .refine() calls (return ZodEffects, safe as ZodTypeAny)\n for (const { fn, message } of refineRules) {\n finalSchema = finalSchema.refine(fn, message);\n }\n\n return finalSchema;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a Zod object schema from a list of resolved fields.\n *\n * - Only visible fields are included in the schema.\n * - Fields without a `required` validation rule are wrapped in `.optional()`.\n * - Numeric fields use `z.coerce.number()` so string inputs are coerced.\n */\nexport function buildZodSchema(\n fields: ResolvedField[],\n externalEnums?: ExternalEnum[],\n data?: JourneyData\n): z.ZodObject<z.ZodRawShape> {\n const shape: z.ZodRawShape = {};\n\n for (const resolvedField of fields) {\n if (!resolvedField.visible) continue;\n shape[resolvedField.definition.id] = buildFieldSchema(resolvedField.definition, externalEnums, data);\n }\n\n return z.object(shape);\n}\n","/**\n * Runtime validation for WaypointSchema JSON.\n *\n * Validates structure and basic constraints without relying on TypeScript types.\n * Designed to be used at import time (builder) and at boot time (runtime).\n */\n\nimport type { WaypointSchema } from \"./schema\";\n\n// ---------------------------------------------------------------------------\n// Result type\n// ---------------------------------------------------------------------------\n\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SUPPORTED_VERSIONS = [\"1\"] as const;\n\nconst VALID_PERSISTENCE_MODES = new Set([\"zustand\", \"backend-step\", \"backend-manual\"]);\n\nconst VALID_EXT_VAR_TYPES = new Set([\"string\", \"number\", \"boolean\", \"object\"]);\n\nconst VALID_CONDITION_OPERATORS = new Set([\n \"equals\", \"notEquals\",\n \"greaterThan\", \"greaterThanOrEqual\",\n \"lessThan\", \"lessThanOrEqual\",\n \"contains\", \"notContains\",\n \"in\", \"notIn\",\n \"exists\", \"notExists\",\n \"matches\",\n]);\n\nconst VALID_VALIDATION_TYPES = new Set([\n \"required\", \"min\", \"max\", \"minLength\", \"maxLength\", \"email\", \"url\", \"regex\", \"custom\",\n]);\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validates a raw parsed JSON value as a WaypointSchema.\n *\n * Returns `{ valid: true, errors: [] }` when the schema is acceptable.\n * Returns `{ valid: false, errors: [...] }` with a list of human-readable errors otherwise.\n */\nexport function validateSchema(raw: unknown): SchemaValidationResult {\n const errors: string[] = [];\n\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return { valid: false, errors: [\"Root must be a JSON object\"] };\n }\n\n const obj = raw as Record<string, unknown>;\n\n // ── Top-level required fields ────────────────────────────────────────────\n\n // version\n if (!(\"version\" in obj)) {\n errors.push('Missing required field \"version\"');\n } else if (!SUPPORTED_VERSIONS.includes(obj.version as typeof SUPPORTED_VERSIONS[number])) {\n errors.push(`Unsupported version \"${obj.version}\". Supported: ${SUPPORTED_VERSIONS.join(\", \")}`);\n }\n\n // id\n if (!(\"id\" in obj) || typeof obj.id !== \"string\" || !obj.id.trim()) {\n errors.push('Field \"id\" must be a non-empty string');\n }\n\n // name\n if (!(\"name\" in obj) || typeof obj.name !== \"string\" || !obj.name.trim()) {\n errors.push('Field \"name\" must be a non-empty string');\n }\n\n // steps\n if (!(\"steps\" in obj) || !Array.isArray(obj.steps)) {\n errors.push('Field \"steps\" must be an array');\n } else {\n validateSteps(obj.steps, errors);\n }\n\n // persistenceMode (optional)\n if (\"persistenceMode\" in obj && !VALID_PERSISTENCE_MODES.has(obj.persistenceMode as string)) {\n errors.push(\n `Invalid \"persistenceMode\" \"${obj.persistenceMode}\". Must be one of: ${[...VALID_PERSISTENCE_MODES].join(\", \")}`,\n );\n }\n\n // externalVariables (optional)\n if (\"externalVariables\" in obj) {\n if (!Array.isArray(obj.externalVariables)) {\n errors.push('\"externalVariables\" must be an array');\n } else {\n validateExternalVariables(obj.externalVariables, errors);\n }\n }\n\n // customTypes (optional)\n if (\"customTypes\" in obj && !Array.isArray(obj.customTypes)) {\n errors.push('\"customTypes\" must be an array');\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction validateSteps(steps: unknown[], errors: string[]) {\n const seenIds = new Set<string>();\n\n steps.forEach((step, i) => {\n const prefix = `steps[${i}]`;\n\n if (!step || typeof step !== \"object\" || Array.isArray(step)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const s = step as Record<string, unknown>;\n\n // id\n if (typeof s.id !== \"string\" || !s.id.trim()) {\n errors.push(`${prefix}: \"id\" must be a non-empty string`);\n } else if (seenIds.has(s.id)) {\n errors.push(`${prefix}: duplicate step id \"${s.id}\"`);\n } else {\n seenIds.add(s.id);\n }\n\n // title\n if (typeof s.title !== \"string\" || !s.title.trim()) {\n errors.push(`${prefix}: \"title\" must be a non-empty string`);\n }\n\n // url\n if (typeof s.url !== \"string\" || !s.url.trim()) {\n errors.push(`${prefix}: \"url\" must be a non-empty string`);\n }\n\n // fields\n if (!Array.isArray(s.fields)) {\n errors.push(`${prefix}: \"fields\" must be an array`);\n } else {\n validateFields(s.fields, s.id as string, prefix, errors);\n }\n\n // visibleWhen (optional)\n if (\"visibleWhen\" in s) {\n validateConditionGroup(s.visibleWhen, `${prefix}.visibleWhen`, errors);\n }\n });\n}\n\nfunction validateFields(\n fields: unknown[],\n stepId: string,\n parentPrefix: string,\n errors: string[],\n) {\n const seenIds = new Set<string>();\n\n fields.forEach((field, i) => {\n const prefix = `${parentPrefix}.fields[${i}]`;\n\n if (!field || typeof field !== \"object\" || Array.isArray(field)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const f = field as Record<string, unknown>;\n\n // id\n if (typeof f.id !== \"string\" || !f.id.trim()) {\n errors.push(`${prefix}: \"id\" must be a non-empty string`);\n } else if (seenIds.has(f.id)) {\n errors.push(`${prefix}: duplicate field id \"${f.id}\" in step \"${stepId}\"`);\n } else {\n seenIds.add(f.id as string);\n }\n\n // type\n if (typeof f.type !== \"string\" || !f.type.trim()) {\n errors.push(`${prefix}: \"type\" must be a non-empty string`);\n }\n\n // label\n if (typeof f.label !== \"string\" || !f.label.trim()) {\n errors.push(`${prefix}: \"label\" must be a non-empty string`);\n }\n\n // options (optional)\n if (\"options\" in f && !Array.isArray(f.options)) {\n errors.push(`${prefix}: \"options\" must be an array`);\n }\n\n // validation (optional)\n if (\"validation\" in f) {\n if (!Array.isArray(f.validation)) {\n errors.push(`${prefix}: \"validation\" must be an array`);\n } else {\n validateValidationRules(f.validation, prefix, errors);\n }\n }\n\n // dependsOn (optional)\n if (\"dependsOn\" in f) {\n if (!Array.isArray(f.dependsOn)) {\n errors.push(`${prefix}: \"dependsOn\" must be an array`);\n } else {\n for (const dep of f.dependsOn as unknown[]) {\n if (typeof dep !== \"string\") {\n errors.push(`${prefix}: each \"dependsOn\" entry must be a string`);\n }\n }\n }\n }\n\n // visibleWhen (optional)\n if (\"visibleWhen\" in f) {\n validateConditionGroup(f.visibleWhen, `${prefix}.visibleWhen`, errors);\n }\n });\n}\n\nfunction validateConditionGroup(group: unknown, prefix: string, errors: string[]) {\n if (!group || typeof group !== \"object\" || Array.isArray(group)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const g = group as Record<string, unknown>;\n\n if (g.combinator !== \"and\" && g.combinator !== \"or\") {\n errors.push(`${prefix}: \"combinator\" must be \"and\" or \"or\"`);\n }\n\n if (!Array.isArray(g.rules)) {\n errors.push(`${prefix}: \"rules\" must be an array`);\n } else {\n (g.rules as unknown[]).forEach((rule, i) => {\n validateConditionRule(rule, `${prefix}.rules[${i}]`, errors);\n });\n }\n\n if (\"groups\" in g && Array.isArray(g.groups)) {\n (g.groups as unknown[]).forEach((nested, i) => {\n validateConditionGroup(nested, `${prefix}.groups[${i}]`, errors);\n });\n }\n}\n\nfunction validateConditionRule(rule: unknown, prefix: string, errors: string[]) {\n if (!rule || typeof rule !== \"object\" || Array.isArray(rule)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const r = rule as Record<string, unknown>;\n\n if (typeof r.field !== \"string\" || !r.field.trim()) {\n errors.push(`${prefix}: \"field\" must be a non-empty string`);\n }\n\n if (!VALID_CONDITION_OPERATORS.has(r.operator as string)) {\n errors.push(\n `${prefix}: invalid operator \"${r.operator}\". Must be one of: ${[...VALID_CONDITION_OPERATORS].join(\", \")}`,\n );\n }\n}\n\nfunction validateValidationRules(rules: unknown[], parentPrefix: string, errors: string[]) {\n rules.forEach((rule, i) => {\n const prefix = `${parentPrefix}.validation[${i}]`;\n\n if (!rule || typeof rule !== \"object\" || Array.isArray(rule)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const r = rule as Record<string, unknown>;\n\n if (!VALID_VALIDATION_TYPES.has(r.type as string)) {\n errors.push(\n `${prefix}: invalid type \"${r.type}\". Must be one of: ${[...VALID_VALIDATION_TYPES].join(\", \")}`,\n );\n }\n\n if (typeof r.message !== \"string\" || !r.message.trim()) {\n errors.push(`${prefix}: \"message\" must be a non-empty string`);\n }\n });\n}\n\nfunction validateExternalVariables(vars: unknown[], errors: string[]) {\n const seenIds = new Set<string>();\n\n vars.forEach((v, i) => {\n const prefix = `externalVariables[${i}]`;\n\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const ev = v as Record<string, unknown>;\n\n if (typeof ev.id !== \"string\" || !ev.id.trim()) {\n errors.push(`${prefix}: \"id\" must be a non-empty string`);\n } else if (seenIds.has(ev.id)) {\n errors.push(`${prefix}: duplicate external variable id \"${ev.id}\"`);\n } else {\n seenIds.add(ev.id as string);\n }\n\n if (typeof ev.label !== \"string\" || !ev.label.trim()) {\n errors.push(`${prefix}: \"label\" must be a non-empty string`);\n }\n\n if (!VALID_EXT_VAR_TYPES.has(ev.type as string)) {\n errors.push(\n `${prefix}: invalid type \"${ev.type}\". Must be one of: ${[...VALID_EXT_VAR_TYPES].join(\", \")}`,\n );\n }\n\n if (typeof ev.blocking !== \"boolean\") {\n errors.push(`${prefix}: \"blocking\" must be a boolean`);\n }\n });\n}\n\n/**\n * Convenience: assert a schema is valid, throw with all errors if not.\n * Useful in tests or runtime boot checks.\n */\nexport function assertSchema(raw: unknown): asserts raw is WaypointSchema {\n const result = validateSchema(raw);\n if (!result.valid) {\n throw new Error(`Invalid WaypointSchema:\\n${result.errors.map((e) => ` - ${e}`).join(\"\\n\")}`);\n }\n}\n","import type { WaypointParams } from \"./types\";\n\ninterface StepDefinition {\n step: string;\n url: string;\n}\n\n/**\n * Utility class for URL template formatting and validation.\n * Templates use `{{PARAM_NAME}}` syntax.\n *\n * @example\n * URLTemplateEngine.format(\"/users/{{USER_ID}}/posts/{{POST_ID}}\", { USER_ID: \"42\", POST_ID: \"hello\" })\n * // => \"/users/42/posts/hello\"\n */\nexport class URLTemplateEngine {\n private static readonly PLACEHOLDER_PATTERN = /\\{\\{([^}]+)\\}\\}/g;\n\n /**\n * Replace all `{{PARAM}}` placeholders in a template with the provided values.\n * Missing params are left as-is.\n */\n static format(template: string, params: WaypointParams): string {\n return template.replace(this.PLACEHOLDER_PATTERN, (match, key) => {\n const value = params[key];\n if (value === undefined || value === null) {\n console.log(`Waypoint: missing parameter \"${key}\" in URL: ${template}`);\n return match;\n }\n return String(value);\n });\n }\n\n /**\n * Extract all placeholder names from a URL template.\n */\n static extractPlaceholders(template: string): string[] {\n const matches = template.match(this.PLACEHOLDER_PATTERN);\n return matches ? matches.map((m) => m.replace(/[{}]/g, \"\")) : [];\n }\n\n /**\n * Validate that all placeholders in the template have corresponding params.\n */\n static validate(\n template: string,\n params: WaypointParams\n ): { isValid: boolean; missingParams: string[] } {\n const placeholders = this.extractPlaceholders(template);\n const missingParams = placeholders.filter((key) => params[key] === undefined);\n return { isValid: missingParams.length === 0, missingParams };\n }\n}\n\n// ── Private URL matching helpers (used by hooks) ──────────────────────────────\n\nfunction doesPatternMatchURL(pathname: string, urlPattern: string): boolean {\n const regexPattern = urlPattern\n .replace(/\\{\\{([^}]+)\\}\\}/g, \"([^/]+)\")\n .replace(/\\//g, \"\\\\/\");\n return new RegExp(`^${regexPattern}$`).test(pathname);\n}\n\nfunction doesPatternPartiallyMatch(\n pathname: string,\n urlPattern: string\n): boolean {\n const patternBase = urlPattern\n .replace(/\\{\\{[^}]+\\}\\}/g, \"*\")\n .split(\"/\")\n .filter((segment) => segment !== \"*\" && segment !== \"\");\n\n const pathSegments = pathname.split(\"/\").filter((s) => s !== \"\");\n\n let patternIndex = 0;\n for (const seg of pathSegments) {\n if (\n patternIndex < patternBase.length &&\n seg === patternBase[patternIndex]\n ) {\n patternIndex++;\n }\n }\n return patternIndex === patternBase.length;\n}\n\nfunction extractParamsFromPattern(\n pathname: string,\n urlPattern: string\n): WaypointParams {\n const params: WaypointParams = {};\n const placeholders: string[] = [];\n\n const regexPattern = urlPattern.replace(\n /\\{\\{([^}]+)\\}\\}/g,\n (_match, paramName) => {\n placeholders.push(paramName);\n return \"([^/]+)\";\n }\n );\n\n const regex = new RegExp(`^${regexPattern.replace(/\\//g, \"\\\\/\")}$`);\n const matches = pathname.match(regex);\n\n if (matches) {\n for (let i = 1; i < matches.length; i++) {\n const paramName = placeholders[i - 1];\n const paramValue = matches[i];\n if (paramName.includes(\"_ID\") && /^\\d+$/.test(paramValue)) {\n params[paramName] = parseInt(paramValue, 10);\n } else {\n params[paramName] = paramValue;\n }\n }\n }\n\n return params;\n}\n\nexport function findMatchingStep(\n pathname: string,\n allSteps: StepDefinition[]\n): StepDefinition | null {\n for (const step of allSteps) {\n if (doesPatternMatchURL(pathname, step.url)) return step;\n }\n for (const step of allSteps) {\n if (doesPatternPartiallyMatch(pathname, step.url)) return step;\n }\n return null;\n}\n\nexport function extractURLParamsFromTree(\n pathname: string,\n allSteps: StepDefinition[]\n): WaypointParams {\n const matching = findMatchingStep(pathname, allSteps);\n if (!matching) return {};\n return extractParamsFromPattern(pathname, matching.url);\n}\n\nexport function extractOnlyMissingParams(\n pathname: string,\n allSteps: StepDefinition[],\n missingParamNames: string[]\n): WaypointParams {\n if (missingParamNames.length === 0) return {};\n const matching = findMatchingStep(pathname, allSteps);\n if (!matching) return {};\n\n const all = extractParamsFromPattern(pathname, matching.url);\n const filtered: WaypointParams = {};\n for (const name of missingParamNames) {\n if (all[name] !== undefined) filtered[name] = all[name];\n }\n return filtered;\n}\n\nexport function mergeContextParams(\n userParams: WaypointParams = {},\n pathname: string,\n allSteps: StepDefinition[],\n targetURL?: string\n): WaypointParams {\n let urlParams: WaypointParams = {};\n if (targetURL) {\n const required = URLTemplateEngine.extractPlaceholders(targetURL);\n const missing = required.filter((p) => userParams[p] === undefined);\n urlParams = extractOnlyMissingParams(pathname, allSteps, missing);\n } else {\n urlParams = extractURLParamsFromTree(pathname, allSteps);\n }\n return { ...urlParams, ...userParams };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -7,7 +7,7 @@ import { z } from 'zod';
7
7
  * Auto-sufficient tree definition generated by @waypointjs/builder.
8
8
  * Versioned to allow non-breaking evolution.
9
9
  */
10
- type ConditionOperator = "equals" | "notEquals" | "greaterThan" | "greaterThanOrEqual" | "lessThan" | "lessThanOrEqual" | "contains" | "notContains" | "in" | "notIn" | "exists" | "notExists" | "matches";
10
+ type ConditionOperator = "equals" | "notEquals" | "greaterThan" | "greaterThanOrEqual" | "lessThan" | "lessThanOrEqual" | "contains" | "notContains" | "in" | "notIn" | "exists" | "notExists" | "matches" | "inEnum" | "notInEnum";
11
11
  /**
12
12
  * A single condition rule.
13
13
  * `field` is a dot-path: "stepId.fieldId" for journey data, or "$ext.varId" for external variables.
@@ -27,7 +27,7 @@ interface ConditionGroup {
27
27
  rules: ConditionRule[];
28
28
  groups?: ConditionGroup[];
29
29
  }
30
- type ValidationRuleType = "required" | "min" | "max" | "minLength" | "maxLength" | "email" | "url" | "regex" | "custom";
30
+ type ValidationRuleType = "required" | "min" | "max" | "minLength" | "maxLength" | "email" | "url" | "regex" | "custom" | "equals" | "notEquals" | "greaterThan" | "greaterThanOrEqual" | "lessThan" | "lessThanOrEqual" | "contains" | "notContains" | "matches" | "inEnum" | "notInEnum";
31
31
  interface ValidationRule {
32
32
  type: ValidationRuleType;
33
33
  /** Value for min/max/minLength/maxLength/regex rules */
@@ -36,6 +36,11 @@ interface ValidationRule {
36
36
  message: string;
37
37
  /** For "custom" type: identifier of the validator function registered at runtime */
38
38
  customValidatorId?: string;
39
+ /**
40
+ * Cross-field reference — "stepId.fieldId" path.
41
+ * When set, the comparison target is resolved from journey data instead of using `value`.
42
+ */
43
+ refField?: string;
39
44
  }
40
45
  type BuiltinFieldType = "text" | "number" | "email" | "password" | "tel" | "url" | "textarea" | "select" | "multiselect" | "checkbox" | "radio" | "date" | "file";
41
46
  /** Field type — either a builtin or a custom type id registered at runtime */
@@ -44,14 +49,29 @@ interface SelectOption {
44
49
  label: string;
45
50
  value: string | number;
46
51
  }
52
+ /**
53
+ * A dynamic default rule: if the condition matches, use the given value
54
+ * as the field's default. First matching rule wins.
55
+ */
56
+ interface DynamicDefaultRule {
57
+ when: ConditionGroup;
58
+ value: unknown;
59
+ }
47
60
  interface FieldDefinition {
48
61
  id: string;
49
62
  type: FieldType;
50
63
  label: string;
51
64
  placeholder?: string;
52
65
  defaultValue?: unknown;
53
- /** Options for select/multiselect/radio fields */
66
+ /**
67
+ * Conditional defaults — evaluated in order, first match wins.
68
+ * Falls back to `defaultValue` if no rule matches.
69
+ */
70
+ dynamicDefault?: DynamicDefaultRule[];
71
+ /** Options for select/multiselect/radio fields (hardcoded) */
54
72
  options?: SelectOption[];
73
+ /** Reference to an external enum — options resolved at runtime from app-provided enums */
74
+ externalEnumId?: string;
55
75
  validation?: ValidationRule[];
56
76
  /** Controls visibility of this field within its step */
57
77
  visibleWhen?: ConditionGroup;
@@ -68,6 +88,8 @@ interface StepDefinition$1 {
68
88
  visibleWhen?: ConditionGroup;
69
89
  /** Whether this step can be used as a resume point */
70
90
  enableResumeFromHere?: boolean;
91
+ /** Whether the user can skip this step without filling required fields */
92
+ skippable?: boolean;
71
93
  }
72
94
  interface ExternalVariable {
73
95
  id: string;
@@ -82,6 +104,16 @@ interface ExternalVariable {
82
104
  fieldId?: string;
83
105
  }>;
84
106
  }
107
+ /**
108
+ * An externally-provided list of options for select/multiselect/radio fields.
109
+ * The actual values are injected at runtime (builder prop / runner prop) so
110
+ * the schema only stores a reference (`externalEnumId`).
111
+ */
112
+ interface ExternalEnum {
113
+ id: string;
114
+ label: string;
115
+ values: SelectOption[];
116
+ }
85
117
  /**
86
118
  * A custom field type registered in the builder.
87
119
  * `metadata` is passed through as-is so the backend can enrich it.
@@ -128,20 +160,21 @@ type JourneyData = Record<string, Record<string, unknown>>;
128
160
  type ExternalVars = Record<string, unknown>;
129
161
  /**
130
162
  * Resolves a field path to its value from the data context.
131
- * - "stepId.fieldId" → journey data
132
- * - "$ext.varId" → external variable
163
+ * - "stepId.fieldId" → journey data
164
+ * - "$ext.varId" → external variable
165
+ * - "$step.stepId.skipped" → whether the step was skipped (boolean)
133
166
  */
134
- declare function resolveFieldValue(path: string, data: JourneyData, externalVars: ExternalVars): unknown;
167
+ declare function resolveFieldValue(path: string, data: JourneyData, externalVars: ExternalVars, skippedSteps?: string[]): unknown;
135
168
  /**
136
169
  * Evaluates a condition group against the current data context.
137
170
  * Returns true if the group's conditions are satisfied.
138
171
  */
139
- declare function evaluateConditionGroup(group: ConditionGroup, data: JourneyData, externalVars: ExternalVars): boolean;
172
+ declare function evaluateConditionGroup(group: ConditionGroup, data: JourneyData, externalVars: ExternalVars, externalEnums?: ExternalEnum[], skippedSteps?: string[]): boolean;
140
173
  /**
141
174
  * Convenience: returns true if no condition is defined (always visible),
142
175
  * or if the condition group evaluates to true.
143
176
  */
144
- declare function isVisible(visibleWhen: ConditionGroup | undefined, data: JourneyData, externalVars: ExternalVars): boolean;
177
+ declare function isVisible(visibleWhen: ConditionGroup | undefined, data: JourneyData, externalVars: ExternalVars, externalEnums?: ExternalEnum[], skippedSteps?: string[]): boolean;
145
178
 
146
179
  /** A field after condition evaluation */
147
180
  interface ResolvedField {
@@ -150,6 +183,17 @@ interface ResolvedField {
150
183
  visible: boolean;
151
184
  /** Whether all dependsOn paths have a non-empty value */
152
185
  dependenciesMet: boolean;
186
+ /**
187
+ * Resolved options from an external enum.
188
+ * Set when `definition.externalEnumId` matches an enum in the provided `externalEnums`.
189
+ * Use `field.resolvedOptions ?? field.definition.options` when rendering.
190
+ */
191
+ resolvedOptions?: SelectOption[];
192
+ /**
193
+ * Resolved dynamic default value (first matching `dynamicDefault` rule).
194
+ * Use `field.resolvedDefaultValue ?? field.definition.defaultValue` for initial form values.
195
+ */
196
+ resolvedDefaultValue?: unknown;
153
197
  }
154
198
  /** A step after condition evaluation */
155
199
  interface ResolvedStep {
@@ -177,7 +221,7 @@ interface ResolvedTree {
177
221
  *
178
222
  * This function is pure: same inputs always produce same outputs.
179
223
  */
180
- declare function resolveTree(schema: WaypointSchema, data: JourneyData, externalVars: ExternalVars): ResolvedTree;
224
+ declare function resolveTree(schema: WaypointSchema, data: JourneyData, externalVars: ExternalVars, externalEnums?: ExternalEnum[], skippedSteps?: string[]): ResolvedTree;
181
225
  /**
182
226
  * Returns the index of the step with the given id in the resolved (visible) tree.
183
227
  * Returns -1 if not found.
@@ -212,6 +256,8 @@ interface WaypointRuntimeState {
212
256
  currentStepId: string | null;
213
257
  /** Step IDs visited in order */
214
258
  history: string[];
259
+ /** Step IDs that have been skipped by the user */
260
+ skippedSteps: string[];
215
261
  isSubmitting: boolean;
216
262
  /** True once onComplete has been called (all steps validated) */
217
263
  completed: boolean;
@@ -238,6 +284,10 @@ interface WaypointRuntimeActions {
238
284
  setCurrentStep(stepId: string): void;
239
285
  setIsSubmitting(b: boolean): void;
240
286
  setCompleted(b: boolean): void;
287
+ /** Marks a step as skipped (user chose to bypass it) */
288
+ skipStep(stepId: string): void;
289
+ /** Removes a step from the skipped list (e.g. when user goes back and fills it) */
290
+ unskipStep(stepId: string): void;
241
291
  /**
242
292
  * Truncates history to include only steps up to and including stepId.
243
293
  * Called before navigating forward so stale steps from a previous path are removed.
@@ -288,7 +338,7 @@ declare function registerCustomValidator(id: string, fn: (value: unknown) => boo
288
338
  * - Fields without a `required` validation rule are wrapped in `.optional()`.
289
339
  * - Numeric fields use `z.coerce.number()` so string inputs are coerced.
290
340
  */
291
- declare function buildZodSchema(fields: ResolvedField[]): z.ZodObject<z.ZodRawShape>;
341
+ declare function buildZodSchema(fields: ResolvedField[], externalEnums?: ExternalEnum[], data?: JourneyData): z.ZodObject<z.ZodRawShape>;
292
342
 
293
343
  /**
294
344
  * Runtime validation for WaypointSchema JSON.
@@ -382,4 +432,4 @@ declare function extractURLParamsFromTree(pathname: string, allSteps: StepDefini
382
432
  declare function extractOnlyMissingParams(pathname: string, allSteps: StepDefinition[], missingParamNames: string[]): WaypointParams;
383
433
  declare function mergeContextParams(userParams: WaypointParams | undefined, pathname: string, allSteps: StepDefinition[], targetURL?: string): WaypointParams;
384
434
 
385
- export { type BuiltinFieldType, type ConditionGroup, type ConditionOperator, type ConditionRule, type CreateRuntimeStoreOptions, type CustomTypeDefinition, type ExternalVariable, type ExternalVars, type FieldDefinition, type FieldType, type JourneyData, type JourneyState, type JourneyTreeStep, type JourneyTreeType, type PersistenceMode, type ResolvedField, type ResolvedStep, type ResolvedTree, type RuntimeStore, type SchemaValidationResult, type SelectOption, type StepDefinition$1 as StepDefinition, URLTemplateEngine, type ValidationRule, type ValidationRuleType, type WaypointParams, type WaypointRuntimeActions, type WaypointRuntimeState, type WaypointRuntimeStore, type WaypointSchema, assertSchema, buildZodSchema, calculateProgress, calculateProgressFromState, createRuntimeStore, evaluateConditionGroup, extractOnlyMissingParams, extractURLParamsFromTree, findLastValidStep, findMatchingStep, findStepIndex, getCurrentStep, getMissingBlockingVars, getNextStep, getNextStepFromState, getPreviousStep, getPreviousStepFromState, getResolvedTree, hasPersistedState, isVisible, mergeContextParams, registerCustomValidator, resolveFieldValue, resolveTree, validateSchema };
435
+ export { type BuiltinFieldType, type ConditionGroup, type ConditionOperator, type ConditionRule, type CreateRuntimeStoreOptions, type CustomTypeDefinition, type DynamicDefaultRule, type ExternalEnum, type ExternalVariable, type ExternalVars, type FieldDefinition, type FieldType, type JourneyData, type JourneyState, type JourneyTreeStep, type JourneyTreeType, type PersistenceMode, type ResolvedField, type ResolvedStep, type ResolvedTree, type RuntimeStore, type SchemaValidationResult, type SelectOption, type StepDefinition$1 as StepDefinition, URLTemplateEngine, type ValidationRule, type ValidationRuleType, type WaypointParams, type WaypointRuntimeActions, type WaypointRuntimeState, type WaypointRuntimeStore, type WaypointSchema, assertSchema, buildZodSchema, calculateProgress, calculateProgressFromState, createRuntimeStore, evaluateConditionGroup, extractOnlyMissingParams, extractURLParamsFromTree, findLastValidStep, findMatchingStep, findStepIndex, getCurrentStep, getMissingBlockingVars, getNextStep, getNextStepFromState, getPreviousStep, getPreviousStepFromState, getResolvedTree, hasPersistedState, isVisible, mergeContextParams, registerCustomValidator, resolveFieldValue, resolveTree, validateSchema };