api_binding_ui 2.0.2 → 3.0.0

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.
@@ -0,0 +1,16 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/framework/openapi.ts", "../src/framework/loadCatalog.ts", "../src/framework/names.ts", "../src/framework/file.ts", "../src/framework/schema.ts", "../src/framework/engine.ts", "../src/framework/validate.ts"],
4
+ "sourcesContent": [
5
+ "/** OpenAPI 3.0–3.2 → Catalog. */\nimport type { Catalog, CatalogOperation, CatalogParameter, JsonSchema } from \"./contract\";\n\ntype Obj = Record<string, any>;\nconst METHODS = [\"get\", \"put\", \"post\", \"delete\", \"patch\", \"head\", \"options\", \"trace\", \"query\"];\n\n/** FNV-1a, enough to detect catalog drift. */\nexport function hashString(s: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); h = Math.imul(h, 0x01000193); }\n return (h >>> 0).toString(16).padStart(8, \"0\");\n}\n\nfunction pointerGet(doc: Obj, ref: string): unknown {\n if (!ref.startsWith(\"#/\")) return undefined;\n return ref.slice(2).split(\"/\").map(k => k.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n .reduce<any>((o, k) => (o == null ? undefined : o[k]), doc);\n}\n\n/** Inline every local $ref. Cycles stop at the first repeat and keep the $ref. */\nfunction deref(doc: Obj, node: unknown, seen: string[] = []): any {\n if (Array.isArray(node)) return node.map(n => deref(doc, n, seen));\n if (!node || typeof node !== \"object\") return node;\n const n = node as Obj;\n if (typeof n.$ref === \"string\") {\n if (seen.includes(n.$ref) || seen.length > 24) return { $ref: n.$ref };\n const { $ref, ...rest } = n;\n const target = deref(doc, pointerGet(doc, $ref), [...seen, $ref]);\n return Object.keys(rest).length ? { ...target, ...deref(doc, rest, seen) } : target;\n }\n const out: Obj = {};\n for (const [k, v] of Object.entries(n)) out[k] = deref(doc, v, seen);\n return out;\n}\n\nfunction jsonContent(content: Obj | undefined): JsonSchema | undefined {\n if (!content) return undefined;\n const key = Object.keys(content).find(k => /json/i.test(k)) ?? Object.keys(content)[0];\n return key ? content[key]?.schema : undefined;\n}\n\nfunction intentOf(method: string, op: Obj): string | undefined {\n if (typeof op[\"x-binding-intent\"] === \"string\") return op[\"x-binding-intent\"];\n if (method === \"get\" || method === \"head\" || method === \"query\") return \"read\";\n if ([\"put\", \"patch\", \"delete\"].includes(method)) return \"write\";\n return undefined; // unknown unless declared\n}\n\nexport function catalogFromOpenApi(input: unknown, source: { url?: string } = {}): Catalog {\n const doc = input as Obj;\n if (!doc || typeof doc !== \"object\" || !doc.paths) throw new Error(\"This file is not an OpenAPI document: it has no paths.\");\n const operations: CatalogOperation[] = [];\n // x-tagGroups: tag → product\n const productOf = new Map<string, string>();\n for (const g of (doc[\"x-tagGroups\"] as Array<{ name?: string; tags?: string[] }> | undefined) ?? []) g.tags?.forEach(t => { if (g.name) productOf.set(t, g.name); });\n for (const [path, rawItem] of Object.entries<Obj>(doc.paths)) {\n const item = deref(doc, rawItem) as Obj;\n for (const method of METHODS) {\n const op = item?.[method] as Obj | undefined;\n if (!op || !op.operationId) continue;\n const params: CatalogParameter[] = [];\n for (const p of [...(item.parameters ?? []), ...(op.parameters ?? [])]) {\n if (!p?.name || !p?.in) continue;\n const pointer = `/${p.in}/${p.name}`;\n const at = params.findIndex(x => x.pointer === pointer);\n const entry = { pointer, name: p.name, required: !!p.required || p.in === \"path\", schema: p.schema ?? {}, description: p.description };\n if (at >= 0) params[at] = entry; else params.push(entry);\n }\n for (const m of path.matchAll(/\\{([^}]+)\\}/g)) {\n if (!params.some(x => x.pointer === `/path/${m[1]}`)) params.unshift({ pointer: `/path/${m[1]}`, name: m[1], required: true, schema: { type: \"string\" } });\n }\n const bodySchema = jsonContent(op.requestBody?.content);\n const responses = Object.entries<Obj>(op.responses ?? {}).map(([status, r]) => ({ status, schema: jsonContent(r?.content) }));\n const extensions: Obj = {};\n for (const [k, v] of Object.entries(op)) if (k.startsWith(\"x-\")) extensions[k] = v;\n operations.push({\n id: op.operationId, method: method.toUpperCase(), path,\n summary: op.summary, description: op.description, tags: op.tags ?? [],\n product: (op.tags as string[] | undefined)?.map(t => productOf.get(t)).find(Boolean),\n intent: intentOf(method, op), parameters: params,\n body: bodySchema ? { required: !!op.requestBody?.required, schema: bodySchema } : undefined,\n responses, extensions,\n });\n }\n }\n const body = JSON.stringify(operations);\n return {\n catalogVersion: 1,\n source: { title: doc.info?.title ?? \"API\", version: doc.info?.version ?? \"\", url: source.url },\n hash: hashString(body),\n operations,\n schemas: {},\n };\n}\n\n",
6
+ "/** Reads a published OpenAPI document (JSON or YAML). Separate from openapi.ts to keep YAML out of the runtime bundle. */\nimport { parse } from \"yaml\";\nimport type { Catalog } from \"./contract\";\nimport { catalogFromOpenApi } from \"./openapi\";\n\nexport class CatalogLoadError extends Error {\n constructor(message: string, readonly source: string) { super(message); this.name = \"CatalogLoadError\"; }\n}\n\n/** Parses OpenAPI text. `source` names where it came from (a URL, or \"pasted\"). */\nexport function catalogFromText(text: string, source: string): Catalog {\n const body = text.trim();\n if (!body) throw new CatalogLoadError(\"Nothing to read: the text is empty.\", source);\n let doc: unknown;\n try {\n // JSON.parse is several times faster than the YAML parser, so try it first when the text looks like JSON.\n doc = body.startsWith(\"{\") ? JSON.parse(body) : parse(body);\n } catch {\n throw new CatalogLoadError(\"The text is not valid JSON or YAML.\", source);\n }\n try {\n return catalogFromOpenApi(doc, source.includes(\"://\") ? { url: source } : {});\n } catch (e) {\n throw new CatalogLoadError(e instanceof Error ? e.message : \"The text is not an OpenAPI document.\", source);\n }\n}\n\nexport async function loadCatalog(url: string, init?: RequestInit): Promise<Catalog> {\n let res: Response;\n try {\n res = await fetch(url, { ...init, headers: { Accept: \"application/yaml, application/json, text/yaml, */*\", ...init?.headers } });\n } catch {\n // fetch rejects only on network or CORS failure; the browser does not say which.\n throw new CatalogLoadError(\"The docs could not be reached. Check the URL, your network, and that the docs server allows this site (CORS).\", url);\n }\n if (!res.ok) throw new CatalogLoadError(`The docs server answered ${res.status} ${res.statusText}. Check the URL.`, url);\n return catalogFromText(await res.text(), url);\n}\n",
7
+ "/** Identifiers to words, for matching and labels. */\nimport type { Glossary } from \"./contract\";\n\n/* ------------------------------------------------------------------ */\n/* Names */\n/* ------------------------------------------------------------------ */\n\nexport const sing = (w: string) => (w.length > 3 && w.endsWith(\"s\") ? w.slice(0, -1) : w);\nexport function synonymIndex(glossaries: Glossary[]) {\n const m: Record<string, string[]> = {};\n glossaries.forEach(g => g.synonyms.forEach(grp => { const g2 = grp.map(x => sing(x.toLowerCase())); g2.forEach(w => { m[w] = g2; }); }));\n return m;\n}\nexport function words(text: string): string[] {\n return text.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").toLowerCase().split(/[^a-z0-9]+/).filter(w => w.length > 1).map(sing);\n}\n/** Turns an identifier into words people read: \"noteTypeId\" → \"Note type id\". */\nexport function humanize(id: string): string {\n const s = id.replace(/^\\$\\.?/, \"\").replace(/\\[\\*\\]/g, \"\").split(/[./]/).filter(Boolean).pop() ?? id;\n const w = s.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").replace(/[_-]+/g, \" \").toLowerCase().trim();\n return w ? w[0].toUpperCase() + w.slice(1) : id;\n}\n",
8
+ "/** The bindings file: parsing, and conversion to and from the studio's working model. */\nimport type { BindingsFile, Catalog, ScreenEntry, ScreenId, SlotBinding, ValidationIssue } from \"./contract\";\nimport type { BindingIndex, FrameworkData } from \"./engine\";\nimport { humanize } from \"./names\";\n\n/** Screen and component ids: lowercase kebab-case segments joined by dots, at least two. */\nexport const ID = /^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$/;\n\nconst BINDING_TYPES = new Set([\"operation\", \"expression\", \"steps\", \"none\"]);\n\n/** Parses and shape-checks a bindings file. Throws a message a person can act on. */\nexport function parseBindingsFile(text: string): BindingsFile {\n let data: unknown;\n try { data = JSON.parse(text); } catch { throw new Error(\"The bindings file is not valid JSON.\"); }\n const f = data as Partial<BindingsFile> | null;\n if (!f || typeof f !== \"object\") throw new Error(\"The bindings file must be a JSON object.\");\n if (f.version !== 3) throw new Error(`The bindings file must have \"version\": 3.`);\n if (typeof f.openapi !== \"string\" || !f.openapi) throw new Error(`The bindings file needs \"openapi\": the docs URL or a path.`);\n for (const k of [\"kinds\", \"screens\", \"components\", \"bindings\"] as const) if (!Array.isArray(f[k])) throw new Error(`\"${k}\" must be a list.`);\n f.bindings!.forEach((b, i) => {\n const x = b as Partial<SlotBinding> | null;\n if (!x || typeof x.component !== \"string\" || typeof x.slot !== \"string\" || !BINDING_TYPES.has(x.type as string))\n throw new Error(`Binding ${i + 1} needs \"component\", \"slot\" and a known \"type\".`);\n });\n if (f.output && (typeof f.output.dir !== \"string\" || typeof f.output.client !== \"string\")) throw new Error(`\"output\" needs \"dir\" and \"client\".`);\n return f as BindingsFile;\n}\n\n/** The screen an id belongs to: the longest screen id that prefixes it. */\nexport function screenOf(id: string, screens: readonly ScreenId[]): ScreenId | undefined {\n let best: ScreenId | undefined;\n for (const s of screens) if (id.startsWith(s + \".\") && (!best || s.length > best.length)) best = s;\n return best;\n}\n\n/** Product label for a screen: the docs' product whose name matches the first id segment, else the segment in words. */\nfunction productLabel(seg: string, catalog: Catalog): string {\n const names = new Set(catalog.operations.map(o => o.product).filter((p): p is string => !!p));\n return [...names].find(n => n.toLowerCase().replace(/[^a-z0-9]+/g, \"-\") === seg) ?? humanize(seg);\n}\n\n/** Builds the studio's model. Components and bindings that fit no screen are dropped with an issue. */\nexport function fromFile(file: BindingsFile, catalog: Catalog): { fw: FrameworkData; index: BindingIndex; issues: ValidationIssue[] } {\n const issues: ValidationIssue[] = [];\n const ids = file.screens.map(s => s.id);\n const screens: ScreenEntry[] = file.screens.map(s => ({\n id: s.id, label: s.label, description: s.description, context: s.context ?? [], components: [],\n path: [productLabel(s.id.split(\".\")[0], catalog)],\n parent: screenOf(s.id, ids),\n }));\n const byId = new Map(screens.map(s => [s.id, s]));\n const screenIds = new Set(ids);\n for (const c of file.components) {\n // One namespace: a component named like a screen would also capture that screen's components.\n if (screenIds.has(c.id)) { issues.push({ severity: \"error\", screen: c.id, component: c.id, code: \"registry.id-clash\", message: `\"${c.id}\" is both a screen and a component id.` }); continue; }\n const s = screenOf(c.id, ids);\n if (!s) { issues.push({ severity: \"error\", screen: \"\", component: c.id, code: \"registry.no-screen\", message: `\"${c.id}\" starts with no registered screen id.` }); continue; }\n byId.get(s)!.components.push({ bindId: c.id, kind: c.kind, label: c.label, parent: c.parent, info: c.info });\n }\n const index: BindingIndex = {};\n for (const b of file.bindings) {\n const s = screenOf(b.component, ids);\n if (!s) { issues.push({ severity: \"error\", screen: \"\", component: b.component, slot: b.slot, code: \"binding.no-screen\", message: `Binding for \"${b.component}\" fits no screen.` }); continue; }\n (index[s] ??= []).push(b);\n }\n return {\n fw: { descriptors: file.kinds, registry: { registryVersion: 1, screens }, catalog, glossaries: file.glossaries },\n index, issues,\n };\n}\n\n/** The file with its bindings replaced by the index, in registry order so diffs stay small. */\nexport function toFile(file: BindingsFile, index: BindingIndex): BindingsFile {\n const order = new Map(file.components.map((c, i) => [c.id, i]));\n const bindings = Object.values(index).flat()\n .sort((a, b) => (order.get(a.component) ?? 1e9) - (order.get(b.component) ?? 1e9) || a.slot.localeCompare(b.slot));\n return { ...file, bindings };\n}\n\n/** In-memory store, for tests and embedding. */\nexport function memoryStore(seed: BindingsFile) {\n let file = seed;\n return { load: async () => file, save: async (f: BindingsFile) => { file = f; }, get current() { return file; } };\n}\n\n/** Store backed by the CLI's studio server. */\nexport function httpStore(url: string) {\n return {\n async load() {\n const res = await fetch(url, { cache: \"no-store\" });\n if (!res.ok) throw new Error(`Could not read the bindings file (HTTP ${res.status}).`);\n return parseBindingsFile(await res.text());\n },\n async save(file: BindingsFile) {\n const res = await fetch(url, { method: \"PUT\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(file, null, 2) + \"\\n\" });\n if (!res.ok) throw new Error((await res.text()) || `Could not save (HTTP ${res.status}).`);\n },\n };\n}\n",
9
+ "/** JSON Schema helpers and per-operation views. */\nimport type { Catalog, CatalogOperation, JsonSchema } from \"./contract\";\n\nexport type Field = [name: string, type: string];\nexport type ReqField = [pointer: string, type: string, required: boolean];\n\nexport interface OpView {\n op: CatalogOperation;\n req: ReqField[];\n lists: Array<{ select: string; fields: Field[] }>;\n one: Field[] | null;\n scalars: Field[];\n}\n\n/* ------------------------------------------------------------------ */\n/* JSON Schema reading */\n/* ------------------------------------------------------------------ */\n\ntype S = Record<string, any>;\nexport const obj = (s: JsonSchema | undefined): S => (s && typeof s === \"object\" ? (s as S) : {});\nexport function flat(s: JsonSchema | undefined): S {\n const o = obj(s);\n const parts = [o, ...((o.allOf as JsonSchema[]) ?? []).map(flat)];\n if (parts.length === 1 && !o.oneOf && !o.anyOf) return o;\n const props: S = {};\n const required: string[] = [];\n parts.forEach(p => { Object.assign(props, p.properties ?? {}); required.push(...(p.required ?? [])); });\n const alt = ((o.oneOf ?? o.anyOf) as JsonSchema[] | undefined)?.map(flat).find(x => x.type !== \"null\");\n return { ...(alt ?? {}), ...o, properties: Object.keys(props).length ? props : alt?.properties, required };\n}\nexport function typeName(s: JsonSchema | undefined): string {\n const o = flat(s);\n const t = Array.isArray(o.type) ? o.type.find((x: string) => x !== \"null\") : o.type;\n if (t === \"array\") return typeName(o.items) + \"[]\";\n if (o.format === \"date-time\" || o.format === \"date\") return \"date-time\";\n if (t === \"integer\" || t === \"number\") return \"number\";\n return t ?? (o.properties ? \"object\" : \"any\");\n}\nexport const isObject = (s: JsonSchema | undefined) => { const o = flat(s); return o.type === \"object\" || !!o.properties; };\nexport const propsOf = (s: JsonSchema | undefined): Field[] => Object.entries<JsonSchema>(flat(s).properties ?? {}).map(([k, v]) => [k, typeName(v)]);\n\nfunction leaves(schema: JsonSchema, prefix: string, required: boolean, out: ReqField[], depth = 0) {\n const s = flat(schema);\n if (isObject(s)) {\n const props = Object.entries<JsonSchema>(s.properties ?? {});\n if (!props.length || depth > 3) { out.push([prefix, \"object\", required]); return; }\n const req = new Set<string>(s.required ?? []);\n props.forEach(([k, v]) => { if (!flat(v).readOnly) leaves(v, `${prefix}/${k}`, required && req.has(k), out, depth + 1); });\n } else out.push([prefix, typeName(s), required]);\n}\nfunction listsIn(schema: JsonSchema | undefined, path: string, out: OpView[\"lists\"], depth = 0) {\n const s = flat(schema);\n if (s.type === \"array\") { if (isObject(s.items)) out.push({ select: `${path}[*]`, fields: propsOf(s.items) }); return; }\n if (isObject(s) && depth < 4) Object.entries<JsonSchema>(s.properties ?? {}).forEach(([k, v]) => listsIn(v, `${path}.${k}`, out, depth + 1));\n}\n\nconst views = new WeakMap<Catalog, Map<string, OpView>>();\nexport function opViews(catalog: Catalog): Map<string, OpView> {\n let m = views.get(catalog);\n if (m) return m;\n m = new Map();\n for (const op of catalog.operations) {\n const req: ReqField[] = op.parameters.map(p => [p.pointer, typeName(p.schema), p.required]);\n if (op.body) leaves(op.body.schema, \"/body\", op.body.required, req);\n const ok = op.responses.find(r => /^2/.test(r.status) && r.schema);\n const lists: OpView[\"lists\"] = [];\n if (ok) listsIn(ok.schema, \"$\", lists);\n const one = ok && !lists.length && isObject(ok.schema) ? propsOf(ok.schema) : null;\n const scalars = ok ? propsOf(ok.schema).filter(([, t]) => t !== \"object\" && !t.endsWith(\"[]\")).map(([k, t]) => [`$.${k}`, t] as Field) : [];\n m.set(op.id, { op, req, lists, one, scalars });\n }\n views.set(catalog, m);\n return m;\n}\n",
10
+ "/** Matching, proposals and status for bindings. Generic: no kinds, products or field names. */\nimport type {\n OperationConsumeBinding,\n BindId, Catalog, CatalogOperation, ComponentDescriptor, ComponentInstance, ContextDeclaration,\n ContextProvider, Glossary, ScreenEntry, ScreenId, ScreenRegistry, SlotBinding,\n SlotDescriptor, TransformDefinition,\n} from \"./contract\";\nimport { synonymIndex, words, humanize } from \"./names\";\nimport { flat, obj, opViews, propsOf, typeName, type Field, type OpView } from \"./schema\";\n\nexport type { Field, OpView, ReqField } from \"./schema\";\nexport { opViews } from \"./schema\";\nexport { humanize, words } from \"./names\";\n\n\nexport interface FrameworkData {\n descriptors: ComponentDescriptor[];\n registry: ScreenRegistry;\n catalog: Catalog;\n transforms?: TransformDefinition[];\n providers?: ContextProvider[];\n glossaries?: Glossary[];\n}\n\n\nexport interface Source {\n expr: string; label: string; name?: string; type: string; group: \"item\" | \"screen\" | \"context\" | \"provider\"; fields?: Field[];\n /** Set when the value's shape is not known yet: names the slot that must be connected first. */\n waitsFor?: string;\n}\nexport interface Ranked { view: OpView; score: number; reasons: string[] }\nexport type SlotState = \"bound\" | \"suggested\" | \"unbound\";\n\n/* ------------------------------------------------------------------ */\n/* Engine */\n/* ------------------------------------------------------------------ */\n\nexport type BindingIndex = Record<ScreenId, SlotBinding[]>;\n\nexport function createEngine(fw: FrameworkData, manifests: BindingIndex) {\n const OPV = opViews(fw.catalog);\n const OPS = [...OPV.values()];\n const DESC = new Map(fw.descriptors.map(d => [d.kind, d]));\n const SCR = new Map(fw.registry.screens.map(s => [s.id, s]));\n const transforms = fw.transforms ?? [];\n const providers = fw.providers ?? [];\n const syn = synonymIndex(fw.glossaries ?? []);\n\n const key = (s: string, c: string, sl: string) => `${s}|${c}|${sl}`;\n const BIND = new Map<string, SlotBinding>();\n for (const [s, list] of Object.entries(manifests)) for (const b of list) {\n if (b.type === \"operation\" && !OPV.has(b.operation)) continue; // operation no longer in the catalog\n if (b.type === \"steps\" && b.steps.some(st => !OPV.has(st.operation))) continue;\n BIND.set(key(s, b.component, b.slot), b);\n }\n const getB = (s: ScreenId, c: BindId, sl: string) => BIND.get(key(s, c, sl));\n const screen = (id: ScreenId) => SCR.get(id)!;\n const compOf = (s: ScreenId, id: BindId) => SCR.get(s)?.components.find(c => c.bindId === id);\n const descOf = (c: ComponentInstance) => DESC.get(c.kind);\n const bindable = (d: ComponentDescriptor | undefined) => (d ? d.slots.filter(x => x.role !== \"produce\") : []);\n\n /* names */\n const tokCache = new Map<string, Set<string>>();\n const tok = (text: string, expand: boolean) => {\n const k = (expand ? \"+\" : \"-\") + text;\n let out = tokCache.get(k);\n if (out) return out;\n out = new Set<string>();\n for (const w of words(text)) { out.add(w); if (expand) (syn[w] ?? []).forEach(x => out!.add(x)); }\n tokCache.set(k, out);\n return out;\n };\n /** Synonyms expand the source side only, so a glossary widens matches without raising scores. */\n function nameScore(target: string, source: string) {\n const a = tok(target, false), b = tok(source, true);\n if (!a.size || !b.size) return 0;\n let n = 0; a.forEach(x => { if (b.has(x)) n++; });\n return n && n / a.size >= 0.5 ? (0.6 * n) / a.size + (0.4 * n) / b.size : 0;\n }\n const base = (t: string) => t.replace(\"[]\", \"\");\n function typeFit(target: string, source: string): { ok: boolean; transform?: string } {\n if (target !== \"any\" && source !== \"any\" && target.endsWith(\"[]\") !== source.endsWith(\"[]\")) return { ok: false };\n const t = base(target), s = base(source);\n if (t === \"any\" || s === \"any\" || t === s) return { ok: true };\n const tr = transforms.find(x => typeName(x.input) === s && typeName(x.output) === t);\n return tr ? { ok: true, transform: tr.name } : { ok: false };\n }\n\n /* shapes: types flow through bindings */\n function bindingFields(s: ScreenId, c: BindId, slotId: string): Field[] | null {\n const b = getB(s, c, slotId);\n if (!b || b.type !== \"operation\") return null;\n const v = OPV.get(b.operation);\n if (!v) return null;\n if (b.select === \"$\" && v.one) return v.one;\n return v.lists.find(x => x.select === b.select)?.fields ?? null;\n }\n function shapeOf(s: ScreenId, comp: ComponentInstance, slot: SlotDescriptor): { many: boolean; fields?: Field[]; type?: string; via?: string } {\n const sc = obj(slot.schema);\n if (typeof sc.$ref === \"string\" && sc.$ref.startsWith(\"#slot/\")) {\n const via = sc.$ref.slice(6);\n return { many: !!slot.many, fields: bindingFields(s, comp.bindId, via) ?? [], via };\n }\n if (flat(sc).properties) return { many: !!slot.many, fields: propsOf(sc) };\n return { many: !!slot.many, type: typeName(sc) };\n }\n function contextShape(ctx: ContextDeclaration): { many: boolean; fields: Field[] } {\n if (\"schema\" in ctx.shape) return { many: !!ctx.many, fields: propsOf(ctx.shape.schema) };\n const f = ctx.shape.from, comp = compOf(f.screen, f.component), d = comp && descOf(comp), slot = d?.slots.find(x => x.id === f.slot);\n return { many: !!ctx.many, fields: (slot && comp ? shapeOf(f.screen, comp, slot).fields : null) ?? [] };\n }\n /** Fields of `$item` for a scoped slot: the parent's bound data. */\n function scopeFields(s: ScreenId, comp: ComponentInstance, slot: SlotDescriptor): Field[] | null {\n if (!slot.scope || !comp.parent) return null;\n return bindingFields(s, comp.parent, slot.scope.parentSlot);\n }\n function manyContext(s: ScreenId) { return screen(s).context.find(x => x.many); }\n\n /* values available on a screen */\n function sources(s: ScreenId, opts: { item?: Field[] } = {}): Source[] {\n const out: Source[] = [], S = screen(s);\n opts.item?.forEach(([f, t]) => out.push({ expr: `$item.${f}`, label: humanize(f), name: f, type: t, group: \"item\" }));\n S.components.forEach(c => {\n const d = descOf(c);\n d?.slots.filter(x => x.role === \"produce\").forEach(sl => {\n const sh = shapeOf(s, c, sl);\n if (sh.fields?.length) {\n if (sh.many) out.push({ expr: `${c.bindId}:${sl.id}`, label: `${c.label} · ${sl.label}`, type: \"list\", group: \"screen\", fields: sh.fields });\n sh.fields.forEach(([f, t]) => out.push({ expr: `${c.bindId}:${sl.id}${sh.many ? \"[*]\" : \"\"}.${f}`, label: `${c.label} · ${humanize(f)}`, name: f, type: sh.many ? t + \"[]\" : t, group: \"screen\" }));\n } else if (sh.via) {\n const via = d.slots.find(x => x.id === sh.via);\n out.push({ expr: `${c.bindId}:${sl.id}`, label: `${c.label} · ${sl.label}`, type: \"pending\", group: \"screen\", waitsFor: `${c.label} · ${via?.label ?? sh.via}` });\n } else out.push({ expr: `${c.bindId}:${sl.id}`, label: c.label + (sl.label && bindable(d).length + 1 < d.slots.length ? ` · ${sl.label}` : \"\"), name: c.label, type: sh.many ? \"list\" : sh.type ?? \"any\", group: \"screen\" });\n });\n });\n S.context.forEach(ctx => {\n const sh = contextShape(ctx);\n if (ctx.many) out.push({ expr: `$context.${ctx.id}`, label: ctx.label, type: \"list\", group: \"context\", fields: sh.fields });\n sh.fields.forEach(([f, t]) => out.push({ expr: `$context.${ctx.id}${ctx.many ? \"[*]\" : \"\"}.${f}`, label: `${ctx.label} · ${humanize(f)}`, name: f, type: ctx.many ? t + \"[]\" : t, group: \"context\" }));\n });\n providers.forEach(p => propsOf(p.schema).forEach(([f, t]) => out.push({ expr: `$${p.id}.${f}`, label: `${p.label} · ${humanize(f)}`, name: `${p.label} ${f}`, type: t, group: \"provider\" })));\n return out;\n }\n /** Sources that fit the target type, best name match first. */\n function rankSources(targetName: string, targetType: string, srcs: Source[], min = 0.65) {\n const out: Array<{ expr: string; score: number; source: Source }> = [];\n for (const x of srcs) {\n if (x.type === \"list\" || x.waitsFor) continue;\n const fit = typeFit(targetType, x.type);\n if (!fit.ok) continue;\n let sc = Math.max(nameScore(targetName, x.name ?? x.label), nameScore(targetName, x.label) * 0.9);\n if (x.group === \"screen\") sc += 0.12; else if (x.group === \"item\") sc += 0.05;\n if (fit.transform) sc -= 0.05;\n if (sc >= min) out.push({ expr: x.expr + (fit.transform ? ` | ${fit.transform}()` : \"\"), score: sc, source: x });\n }\n return out.sort((a, b) => b.score - a.score);\n }\n function bestSource(targetName: string, targetType: string, srcs: Source[]) {\n return rankSources(targetName, targetType, srcs)[0] ?? null;\n }\n /** A one-word field is qualified by its parent: the path resource for parameters, the parent object for body fields. */\n function qualified(ptr: string, op: CatalogOperation) {\n const parts = ptr.split(\"/\").filter(Boolean), name = parts[parts.length - 1];\n if (words(name).length > 1) return name;\n if (parts[0] === \"body\") return parts.length > 2 ? `${parts[parts.length - 2]} ${name}` : name;\n const segs = op.path.split(\"/\").filter(x => x && !x.startsWith(\"{\"));\n return `${segs[segs.length - 1] ?? \"\"} ${name}`;\n }\n function proposeRequest(v: OpView, srcs: Source[]) {\n const req: Record<string, string> = {};\n v.req.forEach(([ptr, t]) => { const m = bestSource(qualified(ptr, v.op), t, srcs); if (m) req[ptr] = m.expr; });\n return req;\n }\n function proposeMap(slotFields: Field[], itemFields: Field[]) {\n const map: Record<string, string> = {};\n const srcs: Source[] = itemFields.map(([f, t]) => ({ expr: `$item.${f}`, name: f, label: f, type: t, group: \"item\" }));\n slotFields.forEach(([p, t]) => { const m = bestSource(p, t, srcs); if (m) map[p] = m.expr; });\n return map;\n }\n function triggerSources(s: ScreenId, item?: Field[]) {\n const mc = manyContext(s);\n return sources(s, { item: item ?? (mc ? contextShape(mc).fields : undefined) });\n }\n\n /* matchers: generic, metadata only */\n function rank(s: ScreenId, comp: ComponentInstance, slot: SlotDescriptor): Ranked[] {\n const S = screen(s);\n const near = tok([comp.label, ...(slot.hints?.keywords ?? [])].join(\" \"), true);\n const far = tok([S.label, ...S.path].join(\" \"), true);\n /** Share of the operation's name covered by the component (full weight) or the screen (half). */\n const cover = (o: CatalogOperation) => {\n const own = tok([o.id, ...o.tags].join(\" \"), false);\n if (!own.size) return { score: 0, near: false };\n let a = 0, b = 0; own.forEach(w => { if (near.has(w)) a++; else if (far.has(w)) b++; });\n return { score: Math.min(1, (a + 0.5 * b) / own.size), near: a > 0 };\n };\n const srcs = slot.role === \"trigger\" ? triggerSources(s) : sources(s);\n const own = srcs.filter(x => x.group === \"screen\" && x.type !== \"list\").length || 1;\n return OPS.map(v => {\n const reasons: string[] = []; let tot = 0, w = 0;\n const add = (weight: number, score: number, why: string | null) => { tot += weight * score; w += weight; if (score >= 0.5 && why) reasons.push(why); };\n const o = v.op;\n const prop = proposeRequest(v, srcs);\n if (slot.role === \"consume\") {\n const sh = shapeOf(s, comp, slot);\n const shape = sh.many ? (v.lists.length ? 1 : 0) : sh.fields?.length ? (v.one || v.lists.length ? 0.7 : 0) : (v.scalars.some(([, t]) => typeFit(sh.type ?? \"any\", t).ok) || v.one ? 0.7 : 0);\n add(0.3, shape, sh.many ? \"Returns a list\" : \"Returns a matching value\");\n add(0.15, o.intent === \"read\" ? 1 : o.intent ? 0 : 0.5, o.intent === \"read\" ? \"Reads data\" : null);\n } else {\n add(0.2, v.req.length ? 0.8 : 0.2, null);\n add(0.15, o.intent === \"write\" ? 1 : o.intent === \"read\" ? 0.1 : 0.5, o.intent === \"write\" ? \"Saves data\" : null);\n const body = v.req.filter(([p]) => p.startsWith(\"/body/\"));\n const filled = Object.entries(prop).filter(([p, e]) => p.startsWith(\"/body/\") && !e.startsWith(\"$\")).length;\n add(0.3, body.length ? Math.min(1, filled / Math.min(own, body.length)) : 0, filled ? `Uses ${filled} values from this screen` : null);\n }\n const required = v.req.filter(r => r[2]);\n if (required.length) {\n const ok = required.filter(([p]) => prop[p]).length;\n add(0.25, ok / required.length, ok === required.length ? \"All required inputs available\" : null);\n } else add(0.25, 1, null);\n if (o.product) add(0.1, o.product === S.path[0] ? 1 : 0, o.product === S.path[0] ? `From ${o.product}` : null);\n const nm = cover(o);\n add(0.35, nm.score, nm.score >= 0.5 ? (nm.near ? `Name fits “${comp.label}”` : \"Name fits this screen\") : null);\n return { view: v, score: w ? tot / w : 0, reasons };\n }).sort((a, b) => b.score - a.score);\n }\n\n /* status */\n function slotState(s: ScreenId, c: BindId, sl: string): SlotState {\n const b = getB(s, c, sl);\n return !b ? \"unbound\" : b.state === \"confirmed\" ? \"bound\" : \"suggested\";\n }\n function compState(s: ScreenId, comp: ComponentInstance): SlotState | \"partial\" {\n const sl = bindable(descOf(comp));\n if (!sl.length) return \"bound\";\n const st = sl.map(x => slotState(s, comp.bindId, x.id));\n if (st.includes(\"suggested\")) return \"suggested\";\n if (st.every(x => x === \"bound\")) return \"bound\";\n const must = sl.filter(x => x.required);\n if (must.length && must.every(x => slotState(s, comp.bindId, x.id) === \"bound\") && st.includes(\"bound\")) return \"bound\";\n return st.includes(\"bound\") ? \"partial\" : \"unbound\";\n }\n /** Counts components, not slots. */\n function tally(screens: ScreenEntry[]) {\n const t = { bound: 0, suggested: 0, unbound: 0, total: 0 };\n screens.forEach(S => S.components.forEach(c => {\n if (!bindable(descOf(c)).length) return;\n const st = compState(S.id, c);\n t[st === \"partial\" ? \"unbound\" : st]++; t.total++;\n }));\n return t;\n }\n\n const fieldsAt = (v: OpView, select: string): Field[] => (select === \"$\" ? v.one ?? [] : v.lists.find(l => l.select === select)?.fields ?? []);\n\n /** Consume binding for `opId`. With `strict`, null when nothing in the response fits the slot. */\n function proposeConsume(s: ScreenId, comp: ComponentInstance, slot: SlotDescriptor, opId: string, strict = false): OperationConsumeBinding | null {\n const v = OPV.get(opId);\n if (!v) return null;\n const shape = shapeOf(s, comp, slot);\n const props = shape.fields && !shape.via ? shape.fields : null;\n let select: string | undefined;\n if (shape.many) select = v.lists[0]?.select;\n else if (props) select = v.one ? \"$\" : v.lists[0]?.select;\n else {\n const scal: Source[] = v.scalars.map(([path, t]) => ({ expr: path, label: humanize(path), name: path.slice(2), type: t, group: \"item\" }));\n select = (rankSources(slot.label, shape.type ?? \"any\", scal)[0] ?? rankSources(`${comp.label} ${slot.label}`, shape.type ?? \"any\", scal)[0])?.expr.split(\" | \")[0];\n if (!select && !strict) select = v.scalars.find(([, t]) => typeFit(shape.type ?? \"any\", t).ok)?.[0];\n }\n if (!select) { if (strict) return null; select = \"$\"; }\n return {\n component: comp.bindId, slot: slot.id, type: \"operation\", operation: opId, select,\n request: proposeRequest(v, sources(s)),\n map: props ? proposeMap(props, fieldsAt(v, select)) : undefined,\n load: \"open\", origin: \"suggested\", state: \"draft\",\n };\n }\n /** Unbound consume slots of the same component that the same response can fill. */\n function siblingFills(s: ScreenId, comp: ComponentInstance, slot: SlotDescriptor, opId: string): OperationConsumeBinding[] {\n return bindable(descOf(comp)).filter(x => x.role === \"consume\" && !x.scope && x.id !== slot.id && !getB(s, comp.bindId, x.id))\n .map(x => proposeConsume(s, comp, x, opId, true)).filter((b): b is OperationConsumeBinding => !!b);\n }\n\n return {\n fw, OPV, OPS, DESC, SCR, getB, screen, compOf, descOf, bindable, typeFit, shapeOf, contextShape, scopeFields,\n sources, triggerSources, bestSource, rankSources, proposeRequest, proposeMap, rank, slotState, compState, tally, manyContext,\n fieldsAt, proposeConsume, siblingFills,\n };\n}\nexport type Engine = ReturnType<typeof createEngine>;\n\n",
11
+ "import type { ScreenRegistry, ValidationIssue } from \"./contract\";\nimport type { Engine, FrameworkData } from \"./engine\";\nimport { ID } from \"./file\";\n\n/* ------------------------------------------------------------------ */\n/* Validation: what does not validate is not shown */\n/* ------------------------------------------------------------------ */\n\nexport function validateRegistry(fw: FrameworkData): { registry: ScreenRegistry; issues: ValidationIssue[] } {\n const kinds = new Set(fw.descriptors.map(d => d.kind));\n const issues: ValidationIssue[] = [];\n const ids = new Set(fw.registry.screens.map(s => s.id));\n const seen = new Set<string>();\n const screens = fw.registry.screens.map(S => {\n if (!ID.test(S.id)) { issues.push({ severity: \"error\", screen: S.id, code: \"registry.invalid-id\", message: `Screen id \"${S.id}\" must be lowercase kebab-case segments joined by dots.` }); return { ...S, components: [] }; }\n const components = S.components.filter(c => {\n if (!ID.test(c.bindId)) { issues.push({ severity: \"error\", screen: S.id, component: c.bindId, code: \"registry.invalid-id\", message: `Component id \"${c.bindId}\" must be lowercase kebab-case segments joined by dots.` }); return false; }\n if (!kinds.has(c.kind)) { issues.push({ severity: \"error\", screen: S.id, component: c.bindId, code: \"registry.unknown-kind\", message: `\"${c.label}\" uses ${c.kind}, which has no descriptor.` }); return false; }\n if (seen.has(c.bindId)) { issues.push({ severity: \"error\", screen: S.id, component: c.bindId, code: \"registry.duplicate-id\", message: `Component id \"${c.bindId}\" is used twice.` }); return false; }\n seen.add(c.bindId); return true;\n }).filter(c => !c.parent || seen.has(c.parent) || (issues.push({ severity: \"error\", screen: S.id, component: c.bindId, code: \"registry.missing-parent\", message: `\"${c.label}\" names a parent that is not on the screen.` }), false));\n const parent = S.parent && ids.has(S.parent) ? S.parent : undefined;\n return { ...S, components, parent };\n });\n return { registry: { ...fw.registry, screens }, issues };\n}\n\nexport function validateBindings(engine: Engine): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n for (const S of engine.fw.registry.screens) for (const c of S.components) {\n const d = engine.descOf(c);\n d?.slots.filter(sl => sl.required && sl.role !== \"produce\").forEach(sl => {\n if (engine.slotState(S.id, c.bindId, sl.id) !== \"bound\") issues.push({ severity: \"warning\", screen: S.id, component: c.bindId, slot: sl.id, code: \"slot.required-unbound\", message: `${c.label}: ${sl.label} is not connected.` });\n });\n }\n return issues;\n}\n"
12
+ ],
13
+ "mappings": ";AAIA,IAAM,UAAU,CAAC,OAAO,OAAO,QAAQ,UAAU,SAAS,QAAQ,WAAW,SAAS,OAAO;AAGtF,SAAS,UAAU,CAAC,GAAmB;AAAA,EAC5C,IAAI,IAAI;AAAA,EACR,SAAS,IAAI,EAAG,IAAI,EAAE,QAAQ,KAAK;AAAA,IAAE,KAAK,EAAE,WAAW,CAAC;AAAA,IAAG,IAAI,KAAK,KAAK,GAAG,QAAU;AAAA,EAAG;AAAA,EACzF,QAAQ,MAAM,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA;AAG/C,SAAS,UAAU,CAAC,KAAU,KAAsB;AAAA,EAClD,IAAI,CAAC,IAAI,WAAW,IAAI;AAAA,IAAG;AAAA,EAC3B,OAAO,IAAI,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,CAAC,EAC9E,OAAY,CAAC,GAAG,MAAO,KAAK,OAAO,YAAY,EAAE,IAAK,GAAG;AAAA;AAI9D,SAAS,KAAK,CAAC,KAAU,MAAe,OAAiB,CAAC,GAAQ;AAAA,EAChE,IAAI,MAAM,QAAQ,IAAI;AAAA,IAAG,OAAO,KAAK,IAAI,OAAK,MAAM,KAAK,GAAG,IAAI,CAAC;AAAA,EACjE,IAAI,CAAC,QAAQ,OAAO,SAAS;AAAA,IAAU,OAAO;AAAA,EAC9C,MAAM,IAAI;AAAA,EACV,IAAI,OAAO,EAAE,SAAS,UAAU;AAAA,IAC9B,IAAI,KAAK,SAAS,EAAE,IAAI,KAAK,KAAK,SAAS;AAAA,MAAI,OAAO,EAAE,MAAM,EAAE,KAAK;AAAA,IACrE,QAAQ,SAAS,SAAS;AAAA,IAC1B,MAAM,SAAS,MAAM,KAAK,WAAW,KAAK,IAAI,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,IAChE,OAAO,OAAO,KAAK,IAAI,EAAE,SAAS,KAAK,WAAW,MAAM,KAAK,MAAM,IAAI,EAAE,IAAI;AAAA,EAC/E;AAAA,EACA,MAAM,MAAW,CAAC;AAAA,EAClB,YAAY,GAAG,MAAM,OAAO,QAAQ,CAAC;AAAA,IAAG,IAAI,KAAK,MAAM,KAAK,GAAG,IAAI;AAAA,EACnE,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,SAAkD;AAAA,EACrE,IAAI,CAAC;AAAA,IAAS;AAAA,EACd,MAAM,MAAM,OAAO,KAAK,OAAO,EAAE,KAAK,OAAK,QAAQ,KAAK,CAAC,CAAC,KAAK,OAAO,KAAK,OAAO,EAAE;AAAA,EACpF,OAAO,MAAM,QAAQ,MAAM,SAAS;AAAA;AAGtC,SAAS,QAAQ,CAAC,QAAgB,IAA6B;AAAA,EAC7D,IAAI,OAAO,GAAG,wBAAwB;AAAA,IAAU,OAAO,GAAG;AAAA,EAC1D,IAAI,WAAW,SAAS,WAAW,UAAU,WAAW;AAAA,IAAS,OAAO;AAAA,EACxE,IAAI,CAAC,OAAO,SAAS,QAAQ,EAAE,SAAS,MAAM;AAAA,IAAG,OAAO;AAAA,EACxD;AAAA;AAGK,SAAS,mBAAkB,CAAC,OAAgB,SAA2B,CAAC,GAAY;AAAA,EACzF,MAAM,MAAM;AAAA,EACZ,IAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,CAAC,IAAI;AAAA,IAAO,MAAM,IAAI,MAAM,wDAAwD;AAAA,EAC3H,MAAM,aAAiC,CAAC;AAAA,EAExC,MAAM,YAAY,IAAI;AAAA,EACtB,WAAW,KAAM,IAAI,kBAA4E,CAAC;AAAA,IAAG,EAAE,MAAM,QAAQ,OAAK;AAAA,MAAE,IAAI,EAAE;AAAA,QAAM,UAAU,IAAI,GAAG,EAAE,IAAI;AAAA,KAAI;AAAA,EACnK,YAAY,MAAM,YAAY,OAAO,QAAa,IAAI,KAAK,GAAG;AAAA,IAC5D,MAAM,OAAO,MAAM,KAAK,OAAO;AAAA,IAC/B,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,KAAK,OAAO;AAAA,MAClB,IAAI,CAAC,MAAM,CAAC,GAAG;AAAA,QAAa;AAAA,MAC5B,MAAM,SAA6B,CAAC;AAAA,MACpC,WAAW,KAAK,CAAC,GAAI,KAAK,cAAc,CAAC,GAAI,GAAI,GAAG,cAAc,CAAC,CAAE,GAAG;AAAA,QACtE,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG;AAAA,UAAI;AAAA,QACxB,MAAM,UAAU,IAAI,EAAE,MAAM,EAAE;AAAA,QAC9B,MAAM,KAAK,OAAO,UAAU,OAAK,EAAE,YAAY,OAAO;AAAA,QACtD,MAAM,QAAQ,EAAE,SAAS,MAAM,EAAE,MAAM,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,QAAQ,QAAQ,EAAE,UAAU,CAAC,GAAG,aAAa,EAAE,YAAY;AAAA,QACrI,IAAI,MAAM;AAAA,UAAG,OAAO,MAAM;AAAA,QAAO;AAAA,UAAK,OAAO,KAAK,KAAK;AAAA,MACzD;AAAA,MACA,WAAW,KAAK,KAAK,SAAS,cAAc,GAAG;AAAA,QAC7C,IAAI,CAAC,OAAO,KAAK,OAAK,EAAE,YAAY,SAAS,EAAE,IAAI;AAAA,UAAG,OAAO,QAAQ,EAAE,SAAS,SAAS,EAAE,MAAM,MAAM,EAAE,IAAI,UAAU,MAAM,QAAQ,EAAE,MAAM,SAAS,EAAE,CAAC;AAAA,MAC3J;AAAA,MACA,MAAM,aAAa,YAAY,GAAG,aAAa,OAAO;AAAA,MACtD,MAAM,YAAY,OAAO,QAAa,GAAG,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,YAAY,GAAG,OAAO,EAAE,EAAE;AAAA,MAC5H,MAAM,aAAkB,CAAC;AAAA,MACzB,YAAY,GAAG,MAAM,OAAO,QAAQ,EAAE;AAAA,QAAG,IAAI,EAAE,WAAW,IAAI;AAAA,UAAG,WAAW,KAAK;AAAA,MACjF,WAAW,KAAK;AAAA,QACd,IAAI,GAAG;AAAA,QAAa,QAAQ,OAAO,YAAY;AAAA,QAAG;AAAA,QAClD,SAAS,GAAG;AAAA,QAAS,aAAa,GAAG;AAAA,QAAa,MAAM,GAAG,QAAQ,CAAC;AAAA,QACpE,SAAU,GAAG,MAA+B,IAAI,OAAK,UAAU,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO;AAAA,QACnF,QAAQ,SAAS,QAAQ,EAAE;AAAA,QAAG,YAAY;AAAA,QAC1C,MAAM,aAAa,EAAE,UAAU,CAAC,CAAC,GAAG,aAAa,UAAU,QAAQ,WAAW,IAAI;AAAA,QAClF;AAAA,QAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,MAAM,OAAO,KAAK,UAAU,UAAU;AAAA,EACtC,OAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,QAAQ,EAAE,OAAO,IAAI,MAAM,SAAS,OAAO,SAAS,IAAI,MAAM,WAAW,IAAI,KAAK,OAAO,IAAI;AAAA,IAC7F,MAAM,WAAW,IAAI;AAAA,IACrB;AAAA,IACA,SAAS,CAAC;AAAA,EACZ;AAAA;;;AC3FF;AAIO,MAAM,0BAAyB,MAAM;AAAA,EACJ;AAAA,EAAtC,WAAW,CAAC,SAA0B,QAAgB;AAAA,IAAE,MAAM,OAAO;AAAA,IAA/B;AAAA,IAAkC,KAAK,OAAO;AAAA;AACtF;AAGO,SAAS,gBAAe,CAAC,MAAc,QAAyB;AAAA,EACrE,MAAM,OAAO,KAAK,KAAK;AAAA,EACvB,IAAI,CAAC;AAAA,IAAM,MAAM,IAAI,kBAAiB,uCAAuC,MAAM;AAAA,EACnF,IAAI;AAAA,EACJ,IAAI;AAAA,IAEF,MAAM,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI;AAAA,IAC1D,MAAM;AAAA,IACN,MAAM,IAAI,kBAAiB,uCAAuC,MAAM;AAAA;AAAA,EAE1E,IAAI;AAAA,IACF,OAAO,oBAAmB,KAAK,OAAO,SAAS,KAAK,IAAI,EAAE,KAAK,OAAO,IAAI,CAAC,CAAC;AAAA,IAC5E,OAAO,GAAG;AAAA,IACV,MAAM,IAAI,kBAAiB,aAAa,QAAQ,EAAE,UAAU,wCAAwC,MAAM;AAAA;AAAA;AAIvG,eAAe,YAAW,CAAC,KAAa,MAAsC;AAAA,EACnF,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,SAAS,EAAE,QAAQ,yDAAyD,MAAM,QAAQ,EAAE,CAAC;AAAA,IAC/H,MAAM;AAAA,IAEN,MAAM,IAAI,kBAAiB,iHAAiH,GAAG;AAAA;AAAA,EAEjJ,IAAI,CAAC,IAAI;AAAA,IAAI,MAAM,IAAI,kBAAiB,4BAA4B,IAAI,UAAU,IAAI,8BAA8B,GAAG;AAAA,EACvH,OAAO,iBAAgB,MAAM,IAAI,KAAK,GAAG,GAAG;AAAA;;;AC7BvC,IAAM,OAAO,CAAC,MAAe,EAAE,SAAS,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;AAChF,SAAS,YAAY,CAAC,YAAwB;AAAA,EACnD,MAAM,IAA8B,CAAC;AAAA,EACrC,WAAW,QAAQ,OAAK,EAAE,SAAS,QAAQ,SAAO;AAAA,IAAE,MAAM,KAAK,IAAI,IAAI,OAAK,KAAK,EAAE,YAAY,CAAC,CAAC;AAAA,IAAG,GAAG,QAAQ,OAAK;AAAA,MAAE,EAAE,KAAK;AAAA,KAAK;AAAA,GAAI,CAAC;AAAA,EACvI,OAAO;AAAA;AAEF,SAAS,KAAK,CAAC,MAAwB;AAAA,EAC5C,OAAO,KAAK,QAAQ,sBAAsB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI;AAAA;AAGlH,SAAS,QAAQ,CAAC,IAAoB;AAAA,EAC3C,MAAM,IAAI,GAAG,QAAQ,UAAU,EAAE,EAAE,QAAQ,WAAW,EAAE,EAAE,MAAM,MAAM,EAAE,OAAO,OAAO,EAAE,IAAI,KAAK;AAAA,EACjG,MAAM,IAAI,EAAE,QAAQ,sBAAsB,OAAO,EAAE,QAAQ,UAAU,GAAG,EAAE,YAAY,EAAE,KAAK;AAAA,EAC7F,OAAO,IAAI,EAAE,GAAG,YAAY,IAAI,EAAE,MAAM,CAAC,IAAI;AAAA;;;ACdxC,IAAM,MAAK;AAElB,IAAM,gBAAgB,IAAI,IAAI,CAAC,aAAa,cAAc,SAAS,MAAM,CAAC;AAGnE,SAAS,kBAAiB,CAAC,MAA4B;AAAA,EAC5D,IAAI;AAAA,EACJ,IAAI;AAAA,IAAE,OAAO,KAAK,MAAM,IAAI;AAAA,IAAK,MAAM;AAAA,IAAE,MAAM,IAAI,MAAM,sCAAsC;AAAA;AAAA,EAC/F,MAAM,IAAI;AAAA,EACV,IAAI,CAAC,KAAK,OAAO,MAAM;AAAA,IAAU,MAAM,IAAI,MAAM,0CAA0C;AAAA,EAC3F,IAAI,EAAE,YAAY;AAAA,IAAG,MAAM,IAAI,MAAM,2CAA2C;AAAA,EAChF,IAAI,OAAO,EAAE,YAAY,YAAY,CAAC,EAAE;AAAA,IAAS,MAAM,IAAI,MAAM,4DAA4D;AAAA,EAC7H,WAAW,KAAK,CAAC,SAAS,WAAW,cAAc,UAAU;AAAA,IAAY,IAAI,CAAC,MAAM,QAAQ,EAAE,EAAE;AAAA,MAAG,MAAM,IAAI,MAAM,IAAI,oBAAoB;AAAA,EAC3I,EAAE,SAAU,QAAQ,CAAC,GAAG,MAAM;AAAA,IAC5B,MAAM,IAAI;AAAA,IACV,IAAI,CAAC,KAAK,OAAO,EAAE,cAAc,YAAY,OAAO,EAAE,SAAS,YAAY,CAAC,cAAc,IAAI,EAAE,IAAc;AAAA,MAC5G,MAAM,IAAI,MAAM,WAAW,IAAI,iDAAiD;AAAA,GACnF;AAAA,EACD,IAAI,EAAE,WAAW,OAAO,EAAE,OAAO,QAAQ,YAAY,OAAO,EAAE,OAAO,WAAW;AAAA,IAAW,MAAM,IAAI,MAAM,oCAAoC;AAAA,EAC/I,OAAO;AAAA;AAIF,SAAS,SAAQ,CAAC,IAAY,SAAoD;AAAA,EACvF,IAAI;AAAA,EACJ,WAAW,KAAK;AAAA,IAAS,IAAI,GAAG,WAAW,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,KAAK;AAAA,MAAS,OAAO;AAAA,EACjG,OAAO;AAAA;AAIT,SAAS,YAAY,CAAC,KAAa,SAA0B;AAAA,EAC3D,MAAM,QAAQ,IAAI,IAAI,QAAQ,WAAW,IAAI,OAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC,CAAC;AAAA,EAC5F,OAAO,CAAC,GAAG,KAAK,EAAE,KAAK,OAAK,EAAE,YAAY,EAAE,QAAQ,eAAe,GAAG,MAAM,GAAG,KAAK,SAAS,GAAG;AAAA;AAI3F,SAAS,SAAQ,CAAC,MAAoB,SAAyF;AAAA,EACpI,MAAM,SAA4B,CAAC;AAAA,EACnC,MAAM,MAAM,KAAK,QAAQ,IAAI,OAAK,EAAE,EAAE;AAAA,EACtC,MAAM,UAAyB,KAAK,QAAQ,IAAI,QAAM;AAAA,IACpD,IAAI,EAAE;AAAA,IAAI,OAAO,EAAE;AAAA,IAAO,aAAa,EAAE;AAAA,IAAa,SAAS,EAAE,WAAW,CAAC;AAAA,IAAG,YAAY,CAAC;AAAA,IAC7F,MAAM,CAAC,aAAa,EAAE,GAAG,MAAM,GAAG,EAAE,IAAI,OAAO,CAAC;AAAA,IAChD,QAAQ,UAAS,EAAE,IAAI,GAAG;AAAA,EAC5B,EAAE;AAAA,EACF,MAAM,OAAO,IAAI,IAAI,QAAQ,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,EAChD,MAAM,YAAY,IAAI,IAAI,GAAG;AAAA,EAC7B,WAAW,KAAK,KAAK,YAAY;AAAA,IAE/B,IAAI,UAAU,IAAI,EAAE,EAAE,GAAG;AAAA,MAAE,OAAO,KAAK,EAAE,UAAU,SAAS,QAAQ,EAAE,IAAI,WAAW,EAAE,IAAI,MAAM,qBAAqB,SAAS,IAAI,EAAE,2CAA2C,CAAC;AAAA,MAAG;AAAA,IAAU;AAAA,IAC9L,MAAM,IAAI,UAAS,EAAE,IAAI,GAAG;AAAA,IAC5B,IAAI,CAAC,GAAG;AAAA,MAAE,OAAO,KAAK,EAAE,UAAU,SAAS,QAAQ,IAAI,WAAW,EAAE,IAAI,MAAM,sBAAsB,SAAS,IAAI,EAAE,2CAA2C,CAAC;AAAA,MAAG;AAAA,IAAU;AAAA,IAC5K,KAAK,IAAI,CAAC,EAAG,WAAW,KAAK,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,QAAQ,EAAE,QAAQ,MAAM,EAAE,KAAK,CAAC;AAAA,EAC7G;AAAA,EACA,MAAM,QAAsB,CAAC;AAAA,EAC7B,WAAW,KAAK,KAAK,UAAU;AAAA,IAC7B,MAAM,IAAI,UAAS,EAAE,WAAW,GAAG;AAAA,IACnC,IAAI,CAAC,GAAG;AAAA,MAAE,OAAO,KAAK,EAAE,UAAU,SAAS,QAAQ,IAAI,WAAW,EAAE,WAAW,MAAM,EAAE,MAAM,MAAM,qBAAqB,SAAS,gBAAgB,EAAE,6BAA6B,CAAC;AAAA,MAAG;AAAA,IAAU;AAAA,KAC7L,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC;AAAA,EAC1B;AAAA,EACA,OAAO;AAAA,IACL,IAAI,EAAE,aAAa,KAAK,OAAO,UAAU,EAAE,iBAAiB,GAAG,QAAQ,GAAG,SAAS,YAAY,KAAK,WAAW;AAAA,IAC/G;AAAA,IAAO;AAAA,EACT;AAAA;AAIK,SAAS,OAAM,CAAC,MAAoB,OAAmC;AAAA,EAC5E,MAAM,QAAQ,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,EAC9D,MAAM,WAAW,OAAO,OAAO,KAAK,EAAE,KAAK,EACxC,KAAK,CAAC,GAAG,OAAO,MAAM,IAAI,EAAE,SAAS,KAAK,QAAQ,MAAM,IAAI,EAAE,SAAS,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,EACnH,OAAO,KAAK,MAAM,SAAS;AAAA;AAItB,SAAS,YAAW,CAAC,MAAoB;AAAA,EAC9C,IAAI,OAAO;AAAA,EACX,OAAO,EAAE,MAAM,YAAY,MAAM,MAAM,OAAO,MAAoB;AAAA,IAAE,OAAO;AAAA,SAAU,OAAO,GAAG;AAAA,IAAE,OAAO;AAAA,IAAQ;AAAA;AAI3G,SAAS,UAAS,CAAC,KAAa;AAAA,EACrC,OAAO;AAAA,UACC,IAAI,GAAG;AAAA,MACX,MAAM,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,WAAW,CAAC;AAAA,MAClD,IAAI,CAAC,IAAI;AAAA,QAAI,MAAM,IAAI,MAAM,0CAA0C,IAAI,UAAU;AAAA,MACrF,OAAO,mBAAkB,MAAM,IAAI,KAAK,CAAC;AAAA;AAAA,UAErC,IAAI,CAAC,MAAoB;AAAA,MAC7B,MAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,SAAS,EAAE,gBAAgB,mBAAmB,GAAG,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AAAA,EAAK,CAAC;AAAA,MAC3I,IAAI,CAAC,IAAI;AAAA,QAAI,MAAM,IAAI,MAAO,MAAM,IAAI,KAAK,KAAM,wBAAwB,IAAI,UAAU;AAAA;AAAA,EAE7F;AAAA;;;AC9EK,IAAM,MAAM,CAAC,MAAkC,KAAK,OAAO,MAAM,WAAY,IAAU,CAAC;AACxF,SAAS,IAAI,CAAC,GAA8B;AAAA,EACjD,MAAM,IAAI,IAAI,CAAC;AAAA,EACf,MAAM,QAAQ,CAAC,GAAG,IAAK,EAAE,SAA0B,CAAC,GAAG,IAAI,IAAI,CAAC;AAAA,EAChE,IAAI,MAAM,WAAW,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE;AAAA,IAAO,OAAO;AAAA,EACvD,MAAM,QAAW,CAAC;AAAA,EAClB,MAAM,WAAqB,CAAC;AAAA,EAC5B,MAAM,QAAQ,OAAK;AAAA,IAAE,OAAO,OAAO,OAAO,EAAE,cAAc,CAAC,CAAC;AAAA,IAAG,SAAS,KAAK,GAAI,EAAE,YAAY,CAAC,CAAE;AAAA,GAAI;AAAA,EACtG,MAAM,OAAQ,EAAE,SAAS,EAAE,QAAqC,IAAI,IAAI,EAAE,KAAK,OAAK,EAAE,SAAS,MAAM;AAAA,EACrG,OAAO,KAAM,OAAO,CAAC,MAAO,GAAG,YAAY,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ,KAAK,YAAY,SAAS;AAAA;AAEpG,SAAS,QAAQ,CAAC,GAAmC;AAAA,EAC1D,MAAM,IAAI,KAAK,CAAC;AAAA,EAChB,MAAM,IAAI,MAAM,QAAQ,EAAE,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,MAAc,MAAM,MAAM,IAAI,EAAE;AAAA,EAC/E,IAAI,MAAM;AAAA,IAAS,OAAO,SAAS,EAAE,KAAK,IAAI;AAAA,EAC9C,IAAI,EAAE,WAAW,eAAe,EAAE,WAAW;AAAA,IAAQ,OAAO;AAAA,EAC5D,IAAI,MAAM,aAAa,MAAM;AAAA,IAAU,OAAO;AAAA,EAC9C,OAAO,MAAM,EAAE,aAAa,WAAW;AAAA;AAElC,IAAM,WAAW,CAAC,MAA8B;AAAA,EAAE,MAAM,IAAI,KAAK,CAAC;AAAA,EAAG,OAAO,EAAE,SAAS,YAAY,CAAC,CAAC,EAAE;AAAA;AACvG,IAAM,UAAU,CAAC,MAAuC,OAAO,QAAoB,KAAK,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;AAEpJ,SAAS,MAAM,CAAC,QAAoB,QAAgB,UAAmB,KAAiB,QAAQ,GAAG;AAAA,EACjG,MAAM,IAAI,KAAK,MAAM;AAAA,EACrB,IAAI,SAAS,CAAC,GAAG;AAAA,IACf,MAAM,QAAQ,OAAO,QAAoB,EAAE,cAAc,CAAC,CAAC;AAAA,IAC3D,IAAI,CAAC,MAAM,UAAU,QAAQ,GAAG;AAAA,MAAE,IAAI,KAAK,CAAC,QAAQ,UAAU,QAAQ,CAAC;AAAA,MAAG;AAAA,IAAQ;AAAA,IAClF,MAAM,MAAM,IAAI,IAAY,EAAE,YAAY,CAAC,CAAC;AAAA,IAC5C,MAAM,QAAQ,EAAE,GAAG,OAAO;AAAA,MAAE,IAAI,CAAC,KAAK,CAAC,EAAE;AAAA,QAAU,OAAO,GAAG,GAAG,UAAU,KAAK,YAAY,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC;AAAA,KAAI;AAAA,EAC3H,EAAE;AAAA,IAAK,IAAI,KAAK,CAAC,QAAQ,SAAS,CAAC,GAAG,QAAQ,CAAC;AAAA;AAEjD,SAAS,OAAO,CAAC,QAAgC,MAAc,KAAsB,QAAQ,GAAG;AAAA,EAC9F,MAAM,IAAI,KAAK,MAAM;AAAA,EACrB,IAAI,EAAE,SAAS,SAAS;AAAA,IAAE,IAAI,SAAS,EAAE,KAAK;AAAA,MAAG,IAAI,KAAK,EAAE,QAAQ,GAAG,WAAW,QAAQ,QAAQ,EAAE,KAAK,EAAE,CAAC;AAAA,IAAG;AAAA,EAAQ;AAAA,EACvH,IAAI,SAAS,CAAC,KAAK,QAAQ;AAAA,IAAG,OAAO,QAAoB,EAAE,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO,QAAQ,GAAG,GAAG,QAAQ,KAAK,KAAK,QAAQ,CAAC,CAAC;AAAA;AAG7I,IAAM,QAAQ,IAAI;AACX,SAAS,OAAO,CAAC,SAAuC;AAAA,EAC7D,IAAI,IAAI,MAAM,IAAI,OAAO;AAAA,EACzB,IAAI;AAAA,IAAG,OAAO;AAAA,EACd,IAAI,IAAI;AAAA,EACR,WAAW,MAAM,QAAQ,YAAY;AAAA,IACnC,MAAM,MAAkB,GAAG,WAAW,IAAI,OAAK,CAAC,EAAE,SAAS,SAAS,EAAE,MAAM,GAAG,EAAE,QAAQ,CAAC;AAAA,IAC1F,IAAI,GAAG;AAAA,MAAM,OAAO,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,UAAU,GAAG;AAAA,IAClE,MAAM,KAAK,GAAG,UAAU,KAAK,OAAK,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,MAAM;AAAA,IACjE,MAAM,QAAyB,CAAC;AAAA,IAChC,IAAI;AAAA,MAAI,QAAQ,GAAG,QAAQ,KAAK,KAAK;AAAA,IACrC,MAAM,MAAM,MAAM,CAAC,MAAM,UAAU,SAAS,GAAG,MAAM,IAAI,QAAQ,GAAG,MAAM,IAAI;AAAA,IAC9E,MAAM,UAAU,KAAK,QAAQ,GAAG,MAAM,EAAE,OAAO,IAAI,OAAO,MAAM,YAAY,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,KAAK,CAAC,CAAU,IAAI,CAAC;AAAA,IAC1I,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,KAAK,QAAQ,CAAC;AAAA,EAC/C;AAAA,EACA,MAAM,IAAI,SAAS,CAAC;AAAA,EACpB,OAAO;AAAA;;;ACjCF,SAAS,aAAY,CAAC,IAAmB,WAAyB;AAAA,EACvE,MAAM,MAAM,QAAQ,GAAG,OAAO;AAAA,EAC9B,MAAM,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC;AAAA,EAC5B,MAAM,OAAO,IAAI,IAAI,GAAG,YAAY,IAAI,OAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,EACzD,MAAM,MAAM,IAAI,IAAI,GAAG,SAAS,QAAQ,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,EAC3D,MAAM,aAAa,GAAG,cAAc,CAAC;AAAA,EACrC,MAAM,YAAY,GAAG,aAAa,CAAC;AAAA,EACnC,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC;AAAA,EAE5C,MAAM,MAAM,CAAC,GAAW,GAAW,OAAe,GAAG,KAAK,KAAK;AAAA,EAC/D,MAAM,OAAO,IAAI;AAAA,EACjB,YAAY,GAAG,SAAS,OAAO,QAAQ,SAAS;AAAA,IAAG,WAAW,KAAK,MAAM;AAAA,MACvE,IAAI,EAAE,SAAS,eAAe,CAAC,IAAI,IAAI,EAAE,SAAS;AAAA,QAAG;AAAA,MACrD,IAAI,EAAE,SAAS,WAAW,EAAE,MAAM,KAAK,QAAM,CAAC,IAAI,IAAI,GAAG,SAAS,CAAC;AAAA,QAAG;AAAA,MACtE,KAAK,IAAI,IAAI,GAAG,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC;AAAA,IACzC;AAAA,EACA,MAAM,OAAO,CAAC,GAAa,GAAW,OAAe,KAAK,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;AAAA,EAC3E,MAAM,SAAS,CAAC,OAAiB,IAAI,IAAI,EAAE;AAAA,EAC3C,MAAM,SAAS,CAAC,GAAa,OAAe,IAAI,IAAI,CAAC,GAAG,WAAW,KAAK,OAAK,EAAE,WAAW,EAAE;AAAA,EAC5F,MAAM,SAAS,CAAC,MAAyB,KAAK,IAAI,EAAE,IAAI;AAAA,EACxD,MAAM,WAAW,CAAC,MAAwC,IAAI,EAAE,MAAM,OAAO,OAAK,EAAE,SAAS,SAAS,IAAI,CAAC;AAAA,EAG3G,MAAM,WAAW,IAAI;AAAA,EACrB,MAAM,MAAM,CAAC,MAAc,WAAoB;AAAA,IAC7C,MAAM,KAAK,SAAS,MAAM,OAAO;AAAA,IACjC,IAAI,MAAM,SAAS,IAAI,CAAC;AAAA,IACxB,IAAI;AAAA,MAAK,OAAO;AAAA,IAChB,MAAM,IAAI;AAAA,IACV,WAAW,KAAK,MAAM,IAAI,GAAG;AAAA,MAAE,IAAI,IAAI,CAAC;AAAA,MAAG,IAAI;AAAA,SAAS,IAAI,MAAM,CAAC,GAAG,QAAQ,OAAK,IAAK,IAAI,CAAC,CAAC;AAAA,IAAG;AAAA,IACjG,SAAS,IAAI,GAAG,GAAG;AAAA,IACnB,OAAO;AAAA;AAAA,EAGT,SAAS,SAAS,CAAC,QAAgB,QAAgB;AAAA,IACjD,MAAM,IAAI,IAAI,QAAQ,KAAK,GAAG,IAAI,IAAI,QAAQ,IAAI;AAAA,IAClD,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE;AAAA,MAAM,OAAO;AAAA,IAC/B,IAAI,IAAI;AAAA,IAAG,EAAE,QAAQ,OAAK;AAAA,MAAE,IAAI,EAAE,IAAI,CAAC;AAAA,QAAG;AAAA,KAAM;AAAA,IAChD,OAAO,KAAK,IAAI,EAAE,QAAQ,MAAO,MAAM,IAAK,EAAE,OAAQ,MAAM,IAAK,EAAE,OAAO;AAAA;AAAA,EAE5E,MAAM,OAAO,CAAC,MAAc,EAAE,QAAQ,MAAM,EAAE;AAAA,EAC9C,SAAS,OAAO,CAAC,QAAgB,QAAqD;AAAA,IACpF,IAAI,WAAW,SAAS,WAAW,SAAS,OAAO,SAAS,IAAI,MAAM,OAAO,SAAS,IAAI;AAAA,MAAG,OAAO,EAAE,IAAI,MAAM;AAAA,IAChH,MAAM,IAAI,KAAK,MAAM,GAAG,IAAI,KAAK,MAAM;AAAA,IACvC,IAAI,MAAM,SAAS,MAAM,SAAS,MAAM;AAAA,MAAG,OAAO,EAAE,IAAI,KAAK;AAAA,IAC7D,MAAM,KAAK,WAAW,KAAK,OAAK,SAAS,EAAE,KAAK,MAAM,KAAK,SAAS,EAAE,MAAM,MAAM,CAAC;AAAA,IACnF,OAAO,KAAK,EAAE,IAAI,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE,IAAI,MAAM;AAAA;AAAA,EAI7D,SAAS,aAAa,CAAC,GAAa,GAAW,QAAgC;AAAA,IAC7E,MAAM,IAAI,KAAK,GAAG,GAAG,MAAM;AAAA,IAC3B,IAAI,CAAC,KAAK,EAAE,SAAS;AAAA,MAAa,OAAO;AAAA,IACzC,MAAM,IAAI,IAAI,IAAI,EAAE,SAAS;AAAA,IAC7B,IAAI,CAAC;AAAA,MAAG,OAAO;AAAA,IACf,IAAI,EAAE,WAAW,OAAO,EAAE;AAAA,MAAK,OAAO,EAAE;AAAA,IACxC,OAAO,EAAE,MAAM,KAAK,OAAK,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU;AAAA;AAAA,EAE7D,SAAS,OAAO,CAAC,GAAa,MAAyB,MAAwF;AAAA,IAC7I,MAAM,KAAK,IAAI,KAAK,MAAM;AAAA,IAC1B,IAAI,OAAO,GAAG,SAAS,YAAY,GAAG,KAAK,WAAW,QAAQ,GAAG;AAAA,MAC/D,MAAM,MAAM,GAAG,KAAK,MAAM,CAAC;AAAA,MAC3B,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,MAAM,QAAQ,cAAc,GAAG,KAAK,QAAQ,GAAG,KAAK,CAAC,GAAG,IAAI;AAAA,IACpF;AAAA,IACA,IAAI,KAAK,EAAE,EAAE;AAAA,MAAY,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,MAAM,QAAQ,QAAQ,EAAE,EAAE;AAAA,IACzE,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,MAAM,MAAM,SAAS,EAAE,EAAE;AAAA;AAAA,EAEjD,SAAS,YAAY,CAAC,KAA6D;AAAA,IACjF,IAAI,YAAY,IAAI;AAAA,MAAO,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,MAAM,QAAQ,QAAQ,IAAI,MAAM,MAAM,EAAE;AAAA,IACxF,MAAM,IAAI,IAAI,MAAM,MAAM,OAAO,OAAO,EAAE,QAAQ,EAAE,SAAS,GAAG,IAAI,QAAQ,OAAO,IAAI,GAAG,OAAO,GAAG,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,IAAI;AAAA,IACnI,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,MAAM,SAAS,QAAQ,OAAO,QAAQ,EAAE,QAAQ,MAAM,IAAI,EAAE,SAAS,SAAS,CAAC,EAAE;AAAA;AAAA,EAGxG,SAAS,WAAW,CAAC,GAAa,MAAyB,MAAsC;AAAA,IAC/F,IAAI,CAAC,KAAK,SAAS,CAAC,KAAK;AAAA,MAAQ,OAAO;AAAA,IACxC,OAAO,cAAc,GAAG,KAAK,QAAQ,KAAK,MAAM,UAAU;AAAA;AAAA,EAE5D,SAAS,WAAW,CAAC,GAAa;AAAA,IAAE,OAAO,OAAO,CAAC,EAAE,QAAQ,KAAK,OAAK,EAAE,IAAI;AAAA;AAAA,EAG7E,SAAS,OAAO,CAAC,GAAa,OAA2B,CAAC,GAAa;AAAA,IACrE,MAAM,MAAgB,CAAC,GAAG,IAAI,OAAO,CAAC;AAAA,IACtC,KAAK,MAAM,QAAQ,EAAE,GAAG,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,KAAK,OAAO,SAAS,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,OAAO,CAAC,CAAC;AAAA,IACpH,EAAE,WAAW,QAAQ,OAAK;AAAA,MACxB,MAAM,IAAI,OAAO,CAAC;AAAA,MAClB,GAAG,MAAM,OAAO,OAAK,EAAE,SAAS,SAAS,EAAE,QAAQ,QAAM;AAAA,QACvD,MAAM,KAAK,QAAQ,GAAG,GAAG,EAAE;AAAA,QAC3B,IAAI,GAAG,QAAQ,QAAQ;AAAA,UACrB,IAAI,GAAG;AAAA,YAAM,IAAI,KAAK,EAAE,MAAM,GAAG,EAAE,UAAU,GAAG,MAAM,OAAO,GAAG,EAAE,WAAW,GAAG,SAAS,MAAM,QAAQ,OAAO,UAAU,QAAQ,GAAG,OAAO,CAAC;AAAA,UAC3I,GAAG,OAAO,QAAQ,EAAE,GAAG,OAAO,IAAI,KAAK,EAAE,MAAM,GAAG,EAAE,UAAU,GAAG,KAAK,GAAG,OAAO,QAAQ,MAAM,KAAK,OAAO,GAAG,EAAE,WAAW,SAAS,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,IAAI,OAAO,GAAG,OAAO,SAAS,CAAC,CAAC;AAAA,QACpM,EAAE,KAAK,IAAI,GAAG,KAAK;AAAA,UACjB,MAAM,MAAM,EAAE,MAAM,KAAK,OAAK,EAAE,OAAO,GAAG,GAAG;AAAA,UAC7C,IAAI,KAAK,EAAE,MAAM,GAAG,EAAE,UAAU,GAAG,MAAM,OAAO,GAAG,EAAE,WAAW,GAAG,SAAS,MAAM,WAAW,OAAO,UAAU,UAAU,GAAG,EAAE,WAAW,KAAK,SAAS,GAAG,MAAM,CAAC;AAAA,QAClK,EAAE;AAAA,UAAK,IAAI,KAAK,EAAE,MAAM,GAAG,EAAE,UAAU,GAAG,MAAM,OAAO,EAAE,SAAS,GAAG,SAAS,SAAS,CAAC,EAAE,SAAS,IAAI,EAAE,MAAM,SAAS,MAAM,GAAG,UAAU,KAAK,MAAM,EAAE,OAAO,MAAM,GAAG,OAAO,SAAS,GAAG,QAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,OAC5N;AAAA,KACF;AAAA,IACD,EAAE,QAAQ,QAAQ,SAAO;AAAA,MACvB,MAAM,KAAK,aAAa,GAAG;AAAA,MAC3B,IAAI,IAAI;AAAA,QAAM,IAAI,KAAK,EAAE,MAAM,YAAY,IAAI,MAAM,OAAO,IAAI,OAAO,MAAM,QAAQ,OAAO,WAAW,QAAQ,GAAG,OAAO,CAAC;AAAA,MAC1H,GAAG,OAAO,QAAQ,EAAE,GAAG,OAAO,IAAI,KAAK,EAAE,MAAM,YAAY,IAAI,KAAK,IAAI,OAAO,QAAQ,MAAM,KAAK,OAAO,GAAG,IAAI,WAAW,SAAS,CAAC,KAAK,MAAM,GAAG,MAAM,IAAI,OAAO,IAAI,OAAO,GAAG,OAAO,UAAU,CAAC,CAAC;AAAA,KACtM;AAAA,IACD,UAAU,QAAQ,OAAK,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,EAAE,WAAW,SAAS,CAAC,KAAK,MAAM,GAAG,EAAE,SAAS,KAAK,MAAM,GAAG,OAAO,WAAW,CAAC,CAAC,CAAC;AAAA,IAC5L,OAAO;AAAA;AAAA,EAGT,SAAS,WAAW,CAAC,YAAoB,YAAoB,MAAgB,MAAM,MAAM;AAAA,IACvF,MAAM,MAA8D,CAAC;AAAA,IACrE,WAAW,KAAK,MAAM;AAAA,MACpB,IAAI,EAAE,SAAS,UAAU,EAAE;AAAA,QAAU;AAAA,MACrC,MAAM,MAAM,QAAQ,YAAY,EAAE,IAAI;AAAA,MACtC,IAAI,CAAC,IAAI;AAAA,QAAI;AAAA,MACb,IAAI,KAAK,KAAK,IAAI,UAAU,YAAY,EAAE,QAAQ,EAAE,KAAK,GAAG,UAAU,YAAY,EAAE,KAAK,IAAI,GAAG;AAAA,MAChG,IAAI,EAAE,UAAU;AAAA,QAAU,MAAM;AAAA,MAAM,KAAK,IAAI,EAAE,UAAU;AAAA,QAAQ,MAAM;AAAA,MACzE,IAAI,IAAI;AAAA,QAAW,MAAM;AAAA,MACzB,IAAI,MAAM;AAAA,QAAK,IAAI,KAAK,EAAE,MAAM,EAAE,QAAQ,IAAI,YAAY,MAAM,IAAI,gBAAgB,KAAK,OAAO,IAAI,QAAQ,EAAE,CAAC;AAAA,IACjH;AAAA,IACA,OAAO,IAAI,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA;AAAA,EAE7C,SAAS,UAAU,CAAC,YAAoB,YAAoB,MAAgB;AAAA,IAC1E,OAAO,YAAY,YAAY,YAAY,IAAI,EAAE,MAAM;AAAA;AAAA,EAGzD,SAAS,SAAS,CAAC,KAAa,IAAsB;AAAA,IACpD,MAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO,GAAG,OAAO,MAAM,MAAM,SAAS;AAAA,IAC1E,IAAI,MAAM,IAAI,EAAE,SAAS;AAAA,MAAG,OAAO;AAAA,IACnC,IAAI,MAAM,OAAO;AAAA,MAAQ,OAAO,MAAM,SAAS,IAAI,GAAG,MAAM,MAAM,SAAS,MAAM,SAAS;AAAA,IAC1F,MAAM,OAAO,GAAG,KAAK,MAAM,GAAG,EAAE,OAAO,OAAK,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AAAA,IACnE,OAAO,GAAG,KAAK,KAAK,SAAS,MAAM,MAAM;AAAA;AAAA,EAE3C,SAAS,cAAc,CAAC,GAAW,MAAgB;AAAA,IACjD,MAAM,MAA8B,CAAC;AAAA,IACrC,EAAE,IAAI,QAAQ,EAAE,KAAK,OAAO;AAAA,MAAE,MAAM,IAAI,WAAW,UAAU,KAAK,EAAE,EAAE,GAAG,GAAG,IAAI;AAAA,MAAG,IAAI;AAAA,QAAG,IAAI,OAAO,EAAE;AAAA,KAAO;AAAA,IAC9G,OAAO;AAAA;AAAA,EAET,SAAS,UAAU,CAAC,YAAqB,YAAqB;AAAA,IAC5D,MAAM,MAA8B,CAAC;AAAA,IACrC,MAAM,OAAiB,WAAW,IAAI,EAAE,GAAG,QAAQ,EAAE,MAAM,SAAS,KAAK,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,OAAO,EAAE;AAAA,IACrH,WAAW,QAAQ,EAAE,GAAG,OAAO;AAAA,MAAE,MAAM,IAAI,WAAW,GAAG,GAAG,IAAI;AAAA,MAAG,IAAI;AAAA,QAAG,IAAI,KAAK,EAAE;AAAA,KAAO;AAAA,IAC5F,OAAO;AAAA;AAAA,EAET,SAAS,cAAc,CAAC,GAAa,MAAgB;AAAA,IACnD,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,OAAO,QAAQ,GAAG,EAAE,MAAM,SAAS,KAAK,aAAa,EAAE,EAAE,SAAS,WAAW,CAAC;AAAA;AAAA,EAIhF,SAAS,IAAI,CAAC,GAAa,MAAyB,MAAgC;AAAA,IAClF,MAAM,IAAI,OAAO,CAAC;AAAA,IAClB,MAAM,OAAO,IAAI,CAAC,KAAK,OAAO,GAAI,KAAK,OAAO,YAAY,CAAC,CAAE,EAAE,KAAK,GAAG,GAAG,IAAI;AAAA,IAC9E,MAAM,MAAM,IAAI,CAAC,EAAE,OAAO,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,IAAI;AAAA,IAEpD,MAAM,QAAQ,CAAC,MAAwB;AAAA,MACrC,MAAM,MAAM,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,KAAK;AAAA,MAClD,IAAI,CAAC,IAAI;AAAA,QAAM,OAAO,EAAE,OAAO,GAAG,MAAM,MAAM;AAAA,MAC9C,IAAI,IAAI,GAAG,IAAI;AAAA,MAAG,IAAI,QAAQ,OAAK;AAAA,QAAE,IAAI,KAAK,IAAI,CAAC;AAAA,UAAG;AAAA,QAAK,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA,UAAG;AAAA,OAAM;AAAA,MACtF,OAAO,EAAE,OAAO,KAAK,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,GAAG,MAAM,IAAI,EAAE;AAAA;AAAA,IAErE,MAAM,OAAO,KAAK,SAAS,YAAY,eAAe,CAAC,IAAI,QAAQ,CAAC;AAAA,IACpE,MAAM,MAAM,KAAK,OAAO,OAAK,EAAE,UAAU,YAAY,EAAE,SAAS,MAAM,EAAE,UAAU;AAAA,IAClF,OAAO,IAAI,IAAI,OAAK;AAAA,MAClB,MAAM,UAAoB,CAAC;AAAA,MAAG,IAAI,MAAM,GAAG,IAAI;AAAA,MAC/C,MAAM,MAAM,CAAC,QAAgB,OAAe,QAAuB;AAAA,QAAE,OAAO,SAAS;AAAA,QAAO,KAAK;AAAA,QAAQ,IAAI,SAAS,OAAO;AAAA,UAAK,QAAQ,KAAK,GAAG;AAAA;AAAA,MAClJ,MAAM,IAAI,EAAE;AAAA,MACZ,MAAM,OAAO,eAAe,GAAG,IAAI;AAAA,MACnC,IAAI,KAAK,SAAS,WAAW;AAAA,QAC3B,MAAM,KAAK,QAAQ,GAAG,MAAM,IAAI;AAAA,QAChC,MAAM,QAAQ,GAAG,OAAQ,EAAE,MAAM,SAAS,IAAI,IAAK,GAAG,QAAQ,SAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,IAAM,EAAE,QAAQ,KAAK,IAAI,OAAO,QAAQ,GAAG,QAAQ,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,MAAM;AAAA,QAC1L,IAAI,KAAK,OAAO,GAAG,OAAO,mBAAmB,0BAA0B;AAAA,QACvE,IAAI,MAAM,EAAE,WAAW,SAAS,IAAI,EAAE,SAAS,IAAI,KAAK,EAAE,WAAW,SAAS,eAAe,IAAI;AAAA,MACnG,EAAE,KAAK;AAAA,QACL,IAAI,KAAK,EAAE,IAAI,SAAS,MAAM,KAAK,IAAI;AAAA,QACvC,IAAI,MAAM,EAAE,WAAW,UAAU,IAAI,EAAE,WAAW,SAAS,MAAM,KAAK,EAAE,WAAW,UAAU,eAAe,IAAI;AAAA,QAChH,MAAM,OAAO,EAAE,IAAI,OAAO,EAAE,OAAO,EAAE,WAAW,QAAQ,CAAC;AAAA,QACzD,MAAM,SAAS,OAAO,QAAQ,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,WAAW,QAAQ,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE;AAAA,QACrG,IAAI,KAAK,KAAK,SAAS,KAAK,IAAI,GAAG,SAAS,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,IAAI,GAAG,SAAS,QAAQ,mCAAmC,IAAI;AAAA;AAAA,MAEvI,MAAM,WAAW,EAAE,IAAI,OAAO,OAAK,EAAE,EAAE;AAAA,MACvC,IAAI,SAAS,QAAQ;AAAA,QACnB,MAAM,KAAK,SAAS,OAAO,EAAE,OAAO,KAAK,EAAE,EAAE;AAAA,QAC7C,IAAI,MAAM,KAAK,SAAS,QAAQ,OAAO,SAAS,SAAS,kCAAkC,IAAI;AAAA,MACjG,EAAE;AAAA,QAAK,IAAI,MAAM,GAAG,IAAI;AAAA,MACxB,IAAI,EAAE;AAAA,QAAS,IAAI,KAAK,EAAE,YAAY,EAAE,KAAK,KAAK,IAAI,GAAG,EAAE,YAAY,EAAE,KAAK,KAAK,QAAQ,EAAE,YAAY,IAAI;AAAA,MAC7G,MAAM,KAAK,MAAM,CAAC;AAAA,MAClB,IAAI,MAAM,GAAG,OAAO,GAAG,SAAS,MAAO,GAAG,OAAO,cAAc,KAAK,WAAW,0BAA2B,IAAI;AAAA,MAC9G,OAAO,EAAE,MAAM,GAAG,OAAO,IAAI,MAAM,IAAI,GAAG,QAAQ;AAAA,KACnD,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA;AAAA,EAIrC,SAAS,SAAS,CAAC,GAAa,GAAW,IAAuB;AAAA,IAChE,MAAM,IAAI,KAAK,GAAG,GAAG,EAAE;AAAA,IACvB,OAAO,CAAC,IAAI,YAAY,EAAE,UAAU,cAAc,UAAU;AAAA;AAAA,EAE9D,SAAS,SAAS,CAAC,GAAa,MAAgD;AAAA,IAC9E,MAAM,KAAK,SAAS,OAAO,IAAI,CAAC;AAAA,IAChC,IAAI,CAAC,GAAG;AAAA,MAAQ,OAAO;AAAA,IACvB,MAAM,KAAK,GAAG,IAAI,OAAK,UAAU,GAAG,KAAK,QAAQ,EAAE,EAAE,CAAC;AAAA,IACtD,IAAI,GAAG,SAAS,WAAW;AAAA,MAAG,OAAO;AAAA,IACrC,IAAI,GAAG,MAAM,OAAK,MAAM,OAAO;AAAA,MAAG,OAAO;AAAA,IACzC,MAAM,OAAO,GAAG,OAAO,OAAK,EAAE,QAAQ;AAAA,IACtC,IAAI,KAAK,UAAU,KAAK,MAAM,OAAK,UAAU,GAAG,KAAK,QAAQ,EAAE,EAAE,MAAM,OAAO,KAAK,GAAG,SAAS,OAAO;AAAA,MAAG,OAAO;AAAA,IAChH,OAAO,GAAG,SAAS,OAAO,IAAI,YAAY;AAAA;AAAA,EAG5C,SAAS,KAAK,CAAC,SAAwB;AAAA,IACrC,MAAM,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,EAAE;AAAA,IACzD,QAAQ,QAAQ,OAAK,EAAE,WAAW,QAAQ,OAAK;AAAA,MAC7C,IAAI,CAAC,SAAS,OAAO,CAAC,CAAC,EAAE;AAAA,QAAQ;AAAA,MACjC,MAAM,KAAK,UAAU,EAAE,IAAI,CAAC;AAAA,MAC5B,EAAE,OAAO,YAAY,YAAY;AAAA,MAAO,EAAE;AAAA,KAC3C,CAAC;AAAA,IACF,OAAO;AAAA;AAAA,EAGT,MAAM,WAAW,CAAC,GAAW,WAA6B,WAAW,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,KAAK,OAAK,EAAE,WAAW,MAAM,GAAG,UAAU,CAAC;AAAA,EAG5I,SAAS,cAAc,CAAC,GAAa,MAAyB,MAAsB,MAAc,SAAS,OAAuC;AAAA,IAChJ,MAAM,IAAI,IAAI,IAAI,IAAI;AAAA,IACtB,IAAI,CAAC;AAAA,MAAG,OAAO;AAAA,IACf,MAAM,QAAQ,QAAQ,GAAG,MAAM,IAAI;AAAA,IACnC,MAAM,QAAQ,MAAM,UAAU,CAAC,MAAM,MAAM,MAAM,SAAS;AAAA,IAC1D,IAAI;AAAA,IACJ,IAAI,MAAM;AAAA,MAAM,SAAS,EAAE,MAAM,IAAI;AAAA,IACrC,KAAK,IAAI;AAAA,MAAO,SAAS,EAAE,MAAM,MAAM,EAAE,MAAM,IAAI;AAAA,IACnD,KAAK;AAAA,MACH,MAAM,OAAiB,EAAE,QAAQ,IAAI,EAAE,MAAM,QAAQ,EAAE,MAAM,MAAM,OAAO,SAAS,IAAI,GAAG,MAAM,KAAK,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,OAAO,EAAE;AAAA,MACxI,UAAU,YAAY,KAAK,OAAO,MAAM,QAAQ,OAAO,IAAI,EAAE,MAAM,YAAY,GAAG,KAAK,SAAS,KAAK,SAAS,MAAM,QAAQ,OAAO,IAAI,EAAE,KAAK,KAAK,MAAM,KAAK,EAAE;AAAA,MAChK,IAAI,CAAC,UAAU,CAAC;AAAA,QAAQ,SAAS,EAAE,QAAQ,KAAK,IAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,CAAC,EAAE,EAAE,IAAI;AAAA;AAAA,IAEnG,IAAI,CAAC,QAAQ;AAAA,MAAE,IAAI;AAAA,QAAQ,OAAO;AAAA,MAAM,SAAS;AAAA,IAAK;AAAA,IACtD,OAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAAQ,MAAM,KAAK;AAAA,MAAI,MAAM;AAAA,MAAa,WAAW;AAAA,MAAM;AAAA,MAC3E,SAAS,eAAe,GAAG,QAAQ,CAAC,CAAC;AAAA,MACrC,KAAK,QAAQ,WAAW,OAAO,SAAS,GAAG,MAAM,CAAC,IAAI;AAAA,MACtD,MAAM;AAAA,MAAQ,QAAQ;AAAA,MAAa,OAAO;AAAA,IAC5C;AAAA;AAAA,EAGF,SAAS,YAAY,CAAC,GAAa,MAAyB,MAAsB,MAAyC;AAAA,IACzH,OAAO,SAAS,OAAO,IAAI,CAAC,EAAE,OAAO,OAAK,EAAE,SAAS,aAAa,CAAC,EAAE,SAAS,EAAE,OAAO,KAAK,MAAM,CAAC,KAAK,GAAG,KAAK,QAAQ,EAAE,EAAE,CAAC,EAC1H,IAAI,OAAK,eAAe,GAAG,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,MAAoC,CAAC,CAAC,CAAC;AAAA;AAAA,EAGrG,OAAO;AAAA,IACL;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAAK;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAS;AAAA,IAAS;AAAA,IAAc;AAAA,IACjG;AAAA,IAAS;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAa;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAM;AAAA,IAAW;AAAA,IAAW;AAAA,IAAO;AAAA,IACjH;AAAA,IAAU;AAAA,IAAgB;AAAA,EAC5B;AAAA;;;ACvRK,SAAS,iBAAgB,CAAC,IAA4E;AAAA,EAC3G,MAAM,QAAQ,IAAI,IAAI,GAAG,YAAY,IAAI,OAAK,EAAE,IAAI,CAAC;AAAA,EACrD,MAAM,SAA4B,CAAC;AAAA,EACnC,MAAM,MAAM,IAAI,IAAI,GAAG,SAAS,QAAQ,IAAI,OAAK,EAAE,EAAE,CAAC;AAAA,EACtD,MAAM,OAAO,IAAI;AAAA,EACjB,MAAM,UAAU,GAAG,SAAS,QAAQ,IAAI,OAAK;AAAA,IAC3C,IAAI,CAAC,IAAG,KAAK,EAAE,EAAE,GAAG;AAAA,MAAE,OAAO,KAAK,EAAE,UAAU,SAAS,QAAQ,EAAE,IAAI,MAAM,uBAAuB,SAAS,cAAc,EAAE,4DAA4D,CAAC;AAAA,MAAG,OAAO,KAAK,GAAG,YAAY,CAAC,EAAE;AAAA,IAAG;AAAA,IAC5N,MAAM,aAAa,EAAE,WAAW,OAAO,OAAK;AAAA,MAC1C,IAAI,CAAC,IAAG,KAAK,EAAE,MAAM,GAAG;AAAA,QAAE,OAAO,KAAK,EAAE,UAAU,SAAS,QAAQ,EAAE,IAAI,WAAW,EAAE,QAAQ,MAAM,uBAAuB,SAAS,iBAAiB,EAAE,gEAAgE,CAAC;AAAA,QAAG,OAAO;AAAA,MAAO;AAAA,MACzO,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,GAAG;AAAA,QAAE,OAAO,KAAK,EAAE,UAAU,SAAS,QAAQ,EAAE,IAAI,WAAW,EAAE,QAAQ,MAAM,yBAAyB,SAAS,IAAI,EAAE,eAAe,EAAE,iCAAiC,CAAC;AAAA,QAAG,OAAO;AAAA,MAAO;AAAA,MAChN,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG;AAAA,QAAE,OAAO,KAAK,EAAE,UAAU,SAAS,QAAQ,EAAE,IAAI,WAAW,EAAE,QAAQ,MAAM,yBAAyB,SAAS,iBAAiB,EAAE,yBAAyB,CAAC;AAAA,QAAG,OAAO;AAAA,MAAO;AAAA,MACpM,KAAK,IAAI,EAAE,MAAM;AAAA,MAAG,OAAO;AAAA,KAC5B,EAAE,OAAO,OAAK,CAAC,EAAE,UAAU,KAAK,IAAI,EAAE,MAAM,MAAM,OAAO,KAAK,EAAE,UAAU,SAAS,QAAQ,EAAE,IAAI,WAAW,EAAE,QAAQ,MAAM,2BAA2B,SAAS,IAAI,EAAE,mDAAmD,CAAC,GAAG,MAAM;AAAA,IACpO,MAAM,SAAS,EAAE,UAAU,IAAI,IAAI,EAAE,MAAM,IAAI,EAAE,SAAS;AAAA,IAC1D,OAAO,KAAK,GAAG,YAAY,OAAO;AAAA,GACnC;AAAA,EACD,OAAO,EAAE,UAAU,KAAK,GAAG,UAAU,QAAQ,GAAG,OAAO;AAAA;AAGlD,SAAS,iBAAgB,CAAC,QAAmC;AAAA,EAClE,MAAM,SAA4B,CAAC;AAAA,EACnC,WAAW,KAAK,OAAO,GAAG,SAAS;AAAA,IAAS,WAAW,KAAK,EAAE,YAAY;AAAA,MACxE,MAAM,IAAI,OAAO,OAAO,CAAC;AAAA,MACzB,GAAG,MAAM,OAAO,QAAM,GAAG,YAAY,GAAG,SAAS,SAAS,EAAE,QAAQ,QAAM;AAAA,QACxE,IAAI,OAAO,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,EAAE,MAAM;AAAA,UAAS,OAAO,KAAK,EAAE,UAAU,WAAW,QAAQ,EAAE,IAAI,WAAW,EAAE,QAAQ,MAAM,GAAG,IAAI,MAAM,yBAAyB,SAAS,GAAG,EAAE,UAAU,GAAG,0BAA0B,CAAC;AAAA,OAClO;AAAA,IACH;AAAA,EACA,OAAO;AAAA;",
14
+ "debugId": "CBA6673BB224224F64756E2164756E21",
15
+ "names": []
16
+ }
package/dist/index.d.ts CHANGED
@@ -1,11 +1,9 @@
1
- /** Runtime entry. The studio is in `api_binding_ui/studio`. */
1
+ /** Design-time API binding: the bindings file, the catalog and the code generator. Nothing here ships in an app. */
2
2
  export type * from "./framework/contract";
3
3
  export { catalogFromOpenApi } from "./framework/openapi";
4
- export { evaluate, type Scope, type Transforms } from "./framework/expr";
5
- export { buildRequest, runConsume, runSteps, select, BindingError, type Fetcher, type HttpRequest, type StepOutcome } from "./framework/runner";
6
- export { localStorageAdapter, memoryAdapter, toManifest } from "./framework/store";
7
- export { createEngine, type FrameworkData, type Engine } from "./framework/engine";
4
+ export { catalogFromText, loadCatalog, CatalogLoadError } from "./framework/loadCatalog";
5
+ export { parse as parseExpression, type Parsed, type Head } from "./framework/expr";
6
+ export { ID, parseBindingsFile, fromFile, toFile, screenOf, memoryStore, httpStore } from "./framework/file";
7
+ export { createEngine, type FrameworkData, type Engine, type BindingIndex } from "./framework/engine";
8
8
  export { validateRegistry, validateBindings } from "./framework/validate";
9
- export { BindingProvider, type BindingProviderProps } from "./runtime/BindingProvider";
10
- export { BindingScreen, BindingActive, type BindingScreenProps } from "./runtime/BindingScreen";
11
- export { useSlot, useCell, useProduce, useTrigger, type SlotResult, type SlotStatus, type TriggerHandle } from "./runtime/hooks";
9
+ export { generate, type GenerateResult, type GeneratedFile } from "./codegen/generate";