metanova 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/url.ts","../src/fetcher/security.ts","../src/fetcher/fetcher.ts","../src/utils/html.ts","../src/extractors/html.ts","../src/extractors/embeddedData.ts","../src/extractors/jsonLd.ts","../src/extractors/media.ts","../src/extractors/oEmbed.ts","../src/extractors/openGraph.ts","../src/extractors/twitter.ts","../src/scorers/image.ts","../src/media/MediaDiscoveryEngine.ts","../src/engines/ConfidenceEngine.ts","../src/normalizers/normalize.ts","../src/adapters/siteAdapters.ts","../src/plugins/registry.ts","../src/parse.ts","../src/utils/imageDimensions.ts","../src/fetchMetadata.ts","../src/preview.ts","../src/core.ts","../src/diagnostics/index.ts"],"sourcesContent":["import { MetaNova } from \"./core.js\";\n\nexport { MetaNova } from \"./core.js\";\nexport { fetchMetadata } from \"./fetchMetadata.js\";\nexport { parseMetadata, parseMetadataAsync } from \"./parse.js\";\nexport { createPreviewCard } from \"./preview.js\";\nexport { detectShortUrl, normalizeUrl, resolveCanonicalUrl, resolveUrl, validateUrl } from \"./utils/url.js\";\nexport { normalizeMetadata } from \"./normalizers/index.js\";\nexport { scoreImages } from \"./scorers/index.js\";\nexport * from \"./engines/index.js\";\nexport * from \"./media/index.js\";\nexport {\n extractAudio,\n extractEmbeddedData,\n extractHtmlMetadata,\n extractImages,\n extractJsonLd,\n extractOEmbed,\n extractOpenGraph,\n extractTwitterCards,\n extractVideos\n} from \"./extractors/index.js\";\nexport * from \"./adapters/index.js\";\nexport * from \"./diagnostics/index.js\";\nexport * from \"./fetcher/index.js\";\nexport * from \"./plugins/index.js\";\nexport type * from \"./types/index.js\";\nexport default MetaNova;\n","import net from \"node:net\";\n\nexport interface ValidateUrlOptions {\n allowedProtocols?: string[];\n}\n\nexport interface ShortUrlInfo {\n isShortUrl: boolean;\n provider?: string;\n}\n\nconst SHORT_URL_HOSTS: Record<string, string> = {\n \"pin.it\": \"Pinterest\",\n \"redd.it\": \"Reddit\",\n \"t.co\": \"X\",\n \"bit.ly\": \"Bitly\",\n \"tinyurl.com\": \"TinyURL\",\n \"youtu.be\": \"YouTube\"\n};\n\nexport function validateUrl(input: string, options: ValidateUrlOptions = {}): URL {\n const url = new URL(input);\n const allowedProtocols = options.allowedProtocols ?? [\"http:\", \"https:\"];\n\n if (!allowedProtocols.includes(url.protocol)) {\n throw new TypeError(`Unsupported URL protocol: ${url.protocol}`);\n }\n\n return url;\n}\n\nexport function resolveUrl(url: string, baseUrl?: string): string {\n const resolved = baseUrl ? new URL(url, baseUrl) : new URL(url);\n return normalizeUrl(resolved.toString());\n}\n\nexport function tryResolveUrl(url: string | undefined, baseUrl?: string): string | undefined {\n if (!url) {\n return undefined;\n }\n\n try {\n return resolveUrl(url, baseUrl);\n } catch {\n return undefined;\n }\n}\n\nexport function normalizeUrl(input: string, options: ValidateUrlOptions = {}): string {\n const url = validateUrl(input, options);\n url.hash = \"\";\n url.hostname = url.hostname.toLowerCase();\n\n if ((url.protocol === \"http:\" && url.port === \"80\") || (url.protocol === \"https:\" && url.port === \"443\")) {\n url.port = \"\";\n }\n\n return url.toString();\n}\n\nexport function detectShortUrl(input: string | URL): ShortUrlInfo {\n const url = typeof input === \"string\" ? validateUrl(input) : input;\n const hostname = url.hostname.toLowerCase().replace(/^www\\./, \"\");\n const provider = SHORT_URL_HOSTS[hostname];\n\n return {\n isShortUrl: Boolean(provider),\n provider\n };\n}\n\nexport function resolveCanonicalUrl(canonicalUrl: string | undefined, baseUrl: string): string | undefined {\n return tryResolveUrl(canonicalUrl, baseUrl);\n}\n\nexport function isLocalHostname(hostname: string): boolean {\n const normalized = hostname.toLowerCase().replace(/\\.$/, \"\");\n return normalized === \"localhost\" || normalized.endsWith(\".localhost\");\n}\n\nexport function classifyIp(address: string): \"public\" | \"loopback\" | \"private\" | \"linkLocal\" | \"reserved\" {\n const ipVersion = net.isIP(address);\n\n if (ipVersion === 4) {\n return classifyIpv4(address);\n }\n\n if (ipVersion === 6) {\n return classifyIpv6(address);\n }\n\n return \"public\";\n}\n\nfunction classifyIpv4(address: string): \"public\" | \"loopback\" | \"private\" | \"linkLocal\" | \"reserved\" {\n const parts = address.split(\".\").map((part) => Number.parseInt(part, 10));\n const [a, b] = parts;\n\n if (a === 127) {\n return \"loopback\";\n }\n\n if (a === 10 || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168)) {\n return \"private\";\n }\n\n if (a === 169 && b === 254) {\n return \"linkLocal\";\n }\n\n if (\n a === 0 ||\n a >= 224 ||\n (a === 100 && b >= 64 && b <= 127) ||\n (a === 192 && b === 0) ||\n (a === 198 && (b === 18 || b === 19))\n ) {\n return \"reserved\";\n }\n\n return \"public\";\n}\n\nfunction classifyIpv6(address: string): \"public\" | \"loopback\" | \"private\" | \"linkLocal\" | \"reserved\" {\n const normalized = address.toLowerCase();\n\n if (normalized === \"::1\" || normalized === \"0:0:0:0:0:0:0:1\") {\n return \"loopback\";\n }\n\n if (normalized.startsWith(\"fc\") || normalized.startsWith(\"fd\")) {\n return \"private\";\n }\n\n if (normalized.startsWith(\"fe8\") || normalized.startsWith(\"fe9\") || normalized.startsWith(\"fea\") || normalized.startsWith(\"feb\")) {\n return \"linkLocal\";\n }\n\n if (normalized === \"::\" || normalized.startsWith(\"::ffff:127.\") || normalized.startsWith(\"::ffff:10.\")) {\n return \"reserved\";\n }\n\n return \"public\";\n}\n","import { lookup } from \"node:dns/promises\";\nimport net from \"node:net\";\nimport type { FetchMetadataOptions } from \"../types/index.js\";\nimport { classifyIp, isLocalHostname, normalizeUrl } from \"../utils/url.js\";\n\nexport class SecurityError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SecurityError\";\n }\n}\n\nexport async function assertSafeRequestUrl(input: string, options: FetchMetadataOptions = {}): Promise<string> {\n const protocols = options.allowedProtocols ?? [\"http:\", \"https:\"];\n let normalizedUrl: string;\n\n try {\n normalizedUrl = normalizeUrl(input, { allowedProtocols: protocols });\n } catch (error) {\n if (error instanceof TypeError) {\n throw new SecurityError(error.message);\n }\n\n throw error;\n }\n\n const url = new URL(normalizedUrl);\n\n if (!protocols.includes(url.protocol)) {\n throw new SecurityError(`Unsupported URL protocol: ${url.protocol}`);\n }\n\n const hostname = url.hostname;\n\n if (isLocalHostname(hostname) && !options.allowLocalhost) {\n throw new SecurityError(\"Localhost URLs are blocked by default.\");\n }\n\n const literalIp = net.isIP(hostname) ? hostname : undefined;\n if (literalIp) {\n assertPublicAddressAllowed(literalIp, options);\n return url.toString();\n }\n\n if (options.allowPrivateNetwork && options.allowLocalhost) {\n return url.toString();\n }\n\n const records = await lookup(hostname, { all: true, verbatim: false });\n for (const record of records) {\n assertPublicAddressAllowed(record.address, options);\n }\n\n return url.toString();\n}\n\nfunction assertPublicAddressAllowed(address: string, options: FetchMetadataOptions): void {\n const classification = classifyIp(address);\n\n if (classification === \"loopback\" && !options.allowLocalhost) {\n throw new SecurityError(`Loopback address is blocked: ${address}`);\n }\n\n if (classification !== \"public\" && classification !== \"loopback\" && !options.allowPrivateNetwork) {\n throw new SecurityError(`Private or reserved network address is blocked: ${address}`);\n }\n}\n","import type { FetchMetadataOptions, MetaNovaCacheEntry, RedirectEntry } from \"../types/index.js\";\nimport { detectShortUrl, normalizeUrl, resolveUrl } from \"../utils/url.js\";\nimport { assertSafeRequestUrl } from \"./security.js\";\n\nconst DEFAULT_TIMEOUT_MS = 8_000;\nconst DEFAULT_MAX_REDIRECTS = 5;\nconst DEFAULT_MAX_BYTES = 2_000_000;\nexport const DEFAULT_BROWSER_USER_AGENT =\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36\";\nexport const DEFAULT_ACCEPT =\n \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\";\nexport const DEFAULT_ACCEPT_LANGUAGE = \"en-US,en;q=0.9\";\nexport const DEFAULT_ACCEPT_ENCODING = \"gzip, deflate, br\";\n\nexport interface FetchedPage {\n url: string;\n originalUrl: string;\n finalUrl: string;\n isShortUrl: boolean;\n shortUrlProvider?: string;\n html: string;\n bytes?: Uint8Array;\n statusCode: number;\n contentType?: string;\n redirects: RedirectEntry[];\n headers: Record<string, string>;\n}\n\nexport async function fetchPage(inputUrl: string, options: FetchMetadataOptions = {}): Promise<FetchedPage> {\n const startUrl = normalizeUrl(inputUrl);\n const cached = await options.cache?.get(startUrl);\n\n if (cached) {\n return fromCache(startUrl, cached);\n }\n\n const retries = options.retries ?? 1;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n try {\n const page = await requestWithRedirects(startUrl, options);\n await options.cache?.set(startUrl, {\n html: page.html,\n finalUrl: page.finalUrl,\n statusCode: page.statusCode,\n contentType: page.contentType,\n redirects: page.redirects\n });\n return page;\n } catch (error) {\n lastError = error;\n if (attempt < retries) {\n await delay(options.retryDelayMs ?? 250);\n }\n }\n }\n\n throw lastError;\n}\n\nexport interface RedirectResolution {\n originalUrl: string;\n finalUrl: string;\n redirects: RedirectEntry[];\n isShortUrl: boolean;\n shortUrlProvider?: string;\n}\n\nexport async function resolveRedirects(inputUrl: string, options: FetchMetadataOptions = {}): Promise<RedirectResolution> {\n const originalUrl = normalizeUrl(inputUrl);\n const maxRedirects = options.maxRedirects ?? DEFAULT_MAX_REDIRECTS;\n const fetchImpl = options.fetch ?? fetch;\n const redirects: RedirectEntry[] = [];\n let currentUrl = await assertSafeRequestUrl(originalUrl, options);\n\n for (let redirectCount = 0; redirectCount <= maxRedirects; redirectCount += 1) {\n const response = await requestOnce(fetchImpl, currentUrl, options);\n const statusCode = response.status;\n\n if (!isRedirect(statusCode)) {\n const shortUrl = detectShortUrl(originalUrl);\n return {\n originalUrl,\n finalUrl: currentUrl,\n redirects,\n isShortUrl: shortUrl.isShortUrl,\n shortUrlProvider: shortUrl.provider\n };\n }\n\n const location = response.headers.get(\"location\");\n if (!location) {\n throw new Error(`Redirect response from ${currentUrl} did not include a Location header.`);\n }\n\n const nextUrl = await assertSafeRequestUrl(resolveUrl(location, currentUrl), options);\n redirects.push({ from: currentUrl, to: nextUrl, statusCode });\n currentUrl = nextUrl;\n }\n\n throw new Error(`Too many redirects. Maximum allowed redirects: ${maxRedirects}.`);\n}\n\nasync function requestWithRedirects(inputUrl: string, options: FetchMetadataOptions): Promise<FetchedPage> {\n const fetchImpl = options.fetch ?? fetch;\n const maxRedirects = options.maxRedirects ?? DEFAULT_MAX_REDIRECTS;\n const redirects: RedirectEntry[] = [];\n const shortUrl = detectShortUrl(inputUrl);\n let currentUrl = await assertSafeRequestUrl(inputUrl, options);\n\n for (let redirectCount = 0; redirectCount <= maxRedirects; redirectCount += 1) {\n const response = await requestOnce(fetchImpl, currentUrl, options);\n const statusCode = response.status;\n\n if (isRedirect(statusCode)) {\n const location = response.headers.get(\"location\");\n if (!location) {\n throw new Error(`Redirect response from ${currentUrl} did not include a Location header.`);\n }\n\n const nextUrl = await assertSafeRequestUrl(resolveUrl(location, currentUrl), options);\n redirects.push({ from: currentUrl, to: nextUrl, statusCode });\n currentUrl = nextUrl;\n continue;\n }\n\n const headers = headersToRecord(response.headers);\n const body = await readLimitedBody(response, options.maxBytes ?? DEFAULT_MAX_BYTES);\n\n return {\n url: inputUrl,\n originalUrl: inputUrl,\n finalUrl: currentUrl,\n isShortUrl: shortUrl.isShortUrl,\n shortUrlProvider: shortUrl.provider,\n html: body.text,\n bytes: body.bytes,\n statusCode,\n contentType: response.headers.get(\"content-type\") ?? undefined,\n redirects,\n headers\n };\n }\n\n throw new Error(`Too many redirects. Maximum allowed redirects: ${maxRedirects}.`);\n}\n\nasync function requestOnce(fetchImpl: typeof fetch, url: string, options: FetchMetadataOptions): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(new Error(\"Request timed out.\")), options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n const externalSignal = options.signal;\n const abortFromExternal = () => controller.abort(externalSignal?.reason);\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n controller.abort(externalSignal.reason);\n } else {\n externalSignal.addEventListener(\"abort\", abortFromExternal, { once: true });\n }\n }\n\n try {\n return await fetchImpl(url, {\n redirect: \"manual\",\n signal: controller.signal,\n headers: buildBrowserLikeHeaders(options)\n });\n } finally {\n clearTimeout(timeout);\n externalSignal?.removeEventListener(\"abort\", abortFromExternal);\n }\n}\n\nfunction buildBrowserLikeHeaders(options: FetchMetadataOptions): Record<string, string> {\n return {\n \"accept\": options.accept ?? DEFAULT_ACCEPT,\n \"accept-language\": options.acceptLanguage ?? DEFAULT_ACCEPT_LANGUAGE,\n \"accept-encoding\": options.acceptEncoding ?? DEFAULT_ACCEPT_ENCODING,\n \"cache-control\": \"no-cache\",\n \"pragma\": \"no-cache\",\n \"sec-ch-ua\": '\"Chromium\";v=\"125\", \"Google Chrome\";v=\"125\", \"Not.A/Brand\";v=\"24\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"Windows\"',\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"sec-fetch-user\": \"?1\",\n \"upgrade-insecure-requests\": \"1\",\n \"user-agent\": options.userAgent ?? DEFAULT_BROWSER_USER_AGENT,\n ...headersToObject(options.headers)\n };\n}\n\nasync function readLimitedBody(response: Response, maxBytes: number): Promise<{ text: string; bytes: Uint8Array }> {\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength && Number.parseInt(contentLength, 10) > maxBytes) {\n throw new Error(`Response body exceeds maxBytes (${maxBytes}).`);\n }\n\n if (!response.body) {\n const text = await response.text();\n return {\n text,\n bytes: new TextEncoder().encode(text)\n };\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let received = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value) {\n received += value.byteLength;\n if (received > maxBytes) {\n throw new Error(`Response body exceeds maxBytes (${maxBytes}).`);\n }\n chunks.push(value);\n }\n }\n\n const buffer = new Uint8Array(received);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return {\n text: decodeBytes(buffer, response.headers.get(\"content-type\")),\n bytes: buffer\n };\n}\n\nfunction fromCache(url: string, entry: MetaNovaCacheEntry): FetchedPage {\n const shortUrl = detectShortUrl(url);\n\n return {\n url,\n originalUrl: url,\n finalUrl: entry.finalUrl ?? url,\n isShortUrl: shortUrl.isShortUrl,\n shortUrlProvider: shortUrl.provider,\n html: entry.html,\n statusCode: entry.statusCode ?? 200,\n contentType: entry.contentType,\n redirects: entry.redirects ?? [],\n headers: {}\n };\n}\n\nfunction isRedirect(statusCode: number): boolean {\n return statusCode === 301 || statusCode === 302 || statusCode === 303 || statusCode === 307 || statusCode === 308;\n}\n\nfunction extractCharset(contentType: string | null): string {\n const charset = contentType?.match(/charset=([^;]+)/i)?.[1]?.trim().replace(/^[\"']|[\"']$/g, \"\");\n return charset || \"utf-8\";\n}\n\nfunction decodeBytes(buffer: Uint8Array, contentType: string | null): string {\n try {\n return new TextDecoder(extractCharset(contentType)).decode(buffer);\n } catch {\n return new TextDecoder(\"utf-8\").decode(buffer);\n }\n}\n\nfunction headersToRecord(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nfunction headersToObject(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) {\n return {};\n }\n\n return Object.fromEntries(new Headers(headers).entries());\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import { load, type CheerioAPI } from \"cheerio\";\nimport type { ExtractionDiagnostics, MediaAsset } from \"../types/index.js\";\n\nexport function loadDocument(html: string): CheerioAPI {\n return load(html);\n}\n\nexport function normalizeWhitespace(value: string | null | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.replace(/\\s+/g, \" \").trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nexport function firstDefined<T>(...values: Array<T | undefined | null | false | \"\">): T | undefined {\n for (const value of values) {\n if (value !== undefined && value !== null && value !== false && value !== \"\") {\n return value as T;\n }\n }\n\n return undefined;\n}\n\nexport function parseInteger(value: string | number | null | undefined): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.round(value);\n }\n\n if (!value) {\n return undefined;\n }\n\n const parsed = Number.parseInt(String(value), 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport function parseNumber(value: string | number | null | undefined): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (!value) {\n return undefined;\n }\n\n const parsed = Number.parseFloat(String(value));\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport function readMetaContent($: CheerioAPI, selectors: string[]): string | undefined {\n for (const selector of selectors) {\n const content = normalizeWhitespace($(selector).first().attr(\"content\"));\n if (content) {\n return content;\n }\n }\n\n return undefined;\n}\n\nexport function setMapValue(map: Record<string, string | string[]>, key: string, value: string): void {\n const current = map[key];\n if (Array.isArray(current)) {\n current.push(value);\n return;\n }\n\n if (typeof current === \"string\") {\n map[key] = [current, value];\n return;\n }\n\n map[key] = value;\n}\n\nexport function splitList(value: string | undefined): string[] | undefined {\n if (!value) {\n return undefined;\n }\n\n const items = value\n .split(\",\")\n .map((item) => normalizeWhitespace(item))\n .filter((item): item is string => Boolean(item));\n\n return items.length > 0 ? items : undefined;\n}\n\nexport function parseSrcset(value: string | undefined): string[] {\n if (!value) {\n return [];\n }\n\n return value\n .split(\",\")\n .map((candidate) => candidate.trim().split(/\\s+/)[0])\n .filter(Boolean);\n}\n\nexport function uniqueMediaByUrl(assets: MediaAsset[]): MediaAsset[] {\n const seen = new Set<string>();\n const unique: MediaAsset[] = [];\n\n for (const asset of assets) {\n const key = asset.url;\n if (!key || seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n unique.push(asset);\n }\n\n return unique;\n}\n\nexport function createEmptyDiagnostics(): ExtractionDiagnostics {\n return {\n redirects: [],\n sourcesUsed: [],\n warnings: [],\n trace: [],\n extractedAt: new Date().toISOString()\n };\n}\n","import type { HtmlMetadata, MediaAsset } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace, readMetaContent, splitList } from \"../utils/html.js\";\n\nexport function extractHtmlMetadata(html: string): HtmlMetadata {\n const $ = loadDocument(html);\n const favicons: MediaAsset[] = [];\n const alternates: HtmlMetadata[\"alternates\"] = [];\n let canonicalUrl: string | undefined;\n let imageSrc: MediaAsset | undefined;\n\n $(\"link[rel][href]\").each((_, element) => {\n const rel = normalizeWhitespace($(element).attr(\"rel\"))?.toLowerCase();\n const href = normalizeWhitespace($(element).attr(\"href\"));\n const type = normalizeWhitespace($(element).attr(\"type\"));\n\n if (!rel || !href) {\n return;\n }\n\n const relTokens = rel.split(/\\s+/);\n if (relTokens.includes(\"canonical\")) {\n canonicalUrl = href;\n }\n\n if (relTokens.includes(\"image_src\")) {\n imageSrc = {\n url: href,\n kind: \"image\",\n source: \"html\"\n };\n }\n\n if (relTokens.includes(\"alternate\")) {\n alternates.push({\n href,\n type,\n hreflang: normalizeWhitespace($(element).attr(\"hreflang\")),\n title: normalizeWhitespace($(element).attr(\"title\"))\n });\n }\n\n if (\n relTokens.includes(\"icon\") ||\n relTokens.includes(\"shortcut\") ||\n relTokens.includes(\"apple-touch-icon\") ||\n relTokens.includes(\"mask-icon\")\n ) {\n favicons.push({\n url: href,\n kind: \"favicon\",\n source: \"favicon\",\n type,\n metadata: {\n sizes: normalizeWhitespace($(element).attr(\"sizes\")),\n rel\n }\n });\n }\n });\n\n return {\n title: normalizeWhitespace($(\"title\").first().text()) ?? readMetaContent($, [\"meta[name='title']\"]),\n description: readMetaContent($, [\"meta[name='description']\", \"meta[itemprop='description']\"]),\n keywords: splitList(readMetaContent($, [\"meta[name='keywords']\"])),\n robots: readMetaContent($, [\"meta[name='robots']\"]),\n canonicalUrl,\n manifestUrl: normalizeWhitespace($(\"link[rel='manifest']\").first().attr(\"href\")),\n themeColor: readMetaContent($, [\"meta[name='theme-color']\"]),\n applicationName: readMetaContent($, [\"meta[name='application-name']\", \"meta[name='apple-mobile-web-app-title']\"]),\n favicons,\n imageSrc,\n alternates\n };\n}\n","import type { EmbeddedDataItem, EmbeddedDataMetadata, JsonLdNode } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace } from \"../utils/html.js\";\n\nconst MAX_SCRIPT_CHARS = 1_500_000;\n\nconst ASSIGNMENT_PATTERNS: Array<{ source: EmbeddedDataItem[\"source\"]; names: string[] }> = [\n { source: \"nuxt\", names: [\"window.__NUXT__\", \"__NUXT__\"] },\n { source: \"initialState\", names: [\"window.__INITIAL_STATE__\", \"__INITIAL_STATE__\"] },\n { source: \"preloadedState\", names: [\"window.__PRELOADED_STATE__\", \"__PRELOADED_STATE__\"] },\n { source: \"apollo\", names: [\"window.__APOLLO_STATE__\", \"__APOLLO_STATE__\", \"window.__APOLLO_CLIENT__\"] },\n { source: \"youtubeInitialData\", names: [\"ytInitialData\", \"window.ytInitialData\"] },\n { source: \"youtubePlayerResponse\", names: [\"ytInitialPlayerResponse\", \"window.ytInitialPlayerResponse\"] }\n];\n\nexport function extractEmbeddedData(html: string): EmbeddedDataMetadata {\n const $ = loadDocument(html);\n const items: EmbeddedDataItem[] = [];\n const warnings: string[] = [];\n\n const nextData = parseJsonScript($(\"#__NEXT_DATA__\").first().html() ?? $(\"#__NEXT_DATA__\").first().text(), \"nextData\", warnings);\n if (nextData) {\n items.push(nextData);\n }\n\n const nuxtData = parseJsonScript($(\"#__NUXT_DATA__\").first().html() ?? $(\"#__NUXT_DATA__\").first().text(), \"nuxt\", warnings);\n if (nuxtData) {\n items.push(nuxtData);\n }\n\n $(\"script\").each((index, element) => {\n const type = normalizeWhitespace($(element).attr(\"type\"))?.toLowerCase();\n const id = normalizeWhitespace($(element).attr(\"id\"));\n const source = $(element).html() ?? $(element).text();\n\n if (!source || source.length > MAX_SCRIPT_CHARS) {\n return;\n }\n\n if (type?.includes(\"application/json\") || type?.includes(\"application/ld+json\")) {\n const parsed = parseJsonScript(source, type?.includes(\"ld+json\") ? \"jsonScript\" : \"applicationJson\", warnings, id);\n if (parsed) {\n items.push(parsed);\n }\n }\n\n for (const pattern of ASSIGNMENT_PATTERNS) {\n for (const name of pattern.names) {\n const data = parseAssignedJson(source, name);\n if (data) {\n items.push({\n source: pattern.source,\n path: name,\n data\n });\n }\n }\n }\n\n const apolloLike = findApolloPayload(source);\n if (apolloLike) {\n items.push({\n source: \"apollo\",\n path: `script[${index}]`,\n data: apolloLike\n });\n }\n });\n\n return {\n items: dedupeEmbeddedItems(items),\n warnings\n };\n}\n\nfunction parseJsonScript(\n source: string | null | undefined,\n itemSource: EmbeddedDataItem[\"source\"],\n warnings: string[],\n path?: string\n): EmbeddedDataItem | undefined {\n const cleanSource = cleanJsonSource(source);\n if (!cleanSource) {\n return undefined;\n }\n\n try {\n const parsed = JSON.parse(cleanSource);\n if (!isRecord(parsed)) {\n return undefined;\n }\n\n return {\n source: itemSource,\n path,\n data: parsed\n };\n } catch (error) {\n warnings.push(`Could not parse ${itemSource} embedded JSON${path ? ` at ${path}` : \"\"}: ${error instanceof Error ? error.message : String(error)}`);\n return undefined;\n }\n}\n\nfunction parseAssignedJson(source: string, assignmentName: string): JsonLdNode | undefined {\n const index = source.indexOf(assignmentName);\n if (index === -1) {\n return undefined;\n }\n\n const afterName = source.slice(index + assignmentName.length);\n const assignmentIndex = afterName.search(/=\\s*[[{]/);\n if (assignmentIndex === -1) {\n return undefined;\n }\n\n const startInAfterName = afterName.slice(assignmentIndex).search(/[[{]/);\n if (startInAfterName === -1) {\n return undefined;\n }\n\n const start = index + assignmentName.length + assignmentIndex + startInAfterName;\n const candidate = readBalancedJson(source, start);\n if (!candidate) {\n return undefined;\n }\n\n try {\n const parsed = JSON.parse(candidate);\n return isRecord(parsed) ? parsed : { value: parsed };\n } catch {\n return undefined;\n }\n}\n\nfunction findApolloPayload(source: string): JsonLdNode | undefined {\n if (!/apollo|__APOLLO/i.test(source)) {\n return undefined;\n }\n\n const data = parseAssignedJson(source, \"window.__APOLLO_STATE__\") ?? parseAssignedJson(source, \"__APOLLO_STATE__\");\n if (data) {\n return data;\n }\n\n return undefined;\n}\n\nfunction readBalancedJson(source: string, start: number): string | undefined {\n const opener = source[start];\n const closer = opener === \"{\" ? \"}\" : opener === \"[\" ? \"]\" : undefined;\n if (!closer) {\n return undefined;\n }\n\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let index = start; index < source.length; index += 1) {\n const char = source[index];\n\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n continue;\n }\n\n if (char === opener) {\n depth += 1;\n } else if (char === closer) {\n depth -= 1;\n if (depth === 0) {\n return source.slice(start, index + 1);\n }\n }\n }\n\n return undefined;\n}\n\nfunction cleanJsonSource(source: string | null | undefined): string | undefined {\n const cleaned = source\n ?.replace(/^<!--/, \"\")\n .replace(/-->$/, \"\")\n .trim();\n\n return cleaned || undefined;\n}\n\nfunction dedupeEmbeddedItems(items: EmbeddedDataItem[]): EmbeddedDataItem[] {\n const seen = new Set<string>();\n const unique: EmbeddedDataItem[] = [];\n\n for (const item of items) {\n const key = `${item.source}:${item.path ?? \"\"}:${JSON.stringify(item.data).slice(0, 500)}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n unique.push(item);\n }\n\n return unique;\n}\n\nfunction isRecord(value: unknown): value is JsonLdNode {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { JsonLdMetadata, JsonLdNode } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace } from \"../utils/html.js\";\n\nexport function extractJsonLd(html: string): JsonLdMetadata {\n const $ = loadDocument(html);\n const nodes: JsonLdNode[] = [];\n const warnings: string[] = [];\n\n $(\"script[type*='ld+json']\").each((index, element) => {\n const source = normalizeWhitespace($(element).text()) ?? normalizeWhitespace($(element).html());\n if (!source) {\n return;\n }\n\n try {\n for (const node of flattenJsonLd(JSON.parse(cleanJson(source)))) {\n nodes.push(node);\n }\n } catch (error) {\n warnings.push(`Could not parse JSON-LD script at index ${index}: ${error instanceof Error ? error.message : String(error)}`);\n }\n });\n\n return { nodes, warnings };\n}\n\nfunction cleanJson(source: string): string {\n return source\n .replace(/^<!--/, \"\")\n .replace(/-->$/, \"\")\n .trim();\n}\n\nfunction flattenJsonLd(value: unknown): JsonLdNode[] {\n if (Array.isArray(value)) {\n return value.flatMap((item) => flattenJsonLd(item));\n }\n\n if (!isRecord(value)) {\n return [];\n }\n\n const graph = value[\"@graph\"];\n const current = value as JsonLdNode;\n if (Array.isArray(graph)) {\n return [current, ...graph.filter(isRecord)];\n }\n\n return [current];\n}\n\nfunction isRecord(value: unknown): value is JsonLdNode {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { MediaAsset } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace, parseInteger, parseSrcset, uniqueMediaByUrl } from \"../utils/html.js\";\nimport { tryResolveUrl } from \"../utils/url.js\";\n\nconst LAZY_IMAGE_ATTRIBUTES = [\n \"data-src\",\n \"data-original\",\n \"data-lazy-src\",\n \"data-image\",\n \"data-image-url\",\n \"data-og-image\",\n \"data-thumbnail\",\n \"data-thumb\",\n \"data-media\",\n \"data-full-src\",\n \"data-hi-res-src\",\n \"data-zoom-src\",\n \"data-poster\",\n \"data-bg\"\n];\nconst LAZY_IMAGE_SRCSET_ATTRIBUTES = [\"data-srcset\", \"data-lazy-srcset\", \"data-original-srcset\"];\nconst LAZY_MEDIA_ATTRIBUTES = [\"data-src\", \"data-original\", \"data-lazy-src\", \"data-video\", \"data-video-url\", \"data-media\", \"data-playback-url\"];\n\nexport function extractImages(html: string, baseUrl: string): MediaAsset[] {\n const $ = loadDocument(html);\n const images: MediaAsset[] = [];\n\n $(\"link[rel='image_src'][href]\").each((_, element) => {\n pushResolved(images, {\n url: normalizeWhitespace($(element).attr(\"href\")),\n kind: \"image\",\n source: \"html\"\n }, baseUrl);\n });\n\n $(\"link[rel][href]\").each((_, element) => {\n const relTokens = (normalizeWhitespace($(element).attr(\"rel\"))?.toLowerCase() ?? \"\").split(/\\s+/);\n const asValue = normalizeWhitespace($(element).attr(\"as\"))?.toLowerCase();\n const type = normalizeWhitespace($(element).attr(\"type\"));\n if (!relTokens.includes(\"preload\") && !relTokens.includes(\"prefetch\")) {\n return;\n }\n\n if (asValue === \"image\" || type?.startsWith(\"image/\")) {\n pushResolved(images, {\n url: normalizeWhitespace($(element).attr(\"href\")),\n kind: \"image\",\n source: \"html\",\n type,\n metadata: { discoveredFrom: \"link.preload\" }\n }, baseUrl);\n\n for (const candidate of parseSrcset($(element).attr(\"imagesrcset\"))) {\n pushResolved(images, {\n url: candidate,\n kind: \"image\",\n source: \"html\",\n type,\n metadata: { discoveredFrom: \"link.imagesrcset\" }\n }, baseUrl);\n }\n }\n });\n\n collectDocumentImages($, images, baseUrl, \"html\");\n\n $(\"video[poster]\").each((_, element) => {\n pushResolved(images, {\n url: normalizeWhitespace($(element).attr(\"poster\")),\n kind: \"image\",\n source: \"html\",\n width: parseInteger($(element).attr(\"width\")),\n height: parseInteger($(element).attr(\"height\")),\n metadata: {\n discoveredFrom: \"video.poster\"\n }\n }, baseUrl);\n });\n\n $(\"noscript\").each((_, element) => {\n const fallbackHtml = $(element).html() || $(element).text();\n if (!fallbackHtml) {\n return;\n }\n\n collectDocumentImages(loadDocument(fallbackHtml), images, baseUrl, \"fallback\");\n });\n\n return uniqueMediaByUrl(images);\n}\n\nexport function extractVideos(html: string, baseUrl: string): MediaAsset[] {\n const $ = loadDocument(html);\n const videos: MediaAsset[] = [];\n\n $(\"video\").each((_, element) => {\n const src = normalizeWhitespace($(element).attr(\"src\")) ?? firstAttribute($, element, LAZY_MEDIA_ATTRIBUTES);\n const common = {\n kind: \"video\" as const,\n source: \"html\",\n width: parseInteger($(element).attr(\"width\")),\n height: parseInteger($(element).attr(\"height\")),\n poster: tryResolveUrl(normalizeWhitespace($(element).attr(\"poster\")), baseUrl)\n };\n\n pushResolved(videos, { ...common, url: src }, baseUrl);\n\n for (const attribute of LAZY_MEDIA_ATTRIBUTES) {\n pushResolved(videos, {\n ...common,\n url: normalizeWhitespace($(element).attr(attribute))\n }, baseUrl);\n }\n\n $(element)\n .find(\"source[src]\")\n .each((_, source) => {\n pushResolved(videos, {\n ...common,\n url: normalizeWhitespace($(source).attr(\"src\")),\n type: normalizeWhitespace($(source).attr(\"type\"))\n }, baseUrl);\n });\n });\n\n $(\"iframe[src]\").each((_, element) => {\n const src = normalizeWhitespace($(element).attr(\"src\"));\n if (!src || !isLikelyVideoEmbed(src)) {\n return;\n }\n\n pushResolved(videos, {\n url: src,\n kind: \"video\",\n source: \"html\",\n width: parseInteger($(element).attr(\"width\")),\n height: parseInteger($(element).attr(\"height\"))\n }, baseUrl);\n });\n\n $(\"link[rel][href]\").each((_, element) => {\n const relTokens = (normalizeWhitespace($(element).attr(\"rel\"))?.toLowerCase() ?? \"\").split(/\\s+/);\n const asValue = normalizeWhitespace($(element).attr(\"as\"))?.toLowerCase();\n const type = normalizeWhitespace($(element).attr(\"type\"));\n if ((!relTokens.includes(\"preload\") && !relTokens.includes(\"prefetch\")) || (asValue !== \"video\" && !type?.startsWith(\"video/\"))) {\n return;\n }\n\n pushResolved(videos, {\n url: normalizeWhitespace($(element).attr(\"href\")),\n kind: \"video\",\n source: \"html\",\n type,\n metadata: { discoveredFrom: \"link.preload\" }\n }, baseUrl);\n });\n\n return uniqueMediaByUrl(videos);\n}\n\nexport function extractAudio(html: string, baseUrl: string): MediaAsset[] {\n const $ = loadDocument(html);\n const audio: MediaAsset[] = [];\n\n $(\"audio\").each((_, element) => {\n pushResolved(audio, {\n url: normalizeWhitespace($(element).attr(\"src\")),\n kind: \"audio\",\n source: \"html\"\n }, baseUrl);\n\n $(element)\n .find(\"source[src]\")\n .each((_, source) => {\n pushResolved(audio, {\n url: normalizeWhitespace($(source).attr(\"src\")),\n kind: \"audio\",\n source: \"html\",\n type: normalizeWhitespace($(source).attr(\"type\"))\n }, baseUrl);\n });\n });\n\n return uniqueMediaByUrl(audio);\n}\n\nfunction pushResolved(assets: MediaAsset[], asset: Omit<MediaAsset, \"url\"> & { url?: string }, baseUrl: string): void {\n const url = tryResolveUrl(asset.url, baseUrl);\n if (!url || shouldIgnoreMediaUrl(url) || shouldIgnoreImageAsset(asset, url)) {\n return;\n }\n\n assets.push({\n ...asset,\n url\n });\n}\n\nfunction collectDocumentImages($: ReturnType<typeof loadDocument>, images: MediaAsset[], baseUrl: string, source: \"html\" | \"fallback\"): void {\n $(\"img\").each((_, element) => {\n const common = {\n kind: \"image\" as const,\n source,\n width: parseInteger($(element).attr(\"width\")),\n height: parseInteger($(element).attr(\"height\")),\n alt: normalizeWhitespace($(element).attr(\"alt\")),\n title: normalizeWhitespace($(element).attr(\"title\"))\n };\n\n const candidates = [\n normalizeWhitespace($(element).attr(\"src\")),\n ...LAZY_IMAGE_ATTRIBUTES.map((attribute) => normalizeWhitespace($(element).attr(attribute))),\n ...parseSrcset($(element).attr(\"srcset\")),\n ...LAZY_IMAGE_SRCSET_ATTRIBUTES.flatMap((attribute) => parseSrcset($(element).attr(attribute)))\n ];\n\n for (const candidate of candidates) {\n pushResolved(images, {\n ...common,\n url: candidate,\n metadata: {\n discoveredFrom: source === \"fallback\" ? \"noscript\" : \"img\"\n }\n }, baseUrl);\n }\n });\n\n $(\"picture source[srcset], source[type^='image/'][srcset]\").each((_, element) => {\n for (const candidate of [\n ...parseSrcset($(element).attr(\"srcset\")),\n ...LAZY_IMAGE_SRCSET_ATTRIBUTES.flatMap((attribute) => parseSrcset($(element).attr(attribute)))\n ]) {\n pushResolved(images, {\n url: candidate,\n kind: \"image\",\n source,\n type: normalizeWhitespace($(element).attr(\"type\")),\n metadata: {\n discoveredFrom: source === \"fallback\" ? \"noscript.picture.source\" : \"picture.source\"\n }\n }, baseUrl);\n }\n });\n}\n\nfunction shouldIgnoreMediaUrl(url: string): boolean {\n const normalized = url.toLowerCase();\n return (\n normalized.startsWith(\"data:\") ||\n normalized.startsWith(\"blob:\") ||\n normalized.startsWith(\"javascript:\") ||\n /(?:sprite|spacer|blank|transparent|placeholder|tracking|beacon|pixel)(?:[._/-]|$|\\?)/i.test(normalized) ||\n /(?:^|[/?_-])1x1(?:[._/-]|$|\\?)/i.test(normalized)\n );\n}\n\nfunction shouldIgnoreImageAsset(asset: Omit<MediaAsset, \"url\"> & { url?: string }, url: string): boolean {\n if (asset.kind !== \"image\" && asset.kind !== \"favicon\") {\n return false;\n }\n\n const width = asset.width;\n const height = asset.height;\n const normalizedUrl = url.toLowerCase();\n\n if (width !== undefined && height !== undefined) {\n if (width <= 2 || height <= 2) {\n return true;\n }\n\n if (width <= 64 && height <= 64 && /(?:icon|favicon|apple-touch-icon|sprite|logo|avatar)/i.test(normalizedUrl)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isLikelyVideoEmbed(src: string): boolean {\n return /youtube\\.com|youtu\\.be|vimeo\\.com|dailymotion\\.com|tiktok\\.com|instagram\\.com|facebook\\.com|player\\./i.test(src);\n}\n\nfunction firstAttribute($: ReturnType<typeof loadDocument>, element: unknown, attributes: string[]): string | undefined {\n for (const attribute of attributes) {\n const value = normalizeWhitespace($(element as never).attr(attribute));\n if (value) {\n return value;\n }\n }\n\n return undefined;\n}\n","import type { FetchMetadataOptions, OEmbedData, OEmbedLink, OEmbedMetadata } from \"../types/index.js\";\nimport { fetchPage } from \"../fetcher/index.js\";\nimport { loadDocument, normalizeWhitespace } from \"../utils/html.js\";\nimport { tryResolveUrl } from \"../utils/url.js\";\n\nexport function extractOEmbed(html: string, url: string): OEmbedMetadata {\n const $ = loadDocument(html);\n const links: OEmbedMetadata[\"links\"] = [];\n\n $(\"link[rel][href]\").each((_, element) => {\n const rel = normalizeWhitespace($(element).attr(\"rel\"))?.toLowerCase() ?? \"\";\n const relTokens = rel.split(/\\s+/);\n const type = normalizeWhitespace($(element).attr(\"type\"));\n const title = normalizeWhitespace($(element).attr(\"title\"));\n const hrefValue = normalizeWhitespace($(element).attr(\"href\"));\n const looksLikeOEmbed = /oembed/i.test(type ?? \"\") || /oembed/i.test(title ?? \"\") || /[?&]format=(?:json|xml)/i.test(hrefValue ?? \"\");\n\n if (!relTokens.includes(\"alternate\") && !relTokens.includes(\"alternate-oembed\") && !looksLikeOEmbed) {\n return;\n }\n\n if (!looksLikeOEmbed) {\n return;\n }\n\n const href = tryResolveUrl(hrefValue, url);\n if (!href) {\n return;\n }\n\n links.push({\n href,\n type,\n title\n });\n });\n\n return {\n links,\n data: []\n };\n}\n\nexport async function fetchOEmbedData(\n links: OEmbedLink[],\n options: FetchMetadataOptions = {}\n): Promise<{ data: OEmbedData[]; warnings: string[] }> {\n const data: OEmbedData[] = [];\n const warnings: string[] = [];\n\n await Promise.all(\n links.map(async (link) => {\n if (link.type && !/json/i.test(link.type)) {\n warnings.push(`Skipping non-JSON oEmbed endpoint: ${link.href}.`);\n return;\n }\n\n try {\n const page = await fetchPage(link.href, {\n ...options,\n headers: {\n \"accept\": \"application/json,*/*;q=0.8\",\n ...headersToObject(options.headers)\n }\n });\n data.push(JSON.parse(page.html) as OEmbedData);\n } catch (error) {\n warnings.push(`Could not fetch oEmbed endpoint ${link.href}: ${error instanceof Error ? error.message : String(error)}`);\n }\n })\n );\n\n return { data, warnings };\n}\n\nfunction headersToObject(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) {\n return {};\n }\n\n return Object.fromEntries(new Headers(headers).entries());\n}\n","import type { CheerioAPI } from \"cheerio\";\nimport type { MediaAsset, OpenGraphMetadata } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace, parseInteger, setMapValue } from \"../utils/html.js\";\n\nexport function extractOpenGraph(html: string): OpenGraphMetadata {\n const $ = loadDocument(html);\n const raw: Record<string, string | string[]> = {};\n\n $(\"meta[property], meta[name]\").each((_, element) => {\n const key = readMetaKey($, element);\n const content = normalizeWhitespace($(element).attr(\"content\"));\n\n if (!key || !content || (!key.startsWith(\"og:\") && !key.startsWith(\"article:\") && !key.startsWith(\"product:\"))) {\n return;\n }\n\n setMapValue(raw, key, content);\n });\n\n return {\n title: firstRaw(raw, \"og:title\"),\n description: firstRaw(raw, \"og:description\"),\n type: firstRaw(raw, \"og:type\"),\n url: firstRaw(raw, \"og:url\"),\n siteName: firstRaw(raw, \"og:site_name\"),\n locale: firstRaw(raw, \"og:locale\"),\n determiner: firstRaw(raw, \"og:determiner\"),\n images: collectStructuredMedia($, \"image\"),\n videos: collectStructuredMedia($, \"video\"),\n audio: collectStructuredMedia($, \"audio\"),\n article: {\n publishedTime: firstRaw(raw, \"article:published_time\"),\n modifiedTime: firstRaw(raw, \"article:modified_time\"),\n expirationTime: firstRaw(raw, \"article:expiration_time\"),\n section: firstRaw(raw, \"article:section\"),\n tags: allRaw(raw, \"article:tag\"),\n authors: allRaw(raw, \"article:author\")?.map((name) => ({ name }))\n },\n product: {\n price: firstRaw(raw, \"product:price:amount\"),\n currency: firstRaw(raw, \"product:price:currency\"),\n availability: firstRaw(raw, \"product:availability\"),\n condition: firstRaw(raw, \"product:condition\")\n },\n raw\n };\n}\n\nfunction collectStructuredMedia($: CheerioAPI, kind: \"image\" | \"video\" | \"audio\"): MediaAsset[] {\n const assets: MediaAsset[] = [];\n const prefix = `og:${kind}`;\n\n $(\"meta[property], meta[name]\").each((_, element) => {\n const key = readMetaKey($, element);\n const content = normalizeWhitespace($(element).attr(\"content\"));\n\n if (!key?.startsWith(prefix) || !content) {\n return;\n }\n\n const current = assets.at(-1);\n\n if (key === prefix || key === `${prefix}:url`) {\n if (key.endsWith(\":url\") && current && !current.url) {\n current.url = content;\n return;\n }\n\n assets.push({\n url: content,\n kind,\n source: \"openGraph\"\n });\n return;\n }\n\n const target = current ?? pushEmptyAsset(assets, kind);\n const property = key.slice(prefix.length + 1);\n\n if (property === \"secure_url\") {\n target.secureUrl = content;\n } else if (property === \"type\") {\n target.type = content;\n } else if (property === \"width\") {\n target.width = parseInteger(content);\n } else if (property === \"height\") {\n target.height = parseInteger(content);\n } else if (property === \"alt\") {\n target.alt = content;\n }\n });\n\n return assets.filter((asset) => Boolean(asset.url));\n}\n\nfunction pushEmptyAsset(assets: MediaAsset[], kind: \"image\" | \"video\" | \"audio\"): MediaAsset {\n const asset: MediaAsset = {\n url: \"\",\n kind,\n source: \"openGraph\"\n };\n assets.push(asset);\n return asset;\n}\n\nfunction readMetaKey($: CheerioAPI, element: any): string | undefined {\n return normalizeWhitespace($(element).attr(\"property\")) ?? normalizeWhitespace($(element).attr(\"name\"));\n}\n\nfunction firstRaw(raw: Record<string, string | string[]>, key: string): string | undefined {\n const value = raw[key];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction allRaw(raw: Record<string, string | string[]>, key: string): string[] | undefined {\n const value = raw[key];\n if (!value) {\n return undefined;\n }\n\n return Array.isArray(value) ? value : [value];\n}\n","import type { CheerioAPI } from \"cheerio\";\nimport type { MediaAsset, TwitterMetadata } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace, parseInteger, setMapValue } from \"../utils/html.js\";\n\nexport function extractTwitterCards(html: string): TwitterMetadata {\n const $ = loadDocument(html);\n const raw: Record<string, string | string[]> = {};\n\n $(\"meta[name], meta[property]\").each((_, element) => {\n const key = readMetaKey($, element);\n const content = normalizeWhitespace($(element).attr(\"content\"));\n\n if (!key?.startsWith(\"twitter:\") || !content) {\n return;\n }\n\n setMapValue(raw, key, content);\n });\n\n return {\n card: firstRaw(raw, \"twitter:card\"),\n site: firstRaw(raw, \"twitter:site\"),\n creator: firstRaw(raw, \"twitter:creator\"),\n title: firstRaw(raw, \"twitter:title\"),\n description: firstRaw(raw, \"twitter:description\"),\n images: collectImages(raw),\n videos: collectVideos(raw),\n raw\n };\n}\n\nfunction collectImages(raw: Record<string, string | string[]>): MediaAsset[] {\n const urls = uniqueStrings([\n ...allRaw(raw, \"twitter:image\"),\n ...allRaw(raw, \"twitter:image:src\"),\n ...allRaw(raw, \"twitter:images\"),\n ...allRaw(raw, \"twitter:image0\"),\n ...allRaw(raw, \"twitter:image1\"),\n ...allRaw(raw, \"twitter:image2\"),\n ...allRaw(raw, \"twitter:image3\"),\n ...allRaw(raw, \"twitter:player:image\"),\n ...Object.entries(raw)\n .filter(([key]) => /^twitter:image(?::\\d+)?$/i.test(key) || /^twitter:image:\\d+$/i.test(key))\n .flatMap(([, value]) => (Array.isArray(value) ? value : [value]))\n ]);\n const alt = firstRaw(raw, \"twitter:image:alt\");\n const width = parseInteger(firstRaw(raw, \"twitter:image:width\"));\n const height = parseInteger(firstRaw(raw, \"twitter:image:height\"));\n\n return urls.map((url) => ({\n url,\n kind: \"image\",\n source: \"twitter\",\n alt,\n width,\n height\n }));\n}\n\nfunction collectVideos(raw: Record<string, string | string[]>): MediaAsset[] {\n const players = allRaw(raw, \"twitter:player\") ?? allRaw(raw, \"twitter:player:stream\") ?? [];\n const width = parseInteger(firstRaw(raw, \"twitter:player:width\"));\n const height = parseInteger(firstRaw(raw, \"twitter:player:height\"));\n\n return players.map((url) => ({\n url,\n kind: \"video\",\n source: \"twitter\",\n width,\n height\n }));\n}\n\nfunction readMetaKey($: CheerioAPI, element: any): string | undefined {\n return normalizeWhitespace($(element).attr(\"name\")) ?? normalizeWhitespace($(element).attr(\"property\"));\n}\n\nfunction firstRaw(raw: Record<string, string | string[]>, key: string): string | undefined {\n const value = raw[key];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction allRaw(raw: Record<string, string | string[]>, key: string): string[] {\n const value = raw[key];\n if (!value) {\n return [];\n }\n\n return Array.isArray(value) ? value : [value];\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values.filter(Boolean))];\n}\n","import type { ImageScorer, MediaAsset } from \"../types/index.js\";\n\nexport interface ImageSelection {\n best?: MediaAsset;\n images: MediaAsset[];\n reason?: string;\n}\n\nconst SOURCE_WEIGHT: Record<string, number> = {\n adapter: 98,\n openGraph: 94,\n oEmbed: 88,\n jsonLd: 82,\n twitter: 86,\n nextData: 76,\n nuxt: 74,\n initialState: 73,\n preloadedState: 73,\n apollo: 72,\n applicationJson: 70,\n jsonScript: 66,\n html: 42,\n fallback: 36,\n favicon: 8\n};\n\nexport function scoreImages(images: MediaAsset[], customScorers: ImageScorer[] = []): MediaAsset[] {\n const duplicateCounts = countDuplicates(images);\n\n return images\n .map((image, index) => {\n const scored = scoreImageWithDetails(image, index, images, duplicateCounts);\n const customScore = customScorers.reduce((total, scorer) => total + scorer(image, { index, images }), 0);\n const score = clamp(scored.score + customScore, 0, 100);\n const reasons = customScore === 0 ? scored.reasons : [...scored.reasons, `custom scorers adjusted score by ${formatSigned(customScore)}`];\n\n return {\n ...image,\n score,\n confidence: Number((score / 100).toFixed(2)),\n metadata: {\n ...image.metadata,\n scoreReasons: reasons\n }\n };\n })\n .sort(\n (left, right) =>\n (right.score ?? 0) - (left.score ?? 0) ||\n sourceSortWeight(right) - sourceSortWeight(left) ||\n imageArea(right) - imageArea(left)\n );\n}\n\nexport function selectBestImage(images: MediaAsset[], customScorers: ImageScorer[] = []): ImageSelection {\n const scored = scoreImages(images, customScorers);\n const best = scored[0];\n\n return {\n best,\n images: scored,\n reason: best ? explainImageChoice(best) : undefined\n };\n}\n\nfunction scoreImageWithDetails(image: MediaAsset, index: number, images: MediaAsset[], duplicateCounts: Map<string, number>): { score: number; reasons: string[] } {\n let score = SOURCE_WEIGHT[image.source] ?? 50;\n const reasons = [`source ${sourceLabel(image.source)} added ${score} base points`];\n const dimensions = scoreDimensions(image);\n const format = scoreFormat(image);\n const urlSignal = scoreUrlSignal(image);\n const urlPenalty = scoreUrlPenalty(image);\n const duplicatePenalty = scoreDuplicatePenalty(image, duplicateCounts);\n\n score += dimensions.score;\n score += format.score;\n score += urlSignal.score;\n score -= urlPenalty;\n score -= duplicatePenalty.score;\n score -= Math.min(index * 1.5, 10);\n reasons.push(...dimensions.reasons, ...format.reasons, ...urlSignal.reasons, ...duplicatePenalty.reasons);\n\n if (images.length === 1) {\n score += 4;\n reasons.push(\"only candidate image added 4 points\");\n }\n\n if (urlPenalty > 0) {\n reasons.push(`URL penalties subtracted ${urlPenalty} points`);\n }\n\n const positionPenalty = Math.min(index * 1.5, 10);\n if (positionPenalty > 0) {\n reasons.push(`candidate position subtracted ${formatNumber(positionPenalty)} points`);\n }\n\n return { score, reasons };\n}\n\nfunction scoreDimensions(image: MediaAsset): { score: number; reasons: string[] } {\n const width = image.width;\n const height = image.height;\n\n if (!width || !height) {\n return { score: 0, reasons: [\"dimensions are unknown\"] };\n }\n\n const area = width * height;\n const ratio = width / height;\n let score = 0;\n const reasons: string[] = [];\n\n if (width < 120 || height < 90) {\n score -= 35;\n reasons.push(`${width}x${height} is below preview minimum and subtracted 35 points`);\n } else if (area >= 1_000_000) {\n score += 12;\n reasons.push(`${width}x${height} dimensions added 12 points`);\n } else if (area >= 300_000) {\n score += 9;\n reasons.push(`${width}x${height} dimensions added 9 points`);\n } else if (area >= 90_000) {\n score += 5;\n reasons.push(`${width}x${height} dimensions added 5 points`);\n } else if (area < 10_000) {\n score -= 20;\n reasons.push(`${width}x${height} dimensions subtracted 20 points`);\n }\n\n if (isNear(ratio, 1.91, 0.18)) {\n score += 12;\n reasons.push(`aspect ratio ${ratio.toFixed(2)} matched social preview ratio`);\n } else if (isNear(ratio, 16 / 9, 0.2) || isNear(ratio, 1, 0.2)) {\n score += 8;\n reasons.push(`aspect ratio ${ratio.toFixed(2)} matched a common preview ratio`);\n } else if (ratio > 4 || ratio < 0.25) {\n score -= 16;\n reasons.push(`aspect ratio ${ratio.toFixed(2)} is unlikely to preview well`);\n }\n\n return { score, reasons };\n}\n\nfunction scoreFormat(image: MediaAsset): { score: number; reasons: string[] } {\n const type = image.type?.toLowerCase() ?? \"\";\n const url = image.url.toLowerCase();\n\n if (type.includes(\"webp\") || url.endsWith(\".webp\")) {\n return { score: 4, reasons: [\"modern WebP format added 4 points\"] };\n }\n\n if (type.includes(\"avif\") || /\\.(avif)(\\?|$)/.test(url)) {\n return { score: 4, reasons: [\"modern AVIF format added 4 points\"] };\n }\n\n if (type.includes(\"jpeg\") || type.includes(\"jpg\") || /\\.(jpe?g)(\\?|$)/.test(url)) {\n return { score: 3, reasons: [\"JPEG format added 3 points\"] };\n }\n\n if (type.includes(\"png\") || /\\.(png)(\\?|$)/.test(url)) {\n return { score: 2, reasons: [\"PNG format added 2 points\"] };\n }\n\n if (/\\.(gif|svg|ico)(\\?|$)/.test(url)) {\n return { score: -8, reasons: [\"GIF/SVG/ICO formats are weaker preview candidates\"] };\n }\n\n return { score: 0, reasons: [] };\n}\n\nfunction scoreUrlSignal(image: MediaAsset): { score: number; reasons: string[] } {\n const url = image.url.toLowerCase();\n const matches = url.match(/cover|preview|thumbnail|thumb|og|card|media|hero|share|social|maxres|highres|large|original/g) ?? [];\n\n const platformScore = platformThumbnailScore(url);\n if (matches.length === 0 && platformScore.score === 0) {\n return { score: 0, reasons: [] };\n }\n\n const uniqueMatches = [...new Set(matches)];\n const score = Math.min(uniqueMatches.length * 4, 14) + platformScore.score;\n const reasons = uniqueMatches.length > 0 ? [`URL matched preview hints (${uniqueMatches.join(\", \")}) and added ${Math.min(uniqueMatches.length * 4, 14)} points`] : [];\n reasons.push(...platformScore.reasons);\n\n return {\n score,\n reasons\n };\n}\n\nfunction platformThumbnailScore(url: string): { score: number; reasons: string[] } {\n if (/ytimg\\.com\\/vi\\/[^/]+\\/(?:maxresdefault|sddefault|hqdefault)/i.test(url)) {\n return { score: 12, reasons: [\"YouTube platform thumbnail added 12 points\"] };\n }\n\n if (/(?:i|preview|external-preview)\\.redd\\.it|v\\.redd\\.it/i.test(url)) {\n return { score: 10, reasons: [\"Reddit media host added 10 points\"] };\n }\n\n if (/pbs\\.twimg\\.com\\/media|pinimg\\.com|cdninstagram\\.com|fbcdn\\.net|tiktokcdn\\.com|mir-s3-cdn-cf\\.behance\\.net/i.test(url)) {\n return { score: 8, reasons: [\"social platform media host added 8 points\"] };\n }\n\n return { score: 0, reasons: [] };\n}\n\nfunction scoreUrlPenalty(image: MediaAsset): number {\n const url = image.url.toLowerCase();\n let penalty = 0;\n\n if (/favicon|apple-touch-icon|sprite|icon-|\\/icon|placeholder|blank|spacer|pixel|tracking|emoji/.test(url)) {\n penalty += 30;\n }\n\n if (/logo|avatar|profile|headshot|badge/.test(url)) {\n penalty += 22;\n }\n\n if (image.alt && /logo|avatar|icon|emoji/i.test(image.alt)) {\n penalty += 14;\n }\n\n if (image.kind === \"favicon\") {\n penalty += 35;\n }\n\n return penalty;\n}\n\nfunction scoreDuplicatePenalty(image: MediaAsset, duplicateCounts: Map<string, number>): { score: number; reasons: string[] } {\n const count = duplicateCounts.get(mediaSignature(image.url)) ?? 0;\n if (count <= 1) {\n return { score: 0, reasons: [] };\n }\n\n const penalty = Math.min((count - 1) * 4, 12);\n return {\n score: penalty,\n reasons: [`duplicate-like URL group subtracted ${penalty} points`]\n };\n}\n\nfunction explainImageChoice(image: MediaAsset): string {\n const dimensions = image.width && image.height ? `${image.width}x${image.height}` : \"unknown dimensions\";\n const reasons = Array.isArray(image.metadata?.scoreReasons) ? image.metadata.scoreReasons.slice(0, 4).join(\"; \") : \"\";\n const reasonSuffix = reasons ? ` Reasons: ${reasons}.` : \"\";\n\n return `Selected because it came from ${sourceLabel(image.source)}, has ${dimensions}, and scored ${Math.round(image.score ?? 0)}.${reasonSuffix}`;\n}\n\nfunction isNear(value: number, target: number, tolerance: number): boolean {\n return Math.abs(value - target) <= tolerance;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction sourceLabel(source: string): string {\n if (source === \"openGraph\") {\n return \"og:image\";\n }\n\n if (source === \"twitter\") {\n return \"Twitter Card metadata\";\n }\n\n if (source === \"jsonLd\") {\n return \"JSON-LD\";\n }\n\n if (source === \"oEmbed\") {\n return \"oEmbed\";\n }\n\n if ([\"nextData\", \"nuxt\", \"initialState\", \"preloadedState\", \"apollo\", \"applicationJson\", \"jsonScript\"].includes(source)) {\n return \"embedded application data\";\n }\n\n return source;\n}\n\nfunction formatSigned(value: number): string {\n return value >= 0 ? `+${formatNumber(value)}` : formatNumber(value);\n}\n\nfunction formatNumber(value: number): string {\n return Number.isInteger(value) ? String(value) : value.toFixed(1);\n}\n\nfunction countDuplicates(images: MediaAsset[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const image of images) {\n const key = mediaSignature(image.url);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction imageArea(image: MediaAsset): number {\n return (image.width ?? 0) * (image.height ?? 0);\n}\n\nfunction sourceSortWeight(image: MediaAsset): number {\n return SOURCE_WEIGHT[image.source] ?? 50;\n}\n\nfunction mediaSignature(url: string): string {\n try {\n const parsed = new URL(url);\n return `${parsed.hostname.toLowerCase()}${parsed.pathname\n .replace(/[-_](?:\\d{2,5}x\\d{2,5}|\\d{2,5}w|small|medium|large|thumb|thumbnail)(?=\\.)/i, \"\")\n .toLowerCase()}`;\n } catch {\n return url.toLowerCase();\n }\n}\n","import type { EmbeddedDataItem, JsonLdNode, MediaAsset, RawMetadataSources } from \"../types/index.js\";\nimport { parseNumber, parseSrcset, uniqueMediaByUrl } from \"../utils/html.js\";\nimport { tryResolveUrl } from \"../utils/url.js\";\n\nexport interface MediaDiscoveryResult {\n images: MediaAsset[];\n videos: MediaAsset[];\n audio: MediaAsset[];\n trace: string[];\n}\n\nconst IMAGE_KEYS = [\n \"image\",\n \"images\",\n \"thumbnail\",\n \"thumbnailUrl\",\n \"thumbnail_url\",\n \"thumbnailSrc\",\n \"thumbnail_src\",\n \"previewImage\",\n \"preview_image\",\n \"preview\",\n \"ogImage\",\n \"og_image\",\n \"cardImage\",\n \"displayUrl\",\n \"display_url\",\n \"mediaUrl\",\n \"media_url\",\n \"media_url_https\",\n \"fullPicture\",\n \"full_picture\",\n \"cover\",\n \"coverImage\",\n \"cover_image\",\n \"original\",\n \"source\",\n \"poster\",\n \"posterImage\",\n \"media\"\n];\n\nconst VIDEO_KEYS = [\n \"video\",\n \"videos\",\n \"videoUrl\",\n \"video_url\",\n \"contentUrl\",\n \"content_url\",\n \"embedUrl\",\n \"embed_url\",\n \"playbackUrl\",\n \"playback_url\",\n \"fallback_url\",\n \"hls_url\",\n \"dash_url\",\n \"media\"\n];\nconst AUDIO_KEYS = [\"audio\", \"audios\", \"audioUrl\", \"audio_url\", \"podcastUrl\"];\n\nexport function discoverMedia(rawSources: RawMetadataSources, finalUrl: string): MediaDiscoveryResult {\n const trace: string[] = [];\n const externalResults = [...rawSources.plugins, ...rawSources.adapters];\n const images = normalizeAssets(\n [\n ...externalResults.flatMap((result) => result.images ?? []),\n ...rawSources.openGraph.images,\n ...rawSources.twitter.images,\n ...jsonLdImages(rawSources.jsonLd.nodes),\n ...embeddedImages(rawSources.embeddedData.items),\n ...(rawSources.html.imageSrc ? [rawSources.html.imageSrc] : []),\n ...rawSources.images,\n ...oEmbedImages(rawSources)\n ],\n finalUrl\n );\n const videos = normalizeAssets(\n [\n ...externalResults.flatMap((result) => result.videos ?? []),\n ...rawSources.openGraph.videos,\n ...rawSources.twitter.videos,\n ...jsonLdVideos(rawSources.jsonLd.nodes),\n ...embeddedVideos(rawSources.embeddedData.items),\n ...rawSources.videos\n ],\n finalUrl\n );\n const audio = normalizeAssets(\n [\n ...externalResults.flatMap((result) => result.audio ?? []),\n ...rawSources.openGraph.audio,\n ...jsonLdAudio(rawSources.jsonLd.nodes),\n ...embeddedAudio(rawSources.embeddedData.items),\n ...rawSources.audio\n ],\n finalUrl\n );\n\n if (rawSources.openGraph.images.length > 0) {\n trace.push(\"media discovery collected og:image candidates\");\n }\n if (rawSources.twitter.images.length > 0) {\n trace.push(\"media discovery collected twitter:image candidates\");\n }\n if (rawSources.jsonLd.nodes.length > 0) {\n trace.push(\"media discovery scanned JSON-LD media\");\n }\n if (rawSources.embeddedData.items.length > 0) {\n trace.push(\"media discovery scanned embedded application data\");\n }\n if (rawSources.images.length > 0) {\n trace.push(\"media discovery scanned HTML images, srcset, lazy images, posters, and fallbacks\");\n }\n if (externalResults.some((result) => (result.images?.length ?? 0) > 0 || (result.videos?.length ?? 0) > 0)) {\n trace.push(\"media discovery included adapter and plugin media\");\n }\n\n return {\n images: dedupeMediaBySignature(uniqueMediaByUrl(images)),\n videos: dedupeMediaBySignature(uniqueMediaByUrl(videos)),\n audio: dedupeMediaBySignature(uniqueMediaByUrl(audio)),\n trace\n };\n}\n\nfunction normalizeAssets(assets: MediaAsset[], baseUrl: string): MediaAsset[] {\n return assets\n .map((asset) => {\n const secureUrl = tryResolveUrl(asset.secureUrl, baseUrl);\n const url = tryResolveUrl(secureUrl ?? asset.url, baseUrl);\n const poster = tryResolveUrl(asset.poster, baseUrl);\n\n if (!url || shouldIgnoreMediaUrl(url)) {\n return undefined;\n }\n\n return stripUndefined({\n ...asset,\n url,\n secureUrl,\n poster\n }) as MediaAsset;\n })\n .filter((asset): asset is MediaAsset => Boolean(asset));\n}\n\nfunction jsonLdImages(nodes: JsonLdNode[]): MediaAsset[] {\n return nodes.flatMap((node) => [\n ...mediaFromJsonValue(node.image, \"image\", \"jsonLd\"),\n ...mediaFromJsonValue(node.thumbnailUrl, \"image\", \"jsonLd\"),\n ...mediaFromJsonValue(node.thumbnail, \"image\", \"jsonLd\"),\n ...mediaFromJsonValue(node.logo, \"image\", \"jsonLd\")\n ]);\n}\n\nfunction jsonLdVideos(nodes: JsonLdNode[]): MediaAsset[] {\n return nodes.flatMap((node) => [\n ...mediaFromJsonValue(node.contentUrl, \"video\", \"jsonLd\"),\n ...mediaFromJsonValue(node.embedUrl, \"video\", \"jsonLd\"),\n ...mediaFromJsonValue(node.video, \"video\", \"jsonLd\")\n ]);\n}\n\nfunction jsonLdAudio(nodes: JsonLdNode[]): MediaAsset[] {\n return nodes.flatMap((node) => [\n ...mediaFromJsonValue(node.contentUrl, \"audio\", \"jsonLd\"),\n ...mediaFromJsonValue(node.encoding, \"audio\", \"jsonLd\")\n ]);\n}\n\nfunction embeddedImages(items: EmbeddedDataItem[]): MediaAsset[] {\n return items.flatMap((item) => mediaFromEmbeddedItem(item, IMAGE_KEYS, \"image\"));\n}\n\nfunction embeddedVideos(items: EmbeddedDataItem[]): MediaAsset[] {\n return items.flatMap((item) => mediaFromEmbeddedItem(item, VIDEO_KEYS, \"video\"));\n}\n\nfunction embeddedAudio(items: EmbeddedDataItem[]): MediaAsset[] {\n return items.flatMap((item) => mediaFromEmbeddedItem(item, AUDIO_KEYS, \"audio\"));\n}\n\nfunction mediaFromEmbeddedItem(item: EmbeddedDataItem, keys: string[], kind: MediaAsset[\"kind\"]): MediaAsset[] {\n const assets: MediaAsset[] = [];\n walkEmbeddedData(item.data, (value, key, parent) => {\n if (!key || !keys.some((candidate) => candidate.toLowerCase() === key.toLowerCase())) {\n if (typeof value === \"string\" && looksLikeMediaUrl(value, kind) && key && keys.some((candidate) => key.toLowerCase().includes(candidate.toLowerCase()))) {\n assets.push(assetFromEmbedded(value, kind, item, parent));\n }\n return;\n }\n\n assets.push(...mediaFromJsonValue(value, kind, item.source));\n });\n\n return assets;\n}\n\nfunction mediaFromJsonValue(value: unknown, kind: MediaAsset[\"kind\"], source: string): MediaAsset[] {\n if (!value) {\n return [];\n }\n\n if (typeof value === \"string\") {\n return looksLikeMediaUrl(value, kind) ? [{ url: value, kind, source }] : [];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => mediaFromJsonValue(item, kind, source));\n }\n\n if (isRecord(value)) {\n const srcset = stringFromUnknown(value.srcset) ?? stringFromUnknown(value.srcSet);\n const srcsetAssets = parseSrcset(srcset).flatMap((url) => mediaFromJsonValue(url, kind, source));\n const url = mediaUrlFromRecord(value, kind);\n const nestedDetails = nestedMediaDetailsRecord(value, kind);\n if (!url || !looksLikeMediaUrl(url, kind)) {\n return srcsetAssets;\n }\n\n return [\n {\n url,\n kind,\n source,\n width: parseNumber(stringFromUnknown(value.width)) ?? parseNumber(stringFromUnknown(nestedDetails?.width)),\n height: parseNumber(stringFromUnknown(value.height)) ?? parseNumber(stringFromUnknown(nestedDetails?.height)),\n alt: stringFromUnknown(value.alt) ?? stringFromUnknown(value.caption) ?? stringFromUnknown(value.name) ?? stringFromUnknown(nestedDetails?.alt),\n title: stringFromUnknown(value.title) ?? stringFromUnknown(nestedDetails?.title),\n type: stringFromUnknown(value.type) ?? stringFromUnknown(value.mimeType) ?? stringFromUnknown(value.encodingFormat) ?? stringFromUnknown(nestedDetails?.type)\n },\n ...srcsetAssets\n ];\n }\n\n return [];\n}\n\nfunction nestedMediaDetailsRecord(value: JsonLdNode, kind: MediaAsset[\"kind\"]): JsonLdNode | undefined {\n const candidates = [\n value.source,\n value.original,\n value.image,\n value.thumbnail,\n value.thumbnailUrl,\n value.thumbnail_url,\n value.previewImage,\n value.preview_image,\n value.video,\n value.reddit_video\n ];\n\n return candidates.find((candidate): candidate is JsonLdNode => isRecord(candidate) && Boolean(mediaUrlFromRecord(candidate, kind)));\n}\n\nfunction mediaUrlFromRecord(value: JsonLdNode, kind: MediaAsset[\"kind\"]): string | undefined {\n const commonCandidates = [\n value.url,\n value.src,\n value.secure_url,\n value.secureUrl,\n value.contentUrl,\n value.content_url,\n value.embedUrl,\n value.embed_url,\n value.thumbnailUrl,\n value.thumbnail_url,\n value.thumbnailSrc,\n value.thumbnail_src,\n value.mediaUrl,\n value.media_url,\n value.media_url_https,\n value.displayUrl,\n value.display_url,\n value.fullPicture,\n value.full_picture,\n value.previewImage,\n value.preview_image,\n value.poster,\n value.posterUrl,\n value.poster_url,\n value.coverImage,\n value.cover_image,\n value.original,\n value.source\n ];\n\n const videoCandidates = [\n value.videoUrl,\n value.video_url,\n value.playbackUrl,\n value.playback_url,\n value.fallback_url,\n value.hls_url,\n value.dash_url\n ];\n\n const candidates = kind === \"video\" ? [...videoCandidates, ...commonCandidates] : commonCandidates;\n return candidates.map(stringFromUnknown).find((candidate) => candidate && looksLikeMediaUrl(candidate, kind));\n}\n\nfunction assetFromEmbedded(value: string, kind: MediaAsset[\"kind\"], item: EmbeddedDataItem, parent: JsonLdNode | undefined): MediaAsset {\n return {\n url: value,\n kind,\n source: item.source,\n width: parseNumber(stringFromUnknown(parent?.width)),\n height: parseNumber(stringFromUnknown(parent?.height)),\n alt: stringFromUnknown(parent?.alt) ?? stringFromUnknown(parent?.caption),\n title: stringFromUnknown(parent?.title),\n metadata: {\n embeddedPath: item.path\n }\n };\n}\n\nfunction oEmbedImages(rawSources: RawMetadataSources): MediaAsset[] {\n return rawSources.oEmbed.data.flatMap((data) => {\n const images: MediaAsset[] = [];\n if (data.thumbnail_url) {\n images.push({\n url: data.thumbnail_url,\n kind: \"image\",\n source: \"oEmbed\",\n width: data.thumbnail_width,\n height: data.thumbnail_height\n });\n }\n\n if (data.type === \"photo\" && data.url) {\n images.push({\n url: data.url,\n kind: \"image\",\n source: \"oEmbed\",\n width: data.width,\n height: data.height\n });\n }\n\n return images;\n });\n}\n\nfunction dedupeMediaBySignature(assets: MediaAsset[]): MediaAsset[] {\n const seen = new Map<string, MediaAsset>();\n\n for (const asset of assets) {\n const key = mediaSignature(asset.url);\n const current = seen.get(key);\n if (!current || sourceRank(asset.source) > sourceRank(current.source)) {\n seen.set(key, asset);\n }\n }\n\n return [...seen.values()];\n}\n\nfunction mediaSignature(url: string): string {\n try {\n const parsed = new URL(url);\n const pathname = parsed.pathname\n .replace(/[-_](?:\\d{2,5}x\\d{2,5}|\\d{2,5}w|small|medium|large|thumb|thumbnail)(?=\\.)/i, \"\")\n .toLowerCase();\n\n return `${parsed.hostname.toLowerCase()}${pathname}`;\n } catch {\n return url.toLowerCase();\n }\n}\n\nfunction sourceRank(source: string): number {\n const ranks: Record<string, number> = {\n adapter: 90,\n openGraph: 80,\n twitter: 75,\n jsonLd: 70,\n oEmbed: 65,\n nextData: 64,\n nuxt: 62,\n initialState: 61,\n preloadedState: 60,\n apollo: 59,\n applicationJson: 58,\n jsonScript: 55,\n html: 40,\n fallback: 30\n };\n\n return ranks[source] ?? 50;\n}\n\nfunction shouldIgnoreMediaUrl(url: string): boolean {\n const normalized = url.toLowerCase();\n return (\n normalized.startsWith(\"data:\") ||\n normalized.startsWith(\"blob:\") ||\n normalized.startsWith(\"javascript:\") ||\n /(?:sprite|spacer|blank|transparent|placeholder|tracking|beacon|pixel|emoji|favicon|apple-touch-icon)(?:[._/-]|$|\\?)/i.test(normalized) ||\n /(?:^|[/?_-])1x1(?:[._/-]|$|\\?)/i.test(normalized)\n );\n}\n\nfunction looksLikeMediaUrl(value: string, kind: MediaAsset[\"kind\"]): boolean {\n if (shouldIgnoreMediaUrl(value)) {\n return false;\n }\n\n if (/^https?:\\/\\//i.test(value) || value.startsWith(\"/\") || value.startsWith(\"./\") || value.startsWith(\"../\")) {\n if (kind === \"image\") {\n return (\n /\\.(?:avif|webp|png|jpe?g|gif)(?:[?#].*)?$/i.test(value) ||\n /(?:image|thumb|thumbnail|cover|poster|preview|media|og|card|photo|format=(?:jpg|jpeg|png|webp))/i.test(value) ||\n /(?:ytimg\\.com|i\\.redd\\.it|preview\\.redd\\.it|external-preview\\.redd\\.it|pbs\\.twimg\\.com|pinimg\\.com|cdninstagram\\.com|fbcdn\\.net|tiktokcdn\\.com|behance\\.net)/i.test(value)\n );\n }\n\n if (kind === \"video\") {\n return /\\.(?:mp4|webm|m3u8|mov)(?:[?#].*)?$/i.test(value) || /(?:video|embed|player|watch|reel|shorts|v\\.redd\\.it)/i.test(value);\n }\n\n if (kind === \"audio\") {\n return /\\.(?:mp3|m4a|wav|ogg|aac)(?:[?#].*)?$/i.test(value) || /(?:audio|podcast)/i.test(value);\n }\n }\n\n return false;\n}\n\nfunction walkEmbeddedData(value: unknown, visit: (value: unknown, key: string | undefined, parent: JsonLdNode | undefined) => void, key?: string, parent?: JsonLdNode, depth = 0): void {\n if (depth > 8) {\n return;\n }\n\n visit(value, key, parent);\n\n if (Array.isArray(value)) {\n for (const item of value.slice(0, 250)) {\n walkEmbeddedData(item, visit, undefined, parent, depth + 1);\n }\n return;\n }\n\n if (isRecord(value)) {\n for (const [childKey, childValue] of Object.entries(value).slice(0, 500)) {\n walkEmbeddedData(childValue, visit, childKey, value, depth + 1);\n }\n }\n}\n\nfunction stripUndefined<T extends object>(value: T): Partial<T> {\n return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined && item !== null && (!Array.isArray(item) || item.length > 0))) as Partial<T>;\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n\n if (isRecord(value)) {\n return stringFromUnknown(value.url) ?? stringFromUnknown(value.src) ?? stringFromUnknown(value.name);\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is JsonLdNode {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { AdapterExtractionResult, ConfidenceBreakdown, Entity, MediaAsset, RawMetadataSources } from \"../types/index.js\";\n\nexport interface ConfidenceEngineInput {\n title?: string;\n description?: string;\n bestImage?: MediaAsset;\n canonicalUrl?: string;\n author?: Entity;\n hasStructuredData: boolean;\n rawSources: RawMetadataSources;\n sourcesUsed: string[];\n warnings: string[];\n}\n\nexport interface CompletenessInput {\n title?: string;\n description?: string;\n bestImage?: MediaAsset;\n canonicalUrl?: string;\n siteName?: string;\n author?: Entity;\n publisher?: Entity;\n type?: string;\n publishedTime?: string;\n mediaCount: number;\n}\n\nexport interface ReliabilityInput {\n confidence: number;\n completeness: number;\n adapterMatched: boolean;\n bestImage?: MediaAsset;\n warnings: string[];\n}\n\nexport function calculateConfidence(input: ConfidenceEngineInput): number {\n let score = 0;\n\n score += qualityPoints(input.title, 18, 6, 120);\n score += qualityPoints(input.description, 16, 24, 300);\n\n if (input.bestImage) {\n score += 18;\n score += Math.min(input.bestImage.score ?? 0, 100) * 0.12;\n score += sourceConfidenceBonus(input.bestImage.source);\n }\n\n if (input.canonicalUrl) {\n score += 10;\n }\n\n if (input.hasStructuredData) {\n score += 12;\n }\n\n if (adapterSucceeded(input.rawSources.adapters)) {\n score += 8;\n }\n\n if (input.sourcesUsed.includes(\"openGraph\")) {\n score += 6;\n }\n\n if (input.sourcesUsed.includes(\"twitter\")) {\n score += 4;\n }\n\n if (input.rawSources.embeddedData.items.length > 0) {\n score += 6;\n }\n\n score -= Math.min(input.warnings.length * 3, 18);\n\n return Math.round(clamp(score, 0, 100));\n}\n\nexport function calculateConfidenceBreakdown(input: ConfidenceEngineInput): ConfidenceBreakdown {\n const title = qualityPoints(input.title, 100, 6, 120);\n const description = qualityPoints(input.description, 100, 24, 300);\n const image = input.bestImage\n ? clamp(58 + Math.min(input.bestImage.score ?? 0, 100) * 0.27 + sourceConfidenceBonus(input.bestImage.source), 0, 100)\n : 0;\n const structuredData = input.hasStructuredData\n ? 100\n : input.rawSources.embeddedData.items.length > 0\n ? 55\n : 0;\n const adapter = adapterSucceeded(input.rawSources.adapters) ? adapterConfidence(input.rawSources.adapters[0]) : 0;\n\n return {\n title: Math.round(title),\n description: Math.round(description),\n image: Math.round(image),\n structuredData: Math.round(structuredData),\n adapter: Math.round(adapter)\n };\n}\n\nexport function calculateCompleteness(input: CompletenessInput): number {\n const weights = [\n input.title ? 20 : 0,\n input.description ? 16 : 0,\n input.bestImage ? 20 : 0,\n input.canonicalUrl ? 12 : 0,\n input.siteName ? 8 : 0,\n input.author ? 8 : 0,\n input.publisher ? 5 : 0,\n input.type && input.type !== \"unknown\" ? 6 : 0,\n input.publishedTime ? 3 : 0,\n input.mediaCount > 1 ? 2 : 0\n ];\n\n return Math.round(clamp(weights.reduce((total, value) => total + value, 0), 0, 100));\n}\n\nexport function calculateReliability(input: ReliabilityInput): number {\n let score = input.confidence * 0.45 + input.completeness * 0.3;\n\n if (input.adapterMatched) {\n score += 10;\n }\n\n if ((input.bestImage?.score ?? 0) >= 80) {\n score += 10;\n } else if (input.bestImage) {\n score += 5;\n }\n\n score -= Math.min(input.warnings.length * 4, 20);\n\n return Math.round(clamp(score, 0, 100));\n}\n\nfunction qualityPoints(value: string | undefined, maxPoints: number, idealMinLength: number, idealMaxLength: number): number {\n if (!value) {\n return 0;\n }\n\n const normalized = value.replace(/\\s+/g, \" \").trim();\n if (!normalized) {\n return 0;\n }\n\n let points = maxPoints;\n\n if (normalized.length < idealMinLength) {\n points *= normalized.length / idealMinLength;\n }\n\n if (normalized.length > idealMaxLength) {\n points *= Math.max(0.4, idealMaxLength / normalized.length);\n }\n\n if (/^(home|untitled|index|login|sign in)$/i.test(normalized)) {\n points *= 0.35;\n }\n\n return points;\n}\n\nfunction sourceConfidenceBonus(source: string): number {\n if (source === \"adapter\") {\n return 8;\n }\n\n if (source === \"openGraph\" || source === \"twitter\") {\n return 7;\n }\n\n if (source === \"jsonLd\" || source === \"oEmbed\") {\n return 6;\n }\n\n if ([\"nextData\", \"nuxt\", \"initialState\", \"preloadedState\", \"apollo\", \"applicationJson\"].includes(source)) {\n return 5;\n }\n\n if (source === \"html\") {\n return 3;\n }\n\n return 1;\n}\n\nfunction adapterSucceeded(adapters: AdapterExtractionResult[]): boolean {\n return adapters.some((adapter) => Boolean(adapter.title || adapter.description || adapter.images?.length || adapter.videos?.length));\n}\n\nfunction adapterConfidence(adapter: AdapterExtractionResult | undefined): number {\n if (!adapter) {\n return 0;\n }\n\n let score = 45;\n if (adapter.title) {\n score += 22;\n }\n if (adapter.description) {\n score += 14;\n }\n if ((adapter.images?.length ?? 0) > 0 || (adapter.videos?.length ?? 0) > 0) {\n score += 14;\n }\n if (adapter.author) {\n score += 6;\n }\n\n return clamp(score, 0, 100);\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","import type {\n AdapterExtractionResult,\n ApplicationMetadata,\n ArticleMetadata,\n ExtractionFallbackAttempt,\n Entity,\n ExtractionDiagnostics,\n ExtractionRetryInfo,\n ImageScorer,\n JsonLdNode,\n MediaAsset,\n MetadataType,\n ProductMetadata,\n RawMetadataSources,\n UnifiedMetadata\n} from \"../types/index.js\";\nimport { firstDefined, parseNumber } from \"../utils/html.js\";\nimport { tryResolveUrl } from \"../utils/url.js\";\nimport { selectBestImage } from \"../scorers/image.js\";\nimport { discoverMedia } from \"../media/index.js\";\nimport { calculateCompleteness, calculateConfidence, calculateConfidenceBreakdown, calculateReliability } from \"../engines/index.js\";\n\nexport interface NormalizeContext {\n url?: string;\n finalUrl?: string;\n diagnostics?: ExtractionDiagnostics;\n imageScorers?: ImageScorer[];\n includeRaw?: boolean;\n}\n\nexport function normalizeMetadata(rawSources: RawMetadataSources, context: NormalizeContext = {}): UnifiedMetadata {\n const finalUrl = context.finalUrl ?? context.url ?? \"\";\n const url = context.url ?? finalUrl;\n const externalResults = [...rawSources.plugins, ...rawSources.adapters];\n const jsonLdNodes = rawSources.jsonLd.nodes;\n const embeddedNodes = rawSources.embeddedData.items.map((item) => item.data);\n const articleNode = findJsonLdNode(jsonLdNodes, [\"Article\", \"NewsArticle\", \"BlogPosting\"]);\n const productNode = findJsonLdNode(jsonLdNodes, [\"Product\"]);\n const appNode = findJsonLdNode(jsonLdNodes, [\"SoftwareApplication\", \"MobileApplication\", \"WebApplication\"]);\n const organizationNode = findJsonLdNode(jsonLdNodes, [\"Organization\", \"NewsMediaOrganization\", \"WebSite\"]);\n const canonicalUrl = tryResolveUrl(\n firstDefined(\n firstResultValue(externalResults, (result) => result.canonicalUrl),\n rawSources.html.canonicalUrl,\n rawSources.openGraph.url,\n jsonString(jsonLdNodes, \"url\"),\n findStringByKeys(embeddedNodes, [\"canonicalUrl\", \"canonical\", \"permalink\", \"pageUrl\", \"shareUrl\"])\n ),\n finalUrl\n );\n\n const title = firstDefined(\n firstResultValue(externalResults, (result) => result.title),\n rawSources.openGraph.title,\n rawSources.twitter.title,\n jsonString([articleNode, productNode, appNode, organizationNode].filter(isJsonLdNode), \"headline\"),\n jsonString([articleNode, productNode, appNode, organizationNode].filter(isJsonLdNode), \"name\"),\n findStringByKeys(embeddedNodes, [\"title\", \"headline\", \"pageTitle\", \"ogTitle\", \"name\"]),\n rawSources.html.title\n );\n\n const description = firstDefined(\n firstResultValue(externalResults, (result) => result.description),\n rawSources.openGraph.description,\n rawSources.twitter.description,\n jsonString([articleNode, productNode, appNode, organizationNode].filter(isJsonLdNode), \"description\"),\n findStringByKeys(embeddedNodes, [\"description\", \"excerpt\", \"summary\", \"subtitle\", \"ogDescription\"]),\n rawSources.html.description\n );\n\n const siteName = firstDefined(\n firstResultValue(externalResults, (result) => result.siteName),\n rawSources.openGraph.siteName,\n jsonString([organizationNode].filter(isJsonLdNode), \"name\"),\n findStringByKeys(embeddedNodes, [\"siteName\", \"site_name\", \"appName\", \"applicationName\"]),\n domainName(finalUrl)\n );\n\n const mediaDiscovery = discoverMedia(rawSources, finalUrl);\n const images = mediaDiscovery.images;\n const videos = mediaDiscovery.videos;\n const audio = mediaDiscovery.audio;\n const favicons = normalizeAssets(rawSources.html.favicons, finalUrl);\n const selectedImage = selectBestImage(images, context.imageScorers);\n const article = mergeArticle(rawSources, externalResults, articleNode, embeddedNodes);\n const product = mergeProduct(rawSources, externalResults, productNode);\n const app = mergeApp(rawSources, externalResults, appNode);\n const video = mergeVideo(rawSources, externalResults, jsonLdNodes, embeddedNodes, videos);\n const playlist = mergePlaylist(externalResults);\n const type = inferType(rawSources, externalResults, jsonLdNodes, article, product, app, playlist, videos, audio);\n const author = firstResultValue(externalResults, (result) => result.author) ?? firstEntity(article?.authors) ?? entityFromEmbedded(embeddedNodes, [\"author\", \"creator\", \"owner\", \"user\"]);\n const publisher = article?.publisher ?? firstResultValue(externalResults, (result) => result.publisher) ?? entityFromJsonLd(organizationNode) ?? entityFromEmbedded(embeddedNodes, [\"publisher\", \"provider\", \"organization\"]);\n const publishDate = firstDefined(article?.publishedTime, video?.publishedTime);\n const sourcesUsed = detectSourcesUsed(rawSources);\n const warnings = diagnosticsWarnings(rawSources, externalResults, context.diagnostics);\n const fieldSources = {\n title: fieldSource(rawSources, externalResults, embeddedNodes, \"title\", selectedImage.best),\n description: fieldSource(rawSources, externalResults, embeddedNodes, \"description\", selectedImage.best),\n author: fieldSource(rawSources, externalResults, embeddedNodes, \"author\", selectedImage.best),\n image: fieldSource(rawSources, externalResults, embeddedNodes, \"image\", selectedImage.best)\n };\n const confidenceInput = {\n title,\n description,\n bestImage: selectedImage.best,\n canonicalUrl,\n hasStructuredData: jsonLdNodes.length > 0,\n rawSources,\n sourcesUsed,\n warnings\n };\n const confidence = calculateConfidence(confidenceInput);\n const confidenceBreakdown = calculateConfidenceBreakdown(confidenceInput);\n const completeness = calculateCompleteness({\n title,\n description,\n bestImage: selectedImage.best,\n canonicalUrl,\n siteName,\n author,\n publisher,\n type,\n publishedTime: publishDate,\n mediaCount: images.length + videos.length + audio.length\n });\n const reliability = calculateReliability({\n confidence,\n completeness,\n adapterMatched: rawSources.adapters.length > 0,\n bestImage: selectedImage.best,\n warnings\n });\n const diagnostics = context.diagnostics ?? {\n redirects: [],\n sourcesUsed: [],\n warnings: [],\n trace: [],\n extractedAt: new Date().toISOString()\n };\n\n diagnostics.sourcesUsed = uniqueStrings([...diagnostics.sourcesUsed, ...sourcesUsed]);\n diagnostics.warnings = uniqueStrings([...diagnostics.warnings, ...rawSources.jsonLd.warnings, ...externalResults.flatMap((result) => result.warnings ?? [])]);\n diagnostics.adapterUsed = diagnostics.adapterUsed ?? rawSources.adapters[0]?.source;\n diagnostics.extractionMethod = diagnostics.extractionMethod ?? adapterRawString(rawSources.adapters[0], \"extractionMethod\") ?? fieldSources.title;\n diagnostics.sourcePriority = uniqueStrings([\n ...(diagnostics.sourcePriority ?? []),\n ...(arrayOfStrings(rawSources.adapters[0]?.raw?.sourcePriority) ?? [])\n ]);\n diagnostics.fallbacksAttempted = mergeFallbackAttempts(\n diagnostics.fallbacksAttempted,\n fallbackAttemptsFromUnknown(rawSources.adapters[0]?.raw?.fallbacksAttempted)\n );\n diagnostics.retryInfo = diagnostics.retryInfo ?? retryInfoFromUnknown(rawSources.adapters[0]?.raw?.retryInfo);\n diagnostics.selectedImageReason = selectedImage.reason;\n diagnostics.confidenceBreakdown = confidenceBreakdown;\n diagnostics.originalUrl = diagnostics.originalUrl ?? url;\n diagnostics.finalUrl = diagnostics.finalUrl ?? finalUrl;\n diagnostics.canonicalUrl = canonicalUrl;\n diagnostics.adapter = adapterDiagnostics(rawSources.adapters);\n diagnostics.trace = uniqueStrings([\n ...diagnostics.trace,\n ...mediaDiscovery.trace,\n ...(selectedImage.best ? [`selected image from ${sourceLabel(selectedImage.best)}`] : [])\n ]);\n\n return stripUndefined({\n ok: true,\n url,\n finalUrl,\n type,\n title,\n description,\n publishDate,\n siteName,\n canonicalUrl,\n confidence,\n completeness,\n reliability,\n bestImage: selectedImage.best?.url,\n images: selectedImage.images,\n videos,\n audio,\n favicons,\n article,\n product,\n video,\n playlist,\n author,\n publisher,\n app,\n sources: fieldSources,\n raw: context.includeRaw ? rawSources : undefined,\n diagnostics,\n trace: diagnostics.trace\n }) as UnifiedMetadata;\n}\n\nfunction normalizeAssets(assets: MediaAsset[], baseUrl: string): MediaAsset[] {\n return assets\n .map((asset) => {\n const secureUrl = tryResolveUrl(asset.secureUrl, baseUrl);\n const url = tryResolveUrl(secureUrl ?? asset.url, baseUrl);\n const poster = tryResolveUrl(asset.poster, baseUrl);\n\n if (!url) {\n return undefined;\n }\n\n return stripUndefined({\n ...asset,\n url,\n secureUrl,\n poster\n }) as MediaAsset;\n })\n .filter((asset): asset is MediaAsset => Boolean(asset));\n}\n\nfunction mergeArticle(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n articleNode: JsonLdNode | undefined,\n embeddedNodes: JsonLdNode[]\n): ArticleMetadata | undefined {\n const embeddedAuthor = entityFromEmbedded(embeddedNodes, [\"author\", \"creator\", \"owner\", \"user\"]);\n const embeddedPublisher = entityFromEmbedded(embeddedNodes, [\"publisher\", \"provider\", \"organization\"]);\n const article: ArticleMetadata = {\n ...rawSources.openGraph.article,\n ...mergePartialObjects(externalResults.map((result) => result.article)),\n headline: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.headline),\n jsonString([articleNode].filter(isJsonLdNode), \"headline\"),\n findStringByKeys(embeddedNodes, [\"headline\", \"title\", \"postTitle\", \"pinTitle\", \"projectTitle\"]),\n rawSources.openGraph.article?.headline,\n rawSources.openGraph.title\n ),\n section: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.section),\n rawSources.openGraph.article?.section,\n jsonString([articleNode].filter(isJsonLdNode), \"articleSection\")\n ),\n publishedTime: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.publishedTime),\n rawSources.openGraph.article?.publishedTime,\n jsonString([articleNode].filter(isJsonLdNode), \"datePublished\"),\n findStringByKeys(embeddedNodes, [\"datePublished\", \"publishedTime\", \"published_at\", \"createdAt\", \"created_at\", \"timestamp\"])\n ),\n modifiedTime: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.modifiedTime),\n rawSources.openGraph.article?.modifiedTime,\n jsonString([articleNode].filter(isJsonLdNode), \"dateModified\")\n ),\n expirationTime: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.expirationTime),\n rawSources.openGraph.article?.expirationTime\n ),\n tags: uniqueStrings([\n ...(rawSources.openGraph.article?.tags ?? []),\n ...jsonKeywords(articleNode)\n ]),\n authors: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.authors),\n rawSources.openGraph.article?.authors,\n entitiesFromJsonLd(articleNode?.author),\n embeddedAuthor ? [embeddedAuthor] : undefined\n ),\n publisher: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.publisher),\n rawSources.openGraph.article?.publisher,\n entityFromJsonLd(articleNode?.publisher),\n embeddedPublisher\n )\n };\n\n return emptyToUndefined(article);\n}\n\nfunction mergeProduct(\n _rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n productNode: JsonLdNode | undefined\n): ProductMetadata | undefined {\n const offers = firstRecord(productNode?.offers);\n const aggregateRating = firstRecord(productNode?.aggregateRating);\n const product: ProductMetadata = {\n ...mergePartialObjects(externalResults.map((result) => result.product)),\n name: firstDefined(firstResultValue(externalResults, (result) => result.product?.name), jsonString([productNode].filter(isJsonLdNode), \"name\")),\n brand: firstDefined(firstResultValue(externalResults, (result) => result.product?.brand), entityFromJsonLd(productNode?.brand)),\n sku: firstDefined(firstResultValue(externalResults, (result) => result.product?.sku), jsonString([productNode].filter(isJsonLdNode), \"sku\")),\n price: firstDefined(firstResultValue(externalResults, (result) => result.product?.price), jsonString([offers].filter(isJsonLdNode), \"price\")),\n currency: firstDefined(\n firstResultValue(externalResults, (result) => result.product?.currency),\n jsonString([offers].filter(isJsonLdNode), \"priceCurrency\")\n ),\n availability: firstDefined(\n firstResultValue(externalResults, (result) => result.product?.availability),\n shortSchemaValue(jsonString([offers].filter(isJsonLdNode), \"availability\"))\n ),\n condition: firstDefined(\n firstResultValue(externalResults, (result) => result.product?.condition),\n shortSchemaValue(jsonString([offers].filter(isJsonLdNode), \"itemCondition\"))\n ),\n ratingValue: firstDefined(\n firstResultValue(externalResults, (result) => result.product?.ratingValue),\n parseNumber(jsonString([aggregateRating].filter(isJsonLdNode), \"ratingValue\"))\n ),\n reviewCount: firstDefined(\n firstResultValue(externalResults, (result) => result.product?.reviewCount),\n parseNumber(jsonString([aggregateRating].filter(isJsonLdNode), \"reviewCount\"))\n )\n };\n\n return emptyToUndefined(product);\n}\n\nfunction mergeApp(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n appNode: JsonLdNode | undefined\n): ApplicationMetadata | undefined {\n const offers = firstRecord(appNode?.offers);\n const app: ApplicationMetadata = {\n ...mergePartialObjects(externalResults.map((result) => result.app)),\n name: firstDefined(\n firstResultValue(externalResults, (result) => result.app?.name),\n rawSources.html.applicationName,\n jsonString([appNode].filter(isJsonLdNode), \"name\")\n ),\n category: firstDefined(firstResultValue(externalResults, (result) => result.app?.category), jsonString([appNode].filter(isJsonLdNode), \"applicationCategory\")),\n operatingSystem: firstDefined(\n firstResultValue(externalResults, (result) => result.app?.operatingSystem),\n jsonString([appNode].filter(isJsonLdNode), \"operatingSystem\")\n ),\n price: firstDefined(firstResultValue(externalResults, (result) => result.app?.price), jsonString([offers].filter(isJsonLdNode), \"price\")),\n currency: firstDefined(firstResultValue(externalResults, (result) => result.app?.currency), jsonString([offers].filter(isJsonLdNode), \"priceCurrency\"))\n };\n\n return emptyToUndefined(app);\n}\n\nfunction mergeVideo(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n jsonLdNodes: JsonLdNode[],\n embeddedNodes: JsonLdNode[],\n videos: MediaAsset[]\n) {\n const externalVideo = mergePartialObjects(externalResults.map((result) => result.video));\n const hasExternalVideo = Object.keys(externalVideo).length > 0;\n const explicitExternalType = firstResultValue(externalResults, (result) => result.type);\n const videoNode = findJsonLdNode(jsonLdNodes, [\"VideoObject\"]);\n const openGraphType = rawSources.openGraph.type?.toLowerCase() ?? \"\";\n const canTrustEmbeddedVideo =\n !explicitExternalType ||\n explicitExternalType === \"video\" ||\n explicitExternalType === \"playlist\" ||\n openGraphType.includes(\"video\") ||\n Boolean(videoNode);\n\n if (!hasExternalVideo && !canTrustEmbeddedVideo) {\n return undefined;\n }\n\n const canUseEmbeddedFallbacks = hasExternalVideo || canTrustEmbeddedVideo;\n const video = {\n ...externalVideo,\n id: firstDefined(\n firstResultValue(externalResults, (result) => result.video?.id),\n canUseEmbeddedFallbacks ? findStringByKeys([videoNode, ...embeddedNodes].filter(isJsonLdNode), [\"videoId\", \"video_id\"]) : undefined\n ),\n title: firstDefined(\n firstResultValue(externalResults, (result) => result.video?.title),\n jsonString([videoNode].filter(isJsonLdNode), \"name\"),\n canUseEmbeddedFallbacks ? rawSources.openGraph.title : undefined,\n canUseEmbeddedFallbacks ? findStringByKeys(embeddedNodes, [\"videoTitle\", \"title\"]) : undefined\n ),\n channel: firstDefined(firstResultValue(externalResults, (result) => result.video?.channel), entityFromEmbedded(embeddedNodes, [\"channel\", \"ownerChannelName\", \"author\"])),\n publishedTime: firstDefined(\n firstResultValue(externalResults, (result) => result.video?.publishedTime),\n jsonString([videoNode].filter(isJsonLdNode), \"uploadDate\"),\n canUseEmbeddedFallbacks ? findStringByKeys(embeddedNodes, [\"publishDate\", \"publishedTime\", \"uploadDate\", \"datePublished\"]) : undefined\n ),\n duration: firstDefined(\n firstResultValue(externalResults, (result) => result.video?.duration),\n jsonString([videoNode].filter(isJsonLdNode), \"duration\"),\n canUseEmbeddedFallbacks ? findStringByKeys(embeddedNodes, [\"duration\", \"lengthSeconds\"]) : undefined\n ),\n category: firstDefined(firstResultValue(externalResults, (result) => result.video?.category), canUseEmbeddedFallbacks ? findStringByKeys(embeddedNodes, [\"category\"]) : undefined),\n viewCount: firstDefined(\n firstResultValue(externalResults, (result) => result.video?.viewCount),\n canUseEmbeddedFallbacks ? parseNumber(findStringByKeys(embeddedNodes, [\"viewCount\", \"views\"])) : undefined\n ),\n tags: firstDefined(firstResultValue(externalResults, (result) => result.video?.tags), canUseEmbeddedFallbacks ? arrayOfStrings(findValueByKeys(embeddedNodes, [\"tags\", \"keywords\"])) : undefined)\n };\n\n const cleaned = emptyToUndefined(video);\n const hasUsefulVideoIdentity =\n Boolean(cleaned?.id) ||\n Boolean(cleaned?.duration) ||\n Boolean(cleaned?.channel) ||\n Boolean(cleaned?.publishedTime) ||\n videos.length > 0 ||\n rawSources.openGraph.videos.length > 0 ||\n rawSources.twitter.videos.length > 0 ||\n Boolean(videoNode);\n\n if (!cleaned || (!hasExternalVideo && !hasUsefulVideoIdentity)) {\n return undefined;\n }\n\n return cleaned;\n}\n\nfunction mergePlaylist(externalResults: AdapterExtractionResult[]) {\n const playlist = firstResultValue(externalResults, (result) => result.playlist);\n if (!playlist) {\n return undefined;\n }\n\n return {\n videos: [],\n ...playlist\n };\n}\n\nfunction inferType(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n jsonLdNodes: JsonLdNode[],\n article: ArticleMetadata | undefined,\n product: ProductMetadata | undefined,\n app: ApplicationMetadata | undefined,\n playlist: unknown,\n videos: MediaAsset[],\n audio: MediaAsset[]\n): MetadataType {\n const explicit = firstResultValue(externalResults, (result) => result.type);\n if (explicit) {\n return explicit;\n }\n\n if (playlist) {\n return \"playlist\";\n }\n\n const ogType = rawSources.openGraph.type?.toLowerCase();\n if (ogType?.includes(\"article\") || article) {\n return \"article\";\n }\n\n if (ogType?.includes(\"product\") || product || hasJsonLdType(jsonLdNodes, [\"Product\"])) {\n return \"product\";\n }\n\n if (ogType?.includes(\"image\") || hasJsonLdType(jsonLdNodes, [\"ImageObject\"])) {\n return \"image\";\n }\n\n if (ogType?.includes(\"video\") || videos.length > 0 || hasJsonLdType(jsonLdNodes, [\"VideoObject\"])) {\n return \"video\";\n }\n\n if (ogType?.includes(\"audio\") || audio.length > 0 || hasJsonLdType(jsonLdNodes, [\"AudioObject\", \"MusicRecording\", \"PodcastEpisode\"])) {\n return \"audio\";\n }\n\n if (app || hasJsonLdType(jsonLdNodes, [\"SoftwareApplication\", \"MobileApplication\", \"WebApplication\"])) {\n return \"app\";\n }\n\n if (ogType?.includes(\"profile\") || hasJsonLdType(jsonLdNodes, [\"Person\"])) {\n return \"profile\";\n }\n\n return rawSources.openGraph.raw[\"og:type\"] || rawSources.html.title ? \"website\" : \"unknown\";\n}\n\nfunction detectSourcesUsed(rawSources: RawMetadataSources): string[] {\n const sources: string[] = [];\n\n if (Object.keys(rawSources.openGraph.raw).length > 0) {\n sources.push(\"openGraph\");\n }\n\n if (Object.keys(rawSources.twitter.raw).length > 0) {\n sources.push(\"twitter\");\n }\n\n if (rawSources.jsonLd.nodes.length > 0) {\n sources.push(\"jsonLd\");\n }\n\n if (rawSources.embeddedData.items.length > 0) {\n sources.push(\"embeddedData\", ...rawSources.embeddedData.items.map((item) => item.source));\n }\n\n if (rawSources.oEmbed.links.length > 0 || rawSources.oEmbed.data.length > 0) {\n sources.push(\"oEmbed\");\n }\n\n if (rawSources.html.title || rawSources.html.description || rawSources.html.canonicalUrl) {\n sources.push(\"html\");\n }\n\n if (rawSources.images.length > 0 || rawSources.videos.length > 0 || rawSources.audio.length > 0) {\n sources.push(\"media\");\n }\n\n sources.push(...rawSources.adapters.map((result) => result.source), ...rawSources.plugins.map((result) => result.source));\n return sources;\n}\n\nfunction diagnosticsWarnings(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n diagnostics: ExtractionDiagnostics | undefined\n): string[] {\n return uniqueStrings([\n ...(diagnostics?.warnings ?? []),\n ...rawSources.jsonLd.warnings,\n ...externalResults.flatMap((result) => result.warnings ?? [])\n ]);\n}\n\nfunction adapterDiagnostics(adapters: AdapterExtractionResult[]): ExtractionDiagnostics[\"adapter\"] {\n const adapter = adapters[0];\n if (!adapter) {\n return { matched: false };\n }\n\n let confidence = 55;\n if (adapter.title) {\n confidence += 15;\n }\n if (adapter.description) {\n confidence += 10;\n }\n if ((adapter.images?.length ?? 0) > 0 || (adapter.videos?.length ?? 0) > 0) {\n confidence += 15;\n }\n if (adapter.author) {\n confidence += 5;\n }\n\n return {\n matched: true,\n name: adapter.source,\n confidence: Math.min(confidence, 100)\n };\n}\n\nfunction adapterRawString(adapter: AdapterExtractionResult | undefined, key: string): string | undefined {\n const value = adapter?.raw?.[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction fallbackAttemptsFromUnknown(value: unknown): ExtractionFallbackAttempt[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n\n const attempts = value.flatMap((item): ExtractionFallbackAttempt[] => {\n if (!isJsonLdNode(item) || typeof item.method !== \"string\") {\n return [];\n }\n\n return [{\n method: item.method,\n url: typeof item.url === \"string\" ? item.url : undefined,\n ok: typeof item.ok === \"boolean\" ? item.ok : false,\n statusCode: typeof item.statusCode === \"number\" ? item.statusCode : undefined,\n blocked: typeof item.blocked === \"boolean\" ? item.blocked : undefined,\n error: typeof item.error === \"string\" ? item.error : undefined,\n retryAfter: typeof item.retryAfter === \"string\" ? item.retryAfter : undefined\n }];\n });\n\n return attempts.length > 0 ? attempts : undefined;\n}\n\nfunction mergeFallbackAttempts(\n existing: ExtractionFallbackAttempt[] | undefined,\n incoming: ExtractionFallbackAttempt[] | undefined\n): ExtractionFallbackAttempt[] | undefined {\n const attempts = [...(existing ?? []), ...(incoming ?? [])];\n if (attempts.length === 0) {\n return undefined;\n }\n\n const seen = new Set<string>();\n return attempts.filter((attempt) => {\n const key = `${attempt.method}:${attempt.url ?? \"\"}:${attempt.statusCode ?? \"\"}:${attempt.error ?? \"\"}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n}\n\nfunction retryInfoFromUnknown(value: unknown): ExtractionRetryInfo | undefined {\n if (!isJsonLdNode(value)) {\n return undefined;\n }\n\n const retryable = typeof value.retryable === \"boolean\" ? value.retryable : undefined;\n if (retryable === undefined) {\n return undefined;\n }\n\n return {\n retryable,\n reason: typeof value.reason === \"string\" ? value.reason : undefined,\n retryAfter: typeof value.retryAfter === \"string\" ? value.retryAfter : undefined,\n retryAfterMs: typeof value.retryAfterMs === \"number\" ? value.retryAfterMs : undefined,\n attempts: typeof value.attempts === \"number\" ? value.attempts : undefined\n };\n}\n\nfunction fieldSource(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n embeddedNodes: JsonLdNode[],\n field: \"title\" | \"description\" | \"author\" | \"image\",\n bestImage: MediaAsset | undefined\n): string | undefined {\n if (field === \"image\") {\n return bestImage ? sourceLabel(bestImage) : undefined;\n }\n\n for (const result of externalResults) {\n if (field === \"title\" && result.title) {\n return result.source;\n }\n if (field === \"description\" && result.description) {\n return result.source;\n }\n if (field === \"author\" && result.author) {\n return result.source;\n }\n }\n\n if (field === \"title\") {\n if (rawSources.openGraph.title) return \"openGraph\";\n if (rawSources.twitter.title) return \"twitter\";\n if (findStringByKeys(embeddedNodes, [\"title\", \"headline\", \"name\"])) return \"embeddedData\";\n if (rawSources.html.title) return \"html\";\n }\n\n if (field === \"description\") {\n if (rawSources.openGraph.description) return \"openGraph\";\n if (rawSources.twitter.description) return \"twitter\";\n if (findStringByKeys(embeddedNodes, [\"description\", \"summary\", \"excerpt\"])) return \"embeddedData\";\n if (rawSources.html.description) return \"html\";\n }\n\n if (field === \"author\") {\n if (entityFromEmbedded(embeddedNodes, [\"author\", \"creator\", \"owner\", \"user\"])) return \"embeddedData\";\n if (rawSources.openGraph.article?.authors?.length) return \"openGraph\";\n }\n\n return undefined;\n}\n\nfunction findJsonLdNode(nodes: JsonLdNode[], types: string[]): JsonLdNode | undefined {\n return nodes.find((node) => hasJsonLdType([node], types));\n}\n\nfunction hasJsonLdType(nodes: JsonLdNode[], types: string[]): boolean {\n return nodes.some((node) => {\n const nodeTypes = Array.isArray(node[\"@type\"]) ? node[\"@type\"] : [node[\"@type\"]];\n return nodeTypes.some((type) => typeof type === \"string\" && types.some((candidate) => type.toLowerCase().endsWith(candidate.toLowerCase())));\n });\n}\n\nfunction jsonString(nodes: JsonLdNode[], key: string): string | undefined {\n for (const node of nodes) {\n const value = stringFromUnknown(node[key]);\n if (value) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction findStringByKeys(nodes: JsonLdNode[], keys: string[]): string | undefined {\n const normalizedKeys = keys.map((key) => key.toLowerCase());\n const candidates: string[] = [];\n\n for (const node of nodes) {\n walkJson(node, (value, key) => {\n if (!key || !normalizedKeys.includes(key.toLowerCase())) {\n return;\n }\n\n const text = stringFromUnknown(value);\n if (text) {\n candidates.push(text);\n }\n });\n }\n\n return candidates\n .filter((candidate) => candidate.length >= 2 && !/^\\d+$/.test(candidate))\n .sort((left, right) => scoreTextCandidate(right) - scoreTextCandidate(left))[0];\n}\n\nfunction findValueByKeys(nodes: JsonLdNode[], keys: string[]): unknown {\n const normalizedKeys = keys.map((key) => key.toLowerCase());\n let found: unknown;\n\n for (const node of nodes) {\n walkJson(node, (value, key) => {\n if (found !== undefined || !key || !normalizedKeys.includes(key.toLowerCase())) {\n return;\n }\n\n found = value;\n });\n\n if (found !== undefined) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction entityFromEmbedded(nodes: JsonLdNode[], keys: string[]): Entity | undefined {\n const normalizedKeys = keys.map((key) => key.toLowerCase());\n const candidates: Entity[] = [];\n\n for (const node of nodes) {\n walkJson(node, (value, key) => {\n if (!key || !normalizedKeys.some((candidate) => key.toLowerCase().includes(candidate))) {\n return;\n }\n\n const entity = entityFromJsonLd(value);\n if (entity?.name) {\n candidates.push(entity);\n }\n });\n }\n\n return candidates[0];\n}\n\nfunction walkJson(value: unknown, visit: (value: unknown, key?: string) => void, key?: string, depth = 0): void {\n if (depth > 8) {\n return;\n }\n\n visit(value, key);\n\n if (Array.isArray(value)) {\n for (const item of value.slice(0, 250)) {\n walkJson(item, visit, undefined, depth + 1);\n }\n return;\n }\n\n if (isJsonLdNode(value)) {\n for (const [childKey, childValue] of Object.entries(value).slice(0, 500)) {\n walkJson(childValue, visit, childKey, depth + 1);\n }\n }\n}\n\nfunction scoreTextCandidate(value: string): number {\n let score = Math.min(value.length, 160);\n if (value.length >= 12 && value.length <= 120) {\n score += 50;\n }\n if (/^(home|login|index|untitled)$/i.test(value)) {\n score -= 80;\n }\n return score;\n}\n\nfunction jsonKeywords(node: JsonLdNode | undefined): string[] {\n const value = node?.keywords;\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value.map(stringFromUnknown).filter((item): item is string => Boolean(item));\n }\n\n const text = stringFromUnknown(value);\n return text ? text.split(\",\").map((item) => item.trim()).filter(Boolean) : [];\n}\n\nfunction entityFromJsonLd(value: unknown): Entity | undefined {\n const entity = firstRecord(value);\n if (!entity) {\n const name = stringFromUnknown(value);\n return name ? { name } : undefined;\n }\n\n return emptyToUndefined({\n name: stringFromUnknown(entity.name),\n url: stringFromUnknown(entity.url),\n logo: stringFromUnknown(entity.logo),\n sameAs: arrayOfStrings(entity.sameAs)\n });\n}\n\nfunction entitiesFromJsonLd(value: unknown): Entity[] | undefined {\n if (Array.isArray(value)) {\n const entities = value.map(entityFromJsonLd).filter((entity): entity is Entity => Boolean(entity));\n return entities.length > 0 ? entities : undefined;\n }\n\n const entity = entityFromJsonLd(value);\n return entity ? [entity] : undefined;\n}\n\nfunction firstRecord(value: unknown): JsonLdNode | undefined {\n if (Array.isArray(value)) {\n return value.find(isJsonLdNode);\n }\n\n return isJsonLdNode(value) ? value : undefined;\n}\n\nfunction firstResultValue<T>(results: AdapterExtractionResult[], select: (result: AdapterExtractionResult) => T | undefined): T | undefined {\n for (const result of results) {\n const value = select(result);\n if (value !== undefined) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction firstEntity(entities: Entity[] | undefined): Entity | undefined {\n return entities?.[0];\n}\n\nfunction mergePartialObjects<T extends object>(objects: Array<Partial<T> | undefined>): Partial<T> {\n return Object.assign({}, ...objects.filter(Boolean));\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return value.map(stringFromUnknown).find(Boolean);\n }\n\n if (isJsonLdNode(value)) {\n return stringFromUnknown(value.name) ?? stringFromUnknown(value.url) ?? stringFromUnknown(value[\"@id\"]);\n }\n\n return undefined;\n}\n\nfunction arrayOfStrings(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n const single = stringFromUnknown(value);\n return single ? [single] : undefined;\n }\n\n const values = value.map(stringFromUnknown).filter((item): item is string => Boolean(item));\n return values.length > 0 ? values : undefined;\n}\n\nfunction shortSchemaValue(value: string | undefined): string | undefined {\n return value?.split(\"/\").filter(Boolean).at(-1);\n}\n\nfunction domainName(url: string): string | undefined {\n try {\n return new URL(url).hostname.replace(/^www\\./, \"\");\n } catch {\n return undefined;\n }\n}\n\nfunction uniqueStrings(values: Array<string | undefined>): string[] {\n return [...new Set(values.filter((value): value is string => Boolean(value)))];\n}\n\nfunction emptyToUndefined<T extends object>(value: T): T | undefined {\n const cleaned = stripUndefined(value) as T;\n return Object.keys(cleaned).length > 0 ? cleaned : undefined;\n}\n\nfunction stripUndefined<T extends object>(value: T): Partial<T> {\n return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined && item !== null && (!Array.isArray(item) || item.length > 0))) as Partial<T>;\n}\n\nfunction isJsonLdNode(value: unknown): value is JsonLdNode {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sourceLabel(image: MediaAsset): string {\n if (image.source === \"adapter\") {\n const adapter = typeof image.metadata?.adapter === \"string\" ? image.metadata.adapter : \"adapter\";\n const originalSource = typeof image.metadata?.originalSource === \"string\" ? image.metadata.originalSource : undefined;\n return originalSource ? `${adapter} (${originalSource})` : adapter;\n }\n\n return image.source;\n}\n","import type { AdapterContext, AdapterExtractionResult, Entity, JsonLdNode, MediaAsset, MetadataType, SiteAdapter } from \"../types/index.js\";\nimport { discoverMedia } from \"../media/index.js\";\n\ntype PlatformRawData = AdapterExtractionResult & {\n platform?: string;\n identifiers?: Record<string, string | undefined>;\n};\n\ninterface TextSelection {\n value?: string;\n method?: string;\n}\n\nexport const youtubeAdapter: SiteAdapter<PlatformRawData> = {\n name: \"youtubeAdapter\",\n detect(url) {\n return hostMatches(url, [\"youtube.com\", \"youtu.be\", \"youtube-nocookie.com\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const videoId = getYouTubeVideoId(url);\n const playlistId = getYouTubePlaylistId(url);\n const communityPostId = getYouTubeCommunityPostId(url);\n const titleSelection = youtubeTitleFromContext(context, { videoId, playlistId, communityPostId });\n const descriptionSelection = youtubeDescriptionFromContext(context);\n const channel = entityFromContext(context, [\"author\", \"ownerChannelName\", \"channel\", \"owner\"]);\n const playlistVideos = playlistId ? extractPlaylistVideos(context) : [];\n const sourcePriority = youtubeSourcePriority();\n\n return compactAdapterResult({\n source: \"youtubeAdapter\",\n platform: \"YouTube\",\n type: playlistId ? \"playlist\" : communityPostId ? \"social_post\" : \"video\",\n siteName: \"YouTube\",\n canonicalUrl: videoId ? `https://www.youtube.com/watch?v=${videoId}` : context.raw.openGraph.url,\n title: titleSelection.value,\n description: descriptionSelection.value,\n videos: markAdapterMedia(mediaFromContext(context).videos, \"youtubeAdapter\"),\n images: markAdapterMedia(mediaFromContext(context).images, \"youtubeAdapter\"),\n author: channel,\n article: { publishedTime: publishedTimeFromContext(context) },\n video: videoId\n ? {\n id: videoId,\n title: titleSelection.value,\n channel,\n publishedTime: publishedTimeFromContext(context),\n duration: findEmbeddedString(context, [\"duration\", \"lengthSeconds\", \"approxDurationMs\"]),\n tags: arrayFromContext(context, [\"tags\", \"keywords\"]),\n category: findEmbeddedString(context, [\"category\"]),\n viewCount: numberFromContext(context, [\"viewCount\", \"views\"])\n }\n : undefined,\n playlist: playlistId\n ? {\n id: playlistId,\n title: youtubePlaylistTitleFromContext(context) ?? context.raw.openGraph.title,\n channel,\n videos: playlistVideos\n }\n : undefined,\n identifiers: { videoId, playlistId, communityPostId },\n raw: {\n sourcePriority,\n extractionMethod: titleSelection.method ?? descriptionSelection.method ?? \"youtube:htmlFallback\"\n }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const redditAdapter: SiteAdapter<PlatformRawData> = {\n name: \"redditAdapter\",\n detect(url) {\n return hostMatches(url, [\"reddit.com\", \"redd.it\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const reddit = parseRedditUrl(url);\n const username = typeof reddit.username === \"string\" ? reddit.username : undefined;\n const titleSelection = redditTitleFromContext(context);\n const descriptionSelection = redditDescriptionFromContext(context);\n const sourcePriority = redditSourcePriority();\n\n return compactAdapterResult({\n source: \"redditAdapter\",\n platform: \"Reddit\",\n type: reddit.isPost ? \"social_post\" : \"website\",\n siteName: \"Reddit\",\n canonicalUrl: context.raw.openGraph.url ?? context.raw.html.canonicalUrl,\n title: cleanSocialTitle(titleSelection.value),\n description: descriptionSelection.value,\n images: markAdapterMedia(mediaFromContext(context).images, \"redditAdapter\"),\n videos: markAdapterMedia(mediaFromContext(context).videos, \"redditAdapter\"),\n author: username ? { name: username } : entityFromContext(context, [\"author\", \"submitter\", \"user\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { subreddit: reddit.subreddit, postId: reddit.postId, username: reddit.username },\n raw: {\n ...reddit,\n sourcePriority,\n extractionMethod: titleSelection.method ?? descriptionSelection.method ?? \"reddit:htmlFallback\"\n }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const pinterestAdapter: SiteAdapter<PlatformRawData> = {\n name: \"pinterestAdapter\",\n detect(url) {\n return hostMatches(url, [\"pinterest.com\", \"pin.it\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const pinId = url.pathname.match(/\\/pin\\/([^/]+)/)?.[1];\n\n return compactAdapterResult({\n source: \"pinterestAdapter\",\n platform: \"Pinterest\",\n type: pinId || hostMatches(url, [\"pin.it\"]) ? \"social_post\" : \"image\",\n siteName: \"Pinterest\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"pinTitle\", \"gridTitle\", \"headline\", \"name\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(mediaFromContext(context).images, \"pinterestAdapter\"),\n videos: markAdapterMedia(mediaFromContext(context).videos, \"pinterestAdapter\"),\n author: entityFromContext(context, [\"pinner\", \"author\", \"creator\", \"owner\", \"user\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { pinId }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const behanceAdapter: SiteAdapter<PlatformRawData> = {\n name: \"behanceAdapter\",\n detect(url) {\n return hostMatches(url, [\"behance.net\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const projectId = url.pathname.match(/\\/gallery\\/(\\d+)/)?.[1];\n\n return compactAdapterResult({\n source: \"behanceAdapter\",\n platform: \"Behance\",\n type: projectId ? \"image\" : \"website\",\n siteName: \"Behance\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"projectTitle\", \"name\", \"headline\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(mediaFromContext(context).images, \"behanceAdapter\"),\n videos: markAdapterMedia(mediaFromContext(context).videos, \"behanceAdapter\"),\n author: entityFromContext(context, [\"owners\", \"author\", \"creator\", \"user\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n raw: { projectId }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const tiktokAdapter: SiteAdapter<PlatformRawData> = {\n name: \"tiktokAdapter\",\n detect(url) {\n return hostMatches(url, [\"tiktok.com\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n return socialVideoResult(\"tiktokAdapter\", \"TikTok\", context);\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const facebookAdapter: SiteAdapter<PlatformRawData> = {\n name: \"facebookAdapter\",\n detect(url) {\n return hostMatches(url, [\"facebook.com\", \"fb.watch\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const isPost = /\\/(?:posts|photo|videos|watch|reel|share)\\//i.test(url.pathname) || url.searchParams.has(\"story_fbid\");\n const isPhoto = url.pathname.includes(\"photo.php\") || url.searchParams.has(\"fbid\");\n const postId = url.searchParams.get(\"story_fbid\") ?? url.pathname.match(/\\/(?:posts|videos|reel)\\/([^/]+)/)?.[1];\n const media = mediaFromContext(context);\n\n return compactAdapterResult({\n source: \"facebookAdapter\",\n platform: \"Facebook\",\n type: isPhoto ? \"image\" : isPost || media.images.length > 0 || media.videos.length > 0 ? \"social_post\" : \"website\",\n siteName: \"Facebook\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"headline\", \"name\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(media.images, \"facebookAdapter\"),\n videos: markAdapterMedia(media.videos, \"facebookAdapter\"),\n author: entityFromContext(context, [\"author\", \"owner\", \"profile\", \"user\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { postId }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const twitterAdapter: SiteAdapter<PlatformRawData> = {\n name: \"twitterAdapter\",\n detect(url) {\n return hostMatches(url, [\"twitter.com\", \"x.com\", \"t.co\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const statusId = url.pathname.match(/\\/status(?:es)?\\/(\\d+)/)?.[1];\n\n return compactAdapterResult({\n source: \"twitterAdapter\",\n platform: \"X\",\n type: statusId || hostMatches(url, [\"t.co\"]) ? \"social_post\" : \"profile\",\n siteName: \"X\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"full_text\", \"text\", \"headline\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(mediaFromContext(context).images, \"twitterAdapter\"),\n videos: markAdapterMedia(mediaFromContext(context).videos, \"twitterAdapter\"),\n author: entityFromContext(context, [\"author\", \"user\", \"screen_name\", \"creator\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { statusId }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const instagramAdapter: SiteAdapter<PlatformRawData> = {\n name: \"instagramAdapter\",\n detect(url) {\n return hostMatches(url, [\"instagram.com\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const shortcode = url.pathname.match(/\\/(?:p|reel|tv)\\/([^/]+)/)?.[1];\n\n return compactAdapterResult({\n source: \"instagramAdapter\",\n platform: \"Instagram\",\n type: shortcode ? \"social_post\" : \"profile\",\n siteName: \"Instagram\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"caption\", \"edge_media_to_caption\", \"headline\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(mediaFromContext(context).images, \"instagramAdapter\"),\n videos: markAdapterMedia(mediaFromContext(context).videos, \"instagramAdapter\"),\n author: entityFromContext(context, [\"owner\", \"author\", \"user\", \"username\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { shortcode }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const defaultAdapters: SiteAdapter[] = [\n youtubeAdapter,\n redditAdapter,\n pinterestAdapter,\n behanceAdapter,\n tiktokAdapter,\n facebookAdapter,\n twitterAdapter,\n instagramAdapter\n];\n\nfunction youtubeSourcePriority(): string[] {\n return [\n \"structuredData:VideoObject\",\n \"embeddedData:ytInitialPlayerResponse\",\n \"embeddedData:ytInitialData\",\n \"openGraph\",\n \"twitter\",\n \"html\"\n ];\n}\n\nfunction youtubeTitleFromContext(\n context: AdapterContext,\n ids: { videoId?: string; playlistId?: string; communityPostId?: string }\n): TextSelection {\n const videoObjectTitle = jsonLdVideoObjectString(context, [\"name\", \"headline\"]);\n if (videoObjectTitle) {\n return { value: videoObjectTitle, method: \"youtube:structuredData.VideoObject\" };\n }\n\n const playerTitle = youtubePlayerString(context, [\"videoDetails.title\", \"microformat.playerMicroformatRenderer.title\"]);\n if (playerTitle) {\n return { value: playerTitle, method: \"youtube:ytInitialPlayerResponse\" };\n }\n\n const initialDataTitle = youtubeInitialDataTitle(context, ids);\n if (initialDataTitle) {\n return { value: initialDataTitle, method: \"youtube:ytInitialData\" };\n }\n\n if (context.raw.openGraph.title) {\n return { value: context.raw.openGraph.title, method: \"youtube:openGraph\" };\n }\n\n if (context.raw.twitter.title) {\n return { value: context.raw.twitter.title, method: \"youtube:twitter\" };\n }\n\n return { value: cleanYouTubeHtmlTitle(context.raw.html.title), method: context.raw.html.title ? \"youtube:html\" : undefined };\n}\n\nfunction youtubeDescriptionFromContext(context: AdapterContext): TextSelection {\n const videoObjectDescription = jsonLdVideoObjectString(context, [\"description\"]);\n if (videoObjectDescription) {\n return { value: videoObjectDescription, method: \"youtube:structuredData.VideoObject\" };\n }\n\n const playerDescription = youtubePlayerString(context, [\n \"videoDetails.shortDescription\",\n \"microformat.playerMicroformatRenderer.description\",\n \"microformat.playerMicroformatRenderer.shortDescription\"\n ]);\n if (playerDescription) {\n return { value: playerDescription, method: \"youtube:ytInitialPlayerResponse\" };\n }\n\n const initialDataDescription = youtubeInitialDataDescription(context);\n if (initialDataDescription) {\n return { value: initialDataDescription, method: \"youtube:ytInitialData\" };\n }\n\n if (context.raw.openGraph.description) {\n return { value: context.raw.openGraph.description, method: \"youtube:openGraph\" };\n }\n\n if (context.raw.twitter.description) {\n return { value: context.raw.twitter.description, method: \"youtube:twitter\" };\n }\n\n return { value: context.raw.html.description, method: context.raw.html.description ? \"youtube:html\" : undefined };\n}\n\nfunction redditSourcePriority(): string[] {\n return [\n \"redditJsonEndpoint\",\n \"oldReddit\",\n \"embeddedStructuredData\",\n \"openGraph\",\n \"twitter\",\n \"html\"\n ];\n}\n\nfunction redditTitleFromContext(context: AdapterContext): TextSelection {\n const embedded = findEmbeddedStringBySources(context, [\"applicationJson\", \"jsonScript\", \"initialState\", \"preloadedState\", \"nextData\"], [\n \"postTitle\",\n \"title\",\n \"headline\"\n ]);\n if (embedded) {\n return { value: embedded, method: hasRedditJsonEndpointPayload(context) ? \"reddit:jsonEndpoint\" : \"reddit:embeddedStructuredData\" };\n }\n\n const structured = jsonLdStringByType(context.raw.jsonLd.nodes, [\"SocialMediaPosting\", \"DiscussionForumPosting\", \"Article\"], [\"headline\", \"name\"]);\n if (structured) {\n return { value: structured, method: \"reddit:structuredData\" };\n }\n\n if (context.raw.openGraph.title) {\n return { value: context.raw.openGraph.title, method: \"reddit:openGraph\" };\n }\n\n if (context.raw.twitter.title) {\n return { value: context.raw.twitter.title, method: \"reddit:twitter\" };\n }\n\n return { value: context.raw.html.title, method: context.raw.html.title ? \"reddit:html\" : undefined };\n}\n\nfunction redditDescriptionFromContext(context: AdapterContext): TextSelection {\n const embedded = findEmbeddedStringBySources(context, [\"applicationJson\", \"jsonScript\", \"initialState\", \"preloadedState\", \"nextData\"], [\n \"description\",\n \"selftext\",\n \"excerpt\",\n \"summary\",\n \"body\"\n ]);\n if (embedded) {\n return { value: embedded, method: hasRedditJsonEndpointPayload(context) ? \"reddit:jsonEndpoint\" : \"reddit:embeddedStructuredData\" };\n }\n\n const structured = jsonLdStringByType(context.raw.jsonLd.nodes, [\"SocialMediaPosting\", \"DiscussionForumPosting\", \"Article\"], [\"description\", \"articleBody\"]);\n if (structured) {\n return { value: structured, method: \"reddit:structuredData\" };\n }\n\n if (context.raw.openGraph.description) {\n return { value: context.raw.openGraph.description, method: \"reddit:openGraph\" };\n }\n\n if (context.raw.twitter.description) {\n return { value: context.raw.twitter.description, method: \"reddit:twitter\" };\n }\n\n return { value: context.raw.html.description, method: context.raw.html.description ? \"reddit:html\" : undefined };\n}\n\nfunction socialVideoResult(source: string, platform: string, context: AdapterContext): PlatformRawData {\n const url = new URL(context.finalUrl);\n const username = url.pathname.match(/@([^/]+)/)?.[1];\n const postId = url.pathname.match(/\\/(?:video|photo)\\/([^/]+)/)?.[1] ?? url.pathname.split(\"/\").filter(Boolean).at(-1);\n\n return compactAdapterResult({\n source,\n platform,\n type: \"social_post\",\n siteName: platform,\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"desc\", \"description\", \"caption\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(mediaFromContext(context).images, source),\n videos: markAdapterMedia(mediaFromContext(context).videos, source),\n author: username ? { name: username } : entityFromContext(context, [\"author\", \"user\", \"creator\", \"owner\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { username, postId }\n });\n}\n\nfunction normalizePlatformResult(rawData: PlatformRawData): AdapterExtractionResult {\n const type = rawData.type ?? inferAdapterType(rawData);\n\n return compactAdapterResult({\n ...rawData,\n type,\n raw: {\n ...(rawData.raw ?? {}),\n platform: rawData.platform,\n identifiers: rawData.identifiers\n }\n });\n}\n\nfunction inferAdapterType(rawData: PlatformRawData): MetadataType {\n if ((rawData.videos?.length ?? 0) > 0) {\n return \"video\";\n }\n\n if ((rawData.images?.length ?? 0) > 0) {\n return \"image\";\n }\n\n return \"website\";\n}\n\nfunction markAdapterMedia(assets: MediaAsset[], adapterName: string): MediaAsset[] {\n const seen = new Set<string>();\n\n return assets.filter((asset) => {\n if (seen.has(asset.url)) {\n return false;\n }\n seen.add(asset.url);\n return true;\n }).map((asset) => ({\n ...asset,\n source: \"adapter\",\n metadata: {\n ...asset.metadata,\n adapter: adapterName,\n originalSource: asset.source\n }\n }));\n}\n\nfunction jsonLdVideoObjectString(context: AdapterContext, keys: string[]): string | undefined {\n return jsonLdStringByType(context.raw.jsonLd.nodes, [\"VideoObject\"], keys);\n}\n\nfunction jsonLdStringByType(nodes: JsonLdNode[], types: string[], keys: string[]): string | undefined {\n for (const node of nodes) {\n if (!hasJsonLdType(node, types)) {\n continue;\n }\n\n for (const key of keys) {\n const value = stringFromUnknown(node[key]);\n if (value) {\n return value;\n }\n }\n }\n\n return undefined;\n}\n\nfunction hasJsonLdType(node: JsonLdNode, types: string[]): boolean {\n const nodeTypes = Array.isArray(node[\"@type\"]) ? node[\"@type\"] : [node[\"@type\"]];\n return nodeTypes.some((type) => typeof type === \"string\" && types.some((candidate) => type.toLowerCase().endsWith(candidate.toLowerCase())));\n}\n\nfunction youtubePlayerString(context: AdapterContext, paths: string[]): string | undefined {\n for (const item of context.raw.embeddedData.items) {\n if (item.source !== \"youtubePlayerResponse\") {\n continue;\n }\n\n for (const path of paths) {\n const value = stringFromUnknown(valueAtPath(item.data, path));\n if (value) {\n return value;\n }\n }\n }\n\n return undefined;\n}\n\nfunction youtubeInitialDataTitle(\n context: AdapterContext,\n ids: { videoId?: string; playlistId?: string; communityPostId?: string }\n): string | undefined {\n const items = context.raw.embeddedData.items.filter((item) => item.source === \"youtubeInitialData\");\n\n const primary = findRendererText(items, [\"videoPrimaryInfoRenderer\", \"watchMetadata\"], [\"title\"]);\n if (primary) {\n return primary;\n }\n\n if (ids.videoId) {\n const matchingVideo = findYouTubeRendererForVideoId(items, ids.videoId, [\"title\"]);\n if (matchingVideo) {\n return matchingVideo;\n }\n }\n\n if (ids.communityPostId) {\n const communityPost =\n findEmbeddedStringBySources(context, [\"youtubeInitialData\"], [\"contentText\"]) ??\n findRendererText(items, [\"backstagePostRenderer\", \"postRenderer\"], [\"contentText\", \"title\"]);\n if (communityPost) {\n return communityPost;\n }\n }\n\n if (ids.playlistId && !ids.videoId) {\n return findRendererText(items, [\"playlistMetadataRenderer\", \"playlistHeaderRenderer\"], [\"title\", \"playlistTitle\", \"name\"]);\n }\n\n return undefined;\n}\n\nfunction youtubeInitialDataDescription(context: AdapterContext): string | undefined {\n const items = context.raw.embeddedData.items.filter((item) => item.source === \"youtubeInitialData\");\n return findRendererText(items, [\"expandableVideoDescriptionBodyRenderer\", \"videoSecondaryInfoRenderer\", \"watchMetadata\"], [\n \"description\",\n \"attributedDescription\",\n \"content\"\n ]);\n}\n\nfunction youtubePlaylistTitleFromContext(context: AdapterContext): string | undefined {\n const items = context.raw.embeddedData.items.filter((item) => item.source === \"youtubeInitialData\");\n return findRendererText(items, [\"playlistMetadataRenderer\", \"playlistHeaderRenderer\"], [\"title\", \"playlistTitle\", \"name\"]);\n}\n\nfunction findRendererText(items: Array<{ data: JsonLdNode }>, rendererKeys: string[], textKeys: string[]): string | undefined {\n for (const item of items) {\n let found: string | undefined;\n\n walkData(item.data, (value, key) => {\n if (found || !key || !rendererKeys.includes(key) || !isRecord(value)) {\n return;\n }\n\n for (const textKey of textKeys) {\n found = stringFromUnknown(value[textKey]);\n if (found) {\n return;\n }\n }\n });\n\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction findYouTubeRendererForVideoId(items: Array<{ data: JsonLdNode }>, videoId: string, textKeys: string[]): string | undefined {\n for (const item of items) {\n let found: string | undefined;\n\n walkData(item.data, (value) => {\n if (found || !isRecord(value) || stringFromUnknown(value.videoId) !== videoId) {\n return;\n }\n\n for (const textKey of textKeys) {\n found = stringFromUnknown(value[textKey]);\n if (found) {\n return;\n }\n }\n });\n\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction findEmbeddedStringBySources(context: AdapterContext, sources: string[], keys: string[]): string | undefined {\n const candidates: string[] = [];\n\n for (const item of context.raw.embeddedData.items) {\n if (!sources.includes(item.source)) {\n continue;\n }\n\n walkData(item.data, (value, key) => {\n if (!key || !matchesKey(key, keys)) {\n return;\n }\n\n const text = stringFromUnknown(value);\n if (text) {\n candidates.push(text);\n }\n });\n }\n\n return bestTextCandidate(candidates);\n}\n\nfunction hasRedditJsonEndpointPayload(context: AdapterContext): boolean {\n return context.raw.embeddedData.items.some((item) => item.source === \"applicationJson\" && item.path === \"metanova-reddit-json\");\n}\n\nfunction valueAtPath(node: unknown, path: string): unknown {\n return path.split(\".\").reduce<unknown>((current, key) => (isRecord(current) ? current[key] : undefined), node);\n}\n\nfunction cleanYouTubeHtmlTitle(title: string | undefined): string | undefined {\n return title?.replace(/\\s*-\\s*YouTube\\s*$/i, \"\").trim();\n}\n\nfunction titleFromContext(context: AdapterContext, embeddedKeys: string[]): string | undefined {\n return firstText(\n context.raw.openGraph.title,\n context.raw.twitter.title,\n findEmbeddedString(context, embeddedKeys),\n context.raw.html.title\n );\n}\n\nfunction descriptionFromContext(context: AdapterContext): string | undefined {\n return firstText(\n context.raw.openGraph.description,\n context.raw.twitter.description,\n findEmbeddedString(context, [\"description\", \"desc\", \"summary\", \"excerpt\", \"caption\", \"text\"]),\n context.raw.html.description\n );\n}\n\nfunction publishedTimeFromContext(context: AdapterContext): string | undefined {\n return firstText(\n context.raw.openGraph.article?.publishedTime,\n findJsonLdString(context.raw.jsonLd.nodes, [\"datePublished\", \"uploadDate\", \"createdAt\"]),\n findEmbeddedString(context, [\"datePublished\", \"publishedTime\", \"published_at\", \"createdAt\", \"created_at\", \"uploadDate\", \"timestamp\"])\n );\n}\n\nfunction mediaFromContext(context: AdapterContext): { images: MediaAsset[]; videos: MediaAsset[] } {\n const discovered = discoverMedia(context.raw, context.finalUrl);\n return {\n images: discovered.images,\n videos: discovered.videos\n };\n}\n\nfunction entityFromContext(context: AdapterContext, keys: string[]): Entity | undefined {\n const jsonLdEntity = entityFromJsonValue(findJsonLdValue(context.raw.jsonLd.nodes, keys));\n if (jsonLdEntity) {\n return jsonLdEntity;\n }\n\n for (const item of context.raw.embeddedData.items) {\n const entity = entityFromJsonValue(findValueByKeys(item.data, keys));\n if (entity) {\n return entity;\n }\n }\n\n return undefined;\n}\n\nfunction findEmbeddedString(context: AdapterContext, keys: string[]): string | undefined {\n const candidates: string[] = [];\n\n for (const item of context.raw.embeddedData.items) {\n walkData(item.data, (value, key) => {\n if (!key || !matchesKey(key, keys)) {\n return;\n }\n\n const text = stringFromUnknown(value);\n if (text) {\n candidates.push(text);\n }\n });\n }\n\n return bestTextCandidate(candidates);\n}\n\nfunction findJsonLdString(nodes: JsonLdNode[], keys: string[]): string | undefined {\n const value = findJsonLdValue(nodes, keys);\n return stringFromUnknown(value);\n}\n\nfunction findJsonLdValue(nodes: JsonLdNode[], keys: string[]): unknown {\n for (const node of nodes) {\n const value = findValueByKeys(node, keys);\n if (value !== undefined) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction findValueByKeys(node: unknown, keys: string[]): unknown {\n let found: unknown;\n\n walkData(node, (value, key) => {\n if (found !== undefined || !key || !matchesKey(key, keys)) {\n return;\n }\n\n found = value;\n });\n\n return found;\n}\n\nfunction walkData(value: unknown, visit: (value: unknown, key?: string) => void, key?: string, depth = 0): void {\n if (depth > 8) {\n return;\n }\n\n visit(value, key);\n\n if (Array.isArray(value)) {\n for (const item of value.slice(0, 250)) {\n walkData(item, visit, undefined, depth + 1);\n }\n return;\n }\n\n if (isRecord(value)) {\n for (const [childKey, childValue] of Object.entries(value).slice(0, 500)) {\n walkData(childValue, visit, childKey, depth + 1);\n }\n }\n}\n\nfunction entityFromJsonValue(value: unknown): Entity | undefined {\n if (!value) {\n return undefined;\n }\n\n if (typeof value === \"string\") {\n return { name: value };\n }\n\n if (Array.isArray(value)) {\n return value.map(entityFromJsonValue).find(Boolean);\n }\n\n if (!isRecord(value)) {\n return undefined;\n }\n\n const name =\n stringFromUnknown(value.name) ??\n stringFromUnknown(value.username) ??\n stringFromUnknown(value.screen_name) ??\n stringFromUnknown(value.ownerChannelName) ??\n stringFromUnknown(value.title);\n\n if (!name) {\n return undefined;\n }\n\n return {\n name,\n url: stringFromUnknown(value.url) ?? stringFromUnknown(value.canonicalUrl),\n logo: stringFromUnknown(value.logo) ?? stringFromUnknown(value.avatar) ?? stringFromUnknown(value.image)\n };\n}\n\nfunction firstText(...values: Array<string | undefined>): string | undefined {\n return bestTextCandidate(values.filter((value): value is string => Boolean(value)));\n}\n\nfunction bestTextCandidate(values: string[]): string | undefined {\n return values\n .map((value) => value.replace(/\\s+/g, \" \").trim())\n .filter((value) => value.length > 0)\n .sort((left, right) => scoreText(right) - scoreText(left))[0];\n}\n\nfunction scoreText(value: string): number {\n let score = Math.min(value.length, 180);\n if (value.length >= 10 && value.length <= 140) {\n score += 60;\n }\n if (/^(home|login|index|untitled)$/i.test(value)) {\n score -= 100;\n }\n return score;\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n const values = value.map(stringFromUnknown).filter(Boolean);\n return values.length > 0 ? values.join(\"\") : undefined;\n }\n\n if (isRecord(value)) {\n return (\n stringFromUnknown(value.text) ??\n stringFromUnknown(value.simpleText) ??\n stringFromUnknown(value.runs) ??\n stringFromUnknown(value.title) ??\n stringFromUnknown(value.name) ??\n stringFromUnknown(value.value) ??\n stringFromUnknown(value.url)\n );\n }\n\n return undefined;\n}\n\nfunction matchesKey(key: string, keys: string[]): boolean {\n const normalized = key.toLowerCase();\n return keys.some((candidate) => normalized === candidate.toLowerCase() || normalized.endsWith(candidate.toLowerCase()));\n}\n\nfunction isRecord(value: unknown): value is JsonLdNode {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\ninterface RedditUrlParts {\n isPost: boolean;\n subreddit?: string;\n postId?: string;\n username?: string;\n}\n\nfunction parseRedditUrl(url: URL): RedditUrlParts {\n const parts = url.pathname.split(\"/\").filter(Boolean);\n const commentsIndex = parts.indexOf(\"comments\");\n const shortPostId = hostMatches(url, [\"redd.it\"]) ? parts[0] : undefined;\n\n return {\n isPost: commentsIndex !== -1 || Boolean(shortPostId),\n subreddit: parts[0] === \"r\" ? parts[1] : undefined,\n postId: commentsIndex !== -1 ? parts[commentsIndex + 1] : shortPostId,\n username: parts[0] === \"user\" ? parts[1] : undefined\n };\n}\n\nfunction cleanSocialTitle(title: string | undefined): string | undefined {\n return title?.replace(/\\s*:\\s*r\\/[A-Za-z0-9_]+$/i, \"\").trim();\n}\n\nfunction hostMatches(url: URL, domains: string[]): boolean {\n const host = url.hostname.toLowerCase().replace(/^www\\./, \"\");\n return domains.some((domain) => host === domain || host.endsWith(`.${domain}`));\n}\n\nfunction getYouTubeVideoId(url: URL): string | undefined {\n const host = url.hostname.toLowerCase().replace(/^www\\./, \"\");\n\n if (host === \"youtu.be\") {\n return url.pathname.split(\"/\").filter(Boolean)[0];\n }\n\n if (url.pathname === \"/watch\") {\n return url.searchParams.get(\"v\") ?? undefined;\n }\n\n const embedMatch = url.pathname.match(/\\/(?:embed|shorts)\\/([^/?]+)/);\n return embedMatch?.[1];\n}\n\nfunction getYouTubePlaylistId(url: URL): string | undefined {\n return url.searchParams.get(\"list\") ?? undefined;\n}\n\nfunction getYouTubeCommunityPostId(url: URL): string | undefined {\n return url.pathname.match(/\\/post\\/([^/?]+)/)?.[1];\n}\n\nfunction extractPlaylistVideos(context: AdapterContext): Array<{ id: string; title?: string; url: string }> {\n const videos = new Map<string, { id: string; title?: string; url: string }>();\n\n for (const item of context.raw.embeddedData.items) {\n walkData(item.data, (value) => {\n if (!isRecord(value)) {\n return;\n }\n\n const videoId =\n stringFromUnknown(value.videoId) ??\n stringFromUnknown(value.video_id) ??\n (isRecord(value.watchEndpoint) ? stringFromUnknown(value.watchEndpoint.videoId) : undefined) ??\n (isRecord(value.navigationEndpoint) && isRecord(value.navigationEndpoint.watchEndpoint)\n ? stringFromUnknown(value.navigationEndpoint.watchEndpoint.videoId)\n : undefined);\n\n if (!videoId || videos.has(videoId)) {\n return;\n }\n\n videos.set(videoId, {\n id: videoId,\n title: stringFromUnknown(value.title) ?? stringFromUnknown(value.headline) ?? stringFromUnknown(value.shortBylineText),\n url: `https://www.youtube.com/watch?v=${videoId}`\n });\n });\n }\n\n return [...videos.values()].slice(0, 100);\n}\n\nfunction arrayFromContext(context: AdapterContext, keys: string[]): string[] | undefined {\n const fromJsonLd = arrayOfStrings(findJsonLdValue(context.raw.jsonLd.nodes, keys));\n if (fromJsonLd) {\n return fromJsonLd;\n }\n\n for (const item of context.raw.embeddedData.items) {\n const embedded = arrayOfStrings(findValueByKeys(item.data, keys));\n if (embedded) {\n return embedded;\n }\n }\n\n return undefined;\n}\n\nfunction numberFromContext(context: AdapterContext, keys: string[]): number | undefined {\n const fromJsonLd = numberFromUnknown(findJsonLdValue(context.raw.jsonLd.nodes, keys));\n if (fromJsonLd !== undefined) {\n return fromJsonLd;\n }\n\n for (const item of context.raw.embeddedData.items) {\n const embedded = numberFromUnknown(findValueByKeys(item.data, keys));\n if (embedded !== undefined) {\n return embedded;\n }\n }\n\n return undefined;\n}\n\nfunction arrayOfStrings(value: unknown): string[] | undefined {\n if (!value) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n const values = value.map(stringFromUnknown).filter((item): item is string => Boolean(item));\n return values.length > 0 ? values : undefined;\n }\n\n const text = stringFromUnknown(value);\n if (!text) {\n return undefined;\n }\n\n return text.split(\",\").map((item) => item.trim()).filter(Boolean);\n}\n\nfunction numberFromUnknown(value: unknown): number | undefined {\n const text = stringFromUnknown(value);\n if (!text) {\n return undefined;\n }\n\n const parsed = Number.parseInt(text.replace(/[^\\d]/g, \"\"), 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction compactAdapterResult<T extends AdapterExtractionResult | PlatformRawData>(result: T): T {\n return Object.fromEntries(\n Object.entries(result).filter(([, value]) => value !== undefined && (!Array.isArray(value) || value.length > 0))\n ) as T;\n}\n","import type {\n CustomExtractor,\n ImageScorer,\n MetaNovaPlugin,\n MetaNovaPluginApi,\n ParseMetadataOptions,\n SiteAdapter\n} from \"../types/index.js\";\nimport { defaultAdapters } from \"../adapters/siteAdapters.js\";\n\nexport interface MetaNovaRegistry {\n adapters: SiteAdapter[];\n extractors: CustomExtractor[];\n imageScorers: ImageScorer[];\n}\n\nconst globalPlugins: MetaNovaPlugin[] = [];\n\nexport function registerGlobalPlugin(plugin: MetaNovaPlugin): void {\n if (!globalPlugins.some((registered) => registered.name === plugin.name)) {\n globalPlugins.push(plugin);\n }\n}\n\nexport function createRegistry(options: ParseMetadataOptions = {}): MetaNovaRegistry {\n const registry: MetaNovaRegistry = {\n adapters: [...defaultAdapters, ...(options.adapters ?? [])],\n extractors: [],\n imageScorers: [...(options.imageScorers ?? [])]\n };\n\n const api: MetaNovaPluginApi = {\n addAdapter(adapter) {\n registry.adapters.push(adapter);\n },\n addExtractor(name, extractor) {\n registry.extractors.push({ name, extract: extractor });\n },\n addImageScorer(scorer) {\n registry.imageScorers.push(scorer);\n }\n };\n\n for (const plugin of [...globalPlugins, ...(options.plugins ?? [])]) {\n plugin.setup(api);\n }\n\n return registry;\n}\n","import type { AdapterContext, AdapterExtractionResult, PluginExtractionResult, RawMetadataSources, SiteAdapter, UnifiedMetadata } from \"./types/index.js\";\nimport { extractAudio, extractEmbeddedData, extractHtmlMetadata, extractImages, extractJsonLd, extractOEmbed, extractOpenGraph, extractTwitterCards, extractVideos, fetchOEmbedData } from \"./extractors/index.js\";\nimport { normalizeMetadata } from \"./normalizers/index.js\";\nimport { createRegistry } from \"./plugins/index.js\";\nimport { createEmptyDiagnostics, loadDocument } from \"./utils/html.js\";\nimport { resolveUrl } from \"./utils/url.js\";\nimport type { FetchMetadataOptions, ParseMetadataOptions } from \"./types/index.js\";\n\nexport function parseMetadata(html: string, url: string, options: ParseMetadataOptions = {}): UnifiedMetadata {\n const finalUrl = resolveUrl(url);\n const registry = createRegistry(options);\n const diagnostics = createEmptyDiagnostics();\n diagnostics.originalUrl = url;\n diagnostics.finalUrl = finalUrl;\n diagnostics.trace.push(\"validated and normalized URL\");\n const rawSources: RawMetadataSources = {\n html: extractHtmlMetadata(html),\n openGraph: extractOpenGraph(html),\n twitter: extractTwitterCards(html),\n jsonLd: extractJsonLd(html),\n embeddedData: extractEmbeddedData(html),\n oEmbed: extractOEmbed(html, finalUrl),\n images: extractImages(html, finalUrl),\n videos: extractVideos(html, finalUrl),\n audio: extractAudio(html, finalUrl),\n adapters: [],\n plugins: []\n };\n appendExtractionTrace(rawSources, diagnostics.trace);\n\n const $ = loadDocument(html);\n const fetchOptions = options as FetchMetadataOptions;\n\n if (fetchOptions.fetchOEmbed && rawSources.oEmbed.links.length > 0) {\n diagnostics.warnings.push(\"parseMetadata is synchronous; oEmbed endpoints are discovered but not fetched. Use fetchMetadata or parseMetadataAsync.\");\n }\n\n for (const extractor of registry.extractors) {\n try {\n const result = extractor.extract({ html, url, finalUrl, $, raw: rawSources, options });\n if (isPromise(result)) {\n diagnostics.warnings.push(`Plugin extractor \"${extractor.name}\" returned a Promise during parseMetadata; use fetchMetadata or pre-resolve async work.`);\n continue;\n }\n\n rawSources.plugins.push(withSource(result, extractor.name));\n diagnostics.trace.push(`plugin extractor matched: ${extractor.name}`);\n } catch (error) {\n diagnostics.warnings.push(`Plugin extractor \"${extractor.name}\" failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n const parsedUrl = new URL(finalUrl);\n for (const adapter of registry.adapters) {\n if (!adapterMatches(adapter, parsedUrl)) {\n continue;\n }\n\n try {\n const context: AdapterContext = { html, url, finalUrl, $, raw: rawSources, options };\n const result = adapter.extract(context);\n if (isPromise(result)) {\n diagnostics.warnings.push(`Adapter \"${adapter.name}\" returned a Promise during parseMetadata; use fetchMetadata or a synchronous adapter.`);\n continue;\n }\n\n const normalized = adapter.normalize?.(result as AdapterExtractionResult, context);\n if (normalized && isPromise(normalized)) {\n diagnostics.warnings.push(`Adapter \"${adapter.name}\" normalize returned a Promise during parseMetadata; use fetchMetadata or a synchronous adapter.`);\n continue;\n }\n\n rawSources.adapters.push(withSource(normalized ?? (result as AdapterExtractionResult), adapter.name));\n diagnostics.trace.push(`adapter matched: ${adapter.name}`);\n } catch (error) {\n diagnostics.warnings.push(`Adapter \"${adapter.name}\" failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return normalizeMetadata(rawSources, {\n url,\n finalUrl,\n diagnostics,\n imageScorers: registry.imageScorers,\n includeRaw: options.includeRaw\n });\n}\n\nexport async function parseMetadataAsync(html: string, url: string, options: ParseMetadataOptions = {}): Promise<UnifiedMetadata> {\n const finalUrl = resolveUrl(url);\n const registry = createRegistry(options);\n const diagnostics = createEmptyDiagnostics();\n diagnostics.originalUrl = url;\n diagnostics.finalUrl = finalUrl;\n diagnostics.trace.push(\"validated and normalized URL\");\n const rawSources: RawMetadataSources = {\n html: extractHtmlMetadata(html),\n openGraph: extractOpenGraph(html),\n twitter: extractTwitterCards(html),\n jsonLd: extractJsonLd(html),\n embeddedData: extractEmbeddedData(html),\n oEmbed: extractOEmbed(html, finalUrl),\n images: extractImages(html, finalUrl),\n videos: extractVideos(html, finalUrl),\n audio: extractAudio(html, finalUrl),\n adapters: [],\n plugins: []\n };\n appendExtractionTrace(rawSources, diagnostics.trace);\n const $ = loadDocument(html);\n const fetchOptions = options as FetchMetadataOptions;\n\n if (fetchOptions.fetchOEmbed && rawSources.oEmbed.links.length > 0) {\n const oEmbed = await fetchOEmbedData(rawSources.oEmbed.links, fetchOptions);\n rawSources.oEmbed.data = oEmbed.data;\n diagnostics.warnings.push(...oEmbed.warnings);\n diagnostics.trace.push(\"fetched discovered oEmbed JSON endpoints\");\n }\n\n for (const extractor of registry.extractors) {\n try {\n rawSources.plugins.push(withSource(await extractor.extract({ html, url, finalUrl, $, raw: rawSources, options }), extractor.name));\n diagnostics.trace.push(`plugin extractor matched: ${extractor.name}`);\n } catch (error) {\n diagnostics.warnings.push(`Plugin extractor \"${extractor.name}\" failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n const parsedUrl = new URL(finalUrl);\n for (const adapter of registry.adapters) {\n if (!adapterMatches(adapter, parsedUrl)) {\n continue;\n }\n\n try {\n const context: AdapterContext = { html, url, finalUrl, $, raw: rawSources, options };\n const result = await adapter.extract(context);\n const normalized = adapter.normalize ? await adapter.normalize(result as AdapterExtractionResult, context) : (result as AdapterExtractionResult);\n rawSources.adapters.push(withSource(normalized, adapter.name));\n diagnostics.trace.push(`adapter matched: ${adapter.name}`);\n } catch (error) {\n diagnostics.warnings.push(`Adapter \"${adapter.name}\" failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return normalizeMetadata(rawSources, {\n url,\n finalUrl,\n diagnostics,\n imageScorers: registry.imageScorers,\n includeRaw: options.includeRaw\n });\n}\n\nfunction withSource<T extends AdapterExtractionResult | PluginExtractionResult>(result: T, source: string): T {\n return {\n ...result,\n source: result.source || source\n };\n}\n\nfunction isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n return Boolean(value && typeof (value as Promise<T>).then === \"function\");\n}\n\nfunction adapterMatches(adapter: SiteAdapter, url: URL): boolean {\n return adapter.detect?.(url) ?? adapter.canHandle?.(url) ?? false;\n}\n\nfunction appendExtractionTrace(rawSources: RawMetadataSources, trace: string[]): void {\n if (Object.keys(rawSources.openGraph.raw).length > 0) {\n trace.push(\"parsed Open Graph\");\n }\n if (Object.keys(rawSources.twitter.raw).length > 0) {\n trace.push(\"parsed Twitter Cards\");\n }\n if (rawSources.jsonLd.nodes.length > 0) {\n trace.push(\"parsed JSON-LD\");\n }\n if (rawSources.embeddedData.items.length > 0) {\n trace.push(\"parsed embedded application data\");\n }\n if (rawSources.oEmbed.links.length > 0) {\n trace.push(\"discovered oEmbed endpoints\");\n }\n if (rawSources.images.length > 0 || rawSources.videos.length > 0 || rawSources.audio.length > 0) {\n trace.push(\"discovered HTML media candidates\");\n }\n}\n","export interface ImageDimensions {\n width?: number;\n height?: number;\n}\n\nexport function detectImageDimensions(bytes: Uint8Array | undefined, contentType?: string): ImageDimensions {\n if (!bytes || bytes.length < 16) {\n return {};\n }\n\n const type = contentType?.toLowerCase() ?? \"\";\n\n if (type.includes(\"png\") || isPng(bytes)) {\n return readPngDimensions(bytes);\n }\n\n if (type.includes(\"jpeg\") || type.includes(\"jpg\") || isJpeg(bytes)) {\n return readJpegDimensions(bytes);\n }\n\n if (type.includes(\"webp\") || isWebp(bytes)) {\n return readWebpDimensions(bytes);\n }\n\n return {};\n}\n\nfunction isPng(bytes: Uint8Array): boolean {\n return bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47;\n}\n\nfunction isJpeg(bytes: Uint8Array): boolean {\n return bytes[0] === 0xff && bytes[1] === 0xd8;\n}\n\nfunction isWebp(bytes: Uint8Array): boolean {\n return ascii(bytes, 0, 4) === \"RIFF\" && ascii(bytes, 8, 4) === \"WEBP\";\n}\n\nfunction readPngDimensions(bytes: Uint8Array): ImageDimensions {\n if (bytes.length < 24) {\n return {};\n }\n\n return {\n width: readUint32(bytes, 16),\n height: readUint32(bytes, 20)\n };\n}\n\nfunction readJpegDimensions(bytes: Uint8Array): ImageDimensions {\n let offset = 2;\n\n while (offset + 9 < bytes.length) {\n if (bytes[offset] !== 0xff) {\n offset += 1;\n continue;\n }\n\n const marker = bytes[offset + 1];\n const length = readUint16(bytes, offset + 2);\n if (length < 2) {\n return {};\n }\n\n if (marker >= 0xc0 && marker <= 0xcf && ![0xc4, 0xc8, 0xcc].includes(marker)) {\n return {\n height: readUint16(bytes, offset + 5),\n width: readUint16(bytes, offset + 7)\n };\n }\n\n offset += 2 + length;\n }\n\n return {};\n}\n\nfunction readWebpDimensions(bytes: Uint8Array): ImageDimensions {\n const chunk = ascii(bytes, 12, 4);\n\n if (chunk === \"VP8X\" && bytes.length >= 30) {\n return {\n width: 1 + readUint24Le(bytes, 24),\n height: 1 + readUint24Le(bytes, 27)\n };\n }\n\n if (chunk === \"VP8 \" && bytes.length >= 30) {\n return {\n width: readUint16Le(bytes, 26) & 0x3fff,\n height: readUint16Le(bytes, 28) & 0x3fff\n };\n }\n\n if (chunk === \"VP8L\" && bytes.length >= 25) {\n const b0 = bytes[21];\n const b1 = bytes[22];\n const b2 = bytes[23];\n const b3 = bytes[24];\n return {\n width: 1 + (((b1 & 0x3f) << 8) | b0),\n height: 1 + (((b3 & 0x0f) << 10) | (b2 << 2) | ((b1 & 0xc0) >> 6))\n };\n }\n\n return {};\n}\n\nfunction readUint16(bytes: Uint8Array, offset: number): number {\n return (bytes[offset] << 8) + bytes[offset + 1];\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n return bytes[offset] + (bytes[offset + 1] << 8);\n}\n\nfunction readUint24Le(bytes: Uint8Array, offset: number): number {\n return bytes[offset] + (bytes[offset + 1] << 8) + (bytes[offset + 2] << 16);\n}\n\nfunction readUint32(bytes: Uint8Array, offset: number): number {\n return ((bytes[offset] << 24) >>> 0) + (bytes[offset + 1] << 16) + (bytes[offset + 2] << 8) + bytes[offset + 3];\n}\n\nfunction ascii(bytes: Uint8Array, offset: number, length: number): string {\n return String.fromCharCode(...bytes.slice(offset, offset + length));\n}\n","import { fetchPage, type FetchedPage } from \"./fetcher/index.js\";\nimport { parseMetadataAsync } from \"./parse.js\";\nimport type { ExtractionFallbackAttempt, ExtractionRetryInfo, FetchMetadataOptions, MediaAsset, UnifiedMetadata } from \"./types/index.js\";\nimport { detectImageDimensions } from \"./utils/imageDimensions.js\";\nimport { normalizeUrl } from \"./utils/url.js\";\n\ninterface FetchStrategyResult {\n page: FetchedPage;\n fallbacksAttempted: ExtractionFallbackAttempt[];\n warnings: string[];\n trace: string[];\n sourcePriority?: string[];\n extractionMethod?: string;\n retryInfo?: ExtractionRetryInfo;\n}\n\ninterface RedditPostPayload {\n title?: string;\n description?: string;\n author?: string;\n createdAt?: string;\n canonicalUrl?: string;\n url?: string;\n images: MediaAsset[];\n videos: MediaAsset[];\n subreddit?: string;\n postId?: string;\n}\n\nexport async function fetchMetadata(url: string, options: FetchMetadataOptions = {}): Promise<UnifiedMetadata> {\n const startedAt = Date.now();\n\n try {\n const requestedUrl = normalizeUrl(url);\n const fetchResult = await fetchPageWithStrategies(requestedUrl, options);\n const page = fetchResult.page;\n const directMedia = createDirectMediaMetadata(page, requestedUrl, Date.now() - startedAt);\n if (directMedia) {\n return directMedia;\n }\n\n const metadata = await parseMetadataAsync(page.html, page.finalUrl, options);\n\n metadata.url = requestedUrl;\n metadata.finalUrl = page.finalUrl;\n metadata.ok = page.statusCode >= 200 && page.statusCode < 300;\n metadata.diagnostics.statusCode = page.statusCode;\n metadata.diagnostics.contentType = page.contentType;\n metadata.diagnostics.originalUrl = requestedUrl;\n metadata.diagnostics.finalUrl = page.finalUrl;\n metadata.diagnostics.canonicalUrl = metadata.canonicalUrl;\n metadata.diagnostics.isShortUrl = page.isShortUrl;\n metadata.diagnostics.shortUrlProvider = page.shortUrlProvider;\n metadata.diagnostics.redirects = page.redirects;\n metadata.diagnostics.fetchDurationMs = Date.now() - startedAt;\n metadata.diagnostics.trace = [\n ...(page.isShortUrl ? [`detected short URL provider: ${page.shortUrlProvider ?? \"unknown\"}`] : []),\n ...(page.redirects.length > 0 ? [`resolved ${page.redirects.length} redirect${page.redirects.length === 1 ? \"\" : \"s\"}`] : []),\n ...fetchResult.trace,\n \"downloaded page\",\n ...metadata.diagnostics.trace,\n ...(metadata.canonicalUrl ? [\"resolved canonical URL\"] : [])\n ];\n metadata.diagnostics.fallbacksAttempted = mergeFallbackAttempts(metadata.diagnostics.fallbacksAttempted, fetchResult.fallbacksAttempted);\n metadata.diagnostics.sourcePriority = uniqueStrings([...(metadata.diagnostics.sourcePriority ?? []), ...(fetchResult.sourcePriority ?? [])]);\n metadata.diagnostics.extractionMethod = metadata.diagnostics.extractionMethod ?? fetchResult.extractionMethod;\n metadata.diagnostics.retryInfo = metadata.diagnostics.retryInfo ?? fetchResult.retryInfo;\n metadata.trace = metadata.diagnostics.trace;\n metadata.diagnostics.warnings.push(...fetchResult.warnings);\n\n if (!metadata.ok) {\n metadata.diagnostics.warnings.push(`Fetch completed with non-success status code ${page.statusCode}.`);\n }\n\n if (page.contentType && !/html|xml|text/i.test(page.contentType)) {\n metadata.diagnostics.warnings.push(`Response content type may not contain parseable metadata: ${page.contentType}.`);\n }\n\n return metadata;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const safeUrl = safeNormalize(url);\n\n return {\n ok: false,\n url: safeUrl,\n finalUrl: safeUrl,\n type: \"unknown\",\n confidence: 0,\n completeness: 0,\n reliability: 0,\n images: [],\n videos: [],\n audio: [],\n favicons: [],\n trace: [\"fetch failed\"],\n diagnostics: {\n originalUrl: safeUrl,\n finalUrl: safeUrl,\n redirects: [],\n sourcesUsed: [],\n warnings: [],\n trace: [\"fetch failed\"],\n errors: [message],\n fetchDurationMs: Date.now() - startedAt,\n extractedAt: new Date().toISOString()\n }\n };\n }\n}\n\nasync function fetchPageWithStrategies(requestedUrl: string, options: FetchMetadataOptions): Promise<FetchStrategyResult> {\n if (isRedditUrl(requestedUrl)) {\n return fetchRedditPageWithStrategy(requestedUrl, options);\n }\n\n return {\n page: await fetchPage(requestedUrl, options),\n fallbacksAttempted: [],\n warnings: [],\n trace: []\n };\n}\n\nasync function fetchRedditPageWithStrategy(requestedUrl: string, options: FetchMetadataOptions): Promise<FetchStrategyResult> {\n const attempts: Array<ExtractionFallbackAttempt & { page?: FetchedPage }> = [];\n const warnings: string[] = [];\n const sourcePriority = [\"redditJsonEndpoint\", \"oldReddit\", \"embeddedStructuredData\", \"openGraph\", \"html\"];\n let lastError: unknown;\n\n const jsonUrl = redditJsonEndpoint(requestedUrl);\n if (jsonUrl) {\n const attempt = await attemptFetch(\"redditJsonEndpoint\", jsonUrl, {\n ...options,\n accept: \"application/json,text/html;q=0.8,*/*;q=0.5\"\n });\n attempts.push(attempt);\n lastError = attempt.error;\n\n if (attempt.page && attempt.ok && !attempt.blocked) {\n const redditPost = parseRedditJsonPayload(attempt.page.html);\n if (redditPost?.title) {\n return {\n page: synthesizeRedditJsonPage(attempt.page, requestedUrl, redditPost),\n fallbacksAttempted: attempts,\n warnings,\n trace: [\"used Reddit JSON endpoint\"],\n sourcePriority,\n extractionMethod: \"reddit:jsonEndpoint\",\n retryInfo: redditRetryInfo(attempts)\n };\n }\n\n warnings.push(\"Reddit JSON endpoint responded, but no post payload could be extracted.\");\n } else if (attempt.blocked) {\n warnings.push(\"Reddit JSON endpoint appears to have blocked access.\");\n }\n }\n\n const oldRedditUrl = redditOldUrl(requestedUrl);\n if (oldRedditUrl && oldRedditUrl !== requestedUrl) {\n const attempt = await attemptFetch(\"oldReddit\", oldRedditUrl, options);\n attempts.push(attempt);\n lastError = attempt.error;\n\n if (attempt.page && attempt.ok && !attempt.blocked) {\n return {\n page: attempt.page,\n fallbacksAttempted: attempts,\n warnings,\n trace: [\"retried Reddit page through old.reddit\"],\n sourcePriority,\n extractionMethod: \"reddit:oldReddit\",\n retryInfo: redditRetryInfo(attempts)\n };\n }\n\n if (attempt.blocked) {\n warnings.push(\"old.reddit fallback appears to have been blocked.\");\n }\n }\n\n const htmlAttempt = await attemptFetch(\"redditHtmlFallback\", requestedUrl, options);\n attempts.push(htmlAttempt);\n lastError = htmlAttempt.error;\n\n if (htmlAttempt.page) {\n if (htmlAttempt.blocked) {\n warnings.push(\"Reddit HTML fallback appears to have been blocked; metadata may be incomplete.\");\n }\n\n return {\n page: htmlAttempt.page,\n fallbacksAttempted: attempts,\n warnings,\n trace: [\"used Reddit HTML fallback\"],\n sourcePriority,\n extractionMethod: \"reddit:htmlFallback\",\n retryInfo: redditRetryInfo(attempts)\n };\n }\n\n throw lastError ?? new Error(\"All Reddit extraction fetch attempts failed.\");\n}\n\nasync function attemptFetch(\n method: string,\n url: string,\n options: FetchMetadataOptions\n): Promise<ExtractionFallbackAttempt & { page?: FetchedPage }> {\n try {\n const page = await fetchPage(url, options);\n const retryAfter = page.headers[\"retry-after\"];\n const blocked = isRedditBlocked(page);\n\n return {\n method,\n url,\n ok: page.statusCode >= 200 && page.statusCode < 300 && !blocked,\n statusCode: page.statusCode,\n blocked,\n retryAfter,\n page\n };\n } catch (error) {\n return {\n method,\n url,\n ok: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nfunction isRedditUrl(url: string): boolean {\n try {\n const host = new URL(url).hostname.toLowerCase().replace(/^www\\./, \"\");\n return host === \"reddit.com\" || host === \"redd.it\" || host.endsWith(\".reddit.com\");\n } catch {\n return false;\n }\n}\n\nfunction redditJsonEndpoint(url: string): string | undefined {\n try {\n const parsed = new URL(url);\n const host = parsed.hostname.toLowerCase().replace(/^www\\./, \"\");\n const endpoint = new URL(url);\n endpoint.protocol = \"https:\";\n endpoint.hostname = \"www.reddit.com\";\n endpoint.search = \"\";\n\n if (host === \"redd.it\") {\n const postId = parsed.pathname.split(\"/\").filter(Boolean)[0];\n if (!postId) {\n return undefined;\n }\n endpoint.pathname = `/comments/${postId}.json`;\n } else {\n endpoint.pathname = parsed.pathname.endsWith(\".json\")\n ? parsed.pathname\n : `${parsed.pathname.endsWith(\"/\") ? parsed.pathname : `${parsed.pathname}/`}.json`;\n }\n\n endpoint.searchParams.set(\"raw_json\", \"1\");\n return endpoint.toString();\n } catch {\n return undefined;\n }\n}\n\nfunction redditOldUrl(url: string): string | undefined {\n try {\n const parsed = new URL(url);\n const host = parsed.hostname.toLowerCase().replace(/^www\\./, \"\");\n parsed.protocol = \"https:\";\n parsed.hostname = \"old.reddit.com\";\n parsed.search = \"\";\n\n if (host === \"redd.it\") {\n const postId = parsed.pathname.split(\"/\").filter(Boolean)[0];\n if (!postId) {\n return undefined;\n }\n parsed.pathname = `/comments/${postId}/`;\n }\n\n return parsed.toString();\n } catch {\n return undefined;\n }\n}\n\nfunction parseRedditJsonPayload(source: string): RedditPostPayload | undefined {\n try {\n const parsed = JSON.parse(source) as unknown;\n const post = findRedditPostRecord(parsed);\n if (!post) {\n return undefined;\n }\n\n const createdUtc = numberFromUnknown(post.created_utc);\n const permalink = stringFromUnknown(post.permalink);\n const canonicalUrl = permalink ? `https://www.reddit.com${permalink.startsWith(\"/\") ? permalink : `/${permalink}`}` : undefined;\n const images = redditImagesFromPost(post);\n const videos = redditVideosFromPost(post);\n const description = firstText(\n stringFromUnknown(post.selftext),\n stringFromUnknown(post.selftext_html),\n stringFromUnknown(post.url_overridden_by_dest)\n );\n\n return {\n title: stringFromUnknown(post.title),\n description,\n author: stringFromUnknown(post.author) ?? stringFromUnknown(post.author_fullname),\n createdAt: createdUtc ? new Date(createdUtc * 1000).toISOString() : undefined,\n canonicalUrl,\n url: stringFromUnknown(post.url_overridden_by_dest) ?? stringFromUnknown(post.url),\n images,\n videos,\n subreddit: stringFromUnknown(post.subreddit_name_prefixed) ?? stringFromUnknown(post.subreddit),\n postId: stringFromUnknown(post.id)\n };\n } catch {\n return undefined;\n }\n}\n\nfunction findRedditPostRecord(value: unknown): Record<string, unknown> | undefined {\n if (Array.isArray(value)) {\n for (const item of value) {\n const found = findRedditPostRecord(item);\n if (found) {\n return found;\n }\n }\n return undefined;\n }\n\n if (!isRecord(value)) {\n return undefined;\n }\n\n if (typeof value.title === \"string\" && (typeof value.id === \"string\" || typeof value.name === \"string\")) {\n return value;\n }\n\n const children = isRecord(value.data) && Array.isArray(value.data.children) ? value.data.children : undefined;\n if (children) {\n for (const child of children) {\n if (isRecord(child) && isRecord(child.data) && (child.kind === \"t3\" || typeof child.data.title === \"string\")) {\n return child.data;\n }\n }\n }\n\n for (const childValue of Object.values(value).slice(0, 100)) {\n const found = findRedditPostRecord(childValue);\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction redditImagesFromPost(post: Record<string, unknown>): MediaAsset[] {\n const images: MediaAsset[] = [];\n const preview = isRecord(post.preview) && Array.isArray(post.preview.images) ? post.preview.images : [];\n\n for (const image of preview) {\n if (!isRecord(image)) {\n continue;\n }\n\n for (const candidate of [image.source, ...(Array.isArray(image.resolutions) ? image.resolutions : [])]) {\n if (!isRecord(candidate)) {\n continue;\n }\n\n const url = redditMediaUrl(stringFromUnknown(candidate.url));\n if (!url) {\n continue;\n }\n\n images.push({\n url,\n kind: \"image\",\n source: \"adapter\",\n width: numberFromUnknown(candidate.width),\n height: numberFromUnknown(candidate.height),\n metadata: {\n adapter: \"redditJsonEndpoint\",\n originalSource: \"redditJsonEndpoint\"\n }\n });\n }\n }\n\n const thumbnail = redditMediaUrl(stringFromUnknown(post.thumbnail));\n if (thumbnail && /^https?:\\/\\//i.test(thumbnail)) {\n images.push({\n url: thumbnail,\n kind: \"image\",\n source: \"adapter\",\n metadata: {\n adapter: \"redditJsonEndpoint\",\n originalSource: \"redditJsonEndpoint\"\n }\n });\n }\n\n return images;\n}\n\nfunction redditVideosFromPost(post: Record<string, unknown>): MediaAsset[] {\n const videos: MediaAsset[] = [];\n const media = [post.media, post.secure_media].filter(isRecord);\n\n for (const item of media) {\n const redditVideo = isRecord(item.reddit_video) ? item.reddit_video : undefined;\n const url = redditMediaUrl(stringFromUnknown(redditVideo?.fallback_url) ?? stringFromUnknown(redditVideo?.hls_url) ?? stringFromUnknown(redditVideo?.dash_url));\n if (!url) {\n continue;\n }\n\n videos.push({\n url,\n kind: \"video\",\n source: \"adapter\",\n width: numberFromUnknown(redditVideo?.width),\n height: numberFromUnknown(redditVideo?.height),\n metadata: {\n adapter: \"redditJsonEndpoint\",\n originalSource: \"redditJsonEndpoint\"\n }\n });\n }\n\n return videos;\n}\n\nfunction synthesizeRedditJsonPage(jsonPage: FetchedPage, requestedUrl: string, post: RedditPostPayload): FetchedPage {\n const finalUrl = post.canonicalUrl ?? requestedUrl;\n const bestImage = post.images.sort((left, right) => ((right.width ?? 0) * (right.height ?? 0)) - ((left.width ?? 0) * (left.height ?? 0)))[0];\n const video = post.videos[0];\n const structuredData = {\n \"@context\": \"https://schema.org\",\n \"@type\": \"SocialMediaPosting\",\n headline: post.title,\n description: post.description,\n author: post.author ? { \"@type\": \"Person\", name: post.author } : undefined,\n datePublished: post.createdAt,\n url: finalUrl,\n image: bestImage ? { \"@type\": \"ImageObject\", url: bestImage.url, width: bestImage.width, height: bestImage.height } : undefined,\n video: video ? { \"@type\": \"VideoObject\", contentUrl: video.url, width: video.width, height: video.height } : undefined\n };\n const embeddedPayload = {\n post: {\n postTitle: post.title,\n description: post.description,\n author: post.author ? { name: post.author } : undefined,\n createdAt: post.createdAt,\n canonicalUrl: finalUrl,\n previewImage: bestImage,\n media: {\n videoUrl: video?.url\n },\n images: post.images,\n videos: post.videos,\n subreddit: post.subreddit,\n postId: post.postId\n }\n };\n const html = [\n \"<!doctype html><html><head>\",\n `<title>${escapeHtml(post.title ?? \"Reddit post\")}</title>`,\n post.title ? `<meta property=\"og:title\" content=\"${escapeHtml(post.title)}\">` : \"\",\n post.description ? `<meta property=\"og:description\" content=\"${escapeHtml(post.description)}\">` : \"\",\n `<meta property=\"og:site_name\" content=\"Reddit\">`,\n `<meta property=\"og:url\" content=\"${escapeHtml(finalUrl)}\">`,\n bestImage ? `<meta property=\"og:image\" content=\"${escapeHtml(bestImage.url)}\">` : \"\",\n bestImage?.width ? `<meta property=\"og:image:width\" content=\"${bestImage.width}\">` : \"\",\n bestImage?.height ? `<meta property=\"og:image:height\" content=\"${bestImage.height}\">` : \"\",\n `<link rel=\"canonical\" href=\"${escapeHtml(finalUrl)}\">`,\n `<script type=\"application/ld+json\">${safeJson(structuredData)}</script>`,\n `<script type=\"application/json\" id=\"metanova-reddit-json\">${safeJson(embeddedPayload)}</script>`,\n \"</head><body></body></html>\"\n ].join(\"\");\n\n return {\n ...jsonPage,\n url: requestedUrl,\n originalUrl: requestedUrl,\n finalUrl,\n html,\n bytes: new TextEncoder().encode(html),\n contentType: \"text/html; charset=utf-8\",\n statusCode: jsonPage.statusCode\n };\n}\n\nfunction isRedditBlocked(page: FetchedPage): boolean {\n return (\n page.statusCode === 403 ||\n page.statusCode === 429 ||\n /please wait for verification|whoa there, pardner|blocked|forbidden|too many requests|request has been blocked/i.test(page.html)\n );\n}\n\nfunction redditRetryInfo(attempts: ExtractionFallbackAttempt[]): ExtractionRetryInfo | undefined {\n const blockedAttempts = attempts.filter((attempt) => attempt.blocked || attempt.statusCode === 429 || attempt.statusCode === 403);\n if (blockedAttempts.length === 0) {\n return undefined;\n }\n\n const retryAfter = blockedAttempts.map((attempt) => attempt.retryAfter).find((value): value is string => Boolean(value));\n return {\n retryable: blockedAttempts.some((attempt) => attempt.statusCode === 429 || Boolean(attempt.retryAfter)),\n reason: blockedAttempts.map((attempt) => `${attempt.method}${attempt.statusCode ? ` returned ${attempt.statusCode}` : \" failed\"}`).join(\"; \"),\n retryAfter,\n retryAfterMs: retryAfterToMs(retryAfter),\n attempts: attempts.length\n };\n}\n\nfunction retryAfterToMs(value: string | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const seconds = Number.parseInt(value, 10);\n if (Number.isFinite(seconds)) {\n return seconds * 1000;\n }\n\n const dateMs = Date.parse(value);\n return Number.isFinite(dateMs) ? Math.max(dateMs - Date.now(), 0) : undefined;\n}\n\nfunction mergeFallbackAttempts(\n existing: ExtractionFallbackAttempt[] | undefined,\n incoming: ExtractionFallbackAttempt[]\n): ExtractionFallbackAttempt[] | undefined {\n const attempts = [...(existing ?? []), ...incoming];\n if (attempts.length === 0) {\n return undefined;\n }\n\n const seen = new Set<string>();\n return attempts.map((value) => {\n const { page: _page, ...attempt } = value as ExtractionFallbackAttempt & { page?: FetchedPage };\n return attempt;\n }).filter((attempt) => {\n const key = `${attempt.method}:${attempt.url ?? \"\"}:${attempt.statusCode ?? \"\"}:${attempt.error ?? \"\"}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n}\n\nfunction uniqueStrings(values: Array<string | undefined>): string[] {\n return [...new Set(values.filter((value): value is string => Boolean(value)))];\n}\n\nfunction redditMediaUrl(value: string | undefined): string | undefined {\n return value?.replace(/&amp;/g, \"&\");\n}\n\nfunction firstText(...values: Array<string | undefined>): string | undefined {\n return values.map((value) => value?.replace(/\\s+/g, \" \").trim()).find((value): value is string => Boolean(value));\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n\n return undefined;\n}\n\nfunction numberFromUnknown(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction safeJson(value: unknown): string {\n return JSON.stringify(stripUndefinedDeep(value)).replace(/</g, \"\\\\u003c\");\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction stripUndefinedDeep(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stripUndefinedDeep).filter((item) => item !== undefined);\n }\n\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value)\n .map(([key, item]) => [key, stripUndefinedDeep(item)] as const)\n .filter(([, item]) => item !== undefined && item !== null && (!Array.isArray(item) || item.length > 0))\n );\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction createDirectMediaMetadata(\n page: Awaited<ReturnType<typeof fetchPage>>,\n requestedUrl: string,\n fetchDurationMs: number\n): UnifiedMetadata | undefined {\n const contentType = page.contentType?.toLowerCase() ?? \"\";\n const kind = directMediaKind(contentType, page.finalUrl);\n if (!kind) {\n return undefined;\n }\n\n const dimensions =\n kind === \"image\"\n ? {\n ...imageDimensionsFromUrl(page.finalUrl),\n ...detectImageDimensions(page.bytes, page.contentType)\n }\n : {};\n const asset: MediaAsset = {\n url: page.finalUrl,\n kind,\n source: \"direct\",\n type: page.contentType,\n width: dimensions.width,\n height: dimensions.height,\n score: kind === \"image\" ? 90 : undefined,\n confidence: kind === \"image\" ? 0.9 : undefined\n };\n\n const confidence = kind === \"image\" ? 82 : 70;\n const completeness = kind === \"image\" ? (dimensions.width && dimensions.height ? 60 : 45) : 35;\n\n const trace = [\n ...(page.redirects.length > 0 ? [`resolved ${page.redirects.length} redirect${page.redirects.length === 1 ? \"\" : \"s\"}`] : []),\n \"downloaded direct media\",\n `detected direct ${kind}`\n ];\n\n return {\n ok: page.statusCode >= 200 && page.statusCode < 300,\n url: requestedUrl,\n finalUrl: page.finalUrl,\n type: kind === \"image\" ? \"image\" : kind,\n confidence,\n completeness,\n reliability: Math.round((confidence + completeness) / 2),\n bestImage: kind === \"image\" ? page.finalUrl : undefined,\n images: kind === \"image\" ? [asset] : [],\n videos: kind === \"video\" ? [asset] : [],\n audio: kind === \"audio\" ? [asset] : [],\n favicons: [],\n trace,\n sources: {\n image: kind === \"image\" ? \"direct\" : undefined\n },\n diagnostics: {\n originalUrl: requestedUrl,\n finalUrl: page.finalUrl,\n isShortUrl: page.isShortUrl,\n shortUrlProvider: page.shortUrlProvider,\n statusCode: page.statusCode,\n contentType: page.contentType,\n redirects: page.redirects,\n sourcesUsed: [\"direct\"],\n warnings: [],\n trace,\n extractionMethod: `direct:${kind}`,\n selectedImageReason: kind === \"image\" ? \"Selected direct image URL because the response content type is an image.\" : undefined,\n confidenceBreakdown: {\n title: 0,\n description: 0,\n image: kind === \"image\" ? 100 : 0,\n structuredData: 0,\n adapter: 0\n },\n fetchDurationMs,\n extractedAt: new Date().toISOString()\n }\n };\n}\n\nfunction imageDimensionsFromUrl(url: string): { width?: number; height?: number } {\n try {\n const parsed = new URL(url);\n const width = parseDimension(parsed.searchParams.get(\"width\") ?? parsed.searchParams.get(\"w\"));\n const height = parseDimension(parsed.searchParams.get(\"height\") ?? parsed.searchParams.get(\"h\"));\n if (width && height) {\n return { width, height };\n }\n\n const crop = parsed.searchParams.get(\"crop\");\n const cropMatch = crop?.match(/(\\d{2,5})\\s*:\\s*(\\d{2,5})/);\n if (cropMatch) {\n return { width: Number(cropMatch[1]), height: Number(cropMatch[2]) };\n }\n } catch {\n return {};\n }\n\n return {};\n}\n\nfunction parseDimension(value: string | null): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction directMediaKind(contentType: string, url: string): \"image\" | \"video\" | \"audio\" | undefined {\n const normalizedUrl = url.toLowerCase();\n\n if (contentType.startsWith(\"image/\") || /\\.(?:avif|webp|png|jpe?g|gif)(?:[?#].*)?$/i.test(normalizedUrl)) {\n return \"image\";\n }\n\n if (contentType.startsWith(\"video/\") || /\\.(?:mp4|webm|m3u8|mov)(?:[?#].*)?$/i.test(normalizedUrl)) {\n return \"video\";\n }\n\n if (contentType.startsWith(\"audio/\") || /\\.(?:mp3|m4a|wav|ogg|aac)(?:[?#].*)?$/i.test(normalizedUrl)) {\n return \"audio\";\n }\n\n return undefined;\n}\n\nfunction safeNormalize(url: string): string {\n try {\n return normalizeUrl(url);\n } catch {\n return url;\n }\n}\n","import type { PreviewCard, UnifiedMetadata } from \"./types/index.js\";\n\nexport function createPreviewCard(metadata: UnifiedMetadata): PreviewCard {\n return {\n title: metadata.title,\n description: metadata.description,\n image: metadata.bestImage,\n url: metadata.canonicalUrl ?? metadata.finalUrl,\n siteName: metadata.siteName,\n domain: domainFromUrl(metadata.canonicalUrl ?? metadata.finalUrl),\n author: metadata.author?.name,\n type: metadata.type,\n confidence: metadata.confidence\n };\n}\n\nfunction domainFromUrl(url: string): string | undefined {\n try {\n return new URL(url).hostname.replace(/^www\\./, \"\");\n } catch {\n return undefined;\n }\n}\n","import { fetchMetadata } from \"./fetchMetadata.js\";\nimport { parseMetadata, parseMetadataAsync } from \"./parse.js\";\nimport { registerGlobalPlugin } from \"./plugins/index.js\";\nimport { createPreviewCard } from \"./preview.js\";\nimport type { FetchMetadataOptions, MetaNovaPlugin, ParseMetadataOptions, UnifiedMetadata } from \"./types/index.js\";\n\nexport interface MetaNovaRuntime {\n use(plugin: MetaNovaPlugin): MetaNovaRuntime;\n fetchMetadata(url: string, options?: FetchMetadataOptions): Promise<UnifiedMetadata>;\n parseMetadata(html: string, url: string, options?: ParseMetadataOptions): UnifiedMetadata;\n parseMetadataAsync(html: string, url: string, options?: ParseMetadataOptions): Promise<UnifiedMetadata>;\n createPreviewCard: typeof createPreviewCard;\n}\n\nexport const MetaNova: MetaNovaRuntime = {\n use(plugin) {\n registerGlobalPlugin(plugin);\n return MetaNova;\n },\n fetchMetadata,\n parseMetadata,\n parseMetadataAsync,\n createPreviewCard\n};\n","import type { ExtractionDiagnostics } from \"../types/index.js\";\n\nexport function createDiagnostics(): ExtractionDiagnostics {\n return {\n redirects: [],\n sourcesUsed: [],\n warnings: [],\n trace: [],\n extractedAt: new Date().toISOString()\n };\n}\n\nexport function addWarning(diagnostics: ExtractionDiagnostics, warning: string): ExtractionDiagnostics {\n diagnostics.warnings.push(warning);\n return diagnostics;\n}\n"],"mappings":"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","names":["net","import_node_net","net","isRecord","_","headersToObject","readMetaKey","firstRaw","allRaw","shouldIgnoreMediaUrl","isRecord","url","mediaSignature","clamp","normalizeAssets","uniqueStrings","sourceLabel","stripUndefined","stringFromUnknown","entity","hasJsonLdType","stringFromUnknown","isRecord","findValueByKeys","arrayOfStrings","mergeFallbackAttempts","uniqueStrings","numberFromUnknown","stringFromUnknown","firstText","isRecord"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/url.ts","../src/fetcher/security.ts","../src/fetcher/fetcher.ts","../src/utils/html.ts","../src/extractors/html.ts","../src/extractors/embeddedData.ts","../src/extractors/jsonLd.ts","../src/extractors/media.ts","../src/extractors/oEmbed.ts","../src/extractors/openGraph.ts","../src/extractors/twitter.ts","../src/utils/redditMedia.ts","../src/scorers/image.ts","../src/media/MediaDiscoveryEngine.ts","../src/engines/ConfidenceEngine.ts","../src/normalizers/normalize.ts","../src/adapters/siteAdapters.ts","../src/plugins/registry.ts","../src/parse.ts","../src/utils/imageDimensions.ts","../src/fetchMetadata.ts","../src/preview.ts","../src/core.ts","../src/diagnostics/index.ts"],"sourcesContent":["import { MetaNova } from \"./core.js\";\n\nexport { MetaNova } from \"./core.js\";\nexport { fetchMetadata } from \"./fetchMetadata.js\";\nexport { parseMetadata, parseMetadataAsync } from \"./parse.js\";\nexport { createPreviewCard } from \"./preview.js\";\nexport { detectShortUrl, normalizeUrl, resolveCanonicalUrl, resolveUrl, validateUrl } from \"./utils/url.js\";\nexport { normalizeMetadata } from \"./normalizers/index.js\";\nexport { scoreImages } from \"./scorers/index.js\";\nexport * from \"./engines/index.js\";\nexport * from \"./media/index.js\";\nexport {\n extractAudio,\n extractEmbeddedData,\n extractHtmlMetadata,\n extractImages,\n extractJsonLd,\n extractOEmbed,\n extractOpenGraph,\n extractTwitterCards,\n extractVideos\n} from \"./extractors/index.js\";\nexport * from \"./adapters/index.js\";\nexport * from \"./diagnostics/index.js\";\nexport * from \"./fetcher/index.js\";\nexport * from \"./plugins/index.js\";\nexport type * from \"./types/index.js\";\nexport default MetaNova;\n","import net from \"node:net\";\n\nexport interface ValidateUrlOptions {\n allowedProtocols?: string[];\n}\n\nexport interface ShortUrlInfo {\n isShortUrl: boolean;\n provider?: string;\n}\n\nconst SHORT_URL_HOSTS: Record<string, string> = {\n \"pin.it\": \"Pinterest\",\n \"redd.it\": \"Reddit\",\n \"t.co\": \"X\",\n \"bit.ly\": \"Bitly\",\n \"tinyurl.com\": \"TinyURL\",\n \"youtu.be\": \"YouTube\"\n};\n\nexport function validateUrl(input: string, options: ValidateUrlOptions = {}): URL {\n const url = new URL(input);\n const allowedProtocols = options.allowedProtocols ?? [\"http:\", \"https:\"];\n\n if (!allowedProtocols.includes(url.protocol)) {\n throw new TypeError(`Unsupported URL protocol: ${url.protocol}`);\n }\n\n return url;\n}\n\nexport function resolveUrl(url: string, baseUrl?: string): string {\n const resolved = baseUrl ? new URL(url, baseUrl) : new URL(url);\n return normalizeUrl(resolved.toString());\n}\n\nexport function tryResolveUrl(url: string | undefined, baseUrl?: string): string | undefined {\n if (!url) {\n return undefined;\n }\n\n try {\n return resolveUrl(url, baseUrl);\n } catch {\n return undefined;\n }\n}\n\nexport function normalizeUrl(input: string, options: ValidateUrlOptions = {}): string {\n const url = validateUrl(input, options);\n url.hash = \"\";\n url.hostname = url.hostname.toLowerCase();\n\n if ((url.protocol === \"http:\" && url.port === \"80\") || (url.protocol === \"https:\" && url.port === \"443\")) {\n url.port = \"\";\n }\n\n return url.toString();\n}\n\nexport function detectShortUrl(input: string | URL): ShortUrlInfo {\n const url = typeof input === \"string\" ? validateUrl(input) : input;\n const hostname = url.hostname.toLowerCase().replace(/^www\\./, \"\");\n const provider = SHORT_URL_HOSTS[hostname];\n\n return {\n isShortUrl: Boolean(provider),\n provider\n };\n}\n\nexport function resolveCanonicalUrl(canonicalUrl: string | undefined, baseUrl: string): string | undefined {\n return tryResolveUrl(canonicalUrl, baseUrl);\n}\n\nexport function isLocalHostname(hostname: string): boolean {\n const normalized = hostname.toLowerCase().replace(/\\.$/, \"\");\n return normalized === \"localhost\" || normalized.endsWith(\".localhost\");\n}\n\nexport function classifyIp(address: string): \"public\" | \"loopback\" | \"private\" | \"linkLocal\" | \"reserved\" {\n const ipVersion = net.isIP(address);\n\n if (ipVersion === 4) {\n return classifyIpv4(address);\n }\n\n if (ipVersion === 6) {\n return classifyIpv6(address);\n }\n\n return \"public\";\n}\n\nfunction classifyIpv4(address: string): \"public\" | \"loopback\" | \"private\" | \"linkLocal\" | \"reserved\" {\n const parts = address.split(\".\").map((part) => Number.parseInt(part, 10));\n const [a, b] = parts;\n\n if (a === 127) {\n return \"loopback\";\n }\n\n if (a === 10 || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168)) {\n return \"private\";\n }\n\n if (a === 169 && b === 254) {\n return \"linkLocal\";\n }\n\n if (\n a === 0 ||\n a >= 224 ||\n (a === 100 && b >= 64 && b <= 127) ||\n (a === 192 && b === 0) ||\n (a === 198 && (b === 18 || b === 19))\n ) {\n return \"reserved\";\n }\n\n return \"public\";\n}\n\nfunction classifyIpv6(address: string): \"public\" | \"loopback\" | \"private\" | \"linkLocal\" | \"reserved\" {\n const normalized = address.toLowerCase();\n\n if (normalized === \"::1\" || normalized === \"0:0:0:0:0:0:0:1\") {\n return \"loopback\";\n }\n\n if (normalized.startsWith(\"fc\") || normalized.startsWith(\"fd\")) {\n return \"private\";\n }\n\n if (normalized.startsWith(\"fe8\") || normalized.startsWith(\"fe9\") || normalized.startsWith(\"fea\") || normalized.startsWith(\"feb\")) {\n return \"linkLocal\";\n }\n\n if (normalized === \"::\" || normalized.startsWith(\"::ffff:127.\") || normalized.startsWith(\"::ffff:10.\")) {\n return \"reserved\";\n }\n\n return \"public\";\n}\n","import { lookup } from \"node:dns/promises\";\nimport net from \"node:net\";\nimport type { FetchMetadataOptions } from \"../types/index.js\";\nimport { classifyIp, isLocalHostname, normalizeUrl } from \"../utils/url.js\";\n\nexport class SecurityError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SecurityError\";\n }\n}\n\nexport async function assertSafeRequestUrl(input: string, options: FetchMetadataOptions = {}): Promise<string> {\n const protocols = options.allowedProtocols ?? [\"http:\", \"https:\"];\n let normalizedUrl: string;\n\n try {\n normalizedUrl = normalizeUrl(input, { allowedProtocols: protocols });\n } catch (error) {\n if (error instanceof TypeError) {\n throw new SecurityError(error.message);\n }\n\n throw error;\n }\n\n const url = new URL(normalizedUrl);\n\n if (!protocols.includes(url.protocol)) {\n throw new SecurityError(`Unsupported URL protocol: ${url.protocol}`);\n }\n\n const hostname = url.hostname;\n\n if (isLocalHostname(hostname) && !options.allowLocalhost) {\n throw new SecurityError(\"Localhost URLs are blocked by default.\");\n }\n\n const literalIp = net.isIP(hostname) ? hostname : undefined;\n if (literalIp) {\n assertPublicAddressAllowed(literalIp, options);\n return url.toString();\n }\n\n if (options.allowPrivateNetwork && options.allowLocalhost) {\n return url.toString();\n }\n\n const records = await lookup(hostname, { all: true, verbatim: false });\n for (const record of records) {\n assertPublicAddressAllowed(record.address, options);\n }\n\n return url.toString();\n}\n\nfunction assertPublicAddressAllowed(address: string, options: FetchMetadataOptions): void {\n const classification = classifyIp(address);\n\n if (classification === \"loopback\" && !options.allowLocalhost) {\n throw new SecurityError(`Loopback address is blocked: ${address}`);\n }\n\n if (classification !== \"public\" && classification !== \"loopback\" && !options.allowPrivateNetwork) {\n throw new SecurityError(`Private or reserved network address is blocked: ${address}`);\n }\n}\n","import type { FetchMetadataOptions, MetaNovaCacheEntry, RedirectEntry } from \"../types/index.js\";\nimport { detectShortUrl, normalizeUrl, resolveUrl } from \"../utils/url.js\";\nimport { assertSafeRequestUrl } from \"./security.js\";\n\nconst DEFAULT_TIMEOUT_MS = 8_000;\nconst DEFAULT_MAX_REDIRECTS = 5;\nconst DEFAULT_MAX_BYTES = 2_000_000;\nexport const DEFAULT_BROWSER_USER_AGENT =\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36\";\nexport const DEFAULT_ACCEPT =\n \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\";\nexport const DEFAULT_ACCEPT_LANGUAGE = \"en-US,en;q=0.9\";\nexport const DEFAULT_ACCEPT_ENCODING = \"gzip, deflate, br\";\n\nexport interface FetchedPage {\n url: string;\n originalUrl: string;\n finalUrl: string;\n isShortUrl: boolean;\n shortUrlProvider?: string;\n html: string;\n bytes?: Uint8Array;\n statusCode: number;\n contentType?: string;\n redirects: RedirectEntry[];\n headers: Record<string, string>;\n}\n\nexport async function fetchPage(inputUrl: string, options: FetchMetadataOptions = {}): Promise<FetchedPage> {\n const startUrl = normalizeUrl(inputUrl);\n const cached = await options.cache?.get(startUrl);\n\n if (cached) {\n return fromCache(startUrl, cached);\n }\n\n const retries = options.retries ?? 1;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n try {\n const page = await requestWithRedirects(startUrl, options);\n await options.cache?.set(startUrl, {\n html: page.html,\n finalUrl: page.finalUrl,\n statusCode: page.statusCode,\n contentType: page.contentType,\n redirects: page.redirects\n });\n return page;\n } catch (error) {\n lastError = error;\n if (attempt < retries) {\n await delay(options.retryDelayMs ?? 250);\n }\n }\n }\n\n throw lastError;\n}\n\nexport interface RedirectResolution {\n originalUrl: string;\n finalUrl: string;\n redirects: RedirectEntry[];\n isShortUrl: boolean;\n shortUrlProvider?: string;\n}\n\nexport async function resolveRedirects(inputUrl: string, options: FetchMetadataOptions = {}): Promise<RedirectResolution> {\n const originalUrl = normalizeUrl(inputUrl);\n const maxRedirects = options.maxRedirects ?? DEFAULT_MAX_REDIRECTS;\n const fetchImpl = options.fetch ?? fetch;\n const redirects: RedirectEntry[] = [];\n let currentUrl = await assertSafeRequestUrl(originalUrl, options);\n\n for (let redirectCount = 0; redirectCount <= maxRedirects; redirectCount += 1) {\n const response = await requestOnce(fetchImpl, currentUrl, options);\n const statusCode = response.status;\n\n if (!isRedirect(statusCode)) {\n const shortUrl = detectShortUrl(originalUrl);\n return {\n originalUrl,\n finalUrl: currentUrl,\n redirects,\n isShortUrl: shortUrl.isShortUrl,\n shortUrlProvider: shortUrl.provider\n };\n }\n\n const location = response.headers.get(\"location\");\n if (!location) {\n throw new Error(`Redirect response from ${currentUrl} did not include a Location header.`);\n }\n\n const nextUrl = await assertSafeRequestUrl(resolveUrl(location, currentUrl), options);\n redirects.push({ from: currentUrl, to: nextUrl, statusCode });\n currentUrl = nextUrl;\n }\n\n throw new Error(`Too many redirects. Maximum allowed redirects: ${maxRedirects}.`);\n}\n\nasync function requestWithRedirects(inputUrl: string, options: FetchMetadataOptions): Promise<FetchedPage> {\n const fetchImpl = options.fetch ?? fetch;\n const maxRedirects = options.maxRedirects ?? DEFAULT_MAX_REDIRECTS;\n const redirects: RedirectEntry[] = [];\n const shortUrl = detectShortUrl(inputUrl);\n let currentUrl = await assertSafeRequestUrl(inputUrl, options);\n\n for (let redirectCount = 0; redirectCount <= maxRedirects; redirectCount += 1) {\n const response = await requestOnce(fetchImpl, currentUrl, options);\n const statusCode = response.status;\n\n if (isRedirect(statusCode)) {\n const location = response.headers.get(\"location\");\n if (!location) {\n throw new Error(`Redirect response from ${currentUrl} did not include a Location header.`);\n }\n\n const nextUrl = await assertSafeRequestUrl(resolveUrl(location, currentUrl), options);\n redirects.push({ from: currentUrl, to: nextUrl, statusCode });\n currentUrl = nextUrl;\n continue;\n }\n\n const headers = headersToRecord(response.headers);\n const body = await readLimitedBody(response, options.maxBytes ?? DEFAULT_MAX_BYTES);\n\n return {\n url: inputUrl,\n originalUrl: inputUrl,\n finalUrl: currentUrl,\n isShortUrl: shortUrl.isShortUrl,\n shortUrlProvider: shortUrl.provider,\n html: body.text,\n bytes: body.bytes,\n statusCode,\n contentType: response.headers.get(\"content-type\") ?? undefined,\n redirects,\n headers\n };\n }\n\n throw new Error(`Too many redirects. Maximum allowed redirects: ${maxRedirects}.`);\n}\n\nasync function requestOnce(fetchImpl: typeof fetch, url: string, options: FetchMetadataOptions): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(new Error(\"Request timed out.\")), options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n const externalSignal = options.signal;\n const abortFromExternal = () => controller.abort(externalSignal?.reason);\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n controller.abort(externalSignal.reason);\n } else {\n externalSignal.addEventListener(\"abort\", abortFromExternal, { once: true });\n }\n }\n\n try {\n return await fetchImpl(url, {\n redirect: \"manual\",\n signal: controller.signal,\n headers: buildBrowserLikeHeaders(options)\n });\n } finally {\n clearTimeout(timeout);\n externalSignal?.removeEventListener(\"abort\", abortFromExternal);\n }\n}\n\nfunction buildBrowserLikeHeaders(options: FetchMetadataOptions): Record<string, string> {\n return {\n \"accept\": options.accept ?? DEFAULT_ACCEPT,\n \"accept-language\": options.acceptLanguage ?? DEFAULT_ACCEPT_LANGUAGE,\n \"accept-encoding\": options.acceptEncoding ?? DEFAULT_ACCEPT_ENCODING,\n \"cache-control\": \"no-cache\",\n \"pragma\": \"no-cache\",\n \"sec-ch-ua\": '\"Chromium\";v=\"125\", \"Google Chrome\";v=\"125\", \"Not.A/Brand\";v=\"24\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"Windows\"',\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"sec-fetch-user\": \"?1\",\n \"upgrade-insecure-requests\": \"1\",\n \"user-agent\": options.userAgent ?? DEFAULT_BROWSER_USER_AGENT,\n ...headersToObject(options.headers)\n };\n}\n\nasync function readLimitedBody(response: Response, maxBytes: number): Promise<{ text: string; bytes: Uint8Array }> {\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength && Number.parseInt(contentLength, 10) > maxBytes) {\n throw new Error(`Response body exceeds maxBytes (${maxBytes}).`);\n }\n\n if (!response.body) {\n const text = await response.text();\n return {\n text,\n bytes: new TextEncoder().encode(text)\n };\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let received = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value) {\n received += value.byteLength;\n if (received > maxBytes) {\n throw new Error(`Response body exceeds maxBytes (${maxBytes}).`);\n }\n chunks.push(value);\n }\n }\n\n const buffer = new Uint8Array(received);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return {\n text: decodeBytes(buffer, response.headers.get(\"content-type\")),\n bytes: buffer\n };\n}\n\nfunction fromCache(url: string, entry: MetaNovaCacheEntry): FetchedPage {\n const shortUrl = detectShortUrl(url);\n\n return {\n url,\n originalUrl: url,\n finalUrl: entry.finalUrl ?? url,\n isShortUrl: shortUrl.isShortUrl,\n shortUrlProvider: shortUrl.provider,\n html: entry.html,\n statusCode: entry.statusCode ?? 200,\n contentType: entry.contentType,\n redirects: entry.redirects ?? [],\n headers: {}\n };\n}\n\nfunction isRedirect(statusCode: number): boolean {\n return statusCode === 301 || statusCode === 302 || statusCode === 303 || statusCode === 307 || statusCode === 308;\n}\n\nfunction extractCharset(contentType: string | null): string {\n const charset = contentType?.match(/charset=([^;]+)/i)?.[1]?.trim().replace(/^[\"']|[\"']$/g, \"\");\n return charset || \"utf-8\";\n}\n\nfunction decodeBytes(buffer: Uint8Array, contentType: string | null): string {\n try {\n return new TextDecoder(extractCharset(contentType)).decode(buffer);\n } catch {\n return new TextDecoder(\"utf-8\").decode(buffer);\n }\n}\n\nfunction headersToRecord(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nfunction headersToObject(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) {\n return {};\n }\n\n return Object.fromEntries(new Headers(headers).entries());\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import { load, type CheerioAPI } from \"cheerio\";\nimport type { ExtractionDiagnostics, MediaAsset } from \"../types/index.js\";\n\nexport function loadDocument(html: string): CheerioAPI {\n return load(html);\n}\n\nexport function normalizeWhitespace(value: string | null | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.replace(/\\s+/g, \" \").trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nexport function firstDefined<T>(...values: Array<T | undefined | null | false | \"\">): T | undefined {\n for (const value of values) {\n if (value !== undefined && value !== null && value !== false && value !== \"\") {\n return value as T;\n }\n }\n\n return undefined;\n}\n\nexport function parseInteger(value: string | number | null | undefined): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.round(value);\n }\n\n if (!value) {\n return undefined;\n }\n\n const parsed = Number.parseInt(String(value), 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport function parseNumber(value: string | number | null | undefined): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (!value) {\n return undefined;\n }\n\n const parsed = Number.parseFloat(String(value));\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport function readMetaContent($: CheerioAPI, selectors: string[]): string | undefined {\n for (const selector of selectors) {\n const content = normalizeWhitespace($(selector).first().attr(\"content\"));\n if (content) {\n return content;\n }\n }\n\n return undefined;\n}\n\nexport function setMapValue(map: Record<string, string | string[]>, key: string, value: string): void {\n const current = map[key];\n if (Array.isArray(current)) {\n current.push(value);\n return;\n }\n\n if (typeof current === \"string\") {\n map[key] = [current, value];\n return;\n }\n\n map[key] = value;\n}\n\nexport function splitList(value: string | undefined): string[] | undefined {\n if (!value) {\n return undefined;\n }\n\n const items = value\n .split(\",\")\n .map((item) => normalizeWhitespace(item))\n .filter((item): item is string => Boolean(item));\n\n return items.length > 0 ? items : undefined;\n}\n\nexport function parseSrcset(value: string | undefined): string[] {\n if (!value) {\n return [];\n }\n\n return value\n .split(\",\")\n .map((candidate) => candidate.trim().split(/\\s+/)[0])\n .filter(Boolean);\n}\n\nexport function uniqueMediaByUrl(assets: MediaAsset[]): MediaAsset[] {\n const seen = new Set<string>();\n const unique: MediaAsset[] = [];\n\n for (const asset of assets) {\n const key = asset.url;\n if (!key || seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n unique.push(asset);\n }\n\n return unique;\n}\n\nexport function createEmptyDiagnostics(): ExtractionDiagnostics {\n return {\n redirects: [],\n sourcesUsed: [],\n warnings: [],\n trace: [],\n extractedAt: new Date().toISOString()\n };\n}\n","import type { HtmlMetadata, MediaAsset } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace, readMetaContent, splitList } from \"../utils/html.js\";\n\nexport function extractHtmlMetadata(html: string): HtmlMetadata {\n const $ = loadDocument(html);\n const favicons: MediaAsset[] = [];\n const alternates: HtmlMetadata[\"alternates\"] = [];\n let canonicalUrl: string | undefined;\n let imageSrc: MediaAsset | undefined;\n\n $(\"link[rel][href]\").each((_, element) => {\n const rel = normalizeWhitespace($(element).attr(\"rel\"))?.toLowerCase();\n const href = normalizeWhitespace($(element).attr(\"href\"));\n const type = normalizeWhitespace($(element).attr(\"type\"));\n\n if (!rel || !href) {\n return;\n }\n\n const relTokens = rel.split(/\\s+/);\n if (relTokens.includes(\"canonical\")) {\n canonicalUrl = href;\n }\n\n if (relTokens.includes(\"image_src\")) {\n imageSrc = {\n url: href,\n kind: \"image\",\n source: \"html\"\n };\n }\n\n if (relTokens.includes(\"alternate\")) {\n alternates.push({\n href,\n type,\n hreflang: normalizeWhitespace($(element).attr(\"hreflang\")),\n title: normalizeWhitespace($(element).attr(\"title\"))\n });\n }\n\n if (\n relTokens.includes(\"icon\") ||\n relTokens.includes(\"shortcut\") ||\n relTokens.includes(\"apple-touch-icon\") ||\n relTokens.includes(\"mask-icon\")\n ) {\n favicons.push({\n url: href,\n kind: \"favicon\",\n source: \"favicon\",\n type,\n metadata: {\n sizes: normalizeWhitespace($(element).attr(\"sizes\")),\n rel\n }\n });\n }\n });\n\n return {\n title: normalizeWhitespace($(\"title\").first().text()) ?? readMetaContent($, [\"meta[name='title']\"]),\n description: readMetaContent($, [\"meta[name='description']\", \"meta[itemprop='description']\"]),\n keywords: splitList(readMetaContent($, [\"meta[name='keywords']\"])),\n robots: readMetaContent($, [\"meta[name='robots']\"]),\n canonicalUrl,\n manifestUrl: normalizeWhitespace($(\"link[rel='manifest']\").first().attr(\"href\")),\n themeColor: readMetaContent($, [\"meta[name='theme-color']\"]),\n applicationName: readMetaContent($, [\"meta[name='application-name']\", \"meta[name='apple-mobile-web-app-title']\"]),\n favicons,\n imageSrc,\n alternates\n };\n}\n","import type { EmbeddedDataItem, EmbeddedDataMetadata, JsonLdNode } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace } from \"../utils/html.js\";\n\nconst MAX_SCRIPT_CHARS = 1_500_000;\n\nconst ASSIGNMENT_PATTERNS: Array<{ source: EmbeddedDataItem[\"source\"]; names: string[] }> = [\n { source: \"nuxt\", names: [\"window.__NUXT__\", \"__NUXT__\"] },\n { source: \"initialState\", names: [\"window.__INITIAL_STATE__\", \"__INITIAL_STATE__\"] },\n { source: \"preloadedState\", names: [\"window.__PRELOADED_STATE__\", \"__PRELOADED_STATE__\"] },\n { source: \"apollo\", names: [\"window.__APOLLO_STATE__\", \"__APOLLO_STATE__\", \"window.__APOLLO_CLIENT__\"] },\n { source: \"youtubeInitialData\", names: [\"ytInitialData\", \"window.ytInitialData\"] },\n { source: \"youtubePlayerResponse\", names: [\"ytInitialPlayerResponse\", \"window.ytInitialPlayerResponse\"] }\n];\n\nexport function extractEmbeddedData(html: string): EmbeddedDataMetadata {\n const $ = loadDocument(html);\n const items: EmbeddedDataItem[] = [];\n const warnings: string[] = [];\n\n const nextData = parseJsonScript($(\"#__NEXT_DATA__\").first().html() ?? $(\"#__NEXT_DATA__\").first().text(), \"nextData\", warnings);\n if (nextData) {\n items.push(nextData);\n }\n\n const nuxtData = parseJsonScript($(\"#__NUXT_DATA__\").first().html() ?? $(\"#__NUXT_DATA__\").first().text(), \"nuxt\", warnings);\n if (nuxtData) {\n items.push(nuxtData);\n }\n\n $(\"script\").each((index, element) => {\n const type = normalizeWhitespace($(element).attr(\"type\"))?.toLowerCase();\n const id = normalizeWhitespace($(element).attr(\"id\"));\n const source = $(element).html() ?? $(element).text();\n\n if (!source || source.length > MAX_SCRIPT_CHARS) {\n return;\n }\n\n if (type?.includes(\"application/json\") || type?.includes(\"application/ld+json\")) {\n const parsed = parseJsonScript(source, type?.includes(\"ld+json\") ? \"jsonScript\" : \"applicationJson\", warnings, id);\n if (parsed) {\n items.push(parsed);\n }\n }\n\n for (const pattern of ASSIGNMENT_PATTERNS) {\n for (const name of pattern.names) {\n const data = parseAssignedJson(source, name);\n if (data) {\n items.push({\n source: pattern.source,\n path: name,\n data\n });\n }\n }\n }\n\n const apolloLike = findApolloPayload(source);\n if (apolloLike) {\n items.push({\n source: \"apollo\",\n path: `script[${index}]`,\n data: apolloLike\n });\n }\n });\n\n return {\n items: dedupeEmbeddedItems(items),\n warnings\n };\n}\n\nfunction parseJsonScript(\n source: string | null | undefined,\n itemSource: EmbeddedDataItem[\"source\"],\n warnings: string[],\n path?: string\n): EmbeddedDataItem | undefined {\n const cleanSource = cleanJsonSource(source);\n if (!cleanSource) {\n return undefined;\n }\n\n try {\n const parsed = JSON.parse(cleanSource);\n if (!isRecord(parsed)) {\n return undefined;\n }\n\n return {\n source: itemSource,\n path,\n data: parsed\n };\n } catch (error) {\n warnings.push(`Could not parse ${itemSource} embedded JSON${path ? ` at ${path}` : \"\"}: ${error instanceof Error ? error.message : String(error)}`);\n return undefined;\n }\n}\n\nfunction parseAssignedJson(source: string, assignmentName: string): JsonLdNode | undefined {\n const index = source.indexOf(assignmentName);\n if (index === -1) {\n return undefined;\n }\n\n const afterName = source.slice(index + assignmentName.length);\n const assignmentIndex = afterName.search(/=\\s*[[{]/);\n if (assignmentIndex === -1) {\n return undefined;\n }\n\n const startInAfterName = afterName.slice(assignmentIndex).search(/[[{]/);\n if (startInAfterName === -1) {\n return undefined;\n }\n\n const start = index + assignmentName.length + assignmentIndex + startInAfterName;\n const candidate = readBalancedJson(source, start);\n if (!candidate) {\n return undefined;\n }\n\n try {\n const parsed = JSON.parse(candidate);\n return isRecord(parsed) ? parsed : { value: parsed };\n } catch {\n return undefined;\n }\n}\n\nfunction findApolloPayload(source: string): JsonLdNode | undefined {\n if (!/apollo|__APOLLO/i.test(source)) {\n return undefined;\n }\n\n const data = parseAssignedJson(source, \"window.__APOLLO_STATE__\") ?? parseAssignedJson(source, \"__APOLLO_STATE__\");\n if (data) {\n return data;\n }\n\n return undefined;\n}\n\nfunction readBalancedJson(source: string, start: number): string | undefined {\n const opener = source[start];\n const closer = opener === \"{\" ? \"}\" : opener === \"[\" ? \"]\" : undefined;\n if (!closer) {\n return undefined;\n }\n\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let index = start; index < source.length; index += 1) {\n const char = source[index];\n\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n continue;\n }\n\n if (char === opener) {\n depth += 1;\n } else if (char === closer) {\n depth -= 1;\n if (depth === 0) {\n return source.slice(start, index + 1);\n }\n }\n }\n\n return undefined;\n}\n\nfunction cleanJsonSource(source: string | null | undefined): string | undefined {\n const cleaned = source\n ?.replace(/^<!--/, \"\")\n .replace(/-->$/, \"\")\n .trim();\n\n return cleaned || undefined;\n}\n\nfunction dedupeEmbeddedItems(items: EmbeddedDataItem[]): EmbeddedDataItem[] {\n const seen = new Set<string>();\n const unique: EmbeddedDataItem[] = [];\n\n for (const item of items) {\n const key = `${item.source}:${item.path ?? \"\"}:${JSON.stringify(item.data).slice(0, 500)}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n unique.push(item);\n }\n\n return unique;\n}\n\nfunction isRecord(value: unknown): value is JsonLdNode {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { JsonLdMetadata, JsonLdNode } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace } from \"../utils/html.js\";\n\nexport function extractJsonLd(html: string): JsonLdMetadata {\n const $ = loadDocument(html);\n const nodes: JsonLdNode[] = [];\n const warnings: string[] = [];\n\n $(\"script[type*='ld+json']\").each((index, element) => {\n const source = normalizeWhitespace($(element).text()) ?? normalizeWhitespace($(element).html());\n if (!source) {\n return;\n }\n\n try {\n for (const node of flattenJsonLd(JSON.parse(cleanJson(source)))) {\n nodes.push(node);\n }\n } catch (error) {\n warnings.push(`Could not parse JSON-LD script at index ${index}: ${error instanceof Error ? error.message : String(error)}`);\n }\n });\n\n return { nodes, warnings };\n}\n\nfunction cleanJson(source: string): string {\n return source\n .replace(/^<!--/, \"\")\n .replace(/-->$/, \"\")\n .trim();\n}\n\nfunction flattenJsonLd(value: unknown): JsonLdNode[] {\n if (Array.isArray(value)) {\n return value.flatMap((item) => flattenJsonLd(item));\n }\n\n if (!isRecord(value)) {\n return [];\n }\n\n const graph = value[\"@graph\"];\n const current = value as JsonLdNode;\n if (Array.isArray(graph)) {\n return [current, ...graph.filter(isRecord)];\n }\n\n return [current];\n}\n\nfunction isRecord(value: unknown): value is JsonLdNode {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { MediaAsset } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace, parseInteger, parseSrcset, uniqueMediaByUrl } from \"../utils/html.js\";\nimport { tryResolveUrl } from \"../utils/url.js\";\n\nconst LAZY_IMAGE_ATTRIBUTES = [\n \"data-src\",\n \"data-original\",\n \"data-lazy-src\",\n \"data-image\",\n \"data-image-url\",\n \"data-og-image\",\n \"data-thumbnail\",\n \"data-thumb\",\n \"data-media\",\n \"data-full-src\",\n \"data-hi-res-src\",\n \"data-zoom-src\",\n \"data-poster\",\n \"data-bg\"\n];\nconst LAZY_IMAGE_SRCSET_ATTRIBUTES = [\"data-srcset\", \"data-lazy-srcset\", \"data-original-srcset\"];\nconst LAZY_MEDIA_ATTRIBUTES = [\"data-src\", \"data-original\", \"data-lazy-src\", \"data-video\", \"data-video-url\", \"data-media\", \"data-playback-url\"];\n\nexport function extractImages(html: string, baseUrl: string): MediaAsset[] {\n const $ = loadDocument(html);\n const images: MediaAsset[] = [];\n\n $(\"link[rel='image_src'][href]\").each((_, element) => {\n pushResolved(images, {\n url: normalizeWhitespace($(element).attr(\"href\")),\n kind: \"image\",\n source: \"html\"\n }, baseUrl);\n });\n\n $(\"link[rel][href]\").each((_, element) => {\n const relTokens = (normalizeWhitespace($(element).attr(\"rel\"))?.toLowerCase() ?? \"\").split(/\\s+/);\n const asValue = normalizeWhitespace($(element).attr(\"as\"))?.toLowerCase();\n const type = normalizeWhitespace($(element).attr(\"type\"));\n if (!relTokens.includes(\"preload\") && !relTokens.includes(\"prefetch\")) {\n return;\n }\n\n if (asValue === \"image\" || type?.startsWith(\"image/\")) {\n pushResolved(images, {\n url: normalizeWhitespace($(element).attr(\"href\")),\n kind: \"image\",\n source: \"html\",\n type,\n metadata: { discoveredFrom: \"link.preload\" }\n }, baseUrl);\n\n for (const candidate of parseSrcset($(element).attr(\"imagesrcset\"))) {\n pushResolved(images, {\n url: candidate,\n kind: \"image\",\n source: \"html\",\n type,\n metadata: { discoveredFrom: \"link.imagesrcset\" }\n }, baseUrl);\n }\n }\n });\n\n collectDocumentImages($, images, baseUrl, \"html\");\n\n $(\"video[poster]\").each((_, element) => {\n pushResolved(images, {\n url: normalizeWhitespace($(element).attr(\"poster\")),\n kind: \"image\",\n source: \"html\",\n width: parseInteger($(element).attr(\"width\")),\n height: parseInteger($(element).attr(\"height\")),\n metadata: {\n discoveredFrom: \"video.poster\"\n }\n }, baseUrl);\n });\n\n $(\"noscript\").each((_, element) => {\n const fallbackHtml = $(element).html() || $(element).text();\n if (!fallbackHtml) {\n return;\n }\n\n collectDocumentImages(loadDocument(fallbackHtml), images, baseUrl, \"fallback\");\n });\n\n return uniqueMediaByUrl(images);\n}\n\nexport function extractVideos(html: string, baseUrl: string): MediaAsset[] {\n const $ = loadDocument(html);\n const videos: MediaAsset[] = [];\n\n $(\"video\").each((_, element) => {\n const src = normalizeWhitespace($(element).attr(\"src\")) ?? firstAttribute($, element, LAZY_MEDIA_ATTRIBUTES);\n const common = {\n kind: \"video\" as const,\n source: \"html\",\n width: parseInteger($(element).attr(\"width\")),\n height: parseInteger($(element).attr(\"height\")),\n poster: tryResolveUrl(normalizeWhitespace($(element).attr(\"poster\")), baseUrl)\n };\n\n pushResolved(videos, { ...common, url: src }, baseUrl);\n\n for (const attribute of LAZY_MEDIA_ATTRIBUTES) {\n pushResolved(videos, {\n ...common,\n url: normalizeWhitespace($(element).attr(attribute))\n }, baseUrl);\n }\n\n $(element)\n .find(\"source[src]\")\n .each((_, source) => {\n pushResolved(videos, {\n ...common,\n url: normalizeWhitespace($(source).attr(\"src\")),\n type: normalizeWhitespace($(source).attr(\"type\"))\n }, baseUrl);\n });\n });\n\n $(\"iframe[src]\").each((_, element) => {\n const src = normalizeWhitespace($(element).attr(\"src\"));\n if (!src || !isLikelyVideoEmbed(src)) {\n return;\n }\n\n pushResolved(videos, {\n url: src,\n kind: \"video\",\n source: \"html\",\n width: parseInteger($(element).attr(\"width\")),\n height: parseInteger($(element).attr(\"height\"))\n }, baseUrl);\n });\n\n $(\"link[rel][href]\").each((_, element) => {\n const relTokens = (normalizeWhitespace($(element).attr(\"rel\"))?.toLowerCase() ?? \"\").split(/\\s+/);\n const asValue = normalizeWhitespace($(element).attr(\"as\"))?.toLowerCase();\n const type = normalizeWhitespace($(element).attr(\"type\"));\n if ((!relTokens.includes(\"preload\") && !relTokens.includes(\"prefetch\")) || (asValue !== \"video\" && !type?.startsWith(\"video/\"))) {\n return;\n }\n\n pushResolved(videos, {\n url: normalizeWhitespace($(element).attr(\"href\")),\n kind: \"video\",\n source: \"html\",\n type,\n metadata: { discoveredFrom: \"link.preload\" }\n }, baseUrl);\n });\n\n return uniqueMediaByUrl(videos);\n}\n\nexport function extractAudio(html: string, baseUrl: string): MediaAsset[] {\n const $ = loadDocument(html);\n const audio: MediaAsset[] = [];\n\n $(\"audio\").each((_, element) => {\n pushResolved(audio, {\n url: normalizeWhitespace($(element).attr(\"src\")),\n kind: \"audio\",\n source: \"html\"\n }, baseUrl);\n\n $(element)\n .find(\"source[src]\")\n .each((_, source) => {\n pushResolved(audio, {\n url: normalizeWhitespace($(source).attr(\"src\")),\n kind: \"audio\",\n source: \"html\",\n type: normalizeWhitespace($(source).attr(\"type\"))\n }, baseUrl);\n });\n });\n\n return uniqueMediaByUrl(audio);\n}\n\nfunction pushResolved(assets: MediaAsset[], asset: Omit<MediaAsset, \"url\"> & { url?: string }, baseUrl: string): void {\n const url = tryResolveUrl(asset.url, baseUrl);\n if (!url || shouldIgnoreMediaUrl(url) || shouldIgnoreImageAsset(asset, url)) {\n return;\n }\n\n assets.push({\n ...asset,\n url\n });\n}\n\nfunction collectDocumentImages($: ReturnType<typeof loadDocument>, images: MediaAsset[], baseUrl: string, source: \"html\" | \"fallback\"): void {\n $(\"img\").each((_, element) => {\n const common = {\n kind: \"image\" as const,\n source,\n width: parseInteger($(element).attr(\"width\")),\n height: parseInteger($(element).attr(\"height\")),\n alt: normalizeWhitespace($(element).attr(\"alt\")),\n title: normalizeWhitespace($(element).attr(\"title\"))\n };\n\n const candidates = [\n normalizeWhitespace($(element).attr(\"src\")),\n ...LAZY_IMAGE_ATTRIBUTES.map((attribute) => normalizeWhitespace($(element).attr(attribute))),\n ...parseSrcset($(element).attr(\"srcset\")),\n ...LAZY_IMAGE_SRCSET_ATTRIBUTES.flatMap((attribute) => parseSrcset($(element).attr(attribute)))\n ];\n\n for (const candidate of candidates) {\n pushResolved(images, {\n ...common,\n url: candidate,\n metadata: {\n discoveredFrom: source === \"fallback\" ? \"noscript\" : \"img\"\n }\n }, baseUrl);\n }\n });\n\n $(\"picture source[srcset], source[type^='image/'][srcset]\").each((_, element) => {\n for (const candidate of [\n ...parseSrcset($(element).attr(\"srcset\")),\n ...LAZY_IMAGE_SRCSET_ATTRIBUTES.flatMap((attribute) => parseSrcset($(element).attr(attribute)))\n ]) {\n pushResolved(images, {\n url: candidate,\n kind: \"image\",\n source,\n type: normalizeWhitespace($(element).attr(\"type\")),\n metadata: {\n discoveredFrom: source === \"fallback\" ? \"noscript.picture.source\" : \"picture.source\"\n }\n }, baseUrl);\n }\n });\n}\n\nfunction shouldIgnoreMediaUrl(url: string): boolean {\n const normalized = url.toLowerCase();\n return (\n normalized.startsWith(\"data:\") ||\n normalized.startsWith(\"blob:\") ||\n normalized.startsWith(\"javascript:\") ||\n /(?:sprite|spacer|blank|transparent|placeholder|tracking|beacon|pixel)(?:[._/-]|$|\\?)/i.test(normalized) ||\n /(?:^|[/?_-])1x1(?:[._/-]|$|\\?)/i.test(normalized)\n );\n}\n\nfunction shouldIgnoreImageAsset(asset: Omit<MediaAsset, \"url\"> & { url?: string }, url: string): boolean {\n if (asset.kind !== \"image\" && asset.kind !== \"favicon\") {\n return false;\n }\n\n const width = asset.width;\n const height = asset.height;\n const normalizedUrl = url.toLowerCase();\n\n if (width !== undefined && height !== undefined) {\n if (width <= 2 || height <= 2) {\n return true;\n }\n\n if (width <= 64 && height <= 64 && /(?:icon|favicon|apple-touch-icon|sprite|logo|avatar)/i.test(normalizedUrl)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isLikelyVideoEmbed(src: string): boolean {\n return /youtube\\.com|youtu\\.be|vimeo\\.com|dailymotion\\.com|tiktok\\.com|instagram\\.com|facebook\\.com|player\\./i.test(src);\n}\n\nfunction firstAttribute($: ReturnType<typeof loadDocument>, element: unknown, attributes: string[]): string | undefined {\n for (const attribute of attributes) {\n const value = normalizeWhitespace($(element as never).attr(attribute));\n if (value) {\n return value;\n }\n }\n\n return undefined;\n}\n","import type { FetchMetadataOptions, OEmbedData, OEmbedLink, OEmbedMetadata } from \"../types/index.js\";\nimport { fetchPage } from \"../fetcher/index.js\";\nimport { loadDocument, normalizeWhitespace } from \"../utils/html.js\";\nimport { tryResolveUrl } from \"../utils/url.js\";\n\nexport function extractOEmbed(html: string, url: string): OEmbedMetadata {\n const $ = loadDocument(html);\n const links: OEmbedMetadata[\"links\"] = [];\n\n $(\"link[rel][href]\").each((_, element) => {\n const rel = normalizeWhitespace($(element).attr(\"rel\"))?.toLowerCase() ?? \"\";\n const relTokens = rel.split(/\\s+/);\n const type = normalizeWhitespace($(element).attr(\"type\"));\n const title = normalizeWhitespace($(element).attr(\"title\"));\n const hrefValue = normalizeWhitespace($(element).attr(\"href\"));\n const looksLikeOEmbed = /oembed/i.test(type ?? \"\") || /oembed/i.test(title ?? \"\") || /[?&]format=(?:json|xml)/i.test(hrefValue ?? \"\");\n\n if (!relTokens.includes(\"alternate\") && !relTokens.includes(\"alternate-oembed\") && !looksLikeOEmbed) {\n return;\n }\n\n if (!looksLikeOEmbed) {\n return;\n }\n\n const href = tryResolveUrl(hrefValue, url);\n if (!href) {\n return;\n }\n\n links.push({\n href,\n type,\n title\n });\n });\n\n return {\n links,\n data: []\n };\n}\n\nexport async function fetchOEmbedData(\n links: OEmbedLink[],\n options: FetchMetadataOptions = {}\n): Promise<{ data: OEmbedData[]; warnings: string[] }> {\n const data: OEmbedData[] = [];\n const warnings: string[] = [];\n\n await Promise.all(\n links.map(async (link) => {\n if (link.type && !/json/i.test(link.type)) {\n warnings.push(`Skipping non-JSON oEmbed endpoint: ${link.href}.`);\n return;\n }\n\n try {\n const page = await fetchPage(link.href, {\n ...options,\n headers: {\n \"accept\": \"application/json,*/*;q=0.8\",\n ...headersToObject(options.headers)\n }\n });\n data.push(JSON.parse(page.html) as OEmbedData);\n } catch (error) {\n warnings.push(`Could not fetch oEmbed endpoint ${link.href}: ${error instanceof Error ? error.message : String(error)}`);\n }\n })\n );\n\n return { data, warnings };\n}\n\nfunction headersToObject(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) {\n return {};\n }\n\n return Object.fromEntries(new Headers(headers).entries());\n}\n","import type { CheerioAPI } from \"cheerio\";\nimport type { MediaAsset, OpenGraphMetadata } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace, parseInteger, setMapValue } from \"../utils/html.js\";\n\nexport function extractOpenGraph(html: string): OpenGraphMetadata {\n const $ = loadDocument(html);\n const raw: Record<string, string | string[]> = {};\n\n $(\"meta[property], meta[name]\").each((_, element) => {\n const key = readMetaKey($, element);\n const content = normalizeWhitespace($(element).attr(\"content\"));\n\n if (!key || !content || (!key.startsWith(\"og:\") && !key.startsWith(\"article:\") && !key.startsWith(\"product:\"))) {\n return;\n }\n\n setMapValue(raw, key, content);\n });\n\n return {\n title: firstRaw(raw, \"og:title\"),\n description: firstRaw(raw, \"og:description\"),\n type: firstRaw(raw, \"og:type\"),\n url: firstRaw(raw, \"og:url\"),\n siteName: firstRaw(raw, \"og:site_name\"),\n locale: firstRaw(raw, \"og:locale\"),\n determiner: firstRaw(raw, \"og:determiner\"),\n images: collectStructuredMedia($, \"image\"),\n videos: collectStructuredMedia($, \"video\"),\n audio: collectStructuredMedia($, \"audio\"),\n article: {\n publishedTime: firstRaw(raw, \"article:published_time\"),\n modifiedTime: firstRaw(raw, \"article:modified_time\"),\n expirationTime: firstRaw(raw, \"article:expiration_time\"),\n section: firstRaw(raw, \"article:section\"),\n tags: allRaw(raw, \"article:tag\"),\n authors: allRaw(raw, \"article:author\")?.map((name) => ({ name }))\n },\n product: {\n price: firstRaw(raw, \"product:price:amount\"),\n currency: firstRaw(raw, \"product:price:currency\"),\n availability: firstRaw(raw, \"product:availability\"),\n condition: firstRaw(raw, \"product:condition\")\n },\n raw\n };\n}\n\nfunction collectStructuredMedia($: CheerioAPI, kind: \"image\" | \"video\" | \"audio\"): MediaAsset[] {\n const assets: MediaAsset[] = [];\n const prefix = `og:${kind}`;\n\n $(\"meta[property], meta[name]\").each((_, element) => {\n const key = readMetaKey($, element);\n const content = normalizeWhitespace($(element).attr(\"content\"));\n\n if (!key?.startsWith(prefix) || !content) {\n return;\n }\n\n const current = assets.at(-1);\n\n if (key === prefix || key === `${prefix}:url`) {\n if (key.endsWith(\":url\") && current && !current.url) {\n current.url = content;\n return;\n }\n\n assets.push({\n url: content,\n kind,\n source: \"openGraph\"\n });\n return;\n }\n\n const target = current ?? pushEmptyAsset(assets, kind);\n const property = key.slice(prefix.length + 1);\n\n if (property === \"secure_url\") {\n target.secureUrl = content;\n } else if (property === \"type\") {\n target.type = content;\n } else if (property === \"width\") {\n target.width = parseInteger(content);\n } else if (property === \"height\") {\n target.height = parseInteger(content);\n } else if (property === \"alt\") {\n target.alt = content;\n }\n });\n\n return assets.filter((asset) => Boolean(asset.url));\n}\n\nfunction pushEmptyAsset(assets: MediaAsset[], kind: \"image\" | \"video\" | \"audio\"): MediaAsset {\n const asset: MediaAsset = {\n url: \"\",\n kind,\n source: \"openGraph\"\n };\n assets.push(asset);\n return asset;\n}\n\nfunction readMetaKey($: CheerioAPI, element: any): string | undefined {\n return normalizeWhitespace($(element).attr(\"property\")) ?? normalizeWhitespace($(element).attr(\"name\"));\n}\n\nfunction firstRaw(raw: Record<string, string | string[]>, key: string): string | undefined {\n const value = raw[key];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction allRaw(raw: Record<string, string | string[]>, key: string): string[] | undefined {\n const value = raw[key];\n if (!value) {\n return undefined;\n }\n\n return Array.isArray(value) ? value : [value];\n}\n","import type { CheerioAPI } from \"cheerio\";\nimport type { MediaAsset, TwitterMetadata } from \"../types/index.js\";\nimport { loadDocument, normalizeWhitespace, parseInteger, setMapValue } from \"../utils/html.js\";\n\nexport function extractTwitterCards(html: string): TwitterMetadata {\n const $ = loadDocument(html);\n const raw: Record<string, string | string[]> = {};\n\n $(\"meta[name], meta[property]\").each((_, element) => {\n const key = readMetaKey($, element);\n const content = normalizeWhitespace($(element).attr(\"content\"));\n\n if (!key?.startsWith(\"twitter:\") || !content) {\n return;\n }\n\n setMapValue(raw, key, content);\n });\n\n return {\n card: firstRaw(raw, \"twitter:card\"),\n site: firstRaw(raw, \"twitter:site\"),\n creator: firstRaw(raw, \"twitter:creator\"),\n title: firstRaw(raw, \"twitter:title\"),\n description: firstRaw(raw, \"twitter:description\"),\n images: collectImages(raw),\n videos: collectVideos(raw),\n raw\n };\n}\n\nfunction collectImages(raw: Record<string, string | string[]>): MediaAsset[] {\n const urls = uniqueStrings([\n ...allRaw(raw, \"twitter:image\"),\n ...allRaw(raw, \"twitter:image:src\"),\n ...allRaw(raw, \"twitter:images\"),\n ...allRaw(raw, \"twitter:image0\"),\n ...allRaw(raw, \"twitter:image1\"),\n ...allRaw(raw, \"twitter:image2\"),\n ...allRaw(raw, \"twitter:image3\"),\n ...allRaw(raw, \"twitter:player:image\"),\n ...Object.entries(raw)\n .filter(([key]) => /^twitter:image(?::\\d+)?$/i.test(key) || /^twitter:image:\\d+$/i.test(key))\n .flatMap(([, value]) => (Array.isArray(value) ? value : [value]))\n ]);\n const alt = firstRaw(raw, \"twitter:image:alt\");\n const width = parseInteger(firstRaw(raw, \"twitter:image:width\"));\n const height = parseInteger(firstRaw(raw, \"twitter:image:height\"));\n\n return urls.map((url) => ({\n url,\n kind: \"image\",\n source: \"twitter\",\n alt,\n width,\n height\n }));\n}\n\nfunction collectVideos(raw: Record<string, string | string[]>): MediaAsset[] {\n const players = allRaw(raw, \"twitter:player\") ?? allRaw(raw, \"twitter:player:stream\") ?? [];\n const width = parseInteger(firstRaw(raw, \"twitter:player:width\"));\n const height = parseInteger(firstRaw(raw, \"twitter:player:height\"));\n\n return players.map((url) => ({\n url,\n kind: \"video\",\n source: \"twitter\",\n width,\n height\n }));\n}\n\nfunction readMetaKey($: CheerioAPI, element: any): string | undefined {\n return normalizeWhitespace($(element).attr(\"name\")) ?? normalizeWhitespace($(element).attr(\"property\"));\n}\n\nfunction firstRaw(raw: Record<string, string | string[]>, key: string): string | undefined {\n const value = raw[key];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction allRaw(raw: Record<string, string | string[]>, key: string): string[] {\n const value = raw[key];\n if (!value) {\n return [];\n }\n\n return Array.isArray(value) ? value : [value];\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values.filter(Boolean))];\n}\n","import type { MediaAsset } from \"../types/index.js\";\n\nconst REDDIT_BAD_IMAGE_URL_PATTERN = /thumbs\\.redditmedia\\.com|avatar|community_icon|subreddit|icon|award|emoji/i;\n\nconst TRUSTED_REDDIT_SOURCES = new Set([\n \"adapter\",\n \"openGraph\",\n \"twitter\",\n \"jsonLd\",\n \"oEmbed\",\n \"nextData\",\n \"nuxt\",\n \"initialState\",\n \"preloadedState\",\n \"apollo\",\n \"applicationJson\",\n \"jsonScript\"\n]);\n\nexport function isRedditUrl(value: string): boolean {\n try {\n const host = new URL(value).hostname.toLowerCase().replace(/^www\\./, \"\");\n return host === \"reddit.com\" || host === \"redd.it\" || host.endsWith(\".reddit.com\");\n } catch {\n return false;\n }\n}\n\nexport function filterRedditImageCandidates(images: MediaAsset[]): MediaAsset[] {\n const allowed = images.filter(isAllowedRedditImageCandidate);\n const trusted = allowed.filter(isTrustedRedditImageCandidate);\n return prioritizeRedditImages(trusted.length > 0 ? trusted : allowed);\n}\n\nexport function prioritizeRedditImages(images: MediaAsset[]): MediaAsset[] {\n return images.slice().sort(\n (left, right) =>\n redditImagePriority(right) - redditImagePriority(left) ||\n imageArea(right) - imageArea(left)\n );\n}\n\nexport function isAllowedRedditImageCandidate(image: MediaAsset): boolean {\n if (image.width !== undefined && image.width < 200) {\n return false;\n }\n\n if (image.height !== undefined && image.height < 200) {\n return false;\n }\n\n return !REDDIT_BAD_IMAGE_URL_PATTERN.test(image.url);\n}\n\nexport function redditImagePriority(image: MediaAsset): number {\n const mediaKind = typeof image.metadata?.redditMediaKind === \"string\" ? image.metadata.redditMediaKind : undefined;\n const url = image.url.toLowerCase();\n\n if (mediaKind === \"gallery\") {\n return 700;\n }\n\n if (mediaKind === \"previewOriginal\") {\n return 620;\n }\n\n if (mediaKind === \"directImage\") {\n return 580;\n }\n\n if (/\\/\\/preview\\.redd\\.it\\//i.test(url)) {\n return 560;\n }\n\n if (/\\/\\/i\\.redd\\.it\\//i.test(url)) {\n return 540;\n }\n\n if (image.source === \"openGraph\" || image.source === \"twitter\") {\n return 420;\n }\n\n if (/\\/\\/external-preview\\.redd\\.it\\//i.test(url)) {\n return 300;\n }\n\n if (/\\/\\/thumbs\\.redditmedia\\.com\\//i.test(url)) {\n return 1;\n }\n\n return isRedditMediaUrl(url) ? 250 : 0;\n}\n\nexport function hasRedditImageContext(images: MediaAsset[]): boolean {\n return images.some((image) => {\n const adapter = typeof image.metadata?.adapter === \"string\" ? image.metadata.adapter : \"\";\n const originalSource = typeof image.metadata?.originalSource === \"string\" ? image.metadata.originalSource : \"\";\n return adapter === \"redditAdapter\" || originalSource === \"redditJsonEndpoint\" || Boolean(image.metadata?.redditMediaKind);\n });\n}\n\nexport function isRedditMediaUrl(value: string): boolean {\n return /(?:^https?:)?\\/\\/(?:(?:i|preview|external-preview)\\.redd\\.it|thumbs\\.redditmedia\\.com|v\\.redd\\.it)\\//i.test(value);\n}\n\nfunction isTrustedRedditImageCandidate(image: MediaAsset): boolean {\n return TRUSTED_REDDIT_SOURCES.has(image.source) || Boolean(image.metadata?.redditMediaKind);\n}\n\nfunction imageArea(image: MediaAsset): number {\n return (image.width ?? 0) * (image.height ?? 0);\n}\n","import type { ImageScorer, MediaAsset } from \"../types/index.js\";\nimport { hasRedditImageContext, isRedditMediaUrl, redditImagePriority } from \"../utils/redditMedia.js\";\n\nexport interface ImageSelection {\n best?: MediaAsset;\n images: MediaAsset[];\n reason?: string;\n}\n\nconst SOURCE_WEIGHT: Record<string, number> = {\n adapter: 98,\n openGraph: 94,\n oEmbed: 88,\n jsonLd: 82,\n twitter: 86,\n nextData: 76,\n nuxt: 74,\n initialState: 73,\n preloadedState: 73,\n apollo: 72,\n applicationJson: 70,\n jsonScript: 66,\n html: 42,\n fallback: 36,\n favicon: 8\n};\n\nexport function scoreImages(images: MediaAsset[], customScorers: ImageScorer[] = []): MediaAsset[] {\n const duplicateCounts = countDuplicates(images);\n const redditContext = hasRedditImageContext(images);\n\n return images\n .map((image, index) => {\n const scored = scoreImageWithDetails(image, index, images, duplicateCounts);\n const customScore = customScorers.reduce((total, scorer) => total + scorer(image, { index, images }), 0);\n const score = clamp(scored.score + customScore, 0, 100);\n const reasons = customScore === 0 ? scored.reasons : [...scored.reasons, `custom scorers adjusted score by ${formatSigned(customScore)}`];\n\n return {\n ...image,\n score,\n confidence: Number((score / 100).toFixed(2)),\n metadata: {\n ...image.metadata,\n scoreReasons: reasons\n }\n };\n })\n .sort(\n (left, right) =>\n (redditContext ? redditImagePriority(right) - redditImagePriority(left) : 0) ||\n (right.score ?? 0) - (left.score ?? 0) ||\n sourceSortWeight(right) - sourceSortWeight(left) ||\n imageArea(right) - imageArea(left)\n );\n}\n\nexport function selectBestImage(images: MediaAsset[], customScorers: ImageScorer[] = []): ImageSelection {\n const scored = scoreImages(images, customScorers);\n const best = scored[0];\n\n return {\n best,\n images: scored,\n reason: best ? explainImageChoice(best) : undefined\n };\n}\n\nfunction scoreImageWithDetails(image: MediaAsset, index: number, images: MediaAsset[], duplicateCounts: Map<string, number>): { score: number; reasons: string[] } {\n let score = SOURCE_WEIGHT[image.source] ?? 50;\n const reasons = [`source ${sourceLabel(image.source)} added ${score} base points`];\n const dimensions = scoreDimensions(image);\n const format = scoreFormat(image);\n const urlSignal = scoreUrlSignal(image);\n const redditMedia = scoreRedditMedia(image);\n const urlPenalty = scoreUrlPenalty(image);\n const duplicatePenalty = scoreDuplicatePenalty(image, duplicateCounts);\n\n score += dimensions.score;\n score += format.score;\n score += urlSignal.score;\n score += redditMedia.score;\n score -= urlPenalty;\n score -= duplicatePenalty.score;\n score -= Math.min(index * 1.5, 10);\n reasons.push(...dimensions.reasons, ...format.reasons, ...urlSignal.reasons, ...redditMedia.reasons, ...duplicatePenalty.reasons);\n\n if (images.length === 1) {\n score += 4;\n reasons.push(\"only candidate image added 4 points\");\n }\n\n if (urlPenalty > 0) {\n reasons.push(`URL penalties subtracted ${urlPenalty} points`);\n }\n\n const positionPenalty = Math.min(index * 1.5, 10);\n if (positionPenalty > 0) {\n reasons.push(`candidate position subtracted ${formatNumber(positionPenalty)} points`);\n }\n\n return { score, reasons };\n}\n\nfunction scoreDimensions(image: MediaAsset): { score: number; reasons: string[] } {\n const width = image.width;\n const height = image.height;\n\n if (!width || !height) {\n return { score: 0, reasons: [\"dimensions are unknown\"] };\n }\n\n const area = width * height;\n const ratio = width / height;\n let score = 0;\n const reasons: string[] = [];\n\n if (width < 120 || height < 90) {\n score -= 35;\n reasons.push(`${width}x${height} is below preview minimum and subtracted 35 points`);\n } else if (area >= 1_000_000) {\n score += 12;\n reasons.push(`${width}x${height} dimensions added 12 points`);\n } else if (area >= 300_000) {\n score += 9;\n reasons.push(`${width}x${height} dimensions added 9 points`);\n } else if (area >= 90_000) {\n score += 5;\n reasons.push(`${width}x${height} dimensions added 5 points`);\n } else if (area < 10_000) {\n score -= 20;\n reasons.push(`${width}x${height} dimensions subtracted 20 points`);\n }\n\n if (isNear(ratio, 1.91, 0.18)) {\n score += 12;\n reasons.push(`aspect ratio ${ratio.toFixed(2)} matched social preview ratio`);\n } else if (isNear(ratio, 16 / 9, 0.2) || isNear(ratio, 1, 0.2)) {\n score += 8;\n reasons.push(`aspect ratio ${ratio.toFixed(2)} matched a common preview ratio`);\n } else if (ratio > 4 || ratio < 0.25) {\n score -= 16;\n reasons.push(`aspect ratio ${ratio.toFixed(2)} is unlikely to preview well`);\n }\n\n return { score, reasons };\n}\n\nfunction scoreFormat(image: MediaAsset): { score: number; reasons: string[] } {\n const type = image.type?.toLowerCase() ?? \"\";\n const url = image.url.toLowerCase();\n\n if (type.includes(\"webp\") || url.endsWith(\".webp\")) {\n return { score: 4, reasons: [\"modern WebP format added 4 points\"] };\n }\n\n if (type.includes(\"avif\") || /\\.(avif)(\\?|$)/.test(url)) {\n return { score: 4, reasons: [\"modern AVIF format added 4 points\"] };\n }\n\n if (type.includes(\"jpeg\") || type.includes(\"jpg\") || /\\.(jpe?g)(\\?|$)/.test(url)) {\n return { score: 3, reasons: [\"JPEG format added 3 points\"] };\n }\n\n if (type.includes(\"png\") || /\\.(png)(\\?|$)/.test(url)) {\n return { score: 2, reasons: [\"PNG format added 2 points\"] };\n }\n\n if (/\\.(gif|svg|ico)(\\?|$)/.test(url)) {\n return { score: -8, reasons: [\"GIF/SVG/ICO formats are weaker preview candidates\"] };\n }\n\n return { score: 0, reasons: [] };\n}\n\nfunction scoreUrlSignal(image: MediaAsset): { score: number; reasons: string[] } {\n const url = image.url.toLowerCase();\n const matches = url.match(/cover|preview|thumbnail|thumb|og|card|media|hero|share|social|maxres|highres|large|original/g) ?? [];\n\n const platformScore = platformThumbnailScore(url);\n if (matches.length === 0 && platformScore.score === 0) {\n return { score: 0, reasons: [] };\n }\n\n const uniqueMatches = [...new Set(matches)];\n const score = Math.min(uniqueMatches.length * 4, 14) + platformScore.score;\n const reasons = uniqueMatches.length > 0 ? [`URL matched preview hints (${uniqueMatches.join(\", \")}) and added ${Math.min(uniqueMatches.length * 4, 14)} points`] : [];\n reasons.push(...platformScore.reasons);\n\n return {\n score,\n reasons\n };\n}\n\nfunction platformThumbnailScore(url: string): { score: number; reasons: string[] } {\n if (/ytimg\\.com\\/vi\\/[^/]+\\/(?:maxresdefault|sddefault|hqdefault)/i.test(url)) {\n return { score: 12, reasons: [\"YouTube platform thumbnail added 12 points\"] };\n }\n\n if (/(?:i|preview|external-preview)\\.redd\\.it|v\\.redd\\.it/i.test(url)) {\n return { score: 10, reasons: [\"Reddit media host added 10 points\"] };\n }\n\n if (/pbs\\.twimg\\.com\\/media|pinimg\\.com|cdninstagram\\.com|fbcdn\\.net|tiktokcdn\\.com|mir-s3-cdn-cf\\.behance\\.net/i.test(url)) {\n return { score: 8, reasons: [\"social platform media host added 8 points\"] };\n }\n\n return { score: 0, reasons: [] };\n}\n\nfunction scoreRedditMedia(image: MediaAsset): { score: number; reasons: string[] } {\n const priority = redditImagePriority(image);\n if (priority === 0 && !isRedditMediaUrl(image.url)) {\n return { score: 0, reasons: [] };\n }\n\n const url = image.url.toLowerCase();\n const mediaKind = typeof image.metadata?.redditMediaKind === \"string\" ? image.metadata.redditMediaKind : undefined;\n\n if (mediaKind === \"gallery\") {\n return { score: 24, reasons: [\"Reddit gallery media added 24 points\"] };\n }\n\n if (mediaKind === \"previewOriginal\") {\n return { score: 20, reasons: [\"Reddit original preview media added 20 points\"] };\n }\n\n if (/\\/\\/i\\.redd\\.it\\//i.test(url)) {\n return { score: 18, reasons: [\"Reddit direct image media added 18 points\"] };\n }\n\n if (/\\/\\/preview\\.redd\\.it\\//i.test(url)) {\n return { score: 16, reasons: [\"Reddit preview media added 16 points\"] };\n }\n\n if (/\\/\\/external-preview\\.redd\\.it\\//i.test(url)) {\n return { score: -8, reasons: [\"Reddit external preview media subtracted 8 points\"] };\n }\n\n if (/\\/\\/thumbs\\.redditmedia\\.com\\//i.test(url)) {\n return { score: -60, reasons: [\"Reddit thumbnail host subtracted 60 points\"] };\n }\n\n return { score: 0, reasons: [] };\n}\n\nfunction scoreUrlPenalty(image: MediaAsset): number {\n const url = image.url.toLowerCase();\n let penalty = 0;\n\n if (/favicon|apple-touch-icon|sprite|icon-|\\/icon|placeholder|blank|spacer|pixel|tracking|emoji/.test(url)) {\n penalty += 30;\n }\n\n if (/logo|avatar|profile|headshot|badge/.test(url)) {\n penalty += 22;\n }\n\n if (image.alt && /logo|avatar|icon|emoji/i.test(image.alt)) {\n penalty += 14;\n }\n\n if (image.kind === \"favicon\") {\n penalty += 35;\n }\n\n return penalty;\n}\n\nfunction scoreDuplicatePenalty(image: MediaAsset, duplicateCounts: Map<string, number>): { score: number; reasons: string[] } {\n const count = duplicateCounts.get(mediaSignature(image.url)) ?? 0;\n if (count <= 1) {\n return { score: 0, reasons: [] };\n }\n\n const penalty = Math.min((count - 1) * 4, 12);\n return {\n score: penalty,\n reasons: [`duplicate-like URL group subtracted ${penalty} points`]\n };\n}\n\nfunction explainImageChoice(image: MediaAsset): string {\n const dimensions = image.width && image.height ? `${image.width}x${image.height}` : \"unknown dimensions\";\n const reasons = Array.isArray(image.metadata?.scoreReasons) ? image.metadata.scoreReasons.slice(0, 4).join(\"; \") : \"\";\n const reasonSuffix = reasons ? ` Reasons: ${reasons}.` : \"\";\n\n return `Selected because it came from ${sourceLabel(image.source)}, has ${dimensions}, and scored ${Math.round(image.score ?? 0)}.${reasonSuffix}`;\n}\n\nfunction isNear(value: number, target: number, tolerance: number): boolean {\n return Math.abs(value - target) <= tolerance;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction sourceLabel(source: string): string {\n if (source === \"openGraph\") {\n return \"og:image\";\n }\n\n if (source === \"twitter\") {\n return \"Twitter Card metadata\";\n }\n\n if (source === \"jsonLd\") {\n return \"JSON-LD\";\n }\n\n if (source === \"oEmbed\") {\n return \"oEmbed\";\n }\n\n if ([\"nextData\", \"nuxt\", \"initialState\", \"preloadedState\", \"apollo\", \"applicationJson\", \"jsonScript\"].includes(source)) {\n return \"embedded application data\";\n }\n\n return source;\n}\n\nfunction formatSigned(value: number): string {\n return value >= 0 ? `+${formatNumber(value)}` : formatNumber(value);\n}\n\nfunction formatNumber(value: number): string {\n return Number.isInteger(value) ? String(value) : value.toFixed(1);\n}\n\nfunction countDuplicates(images: MediaAsset[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const image of images) {\n const key = mediaSignature(image.url);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction imageArea(image: MediaAsset): number {\n return (image.width ?? 0) * (image.height ?? 0);\n}\n\nfunction sourceSortWeight(image: MediaAsset): number {\n return SOURCE_WEIGHT[image.source] ?? 50;\n}\n\nfunction mediaSignature(url: string): string {\n try {\n const parsed = new URL(url);\n return `${parsed.hostname.toLowerCase()}${parsed.pathname\n .replace(/[-_](?:\\d{2,5}x\\d{2,5}|\\d{2,5}w|small|medium|large|thumb|thumbnail)(?=\\.)/i, \"\")\n .toLowerCase()}`;\n } catch {\n return url.toLowerCase();\n }\n}\n","import type { EmbeddedDataItem, JsonLdNode, MediaAsset, RawMetadataSources } from \"../types/index.js\";\nimport { parseNumber, parseSrcset, uniqueMediaByUrl } from \"../utils/html.js\";\nimport { filterRedditImageCandidates, isRedditUrl, redditImagePriority } from \"../utils/redditMedia.js\";\nimport { tryResolveUrl } from \"../utils/url.js\";\n\nexport interface MediaDiscoveryResult {\n images: MediaAsset[];\n videos: MediaAsset[];\n audio: MediaAsset[];\n trace: string[];\n}\n\nconst IMAGE_KEYS = [\n \"image\",\n \"images\",\n \"thumbnail\",\n \"thumbnailUrl\",\n \"thumbnail_url\",\n \"thumbnailSrc\",\n \"thumbnail_src\",\n \"previewImage\",\n \"preview_image\",\n \"preview\",\n \"ogImage\",\n \"og_image\",\n \"cardImage\",\n \"displayUrl\",\n \"display_url\",\n \"mediaUrl\",\n \"media_url\",\n \"media_url_https\",\n \"fullPicture\",\n \"full_picture\",\n \"cover\",\n \"coverImage\",\n \"cover_image\",\n \"original\",\n \"source\",\n \"poster\",\n \"posterImage\",\n \"media\"\n];\n\nconst VIDEO_KEYS = [\n \"video\",\n \"videos\",\n \"videoUrl\",\n \"video_url\",\n \"contentUrl\",\n \"content_url\",\n \"embedUrl\",\n \"embed_url\",\n \"playbackUrl\",\n \"playback_url\",\n \"fallback_url\",\n \"hls_url\",\n \"dash_url\",\n \"media\"\n];\nconst AUDIO_KEYS = [\"audio\", \"audios\", \"audioUrl\", \"audio_url\", \"podcastUrl\"];\n\nexport function discoverMedia(rawSources: RawMetadataSources, finalUrl: string): MediaDiscoveryResult {\n const trace: string[] = [];\n const externalResults = [...rawSources.plugins, ...rawSources.adapters];\n const images = normalizeAssets(\n [\n ...externalResults.flatMap((result) => result.images ?? []),\n ...rawSources.openGraph.images,\n ...rawSources.twitter.images,\n ...jsonLdImages(rawSources.jsonLd.nodes),\n ...embeddedImages(rawSources.embeddedData.items),\n ...(rawSources.html.imageSrc ? [rawSources.html.imageSrc] : []),\n ...rawSources.images,\n ...oEmbedImages(rawSources)\n ],\n finalUrl\n );\n const videos = normalizeAssets(\n [\n ...externalResults.flatMap((result) => result.videos ?? []),\n ...rawSources.openGraph.videos,\n ...rawSources.twitter.videos,\n ...jsonLdVideos(rawSources.jsonLd.nodes),\n ...embeddedVideos(rawSources.embeddedData.items),\n ...rawSources.videos\n ],\n finalUrl\n );\n const audio = normalizeAssets(\n [\n ...externalResults.flatMap((result) => result.audio ?? []),\n ...rawSources.openGraph.audio,\n ...jsonLdAudio(rawSources.jsonLd.nodes),\n ...embeddedAudio(rawSources.embeddedData.items),\n ...rawSources.audio\n ],\n finalUrl\n );\n\n if (rawSources.openGraph.images.length > 0) {\n trace.push(\"media discovery collected og:image candidates\");\n }\n if (rawSources.twitter.images.length > 0) {\n trace.push(\"media discovery collected twitter:image candidates\");\n }\n if (rawSources.jsonLd.nodes.length > 0) {\n trace.push(\"media discovery scanned JSON-LD media\");\n }\n if (rawSources.embeddedData.items.length > 0) {\n trace.push(\"media discovery scanned embedded application data\");\n }\n if (rawSources.images.length > 0) {\n trace.push(\"media discovery scanned HTML images, srcset, lazy images, posters, and fallbacks\");\n }\n if (externalResults.some((result) => (result.images?.length ?? 0) > 0 || (result.videos?.length ?? 0) > 0)) {\n trace.push(\"media discovery included adapter and plugin media\");\n }\n\n const dedupedImages = dedupeMediaBySignature(images);\n\n return {\n images: isRedditUrl(finalUrl) ? filterRedditImageCandidates(dedupedImages) : dedupedImages,\n videos: dedupeMediaBySignature(uniqueMediaByUrl(videos)),\n audio: dedupeMediaBySignature(uniqueMediaByUrl(audio)),\n trace\n };\n}\n\nfunction normalizeAssets(assets: MediaAsset[], baseUrl: string): MediaAsset[] {\n return assets\n .map((asset) => {\n const secureUrl = tryResolveUrl(asset.secureUrl, baseUrl);\n const url = tryResolveUrl(secureUrl ?? asset.url, baseUrl);\n const poster = tryResolveUrl(asset.poster, baseUrl);\n\n if (!url || shouldIgnoreMediaUrl(url)) {\n return undefined;\n }\n\n return stripUndefined({\n ...asset,\n url,\n secureUrl,\n poster\n }) as MediaAsset;\n })\n .filter((asset): asset is MediaAsset => Boolean(asset));\n}\n\nfunction jsonLdImages(nodes: JsonLdNode[]): MediaAsset[] {\n return nodes.flatMap((node) => [\n ...mediaFromJsonValue(node.image, \"image\", \"jsonLd\"),\n ...mediaFromJsonValue(node.thumbnailUrl, \"image\", \"jsonLd\"),\n ...mediaFromJsonValue(node.thumbnail, \"image\", \"jsonLd\"),\n ...mediaFromJsonValue(node.logo, \"image\", \"jsonLd\")\n ]);\n}\n\nfunction jsonLdVideos(nodes: JsonLdNode[]): MediaAsset[] {\n return nodes.flatMap((node) => [\n ...mediaFromJsonValue(node.contentUrl, \"video\", \"jsonLd\"),\n ...mediaFromJsonValue(node.embedUrl, \"video\", \"jsonLd\"),\n ...mediaFromJsonValue(node.video, \"video\", \"jsonLd\")\n ]);\n}\n\nfunction jsonLdAudio(nodes: JsonLdNode[]): MediaAsset[] {\n return nodes.flatMap((node) => [\n ...mediaFromJsonValue(node.contentUrl, \"audio\", \"jsonLd\"),\n ...mediaFromJsonValue(node.encoding, \"audio\", \"jsonLd\")\n ]);\n}\n\nfunction embeddedImages(items: EmbeddedDataItem[]): MediaAsset[] {\n return items.flatMap((item) => mediaFromEmbeddedItem(item, IMAGE_KEYS, \"image\"));\n}\n\nfunction embeddedVideos(items: EmbeddedDataItem[]): MediaAsset[] {\n return items.flatMap((item) => mediaFromEmbeddedItem(item, VIDEO_KEYS, \"video\"));\n}\n\nfunction embeddedAudio(items: EmbeddedDataItem[]): MediaAsset[] {\n return items.flatMap((item) => mediaFromEmbeddedItem(item, AUDIO_KEYS, \"audio\"));\n}\n\nfunction mediaFromEmbeddedItem(item: EmbeddedDataItem, keys: string[], kind: MediaAsset[\"kind\"]): MediaAsset[] {\n const assets: MediaAsset[] = [];\n walkEmbeddedData(item.data, (value, key, parent) => {\n if (!key || !keys.some((candidate) => candidate.toLowerCase() === key.toLowerCase())) {\n if (typeof value === \"string\" && looksLikeMediaUrl(value, kind) && key && keys.some((candidate) => key.toLowerCase().includes(candidate.toLowerCase()))) {\n assets.push(assetFromEmbedded(value, kind, item, parent));\n }\n return;\n }\n\n assets.push(...mediaFromJsonValue(value, kind, item.source));\n });\n\n return assets;\n}\n\nfunction mediaFromJsonValue(value: unknown, kind: MediaAsset[\"kind\"], source: string): MediaAsset[] {\n if (!value) {\n return [];\n }\n\n if (typeof value === \"string\") {\n return looksLikeMediaUrl(value, kind) ? [{ url: value, kind, source }] : [];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => mediaFromJsonValue(item, kind, source));\n }\n\n if (isRecord(value)) {\n const srcset = stringFromUnknown(value.srcset) ?? stringFromUnknown(value.srcSet);\n const srcsetAssets = parseSrcset(srcset).flatMap((url) => mediaFromJsonValue(url, kind, source));\n const url = mediaUrlFromRecord(value, kind);\n const nestedDetails = nestedMediaDetailsRecord(value, kind);\n if (!url || !looksLikeMediaUrl(url, kind)) {\n return srcsetAssets;\n }\n\n return [\n {\n url,\n kind,\n source,\n width: parseNumber(stringFromUnknown(value.width)) ?? parseNumber(stringFromUnknown(nestedDetails?.width)),\n height: parseNumber(stringFromUnknown(value.height)) ?? parseNumber(stringFromUnknown(nestedDetails?.height)),\n alt: stringFromUnknown(value.alt) ?? stringFromUnknown(value.caption) ?? stringFromUnknown(value.name) ?? stringFromUnknown(nestedDetails?.alt),\n title: stringFromUnknown(value.title) ?? stringFromUnknown(nestedDetails?.title),\n type: stringFromUnknown(value.type) ?? stringFromUnknown(value.mimeType) ?? stringFromUnknown(value.encodingFormat) ?? stringFromUnknown(nestedDetails?.type),\n metadata: isRecord(value.metadata) ? value.metadata : undefined\n },\n ...srcsetAssets\n ];\n }\n\n return [];\n}\n\nfunction nestedMediaDetailsRecord(value: JsonLdNode, kind: MediaAsset[\"kind\"]): JsonLdNode | undefined {\n const candidates = [\n value.source,\n value.original,\n value.image,\n value.thumbnail,\n value.thumbnailUrl,\n value.thumbnail_url,\n value.previewImage,\n value.preview_image,\n value.video,\n value.reddit_video\n ];\n\n return candidates.find((candidate): candidate is JsonLdNode => isRecord(candidate) && Boolean(mediaUrlFromRecord(candidate, kind)));\n}\n\nfunction mediaUrlFromRecord(value: JsonLdNode, kind: MediaAsset[\"kind\"]): string | undefined {\n const commonCandidates = [\n value.url,\n value.src,\n value.secure_url,\n value.secureUrl,\n value.contentUrl,\n value.content_url,\n value.embedUrl,\n value.embed_url,\n value.thumbnailUrl,\n value.thumbnail_url,\n value.thumbnailSrc,\n value.thumbnail_src,\n value.mediaUrl,\n value.media_url,\n value.media_url_https,\n value.displayUrl,\n value.display_url,\n value.fullPicture,\n value.full_picture,\n value.previewImage,\n value.preview_image,\n value.poster,\n value.posterUrl,\n value.poster_url,\n value.coverImage,\n value.cover_image,\n value.original,\n value.source\n ];\n\n const videoCandidates = [\n value.videoUrl,\n value.video_url,\n value.playbackUrl,\n value.playback_url,\n value.fallback_url,\n value.hls_url,\n value.dash_url\n ];\n\n const candidates = kind === \"video\" ? [...videoCandidates, ...commonCandidates] : commonCandidates;\n return candidates.map(stringFromUnknown).find((candidate) => candidate && looksLikeMediaUrl(candidate, kind));\n}\n\nfunction assetFromEmbedded(value: string, kind: MediaAsset[\"kind\"], item: EmbeddedDataItem, parent: JsonLdNode | undefined): MediaAsset {\n return {\n url: value,\n kind,\n source: item.source,\n width: parseNumber(stringFromUnknown(parent?.width)),\n height: parseNumber(stringFromUnknown(parent?.height)),\n alt: stringFromUnknown(parent?.alt) ?? stringFromUnknown(parent?.caption),\n title: stringFromUnknown(parent?.title),\n metadata: {\n embeddedPath: item.path\n }\n };\n}\n\nfunction oEmbedImages(rawSources: RawMetadataSources): MediaAsset[] {\n return rawSources.oEmbed.data.flatMap((data) => {\n const images: MediaAsset[] = [];\n if (data.thumbnail_url) {\n images.push({\n url: data.thumbnail_url,\n kind: \"image\",\n source: \"oEmbed\",\n width: data.thumbnail_width,\n height: data.thumbnail_height\n });\n }\n\n if (data.type === \"photo\" && data.url) {\n images.push({\n url: data.url,\n kind: \"image\",\n source: \"oEmbed\",\n width: data.width,\n height: data.height\n });\n }\n\n return images;\n });\n}\n\nfunction dedupeMediaBySignature(assets: MediaAsset[]): MediaAsset[] {\n const seen = new Map<string, MediaAsset>();\n\n for (const asset of assets) {\n const key = mediaSignature(asset.url);\n const current = seen.get(key);\n if (!current || mediaRank(asset) > mediaRank(current)) {\n seen.set(key, asset);\n }\n }\n\n return [...seen.values()];\n}\n\nfunction mediaSignature(url: string): string {\n try {\n const parsed = new URL(url);\n const pathname = parsed.pathname\n .replace(/[-_](?:\\d{2,5}x\\d{2,5}|\\d{2,5}w|small|medium|large|thumb|thumbnail)(?=\\.)/i, \"\")\n .toLowerCase();\n\n return `${parsed.hostname.toLowerCase()}${pathname}`;\n } catch {\n return url.toLowerCase();\n }\n}\n\nfunction sourceRank(source: string): number {\n const ranks: Record<string, number> = {\n adapter: 90,\n openGraph: 80,\n twitter: 75,\n jsonLd: 70,\n oEmbed: 65,\n nextData: 64,\n nuxt: 62,\n initialState: 61,\n preloadedState: 60,\n apollo: 59,\n applicationJson: 58,\n jsonScript: 55,\n html: 40,\n fallback: 30\n };\n\n return ranks[source] ?? 50;\n}\n\nfunction mediaRank(asset: MediaAsset): number {\n const redditPriority = redditImagePriority(asset);\n return redditPriority > 0 ? 1_000 + redditPriority : sourceRank(asset.source);\n}\n\nfunction shouldIgnoreMediaUrl(url: string): boolean {\n const normalized = url.toLowerCase();\n return (\n normalized.startsWith(\"data:\") ||\n normalized.startsWith(\"blob:\") ||\n normalized.startsWith(\"javascript:\") ||\n /(?:sprite|spacer|blank|transparent|placeholder|tracking|beacon|pixel|emoji|favicon|apple-touch-icon)(?:[._/-]|$|\\?)/i.test(normalized) ||\n /(?:^|[/?_-])1x1(?:[._/-]|$|\\?)/i.test(normalized)\n );\n}\n\nfunction looksLikeMediaUrl(value: string, kind: MediaAsset[\"kind\"]): boolean {\n if (shouldIgnoreMediaUrl(value)) {\n return false;\n }\n\n if (/^https?:\\/\\//i.test(value) || value.startsWith(\"/\") || value.startsWith(\"./\") || value.startsWith(\"../\")) {\n if (kind === \"image\") {\n return (\n /\\.(?:avif|webp|png|jpe?g|gif)(?:[?#].*)?$/i.test(value) ||\n /(?:image|thumb|thumbnail|cover|poster|preview|media|og|card|photo|format=(?:jpg|jpeg|png|webp))/i.test(value) ||\n /(?:ytimg\\.com|i\\.redd\\.it|preview\\.redd\\.it|external-preview\\.redd\\.it|pbs\\.twimg\\.com|pinimg\\.com|cdninstagram\\.com|fbcdn\\.net|tiktokcdn\\.com|behance\\.net)/i.test(value)\n );\n }\n\n if (kind === \"video\") {\n return /\\.(?:mp4|webm|m3u8|mov)(?:[?#].*)?$/i.test(value) || /(?:video|embed|player|watch|reel|shorts|v\\.redd\\.it)/i.test(value);\n }\n\n if (kind === \"audio\") {\n return /\\.(?:mp3|m4a|wav|ogg|aac)(?:[?#].*)?$/i.test(value) || /(?:audio|podcast)/i.test(value);\n }\n }\n\n return false;\n}\n\nfunction walkEmbeddedData(value: unknown, visit: (value: unknown, key: string | undefined, parent: JsonLdNode | undefined) => void, key?: string, parent?: JsonLdNode, depth = 0): void {\n if (depth > 8) {\n return;\n }\n\n visit(value, key, parent);\n\n if (Array.isArray(value)) {\n for (const item of value.slice(0, 250)) {\n walkEmbeddedData(item, visit, undefined, parent, depth + 1);\n }\n return;\n }\n\n if (isRecord(value)) {\n for (const [childKey, childValue] of Object.entries(value).slice(0, 500)) {\n walkEmbeddedData(childValue, visit, childKey, value, depth + 1);\n }\n }\n}\n\nfunction stripUndefined<T extends object>(value: T): Partial<T> {\n return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined && item !== null && (!Array.isArray(item) || item.length > 0))) as Partial<T>;\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n\n if (isRecord(value)) {\n return stringFromUnknown(value.url) ?? stringFromUnknown(value.src) ?? stringFromUnknown(value.name);\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is JsonLdNode {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { AdapterExtractionResult, ConfidenceBreakdown, Entity, MediaAsset, RawMetadataSources } from \"../types/index.js\";\n\nexport interface ConfidenceEngineInput {\n title?: string;\n description?: string;\n bestImage?: MediaAsset;\n canonicalUrl?: string;\n author?: Entity;\n hasStructuredData: boolean;\n rawSources: RawMetadataSources;\n sourcesUsed: string[];\n warnings: string[];\n}\n\nexport interface CompletenessInput {\n title?: string;\n description?: string;\n bestImage?: MediaAsset;\n canonicalUrl?: string;\n siteName?: string;\n author?: Entity;\n publisher?: Entity;\n type?: string;\n publishedTime?: string;\n mediaCount: number;\n}\n\nexport interface ReliabilityInput {\n confidence: number;\n completeness: number;\n adapterMatched: boolean;\n bestImage?: MediaAsset;\n warnings: string[];\n}\n\nexport function calculateConfidence(input: ConfidenceEngineInput): number {\n let score = 0;\n\n score += qualityPoints(input.title, 18, 6, 120);\n score += qualityPoints(input.description, 16, 24, 300);\n\n if (input.bestImage) {\n score += 18;\n score += Math.min(input.bestImage.score ?? 0, 100) * 0.12;\n score += sourceConfidenceBonus(input.bestImage.source);\n }\n\n if (input.canonicalUrl) {\n score += 10;\n }\n\n if (input.hasStructuredData) {\n score += 12;\n }\n\n if (adapterSucceeded(input.rawSources.adapters)) {\n score += 8;\n }\n\n if (input.sourcesUsed.includes(\"openGraph\")) {\n score += 6;\n }\n\n if (input.sourcesUsed.includes(\"twitter\")) {\n score += 4;\n }\n\n if (input.rawSources.embeddedData.items.length > 0) {\n score += 6;\n }\n\n score -= Math.min(input.warnings.length * 3, 18);\n\n return Math.round(clamp(score, 0, 100));\n}\n\nexport function calculateConfidenceBreakdown(input: ConfidenceEngineInput): ConfidenceBreakdown {\n const title = qualityPoints(input.title, 100, 6, 120);\n const description = qualityPoints(input.description, 100, 24, 300);\n const image = input.bestImage\n ? clamp(58 + Math.min(input.bestImage.score ?? 0, 100) * 0.27 + sourceConfidenceBonus(input.bestImage.source), 0, 100)\n : 0;\n const structuredData = input.hasStructuredData\n ? 100\n : input.rawSources.embeddedData.items.length > 0\n ? 55\n : 0;\n const adapter = adapterSucceeded(input.rawSources.adapters) ? adapterConfidence(input.rawSources.adapters[0]) : 0;\n\n return {\n title: Math.round(title),\n description: Math.round(description),\n image: Math.round(image),\n structuredData: Math.round(structuredData),\n adapter: Math.round(adapter)\n };\n}\n\nexport function calculateCompleteness(input: CompletenessInput): number {\n const weights = [\n input.title ? 20 : 0,\n input.description ? 16 : 0,\n input.bestImage ? 20 : 0,\n input.canonicalUrl ? 12 : 0,\n input.siteName ? 8 : 0,\n input.author ? 8 : 0,\n input.publisher ? 5 : 0,\n input.type && input.type !== \"unknown\" ? 6 : 0,\n input.publishedTime ? 3 : 0,\n input.mediaCount > 1 ? 2 : 0\n ];\n\n return Math.round(clamp(weights.reduce((total, value) => total + value, 0), 0, 100));\n}\n\nexport function calculateReliability(input: ReliabilityInput): number {\n let score = input.confidence * 0.45 + input.completeness * 0.3;\n\n if (input.adapterMatched) {\n score += 10;\n }\n\n if ((input.bestImage?.score ?? 0) >= 80) {\n score += 10;\n } else if (input.bestImage) {\n score += 5;\n }\n\n score -= Math.min(input.warnings.length * 4, 20);\n\n return Math.round(clamp(score, 0, 100));\n}\n\nfunction qualityPoints(value: string | undefined, maxPoints: number, idealMinLength: number, idealMaxLength: number): number {\n if (!value) {\n return 0;\n }\n\n const normalized = value.replace(/\\s+/g, \" \").trim();\n if (!normalized) {\n return 0;\n }\n\n let points = maxPoints;\n\n if (normalized.length < idealMinLength) {\n points *= normalized.length / idealMinLength;\n }\n\n if (normalized.length > idealMaxLength) {\n points *= Math.max(0.4, idealMaxLength / normalized.length);\n }\n\n if (/^(home|untitled|index|login|sign in)$/i.test(normalized)) {\n points *= 0.35;\n }\n\n return points;\n}\n\nfunction sourceConfidenceBonus(source: string): number {\n if (source === \"adapter\") {\n return 8;\n }\n\n if (source === \"openGraph\" || source === \"twitter\") {\n return 7;\n }\n\n if (source === \"jsonLd\" || source === \"oEmbed\") {\n return 6;\n }\n\n if ([\"nextData\", \"nuxt\", \"initialState\", \"preloadedState\", \"apollo\", \"applicationJson\"].includes(source)) {\n return 5;\n }\n\n if (source === \"html\") {\n return 3;\n }\n\n return 1;\n}\n\nfunction adapterSucceeded(adapters: AdapterExtractionResult[]): boolean {\n return adapters.some((adapter) => Boolean(adapter.title || adapter.description || adapter.images?.length || adapter.videos?.length));\n}\n\nfunction adapterConfidence(adapter: AdapterExtractionResult | undefined): number {\n if (!adapter) {\n return 0;\n }\n\n let score = 45;\n if (adapter.title) {\n score += 22;\n }\n if (adapter.description) {\n score += 14;\n }\n if ((adapter.images?.length ?? 0) > 0 || (adapter.videos?.length ?? 0) > 0) {\n score += 14;\n }\n if (adapter.author) {\n score += 6;\n }\n\n return clamp(score, 0, 100);\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","import type {\n AdapterExtractionResult,\n ApplicationMetadata,\n ArticleMetadata,\n ExtractionFallbackAttempt,\n Entity,\n ExtractionDiagnostics,\n ExtractionRetryInfo,\n ImageScorer,\n JsonLdNode,\n MediaAsset,\n MetadataType,\n ProductMetadata,\n RawMetadataSources,\n UnifiedMetadata\n} from \"../types/index.js\";\nimport { firstDefined, parseNumber } from \"../utils/html.js\";\nimport { tryResolveUrl } from \"../utils/url.js\";\nimport { selectBestImage } from \"../scorers/image.js\";\nimport { discoverMedia } from \"../media/index.js\";\nimport { calculateCompleteness, calculateConfidence, calculateConfidenceBreakdown, calculateReliability } from \"../engines/index.js\";\n\nexport interface NormalizeContext {\n url?: string;\n finalUrl?: string;\n diagnostics?: ExtractionDiagnostics;\n imageScorers?: ImageScorer[];\n includeRaw?: boolean;\n}\n\nexport function normalizeMetadata(rawSources: RawMetadataSources, context: NormalizeContext = {}): UnifiedMetadata {\n const finalUrl = context.finalUrl ?? context.url ?? \"\";\n const url = context.url ?? finalUrl;\n const externalResults = [...rawSources.plugins, ...rawSources.adapters];\n const jsonLdNodes = rawSources.jsonLd.nodes;\n const embeddedNodes = rawSources.embeddedData.items.map((item) => item.data);\n const articleNode = findJsonLdNode(jsonLdNodes, [\"Article\", \"NewsArticle\", \"BlogPosting\"]);\n const productNode = findJsonLdNode(jsonLdNodes, [\"Product\"]);\n const appNode = findJsonLdNode(jsonLdNodes, [\"SoftwareApplication\", \"MobileApplication\", \"WebApplication\"]);\n const organizationNode = findJsonLdNode(jsonLdNodes, [\"Organization\", \"NewsMediaOrganization\", \"WebSite\"]);\n const canonicalUrl = tryResolveUrl(\n firstDefined(\n firstResultValue(externalResults, (result) => result.canonicalUrl),\n rawSources.html.canonicalUrl,\n rawSources.openGraph.url,\n jsonString(jsonLdNodes, \"url\"),\n findStringByKeys(embeddedNodes, [\"canonicalUrl\", \"canonical\", \"permalink\", \"pageUrl\", \"shareUrl\"])\n ),\n finalUrl\n );\n\n const title = firstDefined(\n firstResultValue(externalResults, (result) => result.title),\n rawSources.openGraph.title,\n rawSources.twitter.title,\n jsonString([articleNode, productNode, appNode, organizationNode].filter(isJsonLdNode), \"headline\"),\n jsonString([articleNode, productNode, appNode, organizationNode].filter(isJsonLdNode), \"name\"),\n findStringByKeys(embeddedNodes, [\"title\", \"headline\", \"pageTitle\", \"ogTitle\", \"name\"]),\n rawSources.html.title\n );\n\n const description = firstDefined(\n firstResultValue(externalResults, (result) => result.description),\n rawSources.openGraph.description,\n rawSources.twitter.description,\n jsonString([articleNode, productNode, appNode, organizationNode].filter(isJsonLdNode), \"description\"),\n findStringByKeys(embeddedNodes, [\"description\", \"excerpt\", \"summary\", \"subtitle\", \"ogDescription\"]),\n rawSources.html.description\n );\n\n const siteName = firstDefined(\n firstResultValue(externalResults, (result) => result.siteName),\n rawSources.openGraph.siteName,\n jsonString([organizationNode].filter(isJsonLdNode), \"name\"),\n findStringByKeys(embeddedNodes, [\"siteName\", \"site_name\", \"appName\", \"applicationName\"]),\n domainName(finalUrl)\n );\n\n const mediaDiscovery = discoverMedia(rawSources, finalUrl);\n const images = mediaDiscovery.images;\n const videos = mediaDiscovery.videos;\n const audio = mediaDiscovery.audio;\n const favicons = normalizeAssets(rawSources.html.favicons, finalUrl);\n const selectedImage = selectBestImage(images, context.imageScorers);\n const article = mergeArticle(rawSources, externalResults, articleNode, embeddedNodes);\n const product = mergeProduct(rawSources, externalResults, productNode);\n const app = mergeApp(rawSources, externalResults, appNode);\n const video = mergeVideo(rawSources, externalResults, jsonLdNodes, embeddedNodes, videos);\n const playlist = mergePlaylist(externalResults);\n const type = inferType(rawSources, externalResults, jsonLdNodes, article, product, app, playlist, videos, audio);\n const author = firstResultValue(externalResults, (result) => result.author) ?? firstEntity(article?.authors) ?? entityFromEmbedded(embeddedNodes, [\"author\", \"creator\", \"owner\", \"user\"]);\n const publisher = article?.publisher ?? firstResultValue(externalResults, (result) => result.publisher) ?? entityFromJsonLd(organizationNode) ?? entityFromEmbedded(embeddedNodes, [\"publisher\", \"provider\", \"organization\"]);\n const publishDate = firstDefined(article?.publishedTime, video?.publishedTime);\n const sourcesUsed = detectSourcesUsed(rawSources);\n const warnings = diagnosticsWarnings(rawSources, externalResults, context.diagnostics);\n const fieldSources = {\n title: fieldSource(rawSources, externalResults, embeddedNodes, \"title\", selectedImage.best),\n description: fieldSource(rawSources, externalResults, embeddedNodes, \"description\", selectedImage.best),\n author: fieldSource(rawSources, externalResults, embeddedNodes, \"author\", selectedImage.best),\n image: fieldSource(rawSources, externalResults, embeddedNodes, \"image\", selectedImage.best)\n };\n const confidenceInput = {\n title,\n description,\n bestImage: selectedImage.best,\n canonicalUrl,\n hasStructuredData: jsonLdNodes.length > 0,\n rawSources,\n sourcesUsed,\n warnings\n };\n const confidence = calculateConfidence(confidenceInput);\n const confidenceBreakdown = calculateConfidenceBreakdown(confidenceInput);\n const completeness = calculateCompleteness({\n title,\n description,\n bestImage: selectedImage.best,\n canonicalUrl,\n siteName,\n author,\n publisher,\n type,\n publishedTime: publishDate,\n mediaCount: images.length + videos.length + audio.length\n });\n const reliability = calculateReliability({\n confidence,\n completeness,\n adapterMatched: rawSources.adapters.length > 0,\n bestImage: selectedImage.best,\n warnings\n });\n const diagnostics = context.diagnostics ?? {\n redirects: [],\n sourcesUsed: [],\n warnings: [],\n trace: [],\n extractedAt: new Date().toISOString()\n };\n\n diagnostics.sourcesUsed = uniqueStrings([...diagnostics.sourcesUsed, ...sourcesUsed]);\n diagnostics.warnings = uniqueStrings([...diagnostics.warnings, ...rawSources.jsonLd.warnings, ...externalResults.flatMap((result) => result.warnings ?? [])]);\n diagnostics.adapterUsed = diagnostics.adapterUsed ?? rawSources.adapters[0]?.source;\n diagnostics.extractionMethod = diagnostics.extractionMethod ?? adapterRawString(rawSources.adapters[0], \"extractionMethod\") ?? fieldSources.title;\n diagnostics.sourcePriority = uniqueStrings([\n ...(diagnostics.sourcePriority ?? []),\n ...(arrayOfStrings(rawSources.adapters[0]?.raw?.sourcePriority) ?? [])\n ]);\n diagnostics.fallbacksAttempted = mergeFallbackAttempts(\n diagnostics.fallbacksAttempted,\n fallbackAttemptsFromUnknown(rawSources.adapters[0]?.raw?.fallbacksAttempted)\n );\n diagnostics.retryInfo = diagnostics.retryInfo ?? retryInfoFromUnknown(rawSources.adapters[0]?.raw?.retryInfo);\n diagnostics.selectedImageReason = selectedImage.reason;\n diagnostics.confidenceBreakdown = confidenceBreakdown;\n diagnostics.originalUrl = diagnostics.originalUrl ?? url;\n diagnostics.finalUrl = diagnostics.finalUrl ?? finalUrl;\n diagnostics.canonicalUrl = canonicalUrl;\n diagnostics.adapter = adapterDiagnostics(rawSources.adapters);\n diagnostics.trace = uniqueStrings([\n ...diagnostics.trace,\n ...mediaDiscovery.trace,\n ...(selectedImage.best ? [`selected image from ${sourceLabel(selectedImage.best)}`] : [])\n ]);\n\n const normalized = stripUndefined({\n ok: true,\n url,\n finalUrl,\n type,\n title,\n description,\n publishDate,\n siteName,\n canonicalUrl,\n confidence,\n completeness,\n reliability,\n bestImage: selectedImage.best?.url,\n images: selectedImage.images,\n videos,\n audio,\n favicons,\n article,\n product,\n video,\n playlist,\n author,\n publisher,\n app,\n sources: fieldSources,\n raw: context.includeRaw ? rawSources : undefined,\n diagnostics,\n trace: diagnostics.trace\n }) as UnifiedMetadata;\n\n normalized.images = selectedImage.images;\n normalized.videos = videos;\n normalized.audio = audio;\n normalized.favicons = favicons;\n normalized.trace = diagnostics.trace;\n\n return normalized;\n}\n\nfunction normalizeAssets(assets: MediaAsset[], baseUrl: string): MediaAsset[] {\n return assets\n .map((asset) => {\n const secureUrl = tryResolveUrl(asset.secureUrl, baseUrl);\n const url = tryResolveUrl(secureUrl ?? asset.url, baseUrl);\n const poster = tryResolveUrl(asset.poster, baseUrl);\n\n if (!url) {\n return undefined;\n }\n\n return stripUndefined({\n ...asset,\n url,\n secureUrl,\n poster\n }) as MediaAsset;\n })\n .filter((asset): asset is MediaAsset => Boolean(asset));\n}\n\nfunction mergeArticle(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n articleNode: JsonLdNode | undefined,\n embeddedNodes: JsonLdNode[]\n): ArticleMetadata | undefined {\n const embeddedAuthor = entityFromEmbedded(embeddedNodes, [\"author\", \"creator\", \"owner\", \"user\"]);\n const embeddedPublisher = entityFromEmbedded(embeddedNodes, [\"publisher\", \"provider\", \"organization\"]);\n const article: ArticleMetadata = {\n ...rawSources.openGraph.article,\n ...mergePartialObjects(externalResults.map((result) => result.article)),\n headline: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.headline),\n jsonString([articleNode].filter(isJsonLdNode), \"headline\"),\n findStringByKeys(embeddedNodes, [\"headline\", \"title\", \"postTitle\", \"pinTitle\", \"projectTitle\"]),\n rawSources.openGraph.article?.headline,\n rawSources.openGraph.title\n ),\n section: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.section),\n rawSources.openGraph.article?.section,\n jsonString([articleNode].filter(isJsonLdNode), \"articleSection\")\n ),\n publishedTime: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.publishedTime),\n rawSources.openGraph.article?.publishedTime,\n jsonString([articleNode].filter(isJsonLdNode), \"datePublished\"),\n findStringByKeys(embeddedNodes, [\"datePublished\", \"publishedTime\", \"published_at\", \"createdAt\", \"created_at\", \"timestamp\"])\n ),\n modifiedTime: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.modifiedTime),\n rawSources.openGraph.article?.modifiedTime,\n jsonString([articleNode].filter(isJsonLdNode), \"dateModified\")\n ),\n expirationTime: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.expirationTime),\n rawSources.openGraph.article?.expirationTime\n ),\n tags: uniqueStrings([\n ...(rawSources.openGraph.article?.tags ?? []),\n ...jsonKeywords(articleNode)\n ]),\n authors: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.authors),\n rawSources.openGraph.article?.authors,\n entitiesFromJsonLd(articleNode?.author),\n embeddedAuthor ? [embeddedAuthor] : undefined\n ),\n publisher: firstDefined(\n firstResultValue(externalResults, (result) => result.article?.publisher),\n rawSources.openGraph.article?.publisher,\n entityFromJsonLd(articleNode?.publisher),\n embeddedPublisher\n )\n };\n\n return emptyToUndefined(article);\n}\n\nfunction mergeProduct(\n _rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n productNode: JsonLdNode | undefined\n): ProductMetadata | undefined {\n const offers = firstRecord(productNode?.offers);\n const aggregateRating = firstRecord(productNode?.aggregateRating);\n const product: ProductMetadata = {\n ...mergePartialObjects(externalResults.map((result) => result.product)),\n name: firstDefined(firstResultValue(externalResults, (result) => result.product?.name), jsonString([productNode].filter(isJsonLdNode), \"name\")),\n brand: firstDefined(firstResultValue(externalResults, (result) => result.product?.brand), entityFromJsonLd(productNode?.brand)),\n sku: firstDefined(firstResultValue(externalResults, (result) => result.product?.sku), jsonString([productNode].filter(isJsonLdNode), \"sku\")),\n price: firstDefined(firstResultValue(externalResults, (result) => result.product?.price), jsonString([offers].filter(isJsonLdNode), \"price\")),\n currency: firstDefined(\n firstResultValue(externalResults, (result) => result.product?.currency),\n jsonString([offers].filter(isJsonLdNode), \"priceCurrency\")\n ),\n availability: firstDefined(\n firstResultValue(externalResults, (result) => result.product?.availability),\n shortSchemaValue(jsonString([offers].filter(isJsonLdNode), \"availability\"))\n ),\n condition: firstDefined(\n firstResultValue(externalResults, (result) => result.product?.condition),\n shortSchemaValue(jsonString([offers].filter(isJsonLdNode), \"itemCondition\"))\n ),\n ratingValue: firstDefined(\n firstResultValue(externalResults, (result) => result.product?.ratingValue),\n parseNumber(jsonString([aggregateRating].filter(isJsonLdNode), \"ratingValue\"))\n ),\n reviewCount: firstDefined(\n firstResultValue(externalResults, (result) => result.product?.reviewCount),\n parseNumber(jsonString([aggregateRating].filter(isJsonLdNode), \"reviewCount\"))\n )\n };\n\n return emptyToUndefined(product);\n}\n\nfunction mergeApp(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n appNode: JsonLdNode | undefined\n): ApplicationMetadata | undefined {\n const offers = firstRecord(appNode?.offers);\n const app: ApplicationMetadata = {\n ...mergePartialObjects(externalResults.map((result) => result.app)),\n name: firstDefined(\n firstResultValue(externalResults, (result) => result.app?.name),\n rawSources.html.applicationName,\n jsonString([appNode].filter(isJsonLdNode), \"name\")\n ),\n category: firstDefined(firstResultValue(externalResults, (result) => result.app?.category), jsonString([appNode].filter(isJsonLdNode), \"applicationCategory\")),\n operatingSystem: firstDefined(\n firstResultValue(externalResults, (result) => result.app?.operatingSystem),\n jsonString([appNode].filter(isJsonLdNode), \"operatingSystem\")\n ),\n price: firstDefined(firstResultValue(externalResults, (result) => result.app?.price), jsonString([offers].filter(isJsonLdNode), \"price\")),\n currency: firstDefined(firstResultValue(externalResults, (result) => result.app?.currency), jsonString([offers].filter(isJsonLdNode), \"priceCurrency\"))\n };\n\n return emptyToUndefined(app);\n}\n\nfunction mergeVideo(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n jsonLdNodes: JsonLdNode[],\n embeddedNodes: JsonLdNode[],\n videos: MediaAsset[]\n) {\n const externalVideo = mergePartialObjects(externalResults.map((result) => result.video));\n const hasExternalVideo = Object.keys(externalVideo).length > 0;\n const explicitExternalType = firstResultValue(externalResults, (result) => result.type);\n const videoNode = findJsonLdNode(jsonLdNodes, [\"VideoObject\"]);\n const openGraphType = rawSources.openGraph.type?.toLowerCase() ?? \"\";\n const canTrustEmbeddedVideo =\n !explicitExternalType ||\n explicitExternalType === \"video\" ||\n explicitExternalType === \"playlist\" ||\n openGraphType.includes(\"video\") ||\n Boolean(videoNode);\n\n if (!hasExternalVideo && !canTrustEmbeddedVideo) {\n return undefined;\n }\n\n const canUseEmbeddedFallbacks = hasExternalVideo || canTrustEmbeddedVideo;\n const video = {\n ...externalVideo,\n id: firstDefined(\n firstResultValue(externalResults, (result) => result.video?.id),\n canUseEmbeddedFallbacks ? findStringByKeys([videoNode, ...embeddedNodes].filter(isJsonLdNode), [\"videoId\", \"video_id\"]) : undefined\n ),\n title: firstDefined(\n firstResultValue(externalResults, (result) => result.video?.title),\n jsonString([videoNode].filter(isJsonLdNode), \"name\"),\n canUseEmbeddedFallbacks ? rawSources.openGraph.title : undefined,\n canUseEmbeddedFallbacks ? findStringByKeys(embeddedNodes, [\"videoTitle\", \"title\"]) : undefined\n ),\n channel: firstDefined(firstResultValue(externalResults, (result) => result.video?.channel), entityFromEmbedded(embeddedNodes, [\"channel\", \"ownerChannelName\", \"author\"])),\n publishedTime: firstDefined(\n firstResultValue(externalResults, (result) => result.video?.publishedTime),\n jsonString([videoNode].filter(isJsonLdNode), \"uploadDate\"),\n canUseEmbeddedFallbacks ? findStringByKeys(embeddedNodes, [\"publishDate\", \"publishedTime\", \"uploadDate\", \"datePublished\"]) : undefined\n ),\n duration: firstDefined(\n firstResultValue(externalResults, (result) => result.video?.duration),\n jsonString([videoNode].filter(isJsonLdNode), \"duration\"),\n canUseEmbeddedFallbacks ? findStringByKeys(embeddedNodes, [\"duration\", \"lengthSeconds\"]) : undefined\n ),\n category: firstDefined(firstResultValue(externalResults, (result) => result.video?.category), canUseEmbeddedFallbacks ? findStringByKeys(embeddedNodes, [\"category\"]) : undefined),\n viewCount: firstDefined(\n firstResultValue(externalResults, (result) => result.video?.viewCount),\n canUseEmbeddedFallbacks ? parseNumber(findStringByKeys(embeddedNodes, [\"viewCount\", \"views\"])) : undefined\n ),\n tags: firstDefined(firstResultValue(externalResults, (result) => result.video?.tags), canUseEmbeddedFallbacks ? arrayOfStrings(findValueByKeys(embeddedNodes, [\"tags\", \"keywords\"])) : undefined)\n };\n\n const cleaned = emptyToUndefined(video);\n const hasUsefulVideoIdentity =\n Boolean(cleaned?.id) ||\n Boolean(cleaned?.duration) ||\n Boolean(cleaned?.channel) ||\n Boolean(cleaned?.publishedTime) ||\n videos.length > 0 ||\n rawSources.openGraph.videos.length > 0 ||\n rawSources.twitter.videos.length > 0 ||\n Boolean(videoNode);\n\n if (!cleaned || (!hasExternalVideo && !hasUsefulVideoIdentity)) {\n return undefined;\n }\n\n return cleaned;\n}\n\nfunction mergePlaylist(externalResults: AdapterExtractionResult[]) {\n const playlist = firstResultValue(externalResults, (result) => result.playlist);\n if (!playlist) {\n return undefined;\n }\n\n return {\n videos: [],\n ...playlist\n };\n}\n\nfunction inferType(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n jsonLdNodes: JsonLdNode[],\n article: ArticleMetadata | undefined,\n product: ProductMetadata | undefined,\n app: ApplicationMetadata | undefined,\n playlist: unknown,\n videos: MediaAsset[],\n audio: MediaAsset[]\n): MetadataType {\n const explicit = firstResultValue(externalResults, (result) => result.type);\n if (explicit) {\n return explicit;\n }\n\n if (playlist) {\n return \"playlist\";\n }\n\n const ogType = rawSources.openGraph.type?.toLowerCase();\n if (ogType?.includes(\"article\") || article) {\n return \"article\";\n }\n\n if (ogType?.includes(\"product\") || product || hasJsonLdType(jsonLdNodes, [\"Product\"])) {\n return \"product\";\n }\n\n if (ogType?.includes(\"image\") || hasJsonLdType(jsonLdNodes, [\"ImageObject\"])) {\n return \"image\";\n }\n\n if (ogType?.includes(\"video\") || videos.length > 0 || hasJsonLdType(jsonLdNodes, [\"VideoObject\"])) {\n return \"video\";\n }\n\n if (ogType?.includes(\"audio\") || audio.length > 0 || hasJsonLdType(jsonLdNodes, [\"AudioObject\", \"MusicRecording\", \"PodcastEpisode\"])) {\n return \"audio\";\n }\n\n if (app || hasJsonLdType(jsonLdNodes, [\"SoftwareApplication\", \"MobileApplication\", \"WebApplication\"])) {\n return \"app\";\n }\n\n if (ogType?.includes(\"profile\") || hasJsonLdType(jsonLdNodes, [\"Person\"])) {\n return \"profile\";\n }\n\n return rawSources.openGraph.raw[\"og:type\"] || rawSources.html.title ? \"website\" : \"unknown\";\n}\n\nfunction detectSourcesUsed(rawSources: RawMetadataSources): string[] {\n const sources: string[] = [];\n\n if (Object.keys(rawSources.openGraph.raw).length > 0) {\n sources.push(\"openGraph\");\n }\n\n if (Object.keys(rawSources.twitter.raw).length > 0) {\n sources.push(\"twitter\");\n }\n\n if (rawSources.jsonLd.nodes.length > 0) {\n sources.push(\"jsonLd\");\n }\n\n if (rawSources.embeddedData.items.length > 0) {\n sources.push(\"embeddedData\", ...rawSources.embeddedData.items.map((item) => item.source));\n }\n\n if (rawSources.oEmbed.links.length > 0 || rawSources.oEmbed.data.length > 0) {\n sources.push(\"oEmbed\");\n }\n\n if (rawSources.html.title || rawSources.html.description || rawSources.html.canonicalUrl) {\n sources.push(\"html\");\n }\n\n if (rawSources.images.length > 0 || rawSources.videos.length > 0 || rawSources.audio.length > 0) {\n sources.push(\"media\");\n }\n\n sources.push(...rawSources.adapters.map((result) => result.source), ...rawSources.plugins.map((result) => result.source));\n return sources;\n}\n\nfunction diagnosticsWarnings(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n diagnostics: ExtractionDiagnostics | undefined\n): string[] {\n return uniqueStrings([\n ...(diagnostics?.warnings ?? []),\n ...rawSources.jsonLd.warnings,\n ...externalResults.flatMap((result) => result.warnings ?? [])\n ]);\n}\n\nfunction adapterDiagnostics(adapters: AdapterExtractionResult[]): ExtractionDiagnostics[\"adapter\"] {\n const adapter = adapters[0];\n if (!adapter) {\n return { matched: false };\n }\n\n let confidence = 55;\n if (adapter.title) {\n confidence += 15;\n }\n if (adapter.description) {\n confidence += 10;\n }\n if ((adapter.images?.length ?? 0) > 0 || (adapter.videos?.length ?? 0) > 0) {\n confidence += 15;\n }\n if (adapter.author) {\n confidence += 5;\n }\n\n return {\n matched: true,\n name: adapter.source,\n confidence: Math.min(confidence, 100)\n };\n}\n\nfunction adapterRawString(adapter: AdapterExtractionResult | undefined, key: string): string | undefined {\n const value = adapter?.raw?.[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction fallbackAttemptsFromUnknown(value: unknown): ExtractionFallbackAttempt[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n\n const attempts = value.flatMap((item): ExtractionFallbackAttempt[] => {\n if (!isJsonLdNode(item) || typeof item.method !== \"string\") {\n return [];\n }\n\n return [{\n method: item.method,\n url: typeof item.url === \"string\" ? item.url : undefined,\n ok: typeof item.ok === \"boolean\" ? item.ok : false,\n statusCode: typeof item.statusCode === \"number\" ? item.statusCode : undefined,\n blocked: typeof item.blocked === \"boolean\" ? item.blocked : undefined,\n error: typeof item.error === \"string\" ? item.error : undefined,\n retryAfter: typeof item.retryAfter === \"string\" ? item.retryAfter : undefined\n }];\n });\n\n return attempts.length > 0 ? attempts : undefined;\n}\n\nfunction mergeFallbackAttempts(\n existing: ExtractionFallbackAttempt[] | undefined,\n incoming: ExtractionFallbackAttempt[] | undefined\n): ExtractionFallbackAttempt[] | undefined {\n const attempts = [...(existing ?? []), ...(incoming ?? [])];\n if (attempts.length === 0) {\n return undefined;\n }\n\n const seen = new Set<string>();\n return attempts.filter((attempt) => {\n const key = `${attempt.method}:${attempt.url ?? \"\"}:${attempt.statusCode ?? \"\"}:${attempt.error ?? \"\"}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n}\n\nfunction retryInfoFromUnknown(value: unknown): ExtractionRetryInfo | undefined {\n if (!isJsonLdNode(value)) {\n return undefined;\n }\n\n const retryable = typeof value.retryable === \"boolean\" ? value.retryable : undefined;\n if (retryable === undefined) {\n return undefined;\n }\n\n return {\n retryable,\n reason: typeof value.reason === \"string\" ? value.reason : undefined,\n retryAfter: typeof value.retryAfter === \"string\" ? value.retryAfter : undefined,\n retryAfterMs: typeof value.retryAfterMs === \"number\" ? value.retryAfterMs : undefined,\n attempts: typeof value.attempts === \"number\" ? value.attempts : undefined\n };\n}\n\nfunction fieldSource(\n rawSources: RawMetadataSources,\n externalResults: AdapterExtractionResult[],\n embeddedNodes: JsonLdNode[],\n field: \"title\" | \"description\" | \"author\" | \"image\",\n bestImage: MediaAsset | undefined\n): string | undefined {\n if (field === \"image\") {\n return bestImage ? sourceLabel(bestImage) : undefined;\n }\n\n for (const result of externalResults) {\n if (field === \"title\" && result.title) {\n return result.source;\n }\n if (field === \"description\" && result.description) {\n return result.source;\n }\n if (field === \"author\" && result.author) {\n return result.source;\n }\n }\n\n if (field === \"title\") {\n if (rawSources.openGraph.title) return \"openGraph\";\n if (rawSources.twitter.title) return \"twitter\";\n if (findStringByKeys(embeddedNodes, [\"title\", \"headline\", \"name\"])) return \"embeddedData\";\n if (rawSources.html.title) return \"html\";\n }\n\n if (field === \"description\") {\n if (rawSources.openGraph.description) return \"openGraph\";\n if (rawSources.twitter.description) return \"twitter\";\n if (findStringByKeys(embeddedNodes, [\"description\", \"summary\", \"excerpt\"])) return \"embeddedData\";\n if (rawSources.html.description) return \"html\";\n }\n\n if (field === \"author\") {\n if (entityFromEmbedded(embeddedNodes, [\"author\", \"creator\", \"owner\", \"user\"])) return \"embeddedData\";\n if (rawSources.openGraph.article?.authors?.length) return \"openGraph\";\n }\n\n return undefined;\n}\n\nfunction findJsonLdNode(nodes: JsonLdNode[], types: string[]): JsonLdNode | undefined {\n return nodes.find((node) => hasJsonLdType([node], types));\n}\n\nfunction hasJsonLdType(nodes: JsonLdNode[], types: string[]): boolean {\n return nodes.some((node) => {\n const nodeTypes = Array.isArray(node[\"@type\"]) ? node[\"@type\"] : [node[\"@type\"]];\n return nodeTypes.some((type) => typeof type === \"string\" && types.some((candidate) => type.toLowerCase().endsWith(candidate.toLowerCase())));\n });\n}\n\nfunction jsonString(nodes: JsonLdNode[], key: string): string | undefined {\n for (const node of nodes) {\n const value = stringFromUnknown(node[key]);\n if (value) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction findStringByKeys(nodes: JsonLdNode[], keys: string[]): string | undefined {\n const normalizedKeys = keys.map((key) => key.toLowerCase());\n const candidates: string[] = [];\n\n for (const node of nodes) {\n walkJson(node, (value, key) => {\n if (!key || !normalizedKeys.includes(key.toLowerCase())) {\n return;\n }\n\n const text = stringFromUnknown(value);\n if (text) {\n candidates.push(text);\n }\n });\n }\n\n return candidates\n .filter((candidate) => candidate.length >= 2 && !/^\\d+$/.test(candidate))\n .sort((left, right) => scoreTextCandidate(right) - scoreTextCandidate(left))[0];\n}\n\nfunction findValueByKeys(nodes: JsonLdNode[], keys: string[]): unknown {\n const normalizedKeys = keys.map((key) => key.toLowerCase());\n let found: unknown;\n\n for (const node of nodes) {\n walkJson(node, (value, key) => {\n if (found !== undefined || !key || !normalizedKeys.includes(key.toLowerCase())) {\n return;\n }\n\n found = value;\n });\n\n if (found !== undefined) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction entityFromEmbedded(nodes: JsonLdNode[], keys: string[]): Entity | undefined {\n const normalizedKeys = keys.map((key) => key.toLowerCase());\n const candidates: Entity[] = [];\n\n for (const node of nodes) {\n walkJson(node, (value, key) => {\n if (!key || !normalizedKeys.some((candidate) => key.toLowerCase().includes(candidate))) {\n return;\n }\n\n const entity = entityFromJsonLd(value);\n if (entity?.name) {\n candidates.push(entity);\n }\n });\n }\n\n return candidates[0];\n}\n\nfunction walkJson(value: unknown, visit: (value: unknown, key?: string) => void, key?: string, depth = 0): void {\n if (depth > 8) {\n return;\n }\n\n visit(value, key);\n\n if (Array.isArray(value)) {\n for (const item of value.slice(0, 250)) {\n walkJson(item, visit, undefined, depth + 1);\n }\n return;\n }\n\n if (isJsonLdNode(value)) {\n for (const [childKey, childValue] of Object.entries(value).slice(0, 500)) {\n walkJson(childValue, visit, childKey, depth + 1);\n }\n }\n}\n\nfunction scoreTextCandidate(value: string): number {\n let score = Math.min(value.length, 160);\n if (value.length >= 12 && value.length <= 120) {\n score += 50;\n }\n if (/^(home|login|index|untitled)$/i.test(value)) {\n score -= 80;\n }\n return score;\n}\n\nfunction jsonKeywords(node: JsonLdNode | undefined): string[] {\n const value = node?.keywords;\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value.map(stringFromUnknown).filter((item): item is string => Boolean(item));\n }\n\n const text = stringFromUnknown(value);\n return text ? text.split(\",\").map((item) => item.trim()).filter(Boolean) : [];\n}\n\nfunction entityFromJsonLd(value: unknown): Entity | undefined {\n const entity = firstRecord(value);\n if (!entity) {\n const name = stringFromUnknown(value);\n return name ? { name } : undefined;\n }\n\n return emptyToUndefined({\n name: stringFromUnknown(entity.name),\n url: stringFromUnknown(entity.url),\n logo: stringFromUnknown(entity.logo),\n sameAs: arrayOfStrings(entity.sameAs)\n });\n}\n\nfunction entitiesFromJsonLd(value: unknown): Entity[] | undefined {\n if (Array.isArray(value)) {\n const entities = value.map(entityFromJsonLd).filter((entity): entity is Entity => Boolean(entity));\n return entities.length > 0 ? entities : undefined;\n }\n\n const entity = entityFromJsonLd(value);\n return entity ? [entity] : undefined;\n}\n\nfunction firstRecord(value: unknown): JsonLdNode | undefined {\n if (Array.isArray(value)) {\n return value.find(isJsonLdNode);\n }\n\n return isJsonLdNode(value) ? value : undefined;\n}\n\nfunction firstResultValue<T>(results: AdapterExtractionResult[], select: (result: AdapterExtractionResult) => T | undefined): T | undefined {\n for (const result of results) {\n const value = select(result);\n if (value !== undefined) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction firstEntity(entities: Entity[] | undefined): Entity | undefined {\n return entities?.[0];\n}\n\nfunction mergePartialObjects<T extends object>(objects: Array<Partial<T> | undefined>): Partial<T> {\n return Object.assign({}, ...objects.filter(Boolean));\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return value.map(stringFromUnknown).find(Boolean);\n }\n\n if (isJsonLdNode(value)) {\n return stringFromUnknown(value.name) ?? stringFromUnknown(value.url) ?? stringFromUnknown(value[\"@id\"]);\n }\n\n return undefined;\n}\n\nfunction arrayOfStrings(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n const single = stringFromUnknown(value);\n return single ? [single] : undefined;\n }\n\n const values = value.map(stringFromUnknown).filter((item): item is string => Boolean(item));\n return values.length > 0 ? values : undefined;\n}\n\nfunction shortSchemaValue(value: string | undefined): string | undefined {\n return value?.split(\"/\").filter(Boolean).at(-1);\n}\n\nfunction domainName(url: string): string | undefined {\n try {\n return new URL(url).hostname.replace(/^www\\./, \"\");\n } catch {\n return undefined;\n }\n}\n\nfunction uniqueStrings(values: Array<string | undefined>): string[] {\n return [...new Set(values.filter((value): value is string => Boolean(value)))];\n}\n\nfunction emptyToUndefined<T extends object>(value: T): T | undefined {\n const cleaned = stripUndefined(value) as T;\n return Object.keys(cleaned).length > 0 ? cleaned : undefined;\n}\n\nfunction stripUndefined<T extends object>(value: T): Partial<T> {\n return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined && item !== null && (!Array.isArray(item) || item.length > 0))) as Partial<T>;\n}\n\nfunction isJsonLdNode(value: unknown): value is JsonLdNode {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sourceLabel(image: MediaAsset): string {\n if (image.source === \"adapter\") {\n const adapter = typeof image.metadata?.adapter === \"string\" ? image.metadata.adapter : \"adapter\";\n const originalSource = typeof image.metadata?.originalSource === \"string\" ? image.metadata.originalSource : undefined;\n return originalSource ? `${adapter} (${originalSource})` : adapter;\n }\n\n return image.source;\n}\n","import type { AdapterContext, AdapterExtractionResult, Entity, JsonLdNode, MediaAsset, MetadataType, SiteAdapter } from \"../types/index.js\";\nimport { discoverMedia } from \"../media/index.js\";\n\ntype PlatformRawData = AdapterExtractionResult & {\n platform?: string;\n identifiers?: Record<string, string | undefined>;\n};\n\ninterface TextSelection {\n value?: string;\n method?: string;\n}\n\nexport const youtubeAdapter: SiteAdapter<PlatformRawData> = {\n name: \"youtubeAdapter\",\n detect(url) {\n return hostMatches(url, [\"youtube.com\", \"youtu.be\", \"youtube-nocookie.com\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const videoId = getYouTubeVideoId(url);\n const playlistId = getYouTubePlaylistId(url);\n const communityPostId = getYouTubeCommunityPostId(url);\n const titleSelection = youtubeTitleFromContext(context, { videoId, playlistId, communityPostId });\n const descriptionSelection = youtubeDescriptionFromContext(context);\n const channel = entityFromContext(context, [\"author\", \"ownerChannelName\", \"channel\", \"owner\"]);\n const playlistVideos = playlistId ? extractPlaylistVideos(context) : [];\n const sourcePriority = youtubeSourcePriority();\n\n return compactAdapterResult({\n source: \"youtubeAdapter\",\n platform: \"YouTube\",\n type: playlistId ? \"playlist\" : communityPostId ? \"social_post\" : \"video\",\n siteName: \"YouTube\",\n canonicalUrl: videoId ? `https://www.youtube.com/watch?v=${videoId}` : context.raw.openGraph.url,\n title: titleSelection.value,\n description: descriptionSelection.value,\n videos: markAdapterMedia(mediaFromContext(context).videos, \"youtubeAdapter\"),\n images: markAdapterMedia(mediaFromContext(context).images, \"youtubeAdapter\"),\n author: channel,\n article: { publishedTime: publishedTimeFromContext(context) },\n video: videoId\n ? {\n id: videoId,\n title: titleSelection.value,\n channel,\n publishedTime: publishedTimeFromContext(context),\n duration: findEmbeddedString(context, [\"duration\", \"lengthSeconds\", \"approxDurationMs\"]),\n tags: arrayFromContext(context, [\"tags\", \"keywords\"]),\n category: findEmbeddedString(context, [\"category\"]),\n viewCount: numberFromContext(context, [\"viewCount\", \"views\"])\n }\n : undefined,\n playlist: playlistId\n ? {\n id: playlistId,\n title: youtubePlaylistTitleFromContext(context) ?? context.raw.openGraph.title,\n channel,\n videos: playlistVideos\n }\n : undefined,\n identifiers: { videoId, playlistId, communityPostId },\n raw: {\n sourcePriority,\n extractionMethod: titleSelection.method ?? descriptionSelection.method ?? \"youtube:htmlFallback\"\n }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const redditAdapter: SiteAdapter<PlatformRawData> = {\n name: \"redditAdapter\",\n detect(url) {\n return hostMatches(url, [\"reddit.com\", \"redd.it\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const reddit = parseRedditUrl(url);\n const username = typeof reddit.username === \"string\" ? reddit.username : undefined;\n const titleSelection = redditTitleFromContext(context);\n const descriptionSelection = redditDescriptionFromContext(context);\n const sourcePriority = redditSourcePriority();\n\n return compactAdapterResult({\n source: \"redditAdapter\",\n platform: \"Reddit\",\n type: reddit.isPost ? \"social_post\" : \"website\",\n siteName: \"Reddit\",\n canonicalUrl: context.raw.openGraph.url ?? context.raw.html.canonicalUrl,\n title: cleanRedditTitle(titleSelection.value),\n description: cleanRedditDescription(descriptionSelection.value),\n images: markAdapterMedia(mediaFromContext(context).images, \"redditAdapter\"),\n videos: markAdapterMedia(mediaFromContext(context).videos, \"redditAdapter\"),\n author: username ? { name: username } : entityFromContext(context, [\"author\", \"submitter\", \"user\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { subreddit: reddit.subreddit, postId: reddit.postId, username: reddit.username },\n raw: {\n ...reddit,\n sourcePriority,\n extractionMethod: titleSelection.method ?? descriptionSelection.method ?? \"reddit:htmlFallback\"\n }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const pinterestAdapter: SiteAdapter<PlatformRawData> = {\n name: \"pinterestAdapter\",\n detect(url) {\n return hostMatches(url, [\"pinterest.com\", \"pin.it\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const pinId = url.pathname.match(/\\/pin\\/([^/]+)/)?.[1];\n\n return compactAdapterResult({\n source: \"pinterestAdapter\",\n platform: \"Pinterest\",\n type: pinId || hostMatches(url, [\"pin.it\"]) ? \"social_post\" : \"image\",\n siteName: \"Pinterest\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"pinTitle\", \"gridTitle\", \"headline\", \"name\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(mediaFromContext(context).images, \"pinterestAdapter\"),\n videos: markAdapterMedia(mediaFromContext(context).videos, \"pinterestAdapter\"),\n author: entityFromContext(context, [\"pinner\", \"author\", \"creator\", \"owner\", \"user\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { pinId }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const behanceAdapter: SiteAdapter<PlatformRawData> = {\n name: \"behanceAdapter\",\n detect(url) {\n return hostMatches(url, [\"behance.net\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const projectId = url.pathname.match(/\\/gallery\\/(\\d+)/)?.[1];\n\n return compactAdapterResult({\n source: \"behanceAdapter\",\n platform: \"Behance\",\n type: projectId ? \"image\" : \"website\",\n siteName: \"Behance\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"projectTitle\", \"name\", \"headline\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(mediaFromContext(context).images, \"behanceAdapter\"),\n videos: markAdapterMedia(mediaFromContext(context).videos, \"behanceAdapter\"),\n author: entityFromContext(context, [\"owners\", \"author\", \"creator\", \"user\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n raw: { projectId }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const tiktokAdapter: SiteAdapter<PlatformRawData> = {\n name: \"tiktokAdapter\",\n detect(url) {\n return hostMatches(url, [\"tiktok.com\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n return tiktokResult(context);\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const facebookAdapter: SiteAdapter<PlatformRawData> = {\n name: \"facebookAdapter\",\n detect(url) {\n return hostMatches(url, [\"facebook.com\", \"fb.watch\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const isPost = /\\/(?:posts|photo|videos|watch|reel|share)\\//i.test(url.pathname) || url.searchParams.has(\"story_fbid\");\n const isPhoto = url.pathname.includes(\"photo.php\") || url.searchParams.has(\"fbid\");\n const postId = url.searchParams.get(\"story_fbid\") ?? url.pathname.match(/\\/(?:posts|videos|reel)\\/([^/]+)/)?.[1];\n const media = mediaFromContext(context);\n\n return compactAdapterResult({\n source: \"facebookAdapter\",\n platform: \"Facebook\",\n type: isPhoto ? \"image\" : isPost || media.images.length > 0 || media.videos.length > 0 ? \"social_post\" : \"website\",\n siteName: \"Facebook\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"headline\", \"name\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(media.images, \"facebookAdapter\"),\n videos: markAdapterMedia(media.videos, \"facebookAdapter\"),\n author: entityFromContext(context, [\"author\", \"owner\", \"profile\", \"user\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { postId }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const twitterAdapter: SiteAdapter<PlatformRawData> = {\n name: \"twitterAdapter\",\n detect(url) {\n return hostMatches(url, [\"twitter.com\", \"x.com\", \"t.co\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const statusId = url.pathname.match(/\\/status(?:es)?\\/(\\d+)/)?.[1];\n\n return compactAdapterResult({\n source: \"twitterAdapter\",\n platform: \"X\",\n type: statusId || hostMatches(url, [\"t.co\"]) ? \"social_post\" : \"profile\",\n siteName: \"X\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"full_text\", \"text\", \"headline\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(mediaFromContext(context).images, \"twitterAdapter\"),\n videos: markAdapterMedia(mediaFromContext(context).videos, \"twitterAdapter\"),\n author: entityFromContext(context, [\"author\", \"user\", \"screen_name\", \"creator\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { statusId }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const instagramAdapter: SiteAdapter<PlatformRawData> = {\n name: \"instagramAdapter\",\n detect(url) {\n return hostMatches(url, [\"instagram.com\"]);\n },\n canHandle(url) {\n return this.detect?.(url) ?? false;\n },\n extract(context) {\n const url = new URL(context.finalUrl);\n const shortcode = url.pathname.match(/\\/(?:p|reel|tv)\\/([^/]+)/)?.[1];\n\n return compactAdapterResult({\n source: \"instagramAdapter\",\n platform: \"Instagram\",\n type: shortcode ? \"social_post\" : \"profile\",\n siteName: \"Instagram\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleFromContext(context, [\"title\", \"caption\", \"edge_media_to_caption\", \"headline\"]),\n description: descriptionFromContext(context),\n images: markAdapterMedia(mediaFromContext(context).images, \"instagramAdapter\"),\n videos: markAdapterMedia(mediaFromContext(context).videos, \"instagramAdapter\"),\n author: entityFromContext(context, [\"owner\", \"author\", \"user\", \"username\"]),\n article: { publishedTime: publishedTimeFromContext(context) },\n identifiers: { shortcode }\n });\n },\n normalize(rawData) {\n return normalizePlatformResult(rawData);\n }\n};\n\nexport const defaultAdapters: SiteAdapter[] = [\n youtubeAdapter,\n redditAdapter,\n pinterestAdapter,\n behanceAdapter,\n tiktokAdapter,\n facebookAdapter,\n twitterAdapter,\n instagramAdapter\n];\n\nfunction youtubeSourcePriority(): string[] {\n return [\n \"structuredData:VideoObject\",\n \"embeddedData:ytInitialPlayerResponse\",\n \"embeddedData:ytInitialData\",\n \"openGraph\",\n \"twitter\",\n \"html\"\n ];\n}\n\nfunction youtubeTitleFromContext(\n context: AdapterContext,\n ids: { videoId?: string; playlistId?: string; communityPostId?: string }\n): TextSelection {\n const videoObjectTitle = jsonLdVideoObjectString(context, [\"name\", \"headline\"]);\n if (videoObjectTitle) {\n return { value: videoObjectTitle, method: \"youtube:structuredData.VideoObject\" };\n }\n\n const playerTitle = youtubePlayerString(context, [\"videoDetails.title\", \"microformat.playerMicroformatRenderer.title\"]);\n if (playerTitle) {\n return { value: playerTitle, method: \"youtube:ytInitialPlayerResponse\" };\n }\n\n const initialDataTitle = youtubeInitialDataTitle(context, ids);\n if (initialDataTitle) {\n return { value: initialDataTitle, method: \"youtube:ytInitialData\" };\n }\n\n if (context.raw.openGraph.title) {\n return { value: context.raw.openGraph.title, method: \"youtube:openGraph\" };\n }\n\n if (context.raw.twitter.title) {\n return { value: context.raw.twitter.title, method: \"youtube:twitter\" };\n }\n\n return { value: cleanYouTubeHtmlTitle(context.raw.html.title), method: context.raw.html.title ? \"youtube:html\" : undefined };\n}\n\nfunction youtubeDescriptionFromContext(context: AdapterContext): TextSelection {\n const videoObjectDescription = jsonLdVideoObjectString(context, [\"description\"]);\n if (videoObjectDescription) {\n return { value: videoObjectDescription, method: \"youtube:structuredData.VideoObject\" };\n }\n\n const playerDescription = youtubePlayerString(context, [\n \"videoDetails.shortDescription\",\n \"microformat.playerMicroformatRenderer.description\",\n \"microformat.playerMicroformatRenderer.shortDescription\"\n ]);\n if (playerDescription) {\n return { value: playerDescription, method: \"youtube:ytInitialPlayerResponse\" };\n }\n\n const initialDataDescription = youtubeInitialDataDescription(context);\n if (initialDataDescription) {\n return { value: initialDataDescription, method: \"youtube:ytInitialData\" };\n }\n\n if (context.raw.openGraph.description) {\n return { value: context.raw.openGraph.description, method: \"youtube:openGraph\" };\n }\n\n if (context.raw.twitter.description) {\n return { value: context.raw.twitter.description, method: \"youtube:twitter\" };\n }\n\n return { value: context.raw.html.description, method: context.raw.html.description ? \"youtube:html\" : undefined };\n}\n\nfunction redditSourcePriority(): string[] {\n return [\n \"redditJsonEndpoint\",\n \"oldReddit\",\n \"embeddedStructuredData\",\n \"openGraph\",\n \"twitter\",\n \"html\"\n ];\n}\n\nfunction redditTitleFromContext(context: AdapterContext): TextSelection {\n const embedded = findEmbeddedStringBySources(context, [\"applicationJson\", \"jsonScript\", \"initialState\", \"preloadedState\", \"nextData\"], [\n \"postTitle\",\n \"title\",\n \"headline\"\n ]);\n if (embedded) {\n return { value: embedded, method: hasRedditJsonEndpointPayload(context) ? \"reddit:jsonEndpoint\" : \"reddit:embeddedStructuredData\" };\n }\n\n const structured = jsonLdStringByType(context.raw.jsonLd.nodes, [\"SocialMediaPosting\", \"DiscussionForumPosting\", \"Article\"], [\"headline\", \"name\"]);\n if (structured) {\n return { value: structured, method: \"reddit:structuredData\" };\n }\n\n if (context.raw.openGraph.title) {\n return { value: context.raw.openGraph.title, method: \"reddit:openGraph\" };\n }\n\n if (context.raw.twitter.title) {\n return { value: context.raw.twitter.title, method: \"reddit:twitter\" };\n }\n\n return { value: context.raw.html.title, method: context.raw.html.title ? \"reddit:html\" : undefined };\n}\n\nfunction redditDescriptionFromContext(context: AdapterContext): TextSelection {\n const embedded = findEmbeddedStringBySources(context, [\"applicationJson\", \"jsonScript\", \"initialState\", \"preloadedState\", \"nextData\"], [\n \"description\",\n \"selftext\",\n \"excerpt\",\n \"summary\",\n \"body\"\n ]);\n if (embedded) {\n return { value: embedded, method: hasRedditJsonEndpointPayload(context) ? \"reddit:jsonEndpoint\" : \"reddit:embeddedStructuredData\" };\n }\n\n const structured = jsonLdStringByType(context.raw.jsonLd.nodes, [\"SocialMediaPosting\", \"DiscussionForumPosting\", \"Article\"], [\"description\", \"articleBody\"]);\n if (structured) {\n return { value: structured, method: \"reddit:structuredData\" };\n }\n\n if (context.raw.openGraph.description) {\n return { value: context.raw.openGraph.description, method: \"reddit:openGraph\" };\n }\n\n if (context.raw.twitter.description) {\n return { value: context.raw.twitter.description, method: \"reddit:twitter\" };\n }\n\n return { value: context.raw.html.description, method: context.raw.html.description ? \"reddit:html\" : undefined };\n}\n\nfunction tiktokResult(context: AdapterContext): PlatformRawData {\n const url = new URL(context.finalUrl);\n const username = url.pathname.match(/@([^/]+)/)?.[1];\n const postId = url.pathname.match(/\\/(?:video|photo)\\/([^/]+)/)?.[1] ?? url.pathname.split(\"/\").filter(Boolean).at(-1);\n const itemStruct = tiktokItemStructFromContext(context, postId);\n const titleSelection = tiktokTitleFromContext(context, itemStruct, username);\n const descriptionSelection = tiktokDescriptionFromContext(context, itemStruct);\n const author = tiktokAuthorFromItemStruct(itemStruct, username);\n const media = tiktokMediaFromContext(context, itemStruct);\n const publishedTime = tiktokPublishedTime(itemStruct) ?? publishedTimeFromContext(context);\n\n return compactAdapterResult({\n source: \"tiktokAdapter\",\n platform: \"TikTok\",\n type: \"social_post\",\n siteName: \"TikTok\",\n canonicalUrl: context.raw.openGraph.url,\n title: titleSelection.value,\n description: descriptionSelection.value,\n images: markAdapterMedia(media.images, \"tiktokAdapter\"),\n videos: markAdapterMedia(media.videos, \"tiktokAdapter\"),\n author,\n article: { publishedTime },\n video: postId\n ? {\n id: postId,\n title: titleSelection.value,\n channel: author,\n publishedTime,\n duration: tiktokVideoDuration(itemStruct),\n viewCount: tiktokStatCount(itemStruct, \"playCount\")\n }\n : undefined,\n identifiers: { username, postId },\n raw: {\n extractionMethod: titleSelection.method ?? descriptionSelection.method ?? \"tiktok:htmlFallback\"\n }\n });\n}\n\nfunction tiktokTitleFromContext(context: AdapterContext, itemStruct: JsonLdNode | undefined, username: string | undefined): TextSelection {\n const desc = cleanTikTokText(stringFromUnknown(itemStruct?.desc));\n if (desc) {\n return { value: desc, method: \"tiktok:itemStruct.desc\" };\n }\n\n const musicTitle = tiktokMusicTitle(itemStruct);\n if (musicTitle) {\n return { value: musicTitle, method: \"tiktok:itemStruct.music\" };\n }\n\n const fallback = cleanTikTokText(titleFromContext(context, [\"desc\", \"caption\", \"title\", \"description\"]));\n if (fallback) {\n return { value: fallback, method: \"tiktok:fallback\" };\n }\n\n return {\n value: username ? `TikTok post by @${username}` : undefined,\n method: username ? \"tiktok:urlFallback\" : undefined\n };\n}\n\nfunction tiktokDescriptionFromContext(context: AdapterContext, itemStruct: JsonLdNode | undefined): TextSelection {\n const desc = cleanTikTokText(stringFromUnknown(itemStruct?.desc));\n if (desc) {\n return { value: desc, method: \"tiktok:itemStruct.desc\" };\n }\n\n return {\n value: cleanTikTokText(descriptionFromContext(context)),\n method: \"tiktok:fallback\"\n };\n}\n\nfunction tiktokItemStructFromContext(context: AdapterContext, postId: string | undefined): JsonLdNode | undefined {\n for (const item of context.raw.embeddedData.items) {\n const defaultScope = isRecord(item.data[\"__DEFAULT_SCOPE__\"]) ? item.data[\"__DEFAULT_SCOPE__\"] : undefined;\n const videoDetail = isRecord(defaultScope?.[\"webapp.video-detail\"]) ? defaultScope[\"webapp.video-detail\"] : undefined;\n const itemInfo = isRecord(videoDetail?.itemInfo) ? videoDetail.itemInfo : undefined;\n const itemStruct = isRecord(itemInfo?.itemStruct) ? itemInfo.itemStruct : undefined;\n\n if (itemStruct && (!postId || stringFromUnknown(itemStruct.id) === postId)) {\n return itemStruct;\n }\n }\n\n let found: JsonLdNode | undefined;\n for (const item of context.raw.embeddedData.items) {\n walkData(item.data, (value, key) => {\n if (found || key !== \"itemStruct\" || !isRecord(value)) {\n return;\n }\n\n if (!postId || stringFromUnknown(value.id) === postId) {\n found = value;\n }\n });\n\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction tiktokMediaFromContext(context: AdapterContext, itemStruct: JsonLdNode | undefined): { images: MediaAsset[]; videos: MediaAsset[] } {\n const discovered = mediaFromContext(context);\n\n return {\n images: [...tiktokImagesFromItemStruct(itemStruct), ...discovered.images],\n videos: [...tiktokVideosFromItemStruct(itemStruct), ...discovered.videos]\n };\n}\n\nfunction tiktokImagesFromItemStruct(itemStruct: JsonLdNode | undefined): MediaAsset[] {\n const video = isRecord(itemStruct?.video) ? itemStruct.video : undefined;\n if (!video) {\n return [];\n }\n\n const width = numberFromUnknown(video.width);\n const height = numberFromUnknown(video.height);\n const candidates = [\n stringFromUnknown(video.originCover),\n stringFromUnknown(video.cover),\n stringFromUnknown(video.dynamicCover),\n ...urlsFromUnknown(video.shareCover)\n ];\n\n return uniqueStrings(candidates).map((url) => ({\n url,\n kind: \"image\",\n source: \"applicationJson\",\n width,\n height,\n metadata: {\n tiktokMediaKind: \"videoCover\"\n }\n }));\n}\n\nfunction tiktokVideosFromItemStruct(itemStruct: JsonLdNode | undefined): MediaAsset[] {\n const video = isRecord(itemStruct?.video) ? itemStruct.video : undefined;\n if (!video) {\n return [];\n }\n\n const width = numberFromUnknown(video.width);\n const height = numberFromUnknown(video.height);\n const candidates = [\n stringFromUnknown(video.playAddr),\n stringFromUnknown(video.downloadAddr),\n ...urlsFromTikTokPlayAddr(video.PlayAddrStruct),\n ...(Array.isArray(video.bitrateInfo)\n ? video.bitrateInfo.flatMap((item) => (isRecord(item) ? urlsFromTikTokPlayAddr(item.PlayAddr) : []))\n : [])\n ];\n\n return uniqueStrings(candidates)\n .filter((url) => /^https?:\\/\\//i.test(url))\n .map((url) => ({\n url,\n kind: \"video\",\n source: \"applicationJson\",\n width,\n height,\n type: \"video/mp4\",\n metadata: {\n tiktokMediaKind: \"videoPlay\"\n }\n }));\n}\n\nfunction urlsFromTikTokPlayAddr(value: unknown): string[] {\n if (!isRecord(value)) {\n return [];\n }\n\n return urlsFromUnknown(value.UrlList);\n}\n\nfunction tiktokAuthorFromItemStruct(itemStruct: JsonLdNode | undefined, username: string | undefined): Entity | undefined {\n const author = isRecord(itemStruct?.author) ? itemStruct.author : undefined;\n const name =\n stringFromUnknown(author?.nickname) ??\n stringFromUnknown(author?.uniqueId) ??\n username;\n\n if (!name) {\n return undefined;\n }\n\n return {\n name,\n url: username ? `https://www.tiktok.com/@${username}` : undefined\n };\n}\n\nfunction tiktokPublishedTime(itemStruct: JsonLdNode | undefined): string | undefined {\n const created = numberFromUnknown(itemStruct?.createTime);\n return created ? new Date(created * 1000).toISOString() : undefined;\n}\n\nfunction tiktokVideoDuration(itemStruct: JsonLdNode | undefined): string | undefined {\n const video = isRecord(itemStruct?.video) ? itemStruct.video : undefined;\n return stringFromUnknown(video?.duration);\n}\n\nfunction tiktokStatCount(itemStruct: JsonLdNode | undefined, key: string): number | undefined {\n const stats = isRecord(itemStruct?.stats) ? itemStruct.stats : undefined;\n return numberFromUnknown(stats?.[key]);\n}\n\nfunction tiktokMusicTitle(itemStruct: JsonLdNode | undefined): string | undefined {\n const music = isRecord(itemStruct?.music) ? itemStruct.music : undefined;\n const title = cleanTikTokText(stringFromUnknown(music?.title));\n const author = cleanTikTokText(stringFromUnknown(music?.authorName));\n\n if (!title) {\n return undefined;\n }\n\n if (author && !/original sound/i.test(title)) {\n return `${title} - ${author}`;\n }\n\n return title;\n}\n\nfunction cleanTikTokText(value: string | undefined): string | undefined {\n const cleaned = value?.replace(/\\s+/g, \" \").trim();\n if (!cleaned || isLowQualityTikTokText(cleaned)) {\n return undefined;\n }\n\n return cleaned;\n}\n\nfunction isLowQualityTikTokText(value: string): boolean {\n return (\n /\\{[^}]+\\}/.test(value) ||\n /tiktok\\s*shop|free shipping|eligible items|exclusive collections/i.test(value) ||\n /^tiktok live creator networks$/i.test(value) ||\n /^tiktok\\s*-\\s*make your day$/i.test(value) ||\n /^discover (?:new |popular )?videos?\\b.*\\btiktok\\b/i.test(value)\n );\n}\n\nfunction urlsFromUnknown(value: unknown): string[] {\n if (typeof value === \"string\" && value.trim()) {\n return [value.trim()];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap(urlsFromUnknown);\n }\n\n return [];\n}\n\nfunction uniqueStrings(values: Array<string | undefined>): string[] {\n return [...new Set(values.filter((value): value is string => Boolean(value)))];\n}\n\nfunction normalizePlatformResult(rawData: PlatformRawData): AdapterExtractionResult {\n const type = rawData.type ?? inferAdapterType(rawData);\n\n return compactAdapterResult({\n ...rawData,\n type,\n raw: {\n ...(rawData.raw ?? {}),\n platform: rawData.platform,\n identifiers: rawData.identifiers\n }\n });\n}\n\nfunction inferAdapterType(rawData: PlatformRawData): MetadataType {\n if ((rawData.videos?.length ?? 0) > 0) {\n return \"video\";\n }\n\n if ((rawData.images?.length ?? 0) > 0) {\n return \"image\";\n }\n\n return \"website\";\n}\n\nfunction markAdapterMedia(assets: MediaAsset[], adapterName: string): MediaAsset[] {\n const seen = new Set<string>();\n\n return assets.filter((asset) => {\n if (seen.has(asset.url)) {\n return false;\n }\n seen.add(asset.url);\n return true;\n }).map((asset) => ({\n ...asset,\n source: \"adapter\",\n metadata: {\n ...asset.metadata,\n adapter: adapterName,\n originalSource: asset.source\n }\n }));\n}\n\nfunction jsonLdVideoObjectString(context: AdapterContext, keys: string[]): string | undefined {\n return jsonLdStringByType(context.raw.jsonLd.nodes, [\"VideoObject\"], keys);\n}\n\nfunction jsonLdStringByType(nodes: JsonLdNode[], types: string[], keys: string[]): string | undefined {\n for (const node of nodes) {\n if (!hasJsonLdType(node, types)) {\n continue;\n }\n\n for (const key of keys) {\n const value = stringFromUnknown(node[key]);\n if (value) {\n return value;\n }\n }\n }\n\n return undefined;\n}\n\nfunction hasJsonLdType(node: JsonLdNode, types: string[]): boolean {\n const nodeTypes = Array.isArray(node[\"@type\"]) ? node[\"@type\"] : [node[\"@type\"]];\n return nodeTypes.some((type) => typeof type === \"string\" && types.some((candidate) => type.toLowerCase().endsWith(candidate.toLowerCase())));\n}\n\nfunction youtubePlayerString(context: AdapterContext, paths: string[]): string | undefined {\n for (const item of context.raw.embeddedData.items) {\n if (item.source !== \"youtubePlayerResponse\") {\n continue;\n }\n\n for (const path of paths) {\n const value = stringFromUnknown(valueAtPath(item.data, path));\n if (value) {\n return value;\n }\n }\n }\n\n return undefined;\n}\n\nfunction youtubeInitialDataTitle(\n context: AdapterContext,\n ids: { videoId?: string; playlistId?: string; communityPostId?: string }\n): string | undefined {\n const items = context.raw.embeddedData.items.filter((item) => item.source === \"youtubeInitialData\");\n\n const primary = findRendererText(items, [\"videoPrimaryInfoRenderer\", \"watchMetadata\"], [\"title\"]);\n if (primary) {\n return primary;\n }\n\n if (ids.videoId) {\n const matchingVideo = findYouTubeRendererForVideoId(items, ids.videoId, [\"title\"]);\n if (matchingVideo) {\n return matchingVideo;\n }\n }\n\n if (ids.communityPostId) {\n const communityPost =\n findEmbeddedStringBySources(context, [\"youtubeInitialData\"], [\"contentText\"]) ??\n findRendererText(items, [\"backstagePostRenderer\", \"postRenderer\"], [\"contentText\", \"title\"]);\n if (communityPost) {\n return communityPost;\n }\n }\n\n if (ids.playlistId && !ids.videoId) {\n return findRendererText(items, [\"playlistMetadataRenderer\", \"playlistHeaderRenderer\"], [\"title\", \"playlistTitle\", \"name\"]);\n }\n\n return undefined;\n}\n\nfunction youtubeInitialDataDescription(context: AdapterContext): string | undefined {\n const items = context.raw.embeddedData.items.filter((item) => item.source === \"youtubeInitialData\");\n return findRendererText(items, [\"expandableVideoDescriptionBodyRenderer\", \"videoSecondaryInfoRenderer\", \"watchMetadata\"], [\n \"description\",\n \"attributedDescription\",\n \"content\"\n ]);\n}\n\nfunction youtubePlaylistTitleFromContext(context: AdapterContext): string | undefined {\n const items = context.raw.embeddedData.items.filter((item) => item.source === \"youtubeInitialData\");\n return findRendererText(items, [\"playlistMetadataRenderer\", \"playlistHeaderRenderer\"], [\"title\", \"playlistTitle\", \"name\"]);\n}\n\nfunction findRendererText(items: Array<{ data: JsonLdNode }>, rendererKeys: string[], textKeys: string[]): string | undefined {\n for (const item of items) {\n let found: string | undefined;\n\n walkData(item.data, (value, key) => {\n if (found || !key || !rendererKeys.includes(key) || !isRecord(value)) {\n return;\n }\n\n for (const textKey of textKeys) {\n found = stringFromUnknown(value[textKey]);\n if (found) {\n return;\n }\n }\n });\n\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction findYouTubeRendererForVideoId(items: Array<{ data: JsonLdNode }>, videoId: string, textKeys: string[]): string | undefined {\n for (const item of items) {\n let found: string | undefined;\n\n walkData(item.data, (value) => {\n if (found || !isRecord(value) || stringFromUnknown(value.videoId) !== videoId) {\n return;\n }\n\n for (const textKey of textKeys) {\n found = stringFromUnknown(value[textKey]);\n if (found) {\n return;\n }\n }\n });\n\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction findEmbeddedStringBySources(context: AdapterContext, sources: string[], keys: string[]): string | undefined {\n const candidates: string[] = [];\n\n for (const item of context.raw.embeddedData.items) {\n if (!sources.includes(item.source)) {\n continue;\n }\n\n walkData(item.data, (value, key) => {\n if (!key || !matchesKey(key, keys)) {\n return;\n }\n\n const text = stringFromUnknown(value);\n if (text) {\n candidates.push(text);\n }\n });\n }\n\n return bestTextCandidate(candidates);\n}\n\nfunction hasRedditJsonEndpointPayload(context: AdapterContext): boolean {\n return context.raw.embeddedData.items.some((item) => item.source === \"applicationJson\" && item.path === \"metanova-reddit-json\");\n}\n\nfunction valueAtPath(node: unknown, path: string): unknown {\n return path.split(\".\").reduce<unknown>((current, key) => (isRecord(current) ? current[key] : undefined), node);\n}\n\nfunction cleanYouTubeHtmlTitle(title: string | undefined): string | undefined {\n return title?.replace(/\\s*-\\s*YouTube\\s*$/i, \"\").trim();\n}\n\nfunction titleFromContext(context: AdapterContext, embeddedKeys: string[]): string | undefined {\n return firstText(\n context.raw.openGraph.title,\n context.raw.twitter.title,\n findEmbeddedString(context, embeddedKeys),\n context.raw.html.title\n );\n}\n\nfunction descriptionFromContext(context: AdapterContext): string | undefined {\n return firstText(\n context.raw.openGraph.description,\n context.raw.twitter.description,\n findEmbeddedString(context, [\"description\", \"desc\", \"summary\", \"excerpt\", \"caption\", \"text\"]),\n context.raw.html.description\n );\n}\n\nfunction publishedTimeFromContext(context: AdapterContext): string | undefined {\n return firstText(\n context.raw.openGraph.article?.publishedTime,\n findJsonLdString(context.raw.jsonLd.nodes, [\"datePublished\", \"uploadDate\", \"createdAt\"]),\n findEmbeddedString(context, [\"datePublished\", \"publishedTime\", \"published_at\", \"createdAt\", \"created_at\", \"uploadDate\", \"timestamp\"])\n );\n}\n\nfunction mediaFromContext(context: AdapterContext): { images: MediaAsset[]; videos: MediaAsset[] } {\n const discovered = discoverMedia(context.raw, context.finalUrl);\n return {\n images: discovered.images,\n videos: discovered.videos\n };\n}\n\nfunction entityFromContext(context: AdapterContext, keys: string[]): Entity | undefined {\n const jsonLdEntity = entityFromJsonValue(findJsonLdValue(context.raw.jsonLd.nodes, keys));\n if (jsonLdEntity) {\n return jsonLdEntity;\n }\n\n for (const item of context.raw.embeddedData.items) {\n const entity = entityFromJsonValue(findValueByKeys(item.data, keys));\n if (entity) {\n return entity;\n }\n }\n\n return undefined;\n}\n\nfunction findEmbeddedString(context: AdapterContext, keys: string[]): string | undefined {\n const candidates: string[] = [];\n\n for (const item of context.raw.embeddedData.items) {\n walkData(item.data, (value, key) => {\n if (!key || !matchesKey(key, keys)) {\n return;\n }\n\n const text = stringFromUnknown(value);\n if (text) {\n candidates.push(text);\n }\n });\n }\n\n return bestTextCandidate(candidates);\n}\n\nfunction findJsonLdString(nodes: JsonLdNode[], keys: string[]): string | undefined {\n const value = findJsonLdValue(nodes, keys);\n return stringFromUnknown(value);\n}\n\nfunction findJsonLdValue(nodes: JsonLdNode[], keys: string[]): unknown {\n for (const node of nodes) {\n const value = findValueByKeys(node, keys);\n if (value !== undefined) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction findValueByKeys(node: unknown, keys: string[]): unknown {\n let found: unknown;\n\n walkData(node, (value, key) => {\n if (found !== undefined || !key || !matchesKey(key, keys)) {\n return;\n }\n\n found = value;\n });\n\n return found;\n}\n\nfunction walkData(value: unknown, visit: (value: unknown, key?: string) => void, key?: string, depth = 0): void {\n if (depth > 8) {\n return;\n }\n\n visit(value, key);\n\n if (Array.isArray(value)) {\n for (const item of value.slice(0, 250)) {\n walkData(item, visit, undefined, depth + 1);\n }\n return;\n }\n\n if (isRecord(value)) {\n for (const [childKey, childValue] of Object.entries(value).slice(0, 500)) {\n walkData(childValue, visit, childKey, depth + 1);\n }\n }\n}\n\nfunction entityFromJsonValue(value: unknown): Entity | undefined {\n if (!value) {\n return undefined;\n }\n\n if (typeof value === \"string\") {\n return { name: value };\n }\n\n if (Array.isArray(value)) {\n return value.map(entityFromJsonValue).find(Boolean);\n }\n\n if (!isRecord(value)) {\n return undefined;\n }\n\n const name =\n stringFromUnknown(value.name) ??\n stringFromUnknown(value.username) ??\n stringFromUnknown(value.screen_name) ??\n stringFromUnknown(value.ownerChannelName) ??\n stringFromUnknown(value.title);\n\n if (!name) {\n return undefined;\n }\n\n return {\n name,\n url: stringFromUnknown(value.url) ?? stringFromUnknown(value.canonicalUrl),\n logo: stringFromUnknown(value.logo) ?? stringFromUnknown(value.avatar) ?? stringFromUnknown(value.image)\n };\n}\n\nfunction firstText(...values: Array<string | undefined>): string | undefined {\n return bestTextCandidate(values.filter((value): value is string => Boolean(value)));\n}\n\nfunction bestTextCandidate(values: string[]): string | undefined {\n return values\n .map((value) => value.replace(/\\s+/g, \" \").trim())\n .filter((value) => value.length > 0)\n .sort((left, right) => scoreText(right) - scoreText(left))[0];\n}\n\nfunction scoreText(value: string): number {\n let score = Math.min(value.length, 180);\n if (value.length >= 10 && value.length <= 140) {\n score += 60;\n }\n if (/^(home|login|index|untitled)$/i.test(value)) {\n score -= 100;\n }\n return score;\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n const values = value.map(stringFromUnknown).filter(Boolean);\n return values.length > 0 ? values.join(\"\") : undefined;\n }\n\n if (isRecord(value)) {\n return (\n stringFromUnknown(value.text) ??\n stringFromUnknown(value.simpleText) ??\n stringFromUnknown(value.runs) ??\n stringFromUnknown(value.title) ??\n stringFromUnknown(value.name) ??\n stringFromUnknown(value.value) ??\n stringFromUnknown(value.url)\n );\n }\n\n return undefined;\n}\n\nfunction matchesKey(key: string, keys: string[]): boolean {\n const normalized = key.toLowerCase();\n return keys.some((candidate) => normalized === candidate.toLowerCase() || normalized.endsWith(candidate.toLowerCase()));\n}\n\nfunction isRecord(value: unknown): value is JsonLdNode {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\ninterface RedditUrlParts {\n isPost: boolean;\n subreddit?: string;\n postId?: string;\n username?: string;\n}\n\nfunction parseRedditUrl(url: URL): RedditUrlParts {\n const parts = url.pathname.split(\"/\").filter(Boolean);\n const commentsIndex = parts.indexOf(\"comments\");\n const shortPostId = hostMatches(url, [\"redd.it\"]) ? parts[0] : undefined;\n\n return {\n isPost: commentsIndex !== -1 || Boolean(shortPostId),\n subreddit: parts[0] === \"r\" ? parts[1] : undefined,\n postId: commentsIndex !== -1 ? parts[commentsIndex + 1] : shortPostId,\n username: parts[0] === \"user\" ? parts[1] : undefined\n };\n}\n\nfunction cleanSocialTitle(title: string | undefined): string | undefined {\n return title?.replace(/\\s*:\\s*r\\/[A-Za-z0-9_]+$/i, \"\").trim();\n}\n\nfunction cleanRedditTitle(title: string | undefined): string | undefined {\n const cleaned = cleanSocialTitle(title);\n if (!cleaned || /reddit\\s*-\\s*please wait for verification|please wait for verification|whoa there, pardner/i.test(cleaned)) {\n return undefined;\n }\n\n return cleaned;\n}\n\nfunction cleanRedditDescription(description: string | undefined): string | undefined {\n const cleaned = description?.replace(/\\s+/g, \" \").trim();\n if (!cleaned || /please wait for verification|whoa there, pardner|request has been blocked/i.test(cleaned)) {\n return undefined;\n }\n\n return cleaned;\n}\n\nfunction hostMatches(url: URL, domains: string[]): boolean {\n const host = url.hostname.toLowerCase().replace(/^www\\./, \"\");\n return domains.some((domain) => host === domain || host.endsWith(`.${domain}`));\n}\n\nfunction getYouTubeVideoId(url: URL): string | undefined {\n const host = url.hostname.toLowerCase().replace(/^www\\./, \"\");\n\n if (host === \"youtu.be\") {\n return url.pathname.split(\"/\").filter(Boolean)[0];\n }\n\n if (url.pathname === \"/watch\") {\n return url.searchParams.get(\"v\") ?? undefined;\n }\n\n const embedMatch = url.pathname.match(/\\/(?:embed|shorts)\\/([^/?]+)/);\n return embedMatch?.[1];\n}\n\nfunction getYouTubePlaylistId(url: URL): string | undefined {\n return url.searchParams.get(\"list\") ?? undefined;\n}\n\nfunction getYouTubeCommunityPostId(url: URL): string | undefined {\n return url.pathname.match(/\\/post\\/([^/?]+)/)?.[1];\n}\n\nfunction extractPlaylistVideos(context: AdapterContext): Array<{ id: string; title?: string; url: string }> {\n const videos = new Map<string, { id: string; title?: string; url: string }>();\n\n for (const item of context.raw.embeddedData.items) {\n walkData(item.data, (value) => {\n if (!isRecord(value)) {\n return;\n }\n\n const videoId =\n stringFromUnknown(value.videoId) ??\n stringFromUnknown(value.video_id) ??\n (isRecord(value.watchEndpoint) ? stringFromUnknown(value.watchEndpoint.videoId) : undefined) ??\n (isRecord(value.navigationEndpoint) && isRecord(value.navigationEndpoint.watchEndpoint)\n ? stringFromUnknown(value.navigationEndpoint.watchEndpoint.videoId)\n : undefined);\n\n if (!videoId || videos.has(videoId)) {\n return;\n }\n\n videos.set(videoId, {\n id: videoId,\n title: stringFromUnknown(value.title) ?? stringFromUnknown(value.headline) ?? stringFromUnknown(value.shortBylineText),\n url: `https://www.youtube.com/watch?v=${videoId}`\n });\n });\n }\n\n return [...videos.values()].slice(0, 100);\n}\n\nfunction arrayFromContext(context: AdapterContext, keys: string[]): string[] | undefined {\n const fromJsonLd = arrayOfStrings(findJsonLdValue(context.raw.jsonLd.nodes, keys));\n if (fromJsonLd) {\n return fromJsonLd;\n }\n\n for (const item of context.raw.embeddedData.items) {\n const embedded = arrayOfStrings(findValueByKeys(item.data, keys));\n if (embedded) {\n return embedded;\n }\n }\n\n return undefined;\n}\n\nfunction numberFromContext(context: AdapterContext, keys: string[]): number | undefined {\n const fromJsonLd = numberFromUnknown(findJsonLdValue(context.raw.jsonLd.nodes, keys));\n if (fromJsonLd !== undefined) {\n return fromJsonLd;\n }\n\n for (const item of context.raw.embeddedData.items) {\n const embedded = numberFromUnknown(findValueByKeys(item.data, keys));\n if (embedded !== undefined) {\n return embedded;\n }\n }\n\n return undefined;\n}\n\nfunction arrayOfStrings(value: unknown): string[] | undefined {\n if (!value) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n const values = value.map(stringFromUnknown).filter((item): item is string => Boolean(item));\n return values.length > 0 ? values : undefined;\n }\n\n const text = stringFromUnknown(value);\n if (!text) {\n return undefined;\n }\n\n return text.split(\",\").map((item) => item.trim()).filter(Boolean);\n}\n\nfunction numberFromUnknown(value: unknown): number | undefined {\n const text = stringFromUnknown(value);\n if (!text) {\n return undefined;\n }\n\n const parsed = Number.parseInt(text.replace(/[^\\d]/g, \"\"), 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction compactAdapterResult<T extends AdapterExtractionResult | PlatformRawData>(result: T): T {\n return Object.fromEntries(\n Object.entries(result).filter(([, value]) => value !== undefined && (!Array.isArray(value) || value.length > 0))\n ) as T;\n}\n","import type {\n CustomExtractor,\n ImageScorer,\n MetaNovaPlugin,\n MetaNovaPluginApi,\n ParseMetadataOptions,\n SiteAdapter\n} from \"../types/index.js\";\nimport { defaultAdapters } from \"../adapters/siteAdapters.js\";\n\nexport interface MetaNovaRegistry {\n adapters: SiteAdapter[];\n extractors: CustomExtractor[];\n imageScorers: ImageScorer[];\n}\n\nconst globalPlugins: MetaNovaPlugin[] = [];\n\nexport function registerGlobalPlugin(plugin: MetaNovaPlugin): void {\n if (!globalPlugins.some((registered) => registered.name === plugin.name)) {\n globalPlugins.push(plugin);\n }\n}\n\nexport function createRegistry(options: ParseMetadataOptions = {}): MetaNovaRegistry {\n const registry: MetaNovaRegistry = {\n adapters: [...defaultAdapters, ...(options.adapters ?? [])],\n extractors: [],\n imageScorers: [...(options.imageScorers ?? [])]\n };\n\n const api: MetaNovaPluginApi = {\n addAdapter(adapter) {\n registry.adapters.push(adapter);\n },\n addExtractor(name, extractor) {\n registry.extractors.push({ name, extract: extractor });\n },\n addImageScorer(scorer) {\n registry.imageScorers.push(scorer);\n }\n };\n\n for (const plugin of [...globalPlugins, ...(options.plugins ?? [])]) {\n plugin.setup(api);\n }\n\n return registry;\n}\n","import type { AdapterContext, AdapterExtractionResult, PluginExtractionResult, RawMetadataSources, SiteAdapter, UnifiedMetadata } from \"./types/index.js\";\nimport { extractAudio, extractEmbeddedData, extractHtmlMetadata, extractImages, extractJsonLd, extractOEmbed, extractOpenGraph, extractTwitterCards, extractVideos, fetchOEmbedData } from \"./extractors/index.js\";\nimport { normalizeMetadata } from \"./normalizers/index.js\";\nimport { createRegistry } from \"./plugins/index.js\";\nimport { createEmptyDiagnostics, loadDocument } from \"./utils/html.js\";\nimport { resolveUrl } from \"./utils/url.js\";\nimport type { FetchMetadataOptions, ParseMetadataOptions } from \"./types/index.js\";\n\nexport function parseMetadata(html: string, url: string, options: ParseMetadataOptions = {}): UnifiedMetadata {\n const finalUrl = resolveUrl(url);\n const registry = createRegistry(options);\n const diagnostics = createEmptyDiagnostics();\n diagnostics.originalUrl = url;\n diagnostics.finalUrl = finalUrl;\n diagnostics.trace.push(\"validated and normalized URL\");\n const rawSources: RawMetadataSources = {\n html: extractHtmlMetadata(html),\n openGraph: extractOpenGraph(html),\n twitter: extractTwitterCards(html),\n jsonLd: extractJsonLd(html),\n embeddedData: extractEmbeddedData(html),\n oEmbed: extractOEmbed(html, finalUrl),\n images: extractImages(html, finalUrl),\n videos: extractVideos(html, finalUrl),\n audio: extractAudio(html, finalUrl),\n adapters: [],\n plugins: []\n };\n appendExtractionTrace(rawSources, diagnostics.trace);\n\n const $ = loadDocument(html);\n const fetchOptions = options as FetchMetadataOptions;\n\n if (fetchOptions.fetchOEmbed && rawSources.oEmbed.links.length > 0) {\n diagnostics.warnings.push(\"parseMetadata is synchronous; oEmbed endpoints are discovered but not fetched. Use fetchMetadata or parseMetadataAsync.\");\n }\n\n for (const extractor of registry.extractors) {\n try {\n const result = extractor.extract({ html, url, finalUrl, $, raw: rawSources, options });\n if (isPromise(result)) {\n diagnostics.warnings.push(`Plugin extractor \"${extractor.name}\" returned a Promise during parseMetadata; use fetchMetadata or pre-resolve async work.`);\n continue;\n }\n\n rawSources.plugins.push(withSource(result, extractor.name));\n diagnostics.trace.push(`plugin extractor matched: ${extractor.name}`);\n } catch (error) {\n diagnostics.warnings.push(`Plugin extractor \"${extractor.name}\" failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n const parsedUrl = new URL(finalUrl);\n for (const adapter of registry.adapters) {\n if (!adapterMatches(adapter, parsedUrl)) {\n continue;\n }\n\n try {\n const context: AdapterContext = { html, url, finalUrl, $, raw: rawSources, options };\n const result = adapter.extract(context);\n if (isPromise(result)) {\n diagnostics.warnings.push(`Adapter \"${adapter.name}\" returned a Promise during parseMetadata; use fetchMetadata or a synchronous adapter.`);\n continue;\n }\n\n const normalized = adapter.normalize?.(result as AdapterExtractionResult, context);\n if (normalized && isPromise(normalized)) {\n diagnostics.warnings.push(`Adapter \"${adapter.name}\" normalize returned a Promise during parseMetadata; use fetchMetadata or a synchronous adapter.`);\n continue;\n }\n\n rawSources.adapters.push(withSource(normalized ?? (result as AdapterExtractionResult), adapter.name));\n diagnostics.trace.push(`adapter matched: ${adapter.name}`);\n } catch (error) {\n diagnostics.warnings.push(`Adapter \"${adapter.name}\" failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return normalizeMetadata(rawSources, {\n url,\n finalUrl,\n diagnostics,\n imageScorers: registry.imageScorers,\n includeRaw: options.includeRaw\n });\n}\n\nexport async function parseMetadataAsync(html: string, url: string, options: ParseMetadataOptions = {}): Promise<UnifiedMetadata> {\n const finalUrl = resolveUrl(url);\n const registry = createRegistry(options);\n const diagnostics = createEmptyDiagnostics();\n diagnostics.originalUrl = url;\n diagnostics.finalUrl = finalUrl;\n diagnostics.trace.push(\"validated and normalized URL\");\n const rawSources: RawMetadataSources = {\n html: extractHtmlMetadata(html),\n openGraph: extractOpenGraph(html),\n twitter: extractTwitterCards(html),\n jsonLd: extractJsonLd(html),\n embeddedData: extractEmbeddedData(html),\n oEmbed: extractOEmbed(html, finalUrl),\n images: extractImages(html, finalUrl),\n videos: extractVideos(html, finalUrl),\n audio: extractAudio(html, finalUrl),\n adapters: [],\n plugins: []\n };\n appendExtractionTrace(rawSources, diagnostics.trace);\n const $ = loadDocument(html);\n const fetchOptions = options as FetchMetadataOptions;\n\n if (fetchOptions.fetchOEmbed && rawSources.oEmbed.links.length > 0) {\n const oEmbed = await fetchOEmbedData(rawSources.oEmbed.links, fetchOptions);\n rawSources.oEmbed.data = oEmbed.data;\n diagnostics.warnings.push(...oEmbed.warnings);\n diagnostics.trace.push(\"fetched discovered oEmbed JSON endpoints\");\n }\n\n for (const extractor of registry.extractors) {\n try {\n rawSources.plugins.push(withSource(await extractor.extract({ html, url, finalUrl, $, raw: rawSources, options }), extractor.name));\n diagnostics.trace.push(`plugin extractor matched: ${extractor.name}`);\n } catch (error) {\n diagnostics.warnings.push(`Plugin extractor \"${extractor.name}\" failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n const parsedUrl = new URL(finalUrl);\n for (const adapter of registry.adapters) {\n if (!adapterMatches(adapter, parsedUrl)) {\n continue;\n }\n\n try {\n const context: AdapterContext = { html, url, finalUrl, $, raw: rawSources, options };\n const result = await adapter.extract(context);\n const normalized = adapter.normalize ? await adapter.normalize(result as AdapterExtractionResult, context) : (result as AdapterExtractionResult);\n rawSources.adapters.push(withSource(normalized, adapter.name));\n diagnostics.trace.push(`adapter matched: ${adapter.name}`);\n } catch (error) {\n diagnostics.warnings.push(`Adapter \"${adapter.name}\" failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return normalizeMetadata(rawSources, {\n url,\n finalUrl,\n diagnostics,\n imageScorers: registry.imageScorers,\n includeRaw: options.includeRaw\n });\n}\n\nfunction withSource<T extends AdapterExtractionResult | PluginExtractionResult>(result: T, source: string): T {\n return {\n ...result,\n source: result.source || source\n };\n}\n\nfunction isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n return Boolean(value && typeof (value as Promise<T>).then === \"function\");\n}\n\nfunction adapterMatches(adapter: SiteAdapter, url: URL): boolean {\n return adapter.detect?.(url) ?? adapter.canHandle?.(url) ?? false;\n}\n\nfunction appendExtractionTrace(rawSources: RawMetadataSources, trace: string[]): void {\n if (Object.keys(rawSources.openGraph.raw).length > 0) {\n trace.push(\"parsed Open Graph\");\n }\n if (Object.keys(rawSources.twitter.raw).length > 0) {\n trace.push(\"parsed Twitter Cards\");\n }\n if (rawSources.jsonLd.nodes.length > 0) {\n trace.push(\"parsed JSON-LD\");\n }\n if (rawSources.embeddedData.items.length > 0) {\n trace.push(\"parsed embedded application data\");\n }\n if (rawSources.oEmbed.links.length > 0) {\n trace.push(\"discovered oEmbed endpoints\");\n }\n if (rawSources.images.length > 0 || rawSources.videos.length > 0 || rawSources.audio.length > 0) {\n trace.push(\"discovered HTML media candidates\");\n }\n}\n","export interface ImageDimensions {\n width?: number;\n height?: number;\n}\n\nexport function detectImageDimensions(bytes: Uint8Array | undefined, contentType?: string): ImageDimensions {\n if (!bytes || bytes.length < 16) {\n return {};\n }\n\n const type = contentType?.toLowerCase() ?? \"\";\n\n if (type.includes(\"png\") || isPng(bytes)) {\n return readPngDimensions(bytes);\n }\n\n if (type.includes(\"jpeg\") || type.includes(\"jpg\") || isJpeg(bytes)) {\n return readJpegDimensions(bytes);\n }\n\n if (type.includes(\"webp\") || isWebp(bytes)) {\n return readWebpDimensions(bytes);\n }\n\n return {};\n}\n\nfunction isPng(bytes: Uint8Array): boolean {\n return bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47;\n}\n\nfunction isJpeg(bytes: Uint8Array): boolean {\n return bytes[0] === 0xff && bytes[1] === 0xd8;\n}\n\nfunction isWebp(bytes: Uint8Array): boolean {\n return ascii(bytes, 0, 4) === \"RIFF\" && ascii(bytes, 8, 4) === \"WEBP\";\n}\n\nfunction readPngDimensions(bytes: Uint8Array): ImageDimensions {\n if (bytes.length < 24) {\n return {};\n }\n\n return {\n width: readUint32(bytes, 16),\n height: readUint32(bytes, 20)\n };\n}\n\nfunction readJpegDimensions(bytes: Uint8Array): ImageDimensions {\n let offset = 2;\n\n while (offset + 9 < bytes.length) {\n if (bytes[offset] !== 0xff) {\n offset += 1;\n continue;\n }\n\n const marker = bytes[offset + 1];\n const length = readUint16(bytes, offset + 2);\n if (length < 2) {\n return {};\n }\n\n if (marker >= 0xc0 && marker <= 0xcf && ![0xc4, 0xc8, 0xcc].includes(marker)) {\n return {\n height: readUint16(bytes, offset + 5),\n width: readUint16(bytes, offset + 7)\n };\n }\n\n offset += 2 + length;\n }\n\n return {};\n}\n\nfunction readWebpDimensions(bytes: Uint8Array): ImageDimensions {\n const chunk = ascii(bytes, 12, 4);\n\n if (chunk === \"VP8X\" && bytes.length >= 30) {\n return {\n width: 1 + readUint24Le(bytes, 24),\n height: 1 + readUint24Le(bytes, 27)\n };\n }\n\n if (chunk === \"VP8 \" && bytes.length >= 30) {\n return {\n width: readUint16Le(bytes, 26) & 0x3fff,\n height: readUint16Le(bytes, 28) & 0x3fff\n };\n }\n\n if (chunk === \"VP8L\" && bytes.length >= 25) {\n const b0 = bytes[21];\n const b1 = bytes[22];\n const b2 = bytes[23];\n const b3 = bytes[24];\n return {\n width: 1 + (((b1 & 0x3f) << 8) | b0),\n height: 1 + (((b3 & 0x0f) << 10) | (b2 << 2) | ((b1 & 0xc0) >> 6))\n };\n }\n\n return {};\n}\n\nfunction readUint16(bytes: Uint8Array, offset: number): number {\n return (bytes[offset] << 8) + bytes[offset + 1];\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n return bytes[offset] + (bytes[offset + 1] << 8);\n}\n\nfunction readUint24Le(bytes: Uint8Array, offset: number): number {\n return bytes[offset] + (bytes[offset + 1] << 8) + (bytes[offset + 2] << 16);\n}\n\nfunction readUint32(bytes: Uint8Array, offset: number): number {\n return ((bytes[offset] << 24) >>> 0) + (bytes[offset + 1] << 16) + (bytes[offset + 2] << 8) + bytes[offset + 3];\n}\n\nfunction ascii(bytes: Uint8Array, offset: number, length: number): string {\n return String.fromCharCode(...bytes.slice(offset, offset + length));\n}\n","import { fetchPage, type FetchedPage } from \"./fetcher/index.js\";\nimport { parseMetadataAsync } from \"./parse.js\";\nimport type { ExtractionFallbackAttempt, ExtractionRetryInfo, FetchMetadataOptions, MediaAsset, ProviderDiagnostics, UnifiedMetadata } from \"./types/index.js\";\nimport { detectImageDimensions } from \"./utils/imageDimensions.js\";\nimport { isAllowedRedditImageCandidate, prioritizeRedditImages, redditImagePriority } from \"./utils/redditMedia.js\";\nimport { normalizeUrl } from \"./utils/url.js\";\n\nconst REDDIT_BLOCKED_METADATA_WARNING = \"Reddit returned a verification/block page; metadata is incomplete.\";\nconst PROVIDER_BLOCKED_SUGGESTED_ACTION = \"retry_on_different_host_or_use_supported_proxy\";\n\ninterface FetchStrategyResult {\n page: FetchedPage;\n fallbacksAttempted: ExtractionFallbackAttempt[];\n warnings: string[];\n trace: string[];\n sourcePriority?: string[];\n extractionMethod?: string;\n retryInfo?: ExtractionRetryInfo;\n providerDiagnostics?: ProviderDiagnostics;\n}\n\ntype RedditBlockReason = \"provider_verification_required\" | \"provider_blocked_request\";\n\ninterface RedditFetchAttempt extends ExtractionFallbackAttempt {\n page?: FetchedPage;\n blockReason?: RedditBlockReason;\n}\n\ninterface RedditPostPayload {\n title?: string;\n description?: string;\n author?: string;\n createdAt?: string;\n canonicalUrl?: string;\n url?: string;\n images: MediaAsset[];\n videos: MediaAsset[];\n subreddit?: string;\n postId?: string;\n}\n\nexport async function fetchMetadata(url: string, options: FetchMetadataOptions = {}): Promise<UnifiedMetadata> {\n const startedAt = Date.now();\n\n try {\n const requestedUrl = normalizeUrl(url);\n const fetchResult = await fetchPageWithStrategies(requestedUrl, options);\n const page = fetchResult.page;\n if (fetchResult.providerDiagnostics?.blocked) {\n return createBlockedProviderMetadata(requestedUrl, fetchResult, Date.now() - startedAt);\n }\n\n const directMedia = createDirectMediaMetadata(page, requestedUrl, Date.now() - startedAt);\n if (directMedia) {\n return directMedia;\n }\n\n const metadata = await parseMetadataAsync(page.html, page.finalUrl, options);\n\n metadata.url = requestedUrl;\n metadata.finalUrl = page.finalUrl;\n metadata.ok = page.statusCode >= 200 && page.statusCode < 300;\n metadata.diagnostics.statusCode = page.statusCode;\n metadata.diagnostics.contentType = page.contentType;\n metadata.diagnostics.originalUrl = requestedUrl;\n metadata.diagnostics.finalUrl = page.finalUrl;\n metadata.diagnostics.canonicalUrl = metadata.canonicalUrl;\n metadata.diagnostics.isShortUrl = page.isShortUrl;\n metadata.diagnostics.shortUrlProvider = page.shortUrlProvider;\n metadata.diagnostics.redirects = page.redirects;\n metadata.diagnostics.fetchDurationMs = Date.now() - startedAt;\n metadata.diagnostics.trace = [\n ...(page.isShortUrl ? [`detected short URL provider: ${page.shortUrlProvider ?? \"unknown\"}`] : []),\n ...(page.redirects.length > 0 ? [`resolved ${page.redirects.length} redirect${page.redirects.length === 1 ? \"\" : \"s\"}`] : []),\n ...fetchResult.trace,\n \"downloaded page\",\n ...metadata.diagnostics.trace,\n ...(metadata.canonicalUrl ? [\"resolved canonical URL\"] : [])\n ];\n metadata.diagnostics.fallbacksAttempted = mergeFallbackAttempts(metadata.diagnostics.fallbacksAttempted, fetchResult.fallbacksAttempted);\n metadata.diagnostics.sourcePriority = uniqueStrings([...(metadata.diagnostics.sourcePriority ?? []), ...(fetchResult.sourcePriority ?? [])]);\n metadata.diagnostics.extractionMethod = metadata.diagnostics.extractionMethod ?? fetchResult.extractionMethod;\n metadata.diagnostics.retryInfo = metadata.diagnostics.retryInfo ?? fetchResult.retryInfo;\n metadata.trace = metadata.diagnostics.trace;\n metadata.diagnostics.warnings.push(...fetchResult.warnings);\n\n if (!metadata.ok) {\n metadata.diagnostics.warnings.push(`Fetch completed with non-success status code ${page.statusCode}.`);\n }\n\n if (page.contentType && !/html|xml|text/i.test(page.contentType)) {\n metadata.diagnostics.warnings.push(`Response content type may not contain parseable metadata: ${page.contentType}.`);\n }\n\n return metadata;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const safeUrl = safeNormalize(url);\n\n return {\n ok: false,\n url: safeUrl,\n finalUrl: safeUrl,\n type: \"unknown\",\n confidence: 0,\n completeness: 0,\n reliability: 0,\n images: [],\n videos: [],\n audio: [],\n favicons: [],\n trace: [\"fetch failed\"],\n diagnostics: {\n originalUrl: safeUrl,\n finalUrl: safeUrl,\n redirects: [],\n sourcesUsed: [],\n warnings: [],\n trace: [\"fetch failed\"],\n errors: [message],\n fetchDurationMs: Date.now() - startedAt,\n extractedAt: new Date().toISOString()\n }\n };\n }\n}\n\nfunction createBlockedProviderMetadata(\n requestedUrl: string,\n fetchResult: FetchStrategyResult,\n fetchDurationMs: number\n): UnifiedMetadata {\n const page = fetchResult.page;\n const providerDiagnostics = fetchResult.providerDiagnostics;\n const trace = uniqueStrings([\n ...(page.isShortUrl ? [`detected short URL provider: ${page.shortUrlProvider ?? \"unknown\"}`] : []),\n ...(page.redirects.length > 0 ? [`resolved ${page.redirects.length} redirect${page.redirects.length === 1 ? \"\" : \"s\"}`] : []),\n ...fetchResult.trace,\n \"detected blocked provider response\"\n ]);\n const warnings = uniqueStrings([\n ...fetchResult.warnings,\n REDDIT_BLOCKED_METADATA_WARNING,\n ...(page.statusCode < 200 || page.statusCode >= 300 ? [`Fetch completed with non-success status code ${page.statusCode}.`] : [])\n ]);\n\n return {\n ok: false,\n url: requestedUrl,\n finalUrl: page.finalUrl,\n type: \"unknown\",\n siteName: providerDiagnostics?.platform === \"reddit\" ? \"Reddit\" : undefined,\n confidence: 0,\n completeness: 0,\n reliability: 0,\n images: [],\n videos: [],\n audio: [],\n favicons: [],\n trace,\n diagnostics: {\n originalUrl: requestedUrl,\n finalUrl: page.finalUrl,\n isShortUrl: page.isShortUrl,\n shortUrlProvider: page.shortUrlProvider,\n statusCode: page.statusCode,\n contentType: page.contentType,\n redirects: page.redirects,\n sourcesUsed: [],\n warnings,\n fallbacksAttempted: mergeFallbackAttempts(undefined, fetchResult.fallbacksAttempted),\n trace,\n sourcePriority: fetchResult.sourcePriority,\n extractionMethod: fetchResult.extractionMethod,\n retryInfo: fetchResult.retryInfo,\n providerDiagnostics,\n confidenceBreakdown: {\n title: 0,\n description: 0,\n image: 0,\n structuredData: 0,\n adapter: 0\n },\n fetchDurationMs,\n extractedAt: new Date().toISOString()\n }\n };\n}\n\nasync function fetchPageWithStrategies(requestedUrl: string, options: FetchMetadataOptions): Promise<FetchStrategyResult> {\n if (isRedditUrl(requestedUrl)) {\n return fetchRedditPageWithStrategy(requestedUrl, options);\n }\n\n return {\n page: await fetchPage(requestedUrl, options),\n fallbacksAttempted: [],\n warnings: [],\n trace: []\n };\n}\n\nasync function fetchRedditPageWithStrategy(requestedUrl: string, options: FetchMetadataOptions): Promise<FetchStrategyResult> {\n const attempts: RedditFetchAttempt[] = [];\n const warnings: string[] = [];\n const informationalFallbacks: string[] = [];\n const sourcePriority = [\"redditJsonEndpoint\", \"oldReddit\", \"embeddedStructuredData\", \"openGraph\", \"html\"];\n let lastError: unknown;\n\n const jsonUrl = redditJsonEndpoint(requestedUrl);\n if (jsonUrl) {\n const attempt = await attemptFetch(\"redditJsonEndpoint\", jsonUrl, {\n ...options,\n accept: \"application/json,text/html;q=0.8,*/*;q=0.5\"\n });\n attempts.push(attempt);\n lastError = attempt.error;\n\n if (attempt.page && attempt.ok) {\n const redditPost = parseRedditJsonPayload(attempt.page.html);\n if (redditPost?.title) {\n return {\n page: synthesizeRedditJsonPage(attempt.page, requestedUrl, redditPost),\n fallbacksAttempted: attempts,\n warnings,\n trace: [\"used Reddit JSON endpoint\"],\n sourcePriority,\n extractionMethod: \"reddit:jsonEndpoint\",\n retryInfo: redditRetryInfo(attempts)\n };\n }\n\n warnings.push(\"Reddit JSON endpoint responded, but no post payload could be extracted.\");\n } else if (attempt.blocked) {\n informationalFallbacks.push(\"Informational fallback: Reddit JSON endpoint appears to have blocked access; continuing with fallback extraction.\");\n }\n }\n\n const oldRedditUrl = redditOldUrl(requestedUrl);\n if (oldRedditUrl && oldRedditUrl !== requestedUrl) {\n const attempt = await attemptFetch(\"oldReddit\", oldRedditUrl, options);\n attempts.push(attempt);\n lastError = attempt.error;\n\n if (attempt.page && attempt.ok) {\n return {\n page: attempt.page,\n fallbacksAttempted: attempts,\n warnings,\n trace: [...informationalFallbacks, \"retried Reddit page through old.reddit\"],\n sourcePriority,\n extractionMethod: \"reddit:oldReddit\",\n retryInfo: redditRetryInfo(attempts)\n };\n }\n\n if (attempt.blocked) {\n warnings.push(\"old.reddit fallback appears to have been blocked.\");\n }\n }\n\n const htmlAttempt = await attemptFetch(\"redditHtmlFallback\", requestedUrl, options);\n attempts.push(htmlAttempt);\n lastError = htmlAttempt.error;\n\n if (htmlAttempt.page && htmlAttempt.ok) {\n return {\n page: htmlAttempt.page,\n fallbacksAttempted: attempts,\n warnings,\n trace: [...informationalFallbacks, \"used Reddit HTML fallback\"],\n sourcePriority,\n extractionMethod: \"reddit:htmlFallback\",\n retryInfo: redditRetryInfo(attempts)\n };\n }\n\n if (htmlAttempt.blocked) {\n warnings.push(\"Reddit HTML fallback appears to have been blocked; metadata may be incomplete.\");\n }\n\n const providerDiagnostics = redditProviderDiagnosticsFromAttempts(attempts);\n if (providerDiagnostics) {\n return {\n page: synthesizeRedditBlockedPage(requestedUrl, attempts, providerDiagnostics),\n fallbacksAttempted: attempts,\n warnings: uniqueStrings([...warnings, REDDIT_BLOCKED_METADATA_WARNING]),\n trace: [...informationalFallbacks, \"Reddit provider blocked metadata extraction\"],\n sourcePriority,\n extractionMethod: \"reddit:blockedProvider\",\n retryInfo: redditRetryInfo(attempts),\n providerDiagnostics\n };\n }\n\n throw lastError ?? new Error(\"All Reddit extraction fetch attempts failed.\");\n}\n\nasync function attemptFetch(\n method: string,\n url: string,\n options: FetchMetadataOptions\n): Promise<RedditFetchAttempt> {\n try {\n const page = await fetchPage(url, options);\n const retryAfter = page.headers[\"retry-after\"];\n const blockReason = redditBlockReason(page);\n const blocked = Boolean(blockReason);\n\n return {\n method,\n url,\n ok: page.statusCode >= 200 && page.statusCode < 300 && !blocked,\n statusCode: page.statusCode,\n blocked,\n blockReason,\n retryAfter,\n page\n };\n } catch (error) {\n return {\n method,\n url,\n ok: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nfunction isRedditUrl(url: string): boolean {\n try {\n const host = new URL(url).hostname.toLowerCase().replace(/^www\\./, \"\");\n return host === \"reddit.com\" || host === \"redd.it\" || host.endsWith(\".reddit.com\");\n } catch {\n return false;\n }\n}\n\nfunction redditJsonEndpoint(url: string): string | undefined {\n try {\n const parsed = new URL(url);\n const host = parsed.hostname.toLowerCase().replace(/^www\\./, \"\");\n const endpoint = new URL(url);\n endpoint.protocol = \"https:\";\n endpoint.hostname = \"www.reddit.com\";\n endpoint.search = \"\";\n\n if (host === \"redd.it\") {\n const postId = parsed.pathname.split(\"/\").filter(Boolean)[0];\n if (!postId) {\n return undefined;\n }\n endpoint.pathname = `/comments/${postId}.json`;\n } else {\n endpoint.pathname = parsed.pathname.endsWith(\".json\")\n ? parsed.pathname\n : `${parsed.pathname.endsWith(\"/\") ? parsed.pathname : `${parsed.pathname}/`}.json`;\n }\n\n endpoint.searchParams.set(\"raw_json\", \"1\");\n return endpoint.toString();\n } catch {\n return undefined;\n }\n}\n\nfunction redditOldUrl(url: string): string | undefined {\n try {\n const parsed = new URL(url);\n const host = parsed.hostname.toLowerCase().replace(/^www\\./, \"\");\n parsed.protocol = \"https:\";\n parsed.hostname = \"old.reddit.com\";\n parsed.search = \"\";\n\n if (host === \"redd.it\") {\n const postId = parsed.pathname.split(\"/\").filter(Boolean)[0];\n if (!postId) {\n return undefined;\n }\n parsed.pathname = `/comments/${postId}/`;\n }\n\n return parsed.toString();\n } catch {\n return undefined;\n }\n}\n\nfunction parseRedditJsonPayload(source: string): RedditPostPayload | undefined {\n try {\n const parsed = JSON.parse(source) as unknown;\n const post = findRedditPostRecord(parsed);\n if (!post) {\n return undefined;\n }\n\n const createdUtc = numberFromUnknown(post.created_utc);\n const permalink = stringFromUnknown(post.permalink);\n const canonicalUrl = permalink ? `https://www.reddit.com${permalink.startsWith(\"/\") ? permalink : `/${permalink}`}` : undefined;\n const images = redditImagesFromPost(post);\n const videos = redditVideosFromPost(post);\n const description = firstText(\n stringFromUnknown(post.selftext),\n stringFromUnknown(post.selftext_html),\n stringFromUnknown(post.url_overridden_by_dest)\n );\n\n return {\n title: stringFromUnknown(post.title),\n description,\n author: stringFromUnknown(post.author) ?? stringFromUnknown(post.author_fullname),\n createdAt: createdUtc ? new Date(createdUtc * 1000).toISOString() : undefined,\n canonicalUrl,\n url: stringFromUnknown(post.url_overridden_by_dest) ?? stringFromUnknown(post.url),\n images,\n videos,\n subreddit: stringFromUnknown(post.subreddit_name_prefixed) ?? stringFromUnknown(post.subreddit),\n postId: stringFromUnknown(post.id)\n };\n } catch {\n return undefined;\n }\n}\n\nfunction findRedditPostRecord(value: unknown): Record<string, unknown> | undefined {\n if (Array.isArray(value)) {\n for (const item of value) {\n const found = findRedditPostRecord(item);\n if (found) {\n return found;\n }\n }\n return undefined;\n }\n\n if (!isRecord(value)) {\n return undefined;\n }\n\n if (typeof value.title === \"string\" && (typeof value.id === \"string\" || typeof value.name === \"string\")) {\n return value;\n }\n\n const children = isRecord(value.data) && Array.isArray(value.data.children) ? value.data.children : undefined;\n if (children) {\n for (const child of children) {\n if (isRecord(child) && isRecord(child.data) && (child.kind === \"t3\" || typeof child.data.title === \"string\")) {\n return child.data;\n }\n }\n }\n\n for (const childValue of Object.values(value).slice(0, 100)) {\n const found = findRedditPostRecord(childValue);\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction redditImagesFromPost(post: Record<string, unknown>): MediaAsset[] {\n const images: MediaAsset[] = [\n ...redditGalleryImagesFromPost(post),\n ...redditDirectImagesFromPost(post)\n ];\n const preview = isRecord(post.preview) && Array.isArray(post.preview.images) ? post.preview.images : [];\n\n for (const image of preview) {\n if (!isRecord(image)) {\n continue;\n }\n\n const source = redditImageFromRecord(image.source, \"previewOriginal\");\n if (source) {\n images.push(source);\n continue;\n }\n\n const fallbackResolution = largestRedditImageRecord(Array.isArray(image.resolutions) ? image.resolutions : []);\n const fallback = redditImageFromRecord(fallbackResolution, \"previewResolution\");\n if (fallback) {\n images.push(fallback);\n }\n }\n\n const thumbnail = redditMediaUrl(stringFromUnknown(post.thumbnail));\n if (thumbnail && /^https?:\\/\\//i.test(thumbnail)) {\n const thumbnailAsset = redditImageAsset(thumbnail, undefined, undefined, \"thumbnail\");\n if (thumbnailAsset) {\n images.push(thumbnailAsset);\n }\n }\n\n return dedupeRedditImages(prioritizeRedditImages(images));\n}\n\nfunction redditGalleryImagesFromPost(post: Record<string, unknown>): MediaAsset[] {\n const mediaMetadata = isRecord(post.media_metadata) ? post.media_metadata : undefined;\n if (!mediaMetadata) {\n return [];\n }\n\n const galleryItems = isRecord(post.gallery_data) && Array.isArray(post.gallery_data.items) ? post.gallery_data.items : [];\n const orderedIds = galleryItems\n .map((item) => isRecord(item) ? stringFromUnknown(item.media_id) : undefined)\n .filter((item): item is string => Boolean(item));\n const seenIds = new Set<string>();\n const assets: MediaAsset[] = [];\n\n for (const id of orderedIds) {\n const asset = redditImageFromMediaMetadata(mediaMetadata[id], id);\n if (asset) {\n assets.push(asset);\n seenIds.add(id);\n }\n }\n\n for (const [id, value] of Object.entries(mediaMetadata)) {\n if (seenIds.has(id)) {\n continue;\n }\n\n const asset = redditImageFromMediaMetadata(value, id);\n if (asset) {\n assets.push(asset);\n }\n }\n\n return assets;\n}\n\nfunction redditDirectImagesFromPost(post: Record<string, unknown>): MediaAsset[] {\n const url = redditMediaUrl(stringFromUnknown(post.url_overridden_by_dest) ?? stringFromUnknown(post.url));\n if (!url || !isDirectRedditImageUrl(url)) {\n return [];\n }\n\n const previewSource = previewSourceRecord(post);\n const asset = redditImageAsset(\n url,\n numberFromUnknown(previewSource?.width),\n numberFromUnknown(previewSource?.height),\n \"directImage\"\n );\n\n return asset ? [asset] : [];\n}\n\nfunction redditImageFromMediaMetadata(value: unknown, mediaId: string): MediaAsset | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const source = isRecord(value.s) ? value.s : undefined;\n const url = redditMediaUrl(\n stringFromUnknown(source?.u) ??\n stringFromUnknown(source?.gif) ??\n stringFromUnknown(source?.mp4)\n );\n\n if (!url) {\n return undefined;\n }\n\n const asset = redditImageAsset(\n url,\n numberFromUnknown(source?.x) ?? numberFromUnknown(source?.width),\n numberFromUnknown(source?.y) ?? numberFromUnknown(source?.height),\n \"gallery\",\n stringFromUnknown(value.m)\n );\n\n return asset\n ? {\n ...asset,\n metadata: {\n ...asset.metadata,\n redditMediaId: mediaId\n }\n }\n : undefined;\n}\n\nfunction redditImageFromRecord(value: unknown, redditMediaKind: string): MediaAsset | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const url = redditMediaUrl(stringFromUnknown(value.url) ?? stringFromUnknown(value.u));\n if (!url) {\n return undefined;\n }\n\n return redditImageAsset(\n url,\n numberFromUnknown(value.width) ?? numberFromUnknown(value.x),\n numberFromUnknown(value.height) ?? numberFromUnknown(value.y),\n redditMediaKind\n );\n}\n\nfunction redditImageAsset(\n url: string,\n width: number | undefined,\n height: number | undefined,\n redditMediaKind: string,\n type?: string\n): MediaAsset | undefined {\n const asset: MediaAsset = {\n url,\n kind: \"image\",\n source: \"adapter\",\n width,\n height,\n type,\n metadata: {\n adapter: \"redditJsonEndpoint\",\n originalSource: \"redditJsonEndpoint\",\n redditMediaKind\n }\n };\n\n return isAllowedRedditImageCandidate(asset) ? asset : undefined;\n}\n\nfunction largestRedditImageRecord(values: unknown[]): unknown {\n return values\n .filter(isRecord)\n .sort((left, right) =>\n (numberFromUnknown(right.width) ?? 0) * (numberFromUnknown(right.height) ?? 0) -\n (numberFromUnknown(left.width) ?? 0) * (numberFromUnknown(left.height) ?? 0)\n )[0];\n}\n\nfunction previewSourceRecord(post: Record<string, unknown>): Record<string, unknown> | undefined {\n const images = isRecord(post.preview) && Array.isArray(post.preview.images) ? post.preview.images : [];\n const firstImage = images.find(isRecord);\n return firstImage && isRecord(firstImage.source) ? firstImage.source : undefined;\n}\n\nfunction isDirectRedditImageUrl(value: string): boolean {\n try {\n const parsed = new URL(value);\n const host = parsed.hostname.toLowerCase();\n return host === \"i.redd.it\" || host === \"preview.redd.it\";\n } catch {\n return false;\n }\n}\n\nfunction dedupeRedditImages(images: MediaAsset[]): MediaAsset[] {\n const seen = new Set<string>();\n const unique: MediaAsset[] = [];\n\n for (const image of images) {\n if (seen.has(image.url)) {\n continue;\n }\n\n seen.add(image.url);\n unique.push(image);\n }\n\n return unique;\n}\n\nfunction redditVideosFromPost(post: Record<string, unknown>): MediaAsset[] {\n const videos: MediaAsset[] = [];\n const media = [post.media, post.secure_media].filter(isRecord);\n\n for (const item of media) {\n const redditVideo = isRecord(item.reddit_video) ? item.reddit_video : undefined;\n const url = redditMediaUrl(stringFromUnknown(redditVideo?.fallback_url) ?? stringFromUnknown(redditVideo?.hls_url) ?? stringFromUnknown(redditVideo?.dash_url));\n if (!url) {\n continue;\n }\n\n videos.push({\n url,\n kind: \"video\",\n source: \"adapter\",\n width: numberFromUnknown(redditVideo?.width),\n height: numberFromUnknown(redditVideo?.height),\n metadata: {\n adapter: \"redditJsonEndpoint\",\n originalSource: \"redditJsonEndpoint\"\n }\n });\n }\n\n return videos;\n}\n\nfunction synthesizeRedditJsonPage(jsonPage: FetchedPage, requestedUrl: string, post: RedditPostPayload): FetchedPage {\n const finalUrl = post.canonicalUrl ?? requestedUrl;\n const bestImage = post.images.slice().sort(\n (left, right) =>\n redditImagePriority(right) - redditImagePriority(left) ||\n ((right.width ?? 0) * (right.height ?? 0)) - ((left.width ?? 0) * (left.height ?? 0))\n )[0];\n const video = post.videos[0];\n const structuredData = {\n \"@context\": \"https://schema.org\",\n \"@type\": \"SocialMediaPosting\",\n headline: post.title,\n description: post.description,\n author: post.author ? { \"@type\": \"Person\", name: post.author } : undefined,\n datePublished: post.createdAt,\n url: finalUrl,\n image: bestImage ? { \"@type\": \"ImageObject\", url: bestImage.url, width: bestImage.width, height: bestImage.height } : undefined,\n video: video ? { \"@type\": \"VideoObject\", contentUrl: video.url, width: video.width, height: video.height } : undefined\n };\n const embeddedPayload = {\n post: {\n postTitle: post.title,\n description: post.description,\n author: post.author ? { name: post.author } : undefined,\n createdAt: post.createdAt,\n canonicalUrl: finalUrl,\n previewImage: bestImage,\n media: {\n videoUrl: video?.url\n },\n images: post.images,\n videos: post.videos,\n subreddit: post.subreddit,\n postId: post.postId\n }\n };\n const html = [\n \"<!doctype html><html><head>\",\n `<title>${escapeHtml(post.title ?? \"Reddit post\")}</title>`,\n post.title ? `<meta property=\"og:title\" content=\"${escapeHtml(post.title)}\">` : \"\",\n post.description ? `<meta property=\"og:description\" content=\"${escapeHtml(post.description)}\">` : \"\",\n `<meta property=\"og:site_name\" content=\"Reddit\">`,\n `<meta property=\"og:url\" content=\"${escapeHtml(finalUrl)}\">`,\n bestImage ? `<meta property=\"og:image\" content=\"${escapeHtml(bestImage.url)}\">` : \"\",\n bestImage?.width ? `<meta property=\"og:image:width\" content=\"${bestImage.width}\">` : \"\",\n bestImage?.height ? `<meta property=\"og:image:height\" content=\"${bestImage.height}\">` : \"\",\n `<link rel=\"canonical\" href=\"${escapeHtml(finalUrl)}\">`,\n `<script type=\"application/ld+json\">${safeJson(structuredData)}</script>`,\n `<script type=\"application/json\" id=\"metanova-reddit-json\">${safeJson(embeddedPayload)}</script>`,\n \"</head><body></body></html>\"\n ].join(\"\");\n\n return {\n ...jsonPage,\n url: requestedUrl,\n originalUrl: requestedUrl,\n finalUrl,\n html,\n bytes: new TextEncoder().encode(html),\n contentType: \"text/html; charset=utf-8\",\n statusCode: jsonPage.statusCode\n };\n}\n\nfunction redditProviderDiagnosticsFromAttempts(attempts: RedditFetchAttempt[]): ProviderDiagnostics | undefined {\n const blockedAttempts = attempts.filter((attempt) => attempt.blocked);\n if (blockedAttempts.length === 0) {\n return undefined;\n }\n\n const selectedAttempt =\n blockedAttempts.find((attempt) => attempt.blockReason === \"provider_verification_required\") ??\n blockedAttempts.at(-1);\n\n return {\n platform: \"reddit\",\n blocked: true,\n statusCode: selectedAttempt?.statusCode,\n reason: selectedAttempt?.blockReason ?? \"provider_blocked_request\",\n suggestedAction: PROVIDER_BLOCKED_SUGGESTED_ACTION\n };\n}\n\nfunction synthesizeRedditBlockedPage(\n requestedUrl: string,\n attempts: RedditFetchAttempt[],\n providerDiagnostics: ProviderDiagnostics\n): FetchedPage {\n const selectedPage =\n attempts.find((attempt) => attempt.blockReason === providerDiagnostics.reason)?.page ??\n attempts.slice().reverse().find((attempt) => attempt.page)?.page;\n\n return {\n url: requestedUrl,\n originalUrl: requestedUrl,\n finalUrl: requestedUrl,\n isShortUrl: selectedPage?.isShortUrl ?? false,\n shortUrlProvider: selectedPage?.shortUrlProvider,\n html: \"\",\n bytes: new Uint8Array(),\n statusCode: providerDiagnostics.statusCode ?? selectedPage?.statusCode ?? 403,\n contentType: selectedPage?.contentType,\n redirects: selectedPage?.redirects ?? [],\n headers: selectedPage?.headers ?? {}\n };\n}\n\nfunction redditBlockReason(page: FetchedPage): RedditBlockReason | undefined {\n const title = htmlTitle(page.html);\n const text = normalizeText(`${title ?? \"\"} ${page.html}`);\n\n if (/reddit\\s*-\\s*please wait for verification/i.test(title ?? \"\") || /please wait for verification|verification required|verify you are human/i.test(text)) {\n return \"provider_verification_required\";\n }\n\n if (\n page.statusCode === 403 ||\n page.statusCode === 429 ||\n /whoa there, pardner|request has been blocked|too many requests|forbidden|you're blocked|you are blocked|youre blocked|blocked by network security/i.test(text) ||\n /^blocked$/i.test(title ?? \"\")\n ) {\n return \"provider_blocked_request\";\n }\n\n return undefined;\n}\n\nfunction htmlTitle(html: string): string | undefined {\n return normalizeText(html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)?.[1]);\n}\n\nfunction normalizeText(value: string | undefined): string {\n return value?.replace(/<[^>]*>/g, \" \").replace(/\\s+/g, \" \").trim() ?? \"\";\n}\n\nfunction redditRetryInfo(attempts: ExtractionFallbackAttempt[]): ExtractionRetryInfo | undefined {\n const blockedAttempts = attempts.filter((attempt) => attempt.blocked || attempt.statusCode === 429 || attempt.statusCode === 403);\n if (blockedAttempts.length === 0) {\n return undefined;\n }\n\n const retryAfter = blockedAttempts.map((attempt) => attempt.retryAfter).find((value): value is string => Boolean(value));\n return {\n retryable: blockedAttempts.some((attempt) => attempt.statusCode === 429 || Boolean(attempt.retryAfter)),\n reason: blockedAttempts.map((attempt) => `${attempt.method}${attempt.statusCode ? ` returned ${attempt.statusCode}` : \" failed\"}`).join(\"; \"),\n retryAfter,\n retryAfterMs: retryAfterToMs(retryAfter),\n attempts: attempts.length\n };\n}\n\nfunction retryAfterToMs(value: string | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const seconds = Number.parseInt(value, 10);\n if (Number.isFinite(seconds)) {\n return seconds * 1000;\n }\n\n const dateMs = Date.parse(value);\n return Number.isFinite(dateMs) ? Math.max(dateMs - Date.now(), 0) : undefined;\n}\n\nfunction mergeFallbackAttempts(\n existing: ExtractionFallbackAttempt[] | undefined,\n incoming: ExtractionFallbackAttempt[]\n): ExtractionFallbackAttempt[] | undefined {\n const attempts = [...(existing ?? []), ...incoming];\n if (attempts.length === 0) {\n return undefined;\n }\n\n const seen = new Set<string>();\n return attempts.map((value) => {\n const { page: _page, blockReason: _blockReason, ...attempt } = value as RedditFetchAttempt;\n return attempt;\n }).filter((attempt) => {\n const key = `${attempt.method}:${attempt.url ?? \"\"}:${attempt.statusCode ?? \"\"}:${attempt.error ?? \"\"}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n}\n\nfunction uniqueStrings(values: Array<string | undefined>): string[] {\n return [...new Set(values.filter((value): value is string => Boolean(value)))];\n}\n\nfunction redditMediaUrl(value: string | undefined): string | undefined {\n return value?.replace(/&amp;/g, \"&\");\n}\n\nfunction firstText(...values: Array<string | undefined>): string | undefined {\n return values.map((value) => value?.replace(/\\s+/g, \" \").trim()).find((value): value is string => Boolean(value));\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n\n return undefined;\n}\n\nfunction numberFromUnknown(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction safeJson(value: unknown): string {\n return JSON.stringify(stripUndefinedDeep(value)).replace(/</g, \"\\\\u003c\");\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction stripUndefinedDeep(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stripUndefinedDeep).filter((item) => item !== undefined);\n }\n\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value)\n .map(([key, item]) => [key, stripUndefinedDeep(item)] as const)\n .filter(([, item]) => item !== undefined && item !== null && (!Array.isArray(item) || item.length > 0))\n );\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction createDirectMediaMetadata(\n page: Awaited<ReturnType<typeof fetchPage>>,\n requestedUrl: string,\n fetchDurationMs: number\n): UnifiedMetadata | undefined {\n const contentType = page.contentType?.toLowerCase() ?? \"\";\n const kind = directMediaKind(contentType, page.finalUrl);\n if (!kind) {\n return undefined;\n }\n\n const dimensions =\n kind === \"image\"\n ? {\n ...imageDimensionsFromUrl(page.finalUrl),\n ...detectImageDimensions(page.bytes, page.contentType)\n }\n : {};\n const asset: MediaAsset = {\n url: page.finalUrl,\n kind,\n source: \"direct\",\n type: page.contentType,\n width: dimensions.width,\n height: dimensions.height,\n score: kind === \"image\" ? 90 : undefined,\n confidence: kind === \"image\" ? 0.9 : undefined\n };\n\n const confidence = kind === \"image\" ? 82 : 70;\n const completeness = kind === \"image\" ? (dimensions.width && dimensions.height ? 60 : 45) : 35;\n\n const trace = [\n ...(page.redirects.length > 0 ? [`resolved ${page.redirects.length} redirect${page.redirects.length === 1 ? \"\" : \"s\"}`] : []),\n \"downloaded direct media\",\n `detected direct ${kind}`\n ];\n\n return {\n ok: page.statusCode >= 200 && page.statusCode < 300,\n url: requestedUrl,\n finalUrl: page.finalUrl,\n type: kind === \"image\" ? \"image\" : kind,\n confidence,\n completeness,\n reliability: Math.round((confidence + completeness) / 2),\n bestImage: kind === \"image\" ? page.finalUrl : undefined,\n images: kind === \"image\" ? [asset] : [],\n videos: kind === \"video\" ? [asset] : [],\n audio: kind === \"audio\" ? [asset] : [],\n favicons: [],\n trace,\n sources: {\n image: kind === \"image\" ? \"direct\" : undefined\n },\n diagnostics: {\n originalUrl: requestedUrl,\n finalUrl: page.finalUrl,\n isShortUrl: page.isShortUrl,\n shortUrlProvider: page.shortUrlProvider,\n statusCode: page.statusCode,\n contentType: page.contentType,\n redirects: page.redirects,\n sourcesUsed: [\"direct\"],\n warnings: [],\n trace,\n extractionMethod: `direct:${kind}`,\n selectedImageReason: kind === \"image\" ? \"Selected direct image URL because the response content type is an image.\" : undefined,\n confidenceBreakdown: {\n title: 0,\n description: 0,\n image: kind === \"image\" ? 100 : 0,\n structuredData: 0,\n adapter: 0\n },\n fetchDurationMs,\n extractedAt: new Date().toISOString()\n }\n };\n}\n\nfunction imageDimensionsFromUrl(url: string): { width?: number; height?: number } {\n try {\n const parsed = new URL(url);\n const width = parseDimension(parsed.searchParams.get(\"width\") ?? parsed.searchParams.get(\"w\"));\n const height = parseDimension(parsed.searchParams.get(\"height\") ?? parsed.searchParams.get(\"h\"));\n if (width && height) {\n return { width, height };\n }\n\n const crop = parsed.searchParams.get(\"crop\");\n const cropMatch = crop?.match(/(\\d{2,5})\\s*:\\s*(\\d{2,5})/);\n if (cropMatch) {\n return { width: Number(cropMatch[1]), height: Number(cropMatch[2]) };\n }\n } catch {\n return {};\n }\n\n return {};\n}\n\nfunction parseDimension(value: string | null): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction directMediaKind(contentType: string, url: string): \"image\" | \"video\" | \"audio\" | undefined {\n const normalizedUrl = url.toLowerCase();\n\n if (contentType.startsWith(\"image/\") || /\\.(?:avif|webp|png|jpe?g|gif)(?:[?#].*)?$/i.test(normalizedUrl)) {\n return \"image\";\n }\n\n if (contentType.startsWith(\"video/\") || /\\.(?:mp4|webm|m3u8|mov)(?:[?#].*)?$/i.test(normalizedUrl)) {\n return \"video\";\n }\n\n if (contentType.startsWith(\"audio/\") || /\\.(?:mp3|m4a|wav|ogg|aac)(?:[?#].*)?$/i.test(normalizedUrl)) {\n return \"audio\";\n }\n\n return undefined;\n}\n\nfunction safeNormalize(url: string): string {\n try {\n return normalizeUrl(url);\n } catch {\n return url;\n }\n}\n","import type { PreviewCard, UnifiedMetadata } from \"./types/index.js\";\n\nexport function createPreviewCard(metadata: UnifiedMetadata): PreviewCard {\n return {\n title: metadata.title,\n description: metadata.description,\n image: metadata.bestImage,\n url: metadata.canonicalUrl ?? metadata.finalUrl,\n siteName: metadata.siteName,\n domain: domainFromUrl(metadata.canonicalUrl ?? metadata.finalUrl),\n author: metadata.author?.name,\n type: metadata.type,\n confidence: metadata.confidence\n };\n}\n\nfunction domainFromUrl(url: string): string | undefined {\n try {\n return new URL(url).hostname.replace(/^www\\./, \"\");\n } catch {\n return undefined;\n }\n}\n","import { fetchMetadata } from \"./fetchMetadata.js\";\nimport { parseMetadata, parseMetadataAsync } from \"./parse.js\";\nimport { registerGlobalPlugin } from \"./plugins/index.js\";\nimport { createPreviewCard } from \"./preview.js\";\nimport type { FetchMetadataOptions, MetaNovaPlugin, ParseMetadataOptions, UnifiedMetadata } from \"./types/index.js\";\n\nexport interface MetaNovaRuntime {\n use(plugin: MetaNovaPlugin): MetaNovaRuntime;\n fetchMetadata(url: string, options?: FetchMetadataOptions): Promise<UnifiedMetadata>;\n parseMetadata(html: string, url: string, options?: ParseMetadataOptions): UnifiedMetadata;\n parseMetadataAsync(html: string, url: string, options?: ParseMetadataOptions): Promise<UnifiedMetadata>;\n createPreviewCard: typeof createPreviewCard;\n}\n\nexport const MetaNova: MetaNovaRuntime = {\n use(plugin) {\n registerGlobalPlugin(plugin);\n return MetaNova;\n },\n fetchMetadata,\n parseMetadata,\n parseMetadataAsync,\n createPreviewCard\n};\n","import type { ExtractionDiagnostics } from \"../types/index.js\";\n\nexport function createDiagnostics(): ExtractionDiagnostics {\n return {\n redirects: [],\n sourcesUsed: [],\n warnings: [],\n trace: [],\n extractedAt: new Date().toISOString()\n };\n}\n\nexport function addWarning(diagnostics: ExtractionDiagnostics, warning: string): ExtractionDiagnostics {\n diagnostics.warnings.push(warning);\n return diagnostics;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sBAAgB;AAWhB,IAAM,kBAA0C;AAAA,EAC9C,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,eAAe;AAAA,EACf,YAAY;AACd;AAEO,SAAS,YAAY,OAAe,UAA8B,CAAC,GAAQ;AAChF,QAAM,MAAM,IAAI,IAAI,KAAK;AACzB,QAAM,mBAAmB,QAAQ,oBAAoB,CAAC,SAAS,QAAQ;AAEvE,MAAI,CAAC,iBAAiB,SAAS,IAAI,QAAQ,GAAG;AAC5C,UAAM,IAAI,UAAU,6BAA6B,IAAI,QAAQ,EAAE;AAAA,EACjE;AAEA,SAAO;AACT;AAEO,SAAS,WAAW,KAAa,SAA0B;AAChE,QAAM,WAAW,UAAU,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,IAAI,GAAG;AAC9D,SAAO,aAAa,SAAS,SAAS,CAAC;AACzC;AAEO,SAAS,cAAc,KAAyB,SAAsC;AAC3F,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,WAAW,KAAK,OAAO;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,OAAe,UAA8B,CAAC,GAAW;AACpF,QAAM,MAAM,YAAY,OAAO,OAAO;AACtC,MAAI,OAAO;AACX,MAAI,WAAW,IAAI,SAAS,YAAY;AAExC,MAAK,IAAI,aAAa,WAAW,IAAI,SAAS,QAAU,IAAI,aAAa,YAAY,IAAI,SAAS,OAAQ;AACxG,QAAI,OAAO;AAAA,EACb;AAEA,SAAO,IAAI,SAAS;AACtB;AAEO,SAAS,eAAe,OAAmC;AAChE,QAAM,MAAM,OAAO,UAAU,WAAW,YAAY,KAAK,IAAI;AAC7D,QAAM,WAAW,IAAI,SAAS,YAAY,EAAE,QAAQ,UAAU,EAAE;AAChE,QAAM,WAAW,gBAAgB,QAAQ;AAEzC,SAAO;AAAA,IACL,YAAY,QAAQ,QAAQ;AAAA,IAC5B;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,cAAkC,SAAqC;AACzG,SAAO,cAAc,cAAc,OAAO;AAC5C;AAEO,SAAS,gBAAgB,UAA2B;AACzD,QAAM,aAAa,SAAS,YAAY,EAAE,QAAQ,OAAO,EAAE;AAC3D,SAAO,eAAe,eAAe,WAAW,SAAS,YAAY;AACvE;AAEO,SAAS,WAAW,SAA+E;AACxG,QAAM,YAAY,gBAAAA,QAAI,KAAK,OAAO;AAElC,MAAI,cAAc,GAAG;AACnB,WAAO,aAAa,OAAO;AAAA,EAC7B;AAEA,MAAI,cAAc,GAAG;AACnB,WAAO,aAAa,OAAO;AAAA,EAC7B;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,SAA+E;AACnG,QAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,OAAO,SAAS,MAAM,EAAE,CAAC;AACxE,QAAM,CAAC,GAAG,CAAC,IAAI;AAEf,MAAI,MAAM,KAAK;AACb,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,MAAO,MAAM,OAAO,KAAK,MAAM,KAAK,MAAQ,MAAM,OAAO,MAAM,KAAM;AAC7E,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,OAAO,MAAM,KAAK;AAC1B,WAAO;AAAA,EACT;AAEA,MACE,MAAM,KACN,KAAK,OACJ,MAAM,OAAO,KAAK,MAAM,KAAK,OAC7B,MAAM,OAAO,MAAM,KACnB,MAAM,QAAQ,MAAM,MAAM,MAAM,KACjC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,SAA+E;AACnG,QAAM,aAAa,QAAQ,YAAY;AAEvC,MAAI,eAAe,SAAS,eAAe,mBAAmB;AAC5D,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,WAAW,IAAI,KAAK,WAAW,WAAW,IAAI,GAAG;AAC9D,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,WAAW,KAAK,KAAK,WAAW,WAAW,KAAK,KAAK,WAAW,WAAW,KAAK,KAAK,WAAW,WAAW,KAAK,GAAG;AAChI,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,QAAQ,WAAW,WAAW,aAAa,KAAK,WAAW,WAAW,YAAY,GAAG;AACtG,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC/IA,sBAAuB;AACvB,IAAAC,mBAAgB;AAIT,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAsB,qBAAqB,OAAe,UAAgC,CAAC,GAAoB;AAC7G,QAAM,YAAY,QAAQ,oBAAoB,CAAC,SAAS,QAAQ;AAChE,MAAI;AAEJ,MAAI;AACF,oBAAgB,aAAa,OAAO,EAAE,kBAAkB,UAAU,CAAC;AAAA,EACrE,SAAS,OAAO;AACd,QAAI,iBAAiB,WAAW;AAC9B,YAAM,IAAI,cAAc,MAAM,OAAO;AAAA,IACvC;AAEA,UAAM;AAAA,EACR;AAEA,QAAM,MAAM,IAAI,IAAI,aAAa;AAEjC,MAAI,CAAC,UAAU,SAAS,IAAI,QAAQ,GAAG;AACrC,UAAM,IAAI,cAAc,6BAA6B,IAAI,QAAQ,EAAE;AAAA,EACrE;AAEA,QAAM,WAAW,IAAI;AAErB,MAAI,gBAAgB,QAAQ,KAAK,CAAC,QAAQ,gBAAgB;AACxD,UAAM,IAAI,cAAc,wCAAwC;AAAA,EAClE;AAEA,QAAM,YAAY,iBAAAC,QAAI,KAAK,QAAQ,IAAI,WAAW;AAClD,MAAI,WAAW;AACb,+BAA2B,WAAW,OAAO;AAC7C,WAAO,IAAI,SAAS;AAAA,EACtB;AAEA,MAAI,QAAQ,uBAAuB,QAAQ,gBAAgB;AACzD,WAAO,IAAI,SAAS;AAAA,EACtB;AAEA,QAAM,UAAU,UAAM,wBAAO,UAAU,EAAE,KAAK,MAAM,UAAU,MAAM,CAAC;AACrE,aAAW,UAAU,SAAS;AAC5B,+BAA2B,OAAO,SAAS,OAAO;AAAA,EACpD;AAEA,SAAO,IAAI,SAAS;AACtB;AAEA,SAAS,2BAA2B,SAAiB,SAAqC;AACxF,QAAM,iBAAiB,WAAW,OAAO;AAEzC,MAAI,mBAAmB,cAAc,CAAC,QAAQ,gBAAgB;AAC5D,UAAM,IAAI,cAAc,gCAAgC,OAAO,EAAE;AAAA,EACnE;AAEA,MAAI,mBAAmB,YAAY,mBAAmB,cAAc,CAAC,QAAQ,qBAAqB;AAChG,UAAM,IAAI,cAAc,mDAAmD,OAAO,EAAE;AAAA,EACtF;AACF;;;AC9DA,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAC9B,IAAM,oBAAoB;AACnB,IAAM,6BACX;AACK,IAAM,iBACX;AACK,IAAM,0BAA0B;AAChC,IAAM,0BAA0B;AAgBvC,eAAsB,UAAU,UAAkB,UAAgC,CAAC,GAAyB;AAC1G,QAAM,WAAW,aAAa,QAAQ;AACtC,QAAM,SAAS,MAAM,QAAQ,OAAO,IAAI,QAAQ;AAEhD,MAAI,QAAQ;AACV,WAAO,UAAU,UAAU,MAAM;AAAA,EACnC;AAEA,QAAM,UAAU,QAAQ,WAAW;AACnC,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,SAAS,WAAW,GAAG;AACtD,QAAI;AACF,YAAM,OAAO,MAAM,qBAAqB,UAAU,OAAO;AACzD,YAAM,QAAQ,OAAO,IAAI,UAAU;AAAA,QACjC,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,QACf,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,kBAAY;AACZ,UAAI,UAAU,SAAS;AACrB,cAAM,MAAM,QAAQ,gBAAgB,GAAG;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,QAAM;AACR;AAUA,eAAsB,iBAAiB,UAAkB,UAAgC,CAAC,GAAgC;AACxH,QAAM,cAAc,aAAa,QAAQ;AACzC,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,YAAY,QAAQ,SAAS;AACnC,QAAM,YAA6B,CAAC;AACpC,MAAI,aAAa,MAAM,qBAAqB,aAAa,OAAO;AAEhE,WAAS,gBAAgB,GAAG,iBAAiB,cAAc,iBAAiB,GAAG;AAC7E,UAAM,WAAW,MAAM,YAAY,WAAW,YAAY,OAAO;AACjE,UAAM,aAAa,SAAS;AAE5B,QAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,YAAM,WAAW,eAAe,WAAW;AAC3C,aAAO;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,YAAY,SAAS;AAAA,QACrB,kBAAkB,SAAS;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,QAAQ,IAAI,UAAU;AAChD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,0BAA0B,UAAU,qCAAqC;AAAA,IAC3F;AAEA,UAAM,UAAU,MAAM,qBAAqB,WAAW,UAAU,UAAU,GAAG,OAAO;AACpF,cAAU,KAAK,EAAE,MAAM,YAAY,IAAI,SAAS,WAAW,CAAC;AAC5D,iBAAa;AAAA,EACf;AAEA,QAAM,IAAI,MAAM,kDAAkD,YAAY,GAAG;AACnF;AAEA,eAAe,qBAAqB,UAAkB,SAAqD;AACzG,QAAM,YAAY,QAAQ,SAAS;AACnC,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,YAA6B,CAAC;AACpC,QAAM,WAAW,eAAe,QAAQ;AACxC,MAAI,aAAa,MAAM,qBAAqB,UAAU,OAAO;AAE7D,WAAS,gBAAgB,GAAG,iBAAiB,cAAc,iBAAiB,GAAG;AAC7E,UAAM,WAAW,MAAM,YAAY,WAAW,YAAY,OAAO;AACjE,UAAM,aAAa,SAAS;AAE5B,QAAI,WAAW,UAAU,GAAG;AAC1B,YAAM,WAAW,SAAS,QAAQ,IAAI,UAAU;AAChD,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,0BAA0B,UAAU,qCAAqC;AAAA,MAC3F;AAEA,YAAM,UAAU,MAAM,qBAAqB,WAAW,UAAU,UAAU,GAAG,OAAO;AACpF,gBAAU,KAAK,EAAE,MAAM,YAAY,IAAI,SAAS,WAAW,CAAC;AAC5D,mBAAa;AACb;AAAA,IACF;AAEA,UAAM,UAAU,gBAAgB,SAAS,OAAO;AAChD,UAAM,OAAO,MAAM,gBAAgB,UAAU,QAAQ,YAAY,iBAAiB;AAElF,WAAO;AAAA,MACL,KAAK;AAAA,MACL,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY,SAAS;AAAA,MACrB,kBAAkB,SAAS;AAAA,MAC3B,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,MACrD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,kDAAkD,YAAY,GAAG;AACnF;AAEA,eAAe,YAAY,WAAyB,KAAa,SAAkD;AACjH,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,WAAW,MAAM,WAAW,MAAM,IAAI,MAAM,oBAAoB,CAAC,GAAG,QAAQ,aAAa,kBAAkB;AAC3H,QAAM,iBAAiB,QAAQ;AAC/B,QAAM,oBAAoB,MAAM,WAAW,MAAM,gBAAgB,MAAM;AAEvE,MAAI,gBAAgB;AAClB,QAAI,eAAe,SAAS;AAC1B,iBAAW,MAAM,eAAe,MAAM;AAAA,IACxC,OAAO;AACL,qBAAe,iBAAiB,SAAS,mBAAmB,EAAE,MAAM,KAAK,CAAC;AAAA,IAC5E;AAAA,EACF;AAEA,MAAI;AACF,WAAO,MAAM,UAAU,KAAK;AAAA,MAC1B,UAAU;AAAA,MACV,QAAQ,WAAW;AAAA,MACnB,SAAS,wBAAwB,OAAO;AAAA,IAC1C,CAAC;AAAA,EACH,UAAE;AACA,iBAAa,OAAO;AACpB,oBAAgB,oBAAoB,SAAS,iBAAiB;AAAA,EAChE;AACF;AAEA,SAAS,wBAAwB,SAAuD;AACtF,SAAO;AAAA,IACL,UAAU,QAAQ,UAAU;AAAA,IAC5B,mBAAmB,QAAQ,kBAAkB;AAAA,IAC7C,mBAAmB,QAAQ,kBAAkB;AAAA,IAC7C,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,6BAA6B;AAAA,IAC7B,cAAc,QAAQ,aAAa;AAAA,IACnC,GAAG,gBAAgB,QAAQ,OAAO;AAAA,EACpC;AACF;AAEA,eAAe,gBAAgB,UAAoB,UAAgE;AACjH,QAAM,gBAAgB,SAAS,QAAQ,IAAI,gBAAgB;AAC3D,MAAI,iBAAiB,OAAO,SAAS,eAAe,EAAE,IAAI,UAAU;AAClE,UAAM,IAAI,MAAM,mCAAmC,QAAQ,IAAI;AAAA,EACjE;AAEA,MAAI,CAAC,SAAS,MAAM;AAClB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO;AAAA,MACL;AAAA,MACA,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,QAAM,SAAuB,CAAC;AAC9B,MAAI,WAAW;AAEf,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,MAAM;AACR;AAAA,IACF;AAEA,QAAI,OAAO;AACT,kBAAY,MAAM;AAClB,UAAI,WAAW,UAAU;AACvB,cAAM,IAAI,MAAM,mCAAmC,QAAQ,IAAI;AAAA,MACjE;AACA,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,SAAS,IAAI,WAAW,QAAQ;AACtC,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AAC1B,WAAO,IAAI,OAAO,MAAM;AACxB,cAAU,MAAM;AAAA,EAClB;AAEA,SAAO;AAAA,IACL,MAAM,YAAY,QAAQ,SAAS,QAAQ,IAAI,cAAc,CAAC;AAAA,IAC9D,OAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,KAAa,OAAwC;AACtE,QAAM,WAAW,eAAe,GAAG;AAEnC,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb,UAAU,MAAM,YAAY;AAAA,IAC5B,YAAY,SAAS;AAAA,IACrB,kBAAkB,SAAS;AAAA,IAC3B,MAAM,MAAM;AAAA,IACZ,YAAY,MAAM,cAAc;AAAA,IAChC,aAAa,MAAM;AAAA,IACnB,WAAW,MAAM,aAAa,CAAC;AAAA,IAC/B,SAAS,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,WAAW,YAA6B;AAC/C,SAAO,eAAe,OAAO,eAAe,OAAO,eAAe,OAAO,eAAe,OAAO,eAAe;AAChH;AAEA,SAAS,eAAe,aAAoC;AAC1D,QAAM,UAAU,aAAa,MAAM,kBAAkB,IAAI,CAAC,GAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AAC9F,SAAO,WAAW;AACpB;AAEA,SAAS,YAAY,QAAoB,aAAoC;AAC3E,MAAI;AACF,WAAO,IAAI,YAAY,eAAe,WAAW,CAAC,EAAE,OAAO,MAAM;AAAA,EACnE,QAAQ;AACN,WAAO,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM;AAAA,EAC/C;AACF;AAEA,SAAS,gBAAgB,SAA0C;AACjE,QAAM,SAAiC,CAAC;AACxC,UAAQ,QAAQ,CAAC,OAAO,QAAQ;AAC9B,WAAO,GAAG,IAAI;AAAA,EAChB,CAAC;AACD,SAAO;AACT;AAEA,SAAS,gBAAgB,SAA0D;AACjF,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO,YAAY,IAAI,QAAQ,OAAO,EAAE,QAAQ,CAAC;AAC1D;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;;;ACtSA,qBAAsC;AAG/B,SAAS,aAAa,MAA0B;AACrD,aAAO,qBAAK,IAAI;AAClB;AAEO,SAAS,oBAAoB,OAAsD;AACxF,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACnD,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEO,SAAS,gBAAmB,QAAiE;AAClG,aAAW,SAAS,QAAQ;AAC1B,QAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,SAAS,UAAU,IAAI;AAC5E,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,OAA+D;AAC1F,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,SAAS,OAAO,KAAK,GAAG,EAAE;AAChD,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEO,SAAS,YAAY,OAA+D;AACzF,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,WAAW,OAAO,KAAK,CAAC;AAC9C,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEO,SAAS,gBAAgB,GAAe,WAAyC;AACtF,aAAW,YAAY,WAAW;AAChC,UAAM,UAAU,oBAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAS,CAAC;AACvE,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,KAAwC,KAAa,OAAqB;AACpG,QAAM,UAAU,IAAI,GAAG;AACvB,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,YAAQ,KAAK,KAAK;AAClB;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,UAAU;AAC/B,QAAI,GAAG,IAAI,CAAC,SAAS,KAAK;AAC1B;AAAA,EACF;AAEA,MAAI,GAAG,IAAI;AACb;AAEO,SAAS,UAAU,OAAiD;AACzE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MACX,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,oBAAoB,IAAI,CAAC,EACvC,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAEjD,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;AAEO,SAAS,YAAY,OAAqC;AAC/D,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,cAAc,UAAU,KAAK,EAAE,MAAM,KAAK,EAAE,CAAC,CAAC,EACnD,OAAO,OAAO;AACnB;AAEO,SAAS,iBAAiB,QAAoC;AACnE,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAuB,CAAC;AAE9B,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,MAAM;AAClB,QAAI,CAAC,OAAO,KAAK,IAAI,GAAG,GAAG;AACzB;AAAA,IACF;AAEA,SAAK,IAAI,GAAG;AACZ,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,SAAS,yBAAgD;AAC9D,SAAO;AAAA,IACL,WAAW,CAAC;AAAA,IACZ,aAAa,CAAC;AAAA,IACd,UAAU,CAAC;AAAA,IACX,OAAO,CAAC;AAAA,IACR,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AACF;;;AC5HO,SAAS,oBAAoB,MAA4B;AAC9D,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,WAAyB,CAAC;AAChC,QAAM,aAAyC,CAAC;AAChD,MAAI;AACJ,MAAI;AAEJ,IAAE,iBAAiB,EAAE,KAAK,CAAC,GAAG,YAAY;AACxC,UAAM,MAAM,oBAAoB,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC,GAAG,YAAY;AACrE,UAAM,OAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AACxD,UAAM,OAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AAExD,QAAI,CAAC,OAAO,CAAC,MAAM;AACjB;AAAA,IACF;AAEA,UAAM,YAAY,IAAI,MAAM,KAAK;AACjC,QAAI,UAAU,SAAS,WAAW,GAAG;AACnC,qBAAe;AAAA,IACjB;AAEA,QAAI,UAAU,SAAS,WAAW,GAAG;AACnC,iBAAW;AAAA,QACT,KAAK;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,WAAW,GAAG;AACnC,iBAAW,KAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA,UAAU,oBAAoB,EAAE,OAAO,EAAE,KAAK,UAAU,CAAC;AAAA,QACzD,OAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAAA,MACrD,CAAC;AAAA,IACH;AAEA,QACE,UAAU,SAAS,MAAM,KACzB,UAAU,SAAS,UAAU,KAC7B,UAAU,SAAS,kBAAkB,KACrC,UAAU,SAAS,WAAW,GAC9B;AACA,eAAS,KAAK;AAAA,QACZ,KAAK;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,UAAU;AAAA,UACR,OAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAAA,UACnD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,OAAO,oBAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,gBAAgB,GAAG,CAAC,oBAAoB,CAAC;AAAA,IAClG,aAAa,gBAAgB,GAAG,CAAC,4BAA4B,8BAA8B,CAAC;AAAA,IAC5F,UAAU,UAAU,gBAAgB,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAAA,IACjE,QAAQ,gBAAgB,GAAG,CAAC,qBAAqB,CAAC;AAAA,IAClD;AAAA,IACA,aAAa,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;AAAA,IAC/E,YAAY,gBAAgB,GAAG,CAAC,0BAA0B,CAAC;AAAA,IAC3D,iBAAiB,gBAAgB,GAAG,CAAC,iCAAiC,yCAAyC,CAAC;AAAA,IAChH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACtEA,IAAM,mBAAmB;AAEzB,IAAM,sBAAsF;AAAA,EAC1F,EAAE,QAAQ,QAAQ,OAAO,CAAC,mBAAmB,UAAU,EAAE;AAAA,EACzD,EAAE,QAAQ,gBAAgB,OAAO,CAAC,4BAA4B,mBAAmB,EAAE;AAAA,EACnF,EAAE,QAAQ,kBAAkB,OAAO,CAAC,8BAA8B,qBAAqB,EAAE;AAAA,EACzF,EAAE,QAAQ,UAAU,OAAO,CAAC,2BAA2B,oBAAoB,0BAA0B,EAAE;AAAA,EACvG,EAAE,QAAQ,sBAAsB,OAAO,CAAC,iBAAiB,sBAAsB,EAAE;AAAA,EACjF,EAAE,QAAQ,yBAAyB,OAAO,CAAC,2BAA2B,gCAAgC,EAAE;AAC1G;AAEO,SAAS,oBAAoB,MAAoC;AACtE,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,QAA4B,CAAC;AACnC,QAAM,WAAqB,CAAC;AAE5B,QAAM,WAAW,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,GAAG,YAAY,QAAQ;AAC/H,MAAI,UAAU;AACZ,UAAM,KAAK,QAAQ;AAAA,EACrB;AAEA,QAAM,WAAW,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,GAAG,QAAQ,QAAQ;AAC3H,MAAI,UAAU;AACZ,UAAM,KAAK,QAAQ;AAAA,EACrB;AAEA,IAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,YAAY;AACnC,UAAM,OAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC,GAAG,YAAY;AACvE,UAAM,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AACpD,UAAM,SAAS,EAAE,OAAO,EAAE,KAAK,KAAK,EAAE,OAAO,EAAE,KAAK;AAEpD,QAAI,CAAC,UAAU,OAAO,SAAS,kBAAkB;AAC/C;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,kBAAkB,KAAK,MAAM,SAAS,qBAAqB,GAAG;AAC/E,YAAM,SAAS,gBAAgB,QAAQ,MAAM,SAAS,SAAS,IAAI,eAAe,mBAAmB,UAAU,EAAE;AACjH,UAAI,QAAQ;AACV,cAAM,KAAK,MAAM;AAAA,MACnB;AAAA,IACF;AAEA,eAAW,WAAW,qBAAqB;AACzC,iBAAW,QAAQ,QAAQ,OAAO;AAChC,cAAM,OAAO,kBAAkB,QAAQ,IAAI;AAC3C,YAAI,MAAM;AACR,gBAAM,KAAK;AAAA,YACT,QAAQ,QAAQ;AAAA,YAChB,MAAM;AAAA,YACN;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,kBAAkB,MAAM;AAC3C,QAAI,YAAY;AACd,YAAM,KAAK;AAAA,QACT,QAAQ;AAAA,QACR,MAAM,UAAU,KAAK;AAAA,QACrB,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,OAAO,oBAAoB,KAAK;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,gBACP,QACA,YACA,UACA,MAC8B;AAC9B,QAAM,cAAc,gBAAgB,MAAM;AAC1C,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,WAAW;AACrC,QAAI,CAAC,SAAS,MAAM,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF,SAAS,OAAO;AACd,aAAS,KAAK,mBAAmB,UAAU,iBAAiB,OAAO,OAAO,IAAI,KAAK,EAAE,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAClJ,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,QAAgB,gBAAgD;AACzF,QAAM,QAAQ,OAAO,QAAQ,cAAc;AAC3C,MAAI,UAAU,IAAI;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,MAAM,QAAQ,eAAe,MAAM;AAC5D,QAAM,kBAAkB,UAAU,OAAO,UAAU;AACnD,MAAI,oBAAoB,IAAI;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,UAAU,MAAM,eAAe,EAAE,OAAO,MAAM;AACvE,MAAI,qBAAqB,IAAI;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,eAAe,SAAS,kBAAkB;AAChE,QAAM,YAAY,iBAAiB,QAAQ,KAAK;AAChD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,SAAS;AACnC,WAAO,SAAS,MAAM,IAAI,SAAS,EAAE,OAAO,OAAO;AAAA,EACrD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,QAAwC;AACjE,MAAI,CAAC,mBAAmB,KAAK,MAAM,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,kBAAkB,QAAQ,yBAAyB,KAAK,kBAAkB,QAAQ,kBAAkB;AACjH,MAAI,MAAM;AACR,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAgB,OAAmC;AAC3E,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,SAAS,WAAW,MAAM,MAAM,WAAW,MAAM,MAAM;AAC7D,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,UAAU;AAEd,WAAS,QAAQ,OAAO,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACzD,UAAM,OAAO,OAAO,KAAK;AAEzB,QAAI,UAAU;AACZ,UAAI,SAAS;AACX,kBAAU;AAAA,MACZ,WAAW,SAAS,MAAM;AACxB,kBAAU;AAAA,MACZ,WAAW,SAAS,KAAK;AACvB,mBAAW;AAAA,MACb;AACA;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,iBAAW;AACX;AAAA,IACF;AAEA,QAAI,SAAS,QAAQ;AACnB,eAAS;AAAA,IACX,WAAW,SAAS,QAAQ;AAC1B,eAAS;AACT,UAAI,UAAU,GAAG;AACf,eAAO,OAAO,MAAM,OAAO,QAAQ,CAAC;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAuD;AAC9E,QAAM,UAAU,QACZ,QAAQ,SAAS,EAAE,EACpB,QAAQ,QAAQ,EAAE,EAClB,KAAK;AAER,SAAO,WAAW;AACpB;AAEA,SAAS,oBAAoB,OAA+C;AAC1E,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAA6B,CAAC;AAEpC,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,GAAG,KAAK,MAAM,IAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,UAAU,KAAK,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;AACxF,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB;AAAA,IACF;AACA,SAAK,IAAI,GAAG;AACZ,WAAO,KAAK,IAAI;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ACrNO,SAAS,cAAc,MAA8B;AAC1D,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,QAAsB,CAAC;AAC7B,QAAM,WAAqB,CAAC;AAE5B,IAAE,yBAAyB,EAAE,KAAK,CAAC,OAAO,YAAY;AACpD,UAAM,SAAS,oBAAoB,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,CAAC;AAC9F,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,QAAI;AACF,iBAAW,QAAQ,cAAc,KAAK,MAAM,UAAU,MAAM,CAAC,CAAC,GAAG;AAC/D,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,eAAS,KAAK,2CAA2C,KAAK,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IAC7H;AAAA,EACF,CAAC;AAED,SAAO,EAAE,OAAO,SAAS;AAC3B;AAEA,SAAS,UAAU,QAAwB;AACzC,SAAO,OACJ,QAAQ,SAAS,EAAE,EACnB,QAAQ,QAAQ,EAAE,EAClB,KAAK;AACV;AAEA,SAAS,cAAc,OAA8B;AACnD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,QAAQ,CAAC,SAAS,cAAc,IAAI,CAAC;AAAA,EACpD;AAEA,MAAI,CAACC,UAAS,KAAK,GAAG;AACpB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,MAAM,QAAQ;AAC5B,QAAM,UAAU;AAChB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,CAAC,SAAS,GAAG,MAAM,OAAOA,SAAQ,CAAC;AAAA,EAC5C;AAEA,SAAO,CAAC,OAAO;AACjB;AAEA,SAASA,UAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ACjDA,IAAM,wBAAwB;AAAA,EAC5B;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;AACA,IAAM,+BAA+B,CAAC,eAAe,oBAAoB,sBAAsB;AAC/F,IAAM,wBAAwB,CAAC,YAAY,iBAAiB,iBAAiB,cAAc,kBAAkB,cAAc,mBAAmB;AAEvI,SAAS,cAAc,MAAc,SAA+B;AACzE,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,SAAuB,CAAC;AAE9B,IAAE,6BAA6B,EAAE,KAAK,CAAC,GAAG,YAAY;AACpD,iBAAa,QAAQ;AAAA,MACnB,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AAAA,MAChD,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,GAAG,OAAO;AAAA,EACZ,CAAC;AAED,IAAE,iBAAiB,EAAE,KAAK,CAAC,GAAG,YAAY;AACxC,UAAM,aAAa,oBAAoB,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC,GAAG,YAAY,KAAK,IAAI,MAAM,KAAK;AAChG,UAAM,UAAU,oBAAoB,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,GAAG,YAAY;AACxE,UAAM,OAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AACxD,QAAI,CAAC,UAAU,SAAS,SAAS,KAAK,CAAC,UAAU,SAAS,UAAU,GAAG;AACrE;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,MAAM,WAAW,QAAQ,GAAG;AACrD,mBAAa,QAAQ;AAAA,QACnB,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AAAA,QAChD,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,UAAU,EAAE,gBAAgB,eAAe;AAAA,MAC7C,GAAG,OAAO;AAEV,iBAAW,aAAa,YAAY,EAAE,OAAO,EAAE,KAAK,aAAa,CAAC,GAAG;AACnE,qBAAa,QAAQ;AAAA,UACnB,KAAK;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,UACR;AAAA,UACA,UAAU,EAAE,gBAAgB,mBAAmB;AAAA,QACjD,GAAG,OAAO;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CAAC;AAED,wBAAsB,GAAG,QAAQ,SAAS,MAAM;AAEhD,IAAE,eAAe,EAAE,KAAK,CAAC,GAAG,YAAY;AACtC,iBAAa,QAAQ;AAAA,MACnB,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC;AAAA,MAClD,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO,aAAa,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAAA,MAC5C,QAAQ,aAAa,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC;AAAA,MAC9C,UAAU;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF,GAAG,OAAO;AAAA,EACZ,CAAC;AAED,IAAE,UAAU,EAAE,KAAK,CAAC,GAAG,YAAY;AACjC,UAAM,eAAe,EAAE,OAAO,EAAE,KAAK,KAAK,EAAE,OAAO,EAAE,KAAK;AAC1D,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,0BAAsB,aAAa,YAAY,GAAG,QAAQ,SAAS,UAAU;AAAA,EAC/E,CAAC;AAED,SAAO,iBAAiB,MAAM;AAChC;AAEO,SAAS,cAAc,MAAc,SAA+B;AACzE,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,SAAuB,CAAC;AAE9B,IAAE,OAAO,EAAE,KAAK,CAAC,GAAG,YAAY;AAC9B,UAAM,MAAM,oBAAoB,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC,KAAK,eAAe,GAAG,SAAS,qBAAqB;AAC3G,UAAM,SAAS;AAAA,MACb,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO,aAAa,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAAA,MAC5C,QAAQ,aAAa,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC;AAAA,MAC9C,QAAQ,cAAc,oBAAoB,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC,GAAG,OAAO;AAAA,IAC/E;AAEA,iBAAa,QAAQ,EAAE,GAAG,QAAQ,KAAK,IAAI,GAAG,OAAO;AAErD,eAAW,aAAa,uBAAuB;AAC7C,mBAAa,QAAQ;AAAA,QACnB,GAAG;AAAA,QACH,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,SAAS,CAAC;AAAA,MACrD,GAAG,OAAO;AAAA,IACZ;AAEA,MAAE,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,CAACC,IAAG,WAAW;AACnB,mBAAa,QAAQ;AAAA,QACnB,GAAG;AAAA,QACH,KAAK,oBAAoB,EAAE,MAAM,EAAE,KAAK,KAAK,CAAC;AAAA,QAC9C,MAAM,oBAAoB,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;AAAA,MAClD,GAAG,OAAO;AAAA,IACZ,CAAC;AAAA,EACL,CAAC;AAED,IAAE,aAAa,EAAE,KAAK,CAAC,GAAG,YAAY;AACpC,UAAM,MAAM,oBAAoB,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC;AACtD,QAAI,CAAC,OAAO,CAAC,mBAAmB,GAAG,GAAG;AACpC;AAAA,IACF;AAEA,iBAAa,QAAQ;AAAA,MACnB,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO,aAAa,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAAA,MAC5C,QAAQ,aAAa,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC;AAAA,IAChD,GAAG,OAAO;AAAA,EACZ,CAAC;AAED,IAAE,iBAAiB,EAAE,KAAK,CAAC,GAAG,YAAY;AACxC,UAAM,aAAa,oBAAoB,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC,GAAG,YAAY,KAAK,IAAI,MAAM,KAAK;AAChG,UAAM,UAAU,oBAAoB,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,GAAG,YAAY;AACxE,UAAM,OAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AACxD,QAAK,CAAC,UAAU,SAAS,SAAS,KAAK,CAAC,UAAU,SAAS,UAAU,KAAO,YAAY,WAAW,CAAC,MAAM,WAAW,QAAQ,GAAI;AAC/H;AAAA,IACF;AAEA,iBAAa,QAAQ;AAAA,MACnB,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AAAA,MAChD,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,MACA,UAAU,EAAE,gBAAgB,eAAe;AAAA,IAC7C,GAAG,OAAO;AAAA,EACZ,CAAC;AAED,SAAO,iBAAiB,MAAM;AAChC;AAEO,SAAS,aAAa,MAAc,SAA+B;AACxE,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,QAAsB,CAAC;AAE7B,IAAE,OAAO,EAAE,KAAK,CAAC,GAAG,YAAY;AAC9B,iBAAa,OAAO;AAAA,MAClB,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC;AAAA,MAC/C,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,GAAG,OAAO;AAEV,MAAE,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,CAACA,IAAG,WAAW;AACnB,mBAAa,OAAO;AAAA,QAClB,KAAK,oBAAoB,EAAE,MAAM,EAAE,KAAK,KAAK,CAAC;AAAA,QAC9C,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,MAAM,oBAAoB,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;AAAA,MAClD,GAAG,OAAO;AAAA,IACZ,CAAC;AAAA,EACL,CAAC;AAED,SAAO,iBAAiB,KAAK;AAC/B;AAEA,SAAS,aAAa,QAAsB,OAAmD,SAAuB;AACpH,QAAM,MAAM,cAAc,MAAM,KAAK,OAAO;AAC5C,MAAI,CAAC,OAAO,qBAAqB,GAAG,KAAK,uBAAuB,OAAO,GAAG,GAAG;AAC3E;AAAA,EACF;AAEA,SAAO,KAAK;AAAA,IACV,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,SAAS,sBAAsB,GAAoC,QAAsB,SAAiB,QAAmC;AAC3I,IAAE,KAAK,EAAE,KAAK,CAAC,GAAG,YAAY;AAC5B,UAAM,SAAS;AAAA,MACb,MAAM;AAAA,MACN;AAAA,MACA,OAAO,aAAa,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAAA,MAC5C,QAAQ,aAAa,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC;AAAA,MAC9C,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC;AAAA,MAC/C,OAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAAA,IACrD;AAEA,UAAM,aAAa;AAAA,MACjB,oBAAoB,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC;AAAA,MAC1C,GAAG,sBAAsB,IAAI,CAAC,cAAc,oBAAoB,EAAE,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC;AAAA,MAC3F,GAAG,YAAY,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC;AAAA,MACxC,GAAG,6BAA6B,QAAQ,CAAC,cAAc,YAAY,EAAE,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC;AAAA,IAChG;AAEA,eAAW,aAAa,YAAY;AAClC,mBAAa,QAAQ;AAAA,QACnB,GAAG;AAAA,QACH,KAAK;AAAA,QACL,UAAU;AAAA,UACR,gBAAgB,WAAW,aAAa,aAAa;AAAA,QACvD;AAAA,MACF,GAAG,OAAO;AAAA,IACZ;AAAA,EACF,CAAC;AAED,IAAE,wDAAwD,EAAE,KAAK,CAAC,GAAG,YAAY;AAC/E,eAAW,aAAa;AAAA,MACtB,GAAG,YAAY,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC;AAAA,MACxC,GAAG,6BAA6B,QAAQ,CAAC,cAAc,YAAY,EAAE,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC;AAAA,IAChG,GAAG;AACD,mBAAa,QAAQ;AAAA,QACnB,KAAK;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,MAAM,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AAAA,QACjD,UAAU;AAAA,UACR,gBAAgB,WAAW,aAAa,4BAA4B;AAAA,QACtE;AAAA,MACF,GAAG,OAAO;AAAA,IACZ;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBAAqB,KAAsB;AAClD,QAAM,aAAa,IAAI,YAAY;AACnC,SACE,WAAW,WAAW,OAAO,KAC7B,WAAW,WAAW,OAAO,KAC7B,WAAW,WAAW,aAAa,KACnC,wFAAwF,KAAK,UAAU,KACvG,kCAAkC,KAAK,UAAU;AAErD;AAEA,SAAS,uBAAuB,OAAmD,KAAsB;AACvG,MAAI,MAAM,SAAS,WAAW,MAAM,SAAS,WAAW;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM;AACpB,QAAM,SAAS,MAAM;AACrB,QAAM,gBAAgB,IAAI,YAAY;AAEtC,MAAI,UAAU,UAAa,WAAW,QAAW;AAC/C,QAAI,SAAS,KAAK,UAAU,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,MAAM,UAAU,MAAM,wDAAwD,KAAK,aAAa,GAAG;AAC9G,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAsB;AAChD,SAAO,wGAAwG,KAAK,GAAG;AACzH;AAEA,SAAS,eAAe,GAAoC,SAAkB,YAA0C;AACtH,aAAW,aAAa,YAAY;AAClC,UAAM,QAAQ,oBAAoB,EAAE,OAAgB,EAAE,KAAK,SAAS,CAAC;AACrE,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;AC9RO,SAAS,cAAc,MAAc,KAA6B;AACvE,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,QAAiC,CAAC;AAExC,IAAE,iBAAiB,EAAE,KAAK,CAAC,GAAG,YAAY;AACxC,UAAM,MAAM,oBAAoB,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC,GAAG,YAAY,KAAK;AAC1E,UAAM,YAAY,IAAI,MAAM,KAAK;AACjC,UAAM,OAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AACxD,UAAM,QAAQ,oBAAoB,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAC1D,UAAM,YAAY,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AAC7D,UAAM,kBAAkB,UAAU,KAAK,QAAQ,EAAE,KAAK,UAAU,KAAK,SAAS,EAAE,KAAK,2BAA2B,KAAK,aAAa,EAAE;AAEpI,QAAI,CAAC,UAAU,SAAS,WAAW,KAAK,CAAC,UAAU,SAAS,kBAAkB,KAAK,CAAC,iBAAiB;AACnG;AAAA,IACF;AAEA,QAAI,CAAC,iBAAiB;AACpB;AAAA,IACF;AAEA,UAAM,OAAO,cAAc,WAAW,GAAG;AACzC,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,MAAM,CAAC;AAAA,EACT;AACF;AAEA,eAAsB,gBACpB,OACA,UAAgC,CAAC,GACoB;AACrD,QAAM,OAAqB,CAAC;AAC5B,QAAM,WAAqB,CAAC;AAE5B,QAAM,QAAQ;AAAA,IACZ,MAAM,IAAI,OAAO,SAAS;AACxB,UAAI,KAAK,QAAQ,CAAC,QAAQ,KAAK,KAAK,IAAI,GAAG;AACzC,iBAAS,KAAK,sCAAsC,KAAK,IAAI,GAAG;AAChE;AAAA,MACF;AAEA,UAAI;AACF,cAAM,OAAO,MAAM,UAAU,KAAK,MAAM;AAAA,UACtC,GAAG;AAAA,UACH,SAAS;AAAA,YACP,UAAU;AAAA,YACV,GAAGC,iBAAgB,QAAQ,OAAO;AAAA,UACpC;AAAA,QACF,CAAC;AACD,aAAK,KAAK,KAAK,MAAM,KAAK,IAAI,CAAe;AAAA,MAC/C,SAAS,OAAO;AACd,iBAAS,KAAK,mCAAmC,KAAK,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,MACzH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAM,SAAS;AAC1B;AAEA,SAASA,iBAAgB,SAA0D;AACjF,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO,YAAY,IAAI,QAAQ,OAAO,EAAE,QAAQ,CAAC;AAC1D;;;AC7EO,SAAS,iBAAiB,MAAiC;AAChE,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,MAAyC,CAAC;AAEhD,IAAE,4BAA4B,EAAE,KAAK,CAAC,GAAG,YAAY;AACnD,UAAM,MAAM,YAAY,GAAG,OAAO;AAClC,UAAM,UAAU,oBAAoB,EAAE,OAAO,EAAE,KAAK,SAAS,CAAC;AAE9D,QAAI,CAAC,OAAO,CAAC,WAAY,CAAC,IAAI,WAAW,KAAK,KAAK,CAAC,IAAI,WAAW,UAAU,KAAK,CAAC,IAAI,WAAW,UAAU,GAAI;AAC9G;AAAA,IACF;AAEA,gBAAY,KAAK,KAAK,OAAO;AAAA,EAC/B,CAAC;AAED,SAAO;AAAA,IACL,OAAO,SAAS,KAAK,UAAU;AAAA,IAC/B,aAAa,SAAS,KAAK,gBAAgB;AAAA,IAC3C,MAAM,SAAS,KAAK,SAAS;AAAA,IAC7B,KAAK,SAAS,KAAK,QAAQ;AAAA,IAC3B,UAAU,SAAS,KAAK,cAAc;AAAA,IACtC,QAAQ,SAAS,KAAK,WAAW;AAAA,IACjC,YAAY,SAAS,KAAK,eAAe;AAAA,IACzC,QAAQ,uBAAuB,GAAG,OAAO;AAAA,IACzC,QAAQ,uBAAuB,GAAG,OAAO;AAAA,IACzC,OAAO,uBAAuB,GAAG,OAAO;AAAA,IACxC,SAAS;AAAA,MACP,eAAe,SAAS,KAAK,wBAAwB;AAAA,MACrD,cAAc,SAAS,KAAK,uBAAuB;AAAA,MACnD,gBAAgB,SAAS,KAAK,yBAAyB;AAAA,MACvD,SAAS,SAAS,KAAK,iBAAiB;AAAA,MACxC,MAAM,OAAO,KAAK,aAAa;AAAA,MAC/B,SAAS,OAAO,KAAK,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;AAAA,IAClE;AAAA,IACA,SAAS;AAAA,MACP,OAAO,SAAS,KAAK,sBAAsB;AAAA,MAC3C,UAAU,SAAS,KAAK,wBAAwB;AAAA,MAChD,cAAc,SAAS,KAAK,sBAAsB;AAAA,MAClD,WAAW,SAAS,KAAK,mBAAmB;AAAA,IAC9C;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,GAAe,MAAiD;AAC9F,QAAM,SAAuB,CAAC;AAC9B,QAAM,SAAS,MAAM,IAAI;AAEzB,IAAE,4BAA4B,EAAE,KAAK,CAAC,GAAG,YAAY;AACnD,UAAM,MAAM,YAAY,GAAG,OAAO;AAClC,UAAM,UAAU,oBAAoB,EAAE,OAAO,EAAE,KAAK,SAAS,CAAC;AAE9D,QAAI,CAAC,KAAK,WAAW,MAAM,KAAK,CAAC,SAAS;AACxC;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,GAAG,EAAE;AAE5B,QAAI,QAAQ,UAAU,QAAQ,GAAG,MAAM,QAAQ;AAC7C,UAAI,IAAI,SAAS,MAAM,KAAK,WAAW,CAAC,QAAQ,KAAK;AACnD,gBAAQ,MAAM;AACd;AAAA,MACF;AAEA,aAAO,KAAK;AAAA,QACV,KAAK;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS,WAAW,eAAe,QAAQ,IAAI;AACrD,UAAM,WAAW,IAAI,MAAM,OAAO,SAAS,CAAC;AAE5C,QAAI,aAAa,cAAc;AAC7B,aAAO,YAAY;AAAA,IACrB,WAAW,aAAa,QAAQ;AAC9B,aAAO,OAAO;AAAA,IAChB,WAAW,aAAa,SAAS;AAC/B,aAAO,QAAQ,aAAa,OAAO;AAAA,IACrC,WAAW,aAAa,UAAU;AAChC,aAAO,SAAS,aAAa,OAAO;AAAA,IACtC,WAAW,aAAa,OAAO;AAC7B,aAAO,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AAED,SAAO,OAAO,OAAO,CAAC,UAAU,QAAQ,MAAM,GAAG,CAAC;AACpD;AAEA,SAAS,eAAe,QAAsB,MAA+C;AAC3F,QAAM,QAAoB;AAAA,IACxB,KAAK;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,EACV;AACA,SAAO,KAAK,KAAK;AACjB,SAAO;AACT;AAEA,SAAS,YAAY,GAAe,SAAkC;AACpE,SAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,UAAU,CAAC,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AACxG;AAEA,SAAS,SAAS,KAAwC,KAAiC;AACzF,QAAM,QAAQ,IAAI,GAAG;AACrB,SAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI;AAC3C;AAEA,SAAS,OAAO,KAAwC,KAAmC;AACzF,QAAM,QAAQ,IAAI,GAAG;AACrB,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC9C;;;ACrHO,SAAS,oBAAoB,MAA+B;AACjE,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,MAAyC,CAAC;AAEhD,IAAE,4BAA4B,EAAE,KAAK,CAAC,GAAG,YAAY;AACnD,UAAM,MAAMC,aAAY,GAAG,OAAO;AAClC,UAAM,UAAU,oBAAoB,EAAE,OAAO,EAAE,KAAK,SAAS,CAAC;AAE9D,QAAI,CAAC,KAAK,WAAW,UAAU,KAAK,CAAC,SAAS;AAC5C;AAAA,IACF;AAEA,gBAAY,KAAK,KAAK,OAAO;AAAA,EAC/B,CAAC;AAED,SAAO;AAAA,IACL,MAAMC,UAAS,KAAK,cAAc;AAAA,IAClC,MAAMA,UAAS,KAAK,cAAc;AAAA,IAClC,SAASA,UAAS,KAAK,iBAAiB;AAAA,IACxC,OAAOA,UAAS,KAAK,eAAe;AAAA,IACpC,aAAaA,UAAS,KAAK,qBAAqB;AAAA,IAChD,QAAQ,cAAc,GAAG;AAAA,IACzB,QAAQ,cAAc,GAAG;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,cAAc,KAAsD;AAC3E,QAAM,OAAO,cAAc;AAAA,IACzB,GAAGC,QAAO,KAAK,eAAe;AAAA,IAC9B,GAAGA,QAAO,KAAK,mBAAmB;AAAA,IAClC,GAAGA,QAAO,KAAK,gBAAgB;AAAA,IAC/B,GAAGA,QAAO,KAAK,gBAAgB;AAAA,IAC/B,GAAGA,QAAO,KAAK,gBAAgB;AAAA,IAC/B,GAAGA,QAAO,KAAK,gBAAgB;AAAA,IAC/B,GAAGA,QAAO,KAAK,gBAAgB;AAAA,IAC/B,GAAGA,QAAO,KAAK,sBAAsB;AAAA,IACrC,GAAG,OAAO,QAAQ,GAAG,EAClB,OAAO,CAAC,CAAC,GAAG,MAAM,4BAA4B,KAAK,GAAG,KAAK,uBAAuB,KAAK,GAAG,CAAC,EAC3F,QAAQ,CAAC,CAAC,EAAE,KAAK,MAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAE;AAAA,EACpE,CAAC;AACD,QAAM,MAAMD,UAAS,KAAK,mBAAmB;AAC7C,QAAM,QAAQ,aAAaA,UAAS,KAAK,qBAAqB,CAAC;AAC/D,QAAM,SAAS,aAAaA,UAAS,KAAK,sBAAsB,CAAC;AAEjE,SAAO,KAAK,IAAI,CAAC,SAAS;AAAA,IACxB;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE;AACJ;AAEA,SAAS,cAAc,KAAsD;AAC3E,QAAM,UAAUC,QAAO,KAAK,gBAAgB,KAAKA,QAAO,KAAK,uBAAuB,KAAK,CAAC;AAC1F,QAAM,QAAQ,aAAaD,UAAS,KAAK,sBAAsB,CAAC;AAChE,QAAM,SAAS,aAAaA,UAAS,KAAK,uBAAuB,CAAC;AAElE,SAAO,QAAQ,IAAI,CAAC,SAAS;AAAA,IAC3B;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF,EAAE;AACJ;AAEA,SAASD,aAAY,GAAe,SAAkC;AACpE,SAAO,oBAAoB,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC,KAAK,oBAAoB,EAAE,OAAO,EAAE,KAAK,UAAU,CAAC;AACxG;AAEA,SAASC,UAAS,KAAwC,KAAiC;AACzF,QAAM,QAAQ,IAAI,GAAG;AACrB,SAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI;AAC3C;AAEA,SAASC,QAAO,KAAwC,KAAuB;AAC7E,QAAM,QAAQ,IAAI,GAAG;AACrB,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC9C;AAEA,SAAS,cAAc,QAA4B;AACjD,SAAO,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,OAAO,CAAC,CAAC;AAC5C;;;AC3FA,IAAM,+BAA+B;AAErC,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,YAAY,OAAwB;AAClD,MAAI;AACF,UAAM,OAAO,IAAI,IAAI,KAAK,EAAE,SAAS,YAAY,EAAE,QAAQ,UAAU,EAAE;AACvE,WAAO,SAAS,gBAAgB,SAAS,aAAa,KAAK,SAAS,aAAa;AAAA,EACnF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,4BAA4B,QAAoC;AAC9E,QAAM,UAAU,OAAO,OAAO,6BAA6B;AAC3D,QAAM,UAAU,QAAQ,OAAO,6BAA6B;AAC5D,SAAO,uBAAuB,QAAQ,SAAS,IAAI,UAAU,OAAO;AACtE;AAEO,SAAS,uBAAuB,QAAoC;AACzE,SAAO,OAAO,MAAM,EAAE;AAAA,IACpB,CAAC,MAAM,UACL,oBAAoB,KAAK,IAAI,oBAAoB,IAAI,KACrD,UAAU,KAAK,IAAI,UAAU,IAAI;AAAA,EACrC;AACF;AAEO,SAAS,8BAA8B,OAA4B;AACxE,MAAI,MAAM,UAAU,UAAa,MAAM,QAAQ,KAAK;AAClD,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,WAAW,UAAa,MAAM,SAAS,KAAK;AACpD,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,6BAA6B,KAAK,MAAM,GAAG;AACrD;AAEO,SAAS,oBAAoB,OAA2B;AAC7D,QAAM,YAAY,OAAO,MAAM,UAAU,oBAAoB,WAAW,MAAM,SAAS,kBAAkB;AACzG,QAAM,MAAM,MAAM,IAAI,YAAY;AAElC,MAAI,cAAc,WAAW;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,mBAAmB;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,eAAe;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,2BAA2B,KAAK,GAAG,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,MAAI,qBAAqB,KAAK,GAAG,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,WAAW,eAAe,MAAM,WAAW,WAAW;AAC9D,WAAO;AAAA,EACT;AAEA,MAAI,oCAAoC,KAAK,GAAG,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,MAAI,kCAAkC,KAAK,GAAG,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,GAAG,IAAI,MAAM;AACvC;AAEO,SAAS,sBAAsB,QAA+B;AACnE,SAAO,OAAO,KAAK,CAAC,UAAU;AAC5B,UAAM,UAAU,OAAO,MAAM,UAAU,YAAY,WAAW,MAAM,SAAS,UAAU;AACvF,UAAM,iBAAiB,OAAO,MAAM,UAAU,mBAAmB,WAAW,MAAM,SAAS,iBAAiB;AAC5G,WAAO,YAAY,mBAAmB,mBAAmB,wBAAwB,QAAQ,MAAM,UAAU,eAAe;AAAA,EAC1H,CAAC;AACH;AAEO,SAAS,iBAAiB,OAAwB;AACvD,SAAO,wGAAwG,KAAK,KAAK;AAC3H;AAEA,SAAS,8BAA8B,OAA4B;AACjE,SAAO,uBAAuB,IAAI,MAAM,MAAM,KAAK,QAAQ,MAAM,UAAU,eAAe;AAC5F;AAEA,SAAS,UAAU,OAA2B;AAC5C,UAAQ,MAAM,SAAS,MAAM,MAAM,UAAU;AAC/C;;;ACtGA,IAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;AAEO,SAAS,YAAY,QAAsB,gBAA+B,CAAC,GAAiB;AACjG,QAAM,kBAAkB,gBAAgB,MAAM;AAC9C,QAAM,gBAAgB,sBAAsB,MAAM;AAElD,SAAO,OACJ,IAAI,CAAC,OAAO,UAAU;AACrB,UAAM,SAAS,sBAAsB,OAAO,OAAO,QAAQ,eAAe;AAC1E,UAAM,cAAc,cAAc,OAAO,CAAC,OAAO,WAAW,QAAQ,OAAO,OAAO,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC;AACvG,UAAM,QAAQ,MAAM,OAAO,QAAQ,aAAa,GAAG,GAAG;AACtD,UAAM,UAAU,gBAAgB,IAAI,OAAO,UAAU,CAAC,GAAG,OAAO,SAAS,oCAAoC,aAAa,WAAW,CAAC,EAAE;AAExI,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA,YAAY,QAAQ,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC3C,UAAU;AAAA,QACR,GAAG,MAAM;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF,CAAC,EACA;AAAA,IACC,CAAC,MAAM,WACJ,gBAAgB,oBAAoB,KAAK,IAAI,oBAAoB,IAAI,IAAI,OACzE,MAAM,SAAS,MAAM,KAAK,SAAS,MACpC,iBAAiB,KAAK,IAAI,iBAAiB,IAAI,KAC/CC,WAAU,KAAK,IAAIA,WAAU,IAAI;AAAA,EACrC;AACJ;AAEO,SAAS,gBAAgB,QAAsB,gBAA+B,CAAC,GAAmB;AACvG,QAAM,SAAS,YAAY,QAAQ,aAAa;AAChD,QAAM,OAAO,OAAO,CAAC;AAErB,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,OAAO,mBAAmB,IAAI,IAAI;AAAA,EAC5C;AACF;AAEA,SAAS,sBAAsB,OAAmB,OAAe,QAAsB,iBAA4E;AACjK,MAAI,QAAQ,cAAc,MAAM,MAAM,KAAK;AAC3C,QAAM,UAAU,CAAC,UAAU,YAAY,MAAM,MAAM,CAAC,UAAU,KAAK,cAAc;AACjF,QAAM,aAAa,gBAAgB,KAAK;AACxC,QAAM,SAAS,YAAY,KAAK;AAChC,QAAM,YAAY,eAAe,KAAK;AACtC,QAAM,cAAc,iBAAiB,KAAK;AAC1C,QAAM,aAAa,gBAAgB,KAAK;AACxC,QAAM,mBAAmB,sBAAsB,OAAO,eAAe;AAErE,WAAS,WAAW;AACpB,WAAS,OAAO;AAChB,WAAS,UAAU;AACnB,WAAS,YAAY;AACrB,WAAS;AACT,WAAS,iBAAiB;AAC1B,WAAS,KAAK,IAAI,QAAQ,KAAK,EAAE;AACjC,UAAQ,KAAK,GAAG,WAAW,SAAS,GAAG,OAAO,SAAS,GAAG,UAAU,SAAS,GAAG,YAAY,SAAS,GAAG,iBAAiB,OAAO;AAEhI,MAAI,OAAO,WAAW,GAAG;AACvB,aAAS;AACT,YAAQ,KAAK,qCAAqC;AAAA,EACpD;AAEA,MAAI,aAAa,GAAG;AAClB,YAAQ,KAAK,4BAA4B,UAAU,SAAS;AAAA,EAC9D;AAEA,QAAM,kBAAkB,KAAK,IAAI,QAAQ,KAAK,EAAE;AAChD,MAAI,kBAAkB,GAAG;AACvB,YAAQ,KAAK,iCAAiC,aAAa,eAAe,CAAC,SAAS;AAAA,EACtF;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAEA,SAAS,gBAAgB,OAAyD;AAChF,QAAM,QAAQ,MAAM;AACpB,QAAM,SAAS,MAAM;AAErB,MAAI,CAAC,SAAS,CAAC,QAAQ;AACrB,WAAO,EAAE,OAAO,GAAG,SAAS,CAAC,wBAAwB,EAAE;AAAA,EACzD;AAEA,QAAM,OAAO,QAAQ;AACrB,QAAM,QAAQ,QAAQ;AACtB,MAAI,QAAQ;AACZ,QAAM,UAAoB,CAAC;AAE3B,MAAI,QAAQ,OAAO,SAAS,IAAI;AAC9B,aAAS;AACT,YAAQ,KAAK,GAAG,KAAK,IAAI,MAAM,oDAAoD;AAAA,EACrF,WAAW,QAAQ,KAAW;AAC5B,aAAS;AACT,YAAQ,KAAK,GAAG,KAAK,IAAI,MAAM,6BAA6B;AAAA,EAC9D,WAAW,QAAQ,KAAS;AAC1B,aAAS;AACT,YAAQ,KAAK,GAAG,KAAK,IAAI,MAAM,4BAA4B;AAAA,EAC7D,WAAW,QAAQ,KAAQ;AACzB,aAAS;AACT,YAAQ,KAAK,GAAG,KAAK,IAAI,MAAM,4BAA4B;AAAA,EAC7D,WAAW,OAAO,KAAQ;AACxB,aAAS;AACT,YAAQ,KAAK,GAAG,KAAK,IAAI,MAAM,kCAAkC;AAAA,EACnE;AAEA,MAAI,OAAO,OAAO,MAAM,IAAI,GAAG;AAC7B,aAAS;AACT,YAAQ,KAAK,gBAAgB,MAAM,QAAQ,CAAC,CAAC,+BAA+B;AAAA,EAC9E,WAAW,OAAO,OAAO,KAAK,GAAG,GAAG,KAAK,OAAO,OAAO,GAAG,GAAG,GAAG;AAC9D,aAAS;AACT,YAAQ,KAAK,gBAAgB,MAAM,QAAQ,CAAC,CAAC,iCAAiC;AAAA,EAChF,WAAW,QAAQ,KAAK,QAAQ,MAAM;AACpC,aAAS;AACT,YAAQ,KAAK,gBAAgB,MAAM,QAAQ,CAAC,CAAC,8BAA8B;AAAA,EAC7E;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAEA,SAAS,YAAY,OAAyD;AAC5E,QAAM,OAAO,MAAM,MAAM,YAAY,KAAK;AAC1C,QAAM,MAAM,MAAM,IAAI,YAAY;AAElC,MAAI,KAAK,SAAS,MAAM,KAAK,IAAI,SAAS,OAAO,GAAG;AAClD,WAAO,EAAE,OAAO,GAAG,SAAS,CAAC,mCAAmC,EAAE;AAAA,EACpE;AAEA,MAAI,KAAK,SAAS,MAAM,KAAK,iBAAiB,KAAK,GAAG,GAAG;AACvD,WAAO,EAAE,OAAO,GAAG,SAAS,CAAC,mCAAmC,EAAE;AAAA,EACpE;AAEA,MAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,kBAAkB,KAAK,GAAG,GAAG;AAChF,WAAO,EAAE,OAAO,GAAG,SAAS,CAAC,4BAA4B,EAAE;AAAA,EAC7D;AAEA,MAAI,KAAK,SAAS,KAAK,KAAK,gBAAgB,KAAK,GAAG,GAAG;AACrD,WAAO,EAAE,OAAO,GAAG,SAAS,CAAC,2BAA2B,EAAE;AAAA,EAC5D;AAEA,MAAI,wBAAwB,KAAK,GAAG,GAAG;AACrC,WAAO,EAAE,OAAO,IAAI,SAAS,CAAC,mDAAmD,EAAE;AAAA,EACrF;AAEA,SAAO,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE;AACjC;AAEA,SAAS,eAAe,OAAyD;AAC/E,QAAM,MAAM,MAAM,IAAI,YAAY;AAClC,QAAM,UAAU,IAAI,MAAM,8FAA8F,KAAK,CAAC;AAE9H,QAAM,gBAAgB,uBAAuB,GAAG;AAChD,MAAI,QAAQ,WAAW,KAAK,cAAc,UAAU,GAAG;AACrD,WAAO,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE;AAAA,EACjC;AAEA,QAAM,gBAAgB,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAC1C,QAAM,QAAQ,KAAK,IAAI,cAAc,SAAS,GAAG,EAAE,IAAI,cAAc;AACrE,QAAM,UAAU,cAAc,SAAS,IAAI,CAAC,8BAA8B,cAAc,KAAK,IAAI,CAAC,eAAe,KAAK,IAAI,cAAc,SAAS,GAAG,EAAE,CAAC,SAAS,IAAI,CAAC;AACrK,UAAQ,KAAK,GAAG,cAAc,OAAO;AAErC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,KAAmD;AACjF,MAAI,gEAAgE,KAAK,GAAG,GAAG;AAC7E,WAAO,EAAE,OAAO,IAAI,SAAS,CAAC,4CAA4C,EAAE;AAAA,EAC9E;AAEA,MAAI,wDAAwD,KAAK,GAAG,GAAG;AACrE,WAAO,EAAE,OAAO,IAAI,SAAS,CAAC,mCAAmC,EAAE;AAAA,EACrE;AAEA,MAAI,8GAA8G,KAAK,GAAG,GAAG;AAC3H,WAAO,EAAE,OAAO,GAAG,SAAS,CAAC,2CAA2C,EAAE;AAAA,EAC5E;AAEA,SAAO,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE;AACjC;AAEA,SAAS,iBAAiB,OAAyD;AACjF,QAAM,WAAW,oBAAoB,KAAK;AAC1C,MAAI,aAAa,KAAK,CAAC,iBAAiB,MAAM,GAAG,GAAG;AAClD,WAAO,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE;AAAA,EACjC;AAEA,QAAM,MAAM,MAAM,IAAI,YAAY;AAClC,QAAM,YAAY,OAAO,MAAM,UAAU,oBAAoB,WAAW,MAAM,SAAS,kBAAkB;AAEzG,MAAI,cAAc,WAAW;AAC3B,WAAO,EAAE,OAAO,IAAI,SAAS,CAAC,sCAAsC,EAAE;AAAA,EACxE;AAEA,MAAI,cAAc,mBAAmB;AACnC,WAAO,EAAE,OAAO,IAAI,SAAS,CAAC,+CAA+C,EAAE;AAAA,EACjF;AAEA,MAAI,qBAAqB,KAAK,GAAG,GAAG;AAClC,WAAO,EAAE,OAAO,IAAI,SAAS,CAAC,2CAA2C,EAAE;AAAA,EAC7E;AAEA,MAAI,2BAA2B,KAAK,GAAG,GAAG;AACxC,WAAO,EAAE,OAAO,IAAI,SAAS,CAAC,sCAAsC,EAAE;AAAA,EACxE;AAEA,MAAI,oCAAoC,KAAK,GAAG,GAAG;AACjD,WAAO,EAAE,OAAO,IAAI,SAAS,CAAC,mDAAmD,EAAE;AAAA,EACrF;AAEA,MAAI,kCAAkC,KAAK,GAAG,GAAG;AAC/C,WAAO,EAAE,OAAO,KAAK,SAAS,CAAC,4CAA4C,EAAE;AAAA,EAC/E;AAEA,SAAO,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE;AACjC;AAEA,SAAS,gBAAgB,OAA2B;AAClD,QAAM,MAAM,MAAM,IAAI,YAAY;AAClC,MAAI,UAAU;AAEd,MAAI,6FAA6F,KAAK,GAAG,GAAG;AAC1G,eAAW;AAAA,EACb;AAEA,MAAI,qCAAqC,KAAK,GAAG,GAAG;AAClD,eAAW;AAAA,EACb;AAEA,MAAI,MAAM,OAAO,0BAA0B,KAAK,MAAM,GAAG,GAAG;AAC1D,eAAW;AAAA,EACb;AAEA,MAAI,MAAM,SAAS,WAAW;AAC5B,eAAW;AAAA,EACb;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAmB,iBAA4E;AAC5H,QAAM,QAAQ,gBAAgB,IAAI,eAAe,MAAM,GAAG,CAAC,KAAK;AAChE,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE;AAAA,EACjC;AAEA,QAAM,UAAU,KAAK,KAAK,QAAQ,KAAK,GAAG,EAAE;AAC5C,SAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS,CAAC,uCAAuC,OAAO,SAAS;AAAA,EACnE;AACF;AAEA,SAAS,mBAAmB,OAA2B;AACrD,QAAM,aAAa,MAAM,SAAS,MAAM,SAAS,GAAG,MAAM,KAAK,IAAI,MAAM,MAAM,KAAK;AACpF,QAAM,UAAU,MAAM,QAAQ,MAAM,UAAU,YAAY,IAAI,MAAM,SAAS,aAAa,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI;AACnH,QAAM,eAAe,UAAU,aAAa,OAAO,MAAM;AAEzD,SAAO,iCAAiC,YAAY,MAAM,MAAM,CAAC,SAAS,UAAU,gBAAgB,KAAK,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,YAAY;AAClJ;AAEA,SAAS,OAAO,OAAe,QAAgB,WAA4B;AACzE,SAAO,KAAK,IAAI,QAAQ,MAAM,KAAK;AACrC;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEA,SAAS,YAAY,QAAwB;AAC3C,MAAI,WAAW,aAAa;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,WAAW;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,UAAU;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,UAAU;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,YAAY,QAAQ,gBAAgB,kBAAkB,UAAU,mBAAmB,YAAY,EAAE,SAAS,MAAM,GAAG;AACtH,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,SAAS,IAAI,IAAI,aAAa,KAAK,CAAC,KAAK,aAAa,KAAK;AACpE;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,OAAO,UAAU,KAAK,IAAI,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAClE;AAEA,SAAS,gBAAgB,QAA2C;AAClE,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,eAAe,MAAM,GAAG;AACpC,WAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAASA,WAAU,OAA2B;AAC5C,UAAQ,MAAM,SAAS,MAAM,MAAM,UAAU;AAC/C;AAEA,SAAS,iBAAiB,OAA2B;AACnD,SAAO,cAAc,MAAM,MAAM,KAAK;AACxC;AAEA,SAAS,eAAe,KAAqB;AAC3C,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,WAAO,GAAG,OAAO,SAAS,YAAY,CAAC,GAAG,OAAO,SAC9C,QAAQ,8EAA8E,EAAE,EACxF,YAAY,CAAC;AAAA,EAClB,QAAQ;AACN,WAAO,IAAI,YAAY;AAAA,EACzB;AACF;;;ACzVA,IAAM,aAAa;AAAA,EACjB;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;AAEA,IAAM,aAAa;AAAA,EACjB;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;AACA,IAAM,aAAa,CAAC,SAAS,UAAU,YAAY,aAAa,YAAY;AAErE,SAAS,cAAc,YAAgC,UAAwC;AACpG,QAAM,QAAkB,CAAC;AACzB,QAAM,kBAAkB,CAAC,GAAG,WAAW,SAAS,GAAG,WAAW,QAAQ;AACtE,QAAM,SAAS;AAAA,IACb;AAAA,MACE,GAAG,gBAAgB,QAAQ,CAAC,WAAW,OAAO,UAAU,CAAC,CAAC;AAAA,MAC1D,GAAG,WAAW,UAAU;AAAA,MACxB,GAAG,WAAW,QAAQ;AAAA,MACtB,GAAG,aAAa,WAAW,OAAO,KAAK;AAAA,MACvC,GAAG,eAAe,WAAW,aAAa,KAAK;AAAA,MAC/C,GAAI,WAAW,KAAK,WAAW,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC7D,GAAG,WAAW;AAAA,MACd,GAAG,aAAa,UAAU;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACA,QAAM,SAAS;AAAA,IACb;AAAA,MACE,GAAG,gBAAgB,QAAQ,CAAC,WAAW,OAAO,UAAU,CAAC,CAAC;AAAA,MAC1D,GAAG,WAAW,UAAU;AAAA,MACxB,GAAG,WAAW,QAAQ;AAAA,MACtB,GAAG,aAAa,WAAW,OAAO,KAAK;AAAA,MACvC,GAAG,eAAe,WAAW,aAAa,KAAK;AAAA,MAC/C,GAAG,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,MACE,GAAG,gBAAgB,QAAQ,CAAC,WAAW,OAAO,SAAS,CAAC,CAAC;AAAA,MACzD,GAAG,WAAW,UAAU;AAAA,MACxB,GAAG,YAAY,WAAW,OAAO,KAAK;AAAA,MACtC,GAAG,cAAc,WAAW,aAAa,KAAK;AAAA,MAC9C,GAAG,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AAEA,MAAI,WAAW,UAAU,OAAO,SAAS,GAAG;AAC1C,UAAM,KAAK,+CAA+C;AAAA,EAC5D;AACA,MAAI,WAAW,QAAQ,OAAO,SAAS,GAAG;AACxC,UAAM,KAAK,oDAAoD;AAAA,EACjE;AACA,MAAI,WAAW,OAAO,MAAM,SAAS,GAAG;AACtC,UAAM,KAAK,uCAAuC;AAAA,EACpD;AACA,MAAI,WAAW,aAAa,MAAM,SAAS,GAAG;AAC5C,UAAM,KAAK,mDAAmD;AAAA,EAChE;AACA,MAAI,WAAW,OAAO,SAAS,GAAG;AAChC,UAAM,KAAK,kFAAkF;AAAA,EAC/F;AACA,MAAI,gBAAgB,KAAK,CAAC,YAAY,OAAO,QAAQ,UAAU,KAAK,MAAM,OAAO,QAAQ,UAAU,KAAK,CAAC,GAAG;AAC1G,UAAM,KAAK,mDAAmD;AAAA,EAChE;AAEA,QAAM,gBAAgB,uBAAuB,MAAM;AAEnD,SAAO;AAAA,IACL,QAAQ,YAAY,QAAQ,IAAI,4BAA4B,aAAa,IAAI;AAAA,IAC7E,QAAQ,uBAAuB,iBAAiB,MAAM,CAAC;AAAA,IACvD,OAAO,uBAAuB,iBAAiB,KAAK,CAAC;AAAA,IACrD;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,QAAsB,SAA+B;AAC5E,SAAO,OACJ,IAAI,CAAC,UAAU;AACd,UAAM,YAAY,cAAc,MAAM,WAAW,OAAO;AACxD,UAAM,MAAM,cAAc,aAAa,MAAM,KAAK,OAAO;AACzD,UAAM,SAAS,cAAc,MAAM,QAAQ,OAAO;AAElD,QAAI,CAAC,OAAOC,sBAAqB,GAAG,GAAG;AACrC,aAAO;AAAA,IACT;AAEA,WAAO,eAAe;AAAA,MACpB,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC,EACA,OAAO,CAAC,UAA+B,QAAQ,KAAK,CAAC;AAC1D;AAEA,SAAS,aAAa,OAAmC;AACvD,SAAO,MAAM,QAAQ,CAAC,SAAS;AAAA,IAC7B,GAAG,mBAAmB,KAAK,OAAO,SAAS,QAAQ;AAAA,IACnD,GAAG,mBAAmB,KAAK,cAAc,SAAS,QAAQ;AAAA,IAC1D,GAAG,mBAAmB,KAAK,WAAW,SAAS,QAAQ;AAAA,IACvD,GAAG,mBAAmB,KAAK,MAAM,SAAS,QAAQ;AAAA,EACpD,CAAC;AACH;AAEA,SAAS,aAAa,OAAmC;AACvD,SAAO,MAAM,QAAQ,CAAC,SAAS;AAAA,IAC7B,GAAG,mBAAmB,KAAK,YAAY,SAAS,QAAQ;AAAA,IACxD,GAAG,mBAAmB,KAAK,UAAU,SAAS,QAAQ;AAAA,IACtD,GAAG,mBAAmB,KAAK,OAAO,SAAS,QAAQ;AAAA,EACrD,CAAC;AACH;AAEA,SAAS,YAAY,OAAmC;AACtD,SAAO,MAAM,QAAQ,CAAC,SAAS;AAAA,IAC7B,GAAG,mBAAmB,KAAK,YAAY,SAAS,QAAQ;AAAA,IACxD,GAAG,mBAAmB,KAAK,UAAU,SAAS,QAAQ;AAAA,EACxD,CAAC;AACH;AAEA,SAAS,eAAe,OAAyC;AAC/D,SAAO,MAAM,QAAQ,CAAC,SAAS,sBAAsB,MAAM,YAAY,OAAO,CAAC;AACjF;AAEA,SAAS,eAAe,OAAyC;AAC/D,SAAO,MAAM,QAAQ,CAAC,SAAS,sBAAsB,MAAM,YAAY,OAAO,CAAC;AACjF;AAEA,SAAS,cAAc,OAAyC;AAC9D,SAAO,MAAM,QAAQ,CAAC,SAAS,sBAAsB,MAAM,YAAY,OAAO,CAAC;AACjF;AAEA,SAAS,sBAAsB,MAAwB,MAAgB,MAAwC;AAC7G,QAAM,SAAuB,CAAC;AAC9B,mBAAiB,KAAK,MAAM,CAAC,OAAO,KAAK,WAAW;AAClD,QAAI,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,cAAc,UAAU,YAAY,MAAM,IAAI,YAAY,CAAC,GAAG;AACpF,UAAI,OAAO,UAAU,YAAY,kBAAkB,OAAO,IAAI,KAAK,OAAO,KAAK,KAAK,CAAC,cAAc,IAAI,YAAY,EAAE,SAAS,UAAU,YAAY,CAAC,CAAC,GAAG;AACvJ,eAAO,KAAK,kBAAkB,OAAO,MAAM,MAAM,MAAM,CAAC;AAAA,MAC1D;AACA;AAAA,IACF;AAEA,WAAO,KAAK,GAAG,mBAAmB,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,EAC7D,CAAC;AAED,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAgB,MAA0B,QAA8B;AAClG,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,kBAAkB,OAAO,IAAI,IAAI,CAAC,EAAE,KAAK,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;AAAA,EAC5E;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,QAAQ,CAAC,SAAS,mBAAmB,MAAM,MAAM,MAAM,CAAC;AAAA,EACvE;AAEA,MAAIC,UAAS,KAAK,GAAG;AACnB,UAAM,SAAS,kBAAkB,MAAM,MAAM,KAAK,kBAAkB,MAAM,MAAM;AAChF,UAAM,eAAe,YAAY,MAAM,EAAE,QAAQ,CAACC,SAAQ,mBAAmBA,MAAK,MAAM,MAAM,CAAC;AAC/F,UAAM,MAAM,mBAAmB,OAAO,IAAI;AAC1C,UAAM,gBAAgB,yBAAyB,OAAO,IAAI;AAC1D,QAAI,CAAC,OAAO,CAAC,kBAAkB,KAAK,IAAI,GAAG;AACzC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,YAAY,kBAAkB,MAAM,KAAK,CAAC,KAAK,YAAY,kBAAkB,eAAe,KAAK,CAAC;AAAA,QACzG,QAAQ,YAAY,kBAAkB,MAAM,MAAM,CAAC,KAAK,YAAY,kBAAkB,eAAe,MAAM,CAAC;AAAA,QAC5G,KAAK,kBAAkB,MAAM,GAAG,KAAK,kBAAkB,MAAM,OAAO,KAAK,kBAAkB,MAAM,IAAI,KAAK,kBAAkB,eAAe,GAAG;AAAA,QAC9I,OAAO,kBAAkB,MAAM,KAAK,KAAK,kBAAkB,eAAe,KAAK;AAAA,QAC/E,MAAM,kBAAkB,MAAM,IAAI,KAAK,kBAAkB,MAAM,QAAQ,KAAK,kBAAkB,MAAM,cAAc,KAAK,kBAAkB,eAAe,IAAI;AAAA,QAC5J,UAAUD,UAAS,MAAM,QAAQ,IAAI,MAAM,WAAW;AAAA,MACxD;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,yBAAyB,OAAmB,MAAkD;AACrG,QAAM,aAAa;AAAA,IACjB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,SAAO,WAAW,KAAK,CAAC,cAAuCA,UAAS,SAAS,KAAK,QAAQ,mBAAmB,WAAW,IAAI,CAAC,CAAC;AACpI;AAEA,SAAS,mBAAmB,OAAmB,MAA8C;AAC3F,QAAM,mBAAmB;AAAA,IACvB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,QAAM,kBAAkB;AAAA,IACtB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,QAAM,aAAa,SAAS,UAAU,CAAC,GAAG,iBAAiB,GAAG,gBAAgB,IAAI;AAClF,SAAO,WAAW,IAAI,iBAAiB,EAAE,KAAK,CAAC,cAAc,aAAa,kBAAkB,WAAW,IAAI,CAAC;AAC9G;AAEA,SAAS,kBAAkB,OAAe,MAA0B,MAAwB,QAA4C;AACtI,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,OAAO,YAAY,kBAAkB,QAAQ,KAAK,CAAC;AAAA,IACnD,QAAQ,YAAY,kBAAkB,QAAQ,MAAM,CAAC;AAAA,IACrD,KAAK,kBAAkB,QAAQ,GAAG,KAAK,kBAAkB,QAAQ,OAAO;AAAA,IACxE,OAAO,kBAAkB,QAAQ,KAAK;AAAA,IACtC,UAAU;AAAA,MACR,cAAc,KAAK;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,aAAa,YAA8C;AAClE,SAAO,WAAW,OAAO,KAAK,QAAQ,CAAC,SAAS;AAC9C,UAAM,SAAuB,CAAC;AAC9B,QAAI,KAAK,eAAe;AACtB,aAAO,KAAK;AAAA,QACV,KAAK,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,SAAS,WAAW,KAAK,KAAK;AACrC,aAAO,KAAK;AAAA,QACV,KAAK,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,uBAAuB,QAAoC;AAClE,QAAM,OAAO,oBAAI,IAAwB;AAEzC,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAME,gBAAe,MAAM,GAAG;AACpC,UAAM,UAAU,KAAK,IAAI,GAAG;AAC5B,QAAI,CAAC,WAAW,UAAU,KAAK,IAAI,UAAU,OAAO,GAAG;AACrD,WAAK,IAAI,KAAK,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AAC1B;AAEA,SAASA,gBAAe,KAAqB;AAC3C,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,WAAW,OAAO,SACrB,QAAQ,8EAA8E,EAAE,EACxF,YAAY;AAEf,WAAO,GAAG,OAAO,SAAS,YAAY,CAAC,GAAG,QAAQ;AAAA,EACpD,QAAQ;AACN,WAAO,IAAI,YAAY;AAAA,EACzB;AACF;AAEA,SAAS,WAAW,QAAwB;AAC1C,QAAM,QAAgC;AAAA,IACpC,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAEA,SAAO,MAAM,MAAM,KAAK;AAC1B;AAEA,SAAS,UAAU,OAA2B;AAC5C,QAAM,iBAAiB,oBAAoB,KAAK;AAChD,SAAO,iBAAiB,IAAI,MAAQ,iBAAiB,WAAW,MAAM,MAAM;AAC9E;AAEA,SAASH,sBAAqB,KAAsB;AAClD,QAAM,aAAa,IAAI,YAAY;AACnC,SACE,WAAW,WAAW,OAAO,KAC7B,WAAW,WAAW,OAAO,KAC7B,WAAW,WAAW,aAAa,KACnC,uHAAuH,KAAK,UAAU,KACtI,kCAAkC,KAAK,UAAU;AAErD;AAEA,SAAS,kBAAkB,OAAe,MAAmC;AAC3E,MAAIA,sBAAqB,KAAK,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,KAAK,KAAK,KAAK,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,IAAI,KAAK,MAAM,WAAW,KAAK,GAAG;AAC7G,QAAI,SAAS,SAAS;AACpB,aACE,6CAA6C,KAAK,KAAK,KACvD,mGAAmG,KAAK,KAAK,KAC7G,gKAAgK,KAAK,KAAK;AAAA,IAE9K;AAEA,QAAI,SAAS,SAAS;AACpB,aAAO,uCAAuC,KAAK,KAAK,KAAK,wDAAwD,KAAK,KAAK;AAAA,IACjI;AAEA,QAAI,SAAS,SAAS;AACpB,aAAO,yCAAyC,KAAK,KAAK,KAAK,qBAAqB,KAAK,KAAK;AAAA,IAChG;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAgB,OAA0F,KAAc,QAAqB,QAAQ,GAAS;AACtL,MAAI,QAAQ,GAAG;AACb;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,MAAM;AAExB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,QAAQ,MAAM,MAAM,GAAG,GAAG,GAAG;AACtC,uBAAiB,MAAM,OAAO,QAAW,QAAQ,QAAQ,CAAC;AAAA,IAC5D;AACA;AAAA,EACF;AAEA,MAAIC,UAAS,KAAK,GAAG;AACnB,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG;AACxE,uBAAiB,YAAY,OAAO,UAAU,OAAO,QAAQ,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAEA,SAAS,eAAiC,OAAsB;AAC9D,SAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,SAAS,UAAa,SAAS,SAAS,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;AACxJ;AAEA,SAAS,kBAAkB,OAAoC;AAC7D,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,WAAO,MAAM,KAAK;AAAA,EACpB;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAIA,UAAS,KAAK,GAAG;AACnB,WAAO,kBAAkB,MAAM,GAAG,KAAK,kBAAkB,MAAM,GAAG,KAAK,kBAAkB,MAAM,IAAI;AAAA,EACrG;AAEA,SAAO;AACT;AAEA,SAASA,UAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AC7bO,SAAS,oBAAoB,OAAsC;AACxE,MAAI,QAAQ;AAEZ,WAAS,cAAc,MAAM,OAAO,IAAI,GAAG,GAAG;AAC9C,WAAS,cAAc,MAAM,aAAa,IAAI,IAAI,GAAG;AAErD,MAAI,MAAM,WAAW;AACnB,aAAS;AACT,aAAS,KAAK,IAAI,MAAM,UAAU,SAAS,GAAG,GAAG,IAAI;AACrD,aAAS,sBAAsB,MAAM,UAAU,MAAM;AAAA,EACvD;AAEA,MAAI,MAAM,cAAc;AACtB,aAAS;AAAA,EACX;AAEA,MAAI,MAAM,mBAAmB;AAC3B,aAAS;AAAA,EACX;AAEA,MAAI,iBAAiB,MAAM,WAAW,QAAQ,GAAG;AAC/C,aAAS;AAAA,EACX;AAEA,MAAI,MAAM,YAAY,SAAS,WAAW,GAAG;AAC3C,aAAS;AAAA,EACX;AAEA,MAAI,MAAM,YAAY,SAAS,SAAS,GAAG;AACzC,aAAS;AAAA,EACX;AAEA,MAAI,MAAM,WAAW,aAAa,MAAM,SAAS,GAAG;AAClD,aAAS;AAAA,EACX;AAEA,WAAS,KAAK,IAAI,MAAM,SAAS,SAAS,GAAG,EAAE;AAE/C,SAAO,KAAK,MAAMG,OAAM,OAAO,GAAG,GAAG,CAAC;AACxC;AAEO,SAAS,6BAA6B,OAAmD;AAC9F,QAAM,QAAQ,cAAc,MAAM,OAAO,KAAK,GAAG,GAAG;AACpD,QAAM,cAAc,cAAc,MAAM,aAAa,KAAK,IAAI,GAAG;AACjE,QAAM,QAAQ,MAAM,YAChBA,OAAM,KAAK,KAAK,IAAI,MAAM,UAAU,SAAS,GAAG,GAAG,IAAI,OAAO,sBAAsB,MAAM,UAAU,MAAM,GAAG,GAAG,GAAG,IACnH;AACJ,QAAM,iBAAiB,MAAM,oBACzB,MACA,MAAM,WAAW,aAAa,MAAM,SAAS,IAC3C,KACA;AACN,QAAM,UAAU,iBAAiB,MAAM,WAAW,QAAQ,IAAI,kBAAkB,MAAM,WAAW,SAAS,CAAC,CAAC,IAAI;AAEhH,SAAO;AAAA,IACL,OAAO,KAAK,MAAM,KAAK;AAAA,IACvB,aAAa,KAAK,MAAM,WAAW;AAAA,IACnC,OAAO,KAAK,MAAM,KAAK;AAAA,IACvB,gBAAgB,KAAK,MAAM,cAAc;AAAA,IACzC,SAAS,KAAK,MAAM,OAAO;AAAA,EAC7B;AACF;AAEO,SAAS,sBAAsB,OAAkC;AACtE,QAAM,UAAU;AAAA,IACd,MAAM,QAAQ,KAAK;AAAA,IACnB,MAAM,cAAc,KAAK;AAAA,IACzB,MAAM,YAAY,KAAK;AAAA,IACvB,MAAM,eAAe,KAAK;AAAA,IAC1B,MAAM,WAAW,IAAI;AAAA,IACrB,MAAM,SAAS,IAAI;AAAA,IACnB,MAAM,YAAY,IAAI;AAAA,IACtB,MAAM,QAAQ,MAAM,SAAS,YAAY,IAAI;AAAA,IAC7C,MAAM,gBAAgB,IAAI;AAAA,IAC1B,MAAM,aAAa,IAAI,IAAI;AAAA,EAC7B;AAEA,SAAO,KAAK,MAAMA,OAAM,QAAQ,OAAO,CAAC,OAAO,UAAU,QAAQ,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AACrF;AAEO,SAAS,qBAAqB,OAAiC;AACpE,MAAI,QAAQ,MAAM,aAAa,OAAO,MAAM,eAAe;AAE3D,MAAI,MAAM,gBAAgB;AACxB,aAAS;AAAA,EACX;AAEA,OAAK,MAAM,WAAW,SAAS,MAAM,IAAI;AACvC,aAAS;AAAA,EACX,WAAW,MAAM,WAAW;AAC1B,aAAS;AAAA,EACX;AAEA,WAAS,KAAK,IAAI,MAAM,SAAS,SAAS,GAAG,EAAE;AAE/C,SAAO,KAAK,MAAMA,OAAM,OAAO,GAAG,GAAG,CAAC;AACxC;AAEA,SAAS,cAAc,OAA2B,WAAmB,gBAAwB,gBAAgC;AAC3H,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACnD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AAEb,MAAI,WAAW,SAAS,gBAAgB;AACtC,cAAU,WAAW,SAAS;AAAA,EAChC;AAEA,MAAI,WAAW,SAAS,gBAAgB;AACtC,cAAU,KAAK,IAAI,KAAK,iBAAiB,WAAW,MAAM;AAAA,EAC5D;AAEA,MAAI,yCAAyC,KAAK,UAAU,GAAG;AAC7D,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,QAAwB;AACrD,MAAI,WAAW,WAAW;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,eAAe,WAAW,WAAW;AAClD,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,YAAY,WAAW,UAAU;AAC9C,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,YAAY,QAAQ,gBAAgB,kBAAkB,UAAU,iBAAiB,EAAE,SAAS,MAAM,GAAG;AACxG,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,QAAQ;AACrB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,UAA8C;AACtE,SAAO,SAAS,KAAK,CAAC,YAAY,QAAQ,QAAQ,SAAS,QAAQ,eAAe,QAAQ,QAAQ,UAAU,QAAQ,QAAQ,MAAM,CAAC;AACrI;AAEA,SAAS,kBAAkB,SAAsD;AAC/E,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,MAAI,QAAQ,OAAO;AACjB,aAAS;AAAA,EACX;AACA,MAAI,QAAQ,aAAa;AACvB,aAAS;AAAA,EACX;AACA,OAAK,QAAQ,QAAQ,UAAU,KAAK,MAAM,QAAQ,QAAQ,UAAU,KAAK,GAAG;AAC1E,aAAS;AAAA,EACX;AACA,MAAI,QAAQ,QAAQ;AAClB,aAAS;AAAA,EACX;AAEA,SAAOA,OAAM,OAAO,GAAG,GAAG;AAC5B;AAEA,SAASA,OAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;;;ACtLO,SAAS,kBAAkB,YAAgC,UAA4B,CAAC,GAAoB;AACjH,QAAM,WAAW,QAAQ,YAAY,QAAQ,OAAO;AACpD,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,kBAAkB,CAAC,GAAG,WAAW,SAAS,GAAG,WAAW,QAAQ;AACtE,QAAM,cAAc,WAAW,OAAO;AACtC,QAAM,gBAAgB,WAAW,aAAa,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAC3E,QAAM,cAAc,eAAe,aAAa,CAAC,WAAW,eAAe,aAAa,CAAC;AACzF,QAAM,cAAc,eAAe,aAAa,CAAC,SAAS,CAAC;AAC3D,QAAM,UAAU,eAAe,aAAa,CAAC,uBAAuB,qBAAqB,gBAAgB,CAAC;AAC1G,QAAM,mBAAmB,eAAe,aAAa,CAAC,gBAAgB,yBAAyB,SAAS,CAAC;AACzG,QAAM,eAAe;AAAA,IACnB;AAAA,MACE,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,YAAY;AAAA,MACjE,WAAW,KAAK;AAAA,MAChB,WAAW,UAAU;AAAA,MACrB,WAAW,aAAa,KAAK;AAAA,MAC7B,iBAAiB,eAAe,CAAC,gBAAgB,aAAa,aAAa,WAAW,UAAU,CAAC;AAAA,IACnG;AAAA,IACA;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,KAAK;AAAA,IAC1D,WAAW,UAAU;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,WAAW,CAAC,aAAa,aAAa,SAAS,gBAAgB,EAAE,OAAO,YAAY,GAAG,UAAU;AAAA,IACjG,WAAW,CAAC,aAAa,aAAa,SAAS,gBAAgB,EAAE,OAAO,YAAY,GAAG,MAAM;AAAA,IAC7F,iBAAiB,eAAe,CAAC,SAAS,YAAY,aAAa,WAAW,MAAM,CAAC;AAAA,IACrF,WAAW,KAAK;AAAA,EAClB;AAEA,QAAM,cAAc;AAAA,IAClB,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,WAAW;AAAA,IAChE,WAAW,UAAU;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,WAAW,CAAC,aAAa,aAAa,SAAS,gBAAgB,EAAE,OAAO,YAAY,GAAG,aAAa;AAAA,IACpG,iBAAiB,eAAe,CAAC,eAAe,WAAW,WAAW,YAAY,eAAe,CAAC;AAAA,IAClG,WAAW,KAAK;AAAA,EAClB;AAEA,QAAM,WAAW;AAAA,IACf,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,QAAQ;AAAA,IAC7D,WAAW,UAAU;AAAA,IACrB,WAAW,CAAC,gBAAgB,EAAE,OAAO,YAAY,GAAG,MAAM;AAAA,IAC1D,iBAAiB,eAAe,CAAC,YAAY,aAAa,WAAW,iBAAiB,CAAC;AAAA,IACvF,WAAW,QAAQ;AAAA,EACrB;AAEA,QAAM,iBAAiB,cAAc,YAAY,QAAQ;AACzD,QAAM,SAAS,eAAe;AAC9B,QAAM,SAAS,eAAe;AAC9B,QAAM,QAAQ,eAAe;AAC7B,QAAM,WAAWC,iBAAgB,WAAW,KAAK,UAAU,QAAQ;AACnE,QAAM,gBAAgB,gBAAgB,QAAQ,QAAQ,YAAY;AAClE,QAAM,UAAU,aAAa,YAAY,iBAAiB,aAAa,aAAa;AACpF,QAAM,UAAU,aAAa,YAAY,iBAAiB,WAAW;AACrE,QAAM,MAAM,SAAS,YAAY,iBAAiB,OAAO;AACzD,QAAM,QAAQ,WAAW,YAAY,iBAAiB,aAAa,eAAe,MAAM;AACxF,QAAM,WAAW,cAAc,eAAe;AAC9C,QAAM,OAAO,UAAU,YAAY,iBAAiB,aAAa,SAAS,SAAS,KAAK,UAAU,QAAQ,KAAK;AAC/G,QAAM,SAAS,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,MAAM,KAAK,YAAY,SAAS,OAAO,KAAK,mBAAmB,eAAe,CAAC,UAAU,WAAW,SAAS,MAAM,CAAC;AACxL,QAAM,YAAY,SAAS,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,KAAK,iBAAiB,gBAAgB,KAAK,mBAAmB,eAAe,CAAC,aAAa,YAAY,cAAc,CAAC;AAC5N,QAAM,cAAc,aAAa,SAAS,eAAe,OAAO,aAAa;AAC7E,QAAM,cAAc,kBAAkB,UAAU;AAChD,QAAM,WAAW,oBAAoB,YAAY,iBAAiB,QAAQ,WAAW;AACrF,QAAM,eAAe;AAAA,IACnB,OAAO,YAAY,YAAY,iBAAiB,eAAe,SAAS,cAAc,IAAI;AAAA,IAC1F,aAAa,YAAY,YAAY,iBAAiB,eAAe,eAAe,cAAc,IAAI;AAAA,IACtG,QAAQ,YAAY,YAAY,iBAAiB,eAAe,UAAU,cAAc,IAAI;AAAA,IAC5F,OAAO,YAAY,YAAY,iBAAiB,eAAe,SAAS,cAAc,IAAI;AAAA,EAC5F;AACA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,WAAW,cAAc;AAAA,IACzB;AAAA,IACA,mBAAmB,YAAY,SAAS;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,aAAa,oBAAoB,eAAe;AACtD,QAAM,sBAAsB,6BAA6B,eAAe;AACxE,QAAM,eAAe,sBAAsB;AAAA,IACzC;AAAA,IACA;AAAA,IACA,WAAW,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,YAAY,OAAO,SAAS,OAAO,SAAS,MAAM;AAAA,EACpD,CAAC;AACD,QAAM,cAAc,qBAAqB;AAAA,IACvC;AAAA,IACA;AAAA,IACA,gBAAgB,WAAW,SAAS,SAAS;AAAA,IAC7C,WAAW,cAAc;AAAA,IACzB;AAAA,EACF,CAAC;AACD,QAAM,cAAc,QAAQ,eAAe;AAAA,IACzC,WAAW,CAAC;AAAA,IACZ,aAAa,CAAC;AAAA,IACd,UAAU,CAAC;AAAA,IACX,OAAO,CAAC;AAAA,IACR,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AAEA,cAAY,cAAcC,eAAc,CAAC,GAAG,YAAY,aAAa,GAAG,WAAW,CAAC;AACpF,cAAY,WAAWA,eAAc,CAAC,GAAG,YAAY,UAAU,GAAG,WAAW,OAAO,UAAU,GAAG,gBAAgB,QAAQ,CAAC,WAAW,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;AAC5J,cAAY,cAAc,YAAY,eAAe,WAAW,SAAS,CAAC,GAAG;AAC7E,cAAY,mBAAmB,YAAY,oBAAoB,iBAAiB,WAAW,SAAS,CAAC,GAAG,kBAAkB,KAAK,aAAa;AAC5I,cAAY,iBAAiBA,eAAc;AAAA,IACzC,GAAI,YAAY,kBAAkB,CAAC;AAAA,IACnC,GAAI,eAAe,WAAW,SAAS,CAAC,GAAG,KAAK,cAAc,KAAK,CAAC;AAAA,EACtE,CAAC;AACD,cAAY,qBAAqB;AAAA,IAC/B,YAAY;AAAA,IACZ,4BAA4B,WAAW,SAAS,CAAC,GAAG,KAAK,kBAAkB;AAAA,EAC7E;AACA,cAAY,YAAY,YAAY,aAAa,qBAAqB,WAAW,SAAS,CAAC,GAAG,KAAK,SAAS;AAC5G,cAAY,sBAAsB,cAAc;AAChD,cAAY,sBAAsB;AAClC,cAAY,cAAc,YAAY,eAAe;AACrD,cAAY,WAAW,YAAY,YAAY;AAC/C,cAAY,eAAe;AAC3B,cAAY,UAAU,mBAAmB,WAAW,QAAQ;AAC5D,cAAY,QAAQA,eAAc;AAAA,IAChC,GAAG,YAAY;AAAA,IACf,GAAG,eAAe;AAAA,IAClB,GAAI,cAAc,OAAO,CAAC,uBAAuBC,aAAY,cAAc,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACzF,CAAC;AAED,QAAM,aAAaC,gBAAe;AAAA,IAChC,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,cAAc,MAAM;AAAA,IAC/B,QAAQ,cAAc;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,KAAK,QAAQ,aAAa,aAAa;AAAA,IACvC;AAAA,IACA,OAAO,YAAY;AAAA,EACrB,CAAC;AAED,aAAW,SAAS,cAAc;AAClC,aAAW,SAAS;AACpB,aAAW,QAAQ;AACnB,aAAW,WAAW;AACtB,aAAW,QAAQ,YAAY;AAE/B,SAAO;AACT;AAEA,SAASH,iBAAgB,QAAsB,SAA+B;AAC5E,SAAO,OACJ,IAAI,CAAC,UAAU;AACd,UAAM,YAAY,cAAc,MAAM,WAAW,OAAO;AACxD,UAAM,MAAM,cAAc,aAAa,MAAM,KAAK,OAAO;AACzD,UAAM,SAAS,cAAc,MAAM,QAAQ,OAAO;AAElD,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAEA,WAAOG,gBAAe;AAAA,MACpB,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC,EACA,OAAO,CAAC,UAA+B,QAAQ,KAAK,CAAC;AAC1D;AAEA,SAAS,aACP,YACA,iBACA,aACA,eAC6B;AAC7B,QAAM,iBAAiB,mBAAmB,eAAe,CAAC,UAAU,WAAW,SAAS,MAAM,CAAC;AAC/F,QAAM,oBAAoB,mBAAmB,eAAe,CAAC,aAAa,YAAY,cAAc,CAAC;AACrG,QAAM,UAA2B;AAAA,IAC/B,GAAG,WAAW,UAAU;AAAA,IACxB,GAAG,oBAAoB,gBAAgB,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC;AAAA,IACtE,UAAU;AAAA,MACR,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,QAAQ;AAAA,MACtE,WAAW,CAAC,WAAW,EAAE,OAAO,YAAY,GAAG,UAAU;AAAA,MACzD,iBAAiB,eAAe,CAAC,YAAY,SAAS,aAAa,YAAY,cAAc,CAAC;AAAA,MAC9F,WAAW,UAAU,SAAS;AAAA,MAC9B,WAAW,UAAU;AAAA,IACvB;AAAA,IACA,SAAS;AAAA,MACP,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,OAAO;AAAA,MACrE,WAAW,UAAU,SAAS;AAAA,MAC9B,WAAW,CAAC,WAAW,EAAE,OAAO,YAAY,GAAG,gBAAgB;AAAA,IACjE;AAAA,IACA,eAAe;AAAA,MACb,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,aAAa;AAAA,MAC3E,WAAW,UAAU,SAAS;AAAA,MAC9B,WAAW,CAAC,WAAW,EAAE,OAAO,YAAY,GAAG,eAAe;AAAA,MAC9D,iBAAiB,eAAe,CAAC,iBAAiB,iBAAiB,gBAAgB,aAAa,cAAc,WAAW,CAAC;AAAA,IAC5H;AAAA,IACA,cAAc;AAAA,MACZ,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,YAAY;AAAA,MAC1E,WAAW,UAAU,SAAS;AAAA,MAC9B,WAAW,CAAC,WAAW,EAAE,OAAO,YAAY,GAAG,cAAc;AAAA,IAC/D;AAAA,IACA,gBAAgB;AAAA,MACd,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,cAAc;AAAA,MAC5E,WAAW,UAAU,SAAS;AAAA,IAChC;AAAA,IACA,MAAMF,eAAc;AAAA,MAClB,GAAI,WAAW,UAAU,SAAS,QAAQ,CAAC;AAAA,MAC3C,GAAG,aAAa,WAAW;AAAA,IAC7B,CAAC;AAAA,IACD,SAAS;AAAA,MACP,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,OAAO;AAAA,MACrE,WAAW,UAAU,SAAS;AAAA,MAC9B,mBAAmB,aAAa,MAAM;AAAA,MACtC,iBAAiB,CAAC,cAAc,IAAI;AAAA,IACtC;AAAA,IACA,WAAW;AAAA,MACT,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,SAAS;AAAA,MACvE,WAAW,UAAU,SAAS;AAAA,MAC9B,iBAAiB,aAAa,SAAS;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,iBAAiB,OAAO;AACjC;AAEA,SAAS,aACP,aACA,iBACA,aAC6B;AAC7B,QAAM,SAAS,YAAY,aAAa,MAAM;AAC9C,QAAM,kBAAkB,YAAY,aAAa,eAAe;AAChE,QAAM,UAA2B;AAAA,IAC/B,GAAG,oBAAoB,gBAAgB,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC;AAAA,IACtE,MAAM,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,IAAI,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,YAAY,GAAG,MAAM,CAAC;AAAA,IAC9I,OAAO,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,KAAK,GAAG,iBAAiB,aAAa,KAAK,CAAC;AAAA,IAC9H,KAAK,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,GAAG,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,YAAY,GAAG,KAAK,CAAC;AAAA,IAC3I,OAAO,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,YAAY,GAAG,OAAO,CAAC;AAAA,IAC5I,UAAU;AAAA,MACR,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,QAAQ;AAAA,MACtE,WAAW,CAAC,MAAM,EAAE,OAAO,YAAY,GAAG,eAAe;AAAA,IAC3D;AAAA,IACA,cAAc;AAAA,MACZ,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,YAAY;AAAA,MAC1E,iBAAiB,WAAW,CAAC,MAAM,EAAE,OAAO,YAAY,GAAG,cAAc,CAAC;AAAA,IAC5E;AAAA,IACA,WAAW;AAAA,MACT,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,SAAS;AAAA,MACvE,iBAAiB,WAAW,CAAC,MAAM,EAAE,OAAO,YAAY,GAAG,eAAe,CAAC;AAAA,IAC7E;AAAA,IACA,aAAa;AAAA,MACX,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,WAAW;AAAA,MACzE,YAAY,WAAW,CAAC,eAAe,EAAE,OAAO,YAAY,GAAG,aAAa,CAAC;AAAA,IAC/E;AAAA,IACA,aAAa;AAAA,MACX,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,SAAS,WAAW;AAAA,MACzE,YAAY,WAAW,CAAC,eAAe,EAAE,OAAO,YAAY,GAAG,aAAa,CAAC;AAAA,IAC/E;AAAA,EACF;AAEA,SAAO,iBAAiB,OAAO;AACjC;AAEA,SAAS,SACP,YACA,iBACA,SACiC;AACjC,QAAM,SAAS,YAAY,SAAS,MAAM;AAC1C,QAAM,MAA2B;AAAA,IAC/B,GAAG,oBAAoB,gBAAgB,IAAI,CAAC,WAAW,OAAO,GAAG,CAAC;AAAA,IAClE,MAAM;AAAA,MACJ,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,KAAK,IAAI;AAAA,MAC9D,WAAW,KAAK;AAAA,MAChB,WAAW,CAAC,OAAO,EAAE,OAAO,YAAY,GAAG,MAAM;AAAA,IACnD;AAAA,IACA,UAAU,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,KAAK,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,YAAY,GAAG,qBAAqB,CAAC;AAAA,IAC7J,iBAAiB;AAAA,MACf,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,KAAK,eAAe;AAAA,MACzE,WAAW,CAAC,OAAO,EAAE,OAAO,YAAY,GAAG,iBAAiB;AAAA,IAC9D;AAAA,IACA,OAAO,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,KAAK,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,YAAY,GAAG,OAAO,CAAC;AAAA,IACxI,UAAU,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,KAAK,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,YAAY,GAAG,eAAe,CAAC;AAAA,EACxJ;AAEA,SAAO,iBAAiB,GAAG;AAC7B;AAEA,SAAS,WACP,YACA,iBACA,aACA,eACA,QACA;AACA,QAAM,gBAAgB,oBAAoB,gBAAgB,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC;AACvF,QAAM,mBAAmB,OAAO,KAAK,aAAa,EAAE,SAAS;AAC7D,QAAM,uBAAuB,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,IAAI;AACtF,QAAM,YAAY,eAAe,aAAa,CAAC,aAAa,CAAC;AAC7D,QAAM,gBAAgB,WAAW,UAAU,MAAM,YAAY,KAAK;AAClE,QAAM,wBACJ,CAAC,wBACD,yBAAyB,WACzB,yBAAyB,cACzB,cAAc,SAAS,OAAO,KAC9B,QAAQ,SAAS;AAEnB,MAAI,CAAC,oBAAoB,CAAC,uBAAuB;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,0BAA0B,oBAAoB;AACpD,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,IAAI;AAAA,MACF,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,OAAO,EAAE;AAAA,MAC9D,0BAA0B,iBAAiB,CAAC,WAAW,GAAG,aAAa,EAAE,OAAO,YAAY,GAAG,CAAC,WAAW,UAAU,CAAC,IAAI;AAAA,IAC5H;AAAA,IACA,OAAO;AAAA,MACL,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,OAAO,KAAK;AAAA,MACjE,WAAW,CAAC,SAAS,EAAE,OAAO,YAAY,GAAG,MAAM;AAAA,MACnD,0BAA0B,WAAW,UAAU,QAAQ;AAAA,MACvD,0BAA0B,iBAAiB,eAAe,CAAC,cAAc,OAAO,CAAC,IAAI;AAAA,IACvF;AAAA,IACA,SAAS,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,OAAO,OAAO,GAAG,mBAAmB,eAAe,CAAC,WAAW,oBAAoB,QAAQ,CAAC,CAAC;AAAA,IACxK,eAAe;AAAA,MACb,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,OAAO,aAAa;AAAA,MACzE,WAAW,CAAC,SAAS,EAAE,OAAO,YAAY,GAAG,YAAY;AAAA,MACzD,0BAA0B,iBAAiB,eAAe,CAAC,eAAe,iBAAiB,cAAc,eAAe,CAAC,IAAI;AAAA,IAC/H;AAAA,IACA,UAAU;AAAA,MACR,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,OAAO,QAAQ;AAAA,MACpE,WAAW,CAAC,SAAS,EAAE,OAAO,YAAY,GAAG,UAAU;AAAA,MACvD,0BAA0B,iBAAiB,eAAe,CAAC,YAAY,eAAe,CAAC,IAAI;AAAA,IAC7F;AAAA,IACA,UAAU,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,OAAO,QAAQ,GAAG,0BAA0B,iBAAiB,eAAe,CAAC,UAAU,CAAC,IAAI,MAAS;AAAA,IACjL,WAAW;AAAA,MACT,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,OAAO,SAAS;AAAA,MACrE,0BAA0B,YAAY,iBAAiB,eAAe,CAAC,aAAa,OAAO,CAAC,CAAC,IAAI;AAAA,IACnG;AAAA,IACA,MAAM,aAAa,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,OAAO,IAAI,GAAG,0BAA0B,eAAe,gBAAgB,eAAe,CAAC,QAAQ,UAAU,CAAC,CAAC,IAAI,MAAS;AAAA,EAClM;AAEA,QAAM,UAAU,iBAAiB,KAAK;AACtC,QAAM,yBACJ,QAAQ,SAAS,EAAE,KACnB,QAAQ,SAAS,QAAQ,KACzB,QAAQ,SAAS,OAAO,KACxB,QAAQ,SAAS,aAAa,KAC9B,OAAO,SAAS,KAChB,WAAW,UAAU,OAAO,SAAS,KACrC,WAAW,QAAQ,OAAO,SAAS,KACnC,QAAQ,SAAS;AAEnB,MAAI,CAAC,WAAY,CAAC,oBAAoB,CAAC,wBAAyB;AAC9D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,iBAA4C;AACjE,QAAM,WAAW,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,QAAQ;AAC9E,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,QAAQ,CAAC;AAAA,IACT,GAAG;AAAA,EACL;AACF;AAEA,SAAS,UACP,YACA,iBACA,aACA,SACA,SACA,KACA,UACA,QACA,OACc;AACd,QAAM,WAAW,iBAAiB,iBAAiB,CAAC,WAAW,OAAO,IAAI;AAC1E,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,WAAW,UAAU,MAAM,YAAY;AACtD,MAAI,QAAQ,SAAS,SAAS,KAAK,SAAS;AAC1C,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,SAAS,KAAK,WAAW,cAAc,aAAa,CAAC,SAAS,CAAC,GAAG;AACrF,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,OAAO,KAAK,cAAc,aAAa,CAAC,aAAa,CAAC,GAAG;AAC5E,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,OAAO,KAAK,OAAO,SAAS,KAAK,cAAc,aAAa,CAAC,aAAa,CAAC,GAAG;AACjG,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,OAAO,KAAK,MAAM,SAAS,KAAK,cAAc,aAAa,CAAC,eAAe,kBAAkB,gBAAgB,CAAC,GAAG;AACpI,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,cAAc,aAAa,CAAC,uBAAuB,qBAAqB,gBAAgB,CAAC,GAAG;AACrG,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,SAAS,KAAK,cAAc,aAAa,CAAC,QAAQ,CAAC,GAAG;AACzE,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,UAAU,IAAI,SAAS,KAAK,WAAW,KAAK,QAAQ,YAAY;AACpF;AAEA,SAAS,kBAAkB,YAA0C;AACnE,QAAM,UAAoB,CAAC;AAE3B,MAAI,OAAO,KAAK,WAAW,UAAU,GAAG,EAAE,SAAS,GAAG;AACpD,YAAQ,KAAK,WAAW;AAAA,EAC1B;AAEA,MAAI,OAAO,KAAK,WAAW,QAAQ,GAAG,EAAE,SAAS,GAAG;AAClD,YAAQ,KAAK,SAAS;AAAA,EACxB;AAEA,MAAI,WAAW,OAAO,MAAM,SAAS,GAAG;AACtC,YAAQ,KAAK,QAAQ;AAAA,EACvB;AAEA,MAAI,WAAW,aAAa,MAAM,SAAS,GAAG;AAC5C,YAAQ,KAAK,gBAAgB,GAAG,WAAW,aAAa,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AAAA,EAC1F;AAEA,MAAI,WAAW,OAAO,MAAM,SAAS,KAAK,WAAW,OAAO,KAAK,SAAS,GAAG;AAC3E,YAAQ,KAAK,QAAQ;AAAA,EACvB;AAEA,MAAI,WAAW,KAAK,SAAS,WAAW,KAAK,eAAe,WAAW,KAAK,cAAc;AACxF,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,MAAI,WAAW,OAAO,SAAS,KAAK,WAAW,OAAO,SAAS,KAAK,WAAW,MAAM,SAAS,GAAG;AAC/F,YAAQ,KAAK,OAAO;AAAA,EACtB;AAEA,UAAQ,KAAK,GAAG,WAAW,SAAS,IAAI,CAAC,WAAW,OAAO,MAAM,GAAG,GAAG,WAAW,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM,CAAC;AACxH,SAAO;AACT;AAEA,SAAS,oBACP,YACA,iBACA,aACU;AACV,SAAOA,eAAc;AAAA,IACnB,GAAI,aAAa,YAAY,CAAC;AAAA,IAC9B,GAAG,WAAW,OAAO;AAAA,IACrB,GAAG,gBAAgB,QAAQ,CAAC,WAAW,OAAO,YAAY,CAAC,CAAC;AAAA,EAC9D,CAAC;AACH;AAEA,SAAS,mBAAmB,UAAuE;AACjG,QAAM,UAAU,SAAS,CAAC;AAC1B,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAEA,MAAI,aAAa;AACjB,MAAI,QAAQ,OAAO;AACjB,kBAAc;AAAA,EAChB;AACA,MAAI,QAAQ,aAAa;AACvB,kBAAc;AAAA,EAChB;AACA,OAAK,QAAQ,QAAQ,UAAU,KAAK,MAAM,QAAQ,QAAQ,UAAU,KAAK,GAAG;AAC1E,kBAAc;AAAA,EAChB;AACA,MAAI,QAAQ,QAAQ;AAClB,kBAAc;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,QAAQ;AAAA,IACd,YAAY,KAAK,IAAI,YAAY,GAAG;AAAA,EACtC;AACF;AAEA,SAAS,iBAAiB,SAA8C,KAAiC;AACvG,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,4BAA4B,OAAyD;AAC5F,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,QAAQ,CAAC,SAAsC;AACpE,QAAI,CAAC,aAAa,IAAI,KAAK,OAAO,KAAK,WAAW,UAAU;AAC1D,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,CAAC;AAAA,MACN,QAAQ,KAAK;AAAA,MACb,KAAK,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM;AAAA,MAC/C,IAAI,OAAO,KAAK,OAAO,YAAY,KAAK,KAAK;AAAA,MAC7C,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAAA,MACpE,SAAS,OAAO,KAAK,YAAY,YAAY,KAAK,UAAU;AAAA,MAC5D,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MACrD,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAAA,IACtE,CAAC;AAAA,EACH,CAAC;AAED,SAAO,SAAS,SAAS,IAAI,WAAW;AAC1C;AAEA,SAAS,sBACP,UACA,UACyC;AACzC,QAAM,WAAW,CAAC,GAAI,YAAY,CAAC,GAAI,GAAI,YAAY,CAAC,CAAE;AAC1D,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,SAAS,OAAO,CAAC,YAAY;AAClC,UAAM,MAAM,GAAG,QAAQ,MAAM,IAAI,QAAQ,OAAO,EAAE,IAAI,QAAQ,cAAc,EAAE,IAAI,QAAQ,SAAS,EAAE;AACrG,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAiD;AAC7E,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,MAAM,cAAc,YAAY,MAAM,YAAY;AAC3E,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,IAC1D,YAAY,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAAA,IACtE,cAAc,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe;AAAA,IAC5E,UAAU,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;AAAA,EAClE;AACF;AAEA,SAAS,YACP,YACA,iBACA,eACA,OACA,WACoB;AACpB,MAAI,UAAU,SAAS;AACrB,WAAO,YAAYC,aAAY,SAAS,IAAI;AAAA,EAC9C;AAEA,aAAW,UAAU,iBAAiB;AACpC,QAAI,UAAU,WAAW,OAAO,OAAO;AACrC,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,UAAU,iBAAiB,OAAO,aAAa;AACjD,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,UAAU,YAAY,OAAO,QAAQ;AACvC,aAAO,OAAO;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,UAAU,SAAS;AACrB,QAAI,WAAW,UAAU,MAAO,QAAO;AACvC,QAAI,WAAW,QAAQ,MAAO,QAAO;AACrC,QAAI,iBAAiB,eAAe,CAAC,SAAS,YAAY,MAAM,CAAC,EAAG,QAAO;AAC3E,QAAI,WAAW,KAAK,MAAO,QAAO;AAAA,EACpC;AAEA,MAAI,UAAU,eAAe;AAC3B,QAAI,WAAW,UAAU,YAAa,QAAO;AAC7C,QAAI,WAAW,QAAQ,YAAa,QAAO;AAC3C,QAAI,iBAAiB,eAAe,CAAC,eAAe,WAAW,SAAS,CAAC,EAAG,QAAO;AACnF,QAAI,WAAW,KAAK,YAAa,QAAO;AAAA,EAC1C;AAEA,MAAI,UAAU,UAAU;AACtB,QAAI,mBAAmB,eAAe,CAAC,UAAU,WAAW,SAAS,MAAM,CAAC,EAAG,QAAO;AACtF,QAAI,WAAW,UAAU,SAAS,SAAS,OAAQ,QAAO;AAAA,EAC5D;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAqB,OAAyC;AACpF,SAAO,MAAM,KAAK,CAAC,SAAS,cAAc,CAAC,IAAI,GAAG,KAAK,CAAC;AAC1D;AAEA,SAAS,cAAc,OAAqB,OAA0B;AACpE,SAAO,MAAM,KAAK,CAAC,SAAS;AAC1B,UAAM,YAAY,MAAM,QAAQ,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,OAAO,CAAC;AAC/E,WAAO,UAAU,KAAK,CAAC,SAAS,OAAO,SAAS,YAAY,MAAM,KAAK,CAAC,cAAc,KAAK,YAAY,EAAE,SAAS,UAAU,YAAY,CAAC,CAAC,CAAC;AAAA,EAC7I,CAAC;AACH;AAEA,SAAS,WAAW,OAAqB,KAAiC;AACxE,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQE,mBAAkB,KAAK,GAAG,CAAC;AACzC,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAqB,MAAoC;AACjF,QAAM,iBAAiB,KAAK,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC;AAC1D,QAAM,aAAuB,CAAC;AAE9B,aAAW,QAAQ,OAAO;AACxB,aAAS,MAAM,CAAC,OAAO,QAAQ;AAC7B,UAAI,CAAC,OAAO,CAAC,eAAe,SAAS,IAAI,YAAY,CAAC,GAAG;AACvD;AAAA,MACF;AAEA,YAAM,OAAOA,mBAAkB,KAAK;AACpC,UAAI,MAAM;AACR,mBAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,WACJ,OAAO,CAAC,cAAc,UAAU,UAAU,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,EACvE,KAAK,CAAC,MAAM,UAAU,mBAAmB,KAAK,IAAI,mBAAmB,IAAI,CAAC,EAAE,CAAC;AAClF;AAEA,SAAS,gBAAgB,OAAqB,MAAyB;AACrE,QAAM,iBAAiB,KAAK,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC;AAC1D,MAAI;AAEJ,aAAW,QAAQ,OAAO;AACxB,aAAS,MAAM,CAAC,OAAO,QAAQ;AAC7B,UAAI,UAAU,UAAa,CAAC,OAAO,CAAC,eAAe,SAAS,IAAI,YAAY,CAAC,GAAG;AAC9E;AAAA,MACF;AAEA,cAAQ;AAAA,IACV,CAAC;AAED,QAAI,UAAU,QAAW;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAqB,MAAoC;AACnF,QAAM,iBAAiB,KAAK,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC;AAC1D,QAAM,aAAuB,CAAC;AAE9B,aAAW,QAAQ,OAAO;AACxB,aAAS,MAAM,CAAC,OAAO,QAAQ;AAC7B,UAAI,CAAC,OAAO,CAAC,eAAe,KAAK,CAAC,cAAc,IAAI,YAAY,EAAE,SAAS,SAAS,CAAC,GAAG;AACtF;AAAA,MACF;AAEA,YAAM,SAAS,iBAAiB,KAAK;AACrC,UAAI,QAAQ,MAAM;AAChB,mBAAW,KAAK,MAAM;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,WAAW,CAAC;AACrB;AAEA,SAAS,SAAS,OAAgB,OAA+C,KAAc,QAAQ,GAAS;AAC9G,MAAI,QAAQ,GAAG;AACb;AAAA,EACF;AAEA,QAAM,OAAO,GAAG;AAEhB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,QAAQ,MAAM,MAAM,GAAG,GAAG,GAAG;AACtC,eAAS,MAAM,OAAO,QAAW,QAAQ,CAAC;AAAA,IAC5C;AACA;AAAA,EACF;AAEA,MAAI,aAAa,KAAK,GAAG;AACvB,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG;AACxE,eAAS,YAAY,OAAO,UAAU,QAAQ,CAAC;AAAA,IACjD;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAuB;AACjD,MAAI,QAAQ,KAAK,IAAI,MAAM,QAAQ,GAAG;AACtC,MAAI,MAAM,UAAU,MAAM,MAAM,UAAU,KAAK;AAC7C,aAAS;AAAA,EACX;AACA,MAAI,iCAAiC,KAAK,KAAK,GAAG;AAChD,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAwC;AAC5D,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAIA,kBAAiB,EAAE,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAAA,EACpF;AAEA,QAAM,OAAOA,mBAAkB,KAAK;AACpC,SAAO,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO,IAAI,CAAC;AAC9E;AAEA,SAAS,iBAAiB,OAAoC;AAC5D,QAAM,SAAS,YAAY,KAAK;AAChC,MAAI,CAAC,QAAQ;AACX,UAAM,OAAOA,mBAAkB,KAAK;AACpC,WAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAC3B;AAEA,SAAO,iBAAiB;AAAA,IACtB,MAAMA,mBAAkB,OAAO,IAAI;AAAA,IACnC,KAAKA,mBAAkB,OAAO,GAAG;AAAA,IACjC,MAAMA,mBAAkB,OAAO,IAAI;AAAA,IACnC,QAAQ,eAAe,OAAO,MAAM;AAAA,EACtC,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAsC;AAChE,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,WAAW,MAAM,IAAI,gBAAgB,EAAE,OAAO,CAACC,YAA6B,QAAQA,OAAM,CAAC;AACjG,WAAO,SAAS,SAAS,IAAI,WAAW;AAAA,EAC1C;AAEA,QAAM,SAAS,iBAAiB,KAAK;AACrC,SAAO,SAAS,CAAC,MAAM,IAAI;AAC7B;AAEA,SAAS,YAAY,OAAwC;AAC3D,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,KAAK,YAAY;AAAA,EAChC;AAEA,SAAO,aAAa,KAAK,IAAI,QAAQ;AACvC;AAEA,SAAS,iBAAoB,SAAoC,QAA2E;AAC1I,aAAW,UAAU,SAAS;AAC5B,UAAM,QAAQ,OAAO,MAAM;AAC3B,QAAI,UAAU,QAAW;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,UAAoD;AACvE,SAAO,WAAW,CAAC;AACrB;AAEA,SAAS,oBAAsC,SAAoD;AACjG,SAAO,OAAO,OAAO,CAAC,GAAG,GAAG,QAAQ,OAAO,OAAO,CAAC;AACrD;AAEA,SAASD,mBAAkB,OAAoC;AAC7D,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,WAAO,MAAM,KAAK;AAAA,EACpB;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAIA,kBAAiB,EAAE,KAAK,OAAO;AAAA,EAClD;AAEA,MAAI,aAAa,KAAK,GAAG;AACvB,WAAOA,mBAAkB,MAAM,IAAI,KAAKA,mBAAkB,MAAM,GAAG,KAAKA,mBAAkB,MAAM,KAAK,CAAC;AAAA,EACxG;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAsC;AAC5D,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,SAASA,mBAAkB,KAAK;AACtC,WAAO,SAAS,CAAC,MAAM,IAAI;AAAA,EAC7B;AAEA,QAAM,SAAS,MAAM,IAAIA,kBAAiB,EAAE,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAC1F,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEA,SAAS,iBAAiB,OAA+C;AACvE,SAAO,OAAO,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE;AAChD;AAEA,SAAS,WAAW,KAAiC;AACnD,MAAI;AACF,WAAO,IAAI,IAAI,GAAG,EAAE,SAAS,QAAQ,UAAU,EAAE;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASH,eAAc,QAA6C;AAClE,SAAO,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,CAAC,CAAC;AAC/E;AAEA,SAAS,iBAAmC,OAAyB;AACnE,QAAM,UAAUE,gBAAe,KAAK;AACpC,SAAO,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AACrD;AAEA,SAASA,gBAAiC,OAAsB;AAC9D,SAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,SAAS,UAAa,SAAS,SAAS,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;AACxJ;AAEA,SAAS,aAAa,OAAqC;AACzD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASD,aAAY,OAA2B;AAC9C,MAAI,MAAM,WAAW,WAAW;AAC9B,UAAM,UAAU,OAAO,MAAM,UAAU,YAAY,WAAW,MAAM,SAAS,UAAU;AACvF,UAAM,iBAAiB,OAAO,MAAM,UAAU,mBAAmB,WAAW,MAAM,SAAS,iBAAiB;AAC5G,WAAO,iBAAiB,GAAG,OAAO,KAAK,cAAc,MAAM;AAAA,EAC7D;AAEA,SAAO,MAAM;AACf;;;AC74BO,IAAM,iBAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,OAAO,KAAK;AACV,WAAO,YAAY,KAAK,CAAC,eAAe,YAAY,sBAAsB,CAAC;AAAA,EAC7E;AAAA,EACA,UAAU,KAAK;AACb,WAAO,KAAK,SAAS,GAAG,KAAK;AAAA,EAC/B;AAAA,EACA,QAAQ,SAAS;AACf,UAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ;AACpC,UAAM,UAAU,kBAAkB,GAAG;AACrC,UAAM,aAAa,qBAAqB,GAAG;AAC3C,UAAM,kBAAkB,0BAA0B,GAAG;AACrD,UAAM,iBAAiB,wBAAwB,SAAS,EAAE,SAAS,YAAY,gBAAgB,CAAC;AAChG,UAAM,uBAAuB,8BAA8B,OAAO;AAClE,UAAM,UAAU,kBAAkB,SAAS,CAAC,UAAU,oBAAoB,WAAW,OAAO,CAAC;AAC7F,UAAM,iBAAiB,aAAa,sBAAsB,OAAO,IAAI,CAAC;AACtE,UAAM,iBAAiB,sBAAsB;AAE7C,WAAO,qBAAqB;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM,aAAa,aAAa,kBAAkB,gBAAgB;AAAA,MAClE,UAAU;AAAA,MACV,cAAc,UAAU,mCAAmC,OAAO,KAAK,QAAQ,IAAI,UAAU;AAAA,MAC7F,OAAO,eAAe;AAAA,MACtB,aAAa,qBAAqB;AAAA,MAClC,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,gBAAgB;AAAA,MAC3E,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,gBAAgB;AAAA,MAC3E,QAAQ;AAAA,MACR,SAAS,EAAE,eAAe,yBAAyB,OAAO,EAAE;AAAA,MAC5D,OAAO,UACH;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,eAAe;AAAA,QACtB;AAAA,QACA,eAAe,yBAAyB,OAAO;AAAA,QAC/C,UAAU,mBAAmB,SAAS,CAAC,YAAY,iBAAiB,kBAAkB,CAAC;AAAA,QACvF,MAAM,iBAAiB,SAAS,CAAC,QAAQ,UAAU,CAAC;AAAA,QACpD,UAAU,mBAAmB,SAAS,CAAC,UAAU,CAAC;AAAA,QAClD,WAAW,kBAAkB,SAAS,CAAC,aAAa,OAAO,CAAC;AAAA,MAC9D,IACA;AAAA,MACJ,UAAU,aACN;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,gCAAgC,OAAO,KAAK,QAAQ,IAAI,UAAU;AAAA,QACzE;AAAA,QACA,QAAQ;AAAA,MACV,IACA;AAAA,MACJ,aAAa,EAAE,SAAS,YAAY,gBAAgB;AAAA,MACpD,KAAK;AAAA,QACH;AAAA,QACA,kBAAkB,eAAe,UAAU,qBAAqB,UAAU;AAAA,MAC5E;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EACA,UAAU,SAAS;AACjB,WAAO,wBAAwB,OAAO;AAAA,EACxC;AACF;AAEO,IAAM,gBAA8C;AAAA,EACzD,MAAM;AAAA,EACN,OAAO,KAAK;AACV,WAAO,YAAY,KAAK,CAAC,cAAc,SAAS,CAAC;AAAA,EACnD;AAAA,EACA,UAAU,KAAK;AACb,WAAO,KAAK,SAAS,GAAG,KAAK;AAAA,EAC/B;AAAA,EACA,QAAQ,SAAS;AACf,UAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ;AACpC,UAAM,SAAS,eAAe,GAAG;AACjC,UAAM,WAAW,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AACzE,UAAM,iBAAiB,uBAAuB,OAAO;AACrD,UAAM,uBAAuB,6BAA6B,OAAO;AACjE,UAAM,iBAAiB,qBAAqB;AAE5C,WAAO,qBAAqB;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM,OAAO,SAAS,gBAAgB;AAAA,MACtC,UAAU;AAAA,MACV,cAAc,QAAQ,IAAI,UAAU,OAAO,QAAQ,IAAI,KAAK;AAAA,MAC5D,OAAO,iBAAiB,eAAe,KAAK;AAAA,MAC5C,aAAa,uBAAuB,qBAAqB,KAAK;AAAA,MAC9D,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,eAAe;AAAA,MAC1E,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,eAAe;AAAA,MAC1E,QAAQ,WAAW,EAAE,MAAM,SAAS,IAAI,kBAAkB,SAAS,CAAC,UAAU,aAAa,MAAM,CAAC;AAAA,MAClG,SAAS,EAAE,eAAe,yBAAyB,OAAO,EAAE;AAAA,MAC5D,aAAa,EAAE,WAAW,OAAO,WAAW,QAAQ,OAAO,QAAQ,UAAU,OAAO,SAAS;AAAA,MAC7F,KAAK;AAAA,QACH,GAAG;AAAA,QACH;AAAA,QACA,kBAAkB,eAAe,UAAU,qBAAqB,UAAU;AAAA,MAC5E;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EACA,UAAU,SAAS;AACjB,WAAO,wBAAwB,OAAO;AAAA,EACxC;AACF;AAEO,IAAM,mBAAiD;AAAA,EAC5D,MAAM;AAAA,EACN,OAAO,KAAK;AACV,WAAO,YAAY,KAAK,CAAC,iBAAiB,QAAQ,CAAC;AAAA,EACrD;AAAA,EACA,UAAU,KAAK;AACb,WAAO,KAAK,SAAS,GAAG,KAAK;AAAA,EAC/B;AAAA,EACA,QAAQ,SAAS;AACf,UAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ;AACpC,UAAM,QAAQ,IAAI,SAAS,MAAM,gBAAgB,IAAI,CAAC;AAEtD,WAAO,qBAAqB;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM,SAAS,YAAY,KAAK,CAAC,QAAQ,CAAC,IAAI,gBAAgB;AAAA,MAC9D,UAAU;AAAA,MACV,cAAc,QAAQ,IAAI,UAAU;AAAA,MACpC,OAAO,iBAAiB,SAAS,CAAC,SAAS,YAAY,aAAa,YAAY,MAAM,CAAC;AAAA,MACvF,aAAa,uBAAuB,OAAO;AAAA,MAC3C,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,kBAAkB;AAAA,MAC7E,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,kBAAkB;AAAA,MAC7E,QAAQ,kBAAkB,SAAS,CAAC,UAAU,UAAU,WAAW,SAAS,MAAM,CAAC;AAAA,MACnF,SAAS,EAAE,eAAe,yBAAyB,OAAO,EAAE;AAAA,MAC5D,aAAa,EAAE,MAAM;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EACA,UAAU,SAAS;AACjB,WAAO,wBAAwB,OAAO;AAAA,EACxC;AACF;AAEO,IAAM,iBAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,OAAO,KAAK;AACV,WAAO,YAAY,KAAK,CAAC,aAAa,CAAC;AAAA,EACzC;AAAA,EACA,UAAU,KAAK;AACb,WAAO,KAAK,SAAS,GAAG,KAAK;AAAA,EAC/B;AAAA,EACA,QAAQ,SAAS;AACf,UAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ;AACpC,UAAM,YAAY,IAAI,SAAS,MAAM,kBAAkB,IAAI,CAAC;AAE5D,WAAO,qBAAqB;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM,YAAY,UAAU;AAAA,MAC5B,UAAU;AAAA,MACV,cAAc,QAAQ,IAAI,UAAU;AAAA,MACpC,OAAO,iBAAiB,SAAS,CAAC,SAAS,gBAAgB,QAAQ,UAAU,CAAC;AAAA,MAC9E,aAAa,uBAAuB,OAAO;AAAA,MAC3C,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,gBAAgB;AAAA,MAC3E,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,gBAAgB;AAAA,MAC3E,QAAQ,kBAAkB,SAAS,CAAC,UAAU,UAAU,WAAW,MAAM,CAAC;AAAA,MAC1E,SAAS,EAAE,eAAe,yBAAyB,OAAO,EAAE;AAAA,MAC5D,KAAK,EAAE,UAAU;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EACA,UAAU,SAAS;AACjB,WAAO,wBAAwB,OAAO;AAAA,EACxC;AACF;AAEO,IAAM,gBAA8C;AAAA,EACzD,MAAM;AAAA,EACN,OAAO,KAAK;AACV,WAAO,YAAY,KAAK,CAAC,YAAY,CAAC;AAAA,EACxC;AAAA,EACA,UAAU,KAAK;AACb,WAAO,KAAK,SAAS,GAAG,KAAK;AAAA,EAC/B;AAAA,EACA,QAAQ,SAAS;AACf,WAAO,aAAa,OAAO;AAAA,EAC7B;AAAA,EACA,UAAU,SAAS;AACjB,WAAO,wBAAwB,OAAO;AAAA,EACxC;AACF;AAEO,IAAM,kBAAgD;AAAA,EAC3D,MAAM;AAAA,EACN,OAAO,KAAK;AACV,WAAO,YAAY,KAAK,CAAC,gBAAgB,UAAU,CAAC;AAAA,EACtD;AAAA,EACA,UAAU,KAAK;AACb,WAAO,KAAK,SAAS,GAAG,KAAK;AAAA,EAC/B;AAAA,EACA,QAAQ,SAAS;AACf,UAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ;AACpC,UAAM,SAAS,+CAA+C,KAAK,IAAI,QAAQ,KAAK,IAAI,aAAa,IAAI,YAAY;AACrH,UAAM,UAAU,IAAI,SAAS,SAAS,WAAW,KAAK,IAAI,aAAa,IAAI,MAAM;AACjF,UAAM,SAAS,IAAI,aAAa,IAAI,YAAY,KAAK,IAAI,SAAS,MAAM,kCAAkC,IAAI,CAAC;AAC/G,UAAM,QAAQ,iBAAiB,OAAO;AAEtC,WAAO,qBAAqB;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM,UAAU,UAAU,UAAU,MAAM,OAAO,SAAS,KAAK,MAAM,OAAO,SAAS,IAAI,gBAAgB;AAAA,MACzG,UAAU;AAAA,MACV,cAAc,QAAQ,IAAI,UAAU;AAAA,MACpC,OAAO,iBAAiB,SAAS,CAAC,SAAS,YAAY,MAAM,CAAC;AAAA,MAC9D,aAAa,uBAAuB,OAAO;AAAA,MAC3C,QAAQ,iBAAiB,MAAM,QAAQ,iBAAiB;AAAA,MACxD,QAAQ,iBAAiB,MAAM,QAAQ,iBAAiB;AAAA,MACxD,QAAQ,kBAAkB,SAAS,CAAC,UAAU,SAAS,WAAW,MAAM,CAAC;AAAA,MACzE,SAAS,EAAE,eAAe,yBAAyB,OAAO,EAAE;AAAA,MAC5D,aAAa,EAAE,OAAO;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EACA,UAAU,SAAS;AACjB,WAAO,wBAAwB,OAAO;AAAA,EACxC;AACF;AAEO,IAAM,iBAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,OAAO,KAAK;AACV,WAAO,YAAY,KAAK,CAAC,eAAe,SAAS,MAAM,CAAC;AAAA,EAC1D;AAAA,EACA,UAAU,KAAK;AACb,WAAO,KAAK,SAAS,GAAG,KAAK;AAAA,EAC/B;AAAA,EACA,QAAQ,SAAS;AACf,UAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ;AACpC,UAAM,WAAW,IAAI,SAAS,MAAM,wBAAwB,IAAI,CAAC;AAEjE,WAAO,qBAAqB;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM,YAAY,YAAY,KAAK,CAAC,MAAM,CAAC,IAAI,gBAAgB;AAAA,MAC/D,UAAU;AAAA,MACV,cAAc,QAAQ,IAAI,UAAU;AAAA,MACpC,OAAO,iBAAiB,SAAS,CAAC,SAAS,aAAa,QAAQ,UAAU,CAAC;AAAA,MAC3E,aAAa,uBAAuB,OAAO;AAAA,MAC3C,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,gBAAgB;AAAA,MAC3E,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,gBAAgB;AAAA,MAC3E,QAAQ,kBAAkB,SAAS,CAAC,UAAU,QAAQ,eAAe,SAAS,CAAC;AAAA,MAC/E,SAAS,EAAE,eAAe,yBAAyB,OAAO,EAAE;AAAA,MAC5D,aAAa,EAAE,SAAS;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EACA,UAAU,SAAS;AACjB,WAAO,wBAAwB,OAAO;AAAA,EACxC;AACF;AAEO,IAAM,mBAAiD;AAAA,EAC5D,MAAM;AAAA,EACN,OAAO,KAAK;AACV,WAAO,YAAY,KAAK,CAAC,eAAe,CAAC;AAAA,EAC3C;AAAA,EACA,UAAU,KAAK;AACb,WAAO,KAAK,SAAS,GAAG,KAAK;AAAA,EAC/B;AAAA,EACA,QAAQ,SAAS;AACf,UAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ;AACpC,UAAM,YAAY,IAAI,SAAS,MAAM,0BAA0B,IAAI,CAAC;AAEpE,WAAO,qBAAqB;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM,YAAY,gBAAgB;AAAA,MAClC,UAAU;AAAA,MACV,cAAc,QAAQ,IAAI,UAAU;AAAA,MACpC,OAAO,iBAAiB,SAAS,CAAC,SAAS,WAAW,yBAAyB,UAAU,CAAC;AAAA,MAC1F,aAAa,uBAAuB,OAAO;AAAA,MAC3C,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,kBAAkB;AAAA,MAC7E,QAAQ,iBAAiB,iBAAiB,OAAO,EAAE,QAAQ,kBAAkB;AAAA,MAC7E,QAAQ,kBAAkB,SAAS,CAAC,SAAS,UAAU,QAAQ,UAAU,CAAC;AAAA,MAC1E,SAAS,EAAE,eAAe,yBAAyB,OAAO,EAAE;AAAA,MAC5D,aAAa,EAAE,UAAU;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EACA,UAAU,SAAS;AACjB,WAAO,wBAAwB,OAAO;AAAA,EACxC;AACF;AAEO,IAAM,kBAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,wBAAkC;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBACP,SACA,KACe;AACf,QAAM,mBAAmB,wBAAwB,SAAS,CAAC,QAAQ,UAAU,CAAC;AAC9E,MAAI,kBAAkB;AACpB,WAAO,EAAE,OAAO,kBAAkB,QAAQ,qCAAqC;AAAA,EACjF;AAEA,QAAM,cAAc,oBAAoB,SAAS,CAAC,sBAAsB,6CAA6C,CAAC;AACtH,MAAI,aAAa;AACf,WAAO,EAAE,OAAO,aAAa,QAAQ,kCAAkC;AAAA,EACzE;AAEA,QAAM,mBAAmB,wBAAwB,SAAS,GAAG;AAC7D,MAAI,kBAAkB;AACpB,WAAO,EAAE,OAAO,kBAAkB,QAAQ,wBAAwB;AAAA,EACpE;AAEA,MAAI,QAAQ,IAAI,UAAU,OAAO;AAC/B,WAAO,EAAE,OAAO,QAAQ,IAAI,UAAU,OAAO,QAAQ,oBAAoB;AAAA,EAC3E;AAEA,MAAI,QAAQ,IAAI,QAAQ,OAAO;AAC7B,WAAO,EAAE,OAAO,QAAQ,IAAI,QAAQ,OAAO,QAAQ,kBAAkB;AAAA,EACvE;AAEA,SAAO,EAAE,OAAO,sBAAsB,QAAQ,IAAI,KAAK,KAAK,GAAG,QAAQ,QAAQ,IAAI,KAAK,QAAQ,iBAAiB,OAAU;AAC7H;AAEA,SAAS,8BAA8B,SAAwC;AAC7E,QAAM,yBAAyB,wBAAwB,SAAS,CAAC,aAAa,CAAC;AAC/E,MAAI,wBAAwB;AAC1B,WAAO,EAAE,OAAO,wBAAwB,QAAQ,qCAAqC;AAAA,EACvF;AAEA,QAAM,oBAAoB,oBAAoB,SAAS;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,mBAAmB;AACrB,WAAO,EAAE,OAAO,mBAAmB,QAAQ,kCAAkC;AAAA,EAC/E;AAEA,QAAM,yBAAyB,8BAA8B,OAAO;AACpE,MAAI,wBAAwB;AAC1B,WAAO,EAAE,OAAO,wBAAwB,QAAQ,wBAAwB;AAAA,EAC1E;AAEA,MAAI,QAAQ,IAAI,UAAU,aAAa;AACrC,WAAO,EAAE,OAAO,QAAQ,IAAI,UAAU,aAAa,QAAQ,oBAAoB;AAAA,EACjF;AAEA,MAAI,QAAQ,IAAI,QAAQ,aAAa;AACnC,WAAO,EAAE,OAAO,QAAQ,IAAI,QAAQ,aAAa,QAAQ,kBAAkB;AAAA,EAC7E;AAEA,SAAO,EAAE,OAAO,QAAQ,IAAI,KAAK,aAAa,QAAQ,QAAQ,IAAI,KAAK,cAAc,iBAAiB,OAAU;AAClH;AAEA,SAAS,uBAAiC;AACxC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,SAAwC;AACtE,QAAM,WAAW,4BAA4B,SAAS,CAAC,mBAAmB,cAAc,gBAAgB,kBAAkB,UAAU,GAAG;AAAA,IACrI;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,UAAU;AACZ,WAAO,EAAE,OAAO,UAAU,QAAQ,6BAA6B,OAAO,IAAI,wBAAwB,gCAAgC;AAAA,EACpI;AAEA,QAAM,aAAa,mBAAmB,QAAQ,IAAI,OAAO,OAAO,CAAC,sBAAsB,0BAA0B,SAAS,GAAG,CAAC,YAAY,MAAM,CAAC;AACjJ,MAAI,YAAY;AACd,WAAO,EAAE,OAAO,YAAY,QAAQ,wBAAwB;AAAA,EAC9D;AAEA,MAAI,QAAQ,IAAI,UAAU,OAAO;AAC/B,WAAO,EAAE,OAAO,QAAQ,IAAI,UAAU,OAAO,QAAQ,mBAAmB;AAAA,EAC1E;AAEA,MAAI,QAAQ,IAAI,QAAQ,OAAO;AAC7B,WAAO,EAAE,OAAO,QAAQ,IAAI,QAAQ,OAAO,QAAQ,iBAAiB;AAAA,EACtE;AAEA,SAAO,EAAE,OAAO,QAAQ,IAAI,KAAK,OAAO,QAAQ,QAAQ,IAAI,KAAK,QAAQ,gBAAgB,OAAU;AACrG;AAEA,SAAS,6BAA6B,SAAwC;AAC5E,QAAM,WAAW,4BAA4B,SAAS,CAAC,mBAAmB,cAAc,gBAAgB,kBAAkB,UAAU,GAAG;AAAA,IACrI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,UAAU;AACZ,WAAO,EAAE,OAAO,UAAU,QAAQ,6BAA6B,OAAO,IAAI,wBAAwB,gCAAgC;AAAA,EACpI;AAEA,QAAM,aAAa,mBAAmB,QAAQ,IAAI,OAAO,OAAO,CAAC,sBAAsB,0BAA0B,SAAS,GAAG,CAAC,eAAe,aAAa,CAAC;AAC3J,MAAI,YAAY;AACd,WAAO,EAAE,OAAO,YAAY,QAAQ,wBAAwB;AAAA,EAC9D;AAEA,MAAI,QAAQ,IAAI,UAAU,aAAa;AACrC,WAAO,EAAE,OAAO,QAAQ,IAAI,UAAU,aAAa,QAAQ,mBAAmB;AAAA,EAChF;AAEA,MAAI,QAAQ,IAAI,QAAQ,aAAa;AACnC,WAAO,EAAE,OAAO,QAAQ,IAAI,QAAQ,aAAa,QAAQ,iBAAiB;AAAA,EAC5E;AAEA,SAAO,EAAE,OAAO,QAAQ,IAAI,KAAK,aAAa,QAAQ,QAAQ,IAAI,KAAK,cAAc,gBAAgB,OAAU;AACjH;AAEA,SAAS,aAAa,SAA0C;AAC9D,QAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ;AACpC,QAAM,WAAW,IAAI,SAAS,MAAM,UAAU,IAAI,CAAC;AACnD,QAAM,SAAS,IAAI,SAAS,MAAM,4BAA4B,IAAI,CAAC,KAAK,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE;AACrH,QAAM,aAAa,4BAA4B,SAAS,MAAM;AAC9D,QAAM,iBAAiB,uBAAuB,SAAS,YAAY,QAAQ;AAC3E,QAAM,uBAAuB,6BAA6B,SAAS,UAAU;AAC7E,QAAM,SAAS,2BAA2B,YAAY,QAAQ;AAC9D,QAAM,QAAQ,uBAAuB,SAAS,UAAU;AACxD,QAAM,gBAAgB,oBAAoB,UAAU,KAAK,yBAAyB,OAAO;AAEzF,SAAO,qBAAqB;AAAA,IAC1B,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc,QAAQ,IAAI,UAAU;AAAA,IACpC,OAAO,eAAe;AAAA,IACtB,aAAa,qBAAqB;AAAA,IAClC,QAAQ,iBAAiB,MAAM,QAAQ,eAAe;AAAA,IACtD,QAAQ,iBAAiB,MAAM,QAAQ,eAAe;AAAA,IACtD;AAAA,IACA,SAAS,EAAE,cAAc;AAAA,IACzB,OAAO,SACH;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,eAAe;AAAA,MACtB,SAAS;AAAA,MACT;AAAA,MACA,UAAU,oBAAoB,UAAU;AAAA,MACxC,WAAW,gBAAgB,YAAY,WAAW;AAAA,IACpD,IACA;AAAA,IACJ,aAAa,EAAE,UAAU,OAAO;AAAA,IAChC,KAAK;AAAA,MACH,kBAAkB,eAAe,UAAU,qBAAqB,UAAU;AAAA,IAC5E;AAAA,EACF,CAAC;AACH;AAEA,SAAS,uBAAuB,SAAyB,YAAoC,UAA6C;AACxI,QAAM,OAAO,gBAAgBI,mBAAkB,YAAY,IAAI,CAAC;AAChE,MAAI,MAAM;AACR,WAAO,EAAE,OAAO,MAAM,QAAQ,yBAAyB;AAAA,EACzD;AAEA,QAAM,aAAa,iBAAiB,UAAU;AAC9C,MAAI,YAAY;AACd,WAAO,EAAE,OAAO,YAAY,QAAQ,0BAA0B;AAAA,EAChE;AAEA,QAAM,WAAW,gBAAgB,iBAAiB,SAAS,CAAC,QAAQ,WAAW,SAAS,aAAa,CAAC,CAAC;AACvG,MAAI,UAAU;AACZ,WAAO,EAAE,OAAO,UAAU,QAAQ,kBAAkB;AAAA,EACtD;AAEA,SAAO;AAAA,IACL,OAAO,WAAW,mBAAmB,QAAQ,KAAK;AAAA,IAClD,QAAQ,WAAW,uBAAuB;AAAA,EAC5C;AACF;AAEA,SAAS,6BAA6B,SAAyB,YAAmD;AAChH,QAAM,OAAO,gBAAgBA,mBAAkB,YAAY,IAAI,CAAC;AAChE,MAAI,MAAM;AACR,WAAO,EAAE,OAAO,MAAM,QAAQ,yBAAyB;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,OAAO,gBAAgB,uBAAuB,OAAO,CAAC;AAAA,IACtD,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,4BAA4B,SAAyB,QAAoD;AAChH,aAAW,QAAQ,QAAQ,IAAI,aAAa,OAAO;AACjD,UAAM,eAAeC,UAAS,KAAK,KAAK,mBAAmB,CAAC,IAAI,KAAK,KAAK,mBAAmB,IAAI;AACjG,UAAM,cAAcA,UAAS,eAAe,qBAAqB,CAAC,IAAI,aAAa,qBAAqB,IAAI;AAC5G,UAAM,WAAWA,UAAS,aAAa,QAAQ,IAAI,YAAY,WAAW;AAC1E,UAAM,aAAaA,UAAS,UAAU,UAAU,IAAI,SAAS,aAAa;AAE1E,QAAI,eAAe,CAAC,UAAUD,mBAAkB,WAAW,EAAE,MAAM,SAAS;AAC1E,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI;AACJ,aAAW,QAAQ,QAAQ,IAAI,aAAa,OAAO;AACjD,aAAS,KAAK,MAAM,CAAC,OAAO,QAAQ;AAClC,UAAI,SAAS,QAAQ,gBAAgB,CAACC,UAAS,KAAK,GAAG;AACrD;AAAA,MACF;AAEA,UAAI,CAAC,UAAUD,mBAAkB,MAAM,EAAE,MAAM,QAAQ;AACrD,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAED,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,SAAyB,YAAoF;AAC3I,QAAM,aAAa,iBAAiB,OAAO;AAE3C,SAAO;AAAA,IACL,QAAQ,CAAC,GAAG,2BAA2B,UAAU,GAAG,GAAG,WAAW,MAAM;AAAA,IACxE,QAAQ,CAAC,GAAG,2BAA2B,UAAU,GAAG,GAAG,WAAW,MAAM;AAAA,EAC1E;AACF;AAEA,SAAS,2BAA2B,YAAkD;AACpF,QAAM,QAAQC,UAAS,YAAY,KAAK,IAAI,WAAW,QAAQ;AAC/D,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,kBAAkB,MAAM,KAAK;AAC3C,QAAM,SAAS,kBAAkB,MAAM,MAAM;AAC7C,QAAM,aAAa;AAAA,IACjBD,mBAAkB,MAAM,WAAW;AAAA,IACnCA,mBAAkB,MAAM,KAAK;AAAA,IAC7BA,mBAAkB,MAAM,YAAY;AAAA,IACpC,GAAG,gBAAgB,MAAM,UAAU;AAAA,EACrC;AAEA,SAAOE,eAAc,UAAU,EAAE,IAAI,CAAC,SAAS;AAAA,IAC7C;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,UAAU;AAAA,MACR,iBAAiB;AAAA,IACnB;AAAA,EACF,EAAE;AACJ;AAEA,SAAS,2BAA2B,YAAkD;AACpF,QAAM,QAAQD,UAAS,YAAY,KAAK,IAAI,WAAW,QAAQ;AAC/D,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,kBAAkB,MAAM,KAAK;AAC3C,QAAM,SAAS,kBAAkB,MAAM,MAAM;AAC7C,QAAM,aAAa;AAAA,IACjBD,mBAAkB,MAAM,QAAQ;AAAA,IAChCA,mBAAkB,MAAM,YAAY;AAAA,IACpC,GAAG,uBAAuB,MAAM,cAAc;AAAA,IAC9C,GAAI,MAAM,QAAQ,MAAM,WAAW,IAC/B,MAAM,YAAY,QAAQ,CAAC,SAAUC,UAAS,IAAI,IAAI,uBAAuB,KAAK,QAAQ,IAAI,CAAC,CAAE,IACjG,CAAC;AAAA,EACP;AAEA,SAAOC,eAAc,UAAU,EAC5B,OAAO,CAAC,QAAQ,gBAAgB,KAAK,GAAG,CAAC,EACzC,IAAI,CAAC,SAAS;AAAA,IACb;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,UAAU;AAAA,MACR,iBAAiB;AAAA,IACnB;AAAA,EACF,EAAE;AACN;AAEA,SAAS,uBAAuB,OAA0B;AACxD,MAAI,CAACD,UAAS,KAAK,GAAG;AACpB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,gBAAgB,MAAM,OAAO;AACtC;AAEA,SAAS,2BAA2B,YAAoC,UAAkD;AACxH,QAAM,SAASA,UAAS,YAAY,MAAM,IAAI,WAAW,SAAS;AAClE,QAAM,OACJD,mBAAkB,QAAQ,QAAQ,KAClCA,mBAAkB,QAAQ,QAAQ,KAClC;AAEF,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,KAAK,WAAW,2BAA2B,QAAQ,KAAK;AAAA,EAC1D;AACF;AAEA,SAAS,oBAAoB,YAAwD;AACnF,QAAM,UAAU,kBAAkB,YAAY,UAAU;AACxD,SAAO,UAAU,IAAI,KAAK,UAAU,GAAI,EAAE,YAAY,IAAI;AAC5D;AAEA,SAAS,oBAAoB,YAAwD;AACnF,QAAM,QAAQC,UAAS,YAAY,KAAK,IAAI,WAAW,QAAQ;AAC/D,SAAOD,mBAAkB,OAAO,QAAQ;AAC1C;AAEA,SAAS,gBAAgB,YAAoC,KAAiC;AAC5F,QAAM,QAAQC,UAAS,YAAY,KAAK,IAAI,WAAW,QAAQ;AAC/D,SAAO,kBAAkB,QAAQ,GAAG,CAAC;AACvC;AAEA,SAAS,iBAAiB,YAAwD;AAChF,QAAM,QAAQA,UAAS,YAAY,KAAK,IAAI,WAAW,QAAQ;AAC/D,QAAM,QAAQ,gBAAgBD,mBAAkB,OAAO,KAAK,CAAC;AAC7D,QAAM,SAAS,gBAAgBA,mBAAkB,OAAO,UAAU,CAAC;AAEnE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,CAAC,kBAAkB,KAAK,KAAK,GAAG;AAC5C,WAAO,GAAG,KAAK,MAAM,MAAM;AAAA,EAC7B;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA+C;AACtE,QAAM,UAAU,OAAO,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACjD,MAAI,CAAC,WAAW,uBAAuB,OAAO,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAwB;AACtD,SACE,YAAY,KAAK,KAAK,KACtB,oEAAoE,KAAK,KAAK,KAC9E,kCAAkC,KAAK,KAAK,KAC5C,gCAAgC,KAAK,KAAK,KAC1C,qDAAqD,KAAK,KAAK;AAEnE;AAEA,SAAS,gBAAgB,OAA0B;AACjD,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,WAAO,CAAC,MAAM,KAAK,CAAC;AAAA,EACtB;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,QAAQ,eAAe;AAAA,EACtC;AAEA,SAAO,CAAC;AACV;AAEA,SAASE,eAAc,QAA6C;AAClE,SAAO,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,CAAC,CAAC;AAC/E;AAEA,SAAS,wBAAwB,SAAmD;AAClF,QAAM,OAAO,QAAQ,QAAQ,iBAAiB,OAAO;AAErD,SAAO,qBAAqB;AAAA,IAC1B,GAAG;AAAA,IACH;AAAA,IACA,KAAK;AAAA,MACH,GAAI,QAAQ,OAAO,CAAC;AAAA,MACpB,UAAU,QAAQ;AAAA,MAClB,aAAa,QAAQ;AAAA,IACvB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,iBAAiB,SAAwC;AAChE,OAAK,QAAQ,QAAQ,UAAU,KAAK,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,OAAK,QAAQ,QAAQ,UAAU,KAAK,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAsB,aAAmC;AACjF,QAAM,OAAO,oBAAI,IAAY;AAE7B,SAAO,OAAO,OAAO,CAAC,UAAU;AAC9B,QAAI,KAAK,IAAI,MAAM,GAAG,GAAG;AACvB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,MAAM,GAAG;AAClB,WAAO;AAAA,EACT,CAAC,EAAE,IAAI,CAAC,WAAW;AAAA,IACjB,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,UAAU;AAAA,MACR,GAAG,MAAM;AAAA,MACT,SAAS;AAAA,MACT,gBAAgB,MAAM;AAAA,IACtB;AAAA,EACF,EAAE;AACN;AAEA,SAAS,wBAAwB,SAAyB,MAAoC;AAC5F,SAAO,mBAAmB,QAAQ,IAAI,OAAO,OAAO,CAAC,aAAa,GAAG,IAAI;AAC3E;AAEA,SAAS,mBAAmB,OAAqB,OAAiB,MAAoC;AACpG,aAAW,QAAQ,OAAO;AACxB,QAAI,CAACC,eAAc,MAAM,KAAK,GAAG;AAC/B;AAAA,IACF;AAEA,eAAW,OAAO,MAAM;AACtB,YAAM,QAAQH,mBAAkB,KAAK,GAAG,CAAC;AACzC,UAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASG,eAAc,MAAkB,OAA0B;AACjE,QAAM,YAAY,MAAM,QAAQ,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,OAAO,CAAC;AAC/E,SAAO,UAAU,KAAK,CAAC,SAAS,OAAO,SAAS,YAAY,MAAM,KAAK,CAAC,cAAc,KAAK,YAAY,EAAE,SAAS,UAAU,YAAY,CAAC,CAAC,CAAC;AAC7I;AAEA,SAAS,oBAAoB,SAAyB,OAAqC;AACzF,aAAW,QAAQ,QAAQ,IAAI,aAAa,OAAO;AACjD,QAAI,KAAK,WAAW,yBAAyB;AAC3C;AAAA,IACF;AAEA,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQH,mBAAkB,YAAY,KAAK,MAAM,IAAI,CAAC;AAC5D,UAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBACP,SACA,KACoB;AACpB,QAAM,QAAQ,QAAQ,IAAI,aAAa,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,oBAAoB;AAElG,QAAM,UAAU,iBAAiB,OAAO,CAAC,4BAA4B,eAAe,GAAG,CAAC,OAAO,CAAC;AAChG,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,SAAS;AACf,UAAM,gBAAgB,8BAA8B,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC;AACjF,QAAI,eAAe;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,IAAI,iBAAiB;AACvB,UAAM,gBACJ,4BAA4B,SAAS,CAAC,oBAAoB,GAAG,CAAC,aAAa,CAAC,KAC5E,iBAAiB,OAAO,CAAC,yBAAyB,cAAc,GAAG,CAAC,eAAe,OAAO,CAAC;AAC7F,QAAI,eAAe;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,IAAI,cAAc,CAAC,IAAI,SAAS;AAClC,WAAO,iBAAiB,OAAO,CAAC,4BAA4B,wBAAwB,GAAG,CAAC,SAAS,iBAAiB,MAAM,CAAC;AAAA,EAC3H;AAEA,SAAO;AACT;AAEA,SAAS,8BAA8B,SAA6C;AAClF,QAAM,QAAQ,QAAQ,IAAI,aAAa,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,oBAAoB;AAClG,SAAO,iBAAiB,OAAO,CAAC,0CAA0C,8BAA8B,eAAe,GAAG;AAAA,IACxH;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gCAAgC,SAA6C;AACpF,QAAM,QAAQ,QAAQ,IAAI,aAAa,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,oBAAoB;AAClG,SAAO,iBAAiB,OAAO,CAAC,4BAA4B,wBAAwB,GAAG,CAAC,SAAS,iBAAiB,MAAM,CAAC;AAC3H;AAEA,SAAS,iBAAiB,OAAoC,cAAwB,UAAwC;AAC5H,aAAW,QAAQ,OAAO;AACxB,QAAI;AAEJ,aAAS,KAAK,MAAM,CAAC,OAAO,QAAQ;AAClC,UAAI,SAAS,CAAC,OAAO,CAAC,aAAa,SAAS,GAAG,KAAK,CAACC,UAAS,KAAK,GAAG;AACpE;AAAA,MACF;AAEA,iBAAW,WAAW,UAAU;AAC9B,gBAAQD,mBAAkB,MAAM,OAAO,CAAC;AACxC,YAAI,OAAO;AACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,8BAA8B,OAAoC,SAAiB,UAAwC;AAClI,aAAW,QAAQ,OAAO;AACxB,QAAI;AAEJ,aAAS,KAAK,MAAM,CAAC,UAAU;AAC7B,UAAI,SAAS,CAACC,UAAS,KAAK,KAAKD,mBAAkB,MAAM,OAAO,MAAM,SAAS;AAC7E;AAAA,MACF;AAEA,iBAAW,WAAW,UAAU;AAC9B,gBAAQA,mBAAkB,MAAM,OAAO,CAAC;AACxC,YAAI,OAAO;AACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,SAAyB,SAAmB,MAAoC;AACnH,QAAM,aAAuB,CAAC;AAE9B,aAAW,QAAQ,QAAQ,IAAI,aAAa,OAAO;AACjD,QAAI,CAAC,QAAQ,SAAS,KAAK,MAAM,GAAG;AAClC;AAAA,IACF;AAEA,aAAS,KAAK,MAAM,CAAC,OAAO,QAAQ;AAClC,UAAI,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI,GAAG;AAClC;AAAA,MACF;AAEA,YAAM,OAAOA,mBAAkB,KAAK;AACpC,UAAI,MAAM;AACR,mBAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,kBAAkB,UAAU;AACrC;AAEA,SAAS,6BAA6B,SAAkC;AACtE,SAAO,QAAQ,IAAI,aAAa,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,qBAAqB,KAAK,SAAS,sBAAsB;AAChI;AAEA,SAAS,YAAY,MAAe,MAAuB;AACzD,SAAO,KAAK,MAAM,GAAG,EAAE,OAAgB,CAAC,SAAS,QAASC,UAAS,OAAO,IAAI,QAAQ,GAAG,IAAI,QAAY,IAAI;AAC/G;AAEA,SAAS,sBAAsB,OAA+C;AAC5E,SAAO,OAAO,QAAQ,uBAAuB,EAAE,EAAE,KAAK;AACxD;AAEA,SAAS,iBAAiB,SAAyB,cAA4C;AAC7F,SAAO;AAAA,IACL,QAAQ,IAAI,UAAU;AAAA,IACtB,QAAQ,IAAI,QAAQ;AAAA,IACpB,mBAAmB,SAAS,YAAY;AAAA,IACxC,QAAQ,IAAI,KAAK;AAAA,EACnB;AACF;AAEA,SAAS,uBAAuB,SAA6C;AAC3E,SAAO;AAAA,IACL,QAAQ,IAAI,UAAU;AAAA,IACtB,QAAQ,IAAI,QAAQ;AAAA,IACpB,mBAAmB,SAAS,CAAC,eAAe,QAAQ,WAAW,WAAW,WAAW,MAAM,CAAC;AAAA,IAC5F,QAAQ,IAAI,KAAK;AAAA,EACnB;AACF;AAEA,SAAS,yBAAyB,SAA6C;AAC7E,SAAO;AAAA,IACL,QAAQ,IAAI,UAAU,SAAS;AAAA,IAC/B,iBAAiB,QAAQ,IAAI,OAAO,OAAO,CAAC,iBAAiB,cAAc,WAAW,CAAC;AAAA,IACvF,mBAAmB,SAAS,CAAC,iBAAiB,iBAAiB,gBAAgB,aAAa,cAAc,cAAc,WAAW,CAAC;AAAA,EACtI;AACF;AAEA,SAAS,iBAAiB,SAAyE;AACjG,QAAM,aAAa,cAAc,QAAQ,KAAK,QAAQ,QAAQ;AAC9D,SAAO;AAAA,IACL,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,kBAAkB,SAAyB,MAAoC;AACtF,QAAM,eAAe,oBAAoB,gBAAgB,QAAQ,IAAI,OAAO,OAAO,IAAI,CAAC;AACxF,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,aAAW,QAAQ,QAAQ,IAAI,aAAa,OAAO;AACjD,UAAM,SAAS,oBAAoBG,iBAAgB,KAAK,MAAM,IAAI,CAAC;AACnE,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAyB,MAAoC;AACvF,QAAM,aAAuB,CAAC;AAE9B,aAAW,QAAQ,QAAQ,IAAI,aAAa,OAAO;AACjD,aAAS,KAAK,MAAM,CAAC,OAAO,QAAQ;AAClC,UAAI,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI,GAAG;AAClC;AAAA,MACF;AAEA,YAAM,OAAOJ,mBAAkB,KAAK;AACpC,UAAI,MAAM;AACR,mBAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,kBAAkB,UAAU;AACrC;AAEA,SAAS,iBAAiB,OAAqB,MAAoC;AACjF,QAAM,QAAQ,gBAAgB,OAAO,IAAI;AACzC,SAAOA,mBAAkB,KAAK;AAChC;AAEA,SAAS,gBAAgB,OAAqB,MAAyB;AACrE,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQI,iBAAgB,MAAM,IAAI;AACxC,QAAI,UAAU,QAAW;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASA,iBAAgB,MAAe,MAAyB;AAC/D,MAAI;AAEJ,WAAS,MAAM,CAAC,OAAO,QAAQ;AAC7B,QAAI,UAAU,UAAa,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI,GAAG;AACzD;AAAA,IACF;AAEA,YAAQ;AAAA,EACV,CAAC;AAED,SAAO;AACT;AAEA,SAAS,SAAS,OAAgB,OAA+C,KAAc,QAAQ,GAAS;AAC9G,MAAI,QAAQ,GAAG;AACb;AAAA,EACF;AAEA,QAAM,OAAO,GAAG;AAEhB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,QAAQ,MAAM,MAAM,GAAG,GAAG,GAAG;AACtC,eAAS,MAAM,OAAO,QAAW,QAAQ,CAAC;AAAA,IAC5C;AACA;AAAA,EACF;AAEA,MAAIH,UAAS,KAAK,GAAG;AACnB,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG;AACxE,eAAS,YAAY,OAAO,UAAU,QAAQ,CAAC;AAAA,IACjD;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAAoC;AAC/D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,mBAAmB,EAAE,KAAK,OAAO;AAAA,EACpD;AAEA,MAAI,CAACA,UAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,OACJD,mBAAkB,MAAM,IAAI,KAC5BA,mBAAkB,MAAM,QAAQ,KAChCA,mBAAkB,MAAM,WAAW,KACnCA,mBAAkB,MAAM,gBAAgB,KACxCA,mBAAkB,MAAM,KAAK;AAE/B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,KAAKA,mBAAkB,MAAM,GAAG,KAAKA,mBAAkB,MAAM,YAAY;AAAA,IACzE,MAAMA,mBAAkB,MAAM,IAAI,KAAKA,mBAAkB,MAAM,MAAM,KAAKA,mBAAkB,MAAM,KAAK;AAAA,EACzG;AACF;AAEA,SAAS,aAAa,QAAuD;AAC3E,SAAO,kBAAkB,OAAO,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,CAAC;AACpF;AAEA,SAAS,kBAAkB,QAAsC;AAC/D,SAAO,OACJ,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAChD,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,EAClC,KAAK,CAAC,MAAM,UAAU,UAAU,KAAK,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;AAChE;AAEA,SAAS,UAAU,OAAuB;AACxC,MAAI,QAAQ,KAAK,IAAI,MAAM,QAAQ,GAAG;AACtC,MAAI,MAAM,UAAU,MAAM,MAAM,UAAU,KAAK;AAC7C,aAAS;AAAA,EACX;AACA,MAAI,iCAAiC,KAAK,KAAK,GAAG;AAChD,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAASA,mBAAkB,OAAoC;AAC7D,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,WAAO,MAAM,KAAK;AAAA,EACpB;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,SAAS,MAAM,IAAIA,kBAAiB,EAAE,OAAO,OAAO;AAC1D,WAAO,OAAO,SAAS,IAAI,OAAO,KAAK,EAAE,IAAI;AAAA,EAC/C;AAEA,MAAIC,UAAS,KAAK,GAAG;AACnB,WACED,mBAAkB,MAAM,IAAI,KAC5BA,mBAAkB,MAAM,UAAU,KAClCA,mBAAkB,MAAM,IAAI,KAC5BA,mBAAkB,MAAM,KAAK,KAC7BA,mBAAkB,MAAM,IAAI,KAC5BA,mBAAkB,MAAM,KAAK,KAC7BA,mBAAkB,MAAM,GAAG;AAAA,EAE/B;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,KAAa,MAAyB;AACxD,QAAM,aAAa,IAAI,YAAY;AACnC,SAAO,KAAK,KAAK,CAAC,cAAc,eAAe,UAAU,YAAY,KAAK,WAAW,SAAS,UAAU,YAAY,CAAC,CAAC;AACxH;AAEA,SAASC,UAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AASA,SAAS,eAAe,KAA0B;AAChD,QAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACpD,QAAM,gBAAgB,MAAM,QAAQ,UAAU;AAC9C,QAAM,cAAc,YAAY,KAAK,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,IAAI;AAE/D,SAAO;AAAA,IACL,QAAQ,kBAAkB,MAAM,QAAQ,WAAW;AAAA,IACnD,WAAW,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,IAAI;AAAA,IACzC,QAAQ,kBAAkB,KAAK,MAAM,gBAAgB,CAAC,IAAI;AAAA,IAC1D,UAAU,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,IAAI;AAAA,EAC7C;AACF;AAEA,SAAS,iBAAiB,OAA+C;AACvE,SAAO,OAAO,QAAQ,6BAA6B,EAAE,EAAE,KAAK;AAC9D;AAEA,SAAS,iBAAiB,OAA+C;AACvE,QAAM,UAAU,iBAAiB,KAAK;AACtC,MAAI,CAAC,WAAW,8FAA8F,KAAK,OAAO,GAAG;AAC3H,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,aAAqD;AACnF,QAAM,UAAU,aAAa,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD,MAAI,CAAC,WAAW,6EAA6E,KAAK,OAAO,GAAG;AAC1G,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,KAAU,SAA4B;AACzD,QAAM,OAAO,IAAI,SAAS,YAAY,EAAE,QAAQ,UAAU,EAAE;AAC5D,SAAO,QAAQ,KAAK,CAAC,WAAW,SAAS,UAAU,KAAK,SAAS,IAAI,MAAM,EAAE,CAAC;AAChF;AAEA,SAAS,kBAAkB,KAA8B;AACvD,QAAM,OAAO,IAAI,SAAS,YAAY,EAAE,QAAQ,UAAU,EAAE;AAE5D,MAAI,SAAS,YAAY;AACvB,WAAO,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,CAAC;AAAA,EAClD;AAEA,MAAI,IAAI,aAAa,UAAU;AAC7B,WAAO,IAAI,aAAa,IAAI,GAAG,KAAK;AAAA,EACtC;AAEA,QAAM,aAAa,IAAI,SAAS,MAAM,8BAA8B;AACpE,SAAO,aAAa,CAAC;AACvB;AAEA,SAAS,qBAAqB,KAA8B;AAC1D,SAAO,IAAI,aAAa,IAAI,MAAM,KAAK;AACzC;AAEA,SAAS,0BAA0B,KAA8B;AAC/D,SAAO,IAAI,SAAS,MAAM,kBAAkB,IAAI,CAAC;AACnD;AAEA,SAAS,sBAAsB,SAA6E;AAC1G,QAAM,SAAS,oBAAI,IAAyD;AAE5E,aAAW,QAAQ,QAAQ,IAAI,aAAa,OAAO;AACjD,aAAS,KAAK,MAAM,CAAC,UAAU;AAC7B,UAAI,CAACA,UAAS,KAAK,GAAG;AACpB;AAAA,MACF;AAEA,YAAM,UACJD,mBAAkB,MAAM,OAAO,KAC/BA,mBAAkB,MAAM,QAAQ,MAC/BC,UAAS,MAAM,aAAa,IAAID,mBAAkB,MAAM,cAAc,OAAO,IAAI,YACjFC,UAAS,MAAM,kBAAkB,KAAKA,UAAS,MAAM,mBAAmB,aAAa,IAClFD,mBAAkB,MAAM,mBAAmB,cAAc,OAAO,IAChE;AAEN,UAAI,CAAC,WAAW,OAAO,IAAI,OAAO,GAAG;AACnC;AAAA,MACF;AAEA,aAAO,IAAI,SAAS;AAAA,QAClB,IAAI;AAAA,QACJ,OAAOA,mBAAkB,MAAM,KAAK,KAAKA,mBAAkB,MAAM,QAAQ,KAAKA,mBAAkB,MAAM,eAAe;AAAA,QACrH,KAAK,mCAAmC,OAAO;AAAA,MACjD,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG;AAC1C;AAEA,SAAS,iBAAiB,SAAyB,MAAsC;AACvF,QAAM,aAAaK,gBAAe,gBAAgB,QAAQ,IAAI,OAAO,OAAO,IAAI,CAAC;AACjF,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAEA,aAAW,QAAQ,QAAQ,IAAI,aAAa,OAAO;AACjD,UAAM,WAAWA,gBAAeD,iBAAgB,KAAK,MAAM,IAAI,CAAC;AAChE,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAyB,MAAoC;AACtF,QAAM,aAAa,kBAAkB,gBAAgB,QAAQ,IAAI,OAAO,OAAO,IAAI,CAAC;AACpF,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAEA,aAAW,QAAQ,QAAQ,IAAI,aAAa,OAAO;AACjD,UAAM,WAAW,kBAAkBA,iBAAgB,KAAK,MAAM,IAAI,CAAC;AACnE,QAAI,aAAa,QAAW;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASC,gBAAe,OAAsC;AAC5D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,SAAS,MAAM,IAAIL,kBAAiB,EAAE,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAC1F,WAAO,OAAO,SAAS,IAAI,SAAS;AAAA,EACtC;AAEA,QAAM,OAAOA,mBAAkB,KAAK;AACpC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAClE;AAEA,SAAS,kBAAkB,OAAoC;AAC7D,QAAM,OAAOA,mBAAkB,KAAK;AACpC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,SAAS,KAAK,QAAQ,UAAU,EAAE,GAAG,EAAE;AAC7D,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,qBAA0E,QAAc;AAC/F,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,WAAc,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,EAAE;AAAA,EACjH;AACF;;;AChxCA,IAAM,gBAAkC,CAAC;AAElC,SAAS,qBAAqB,QAA8B;AACjE,MAAI,CAAC,cAAc,KAAK,CAAC,eAAe,WAAW,SAAS,OAAO,IAAI,GAAG;AACxE,kBAAc,KAAK,MAAM;AAAA,EAC3B;AACF;AAEO,SAAS,eAAe,UAAgC,CAAC,GAAqB;AACnF,QAAM,WAA6B;AAAA,IACjC,UAAU,CAAC,GAAG,iBAAiB,GAAI,QAAQ,YAAY,CAAC,CAAE;AAAA,IAC1D,YAAY,CAAC;AAAA,IACb,cAAc,CAAC,GAAI,QAAQ,gBAAgB,CAAC,CAAE;AAAA,EAChD;AAEA,QAAM,MAAyB;AAAA,IAC7B,WAAW,SAAS;AAClB,eAAS,SAAS,KAAK,OAAO;AAAA,IAChC;AAAA,IACA,aAAa,MAAM,WAAW;AAC5B,eAAS,WAAW,KAAK,EAAE,MAAM,SAAS,UAAU,CAAC;AAAA,IACvD;AAAA,IACA,eAAe,QAAQ;AACrB,eAAS,aAAa,KAAK,MAAM;AAAA,IACnC;AAAA,EACF;AAEA,aAAW,UAAU,CAAC,GAAG,eAAe,GAAI,QAAQ,WAAW,CAAC,CAAE,GAAG;AACnE,WAAO,MAAM,GAAG;AAAA,EAClB;AAEA,SAAO;AACT;;;ACxCO,SAAS,cAAc,MAAc,KAAa,UAAgC,CAAC,GAAoB;AAC5G,QAAM,WAAW,WAAW,GAAG;AAC/B,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,cAAc,uBAAuB;AAC3C,cAAY,cAAc;AAC1B,cAAY,WAAW;AACvB,cAAY,MAAM,KAAK,8BAA8B;AACrD,QAAM,aAAiC;AAAA,IACrC,MAAM,oBAAoB,IAAI;AAAA,IAC9B,WAAW,iBAAiB,IAAI;AAAA,IAChC,SAAS,oBAAoB,IAAI;AAAA,IACjC,QAAQ,cAAc,IAAI;AAAA,IAC1B,cAAc,oBAAoB,IAAI;AAAA,IACtC,QAAQ,cAAc,MAAM,QAAQ;AAAA,IACpC,QAAQ,cAAc,MAAM,QAAQ;AAAA,IACpC,QAAQ,cAAc,MAAM,QAAQ;AAAA,IACpC,OAAO,aAAa,MAAM,QAAQ;AAAA,IAClC,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,EACZ;AACA,wBAAsB,YAAY,YAAY,KAAK;AAEnD,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,eAAe;AAErB,MAAI,aAAa,eAAe,WAAW,OAAO,MAAM,SAAS,GAAG;AAClE,gBAAY,SAAS,KAAK,yHAAyH;AAAA,EACrJ;AAEA,aAAW,aAAa,SAAS,YAAY;AAC3C,QAAI;AACF,YAAM,SAAS,UAAU,QAAQ,EAAE,MAAM,KAAK,UAAU,GAAG,KAAK,YAAY,QAAQ,CAAC;AACrF,UAAI,UAAU,MAAM,GAAG;AACrB,oBAAY,SAAS,KAAK,qBAAqB,UAAU,IAAI,yFAAyF;AACtJ;AAAA,MACF;AAEA,iBAAW,QAAQ,KAAK,WAAW,QAAQ,UAAU,IAAI,CAAC;AAC1D,kBAAY,MAAM,KAAK,6BAA6B,UAAU,IAAI,EAAE;AAAA,IACtE,SAAS,OAAO;AACd,kBAAY,SAAS,KAAK,qBAAqB,UAAU,IAAI,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IACpI;AAAA,EACF;AAEA,QAAM,YAAY,IAAI,IAAI,QAAQ;AAClC,aAAW,WAAW,SAAS,UAAU;AACvC,QAAI,CAAC,eAAe,SAAS,SAAS,GAAG;AACvC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAA0B,EAAE,MAAM,KAAK,UAAU,GAAG,KAAK,YAAY,QAAQ;AACnF,YAAM,SAAS,QAAQ,QAAQ,OAAO;AACtC,UAAI,UAAU,MAAM,GAAG;AACrB,oBAAY,SAAS,KAAK,YAAY,QAAQ,IAAI,wFAAwF;AAC1I;AAAA,MACF;AAEA,YAAM,aAAa,QAAQ,YAAY,QAAmC,OAAO;AACjF,UAAI,cAAc,UAAU,UAAU,GAAG;AACvC,oBAAY,SAAS,KAAK,YAAY,QAAQ,IAAI,kGAAkG;AACpJ;AAAA,MACF;AAEA,iBAAW,SAAS,KAAK,WAAW,cAAe,QAAoC,QAAQ,IAAI,CAAC;AACpG,kBAAY,MAAM,KAAK,oBAAoB,QAAQ,IAAI,EAAE;AAAA,IAC3D,SAAS,OAAO;AACd,kBAAY,SAAS,KAAK,YAAY,QAAQ,IAAI,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IACzH;AAAA,EACF;AAEA,SAAO,kBAAkB,YAAY;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,SAAS;AAAA,IACvB,YAAY,QAAQ;AAAA,EACtB,CAAC;AACH;AAEA,eAAsB,mBAAmB,MAAc,KAAa,UAAgC,CAAC,GAA6B;AAChI,QAAM,WAAW,WAAW,GAAG;AAC/B,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,cAAc,uBAAuB;AAC3C,cAAY,cAAc;AAC1B,cAAY,WAAW;AACvB,cAAY,MAAM,KAAK,8BAA8B;AACrD,QAAM,aAAiC;AAAA,IACrC,MAAM,oBAAoB,IAAI;AAAA,IAC9B,WAAW,iBAAiB,IAAI;AAAA,IAChC,SAAS,oBAAoB,IAAI;AAAA,IACjC,QAAQ,cAAc,IAAI;AAAA,IAC1B,cAAc,oBAAoB,IAAI;AAAA,IACtC,QAAQ,cAAc,MAAM,QAAQ;AAAA,IACpC,QAAQ,cAAc,MAAM,QAAQ;AAAA,IACpC,QAAQ,cAAc,MAAM,QAAQ;AAAA,IACpC,OAAO,aAAa,MAAM,QAAQ;AAAA,IAClC,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,EACZ;AACA,wBAAsB,YAAY,YAAY,KAAK;AACnD,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,eAAe;AAErB,MAAI,aAAa,eAAe,WAAW,OAAO,MAAM,SAAS,GAAG;AAClE,UAAM,SAAS,MAAM,gBAAgB,WAAW,OAAO,OAAO,YAAY;AAC1E,eAAW,OAAO,OAAO,OAAO;AAChC,gBAAY,SAAS,KAAK,GAAG,OAAO,QAAQ;AAC5C,gBAAY,MAAM,KAAK,0CAA0C;AAAA,EACnE;AAEA,aAAW,aAAa,SAAS,YAAY;AAC3C,QAAI;AACF,iBAAW,QAAQ,KAAK,WAAW,MAAM,UAAU,QAAQ,EAAE,MAAM,KAAK,UAAU,GAAG,KAAK,YAAY,QAAQ,CAAC,GAAG,UAAU,IAAI,CAAC;AACjI,kBAAY,MAAM,KAAK,6BAA6B,UAAU,IAAI,EAAE;AAAA,IACtE,SAAS,OAAO;AACd,kBAAY,SAAS,KAAK,qBAAqB,UAAU,IAAI,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IACpI;AAAA,EACF;AAEA,QAAM,YAAY,IAAI,IAAI,QAAQ;AAClC,aAAW,WAAW,SAAS,UAAU;AACvC,QAAI,CAAC,eAAe,SAAS,SAAS,GAAG;AACvC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAA0B,EAAE,MAAM,KAAK,UAAU,GAAG,KAAK,YAAY,QAAQ;AACnF,YAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO;AAC5C,YAAM,aAAa,QAAQ,YAAY,MAAM,QAAQ,UAAU,QAAmC,OAAO,IAAK;AAC9G,iBAAW,SAAS,KAAK,WAAW,YAAY,QAAQ,IAAI,CAAC;AAC7D,kBAAY,MAAM,KAAK,oBAAoB,QAAQ,IAAI,EAAE;AAAA,IAC3D,SAAS,OAAO;AACd,kBAAY,SAAS,KAAK,YAAY,QAAQ,IAAI,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IACzH;AAAA,EACF;AAEA,SAAO,kBAAkB,YAAY;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,SAAS;AAAA,IACvB,YAAY,QAAQ;AAAA,EACtB,CAAC;AACH;AAEA,SAAS,WAAuE,QAAW,QAAmB;AAC5G,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,OAAO,UAAU;AAAA,EAC3B;AACF;AAEA,SAAS,UAAa,OAA4C;AAChE,SAAO,QAAQ,SAAS,OAAQ,MAAqB,SAAS,UAAU;AAC1E;AAEA,SAAS,eAAe,SAAsB,KAAmB;AAC/D,SAAO,QAAQ,SAAS,GAAG,KAAK,QAAQ,YAAY,GAAG,KAAK;AAC9D;AAEA,SAAS,sBAAsB,YAAgC,OAAuB;AACpF,MAAI,OAAO,KAAK,WAAW,UAAU,GAAG,EAAE,SAAS,GAAG;AACpD,UAAM,KAAK,mBAAmB;AAAA,EAChC;AACA,MAAI,OAAO,KAAK,WAAW,QAAQ,GAAG,EAAE,SAAS,GAAG;AAClD,UAAM,KAAK,sBAAsB;AAAA,EACnC;AACA,MAAI,WAAW,OAAO,MAAM,SAAS,GAAG;AACtC,UAAM,KAAK,gBAAgB;AAAA,EAC7B;AACA,MAAI,WAAW,aAAa,MAAM,SAAS,GAAG;AAC5C,UAAM,KAAK,kCAAkC;AAAA,EAC/C;AACA,MAAI,WAAW,OAAO,MAAM,SAAS,GAAG;AACtC,UAAM,KAAK,6BAA6B;AAAA,EAC1C;AACA,MAAI,WAAW,OAAO,SAAS,KAAK,WAAW,OAAO,SAAS,KAAK,WAAW,MAAM,SAAS,GAAG;AAC/F,UAAM,KAAK,kCAAkC;AAAA,EAC/C;AACF;;;ACvLO,SAAS,sBAAsB,OAA+B,aAAuC;AAC1G,MAAI,CAAC,SAAS,MAAM,SAAS,IAAI;AAC/B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,OAAO,aAAa,YAAY,KAAK;AAE3C,MAAI,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,GAAG;AACxC,WAAO,kBAAkB,KAAK;AAAA,EAChC;AAEA,MAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,OAAO,KAAK,GAAG;AAClE,WAAO,mBAAmB,KAAK;AAAA,EACjC;AAEA,MAAI,KAAK,SAAS,MAAM,KAAK,OAAO,KAAK,GAAG;AAC1C,WAAO,mBAAmB,KAAK;AAAA,EACjC;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,MAAM,OAA4B;AACzC,SAAO,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM;AACrF;AAEA,SAAS,OAAO,OAA4B;AAC1C,SAAO,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM;AAC3C;AAEA,SAAS,OAAO,OAA4B;AAC1C,SAAO,MAAM,OAAO,GAAG,CAAC,MAAM,UAAU,MAAM,OAAO,GAAG,CAAC,MAAM;AACjE;AAEA,SAAS,kBAAkB,OAAoC;AAC7D,MAAI,MAAM,SAAS,IAAI;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AAAA,IACL,OAAO,WAAW,OAAO,EAAE;AAAA,IAC3B,QAAQ,WAAW,OAAO,EAAE;AAAA,EAC9B;AACF;AAEA,SAAS,mBAAmB,OAAoC;AAC9D,MAAI,SAAS;AAEb,SAAO,SAAS,IAAI,MAAM,QAAQ;AAChC,QAAI,MAAM,MAAM,MAAM,KAAM;AAC1B,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,SAAS,CAAC;AAC/B,UAAM,SAAS,WAAW,OAAO,SAAS,CAAC;AAC3C,QAAI,SAAS,GAAG;AACd,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,UAAU,OAAQ,UAAU,OAAQ,CAAC,CAAC,KAAM,KAAM,GAAI,EAAE,SAAS,MAAM,GAAG;AAC5E,aAAO;AAAA,QACL,QAAQ,WAAW,OAAO,SAAS,CAAC;AAAA,QACpC,OAAO,WAAW,OAAO,SAAS,CAAC;AAAA,MACrC;AAAA,IACF;AAEA,cAAU,IAAI;AAAA,EAChB;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,mBAAmB,OAAoC;AAC9D,QAAM,QAAQ,MAAM,OAAO,IAAI,CAAC;AAEhC,MAAI,UAAU,UAAU,MAAM,UAAU,IAAI;AAC1C,WAAO;AAAA,MACL,OAAO,IAAI,aAAa,OAAO,EAAE;AAAA,MACjC,QAAQ,IAAI,aAAa,OAAO,EAAE;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,UAAU,UAAU,MAAM,UAAU,IAAI;AAC1C,WAAO;AAAA,MACL,OAAO,aAAa,OAAO,EAAE,IAAI;AAAA,MACjC,QAAQ,aAAa,OAAO,EAAE,IAAI;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,UAAU,UAAU,MAAM,UAAU,IAAI;AAC1C,UAAM,KAAK,MAAM,EAAE;AACnB,UAAM,KAAK,MAAM,EAAE;AACnB,UAAM,KAAK,MAAM,EAAE;AACnB,UAAM,KAAK,MAAM,EAAE;AACnB,WAAO;AAAA,MACL,OAAO,MAAO,KAAK,OAAS,IAAK;AAAA,MACjC,QAAQ,MAAO,KAAK,OAAS,KAAO,MAAM,KAAO,KAAK,QAAS;AAAA,IACjE;AAAA,EACF;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,WAAW,OAAmB,QAAwB;AAC7D,UAAQ,MAAM,MAAM,KAAK,KAAK,MAAM,SAAS,CAAC;AAChD;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAO,MAAM,MAAM,KAAK,MAAM,SAAS,CAAC,KAAK;AAC/C;AAEA,SAAS,aAAa,OAAmB,QAAwB;AAC/D,SAAO,MAAM,MAAM,KAAK,MAAM,SAAS,CAAC,KAAK,MAAM,MAAM,SAAS,CAAC,KAAK;AAC1E;AAEA,SAAS,WAAW,OAAmB,QAAwB;AAC7D,UAAS,MAAM,MAAM,KAAK,OAAQ,MAAM,MAAM,SAAS,CAAC,KAAK,OAAO,MAAM,SAAS,CAAC,KAAK,KAAK,MAAM,SAAS,CAAC;AAChH;AAEA,SAAS,MAAM,OAAmB,QAAgB,QAAwB;AACxE,SAAO,OAAO,aAAa,GAAG,MAAM,MAAM,QAAQ,SAAS,MAAM,CAAC;AACpE;;;ACxHA,IAAM,kCAAkC;AACxC,IAAM,oCAAoC;AAiC1C,eAAsB,cAAc,KAAa,UAAgC,CAAC,GAA6B;AAC7G,QAAM,YAAY,KAAK,IAAI;AAE3B,MAAI;AACF,UAAM,eAAe,aAAa,GAAG;AACrC,UAAM,cAAc,MAAM,wBAAwB,cAAc,OAAO;AACvE,UAAM,OAAO,YAAY;AACzB,QAAI,YAAY,qBAAqB,SAAS;AAC5C,aAAO,8BAA8B,cAAc,aAAa,KAAK,IAAI,IAAI,SAAS;AAAA,IACxF;AAEA,UAAM,cAAc,0BAA0B,MAAM,cAAc,KAAK,IAAI,IAAI,SAAS;AACxF,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,MAAM,mBAAmB,KAAK,MAAM,KAAK,UAAU,OAAO;AAE3E,aAAS,MAAM;AACf,aAAS,WAAW,KAAK;AACzB,aAAS,KAAK,KAAK,cAAc,OAAO,KAAK,aAAa;AAC1D,aAAS,YAAY,aAAa,KAAK;AACvC,aAAS,YAAY,cAAc,KAAK;AACxC,aAAS,YAAY,cAAc;AACnC,aAAS,YAAY,WAAW,KAAK;AACrC,aAAS,YAAY,eAAe,SAAS;AAC7C,aAAS,YAAY,aAAa,KAAK;AACvC,aAAS,YAAY,mBAAmB,KAAK;AAC7C,aAAS,YAAY,YAAY,KAAK;AACtC,aAAS,YAAY,kBAAkB,KAAK,IAAI,IAAI;AACpD,aAAS,YAAY,QAAQ;AAAA,MAC3B,GAAI,KAAK,aAAa,CAAC,gCAAgC,KAAK,oBAAoB,SAAS,EAAE,IAAI,CAAC;AAAA,MAChG,GAAI,KAAK,UAAU,SAAS,IAAI,CAAC,YAAY,KAAK,UAAU,MAAM,YAAY,KAAK,UAAU,WAAW,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,MAC3H,GAAG,YAAY;AAAA,MACf;AAAA,MACA,GAAG,SAAS,YAAY;AAAA,MACxB,GAAI,SAAS,eAAe,CAAC,wBAAwB,IAAI,CAAC;AAAA,IAC5D;AACA,aAAS,YAAY,qBAAqBM,uBAAsB,SAAS,YAAY,oBAAoB,YAAY,kBAAkB;AACvI,aAAS,YAAY,iBAAiBC,eAAc,CAAC,GAAI,SAAS,YAAY,kBAAkB,CAAC,GAAI,GAAI,YAAY,kBAAkB,CAAC,CAAE,CAAC;AAC3I,aAAS,YAAY,mBAAmB,SAAS,YAAY,oBAAoB,YAAY;AAC7F,aAAS,YAAY,YAAY,SAAS,YAAY,aAAa,YAAY;AAC/E,aAAS,QAAQ,SAAS,YAAY;AACtC,aAAS,YAAY,SAAS,KAAK,GAAG,YAAY,QAAQ;AAE1D,QAAI,CAAC,SAAS,IAAI;AAChB,eAAS,YAAY,SAAS,KAAK,gDAAgD,KAAK,UAAU,GAAG;AAAA,IACvG;AAEA,QAAI,KAAK,eAAe,CAAC,iBAAiB,KAAK,KAAK,WAAW,GAAG;AAChE,eAAS,YAAY,SAAS,KAAK,6DAA6D,KAAK,WAAW,GAAG;AAAA,IACrH;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,UAAU,cAAc,GAAG;AAEjC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,aAAa;AAAA,MACb,QAAQ,CAAC;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,OAAO,CAAC;AAAA,MACR,UAAU,CAAC;AAAA,MACX,OAAO,CAAC,cAAc;AAAA,MACtB,aAAa;AAAA,QACX,aAAa;AAAA,QACb,UAAU;AAAA,QACV,WAAW,CAAC;AAAA,QACZ,aAAa,CAAC;AAAA,QACd,UAAU,CAAC;AAAA,QACX,OAAO,CAAC,cAAc;AAAA,QACtB,QAAQ,CAAC,OAAO;AAAA,QAChB,iBAAiB,KAAK,IAAI,IAAI;AAAA,QAC9B,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,8BACP,cACA,aACA,iBACiB;AACjB,QAAM,OAAO,YAAY;AACzB,QAAM,sBAAsB,YAAY;AACxC,QAAM,QAAQA,eAAc;AAAA,IAC1B,GAAI,KAAK,aAAa,CAAC,gCAAgC,KAAK,oBAAoB,SAAS,EAAE,IAAI,CAAC;AAAA,IAChG,GAAI,KAAK,UAAU,SAAS,IAAI,CAAC,YAAY,KAAK,UAAU,MAAM,YAAY,KAAK,UAAU,WAAW,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,IAC3H,GAAG,YAAY;AAAA,IACf;AAAA,EACF,CAAC;AACD,QAAM,WAAWA,eAAc;AAAA,IAC7B,GAAG,YAAY;AAAA,IACf;AAAA,IACA,GAAI,KAAK,aAAa,OAAO,KAAK,cAAc,MAAM,CAAC,gDAAgD,KAAK,UAAU,GAAG,IAAI,CAAC;AAAA,EAChI,CAAC;AAED,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,UAAU,KAAK;AAAA,IACf,MAAM;AAAA,IACN,UAAU,qBAAqB,aAAa,WAAW,WAAW;AAAA,IAClE,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,aAAa;AAAA,IACb,QAAQ,CAAC;AAAA,IACT,QAAQ,CAAC;AAAA,IACT,OAAO,CAAC;AAAA,IACR,UAAU,CAAC;AAAA,IACX;AAAA,IACA,aAAa;AAAA,MACX,aAAa;AAAA,MACb,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,kBAAkB,KAAK;AAAA,MACvB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,aAAa,CAAC;AAAA,MACd;AAAA,MACA,oBAAoBD,uBAAsB,QAAW,YAAY,kBAAkB;AAAA,MACnF;AAAA,MACA,gBAAgB,YAAY;AAAA,MAC5B,kBAAkB,YAAY;AAAA,MAC9B,WAAW,YAAY;AAAA,MACvB;AAAA,MACA,qBAAqB;AAAA,QACnB,OAAO;AAAA,QACP,aAAa;AAAA,QACb,OAAO;AAAA,QACP,gBAAgB;AAAA,QAChB,SAAS;AAAA,MACX;AAAA,MACA;AAAA,MACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC;AAAA,EACF;AACF;AAEA,eAAe,wBAAwB,cAAsB,SAA6D;AACxH,MAAIE,aAAY,YAAY,GAAG;AAC7B,WAAO,4BAA4B,cAAc,OAAO;AAAA,EAC1D;AAEA,SAAO;AAAA,IACL,MAAM,MAAM,UAAU,cAAc,OAAO;AAAA,IAC3C,oBAAoB,CAAC;AAAA,IACrB,UAAU,CAAC;AAAA,IACX,OAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,4BAA4B,cAAsB,SAA6D;AAC5H,QAAM,WAAiC,CAAC;AACxC,QAAM,WAAqB,CAAC;AAC5B,QAAM,yBAAmC,CAAC;AAC1C,QAAM,iBAAiB,CAAC,sBAAsB,aAAa,0BAA0B,aAAa,MAAM;AACxG,MAAI;AAEJ,QAAM,UAAU,mBAAmB,YAAY;AAC/C,MAAI,SAAS;AACX,UAAM,UAAU,MAAM,aAAa,sBAAsB,SAAS;AAAA,MAChE,GAAG;AAAA,MACH,QAAQ;AAAA,IACV,CAAC;AACD,aAAS,KAAK,OAAO;AACrB,gBAAY,QAAQ;AAEpB,QAAI,QAAQ,QAAQ,QAAQ,IAAI;AAC9B,YAAM,aAAa,uBAAuB,QAAQ,KAAK,IAAI;AAC3D,UAAI,YAAY,OAAO;AACrB,eAAO;AAAA,UACL,MAAM,yBAAyB,QAAQ,MAAM,cAAc,UAAU;AAAA,UACrE,oBAAoB;AAAA,UACpB;AAAA,UACA,OAAO,CAAC,2BAA2B;AAAA,UACnC;AAAA,UACA,kBAAkB;AAAA,UAClB,WAAW,gBAAgB,QAAQ;AAAA,QACrC;AAAA,MACF;AAEA,eAAS,KAAK,yEAAyE;AAAA,IACzF,WAAW,QAAQ,SAAS;AAC1B,6BAAuB,KAAK,mHAAmH;AAAA,IACjJ;AAAA,EACF;AAEA,QAAM,eAAe,aAAa,YAAY;AAC9C,MAAI,gBAAgB,iBAAiB,cAAc;AACjD,UAAM,UAAU,MAAM,aAAa,aAAa,cAAc,OAAO;AACrE,aAAS,KAAK,OAAO;AACrB,gBAAY,QAAQ;AAEpB,QAAI,QAAQ,QAAQ,QAAQ,IAAI;AAC9B,aAAO;AAAA,QACL,MAAM,QAAQ;AAAA,QACd,oBAAoB;AAAA,QACpB;AAAA,QACA,OAAO,CAAC,GAAG,wBAAwB,wCAAwC;AAAA,QAC3E;AAAA,QACA,kBAAkB;AAAA,QAClB,WAAW,gBAAgB,QAAQ;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS;AACnB,eAAS,KAAK,mDAAmD;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,aAAa,sBAAsB,cAAc,OAAO;AAClF,WAAS,KAAK,WAAW;AACzB,cAAY,YAAY;AAExB,MAAI,YAAY,QAAQ,YAAY,IAAI;AACtC,WAAO;AAAA,MACL,MAAM,YAAY;AAAA,MAClB,oBAAoB;AAAA,MACpB;AAAA,MACA,OAAO,CAAC,GAAG,wBAAwB,2BAA2B;AAAA,MAC9D;AAAA,MACA,kBAAkB;AAAA,MAClB,WAAW,gBAAgB,QAAQ;AAAA,IACrC;AAAA,EACF;AAEA,MAAI,YAAY,SAAS;AACvB,aAAS,KAAK,gFAAgF;AAAA,EAChG;AAEA,QAAM,sBAAsB,sCAAsC,QAAQ;AAC1E,MAAI,qBAAqB;AACvB,WAAO;AAAA,MACL,MAAM,4BAA4B,cAAc,UAAU,mBAAmB;AAAA,MAC7E,oBAAoB;AAAA,MACpB,UAAUD,eAAc,CAAC,GAAG,UAAU,+BAA+B,CAAC;AAAA,MACtE,OAAO,CAAC,GAAG,wBAAwB,6CAA6C;AAAA,MAChF;AAAA,MACA,kBAAkB;AAAA,MAClB,WAAW,gBAAgB,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,MAAM,8CAA8C;AAC7E;AAEA,eAAe,aACb,QACA,KACA,SAC6B;AAC7B,MAAI;AACF,UAAM,OAAO,MAAM,UAAU,KAAK,OAAO;AACzC,UAAM,aAAa,KAAK,QAAQ,aAAa;AAC7C,UAAM,cAAc,kBAAkB,IAAI;AAC1C,UAAM,UAAU,QAAQ,WAAW;AAEnC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,IAAI,KAAK,cAAc,OAAO,KAAK,aAAa,OAAO,CAAC;AAAA,MACxD,YAAY,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,SAASC,aAAY,KAAsB;AACzC,MAAI;AACF,UAAM,OAAO,IAAI,IAAI,GAAG,EAAE,SAAS,YAAY,EAAE,QAAQ,UAAU,EAAE;AACrE,WAAO,SAAS,gBAAgB,SAAS,aAAa,KAAK,SAAS,aAAa;AAAA,EACnF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,KAAiC;AAC3D,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,OAAO,OAAO,SAAS,YAAY,EAAE,QAAQ,UAAU,EAAE;AAC/D,UAAM,WAAW,IAAI,IAAI,GAAG;AAC5B,aAAS,WAAW;AACpB,aAAS,WAAW;AACpB,aAAS,SAAS;AAElB,QAAI,SAAS,WAAW;AACtB,YAAM,SAAS,OAAO,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,CAAC;AAC3D,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,MACT;AACA,eAAS,WAAW,aAAa,MAAM;AAAA,IACzC,OAAO;AACL,eAAS,WAAW,OAAO,SAAS,SAAS,OAAO,IAChD,OAAO,WACP,GAAG,OAAO,SAAS,SAAS,GAAG,IAAI,OAAO,WAAW,GAAG,OAAO,QAAQ,GAAG;AAAA,IAChF;AAEA,aAAS,aAAa,IAAI,YAAY,GAAG;AACzC,WAAO,SAAS,SAAS;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,KAAiC;AACrD,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,OAAO,OAAO,SAAS,YAAY,EAAE,QAAQ,UAAU,EAAE;AAC/D,WAAO,WAAW;AAClB,WAAO,WAAW;AAClB,WAAO,SAAS;AAEhB,QAAI,SAAS,WAAW;AACtB,YAAM,SAAS,OAAO,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,CAAC;AAC3D,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,MACT;AACA,aAAO,WAAW,aAAa,MAAM;AAAA,IACvC;AAEA,WAAO,OAAO,SAAS;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,QAA+C;AAC7E,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,UAAM,OAAO,qBAAqB,MAAM;AACxC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,UAAM,aAAaC,mBAAkB,KAAK,WAAW;AACrD,UAAM,YAAYC,mBAAkB,KAAK,SAAS;AAClD,UAAM,eAAe,YAAY,yBAAyB,UAAU,WAAW,GAAG,IAAI,YAAY,IAAI,SAAS,EAAE,KAAK;AACtH,UAAM,SAAS,qBAAqB,IAAI;AACxC,UAAM,SAAS,qBAAqB,IAAI;AACxC,UAAM,cAAcC;AAAA,MAClBD,mBAAkB,KAAK,QAAQ;AAAA,MAC/BA,mBAAkB,KAAK,aAAa;AAAA,MACpCA,mBAAkB,KAAK,sBAAsB;AAAA,IAC/C;AAEA,WAAO;AAAA,MACL,OAAOA,mBAAkB,KAAK,KAAK;AAAA,MACnC;AAAA,MACA,QAAQA,mBAAkB,KAAK,MAAM,KAAKA,mBAAkB,KAAK,eAAe;AAAA,MAChF,WAAW,aAAa,IAAI,KAAK,aAAa,GAAI,EAAE,YAAY,IAAI;AAAA,MACpE;AAAA,MACA,KAAKA,mBAAkB,KAAK,sBAAsB,KAAKA,mBAAkB,KAAK,GAAG;AAAA,MACjF;AAAA,MACA;AAAA,MACA,WAAWA,mBAAkB,KAAK,uBAAuB,KAAKA,mBAAkB,KAAK,SAAS;AAAA,MAC9F,QAAQA,mBAAkB,KAAK,EAAE;AAAA,IACnC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,OAAqD;AACjF,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,qBAAqB,IAAI;AACvC,UAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAACE,UAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,MAAM,UAAU,aAAa,OAAO,MAAM,OAAO,YAAY,OAAO,MAAM,SAAS,WAAW;AACvG,WAAO;AAAA,EACT;AAEA,QAAM,WAAWA,UAAS,MAAM,IAAI,KAAK,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,WAAW;AACpG,MAAI,UAAU;AACZ,eAAW,SAAS,UAAU;AAC5B,UAAIA,UAAS,KAAK,KAAKA,UAAS,MAAM,IAAI,MAAM,MAAM,SAAS,QAAQ,OAAO,MAAM,KAAK,UAAU,WAAW;AAC5G,eAAO,MAAM;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,aAAW,cAAc,OAAO,OAAO,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG;AAC3D,UAAM,QAAQ,qBAAqB,UAAU;AAC7C,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,MAA6C;AACzE,QAAM,SAAuB;AAAA,IAC3B,GAAG,4BAA4B,IAAI;AAAA,IACnC,GAAG,2BAA2B,IAAI;AAAA,EACpC;AACA,QAAM,UAAUA,UAAS,KAAK,OAAO,KAAK,MAAM,QAAQ,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,SAAS,CAAC;AAEtG,aAAW,SAAS,SAAS;AAC3B,QAAI,CAACA,UAAS,KAAK,GAAG;AACpB;AAAA,IACF;AAEA,UAAM,SAAS,sBAAsB,MAAM,QAAQ,iBAAiB;AACpE,QAAI,QAAQ;AACV,aAAO,KAAK,MAAM;AAClB;AAAA,IACF;AAEA,UAAM,qBAAqB,yBAAyB,MAAM,QAAQ,MAAM,WAAW,IAAI,MAAM,cAAc,CAAC,CAAC;AAC7G,UAAM,WAAW,sBAAsB,oBAAoB,mBAAmB;AAC9E,QAAI,UAAU;AACZ,aAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,YAAY,eAAeF,mBAAkB,KAAK,SAAS,CAAC;AAClE,MAAI,aAAa,gBAAgB,KAAK,SAAS,GAAG;AAChD,UAAM,iBAAiB,iBAAiB,WAAW,QAAW,QAAW,WAAW;AACpF,QAAI,gBAAgB;AAClB,aAAO,KAAK,cAAc;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,mBAAmB,uBAAuB,MAAM,CAAC;AAC1D;AAEA,SAAS,4BAA4B,MAA6C;AAChF,QAAM,gBAAgBE,UAAS,KAAK,cAAc,IAAI,KAAK,iBAAiB;AAC5E,MAAI,CAAC,eAAe;AAClB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,eAAeA,UAAS,KAAK,YAAY,KAAK,MAAM,QAAQ,KAAK,aAAa,KAAK,IAAI,KAAK,aAAa,QAAQ,CAAC;AACxH,QAAM,aAAa,aAChB,IAAI,CAAC,SAASA,UAAS,IAAI,IAAIF,mBAAkB,KAAK,QAAQ,IAAI,MAAS,EAC3E,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AACjD,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,SAAuB,CAAC;AAE9B,aAAW,MAAM,YAAY;AAC3B,UAAM,QAAQ,6BAA6B,cAAc,EAAE,GAAG,EAAE;AAChE,QAAI,OAAO;AACT,aAAO,KAAK,KAAK;AACjB,cAAQ,IAAI,EAAE;AAAA,IAChB;AAAA,EACF;AAEA,aAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,aAAa,GAAG;AACvD,QAAI,QAAQ,IAAI,EAAE,GAAG;AACnB;AAAA,IACF;AAEA,UAAM,QAAQ,6BAA6B,OAAO,EAAE;AACpD,QAAI,OAAO;AACT,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BAA2B,MAA6C;AAC/E,QAAM,MAAM,eAAeA,mBAAkB,KAAK,sBAAsB,KAAKA,mBAAkB,KAAK,GAAG,CAAC;AACxG,MAAI,CAAC,OAAO,CAAC,uBAAuB,GAAG,GAAG;AACxC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,gBAAgB,oBAAoB,IAAI;AAC9C,QAAM,QAAQ;AAAA,IACZ;AAAA,IACAD,mBAAkB,eAAe,KAAK;AAAA,IACtCA,mBAAkB,eAAe,MAAM;AAAA,IACvC;AAAA,EACF;AAEA,SAAO,QAAQ,CAAC,KAAK,IAAI,CAAC;AAC5B;AAEA,SAAS,6BAA6B,OAAgB,SAAyC;AAC7F,MAAI,CAACG,UAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,SAASA,UAAS,MAAM,CAAC,IAAI,MAAM,IAAI;AAC7C,QAAM,MAAM;AAAA,IACVF,mBAAkB,QAAQ,CAAC,KAC3BA,mBAAkB,QAAQ,GAAG,KAC7BA,mBAAkB,QAAQ,GAAG;AAAA,EAC/B;AAEA,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACAD,mBAAkB,QAAQ,CAAC,KAAKA,mBAAkB,QAAQ,KAAK;AAAA,IAC/DA,mBAAkB,QAAQ,CAAC,KAAKA,mBAAkB,QAAQ,MAAM;AAAA,IAChE;AAAA,IACAC,mBAAkB,MAAM,CAAC;AAAA,EAC3B;AAEA,SAAO,QACH;AAAA,IACE,GAAG;AAAA,IACH,UAAU;AAAA,MACR,GAAG,MAAM;AAAA,MACT,eAAe;AAAA,IACjB;AAAA,EACF,IACA;AACN;AAEA,SAAS,sBAAsB,OAAgB,iBAAiD;AAC9F,MAAI,CAACE,UAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,eAAeF,mBAAkB,MAAM,GAAG,KAAKA,mBAAkB,MAAM,CAAC,CAAC;AACrF,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACAD,mBAAkB,MAAM,KAAK,KAAKA,mBAAkB,MAAM,CAAC;AAAA,IAC3DA,mBAAkB,MAAM,MAAM,KAAKA,mBAAkB,MAAM,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,SAAS,iBACP,KACA,OACA,QACA,iBACA,MACwB;AACxB,QAAM,QAAoB;AAAA,IACxB;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,MACR,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,8BAA8B,KAAK,IAAI,QAAQ;AACxD;AAEA,SAAS,yBAAyB,QAA4B;AAC5D,SAAO,OACJ,OAAOG,SAAQ,EACf;AAAA,IAAK,CAAC,MAAM,WACVH,mBAAkB,MAAM,KAAK,KAAK,MAAMA,mBAAkB,MAAM,MAAM,KAAK,MAC3EA,mBAAkB,KAAK,KAAK,KAAK,MAAMA,mBAAkB,KAAK,MAAM,KAAK;AAAA,EAC5E,EAAE,CAAC;AACP;AAEA,SAAS,oBAAoB,MAAoE;AAC/F,QAAM,SAASG,UAAS,KAAK,OAAO,KAAK,MAAM,QAAQ,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,SAAS,CAAC;AACrG,QAAM,aAAa,OAAO,KAAKA,SAAQ;AACvC,SAAO,cAAcA,UAAS,WAAW,MAAM,IAAI,WAAW,SAAS;AACzE;AAEA,SAAS,uBAAuB,OAAwB;AACtD,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,KAAK;AAC5B,UAAM,OAAO,OAAO,SAAS,YAAY;AACzC,WAAO,SAAS,eAAe,SAAS;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,QAAoC;AAC9D,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAuB,CAAC;AAE9B,aAAW,SAAS,QAAQ;AAC1B,QAAI,KAAK,IAAI,MAAM,GAAG,GAAG;AACvB;AAAA,IACF;AAEA,SAAK,IAAI,MAAM,GAAG;AAClB,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,MAA6C;AACzE,QAAM,SAAuB,CAAC;AAC9B,QAAM,QAAQ,CAAC,KAAK,OAAO,KAAK,YAAY,EAAE,OAAOA,SAAQ;AAE7D,aAAW,QAAQ,OAAO;AACxB,UAAM,cAAcA,UAAS,KAAK,YAAY,IAAI,KAAK,eAAe;AACtE,UAAM,MAAM,eAAeF,mBAAkB,aAAa,YAAY,KAAKA,mBAAkB,aAAa,OAAO,KAAKA,mBAAkB,aAAa,QAAQ,CAAC;AAC9J,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAOD,mBAAkB,aAAa,KAAK;AAAA,MAC3C,QAAQA,mBAAkB,aAAa,MAAM;AAAA,MAC7C,UAAU;AAAA,QACR,SAAS;AAAA,QACT,gBAAgB;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,UAAuB,cAAsB,MAAsC;AACnH,QAAM,WAAW,KAAK,gBAAgB;AACtC,QAAM,YAAY,KAAK,OAAO,MAAM,EAAE;AAAA,IACpC,CAAC,MAAM,UACL,oBAAoB,KAAK,IAAI,oBAAoB,IAAI,MACnD,MAAM,SAAS,MAAM,MAAM,UAAU,MAAQ,KAAK,SAAS,MAAM,KAAK,UAAU;AAAA,EACtF,EAAE,CAAC;AACH,QAAM,QAAQ,KAAK,OAAO,CAAC;AAC3B,QAAM,iBAAiB;AAAA,IACrB,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,UAAU,KAAK;AAAA,IACf,aAAa,KAAK;AAAA,IAClB,QAAQ,KAAK,SAAS,EAAE,SAAS,UAAU,MAAM,KAAK,OAAO,IAAI;AAAA,IACjE,eAAe,KAAK;AAAA,IACpB,KAAK;AAAA,IACL,OAAO,YAAY,EAAE,SAAS,eAAe,KAAK,UAAU,KAAK,OAAO,UAAU,OAAO,QAAQ,UAAU,OAAO,IAAI;AAAA,IACtH,OAAO,QAAQ,EAAE,SAAS,eAAe,YAAY,MAAM,KAAK,OAAO,MAAM,OAAO,QAAQ,MAAM,OAAO,IAAI;AAAA,EAC/G;AACA,QAAM,kBAAkB;AAAA,IACtB,MAAM;AAAA,MACJ,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,MAClB,QAAQ,KAAK,SAAS,EAAE,MAAM,KAAK,OAAO,IAAI;AAAA,MAC9C,WAAW,KAAK;AAAA,MAChB,cAAc;AAAA,MACd,cAAc;AAAA,MACd,OAAO;AAAA,QACL,UAAU,OAAO;AAAA,MACnB;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AACA,QAAM,OAAO;AAAA,IACX;AAAA,IACA,UAAU,WAAW,KAAK,SAAS,aAAa,CAAC;AAAA,IACjD,KAAK,QAAQ,sCAAsC,WAAW,KAAK,KAAK,CAAC,OAAO;AAAA,IAChF,KAAK,cAAc,4CAA4C,WAAW,KAAK,WAAW,CAAC,OAAO;AAAA,IAClG;AAAA,IACA,oCAAoC,WAAW,QAAQ,CAAC;AAAA,IACxD,YAAY,sCAAsC,WAAW,UAAU,GAAG,CAAC,OAAO;AAAA,IAClF,WAAW,QAAQ,4CAA4C,UAAU,KAAK,OAAO;AAAA,IACrF,WAAW,SAAS,6CAA6C,UAAU,MAAM,OAAO;AAAA,IACxF,+BAA+B,WAAW,QAAQ,CAAC;AAAA,IACnD,sCAAsC,SAAS,cAAc,CAAC;AAAA,IAC9D,6DAA6D,SAAS,eAAe,CAAC;AAAA,IACtF;AAAA,EACF,EAAE,KAAK,EAAE;AAET,SAAO;AAAA,IACL,GAAG;AAAA,IACH,KAAK;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,IACpC,aAAa;AAAA,IACb,YAAY,SAAS;AAAA,EACvB;AACF;AAEA,SAAS,sCAAsC,UAAiE;AAC9G,QAAM,kBAAkB,SAAS,OAAO,CAAC,YAAY,QAAQ,OAAO;AACpE,MAAI,gBAAgB,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,kBACJ,gBAAgB,KAAK,CAAC,YAAY,QAAQ,gBAAgB,gCAAgC,KAC1F,gBAAgB,GAAG,EAAE;AAEvB,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY,iBAAiB;AAAA,IAC7B,QAAQ,iBAAiB,eAAe;AAAA,IACxC,iBAAiB;AAAA,EACnB;AACF;AAEA,SAAS,4BACP,cACA,UACA,qBACa;AACb,QAAM,eACJ,SAAS,KAAK,CAAC,YAAY,QAAQ,gBAAgB,oBAAoB,MAAM,GAAG,QAChF,SAAS,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,YAAY,QAAQ,IAAI,GAAG;AAE9D,SAAO;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY,cAAc,cAAc;AAAA,IACxC,kBAAkB,cAAc;AAAA,IAChC,MAAM;AAAA,IACN,OAAO,IAAI,WAAW;AAAA,IACtB,YAAY,oBAAoB,cAAc,cAAc,cAAc;AAAA,IAC1E,aAAa,cAAc;AAAA,IAC3B,WAAW,cAAc,aAAa,CAAC;AAAA,IACvC,SAAS,cAAc,WAAW,CAAC;AAAA,EACrC;AACF;AAEA,SAAS,kBAAkB,MAAkD;AAC3E,QAAM,QAAQ,UAAU,KAAK,IAAI;AACjC,QAAM,OAAO,cAAc,GAAG,SAAS,EAAE,IAAI,KAAK,IAAI,EAAE;AAExD,MAAI,6CAA6C,KAAK,SAAS,EAAE,KAAK,2EAA2E,KAAK,IAAI,GAAG;AAC3J,WAAO;AAAA,EACT;AAEA,MACE,KAAK,eAAe,OACpB,KAAK,eAAe,OACpB,qJAAqJ,KAAK,IAAI,KAC9J,aAAa,KAAK,SAAS,EAAE,GAC7B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,MAAkC;AACnD,SAAO,cAAc,KAAK,MAAM,kCAAkC,IAAI,CAAC,CAAC;AAC1E;AAEA,SAAS,cAAc,OAAmC;AACxD,SAAO,OAAO,QAAQ,YAAY,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK,KAAK;AACxE;AAEA,SAAS,gBAAgB,UAAwE;AAC/F,QAAM,kBAAkB,SAAS,OAAO,CAAC,YAAY,QAAQ,WAAW,QAAQ,eAAe,OAAO,QAAQ,eAAe,GAAG;AAChI,MAAI,gBAAgB,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,gBAAgB,IAAI,CAAC,YAAY,QAAQ,UAAU,EAAE,KAAK,CAAC,UAA2B,QAAQ,KAAK,CAAC;AACvH,SAAO;AAAA,IACL,WAAW,gBAAgB,KAAK,CAAC,YAAY,QAAQ,eAAe,OAAO,QAAQ,QAAQ,UAAU,CAAC;AAAA,IACtG,QAAQ,gBAAgB,IAAI,CAAC,YAAY,GAAG,QAAQ,MAAM,GAAG,QAAQ,aAAa,aAAa,QAAQ,UAAU,KAAK,SAAS,EAAE,EAAE,KAAK,IAAI;AAAA,IAC5I;AAAA,IACA,cAAc,eAAe,UAAU;AAAA,IACvC,UAAU,SAAS;AAAA,EACrB;AACF;AAEA,SAAS,eAAe,OAA+C;AACrE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,SAAS,OAAO,EAAE;AACzC,MAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,SAAO,OAAO,SAAS,MAAM,IAAI,KAAK,IAAI,SAAS,KAAK,IAAI,GAAG,CAAC,IAAI;AACtE;AAEA,SAASH,uBACP,UACA,UACyC;AACzC,QAAM,WAAW,CAAC,GAAI,YAAY,CAAC,GAAI,GAAG,QAAQ;AAClD,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,SAAS,IAAI,CAAC,UAAU;AAC7B,UAAM,EAAE,MAAM,OAAO,aAAa,cAAc,GAAG,QAAQ,IAAI;AAC/D,WAAO;AAAA,EACT,CAAC,EAAE,OAAO,CAAC,YAAY;AACrB,UAAM,MAAM,GAAG,QAAQ,MAAM,IAAI,QAAQ,OAAO,EAAE,IAAI,QAAQ,cAAc,EAAE,IAAI,QAAQ,SAAS,EAAE;AACrG,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAASC,eAAc,QAA6C;AAClE,SAAO,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,CAAC,CAAC;AAC/E;AAEA,SAAS,eAAe,OAA+C;AACrE,SAAO,OAAO,QAAQ,UAAU,GAAG;AACrC;AAEA,SAASI,cAAa,QAAuD;AAC3E,SAAO,OAAO,IAAI,CAAC,UAAU,OAAO,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,UAA2B,QAAQ,KAAK,CAAC;AAClH;AAEA,SAASD,mBAAkB,OAAoC;AAC7D,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,WAAO,MAAM,KAAK;AAAA,EACpB;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAASD,mBAAkB,OAAoC;AAC7D,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,WAAW,KAAK;AACtC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,SAAS,OAAwB;AACxC,SAAO,KAAK,UAAU,mBAAmB,KAAK,CAAC,EAAE,QAAQ,MAAM,SAAS;AAC1E;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AACzB;AAEA,SAAS,mBAAmB,OAAyB;AACnD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,kBAAkB,EAAE,OAAO,CAAC,SAAS,SAAS,MAAS;AAAA,EAC1E;AAEA,MAAIG,UAAS,KAAK,GAAG;AACnB,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,KAAK,EACjB,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,mBAAmB,IAAI,CAAC,CAAU,EAC7D,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,SAAS,UAAa,SAAS,SAAS,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE;AAAA,IAC1G;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,0BACP,MACA,cACA,iBAC6B;AAC7B,QAAM,cAAc,KAAK,aAAa,YAAY,KAAK;AACvD,QAAM,OAAO,gBAAgB,aAAa,KAAK,QAAQ;AACvD,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,aACJ,SAAS,UACL;AAAA,IACE,GAAG,uBAAuB,KAAK,QAAQ;AAAA,IACvC,GAAG,sBAAsB,KAAK,OAAO,KAAK,WAAW;AAAA,EACvD,IACA,CAAC;AACP,QAAM,QAAoB;AAAA,IACxB,KAAK,KAAK;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,KAAK;AAAA,IACX,OAAO,WAAW;AAAA,IAClB,QAAQ,WAAW;AAAA,IACnB,OAAO,SAAS,UAAU,KAAK;AAAA,IAC/B,YAAY,SAAS,UAAU,MAAM;AAAA,EACvC;AAEA,QAAM,aAAa,SAAS,UAAU,KAAK;AAC3C,QAAM,eAAe,SAAS,UAAW,WAAW,SAAS,WAAW,SAAS,KAAK,KAAM;AAE5F,QAAM,QAAQ;AAAA,IACZ,GAAI,KAAK,UAAU,SAAS,IAAI,CAAC,YAAY,KAAK,UAAU,MAAM,YAAY,KAAK,UAAU,WAAW,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,IAC3H;AAAA,IACA,mBAAmB,IAAI;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,IAAI,KAAK,cAAc,OAAO,KAAK,aAAa;AAAA,IAChD,KAAK;AAAA,IACL,UAAU,KAAK;AAAA,IACf,MAAM,SAAS,UAAU,UAAU;AAAA,IACnC;AAAA,IACA;AAAA,IACA,aAAa,KAAK,OAAO,aAAa,gBAAgB,CAAC;AAAA,IACvD,WAAW,SAAS,UAAU,KAAK,WAAW;AAAA,IAC9C,QAAQ,SAAS,UAAU,CAAC,KAAK,IAAI,CAAC;AAAA,IACtC,QAAQ,SAAS,UAAU,CAAC,KAAK,IAAI,CAAC;AAAA,IACtC,OAAO,SAAS,UAAU,CAAC,KAAK,IAAI,CAAC;AAAA,IACrC,UAAU,CAAC;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,OAAO,SAAS,UAAU,WAAW;AAAA,IACvC;AAAA,IACA,aAAa;AAAA,MACX,aAAa;AAAA,MACb,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,kBAAkB,KAAK;AAAA,MACvB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,aAAa,CAAC,QAAQ;AAAA,MACtB,UAAU,CAAC;AAAA,MACX;AAAA,MACA,kBAAkB,UAAU,IAAI;AAAA,MAChC,qBAAqB,SAAS,UAAU,6EAA6E;AAAA,MACrH,qBAAqB;AAAA,QACnB,OAAO;AAAA,QACP,aAAa;AAAA,QACb,OAAO,SAAS,UAAU,MAAM;AAAA,QAChC,gBAAgB;AAAA,QAChB,SAAS;AAAA,MACX;AAAA,MACA;AAAA,MACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,KAAkD;AAChF,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,QAAQ,eAAe,OAAO,aAAa,IAAI,OAAO,KAAK,OAAO,aAAa,IAAI,GAAG,CAAC;AAC7F,UAAM,SAAS,eAAe,OAAO,aAAa,IAAI,QAAQ,KAAK,OAAO,aAAa,IAAI,GAAG,CAAC;AAC/F,QAAI,SAAS,QAAQ;AACnB,aAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AAEA,UAAM,OAAO,OAAO,aAAa,IAAI,MAAM;AAC3C,UAAM,YAAY,MAAM,MAAM,2BAA2B;AACzD,QAAI,WAAW;AACb,aAAO,EAAE,OAAO,OAAO,UAAU,CAAC,CAAC,GAAG,QAAQ,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,IACrE;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,eAAe,OAA0C;AAChE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS;AAC1D;AAEA,SAAS,gBAAgB,aAAqB,KAAsD;AAClG,QAAM,gBAAgB,IAAI,YAAY;AAEtC,MAAI,YAAY,WAAW,QAAQ,KAAK,6CAA6C,KAAK,aAAa,GAAG;AACxG,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,WAAW,QAAQ,KAAK,uCAAuC,KAAK,aAAa,GAAG;AAClG,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,WAAW,QAAQ,KAAK,yCAAyC,KAAK,aAAa,GAAG;AACpG,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,KAAqB;AAC1C,MAAI;AACF,WAAO,aAAa,GAAG;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC7jCO,SAAS,kBAAkB,UAAwC;AACxE,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB,aAAa,SAAS;AAAA,IACtB,OAAO,SAAS;AAAA,IAChB,KAAK,SAAS,gBAAgB,SAAS;AAAA,IACvC,UAAU,SAAS;AAAA,IACnB,QAAQ,cAAc,SAAS,gBAAgB,SAAS,QAAQ;AAAA,IAChE,QAAQ,SAAS,QAAQ;AAAA,IACzB,MAAM,SAAS;AAAA,IACf,YAAY,SAAS;AAAA,EACvB;AACF;AAEA,SAAS,cAAc,KAAiC;AACtD,MAAI;AACF,WAAO,IAAI,IAAI,GAAG,EAAE,SAAS,QAAQ,UAAU,EAAE;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACRO,IAAM,WAA4B;AAAA,EACvC,IAAI,QAAQ;AACV,yBAAqB,MAAM;AAC3B,WAAO;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACrBO,SAAS,oBAA2C;AACzD,SAAO;AAAA,IACL,WAAW,CAAC;AAAA,IACZ,aAAa,CAAC;AAAA,IACd,UAAU,CAAC;AAAA,IACX,OAAO,CAAC;AAAA,IACR,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AACF;AAEO,SAAS,WAAW,aAAoC,SAAwC;AACrG,cAAY,SAAS,KAAK,OAAO;AACjC,SAAO;AACT;;;AxBYA,IAAO,gBAAQ;","names":["net","import_node_net","net","isRecord","_","headersToObject","readMetaKey","firstRaw","allRaw","imageArea","shouldIgnoreMediaUrl","isRecord","url","mediaSignature","clamp","normalizeAssets","uniqueStrings","sourceLabel","stripUndefined","stringFromUnknown","entity","stringFromUnknown","isRecord","uniqueStrings","hasJsonLdType","findValueByKeys","arrayOfStrings","mergeFallbackAttempts","uniqueStrings","isRedditUrl","numberFromUnknown","stringFromUnknown","firstText","isRecord"]}