{"version":3,"file":"registry-context-DLWP4Bzy.cjs","names":[],"sources":["../../core/src/data-sources/fetchers/api.ts","../../core/src/data-sources/fetchers/custom.ts","../../core/src/data-sources/fetchers/static.ts","../../core/src/data-sources/transformers.ts","../../core/src/data-sources/registry.ts","../../react/src/data-sources/context.tsx","../../react/src/data-sources/registry-context.tsx"],"sourcesContent":["import type { DataSourceShareableType } from \"../../data-source-api-types\";\nimport type { ApiDataSource, DataSourceContext } from \"../types\";\n\n/**\n * Delegates a preset API source to the injected DataSourceApi adapter.\n * Returns undefined for unknown presets (caller falls through to raw fetch).\n */\nasync function fetchViaAdapter(\n  source: ApiDataSource,\n  context: DataSourceContext,\n): Promise<unknown> {\n  const api = context.api!;\n  const vars = { ...context.variables, ...source.variables };\n\n  switch (source.presetId) {\n    case \"rep-most-shared\": {\n      return api.fetchMostShared(vars?.rep_id ?? \"\", {\n        shareableType:\n          (vars?.shareable_type as DataSourceShareableType) ?? \"products\",\n        limit: vars?.limit ? Number(vars.limit) : undefined,\n        period: vars?.period,\n        languageIso: vars?.language_iso,\n        signal: context.signal,\n      });\n    }\n    case \"rep-most-viewed\": {\n      return api.fetchMostViewed(vars?.rep_id ?? \"\", {\n        shareableType:\n          (vars?.shareable_type as DataSourceShareableType) ?? \"products\",\n        limit: vars?.limit ? Number(vars.limit) : undefined,\n        period: vars?.period,\n        languageIso: vars?.language_iso,\n        signal: context.signal,\n      });\n    }\n    case \"customer-orders\": {\n      // BFF scopes by session — customer_id is informational/optional.\n      return api.fetchOrders(vars?.customer_id ?? \"\", {\n        limit: vars?.limit ? Number(vars.limit) : undefined,\n        status: vars?.status,\n        signal: context.signal,\n      });\n    }\n    case \"customer-subscriptions\": {\n      // BFF scopes by session — customer_id is informational/optional.\n      return api.fetchSubscriptions(vars?.customer_id ?? \"\", {\n        limit: vars?.limit ? Number(vars.limit) : undefined,\n        status: vars?.status,\n        signal: context.signal,\n      });\n    }\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Extracts a value from an object using dot notation path\n * e.g., getByPath({ data: { items: [1,2,3] } }, 'data.items') => [1,2,3]\n */\nfunction getByPath(obj: unknown, path: string): unknown {\n  return path.split(\".\").reduce((current, key) => {\n    if (current && typeof current === \"object\" && key in current) {\n      return (current as Record<string, unknown>)[key];\n    }\n    return undefined;\n  }, obj);\n}\n\n/**\n * Replaces {variable} placeholders in an endpoint path with values from the\n * variables map. E.g., \"/reps/{rep_id}/most_shared\" with { rep_id: \"42\" }\n * becomes \"/reps/42/most_shared\".\n */\nfunction interpolateVariables(\n  endpoint: string,\n  variables?: Record<string, string>,\n): string {\n  if (!variables) return endpoint;\n  const resolved = endpoint.replace(\n    /\\{(\\w+)\\}/g,\n    (match, key: string) => variables[key] ?? match,\n  );\n  const unresolved = resolved.match(/\\{(\\w+)\\}/g);\n  if (unresolved) {\n    console.warn(\n      `[DataSource] Unresolved variable placeholders in endpoint: ${unresolved.join(\", \")}. ` +\n        `Endpoint: \"${endpoint}\". Available variables: ${Object.keys(variables).join(\", \") || \"(none)\"}`,\n    );\n  }\n  return stripAllQueryParams(resolved);\n}\n\n/**\n * Removes query parameters whose value is \"all\" from a URL.\n *\n * Convention: \"all\" is a reserved no-op value for data source preset\n * config fields. Preset authors should use \"all\" as the default option\n * for \"show everything\" filters. This function strips those params so\n * APIs that don't recognise \"all\" fall back to their default (return\n * everything) behaviour. Do not use \"all\" as a meaningful filter value\n * in preset endpoints.\n */\nfunction stripAllQueryParams(url: string): string {\n  const qIndex = url.indexOf(\"?\");\n  if (qIndex === -1) return url;\n\n  const base = url.slice(0, qIndex);\n  const query = url.slice(qIndex + 1);\n  const kept = query\n    .split(\"&\")\n    .filter((pair) => {\n      const eqIndex = pair.indexOf(\"=\");\n      if (eqIndex === -1) return true;\n      return pair.slice(eqIndex + 1) !== \"all\";\n    })\n    .join(\"&\");\n\n  return kept ? `${base}?${kept}` : base;\n}\n\n/**\n * Resolves the full URL for an endpoint.\n * - Substitutes {variable} placeholders from context variables\n * - Absolute URLs (starting with http:// or https://) are used as-is\n * - Relative paths are prefixed with the context's baseUrl\n */\nfunction resolveEndpointUrl(\n  endpoint: string,\n  baseUrl?: string,\n  variables?: Record<string, string>,\n): string {\n  const resolved = interpolateVariables(endpoint, variables);\n\n  // If endpoint is already absolute, use it directly\n  if (resolved.startsWith(\"http://\") || resolved.startsWith(\"https://\")) {\n    return resolved;\n  }\n\n  // If we have a baseUrl, prepend it to the relative endpoint\n  if (baseUrl) {\n    // Ensure proper joining (no double slashes)\n    const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n    const path = resolved.startsWith(\"/\") ? resolved : `/${resolved}`;\n    return `${base}${path}`;\n  }\n\n  // No baseUrl provided, return endpoint as-is (will likely fail for relative paths)\n  return resolved;\n}\n\n/**\n * Default API fetcher implementation\n */\nexport async function apiFetcher(\n  source: ApiDataSource,\n  context: DataSourceContext,\n): Promise<unknown> {\n  // Delegate to adapter if available for preset-backed sources\n  if (context.api && source.presetId) {\n    const result = await fetchViaAdapter(source, context);\n    if (result !== undefined) return result;\n    // Fall through to legacy fetch for unknown presets\n  }\n\n  const { endpoint, method = \"GET\", headers = {}, body, resultPath } = source;\n\n  // Merge context variables with per-source variables (source overrides context)\n  const mergedVariables = { ...context.variables, ...source.variables };\n\n  // Resolve the full URL, substituting variables and using baseUrl for relative endpoints\n  const url = resolveEndpointUrl(endpoint, context.baseUrl, mergedVariables);\n\n  // Skip the fetch if the URL still contains unresolved {variable} placeholders\n  // (e.g. rep_id not yet loaded). Return null — TanStack Query treats undefined\n  // as a missing return and throws, so use null for the no-op case.\n  if (/\\{\\w+\\}/.test(url)) {\n    return null;\n  }\n\n  const fetchOptions: RequestInit = {\n    method,\n    headers: {\n      \"content-type\": \"application/json\",\n      ...context.getApiHeaders?.(),\n      ...headers,\n    },\n    signal: context.signal,\n  };\n\n  if (body && (method === \"POST\" || method === \"PUT\")) {\n    fetchOptions.body = JSON.stringify(body);\n  }\n\n  const response = await fetch(url, fetchOptions);\n\n  if (!response.ok) {\n    throw new Error(\n      `API request failed: ${response.status} ${response.statusText}`,\n    );\n  }\n\n  const data = await response.json();\n\n  // Extract data at resultPath if specified\n  if (resultPath) {\n    return getByPath(data, resultPath);\n  }\n\n  return data;\n}\n","import type { ResourceType } from \"../../data-source-api-types\";\nimport type {\n  CustomDataSource,\n  DataSourceContext,\n  SelectedItem,\n} from \"../types\";\n\nexport const SHAREABLE_TO_RESOURCE_TYPE: Record<string, ResourceType> = {\n  Medium: \"Medium\",\n  Page: \"Page\",\n  Library: \"Library\",\n  Product: \"Product\",\n  EnrollmentPack: \"EnrollmentPack\",\n};\n\nasync function fetchItemsViaAdapter(\n  items: SelectedItem[],\n  context: DataSourceContext,\n): Promise<unknown[]> {\n  const api = context.api!;\n  const languageIso = context.variables?.language_iso;\n\n  // Use Promise.allSettled so individual failures don't blow up the whole\n  // batch, but *do* surface the aggregate failure for visibility — a rep who\n  // hand-picked 5 items shouldn't silently see 3 without knowing why.\n  const settled = await Promise.allSettled(\n    items.map(async (item) => {\n      const resourceType = SHAREABLE_TO_RESOURCE_TYPE[item.shareableType];\n      if (!resourceType) {\n        throw new Error(\n          `Unknown shareable type: ${item.shareableType} for item #${item.id}`,\n        );\n      }\n      return api.fetchResource(\n        resourceType,\n        item.id,\n        context.signal,\n        languageIso,\n      );\n    }),\n  );\n\n  const successful: unknown[] = [];\n  const failures: { item: SelectedItem; reason: unknown }[] = [];\n\n  settled.forEach((result, index) => {\n    const item = items[index];\n    if (!item) return;\n    if (result.status === \"fulfilled\") {\n      successful.push(result.value);\n    } else {\n      failures.push({ item, reason: result.reason });\n    }\n  });\n\n  if (failures.length > 0) {\n    // Log once with aggregate context so Sentry/logs show the full picture\n    // rather than N scattered warnings that are hard to correlate.\n    console.error(\n      `[CustomFetcher] ${failures.length}/${items.length} items failed to fetch:`,\n      failures.map((f) => ({\n        shareableType: f.item.shareableType,\n        id: f.item.id,\n        error: f.reason instanceof Error ? f.reason.message : f.reason,\n      })),\n    );\n  }\n\n  if (successful.length === 0 && items.length > 0) {\n    const firstErr = failures[0]?.reason;\n    throw new Error(\n      `Failed to fetch all ${items.length} item(s)${firstErr instanceof Error ? `: ${firstErr.message}` : \"\"}`,\n    );\n  }\n\n  return successful;\n}\n\n/**\n * Custom fetcher that fetches selected items via the injected DataSourceApi adapter.\n *\n * Fetches all items in parallel for performance.\n * Returns an array of successfully fetched items, preserving order.\n * Logs warnings for failed fetches but doesn't throw unless all items fail.\n */\nexport async function customFetcher(\n  source: CustomDataSource,\n  context: DataSourceContext,\n): Promise<unknown[]> {\n  const { selectedItems } = source;\n  if (!selectedItems || selectedItems.length === 0) {\n    return [];\n  }\n\n  if (!context.api) {\n    throw new Error(\n      \"customFetcher requires context.api — ensure a DataSourceApiProvider wraps this tree.\",\n    );\n  }\n\n  return fetchItemsViaAdapter(selectedItems, context);\n}\n","import type {\n  StaticDataSource,\n  DataSourceContext,\n  StaticSourceType,\n} from \"../types\";\n\n/**\n * Static data source fetcher.\n *\n * Delegates to the injected DataSourceApi adapter to fetch products filtered\n * by collection, category, or tag.\n */\nexport async function staticFetcher(\n  source: StaticDataSource,\n  context: DataSourceContext,\n): Promise<unknown[]> {\n  const { staticType, selectedId } = source;\n\n  if (!context.api) {\n    throw new Error(\n      \"staticFetcher requires context.api — ensure a DataSourceApiProvider wraps this tree.\",\n    );\n  }\n\n  // Validate filterId once at the shared delegation point so BFF and legacy\n  // adapters behave identically. Tags are a known-unsupported type the\n  // adapters throw for separately.\n  if (staticType !== \"tags\" && Number.isNaN(Number(selectedId))) {\n    throw new Error(\n      `staticFetcher: selectedId must be numeric, got \"${selectedId}\"`,\n    );\n  }\n\n  return context.api.fetchProductsByFilter(\n    staticType,\n    selectedId,\n    context.signal,\n  );\n}\n\n/**\n * Endpoints for listing static source items (collections, categories, tags).\n * Used by the portal builder UI for populating selection dropdowns.\n */\nexport const LIST_ENDPOINTS: Record<\n  StaticSourceType,\n  { endpoint: string; resultKey: string }\n> = {\n  collections: {\n    endpoint: \"/company/v1/collections\",\n    resultKey: \"collections\",\n  },\n  categories: { endpoint: \"/company/v1/categories\", resultKey: \"categories\" },\n  tags: { endpoint: \"/company/v1/tags\", resultKey: \"tags\" },\n};\n","/**\n * Widget Transformers\n *\n * Transform functions that map API response data to widget-specific prop shapes.\n * Each widget has one transformer that handles all data structure variants:\n * - Standard: Direct field name match\n * - Legacy: Different field names that need mapping\n * - Minimal: Bare minimum fields that need defaults\n *\n * Usage:\n * 1. Transformers are registered in the DataSourceRegistry\n * 2. Reference by name in ApiDataSource.transform\n * 3. Applied after resultPath extraction, before targetProps assignment\n */\n\nimport type { DataTransformer, DataSource } from \"./types\";\n\n/**\n * Helper to extract image URL from various API response structures.\n * Handles:\n * - Flat fields (Medium, Page, Product): image_url, imageUrl, thumbnail_url, src\n * - Nested images array (EnrollmentPack): images[0].image_url\n * - Nested library_items (Library): library_items[0].relateable.image_url\n */\nfunction extractImageUrl(d: Record<string, unknown>): string {\n  // Try flat fields first (Medium, Page, Product)\n  if (d.image_url) return d.image_url as string;\n  if (d.imageUrl) return d.imageUrl as string;\n  if (d.thumbnail_url) return d.thumbnail_url as string;\n  if (d.src) return d.src as string;\n\n  // Try nested images array (EnrollmentPack)\n  const images = d.images as Array<Record<string, unknown>> | undefined;\n  if (images && images.length > 0) {\n    const firstImage = images[0];\n    if (firstImage?.image_url) return firstImage.image_url as string;\n    if (firstImage?.url) return firstImage.url as string;\n  }\n\n  // Try nested library_items (Library/Playlist)\n  const libraryItems = d.library_items as\n    | Array<Record<string, unknown>>\n    | undefined;\n  if (libraryItems && libraryItems.length > 0) {\n    const firstItem = libraryItems[0];\n    const relateable = firstItem?.relateable as\n      | Record<string, unknown>\n      | undefined;\n    if (relateable?.image_url) return relateable.image_url as string;\n    if (relateable?.imageUrl) return relateable.imageUrl as string;\n    if (relateable?.thumbnail_url) return relateable.thumbnail_url as string;\n  }\n\n  return \"\";\n}\n\n/**\n * Helper to extract description from various API response structures.\n * Handles different field names across endpoints.\n */\nfunction extractDescription(d: Record<string, unknown>): string {\n  // Try various description field names\n  const desc =\n    d.description ?? d.stripped ?? d.stripped_description ?? d.body ?? \"\";\n\n  // Handle nested description object (some APIs return { body: \"...\" })\n  if (typeof desc === \"object\" && desc !== null && \"body\" in desc) {\n    return ((desc as Record<string, unknown>).body as string) ?? \"\";\n  }\n\n  return desc as string;\n}\n\n/**\n * Helper to extract custom widget config from a selected item.\n */\nfunction extractCustomWidgetConfig(\n  d: Record<string, unknown>,\n  source: DataSource | undefined,\n): Record<string, unknown> {\n  if (source === undefined || source.type !== \"custom\") return {};\n\n  const selectedItem = source.selectedItems.find(\n    (s) =>\n      String(s.id) === String(d.id) && s.shareableType === d.shareable_type,\n  );\n  return selectedItem?.widgetConfig ?? {};\n}\n\nfunction hasDisplayValue(value: unknown): boolean {\n  return value !== null && value !== undefined && value !== \"\";\n}\n\nfunction toDisplayString(value: unknown): string | undefined {\n  if (!hasDisplayValue(value)) return undefined;\n  if (typeof value === \"string\") return value;\n  if (typeof value === \"number\") return String(value);\n  return undefined;\n}\n\nfunction isPlainNumericString(value: string): boolean {\n  return /^-?\\d+(\\.\\d+)?$/.test(value);\n}\n\nfunction formatCurrencyValue(\n  value: unknown,\n  currency: unknown,\n): string | undefined {\n  const displayValue = toDisplayString(value)?.trim();\n  if (!displayValue) return undefined;\n  if (!isPlainNumericString(displayValue)) return displayValue;\n  if (typeof currency !== \"string\" || !currency) return displayValue;\n\n  const amount = Number(displayValue);\n  if (!Number.isFinite(amount)) return displayValue;\n\n  try {\n    return new Intl.NumberFormat(undefined, {\n      style: \"currency\",\n      currency,\n    }).format(amount);\n  } catch {\n    return displayValue;\n  }\n}\n\n/**\n * ImageWidget transformer from shareable data\n */\nconst toImagePropsFromShareable: DataTransformer = (data, _source, context) => {\n  const item = Array.isArray(data) ? data[0] : data;\n  const fallbackAlt = context?.t?.(\"table_image_fallback_alt\") ?? \"Image\";\n  if (!item || typeof item !== \"object\") {\n    return { src: \"\", alt: fallbackAlt, objectFit: \"cover\" };\n  }\n\n  const d = item as Record<string, unknown>;\n  return {\n    src: extractImageUrl(d),\n    alt: (d.title ?? d.name ?? d.alt ?? fallbackAlt) as string,\n    objectFit: \"cover\" as const,\n  };\n};\n\n/**\n * VideoWidget transformer from shareable data\n */\nconst toVideoPropsFromShareable: DataTransformer = (data) => {\n  const item = Array.isArray(data) ? data[0] : data;\n  if (!item || typeof item !== \"object\") {\n    return { src: \"\", poster: \"\", caption: \"\" };\n  }\n\n  const d = item as Record<string, unknown>;\n  return {\n    src: ((d.video_url ?? d.videoUrl ?? d.src) as string) || \"\",\n    poster: extractImageUrl(d),\n    caption: (d.title ?? d.name ?? d.caption ?? \"\") as string,\n  };\n};\n\n/**\n * Shareable content transformer\n * Normalizes shareable API responses to a consistent format\n */\nconst toShareableProps: DataTransformer = (data, source) => {\n  if (!Array.isArray(data)) return [];\n\n  // Derive a fallback shareable type from the data source configuration.\n  // API presets pass shareable_type in their variables (e.g., \"products\").\n  // Custom sources store it per-item (handled below).\n  const sourceTypeHint =\n    source?.type === \"api\" ? source.variables?.shareable_type : undefined;\n\n  return data.map((item: unknown) => {\n    const d = item as Record<string, unknown>;\n\n    const widgetConfig = extractCustomWidgetConfig(d, source);\n    const retailPrice = formatCurrencyValue(\n      d.display_price ?? d.price,\n      d.currency,\n    );\n    const wholesalePrice = formatCurrencyValue(\n      d.display_wholesale_price ?? d.wholesale_price ?? d.wholesalePrice,\n      d.currency,\n    );\n    const displayPrice = wholesalePrice ?? retailPrice;\n    const pricePayload = displayPrice ? { display_price: displayPrice } : {};\n    // Two aliases per metric, normalised to one field each. That single field\n    // is what renderers read and what the volume gate covers, so neither name\n    // offers a way around it — suppressing only the retail form upstream would\n    // otherwise leave the wholesale one readable here (CURRENT-3473).\n    // The remote-widget SDK contract also reads these; that surface is\n    // CURRENT-3475.\n    const qv = toDisplayString(d.qv ?? d.wholesale_qv);\n    const cv = toDisplayString(d.cv ?? d.wholesale_cv);\n    const volumePayload = {\n      ...(qv !== undefined ? { qv } : {}),\n      ...(cv !== undefined ? { cv } : {}),\n    };\n\n    // Resolve shareable type from the item itself, then fall back to source hint\n    const shareableType = (d.type ??\n      d.relateable_type ??\n      d.shareable_type ??\n      d.shareableType ??\n      sourceTypeHint ??\n      \"\") as string;\n\n    return {\n      ...d,\n      id: d.id,\n      title: (d.title ?? d.name ?? \"\") as string,\n      description: extractDescription(d),\n      imageUrl: extractImageUrl(d),\n      videoUrl: ((d.video_url ?? d.videoUrl) as string) || null,\n      shareableType,\n      kind: (d.kind ?? \"image\") as string,\n      status: (d.status ?? \"active\") as string,\n      wholesalePrice: wholesalePrice ?? null,\n      subscriptionPrice: d.subscription_price ?? null,\n      outOfStock: d.out_of_stock ?? false,\n      lowInStock: d.low_in_stock ?? false,\n      ...pricePayload,\n      ...volumePayload,\n      ...widgetConfig,\n    };\n  });\n};\n\n/**\n * Carousel slides from shareables transformer\n */\nconst toCarouselSlidesFromShareables: DataTransformer = (\n  data,\n  source,\n  context,\n) => {\n  if (!Array.isArray(data)) return [];\n\n  const slideImageAlt = context?.t?.(\"table_slide_image_alt\") ?? \"Slide image\";\n\n  return data.map((item: unknown, index: number) => {\n    const d = item as Record<string, unknown>;\n\n    const widgetConfig = extractCustomWidgetConfig(d, source);\n\n    const imageUrl = extractImageUrl(d);\n    const isVideo =\n      d.kind === \"video\" ||\n      d.content_format === \"video\" ||\n      d.videoUrl ||\n      d.video_url;\n    const videoSrc =\n      ((d.videoUrl ?? d.video_url) as string) ||\n      (isVideo ? (d.url as string) || \"\" : \"\");\n    const title = (d.title ?? d.name ?? \"\") as string;\n\n    const content = isVideo\n      ? {\n          type: \"VideoWidget\",\n          props: {\n            src: videoSrc,\n            poster: imageUrl,\n            caption: title,\n            autoplay: false,\n            loop: false,\n            muted: true,\n            controls: true,\n          },\n        }\n      : {\n          type: \"ImageWidget\",\n          props: {\n            src: imageUrl,\n            alt: title || slideImageAlt,\n            objectFit: \"cover\",\n          },\n        };\n\n    const baseSlide = {\n      id: String(d.id ?? `slide-${index}`),\n      content,\n      title,\n      description: extractDescription(d),\n    };\n\n    // Spread the raw shareable first so routing fields\n    // (shareable_type, subscription_token, token, canonical_url, ...)\n    // pass through to onItemClick in AppShell. Normalized baseSlide\n    // overrides id/content/title/description; widgetConfig wins last.\n    return {\n      ...d,\n      ...baseSlide,\n      ...widgetConfig,\n    };\n  });\n};\n\n/**\n * Orders table transformer\n * Normalizes order list data into ShareableItem rows + column definitions.\n * Returns { data, columns } so multi-targetProp mapping sends each to the widget.\n */\nconst toOrderTableProps: DataTransformer = (data, _source, context) => {\n  const orders = Array.isArray(data) ? data : [];\n  const t = context?.t;\n\n  const columns = [\n    {\n      key: \"imageUrl\",\n      label: t?.(\"table_col_image\") ?? \"Image\",\n      sortable: false,\n    },\n    {\n      key: \"order_number\",\n      label: t?.(\"table_col_order_number\") ?? \"Order #\",\n      sortable: true,\n    },\n    { key: \"price\", label: t?.(\"table_col_total\") ?? \"Total\", sortable: true },\n    {\n      key: \"status\",\n      label: t?.(\"table_col_status\") ?? \"Status\",\n      sortable: true,\n    },\n  ];\n\n  const rows = orders.map((item: unknown) => {\n    const d = item as Record<string, unknown>;\n    const firstItem = d.first_item as Record<string, unknown> | undefined;\n    const amount = parseFloat(String(d.amount ?? \"0\")) || 0;\n\n    return {\n      ...d,\n      id: d.id ?? d.token,\n      shareableType: \"Order\",\n      imageUrl: (firstItem?.image_url as string) || \"\",\n      title: (firstItem?.title as string) || \"\",\n      order_number: d.order_number ?? \"\",\n      price: amount,\n      display_price: (d.total_display_amount as string) ?? d.amount ?? \"\",\n      status: (d.status as string) ?? \"unknown\",\n      created_at: d.created_at,\n    };\n  });\n\n  return { data: rows, columns };\n};\n\n/**\n * Subscriptions table transformer\n * Normalizes subscription list data into ShareableItem rows + column definitions.\n */\nconst toSubscriptionTableProps: DataTransformer = (data, _source, context) => {\n  const subscriptions = Array.isArray(data) ? data : [];\n  const t = context?.t;\n\n  const columns = [\n    {\n      key: \"imageUrl\",\n      label: t?.(\"table_col_image\") ?? \"Image\",\n      sortable: false,\n    },\n    {\n      key: \"title\",\n      label: t?.(\"table_col_product\") ?? \"Product\",\n      sortable: true,\n    },\n    { key: \"price\", label: t?.(\"table_col_price\") ?? \"Price\", sortable: true },\n    {\n      key: \"status\",\n      label: t?.(\"table_col_status\") ?? \"Status\",\n      sortable: true,\n    },\n  ];\n\n  const rows = subscriptions.map((item: unknown) => {\n    const d = item as Record<string, unknown>;\n    const variant = d.variant as Record<string, unknown> | undefined;\n    const product = variant?.product as Record<string, unknown> | undefined;\n\n    return {\n      ...d,\n      id: d.id ?? d.subscription_token,\n      shareableType: \"Subscription\",\n      imageUrl: (product?.image_url as string) || \"\",\n      title: (product?.title as string) || \"\",\n      price: parseFloat(String(d.price ?? \"0\")) || 0,\n      display_price:\n        (product?.price_in_currency as string) ?? String(d.price ?? \"\"),\n      status: (d.status as string) ?? \"unknown\",\n      next_bill_date: d.next_bill_date,\n    };\n  });\n\n  return { data: rows, columns };\n};\n\n/**\n * All widget transformers bundled for registration\n */\nexport const WIDGET_TRANSFORMERS: Record<string, DataTransformer> = {\n  toShareableProps,\n  toCarouselSlidesFromShareables,\n  toImagePropsFromShareable,\n  toVideoPropsFromShareable,\n  toOrderTableProps,\n  toSubscriptionTableProps,\n};\n","import type {\n  DataSourceRegistry,\n  DataFetcher,\n  DataTransformer,\n  DataSourceType,\n} from \"./types\";\nimport { apiFetcher } from \"./fetchers/api\";\nimport { customFetcher } from \"./fetchers/custom\";\nimport { staticFetcher } from \"./fetchers/static\";\nimport { WIDGET_TRANSFORMERS } from \"./transformers\";\n\nexport interface CreateDataSourceRegistryOptions {\n  /** Custom fetchers to add or override */\n  fetchers?: Partial<Record<DataSourceType, DataFetcher>>;\n  /** Custom transform functions */\n  transformers?: Record<string, DataTransformer>;\n}\n\n/**\n * Creates a data source registry with default fetchers.\n * Users can extend this with custom fetchers and transformers.\n */\nexport function createDataSourceRegistry(\n  options?: CreateDataSourceRegistryOptions,\n): DataSourceRegistry {\n  return {\n    fetchers: {\n      api: apiFetcher,\n      custom: customFetcher,\n      static: staticFetcher,\n      ...options?.fetchers,\n    } as Record<DataSourceType, DataFetcher>,\n    transformers: {\n      ...WIDGET_TRANSFORMERS,\n      ...options?.transformers,\n    },\n  };\n}\n\n/** Default registry instance */\nexport const DEFAULT_DATA_SOURCE_REGISTRY: DataSourceRegistry =\n  createDataSourceRegistry();\n","import type React from \"react\";\nimport { createContext, type ReactNode, use, useMemo } from \"react\";\n\nexport interface DataSourceContextValue {\n  baseUrl?: string | undefined;\n  getApiHeaders?: (() => Record<string, string>) | undefined;\n}\n\nconst DataSourceContext = createContext<DataSourceContextValue>({});\n\nexport interface DataSourceProviderProps {\n  baseUrl?: string | undefined;\n  getApiHeaders?: (() => Record<string, string>) | undefined;\n  children: ReactNode;\n}\n\nexport function DataSourceProvider({\n  baseUrl,\n  getApiHeaders,\n  children,\n}: DataSourceProviderProps): React.JSX.Element {\n  const value = useMemo(\n    () => ({ baseUrl, getApiHeaders }),\n    [baseUrl, getApiHeaders],\n  );\n\n  return (\n    <DataSourceContext.Provider value={value}>\n      {children}\n    </DataSourceContext.Provider>\n  );\n}\n\nexport function useDataSourceConfig(): DataSourceContextValue {\n  return use(DataSourceContext);\n}\n","import type React from \"react\";\nimport { createContext, type ReactNode, use, useMemo } from \"react\";\nimport type { DataSourceRegistry } from \"@fluid-app/portal-core/data-sources/types\";\nimport { DEFAULT_DATA_SOURCE_REGISTRY } from \"@fluid-app/portal-core/data-sources/registry\";\nimport { DataSourceProvider } from \"./context\";\n\ninterface DataSourceRegistryContextValue {\n  registry: DataSourceRegistry;\n  baseUrl?: string | undefined;\n  /** Get API headers function */\n  getApiHeaders?: (() => Record<string, string>) | undefined;\n  /** Dynamic variables for endpoint path substitution (e.g., { rep_id: \"123\" }) */\n  variables?: Record<string, string> | undefined;\n}\n\nconst DataSourceRegistryContext = createContext<DataSourceRegistryContextValue>(\n  {\n    registry: DEFAULT_DATA_SOURCE_REGISTRY,\n  },\n);\n\nexport interface DataSourceRegistryProviderProps {\n  registry?: DataSourceRegistry | undefined;\n  /** Base URL for API calls (e.g., \"https://api.fluid.app/api\") */\n  baseUrl?: string | undefined;\n  /**\n   * Get API headers function\n   */\n  getApiHeaders?: (() => Record<string, string>) | undefined;\n  /** Dynamic variables for endpoint path substitution (e.g., { rep_id: \"123\" }) */\n  variables?: Record<string, string> | undefined;\n  children: ReactNode;\n}\n\n/**\n * Provides data source registry and configuration to all descendants.\n * If no registry is provided, uses the default.\n * Also provides the shared DataSourceProvider from portal-core so that\n * portal-widgets hooks can access baseUrl and getApiHeaders.\n *\n * The DataSourceApi adapter is provided separately via DataSourceApiProvider.\n */\nexport function DataSourceRegistryProvider({\n  registry,\n  baseUrl,\n  getApiHeaders,\n  variables,\n  children,\n}: DataSourceRegistryProviderProps): React.JSX.Element {\n  const value = useMemo(\n    () => ({\n      registry: registry ?? DEFAULT_DATA_SOURCE_REGISTRY,\n      baseUrl,\n      getApiHeaders,\n      variables,\n    }),\n    [registry, baseUrl, getApiHeaders, variables],\n  );\n\n  return (\n    <DataSourceRegistryContext.Provider value={value}>\n      <DataSourceProvider baseUrl={baseUrl} getApiHeaders={getApiHeaders}>\n        {children}\n      </DataSourceProvider>\n    </DataSourceRegistryContext.Provider>\n  );\n}\n\n/**\n * Hook to access the data source registry.\n */\nexport function useDataSourceRegistry(): DataSourceRegistry {\n  return use(DataSourceRegistryContext).registry;\n}\n\n/**\n * Hook to access the full data source registry context (registry + config).\n */\nexport function useDataSourceRegistryConfig(): DataSourceRegistryContextValue {\n  return use(DataSourceRegistryContext);\n}\n"],"mappings":";;;;;;;;AAOA,eAAe,gBACb,QACA,SACkB;CAClB,MAAM,MAAM,QAAQ;CACpB,MAAM,OAAO;EAAE,GAAG,QAAQ;EAAW,GAAG,OAAO;EAAW;AAE1D,SAAQ,OAAO,UAAf;EACE,KAAK,kBACH,QAAO,IAAI,gBAAgB,MAAM,UAAU,IAAI;GAC7C,eACG,MAAM,kBAA8C;GACvD,OAAO,MAAM,QAAQ,OAAO,KAAK,MAAM,GAAG,KAAA;GAC1C,QAAQ,MAAM;GACd,aAAa,MAAM;GACnB,QAAQ,QAAQ;GACjB,CAAC;EAEJ,KAAK,kBACH,QAAO,IAAI,gBAAgB,MAAM,UAAU,IAAI;GAC7C,eACG,MAAM,kBAA8C;GACvD,OAAO,MAAM,QAAQ,OAAO,KAAK,MAAM,GAAG,KAAA;GAC1C,QAAQ,MAAM;GACd,aAAa,MAAM;GACnB,QAAQ,QAAQ;GACjB,CAAC;EAEJ,KAAK,kBAEH,QAAO,IAAI,YAAY,MAAM,eAAe,IAAI;GAC9C,OAAO,MAAM,QAAQ,OAAO,KAAK,MAAM,GAAG,KAAA;GAC1C,QAAQ,MAAM;GACd,QAAQ,QAAQ;GACjB,CAAC;EAEJ,KAAK,yBAEH,QAAO,IAAI,mBAAmB,MAAM,eAAe,IAAI;GACrD,OAAO,MAAM,QAAQ,OAAO,KAAK,MAAM,GAAG,KAAA;GAC1C,QAAQ,MAAM;GACd,QAAQ,QAAQ;GACjB,CAAC;EAEJ,QACE;;;;;;;AAQN,SAAS,UAAU,KAAc,MAAuB;AACtD,QAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,SAAS,QAAQ;AAC9C,MAAI,WAAW,OAAO,YAAY,YAAY,OAAO,QACnD,QAAQ,QAAoC;IAG7C,IAAI;;;;;;;AAQT,SAAS,qBACP,UACA,WACQ;AACR,KAAI,CAAC,UAAW,QAAO;CACvB,MAAM,WAAW,SAAS,QACxB,eACC,OAAO,QAAgB,UAAU,QAAQ,MAC3C;CACD,MAAM,aAAa,SAAS,MAAM,aAAa;AAC/C,KAAI,WACF,SAAQ,KACN,8DAA8D,WAAW,KAAK,KAAK,CAAC,eACpE,SAAS,0BAA0B,OAAO,KAAK,UAAU,CAAC,KAAK,KAAK,IAAI,WACzF;AAEH,QAAO,oBAAoB,SAAS;;;;;;;;;;;;AAatC,SAAS,oBAAoB,KAAqB;CAChD,MAAM,SAAS,IAAI,QAAQ,IAAI;AAC/B,KAAI,WAAW,GAAI,QAAO;CAE1B,MAAM,OAAO,IAAI,MAAM,GAAG,OAAO;CAEjC,MAAM,OADQ,IAAI,MAAM,SAAS,EAAE,CAEhC,MAAM,IAAI,CACV,QAAQ,SAAS;EAChB,MAAM,UAAU,KAAK,QAAQ,IAAI;AACjC,MAAI,YAAY,GAAI,QAAO;AAC3B,SAAO,KAAK,MAAM,UAAU,EAAE,KAAK;GACnC,CACD,KAAK,IAAI;AAEZ,QAAO,OAAO,GAAG,KAAK,GAAG,SAAS;;;;;;;;AASpC,SAAS,mBACP,UACA,SACA,WACQ;CACR,MAAM,WAAW,qBAAqB,UAAU,UAAU;AAG1D,KAAI,SAAS,WAAW,UAAU,IAAI,SAAS,WAAW,WAAW,CACnE,QAAO;AAIT,KAAI,QAIF,QAAO,GAFM,QAAQ,SAAS,IAAI,GAAG,QAAQ,MAAM,GAAG,GAAG,GAAG,UAC/C,SAAS,WAAW,IAAI,GAAG,WAAW,IAAI;AAKzD,QAAO;;;;;AAMT,eAAsB,WACpB,QACA,SACkB;AAElB,KAAI,QAAQ,OAAO,OAAO,UAAU;EAClC,MAAM,SAAS,MAAM,gBAAgB,QAAQ,QAAQ;AACrD,MAAI,WAAW,KAAA,EAAW,QAAO;;CAInC,MAAM,EAAE,UAAU,SAAS,OAAO,UAAU,EAAE,EAAE,MAAM,eAAe;CAGrE,MAAM,kBAAkB;EAAE,GAAG,QAAQ;EAAW,GAAG,OAAO;EAAW;CAGrE,MAAM,MAAM,mBAAmB,UAAU,QAAQ,SAAS,gBAAgB;AAK1E,KAAI,UAAU,KAAK,IAAI,CACrB,QAAO;CAGT,MAAM,eAA4B;EAChC;EACA,SAAS;GACP,gBAAgB;GAChB,GAAG,QAAQ,iBAAiB;GAC5B,GAAG;GACJ;EACD,QAAQ,QAAQ;EACjB;AAED,KAAI,SAAS,WAAW,UAAU,WAAW,OAC3C,cAAa,OAAO,KAAK,UAAU,KAAK;CAG1C,MAAM,WAAW,MAAM,MAAM,KAAK,aAAa;AAE/C,KAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MACR,uBAAuB,SAAS,OAAO,GAAG,SAAS,aACpD;CAGH,MAAM,OAAO,MAAM,SAAS,MAAM;AAGlC,KAAI,WACF,QAAO,UAAU,MAAM,WAAW;AAGpC,QAAO;;;;AC1MT,MAAa,6BAA2D;CACtE,QAAQ;CACR,MAAM;CACN,SAAS;CACT,SAAS;CACT,gBAAgB;CACjB;AAED,eAAe,qBACb,OACA,SACoB;CACpB,MAAM,MAAM,QAAQ;CACpB,MAAM,cAAc,QAAQ,WAAW;CAKvC,MAAM,UAAU,MAAM,QAAQ,WAC5B,MAAM,IAAI,OAAO,SAAS;EACxB,MAAM,eAAe,2BAA2B,KAAK;AACrD,MAAI,CAAC,aACH,OAAM,IAAI,MACR,2BAA2B,KAAK,cAAc,aAAa,KAAK,KACjE;AAEH,SAAO,IAAI,cACT,cACA,KAAK,IACL,QAAQ,QACR,YACD;GACD,CACH;CAED,MAAM,aAAwB,EAAE;CAChC,MAAM,WAAsD,EAAE;AAE9D,SAAQ,SAAS,QAAQ,UAAU;EACjC,MAAM,OAAO,MAAM;AACnB,MAAI,CAAC,KAAM;AACX,MAAI,OAAO,WAAW,YACpB,YAAW,KAAK,OAAO,MAAM;MAE7B,UAAS,KAAK;GAAE;GAAM,QAAQ,OAAO;GAAQ,CAAC;GAEhD;AAEF,KAAI,SAAS,SAAS,EAGpB,SAAQ,MACN,mBAAmB,SAAS,OAAO,GAAG,MAAM,OAAO,0BACnD,SAAS,KAAK,OAAO;EACnB,eAAe,EAAE,KAAK;EACtB,IAAI,EAAE,KAAK;EACX,OAAO,EAAE,kBAAkB,QAAQ,EAAE,OAAO,UAAU,EAAE;EACzD,EAAE,CACJ;AAGH,KAAI,WAAW,WAAW,KAAK,MAAM,SAAS,GAAG;EAC/C,MAAM,WAAW,SAAS,IAAI;AAC9B,QAAM,IAAI,MACR,uBAAuB,MAAM,OAAO,UAAU,oBAAoB,QAAQ,KAAK,SAAS,YAAY,KACrG;;AAGH,QAAO;;;;;;;;;AAUT,eAAsB,cACpB,QACA,SACoB;CACpB,MAAM,EAAE,kBAAkB;AAC1B,KAAI,CAAC,iBAAiB,cAAc,WAAW,EAC7C,QAAO,EAAE;AAGX,KAAI,CAAC,QAAQ,IACX,OAAM,IAAI,MACR,uFACD;AAGH,QAAO,qBAAqB,eAAe,QAAQ;;;;;;;;;;ACxFrD,eAAsB,cACpB,QACA,SACoB;CACpB,MAAM,EAAE,YAAY,eAAe;AAEnC,KAAI,CAAC,QAAQ,IACX,OAAM,IAAI,MACR,uFACD;AAMH,KAAI,eAAe,UAAU,OAAO,MAAM,OAAO,WAAW,CAAC,CAC3D,OAAM,IAAI,MACR,mDAAmD,WAAW,GAC/D;AAGH,QAAO,QAAQ,IAAI,sBACjB,YACA,YACA,QAAQ,OACT;;;;;;;;;;;ACbH,SAAS,gBAAgB,GAAoC;AAE3D,KAAI,EAAE,UAAW,QAAO,EAAE;AAC1B,KAAI,EAAE,SAAU,QAAO,EAAE;AACzB,KAAI,EAAE,cAAe,QAAO,EAAE;AAC9B,KAAI,EAAE,IAAK,QAAO,EAAE;CAGpB,MAAM,SAAS,EAAE;AACjB,KAAI,UAAU,OAAO,SAAS,GAAG;EAC/B,MAAM,aAAa,OAAO;AAC1B,MAAI,YAAY,UAAW,QAAO,WAAW;AAC7C,MAAI,YAAY,IAAK,QAAO,WAAW;;CAIzC,MAAM,eAAe,EAAE;AAGvB,KAAI,gBAAgB,aAAa,SAAS,GAAG;EAE3C,MAAM,aADY,aAAa,IACD;AAG9B,MAAI,YAAY,UAAW,QAAO,WAAW;AAC7C,MAAI,YAAY,SAAU,QAAO,WAAW;AAC5C,MAAI,YAAY,cAAe,QAAO,WAAW;;AAGnD,QAAO;;;;;;AAOT,SAAS,mBAAmB,GAAoC;CAE9D,MAAM,OACJ,EAAE,eAAe,EAAE,YAAY,EAAE,wBAAwB,EAAE,QAAQ;AAGrE,KAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU,KACzD,QAAS,KAAiC,QAAmB;AAG/D,QAAO;;;;;AAMT,SAAS,0BACP,GACA,QACyB;AACzB,KAAI,WAAW,KAAA,KAAa,OAAO,SAAS,SAAU,QAAO,EAAE;AAM/D,QAJqB,OAAO,cAAc,MACvC,MACC,OAAO,EAAE,GAAG,KAAK,OAAO,EAAE,GAAG,IAAI,EAAE,kBAAkB,EAAE,eAC1D,EACoB,gBAAgB,EAAE;;AAGzC,SAAS,gBAAgB,OAAyB;AAChD,QAAO,UAAU,QAAQ,UAAU,KAAA,KAAa,UAAU;;AAG5D,SAAS,gBAAgB,OAAoC;AAC3D,KAAI,CAAC,gBAAgB,MAAM,CAAE,QAAO,KAAA;AACpC,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,OAAO,UAAU,SAAU,QAAO,OAAO,MAAM;;AAIrD,SAAS,qBAAqB,OAAwB;AACpD,QAAO,kBAAkB,KAAK,MAAM;;AAGtC,SAAS,oBACP,OACA,UACoB;CACpB,MAAM,eAAe,gBAAgB,MAAM,EAAE,MAAM;AACnD,KAAI,CAAC,aAAc,QAAO,KAAA;AAC1B,KAAI,CAAC,qBAAqB,aAAa,CAAE,QAAO;AAChD,KAAI,OAAO,aAAa,YAAY,CAAC,SAAU,QAAO;CAEtD,MAAM,SAAS,OAAO,aAAa;AACnC,KAAI,CAAC,OAAO,SAAS,OAAO,CAAE,QAAO;AAErC,KAAI;AACF,SAAO,IAAI,KAAK,aAAa,KAAA,GAAW;GACtC,OAAO;GACP;GACD,CAAC,CAAC,OAAO,OAAO;SACX;AACN,SAAO;;;;;;AAOX,MAAM,6BAA8C,MAAM,SAAS,YAAY;CAC7E,MAAM,OAAO,MAAM,QAAQ,KAAK,GAAG,KAAK,KAAK;CAC7C,MAAM,cAAc,SAAS,IAAI,2BAA2B,IAAI;AAChE,KAAI,CAAC,QAAQ,OAAO,SAAS,SAC3B,QAAO;EAAE,KAAK;EAAI,KAAK;EAAa,WAAW;EAAS;CAG1D,MAAM,IAAI;AACV,QAAO;EACL,KAAK,gBAAgB,EAAE;EACvB,KAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO;EACpC,WAAW;EACZ;;;;;AAMH,MAAM,6BAA8C,SAAS;CAC3D,MAAM,OAAO,MAAM,QAAQ,KAAK,GAAG,KAAK,KAAK;AAC7C,KAAI,CAAC,QAAQ,OAAO,SAAS,SAC3B,QAAO;EAAE,KAAK;EAAI,QAAQ;EAAI,SAAS;EAAI;CAG7C,MAAM,IAAI;AACV,QAAO;EACL,MAAO,EAAE,aAAa,EAAE,YAAY,EAAE,QAAmB;EACzD,QAAQ,gBAAgB,EAAE;EAC1B,SAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW;EAC7C;;;;;;AAOH,MAAM,oBAAqC,MAAM,WAAW;AAC1D,KAAI,CAAC,MAAM,QAAQ,KAAK,CAAE,QAAO,EAAE;CAKnC,MAAM,iBACJ,QAAQ,SAAS,QAAQ,OAAO,WAAW,iBAAiB,KAAA;AAE9D,QAAO,KAAK,KAAK,SAAkB;EACjC,MAAM,IAAI;EAEV,MAAM,eAAe,0BAA0B,GAAG,OAAO;EACzD,MAAM,cAAc,oBAClB,EAAE,iBAAiB,EAAE,OACrB,EAAE,SACH;EACD,MAAM,iBAAiB,oBACrB,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,gBACpD,EAAE,SACH;EACD,MAAM,eAAe,kBAAkB;EACvC,MAAM,eAAe,eAAe,EAAE,eAAe,cAAc,GAAG,EAAE;EAOxE,MAAM,KAAK,gBAAgB,EAAE,MAAM,EAAE,aAAa;EAClD,MAAM,KAAK,gBAAgB,EAAE,MAAM,EAAE,aAAa;EAClD,MAAM,gBAAgB;GACpB,GAAI,OAAO,KAAA,IAAY,EAAE,IAAI,GAAG,EAAE;GAClC,GAAI,OAAO,KAAA,IAAY,EAAE,IAAI,GAAG,EAAE;GACnC;EAGD,MAAM,gBAAiB,EAAE,QACvB,EAAE,mBACF,EAAE,kBACF,EAAE,iBACF,kBACA;AAEF,SAAO;GACL,GAAG;GACH,IAAI,EAAE;GACN,OAAQ,EAAE,SAAS,EAAE,QAAQ;GAC7B,aAAa,mBAAmB,EAAE;GAClC,UAAU,gBAAgB,EAAE;GAC5B,WAAY,EAAE,aAAa,EAAE,aAAwB;GACrD;GACA,MAAO,EAAE,QAAQ;GACjB,QAAS,EAAE,UAAU;GACrB,gBAAgB,kBAAkB;GAClC,mBAAmB,EAAE,sBAAsB;GAC3C,YAAY,EAAE,gBAAgB;GAC9B,YAAY,EAAE,gBAAgB;GAC9B,GAAG;GACH,GAAG;GACH,GAAG;GACJ;GACD;;;;;AAMJ,MAAM,kCACJ,MACA,QACA,YACG;AACH,KAAI,CAAC,MAAM,QAAQ,KAAK,CAAE,QAAO,EAAE;CAEnC,MAAM,gBAAgB,SAAS,IAAI,wBAAwB,IAAI;AAE/D,QAAO,KAAK,KAAK,MAAe,UAAkB;EAChD,MAAM,IAAI;EAEV,MAAM,eAAe,0BAA0B,GAAG,OAAO;EAEzD,MAAM,WAAW,gBAAgB,EAAE;EACnC,MAAM,UACJ,EAAE,SAAS,WACX,EAAE,mBAAmB,WACrB,EAAE,YACF,EAAE;EACJ,MAAM,YACF,EAAE,YAAY,EAAE,eACjB,UAAW,EAAE,OAAkB,KAAK;EACvC,MAAM,QAAS,EAAE,SAAS,EAAE,QAAQ;EAEpC,MAAM,UAAU,UACZ;GACE,MAAM;GACN,OAAO;IACL,KAAK;IACL,QAAQ;IACR,SAAS;IACT,UAAU;IACV,MAAM;IACN,OAAO;IACP,UAAU;IACX;GACF,GACD;GACE,MAAM;GACN,OAAO;IACL,KAAK;IACL,KAAK,SAAS;IACd,WAAW;IACZ;GACF;EAEL,MAAM,YAAY;GAChB,IAAI,OAAO,EAAE,MAAM,SAAS,QAAQ;GACpC;GACA;GACA,aAAa,mBAAmB,EAAE;GACnC;AAMD,SAAO;GACL,GAAG;GACH,GAAG;GACH,GAAG;GACJ;GACD;;;;;;;AAQJ,MAAM,qBAAsC,MAAM,SAAS,YAAY;CACrE,MAAM,SAAS,MAAM,QAAQ,KAAK,GAAG,OAAO,EAAE;CAC9C,MAAM,IAAI,SAAS;CAEnB,MAAM,UAAU;EACd;GACE,KAAK;GACL,OAAO,IAAI,kBAAkB,IAAI;GACjC,UAAU;GACX;EACD;GACE,KAAK;GACL,OAAO,IAAI,yBAAyB,IAAI;GACxC,UAAU;GACX;EACD;GAAE,KAAK;GAAS,OAAO,IAAI,kBAAkB,IAAI;GAAS,UAAU;GAAM;EAC1E;GACE,KAAK;GACL,OAAO,IAAI,mBAAmB,IAAI;GAClC,UAAU;GACX;EACF;AAqBD,QAAO;EAAE,MAnBI,OAAO,KAAK,SAAkB;GACzC,MAAM,IAAI;GACV,MAAM,YAAY,EAAE;GACpB,MAAM,SAAS,WAAW,OAAO,EAAE,UAAU,IAAI,CAAC,IAAI;AAEtD,UAAO;IACL,GAAG;IACH,IAAI,EAAE,MAAM,EAAE;IACd,eAAe;IACf,UAAW,WAAW,aAAwB;IAC9C,OAAQ,WAAW,SAAoB;IACvC,cAAc,EAAE,gBAAgB;IAChC,OAAO;IACP,eAAgB,EAAE,wBAAmC,EAAE,UAAU;IACjE,QAAS,EAAE,UAAqB;IAChC,YAAY,EAAE;IACf;IACD;EAEmB;EAAS;;;;;;AAOhC,MAAM,4BAA6C,MAAM,SAAS,YAAY;CAC5E,MAAM,gBAAgB,MAAM,QAAQ,KAAK,GAAG,OAAO,EAAE;CACrD,MAAM,IAAI,SAAS;CAEnB,MAAM,UAAU;EACd;GACE,KAAK;GACL,OAAO,IAAI,kBAAkB,IAAI;GACjC,UAAU;GACX;EACD;GACE,KAAK;GACL,OAAO,IAAI,oBAAoB,IAAI;GACnC,UAAU;GACX;EACD;GAAE,KAAK;GAAS,OAAO,IAAI,kBAAkB,IAAI;GAAS,UAAU;GAAM;EAC1E;GACE,KAAK;GACL,OAAO,IAAI,mBAAmB,IAAI;GAClC,UAAU;GACX;EACF;AAqBD,QAAO;EAAE,MAnBI,cAAc,KAAK,SAAkB;GAChD,MAAM,IAAI;GAEV,MAAM,UADU,EAAE,SACO;AAEzB,UAAO;IACL,GAAG;IACH,IAAI,EAAE,MAAM,EAAE;IACd,eAAe;IACf,UAAW,SAAS,aAAwB;IAC5C,OAAQ,SAAS,SAAoB;IACrC,OAAO,WAAW,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI;IAC7C,eACG,SAAS,qBAAgC,OAAO,EAAE,SAAS,GAAG;IACjE,QAAS,EAAE,UAAqB;IAChC,gBAAgB,EAAE;IACnB;IACD;EAEmB;EAAS;;;;;AAMhC,MAAa,sBAAuD;CAClE;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;;AClYD,SAAgB,yBACd,SACoB;AACpB,QAAO;EACL,UAAU;GACR,KAAK;GACL,QAAQ;GACR,QAAQ;GACR,GAAG,SAAS;GACb;EACD,cAAc;GACZ,GAAG;GACH,GAAG,SAAS;GACb;EACF;;;AAIH,MAAa,+BACX,0BAA0B;;;ACjC5B,MAAM,qBAAA,GAAA,MAAA,eAA0D,EAAE,CAAC;AAQnE,SAAgB,mBAAmB,EACjC,SACA,eACA,YAC6C;CAC7C,MAAM,SAAA,GAAA,MAAA,gBACG;EAAE;EAAS;EAAe,GACjC,CAAC,SAAS,cAAc,CACzB;AAED,QACE,iBAAA,GAAA,kBAAA,KAAC,kBAAkB,UAAnB;EAAmC;EAChC;EAC0B,CAAA;;;;ACdjC,MAAM,6BAAA,GAAA,MAAA,eACJ,EACE,UAAU,8BACX,CACF;;;;;;;;;AAuBD,SAAgB,2BAA2B,EACzC,UACA,SACA,eACA,WACA,YACqD;CACrD,MAAM,SAAA,GAAA,MAAA,gBACG;EACL,UAAU,YAAY;EACtB;EACA;EACA;EACD,GACD;EAAC;EAAU;EAAS;EAAe;EAAU,CAC9C;AAED,QACE,iBAAA,GAAA,kBAAA,KAAC,0BAA0B,UAA3B;EAA2C;YACzC,iBAAA,GAAA,kBAAA,KAAC,oBAAD;GAA6B;GAAwB;GAClD;GACkB,CAAA;EACc,CAAA;;;;;AAczC,SAAgB,8BAA8D;AAC5E,SAAA,GAAA,MAAA,KAAW,0BAA0B"}