{"version":3,"file":"stegaEncodeSourceMap.cjs","sources":["../../src/csm/studioPath.ts","../../src/csm/jsonPath.ts","../../src/csm/resolveMapping.ts","../../src/csm/isArray.ts","../../src/csm/walkMap.ts","../../src/stega/encodeIntoResult.ts","../../src/csm/draftUtils.ts","../../src/csm/createEditUrl.ts","../../src/csm/resolveEditInfo.ts","../../src/stega/filterDefault.ts","../../src/stega/stega.ts","../../src/stega/stegaEncodeSourceMap.ts"],"sourcesContent":["/** @alpha */\nexport type KeyedSegment = {_key: string}\n\n/** @alpha */\nexport type IndexTuple = [number | '', number | '']\n\n/** @alpha */\nexport type PathSegment = string | number | KeyedSegment | IndexTuple\n\n/** @alpha */\nexport type Path = PathSegment[]\n\nconst rePropName =\n  /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g\n/** @internal */\nexport const reKeySegment = /_key\\s*==\\s*['\"](.*)['\"]/\nconst reIndexTuple = /^\\d*:\\d*$/\n\n/** @internal */\nexport function isIndexSegment(segment: PathSegment): segment is number {\n  return typeof segment === 'number' || (typeof segment === 'string' && /^\\[\\d+\\]$/.test(segment))\n}\n\n/** @internal */\nexport function isKeySegment(segment: PathSegment): segment is KeyedSegment {\n  if (typeof segment === 'string') {\n    return reKeySegment.test(segment.trim())\n  }\n\n  return typeof segment === 'object' && '_key' in segment\n}\n\n/** @internal */\nexport function isIndexTuple(segment: PathSegment): segment is IndexTuple {\n  if (typeof segment === 'string' && reIndexTuple.test(segment)) {\n    return true\n  }\n\n  if (!Array.isArray(segment) || segment.length !== 2) {\n    return false\n  }\n\n  const [from, to] = segment\n  return (typeof from === 'number' || from === '') && (typeof to === 'number' || to === '')\n}\n\n/** @internal */\nexport function get<Result = unknown, Fallback = unknown>(\n  obj: unknown,\n  path: Path | string,\n  defaultVal?: Fallback,\n): Result | typeof defaultVal {\n  const select = typeof path === 'string' ? fromString(path) : path\n  if (!Array.isArray(select)) {\n    throw new Error('Path must be an array or a string')\n  }\n\n  let acc: unknown | undefined = obj\n  for (let i = 0; i < select.length; i++) {\n    const segment = select[i]\n    if (isIndexSegment(segment)) {\n      if (!Array.isArray(acc)) {\n        return defaultVal\n      }\n\n      acc = acc[segment]\n    }\n\n    if (isKeySegment(segment)) {\n      if (!Array.isArray(acc)) {\n        return defaultVal\n      }\n\n      acc = acc.find((item) => item._key === segment._key)\n    }\n\n    if (typeof segment === 'string') {\n      acc =\n        typeof acc === 'object' && acc !== null\n          ? ((acc as Record<string, unknown>)[segment] as Result)\n          : undefined\n    }\n\n    if (typeof acc === 'undefined') {\n      return defaultVal\n    }\n  }\n\n  return acc as Result\n}\n\n/** @alpha */\nexport function toString(path: Path): string {\n  if (!Array.isArray(path)) {\n    throw new Error('Path is not an array')\n  }\n\n  return path.reduce<string>((target, segment, i) => {\n    const segmentType = typeof segment\n    if (segmentType === 'number') {\n      return `${target}[${segment}]`\n    }\n\n    if (segmentType === 'string') {\n      const separator = i === 0 ? '' : '.'\n      return `${target}${separator}${segment}`\n    }\n\n    if (isKeySegment(segment) && segment._key) {\n      return `${target}[_key==\"${segment._key}\"]`\n    }\n\n    if (Array.isArray(segment)) {\n      const [from, to] = segment\n      return `${target}[${from}:${to}]`\n    }\n\n    throw new Error(`Unsupported path segment \\`${JSON.stringify(segment)}\\``)\n  }, '')\n}\n\n/** @alpha */\nexport function fromString(path: string): Path {\n  if (typeof path !== 'string') {\n    throw new Error('Path is not a string')\n  }\n\n  const segments = path.match(rePropName)\n  if (!segments) {\n    throw new Error('Invalid path string')\n  }\n\n  return segments.map(parsePathSegment)\n}\n\nfunction parsePathSegment(segment: string): PathSegment {\n  if (isIndexSegment(segment)) {\n    return parseIndexSegment(segment)\n  }\n\n  if (isKeySegment(segment)) {\n    return parseKeySegment(segment)\n  }\n\n  if (isIndexTuple(segment)) {\n    return parseIndexTupleSegment(segment)\n  }\n\n  return segment\n}\n\nfunction parseIndexSegment(segment: string): PathSegment {\n  return Number(segment.replace(/[^\\d]/g, ''))\n}\n\nfunction parseKeySegment(segment: string): KeyedSegment {\n  const segments = segment.match(reKeySegment)\n  return {_key: segments![1]}\n}\n\nfunction parseIndexTupleSegment(segment: string): IndexTuple {\n  const [from, to] = segment.split(':').map((seg) => (seg === '' ? seg : Number(seg)))\n  return [from, to]\n}\n","import * as studioPath from './studioPath'\nimport type {\n  ContentSourceMapParsedPath,\n  ContentSourceMapParsedPathKeyedSegment,\n  ContentSourceMapPaths,\n  Path,\n} from './types'\n\nconst ESCAPE: Record<string, string> = {\n  '\\f': '\\\\f',\n  '\\n': '\\\\n',\n  '\\r': '\\\\r',\n  '\\t': '\\\\t',\n  \"'\": \"\\\\'\",\n  '\\\\': '\\\\\\\\',\n}\n\nconst UNESCAPE: Record<string, string> = {\n  '\\\\f': '\\f',\n  '\\\\n': '\\n',\n  '\\\\r': '\\r',\n  '\\\\t': '\\t',\n  \"\\\\'\": \"'\",\n  '\\\\\\\\': '\\\\',\n}\n\n/**\n * @internal\n */\nexport function jsonPath(path: ContentSourceMapParsedPath): ContentSourceMapPaths[number] {\n  return `$${path\n    .map((segment) => {\n      if (typeof segment === 'string') {\n        const escapedKey = segment.replace(/[\\f\\n\\r\\t'\\\\]/g, (match) => {\n          return ESCAPE[match]\n        })\n        return `['${escapedKey}']`\n      }\n\n      if (typeof segment === 'number') {\n        return `[${segment}]`\n      }\n\n      if (segment._key !== '') {\n        const escapedKey = segment._key.replace(/['\\\\]/g, (match) => {\n          return ESCAPE[match]\n        })\n        return `[?(@._key=='${escapedKey}')]`\n      }\n\n      return `[${segment._index}]`\n    })\n    .join('')}`\n}\n/**\n * @internal\n */\nexport function jsonPathArray(path: ContentSourceMapParsedPath): string[] {\n  return path.map((segment) => {\n    if (typeof segment === 'string') {\n      const escapedKey = segment.replace(/[\\f\\n\\r\\t'\\\\]/g, (match) => {\n        return ESCAPE[match]\n      })\n      return `['${escapedKey}']`\n    }\n\n    if (typeof segment === 'number') {\n      return `[${segment}]`\n    }\n\n    if (segment._key !== '') {\n      const escapedKey = segment._key.replace(/['\\\\]/g, (match) => {\n        return ESCAPE[match]\n      })\n      return `[?(@._key=='${escapedKey}')]`\n    }\n\n    return `[${segment._index}]`\n  })\n}\n\n/**\n * @internal\n */\nexport function parseJsonPath(path: ContentSourceMapPaths[number]): ContentSourceMapParsedPath {\n  const parsed: ContentSourceMapParsedPath = []\n\n  const parseRe = /\\['(.*?)'\\]|\\[(\\d+)\\]|\\[\\?\\(@\\._key=='(.*?)'\\)\\]/g\n  let match: RegExpExecArray | null\n\n  while ((match = parseRe.exec(path)) !== null) {\n    if (match[1] !== undefined) {\n      const key = match[1].replace(/\\\\(\\\\|f|n|r|t|')/g, (m) => {\n        return UNESCAPE[m]\n      })\n\n      parsed.push(key)\n      continue\n    }\n\n    if (match[2] !== undefined) {\n      parsed.push(parseInt(match[2], 10))\n      continue\n    }\n\n    if (match[3] !== undefined) {\n      const _key = match[3].replace(/\\\\(\\\\')/g, (m) => {\n        return UNESCAPE[m]\n      })\n\n      parsed.push({\n        _key,\n        _index: -1,\n      })\n      continue\n    }\n  }\n\n  return parsed\n}\n\n/**\n * @internal\n */\nexport function jsonPathToStudioPath(path: ContentSourceMapParsedPath): Path {\n  return path.map((segment) => {\n    if (typeof segment === 'string') {\n      return segment\n    }\n\n    if (typeof segment === 'number') {\n      return segment\n    }\n\n    if (segment._key !== '') {\n      return {_key: segment._key}\n    }\n\n    if (segment._index !== -1) {\n      return segment._index\n    }\n\n    throw new Error(`invalid segment:${JSON.stringify(segment)}`)\n  })\n}\n\n/**\n * @internal\n */\nexport function studioPathToJsonPath(path: Path | string): ContentSourceMapParsedPath {\n  const parsedPath = typeof path === 'string' ? studioPath.fromString(path) : path\n\n  return parsedPath.map((segment) => {\n    if (typeof segment === 'string') {\n      return segment\n    }\n\n    if (typeof segment === 'number') {\n      return segment\n    }\n\n    if (Array.isArray(segment)) {\n      throw new Error(`IndexTuple segments aren't supported:${JSON.stringify(segment)}`)\n    }\n\n    if (isContentSourceMapParsedPathKeyedSegment(segment)) {\n      return segment\n    }\n\n    if (segment._key) {\n      return {_key: segment._key, _index: -1}\n    }\n\n    throw new Error(`invalid segment:${JSON.stringify(segment)}`)\n  })\n}\n\nfunction isContentSourceMapParsedPathKeyedSegment(\n  segment: studioPath.PathSegment | ContentSourceMapParsedPath[number],\n): segment is ContentSourceMapParsedPathKeyedSegment {\n  return typeof segment === 'object' && '_key' in segment && '_index' in segment\n}\n\n/**\n * @internal\n */\nexport function jsonPathToMappingPath(path: ContentSourceMapParsedPath): (string | number)[] {\n  return path.map((segment) => {\n    if (typeof segment === 'string') {\n      return segment\n    }\n\n    if (typeof segment === 'number') {\n      return segment\n    }\n\n    if (segment._index !== -1) {\n      return segment._index\n    }\n\n    throw new Error(`invalid segment:${JSON.stringify(segment)}`)\n  })\n}\n","import {jsonPath, jsonPathArray, jsonPathToMappingPath} from './jsonPath'\nimport type {ContentSourceMap, ContentSourceMapMapping, ContentSourceMapParsedPath} from './types'\n\n/**\n * @internal\n */\nexport function resolveMapping(\n  resultPath: ContentSourceMapParsedPath,\n  csm?: ContentSourceMap,\n):\n  | {\n      mapping: ContentSourceMapMapping\n      matchedPath: string\n      pathSuffix: string\n    }\n  | undefined {\n  if (!csm?.mappings) {\n    return undefined\n  }\n  const resultMappingPath = jsonPath(jsonPathToMappingPath(resultPath))\n\n  if (csm.mappings[resultMappingPath] !== undefined) {\n    return {\n      mapping: csm.mappings[resultMappingPath],\n      matchedPath: resultMappingPath,\n      pathSuffix: '',\n    }\n  }\n\n  const resultMappingPathArray = jsonPathArray(jsonPathToMappingPath(resultPath))\n  for (let i = resultMappingPathArray.length - 1; i >= 0; i--) {\n    const key = `$${resultMappingPathArray.slice(0, i).join('')}`\n    const mappingFound = csm.mappings[key]\n    if (mappingFound) {\n      const pathSuffix = resultMappingPath.substring(key.length)\n      return {mapping: mappingFound, matchedPath: key, pathSuffix}\n    }\n  }\n\n  return undefined\n}\n","/** @internal */\nexport function isArray(value: unknown): value is Array<unknown> {\n  return value !== null && Array.isArray(value)\n}\n","import {isRecord} from '../util/isRecord'\nimport {isArray} from './isArray'\nimport type {ContentSourceMapParsedPath, WalkMapFn} from './types'\n\n/**\n * generic way to walk a nested object or array and apply a mapping function to each value\n * @internal\n */\nexport function walkMap(\n  value: unknown,\n  mappingFn: WalkMapFn,\n  path: ContentSourceMapParsedPath = [],\n): unknown {\n  if (isArray(value)) {\n    return value.map((v, idx) => {\n      if (isRecord(v)) {\n        const _key = v['_key']\n        if (typeof _key === 'string') {\n          return walkMap(v, mappingFn, path.concat({_key, _index: idx}))\n        }\n      }\n\n      return walkMap(v, mappingFn, path.concat(idx))\n    })\n  }\n\n  if (isRecord(value)) {\n    // Handle Portable Text in a faster way\n    if (value._type === 'block' || value._type === 'span') {\n      const result = {...value}\n      if (value._type === 'block') {\n        result.children = walkMap(value.children, mappingFn, path.concat('children'))\n      } else if (value._type === 'span') {\n        result.text = walkMap(value.text, mappingFn, path.concat('text'))\n      }\n      return result\n    }\n\n    return Object.fromEntries(\n      Object.entries(value).map(([k, v]) => [k, walkMap(v, mappingFn, path.concat(k))]),\n    )\n  }\n\n  return mappingFn(value, path)\n}\n","import type {ContentSourceMap} from '@sanity/client/csm'\n\nimport {parseJsonPath} from '../csm/jsonPath'\nimport {resolveMapping} from '../csm/resolveMapping'\nimport {walkMap} from '../csm/walkMap'\nimport type {Encoder} from './types'\n\n/**\n * @internal\n */\nexport function encodeIntoResult<Result>(\n  result: Result,\n  csm: ContentSourceMap,\n  encoder: Encoder,\n): Result {\n  return walkMap(result, (value, path) => {\n    // Only map strings, we could extend this in the future to support other types like integers...\n    if (typeof value !== 'string') {\n      return value\n    }\n\n    const resolveMappingResult = resolveMapping(path, csm)\n    if (!resolveMappingResult) {\n      return value\n    }\n\n    const {mapping, matchedPath} = resolveMappingResult\n    if (mapping.type !== 'value') {\n      return value\n    }\n\n    if (mapping.source.type !== 'documentValue') {\n      return value\n    }\n\n    const sourceDocument = csm.documents[mapping.source.document!]\n    const sourcePath = csm.paths[mapping.source.path]\n\n    const matchPathSegments = parseJsonPath(matchedPath)\n    const sourcePathSegments = parseJsonPath(sourcePath)\n    const fullSourceSegments = sourcePathSegments.concat(path.slice(matchPathSegments.length))\n\n    return encoder({\n      sourcePath: fullSourceSegments,\n      sourceDocument,\n      resultPath: path,\n      value,\n    })\n  }) as Result\n}\n","// nominal/opaque type hack\ntype Opaque<T, K> = T & {__opaqueId__: K}\n\n/** @internal */\nexport type DraftId = Opaque<string, 'draftId'>\n\n/** @internal */\nexport type PublishedId = Opaque<string, 'publishedId'>\n\n/** @internal */\nexport const DRAFTS_FOLDER = 'drafts'\n\n/** @internal */\nexport const VERSION_FOLDER = 'versions'\n\nconst PATH_SEPARATOR = '.'\nconst DRAFTS_PREFIX = `${DRAFTS_FOLDER}${PATH_SEPARATOR}`\nconst VERSION_PREFIX = `${VERSION_FOLDER}${PATH_SEPARATOR}`\n\n/** @internal */\nexport function isDraftId(id: string): id is DraftId {\n  return id.startsWith(DRAFTS_PREFIX)\n}\n\n/** @internal */\nexport function isVersionId(id: string): boolean {\n  return id.startsWith(VERSION_PREFIX)\n}\n\n/** @internal */\nexport function isPublishedId(id: string): id is PublishedId {\n  return !isDraftId(id) && !isVersionId(id)\n}\n\n/** @internal */\nexport function getDraftId(id: string): DraftId {\n  if (isVersionId(id)) {\n    const publishedId = getPublishedId(id)\n    return (DRAFTS_PREFIX + publishedId) as DraftId\n  }\n\n  return isDraftId(id) ? id : ((DRAFTS_PREFIX + id) as DraftId)\n}\n\n/**  @internal */\nexport function getVersionId(id: string, version: string): string {\n  if (version === 'drafts' || version === 'published') {\n    throw new Error('Version can not be \"published\" or \"drafts\"')\n  }\n\n  return `${VERSION_PREFIX}${version}${PATH_SEPARATOR}${getPublishedId(id)}`\n}\n\n/**\n *  @internal\n *  Given an id, returns the versionId if it exists.\n *  e.g. `versions.summer-drop.foo` = `summer-drop`\n *  e.g. `drafts.foo` = `undefined`\n *  e.g. `foo` = `undefined`\n */\nexport function getVersionFromId(id: string): string | undefined {\n  if (!isVersionId(id)) return undefined\n  // eslint-disable-next-line unused-imports/no-unused-vars\n  const [_versionPrefix, versionId, ..._publishedId] = id.split(PATH_SEPARATOR)\n\n  return versionId\n}\n\n/** @internal */\nexport function getPublishedId(id: string): PublishedId {\n  if (isVersionId(id)) {\n    // make sure to only remove the versions prefix and the bundle name\n    return id.split(PATH_SEPARATOR).slice(2).join(PATH_SEPARATOR) as PublishedId as PublishedId\n  }\n\n  if (isDraftId(id)) {\n    return id.slice(DRAFTS_PREFIX.length) as PublishedId\n  }\n\n  return id as PublishedId\n}\n","import {getPublishedId, getVersionFromId, isPublishedId, isVersionId} from './draftUtils'\nimport {jsonPathToStudioPath} from './jsonPath'\nimport * as studioPath from './studioPath'\nimport type {CreateEditUrlOptions, EditIntentUrl, StudioBaseUrl} from './types'\n\n/** @internal */\nexport function createEditUrl(options: CreateEditUrlOptions): `${StudioBaseUrl}${EditIntentUrl}` {\n  const {\n    baseUrl,\n    workspace: _workspace = 'default',\n    tool: _tool = 'default',\n    id: _id,\n    type,\n    path,\n    projectId,\n    dataset,\n  } = options\n\n  if (!baseUrl) {\n    throw new Error('baseUrl is required')\n  }\n  if (!path) {\n    throw new Error('path is required')\n  }\n  if (!_id) {\n    throw new Error('id is required')\n  }\n  if (baseUrl !== '/' && baseUrl.endsWith('/')) {\n    throw new Error('baseUrl must not end with a slash')\n  }\n\n  const workspace = _workspace === 'default' ? undefined : _workspace\n  const tool = _tool === 'default' ? undefined : _tool\n  const id = getPublishedId(_id)\n  const stringifiedPath = Array.isArray(path)\n    ? studioPath.toString(jsonPathToStudioPath(path))\n    : path\n\n  // eslint-disable-next-line no-warning-comments\n  // @TODO Using searchParams as a temporary workaround until `@sanity/overlays` can decode state from the path reliably\n  const searchParams = new URLSearchParams({\n    baseUrl,\n    id,\n    type,\n    path: stringifiedPath,\n  })\n  if (workspace) {\n    searchParams.set('workspace', workspace)\n  }\n  if (tool) {\n    searchParams.set('tool', tool)\n  }\n  if (projectId) {\n    searchParams.set('projectId', projectId)\n  }\n  if (dataset) {\n    searchParams.set('dataset', dataset)\n  }\n  if (isPublishedId(_id)) {\n    searchParams.set('perspective', 'published')\n  } else if (isVersionId(_id)) {\n    const versionId = getVersionFromId(_id)!\n    searchParams.set('perspective', versionId)\n  }\n\n  const segments = [baseUrl === '/' ? '' : baseUrl]\n  if (workspace) {\n    segments.push(workspace)\n  }\n  const routerParams = [\n    'mode=presentation',\n    `id=${id}`,\n    `type=${type}`,\n    `path=${encodeURIComponent(stringifiedPath)}`,\n  ]\n  if (tool) {\n    routerParams.push(`tool=${tool}`)\n  }\n  segments.push('intent', 'edit', `${routerParams.join(';')}?${searchParams}`)\n  return segments.join('/') as unknown as `${StudioBaseUrl}${EditIntentUrl}`\n}\n","import {parseJsonPath} from './jsonPath'\nimport {resolveMapping} from './resolveMapping'\nimport type {\n  CreateEditUrlOptions,\n  ResolveEditInfoOptions,\n  StudioBaseRoute,\n  StudioBaseUrl,\n  StudioUrl,\n} from './types'\n\n/** @internal */\nexport function resolveEditInfo(options: ResolveEditInfoOptions): CreateEditUrlOptions | undefined {\n  const {resultSourceMap: csm, resultPath} = options\n  const {mapping, pathSuffix} = resolveMapping(resultPath, csm) || {}\n\n  if (!mapping) {\n    // console.warn('no mapping for path', { path: resultPath, sourceMap: csm })\n    return undefined\n  }\n\n  if (mapping.source.type === 'literal') {\n    return undefined\n  }\n\n  if (mapping.source.type === 'unknown') {\n    return undefined\n  }\n\n  const sourceDoc = csm.documents[mapping.source.document]\n  const sourcePath = csm.paths[mapping.source.path]\n\n  if (sourceDoc && sourcePath) {\n    const {baseUrl, workspace, tool} = resolveStudioBaseRoute(\n      typeof options.studioUrl === 'function' ? options.studioUrl(sourceDoc) : options.studioUrl,\n    )\n    if (!baseUrl) return undefined\n    const {_id, _type, _projectId, _dataset} = sourceDoc\n    return {\n      baseUrl,\n      workspace,\n      tool,\n      id: _id,\n      type: _type,\n      path: parseJsonPath(sourcePath + pathSuffix),\n      projectId: _projectId,\n      dataset: _dataset,\n    } satisfies CreateEditUrlOptions\n  }\n\n  return undefined\n}\n\n/** @internal */\nexport function resolveStudioBaseRoute(studioUrl: StudioUrl): StudioBaseRoute {\n  let baseUrl: StudioBaseUrl = typeof studioUrl === 'string' ? studioUrl : studioUrl.baseUrl\n  if (baseUrl !== '/') {\n    baseUrl = baseUrl.replace(/\\/$/, '')\n  }\n  if (typeof studioUrl === 'string') {\n    return {baseUrl}\n  }\n  return {...studioUrl, baseUrl}\n}\n","import type {ContentSourceMapParsedPath, FilterDefault} from './types'\n\nexport const filterDefault: FilterDefault = ({sourcePath, resultPath, value}) => {\n  // Skips encoding on URL or Date strings, similar to the `skip: 'auto'` parameter in vercelStegaCombine()\n  if (isValidDate(value) || isValidURL(value)) {\n    return false\n  }\n\n  const endPath = sourcePath.at(-1)\n  // Never encode slugs\n  if (sourcePath.at(-2) === 'slug' && endPath === 'current') {\n    return false\n  }\n\n  // Skip underscored keys, and strings that end with `Id`, needs better heuristics but it works for now\n  if (typeof endPath === 'string' && (endPath.startsWith('_') || endPath.endsWith('Id'))) {\n    return false\n  }\n\n  // Don't encode into anything that is suggested it'll render for SEO in meta tags\n  if (\n    sourcePath.some(\n      (path) => path === 'meta' || path === 'metadata' || path === 'openGraph' || path === 'seo',\n    )\n  ) {\n    return false\n  }\n\n  // If the sourcePath or resultPath contains something that sounds like a type, like iconType, we skip encoding, as it's most\n  // of the time used for logic that breaks if it contains stega characters\n  if (hasTypeLike(sourcePath) || hasTypeLike(resultPath)) {\n    return false\n  }\n\n  // Finally, we ignore a bunch of paths that are typically used for page building\n  if (typeof endPath === 'string' && denylist.has(endPath)) {\n    return false\n  }\n\n  return true\n}\n\nconst denylist = new Set([\n  'color',\n  'colour',\n  'currency',\n  'email',\n  'format',\n  'gid',\n  'hex',\n  'href',\n  'hsl',\n  'hsla',\n  'icon',\n  'id',\n  'index',\n  'key',\n  'language',\n  'layout',\n  'link',\n  'linkAction',\n  'locale',\n  'lqip',\n  'page',\n  'path',\n  'ref',\n  'rgb',\n  'rgba',\n  'route',\n  'secret',\n  'slug',\n  'status',\n  'tag',\n  'template',\n  'theme',\n  'type',\n  'textTheme',\n  'unit',\n  'url',\n  'username',\n  'variant',\n  'website',\n])\n\nfunction isValidDate(dateString: string) {\n  return /^\\d{4}-\\d{2}-\\d{2}/.test(dateString) ? Boolean(Date.parse(dateString)) : false\n}\n\nconst allowedProtocols = new Set([\n  'app:',\n  'data:',\n  'discord:',\n  'file:',\n  'ftp:',\n  'ftps:',\n  'geo:',\n  'http:',\n  'https:',\n  'imap:',\n  'javascript:',\n  'magnet:',\n  'mailto:',\n  'maps:',\n  'ms-excel:',\n  'ms-powerpoint:',\n  'ms-word:',\n  'slack:',\n  'sms:',\n  'spotify:',\n  'steam:',\n  'teams:',\n  'tel:',\n  'vscode:',\n  'zoom:',\n])\n\nfunction isValidURL(url: string) {\n  try {\n    const {protocol} = new URL(url, url.startsWith('/') ? 'https://acme.com' : undefined)\n    return allowedProtocols.has(protocol) || protocol.startsWith('web+')\n  } catch {\n    return false\n  }\n}\n\nfunction hasTypeLike(path: ContentSourceMapParsedPath): boolean {\n  return path.some((segment) => typeof segment === 'string' && segment.match(/type/i) !== null)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// ---------- CONSTANTS ----------\nconst ZERO_WIDTHS = [\n  8203, // U+200B ZERO WIDTH SPACE\n  8204, // U+200C ZERO WIDTH NON-JOINER\n  8205, // U+200D ZERO WIDTH JOINER\n  65279, // U+FEFF ZERO WIDTH NO-BREAK SPACE\n]\n\nconst ZERO_WIDTHS_CHAR_CODES = ZERO_WIDTHS.map((x) => String.fromCharCode(x))\n\nconst LEGACY_WIDTHS = [\n  8203, 8204, 8205, 8290, 8291, 8288, 65279, 8289, 119155, 119156, 119157, 119158, 119159, 119160,\n  119161, 119162,\n]\n\nconst ZERO_WIDTH_MAP = Object.fromEntries(ZERO_WIDTHS.map((cp, i) => [cp, i]))\nconst LEGACY_WIDTH_MAP = Object.fromEntries(LEGACY_WIDTHS.map((cp, i) => [cp, i.toString(16)]))\n\n// Base prefix for new encoding — compression flag appended as 5th char\nconst PREFIX = String.fromCodePoint(ZERO_WIDTHS[0]).repeat(4)\n\nconst ALL_WIDTHS = [...ZERO_WIDTHS, ...LEGACY_WIDTHS]\nconst WIDTH_HEXES = ALL_WIDTHS.map((cp) => `\\\\u{${cp.toString(16)}}`).join('')\n\nexport const STEGA_REGEX = new RegExp(`[${WIDTH_HEXES}]{4,}`, 'gu')\n\n// ---------- ENCODE ----------\nexport function stegaEncode(data: any) {\n  if (data === undefined) return ''\n\n  const json = typeof data === 'string' ? data : JSON.stringify(data)\n  // On nodejs we could use Buffer instead (it is faster) but we need to identify if we are running on node\n  const bytes = new TextEncoder().encode(json)\n  // Using a string and concatenating the result as we are looping is faster\n  // than creating an array and merging at the end\n  let out = ''\n  for (let i = 0; i < bytes.length; i++) {\n    const b = bytes[i]\n    out +=\n      ZERO_WIDTHS_CHAR_CODES[(b >> 6) & 3] +\n      ZERO_WIDTHS_CHAR_CODES[(b >> 4) & 3] +\n      ZERO_WIDTHS_CHAR_CODES[(b >> 2) & 3] +\n      ZERO_WIDTHS_CHAR_CODES[b & 3]\n  }\n\n  return PREFIX + out\n}\n\n// ---------- DECODE ----------\nexport function stegaDecode(str: string) {\n  if (!str) return undefined\n  const match = str.match(STEGA_REGEX)\n  if (!match) return undefined\n\n  const encoded = match[0]\n  if (encoded.length % 2 === 0) {\n    if (encoded.length % 4 || !encoded.startsWith(PREFIX)) {\n      // Legacy hex-based encoding\n      return decodeLegacy(encoded)\n    }\n  } else throw new Error('Encoded data has invalid length')\n  const payload = encoded.slice(4)\n  const chars = Array.from(payload)\n  const bytes = new Uint8Array(chars.length / 4)\n\n  for (let i = 0; i < bytes.length; i++) {\n    bytes[i] =\n      (ZERO_WIDTH_MAP[chars[i * 4].codePointAt(0) ?? 0] << 6) |\n      (ZERO_WIDTH_MAP[chars[i * 4 + 1].codePointAt(0) ?? 0] << 4) |\n      (ZERO_WIDTH_MAP[chars[i * 4 + 2].codePointAt(0) ?? 0] << 2) |\n      ZERO_WIDTH_MAP[chars[i * 4 + 3].codePointAt(0) ?? 0]\n  }\n\n  try {\n    const json = new TextDecoder().decode(bytes)\n    return JSON.parse(json)\n  } catch {\n    return undefined\n  }\n}\n\n// ---------- LEGACY DECODER ----------\nfunction decodeLegacy(chars: string, single = false) {\n  const bytes = []\n\n  for (let i = chars.length / 2; i-- > 0; ) {\n    const hexPair = `${LEGACY_WIDTH_MAP[chars[i * 2].codePointAt(0) ?? 0]}${LEGACY_WIDTH_MAP[chars[i * 2 + 1].codePointAt(0) ?? 0]}`\n    bytes.unshift(String.fromCharCode(parseInt(hexPair, 16)))\n  }\n\n  const decoded = []\n  const queue = [bytes.join('')]\n  let attempts = 10\n\n  while (queue.length) {\n    const chunk = queue.shift() ?? ''\n    try {\n      const parsed = JSON.parse(chunk)\n      decoded.push(parsed)\n      if (single) return decoded\n    } catch (err: any) {\n      if (!attempts--) throw err\n      const pos = err.message.match(/\\sposition\\s(\\d+)$/)?.[1]\n      if (!pos) throw err\n      queue.unshift(chunk.substring(0, +pos), chunk.substring(+pos))\n    }\n  }\n\n  return decoded\n}\n\n// ---------- UTILITIES ----------\nexport function stegaCombine(visible: any, metadata: any, skip: 'auto' | boolean = 'auto') {\n  if (skip === true || (skip === 'auto' && !isDateLike(visible) && !isUrlLike(visible))) {\n    return `${visible}${stegaEncode(metadata)}`\n  }\n  return visible\n}\n\nexport function stegaClean(input: string) {\n  if (input == null) return input\n  const cleaned = JSON.stringify(input).replace(STEGA_REGEX, '')\n  return JSON.parse(cleaned)\n}\n\nexport function stegaSplit(str: string) {\n  const match = str.match(STEGA_REGEX)\n  return {\n    cleaned: str.replace(STEGA_REGEX, ''),\n    encoded: match ? match[0] : '',\n  }\n}\n\n// ---------- HELPERS ----------\nfunction isUrlLike(t: any) {\n  try {\n    new URL(t, t.startsWith('/') ? 'https://example.com' : undefined)\n    return true\n  } catch {\n    return false\n  }\n}\n\nfunction isDateLike(t: any) {\n  if (!t || typeof t !== 'string') return false\n  return Boolean(Date.parse(t))\n}\n\nexport function stegaDecodeAll(data: string): string[] {\n  const e = data.match(STEGA_REGEX)\n  if (e) return e.map((r) => stegaDecode(r)).flat()\n  return []\n}\n\nexport default {\n  stegaEncode,\n  stegaDecode,\n  stegaCombine,\n  stegaClean,\n  stegaSplit,\n  stegaDecodeAll,\n}\n","import {createEditUrl} from '../csm/createEditUrl'\nimport {jsonPathToStudioPath} from '../csm/jsonPath'\nimport {resolveStudioBaseRoute} from '../csm/resolveEditInfo'\nimport {reKeySegment, toString as studioPathToString} from '../csm/studioPath'\nimport {encodeIntoResult} from './encodeIntoResult'\nimport {filterDefault} from './filterDefault'\nimport {stegaCombine} from './stega'\nimport {\n  type ContentSourceMap,\n  type ContentSourceMapParsedPath,\n  type InitializedStegaConfig,\n} from './types'\n\nconst TRUNCATE_LENGTH = 20\n\n/**\n * Uses `@vercel/stega` to embed edit info JSON into strings in your query result.\n * The JSON payloads are added using invisible characters so they don't show up visually.\n * The edit info is generated from the Content Source Map (CSM) that is returned from Sanity for the query.\n * @public\n */\nexport function stegaEncodeSourceMap<Result = unknown>(\n  result: Result,\n  resultSourceMap: ContentSourceMap | undefined,\n  config: InitializedStegaConfig,\n): Result {\n  const {filter, logger, enabled} = config\n  if (!enabled) {\n    const msg = \"config.enabled must be true, don't call this function otherwise\"\n    logger?.error?.(`[@sanity/client]: ${msg}`, {result, resultSourceMap, config})\n    throw new TypeError(msg)\n  }\n\n  if (!resultSourceMap) {\n    logger?.error?.('[@sanity/client]: Missing Content Source Map from response body', {\n      result,\n      resultSourceMap,\n      config,\n    })\n    return result\n  }\n\n  if (!config.studioUrl) {\n    const msg = 'config.studioUrl must be defined'\n    logger?.error?.(`[@sanity/client]: ${msg}`, {result, resultSourceMap, config})\n    throw new TypeError(msg)\n  }\n\n  const report: Record<'encoded' | 'skipped', {path: string; length: number; value: string}[]> = {\n    encoded: [],\n    skipped: [],\n  }\n\n  const resultWithStega = encodeIntoResult(\n    result,\n    resultSourceMap,\n    ({sourcePath, sourceDocument, resultPath, value}) => {\n      // Allow userland to control when to opt-out of encoding\n      if (\n        (typeof filter === 'function'\n          ? filter({sourcePath, resultPath, filterDefault, sourceDocument, value})\n          : filterDefault({sourcePath, resultPath, filterDefault, sourceDocument, value})) === false\n      ) {\n        if (logger) {\n          report.skipped.push({\n            path: prettyPathForLogging(sourcePath),\n            value: `${value.slice(0, TRUNCATE_LENGTH)}${\n              value.length > TRUNCATE_LENGTH ? '...' : ''\n            }`,\n            length: value.length,\n          })\n        }\n        return value\n      }\n\n      if (logger) {\n        report.encoded.push({\n          path: prettyPathForLogging(sourcePath),\n          value: `${value.slice(0, TRUNCATE_LENGTH)}${value.length > TRUNCATE_LENGTH ? '...' : ''}`,\n          length: value.length,\n        })\n      }\n\n      const {baseUrl, workspace, tool} = resolveStudioBaseRoute(\n        typeof config.studioUrl === 'function'\n          ? config.studioUrl(sourceDocument)\n          : config.studioUrl!,\n      )\n      if (!baseUrl) return value\n      const {_id: id, _type: type, _projectId: projectId, _dataset: dataset} = sourceDocument\n\n      return stegaCombine(\n        value,\n        {\n          origin: 'sanity.io',\n          href: createEditUrl({\n            baseUrl,\n            workspace,\n            tool,\n            id,\n            type,\n            path: sourcePath,\n            ...(!config.omitCrossDatasetReferenceData && {dataset, projectId}),\n          }),\n        },\n        // We use custom logic to determine if we should skip encoding\n        true,\n      )\n    },\n  )\n\n  if (logger) {\n    const isSkipping = report.skipped.length\n    const isEncoding = report.encoded.length\n    if (isSkipping || isEncoding) {\n      ;(logger?.groupCollapsed || logger.log)?.('[@sanity/client]: Encoding source map into result')\n      logger.log?.(\n        `[@sanity/client]: Paths encoded: ${report.encoded.length}, skipped: ${report.skipped.length}`,\n      )\n    }\n    if (report.encoded.length > 0) {\n      logger?.log?.(`[@sanity/client]: Table of encoded paths`)\n      ;(logger?.table || logger.log)?.(report.encoded)\n    }\n    if (report.skipped.length > 0) {\n      const skipped = new Set<string>()\n      for (const {path} of report.skipped) {\n        skipped.add(path.replace(reKeySegment, '0').replace(/\\[\\d+\\]/g, '[]'))\n      }\n      logger?.log?.(`[@sanity/client]: List of skipped paths`, [...skipped.values()])\n    }\n\n    if (isSkipping || isEncoding) {\n      logger?.groupEnd?.()\n    }\n  }\n\n  return resultWithStega\n}\n\nfunction prettyPathForLogging(path: ContentSourceMapParsedPath): string {\n  return studioPathToString(jsonPathToStudioPath(path))\n}\n"],"names":["isRecord","studioPath.toString","studioPathToString"],"mappings":";;AAeO,MAAM,eAAe;AASrB,SAAS,aAAa,SAA+C;AAC1E,SAAI,OAAO,WAAY,WACd,aAAa,KAAK,QAAQ,KAAK,CAAC,IAGlC,OAAO,WAAY,YAAY,UAAU;AAClD;AA8DO,SAAS,SAAS,MAAoB;AACvC,MAAA,CAAC,MAAM,QAAQ,IAAI;AACf,UAAA,IAAI,MAAM,sBAAsB;AAGxC,SAAO,KAAK,OAAe,CAAC,QAAQ,SAAS,MAAM;AACjD,UAAM,cAAc,OAAO;AAC3B,QAAI,gBAAgB;AACX,aAAA,GAAG,MAAM,IAAI,OAAO;AAG7B,QAAI,gBAAgB;AAEX,aAAA,GAAG,MAAM,GADE,MAAM,IAAI,KAAK,GACL,GAAG,OAAO;AAGpC,QAAA,aAAa,OAAO,KAAK,QAAQ;AACnC,aAAO,GAAG,MAAM,WAAW,QAAQ,IAAI;AAGrC,QAAA,MAAM,QAAQ,OAAO,GAAG;AACpB,YAAA,CAAC,MAAM,EAAE,IAAI;AACnB,aAAO,GAAG,MAAM,IAAI,IAAI,IAAI,EAAE;AAAA,IAAA;AAGhC,UAAM,IAAI,MAAM,8BAA8B,KAAK,UAAU,OAAO,CAAC,IAAI;AAAA,KACxE,EAAE;AACP;AC/GA,MAAM,SAAiC;AAAA,EACrC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR,GAEM,WAAmC;AAAA,EACvC,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AACV;AAKO,SAAS,SAAS,MAAiE;AACjF,SAAA,IAAI,KACR,IAAI,CAAC,YACA,OAAO,WAAY,WAId,KAHY,QAAQ,QAAQ,kBAAkB,CAAC,UAC7C,OAAO,KAAK,CACpB,CACqB,OAGpB,OAAO,WAAY,WACd,IAAI,OAAO,MAGhB,QAAQ,SAAS,KAIZ,eAHY,QAAQ,KAAK,QAAQ,UAAU,CAAC,UAC1C,OAAO,KAAK,CACpB,CAC+B,QAG3B,IAAI,QAAQ,MAAM,GAC1B,EACA,KAAK,EAAE,CAAC;AACb;AAIO,SAAS,cAAc,MAA4C;AACxE,SAAO,KAAK,IAAI,CAAC,YACX,OAAO,WAAY,WAId,KAHY,QAAQ,QAAQ,kBAAkB,CAAC,UAC7C,OAAO,KAAK,CACpB,CACqB,OAGpB,OAAO,WAAY,WACd,IAAI,OAAO,MAGhB,QAAQ,SAAS,KAIZ,eAHY,QAAQ,KAAK,QAAQ,UAAU,CAAC,UAC1C,OAAO,KAAK,CACpB,CAC+B,QAG3B,IAAI,QAAQ,MAAM,GAC1B;AACH;AAKO,SAAS,cAAc,MAAiE;AACvF,QAAA,SAAqC,IAErC,UAAU;AACZ,MAAA;AAEJ,UAAQ,QAAQ,QAAQ,KAAK,IAAI,OAAO,QAAM;AACxC,QAAA,MAAM,CAAC,MAAM,QAAW;AACpB,YAAA,MAAM,MAAM,CAAC,EAAE,QAAQ,qBAAqB,CAAC,MAC1C,SAAS,CAAC,CAClB;AAED,aAAO,KAAK,GAAG;AACf;AAAA,IAAA;AAGE,QAAA,MAAM,CAAC,MAAM,QAAW;AAC1B,aAAO,KAAK,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC;AAClC;AAAA,IAAA;AAGE,QAAA,MAAM,CAAC,MAAM,QAAW;AACpB,YAAA,OAAO,MAAM,CAAC,EAAE,QAAQ,YAAY,CAAC,MAClC,SAAS,CAAC,CAClB;AAED,aAAO,KAAK;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,MAAA,CACT;AACD;AAAA,IAAA;AAAA,EACF;AAGK,SAAA;AACT;AAKO,SAAS,qBAAqB,MAAwC;AACpE,SAAA,KAAK,IAAI,CAAC,YAAY;AAK3B,QAJI,OAAO,WAAY,YAInB,OAAO,WAAY;AACd,aAAA;AAGT,QAAI,QAAQ,SAAS;AACZ,aAAA,EAAC,MAAM,QAAQ,KAAI;AAG5B,QAAI,QAAQ,WAAW;AACrB,aAAO,QAAQ;AAGjB,UAAM,IAAI,MAAM,mBAAmB,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,EAAA,CAC7D;AACH;AA0CO,SAAS,sBAAsB,MAAuD;AACpF,SAAA,KAAK,IAAI,CAAC,YAAY;AAK3B,QAJI,OAAO,WAAY,YAInB,OAAO,WAAY;AACd,aAAA;AAGT,QAAI,QAAQ,WAAW;AACrB,aAAO,QAAQ;AAGjB,UAAM,IAAI,MAAM,mBAAmB,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,EAAA,CAC7D;AACH;ACpMgB,SAAA,eACd,YACA,KAOY;AACZ,MAAI,CAAC,KAAK;AACR;AAEF,QAAM,oBAAoB,SAAS,sBAAsB,UAAU,CAAC;AAEhE,MAAA,IAAI,SAAS,iBAAiB,MAAM;AAC/B,WAAA;AAAA,MACL,SAAS,IAAI,SAAS,iBAAiB;AAAA,MACvC,aAAa;AAAA,MACb,YAAY;AAAA,IACd;AAGF,QAAM,yBAAyB,cAAc,sBAAsB,UAAU,CAAC;AAC9E,WAAS,IAAI,uBAAuB,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3D,UAAM,MAAM,IAAI,uBAAuB,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,IACrD,eAAe,IAAI,SAAS,GAAG;AACrC,QAAI,cAAc;AAChB,YAAM,aAAa,kBAAkB,UAAU,IAAI,MAAM;AACzD,aAAO,EAAC,SAAS,cAAc,aAAa,KAAK,WAAU;AAAA,IAAA;AAAA,EAC7D;AAIJ;ACvCO,SAAS,QAAQ,OAAyC;AAC/D,SAAO,UAAU,QAAQ,MAAM,QAAQ,KAAK;AAC9C;ACKO,SAAS,QACd,OACA,WACA,OAAmC,CAAA,GAC1B;AACT,MAAI,QAAQ,KAAK;AACf,WAAO,MAAM,IAAI,CAAC,GAAG,QAAQ;AACvB,UAAAA,WAAAA,SAAS,CAAC,GAAG;AACf,cAAM,OAAO,EAAE;AACf,YAAI,OAAO,QAAS;AACX,iBAAA,QAAQ,GAAG,WAAW,KAAK,OAAO,EAAC,MAAM,QAAQ,IAAG,CAAC,CAAC;AAAA,MAAA;AAIjE,aAAO,QAAQ,GAAG,WAAW,KAAK,OAAO,GAAG,CAAC;AAAA,IAAA,CAC9C;AAGC,MAAAA,WAAAA,SAAS,KAAK,GAAG;AAEnB,QAAI,MAAM,UAAU,WAAW,MAAM,UAAU,QAAQ;AAC/C,YAAA,SAAS,EAAC,GAAG,MAAK;AACpB,aAAA,MAAM,UAAU,UAClB,OAAO,WAAW,QAAQ,MAAM,UAAU,WAAW,KAAK,OAAO,UAAU,CAAC,IACnE,MAAM,UAAU,WACzB,OAAO,OAAO,QAAQ,MAAM,MAAM,WAAW,KAAK,OAAO,MAAM,CAAC,IAE3D;AAAA,IAAA;AAGT,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,QAAQ,GAAG,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAAA,IAClF;AAAA,EAAA;AAGK,SAAA,UAAU,OAAO,IAAI;AAC9B;AClCgB,SAAA,iBACd,QACA,KACA,SACQ;AACR,SAAO,QAAQ,QAAQ,CAAC,OAAO,SAAS;AAEtC,QAAI,OAAO,SAAU;AACZ,aAAA;AAGH,UAAA,uBAAuB,eAAe,MAAM,GAAG;AACrD,QAAI,CAAC;AACI,aAAA;AAGH,UAAA,EAAC,SAAS,YAAA,IAAe;AAK/B,QAJI,QAAQ,SAAS,WAIjB,QAAQ,OAAO,SAAS;AACnB,aAAA;AAGH,UAAA,iBAAiB,IAAI,UAAU,QAAQ,OAAO,QAAS,GACvD,aAAa,IAAI,MAAM,QAAQ,OAAO,IAAI,GAE1C,oBAAoB,cAAc,WAAW,GAE7C,qBADqB,cAAc,UAAU,EACL,OAAO,KAAK,MAAM,kBAAkB,MAAM,CAAC;AAEzF,WAAO,QAAQ;AAAA,MACb,YAAY;AAAA,MACZ;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACH;ACvCa,MAAA,gBAAgB,UAGhB,iBAAiB,YAExB,iBAAiB,KACjB,gBAAgB,GAAG,aAAa,GAAG,cAAc,IACjD,iBAAiB,GAAG,cAAc,GAAG,cAAc;AAGlD,SAAS,UAAU,IAA2B;AAC5C,SAAA,GAAG,WAAW,aAAa;AACpC;AAGO,SAAS,YAAY,IAAqB;AACxC,SAAA,GAAG,WAAW,cAAc;AACrC;AAGO,SAAS,cAAc,IAA+B;AAC3D,SAAO,CAAC,UAAU,EAAE,KAAK,CAAC,YAAY,EAAE;AAC1C;AA4BO,SAAS,iBAAiB,IAAgC;AAC3D,MAAA,CAAC,YAAY,EAAE,EAAG;AAEhB,QAAA,CAAC,gBAAgB,WAAW,GAAG,YAAY,IAAI,GAAG,MAAM,cAAc;AAErE,SAAA;AACT;AAGO,SAAS,eAAe,IAAyB;AAClD,SAAA,YAAY,EAAE,IAET,GAAG,MAAM,cAAc,EAAE,MAAM,CAAC,EAAE,KAAK,cAAc,IAG1D,UAAU,EAAE,IACP,GAAG,MAAM,cAAc,MAAM,IAG/B;AACT;AC1EO,SAAS,cAAc,SAAmE;AACzF,QAAA;AAAA,IACJ;AAAA,IACA,WAAW,aAAa;AAAA,IACxB,MAAM,QAAQ;AAAA,IACd,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,MAAI,CAAC;AACG,UAAA,IAAI,MAAM,qBAAqB;AAEvC,MAAI,CAAC;AACG,UAAA,IAAI,MAAM,kBAAkB;AAEpC,MAAI,CAAC;AACG,UAAA,IAAI,MAAM,gBAAgB;AAElC,MAAI,YAAY,OAAO,QAAQ,SAAS,GAAG;AACnC,UAAA,IAAI,MAAM,mCAAmC;AAGrD,QAAM,YAAY,eAAe,YAAY,SAAY,YACnD,OAAO,UAAU,YAAY,SAAY,OACzC,KAAK,eAAe,GAAG,GACvB,kBAAkB,MAAM,QAAQ,IAAI,IACtCC,SAAoB,qBAAqB,IAAI,CAAC,IAC9C,MAIE,eAAe,IAAI,gBAAgB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EAAA,CACP;AACG,MAAA,aACF,aAAa,IAAI,aAAa,SAAS,GAErC,QACF,aAAa,IAAI,QAAQ,IAAI,GAE3B,aACF,aAAa,IAAI,aAAa,SAAS,GAErC,WACF,aAAa,IAAI,WAAW,OAAO,GAEjC,cAAc,GAAG;AACN,iBAAA,IAAI,eAAe,WAAW;AAAA,WAClC,YAAY,GAAG,GAAG;AACrB,UAAA,YAAY,iBAAiB,GAAG;AACzB,iBAAA,IAAI,eAAe,SAAS;AAAA,EAAA;AAG3C,QAAM,WAAW,CAAC,YAAY,MAAM,KAAK,OAAO;AAC5C,eACF,SAAS,KAAK,SAAS;AAEzB,QAAM,eAAe;AAAA,IACnB;AAAA,IACA,MAAM,EAAE;AAAA,IACR,QAAQ,IAAI;AAAA,IACZ,QAAQ,mBAAmB,eAAe,CAAC;AAAA,EAC7C;AACI,SAAA,QACF,aAAa,KAAK,QAAQ,IAAI,EAAE,GAElC,SAAS,KAAK,UAAU,QAAQ,GAAG,aAAa,KAAK,GAAG,CAAC,IAAI,YAAY,EAAE,GACpE,SAAS,KAAK,GAAG;AAC1B;AC3BO,SAAS,uBAAuB,WAAuC;AAC5E,MAAI,UAAyB,OAAO,aAAc,WAAW,YAAY,UAAU;AAInF,SAHI,YAAY,QACd,UAAU,QAAQ,QAAQ,OAAO,EAAE,IAEjC,OAAO,aAAc,WAChB,EAAC,YAEH,EAAC,GAAG,WAAW,QAAO;AAC/B;AC5DO,MAAM,gBAA+B,CAAC,EAAC,YAAY,YAAY,YAAW;AAE/E,MAAI,YAAY,KAAK,KAAK,WAAW,KAAK;AACjC,WAAA;AAGH,QAAA,UAAU,WAAW,GAAG,EAAE;AA2BhC,SAzBI,aAAW,GAAG,EAAE,MAAM,UAAU,YAAY,aAK5C,OAAO,WAAY,aAAa,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,IAAI,MAMlF,WAAW;AAAA,IACT,CAAC,SAAS,SAAS,UAAU,SAAS,cAAc,SAAS,eAAe,SAAS;AAAA,EAQrF,KAAA,YAAY,UAAU,KAAK,YAAY,UAAU,KAKjD,OAAO,WAAY,YAAY,SAAS,IAAI,OAAO;AAKzD,GAEM,+BAAe,IAAI;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,YAAY,YAAoB;AAChC,SAAA,qBAAqB,KAAK,UAAU,IAAI,EAAQ,KAAK,MAAM,UAAU,IAAK;AACnF;AAEA,MAAM,uCAAuB,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,WAAW,KAAa;AAC3B,MAAA;AACI,UAAA,EAAC,SAAQ,IAAI,IAAI,IAAI,KAAK,IAAI,WAAW,GAAG,IAAI,qBAAqB,MAAS;AACpF,WAAO,iBAAiB,IAAI,QAAQ,KAAK,SAAS,WAAW,MAAM;AAAA,EAAA,QAC7D;AACC,WAAA;AAAA,EAAA;AAEX;AAEA,SAAS,YAAY,MAA2C;AACvD,SAAA,KAAK,KAAK,CAAC,YAAY,OAAO,WAAY,YAAY,QAAQ,MAAM,OAAO,MAAM,IAAI;AAC9F;AC7HA,MAAM,cAAc;AAAA,EAClB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF,GAEM,yBAAyB,YAAY,IAAI,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC,GAEtE,gBAAgB;AAAA,EACpB;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AAAA,EAAM;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACzF;AAAA,EAAQ;AACV;AAEuB,OAAO,YAAY,YAAY,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,OAAO,YAAY,cAAc,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AAGxF,MAAA,SAAS,OAAO,cAAc,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,GAEtD,aAAa,CAAC,GAAG,aAAa,GAAG,aAAa;AAChC,WAAW,IAAI,CAAC,OAAO,OAAO,GAAG,SAAS,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE;AAKtE,SAAS,YAAY,MAAW;AACjC,MAAA,SAAS,OAAkB,QAAA;AAE/B,QAAM,OAAO,OAAO,QAAS,WAAW,OAAO,KAAK,UAAU,IAAI,GAE5D,QAAQ,IAAI,YAAY,EAAE,OAAO,IAAI;AAG3C,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAC/B,UAAA,IAAI,MAAM,CAAC;AACjB,WACE,uBAAwB,KAAK,IAAK,CAAC,IACnC,uBAAwB,KAAK,IAAK,CAAC,IACnC,uBAAwB,KAAK,IAAK,CAAC,IACnC,uBAAuB,IAAI,CAAC;AAAA,EAAA;AAGhC,SAAO,SAAS;AAClB;AAkEO,SAAS,aAAa,SAAc,UAAe,OAAyB,QAAQ;AACzF,SAAI,SAAS,MAAS,SAAS,UAAU,CAAC,WAAW,OAAO,KAAK,CAAC,UAAU,OAAO,IAC1E,GAAG,OAAO,GAAG,YAAY,QAAQ,CAAC,KAEpC;AACT;AAiBA,SAAS,UAAU,GAAQ;AACrB,MAAA;AACE,WAAA,IAAA,IAAI,GAAG,EAAE,WAAW,GAAG,IAAI,wBAAwB,MAAS,GACzD;AAAA,EAAA,QACD;AACC,WAAA;AAAA,EAAA;AAEX;AAEA,SAAS,WAAW,GAAQ;AACtB,SAAA,CAAC,KAAK,OAAO,KAAM,WAAiB,KACjC,CAAA,CAAQ,KAAK,MAAM,CAAC;AAC7B;ACtIA,MAAM,kBAAkB;AAQR,SAAA,qBACd,QACA,iBACA,QACQ;AACR,QAAM,EAAC,QAAQ,QAAQ,QAAW,IAAA;AAClC,MAAI,CAAC,SAAS;AACZ,UAAM,MAAM;AACZ,UAAA,QAAQ,QAAQ,qBAAqB,GAAG,IAAI,EAAC,QAAQ,iBAAiB,OAAA,CAAO,GACvE,IAAI,UAAU,GAAG;AAAA,EAAA;AAGzB,MAAI,CAAC;AACH,WAAA,QAAQ,QAAQ,mEAAmE;AAAA,MACjF;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAA,GACM;AAGL,MAAA,CAAC,OAAO,WAAW;AACrB,UAAM,MAAM;AACZ,UAAA,QAAQ,QAAQ,qBAAqB,GAAG,IAAI,EAAC,QAAQ,iBAAiB,OAAA,CAAO,GACvE,IAAI,UAAU,GAAG;AAAA,EAAA;AAGzB,QAAM,SAAyF;AAAA,IAC7F,SAAS,CAAC;AAAA,IACV,SAAS,CAAA;AAAA,KAGL,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,CAAC,EAAC,YAAY,gBAAgB,YAAY,YAAW;AAGhD,WAAA,OAAO,UAAW,aACf,OAAO,EAAC,YAAY,YAAY,eAAe,gBAAgB,MAAA,CAAM,IACrE,cAAc,EAAC,YAAY,YAA2C,MAAM,CAAA,OAAO;AAEnF,eAAA,UACF,OAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,qBAAqB,UAAU;AAAA,UACrC,OAAO,GAAG,MAAM,MAAM,GAAG,eAAe,CAAC,GACvC,MAAM,SAAS,kBAAkB,QAAQ,EAC3C;AAAA,UACA,QAAQ,MAAM;AAAA,QACf,CAAA,GAEI;AAGL,gBACF,OAAO,QAAQ,KAAK;AAAA,QAClB,MAAM,qBAAqB,UAAU;AAAA,QACrC,OAAO,GAAG,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,MAAM,SAAS,kBAAkB,QAAQ,EAAE;AAAA,QACvF,QAAQ,MAAM;AAAA,MAAA,CACf;AAGH,YAAM,EAAC,SAAS,WAAW,KAAQ,IAAA;AAAA,QACjC,OAAO,OAAO,aAAc,aACxB,OAAO,UAAU,cAAc,IAC/B,OAAO;AAAA,MACb;AACI,UAAA,CAAC,QAAgB,QAAA;AACf,YAAA,EAAC,KAAK,IAAI,OAAO,MAAM,YAAY,WAAW,UAAU,QAAA,IAAW;AAElE,aAAA;AAAA,QACL;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM,cAAc;AAAA,YAClB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,MAAM;AAAA,YACN,GAAI,CAAC,OAAO,iCAAiC,EAAC,SAAS,UAAS;AAAA,UACjE,CAAA;AAAA,QACH;AAAA;AAAA,QAEA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAEA,MAAI,QAAQ;AACV,UAAM,aAAa,OAAO,QAAQ,QAC5B,aAAa,OAAO,QAAQ;AAC9B,SAAA,cAAc,iBACd,QAAQ,kBAAkB,OAAO,OAAO,mDAAmD,GAC7F,OAAO;AAAA,MACL,oCAAoC,OAAO,QAAQ,MAAM,cAAc,OAAO,QAAQ,MAAM;AAAA,IAAA,IAG5F,OAAO,QAAQ,SAAS,MAC1B,QAAQ,MAAM,0CAA0C,IACtD,QAAQ,SAAS,OAAO,OAAO,OAAO,OAAO,IAE7C,OAAO,QAAQ,SAAS,GAAG;AACvB,YAAA,8BAAc,IAAY;AACrB,iBAAA,EAAC,UAAS,OAAO;AAClB,gBAAA,IAAI,KAAK,QAAQ,cAAc,GAAG,EAAE,QAAQ,YAAY,IAAI,CAAC;AAEvE,cAAQ,MAAM,2CAA2C,CAAC,GAAG,QAAQ,OAAA,CAAQ,CAAC;AAAA,IAAA;AAG5E,KAAA,cAAc,eAChB,QAAQ,WAAW;AAAA,EAAA;AAIhB,SAAA;AACT;AAEA,SAAS,qBAAqB,MAA0C;AAC/D,SAAAC,SAAmB,qBAAqB,IAAI,CAAC;AACtD;;;;;;;;"}