patent-query-shortcuts 0.2.1 → 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/templates/patsnap.ts","../src/templates/nuvoai.ts","../src/engine/json.ts"],"sourcesContent":["// src/index.ts\n\n\nexport type ShortcutKind = \"field\" | \"macro\";\n\nexport type Suggestion = {\n key: string;\n label?: string;\n description?: string;\n};\n\nexport type Shortcut = {\n key: string; // user types, e.g. \"TAC\"\n kind: ShortcutKind; // \"field\" or \"macro\"\n field?: string; // if kind=\"field\": actual field, e.g. \"TAC_ALL\"\n macro?: string; // if kind=\"macro\": string with {{value}} placeholder\n label?: string;\n description?: string;\n aliases?: string[];\n /**\n * Optional autocomplete snippet.\n * Use `|` to mark cursor position after insertion.\n * Example: \"TAC:(|)\" => inserts \"TAC:()\" and cursor is inside parentheses.\n */\n snippet?: string;\n};\n\nexport type Template = {\n id: string;\n name: string;\n shortcuts: Shortcut[];\n normalizeKey?: \"upper\" | \"none\";\n};\n\nexport type ExpandOptions = {\n templateId: string;\n wrapBareValues?: boolean;\n};\n\nexport type CompletionItem = {\n key: string; // \"TAC\"\n label: string; // e.g. \"TAC:()\"\n description?: string;\n replaceFrom: number;\n replaceTo: number;\n insertText: string; // e.g. \"TAC:() \"\n newCursor: number; // absolute cursor position in final string\n};\n\nexport type CompleteOptions = {\n templateId: string;\n limit?: number;\n trailingSpace?: boolean; // e.g. inserts \"TAC:() \" (cursor stays where snippet says)\n allowEmptyPrefix?: boolean; // if true, shows all shortcuts when prefix is empty\n};\n\nexport type CompletionsResult = {\n token: { start: number; end: number; prefix: string };\n items: CompletionItem[];\n};\n\nfunction normalizeKey(t: Template, key: string): string {\n return t.normalizeKey === \"upper\" ? key.toUpperCase() : key;\n}\n\nfunction isBareValue(v: string): boolean {\n const s = v.trim();\n return !(s.startsWith(\"(\") || s.startsWith(\"[\") || s.startsWith(\"\\\"\"));\n}\n\nfunction maybeWrapValue(v: string, wrapBareValues: boolean): string {\n const s = v.trim();\n if (!wrapBareValues) return s;\n if (!isBareValue(s)) return s;\n return `(${s})`;\n}\n\n// Reads a value after \":\" supporting (), [], \"\" and bare tokens.\n// Returns [value, nextIndex]\nfunction readValue(input: string, start: number): [string, number] {\n let i = start;\n while (i < input.length && /\\s/.test(input[i]!)) i++;\n\n const ch = input[i];\n if (!ch) return [\"\", i];\n\n const readBalanced = (open: string, close: string): [string, number] => {\n let depth = 0;\n let j = i;\n while (j < input.length) {\n const c = input[j]!;\n if (c === open) depth++;\n else if (c === close) {\n depth--;\n if (depth === 0) {\n j++;\n return [input.slice(i, j), j];\n }\n } else if (c === \"\\\"\") {\n j++;\n while (j < input.length) {\n if (input[j] === \"\\\\\" && j + 1 < input.length) { j += 2; continue; }\n if (input[j] === \"\\\"\") { j++; break; }\n j++;\n }\n continue;\n }\n j++;\n }\n return [input.slice(i), input.length];\n };\n\n if (ch === \"(\") return readBalanced(\"(\", \")\");\n if (ch === \"[\") return readBalanced(\"[\", \"]\");\n\n if (ch === \"\\\"\") {\n let j = i + 1;\n while (j < input.length) {\n if (input[j] === \"\\\\\" && j + 1 < input.length) { j += 2; continue; }\n if (input[j] === \"\\\"\") { j++; break; }\n j++;\n }\n return [input.slice(i, j), j];\n }\n\n let j = i;\n while (j < input.length && !/\\s/.test(input[j]!)) j++;\n return [input.slice(i, j), j];\n}\n\n/**\n * Find token at/left of cursor for completion.\n * Token chars: [A-Za-z0-9_]+\n */\nfunction getTokenRange(text: string, cursor: number): { start: number; end: number; prefix: string } {\n const isWord = (c: string) => /[A-Za-z0-9_]/.test(c);\n\n let start = Math.max(0, cursor);\n while (start > 0 && isWord(text[start - 1]!)) start--;\n\n let end = Math.max(0, cursor);\n while (end < text.length && isWord(text[end]!)) end++;\n\n const prefix = text.slice(start, cursor);\n return { start, end, prefix };\n}\n\n/**\n * Convert snippet with `|` cursor marker into (insertText, cursorIndexInInsertText).\n */\nfunction renderSnippet(snippet: string): { insertText: string; cursorIndex: number } {\n const idx = snippet.indexOf(\"|\");\n if (idx === -1) return { insertText: snippet, cursorIndex: snippet.length };\n const insertText = snippet.replace(\"|\", \"\");\n return { insertText, cursorIndex: idx };\n}\n\nfunction pushSuggestionSafe(out: Suggestion[], key: string, label?: string, description?: string) {\n const item: Suggestion = { key };\n if (label !== undefined) item.label = label;\n if (description !== undefined) item.description = description;\n out.push(item);\n}\n\nfunction pushCompletionSafe(out: CompletionItem[], item: Omit<CompletionItem, \"description\"> & { description?: string | undefined }) {\n const x: CompletionItem = {\n key: item.key,\n label: item.label,\n replaceFrom: item.replaceFrom,\n replaceTo: item.replaceTo,\n insertText: item.insertText,\n newCursor: item.newCursor\n };\n if (item.description !== undefined) x.description = item.description;\n out.push(x);\n}\n\nexport class ShortcutRegistry {\n private templates = new Map<string, Template>();\n private lookup = new Map<string, Map<string, Shortcut>>();\n private usage = new Map<string, Map<string, number>>(); // templateId -> normalizedKey -> count\n\n constructor(templates: Template[]) {\n for (const t of templates) this.registerTemplate(t);\n }\n\n registerTemplate(t: Template) {\n this.templates.set(t.id, t);\n\n const map = new Map<string, Shortcut>();\n for (const sc of t.shortcuts) {\n map.set(normalizeKey(t, sc.key), sc);\n for (const a of sc.aliases ?? []) map.set(normalizeKey(t, a), sc);\n }\n this.lookup.set(t.id, map);\n\n if (!this.usage.has(t.id)) this.usage.set(t.id, new Map());\n }\n\n listTemplates(): { id: string; name: string }[] {\n return [...this.templates.values()].map(t => ({ id: t.id, name: t.name }));\n }\n\n /**\n * NEW: record which suggestion was selected so ranking becomes \"most-used-first\"\n */\n recordUsage(templateId: string, key: string, delta = 1) {\n const t = this.templates.get(templateId);\n if (!t) return;\n const norm = normalizeKey(t, key);\n const m = this.usage.get(templateId) ?? new Map<string, number>();\n const cur = m.get(norm) ?? 0;\n m.set(norm, cur + delta);\n this.usage.set(templateId, m);\n }\n\n private getUsage(templateId: string, normalizedKey: string): number {\n return this.usage.get(templateId)?.get(normalizedKey) ?? 0;\n }\n\n /**\n * UPDATED: smarter ranking:\n * 1) exact match\n * 2) most-used first (recordUsage)\n * 3) shorter key first\n * 4) alphabetical\n */\n suggest(prefix: string, templateId: string, limit = 10): Suggestion[] {\n const t = this.templates.get(templateId);\n if (!t) return [];\n\n const p = normalizeKey(t, prefix);\n const candidates = t.shortcuts\n .map(sc => ({ sc, k: normalizeKey(t, sc.key) }))\n .filter(x => x.k.startsWith(p));\n\n candidates.sort((a, b) => {\n const aExact = a.k === p ? 0 : 1;\n const bExact = b.k === p ? 0 : 1;\n if (aExact !== bExact) return aExact - bExact;\n\n const au = this.getUsage(templateId, a.k);\n const bu = this.getUsage(templateId, b.k);\n if (au !== bu) return bu - au;\n\n if (a.k.length !== b.k.length) return a.k.length - b.k.length;\n return a.k.localeCompare(b.k);\n });\n\n const out: Suggestion[] = [];\n for (const { sc } of candidates.slice(0, limit)) {\n pushSuggestionSafe(out, sc.key, sc.label, sc.description);\n }\n return out;\n }\n\n build(alias: string, value: string, opts: ExpandOptions): string {\n const t = this.templates.get(opts.templateId);\n const m = this.lookup.get(opts.templateId);\n if (!t || !m) return `${alias}:${value}`;\n\n const key = normalizeKey(t, alias);\n const sc = m.get(key);\n if (!sc) return `${alias}:${value}`;\n\n const v = maybeWrapValue(value, opts.wrapBareValues ?? true);\n\n if (sc.kind === \"field\" && sc.field) return `${sc.field}:${v}`;\n if (sc.kind === \"macro\" && sc.macro) return sc.macro.replaceAll(\"{{value}}\", v);\n\n return `${alias}:${v}`;\n }\n\n expand(query: string, opts: ExpandOptions): string {\n const t = this.templates.get(opts.templateId);\n const m = this.lookup.get(opts.templateId);\n if (!t || !m) return query;\n\n let i = 0;\n let out = \"\";\n\n while (i < query.length) {\n if (!/[A-Za-z0-9_]/.test(query[i]!)) {\n out += query[i]!;\n i++;\n continue;\n }\n\n let j = i;\n while (j < query.length && /[A-Za-z0-9_]/.test(query[j]!)) j++;\n const keyRaw = query.slice(i, j);\n\n let k = j;\n while (k < query.length && /\\s/.test(query[k]!)) k++;\n\n if (query[k] !== \":\") {\n out += query[i]!;\n i++;\n continue;\n }\n\n const keyNorm = normalizeKey(t, keyRaw);\n const sc = m.get(keyNorm);\n\n out += sc ? \"\" : query.slice(i, k + 1);\n k++;\n\n const [valueRaw, nextIdx] = readValue(query, k);\n const valueNorm = maybeWrapValue(valueRaw, opts.wrapBareValues ?? true);\n\n if (!sc) out += valueRaw;\n else if (sc.kind === \"field\" && sc.field) out += `${sc.field}:${valueNorm}`;\n else if (sc.kind === \"macro\" && sc.macro) out += sc.macro.replaceAll(\"{{value}}\", valueNorm);\n else out += `${keyRaw}:${valueNorm}`;\n\n i = nextIdx;\n }\n\n return out;\n }\n\n /**\n * UPDATED: autocomplete with trailingSpace + allowEmptyPrefix\n */\n complete(text: string, cursor: number, opts: CompleteOptions): CompletionItem[] {\n const t = this.templates.get(opts.templateId);\n if (!t) return [];\n\n // if user is typing value after \":\" don't suggest keys\n if (cursor > 0 && text[cursor - 1] === \":\") return [];\n\n const { start, end, prefix } = getTokenRange(text, cursor);\n if (!prefix && !opts.allowEmptyPrefix) return [];\n\n const suggestions = prefix\n ? this.suggest(prefix, opts.templateId, opts.limit ?? 10)\n : this.suggest(\"\", opts.templateId, opts.limit ?? 10); // will be empty unless you want to support full list via allowEmptyPrefix + startsWith(\"\")\n\n // If allowEmptyPrefix: show all shortcuts (ranked by usage, then length, alpha)\n let finalSuggestions = suggestions;\n if (!prefix && opts.allowEmptyPrefix) {\n const all = t.shortcuts.map(sc => ({ sc, k: normalizeKey(t, sc.key) }));\n all.sort((a, b) => {\n const au = this.getUsage(opts.templateId, a.k);\n const bu = this.getUsage(opts.templateId, b.k);\n if (au !== bu) return bu - au;\n if (a.k.length !== b.k.length) return a.k.length - b.k.length;\n return a.k.localeCompare(b.k);\n });\n finalSuggestions = [];\n for (const x of all.slice(0, opts.limit ?? 10)) {\n pushSuggestionSafe(finalSuggestions, x.sc.key, x.sc.label, x.sc.description);\n }\n }\n\n const items: CompletionItem[] = [];\n\n for (const s of finalSuggestions) {\n const sc = t.shortcuts.find(x => normalizeKey(t, x.key) === normalizeKey(t, s.key));\n if (!sc) continue;\n\n // Determine what to use for snippet generation\n // Only use field name if it's different from the key (e.g., TAC -> TAC_ALL)\n // If field equals key (e.g., TAC -> TAC), use key as-is\n const displayName = (sc.kind === \"field\" && sc.field && sc.field !== s.key) \n ? sc.field \n : s.key;\n \n // Generate snippet using display name\n const rawSnippet = sc.snippet \n ? sc.snippet.replace(s.key, displayName)\n : `${displayName}:(|)`;\n \n let { insertText, cursorIndex } = renderSnippet(rawSnippet);\n\n // Label is the same as insertText\n let labelText = insertText;\n\n // NEW: trailing space support\n if (opts.trailingSpace) {\n const atEnd = cursorIndex === insertText.length;\n insertText = insertText + \" \";\n labelText = labelText + \" \";\n if (atEnd) cursorIndex += 1;\n }\n\n const replaceFrom = start;\n const replaceTo = end;\n const newCursor = replaceFrom + cursorIndex;\n\n pushCompletionSafe(items, {\n key: s.key,\n label: labelText,\n description: sc.description,\n replaceFrom,\n replaceTo,\n insertText,\n newCursor\n });\n }\n\n return items;\n }\n\n /**\n * NEW: one-call UI helper\n */\n getCompletions(text: string, cursor: number, opts: CompleteOptions): CompletionsResult {\n const token = getTokenRange(text, cursor);\n const items = this.complete(text, cursor, opts);\n return { token, items };\n }\n\n applyCompletion(text: string, item: CompletionItem): { text: string; cursor: number } {\n const next =\n text.slice(0, item.replaceFrom) +\n item.insertText +\n text.slice(item.replaceTo);\n\n return { text: next, cursor: item.newCursor };\n }\n}\n\n// exports\nexport function createRegistry(templates: Template[]) {\n return new ShortcutRegistry(templates);\n}\n\nexport { patsnapTemplate } from \"./templates/patsnap.js\";\nexport { nuvoaiTemplate } from \"./templates/nuvoai.js\";\n\n// JSON loader exports\nexport { loadTemplateFromJson, loadTemplatesFromJson } from \"./engine/json.js\";\nexport type { TemplateJson, ShortcutJson } from \"./engine/json.js\";\n","// src/templates/patsnap.ts\nimport type { Template } from \"../index.js\";\n\nexport const patsnapTemplate: Template = {\n id: \"patsnap\",\n name: \"Patsnap\",\n normalizeKey: \"upper\",\n shortcuts: [\n // --- Text fields (from your 1st screenshot) ---\n { key: \"TA\", kind: \"field\", field: \"TA_ALL\", label: \"Title + Abstract\", description: \"Search in title and abstract\", aliases: [\"TA_ALL\"] },\n { key: \"TTL\", kind: \"field\", field: \"TTL_ALL\", label: \"Title\", description: \"Search in title\", aliases: [\"TTL_ALL\"] },\n { key: \"TAC\", kind: \"field\", field: \"TAC_ALL\", label: \"Title+Abstract+Claims\", description: \"Search in title, abstract, and claims\", aliases: [\"TAC_ALL\"] },\n { key: \"TACD\", kind: \"field\", field: \"TACD_ALL\", label: \"Title+Abstract+Claims+Description\", description: \"Search in title/abstract/claims/description\", aliases: [\"TACD_ALL\"] },\n { key: \"ABST\", kind: \"field\", field: \"ABST_ALL\", label: \"Abstract\", description: \"Search in abstract\", aliases: [\"ABST_ALL\"] },\n { key: \"CLMS\", kind: \"field\", field: \"CLMS_ALL\", label: \"Claims\", description: \"Search in claims\", aliases: [\"CLMS_ALL\"] },\n { key: \"DESC\", kind: \"field\", field: \"DESC_ALL\", label: \"Description\", description: \"Search in description\", aliases: [\"DESC_ALL\"] },\n\n { key: \"DESC_F\", kind: \"field\", field: \"DESC_F\", label: \"Technical Field\", description: \"Description: technical field\" },\n { key: \"DESC_B\", kind: \"field\", field: \"DESC_B\", label: \"Background Art\", description: \"Description: background art\" },\n { key: \"DESC_S\", kind: \"field\", field: \"DESC_S\", label: \"Summary of Invention\", description: \"Description: summary\" },\n { key: \"DESC_D\", kind: \"field\", field: \"DESC_D\", label: \"Brief Description of Drawings\", description: \"Description: drawings\" },\n { key: \"DESC_E\", kind: \"field\", field: \"DESC_E\", label: \"Description of Embodiments\", description: \"Description: embodiments\" },\n\n { key: \"ICLMS\", kind: \"field\", field: \"ICLMS_ALL\", label: \"Independent Claims\", description: \"Search in independent claims\", aliases: [\"ICLMS_ALL\"] },\n { key: \"PROBLEM_SUM\", kind: \"field\", field: \"PROBLEM_SUM\", label: \"Technical Problem\", description: \"Problem summary\" },\n { key: \"METHOD_SUM\", kind: \"field\", field: \"METHOD_SUM\", label: \"Technical Method\", description: \"Method summary\" },\n { key: \"BENEFIT_SUM\", kind: \"field\", field: \"BENEFIT_SUM\", label: \"Technical Benefit\", description: \"Benefit summary\" },\n\n // --- Classification (2nd screenshot) ---\n { key: \"MCPC\", kind: \"field\", field: \"MCPC\", label: \"Main CPC\" },\n { key: \"CPC_SUB_GROUP\", kind: \"field\", field: \"CPC_SUB_GROUP\", label: \"CPC Sub Group\" },\n { key: \"IPC_CPC\", kind: \"field\", field: \"IPC_CPC\", label: \"IPC & CPC\" },\n { key: \"UPC\", kind: \"field\", field: \"UPC\", label: \"UPC\" },\n { key: \"LOC\", kind: \"field\", field: \"LOC\", label: \"LOC\" },\n { key: \"FI\", kind: \"field\", field: \"FI\", label: \"FI\" },\n { key: \"FTERM\", kind: \"field\", field: \"FTERM\", label: \"F-TERM\" },\n { key: \"ADC\", kind: \"field\", field: \"ADC\", label: \"Application Domain\" },\n { key: \"TTC\", kind: \"field\", field: \"TTC\", label: \"Technology Topic\" },\n { key: \"SEIC\", kind: \"field\", field: \"SEIC\", label: \"Main SEIC\" },\n { key: \"SEIC_ALL\", kind: \"field\", field: \"SEIC_ALL\", label: \"SEIC (All)\" },\n { key: \"GBC\", kind: \"field\", field: \"GBC\", label: \"GBC\" },\n\n // --- Assignees / Inventors (3rd screenshot) ---\n { key: \"ALL_AN\", kind: \"field\", field: \"ALL_AN\", label: \"All Assignees\" },\n { key: \"ANCS\", kind: \"field\", field: \"ANCS\", label: \"Std. Current Assignee\" },\n { key: \"ANC\", kind: \"field\", field: \"ANC\", label: \"Current Assignee\" },\n { key: \"GNAME\", kind: \"field\", field: \"GNAME\", label: \"Grouped Assignee\" },\n { key: \"ANS\", kind: \"field\", field: \"ANS\", label: \"Std. Original Assignee\" },\n { key: \"AN\", kind: \"field\", field: \"AN\", label: \"Original Assignee\" },\n { key: \"F_AN\", kind: \"field\", field: \"F_AN\", label: \"First Original Assignee\" },\n { key: \"F_ANC\", kind: \"field\", field: \"F_ANC\", label: \"First Current Assignee\" },\n { key: \"IN\", kind: \"field\", field: \"IN\", label: \"Inventor Name\" },\n { key: \"F_IN\", kind: \"field\", field: \"F_IN\", label: \"First Inventor\" },\n { key: \"ATC\", kind: \"field\", field: \"ATC\", label: \"Agency\" },\n { key: \"ATCS\", kind: \"field\", field: \"ATCS\", label: \"Std. Agency\" },\n { key: \"AT\", kind: \"field\", field: \"AT\", label: \"Attorney Name\" },\n { key: \"PE\", kind: \"field\", field: \"PE\", label: \"Primary Examiner\" },\n { key: \"AE\", kind: \"field\", field: \"AE\", label: \"Assistant Examiner\" },\n\n // --- Dates (4th screenshot) ---\n { key: \"APD\", kind: \"field\", field: \"APD\", label: \"Application Date\", snippet: \"APD:[| TO ]\" },\n { key: \"PBD\", kind: \"field\", field: \"PBD\", label: \"Publication Date\", snippet: \"PBD:[| TO ]\" },\n { key: \"PRIORITY_DATE\", kind: \"field\", field: \"PRIORITY_DATE\", label: \"Priority Date\", snippet: \"PRIORITY_DATE:[| TO ]\" },\n { key: \"EXDT\", kind: \"field\", field: \"EXDT\", label: \"Estimated Expiry Date\", snippet: \"EXDT:[| TO ]\" },\n { key: \"ISD\", kind: \"field\", field: \"ISD\", label: \"Issue Date\", snippet: \"ISD:[| TO ]\" },\n { key: \"EXPD\", kind: \"field\", field: \"EXPD\", label: \"Expiry Date\", snippet: \"EXPD:[| TO ]\" },\n { key: \"EXAMINE_DATE\", kind: \"field\", field: \"EXAMINE_DATE\", label: \"Substantive Examination Date\", snippet: \"EXAMINE_DATE:[| TO ]\" },\n { key: \"PCTENTRY_DATE\", kind: \"field\", field: \"PCTENTRY_DATE\", label: \"PCT Entry Date\", snippet: \"PCTENTRY_DATE:[| TO ]\" },\n { key: \"LEGAL_STATUS_DATE\", kind: \"field\", field: \"LEGAL_STATUS_DATE\", label: \"Legal Status Date\", snippet: \"LEGAL_STATUS_DATE:[| TO ]\" },\n \n // --- Numbers (5th screenshot) ---\n { key: \"PN\", kind: \"field\", field: \"PN\", label: \"Publication Number\" },\n { key: \"APNO\", kind: \"field\", field: \"APNO\", label: \"Application Number\" },\n { key: \"PRNO\", kind: \"field\", field: \"PRNO\", label: \"Priority Number\" },\n { key: \"KD\", kind: \"field\", field: \"KD\", label: \"Kind Code\" },\n { key: \"PCT_APNO\", kind: \"field\", field: \"PCT_APNO\", label: \"PCT Application Number\" },\n { key: \"PCT_PN\", kind: \"field\", field: \"PCT_PN\", label: \"PCT Publication Number\" },\n\n // --- Addresses / Regions (6th screenshot) ---\n { key: \"AN_ADD\", kind: \"field\", field: \"AN_ADD\", label: \"Original Assignee Address\" },\n { key: \"ANC_ADD\", kind: \"field\", field: \"ANC_ADD\", label: \"Current Assignee Address\" },\n { key: \"IN_ADDRESS\", kind: \"field\", field: \"IN_ADDRESS\", label: \"Inventor Address\" },\n { key: \"PRIORITY_COUNTRY\", kind: \"field\", field: \"PRIORITY_COUNTRY\", label: \"Priority Country/Region\" },\n { key: \"AUTHORITY\", kind: \"field\", field: \"AUTHORITY\", label: \"Authority\" },\n { key: \"EPDS\", kind: \"field\", field: \"EPDS\", label: \"EP Designated State\" },\n { key: \"ENTRY_COUNTRY\", kind: \"field\", field: \"ENTRY_COUNTRY\", label: \"Entry Country/Region\" },\n\n // --- Citations / Family (7th screenshot) ---\n \n { key: \"B_CITES\", kind: \"field\", field: \"B_CITES\", label: \"Backward Citations\" },\n { key: \"F_CITES\", kind: \"field\", field: \"F_CITES\", label: \"Forward Citations\" },\n { key: \"BF_CITES\", kind: \"field\", field: \"BF_CITES\", label: \"Backward Or Forward Citations\" },\n { key: \"B_CITES_COUNT\", kind: \"field\", field: \"B_CITES_COUNT\", label: \"Count Of Backward Citations\", snippet: \"B_CITES_COUNT:[| TO *]\" },\n { key: \"F_CITES_COUNT\", kind: \"field\", field: \"F_CITES_COUNT\", label: \"Count Of Forward Citations\", snippet: \"F_CITES_COUNT:[| TO *]\" },\n { key: \"F_CITES_ANC\", kind: \"field\", field: \"F_CITES_ANC\", label: \"Assignee Forward Citations (Current)\" },\n { key: \"B_CITES_ANC\", kind: \"field\", field: \"B_CITES_ANC\", label: \"Assignee Backward Citations (Current)\" },\n { key: \"CITE_CATEGORY\", kind: \"field\", field: \"CITE_CATEGORY\", label: \"Citation/Rejection Category\" },\n { key: \"FAM\", kind: \"field\", field: \"FAM\", label: \"Simple Family\" },\n { key: \"EFAM\", kind: \"field\", field: \"EFAM\", label: \"PatSnap Family\" },\n { key: \"FAM_COUNT\", kind: \"field\", field: \"FAM_COUNT\", label: \"Simple Family Application Count\", snippet: \"FAM_COUNT:[| TO *]\" },\n { key: \"IFAM_COUNT\", kind: \"field\", field: \"IFAM_COUNT\", label: \"INPADOC Family Application Count\", snippet: \"IFAM_COUNT:[| TO *]\" },\n { key: \"EFAM_COUNT\", kind: \"field\", field: \"EFAM_COUNT\", label: \"PatSnap Family Application Count\", snippet: \"EFAM_COUNT:[| TO *]\" },\n { key: \"FAM_COUNTRY_COUNT\", kind: \"field\", field: \"FAM_COUNTRY_COUNT\", label: \"Simple Family Jurisdiction Count\", snippet: \"FAM_COUNTRY_COUNT:[| TO *]\" },\n { key: \"IFAM_COUNTRY_COUNT\", kind: \"field\", field: \"IFAM_COUNTRY_COUNT\", label: \"INPADOC Family Jurisdiction Count\", snippet: \"IFAM_COUNTRY_COUNT:[| TO *]\" },\n { key: \"EFAM_COUNTRY_COUNT\", kind: \"field\", field: \"EFAM_COUNTRY_COUNT\", label: \"PatSnap Family Jurisdiction Count\", snippet: \"EFAM_COUNTRY_COUNT:[| TO *]\" },\n \n // --- Legal status / metrics (8th screenshot) ---\n { key: \"LEGAL_STATUS\", kind: \"field\", field: \"LEGAL_STATUS\", label: \"Legal Status\" },\n { key: \"LEGAL_EVENT\", kind: \"field\", field: \"LEGAL_EVENT\", label: \"Legal Event\" },\n { key: \"SIMPLE_LEGAL_STATUS\", kind: \"field\", field: \"SIMPLE_LEGAL_STATUS\", label: \"Simple Legal Status\" },\n { key: \"UP_STATUS\", kind: \"field\", field: \"UP_STATUS\", label: \"Status of Unified Patent Court\" },\n { key: \"ENTRY_COUNTRY_LS\", kind: \"field\", field: \"ENTRY_COUNTRY_LS\", label: \"Legal Status of Entry Country/Region\" },\n { key: \"ENTRY_COUNTRY_SLS\", kind: \"field\", field: \"ENTRY_COUNTRY_SLS\", label: \"Simple Legal Status of Entry Country/Region\" },\n { key: \"PV\", kind: \"field\", field: \"PV\", label: \"Patent Value\", snippet: \"PV:[| TO *]\" },\n { key: \"PAGE_COUNT\", kind: \"field\", field: \"PAGE_COUNT\", label: \"Page Count\", snippet: \"PAGE_COUNT:[| TO *]\" },\n { key: \"CLAIM_COUNT\", kind: \"field\", field: \"CLAIM_COUNT\", label: \"Claim Count\", snippet: \"CLAIM_COUNT:[| TO *]\" },\n { key: \"FCLMS_WORDCOUNT\", kind: \"field\", field: \"FCLMS_WORDCOUNT\", label: \"Word count of first claim\", snippet: \"FCLMS_WORDCOUNT:[| TO *]\" },\n { key: \"AN_COUNT\", kind: \"field\", field: \"AN_COUNT\", label: \"Count of Original Assignees\", snippet: \"AN_COUNT:[| TO *]\" },\n { key: \"ANC_COUNT\", kind: \"field\", field: \"ANC_COUNT\", label: \"Count of Current Assignees\", snippet: \"ANC_COUNT:[| TO *]\" },\n { key: \"IN_COUNT\", kind: \"field\", field: \"IN_COUNT\", label: \"Count of Inventors\", snippet: \"IN_COUNT:[| TO *]\" },\n { key: \"GOV\", kind: \"field\", field: \"GOV\", label: \"Government Interest\" }\n ]\n};\n","// src/templates/nuvoai.ts\nimport type { Template } from \"../index.js\";\n\nexport const nuvoaiTemplate: Template = {\n id: \"nuvoai\",\n name: \"NuvoAI\",\n normalizeKey: \"upper\",\n shortcuts: [\n // Patent keyword (all-fields search)\n { key: \"TTL\", kind: \"field\", field: \"TTL\", label: \"Invention Title\", description: \"Populates all the titles in every language for the publication.\", aliases: [\"TITLE\"] },\n { key: \"TA\", kind: \"field\", field: \"TA\", label: \"Invention Title, Abstract\" },\n { key: \"TAC\", kind: \"field\", field: \"TAC\", label: \"Invention Title, Abstract, Claims\" },\n { key: \"TACD\", kind: \"field\", field: \"TACD\", label: \"Invention Title, Abstract, Claims, Description\" },\n\n { key: \"COUNTRY\", kind: \"field\", field: \"COUNTRY\", label: \"Country\" },\n { key: \"KIND\", kind: \"field\", field: \"KIND\", label: \"Patent Kind\" },\n { key: \"TYPE\", kind: \"field\", field: \"TYPE\", label: \"Patent Type\" },\n\n { key: \"ABST\", kind: \"field\", field: \"ABST\", label: \"Abstract\", description: \"Populates all abstract paragraphs for all languages.\" },\n { key: \"CLM\", kind: \"field\", field: \"CLM\", label: \"Claims\", description: \"Populates the claims (all languages), including claims XML field.\" },\n { key: \"DESC\", kind: \"field\", field: \"DESC\", label: \"Description\", description: \"Populates the descriptions (all languages) for the publication.\" },\n\n // Dates (snippets)\n { key: \"PUB_DT\", kind: \"field\", field: \"PUB_DT\", label: \"Publication Date\", snippet: \"PUB_DT:[| TO ]\" },\n { key: \"APP_DT\", kind: \"field\", field: \"APP_DT\", label: \"Application Date\", snippet: \"APP_DT:[| TO ]\" },\n { key: \"EXP_DT\", kind: \"field\", field: \"EXP_DT\", label: \"Expiration Date\", description: \"Populates the expiration date of the publication.\", snippet: \"EXP_DT:[| TO ]\" },\n\n { key: \"APP_NUM\", kind: \"field\", field: \"APP_NUM\", label: \"Application Number\" },\n { key: \"PUB_NUM\", kind: \"field\", field: \"PUB_NUM\", label: \"Publication Number\" },\n\n { key: \"CURR_ASGN\", kind: \"field\", field: \"CURR_ASGN\", label: \"Current Assignee\", description: \"Populates the current assignee of the publication.\" },\n { key: \"INV\", kind: \"field\", field: \"INV\", label: \"Inventors\", description: \"Populates the inventors for the publication.\" },\n\n { key: \"LEGAL_STATUS\", kind: \"field\", field: \"LEGAL_STATUS\", label: \"Legal Status\", description: \"Populates the legal status value; also triggers legal events.\" },\n { key: \"LEGAL_EVNTS\", kind: \"field\", field: \"LEGAL_EVNTS\", label: \"Legal Events\", description: \"Populates legal events (INPADOC and national office).\" },\n\n { key: \"IPC\", kind: \"field\", field: \"IPC\", label: \"IPC Classification (Main Group)\", description: \"Populates the IPC classifications for the publication.\" },\n { key: \"CPC\", kind: \"field\", field: \"CPC\", label: \"CPC Classification (Main Group)\", description: \"Populates classifications for the publication.\" },\n\n { key: \"FAMILY_ID\", kind: \"field\", field: \"FAMILY_ID\", label: \"Family ID\" }\n ]\n};\n\n","// src/engine/json.ts\nimport type { Template, Shortcut, ShortcutKind } from \"../index.js\";\n\nexport type ShortcutJson = {\n key: string;\n kind: ShortcutKind;\n field?: string;\n macro?: string;\n label?: string;\n description?: string;\n aliases?: string[];\n snippet?: string;\n};\n\nexport type TemplateJson = {\n id: string;\n name: string;\n normalizeKey?: \"upper\" | \"none\";\n shortcuts: ShortcutJson[];\n};\n\nfunction isObj(x: unknown): x is Record<string, unknown> {\n return typeof x === \"object\" && x !== null && !Array.isArray(x);\n}\n\nfunction asString(x: unknown, path: string): string {\n if (typeof x !== \"string\" || x.trim() === \"\") throw new Error(`Invalid string at ${path}`);\n return x;\n}\n\nfunction asOptString(x: unknown): string | undefined {\n return typeof x === \"string\" ? x : undefined;\n}\n\nfunction asOptStringArray(x: unknown): string[] | undefined {\n if (x === undefined) return undefined;\n if (!Array.isArray(x)) return undefined;\n const out: string[] = [];\n for (const v of x) if (typeof v === \"string\" && v.trim() !== \"\") out.push(v);\n return out.length ? out : undefined;\n}\n\nfunction asNormalizeKey(x: unknown): \"upper\" | \"none\" | undefined {\n if (x === undefined) return undefined;\n if (x === \"upper\" || x === \"none\") return x;\n throw new Error(`normalizeKey must be \"upper\" | \"none\"`);\n}\n\nfunction asKind(x: unknown): ShortcutKind {\n if (x === \"field\" || x === \"macro\") return x;\n throw new Error(`Invalid shortcut kind: ${String(x)}`);\n}\n\nfunction normalizeShortcut(s: ShortcutJson): Shortcut {\n const key = asString(s.key, \"shortcuts[].key\");\n const kind = asKind(s.kind);\n\n if (kind === \"field\") {\n const field = asOptString(s.field) ?? key; // default to key\n const out: Shortcut = { key, kind, field };\n \n const label = asOptString(s.label);\n if (label !== undefined) out.label = label;\n \n const description = asOptString(s.description);\n if (description !== undefined) out.description = description;\n \n const aliases = asOptStringArray(s.aliases);\n if (aliases) out.aliases = aliases;\n \n const snippet = asOptString(s.snippet);\n if (snippet !== undefined) out.snippet = snippet;\n \n return out;\n }\n \n\n // macro\n const macro = asString(s.macro, \"shortcuts[].macro (required for kind=macro)\");\n const out: Shortcut = { key, kind, macro };\n\n const label = asOptString(s.label);\n if (label !== undefined) out.label = label;\n\n const description = asOptString(s.description);\n if (description !== undefined) out.description = description;\n\n const aliases = asOptStringArray(s.aliases);\n if (aliases) out.aliases = aliases;\n\n const snippet = asOptString(s.snippet);\n if (snippet !== undefined) out.snippet = snippet;\n\n return out;\n\n}\n\nexport function loadTemplateFromJson(input: unknown): Template {\n const obj = typeof input === \"string\" ? JSON.parse(input) : input;\n if (!isObj(obj)) throw new Error(\"Template JSON must be an object\");\n\n const id = asString(obj.id, \"id\");\n const name = asString(obj.name, \"name\");\n const normalizeKey = asNormalizeKey(obj.normalizeKey);\n\n const shortcutsRaw = obj.shortcuts;\n if (!Array.isArray(shortcutsRaw)) throw new Error(\"shortcuts must be an array\");\n\n const shortcuts: Shortcut[] = shortcutsRaw.map((s, idx) => {\n if (!isObj(s)) throw new Error(`shortcuts[${idx}] must be an object`);\n return normalizeShortcut(s as ShortcutJson);\n });\n\n const t: Template = { id, name, shortcuts };\n if (normalizeKey !== undefined) t.normalizeKey = normalizeKey;\n return t;\n}\n\nexport function loadTemplatesFromJson(input: unknown): Template[] {\n const obj = typeof input === \"string\" ? JSON.parse(input) : input;\n if (!Array.isArray(obj)) throw new Error(\"Templates JSON must be an array\");\n return obj.map(loadTemplateFromJson);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,kBAA4B;AAAA,EACvC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,cAAc;AAAA,EACd,WAAW;AAAA;AAAA,IAET,EAAE,KAAK,MAAQ,MAAM,SAAS,OAAO,UAAY,OAAO,oBAAoB,aAAa,gCAAgC,SAAS,CAAC,QAAQ,EAAE;AAAA,IAC7I,EAAE,KAAK,OAAQ,MAAM,SAAS,OAAO,WAAY,OAAO,SAAoB,aAAa,mBAA8B,SAAS,CAAC,SAAS,EAAE;AAAA,IAC5I,EAAE,KAAK,OAAQ,MAAM,SAAS,OAAO,WAAY,OAAO,yBAAyB,aAAa,yCAAyC,SAAS,CAAC,SAAS,EAAE;AAAA,IAC5J,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,YAAY,OAAO,qCAAqC,aAAa,+CAA+C,SAAS,CAAC,UAAU,EAAE;AAAA,IAC/K,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,YAAY,OAAO,YAAoB,aAAa,sBAA8B,SAAS,CAAC,UAAU,EAAE;AAAA,IAC7I,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,YAAY,OAAO,UAAoB,aAAa,oBAA8B,SAAS,CAAC,UAAU,EAAE;AAAA,IAC7I,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,YAAY,OAAO,eAAoB,aAAa,yBAA8B,SAAS,CAAC,UAAU,EAAE;AAAA,IAE7I,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,mBAAgC,aAAa,+BAA+B;AAAA,IACpI,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,kBAA+B,aAAa,8BAA8B;AAAA,IAClI,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,wBAA+B,aAAa,uBAAuB;AAAA,IAC3H,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,iCAAiC,aAAa,wBAAwB;AAAA,IAC9H,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,8BAA+B,aAAa,2BAA2B;AAAA,IAE/H,EAAE,KAAK,SAAS,MAAM,SAAS,OAAO,aAAa,OAAO,sBAAsB,aAAa,gCAAgC,SAAS,CAAC,WAAW,EAAE;AAAA,IACpJ,EAAE,KAAK,eAAe,MAAM,SAAS,OAAO,eAAe,OAAO,qBAAqB,aAAa,kBAAkB;AAAA,IACtH,EAAE,KAAK,cAAe,MAAM,SAAS,OAAO,cAAe,OAAO,oBAAqB,aAAa,iBAAiB;AAAA,IACrH,EAAE,KAAK,eAAe,MAAM,SAAS,OAAO,eAAe,OAAO,qBAAqB,aAAa,kBAAkB;AAAA;AAAA,IAGtH,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,WAAW;AAAA,IAC/D,EAAE,KAAK,iBAAiB,MAAM,SAAS,OAAO,iBAAiB,OAAO,gBAAgB;AAAA,IACtF,EAAE,KAAK,WAAW,MAAM,SAAS,OAAO,WAAW,OAAO,YAAY;AAAA,IACtE,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,MAAM;AAAA,IACxD,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,MAAM;AAAA,IACxD,EAAE,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,KAAK;AAAA,IACrD,EAAE,KAAK,SAAS,MAAM,SAAS,OAAO,SAAS,OAAO,SAAS;AAAA,IAC/D,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,qBAAqB;AAAA,IACvE,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,mBAAmB;AAAA,IACrE,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,YAAY;AAAA,IAChE,EAAE,KAAK,YAAY,MAAM,SAAS,OAAO,YAAY,OAAO,aAAa;AAAA,IACzE,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,MAAM;AAAA;AAAA,IAGxD,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,gBAAgB;AAAA,IACxE,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,wBAAwB;AAAA,IAC5E,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,mBAAmB;AAAA,IACrE,EAAE,KAAK,SAAS,MAAM,SAAS,OAAO,SAAS,OAAO,mBAAmB;AAAA,IACzE,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,yBAAyB;AAAA,IAC3E,EAAE,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,oBAAoB;AAAA,IACpE,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,0BAA0B;AAAA,IAC9E,EAAE,KAAK,SAAS,MAAM,SAAS,OAAO,SAAS,OAAO,yBAAyB;AAAA,IAC/E,EAAE,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,gBAAgB;AAAA,IAChE,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,iBAAiB;AAAA,IACrE,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,SAAS;AAAA,IAC3D,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,cAAc;AAAA,IAClE,EAAE,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,gBAAgB;AAAA,IAChE,EAAE,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,mBAAmB;AAAA,IACnE,EAAE,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,qBAAqB;AAAA;AAAA,IAGrE,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,oBAAoB,SAAS,cAAc;AAAA,IAC7F,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,oBAAoB,SAAS,cAAc;AAAA,IAC7F,EAAE,KAAK,iBAAiB,MAAM,SAAS,OAAO,iBAAiB,OAAO,iBAAiB,SAAS,wBAAwB;AAAA,IACxH,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,yBAAyB,SAAS,eAAe;AAAA,IACrG,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,cAAc,SAAS,cAAc;AAAA,IACvF,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,eAAe,SAAS,eAAe;AAAA,IAC3F,EAAE,KAAK,gBAAgB,MAAM,SAAS,OAAO,gBAAgB,OAAO,gCAAgC,SAAS,uBAAuB;AAAA,IACpI,EAAE,KAAK,iBAAiB,MAAM,SAAS,OAAO,iBAAiB,OAAO,kBAAkB,SAAS,wBAAwB;AAAA,IACzH,EAAE,KAAK,qBAAqB,MAAM,SAAS,OAAO,qBAAqB,OAAO,qBAAqB,SAAS,4BAA4B;AAAA;AAAA,IAGxI,EAAE,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,qBAAqB;AAAA,IACrE,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,qBAAqB;AAAA,IACzE,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,kBAAkB;AAAA,IACtE,EAAE,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,YAAY;AAAA,IAC5D,EAAE,KAAK,YAAY,MAAM,SAAS,OAAO,YAAY,OAAO,yBAAyB;AAAA,IACrF,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,yBAAyB;AAAA;AAAA,IAGjF,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,4BAA4B;AAAA,IACpF,EAAE,KAAK,WAAW,MAAM,SAAS,OAAO,WAAW,OAAO,2BAA2B;AAAA,IACrF,EAAE,KAAK,cAAc,MAAM,SAAS,OAAO,cAAc,OAAO,mBAAmB;AAAA,IACnF,EAAE,KAAK,oBAAoB,MAAM,SAAS,OAAO,oBAAoB,OAAO,0BAA0B;AAAA,IACtG,EAAE,KAAK,aAAa,MAAM,SAAS,OAAO,aAAa,OAAO,YAAY;AAAA,IAC1E,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,sBAAsB;AAAA,IAC1E,EAAE,KAAK,iBAAiB,MAAM,SAAS,OAAO,iBAAiB,OAAO,uBAAuB;AAAA;AAAA,IAI7F,EAAE,KAAK,WAAW,MAAM,SAAS,OAAO,WAAW,OAAO,qBAAqB;AAAA,IAC/E,EAAE,KAAK,WAAW,MAAM,SAAS,OAAO,WAAW,OAAO,oBAAoB;AAAA,IAC9E,EAAE,KAAK,YAAY,MAAM,SAAS,OAAO,YAAY,OAAO,gCAAgC;AAAA,IAC5F,EAAE,KAAK,iBAAiB,MAAM,SAAS,OAAO,iBAAiB,OAAO,+BAA+B,SAAS,yBAAyB;AAAA,IACvI,EAAE,KAAK,iBAAiB,MAAM,SAAS,OAAO,iBAAiB,OAAO,8BAA8B,SAAS,yBAAyB;AAAA,IACtI,EAAE,KAAK,eAAe,MAAM,SAAS,OAAO,eAAe,OAAO,uCAAuC;AAAA,IACzG,EAAE,KAAK,eAAe,MAAM,SAAS,OAAO,eAAe,OAAO,wCAAwC;AAAA,IAC1G,EAAE,KAAK,iBAAiB,MAAM,SAAS,OAAO,iBAAiB,OAAO,8BAA8B;AAAA,IACpG,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,gBAAgB;AAAA,IAClE,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,iBAAiB;AAAA,IACrE,EAAE,KAAK,aAAa,MAAM,SAAS,OAAO,aAAa,OAAO,mCAAmC,SAAS,qBAAqB;AAAA,IAC/H,EAAE,KAAK,cAAc,MAAM,SAAS,OAAO,cAAc,OAAO,oCAAoC,SAAS,sBAAsB;AAAA,IACnI,EAAE,KAAK,cAAc,MAAM,SAAS,OAAO,cAAc,OAAO,oCAAoC,SAAS,sBAAsB;AAAA,IACnI,EAAE,KAAK,qBAAqB,MAAM,SAAS,OAAO,qBAAqB,OAAO,oCAAoC,SAAS,6BAA6B;AAAA,IACxJ,EAAE,KAAK,sBAAsB,MAAM,SAAS,OAAO,sBAAsB,OAAO,qCAAqC,SAAS,8BAA8B;AAAA,IAC5J,EAAE,KAAK,sBAAsB,MAAM,SAAS,OAAO,sBAAsB,OAAO,qCAAqC,SAAS,8BAA8B;AAAA;AAAA,IAG5J,EAAE,KAAK,gBAAgB,MAAM,SAAS,OAAO,gBAAgB,OAAO,eAAe;AAAA,IACnF,EAAE,KAAK,eAAe,MAAM,SAAS,OAAO,eAAe,OAAO,cAAc;AAAA,IAChF,EAAE,KAAK,uBAAuB,MAAM,SAAS,OAAO,uBAAuB,OAAO,sBAAsB;AAAA,IACxG,EAAE,KAAK,aAAa,MAAM,SAAS,OAAO,aAAa,OAAO,iCAAiC;AAAA,IAC/F,EAAE,KAAK,oBAAoB,MAAM,SAAS,OAAO,oBAAoB,OAAO,uCAAuC;AAAA,IACnH,EAAE,KAAK,qBAAqB,MAAM,SAAS,OAAO,qBAAqB,OAAO,8CAA8C;AAAA,IAC5H,EAAE,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,gBAAgB,SAAS,cAAc;AAAA,IACvF,EAAE,KAAK,cAAc,MAAM,SAAS,OAAO,cAAc,OAAO,cAAc,SAAS,sBAAsB;AAAA,IAC7G,EAAE,KAAK,eAAe,MAAM,SAAS,OAAO,eAAe,OAAO,eAAe,SAAS,uBAAuB;AAAA,IACjH,EAAE,KAAK,mBAAmB,MAAM,SAAS,OAAO,mBAAmB,OAAO,6BAA6B,SAAS,2BAA2B;AAAA,IAC3I,EAAE,KAAK,YAAY,MAAM,SAAS,OAAO,YAAY,OAAO,+BAA+B,SAAS,oBAAoB;AAAA,IACxH,EAAE,KAAK,aAAa,MAAM,SAAS,OAAO,aAAa,OAAO,8BAA8B,SAAS,qBAAqB;AAAA,IAC1H,EAAE,KAAK,YAAY,MAAM,SAAS,OAAO,YAAY,OAAO,sBAAsB,SAAS,oBAAoB;AAAA,IAC/G,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,sBAAsB;AAAA,EAC1E;AACF;;;ACvHO,IAAM,iBAA2B;AAAA,EACtC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,cAAc;AAAA,EACd,WAAW;AAAA;AAAA,IAET,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,mBAAmB,aAAa,mEAAmE,SAAS,CAAC,OAAO,EAAE;AAAA,IACxK,EAAE,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,4BAA4B;AAAA,IAC5E,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,oCAAoC;AAAA,IACtF,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,iDAAiD;AAAA,IAErG,EAAE,KAAK,WAAW,MAAM,SAAS,OAAO,WAAW,OAAO,UAAU;AAAA,IACpE,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,cAAc;AAAA,IAClE,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,cAAc;AAAA,IAElE,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,YAAY,aAAa,uDAAuD;AAAA,IACpI,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,UAAU,aAAa,oEAAoE;AAAA,IAC7I,EAAE,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,OAAO,eAAe,aAAa,kEAAkE;AAAA;AAAA,IAGlJ,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,oBAAoB,SAAS,iBAAiB;AAAA,IACtG,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,oBAAoB,SAAS,iBAAiB;AAAA,IACtG,EAAE,KAAK,UAAU,MAAM,SAAS,OAAO,UAAU,OAAO,mBAAmB,aAAa,qDAAqD,SAAS,iBAAiB;AAAA,IAEvK,EAAE,KAAK,WAAW,MAAM,SAAS,OAAO,WAAW,OAAO,qBAAqB;AAAA,IAC/E,EAAE,KAAK,WAAW,MAAM,SAAS,OAAO,WAAW,OAAO,qBAAqB;AAAA,IAE/E,EAAE,KAAK,aAAa,MAAM,SAAS,OAAO,aAAa,OAAO,oBAAoB,aAAa,qDAAqD;AAAA,IACpJ,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,aAAa,aAAa,+CAA+C;AAAA,IAE3H,EAAE,KAAK,gBAAgB,MAAM,SAAS,OAAO,gBAAgB,OAAO,gBAAgB,aAAa,gEAAgE;AAAA,IACjK,EAAE,KAAK,eAAe,MAAM,SAAS,OAAO,eAAe,OAAO,gBAAgB,aAAa,wDAAwD;AAAA,IAEvJ,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,mCAAmC,aAAa,yDAAyD;AAAA,IAC3J,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,mCAAmC,aAAa,iDAAiD;AAAA,IAEnJ,EAAE,KAAK,aAAa,MAAM,SAAS,OAAO,aAAa,OAAO,YAAY;AAAA,EAC5E;AACF;;;ACpBA,SAAS,MAAM,GAA0C;AACvD,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEA,SAAS,SAAS,GAAY,MAAsB;AAClD,MAAI,OAAO,MAAM,YAAY,EAAE,KAAK,MAAM,GAAI,OAAM,IAAI,MAAM,qBAAqB,IAAI,EAAE;AACzF,SAAO;AACT;AAEA,SAAS,YAAY,GAAgC;AACnD,SAAO,OAAO,MAAM,WAAW,IAAI;AACrC;AAEA,SAAS,iBAAiB,GAAkC;AAC1D,MAAI,MAAM,OAAW,QAAO;AAC5B,MAAI,CAAC,MAAM,QAAQ,CAAC,EAAG,QAAO;AAC9B,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,EAAG,KAAI,OAAO,MAAM,YAAY,EAAE,KAAK,MAAM,GAAI,KAAI,KAAK,CAAC;AAC3E,SAAO,IAAI,SAAS,MAAM;AAC5B;AAEA,SAAS,eAAe,GAA0C;AAChE,MAAI,MAAM,OAAW,QAAO;AAC5B,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,QAAM,IAAI,MAAM,uCAAuC;AACzD;AAEA,SAAS,OAAO,GAA0B;AACxC,MAAI,MAAM,WAAW,MAAM,QAAS,QAAO;AAC3C,QAAM,IAAI,MAAM,0BAA0B,OAAO,CAAC,CAAC,EAAE;AACvD;AAEA,SAAS,kBAAkB,GAA2B;AACpD,QAAM,MAAM,SAAS,EAAE,KAAK,iBAAiB;AAC7C,QAAM,OAAO,OAAO,EAAE,IAAI;AAE1B,MAAI,SAAS,SAAS;AACpB,UAAM,QAAQ,YAAY,EAAE,KAAK,KAAK;AACtC,UAAMA,OAAgB,EAAE,KAAK,MAAM,MAAM;AAEzC,UAAMC,SAAQ,YAAY,EAAE,KAAK;AACjC,QAAIA,WAAU,OAAW,CAAAD,KAAI,QAAQC;AAErC,UAAMC,eAAc,YAAY,EAAE,WAAW;AAC7C,QAAIA,iBAAgB,OAAW,CAAAF,KAAI,cAAcE;AAEjD,UAAMC,WAAU,iBAAiB,EAAE,OAAO;AAC1C,QAAIA,SAAS,CAAAH,KAAI,UAAUG;AAE3B,UAAMC,WAAU,YAAY,EAAE,OAAO;AACrC,QAAIA,aAAY,OAAW,CAAAJ,KAAI,UAAUI;AAEzC,WAAOJ;AAAA,EACT;AAIA,QAAM,QAAQ,SAAS,EAAE,OAAO,6CAA6C;AAC7E,QAAM,MAAgB,EAAE,KAAK,MAAM,MAAM;AAEzC,QAAM,QAAQ,YAAY,EAAE,KAAK;AACjC,MAAI,UAAU,OAAW,KAAI,QAAQ;AAErC,QAAM,cAAc,YAAY,EAAE,WAAW;AAC7C,MAAI,gBAAgB,OAAW,KAAI,cAAc;AAEjD,QAAM,UAAU,iBAAiB,EAAE,OAAO;AAC1C,MAAI,QAAS,KAAI,UAAU;AAE3B,QAAM,UAAU,YAAY,EAAE,OAAO;AACrC,MAAI,YAAY,OAAW,KAAI,UAAU;AAEzC,SAAO;AAET;AAEO,SAAS,qBAAqB,OAA0B;AAC7D,QAAM,MAAM,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAC5D,MAAI,CAAC,MAAM,GAAG,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAElE,QAAM,KAAK,SAAS,IAAI,IAAI,IAAI;AAChC,QAAM,OAAO,SAAS,IAAI,MAAM,MAAM;AACtC,QAAMK,gBAAe,eAAe,IAAI,YAAY;AAEpD,QAAM,eAAe,IAAI;AACzB,MAAI,CAAC,MAAM,QAAQ,YAAY,EAAG,OAAM,IAAI,MAAM,4BAA4B;AAE9E,QAAM,YAAwB,aAAa,IAAI,CAAC,GAAG,QAAQ;AACzD,QAAI,CAAC,MAAM,CAAC,EAAG,OAAM,IAAI,MAAM,aAAa,GAAG,qBAAqB;AACpE,WAAO,kBAAkB,CAAiB;AAAA,EAC5C,CAAC;AAED,QAAM,IAAc,EAAE,IAAI,MAAM,UAAU;AAC1C,MAAIA,kBAAiB,OAAW,GAAE,eAAeA;AACjD,SAAO;AACT;AAEO,SAAS,sBAAsB,OAA4B;AAChE,QAAM,MAAM,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAC5D,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAC1E,SAAO,IAAI,IAAI,oBAAoB;AACrC;;;AH7DA,SAAS,aAAa,GAAa,KAAqB;AACtD,SAAO,EAAE,iBAAiB,UAAU,IAAI,YAAY,IAAI;AAC1D;AAEA,SAAS,YAAY,GAAoB;AACvC,QAAM,IAAI,EAAE,KAAK;AACjB,SAAO,EAAE,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAI;AACtE;AAEA,SAAS,eAAe,GAAW,gBAAiC;AAClE,QAAM,IAAI,EAAE,KAAK;AACjB,MAAI,CAAC,eAAgB,QAAO;AAC5B,MAAI,CAAC,YAAY,CAAC,EAAG,QAAO;AAC5B,SAAO,IAAI,CAAC;AACd;AAIA,SAAS,UAAU,OAAe,OAAiC;AACjE,MAAI,IAAI;AACR,SAAO,IAAI,MAAM,UAAU,KAAK,KAAK,MAAM,CAAC,CAAE,EAAG;AAEjD,QAAM,KAAK,MAAM,CAAC;AAClB,MAAI,CAAC,GAAI,QAAO,CAAC,IAAI,CAAC;AAEtB,QAAM,eAAe,CAAC,MAAc,UAAoC;AACtE,QAAI,QAAQ;AACZ,QAAIC,KAAI;AACR,WAAOA,KAAI,MAAM,QAAQ;AACvB,YAAM,IAAI,MAAMA,EAAC;AACjB,UAAI,MAAM,KAAM;AAAA,eACP,MAAM,OAAO;AACpB;AACA,YAAI,UAAU,GAAG;AACf,UAAAA;AACA,iBAAO,CAAC,MAAM,MAAM,GAAGA,EAAC,GAAGA,EAAC;AAAA,QAC9B;AAAA,MACF,WAAW,MAAM,KAAM;AACrB,QAAAA;AACA,eAAOA,KAAI,MAAM,QAAQ;AACvB,cAAI,MAAMA,EAAC,MAAM,QAAQA,KAAI,IAAI,MAAM,QAAQ;AAAE,YAAAA,MAAK;AAAG;AAAA,UAAU;AACnE,cAAI,MAAMA,EAAC,MAAM,KAAM;AAAE,YAAAA;AAAK;AAAA,UAAO;AACrC,UAAAA;AAAA,QACF;AACA;AAAA,MACF;AACA,MAAAA;AAAA,IACF;AACA,WAAO,CAAC,MAAM,MAAM,CAAC,GAAG,MAAM,MAAM;AAAA,EACtC;AAEA,MAAI,OAAO,IAAK,QAAO,aAAa,KAAK,GAAG;AAC5C,MAAI,OAAO,IAAK,QAAO,aAAa,KAAK,GAAG;AAE5C,MAAI,OAAO,KAAM;AACf,QAAIA,KAAI,IAAI;AACZ,WAAOA,KAAI,MAAM,QAAQ;AACvB,UAAI,MAAMA,EAAC,MAAM,QAAQA,KAAI,IAAI,MAAM,QAAQ;AAAE,QAAAA,MAAK;AAAG;AAAA,MAAU;AACnE,UAAI,MAAMA,EAAC,MAAM,KAAM;AAAE,QAAAA;AAAK;AAAA,MAAO;AACrC,MAAAA;AAAA,IACF;AACA,WAAO,CAAC,MAAM,MAAM,GAAGA,EAAC,GAAGA,EAAC;AAAA,EAC9B;AAEA,MAAI,IAAI;AACR,SAAO,IAAI,MAAM,UAAU,CAAC,KAAK,KAAK,MAAM,CAAC,CAAE,EAAG;AAClD,SAAO,CAAC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC;AAC9B;AAMA,SAAS,cAAc,MAAc,QAAgE;AACnG,QAAM,SAAS,CAAC,MAAc,eAAe,KAAK,CAAC;AAEnD,MAAI,QAAQ,KAAK,IAAI,GAAG,MAAM;AAC9B,SAAO,QAAQ,KAAK,OAAO,KAAK,QAAQ,CAAC,CAAE,EAAG;AAE9C,MAAI,MAAM,KAAK,IAAI,GAAG,MAAM;AAC5B,SAAO,MAAM,KAAK,UAAU,OAAO,KAAK,GAAG,CAAE,EAAG;AAEhD,QAAM,SAAS,KAAK,MAAM,OAAO,MAAM;AACvC,SAAO,EAAE,OAAO,KAAK,OAAO;AAC9B;AAKA,SAAS,cAAc,SAA8D;AACnF,QAAM,MAAM,QAAQ,QAAQ,GAAG;AAC/B,MAAI,QAAQ,GAAI,QAAO,EAAE,YAAY,SAAS,aAAa,QAAQ,OAAO;AAC1E,QAAM,aAAa,QAAQ,QAAQ,KAAK,EAAE;AAC1C,SAAO,EAAE,YAAY,aAAa,IAAI;AACxC;AAEA,SAAS,mBAAmB,KAAmB,KAAa,OAAgB,aAAsB;AAChG,QAAM,OAAmB,EAAE,IAAI;AAC/B,MAAI,UAAU,OAAW,MAAK,QAAQ;AACtC,MAAI,gBAAgB,OAAW,MAAK,cAAc;AAClD,MAAI,KAAK,IAAI;AACf;AAEA,SAAS,mBAAmB,KAAwB,MAAkF;AACpI,QAAM,IAAoB;AAAA,IACxB,KAAK,KAAK;AAAA,IACV,OAAO,KAAK;AAAA,IACZ,aAAa,KAAK;AAAA,IAClB,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,WAAW,KAAK;AAAA,EAClB;AACA,MAAI,KAAK,gBAAgB,OAAW,GAAE,cAAc,KAAK;AACzD,MAAI,KAAK,CAAC;AACZ;AAEO,IAAM,mBAAN,MAAuB;AAAA;AAAA,EAK5B,YAAY,WAAuB;AAJnC,wBAAQ,aAAY,oBAAI,IAAsB;AAC9C,wBAAQ,UAAS,oBAAI,IAAmC;AACxD,wBAAQ,SAAQ,oBAAI,IAAiC;AAGnD,eAAW,KAAK,UAAW,MAAK,iBAAiB,CAAC;AAAA,EACpD;AAAA,EAEA,iBAAiB,GAAa;AAC5B,SAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAE1B,UAAM,MAAM,oBAAI,IAAsB;AACtC,eAAW,MAAM,EAAE,WAAW;AAC5B,UAAI,IAAI,aAAa,GAAG,GAAG,GAAG,GAAG,EAAE;AACnC,iBAAW,KAAK,GAAG,WAAW,CAAC,EAAG,KAAI,IAAI,aAAa,GAAG,CAAC,GAAG,EAAE;AAAA,IAClE;AACA,SAAK,OAAO,IAAI,EAAE,IAAI,GAAG;AAEzB,QAAI,CAAC,KAAK,MAAM,IAAI,EAAE,EAAE,EAAG,MAAK,MAAM,IAAI,EAAE,IAAI,oBAAI,IAAI,CAAC;AAAA,EAC3D;AAAA,EAEA,gBAAgD;AAC9C,WAAO,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,KAAK,EAAE;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,YAAoB,KAAa,QAAQ,GAAG;AACtD,UAAM,IAAI,KAAK,UAAU,IAAI,UAAU;AACvC,QAAI,CAAC,EAAG;AACR,UAAM,OAAO,aAAa,GAAG,GAAG;AAChC,UAAM,IAAI,KAAK,MAAM,IAAI,UAAU,KAAK,oBAAI,IAAoB;AAChE,UAAM,MAAM,EAAE,IAAI,IAAI,KAAK;AAC3B,MAAE,IAAI,MAAM,MAAM,KAAK;AACvB,SAAK,MAAM,IAAI,YAAY,CAAC;AAAA,EAC9B;AAAA,EAEQ,SAAS,YAAoB,eAA+B;AAClE,WAAO,KAAK,MAAM,IAAI,UAAU,GAAG,IAAI,aAAa,KAAK;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,QAAgB,YAAoB,QAAQ,IAAkB;AACpE,UAAM,IAAI,KAAK,UAAU,IAAI,UAAU;AACvC,QAAI,CAAC,EAAG,QAAO,CAAC;AAEhB,UAAM,IAAI,aAAa,GAAG,MAAM;AAChC,UAAM,aAAa,EAAE,UAClB,IAAI,SAAO,EAAE,IAAI,GAAG,aAAa,GAAG,GAAG,GAAG,EAAE,EAAE,EAC9C,OAAO,OAAK,EAAE,EAAE,WAAW,CAAC,CAAC;AAEhC,eAAW,KAAK,CAAC,GAAG,MAAM;AACxB,YAAM,SAAS,EAAE,MAAM,IAAI,IAAI;AAC/B,YAAM,SAAS,EAAE,MAAM,IAAI,IAAI;AAC/B,UAAI,WAAW,OAAQ,QAAO,SAAS;AAEvC,YAAM,KAAK,KAAK,SAAS,YAAY,EAAE,CAAC;AACxC,YAAM,KAAK,KAAK,SAAS,YAAY,EAAE,CAAC;AACxC,UAAI,OAAO,GAAI,QAAO,KAAK;AAE3B,UAAI,EAAE,EAAE,WAAW,EAAE,EAAE,OAAQ,QAAO,EAAE,EAAE,SAAS,EAAE,EAAE;AACvD,aAAO,EAAE,EAAE,cAAc,EAAE,CAAC;AAAA,IAC9B,CAAC;AAED,UAAM,MAAoB,CAAC;AAC3B,eAAW,EAAE,GAAG,KAAK,WAAW,MAAM,GAAG,KAAK,GAAG;AAC/C,yBAAmB,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,WAAW;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAe,OAAe,MAA6B;AAC/D,UAAM,IAAI,KAAK,UAAU,IAAI,KAAK,UAAU;AAC5C,UAAM,IAAI,KAAK,OAAO,IAAI,KAAK,UAAU;AACzC,QAAI,CAAC,KAAK,CAAC,EAAG,QAAO,GAAG,KAAK,IAAI,KAAK;AAEtC,UAAM,MAAM,aAAa,GAAG,KAAK;AACjC,UAAM,KAAK,EAAE,IAAI,GAAG;AACpB,QAAI,CAAC,GAAI,QAAO,GAAG,KAAK,IAAI,KAAK;AAEjC,UAAM,IAAI,eAAe,OAAO,KAAK,kBAAkB,IAAI;AAE3D,QAAI,GAAG,SAAS,WAAW,GAAG,MAAO,QAAO,GAAG,GAAG,KAAK,IAAI,CAAC;AAC5D,QAAI,GAAG,SAAS,WAAW,GAAG,MAAO,QAAO,GAAG,MAAM,WAAW,aAAa,CAAC;AAE9E,WAAO,GAAG,KAAK,IAAI,CAAC;AAAA,EACtB;AAAA,EAEA,OAAO,OAAe,MAA6B;AACjD,UAAM,IAAI,KAAK,UAAU,IAAI,KAAK,UAAU;AAC5C,UAAM,IAAI,KAAK,OAAO,IAAI,KAAK,UAAU;AACzC,QAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AAErB,QAAI,IAAI;AACR,QAAI,MAAM;AAEV,WAAO,IAAI,MAAM,QAAQ;AACvB,UAAI,CAAC,eAAe,KAAK,MAAM,CAAC,CAAE,GAAG;AACnC,eAAO,MAAM,CAAC;AACd;AACA;AAAA,MACF;AAEA,UAAI,IAAI;AACR,aAAO,IAAI,MAAM,UAAU,eAAe,KAAK,MAAM,CAAC,CAAE,EAAG;AAC3D,YAAM,SAAS,MAAM,MAAM,GAAG,CAAC;AAE/B,UAAI,IAAI;AACR,aAAO,IAAI,MAAM,UAAU,KAAK,KAAK,MAAM,CAAC,CAAE,EAAG;AAEjD,UAAI,MAAM,CAAC,MAAM,KAAK;AACpB,eAAO,MAAM,CAAC;AACd;AACA;AAAA,MACF;AAEA,YAAM,UAAU,aAAa,GAAG,MAAM;AACtC,YAAM,KAAK,EAAE,IAAI,OAAO;AAExB,aAAO,KAAK,KAAK,MAAM,MAAM,GAAG,IAAI,CAAC;AACrC;AAEA,YAAM,CAAC,UAAU,OAAO,IAAI,UAAU,OAAO,CAAC;AAC9C,YAAM,YAAY,eAAe,UAAU,KAAK,kBAAkB,IAAI;AAEtE,UAAI,CAAC,GAAI,QAAO;AAAA,eACP,GAAG,SAAS,WAAW,GAAG,MAAO,QAAO,GAAG,GAAG,KAAK,IAAI,SAAS;AAAA,eAChE,GAAG,SAAS,WAAW,GAAG,MAAO,QAAO,GAAG,MAAM,WAAW,aAAa,SAAS;AAAA,UACtF,QAAO,GAAG,MAAM,IAAI,SAAS;AAElC,UAAI;AAAA,IACN;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAc,QAAgB,MAAyC;AAC9E,UAAM,IAAI,KAAK,UAAU,IAAI,KAAK,UAAU;AAC5C,QAAI,CAAC,EAAG,QAAO,CAAC;AAGhB,QAAI,SAAS,KAAK,KAAK,SAAS,CAAC,MAAM,IAAK,QAAO,CAAC;AAEpD,UAAM,EAAE,OAAO,KAAK,OAAO,IAAI,cAAc,MAAM,MAAM;AACzD,QAAI,CAAC,UAAU,CAAC,KAAK,iBAAkB,QAAO,CAAC;AAE/C,UAAM,cAAc,SAChB,KAAK,QAAQ,QAAQ,KAAK,YAAY,KAAK,SAAS,EAAE,IACtD,KAAK,QAAQ,IAAI,KAAK,YAAY,KAAK,SAAS,EAAE;AAGtD,QAAI,mBAAmB;AACvB,QAAI,CAAC,UAAU,KAAK,kBAAkB;AACpC,YAAM,MAAM,EAAE,UAAU,IAAI,SAAO,EAAE,IAAI,GAAG,aAAa,GAAG,GAAG,GAAG,EAAE,EAAE;AACtE,UAAI,KAAK,CAAC,GAAG,MAAM;AACjB,cAAM,KAAK,KAAK,SAAS,KAAK,YAAY,EAAE,CAAC;AAC7C,cAAM,KAAK,KAAK,SAAS,KAAK,YAAY,EAAE,CAAC;AAC7C,YAAI,OAAO,GAAI,QAAO,KAAK;AAC3B,YAAI,EAAE,EAAE,WAAW,EAAE,EAAE,OAAQ,QAAO,EAAE,EAAE,SAAS,EAAE,EAAE;AACvD,eAAO,EAAE,EAAE,cAAc,EAAE,CAAC;AAAA,MAC9B,CAAC;AACD,yBAAmB,CAAC;AACpB,iBAAW,KAAK,IAAI,MAAM,GAAG,KAAK,SAAS,EAAE,GAAG;AAC9C,2BAAmB,kBAAkB,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,WAAW;AAAA,MAC7E;AAAA,IACF;AAEA,UAAM,QAA0B,CAAC;AAEjC,eAAW,KAAK,kBAAkB;AAChC,YAAM,KAAK,EAAE,UAAU,KAAK,OAAK,aAAa,GAAG,EAAE,GAAG,MAAM,aAAa,GAAG,EAAE,GAAG,CAAC;AAClF,UAAI,CAAC,GAAI;AAKT,YAAM,cAAe,GAAG,SAAS,WAAW,GAAG,SAAS,GAAG,UAAU,EAAE,MACnE,GAAG,QACH,EAAE;AAGN,YAAM,aAAa,GAAG,UAClB,GAAG,QAAQ,QAAQ,EAAE,KAAK,WAAW,IACrC,GAAG,WAAW;AAElB,UAAI,EAAE,YAAY,YAAY,IAAI,cAAc,UAAU;AAG1D,UAAI,YAAY;AAGhB,UAAI,KAAK,eAAe;AACtB,cAAM,QAAQ,gBAAgB,WAAW;AACzC,qBAAa,aAAa;AAC1B,oBAAY,YAAY;AACxB,YAAI,MAAO,gBAAe;AAAA,MAC5B;AAEA,YAAM,cAAc;AACpB,YAAM,YAAY;AAClB,YAAM,YAAY,cAAc;AAEhC,yBAAmB,OAAO;AAAA,QACxB,KAAK,EAAE;AAAA,QACP,OAAO;AAAA,QACP,aAAa,GAAG;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAc,QAAgB,MAA0C;AACrF,UAAM,QAAQ,cAAc,MAAM,MAAM;AACxC,UAAM,QAAQ,KAAK,SAAS,MAAM,QAAQ,IAAI;AAC9C,WAAO,EAAE,OAAO,MAAM;AAAA,EACxB;AAAA,EAEA,gBAAgB,MAAc,MAAwD;AACpF,UAAM,OACJ,KAAK,MAAM,GAAG,KAAK,WAAW,IAC9B,KAAK,aACL,KAAK,MAAM,KAAK,SAAS;AAE3B,WAAO,EAAE,MAAM,MAAM,QAAQ,KAAK,UAAU;AAAA,EAC9C;AACF;AAGO,SAAS,eAAe,WAAuB;AACpD,SAAO,IAAI,iBAAiB,SAAS;AACvC;","names":["out","label","description","aliases","snippet","normalizeKey","j"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/templates/patsnap.ts","../src/templates/nuvoai.ts","../src/engine/json.ts"],"sourcesContent":["// src/index.ts\n\n\nexport type ShortcutKind = \"field\" | \"macro\";\n\nexport type Suggestion = {\n key: string;\n label?: string;\n description?: string;\n};\n\nexport type Shortcut = {\n key: string; // user types, e.g. \"TAC\"\n kind: ShortcutKind; // \"field\" or \"macro\"\n field?: string; // if kind=\"field\": actual field, e.g. \"TAC_ALL\"\n macro?: string; // if kind=\"macro\": string with {{value}} placeholder\n label?: string;\n description?: string;\n aliases?: string[];\n /**\n * Optional autocomplete snippet.\n * Use `|` to mark cursor position after insertion.\n * Example: \"TAC:(|)\" => inserts \"TAC:()\" and cursor is inside parentheses.\n */\n snippet?: string;\n};\n\nexport type Template = {\n id: string;\n name: string;\n shortcuts: Shortcut[];\n normalizeKey?: \"upper\" | \"none\";\n};\n\nexport type ExpandOptions = {\n templateId: string;\n wrapBareValues?: boolean;\n};\n\nexport type CompletionItem = {\n key: string; // \"TAC\"\n label: string; // e.g. \"TAC:()\"\n description?: string;\n replaceFrom: number;\n replaceTo: number;\n insertText: string; // e.g. \"TAC:() \"\n newCursor: number; // absolute cursor position in final string\n};\n\nexport type CompleteOptions = {\n templateId: string;\n limit?: number;\n trailingSpace?: boolean; // e.g. inserts \"TAC:() \" (cursor stays where snippet says)\n allowEmptyPrefix?: boolean; // if true, shows all shortcuts when prefix is empty\n};\n\nexport type CompletionsResult = {\n token: { start: number; end: number; prefix: string };\n items: CompletionItem[];\n};\n\nfunction normalizeKey(t: Template, key: string): string {\n return t.normalizeKey === \"upper\" ? key.toUpperCase() : key;\n}\n\nfunction isBareValue(v: string): boolean {\n const s = v.trim();\n return !(s.startsWith(\"(\") || s.startsWith(\"[\") || s.startsWith(\"\\\"\"));\n}\n\nfunction maybeWrapValue(v: string, wrapBareValues: boolean): string {\n const s = v.trim();\n if (!wrapBareValues) return s;\n if (!isBareValue(s)) return s;\n return `(${s})`;\n}\n\n// Reads a value after \":\" supporting (), [], \"\" and bare tokens.\n// Returns [value, nextIndex]\nfunction readValue(input: string, start: number): [string, number] {\n let i = start;\n while (i < input.length && /\\s/.test(input[i]!)) i++;\n\n const ch = input[i];\n if (!ch) return [\"\", i];\n\n const readBalanced = (open: string, close: string): [string, number] => {\n let depth = 0;\n let j = i;\n while (j < input.length) {\n const c = input[j]!;\n if (c === open) depth++;\n else if (c === close) {\n depth--;\n if (depth === 0) {\n j++;\n return [input.slice(i, j), j];\n }\n } else if (c === \"\\\"\") {\n j++;\n while (j < input.length) {\n if (input[j] === \"\\\\\" && j + 1 < input.length) { j += 2; continue; }\n if (input[j] === \"\\\"\") { j++; break; }\n j++;\n }\n continue;\n }\n j++;\n }\n return [input.slice(i), input.length];\n };\n\n if (ch === \"(\") return readBalanced(\"(\", \")\");\n if (ch === \"[\") return readBalanced(\"[\", \"]\");\n\n if (ch === \"\\\"\") {\n let j = i + 1;\n while (j < input.length) {\n if (input[j] === \"\\\\\" && j + 1 < input.length) { j += 2; continue; }\n if (input[j] === \"\\\"\") { j++; break; }\n j++;\n }\n return [input.slice(i, j), j];\n }\n\n let j = i;\n while (j < input.length && !/\\s/.test(input[j]!)) j++;\n return [input.slice(i, j), j];\n}\n\n/**\n * Find token at/left of cursor for completion.\n * Token chars: [A-Za-z0-9_]+\n */\nfunction getTokenRange(text: string, cursor: number): { start: number; end: number; prefix: string } {\n const isWord = (c: string) => /[A-Za-z0-9_]/.test(c);\n\n let start = Math.max(0, cursor);\n while (start > 0 && isWord(text[start - 1]!)) start--;\n\n let end = Math.max(0, cursor);\n while (end < text.length && isWord(text[end]!)) end++;\n\n const prefix = text.slice(start, cursor);\n return { start, end, prefix };\n}\n\n/**\n * Convert snippet with `|` cursor marker into (insertText, cursorIndexInInsertText).\n */\nfunction renderSnippet(snippet: string): { insertText: string; cursorIndex: number } {\n const idx = snippet.indexOf(\"|\");\n if (idx === -1) return { insertText: snippet, cursorIndex: snippet.length };\n const insertText = snippet.replace(\"|\", \"\");\n return { insertText, cursorIndex: idx };\n}\n\nfunction pushSuggestionSafe(out: Suggestion[], key: string, label?: string, description?: string) {\n const item: Suggestion = { key };\n if (label !== undefined) item.label = label;\n if (description !== undefined) item.description = description;\n out.push(item);\n}\n\nfunction pushCompletionSafe(out: CompletionItem[], item: Omit<CompletionItem, \"description\"> & { description?: string | undefined }) {\n const x: CompletionItem = {\n key: item.key,\n label: item.label,\n replaceFrom: item.replaceFrom,\n replaceTo: item.replaceTo,\n insertText: item.insertText,\n newCursor: item.newCursor\n };\n if (item.description !== undefined) x.description = item.description;\n out.push(x);\n}\n\nexport class ShortcutRegistry {\n private templates = new Map<string, Template>();\n private lookup = new Map<string, Map<string, Shortcut>>();\n private usage = new Map<string, Map<string, number>>(); // templateId -> normalizedKey -> count\n\n constructor(templates: Template[]) {\n for (const t of templates) this.registerTemplate(t);\n }\n\n registerTemplate(t: Template) {\n this.templates.set(t.id, t);\n\n const map = new Map<string, Shortcut>();\n for (const sc of t.shortcuts) {\n map.set(normalizeKey(t, sc.key), sc);\n for (const a of sc.aliases ?? []) map.set(normalizeKey(t, a), sc);\n }\n this.lookup.set(t.id, map);\n\n if (!this.usage.has(t.id)) this.usage.set(t.id, new Map());\n }\n\n listTemplates(): { id: string; name: string }[] {\n return [...this.templates.values()].map(t => ({ id: t.id, name: t.name }));\n }\n\n /**\n * NEW: record which suggestion was selected so ranking becomes \"most-used-first\"\n */\n recordUsage(templateId: string, key: string, delta = 1) {\n const t = this.templates.get(templateId);\n if (!t) return;\n const norm = normalizeKey(t, key);\n const m = this.usage.get(templateId) ?? new Map<string, number>();\n const cur = m.get(norm) ?? 0;\n m.set(norm, cur + delta);\n this.usage.set(templateId, m);\n }\n\n private getUsage(templateId: string, normalizedKey: string): number {\n return this.usage.get(templateId)?.get(normalizedKey) ?? 0;\n }\n\n /**\n * UPDATED: smarter ranking:\n * 1) exact match\n * 2) most-used first (recordUsage)\n * 3) shorter key first\n * 4) alphabetical\n */\n suggest(prefix: string, templateId: string, limit = 10): Suggestion[] {\n const t = this.templates.get(templateId);\n if (!t) return [];\n\n const p = normalizeKey(t, prefix);\n const candidates = t.shortcuts\n .map(sc => ({ sc, k: normalizeKey(t, sc.key) }))\n .filter(x => x.k.startsWith(p));\n\n candidates.sort((a, b) => {\n const aExact = a.k === p ? 0 : 1;\n const bExact = b.k === p ? 0 : 1;\n if (aExact !== bExact) return aExact - bExact;\n\n const au = this.getUsage(templateId, a.k);\n const bu = this.getUsage(templateId, b.k);\n if (au !== bu) return bu - au;\n\n if (a.k.length !== b.k.length) return a.k.length - b.k.length;\n return a.k.localeCompare(b.k);\n });\n\n const out: Suggestion[] = [];\n for (const { sc } of candidates.slice(0, limit)) {\n pushSuggestionSafe(out, sc.key, sc.label, sc.description);\n }\n return out;\n }\n\n build(alias: string, value: string, opts: ExpandOptions): string {\n const t = this.templates.get(opts.templateId);\n const m = this.lookup.get(opts.templateId);\n if (!t || !m) return `${alias}:${value}`;\n\n const key = normalizeKey(t, alias);\n const sc = m.get(key);\n if (!sc) return `${alias}:${value}`;\n\n const v = maybeWrapValue(value, opts.wrapBareValues ?? true);\n\n if (sc.kind === \"field\" && sc.field) return `${sc.field}:${v}`;\n if (sc.kind === \"macro\" && sc.macro) return sc.macro.replaceAll(\"{{value}}\", v);\n\n return `${alias}:${v}`;\n }\n\n expand(query: string, opts: ExpandOptions): string {\n const t = this.templates.get(opts.templateId);\n const m = this.lookup.get(opts.templateId);\n if (!t || !m) return query;\n\n let i = 0;\n let out = \"\";\n\n while (i < query.length) {\n if (!/[A-Za-z0-9_]/.test(query[i]!)) {\n out += query[i]!;\n i++;\n continue;\n }\n\n let j = i;\n while (j < query.length && /[A-Za-z0-9_]/.test(query[j]!)) j++;\n const keyRaw = query.slice(i, j);\n\n let k = j;\n while (k < query.length && /\\s/.test(query[k]!)) k++;\n\n if (query[k] !== \":\") {\n out += query[i]!;\n i++;\n continue;\n }\n\n const keyNorm = normalizeKey(t, keyRaw);\n const sc = m.get(keyNorm);\n\n out += sc ? \"\" : query.slice(i, k + 1);\n k++;\n\n const [valueRaw, nextIdx] = readValue(query, k);\n const valueNorm = maybeWrapValue(valueRaw, opts.wrapBareValues ?? true);\n\n if (!sc) out += valueRaw;\n else if (sc.kind === \"field\" && sc.field) out += `${sc.field}:${valueNorm}`;\n else if (sc.kind === \"macro\" && sc.macro) out += sc.macro.replaceAll(\"{{value}}\", valueNorm);\n else out += `${keyRaw}:${valueNorm}`;\n\n i = nextIdx;\n }\n\n return out;\n }\n\n /**\n * UPDATED: autocomplete with trailingSpace + allowEmptyPrefix\n */\n complete(text: string, cursor: number, opts: CompleteOptions): CompletionItem[] {\n const t = this.templates.get(opts.templateId);\n if (!t) return [];\n\n // if user is typing value after \":\" don't suggest keys\n if (cursor > 0 && text[cursor - 1] === \":\") return [];\n\n const { start, end, prefix } = getTokenRange(text, cursor);\n if (!prefix && !opts.allowEmptyPrefix) return [];\n\n const suggestions = prefix\n ? this.suggest(prefix, opts.templateId, opts.limit ?? 10)\n : this.suggest(\"\", opts.templateId, opts.limit ?? 10); // will be empty unless you want to support full list via allowEmptyPrefix + startsWith(\"\")\n\n // If allowEmptyPrefix: show all shortcuts (ranked by usage, then length, alpha)\n let finalSuggestions = suggestions;\n if (!prefix && opts.allowEmptyPrefix) {\n const all = t.shortcuts.map(sc => ({ sc, k: normalizeKey(t, sc.key) }));\n all.sort((a, b) => {\n const au = this.getUsage(opts.templateId, a.k);\n const bu = this.getUsage(opts.templateId, b.k);\n if (au !== bu) return bu - au;\n if (a.k.length !== b.k.length) return a.k.length - b.k.length;\n return a.k.localeCompare(b.k);\n });\n finalSuggestions = [];\n for (const x of all.slice(0, opts.limit ?? 10)) {\n pushSuggestionSafe(finalSuggestions, x.sc.key, x.sc.label, x.sc.description);\n }\n }\n\n const items: CompletionItem[] = [];\n\n for (const s of finalSuggestions) {\n const sc = t.shortcuts.find(x => normalizeKey(t, x.key) === normalizeKey(t, s.key));\n if (!sc) continue;\n\n // Determine what to use for snippet generation\n // Only use field name if it's different from the key (e.g., TAC -> TAC_ALL)\n // If field equals key (e.g., TAC -> TAC), use key as-is\n const displayName = (sc.kind === \"field\" && sc.field && sc.field !== s.key) \n ? sc.field \n : s.key;\n \n // Generate snippet using display name\n const rawSnippet = sc.snippet \n ? sc.snippet.replace(s.key, displayName)\n : `${displayName}:(|)`;\n \n let { insertText, cursorIndex } = renderSnippet(rawSnippet);\n\n // Label is the same as insertText\n let labelText = insertText;\n\n // NEW: trailing space support\n if (opts.trailingSpace) {\n const atEnd = cursorIndex === insertText.length;\n insertText = insertText + \" \";\n labelText = labelText + \" \";\n if (atEnd) cursorIndex += 1;\n }\n\n const replaceFrom = start;\n const replaceTo = end;\n const newCursor = replaceFrom + cursorIndex;\n\n pushCompletionSafe(items, {\n key: s.key,\n label: labelText,\n description: sc.description,\n replaceFrom,\n replaceTo,\n insertText,\n newCursor\n });\n }\n\n return items;\n }\n\n /**\n * NEW: one-call UI helper\n */\n getCompletions(text: string, cursor: number, opts: CompleteOptions): CompletionsResult {\n const token = getTokenRange(text, cursor);\n const items = this.complete(text, cursor, opts);\n return { token, items };\n }\n\n applyCompletion(text: string, item: CompletionItem): { text: string; cursor: number } {\n const next =\n text.slice(0, item.replaceFrom) +\n item.insertText +\n text.slice(item.replaceTo);\n\n return { text: next, cursor: item.newCursor };\n }\n}\n\n// exports\nexport function createRegistry(templates: Template[]) {\n return new ShortcutRegistry(templates);\n}\n\nexport { patsnapTemplate } from \"./templates/patsnap.js\";\nexport { nuvoaiTemplate } from \"./templates/nuvoai.js\";\n\n// JSON loader exports\nexport { loadTemplateFromJson, loadTemplatesFromJson } from \"./engine/json.js\";\nexport type { TemplateJson, ShortcutJson } from \"./engine/json.js\";\n","// src/templates/patsnap.ts\nimport type { Template } from \"../index.js\";\n\nexport const patsnapTemplate: Template = {\n id: \"patsnap\",\n name: \"Patsnap\",\n normalizeKey: \"upper\",\n shortcuts: [\n // --- Text fields (from your 1st screenshot) ---\n { key: \"TA\", kind: \"field\", field: \"TA_ALL\", label: \"Title + Abstract\", description: \"Search in title and abstract\", aliases: [\"TA_ALL\"] },\n { key: \"TTL\", kind: \"field\", field: \"TTL_ALL\", label: \"Title\", description: \"Search in title\", aliases: [\"TTL_ALL\"] },\n { key: \"TAC\", kind: \"field\", field: \"TAC_ALL\", label: \"Title+Abstract+Claims\", description: \"Search in title, abstract, and claims\", aliases: [\"TAC_ALL\"] },\n { key: \"TACD\", kind: \"field\", field: \"TACD_ALL\", label: \"Title+Abstract+Claims+Description\", description: \"Search in title/abstract/claims/description\", aliases: [\"TACD_ALL\"] },\n { key: \"ABST\", kind: \"field\", field: \"ABST_ALL\", label: \"Abstract\", description: \"Search in abstract\", aliases: [\"ABST_ALL\"] },\n { key: \"CLMS\", kind: \"field\", field: \"CLMS_ALL\", label: \"Claims\", description: \"Search in claims\", aliases: [\"CLMS_ALL\"] },\n { key: \"DESC\", kind: \"field\", field: \"DESC_ALL\", label: \"Description\", description: \"Search in description\", aliases: [\"DESC_ALL\"] },\n\n { key: \"DESC_F\", kind: \"field\", field: \"DESC_F\", label: \"Technical Field\", description: \"Description: technical field\" },\n { key: \"DESC_B\", kind: \"field\", field: \"DESC_B\", label: \"Background Art\", description: \"Description: background art\" },\n { key: \"DESC_S\", kind: \"field\", field: \"DESC_S\", label: \"Summary of Invention\", description: \"Description: summary\" },\n { key: \"DESC_D\", kind: \"field\", field: \"DESC_D\", label: \"Brief Description of Drawings\", description: \"Description: drawings\" },\n { key: \"DESC_E\", kind: \"field\", field: \"DESC_E\", label: \"Description of Embodiments\", description: \"Description: embodiments\" },\n\n { key: \"ICLMS\", kind: \"field\", field: \"ICLMS_ALL\", label: \"Independent Claims\", description: \"Search in independent claims\", aliases: [\"ICLMS_ALL\"] },\n { key: \"PROBLEM_SUM\", kind: \"field\", field: \"PROBLEM_SUM\", label: \"Technical Problem\", description: \"Problem summary\" },\n { key: \"METHOD_SUM\", kind: \"field\", field: \"METHOD_SUM\", label: \"Technical Method\", description: \"Method summary\" },\n { key: \"BENEFIT_SUM\", kind: \"field\", field: \"BENEFIT_SUM\", label: \"Technical Benefit\", description: \"Benefit summary\" },\n\n // --- Classification (2nd screenshot) ---\n {\n key: \"CLASS\",\n kind: \"field\",\n field: \"CLASS\",\n label: \"Patent Classification\",\n description: \"Search across multiple classification systems (IPC, CPC, LOC, FI, F-term, UPC)\",\n },\n {\n key: \"IPC\",\n kind: \"field\",\n field: \"IPC\",\n label: \"IPC\",\n description: \"Search in IPC classification codes\",\n },\n {\n key: \"MCPC\",\n kind: \"field\",\n field: \"MCPC\",\n label: \"Main CPC\",\n description: \"Search in main/primary CPC codes\",\n },\n {\n key: \"CPC_SUB_GROUP\",\n kind: \"field\",\n field: \"CPC_SUB_GROUP\",\n label: \"CPC Sub Group\",\n description: \"Search in CPC subgroup codes\",\n },\n {\n key: \"IPC_CPC\",\n kind: \"field\",\n field: \"IPC_CPC\",\n label: \"IPC & CPC\",\n description: \"Search in both IPC and CPC codes\",\n },\n {\n key: \"UPC\",\n kind: \"field\",\n field: \"UPC\",\n label: \"UPC\",\n description: \"Search in U.S. patent classification codes (USPC/UPC)\",\n },\n {\n key: \"LOC\",\n kind: \"field\",\n field: \"LOC\",\n label: \"LOC\",\n description: \"Search in Locarno Classification codes (design patents)\",\n },\n {\n key: \"FI\",\n kind: \"field\",\n field: \"FI\",\n label: \"FI\",\n description: \"Search in Japanese FI classification codes\",\n },\n {\n key: \"FTERM\",\n kind: \"field\",\n field: \"FTERM\",\n label: \"F-TERM\",\n description: \"Search in Japanese F-term indexing codes\",\n },\n {\n key: \"ADC\",\n kind: \"field\",\n field: \"ADC\",\n label: \"Application Domain\",\n description: \"Search in Application Domain categories\",\n },\n {\n key: \"TTC\",\n kind: \"field\",\n field: \"TTC\",\n label: \"Technology Topic\",\n description: \"Search in Technology Topic categories\",\n },\n {\n key: \"SEIC\",\n kind: \"field\",\n field: \"SEIC\",\n label: \"Main SEIC\",\n description: \"Search in main SEIC codes (China)\",\n },\n {\n key: \"SEIC_ALL\",\n kind: \"field\",\n field: \"SEIC_ALL\",\n label: \"SEIC (All)\",\n description: \"Search in all SEIC codes (primary and secondary)\",\n },\n {\n key: \"GBC\",\n kind: \"field\",\n field: \"GBC\",\n label: \"GBC\",\n description: \"Search in GBC codes (China - industry clusters)\",\n }, \n\n // --- Assignees / Inventors (3rd screenshot) ---\n {\n key: \"ALL_AN\",\n kind: \"field\",\n field: \"ALL_AN\",\n label: \"All Assignees\",\n description: \"Search in all assignee names (original and current)\",\n },\n {\n key: \"ANCS\",\n kind: \"field\",\n field: \"ANCS\",\n label: \"Std. Current Assignee\",\n description: \"Search in standardized current assignee name\",\n },\n {\n key: \"ANC\",\n kind: \"field\",\n field: \"ANC\",\n label: \"Current Assignee\",\n description: \"Search in current assignee/owner name\",\n },\n {\n key: \"GNAME\",\n kind: \"field\",\n field: \"GNAME\",\n label: \"Grouped Assignee\",\n description: \"Search in grouped assignee/corporate family name\",\n },\n {\n key: \"ANS\",\n kind: \"field\",\n field: \"ANS\",\n label: \"Std. Original Assignee\",\n description: \"Search in standardized original assignee name\",\n },\n {\n key: \"AN\",\n kind: \"field\",\n field: \"AN\",\n label: \"Original Assignee\",\n description: \"Search in original assignee at filing/publication\",\n },\n {\n key: \"F_AN\",\n kind: \"field\",\n field: \"F_AN\",\n label: \"First Original Assignee\",\n description: \"Search in first original assignee\",\n },\n {\n key: \"F_ANC\",\n kind: \"field\",\n field: \"F_ANC\",\n label: \"First Current Assignee\",\n description: \"Search in first current assignee\",\n },\n {\n key: \"IN\",\n kind: \"field\",\n field: \"IN\",\n label: \"Inventor Name\",\n description: \"Search in inventor names\",\n },\n {\n key: \"F_IN\",\n kind: \"field\",\n field: \"F_IN\",\n label: \"First Inventor\",\n description: \"Search in first inventor\",\n },\n {\n key: \"ATC\",\n kind: \"field\",\n field: \"ATC\",\n label: \"Agency\",\n description: \"Search in prosecution agency/law firm name\",\n },\n {\n key: \"ATCS\",\n kind: \"field\",\n field: \"ATCS\",\n label: \"Std. Agency\",\n description: \"Search in standardized agency name\",\n },\n {\n key: \"AT\",\n kind: \"field\",\n field: \"AT\",\n label: \"Attorney Name\",\n description: \"Search in attorney/agent name\",\n },\n {\n key: \"PE\",\n kind: \"field\",\n field: \"PE\",\n label: \"Primary Examiner\",\n description: \"Search in primary examiner name\",\n },\n {\n key: \"AE\",\n kind: \"field\",\n field: \"AE\",\n label: \"Assistant Examiner\",\n description: \"Search in assistant examiner name\",\n },\n \n\n // --- Dates (4th screenshot) ---\n {\n key: \"APD\",\n kind: \"field\",\n field: \"APD\",\n label: \"Application Date\",\n snippet: \"APD:[| TO ]\",\n description: \"Filter by application filing date (supports ranges)\",\n },\n {\n key: \"PBD\",\n kind: \"field\",\n field: \"PBD\",\n label: \"Publication Date\",\n snippet: \"PBD:[| TO ]\",\n description: \"Filter by publication date (supports ranges)\",\n },\n {\n key: \"PRIORITY_DATE\",\n kind: \"field\",\n field: \"PRIORITY_DATE\",\n label: \"Priority Date\",\n snippet: \"PRIORITY_DATE:[| TO ]\",\n description: \"Filter by priority date (supports ranges)\",\n },\n {\n key: \"EXDT\",\n kind: \"field\",\n field: \"EXDT\",\n label: \"Estimated Expiry Date\",\n snippet: \"EXDT:[| TO ]\",\n description: \"Filter by estimated expiry date (supports ranges)\",\n },\n {\n key: \"ISD\",\n kind: \"field\",\n field: \"ISD\",\n label: \"Issue Date\",\n snippet: \"ISD:[| TO ]\",\n description: \"Filter by grant/issue date (supports ranges)\",\n },\n {\n key: \"EXPD\",\n kind: \"field\",\n field: \"EXPD\",\n label: \"Expiry Date\",\n snippet: \"EXPD:[| TO ]\",\n description: \"Filter by recorded expiry date (supports ranges)\",\n },\n {\n key: \"EXAMINE_DATE\",\n kind: \"field\",\n field: \"EXAMINE_DATE\",\n label: \"Substantive Examination Date\",\n snippet: \"EXAMINE_DATE:[| TO ]\",\n description: \"Filter by examination date (supports ranges)\",\n },\n {\n key: \"PCTENTRY_DATE\",\n kind: \"field\",\n field: \"PCTENTRY_DATE\",\n label: \"PCT Entry Date\",\n snippet: \"PCTENTRY_DATE:[| TO ]\",\n description: \"Filter by PCT entry date (supports ranges)\",\n },\n {\n key: \"LEGAL_STATUS_DATE\",\n kind: \"field\",\n field: \"LEGAL_STATUS_DATE\",\n label: \"Legal Status Date\",\n snippet: \"LEGAL_STATUS_DATE:[| TO ]\",\n description: \"Filter by legal status event date (supports ranges)\",\n },\n \n // --- Numbers (5th screenshot) ---\n {\n key: \"PN\",\n kind: \"field\",\n field: \"PN\",\n label: \"Publication Number\",\n description: \"Search by publication number (e.g., US20240012345A1)\",\n },\n {\n key: \"APNO\",\n kind: \"field\",\n field: \"APNO\",\n label: \"Application Number\",\n description: \"Search by application number\",\n },\n {\n key: \"PRNO\",\n kind: \"field\",\n field: \"PRNO\",\n label: \"Priority Number\",\n description: \"Search by priority application number\",\n },\n {\n key: \"KD\",\n kind: \"field\",\n field: \"KD\",\n label: \"Kind Code\",\n description: \"Search by kind code (e.g., A1, A2, B1, B2)\",\n },\n {\n key: \"PCT_APNO\",\n kind: \"field\",\n field: \"PCT_APNO\",\n label: \"PCT Application Number\",\n description: \"Search by PCT application number\",\n },\n {\n key: \"PCT_PN\",\n kind: \"field\",\n field: \"PCT_PN\",\n label: \"PCT Publication Number\",\n description: \"Search by PCT publication number (e.g., WO2024012345A1)\",\n },\n \n\n // --- Addresses / Regions (6th screenshot) ---\n {\n key: \"AN_ADD\",\n kind: \"field\",\n field: \"AN_ADD\",\n label: \"Original Assignee Address\",\n description: \"Search in original assignee address\",\n },\n {\n key: \"ANC_ADD\",\n kind: \"field\",\n field: \"ANC_ADD\",\n label: \"Current Assignee Address\",\n description: \"Search in current assignee address\",\n },\n {\n key: \"IN_ADDRESS\",\n kind: \"field\",\n field: \"IN_ADDRESS\",\n label: \"Inventor Address\",\n description: \"Search in inventor address\",\n },\n {\n key: \"PRIORITY_COUNTRY\",\n kind: \"field\",\n field: \"PRIORITY_COUNTRY\",\n label: \"Priority Country/Region\",\n description: \"Filter by priority country/region\",\n },\n {\n key: \"AUTHORITY\",\n kind: \"field\",\n field: \"AUTHORITY\",\n label: \"Authority\",\n description: \"Search by authority/jurisdiction code (e.g., US, EP, WO, CN, JP)\",\n },\n {\n key: \"EPDS\",\n kind: \"field\",\n field: \"EPDS\",\n label: \"EP Designated State\",\n description: \"Search by EP designated states\",\n },\n {\n key: \"ENTRY_COUNTRY\",\n kind: \"field\",\n field: \"ENTRY_COUNTRY\",\n label: \"Entry Country/Region\",\n description: \"Search by PCT entry country/region\",\n },\n \n\n // --- Citations / Family (7th screenshot) ---\n {\n key: \"B_CITES\",\n kind: \"field\",\n field: \"B_CITES\",\n label: \"Backward Citations\",\n description: \"Search patents cited by this patent\",\n },\n {\n key: \"F_CITES\",\n kind: \"field\",\n field: \"F_CITES\",\n label: \"Forward Citations\",\n description: \"Search patents that cite this patent\",\n },\n {\n key: \"BF_CITES\",\n kind: \"field\",\n field: \"BF_CITES\",\n label: \"Backward Or Forward Citations\",\n description: \"Search in backward or forward citations\",\n },\n {\n key: \"B_CITES_COUNT\",\n kind: \"field\",\n field: \"B_CITES_COUNT\",\n label: \"Count Of Backward Citations\",\n snippet: \"B_CITES_COUNT:[| TO *]\",\n description: \"Filter by backward citation count (supports ranges)\",\n },\n {\n key: \"F_CITES_COUNT\",\n kind: \"field\",\n field: \"F_CITES_COUNT\",\n label: \"Count Of Forward Citations\",\n snippet: \"F_CITES_COUNT:[| TO *]\",\n description: \"Filter by forward citation count (supports ranges)\",\n },\n {\n key: \"F_CITES_ANC\",\n kind: \"field\",\n field: \"F_CITES_ANC\",\n label: \"Assignee Forward Citations (Current)\",\n description: \"Search forward citations by current assignee\",\n },\n {\n key: \"B_CITES_ANC\",\n kind: \"field\",\n field: \"B_CITES_ANC\",\n label: \"Assignee Backward Citations (Current)\",\n description: \"Search backward citations by current assignee\",\n },\n {\n key: \"CITE_CATEGORY\",\n kind: \"field\",\n field: \"CITE_CATEGORY\",\n label: \"Citation/Rejection Category\",\n description: \"Filter by citation category (examiner-cited, applicant-cited)\",\n },\n {\n key: \"FAM\",\n kind: \"field\",\n field: \"FAM\",\n label: \"Simple Family\",\n description: \"Search by simple patent family ID\",\n },\n {\n key: \"EFAM\",\n kind: \"field\",\n field: \"EFAM\",\n label: \"PatSnap Family\",\n description: \"Search by PatSnap extended family ID\",\n },\n {\n key: \"FAM_COUNT\",\n kind: \"field\",\n field: \"FAM_COUNT\",\n label: \"Simple Family Application Count\",\n snippet: \"FAM_COUNT:[| TO *]\",\n description: \"Filter by simple family count (supports ranges)\",\n },\n {\n key: \"IFAM_COUNT\",\n kind: \"field\",\n field: \"IFAM_COUNT\",\n label: \"INPADOC Family Application Count\",\n snippet: \"IFAM_COUNT:[| TO *]\",\n description: \"Filter by INPADOC family count (supports ranges)\",\n },\n {\n key: \"EFAM_COUNT\",\n kind: \"field\",\n field: \"EFAM_COUNT\",\n label: \"PatSnap Family Application Count\",\n snippet: \"EFAM_COUNT:[| TO *]\",\n description: \"Filter by PatSnap family count (supports ranges)\",\n },\n {\n key: \"FAM_COUNTRY_COUNT\",\n kind: \"field\",\n field: \"FAM_COUNTRY_COUNT\",\n label: \"Simple Family Jurisdiction Count\",\n snippet: \"FAM_COUNTRY_COUNT:[| TO *]\",\n description: \"Filter by simple family jurisdiction count (supports ranges)\",\n },\n {\n key: \"IFAM_COUNTRY_COUNT\",\n kind: \"field\",\n field: \"IFAM_COUNTRY_COUNT\",\n label: \"INPADOC Family Jurisdiction Count\",\n snippet: \"IFAM_COUNTRY_COUNT:[| TO *]\",\n description: \"Filter by INPADOC family jurisdiction count (supports ranges)\",\n },\n {\n key: \"EFAM_COUNTRY_COUNT\",\n kind: \"field\",\n field: \"EFAM_COUNTRY_COUNT\",\n label: \"PatSnap Family Jurisdiction Count\",\n snippet: \"EFAM_COUNTRY_COUNT:[| TO *]\",\n description: \"Filter by PatSnap family jurisdiction count (supports ranges)\",\n },\n \n\n // --- Legal status / metrics (8th screenshot) ---\n {\n key: \"LEGAL_STATUS\",\n kind: \"field\",\n field: \"LEGAL_STATUS\",\n label: \"Legal Status\",\n description: \"Search by legal status (active, expired, lapsed, withdrawn, revoked)\",\n },\n {\n key: \"LEGAL_EVENT\",\n kind: \"field\",\n field: \"LEGAL_EVENT\",\n label: \"Legal Event\",\n description: \"Search by legal event codes (fee payment, lapse, reinstatement, opposition)\",\n },\n {\n key: \"SIMPLE_LEGAL_STATUS\",\n kind: \"field\",\n field: \"SIMPLE_LEGAL_STATUS\",\n label: \"Simple Legal Status\",\n description: \"Search by simple legal status (Active, Pending, Expired, Lapsed, Abandoned)\",\n },\n {\n key: \"UP_STATUS\",\n kind: \"field\",\n field: \"UP_STATUS\",\n label: \"Status of Unified Patent Court\",\n description: \"Search by Unified Patent Court status (EP/Unitary patents)\",\n },\n {\n key: \"ENTRY_COUNTRY_LS\",\n kind: \"field\",\n field: \"ENTRY_COUNTRY_LS\",\n label: \"Legal Status of Entry Country/Region\",\n description: \"Search legal status for PCT entry countries\",\n },\n {\n key: \"ENTRY_COUNTRY_SLS\",\n kind: \"field\",\n field: \"ENTRY_COUNTRY_SLS\",\n label: \"Simple Legal Status of Entry Country/Region\",\n description: \"Search simple legal status for PCT entry countries\",\n },\n {\n key: \"PV\",\n kind: \"field\",\n field: \"PV\",\n label: \"Patent Value\",\n snippet: \"PV:[| TO *]\",\n description: \"Filter by patent value score (supports ranges)\",\n },\n {\n key: \"PAGE_COUNT\",\n kind: \"field\",\n field: \"PAGE_COUNT\",\n label: \"Page Count\",\n snippet: \"PAGE_COUNT:[| TO *]\",\n description: \"Filter by page count (supports ranges)\",\n },\n {\n key: \"CLAIM_COUNT\",\n kind: \"field\",\n field: \"CLAIM_COUNT\",\n label: \"Claim Count\",\n snippet: \"CLAIM_COUNT:[| TO *]\",\n description: \"Filter by claim count (supports ranges)\",\n },\n {\n key: \"FCLMS_WORDCOUNT\",\n kind: \"field\",\n field: \"FCLMS_WORDCOUNT\",\n label: \"Word count of first claim\",\n snippet: \"FCLMS_WORDCOUNT:[| TO *]\",\n description: \"Filter by first claim word count (supports ranges)\",\n },\n {\n key: \"AN_COUNT\",\n kind: \"field\",\n field: \"AN_COUNT\",\n label: \"Count of Original Assignees\",\n snippet: \"AN_COUNT:[| TO *]\",\n description: \"Filter by original assignee count (supports ranges)\",\n },\n {\n key: \"ANC_COUNT\",\n kind: \"field\",\n field: \"ANC_COUNT\",\n label: \"Count of Current Assignees\",\n snippet: \"ANC_COUNT:[| TO *]\",\n description: \"Filter by current assignee count (supports ranges)\",\n },\n {\n key: \"IN_COUNT\",\n kind: \"field\",\n field: \"IN_COUNT\",\n label: \"Count of Inventors\",\n snippet: \"IN_COUNT:[| TO *]\",\n description: \"Filter by inventor count (supports ranges)\",\n },\n {\n key: \"GOV\",\n kind: \"field\",\n field: \"GOV\",\n label: \"Government Interest\",\n description: \"Search by government interest indicators\",\n },\n ]\n};\n","// src/templates/nuvoai.ts\nimport type { Template } from \"../index.js\";\n\nexport const nuvoaiTemplate: Template = {\n id: \"nuvoai\",\n name: \"NuvoAI\",\n normalizeKey: \"upper\",\n shortcuts: [\n // Patent keyword (all-fields search)\n {\n key: \"TTL\",\n kind: \"field\",\n field: \"TTL\",\n label: \"Invention Title\",\n description: \"Search in invention title (all languages)\",\n aliases: [\"TITLE\"],\n },\n {\n key: \"TA\",\n kind: \"field\",\n field: \"TA\",\n label: \"Invention Title, Abstract\",\n description: \"Search in title and abstract (all languages)\",\n },\n {\n key: \"TAC\",\n kind: \"field\",\n field: \"TAC\",\n label: \"Invention Title, Abstract, Claims\",\n description: \"Search in title, abstract, and claims (all languages)\",\n },\n {\n key: \"TACD\",\n kind: \"field\",\n field: \"TACD\",\n label: \"Invention Title, Abstract, Claims, Description\",\n description: \"Search in title, abstract, claims, and description (all languages)\",\n },\n \n {\n key: \"COUNTRY\",\n kind: \"field\",\n field: \"COUNTRY\",\n label: \"Country\",\n description: \"Filter by country/region code (e.g., US, EP, WO, CN, JP)\",\n },\n {\n key: \"KIND\",\n kind: \"field\",\n field: \"KIND\",\n label: \"Patent Kind\",\n description: \"Filter by kind code (e.g., A1, A2, B1, B2)\",\n },\n {\n key: \"TYPE\",\n kind: \"field\",\n field: \"TYPE\",\n label: \"Patent Type\",\n description: \"Filter by document type (application, grant, utility, design)\",\n },\n \n {\n key: \"ABST\",\n kind: \"field\",\n field: \"ABST\",\n label: \"Abstract\",\n description: \"Search in abstract (all languages)\",\n },\n {\n key: \"CLM\",\n kind: \"field\",\n field: \"CLM\",\n label: \"Claims\",\n description: \"Search in claims (all languages)\",\n },\n {\n key: \"DESC\",\n kind: \"field\",\n field: \"DESC\",\n label: \"Description\",\n description: \"Search in description (all languages)\",\n },\n \n {\n key: \"PUB_DT\",\n kind: \"field\",\n field: \"PUB_DT\",\n label: \"Publication Date\",\n snippet: \"PUB_DT:[| TO ]\",\n description: \"Filter by publication date (supports ranges)\",\n },\n {\n key: \"APP_DT\",\n kind: \"field\",\n field: \"APP_DT\",\n label: \"Application Date\",\n snippet: \"APP_DT:[| TO ]\",\n description: \"Filter by application filing date (supports ranges)\",\n },\n {\n key: \"EXP_DT\",\n kind: \"field\",\n field: \"EXP_DT\",\n label: \"Expiration Date\",\n snippet: \"EXP_DT:[| TO ]\",\n description: \"Filter by expiration date (supports ranges)\",\n },\n \n {\n key: \"APP_NUM\",\n kind: \"field\",\n field: \"APP_NUM\",\n label: \"Application Number\",\n description: \"Search by application number\",\n },\n {\n key: \"PUB_NUM\",\n kind: \"field\",\n field: \"PUB_NUM\",\n label: \"Publication Number\",\n description: \"Search by publication number\",\n },\n \n {\n key: \"CURR_ASGN\",\n kind: \"field\",\n field: \"CURR_ASGN\",\n label: \"Current Assignee\",\n description: \"Search by current assignee/owner name\",\n },\n {\n key: \"INV\",\n kind: \"field\",\n field: \"INV\",\n label: \"Inventors\",\n description: \"Search in inventor names\",\n },\n \n {\n key: \"LEGAL_STATUS\",\n kind: \"field\",\n field: \"LEGAL_STATUS\",\n label: \"Legal Status\",\n description: \"Search by legal status (active, pending, expired, lapsed, revoked)\",\n },\n {\n key: \"LEGAL_EVNTS\",\n kind: \"field\",\n field: \"LEGAL_EVNTS\",\n label: \"Legal Events\",\n description: \"Search in legal events (fee payments, lapse, reinstatement, opposition)\",\n },\n \n {\n key: \"IPC\",\n kind: \"field\",\n field: \"IPC\",\n label: \"IPC Classification (Main Group)\",\n description: \"Search in IPC classification codes\",\n },\n {\n key: \"CPC\",\n kind: \"field\",\n field: \"CPC\",\n label: \"CPC Classification (Main Group)\",\n description: \"Search in CPC classification codes\",\n },\n \n {\n key: \"FAMILY_ID\",\n kind: \"field\",\n field: \"FAMILY_ID\",\n label: \"Family ID\",\n description: \"Search by patent family ID\",\n },\n \n ]\n};\n","// src/engine/json.ts\nimport type { Template, Shortcut, ShortcutKind } from \"../index.js\";\n\nexport type ShortcutJson = {\n key: string;\n kind: ShortcutKind;\n field?: string;\n macro?: string;\n label?: string;\n description?: string;\n aliases?: string[];\n snippet?: string;\n};\n\nexport type TemplateJson = {\n id: string;\n name: string;\n normalizeKey?: \"upper\" | \"none\";\n shortcuts: ShortcutJson[];\n};\n\nfunction isObj(x: unknown): x is Record<string, unknown> {\n return typeof x === \"object\" && x !== null && !Array.isArray(x);\n}\n\nfunction asString(x: unknown, path: string): string {\n if (typeof x !== \"string\" || x.trim() === \"\") throw new Error(`Invalid string at ${path}`);\n return x;\n}\n\nfunction asOptString(x: unknown): string | undefined {\n return typeof x === \"string\" ? x : undefined;\n}\n\nfunction asOptStringArray(x: unknown): string[] | undefined {\n if (x === undefined) return undefined;\n if (!Array.isArray(x)) return undefined;\n const out: string[] = [];\n for (const v of x) if (typeof v === \"string\" && v.trim() !== \"\") out.push(v);\n return out.length ? out : undefined;\n}\n\nfunction asNormalizeKey(x: unknown): \"upper\" | \"none\" | undefined {\n if (x === undefined) return undefined;\n if (x === \"upper\" || x === \"none\") return x;\n throw new Error(`normalizeKey must be \"upper\" | \"none\"`);\n}\n\nfunction asKind(x: unknown): ShortcutKind {\n if (x === \"field\" || x === \"macro\") return x;\n throw new Error(`Invalid shortcut kind: ${String(x)}`);\n}\n\nfunction normalizeShortcut(s: ShortcutJson): Shortcut {\n const key = asString(s.key, \"shortcuts[].key\");\n const kind = asKind(s.kind);\n\n if (kind === \"field\") {\n const field = asOptString(s.field) ?? key; // default to key\n const out: Shortcut = { key, kind, field };\n \n const label = asOptString(s.label);\n if (label !== undefined) out.label = label;\n \n const description = asOptString(s.description);\n if (description !== undefined) out.description = description;\n \n const aliases = asOptStringArray(s.aliases);\n if (aliases) out.aliases = aliases;\n \n const snippet = asOptString(s.snippet);\n if (snippet !== undefined) out.snippet = snippet;\n \n return out;\n }\n \n\n // macro\n const macro = asString(s.macro, \"shortcuts[].macro (required for kind=macro)\");\n const out: Shortcut = { key, kind, macro };\n\n const label = asOptString(s.label);\n if (label !== undefined) out.label = label;\n\n const description = asOptString(s.description);\n if (description !== undefined) out.description = description;\n\n const aliases = asOptStringArray(s.aliases);\n if (aliases) out.aliases = aliases;\n\n const snippet = asOptString(s.snippet);\n if (snippet !== undefined) out.snippet = snippet;\n\n return out;\n\n}\n\nexport function loadTemplateFromJson(input: unknown): Template {\n const obj = typeof input === \"string\" ? JSON.parse(input) : input;\n if (!isObj(obj)) throw new Error(\"Template JSON must be an object\");\n\n const id = asString(obj.id, \"id\");\n const name = asString(obj.name, \"name\");\n const normalizeKey = asNormalizeKey(obj.normalizeKey);\n\n const shortcutsRaw = obj.shortcuts;\n if (!Array.isArray(shortcutsRaw)) throw new Error(\"shortcuts must be an array\");\n\n const shortcuts: Shortcut[] = shortcutsRaw.map((s, idx) => {\n if (!isObj(s)) throw new Error(`shortcuts[${idx}] must be an object`);\n return normalizeShortcut(s as ShortcutJson);\n });\n\n const t: Template = { id, name, shortcuts };\n if (normalizeKey !== undefined) t.normalizeKey = normalizeKey;\n return t;\n}\n\nexport function loadTemplatesFromJson(input: unknown): Template[] {\n const obj = typeof input === \"string\" ? JSON.parse(input) : input;\n if (!Array.isArray(obj)) throw new Error(\"Templates JSON must be an array\");\n return obj.map(loadTemplateFromJson);\n}\n"],"mappings":"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","names":["out","label","description","aliases","snippet","normalizeKey","j"]}