@stll/anonymize-wasm 0.1.4 → 0.1.5

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.
package/dist/wasm.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"wasm.mjs","names":["segmenter","escapeRegex","WHITESPACE_RE","sigmoid"],"sources":["../../src/search-engine.ts","../../src/types.ts","../../src/context.ts","../../src/util/lang-loader.ts","../../src/detectors/coreference.ts","../../src/detectors/gazetteer.ts","../../src/util/text.ts","../../src/detectors/names.ts","../../src/config/titles.ts","../../src/util/char-groups.ts","../../src/detectors/regex.ts","../../src/detectors/legal-forms.ts","../../src/config/legal-forms.ts","../../src/detectors/triggers.ts","../../src/regions.ts","../../src/filters/false-positives.ts","../../src/util/normalize.ts","../../src/detectors/deny-list.ts","../../src/detectors/address-seeds.ts","../../src/detectors/org-propagation.ts","../../src/filters/confidence-boost.ts","../../src/filters/zone-classifier.ts","../../src/filters/hotword-rules.ts","../../src/filters/boundary-consistency.ts","../../src/build-unified-search.ts","../../src/unified-search.ts","../../src/util/entity-masking.ts","../../src/pipeline.ts","../../src/operators.ts","../../src/redact.ts","../../src/gliner/decoder.ts","../../src/gliner/token-decoder.ts","../../src/gliner/processor.ts","../../src/util/chunker.ts","../../src/util/levenshtein.ts","../../src/wasm.ts"],"sourcesContent":["/**\n * Late-bound TextSearch constructor.\n *\n * Native entry injects @stll/text-search,\n * WASM entry injects @stll/text-search-wasm.\n * Both expose the same API.\n */\n\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\ntype TextSearchCtor = new (...args: any[]) => any;\n\nlet _TextSearch: TextSearchCtor | undefined;\n\nexport const initTextSearch = (ctor: TextSearchCtor): void => {\n _TextSearch = ctor;\n};\n\nexport const getTextSearch = (): TextSearchCtor => {\n if (!_TextSearch) {\n throw new Error(\n \"TextSearch not initialized. Import from \" +\n \"@stll/anonymize or @stll/anonymize-wasm, \" +\n \"not from internal modules.\",\n );\n }\n return _TextSearch;\n};\n","/**\n * Source of a detected entity span.\n * Ordered by detection layer in the pipeline.\n */\nexport const DETECTION_SOURCES = {\n TRIGGER: \"trigger\",\n REGEX: \"regex\",\n DENY_LIST: \"deny-list\",\n LEGAL_FORM: \"legal-form\",\n GAZETTEER: \"gazetteer\",\n NER: \"ner\",\n COREFERENCE: \"coreference\",\n} as const;\n\nexport type DetectionSource =\n (typeof DETECTION_SOURCES)[keyof typeof DETECTION_SOURCES];\n\n/**\n * Priority levels for detection sources.\n * Higher = more structurally reliable. Used during\n * overlap resolution so deterministic detectors beat\n * probabilistic ones regardless of raw score.\n */\nexport const DETECTOR_PRIORITY: Record<\n DetectionSource,\n number\n> = {\n gazetteer: 5,\n trigger: 4,\n \"legal-form\": 3,\n regex: 3,\n \"deny-list\": 2,\n coreference: 2,\n ner: 1,\n};\n\n/**\n * A detected PII entity span in the source text.\n * Every detection layer produces these.\n */\nexport type Entity = {\n start: number;\n end: number;\n label: string;\n text: string;\n score: number;\n source: DetectionSource;\n};\n\n/**\n * Entity after human review. Extends the base Entity\n * with a review decision.\n */\nexport type ReviewDecision = \"confirmed\" | \"rejected\" | \"relabeled\";\n\nexport type ReviewedEntity = Entity & {\n decision?: ReviewDecision;\n originalLabel?: string;\n};\n\n/**\n * A single entry in the workspace-scoped gazetteer\n * (deny list). Persisted in IndexedDB.\n */\nexport type GazetteerEntry = {\n id: string;\n canonical: string;\n label: string;\n variants: string[];\n workspaceId: string;\n createdAt: number;\n source: \"manual\" | \"confirmed-from-model\";\n};\n\n/** Extraction strategy — closed discriminated union. */\nexport type TriggerStrategy =\n | { type: \"to-next-comma\" }\n | { type: \"to-end-of-line\" }\n | { type: \"n-words\"; count: number }\n | { type: \"company-id-value\" }\n | { type: \"address\"; maxChars?: number };\n\n/** Validation rules — closed discriminated union. */\nexport type TriggerValidation =\n | { type: \"starts-uppercase\" }\n | { type: \"min-length\"; min: number }\n | { type: \"max-length\"; max: number }\n | { type: \"no-digits\" }\n | { type: \"has-digits\" }\n | {\n type: \"matches-pattern\";\n pattern: string;\n flags?: string;\n };\n\n/** Auto-generated trigger variants — closed set. */\nexport type TriggerExtension =\n | \"add-colon\"\n | \"add-trailing-space\"\n | \"add-colon-space\"\n | \"normalize-spaces\";\n\n/** V2 trigger config entry (JSON shape). */\nexport type TriggerGroupConfig = {\n id?: string;\n triggers: string[];\n label: string;\n strategy: TriggerStrategy;\n extensions?: TriggerExtension[];\n validations?: TriggerValidation[];\n /** When true, include the trigger text in the\n * entity span (e.g., court names). */\n includeTrigger?: boolean;\n};\n\n/** Compiled validation with pre-built regex. */\nexport type CompiledValidation =\n | { type: \"starts-uppercase\"; re: RegExp }\n | { type: \"min-length\"; min: number }\n | { type: \"max-length\"; max: number }\n | { type: \"no-digits\"; re: RegExp }\n | { type: \"has-digits\"; re: RegExp }\n | { type: \"matches-pattern\"; re: RegExp };\n\n/**\n * Runtime rule — one per trigger string after\n * expansion. Fed to the Aho-Corasick automaton.\n */\nexport type TriggerRule = {\n trigger: string;\n label: string;\n strategy: TriggerStrategy;\n validations: CompiledValidation[];\n includeTrigger: boolean;\n};\n\n/**\n * Anonymisation operator types. Each operator defines\n * how a confirmed entity is replaced in the output.\n */\nexport const OPERATOR_TYPES = [\"replace\", \"redact\"] as const;\n\nexport type OperatorType = (typeof OPERATOR_TYPES)[number];\n\n/** Per-label operator selection. Key is the entity label. */\nexport type OperatorConfig = {\n /** Operator per label. Missing labels default to \"replace\". */\n operators: Record<string, OperatorType>;\n /** Custom replacement string for the redact operator. */\n redactString: string;\n};\n\n/** Whether an operator produces a reversible redaction entry. */\ntype OperatorReversibility = \"reversible\" | \"irreversible\";\n\nexport type AnonymisationOperator = {\n type: OperatorType;\n reversibility: OperatorReversibility;\n /**\n * Apply the operator to a single entity occurrence.\n * Returns the replacement string to embed in the document.\n */\n apply: (\n text: string,\n label: string,\n placeholder: string,\n redactString: string,\n ) => string;\n};\n\n/**\n * Redacted document output with stable entity mapping.\n */\nexport type RedactionResult = {\n redactedText: string;\n /**\n * Maps placeholder to original text. Only populated for\n * reversible operators (replace). Empty for redact.\n */\n redactionMap: Map<string, string>;\n /** Maps placeholder to the operator that produced it. */\n operatorMap: Map<string, OperatorType>;\n entityCount: number;\n};\n\n/**\n * Configuration for the detection pipeline.\n */\nexport type DenyListCategory =\n | \"Names\"\n | \"Places\"\n | \"Addresses\"\n | \"Courts\"\n | \"Financial\"\n | \"Government\"\n | \"Healthcare\"\n | \"Education\"\n | \"Political\"\n | \"Organizations\"\n | \"International\";\n\nexport type PipelineConfig = {\n threshold: number;\n enableTriggerPhrases: boolean;\n enableRegex: boolean;\n enableNameCorpus: boolean;\n enableDenyList: boolean;\n denyListCountries?: string[];\n denyListRegions?: string[];\n denyListExcludeCategories?: string[];\n enableGazetteer: boolean;\n enableNer: boolean;\n enableConfidenceBoost: boolean;\n enableCoreference: boolean;\n enableZoneClassification?: boolean;\n enableHotwordRules?: boolean;\n labels: string[];\n workspaceId: string;\n};\n\n/**\n * Canonical entity labels used across the pipeline.\n * NER models may use different native labels; the bench\n * NER wrapper maps model output to these canonical names.\n *\n * These labels are ephemeral: entities are regenerated on\n * every pipeline run and never persisted to the database.\n * Renaming a label here requires no migration.\n */\nexport const DEFAULT_ENTITY_LABELS = [\n \"person\",\n \"organization\",\n \"phone number\",\n \"address\",\n \"email address\",\n \"date\",\n \"date of birth\",\n \"bank account number\",\n \"iban\",\n \"tax identification number\",\n \"identity card number\",\n \"registration number\",\n \"credit card number\",\n \"passport number\",\n \"monetary amount\",\n \"land parcel\",\n] as const;\n","import type { UnifiedSearchInstance } from \"./build-unified-search\";\nimport type { Entity } from \"./types\";\n\n/**\n * Build a stable cache key for an entity that survives\n * shallow copies (spread). Uses position + label so the\n * key is identical for the original object and any\n * `{ ...entity }` copy produced by mergeAndDedup.\n */\nexport const corefKey = (e: Entity): string =>\n `${e.start}:${e.end}:${e.label}`;\n\n/**\n * Compiled RegExp pattern used for coreference\n * definition extraction.\n */\nexport type DefinitionPattern = {\n pattern: RegExp;\n};\n\n/**\n * Cached data for the name corpus detector.\n * Populated by initNameCorpus; consumed by\n * detectNameCorpus and deny-list AC integration.\n */\nexport type NameCorpusData = {\n firstNames: ReadonlySet<string>;\n surnames: ReadonlySet<string>;\n titleTokens: ReadonlySet<string>;\n excludedWords: ReadonlySet<string>;\n /** Raw arrays exposed for deny-list AC integration. */\n firstNamesList: readonly string[];\n surnamesList: readonly string[];\n titlesList: readonly string[];\n excludedList: readonly string[];\n};\n\n/**\n * All cached state for a single pipeline run (or\n * sequence of runs sharing the same config). Replacing\n * module-level singletons with this object enables\n * concurrent pipelines with different configs and\n * simplifies testing.\n *\n * Each field starts null and is populated lazily on\n * first use by the corresponding loader function.\n */\nexport type PipelineContext = {\n // ── Unified search cache ──────────────────────\n search: UnifiedSearchInstance | null;\n searchKey: string;\n searchPromise: Promise<UnifiedSearchInstance> | null;\n\n // ── Name corpus ───────────────────────────────\n nameCorpus: NameCorpusData | null;\n nameCorpusPromise: Promise<void> | null;\n\n // ── Deny-list data sets ───────────────────────\n stopwords: ReadonlySet<string> | null;\n stopwordsPromise: Promise<ReadonlySet<string>> | null;\n allowList: ReadonlySet<string> | null;\n allowListPromise: Promise<ReadonlySet<string>> | null;\n personStopwords: ReadonlySet<string> | null;\n personStopwordsPromise:\n | Promise<ReadonlySet<string>>\n | null;\n /** First-name exclusions for stopword filtering. */\n firstNameExclusions: ReadonlySet<string> | null;\n firstNameExclusionCorpusLen: number;\n\n // ── Generic roles (false-positive filter) ─────\n genericRoles: ReadonlySet<string> | null;\n genericRolesPromise:\n | Promise<ReadonlySet<string>>\n | null;\n\n // ── Coreference ───────────────────────────────\n corefPatterns: DefinitionPattern[] | null;\n corefPatternsPromise:\n | Promise<DefinitionPattern[]>\n | null;\n corefLoadAttempted: boolean;\n roleStopSet: ReadonlySet<string> | null;\n roleStopSetPromise:\n | Promise<ReadonlySet<string>>\n | null;\n\n // ── Zone classifier ───────────────────────────\n zoneHeadingPatterns: RegExp[] | null;\n zoneSigningPatterns: RegExp[] | null;\n zoneInitPromise: Promise<void> | null;\n\n // ── Coreference source map ────────────────────\n /**\n * Maps coreference entities to their source entity\n * text. Populated by findCoreferenceSpans, consumed\n * by buildPlaceholderMap for consistent placeholder\n * numbering across aliases and source entities.\n *\n * Keyed by `start:end:label` composite string so\n * lookups survive shallow copies (e.g. from\n * mergeAndDedup's spread operator).\n */\n corefSourceMap: Map<string, string>;\n};\n\n/** Create a fresh, empty pipeline context. */\nexport const createPipelineContext =\n (): PipelineContext => ({\n search: null,\n searchKey: \"\",\n searchPromise: null,\n\n nameCorpus: null,\n nameCorpusPromise: null,\n\n stopwords: null,\n stopwordsPromise: null,\n allowList: null,\n allowListPromise: null,\n personStopwords: null,\n personStopwordsPromise: null,\n firstNameExclusions: null,\n firstNameExclusionCorpusLen: 0,\n\n genericRoles: null,\n genericRolesPromise: null,\n\n corefPatterns: null,\n corefPatternsPromise: null,\n corefLoadAttempted: false,\n roleStopSet: null,\n roleStopSetPromise: null,\n\n zoneHeadingPatterns: null,\n zoneSigningPatterns: null,\n zoneInitPromise: null,\n\n corefSourceMap: new Map(),\n });\n\n/**\n * Module-level default context. Used when callers\n * don't provide an explicit context, preserving full\n * backward compatibility with the existing API.\n */\nexport const defaultContext: PipelineContext =\n createPipelineContext();\n","/**\n * Language manifest loader and config auto-discovery.\n *\n * Reads `manifest.json` from @stll/anonymize-data to\n * determine which languages have which config types,\n * then loads them via a static registry of import()\n * calls (string literals for bundler compatibility).\n */\n\n// ── Types ────────────────────────────────────────────\n\ntype ManifestLanguage = {\n triggers?: boolean;\n coreference?: boolean;\n};\n\ntype Manifest = {\n languages: Record<string, ManifestLanguage>;\n};\n\ntype ConfigType = \"triggers\" | \"coreference\";\n\n// ── Manifest loader (cached) ─────────────────────────\n\nlet _manifest: Manifest | null = null;\nlet _manifestPromise: Promise<Manifest> | null = null;\n\nconst loadManifest = (): Promise<Manifest> => {\n if (_manifest) {\n return Promise.resolve(_manifest);\n }\n if (_manifestPromise) {\n return _manifestPromise;\n }\n _manifestPromise = (async () => {\n try {\n const mod = await import(\n \"@stll/anonymize-data/config/manifest.json\"\n );\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON manifest\n const parsed = (mod.default ?? mod) as Manifest;\n if (\n !parsed ||\n typeof parsed.languages !== \"object\" ||\n parsed.languages === null ||\n Array.isArray(parsed.languages)\n ) {\n console.warn(\n \"[anonymize] lang-loader: manifest has \" +\n \"unexpected structure, falling back \" +\n \"to hardcoded list\",\n );\n _manifest = { languages: {} };\n return _manifest;\n }\n _manifest = parsed;\n return _manifest;\n } catch (err) {\n // Manifest not available (old data package version\n // or unexpected import error). Cache the empty\n // result so we don't retry the failed import.\n console.warn(\n \"[anonymize] lang-loader: manifest not \" +\n \"available, falling back to hardcoded \" +\n \"language list:\",\n err,\n );\n _manifest = { languages: {} };\n return _manifest;\n }\n })();\n return _manifestPromise;\n};\n\n// ── Static import registries ─────────────────────────\n// String literals so bundlers can statically analyze\n// the import paths. Each registry maps language code\n// to a lazy loader thunk.\n\nconst TRIGGER_LOADERS: Record<\n string,\n () => Promise<unknown>\n> = {\n cs: () =>\n import(\n \"@stll/anonymize-data/config/triggers.cs.json\"\n ),\n de: () =>\n import(\n \"@stll/anonymize-data/config/triggers.de.json\"\n ),\n en: () =>\n import(\n \"@stll/anonymize-data/config/triggers.en.json\"\n ),\n es: () =>\n import(\n \"@stll/anonymize-data/config/triggers.es.json\"\n ),\n fr: () =>\n import(\n \"@stll/anonymize-data/config/triggers.fr.json\"\n ),\n hu: () =>\n import(\n \"@stll/anonymize-data/config/triggers.hu.json\"\n ),\n it: () =>\n import(\n \"@stll/anonymize-data/config/triggers.it.json\"\n ),\n pl: () =>\n import(\n \"@stll/anonymize-data/config/triggers.pl.json\"\n ),\n ro: () =>\n import(\n \"@stll/anonymize-data/config/triggers.ro.json\"\n ),\n sk: () =>\n import(\n \"@stll/anonymize-data/config/triggers.sk.json\"\n ),\n sv: () =>\n import(\n \"@stll/anonymize-data/config/triggers.sv.json\"\n ),\n};\n\nconst COREFERENCE_LOADERS: Record<\n string,\n () => Promise<unknown>\n> = {\n cs: () =>\n import(\n \"@stll/anonymize-data/config/coreference.cs.json\"\n ),\n de: () =>\n import(\n \"@stll/anonymize-data/config/coreference.de.json\"\n ),\n en: () =>\n import(\n \"@stll/anonymize-data/config/coreference.en.json\"\n ),\n sk: () =>\n import(\n \"@stll/anonymize-data/config/coreference.sk.json\"\n ),\n};\n\nconst LOADER_REGISTRIES: Record<\n ConfigType,\n Record<string, () => Promise<unknown>>\n> = {\n triggers: TRIGGER_LOADERS,\n coreference: COREFERENCE_LOADERS,\n};\n\n// ── Fallback language lists ──────────────────────────\n// Used when the manifest is unavailable (old data\n// package). Matches the hardcoded lists that existed\n// before the manifest was introduced.\n\nconst FALLBACK_LANGUAGES: Record<\n ConfigType,\n readonly string[]\n> = {\n triggers: [\n \"cs\", \"de\", \"en\", \"es\", \"fr\",\n \"hu\", \"it\", \"pl\", \"ro\", \"sk\", \"sv\",\n ],\n coreference: [\"cs\", \"de\", \"en\", \"sk\"],\n};\n\n// ── Public API ───────────────────────────────────────\n\n/**\n * Load all config files of a given type for all\n * languages enabled in the manifest.\n *\n * Falls back to the hardcoded language list when the\n * manifest is unavailable (backward compatibility).\n */\nexport const loadLanguageConfigs = async <\n T extends NonNullable<unknown>,\n>(\n configType: ConfigType,\n mapFn: (mod: unknown) => T,\n): Promise<T[]> => {\n const manifest = await loadManifest();\n const registry = LOADER_REGISTRIES[configType];\n\n // Determine which language codes to load\n const hasManifestLanguages =\n Object.keys(manifest.languages).length > 0;\n\n const codes = hasManifestLanguages\n ? Object.entries(manifest.languages)\n .filter(([code, lang]) => {\n if (!lang || typeof lang !== \"object\") {\n console.warn(\n `[anonymize] lang-loader: manifest ` +\n `entry for \"${code}\" is not an ` +\n `object, skipping`,\n );\n return false;\n }\n return lang[configType] === true;\n })\n .map(([code]) => code)\n : [...FALLBACK_LANGUAGES[configType]];\n\n // Use indexed assignment so results preserve\n // manifest declaration order regardless of import\n // resolution timing.\n const results: (T | undefined)[] = new Array(\n codes.length,\n );\n\n const loads = codes.map(async (code, i) => {\n const loader = registry[code];\n if (!loader) {\n console.warn(\n `[anonymize] lang-loader: language \"${code}\" ` +\n `is enabled in the manifest for ` +\n `\"${configType}\" but has no loader in ` +\n `the static registry`,\n );\n return;\n }\n let mod: unknown;\n try {\n mod = await loader();\n } catch (err) {\n console.warn(\n `[anonymize] lang-loader: failed to ` +\n `import \"${configType}\" config for ` +\n `\"${code}\":`,\n err,\n );\n return;\n }\n let result: T;\n try {\n result = mapFn(mod);\n } catch (err) {\n console.warn(\n `[anonymize] lang-loader: mapFn failed ` +\n `for \"${code}\" (${configType}):`,\n err,\n );\n return;\n }\n results[i] = result;\n });\n\n await Promise.all(loads);\n return results.filter(\n (r): r is T => r !== undefined,\n );\n};\n\n/**\n * Reset cached manifest. Exposed for testing only.\n */\nexport const _resetManifestCache = (): void => {\n _manifest = null;\n _manifestPromise = null;\n};\n","import { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\nimport type {\n DefinitionPattern,\n PipelineContext,\n} from \"../context\";\nimport { corefKey, defaultContext } from \"../context\";\nimport {\n loadLanguageConfigs,\n} from \"../util/lang-loader\";\n\ntype CoreferenceConfigRow = {\n pattern: string;\n flags: string;\n label: string;\n};\n\n/**\n * Load coreference definition patterns from per-language\n * JSON configs in @stll/anonymize-data. Uses the\n * language manifest for auto-discovery.\n */\nconst loadDefinitionPatterns =\n async (): Promise<DefinitionPattern[]> => {\n const patterns: DefinitionPattern[] = [];\n\n const allRows = await loadLanguageConfigs<\n readonly CoreferenceConfigRow[]\n >(\n \"coreference\",\n (mod) => {\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON config\n const m = mod as {\n default?: readonly CoreferenceConfigRow[];\n };\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON config\n return (m.default ?? mod) as\n readonly CoreferenceConfigRow[];\n },\n );\n\n for (const rows of allRows) {\n if (!Array.isArray(rows)) {\n console.warn(\n \"[anonymize] coreference: unexpected \" +\n \"config shape, skipping\",\n );\n continue;\n }\n for (const row of rows) {\n try {\n patterns.push({\n pattern: new RegExp(row.pattern, row.flags),\n });\n } catch (err) {\n console.warn(\n `[anonymize] coreference: invalid ` +\n `regex \"${row.pattern}\":`,\n err,\n );\n }\n }\n }\n\n return patterns;\n };\n\n/**\n * Load generic role terms that should NOT be treated\n * as PII coreferences. \"Prodávající\" (Seller),\n * \"Kupující\" (Buyer), etc. are legal roles, not\n * identifying information.\n */\nconst getRoleStopSet = async (\n ctx: PipelineContext,\n): Promise<ReadonlySet<string>> => {\n if (ctx.roleStopSet) return ctx.roleStopSet;\n if (ctx.roleStopSetPromise) return ctx.roleStopSetPromise;\n const promise = (async () => {\n let result: ReadonlySet<string>;\n try {\n const mod = await import(\n \"@stll/anonymize-data/config/generic-roles.json\"\n );\n const data = (mod.default ?? mod) as {\n roles: string[];\n };\n result = new Set(\n data.roles.map((r: string) => r.toLowerCase()),\n );\n } catch {\n result = new Set();\n }\n ctx.roleStopSet = result;\n return result;\n })();\n ctx.roleStopSetPromise = promise;\n return promise;\n};\n\nconst getDefinitionPatterns = async (\n ctx: PipelineContext,\n): Promise<DefinitionPattern[]> => {\n if (ctx.corefPatterns) {\n return ctx.corefPatterns;\n }\n if (ctx.corefPatternsPromise) {\n return ctx.corefPatternsPromise;\n }\n ctx.corefPatternsPromise = loadDefinitionPatterns();\n const patterns = await ctx.corefPatternsPromise;\n if (patterns.length === 0) {\n // All loads failed; cache empty array permanently\n // to avoid retrying dynamic imports and flooding\n // logs on every call in high-volume pipelines.\n ctx.corefPatterns = patterns;\n if (!ctx.corefLoadAttempted) {\n ctx.corefLoadAttempted = true;\n console.warn(\n \"[anonymize] coreference: no definition \" +\n \"patterns loaded; coreference detection \" +\n \"will be inactive\",\n );\n }\n return patterns;\n }\n ctx.corefPatterns = patterns;\n return patterns;\n};\n\nconst SEARCH_WINDOW = 200;\n\ntype DefinedTerm = {\n alias: string;\n label: string;\n /** Position of the definition in the source text */\n definitionStart: number;\n /** Original entity text the alias refers to */\n sourceText: string;\n};\n\n/**\n * Scan for defined-term patterns near known entities.\n *\n * Legal documents universally follow:\n * \"Dr. Heinrich Muller (hereinafter 'the Seller')...\"\n *\n * After NER detects the entity, this function scans for\n * definitional patterns within +/-200 chars and extracts\n * the alias. Returns alias + label pairs that can be added\n * to the gazetteer for a full-text re-scan.\n */\n/**\n * Labels that can be the source of a coreference alias.\n * Only parties (person, organization) have defined-term\n * aliases in legal text. Dates, addresses, IDs do not.\n */\nconst COREF_SOURCE_LABELS = new Set([\n \"person\",\n \"organization\",\n]);\n\nexport const extractDefinedTerms = async (\n fullText: string,\n entities: Entity[],\n ctx: PipelineContext = defaultContext,\n): Promise<DefinedTerm[]> => {\n const [definitionPatterns, roleStops] =\n await Promise.all([\n getDefinitionPatterns(ctx),\n getRoleStopSet(ctx),\n ]);\n const terms: DefinedTerm[] = [];\n const seen = new Set<string>();\n\n // Sort entities by position for nearest-preceding lookup\n const sorted = [...entities].sort(\n (a, b) => a.start - b.start,\n );\n\n // Strategy: find all \"dále jen\" definitions in the\n // text, then for each one, find the nearest PRECEDING\n // person/organization entity. This is more accurate\n // than \"any entity within 200 chars\" because:\n // - The alias always refers to a party defined BEFORE\n // the parenthetical, not after\n // - Multiple entities (name, IČO, address) may appear\n // between the party name and the \"dále jen\"; only\n // the party name is the referent\n\n for (const { pattern } of definitionPatterns) {\n pattern.lastIndex = 0;\n\n for (\n let match = pattern.exec(fullText);\n match !== null;\n match = pattern.exec(fullText)\n ) {\n const alias = match[1]?.trim();\n if (!alias || alias.length < 2) {\n continue;\n }\n\n // Skip generic legal roles — \"Prodávající\",\n // \"Kupující\", \"Seller\", etc. are NOT PII.\n // Only track aliases that are themselves\n // identifying (initials, name fragments, etc.)\n if (roleStops.has(alias.toLowerCase())) {\n continue;\n }\n\n const defPos = match.index;\n\n // Find the nearest preceding person/org entity\n // within SEARCH_WINDOW chars before this definition\n let bestEntity: Entity | null = null;\n for (let i = sorted.length - 1; i >= 0; i--) {\n const e = sorted[i];\n if (e === undefined) {\n continue;\n }\n // Must be before the definition\n if (e.end > defPos) {\n continue;\n }\n // Must be within the search window\n if (defPos - e.end > SEARCH_WINDOW) {\n break;\n }\n // Must be a party label\n if (!COREF_SOURCE_LABELS.has(e.label)) {\n continue;\n }\n bestEntity = e;\n break;\n }\n\n if (bestEntity === null) {\n continue;\n }\n\n const key = `${alias.toLowerCase()}::${bestEntity.label}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n\n terms.push({\n alias,\n label: bestEntity.label,\n definitionStart: defPos,\n sourceText: bestEntity.text,\n });\n }\n }\n\n return terms;\n};\n\n/**\n * Check if a character is a Unicode word character\n * (letter, digit, or combining mark). Used for word\n * boundary checks in coreference matching.\n */\nconst isWordChar = (ch: string | undefined): boolean => {\n if (ch === undefined) {\n return false;\n }\n return /[\\p{L}\\p{M}\\p{N}]/u.test(ch);\n};\n\n/**\n * Find all occurrences of defined-term aliases in the\n * full text. Returns Entity spans for each match.\n *\n * Respects word boundaries: \"Kupující\" must not match\n * inside \"Kupujícímu\". A match is valid only if the\n * character before the start and after the end are NOT\n * word characters (letter/digit).\n *\n * Populates `ctx.corefSourceMap` with entries linking\n * each coref entity to its source entity text, for\n * consistent placeholder numbering.\n */\nexport const findCoreferenceSpans = (\n fullText: string,\n terms: DefinedTerm[],\n ctx: PipelineContext = defaultContext,\n): Entity[] => {\n const results: Entity[] = [];\n\n for (const term of terms) {\n let searchFrom = 0;\n while (searchFrom < fullText.length) {\n const idx = fullText.indexOf(term.alias, searchFrom);\n if (idx === -1) {\n break;\n }\n\n const matchEnd = idx + term.alias.length;\n\n // Word boundary check: the character before the\n // match and after the match must not be a word\n // character. This prevents \"Kupující\" matching\n // inside \"Kupujícímu\".\n const charBefore = idx > 0\n ? fullText[idx - 1]\n : undefined;\n const charAfter = fullText[matchEnd];\n\n if (isWordChar(charBefore) || isWordChar(charAfter)) {\n // Not at a word boundary — skip\n searchFrom = idx + 1;\n continue;\n }\n\n const entity: Entity = {\n start: idx,\n end: matchEnd,\n label: term.label,\n text: term.alias,\n score: 0.95,\n source: DETECTION_SOURCES.COREFERENCE,\n };\n ctx.corefSourceMap.set(\n corefKey(entity),\n term.sourceText,\n );\n results.push(entity);\n\n searchFrom = matchEnd;\n }\n }\n\n return results;\n};\n","import type { Match, PatternEntry } from \"@stll/text-search\";\n\nimport { DETECTION_SOURCES } from \"../types\";\nimport type { Entity, GazetteerEntry } from \"../types\";\nimport type { GazetteerData } from \"../build-unified-search\";\n\nconst MAX_EDIT_DISTANCE = 2;\nconst MIN_FUZZY_LENGTH = 4;\n// \" s.r.o.\" = 7 bytes (space + 6 chars). Must be\n// at least 7 to capture the most common Czech LLC\n// suffix without truncating the trailing dot.\nconst MAX_PREFIX_OVERSHOOT = 7;\n\n/**\n * Collect all searchable strings (canonical + variants)\n * from gazetteer entries, mapped to their labels and\n * entry IDs.\n */\nexport const buildSearchTerms = (\n entries: GazetteerEntry[],\n): Map<string, { label: string; entryId: string }> => {\n const terms = new Map<\n string,\n { label: string; entryId: string }\n >();\n for (const entry of entries) {\n const meta = {\n label: entry.label,\n entryId: entry.id,\n };\n terms.set(entry.canonical, meta);\n for (const variant of entry.variants) {\n terms.set(variant, meta);\n }\n }\n return terms;\n};\n\n/**\n * Build TextSearch-compatible patterns from gazetteer\n * entries. Returns:\n * - Exact literal patterns for all terms\n * - Fuzzy patterns (distance: 2) for terms >= 4 chars\n * - Parallel metadata arrays for post-processing\n *\n * Patterns are ordered: all exact first, then all\n * fuzzy. The isFuzzy array marks which are which.\n */\nexport const buildGazetteerPatterns = (\n entries: GazetteerEntry[],\n): {\n patterns: PatternEntry[];\n data: GazetteerData;\n} => {\n const terms = buildSearchTerms(entries);\n\n const patterns: PatternEntry[] = [];\n const labels: string[] = [];\n const isFuzzy: boolean[] = [];\n\n // Pass 1: exact literals (all terms).\n // Use per-pattern wholeWords: false because\n // user-supplied entries may contain dots or\n // special chars (e.g. \"a.s.\", \"AT&T\") that\n // break word-boundary matching. Deny-list and\n // street-type patterns use per-pattern\n // wholeWords: true instead.\n for (const [term, meta] of terms) {\n patterns.push({\n pattern: term,\n literal: true as const,\n wholeWords: false,\n });\n labels.push(meta.label);\n\n isFuzzy.push(false);\n }\n\n // Pass 2: fuzzy patterns (terms >= 4 chars).\n // These are separate patterns with distance: 2,\n // routed to @stll/fuzzy-search by TextSearch.\n for (const [term, meta] of terms) {\n if (term.length < MIN_FUZZY_LENGTH) {\n continue;\n }\n patterns.push({\n pattern: term,\n distance: MAX_EDIT_DISTANCE,\n });\n labels.push(meta.label);\n\n isFuzzy.push(true);\n }\n\n return {\n patterns,\n data: { labels, isFuzzy },\n };\n};\n\n/**\n * Process gazetteer matches from the unified literal\n * search. Receives all matches; filters to the\n * gazetteer slice via sliceStart/sliceEnd.\n *\n * Exact matches get score 0.9; fuzzy matches get\n * 0.85. Fuzzy matches that overlap an exact match\n * are dropped.\n *\n * For exact matches, attempts prefix extension for\n * legal suffixes (\"a.s.\", \"GmbH\", \"s.r.o.\" after\n * the matched term).\n */\nexport const processGazetteerMatches = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText: string,\n data: GazetteerData,\n): Entity[] => {\n const results: Entity[] = [];\n // Track exact-match spans for overlap filtering\n const exactSpans: Array<{\n start: number;\n end: number;\n }> = [];\n\n // Pass 1: exact matches (isFuzzy === false)\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n const localIdx = idx - sliceStart;\n if (data.isFuzzy[localIdx]) {\n continue;\n }\n\n const label = data.labels[localIdx];\n if (!label) {\n continue;\n }\n\n // Try prefix extension for legal entity suffixes\n const extended = tryPrefixExtension(\n fullText,\n match.start,\n match.end,\n );\n const end = extended?.end ?? match.end;\n const text =\n extended?.text ??\n fullText.slice(match.start, match.end);\n\n exactSpans.push({\n start: match.start,\n end,\n });\n results.push({\n start: match.start,\n end,\n label,\n text,\n score: 0.9,\n source: DETECTION_SOURCES.GAZETTEER,\n });\n }\n\n // Pass 2: fuzzy matches (isFuzzy === true),\n // skipping those that overlap exact spans\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n const localIdx = idx - sliceStart;\n if (!data.isFuzzy[localIdx]) {\n continue;\n }\n\n // Skip distance-0 fuzzy hits (already caught\n // as exact matches above)\n if (match.distance === 0) {\n continue;\n }\n\n const label = data.labels[localIdx];\n if (!label) {\n continue;\n }\n\n // Skip if overlapping any exact span\n const overlapsExact = exactSpans.some(\n (e) =>\n match.start < e.end && match.end > e.start,\n );\n if (overlapsExact) {\n continue;\n }\n\n const matchText = fullText.slice(\n match.start,\n match.end,\n );\n results.push({\n start: match.start,\n end: match.end,\n label,\n text: matchText,\n score: 0.85,\n source: DETECTION_SOURCES.GAZETTEER,\n });\n }\n\n return results;\n};\n\n/**\n * Try to extend an exact match to capture one\n * trailing token (max 6 chars) that may be a legal\n * entity suffix (e.g., \"a.s.\", \"GmbH\", \"s.r.o.\").\n *\n * Does not validate the token against a legal-forms\n * list; false extensions are filtered by mergeAndDedup\n * when a legal-form detector produces a competing\n * entity with the correct span.\n */\nconst tryPrefixExtension = (\n fullText: string,\n start: number,\n end: number,\n): { end: number; text: string } | null => {\n const maxEnd = Math.min(\n end + MAX_PREFIX_OVERSHOOT,\n fullText.length,\n );\n if (maxEnd <= end + 1) {\n return null;\n }\n\n const after = fullText.slice(end, maxEnd);\n if (!after.startsWith(\" \")) {\n return null;\n }\n const nextSpace = after.indexOf(\" \", 1);\n const suffixEnd =\n nextSpace !== -1 ? nextSpace : after.length;\n if (suffixEnd <= 1) {\n return null;\n }\n\n const newEnd = end + suffixEnd;\n return {\n end: newEnd,\n text: fullText.slice(start, newEnd),\n };\n};\n\n// Deprecated exports (kept for API compat).\n","/**\n * Shared text utilities for detectors.\n *\n * Extracted from names.ts and deny-list.ts to avoid\n * duplicating regex constants and helper functions.\n */\n\n/** Matches a string that starts with an uppercase letter. */\nexport const UPPER_START_RE = /^\\p{Lu}/u;\n\n/** Matches a string consisting entirely of uppercase letters. */\nexport const ALL_UPPER_RE = /^\\p{Lu}+$/u;\n\nconst SENTENCE_END_RE = /[.!?]/;\n\n/**\n * Detect whether a position is at the start of a sentence.\n * Looks backward past whitespace for sentence-ending\n * punctuation (.!?). Position 0 and positions preceded\n * only by whitespace are considered sentence starts.\n */\nexport const isSentenceStart = (\n text: string,\n pos: number,\n): boolean => {\n if (pos === 0) {\n return true;\n }\n let i = pos - 1;\n while (i >= 0 && /\\s/.test(text[i] ?? \"\")) {\n i--;\n }\n if (i < 0) {\n return true;\n }\n return SENTENCE_END_RE.test(text[i] ?? \"\");\n};\n","import { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\nimport type { PipelineContext, NameCorpusData } from \"../context\";\nimport { defaultContext } from \"../context\";\nimport {\n ALL_UPPER_RE,\n UPPER_START_RE,\n isSentenceStart,\n} from \"../util/text\";\n\n// ── Name corpus ──────────────────────────────────────\n// Per-language first names and surnames loaded from\n// Wikidata-sourced dictionaries in @stll/anonymize-data,\n// plus legacy config/names-*.json for backwards compat.\n// Merged at init time across all configured languages.\n\n// ── Accessors (read from context) ────────────────────\n\nconst getCorpus = (\n ctx: PipelineContext,\n): NameCorpusData | null => ctx.nameCorpus;\n\n// Exported accessors for deny-list.ts AC integration.\nexport const getNameCorpusFirstNames = (\n ctx: PipelineContext = defaultContext,\n): readonly string[] =>\n ctx.nameCorpus?.firstNamesList ?? [];\nexport const getNameCorpusSurnames = (\n ctx: PipelineContext = defaultContext,\n): readonly string[] =>\n ctx.nameCorpus?.surnamesList ?? [];\nexport const getNameCorpusTitles = (\n ctx: PipelineContext = defaultContext,\n): readonly string[] =>\n ctx.nameCorpus?.titlesList ?? [];\nexport const getNameCorpusExcluded = (\n ctx: PipelineContext = defaultContext,\n): readonly string[] =>\n ctx.nameCorpus?.excludedList ?? [];\n\n/**\n * Languages with per-language first/surname\n * dictionaries in @stll/anonymize-data.\n */\nconst NAME_LANGUAGES = [\n \"cs\", \"sk\", \"de\", \"pl\", \"hu\",\n \"ro\", \"fr\", \"es\", \"it\", \"en\", \"sv\",\n] as const;\n\ntype JsonArrayModule = {\n default: readonly string[];\n};\n\n/**\n * Try importing a JSON module; return empty array\n * if not found.\n */\nconst tryImportArray = async (\n path: string,\n): Promise<readonly string[]> => {\n try {\n const mod = (await import(path)) as JsonArrayModule;\n return mod.default;\n } catch {\n return [];\n }\n};\n\n/**\n * Load name corpus data from per-language dictionary\n * files and legacy config files. Merges all sources.\n *\n * Safe to call multiple times; only loads once per\n * context. Must be called before detectNameCorpus or\n * the getNameCorpus*() accessors are used.\n */\nexport const initNameCorpus = (\n ctx: PipelineContext = defaultContext,\n): Promise<void> => {\n if (ctx.nameCorpusPromise) return ctx.nameCorpusPromise;\n const promise = (async () => {\n try {\n // Load legacy config files (backwards compat)\n const [\n legacyFirstMod,\n legacySurnameMod,\n titleMod,\n exclusionMod,\n ] = await Promise.all([\n import(\n \"@stll/anonymize-data/config/names-first.json\"\n ) as Promise<{ default: { names: string[] } }>,\n import(\n \"@stll/anonymize-data/config/names-surnames.json\"\n ) as Promise<{ default: { names: string[] } }>,\n import(\n \"@stll/anonymize-data/config/names-title-tokens.json\"\n ) as Promise<{\n default: { tokens: string[] };\n }>,\n import(\n \"@stll/anonymize-data/config/names-exclusions.json\"\n ) as Promise<{ default: { words: string[] } }>,\n ]);\n\n // Load per-language dictionaries in parallel\n const firstImports = NAME_LANGUAGES.map(\n (lang) => tryImportArray(\n `@stll/anonymize-data/dictionaries/names/first/${lang}.json`,\n ),\n );\n const surnameImports = NAME_LANGUAGES.map(\n (lang) => tryImportArray(\n `@stll/anonymize-data/dictionaries/names/surnames/${lang}.json`,\n ),\n );\n\n const [firstResults, surnameResults] =\n await Promise.all([\n Promise.all(firstImports),\n Promise.all(surnameImports),\n ]);\n\n // Merge: legacy config + all per-language files\n const firstNames: string[] = [\n ...legacyFirstMod.default.names,\n ];\n for (const names of firstResults) {\n for (const name of names) {\n firstNames.push(name);\n }\n }\n\n const surnames: string[] = [\n ...legacySurnameMod.default.names,\n ];\n for (const names of surnameResults) {\n for (const name of names) {\n surnames.push(name);\n }\n }\n\n // Deduplicate (preserve first occurrence)\n const dedup = (arr: string[]): string[] => {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const item of arr) {\n if (seen.has(item)) continue;\n seen.add(item);\n result.push(item);\n }\n return result;\n };\n\n const dedupFirst = dedup(firstNames);\n const dedupSurnames = dedup(surnames);\n const titles = titleMod.default.tokens;\n const exclusions = exclusionMod.default.words;\n\n ctx.nameCorpus = {\n firstNames: Object.freeze(\n new Set(dedupFirst),\n ),\n surnames: Object.freeze(\n new Set(dedupSurnames),\n ),\n titleTokens: Object.freeze(new Set(titles)),\n excludedWords: Object.freeze(\n new Set(exclusions),\n ),\n firstNamesList: Object.freeze(dedupFirst),\n surnamesList: Object.freeze(dedupSurnames),\n titlesList: Object.freeze(titles),\n excludedList: Object.freeze(exclusions),\n };\n } catch (err) {\n // Reset so the next call retries the load rather\n // than returning this (already-resolved) failed\n // promise. Current awaiters still get a resolved\n // (not rejected) Promise; ctx.nameCorpus stays null.\n ctx.nameCorpusPromise = null;\n console.warn(\n \"[anonymize] Failed to load name corpus JSON\"\n + \" — name detection disabled:\",\n err,\n );\n }\n })();\n ctx.nameCorpusPromise = promise;\n return promise;\n};\n\n// ── Czech/Slovak suffix stripping ────────────────────\n// Case suffixes commonly appended to names in declined\n// Czech/Slovak text. Ordered longest-first.\n\nconst INFLECTION_SUFFIXES = [\n \"ovi\", // dative\n \"em\", // instrumental\n \"om\", // instrumental (some stems)\n \"ou\", // instrumental feminine\n \"é\", // dative/locative feminine\n \"a\", // genitive\n \"u\", // accusative/locative\n] as const;\n\n/**\n * Strip common Czech/Slovak case suffixes from a token.\n * Returns candidate base forms if stripping produces a\n * plausible name (capitalised, length >= 3).\n *\n * For the \"-ou\" instrumental feminine suffix, also yields\n * base + \"a\" (e.g., \"Editou\" → \"Edit\" and \"Edita\")\n * because Czech feminine names decline -a → -ou.\n */\nconst stripInflection = (token: string): string[] => {\n const candidates: string[] = [];\n for (const suffix of INFLECTION_SUFFIXES) {\n if (\n token.length > suffix.length + 2 &&\n token.endsWith(suffix)\n ) {\n const base = token.slice(0, -suffix.length);\n if (/^\\p{Lu}/u.test(base)) {\n candidates.push(base);\n // Czech feminine: -a → -ou (instrumental),\n // -a → -é (dative/locative), -a → -u (accusative)\n if (\n suffix === \"ou\" ||\n suffix === \"é\" ||\n suffix === \"u\"\n ) {\n candidates.push(`${base}a`);\n }\n // Czech feminine: -a → -ovi is not valid, but\n // -e → -em is (e.g., \"Kalhousem\" → \"Kalhous\")\n // which is already handled by stripping \"em\".\n }\n }\n }\n return candidates;\n};\n\n// ── Token types ──────────────────────────────────────\n\nconst TOKEN_TYPE = {\n NAME: \"name\",\n SURNAME: \"surname\",\n TITLE: \"title\",\n ABBREVIATION: \"abbreviation\",\n CAPITALIZED: \"capitalized\",\n OTHER: \"other\",\n} as const;\n\ntype TokenType = (typeof TOKEN_TYPE)[keyof typeof TOKEN_TYPE];\n\ntype ClassifiedToken = {\n text: string;\n type: TokenType;\n start: number;\n end: number;\n};\n\n// ── Helpers ──────────────────────────────────────────\n\n/**\n * Check if a token is in the first-name set, either\n * directly or after stripping Czech/Slovak inflection.\n */\nconst isFirstNameToken = (\n token: string,\n corpus: NameCorpusData,\n): boolean => {\n if (corpus.firstNames.has(token)) {\n return true;\n }\n return stripInflection(token).some(\n (b) => corpus.firstNames.has(b),\n );\n};\n\n/**\n * Check if a token is in the surname set, either\n * directly or after stripping Czech/Slovak inflection.\n */\nconst isSurnameToken = (\n token: string,\n corpus: NameCorpusData,\n): boolean => {\n if (corpus.surnames.has(token)) {\n return true;\n }\n return stripInflection(token).some(\n (b) => corpus.surnames.has(b),\n );\n};\n\n/**\n * Check if a token looks like a single-letter\n * abbreviation: \"J.\", \"M.\", etc.\n */\nconst isAbbreviation = (token: string): boolean =>\n token.length === 2 && /^\\p{Lu}$/u.test(token[0] ?? \"\") && token[1] === \".\";\n\n// ── Word segmentation ────────────────────────────────\n\nconst segmenter = new Intl.Segmenter(undefined, {\n granularity: \"word\",\n});\n\ntype WordSegment = {\n text: string;\n start: number;\n end: number;\n};\n\n/**\n * Split text into word segments using Intl.Segmenter.\n * Only returns segments flagged as words.\n */\nconst segmentWords = (fullText: string): WordSegment[] => {\n const words: WordSegment[] = [];\n for (const seg of segmenter.segment(fullText)) {\n if (seg.isWordLike) {\n words.push({\n text: seg.segment,\n start: seg.index,\n end: seg.index + seg.segment.length,\n });\n }\n }\n return words;\n};\n\n// ── Helpers for chain scoring ────────────────────────\n\n/** NAME or SURNAME — both represent corpus-matched tokens */\nconst isCorpusMatch = (type: TokenType): boolean =>\n type === TOKEN_TYPE.NAME || type === TOKEN_TYPE.SURNAME;\n\n// ── Token classification ─────────────────────────────\n\nconst classifyToken = (\n word: WordSegment,\n corpus: NameCorpusData,\n): ClassifiedToken => {\n const { text, start, end } = word;\n const lower = text.toLowerCase();\n\n // Strip trailing period for title check (e.g., \"Ing.\")\n const stripped = text.endsWith(\".\") ? text.slice(0, -1).toLowerCase() : lower;\n\n if (corpus.titleTokens.has(stripped)) {\n return { text, type: TOKEN_TYPE.TITLE, start, end };\n }\n\n if (isAbbreviation(text)) {\n return {\n text,\n type: TOKEN_TYPE.ABBREVIATION,\n start,\n end,\n };\n }\n\n // Skip excluded words\n if (corpus.excludedWords.has(lower)) {\n return { text, type: TOKEN_TYPE.OTHER, start, end };\n }\n\n // Minimum length 3\n if (text.length < 3) {\n return { text, type: TOKEN_TYPE.OTHER, start, end };\n }\n\n // Skip all-uppercase tokens > 3 chars (likely acronyms)\n if (text.length > 3 && ALL_UPPER_RE.test(text)) {\n return { text, type: TOKEN_TYPE.OTHER, start, end };\n }\n\n // Must start with uppercase\n if (!UPPER_START_RE.test(text)) {\n return { text, type: TOKEN_TYPE.OTHER, start, end };\n }\n\n if (isFirstNameToken(text, corpus)) {\n return { text, type: TOKEN_TYPE.NAME, start, end };\n }\n\n if (isSurnameToken(text, corpus)) {\n return { text, type: TOKEN_TYPE.SURNAME, start, end };\n }\n\n // Capitalised word (not in corpus but starts uppercase)\n return {\n text,\n type: TOKEN_TYPE.CAPITALIZED,\n start,\n end,\n };\n};\n\n// ── Chain assembly ───────────────────────────────────\n\n/**\n * Detect person names by looking up tokens against the\n * name corpus, then chaining adjacent name-like tokens.\n *\n * Requires initNameCorpus() to have been called first.\n * If not initialized, returns an empty array.\n *\n * Scoring:\n * TITLE + NAME/SURNAME → 0.95\n * NAME + NAME/SURNAME → 0.9\n * SURNAME + NAME/SURNAME → 0.9\n * NAME + CAPITALIZED → 0.7\n * ABBREVIATION + NAME → 0.7\n * Standalone NAME → 0.5 (low confidence)\n * Standalone SURNAME → skip (too ambiguous)\n */\nexport const detectNameCorpus = (\n fullText: string,\n ctx: PipelineContext = defaultContext,\n): Entity[] => {\n const corpus = getCorpus(ctx);\n if (!corpus) {\n return [];\n }\n\n const words = segmentWords(fullText);\n const tokens = words.map((w) => classifyToken(w, corpus));\n const entities: Entity[] = [];\n const consumed = new Set<number>();\n\n for (let i = 0; i < tokens.length; i++) {\n if (consumed.has(i)) {\n continue;\n }\n\n const token = tokens[i];\n if (!token) {\n continue;\n }\n\n // Only start chains from TITLE, NAME, SURNAME,\n // or ABBREVIATION\n if (\n token.type !== TOKEN_TYPE.TITLE &&\n token.type !== TOKEN_TYPE.NAME &&\n token.type !== TOKEN_TYPE.SURNAME &&\n token.type !== TOKEN_TYPE.ABBREVIATION\n ) {\n continue;\n }\n\n // Build a chain of adjacent relevant tokens.\n // Max 5 tokens to prevent merging independent names\n // (e.g., \"Jan Novák Pavel Moc\" should be two entities).\n const MAX_CHAIN = 5;\n const chain: ClassifiedToken[] = [token];\n let j = i + 1;\n\n while (j < tokens.length && chain.length < MAX_CHAIN) {\n const next = tokens[j];\n if (!next) {\n break;\n }\n\n // Break chain if there's a newline between tokens\n const prev = chain.at(-1);\n if (prev) {\n const gap = fullText.slice(prev.end, next.start);\n if (gap.includes(\"\\n\")) {\n break;\n }\n }\n\n // Only chain NAME, SURNAME, TITLE, ABBREVIATION,\n // CAPITALIZED\n if (\n next.type === TOKEN_TYPE.NAME ||\n next.type === TOKEN_TYPE.SURNAME ||\n next.type === TOKEN_TYPE.TITLE ||\n next.type === TOKEN_TYPE.ABBREVIATION ||\n next.type === TOKEN_TYPE.CAPITALIZED\n ) {\n chain.push(next);\n j++;\n } else {\n break;\n }\n }\n\n // Score the chain\n const hasTitle = chain.some((t) => t.type === TOKEN_TYPE.TITLE);\n const hasCorpusName = chain.some((t) => isCorpusMatch(t.type));\n const hasFirstName = chain.some((t) => t.type === TOKEN_TYPE.NAME);\n const hasAbbreviation = chain.some(\n (t) => t.type === TOKEN_TYPE.ABBREVIATION,\n );\n const corpusCount = chain.filter((t) => isCorpusMatch(t.type)).length;\n const capitalizedCount = chain.filter(\n (t) => t.type === TOKEN_TYPE.CAPITALIZED,\n ).length;\n\n // Determine score based on chain composition\n let score = 0;\n\n if (hasTitle && hasCorpusName) {\n // TITLE + NAME/SURNAME → high confidence\n score = 0.95;\n } else if (corpusCount >= 2) {\n // NAME + NAME, NAME + SURNAME, etc. → high confidence\n score = 0.9;\n } else if (hasCorpusName && capitalizedCount > 0) {\n // NAME/SURNAME + CAPITALIZED → medium confidence\n score = 0.7;\n } else if (hasAbbreviation && hasCorpusName) {\n // ABBREVIATION + NAME/SURNAME → medium confidence\n score = 0.7;\n } else if (hasFirstName && chain.length === 1) {\n // Standalone first NAME → low confidence\n // Skip if at sentence start (likely not a name)\n if (isSentenceStart(fullText, token.start)) {\n continue;\n }\n score = 0.5;\n } else if (\n !hasFirstName &&\n chain.length === 1 &&\n chain[0]?.type === TOKEN_TYPE.SURNAME\n ) {\n // Standalone SURNAME → skip (too ambiguous alone)\n continue;\n } else if (hasTitle && chain.length === 1) {\n // Standalone TITLE → skip (not a name by itself)\n continue;\n } else {\n // No corpus match in chain → skip\n if (!hasCorpusName) {\n continue;\n }\n score = 0.5;\n }\n\n // Build entity span from first to last token in chain\n const first = chain.at(0);\n const last = chain.at(-1);\n if (!first || !last) {\n continue;\n }\n\n const start = first.start;\n const end = last.end;\n const text = fullText.slice(start, end);\n\n // Mark all chain tokens as consumed\n for (let k = i; k < i + chain.length; k++) {\n consumed.add(k);\n }\n\n entities.push({\n start,\n end,\n label: \"person\",\n text,\n score,\n source: DETECTION_SOURCES.REGEX,\n });\n }\n\n return entities;\n};\n","/**\n * Academic and professional title prefixes.\n * Plain text; the detector auto-escapes for regex.\n * Sorted longest-first at build time.\n */\nexport const TITLE_PREFIXES = [\n // Czech/Slovak pre-nominal\n \"Ing.\",\n \"Mgr.\",\n \"MgA.\",\n \"Bc.\",\n \"BcA.\",\n \"JUDr.\",\n \"MUDr.\",\n \"MVDr.\",\n \"MDDr.\",\n \"PhDr.\",\n \"RNDr.\",\n \"PaedDr.\",\n \"ThDr.\",\n \"ThLic.\",\n \"ICDr.\",\n \"RSDr.\",\n \"PharmDr.\",\n \"artD.\",\n \"akad.\",\n \"doc.\",\n \"prof.\",\n\n // Professor variants (AT/DE)\n \"ao. Univ.-Prof.\",\n \"o. Univ.-Prof.\",\n \"Univ.-Prof.\",\n \"Hon.-Prof.\",\n \"em. Prof.\",\n\n // German doctoral (compound before simple)\n \"Dr. med. dent.\",\n \"Dr. med. vet.\",\n \"Dr. med.\",\n \"Dr. rer. nat.\",\n \"Dr. rer. soc.\",\n \"Dr. rer. pol.\",\n \"Dr. sc. tech.\",\n \"Dr. sc. nat.\",\n \"Dr. sc. hum.\",\n \"Dr. iur.\",\n \"Dr. jur.\",\n \"Dr. theol.\",\n \"Dr. oec.\",\n \"Dr. techn.\",\n \"Dr. h. c.\",\n \"Dr. phil.\",\n \"Dr.-Ing.\",\n \"Dr. Ing.\",\n \"Dr.\",\n\n // German Diplom variants (longest first)\n \"Dipl.-Wirt.-Ing.\",\n \"Dipl.-Betriebsw.\",\n \"Dipl.-Inform.\",\n \"Dipl.-Volksw.\",\n \"Dipl.-Psych.\",\n \"Dipl.-Phys.\",\n \"Dipl.-Chem.\",\n \"Dipl.-Biol.\",\n \"Dipl.-Math.\",\n \"Dipl.-Päd.\",\n \"Dipl.-Soz.\",\n \"Dipl.-Kfm.\",\n \"Dipl.-Jur.\",\n \"Dipl. Ing.\",\n \"Dipl.-Ing.\",\n\n // Austrian Mag/Bakk variants\n \"Mag. rer. soc. oec.\",\n \"Mag. rer. nat.\",\n \"Mag. phil.\",\n \"Mag. iur.\",\n \"Mag. arch.\",\n \"Mag. pharm.\",\n \"Mag. (FH)\",\n \"Mag.\",\n \"Bakk. rer. nat.\",\n \"Bakk. techn.\",\n \"Bakk. phil.\",\n \"Bakk.\",\n\n // Swiss Lic variants\n \"Lic. phil.\",\n \"Lic. iur.\",\n \"Lic. oec.\",\n \"Lic. theol.\",\n \"Lic.\",\n\n // Other German/Austrian\n \"Priv.-Doz.\",\n \"PD\",\n \"RA\",\n] as const;\n\n/**\n * Courtesy/honorific titles that precede a person's\n * name. Sorted alphabetically. The detector escapes\n * dots and adds \\b for entries in HONORIFIC_BOUNDARY.\n */\nexport const HONORIFICS = [\n \"Avv.\",\n \"Dame\",\n \"Doamna\",\n \"Domnul\",\n \"Don\",\n \"Doña\",\n \"Dott.\",\n \"Judge\",\n \"Justice\",\n \"Lady\",\n \"Lord\",\n \"M.\",\n \"Madame\",\n \"Mademoiselle\",\n \"Maître\",\n \"Me\",\n \"Messrs\",\n \"Miss\",\n \"Mlle\",\n \"Mme\",\n \"Monsieur\",\n \"Mr\",\n \"Mrs\",\n \"Ms\",\n \"President\",\n \"Señor\",\n \"Señora\",\n \"Sig.\",\n \"Sig.ra\",\n \"Signor\",\n \"Signora\",\n \"Signorina\",\n \"Sir\",\n \"Sr.\",\n \"Sra.\",\n] as const;\n\n/**\n * Honorifics that need \\b word-boundary anchors\n * (short or common words that could match mid-word).\n */\nexport const HONORIFIC_BOUNDARY = new Set([\n \"Don\",\n \"Doña\",\n \"M.\",\n \"Me\",\n \"Señor\",\n \"Señora\",\n]);\n\n/**\n * Post-nominal degrees (comma or space separated after name).\n * Plain text; the detector auto-escapes for regex.\n */\nexport const POST_NOMINALS = [\n \"Ph.D.\",\n \"Ph.D\",\n \"CSc.\",\n \"DrSc.\",\n \"ArtD.\",\n \"D.Phil.\",\n \"DPhil.\",\n \"MPhil.\",\n \"MBA\",\n \"MPA\",\n \"LL.M.\",\n \"LL.B.\",\n \"M.Sc.\",\n \"B.Sc.\",\n \"MSc.\",\n \"BSc.\",\n \"M.Eng.\",\n \"B.Eng.\",\n \"M.A.\",\n \"B.A.\",\n \"JCD\",\n \"JD\",\n \"DiS.\",\n \"ACCA\",\n \"FCCA\",\n \"CIPM\",\n \"CIPT\",\n \"CIPP/E\",\n \"CIPP\",\n] as const;\n","/**\n * Centralized Unicode character equivalence groups.\n *\n * Loads char-groups.json from @stll/anonymize-data and\n * provides helpers to build regex character classes that\n * match all typographic variants of a character type\n * (dashes, spaces, quotes, etc.).\n *\n * The JSON is statically imported so the bundler inlines\n * it, avoiding a runtime require() that breaks browsers.\n */\n\nimport charGroupsJson from\n \"@stll/anonymize-data/config/char-groups.json\";\n\ntype CharEntry = {\n char: string;\n name: string;\n code: string;\n};\n\ntype CharGroup = {\n description: string;\n chars: readonly CharEntry[];\n};\n\ntype CharGroupsConfig = {\n _comment: string;\n groups: Record<string, CharGroup>;\n};\n\n/** Chars that need escaping inside a regex char class. */\nconst REGEX_CLASS_SPECIAL = /[\\\\\\]^-]/;\n\nconst escapeForCharClass = (ch: string): string =>\n REGEX_CLASS_SPECIAL.test(ch) ? `\\\\${ch}` : ch;\n\n// SAFETY: JSON shape matches CharGroupsConfig by contract\n// with @stll/anonymize-data.\nconst config = charGroupsJson as CharGroupsConfig;\n\n/**\n * Get the raw characters for a named group.\n * Throws if the group does not exist.\n */\nexport const charSet = (\n group: string,\n): readonly string[] => {\n const g = config.groups[group];\n if (!g) {\n throw new Error(\n `Unknown char group: \"${group}\"`,\n );\n }\n return g.chars.map((entry) => entry.char);\n};\n\n/**\n * Build a regex character class string for a named\n * group. E.g., charClass(\"dash\") returns a string\n * like \"[-\\u2013\\u2014\\u2010\\u2011\\u2212\\u2043]\".\n *\n * The hyphen-minus is placed first so it is treated\n * as a literal, not a range indicator.\n */\nexport const charClass = (group: string): string => {\n const chars = charSet(group);\n // Place hyphen-minus first to avoid range issues.\n const sorted = [...chars].sort((a, b) => {\n if (a === \"-\") return -1;\n if (b === \"-\") return 1;\n return a.localeCompare(b);\n });\n const escaped = sorted.map(escapeForCharClass);\n return `[${escaped.join(\"\")}]`;\n};\n\n/**\n * Return the inner content of a character class (without\n * the surrounding brackets). Useful for embedding a group\n * inside a larger character class, e.g.:\n * `[\\\\s&,.${charClassInner(\"dash\")}]`\n */\nexport const charClassInner = (\n group: string,\n): string => {\n const chars = charSet(group);\n const sorted = [...chars].sort((a, b) => {\n if (a === \"-\") return -1;\n if (b === \"-\") return 1;\n return a.localeCompare(b);\n });\n return sorted.map(escapeForCharClass).join(\"\");\n};\n\n/**\n * Build a regex alternation pattern for a named group.\n * Unlike charClass, this uses (?:a|b|c) syntax which\n * is useful when chars need individual escaping or\n * when embedding in complex patterns.\n */\nexport const charPattern = (group: string): string => {\n const chars = charSet(group);\n // SAFETY: length === 1 guarantees index 0 exists.\n if (chars.length === 1) return chars[0]!;\n const escaped = chars.map((ch) =>\n ch.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"),\n );\n return `(?:${escaped.join(\"|\")})`;\n};\n\n// ── Pre-built constants for common groups ──────\n\n/** Regex char class matching all dash variants. */\nexport const DASH = charClass(\"dash\");\n\n/**\n * Inner content of the dash char class (no brackets).\n * For embedding inside a larger character class:\n * `[\\\\s&,.${DASH_INNER}]`\n */\nexport const DASH_INNER = charClassInner(\"dash\");\n\n/** Regex char class matching all space variants. */\nexport const SPACE = charClass(\"space\");\n\n/** Regex char class matching all double-quote variants. */\nexport const QUOTE_DOUBLE = charClass(\"quote-double\");\n\n/** Regex char class matching all single-quote variants. */\nexport const QUOTE_SINGLE = charClass(\"quote-single\");\n\n/** Regex char class matching all slash variants. */\nexport const SLASH = charClass(\"slash\");\n\n/** Regex char class matching all dot variants. */\nexport const DOT = charClass(\"dot\");\n\n/** Regex char class matching all colon variants. */\nexport const COLON = charClass(\"colon\");\n","import type { Match } from \"@stll/text-search\";\nimport type { Validator } from \"@stll/stdnum\";\nimport {\n at, be, bg, cz, cy, de, dk, ee, es,\n fi, fr, gb, gr, hr, hu, ie, it, lt,\n lu, lv, mt, nl, pl, pt, ro, se, si,\n sk,\n} from \"@stll/stdnum\";\nimport { toRegex } from \"@stll/stdnum/patterns\";\n\nimport {\n HONORIFIC_BOUNDARY,\n HONORIFICS,\n POST_NOMINALS,\n TITLE_PREFIXES,\n} from \"../config/titles\";\nimport { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\nimport { DASH } from \"../util/char-groups\";\n\nconst MIN_PHONE_LENGTH = 7;\nconst MIN_MONTH_NAME_LENGTH = 3;\n\n// ── Shared helpers ──────────────────────────────────\n\nconst escapeTitle = (title: string): string =>\n title\n // eslint-disable-next-line no-useless-escape\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\s+/g, \"\\\\s*\");\n\n/** Escape for use inside a regex alternation. */\nconst escapeRegex = (s: string): string =>\n // eslint-disable-next-line no-useless-escape\n s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/** Escape for use inside a regex character class. */\nconst escapeCharClass = (s: string): string =>\n s.replace(/[\\]\\\\^-]/g, \"\\\\$&\");\n\nconst TITLE_PREFIX = TITLE_PREFIXES.toSorted(\n (a, b) => b.length - a.length,\n)\n .map(escapeTitle)\n .join(\"|\");\n\nconst POST_NOMINAL = POST_NOMINALS.toSorted(\n (a, b) => b.length - a.length,\n)\n .map(escapeTitle)\n .join(\"|\");\n\n// biome-ignore lint/security/noSecrets: diacritics char class\nconst UPPER_CZ = \"A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ\";\n// biome-ignore lint/security/noSecrets: diacritics char class\nconst LOWER_CZ = \"a-záčďéěíňóřšťúůýžäöüß\";\nconst NAME_WORD = `[${UPPER_CZ}][${LOWER_CZ}]+`;\n\nconst PARTICLE =\n `(?:van der|van den|de la|della|` +\n `von|van|dos|ibn|ben|bin|del|zum|zur|ten|ter|` +\n `da|de|di|al|el|le|la|zu|af|av)`;\n\n// Non-newline whitespace\nconst SP = \"[^\\\\S\\\\n\\\\t]\";\n\n/** Honorific alternation built from titles.ts config. */\nconst HONORIFIC_ALT = [...HONORIFICS]\n .toSorted((a, b) => b.length - a.length)\n .map((h) => {\n const escaped = escapeRegex(h);\n return HONORIFIC_BOUNDARY.has(h)\n ? `\\\\b${escaped}`\n : escaped;\n })\n .join(\"|\");\n\n// ── Pattern definitions ─────────────────────────────\n\nexport type RegexMeta = {\n label: string;\n score: number;\n /** Post-match stdnum validator for confirmation. */\n validator?: Validator;\n};\n\ntype RegexDef = {\n pattern: string;\n label: string;\n score: number;\n validator?: Validator;\n};\n\n// ── stdnum validator entries ────────────────────────\n// Each entry pairs a @stll/stdnum validator with a\n// label and confidence score. The pattern derived via\n// toRegex(validator).source is used as the regex; the\n// validator itself is stored in META for post-match\n// confirmation (see processRegexMatches).\n\ntype StdnumEntry = {\n validator: Validator;\n label: string;\n score: number;\n pattern: string;\n};\n\nconst toEntry = (\n validator: Validator,\n label: string,\n score: number,\n): StdnumEntry | null => {\n const pattern = toRegex(validator).source;\n if (!pattern) return null;\n return {\n validator,\n label,\n score,\n pattern,\n };\n};\n\n/**\n * Stdnum validators for national/company IDs.\n *\n * Selection criteria: only patterns specific enough\n * to avoid excessive false positives (country-prefixed\n * VAT numbers, structured personal IDs). Generic\n * digit-only patterns (e.g. \\d{8}) are excluded unless\n * the validator's checksum is strong enough to filter.\n */\nconst STDNUM_ENTRIES: readonly StdnumEntry[] = [\n // ── Original PR #28 patterns (were 15-21) ────────\n toEntry(hu.vat, \"tax identification number\", 0.95),\n toEntry(\n it.codiceFiscale,\n \"national identification number\",\n 0.95,\n ),\n toEntry(\n es.dni,\n \"national identification number\",\n 0.9,\n ),\n toEntry(\n es.nie,\n \"national identification number\",\n 0.95,\n ),\n toEntry(\n se.personnummer,\n \"national identification number\",\n 0.9,\n ),\n toEntry(ro.cnp, \"national identification number\", 0.95),\n toEntry(fr.nir, \"social security number\", 0.9),\n\n // ── CZ validators ────────────────────────────────\n toEntry(cz.dic, \"tax identification number\", 0.95),\n // cz.ico and cz.rc omitted: cz.ico is \\d{8} (too\n // generic), cz.rc is \\d{6}/\\d{3,4} (handled by\n // pattern 7: czech birth number)\n\n // ── DE validators ────────────────────────────────\n toEntry(de.vat, \"tax identification number\", 0.95),\n toEntry(\n de.idnr,\n \"tax identification number\",\n 0.9,\n ),\n toEntry(\n de.stnr,\n \"tax identification number\",\n 0.9,\n ),\n toEntry(\n de.svnr,\n \"social security number\",\n 0.9,\n ),\n\n // ── PL validators ────────────────────────────────\n toEntry(pl.nip, \"tax identification number\", 0.95),\n toEntry(\n pl.pesel,\n \"national identification number\",\n 0.9,\n ),\n // pl.regon omitted: \\d{9,14} too generic\n\n // ── GB validators ────────────────────────────────\n toEntry(gb.vat, \"tax identification number\", 0.95),\n toEntry(\n gb.nino,\n \"social security number\",\n 0.95,\n ),\n // gb.utr omitted: \\d{10} too generic\n\n // ── AT validators ────────────────────────────────\n toEntry(at.uid, \"tax identification number\", 0.95),\n toEntry(\n at.tin,\n \"tax identification number\",\n 0.9,\n ),\n toEntry(\n at.businessid,\n \"registration number\",\n 0.95,\n ),\n\n // ── BE validators ────────────────────────────────\n toEntry(be.vat, \"tax identification number\", 0.95),\n toEntry(\n be.nn,\n \"national identification number\",\n 0.9,\n ),\n\n // ── NL validators ────────────────────────────────\n toEntry(nl.vat, \"tax identification number\", 0.95),\n // nl.bsn omitted: \\d{9} too generic\n\n // ── DK validators ────────────────────────────────\n toEntry(dk.vat, \"tax identification number\", 0.95),\n toEntry(\n dk.cpr,\n \"national identification number\",\n 0.9,\n ),\n\n // ── FI validators ────────────────────────────────\n toEntry(fi.vat, \"tax identification number\", 0.95),\n toEntry(\n fi.hetu,\n \"national identification number\",\n 0.95,\n ),\n toEntry(fi.ytunnus, \"registration number\", 0.9),\n\n // ── BG validators ────────────────────────────────\n toEntry(bg.vat, \"tax identification number\", 0.95),\n\n // ── SK validators ────────────────────────────────\n toEntry(sk.dic, \"tax identification number\", 0.95),\n // sk.ico: \\d{8} too generic; sk.rc overlaps with\n // czech birth number pattern\n\n // ── ES additional validators ─────────────────────\n toEntry(es.cif, \"registration number\", 0.95),\n toEntry(es.vat, \"tax identification number\", 0.95),\n toEntry(es.nss, \"social security number\", 0.9),\n\n // ── FR additional validators ─────────────────────\n toEntry(fr.tva, \"tax identification number\", 0.95),\n toEntry(fr.siren, \"registration number\", 0.9),\n toEntry(fr.siret, \"registration number\", 0.9),\n\n // ── IT additional validators ─────────────────────\n toEntry(it.iva, \"tax identification number\", 0.95),\n\n // ── IE validators ────────────────────────────────\n toEntry(ie.vat, \"tax identification number\", 0.95),\n toEntry(\n ie.pps,\n \"national identification number\",\n 0.9,\n ),\n\n // ── PT validators ────────────────────────────────\n toEntry(pt.vat, \"tax identification number\", 0.95),\n toEntry(\n pt.cc,\n \"national identification number\",\n 0.9,\n ),\n\n // ── RO additional validators ─────────────────────\n toEntry(ro.vat, \"tax identification number\", 0.95),\n\n // ── GR validators ────────────────────────────────\n toEntry(gr.vat, \"tax identification number\", 0.95),\n\n // ── HR validators ────────────────────────────────\n toEntry(hr.vat, \"tax identification number\", 0.95),\n\n // ── SI validators ────────────────────────────────\n toEntry(si.vat, \"tax identification number\", 0.95),\n\n // ── LT validators ────────────────────────────────\n toEntry(lt.vat, \"tax identification number\", 0.95),\n toEntry(\n lt.asmens,\n \"national identification number\",\n 0.9,\n ),\n\n // ── LV validators ────────────────────────────────\n toEntry(lv.vat, \"tax identification number\", 0.95),\n\n // ── EE validators ────────────────────────────────\n toEntry(ee.vat, \"tax identification number\", 0.95),\n toEntry(\n ee.ik,\n \"national identification number\",\n 0.9,\n ),\n\n // ── CY validators ────────────────────────────────\n toEntry(cy.vat, \"tax identification number\", 0.95),\n\n // ── MT validators ────────────────────────────────\n toEntry(mt.vat, \"tax identification number\", 0.95),\n\n // ── LU validators ────────────────────────────────\n toEntry(lu.vat, \"tax identification number\", 0.95),\n].filter((e): e is StdnumEntry => e !== null);\n\n// ── Named pattern definitions ────────────────────────\n\nconst TITLED_PERSON: RegexDef = {\n pattern:\n `(?:${TITLE_PREFIX})` +\n `(?:${SP}+(?:${TITLE_PREFIX}))*` +\n `${SP}+` +\n `(?:${NAME_WORD})` +\n `(?:${SP}{1,4}(?:${PARTICLE}${SP}+)?` +\n `${NAME_WORD}){1,3}` +\n `(?:,?${SP}+(?:${POST_NOMINAL})(?:,?${SP}+(?:${POST_NOMINAL}))*)?`,\n label: \"person\",\n score: 0.95,\n};\n\nconst HONORIFIC_PERSON: RegexDef = {\n pattern:\n `(?:${HONORIFIC_ALT})` +\n `\\\\.?${SP}+${NAME_WORD}` +\n `(?:(?:${SP}|-){1,2}(?:${PARTICLE}${SP}+)?` +\n `${NAME_WORD}){0,3}` +\n `(?:${SP}+(?:QC|KC|SC|LJ|AG))?`,\n label: \"person\",\n score: 0.95,\n};\n\nconst IBAN: RegexDef = {\n pattern:\n `\\\\b[A-Z]{2}\\\\d{2}\\\\s?[\\\\dA-Z]{4}\\\\s?[\\\\dA-Z]{4}` +\n `\\\\s?[\\\\dA-Z]{4}\\\\s?[\\\\dA-Z]{4}` +\n `\\\\s?[\\\\dA-Z]{0,14}\\\\b`,\n label: \"iban\",\n score: 1,\n};\n\nconst EMAIL: RegexDef = {\n pattern:\n `\\\\b[\\\\w.+\\\\-]+@[\\\\w\\\\-]+(?:\\\\.[\\\\w\\\\-]+)+\\\\b`,\n label: \"email address\",\n score: 1,\n};\n\n// [^\\S\\n] instead of \\s: separators must not\n// match newlines (prevents cross-line bleeding).\nconst INTL_PHONE: RegexDef = {\n pattern:\n `\\\\+\\\\d{1,3}(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\(?\\\\d{2,4}\\\\)?` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{2,4}` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{0,4}\\\\b`,\n label: \"phone number\",\n score: 1,\n};\n\n// Czech phone numbers: mobiles start with 6/7,\n// landlines with 2-5. Restrict to [2-7] but require\n// the full 9-digit pattern to avoid matching monetary\n// amounts. The negative lookahead prevents bank\n// account patterns (digits/digits).\nconst CZ_PHONE: RegexDef = {\n pattern:\n `\\\\b[2-7]\\\\d{2}(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}` +\n `(?!(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d*/\\\\d)` +\n `(?![^\\\\S\\\\n]*(?:Kč|,-|korun|EUR|USD|€|\\\\$))\\\\b`,\n label: \"phone number\",\n score: 0.85,\n};\n\n/**\n * Phone numbers prefixed with \"tel.:\" or \"telefon:\".\n * Captures the number after the prefix, including\n * optional international code (+420).\n */\nconst TEL_PREFIX_PHONE: RegexDef = {\n pattern:\n `(?:\\\\b[Tt]el(?:efon)?\\\\.?\\\\s*:?\\\\s*)` +\n `(?:\\\\+?\\\\d{1,3}[^\\\\S\\\\n]?)?` +\n `\\\\d{3}(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}\\\\b`,\n label: \"phone number\",\n score: 0.95,\n};\n\nconst CREDIT_CARD: RegexDef = {\n pattern:\n `\\\\b(?:4\\\\d{3}|5[1-5]\\\\d{2}|3[47]\\\\d{2})` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{4}(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{4}` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{2,4}\\\\b`,\n label: \"credit card number\",\n score: 1,\n};\n\nconst CZ_BIRTH_NUMBER: RegexDef = {\n pattern: `\\\\b\\\\d{6}/\\\\d{3,4}\\\\b`,\n label: \"czech birth number\",\n score: 1,\n validator: cz.rc,\n};\n\nconst DATE_NUMERIC: RegexDef = {\n pattern:\n `\\\\b(?:\\\\d{1,2}[./]\\\\d{1,2}[./]\\\\d{2,4}` +\n `|\\\\d{4}-\\\\d{2}-\\\\d{2}` +\n `|\\\\d{4}\\\\.\\\\d{2}\\\\.\\\\d{2})\\\\b`,\n label: \"date\",\n score: 1,\n};\n\nconst DATE_CZ_SPACED: RegexDef = {\n pattern:\n `\\\\b\\\\d{1,2}\\\\.[^\\\\S\\\\n]+\\\\d{1,2}\\\\.[^\\\\S\\\\n]+\\\\d{4}\\\\b`,\n label: \"date\",\n score: 1,\n};\n\nconst IP_ADDRESS: RegexDef = {\n pattern:\n `\\\\b(?:(?:25[0-5]|2[0-4]\\\\d|[01]?\\\\d\\\\d?)\\\\.){3}` +\n `(?:25[0-5]|2[0-4]\\\\d|[01]?\\\\d\\\\d?)\\\\b`,\n label: \"ip address\",\n score: 1,\n};\n\nconst CZ_BANK_ACCOUNT: RegexDef = {\n pattern:\n `\\\\b(?:\\\\d{1,6}-)?\\\\d{6,10}/\\\\d{4}(?!\\\\d)`,\n label: \"bank account number\",\n score: 0.95,\n};\n\n// Hungarian Budapest landline (+36 1 XXX XXXX).\n// 2+ digit area codes handled by INTL_PHONE.\nconst HU_LANDLINE: RegexDef = {\n pattern:\n `\\\\+36(?:[^\\\\S\\\\n]|[.\\\\-])?1(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{4}\\\\b`,\n label: \"phone number\",\n score: 0.9,\n};\n\n// Czech license plates (SPZ/RZ).\n// New format: 3SJ 0753 — digit, two letters, space?,\n// four digits. Old format: 1A2 3456 — digit, letter,\n// digit, space?, four digits.\n\n// Czech/Slovak postal code: \"110 00\", \"120 00\".\n// The distinctive XXX XX format with mandatory\n// space is specific enough to avoid most false\n// positives.\nconst CZ_POSTAL: RegexDef = {\n pattern: `\\\\b\\\\d{3}[^\\\\S\\\\n]\\\\d{2}\\\\b`,\n label: \"address\",\n score: 0.7,\n};\n\n// URL: scheme + host + optional port + path + query +\n// fragment. Trailing prose punctuation excluded but\n// ? = & # kept for query strings.\n// Allow missing // after http:/https: — common OCR\n// artifact (\"http:example.cz\" instead of\n// \"http://example.cz\"). Lookahead ensures bare scheme\n// is not matched in isolation (e.g., \"http:\" at EOL).\nconst URL: RegexDef = {\n pattern:\n `(?:https?://|https?:(?=[^\\\\s])|www\\\\.)` +\n `[\\\\w\\\\-]+(?:\\\\.[\\\\w\\\\-]+)+` +\n `(?::\\\\d+)?` +\n `(?:[/?#][^\\\\s)\\\\]>]*[^\\\\s.,;:!?)\\\\]>])?`,\n label: \"url\",\n score: 1,\n};\n\n// Bare domain: no protocol/www prefix, ends with a\n// known TLD. Catches \"fondkinematografie.cz\" etc.\n// Uses [a-zA-Z0-9] (no underscores — invalid in\n// hostnames). Short ambiguous TLDs (de, at, no, se,\n// fi, dk, be, it, uk) require at least one subdomain\n// dot to reduce false positives in European legal\n// text; unambiguous TLDs allow bare second-level\n// domains (e.g., \"fondkinematografie.cz\").\nconst LONG_TLDS =\n \"com|org|net|eu|cz|sk|pl|hu|ro|fr|es\" +\n \"|co\\\\.uk|nl|ch|info|io|dev\";\nconst SHORT_TLDS = \"de|at|be|se|fi|dk|no|it|uk\";\n// RFC 1123: labels cannot start or end with hyphen.\nconst HOST_LABEL =\n `[a-zA-Z0-9](?:[a-zA-Z0-9\\\\-]*[a-zA-Z0-9])?`;\nconst BARE_HOST =\n `\\\\b[a-zA-Z0-9][a-zA-Z0-9\\\\-]+[a-zA-Z0-9]`;\nconst PATH_SUFFIX =\n `(?:[/?#][^\\\\s)\\\\]>]*[^\\\\s.,;:!?)\\\\]>])?`;\nconst BARE_DOMAIN: RegexDef = {\n pattern:\n // Unambiguous TLDs: bare SLDs ok (one dot)\n `${BARE_HOST}(?:\\\\.${HOST_LABEL})*` +\n `\\\\.(?:${LONG_TLDS})\\\\b${PATH_SUFFIX}` +\n `|` +\n // Short/ambiguous TLDs: require subdomain (two+ dots)\n `${BARE_HOST}(?:\\\\.${HOST_LABEL})+` +\n `\\\\.(?:${SHORT_TLDS})\\\\b${PATH_SUFFIX}`,\n label: \"url\",\n score: 0.9,\n};\n\n\n// Full RFC 5952 IPv6. :: compressed form replaces\n// 1+ zero groups. Right side: 1-7 hex groups.\nconst IPV6_ADDRESS: RegexDef = {\n pattern:\n `\\\\b(?:[0-9a-fA-F]{1,4}:){7}` +\n `[0-9a-fA-F]{1,4}\\\\b` +\n `|\\\\b(?:[0-9a-fA-F]{1,4}:){1,7}:\\\\b` +\n `|::(?:[0-9a-fA-F]{1,4}:){0,6}` +\n `[0-9a-fA-F]{1,4}`,\n label: \"ip address\",\n score: 1,\n};\n\n// MAC: colon-only OR hyphen-only (no mixed).\nconst MAC_ADDRESS: RegexDef = {\n pattern:\n `\\\\b(?:[0-9a-fA-F]{2}:){5}` +\n `[0-9a-fA-F]{2}\\\\b` +\n `|\\\\b(?:[0-9a-fA-F]{2}-){5}` +\n `[0-9a-fA-F]{2}\\\\b`,\n label: \"mac address\",\n score: 1,\n};\n\n// SWIFT/BIC moved to trigger-based detection\n// (triggers.global.json) for better composability.\n\n// 12-hour time: \"5:00 p.m.\", \"12:30 AM\", \"5:00p.m.\",\n// \"11:00 a.m. Eastern Time\". Captures HH:MM and the\n// am/pm marker; optional timezone suffix is not\n// included (it's not PII). Case spelled out explicitly\n// (no (?i)) because DFA compilation fails with\n// Unicode + case-insensitive flag on this pattern.\nconst TIME_12H: RegexDef = {\n pattern:\n `\\\\b(?:1[0-2]|0?[1-9]):[0-5]\\\\d` +\n `[^\\\\S\\\\n]?(?:[aApP]\\\\.?[mM]\\\\.?)` +\n `(?=[\\\\s,;!?)]|$)`,\n label: \"date\",\n score: 0.9,\n};\n\n// ── Collected definitions ────────────────────────────\n\n/**\n * All static PII regex definitions. Scanned in a\n * single pass by @stll/regex-set (Rust DFA).\n *\n * Hand-written patterns (0-17) followed by\n * stdnum-derived patterns (18+). Each stdnum entry\n * has a post-match validator for confirmation.\n *\n * Monetary amount patterns are built dynamically from\n * currencies.json via `getCurrencyPatterns()`.\n *\n * Date patterns using written month names are built\n * dynamically from date-months.json via\n * `getDatePatterns()`.\n */\nconst ALL_REGEX_DEFS: readonly RegexDef[] = [\n TITLED_PERSON,\n HONORIFIC_PERSON,\n IBAN,\n EMAIL,\n INTL_PHONE,\n CZ_PHONE,\n TEL_PREFIX_PHONE,\n CREDIT_CARD,\n CZ_BIRTH_NUMBER,\n DATE_NUMERIC,\n DATE_CZ_SPACED,\n IP_ADDRESS,\n CZ_BANK_ACCOUNT,\n HU_LANDLINE,\n CZ_POSTAL,\n URL,\n IPV6_ADDRESS,\n MAC_ADDRESS,\n BARE_DOMAIN,\n TIME_12H,\n ...STDNUM_ENTRIES,\n];\n\n/** Flat pattern array for text-search. */\nexport const REGEX_PATTERNS: readonly string[] =\n ALL_REGEX_DEFS.map((d) => d.pattern);\n\n/** Parallel metadata. Index = pattern index. */\nexport const REGEX_META: readonly RegexMeta[] =\n ALL_REGEX_DEFS.map((d): RegexMeta => {\n const meta: RegexMeta = {\n label: d.label,\n score: d.score,\n };\n if (d.validator) {\n meta.validator = d.validator;\n }\n return meta;\n });\n\n// ── Dynamic date patterns (22 languages) ────────────\n\n/**\n * JSON shape: language codes map to string arrays;\n * metadata keys (prefixed `_`) map to strings.\n * The `_` keys are skipped by `buildMonthAlternation`.\n */\ntype DateMonths = Record<string, string[] | string>;\n\n/**\n * Build month-name alternation from date-months.json.\n * Deduplicates across all 22 languages, filters names\n * shorter than 3 chars (too many false positives), and\n * sorts longest-first so the regex engine prefers the\n * longest match.\n */\nconst buildMonthAlternation = (\n months: DateMonths,\n): string => {\n const seen = new Set<string>();\n for (const [key, value] of Object.entries(months)) {\n if (key.startsWith(\"_\")) continue;\n const names = Array.isArray(value) ? value : [value];\n for (const name of names) {\n // Strip trailing dots for the regex; date patterns\n // use `\\\\.?` after the alternation to match optional\n // abbreviation dots.\n const clean = name\n .replace(/\\.$/, \"\")\n .toLowerCase();\n if (clean.length >= MIN_MONTH_NAME_LENGTH) {\n seen.add(clean);\n }\n }\n }\n return [...seen]\n .toSorted((a, b) => b.length - a.length)\n .map(escapeRegex)\n .join(\"|\");\n};\n\n/**\n * Build date patterns from a month-name alternation.\n * Returns 6 patterns covering the major written-date\n * formats across all supported languages.\n */\nconst buildDatePatternsFromMonths = (\n alt: string,\n): string[] => {\n if (!alt) {\n // No month names survived filtering — return nothing\n // rather than emitting patterns with (?:) that match\n // arbitrary whitespace.\n return [];\n }\n // Optional time suffix: \"19:45:50\" or \"19:45\"\n const TIME = `(?:\\\\s+\\\\d{1,2}:\\\\d{2}(?::\\\\d{2})?)`;\n return [\n // a. DD[.] Month[.] YYYY [HH:MM[:SS]]\n `(?i)\\\\b\\\\d{1,2}\\\\.?\\\\s+(?:${alt})\\\\.?\\\\s+\\\\d{4}${TIME}?\\\\b`,\n // b. Month[.] DD[,] YYYY — \"March 7, 2023\" (US format)\n `(?i)\\\\b(?:${alt})\\\\.?\\\\s+\\\\d{1,2},?\\\\s+\\\\d{4}\\\\b`,\n // c. DDst/nd/rd/th Month[.] [YYYY] — \"1st January 2025\"\n `(?i)\\\\b\\\\d{1,2}(?:st|nd|rd|th)\\\\s+(?:${alt})\\\\.?` +\n `(?:\\\\s+\\\\d{4})?(?=\\\\s|[.,;!?)]|$)`,\n // d. Month[.] YYYY — \"October 1983\"\n `(?i)\\\\b(?:${alt})\\\\.?\\\\s+\\\\d{4}\\\\b`,\n // e. YYYY. Month[.] DD. — Hungarian \"2025. január 7.\"\n `(?i)\\\\b\\\\d{4}\\\\.\\\\s+(?:${alt})\\\\.?\\\\s+\\\\d{1,2}\\\\.?(?=\\\\s|[.,;!?)]|$)`,\n // f. DD de Month[.] [de] YYYY — Spanish \"7 de enero de 2025\"\n `(?i)\\\\b\\\\d{1,2}\\\\s+de\\\\s+(?:${alt})\\\\.?` +\n `(?:\\\\s+de)?\\\\s+\\\\d{4}\\\\b`,\n ];\n};\n\n/** Cached promise for date patterns. Loaded once. */\nlet datePatternPromise: Promise<string[]> | null = null;\n\nconst loadDatePatterns = async (): Promise<string[]> => {\n const mod = await import(\n \"@stll/anonymize-data/config/date-months.json\"\n );\n // Dynamic import of JSON returns { default, ...keys }.\n // Use `default` if present (ESM wrapper), else the\n // module itself.\n const months: DateMonths = mod.default ?? mod;\n const alt = buildMonthAlternation(months);\n return buildDatePatternsFromMonths(alt);\n};\n\n/**\n * Get dynamically built date patterns from\n * date-months.json. Returns a cached promise; the JSON\n * is loaded only once.\n */\nexport const getDatePatterns = (): Promise<string[]> => {\n if (!datePatternPromise) {\n datePatternPromise = loadDatePatterns().catch(\n (err) => {\n datePatternPromise = null;\n throw err;\n },\n );\n }\n return datePatternPromise;\n};\n\n/** Date pattern metadata (all are score 1 dates). */\nexport const DATE_PATTERN_META: Readonly<RegexMeta> =\n Object.freeze({\n label: \"date\",\n score: 1,\n });\n\n// ── Dynamic currency patterns ──────────────────────\n\n/**\n * JSON shape from currencies.json: ISO 4217 codes,\n * common currency symbols, and local currency names.\n */\ntype CurrenciesData = {\n codes: string[];\n symbols: string[];\n localNames?: string[];\n};\n\n/**\n * Build symbol character class, code alternation,\n * and local-name alternation from currencies.json,\n * then return two monetary amount patterns: leading\n * symbol and trailing code/name.\n *\n * The number sub-pattern accepts both grouped\n * thousands (1,000) and plain integers (100000)\n * via `\\d{1,9}` to catch unformatted amounts.\n */\nconst buildCurrencyPatterns = (\n data: CurrenciesData,\n): string[] => {\n const symbols = data.symbols\n .map(escapeCharClass)\n .join(\"\");\n\n // Build trailing alternation: ISO codes (case-\n // sensitive, always uppercase) + local names.\n // Local names that contain only ASCII letters\n // are wrapped in (?i:...) for case-insensitive\n // matching; abbreviations with non-ASCII or\n // punctuation (Kč, zł, Fr.) stay case-sensitive.\n // Sorted longest-first to avoid partial matches.\n const isAsciiAlpha = /^[a-zA-Z\\s]+$/;\n\n type TrailingPart = { len: number; alt: string };\n const parts: TrailingPart[] = data.codes.map(\n (code) => ({\n len: code.length,\n alt: escapeRegex(code),\n }),\n );\n\n // Minimum length for case-insensitive wrapping.\n // Short abbreviations like \"Ft\" (2 chars) stay\n // case-sensitive to avoid collisions (Ft vs ft/feet).\n const MIN_CI_LENGTH = 3;\n\n if (data.localNames) {\n for (const name of data.localNames) {\n const escaped = escapeRegex(name);\n const wrapCI =\n isAsciiAlpha.test(name) &&\n name.length >= MIN_CI_LENGTH;\n if (wrapCI) {\n parts.push({\n len: name.length,\n alt: `(?i:${escaped})`,\n });\n } else {\n parts.push({ len: name.length, alt: escaped });\n }\n }\n }\n\n // Also include currency symbols as trailing\n // alternatives (e.g., \"126 €\", \"8 190 £\").\n // These are common in European notation.\n if (symbols) {\n for (const ch of data.symbols) {\n parts.push({\n len: ch.length,\n alt: escapeRegex(ch),\n });\n }\n }\n\n const trailingAlt = parts\n .toSorted((a, b) => b.len - a.len)\n .map((p) => p.alt)\n .join(\"|\");\n\n if (!symbols && !trailingAlt) return [];\n\n // Number sub-pattern: grouped thousands OR plain\n // integer up to 9 digits (covers unformatted\n // amounts like \"100000 CZK\").\n const NUM =\n `(?:\\\\d{1,3}(?:[,.'[^\\\\S\\\\n\\\\t]]\\\\d{3})+` +\n `|\\\\d{1,9})`;\n\n const patterns: string[] = [];\n\n // Leading symbol: $100, €1,000.50, € 100000\n if (symbols) {\n patterns.push(\n `(?:[${symbols}])` +\n `[^\\\\S\\\\n\\\\t]?` +\n `${NUM}` +\n `(?:[.,][^\\\\S\\\\n\\\\t]?(?:\\\\d{1,2}${DASH}?|${DASH}{1,2})?)?\\\\b`,\n );\n }\n\n // Leading multi-char code: \"Kč 10,—\", \"Fr. 500\"\n // Uses the trailing alternation in reverse position.\n if (trailingAlt) {\n patterns.push(\n `\\\\b(?:${trailingAlt})` +\n `[^\\\\S\\\\n\\\\t]{0,2}` +\n `${NUM}` +\n `(?:[.,][^\\\\S\\\\n\\\\t]?(?:\\\\d{1,2}${DASH}?|${DASH}{1,2})?)?\\\\b`,\n );\n }\n\n // Trailing code/name: 100 USD, 1,000.50 CZK,\n // 100000 Kč, 500 korun, 100 Fr.\n // Use (?:\\b|(?=\\s|[.,;!?)]|$)) instead of bare\n // \\b so entries ending in non-word characters\n // (e.g. \"Fr.\") still match at word boundaries.\n if (trailingAlt) {\n patterns.push(\n `\\\\b${NUM}` +\n `(?:[.,][^\\\\S\\\\n\\\\t]?(?:\\\\d{1,2}${DASH}?|${DASH}{1,2})?)?[^\\\\S\\\\n\\\\t]{0,4}` +\n `(?:${trailingAlt})` +\n `(?:\\\\b|(?=\\\\s|[.,;!?)]|$))`,\n );\n }\n\n return patterns;\n};\n\n/** Cached promise for currency patterns. Loaded once. */\nlet currencyPatternPromise:\n | Promise<string[]>\n | null = null;\n\nconst loadCurrencyPatterns =\n async (): Promise<string[]> => {\n const mod = await import(\n \"@stll/anonymize-data/config/currencies.json\"\n );\n const data: CurrenciesData = mod.default ?? mod;\n return buildCurrencyPatterns(data);\n };\n\n/**\n * Get dynamically built monetary amount patterns from\n * currencies.json. Returns a cached promise; the JSON\n * is loaded only once.\n */\nexport const getCurrencyPatterns =\n (): Promise<string[]> => {\n if (!currencyPatternPromise) {\n currencyPatternPromise =\n loadCurrencyPatterns().catch((err) => {\n currencyPatternPromise = null;\n throw err;\n });\n }\n return currencyPatternPromise;\n };\n\n/** Currency pattern metadata (score 0.9). */\nexport const CURRENCY_PATTERN_META: Readonly<RegexMeta> =\n Object.freeze({\n label: \"monetary amount\",\n score: 0.9,\n });\n\n// ── Public API ──────────────────────────────────────\n\n/**\n * Process regex matches from the unified search.\n * Receives all matches; filters to the regex slice\n * via sliceStart/sliceEnd. Local index into META is\n * match.pattern - sliceStart.\n *\n * For stdnum-derived patterns (those with a validator\n * in META), the matched text is passed through the\n * validator's validate() method. If validation fails,\n * the match is discarded as a false positive.\n */\nexport const processRegexMatches = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n meta_: readonly RegexMeta[],\n): Entity[] => {\n const results: Entity[] = [];\n\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n\n const localIdx = idx - sliceStart;\n const meta = meta_[localIdx];\n if (!meta) {\n continue;\n }\n if (\n meta.label === \"phone number\" &&\n match.text.length < MIN_PHONE_LENGTH\n ) {\n continue;\n }\n\n // Post-match validation: if the pattern came from\n // a stdnum validator, compact (strip separators)\n // then validate. The candidate regex may capture\n // spaced/dashed variants that validate() rejects\n // without compaction.\n if (meta.validator) {\n const compacted = meta.validator.compact(\n match.text,\n );\n const result = meta.validator.validate(compacted);\n if (!result.valid) {\n continue;\n }\n }\n\n results.push({\n start: match.start,\n end: match.end,\n label: meta.label,\n text: match.text,\n score: meta.score,\n source: DETECTION_SOURCES.REGEX,\n });\n }\n\n return results;\n};\n\n// ── Dynamic signing clause patterns ────────────────\n\ntype SigningClauseConfig = {\n patterns: Array<{\n lang: string;\n prefix: string;\n suffix: string;\n prepositions: string[];\n }>;\n};\n\n/**\n * Build signing clause place-name patterns from\n * signing-clauses.json. Each pattern captures the\n * city/place name from contract signing locations.\n *\n * The place name sub-pattern:\n * \\p{Lu}\\p{Ll}+ (capitalized word)\n * optionally followed by preposition + capitalized\n * word (for \"nad Nisou\", \"am Main\", etc.)\n * optionally followed by more capitalized words\n * (for \"Hradec Králové\", \"New York\", etc.)\n */\nconst buildSigningClausePatterns = (\n data: SigningClauseConfig,\n): string[] => {\n const patterns: string[] = [];\n\n for (const entry of data.patterns) {\n const prepAlt =\n entry.prepositions.length > 0\n ? entry.prepositions.join(\"|\")\n : null;\n\n // Place name: Uppercase word, optionally with\n // preposition + uppercase, optionally more caps\n const place = prepAlt\n ? `(\\\\p{Lu}\\\\p{Ll}+` +\n `(?:\\\\s+(?:${prepAlt})\\\\s+\\\\p{Lu}\\\\p{Ll}+)*` +\n `(?:\\\\s+\\\\p{Lu}\\\\p{Ll}+)*)`\n : `(\\\\p{Lu}\\\\p{Ll}+(?:[- ]\\\\p{Lu}\\\\p{Ll}+)*)`;\n\n const full =\n `(?:^|\\\\n|[^\\\\S\\\\n])` +\n entry.prefix +\n place +\n (entry.suffix ? `(?:${entry.suffix})` : \"\");\n\n patterns.push(full);\n }\n\n return patterns;\n};\n\nexport const SIGNING_CLAUSE_META: Readonly<RegexMeta> =\n { label: \"address\", score: 0.9 };\n\nlet signingPatternPromise: Promise<string[]> | null =\n null;\n\nconst loadSigningPatterns =\n async (): Promise<string[]> => {\n const mod = await import(\n \"@stll/anonymize-data/config/signing-clauses.json\"\n );\n const data: SigningClauseConfig =\n mod.default ?? mod;\n return buildSigningClausePatterns(data);\n };\n\nexport const getSigningClausePatterns =\n (): Promise<string[]> => {\n if (!signingPatternPromise) {\n signingPatternPromise =\n loadSigningPatterns().catch((err) => {\n signingPatternPromise = null;\n throw err;\n });\n }\n return signingPatternPromise;\n };\n","/**\n * Legal form detection for company/organization names.\n *\n * Detects company names by finding legal form suffixes\n * (s.r.o., GmbH, a.s., etc.) and extending backwards\n * to capture preceding capitalised words.\n *\n * Exports pattern definitions for the unified builder\n * and a match processor for post-processing.\n */\n\nimport type { Match } from \"@stll/text-search\";\n\nimport { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\nimport { DASH_INNER } from \"../util/char-groups\";\n\nconst UPPER =\n \"A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽÄÖÜÀÂÆÇÈÊËÎÏÔÙÛŸÑ\\\\u0130\";\nconst LOWER =\n \"a-záčďéěíňóřšťúůýžäöüßàâæçèêëîïôùûÿñ\\\\u0131\";\nconst CAP_WORD =\n `(?:[${UPPER}]{2,}|[${UPPER}][${LOWER}${UPPER}]+)`;\n// ANY_WORD: mixed-case word, short all-caps token\n// (2-3 chars, e.g. \"CZ\" in \"Metrostav CZ s.r.o.\"),\n// or digit-only token (1-4 digits, e.g. \"2028\" in\n// \"Invest 2028 s.r.o.\" or \"12\" in \"Praha 12 s.r.o.\").\nconst ANY_WORD =\n `(?:[${UPPER}${LOWER}][${LOWER}${UPPER}]+` +\n `|[${UPPER}]{2,3}` +\n `|\\\\d{1,4})`;\n// All-caps word: 2+ uppercase letters, no lowercase.\n// For company names like \"EAGLES BRNO\", max 3 words.\nconst ALLCAP_WORD = `[${UPPER}]{2,}`;\n\nconst ROMAN_NUMERAL_RE =\n /^(?=[IVXLCDM])M{0,3}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})$/;\n\nconst escapeForRegex = (form: string): string =>\n form\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\s+/g, \"\\\\s+\")\n // Use [^\\S\\n]? (optional horizontal whitespace)\n // instead of \\s* to prevent greedy matching across\n // newlines which causes DFA failures in regex-set.\n .replace(/\\\\\\./g, \"\\\\.[^\\\\S\\\\n]?\");\n\nconst isShortForm = (form: string): boolean =>\n form.replace(/[.\\s]/g, \"\").length <= 3 &&\n !form.includes(\" \");\n\nconst buildPatternString = (\n forms: string[],\n requireCapBefore: boolean,\n): string | null => {\n if (forms.length === 0) {\n return null;\n }\n\n const sorted = forms.toSorted(\n (a, b) => b.length - a.length,\n );\n const alt = sorted.map(escapeForRegex).join(\"|\");\n // Allow lowercase connectors between name words:\n // \"a\" (Czech/SK), \"and\", \"und\", \"et\", \"&\", \"e\"\n const CONNECTOR = `(?:[\\\\s&,.${DASH_INNER}]{1,4}|\\\\s+(?:a|and|und|et|e|y|i)\\\\s+)`;\n // Czech state enterprise names can be 7+ words:\n // \"Národní agentura pro komunikační a informační\n // technologie, s. p.\" — need generous limit.\n const prefix =\n `(?:${CAP_WORD})` +\n `(?:${CONNECTOR}(?:${ANY_WORD})){0,10}`;\n const separator = requireCapBefore\n ? `(?:\\\\s+|,\\\\s*)`\n : `\\\\s+`;\n\n return `${prefix}${separator}(?:${alt})(?![${LOWER}])`;\n};\n\n// ── Pattern builder for unified search ──────────────\n\n/**\n * Build legal form regex pattern strings.\n * Returns an array of regex strings for the unified\n * TextSearch builder. Empty if data package is not\n * installed.\n */\nexport const buildLegalFormPatterns = async (): Promise<\n string[]\n> => {\n let data: Record<string, string[]> = {};\n\n try {\n const mod = await import(\n \"@stll/anonymize-data/config/legal-forms.json\"\n );\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON module shape\n data = (\n mod as { default: Record<string, string[]> }\n ).default;\n } catch {\n return [];\n }\n\n const allForms: string[] = [];\n const seen = new Set<string>();\n\n for (const forms of Object.values(data)) {\n for (const form of forms) {\n const key = form.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n allForms.push(form);\n }\n }\n }\n\n const patterns: string[] = [];\n\n const longPattern = buildPatternString(\n allForms.filter((f) => !isShortForm(f)),\n false,\n );\n if (longPattern) {\n patterns.push(longPattern);\n }\n\n const shortPattern = buildPatternString(\n allForms.filter(isShortForm),\n true,\n );\n if (shortPattern) {\n patterns.push(shortPattern);\n }\n\n // All-caps company names: \"EAGLES BRNO, z.s.\"\n // Up to 3 all-caps words before any legal form.\n // Uses all forms (both long and short).\n const allcapPrefix =\n `(?:${ALLCAP_WORD})` +\n `(?:[\\\\s&,.${DASH_INNER}]{1,4}(?:${ALLCAP_WORD})){0,2}`;\n const allcapAlt = allForms\n .toSorted((a, b) => b.length - a.length)\n .map(escapeForRegex)\n .join(\"|\");\n patterns.push(\n `${allcapPrefix}(?:\\\\s+|,\\\\s*)` +\n `(?:${allcapAlt})(?![${LOWER}])`,\n );\n\n return patterns;\n};\n\n// ── Match processor ─────────────────────────────────\n\n/**\n * Process legal form matches from the unified search.\n * Receives all matches; filters to the legal forms\n * slice via sliceStart/sliceEnd.\n */\nexport const processLegalFormMatches = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText?: string,\n): Entity[] => {\n const results: Entity[] = [];\n\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n\n const text = match.text.trimEnd();\n if (text.length < 5) {\n continue;\n }\n\n if (text.includes(\"\\n\")) {\n continue;\n }\n\n // Reject all-caps matches only if the entire\n // surrounding line is all-caps (section headings\n // like \"KUPNÍ SMLOUVA\"). If only the company name\n // is all-caps (\"uzavřená s EAGLES BRNO, z.s.\"),\n // keep it — max 3 all-caps words are allowed.\n const prefixEnd =\n text.lastIndexOf(\",\") !== -1\n ? text.lastIndexOf(\",\")\n : text.lastIndexOf(\" \");\n const prefixPart =\n prefixEnd > 0\n ? text\n .slice(0, prefixEnd)\n .replace(/[^a-zA-ZÀ-ž]/g, \"\")\n : text.replace(/[^a-zA-ZÀ-ž]/g, \"\");\n const isAllCapsMatch =\n prefixPart.length > 2 &&\n prefixPart === prefixPart.toUpperCase();\n\n if (isAllCapsMatch && fullText) {\n // Check: is the surrounding line also all-caps?\n const lineStart = fullText.lastIndexOf(\n \"\\n\",\n match.start,\n );\n const lineEnd = fullText.indexOf(\n \"\\n\",\n match.end,\n );\n const line = fullText.slice(\n lineStart + 1,\n lineEnd === -1 ? fullText.length : lineEnd,\n );\n const lineLetters = line.replace(\n /[^a-zA-ZÀ-ž]/g,\n \"\",\n );\n const upperCount = [...lineLetters].filter(\n (c) => c === c.toUpperCase(),\n ).length;\n const lineIsAllCaps =\n lineLetters.length > 5 &&\n upperCount / lineLetters.length >= 0.95;\n if (lineIsAllCaps) {\n // Entire line is all-caps → heading, skip\n continue;\n }\n // Only the company name is all-caps → keep it\n // (but limit to 3 words in prefix)\n const wordCount =\n prefixPart.length > 0\n ? text\n .slice(0, prefixEnd > 0 ? prefixEnd : text.length)\n .trim()\n .split(/\\s+/).length\n : 0;\n if (wordCount > 3) {\n continue;\n }\n } else if (isAllCapsMatch) {\n // No fullText available — fall back to rejecting\n continue;\n }\n\n // Reject Roman numeral suffixes\n const lastSpace = text.lastIndexOf(\" \");\n const rawSuffix =\n lastSpace !== -1\n ? text.slice(lastSpace + 1)\n : \"\";\n const suffixClean = rawSuffix.replace(/[.,]/g, \"\");\n if (\n suffixClean.length > 0 &&\n ROMAN_NUMERAL_RE.test(suffixClean)\n ) {\n continue;\n }\n\n // Short ASCII-only suffixes (NA, PA, LP, PC) are\n // US-specific. Reject if the prefix contains non-\n // ASCII chars (Czech/Slovak diacritics) — a US\n // legal entity wouldn't have \"ÚČASTI MSP NA\".\n // Test for dots in the raw suffix (before dot\n // stripping) to protect Czech dotted forms like\n // \"a.s.\" and \"k.s.\".\n if (\n suffixClean.length <= 2 &&\n !/\\./.test(rawSuffix) &&\n /[^\\x00-\\x7F]/.test(\n text.slice(\n 0,\n lastSpace !== -1 ? lastSpace : text.length,\n ),\n )\n ) {\n continue;\n }\n\n // Definitive legal forms (s.r.o., a.s., GmbH, etc.)\n // get score 0.95 to beat person names in dedup.\n results.push({\n start: match.start,\n end: match.start + text.length,\n label: \"organization\",\n text,\n score: 0.95,\n source: DETECTION_SOURCES.LEGAL_FORM,\n });\n }\n\n return results;\n};\n","/**\n * Known legal form suffixes. Shared between trigger\n * detection (reclassification) and org-propagation\n * (suffix stripping). Within each family of related\n * forms, longer variants come first so that\n * \"spol. s r.o.\" matches before \"s.r.o.\" and\n * \"s. r. o.\" matches before \"s.r.o.\".\n */\nexport const LEGAL_SUFFIXES = [\n \"spol. s r.o.\",\n \"s.r.o.\",\n \"s. r. o.\",\n \"a.s.\",\n \"a. s.\",\n \"v.o.s.\",\n \"v. o. s.\",\n \"k.s.\",\n \"k. s.\",\n \"z.s.\",\n \"z. s.\",\n \"z.ú.\",\n \"z. ú.\",\n \"o.p.s.\",\n \"o. p. s.\",\n \"s.p.\",\n \"s. p.\",\n \"GmbH\",\n \"AG\",\n \"SE\",\n \"KG\",\n \"OHG\",\n \"Ltd.\",\n \"Ltd\",\n \"LLC\",\n \"LLP\",\n \"Inc.\",\n \"S.A.\",\n \"SA\",\n \"SAS\",\n \"SARL\",\n \"Sp. z o.o.\",\n \"S.p.A.\",\n] as const;\n","import type { Match } from \"@stll/text-search\";\n\nimport { DETECTION_SOURCES } from \"../types\";\nimport type {\n CompiledValidation,\n Entity,\n TriggerGroupConfig,\n TriggerRule,\n TriggerValidation,\n} from \"../types\";\nimport { POST_NOMINALS } from \"../config/titles\";\nimport { LEGAL_SUFFIXES } from \"../config/legal-forms\";\nimport { loadLanguageConfigs } from \"../util/lang-loader\";\nimport { DASH } from \"../util/char-groups\";\n\nconst TRIGGER_SCORE = 0.95;\nconst WHITESPACE_RE = /\\s+/;\nconst LETTER_RE = /\\p{L}/u;\n/**\n * Decimal-comma pattern: comma followed by digit or\n * dash notation (\"0,05%\", \"1.529,50 Kč\", \"98.000,- Kč\").\n */\nconst DECIMAL_COMMA_RE = new RegExp(\n `^,(?:\\\\d|${DASH}{1,2})`,\n);\n\n/**\n * Post-nominal degree regex. When a comma-stop is\n * followed by a known post-nominal (Ph.D., CSc., MBA\n * etc.), skip the comma and degree, then continue.\n */\nconst POST_NOMINAL_RE = new RegExp(\n `^,\\\\s*(?:${POST_NOMINALS.toSorted(\n (a, b) => b.length - a.length,\n )\n .map((d) =>\n d\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\\\\\./g, \"\\\\.\\\\s*\"),\n )\n .join(\"|\")})\\\\.?`,\n \"i\",\n);\n\n// Definitive legal form suffixes (case-sensitive).\n// When a person-labeled trigger captures text containing\n// one of these, the entity is reclassified as\n// \"organization\". No \"i\" flag: short uppercase-only\n// forms (SE, SA, AG) must NOT match Czech/Slovak\n// reflexive pronouns \"se\", \"sa\" which appear in\n// person-trigger captures like\n// \"Ing. Jan Novák, se sídlem...\".\nconst DEFINITIVE_LEGAL_FORMS = LEGAL_SUFFIXES;\n// Build case-sensitive regex. Short dot-free forms\n// (AG, SE, KG) get word boundaries to prevent substring\n// matches. All forms are uppercase in the list; the\n// regex is case-sensitive so \"se\"/\"sa\" won't match.\nconst LEGAL_FORM_CHECK_RE = new RegExp(\n DEFINITIVE_LEGAL_FORMS.map((f) => {\n const escaped = f\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\\\\\./g, \"\\\\.\\\\s*\");\n const isDotFree = !f.includes(\".\");\n const isShort = f.length <= 4;\n return isDotFree && isShort\n ? `\\\\b${escaped}\\\\b`\n : escaped;\n }).join(\"|\"),\n);\n\n// ── Validation compilation ─────────────────────────\n\nconst compileValidations = (\n validations: TriggerValidation[],\n): CompiledValidation[] =>\n validations.map((v): CompiledValidation => {\n switch (v.type) {\n case \"starts-uppercase\":\n return {\n type: \"starts-uppercase\",\n re: /^\\p{Lu}/u,\n };\n case \"min-length\":\n return { type: \"min-length\", min: v.min };\n case \"max-length\":\n return { type: \"max-length\", max: v.max };\n case \"no-digits\":\n return { type: \"no-digits\", re: /\\d/ };\n case \"has-digits\":\n return { type: \"has-digits\", re: /\\d/ };\n case \"matches-pattern\":\n return {\n type: \"matches-pattern\",\n // Strip g/y flags: the compiled regex is shared\n // across all rules in the group and must be\n // stateless (no lastIndex advancement).\n re: new RegExp(\n v.pattern,\n (v.flags ?? \"\").replace(/[gy]/g, \"\"),\n ),\n };\n default: {\n // TriggerValidation is a public export; custom\n // configs may bypass the build-time validator.\n const _exhaustive: never = v;\n throw new Error(\n `Unknown validation type: ${JSON.stringify(_exhaustive)}`,\n );\n }\n }\n });\n\nconst applyValidations = (\n text: string,\n validations: CompiledValidation[],\n): boolean => {\n for (const v of validations) {\n switch (v.type) {\n case \"starts-uppercase\":\n if (!v.re.test(text)) return false;\n break;\n case \"min-length\":\n if (text.length < v.min) return false;\n break;\n case \"max-length\":\n if (text.length > v.max) return false;\n break;\n case \"no-digits\":\n if (v.re.test(text)) return false;\n break;\n case \"has-digits\":\n if (!v.re.test(text)) return false;\n break;\n case \"matches-pattern\":\n if (!v.re.test(text)) return false;\n break;\n default: {\n const _exhaustive: never = v;\n throw new Error(\n `Unknown compiled validation type: ${JSON.stringify(_exhaustive)}`,\n );\n }\n }\n }\n return true;\n};\n\n// ── Trigger expansion ──────────────────────────────\n\nconst expandTriggerGroups = (\n groups: TriggerGroupConfig[],\n): TriggerRule[] => {\n const rules: TriggerRule[] = [];\n for (const group of groups) {\n const extensions = group.extensions ?? [];\n const compiled = compileValidations(\n group.validations ?? [],\n );\n\n // Generate trigger variants from the original\n // trigger strings. Extensions are applied once to\n // the base set only (not combinatorially); e.g.,\n // [\"add-colon\", \"normalize-spaces\"] produces\n // \"trigger:\", \"trigger\\u00A0\", but NOT\n // \"trigger\\u00A0:\". This is intentional to avoid\n // exponential variant growth.\n const allTriggers = new Set(group.triggers);\n for (const trigger of group.triggers) {\n if (\n extensions.includes(\"add-colon\") &&\n !trigger.endsWith(\":\")\n )\n allTriggers.add(`${trigger}:`);\n if (\n extensions.includes(\"add-trailing-space\") &&\n !trigger.endsWith(\" \")\n )\n allTriggers.add(`${trigger} `);\n if (\n extensions.includes(\"add-colon-space\") &&\n !trigger.endsWith(\": \") &&\n !trigger.endsWith(\":\")\n )\n allTriggers.add(`${trigger}: `);\n if (extensions.includes(\"normalize-spaces\")) {\n if (trigger.includes(\" \")) {\n allTriggers.add(\n trigger.replace(/ /g, \"\\u00A0\"),\n );\n }\n }\n }\n\n const includeTrigger =\n group.includeTrigger ?? false;\n\n for (const trigger of allTriggers) {\n rules.push({\n trigger,\n label: group.label,\n strategy: group.strategy,\n validations: compiled,\n includeTrigger,\n });\n }\n }\n return rules;\n};\n\n// ── Pattern builder for unified search ──────────────\n\n/**\n * Build trigger patterns and rules from data configs.\n * Returns string[] for the unified TextSearch\n * builder and the parallel rules array.\n */\nexport const buildTriggerPatterns = async (): Promise<{\n patterns: string[];\n rules: TriggerRule[];\n}> => {\n const rules: TriggerRule[] = [];\n\n const allGroups = await loadLanguageConfigs<\n readonly TriggerGroupConfig[]\n >(\n \"triggers\",\n (mod) => {\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON config\n const m = mod as {\n default?: readonly TriggerGroupConfig[];\n };\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON config\n return (m.default ?? mod) as\n readonly TriggerGroupConfig[];\n },\n );\n for (const groups of allGroups) {\n if (!Array.isArray(groups)) {\n console.warn(\n \"[anonymize] triggers: unexpected \" +\n \"config shape, skipping\",\n );\n continue;\n }\n rules.push(\n ...expandTriggerGroups(\n groups as TriggerGroupConfig[],\n ),\n );\n }\n\n // Load global triggers (language-agnostic)\n try {\n const globalMod = await import(\n \"@stll/anonymize-data/config/triggers.global.json\"\n );\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON config\n const globalGroups = (\n (globalMod as { default?: unknown }).default ??\n globalMod\n ) as TriggerGroupConfig[];\n if (Array.isArray(globalGroups)) {\n rules.push(\n ...expandTriggerGroups(globalGroups),\n );\n }\n } catch (err) {\n // Only suppress \"module not found\"; re-throw\n // other errors (JSON parse, etc.).\n if (\n !(err instanceof Error) ||\n !err.message.includes(\"Cannot find module\")\n ) {\n throw err;\n }\n }\n\n // Warn about cross-group trigger duplicates.\n // Duplicates cause redundant AC matches but are\n // not fatal (mergeAndDedup handles overlap).\n const seen = new Map<\n string,\n { label: string; strategy: string }\n >();\n for (const rule of rules) {\n const key = rule.trigger.toLowerCase();\n const prev = seen.get(key);\n if (prev !== undefined) {\n const labelDiff = prev.label !== rule.label;\n const stratDiff =\n prev.strategy !== rule.strategy.type;\n if (labelDiff || stratDiff) {\n console.warn(\n `[anonymize] duplicate trigger` +\n ` \"${rule.trigger}\":` +\n (labelDiff\n ? ` labels \"${prev.label}\" vs` +\n ` \"${rule.label}\"`\n : \"\") +\n (stratDiff\n ? ` strategies \"${prev.strategy}\" vs` +\n ` \"${rule.strategy.type}\"`\n : \"\"),\n );\n }\n }\n seen.set(key, {\n label: rule.label,\n strategy: rule.strategy.type,\n });\n }\n\n // Build patterns from lowercased trigger strings.\n // rules[i] corresponds to patterns[i].\n // Plain lowercased strings — the unified builder\n // sets caseInsensitive globally on the AC.\n const patterns: string[] = rules.map((r) =>\n r.trigger.toLowerCase(),\n );\n\n return { patterns, rules };\n};\n\n// ── Value extraction ────────────────────────────────\n\nconst LEADING_PUNCT = /^[„\"\"»«'\"()\\s]+/;\nconst TRAILING_PUNCT = /[\"\"»«'\"()\\s]+$/;\n\nconst stripQuotes = (value: {\n start: number;\n end: number;\n text: string;\n}): {\n start: number;\n end: number;\n text: string;\n} | null => {\n const leadingMatch = LEADING_PUNCT.exec(value.text);\n const leadingLen = leadingMatch\n ? leadingMatch[0].length\n : 0;\n const stripped = value.text\n .slice(leadingLen)\n .replace(TRAILING_PUNCT, \"\");\n if (stripped.length === 0) {\n return null;\n }\n return {\n start: value.start + leadingLen,\n end: value.start + leadingLen + stripped.length,\n text: stripped,\n };\n};\n\n/** Hard stop characters for to-next-comma scanning. */\nconst COMMA_STOP_CHARS = new Set([\"\\n\", \"(\"]);\n\n/**\n * Field-label keywords that terminate address scanning.\n * When a comma in the address strategy is followed by\n * one of these, the address stops before the keyword.\n */\nconst ADDRESS_STOP_KEYWORDS = [\n \"číslo účtu\",\n \"registrační\",\n \"zastoupen\",\n \"bankovní\",\n \"e-mail\",\n \"telefon\",\n \"jednatel\",\n \"ředitel\",\n \"datová\",\n \"vložka\",\n \"sp.zn.\",\n \"oddíl\",\n \"swift\",\n \"email\",\n \"iban\",\n \"dič\",\n \"ičo\",\n \"tel\",\n \"č.ú.\",\n \"bic\",\n \"ič\",\n];\n\nconst extractValue = (\n text: string,\n triggerEnd: number,\n strategy: TriggerRule[\"strategy\"],\n label?: string,\n): {\n start: number;\n end: number;\n text: string;\n} | null => {\n const remaining = text.slice(triggerEnd);\n // Strip leading whitespace, colons, semicolons —\n // triggers are often followed by \": \\t\\t\\t\" in\n // formatted documents.\n const stripped = remaining.replace(\n /^[\\s:;]+/,\n \"\",\n );\n const trimmedOffset =\n remaining.length - stripped.length;\n const valueStart = triggerEnd + trimmedOffset;\n const valueText = stripped;\n\n if (valueText.length === 0) {\n return null;\n }\n\n switch (strategy.type) {\n case \"to-next-comma\": {\n // Stop at comma, newline, or opening parenthesis.\n // Parens mark defined-term clauses in legal text\n // (e.g., \"(dále jen ...)\") and should not be\n // captured as part of a name/address.\n // When a comma is followed by a known post-nominal\n // degree (Ph.D., CSc., MBA), skip it and continue\n // so \"RNDr. Filipem Hartvichem, Ph.D., CSc.\"\n // captures the full name with degrees.\n let end = 0;\n let foundStop = false;\n\n while (end < valueText.length) {\n const ch = valueText[end];\n // Hard stops: newline, paren, tab\n if (\n ch !== undefined &&\n COMMA_STOP_CHARS.has(ch)\n ) {\n foundStop = true;\n break;\n }\n // Comma: for person triggers, check if followed\n // by a post-nominal degree (Ph.D., CSc.) and\n // skip past it. Non-person triggers stop here.\n if (ch === \",\") {\n const afterComma = valueText.slice(end);\n // Decimal separator: comma followed by digit or\n // dash notation (\"0,05%\", \"1.529,50 Kč\",\n // \"98.000,- Kč\", \"98.000,-- Kč\")\n if (DECIMAL_COMMA_RE.test(afterComma)) {\n end++;\n continue;\n }\n const degreeMatch =\n label === \"person\"\n ? POST_NOMINAL_RE.exec(afterComma)\n : null;\n if (degreeMatch) {\n // Skip the comma + degree, continue scan\n end += degreeMatch[0].length;\n continue;\n }\n // Regular comma — stop here\n foundStop = true;\n break;\n }\n end++;\n }\n\n // Only cap at 100 chars when no stop char was\n // found (fallback for unterminated values). When\n // a stop char exists, respect its position even\n // if > 100.\n if (!foundStop) {\n end = Math.min(end, 100);\n }\n\n const rawSlice = valueText.slice(0, end);\n const extracted = rawSlice.trim();\n if (extracted.length === 0) {\n return null;\n }\n const trailingSpaces =\n rawSlice.length - rawSlice.trimEnd().length;\n return {\n start: valueStart,\n end: valueStart + end - trailingSpaces,\n text: extracted,\n };\n }\n\n case \"to-end-of-line\": {\n // Stop at newline or tab (tab separates cells\n // in DOCX table rows).\n const LINE_STOPS = [\"\\n\"];\n let end = valueText.length;\n for (const ch of LINE_STOPS) {\n const idx = valueText.indexOf(ch);\n if (idx !== -1 && idx < end) {\n end = idx;\n }\n }\n const rawSlice = valueText.slice(0, end);\n const extracted = rawSlice.trim();\n if (extracted.length === 0) {\n return null;\n }\n const trailingSpaces =\n rawSlice.length - rawSlice.trimEnd().length;\n return {\n start: valueStart,\n end: valueStart + end - trailingSpaces,\n text: extracted,\n };\n }\n\n case \"n-words\": {\n // Respect tab as a cell boundary (DOCX table\n // rows use tabs between columns).\n const tabIdx = valueText.indexOf(\"\\t\");\n const cellText =\n tabIdx !== -1\n ? valueText.slice(0, tabIdx)\n : valueText;\n // Skip punctuation-only tokens (colons, dashes)\n // so \"datová schránka : hsaxra8\" captures\n // \"hsaxra8\" not \":\"\n const PUNCT_ONLY = /^[\\p{P}\\p{S}]+$/u;\n const allTokens = cellText.split(WHITESPACE_RE);\n const words = allTokens\n .filter((w) => !PUNCT_ONLY.test(w))\n .slice(0, strategy.count);\n if (words.length === 0) {\n return null;\n }\n // Find span of the first real word\n const firstWord = words[0];\n if (firstWord === undefined) {\n return null;\n }\n const firstIdx = cellText.indexOf(firstWord);\n let actualEnd = firstIdx + firstWord.length;\n // If multiple words, extend to last one\n let searchPos = actualEnd;\n for (let wi = 1; wi < words.length; wi++) {\n const w = words[wi];\n if (w === undefined) {\n break;\n }\n const wIdx = cellText.indexOf(w, searchPos);\n if (wIdx === -1) break;\n actualEnd = wIdx + w.length;\n searchPos = actualEnd;\n }\n return {\n start: valueStart + firstIdx,\n end: valueStart + actualEnd,\n text: cellText.slice(firstIdx, actualEnd),\n };\n }\n\n case \"company-id-value\": {\n // Work from the raw remaining text (before the\n // upstream trimStart) so we can require at least\n // a colon or whitespace separator between the\n // keyword and value (e.g., \"IČO: 12345678\" or\n // \"IČO 12345678\", but not \"IČO12345678\").\n const raw = text.slice(triggerEnd);\n const sepMatch = /^(?:\\s*:\\s*|\\s+)/.exec(raw);\n if (!sepMatch) {\n return null;\n }\n const afterSep = raw.slice(sepMatch[0].length);\n const idMatch =\n /^[A-Z]{0,6}\\s?\\d[\\d\\s\\-/]{4,}/i.exec(afterSep);\n if (!idMatch) {\n return null;\n }\n const idText = idMatch[0].trim();\n const leadingSpaces =\n idMatch[0].length -\n idMatch[0].trimStart().length;\n const idStart =\n triggerEnd +\n sepMatch[0].length +\n // idMatch.index is always 0 (anchored ^ regex)\n leadingSpaces;\n return {\n start: idStart,\n end: idStart + idText.length,\n text: idText,\n };\n }\n\n case \"address\": {\n // Walk through comma-separated segments.\n // Continue through a comma if the next segment\n // starts with a digit (PSČ like \"110 00\") or\n // an uppercase letter (city like \"Praha\").\n // Stop at: newline, opening paren \"(\", tab,\n // or a period that is NOT an abbreviation\n // (abbreviation = period followed by a space\n // and a lowercase letter, e.g. \"nábř. \").\n const maxLen = strategy.maxChars ?? 120;\n const UPPER_RE = /\\p{Lu}/u;\n let end = 0;\n\n while (end < valueText.length && end < maxLen) {\n const ch = valueText[end];\n\n // Hard stops: newline, opening paren.\n // Tabs are NOT hard stops — they appear as\n // formatting in structured documents between\n // trigger and value.\n if (ch === \"\\n\" || ch === \"(\") {\n break;\n }\n\n // Period: stop unless it's an abbreviation.\n // Abbreviation patterns in Czech addresses:\n // \"nábř. Kpt.\" — period + space + letter\n // \"č.p.\" — period + letter (no space)\n // \"1000/7.\" — period at end of address\n if (ch === \".\") {\n const next = valueText[end + 1];\n const afterNext = valueText[end + 2];\n // \"č.p.\" or \"Kpt.J\" — period immediately\n // followed by letter or digit\n if (\n next !== undefined &&\n (/\\p{L}/u.test(next) || /\\d/.test(next))\n ) {\n end++;\n continue;\n }\n // \"nábř. Kpt.\" or \"ul. nová\" — period +\n // space + any letter or digit. In address\n // context, this is always an abbreviation,\n // not end of sentence.\n if (\n next === \" \" &&\n afterNext !== undefined &&\n (/\\p{L}/u.test(afterNext) ||\n /\\d/.test(afterNext))\n ) {\n end++;\n continue;\n }\n // Period at end of address — stop but\n // don't include the period\n break;\n }\n\n // Comma: look ahead to see if address continues\n if (ch === \",\") {\n // Skip comma + whitespace, check next char\n let peek = end + 1;\n while (\n peek < valueText.length &&\n (valueText[peek] === \" \" ||\n valueText[peek] === \"\\t\")\n ) {\n peek++;\n }\n const peekCh = valueText[peek];\n if (peekCh === undefined) {\n break;\n }\n // Check for field-label keywords after\n // comma before continuing. Keywords like\n // \"IČ\", \"DIČ\" start new fields.\n const afterComma = valueText\n .slice(end + 1)\n .trimStart()\n .toLowerCase();\n const hitsKeyword =\n ADDRESS_STOP_KEYWORDS.some((kw) => {\n if (!afterComma.startsWith(kw))\n return false;\n // Guard: next char must be a delimiter\n // or digit to avoid truncating city\n // names like \"Telč\" on \"tel\". Digits\n // are included so \"IČ25672541\" (no\n // space) still triggers a stop.\n const next = afterComma[kw.length];\n return (\n next === undefined ||\n /[\\s:;.,!?()\\d]/.test(next)\n );\n });\n if (hitsKeyword) {\n break;\n }\n // Continue if next segment starts with\n // digit (PSČ) or uppercase (city name)\n if (\n /\\d/.test(peekCh) ||\n UPPER_RE.test(peekCh)\n ) {\n end++;\n continue;\n }\n // Otherwise stop at this comma\n break;\n }\n\n end++;\n }\n\n // When the loop stopped at maxLen, trim back to\n // the last word boundary so fixPartialWords does\n // not extend the entity beyond the configured max.\n if (end >= maxLen) {\n const lastSpace = valueText.lastIndexOf(\n \" \",\n end - 1,\n );\n if (lastSpace > 0) {\n end = lastSpace;\n }\n }\n\n const rawSlice = valueText.slice(0, end);\n const extracted = rawSlice.trim();\n if (extracted.length === 0) {\n return null;\n }\n const trailingSpaces =\n rawSlice.length - rawSlice.trimEnd().length;\n return {\n start: valueStart,\n end: valueStart + end - trailingSpaces,\n text: extracted,\n };\n }\n\n default:\n return null;\n }\n};\n\n// ── Match processor ─────────────────────────────────\n\n/**\n * Process trigger matches from the unified search.\n * Receives all matches; filters to the trigger slice\n * via sliceStart/sliceEnd. Uses fullText for value\n * extraction (the unified search runs on lowercased\n * text, but extraction needs original casing).\n */\nexport const processTriggerMatches = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText: string,\n rules: readonly TriggerRule[],\n): Entity[] => {\n const results: Entity[] = [];\n\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n\n const localIdx = idx - sliceStart;\n\n // Left word-boundary: reject if preceded by a\n // letter (prevents partial keyword matches).\n if (\n match.start > 0 &&\n LETTER_RE.test(fullText[match.start - 1] ?? \"\")\n ) {\n continue;\n }\n\n const rule = rules[localIdx];\n if (!rule) {\n continue;\n }\n\n // Right word-boundary: reject if followed by a\n // letter — but skip this check when the trigger\n // itself ends with whitespace (e.g., \"pan \",\n // \"město \") since the trailing space already\n // acts as a boundary delimiter.\n if (\n !rule.trigger.endsWith(\" \") &&\n LETTER_RE.test(fullText[match.end] ?? \"\")\n ) {\n continue;\n }\n\n const triggerEnd = match.end;\n const rawValue = extractValue(\n fullText,\n triggerEnd,\n rule.strategy,\n rule.label,\n );\n const value = rawValue\n ? stripQuotes(rawValue)\n : null;\n\n if (value) {\n // Apply declarative validations to the captured\n // value text (not the full entity including\n // trigger). This is intentional: validations\n // like min-length should test the extracted\n // value, not the trigger keyword itself.\n if (\n !applyValidations(\n value.text,\n rule.validations,\n )\n ) {\n continue;\n }\n\n // When includeTrigger is set, the entity span\n // starts at the trigger match, not the value.\n const entityStart = rule.includeTrigger\n ? match.start\n : value.start;\n const entityEnd = value.end;\n const entityText = fullText.slice(\n entityStart,\n entityEnd,\n );\n\n // Legal form reclassification: any person-labeled\n // trigger whose captured text contains a definitive\n // legal form suffix is reclassified as organization.\n // This is universal — every person with a legal form\n // is an organisation, no per-group config needed.\n const effectiveLabel =\n rule.label === \"person\" &&\n LEGAL_FORM_CHECK_RE.test(entityText)\n ? \"organization\"\n : rule.label;\n\n results.push({\n start: entityStart,\n end: entityEnd,\n label: effectiveLabel,\n text: entityText,\n score: TRIGGER_SCORE,\n source: DETECTION_SOURCES.TRIGGER,\n });\n }\n }\n\n return results;\n};\n\n// Re-export for testing\nexport {\n expandTriggerGroups,\n compileValidations,\n applyValidations,\n};\n","/**\n * Geographic regions and country code mappings for\n * scoping deny list dictionaries.\n */\n\nexport const REGIONS = {\n Global: null,\n International: null,\n Europe: [\n \"AL\",\n \"AD\",\n \"AT\",\n \"BE\",\n \"BA\",\n \"BG\",\n \"HR\",\n \"CY\",\n \"CZ\",\n \"DK\",\n \"EE\",\n \"FI\",\n \"FR\",\n \"DE\",\n \"GR\",\n \"HU\",\n \"IS\",\n \"IE\",\n \"IT\",\n \"XK\",\n \"LV\",\n \"LI\",\n \"LT\",\n \"LU\",\n \"MD\",\n \"ME\",\n \"MK\",\n \"MT\",\n \"MC\",\n \"NL\",\n \"NO\",\n \"PL\",\n \"PT\",\n \"RO\",\n \"RS\",\n \"SK\",\n \"SI\",\n \"ES\",\n \"SE\",\n \"CH\",\n \"UA\",\n \"GB\",\n ],\n Americas: [\n \"US\",\n \"CA\",\n \"MX\",\n \"BR\",\n \"AR\",\n \"CL\",\n \"CO\",\n \"PE\",\n \"EC\",\n \"VE\",\n \"UY\",\n \"PY\",\n \"BO\",\n \"CR\",\n \"PA\",\n \"DO\",\n \"GT\",\n \"HN\",\n \"SV\",\n \"NI\",\n \"CU\",\n ],\n AsiaPacific: [\n \"AU\",\n \"NZ\",\n \"JP\",\n \"KR\",\n \"CN\",\n \"TW\",\n \"SG\",\n \"MY\",\n \"TH\",\n \"VN\",\n \"PH\",\n \"ID\",\n \"IN\",\n \"PK\",\n \"BD\",\n \"LK\",\n \"NP\",\n \"HK\",\n \"MO\",\n ],\n MENA: [\n \"AE\",\n \"SA\",\n \"IL\",\n \"TR\",\n \"EG\",\n \"JO\",\n \"LB\",\n \"IQ\",\n \"IR\",\n \"QA\",\n \"KW\",\n \"BH\",\n \"OM\",\n \"MA\",\n \"TN\",\n \"DZ\",\n \"LY\",\n \"SY\",\n \"YE\",\n \"PS\",\n ],\n SubSaharanAfrica: [\n \"ZA\",\n \"NG\",\n \"KE\",\n \"GH\",\n \"TZ\",\n \"ET\",\n \"SN\",\n \"CI\",\n \"CM\",\n \"UG\",\n \"RW\",\n \"MZ\",\n \"AO\",\n \"ZW\",\n \"BW\",\n \"NA\",\n \"MU\",\n ],\n EU: [\n \"AT\",\n \"BE\",\n \"BG\",\n \"HR\",\n \"CY\",\n \"CZ\",\n \"DK\",\n \"EE\",\n \"FI\",\n \"FR\",\n \"DE\",\n \"GR\",\n \"HU\",\n \"IE\",\n \"IT\",\n \"LV\",\n \"LT\",\n \"LU\",\n \"MT\",\n \"NL\",\n \"PL\",\n \"PT\",\n \"RO\",\n \"SK\",\n \"SI\",\n \"ES\",\n \"SE\",\n ],\n DACH: [\"DE\", \"AT\", \"CH\"],\n Nordics: [\"DK\", \"SE\", \"NO\", \"FI\", \"IS\"],\n CEE: [\"CZ\", \"SK\", \"PL\", \"HU\", \"RO\", \"BG\", \"HR\", \"SI\", \"LT\", \"LV\", \"EE\"],\n Anglosphere: [\"GB\", \"US\", \"CA\", \"AU\", \"NZ\", \"IE\"],\n Benelux: [\"BE\", \"NL\", \"LU\"],\n GulfStates: [\"AE\", \"SA\", \"QA\", \"KW\", \"BH\", \"OM\"],\n SouthAsia: [\"IN\", \"PK\", \"BD\", \"LK\", \"NP\"],\n EastAsia: [\"CN\", \"JP\", \"KR\", \"TW\"],\n SoutheastAsia: [\"SG\", \"MY\", \"TH\", \"VN\", \"PH\", \"ID\"],\n Oceania: [\"AU\", \"NZ\"],\n} as const;\n\nexport type RegionId = keyof typeof REGIONS;\n\ntype RegionArrays = {\n [K in RegionId]: (typeof REGIONS)[K];\n};\n\ntype NonNullRegion = {\n [K in RegionId as RegionArrays[K] extends null ? never : K]: RegionArrays[K];\n};\n\nexport type CountryCode = NonNullRegion[keyof NonNullRegion][number];\n\n/**\n * Expand region names to country codes and merge with\n * explicit country codes. Returns null when both inputs\n * are empty/undefined (meaning \"match all countries\").\n */\nexport const resolveCountries = (\n regions?: string[],\n countries?: string[],\n): Set<string> | null => {\n const hasRegions = regions && regions.length > 0;\n const hasCountries = countries && countries.length > 0;\n\n if (!hasRegions && !hasCountries) {\n return null;\n }\n\n const result = new Set<string>();\n\n const isRegion = (name: string): name is RegionId => name in REGIONS;\n\n if (hasRegions) {\n for (const name of regions) {\n if (!isRegion(name)) {\n continue;\n }\n const codes = REGIONS[name];\n if (codes === null) {\n // Global/International: return null (all)\n return null;\n }\n for (const code of codes) {\n result.add(code);\n }\n }\n }\n\n if (hasCountries) {\n for (const code of countries) {\n result.add(code);\n }\n }\n\n return result;\n};\n","import type { Entity } from \"../types\";\nimport type { PipelineContext } from \"../context\";\nimport { defaultContext } from \"../context\";\n\nconst TEMPLATE_PLACEHOLDER_RE =\n /^(?:\\.{3,}|_{3,}|\\[[\\w\\s]+\\]|\\{[\\w\\s]+\\})$/;\n\n// Patterns that indicate a genuine address (not prose).\nconst POSTAL_CODE_RE = /\\d{3}\\s?\\d{2}/;\nconst HAS_DIGIT_RE = /\\d/;\nconst ADDRESS_COMPONENTS_RE =\n /(?:^|\\s)(?:ul\\.|ulice|nám\\.|náměstí|tř\\.|třída|nábř\\.|nábřeží|č\\.p\\.|č\\.ev\\.|č\\.|sídliště|bulvár)(?=[\\s,./]|$)/i;\n\n// Jurisdiction patterns: \"State of X\", \"Commonwealth of X\",\n// \"District of X\", \"Territory of X\"\n// — valid address entities without digits or street words.\nconst JURISDICTION_RE =\n /^(?:state|commonwealth|district|territory)\\s+of\\s+/i;\n\n// Max entity text length by label. Prevents runaway\n// trigger extractions (e.g., \"město Dobříš i okolních\n// obcí...\") from producing absurdly long entities.\nconst MAX_ENTITY_LENGTH: Partial<Record<string, number>> =\n {\n organization: 80,\n person: 60,\n };\n// Section/clause numbers: \"§ 3\", \"3.2.1\", \"12.\" but NOT\n// dates like \"4.3.2026\" or long digit strings like IČO.\n// A section number has 1-3 digit groups of 1-3 digits each,\n// never ending with a 4-digit group (that's a year).\nconst SECTION_NUMBER_RE =\n /^(?:§\\s*)?\\d{1,3}(?:\\.\\d{1,3}){0,4}\\.?$/;\nconst STANDALONE_YEAR_RE = /^(?:19|20)\\d{2}$/;\n\n// ── Generic roles (lazy-loaded from JSON) ────────────\n\nconst EMPTY_GENERIC_ROLES: ReadonlySet<string> =\n new Set();\n\n/**\n * Load generic-roles.json and cache the result on the\n * given context. Must be awaited during pipeline init\n * so the sync accessor is populated before\n * filterFalsePositives runs.\n */\nexport const loadGenericRoles = (\n ctx: PipelineContext = defaultContext,\n): Promise<ReadonlySet<string>> => {\n if (ctx.genericRolesPromise) {\n return ctx.genericRolesPromise;\n }\n ctx.genericRolesPromise = (async () => {\n try {\n const mod: {\n default?: { roles?: string[] };\n } = await import(\n \"@stll/anonymize-data/config/generic-roles.json\"\n );\n const set: ReadonlySet<string> = new Set(\n mod.default?.roles ?? [],\n );\n ctx.genericRoles = set;\n return set;\n } catch {\n const empty: ReadonlySet<string> = new Set();\n ctx.genericRoles = empty;\n return empty;\n }\n })();\n return ctx.genericRolesPromise;\n};\n\n/** Sync accessor — returns empty set before init. */\nconst getGenericRoles = (\n ctx: PipelineContext,\n): ReadonlySet<string> =>\n ctx.genericRoles ?? EMPTY_GENERIC_ROLES;\n\n/**\n * Filter out entities that are likely false positives:\n * template placeholders, clause/section numbers,\n * standalone years, and generic legal role terms.\n *\n * Runs as a post-processing step after all detection\n * layers have merged.\n */\nexport const filterFalsePositives = (\n entities: Entity[],\n ctx: PipelineContext = defaultContext,\n): Entity[] => {\n const filtered: Entity[] = [];\n const roles = getGenericRoles(ctx);\n\n for (const entity of entities) {\n const trimmed = entity.text.trim();\n\n if (TEMPLATE_PLACEHOLDER_RE.test(trimmed)) {\n continue;\n }\n // Reject entities exceeding max length for their\n // label (prevents runaway trigger extractions).\n // Exempt legal-form entities: their span is already\n // bounded by the regex pattern, not open-ended.\n const maxLen = MAX_ENTITY_LENGTH[entity.label];\n if (\n maxLen &&\n trimmed.length > maxLen &&\n entity.source !== \"legal-form\"\n ) {\n continue;\n }\n // Section numbers (§ 3, 3.2.1, 12.) are false\n // positives unless they were captured by a trigger\n // phrase (e.g., \"č.p. 92\" is an address, not a\n // section number).\n if (\n SECTION_NUMBER_RE.test(trimmed) &&\n entity.source !== \"trigger\"\n ) {\n continue;\n }\n if (STANDALONE_YEAR_RE.test(trimmed)) {\n continue;\n }\n\n // Person names never contain digits.\n // \"Solution Pack ABL90 Flex\" → reject.\n if (\n entity.label === \"person\" &&\n HAS_DIGIT_RE.test(trimmed)\n ) {\n continue;\n }\n\n if (\n (entity.label === \"person\" ||\n entity.label === \"organization\") &&\n roles.has(trimmed.toLowerCase())\n ) {\n continue;\n }\n\n // Reject long address entities that look like prose:\n // no digits, no postal code, no known address\n // component (street abbreviations, etc.).\n if (\n entity.label === \"address\" &&\n trimmed.length > 40 &&\n !POSTAL_CODE_RE.test(trimmed) &&\n !HAS_DIGIT_RE.test(trimmed) &&\n !ADDRESS_COMPONENTS_RE.test(trimmed) &&\n !JURISDICTION_RE.test(trimmed)\n ) {\n continue;\n }\n\n // Reject ANY trigger-sourced address without digits\n // and without a known street-type word. Catches\n // non-address text like \"Nejsme plátci DPH !\".\n // Exempt jurisdiction patterns (\"State of ...\",\n // \"Commonwealth of ...\") which are valid addresses\n // without digits.\n if (\n entity.label === \"address\" &&\n entity.source === \"trigger\" &&\n !HAS_DIGIT_RE.test(trimmed) &&\n !ADDRESS_COMPONENTS_RE.test(trimmed) &&\n !JURISDICTION_RE.test(trimmed)\n ) {\n continue;\n }\n\n filtered.push(entity);\n }\n\n return filtered;\n};\n","/**\n * Normalize typographic variants for search matching.\n *\n * Legal documents (especially Czech/German) use\n * non-breaking spaces, smart quotes, and en/em dashes\n * that differ from their ASCII equivalents. Since all\n * replacements are same-length (single code unit →\n * single code unit), character offsets remain valid.\n *\n * Lives here (application layer) rather than in the\n * AC library: what to normalize is domain-specific.\n *\n * Uses a char-code lookup (`Map<number, number>`) and\n * `Uint16Array` instead of 7 sequential `replaceAll`\n * calls. For a 50 KB document this eliminates ~350 KB\n * of intermediate string allocations.\n *\n * When no replaceable characters are present (common\n * for plain-text inputs), a fast-path scan returns the\n * original string without any allocation. When special\n * characters exist, the string is scanned twice: once\n * to detect, once to build the replacement array.\n */\n\nconst REPLACEMENTS: readonly [number, number][] = [\n [0x00a0, 0x0020], // NBSP → space\n [0x2007, 0x0020], // figure space → space\n [0x202f, 0x0020], // narrow NBSP → space\n [0x2013, 0x002d], // en-dash → hyphen\n [0x2014, 0x002d], // em-dash → hyphen\n [0x201c, 0x0022], // left smart quote → \"\n [0x201d, 0x0022], // right smart quote → \"\n];\n\nconst CHAR_MAP = new Map<number, number>(REPLACEMENTS);\n\n/** Chunk size for `String.fromCharCode` to avoid\n * hitting the call-stack limit on very large strings. */\nconst CHUNK_SIZE = 8192;\n\nexport const normalizeForSearch = (\n text: string,\n): string => {\n // Fast path: skip allocation when nothing to replace.\n let hasSpecial = false;\n for (let i = 0; i < text.length; i++) {\n if (CHAR_MAP.has(text.charCodeAt(i))) {\n hasSpecial = true;\n break;\n }\n }\n if (!hasSpecial) return text;\n\n // Second pass: build output via Uint16Array.\n const len = text.length;\n const codes = new Uint16Array(len);\n for (let i = 0; i < len; i++) {\n const code = text.charCodeAt(i);\n codes[i] = CHAR_MAP.get(code) ?? code;\n }\n\n // Convert in chunks to avoid stack overflow on\n // spread of large arrays.\n if (len <= CHUNK_SIZE) {\n return String.fromCharCode(...codes);\n }\n\n let result = \"\";\n for (let offset = 0; offset < len; offset += CHUNK_SIZE) {\n const end = Math.min(offset + CHUNK_SIZE, len);\n result += String.fromCharCode(\n ...codes.subarray(offset, end),\n );\n }\n return result;\n};\n","import type { Match } from \"@stll/text-search\";\n\nimport {\n getNameCorpusFirstNames,\n getNameCorpusSurnames,\n getNameCorpusTitles,\n initNameCorpus,\n} from \"./names\";\nimport { resolveCountries } from \"../regions\";\nimport { DETECTION_SOURCES } from \"../types\";\nimport type { Entity, PipelineConfig } from \"../types\";\nimport type { PipelineContext } from \"../context\";\nimport { defaultContext } from \"../context\";\nimport { loadGenericRoles } from \"../filters/false-positives\";\nimport { normalizeForSearch } from \"../util/normalize\";\nimport {\n ALL_UPPER_RE,\n UPPER_START_RE,\n isSentenceStart,\n} from \"../util/text\";\nimport { DASH } from \"../util/char-groups\";\n\n/**\n * Try to load the optional @stll/anonymize-data package.\n * Returns null if not installed.\n */\nconst loadDataModule = async (): Promise<\n typeof import(\"@stll/anonymize-data\") | null\n> => {\n try {\n return await import(\"@stll/anonymize-data\");\n } catch {\n return null;\n }\n};\n\nexport type DenyListConfig = Pick<\n PipelineConfig,\n | \"enableDenyList\"\n | \"denyListCountries\"\n | \"denyListRegions\"\n | \"denyListExcludeCategories\"\n>;\n\n// ── Allow list (lazy-loaded from JSON) ───────────────\n\nconst loadAllowList = (\n ctx: PipelineContext,\n): Promise<ReadonlySet<string>> => {\n if (ctx.allowListPromise) return ctx.allowListPromise;\n ctx.allowListPromise = (async () => {\n try {\n const mod: {\n default?: { words?: string[] };\n } = await import(\n \"@stll/anonymize-data/config/allow-list.json\"\n );\n const set: ReadonlySet<string> = new Set(\n mod.default?.words ?? [],\n );\n ctx.allowList = set;\n return set;\n } catch {\n const empty: ReadonlySet<string> = new Set();\n ctx.allowList = empty;\n return empty;\n }\n })();\n return ctx.allowListPromise;\n};\n\nconst EMPTY_ALLOW_LIST: ReadonlySet<string> = new Set();\n\n/** Sync accessor — returns empty set before init. */\nconst getAllowList = (\n ctx: PipelineContext,\n): ReadonlySet<string> =>\n ctx.allowList ?? EMPTY_ALLOW_LIST;\n\n/**\n * Common EU given names present in the stopwords-iso dataset\n * but absent from the first-name corpus. Without this\n * supplementary set, these names would pass through the\n * corpus-based filter and remain in the stopwords, silently\n * suppressing person detection.\n *\n * Sourced from EU member state birth registries (top-100\n * names) cross-referenced with stopwords.json.\n */\nconst SUPPLEMENTARY_NAME_EXCLUSIONS: ReadonlySet<string> =\n new Set([\n \"ana\", \"ben\", \"dan\", \"eden\", \"ella\", \"ina\", \"jo\",\n \"kai\", \"lena\", \"may\", \"mia\", \"sam\", \"sara\", \"sue\",\n \"tim\", \"tom\",\n ]);\n\n/**\n * Names from the first-name corpus (lowercased) that also\n * appear in the stopwords-iso dataset, plus supplementary\n * common EU given names not in the corpus. These must be\n * kept out of global STOPWORDS so that person detection is\n * not silently suppressed for real given names.\n *\n * Computed lazily after initNameCorpus() has populated\n * the first-name corpus. Re-builds if corpus size changes.\n */\nconst getFirstNameExclusions = (\n ctx: PipelineContext,\n): ReadonlySet<string> => {\n const corpus = getNameCorpusFirstNames(ctx);\n // Re-build if corpus has been populated since last call\n if (\n ctx.firstNameExclusions &&\n corpus.length === ctx.firstNameExclusionCorpusLen\n ) {\n return ctx.firstNameExclusions;\n }\n ctx.firstNameExclusionCorpusLen = corpus.length;\n const set: ReadonlySet<string> = new Set([\n ...corpus.map((n) => n.toLowerCase()),\n ...SUPPLEMENTARY_NAME_EXCLUSIONS,\n ]);\n ctx.firstNameExclusions = set;\n return set;\n};\n\n/**\n * Global stopwords: common words across 23 EU languages\n * sourced from the stopwords-iso dataset (MIT license).\n * Checked case-insensitively against matches.\n *\n * Entries that collide with the first-name corpus are\n * excluded so they can still be detected as person names.\n *\n * Regenerate: bun packages/data/scripts/generate-stopwords.ts\n */\n\n// INVARIANT: must be called after initNameCorpus() has\n// resolved, so getFirstNameExclusions() sees the full\n// corpus. buildDenyList() enforces this ordering.\nconst loadStopwords = (\n ctx: PipelineContext,\n): Promise<ReadonlySet<string>> => {\n if (ctx.stopwordsPromise) return ctx.stopwordsPromise;\n ctx.stopwordsPromise = (async () => {\n try {\n const mod: { default?: string[] } = await import(\n \"@stll/anonymize-data/config/stopwords.json\"\n );\n const list = (mod.default ?? []).filter(\n (w: string) =>\n !getFirstNameExclusions(ctx).has(w),\n );\n const set: ReadonlySet<string> = new Set(list);\n ctx.stopwords = set;\n return set;\n } catch (err) {\n console.warn(\n \"[anonymize] Failed to load stopwords.json\"\n + \" — stopword filtering disabled:\",\n err,\n );\n const empty: ReadonlySet<string> = new Set();\n ctx.stopwords = empty;\n return empty;\n }\n })();\n return ctx.stopwordsPromise;\n};\n\nconst EMPTY_STOPWORDS: ReadonlySet<string> = new Set();\n\n/** Sync accessor — returns empty set before init. */\nconst getStopwords = (\n ctx: PipelineContext,\n): ReadonlySet<string> =>\n ctx.stopwords ?? EMPTY_STOPWORDS;\n\n// ── Person stopwords (lazy-loaded from JSON) ─────────\n\nconst loadPersonStopwords = (\n ctx: PipelineContext,\n): Promise<ReadonlySet<string>> => {\n if (ctx.personStopwordsPromise) {\n return ctx.personStopwordsPromise;\n }\n ctx.personStopwordsPromise = (async () => {\n try {\n const mod: {\n default?: { words?: string[] };\n } = await import(\n \"@stll/anonymize-data/config/person-stopwords.json\"\n );\n const set: ReadonlySet<string> = new Set(\n mod.default?.words ?? [],\n );\n ctx.personStopwords = set;\n return set;\n } catch {\n const empty: ReadonlySet<string> = new Set();\n ctx.personStopwords = empty;\n return empty;\n }\n })();\n return ctx.personStopwordsPromise;\n};\n\nconst EMPTY_PERSON_STOPWORDS: ReadonlySet<string> =\n new Set();\n\n/** Sync accessor — returns empty set before init. */\nconst getPersonStopwords = (\n ctx: PipelineContext,\n): ReadonlySet<string> =>\n ctx.personStopwords ?? EMPTY_PERSON_STOPWORDS;\n\n/**\n * Source tag for each pattern in the automaton.\n * \"deny-list\" = standard deny list entry\n * \"first-name\" = name corpus first name\n * \"surname\" = name corpus surname\n * \"title\" = academic/professional title\n */\ntype PatternSource =\n | \"deny-list\"\n | \"first-name\"\n | \"surname\"\n | \"title\";\n\n/**\n * Pre-built deny list data. Constructed once by\n * `buildDenyList`, reused across `processDenyListMatches`\n * calls. Contains PatternEntry[] for the unified builder\n * plus parallel label/source arrays for post-processing.\n */\nexport type DenyListData = {\n /**\n * Maps pattern index → entity labels (plural).\n * Same pattern can have multiple labels when it\n * appears in multiple dictionaries (e.g., \"Denver\"\n * is both a person name and a city name).\n */\n labels: string[][];\n /** Maps pattern index → original pattern text. */\n originals: string[];\n /** Maps pattern index → source types (plural). */\n sources: PatternSource[][];\n};\n\n/**\n * Resolve which dictionaries to load based on country\n * and category filters, load them, and build the deny\n * list data. The returned data provides PatternEntry[]\n * for the unified builder and parallel arrays for\n * post-processing.\n *\n * Requires `@stll/anonymize-data` to be installed.\n * Returns null if the data package is not available.\n */\nexport const buildDenyList = async (\n config: DenyListConfig,\n ctx: PipelineContext = defaultContext,\n): Promise<DenyListData | null> => {\n // Pre-load name corpus so getNameCorpus*() accessors\n // and getFirstNameExclusions() are populated before\n // stopwords filtering runs.\n await initNameCorpus(ctx);\n // Pre-load all JSON data so sync accessors are\n // populated before processDenyListMatches runs.\n await Promise.all([\n loadStopwords(ctx),\n loadAllowList(ctx),\n loadPersonStopwords(ctx),\n loadGenericRoles(ctx),\n ]);\n const dataModule = await loadDataModule();\n if (!dataModule) {\n return null;\n }\n\n const allowedCountries = resolveCountries(\n config.denyListRegions,\n config.denyListCountries,\n );\n\n const excluded = config.denyListExcludeCategories;\n const excludeCategories = excluded\n ? new Set(excluded)\n : new Set<string>();\n\n const allIds = [...dataModule.ALL_DICTIONARY_IDS];\n\n const ids = allIds.filter((id) => {\n const meta = dataModule.DICTIONARY_META[id];\n if (!meta) {\n return false;\n }\n\n if (excludeCategories.has(meta.category)) {\n return false;\n }\n\n if (allowedCountries === null) {\n return true;\n }\n\n if (meta.country === null) {\n return true;\n }\n\n return allowedCountries.has(meta.country);\n });\n\n const patternList: string[] = [];\n const labelList: string[][] = [];\n const sourceList: PatternSource[][] = [];\n // Maps lowercased pattern → index in patternList\n // for accumulating labels from multiple dictionaries\n const patternIndex = new Map<string, number>();\n\n const results = await Promise.all(\n ids.map(async (id) => {\n const entries =\n await dataModule.loadDictionary(id);\n return { id, entries };\n }),\n );\n\n const addDenyListEntry = (\n entry: string,\n label: string,\n ) => {\n // Strip | and \\ only — these caused the 12K FP\n // bug (| creates empty regex alternation, \\ is\n // an escape prefix). Other chars like () [] are\n // kept since they appear in real dictionary\n // entries and are matched literally by AC.\n const normalized = normalizeForSearch(entry)\n .replace(/[|\\\\]/g, \"\");\n if (normalized.length === 0) {\n return;\n }\n const lower = normalized.toLowerCase();\n const existing = patternIndex.get(lower);\n if (existing !== undefined) {\n if (!labelList[existing]!.includes(label)) {\n labelList[existing]!.push(label);\n }\n if (!sourceList[existing]!.includes(\"deny-list\")) {\n sourceList[existing]!.push(\"deny-list\");\n }\n } else {\n patternIndex.set(lower, patternList.length);\n patternList.push(normalized);\n labelList.push([label]);\n sourceList.push([\"deny-list\"]);\n }\n };\n\n for (const { id, entries } of results) {\n const meta = dataModule.DICTIONARY_META[id];\n if (!meta) {\n continue;\n }\n for (const entry of entries) {\n addDenyListEntry(entry, meta.label);\n }\n }\n\n // Load city dictionaries dynamically for all\n // allowed countries. Cities cover 230 countries\n // via GeoNames and are loaded separately from\n // the static dictionary registry.\n if (!excludeCategories.has(\"Places\")) {\n const cityCountries =\n allowedCountries !== null\n ? [...allowedCountries]\n : // No country filter — load all. In practice\n // this would be massive, so limit to a\n // reasonable set of common legal jurisdictions.\n [\n \"AT\", \"AU\", \"BE\", \"BG\", \"BR\", \"CA\",\n \"CH\", \"CZ\", \"DE\", \"DK\", \"ES\", \"FI\",\n \"FR\", \"GB\", \"GR\", \"HR\", \"HU\", \"IE\",\n \"IT\", \"LU\", \"NL\", \"NO\", \"NZ\", \"PL\",\n \"PT\", \"RO\", \"SE\", \"SI\", \"SK\", \"US\",\n ];\n const cityEntries =\n await dataModule.loadCityDictionaries(\n cityCountries,\n );\n for (const entry of cityEntries) {\n addDenyListEntry(entry, \"address\");\n }\n }\n\n // Add name corpus entries — accumulate labels\n // for entries that already exist from deny-list.\n const addNameEntry = (\n name: string,\n source: PatternSource,\n ) => {\n // Normalize same as deny-list entries so name\n // patterns match against normalizeForSearch(text).\n const normalized = normalizeForSearch(name)\n .replace(/[|\\\\]/g, \"\");\n if (normalized.length === 0) {\n return;\n }\n const lower = normalized.toLowerCase();\n const existing = patternIndex.get(lower);\n if (existing !== undefined) {\n if (!labelList[existing]!.includes(\"person\")) {\n labelList[existing]!.push(\"person\");\n }\n if (!sourceList[existing]!.includes(source)) {\n sourceList[existing]!.push(source);\n }\n } else {\n patternIndex.set(lower, patternList.length);\n patternList.push(normalized);\n labelList.push([\"person\"]);\n sourceList.push([source]);\n }\n };\n\n for (const name of getNameCorpusFirstNames(ctx)) {\n addNameEntry(name, \"first-name\");\n }\n for (const name of getNameCorpusSurnames(ctx)) {\n addNameEntry(name, \"surname\");\n }\n for (const title of getNameCorpusTitles(ctx)) {\n const norm = normalizeForSearch(title)\n .replace(/[|\\\\]/g, \"\");\n if (norm.length === 0) continue;\n const lower = norm.toLowerCase();\n const existing = patternIndex.get(lower);\n if (existing !== undefined) {\n if (!sourceList[existing]!.includes(\"title\")) {\n sourceList[existing]!.push(\"title\");\n }\n } else {\n patternIndex.set(lower, patternList.length);\n patternList.push(norm);\n labelList.push([\"person\"]);\n sourceList.push([\"title\"]);\n }\n }\n\n if (patternList.length === 0) {\n return null;\n }\n\n return {\n labels: labelList,\n originals: patternList,\n sources: sourceList,\n };\n};\n\ntype RawMatch = {\n start: number;\n end: number;\n /** All labels for this pattern (e.g., [\"person\", \"address\"]). */\n labels: string[];\n text: string;\n patternIdx: number;\n};\n\n/**\n * Ensure all deny-list support data (stopwords, allow\n * list, person stopwords, generic roles) is loaded on\n * the given context. Call this before\n * processDenyListMatches / filterFalsePositives when\n * the search instance was built on a different context\n * (e.g. cachedSearch).\n */\nexport const ensureDenyListData = async (\n ctx: PipelineContext = defaultContext,\n): Promise<void> => {\n // INVARIANT: initNameCorpus must resolve before\n // loadStopwords so first-name exclusions are\n // available when computing the stopword set.\n await initNameCorpus(ctx);\n await Promise.all([\n loadStopwords(ctx),\n loadAllowList(ctx),\n loadPersonStopwords(ctx),\n loadGenericRoles(ctx),\n ]);\n};\n\n// ── Match processor ─────────────────────────────────\n\n/**\n * Process deny list matches from the unified search.\n * Receives all matches; filters to the deny list slice\n * via sliceStart/sliceEnd. Local index into data.labels,\n * data.originals, data.sources is match.pattern - sliceStart.\n *\n * Two-pass approach to reduce false positives:\n * 1. Collect all matches (case-insensitive,\n * whole-word via Rust automaton)\n * 2. Require uppercase start in source text\n * 3. For person names, require at least one\n * mid-sentence occurrence to prove proper noun\n * 4. Return all occurrences of validated terms\n */\nexport const processDenyListMatches = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText: string,\n data: DenyListData,\n ctx: PipelineContext = defaultContext,\n): Entity[] => {\n // Pass 1: collect valid matches grouped by pattern\n const matchesByPattern = new Map<\n number,\n RawMatch[]\n >();\n\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n\n const localIdx = idx - sliceStart;\n\n const sourceChar = fullText[match.start] ?? \"\";\n if (!UPPER_START_RE.test(sourceChar)) {\n continue;\n }\n\n // Use original text for display; normalized was\n // only for the AC search.\n const matchText = fullText.slice(\n match.start,\n match.end,\n );\n const keyword = matchText.toLowerCase();\n if (getStopwords(ctx).has(keyword) || getAllowList(ctx).has(keyword)) {\n continue;\n }\n\n // Skip ALL-CAPS tokens (likely acronyms, not PII)\n // unless surrounding context is also all-caps\n if (ALL_UPPER_RE.test(matchText)) {\n continue;\n }\n\n const labels = data.labels[localIdx];\n if (!labels || labels.length === 0) {\n continue;\n }\n\n const entry: RawMatch = {\n start: match.start,\n end: match.end,\n labels,\n text: matchText,\n patternIdx: localIdx,\n };\n\n const existing = matchesByPattern.get(localIdx);\n if (existing) {\n existing.push(entry);\n } else {\n matchesByPattern.set(localIdx, [entry]);\n }\n }\n\n // Pass 2: process all matches\n const results: Entity[] = [];\n const nameHits: RawMatch[] = [];\n\n for (const [, matches] of Array.from(\n matchesByPattern,\n )) {\n const first = matches[0];\n if (!first) {\n continue;\n }\n\n const hasPerson = first.labels.includes(\"person\");\n const nonPersonLabels = first.labels.filter(\n (l) => l !== \"person\",\n );\n\n // Person hits go to chain scoring (Pass 2b).\n // Skip words that are valid places/orgs but not\n // person names (months, states, languages).\n if (hasPerson) {\n const keyword = first.text.toLowerCase();\n if (!getPersonStopwords(ctx).has(keyword)) {\n for (const m of matches) {\n nameHits.push(m);\n }\n }\n }\n\n // Emit entities for all non-person labels\n for (const m of matches) {\n for (const label of nonPersonLabels) {\n results.push({\n start: m.start,\n end: m.end,\n label,\n text: m.text,\n score: 0.9,\n source: DETECTION_SOURCES.DENY_LIST,\n });\n }\n }\n }\n\n // Pass 2b: person hits — chain adjacent hits and\n // extend to following capitalised words.\n nameHits.sort((a, b) => a.start - b.start);\n\n const nameConsumed = new Set<number>();\n for (let i = 0; i < nameHits.length; i++) {\n if (nameConsumed.has(i)) {\n continue;\n }\n const hit = nameHits[i];\n if (!hit) {\n continue;\n }\n\n // Build chain of adjacent person hits\n const chain: RawMatch[] = [hit];\n let j = i + 1;\n\n while (j < nameHits.length && chain.length < 5) {\n const next = nameHits[j];\n if (!next) {\n break;\n }\n const prev = chain.at(-1);\n if (!prev) {\n break;\n }\n\n const gap = fullText.slice(prev.end, next.start);\n if (\n gap.length > 4 ||\n gap.length === 0 ||\n gap.includes(\"\\n\") ||\n gap.includes(\"\\t\")\n ) {\n break;\n }\n\n chain.push(next);\n j++;\n }\n\n // Mark chain members consumed\n for (let k = i; k < i + chain.length; k++) {\n nameConsumed.add(k);\n }\n\n // Extend to following capitalised word (for\n // unknown surnames not in the corpus)\n const first = chain.at(0);\n const last = chain.at(-1);\n if (!first || !last) {\n continue;\n }\n\n const extended = extendPersonName(\n fullText,\n first.start,\n last.end,\n ctx,\n );\n\n // Score: chained names get 0.9, single names 0.5\n const score = chain.length >= 2 ? 0.9 : 0.5;\n\n // Skip standalone single-word names at sentence\n // start (likely not a person name) — BUT keep it\n // if the word after the chain is also uppercase\n // (likely a full name: \"Alena Zemanová\").\n if (\n chain.length === 1 &&\n isSentenceStart(fullText, first.start)\n ) {\n const afterEnd = last.end;\n const rest = fullText.slice(afterEnd).trimStart();\n const nextIsUpper =\n rest.length > 1 &&\n /^\\p{Lu}\\p{Ll}/u.test(rest);\n if (!nextIsUpper) {\n continue;\n }\n }\n\n results.push({\n start: first.start,\n end: extended.end,\n label: \"person\",\n text: extended.text,\n score,\n source: DETECTION_SOURCES.DENY_LIST,\n });\n }\n\n // Post-process: extend city/address matches to\n // include adjacent trailing district numbers (e.g.,\n // \"Praha 1\", \"Brno 2\"). Czech and Slovak cities\n // commonly have numbered districts that are part of\n // the address.\n extendCityDistricts(results, fullText);\n\n return results;\n};\n\n/**\n * Extend address-label entities to absorb adjacent\n * integers: trailing district numbers (\"Praha 1\") and\n * leading postal codes (\"80336 München\").\n * Mutates the entities in place.\n */\n// District suffixes: digits (\"Praha 1\") or Roman\n// numerals (\"Příbram II\", \"Brno III\")\n// Valid Roman numerals only (I-XXX range, no invalid\n// combos like IC, LC, VC). Covers district suffixes\n// up to Praha XXX which is more than enough.\n// Roman numeral district suffixes II-XXX. Standalone\n// \"I\" and \"V\" excluded: \"V\" clashes with Czech\n// preposition \"in\"; \"I\" is too ambiguous.\nconst ROMAN_DISTRICT =\n \"XXX|XXIX|XXVIII|XXVII|XXVI|XXV|XXIV|XXIII\" +\n \"|XXII|XXI|XX|XIX|XVIII|XVII|XVI|XV|XIV|XIII\" +\n \"|XII|XI|X|IX|VIII|VII|VI|IV|III|II\";\nconst DISTRICT_SUFFIX_RE = new RegExp(\n `^ (\\\\d{1,2}(?!\\\\d)|(?:${ROMAN_DISTRICT}))` +\n `(?=[\\\\s,;.)\"\\\\n]|$)`,\n);\n// Postal code before city: \"163 00 \", \"16300 \",\n// \"16300 - \" (with dash separator).\nconst POSTAL_PREFIX_RE =\n new RegExp(\n `(?:\\\\d{5}|\\\\d{3}\\\\s\\\\d{2})\\\\s*${DASH}?\\\\s*$`,\n );\n\n// Words that must NOT be absorbed into an address span\n// when they follow a postal-code + city pattern. Party\n// roles, organizational nouns, and common legal terms.\nconst TRAILING_WORD_EXCLUSIONS: ReadonlySet<string> =\n new Set([\n // CZ/SK party roles\n \"nájemce\", \"pronajímatel\", \"kupující\",\n \"prodávající\", \"objednatel\", \"zhotovitel\",\n \"dodavatel\", \"odběratel\", \"věřitel\", \"dlužník\",\n \"zadavatel\", \"uchazeč\", \"příjemce\", \"plátce\",\n // Organizational nouns\n \"správa\", \"sekretariát\", \"kancelář\", \"odbor\",\n \"oddělení\", \"úřad\", \"inspekce\", \"agentura\",\n // Legal clause starters\n \"článek\", \"smlouva\", \"dodatek\", \"příloha\",\n \"předmět\", \"podmínky\", \"ustanovení\",\n ]);\n\nconst extendCityDistricts = (\n entities: Entity[],\n fullText: string,\n): void => {\n for (const entity of entities) {\n if (entity.label !== \"address\") {\n continue;\n }\n\n // Trailing: \"Praha\" + \" 1\" → \"Praha 1\"\n // Trailing: \"Praha\" + \" 1\" → \"Praha 1\"\n const afterMatch = fullText.slice(entity.end);\n const suffixM = DISTRICT_SUFFIX_RE.exec(afterMatch);\n if (suffixM) {\n entity.end += suffixM[0].length;\n entity.text = fullText.slice(\n entity.start,\n entity.end,\n );\n }\n\n // Dash-separated district name:\n // \"Praha 10 - Strašnice\", \"Havířov – Město\"\n const afterDistrict = fullText.slice(entity.end);\n const dashDistrictM =\n /^[\\s]*[-–][\\s]*(\\p{Lu}\\p{Ll}+)/u.exec(\n afterDistrict,\n );\n if (\n dashDistrictM &&\n !dashDistrictM[0].includes(\"\\n\")\n ) {\n entity.end += dashDistrictM[0].length;\n entity.text = fullText.slice(\n entity.start,\n entity.end,\n );\n }\n\n // Leading: \"80336 \" + \"München\" → \"80336 München\"\n // Absorbs 3-5 digit postal codes before the city.\n const beforeMatch = fullText.slice(\n Math.max(0, entity.start - 10),\n entity.start,\n );\n const prefixM = POSTAL_PREFIX_RE.exec(beforeMatch);\n if (prefixM) {\n entity.start -= prefixM[0].length;\n entity.text = fullText.slice(\n entity.start,\n entity.end,\n );\n }\n\n // Trailing uppercase word: \"434 01\" + \" Most\" →\n // \"434 01 Most\". Absorb if the next word starts\n // with uppercase and is on the same line.\n // Guard: skip party-role or organizational terms.\n const afterExt = fullText.slice(entity.end);\n // Max 4 spaces gap — more means different column\n const trailingWordM =\n /^[\\s]{1,4}(\\p{Lu}\\p{Ll}+)/u.exec(afterExt);\n if (\n trailingWordM &&\n !trailingWordM[0].includes(\"\\n\")\n ) {\n const candidate =\n (trailingWordM[1] ?? \"\").toLowerCase();\n if (!TRAILING_WORD_EXCLUSIONS.has(candidate)) {\n entity.end += trailingWordM[0].length;\n entity.text = fullText.slice(\n entity.start,\n entity.end,\n );\n }\n }\n }\n};\n\n/**\n * Extend a person name match to include subsequent\n * capitalized words. \"Pavel\" + \" Heřmánek\" → \"Pavel\n * Heřmánek\". Stops at lowercase words, punctuation,\n * or end of text. Also extends backward if preceded\n * by a capitalized word (for \"Miroslav Braňka\" when\n * only \"Braňka\" matched).\n */\nconst extendPersonName = (\n text: string,\n start: number,\n end: number,\n ctx: PipelineContext,\n): { end: number; text: string } => {\n let newEnd = end;\n\n // Extend forward: skip whitespace, check if next\n // word starts with uppercase\n let pos = newEnd;\n while (pos < text.length) {\n // Skip single whitespace\n if (pos < text.length && text[pos] === \" \") {\n const wordStart = pos + 1;\n if (wordStart >= text.length) {\n break;\n }\n\n const char = text[wordStart] ?? \"\";\n if (!UPPER_START_RE.test(char)) {\n break;\n }\n\n // Find end of this word\n let wordEnd = wordStart;\n while (\n wordEnd < text.length &&\n !/\\s/.test(text[wordEnd] ?? \"\")\n ) {\n wordEnd++;\n }\n\n // Skip trailing punctuation (commas, etc.)\n const word = text.slice(wordStart, wordEnd);\n const stripped = word.replace(/[,;.]+$/, \"\");\n if (stripped.length < 2) {\n break;\n }\n\n // Don't extend into global or person stopwords\n const lower = stripped.toLowerCase();\n if (\n getStopwords(ctx).has(lower) ||\n getPersonStopwords(ctx).has(lower)\n ) {\n break;\n }\n\n newEnd = wordStart + stripped.length;\n pos = newEnd;\n } else {\n break;\n }\n }\n\n return {\n end: newEnd,\n text: text.slice(start, newEnd),\n };\n};\n","/**\n * Address detection via seed expansion.\n *\n * 1. Find \"address seeds\" — high-confidence address\n * components (postal codes, cities, street types)\n * 2. Cluster nearby seeds (within ~150 chars)\n * 3. Expand each cluster to the full address span\n * 4. Score by seed diversity (more types = higher)\n *\n * Language-agnostic: street type words and boundary\n * words are loaded from data dictionaries, not\n * hardcoded per language.\n */\n\nimport type { Match } from \"@stll/text-search\";\n\nimport { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\n\n// ── Seed types ──────────────────────────────────────\n\ntype SeedType =\n | \"street-word\"\n | \"house-number\"\n | \"postal-code\"\n | \"city\"\n | \"address-trigger\";\n\ntype Seed = {\n type: SeedType;\n start: number;\n end: number;\n text: string;\n};\n\n// ── Dictionary loading ──────────────────────────────\n\ntype DictionaryConfig = Record<\n string,\n string[] | string\n>;\n\nlet cachedBoundaryRe: RegExp | null = null;\n\nconst loadBoundaryWords =\n async (): Promise<DictionaryConfig> => {\n try {\n const mod = await import(\n \"@stll/anonymize-data/config/address-boundaries.json\"\n );\n return mod.default as DictionaryConfig;\n } catch {\n return {};\n }\n };\n\n/**\n * Build regex for boundary words. Matches any\n * boundary word preceded by a word boundary.\n */\nconst getBoundaryRe = async (): Promise<RegExp> => {\n if (cachedBoundaryRe) {\n return cachedBoundaryRe;\n }\n const config = await loadBoundaryWords();\n const words: string[] = [];\n for (const entries of Object.values(config)) {\n if (!Array.isArray(entries)) {\n continue;\n }\n for (const word of entries) {\n // Escape regex special chars\n words.push(\n word.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"),\n );\n }\n }\n // Sort longest first so longer phrases match first\n words.sort((a, b) => b.length - a.length);\n cachedBoundaryRe = words.length > 0\n ? new RegExp(`\\\\b(?:${words.join(\"|\")})\\\\b`, \"i\")\n : /(?!)/; // never matches\n return cachedBoundaryRe;\n};\n\n// ── Pattern builder for unified search ──────────────\n\n/**\n * Build street type patterns for the unified search.\n * Returns string[] for the unified TextSearch\n * builder. Empty if data package is not installed.\n */\nexport const buildStreetTypePatterns =\n async (): Promise<string[]> => {\n let config: DictionaryConfig = {};\n try {\n const mod = await import(\n \"@stll/anonymize-data/config/address-street-types.json\"\n );\n config = mod.default as DictionaryConfig;\n } catch {\n return [];\n }\n\n // Plain strings — the unified builder sets\n // caseInsensitive + wholeWords globally.\n const words: string[] = [];\n for (const values of Object.values(config)) {\n if (!Array.isArray(values)) {\n continue;\n }\n for (const word of values) {\n words.push(word);\n }\n }\n return words;\n };\n\n// ── Seed collection ─────────────────────────────────\n\nconst collectSeeds = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText: string,\n existingEntities: Entity[],\n): Seed[] => {\n const seeds: Seed[] = [];\n\n // 1. Street type words from unified search matches\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n seeds.push({\n type: \"street-word\",\n start: match.start,\n end: match.end,\n text: match.text,\n });\n }\n\n // 2. Cities and postal codes from existing entities\n for (const e of existingEntities) {\n if (e.label !== \"address\") {\n continue;\n }\n if (e.source === \"deny-list\") {\n seeds.push({\n type: \"city\",\n start: e.start,\n end: e.end,\n text: e.text,\n });\n } else if (\n e.source === \"trigger\" &&\n /^\\d/.test(e.text)\n ) {\n seeds.push({\n type: \"postal-code\",\n start: e.start,\n end: e.end,\n text: e.text,\n });\n } else if (e.source === \"trigger\") {\n seeds.push({\n type: \"address-trigger\",\n start: e.start,\n end: e.end,\n text: e.text,\n });\n }\n }\n\n // 3. Standalone postal codes (multiple formats):\n // Czech/Slovak: NNN NN (e.g., 140 00)\n // Polish: NN-NNN (e.g., 00-950)\n const postalRe =\n /\\b(?:\\d{3}\\s\\d{2}|\\d{2}-\\d{3})\\b/g;\n let postalMatch;\n while (\n (postalMatch = postalRe.exec(fullText)) !== null\n ) {\n const start = postalMatch.index;\n const end = start + postalMatch[0].length;\n const alreadyCovered = seeds.some(\n (s) => s.start <= start && s.end >= end,\n );\n if (!alreadyCovered) {\n seeds.push({\n type: \"postal-code\",\n start,\n end,\n text: postalMatch[0],\n });\n }\n }\n\n // 4. Street name + house number pattern:\n // [CapitalizedWord] [number](/[number])?,\n // e.g., \"Olbrachtova 1929/62,\" or \"Kamínky 5,\"\n const streetNumRe =\n /\\b(\\p{Lu}\\p{Ll}{2,})\\s+(\\d{1,5}(?:\\/\\d{1,5})?)\\s*[,\\n]/gu;\n let streetMatch;\n while (\n (streetMatch = streetNumRe.exec(fullText)) !== null\n ) {\n const matchedStreet = streetMatch[1];\n const matchedNum = streetMatch[2];\n if (!matchedStreet || !matchedNum) {\n continue;\n }\n const start = streetMatch.index;\n const end =\n start +\n matchedStreet.length +\n 1 +\n matchedNum.length;\n seeds.push({\n type: \"street-word\",\n start,\n end,\n text: fullText.slice(start, end),\n });\n }\n\n return seeds.sort((a, b) => a.start - b.start);\n};\n\n// ── Cluster nearby seeds ────────────────────────────\n\ntype SeedCluster = {\n seeds: Seed[];\n start: number;\n end: number;\n};\n\nconst clusterSeeds = (\n seeds: Seed[],\n maxGap: number,\n): SeedCluster[] => {\n const first = seeds[0];\n if (!first) {\n return [];\n }\n\n const clusters: SeedCluster[] = [];\n let current: SeedCluster = {\n seeds: [first],\n start: first.start,\n end: first.end,\n };\n\n for (let i = 1; i < seeds.length; i++) {\n const seed = seeds.at(i);\n if (!seed) {\n continue;\n }\n if (seed.start - current.end <= maxGap) {\n current.seeds.push(seed);\n current.end = Math.max(current.end, seed.end);\n } else {\n clusters.push(current);\n current = {\n seeds: [seed],\n start: seed.start,\n end: seed.end,\n };\n }\n }\n clusters.push(current);\n\n return clusters;\n};\n\n// ── Score a cluster ─────────────────────────────────\n\nconst scoreCluster = (\n cluster: SeedCluster,\n): number => {\n const types = new Set(\n cluster.seeds.map((s) => s.type),\n );\n\n // Need at least 2 different seed types for an\n // address (e.g., city + postal code, or street\n // word + house number)\n if (types.size < 2) {\n return 0;\n }\n\n let score = 0.5;\n\n if (types.has(\"postal-code\")) score += 0.15;\n if (types.has(\"city\")) score += 0.15;\n if (types.has(\"street-word\")) score += 0.15;\n if (types.has(\"address-trigger\")) score += 0.1;\n\n return Math.min(score, 0.95);\n};\n\n// ── Expand cluster to full address span ─────────────\n\nconst NON_ADDRESS_LABELS = new Set([\n \"registration number\",\n \"tax identification number\",\n \"person\",\n \"bank account number\",\n \"email address\",\n \"phone number\",\n \"organization\",\n \"iban\",\n]);\n\nconst expandCluster = async (\n fullText: string,\n cluster: SeedCluster,\n existingEntities: Entity[],\n): Promise<{ start: number; end: number }> => {\n const { start, end } = cluster;\n\n // Find the nearest non-address entity to the LEFT\n let leftBound = 0;\n for (const e of existingEntities) {\n if (\n NON_ADDRESS_LABELS.has(e.label) &&\n e.end <= start &&\n e.end > leftBound\n ) {\n leftBound = e.end;\n }\n }\n\n // Expand left: include preceding capitalized words\n // and numbers (street name before the street type)\n let leftPos = start;\n while (leftPos > leftBound) {\n let p = leftPos - 1;\n while (\n p >= 0 &&\n (fullText[p] === \" \" || fullText[p] === \",\")\n ) {\n p--;\n }\n if (p < 0) break;\n\n let wordEnd = p + 1;\n while (p >= 0 && /\\S/.test(fullText[p] ?? \"\")) {\n p--;\n }\n const word = fullText.slice(p + 1, wordEnd);\n\n if (\n word.length < 2 ||\n (!/^\\p{Lu}/u.test(word) && !/^\\d/.test(word))\n ) {\n break;\n }\n\n if (\n fullText.slice(p + 1, leftPos).includes(\"\\n\")\n ) {\n break;\n }\n\n leftPos = p + 1;\n }\n\n // Expand right: include following text until we\n // hit a boundary word, non-address entity,\n // double newline, or 200 char cap.\n let rightPos = end;\n const remaining = fullText.slice(rightPos);\n let nearestBoundary = Math.min(\n remaining.length,\n 200,\n );\n\n // Stop at dictionary-defined boundary words\n const boundaryRe = await getBoundaryRe();\n const boundaryMatch = boundaryRe.exec(remaining);\n if (\n boundaryMatch &&\n boundaryMatch.index < nearestBoundary\n ) {\n nearestBoundary = boundaryMatch.index;\n }\n\n // Stop at non-address entities\n for (const e of existingEntities) {\n if (!NON_ADDRESS_LABELS.has(e.label)) {\n continue;\n }\n const offset = e.start - rightPos;\n if (offset > 0 && offset < nearestBoundary) {\n nearestBoundary = offset;\n }\n }\n\n // Stop at double newline (paragraph break)\n const doubleNewline = remaining.indexOf(\"\\n\\n\");\n if (\n doubleNewline !== -1 &&\n doubleNewline < nearestBoundary\n ) {\n nearestBoundary = doubleNewline;\n }\n\n const expanded = remaining\n .slice(0, nearestBoundary)\n .trimEnd();\n rightPos = end + expanded.length;\n\n // Trim trailing punctuation\n while (\n rightPos > end &&\n /[,;:\\s]/.test(fullText[rightPos - 1] ?? \"\")\n ) {\n rightPos--;\n }\n\n return {\n start: Math.min(leftPos, start),\n end: Math.max(rightPos, end),\n };\n};\n\n// ── Public API ──────────────────────────────────────\n\n/**\n * Process address seeds from the unified search.\n * Receives all matches; filters to the street types\n * slice via sliceStart/sliceEnd. Uses fullText and\n * existingEntities for seed collection, clustering,\n * expansion, and scoring.\n *\n * Runs as a post-processor after all other detectors,\n * using their output as seed sources.\n */\nexport const processAddressSeeds = async (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText: string,\n existingEntities: Entity[],\n): Promise<Entity[]> => {\n const seeds = collectSeeds(\n allMatches,\n sliceStart,\n sliceEnd,\n fullText,\n existingEntities,\n );\n const clusters = clusterSeeds(seeds, 150);\n\n const results: Entity[] = [];\n\n for (const cluster of clusters) {\n const score = scoreCluster(cluster);\n if (score < 0.6) {\n continue;\n }\n\n const { start, end } = await expandCluster(\n fullText,\n cluster,\n existingEntities,\n );\n const text = fullText.slice(start, end).trim();\n\n // Skip very short or very long spans\n if (text.length < 5 || text.length > 300) {\n continue;\n }\n\n // Skip if it contains a newline (likely crossed\n // a structural boundary)\n if (text.includes(\"\\n\")) {\n continue;\n }\n\n results.push({\n start,\n end: start + text.length,\n label: \"address\",\n text,\n score,\n source: DETECTION_SOURCES.REGEX,\n });\n }\n\n return results;\n};\n","import { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\nimport { LEGAL_SUFFIXES } from \"../config/legal-forms\";\n\nconst TRAILING_SEP = /[,\\s]+$/;\nconst WORD_CHAR_RE = /[\\p{L}\\p{N}]/u;\nconst ORG_PROPAGATION_SCORE = 0.9;\n\ntype Seed = {\n baseName: string;\n label: string;\n};\n\n/**\n * After the main detection pass, collect organization\n * entities with a legal form suffix, strip the suffix\n * to get the base name, and re-scan the full text for\n * bare mentions of that base name. Returns new entities\n * for occurrences not already covered.\n */\nexport const propagateOrgNames = (\n entities: Entity[],\n fullText: string,\n): Entity[] => {\n const seeds: Seed[] = [];\n const seenBases = new Set<string>();\n\n for (const e of entities) {\n if (e.label !== \"organization\") continue;\n for (const suffix of LEGAL_SUFFIXES) {\n if (e.text.endsWith(suffix)) {\n const base = e.text\n .slice(0, -suffix.length)\n .replace(TRAILING_SEP, \"\")\n .trim();\n if (base.length >= 3 && !seenBases.has(base)) {\n seenBases.add(base);\n seeds.push({\n baseName: base,\n label: e.label,\n });\n }\n break;\n }\n }\n }\n\n if (seeds.length === 0) return [];\n\n // Build a mutable array of already-covered spans\n // for overlap checks. Updated as new entities are\n // emitted to prevent duplicate propagation.\n const covered: [number, number][] = entities.map(\n (e) => [e.start, e.end],\n );\n const isOverlapping = (\n start: number,\n end: number,\n ): boolean =>\n covered.some(\n ([cs, ce]) => start < ce && end > cs,\n );\n\n const results: Entity[] = [];\n\n for (const seed of seeds) {\n const { baseName, label } = seed;\n let searchFrom = 0;\n while (searchFrom < fullText.length) {\n const idx = fullText.indexOf(\n baseName,\n searchFrom,\n );\n if (idx === -1) break;\n\n const matchEnd = idx + baseName.length;\n\n // Word boundary: reject if preceded or followed\n // by a letter or digit (prevents substring\n // matches like \"ACME\" inside \"ACME2\").\n const prevCh = fullText[idx - 1] ?? \"\";\n const nextCh = fullText[matchEnd] ?? \"\";\n if (\n WORD_CHAR_RE.test(prevCh) ||\n WORD_CHAR_RE.test(nextCh)\n ) {\n searchFrom = idx + 1;\n continue;\n }\n\n // Skip if already covered by an existing entity\n // or a previously propagated result.\n if (!isOverlapping(idx, matchEnd)) {\n results.push({\n start: idx,\n end: matchEnd,\n label,\n text: baseName,\n score: ORG_PROPAGATION_SCORE,\n source: DETECTION_SOURCES.COREFERENCE,\n });\n covered.push([idx, matchEnd]);\n }\n\n searchFrom = matchEnd;\n }\n }\n\n return results;\n};\n","import type { Entity } from \"../types\";\n\n// Common Czech words that start uppercase at sentence\n// beginnings but are not street names. Module-level\n// to avoid allocation in a hot loop.\nconst BARE_STOPWORDS = new Set([\n \"Příloha\",\n \"Smlouva\",\n \"Článek\",\n \"Dodatek\",\n \"Celkem\",\n \"Strana\",\n \"Faktura\",\n \"Částka\",\n \"Položka\",\n \"Kapitola\",\n \"Zákon\",\n \"Vyhláška\",\n \"Nařízení\",\n \"Usnesení\",\n \"Rozsudek\",\n \"Bod\",\n \"Odstavec\",\n \"Záloha\",\n \"Zbývá\",\n \"Dne\",\n \"Platba\",\n \"Datum\",\n \"Splatnost\",\n \"Variabilní\",\n \"Konstantní\",\n \"Specifický\",\n]);\n\nconst NEAR_MISS_BAND = 0.15;\nconst BOOST_PER_NEIGHBOUR = 0.05;\nconst CONTEXT_WINDOW_CHARS = 150;\nconst HIGH_CONFIDENCE_FLOOR = 0.9;\n\n/**\n * Boost confidence of near-miss NER entities that appear\n * near high-confidence detections (regex, trigger phrase).\n *\n * If an NER entity scored between (threshold - 0.15) and\n * threshold, count how many confirmed entities exist within\n * a 150-char window. Add +0.05 per co-located entity.\n * If the boosted score crosses the threshold, include it.\n *\n * Only mutates score on near-miss entities; high-confidence\n * entities pass through unchanged.\n */\nexport const boostNearMissEntities = (\n entities: Entity[],\n threshold: number,\n): Entity[] => {\n const nearMissBand = Math.max(0, threshold - NEAR_MISS_BAND);\n const confirmed = entities.filter((e) => e.score >= HIGH_CONFIDENCE_FLOOR);\n\n const boosted: Entity[] = [];\n\n for (const entity of entities) {\n if (entity.score >= threshold) {\n boosted.push(entity);\n continue;\n }\n\n if (entity.score < nearMissBand) {\n continue;\n }\n\n const midpoint = (entity.start + entity.end) / 2;\n let neighbourCount = 0;\n\n for (const anchor of confirmed) {\n const anchorMid = (anchor.start + anchor.end) / 2;\n if (Math.abs(midpoint - anchorMid) <= CONTEXT_WINDOW_CHARS) {\n neighbourCount++;\n }\n }\n\n const boostedScore = entity.score + neighbourCount * BOOST_PER_NEIGHBOUR;\n\n if (boostedScore >= threshold) {\n boosted.push({ ...entity, score: boostedScore });\n }\n }\n\n return boosted;\n};\n\n// ── Address backward scan ────────────────────────────\n\nconst UPPER_WORD_RE = /\\p{Lu}/u;\n\n/** Header zone: top 15% of document */\nconst HEADER_ZONE_FRACTION = 0.15;\n\n/** Context window for address adjacency */\nconst STREET_CONTEXT_WINDOW = 200;\n\n// ── Preposition data (lazy-loaded from JSON) ────────\n\ntype PrepositionData = {\n address: Record<string, string[] | string>;\n temporal: Record<string, string[] | string>;\n};\n\nlet _addressPreps: ReadonlySet<string> | null = null;\nlet _temporalPreps: ReadonlySet<string> | null = null;\nlet _prepsPromise: Promise<void> | null = null;\n\nconst loadPrepositions = async (): Promise<void> => {\n try {\n const mod = await import(\n \"@stll/anonymize-data/config/address-prepositions.json\"\n );\n const data: PrepositionData = mod.default ?? mod;\n // Merge all languages into flat sets\n const addr = new Set<string>();\n const temp = new Set<string>();\n for (const words of Object.values(data.address)) {\n if (Array.isArray(words)) {\n for (const w of words) addr.add(w.toLowerCase());\n }\n }\n for (const words of Object.values(data.temporal)) {\n if (Array.isArray(words)) {\n for (const w of words) temp.add(w.toLowerCase());\n }\n }\n _addressPreps = addr;\n _temporalPreps = temp;\n } catch {\n _addressPreps = new Set();\n _temporalPreps = new Set();\n }\n};\n\n/** Ensure preposition data is loaded. */\nexport const initPrepositions =\n (): Promise<void> => {\n if (!_prepsPromise) {\n _prepsPromise = loadPrepositions();\n }\n return _prepsPromise;\n };\n\nconst getAddressPreps = (): ReadonlySet<string> =>\n _addressPreps ?? new Set();\n\nconst getTemporalPreps = (): ReadonlySet<string> =>\n _temporalPreps ?? new Set();\n\n// ── Street type abbreviations (lazy-loaded) ─────────\n\nlet _streetAbbrevs: ReadonlySet<string> | null = null;\nlet _streetAbbrevsPromise: Promise<void> | null = null;\n\nconst loadStreetAbbrevs = async (): Promise<void> => {\n try {\n const mod = await import(\n \"@stll/anonymize-data/config/address-street-types.json\"\n );\n const data: Record<string, string[] | string> =\n mod.default ?? mod;\n const abbrevs = new Set<string>();\n for (const [key, words] of Object.entries(data)) {\n if (key.startsWith(\"_\")) continue;\n if (!Array.isArray(words)) continue;\n for (const w of words) {\n // Only keep abbreviated forms (with dots)\n if (w.includes(\".\")) {\n abbrevs.add(w.toLowerCase());\n }\n }\n }\n _streetAbbrevs = abbrevs;\n } catch {\n _streetAbbrevs = new Set();\n }\n};\n\n/** Ensure street abbreviation data is loaded. */\nexport const initStreetAbbrevs =\n (): Promise<void> => {\n if (!_streetAbbrevsPromise) {\n _streetAbbrevsPromise = loadStreetAbbrevs();\n }\n return _streetAbbrevsPromise;\n };\n\nconst getStreetAbbrevs = (): ReadonlySet<string> =>\n _streetAbbrevs ?? new Set();\n\n/**\n * Scan backwards from known address entities and\n * house number patterns to find street names.\n *\n * Strategy (a): from a house number like \"2512/2a\",\n * walk left to find the first uppercase word — that's\n * the street name start. \"Mezi úvozy 2512/2a\" →\n * captures \"Mezi úvozy 2512/2a\".\n *\n * Strategy (b): if a colon \":\" appears within 3 chars\n * before the street start, boost confidence. Colons\n * signal \"label: value\" pairs universal in contracts.\n *\n * Strategy (c): in the header zone (top 15% of doc),\n * be more aggressive — detect street patterns even\n * without nearby address entities.\n */\nexport const detectStreetPatternsNearAddresses = (\n fullText: string,\n existingEntities: Entity[],\n): Entity[] => {\n const results: Entity[] = [];\n const addressEntities = existingEntities.filter(\n (e) => e.label === \"address\",\n );\n const headerEnd = Math.floor(\n fullText.length * HEADER_ZONE_FRACTION,\n );\n\n // Find all house number positions in the text.\n // Slash-style house numbers only: either with a letter\n // suffix (\"2512/2a\") or primary >= 100 (\"853/12\").\n // This excludes date-like patterns (\"31/12\", \"1/1\").\n // Require either a letter suffix (2512/2a) or a\n // primary part > 31 to avoid matching Czech slash\n // dates like \"31/12\" or \"1/1\". Slash house numbers\n // in Czech addresses almost always have primary > 99\n // or carry a letter suffix.\n const houseNumRe =\n /\\b(?:\\d{1,4}\\/\\d+[a-zA-Z]\\b|\\d{3,4}\\/\\d+\\b|(?:1[3-9]|[2-9]\\d)\\/\\d{3,}\\b)/g;\n houseNumRe.lastIndex = 0;\n\n for (\n let m = houseNumRe.exec(fullText);\n m !== null;\n m = houseNumRe.exec(fullText)\n ) {\n const numStart = m.index;\n const numEnd = numStart + m[0].length;\n\n // Skip if already covered by an existing entity\n if (\n existingEntities.some(\n (e) => e.start <= numStart && e.end >= numEnd,\n )\n ) {\n continue;\n }\n\n // Is this near a known address entity OR in header?\n const inHeader = numStart < headerEnd;\n const nearAddress = addressEntities.some(\n (e) =>\n Math.abs(e.start - numEnd) <\n STREET_CONTEXT_WINDOW ||\n Math.abs(e.end - numStart) <\n STREET_CONTEXT_WINDOW,\n );\n\n if (!inHeader && !nearAddress) {\n continue;\n }\n\n // Backward scan: find street name before the\n // house number. Walk left over whitespace, then\n // collect words that start with uppercase.\n let scanPos = numStart - 1;\n\n // Skip whitespace before the number (including\n // non-breaking spaces from PDF extraction)\n while (\n scanPos >= 0 &&\n /[\\s\\u00A0]/.test(fullText[scanPos] ?? \"\")\n ) {\n scanPos--;\n }\n\n if (scanPos < 0) {\n continue;\n }\n\n // Track if any temporal preposition was passed\n // through during the scan (e.g., \"do\", \"od\").\n // If so, the result is likely a date expression\n // even if wordCount > 1 (\"Praha do 225/1\").\n let hasTemporalPrep = false;\n\n // Collect words backwards until we hit:\n // - a non-letter character (except space/dot)\n // - a newline\n // - start of text\n // - a lowercase-only word (not a street name)\n let streetStart = scanPos + 1;\n let wordCount = 0;\n const MAX_WORDS = 5;\n\n while (scanPos >= 0 && wordCount < MAX_WORDS) {\n // Find end of current word. If we're on a dot,\n // include it (street abbreviations: \"ul.\", \"nám.\")\n let wordEnd = scanPos + 1;\n const hasDot = fullText[scanPos] === \".\";\n if (hasDot) {\n scanPos--;\n }\n\n // Walk back through word chars (letters, marks,\n // and digits for tokens like \"28\" in \"28. října\").\n while (\n scanPos >= 0 &&\n /[\\p{L}\\p{M}\\d]/u.test(\n fullText[scanPos] ?? \"\",\n )\n ) {\n scanPos--;\n }\n const wordStart = scanPos + 1;\n const rawWord = fullText.slice(\n wordStart,\n wordEnd,\n );\n // Strip trailing dot for word checks\n const word = hasDot\n ? rawWord.slice(0, -1)\n : rawWord;\n\n if (word.length === 0) {\n break;\n }\n\n // Check if this is a known street abbreviation\n // (e.g., \"ul.\", \"nám.\", \"tř.\", \"nábř.\")\n const isStreetAbbrev =\n hasDot &&\n getStreetAbbrevs().has(rawWord.toLowerCase());\n\n // Word must start with uppercase (street name),\n // be a known preposition, a street abbreviation,\n // or a digit-starting token (e.g., \"28.\" in\n // \"28. října 1168/102\").\n const isUpper = UPPER_WORD_RE.test(\n word[0] ?? \"\",\n );\n const isPrep = getAddressPreps().has(\n word.toLowerCase(),\n );\n const isDigitToken = /^\\d{1,2}$/.test(word);\n\n if (\n !isUpper &&\n !isPrep &&\n !isStreetAbbrev &&\n !isDigitToken\n ) {\n break;\n }\n\n // Track temporal prepositions passed through\n if (\n isPrep &&\n getTemporalPreps().has(word.toLowerCase())\n ) {\n hasTemporalPrep = true;\n }\n\n streetStart = wordStart;\n wordCount++;\n\n // Skip whitespace before this word (inc. NBSP)\n while (\n scanPos >= 0 &&\n /[\\s\\u00A0]/.test(fullText[scanPos] ?? \"\")\n ) {\n scanPos--;\n }\n\n // Stop at newline, tab, comma, semicolon\n const prevCh = fullText[scanPos];\n if (\n prevCh === \"\\n\" ||\n prevCh === \"\\t\" ||\n prevCh === \";\" ||\n prevCh === undefined\n ) {\n break;\n }\n\n // Comma: stop (it separates address from\n // previous clause)\n if (prevCh === \",\") {\n break;\n }\n }\n\n if (wordCount === 0) {\n continue;\n }\n\n const streetText = fullText.slice(\n streetStart,\n numEnd,\n );\n\n // Skip if too short (single digit without name)\n if (streetText.length < 4) {\n continue;\n }\n\n // Guard: reject if any temporal preposition was\n // encountered during the backward scan. Catches\n // both \"do 225/1\" (wordCount=1) and \"Praha do\n // 225/1\" (wordCount=2).\n if (hasTemporalPrep) {\n continue;\n }\n\n // Skip if already covered\n if (\n existingEntities.some(\n (e) =>\n e.start <= streetStart && e.end >= numEnd,\n )\n ) {\n continue;\n }\n\n // Colon boost: if \":\" appears within 5 chars\n // before street start, this is a \"label: value\"\n // pair — very high confidence.\n const beforeStreet = fullText.slice(\n Math.max(0, streetStart - 5),\n streetStart,\n );\n const hasColon = beforeStreet.includes(\":\");\n const score = hasColon ? 0.95 : inHeader ? 0.85 : 0.8;\n\n results.push({\n start: streetStart,\n end: numEnd,\n label: \"address\",\n text: streetText,\n score,\n source: \"regex\",\n });\n }\n\n // ── Second scan: bare house numbers near addresses ─\n // \"Vinohradská 46\" near \"Praha 2\" → address.\n // Uppercase word + space + 1-3 digit number, no slash.\n // Capped at 3 digits to exclude year numbers (2024).\n const bareHouseRe =\n /(?<=\\s|^)(\\p{Lu}\\p{Ll}[\\p{Ll}\\p{Lu}]+\\s+\\d{1,3})\\b/gu;\n bareHouseRe.lastIndex = 0;\n\n // Merge existing + newly found entities for proximity\n const allAddr = [\n ...addressEntities,\n ...results,\n ];\n\n for (\n let m = bareHouseRe.exec(fullText);\n m !== null;\n m = bareHouseRe.exec(fullText)\n ) {\n const captured = m[1];\n if (captured === undefined) continue;\n\n const start = m.index;\n const end = start + captured.length;\n\n // Must be on the same line as a confirmed address\n // entity and within 50 chars.\n const nearAddr = allAddr.some((e) => {\n const dist = Math.min(\n Math.abs(e.start - end),\n Math.abs(e.end - start),\n );\n if (dist > 50) return false;\n // Ensure same line: no newline between\n const lo = Math.min(e.start, start);\n const hi = Math.max(e.end, end);\n const between = fullText.slice(lo, hi);\n return !between.includes(\"\\n\");\n });\n\n if (!nearAddr) continue;\n\n // Extract the uppercase word to check stopwords\n const spaceIdx = captured.search(/\\s+\\d/);\n const word =\n spaceIdx > 0\n ? captured.slice(0, spaceIdx)\n : captured;\n\n if (BARE_STOPWORDS.has(word)) continue;\n\n // Skip if overlapping an existing entity\n const allEntities = [\n ...existingEntities,\n ...results,\n ];\n const overlaps = allEntities.some(\n (e) => e.start < end && e.end > start,\n );\n if (overlaps) continue;\n\n results.push({\n start,\n end,\n label: \"address\",\n text: captured,\n score: 0.75,\n source: \"regex\",\n });\n }\n\n return results;\n};\n\n// ── Orphan street lines in header zone ──────────────\n\n// Orphan street: first word uppercase, subsequent words\n// can be lowercase (Czech: \"Karlínské náměstí 7\",\n// \"Pražská ulice 12\") or uppercase (\"Národní třída 1\").\n// House number requires 2+ digits to avoid matching\n// contract headings like \"Příloha 1\" or \"Smlouva 3\".\nconst ORPHAN_STREET_RE =\n /^\\s*(\\p{Lu}[\\p{Ll}\\p{Lu}]+(?:\\s+[\\p{Lu}\\p{Ll}][\\p{Ll}]+)*\\s+\\d{2,4}[a-zA-Z]?)\\s*$/gmu;\n\n/**\n * In the header zone (top 15%), find standalone lines\n * matching \"[Uppercase word(s)] [number]\" that sit\n * between other detected entities. These are almost\n * certainly street addresses in party definitions.\n *\n * Example: \"Evropská 710\" on its own line between\n * an organization entity and a postal code entity.\n */\nexport const detectOrphanStreetLines = (\n fullText: string,\n existingEntities: Entity[],\n): Entity[] => {\n const headerEnd = Math.floor(\n fullText.length * HEADER_ZONE_FRACTION,\n );\n const results: Entity[] = [];\n ORPHAN_STREET_RE.lastIndex = 0;\n\n for (\n let m = ORPHAN_STREET_RE.exec(fullText);\n m !== null;\n m = ORPHAN_STREET_RE.exec(fullText)\n ) {\n const captured = m[1];\n if (captured === undefined) {\n continue;\n }\n const start = m.index + m[0].indexOf(captured);\n const end = start + captured.length;\n\n // Only in header zone\n if (start >= headerEnd) {\n continue;\n }\n\n // Skip if already covered\n if (\n existingEntities.some(\n (e) => e.start <= start && e.end >= end,\n )\n ) {\n continue;\n }\n\n // Must have a nearby entity (within 200 chars)\n const hasContext = existingEntities.some(\n (e) =>\n Math.abs(e.start - end) < 200 ||\n Math.abs(e.end - start) < 200,\n );\n if (!hasContext) {\n continue;\n }\n\n results.push({\n start,\n end,\n label: \"address\",\n text: captured,\n score: 0.85,\n source: \"regex\",\n });\n }\n\n return results;\n};\n","import type { Entity } from \"../types\";\nimport type { PipelineContext } from \"../context\";\nimport { defaultContext } from \"../context\";\n\n// ── Zone types ───────────────────────────────────\n\nexport type DocumentZone =\n | \"header\"\n | \"signature\"\n | \"body\"\n | \"table\";\n\nexport type ZoneSpan = {\n zone: DocumentZone;\n start: number;\n end: number;\n};\n\n// ── Score adjustments per zone ───────────────────\n\n/**\n * Additive score adjustments per document zone.\n * Header and signature blocks are dense with PII;\n * tables often contain structured identifying data.\n */\nexport const ZONE_SCORE_ADJUSTMENTS = {\n header: 0.1,\n signature: 0.15,\n body: 0,\n table: 0.05,\n} as const satisfies Record<DocumentZone, number>;\n\n// ── Lazy-loaded config ───────────────────────────\n\ntype SectionHeadingsConfig = {\n patterns: Array<{ re: string; flags: string }>;\n};\n\ntype SigningClauseConfig = {\n patterns: Array<{\n lang: string;\n prefix: string;\n suffix: string;\n prepositions: string[];\n }>;\n};\n\nconst loadSectionHeadings =\n async (): Promise<RegExp[]> => {\n const mod = await import(\n \"@stll/anonymize-data/config/section-headings.json\"\n );\n const data: SectionHeadingsConfig =\n mod.default ?? mod;\n return data.patterns.map(\n (p) => new RegExp(p.re, p.flags),\n );\n };\n\nconst loadSigningClauses =\n async (): Promise<RegExp[]> => {\n const mod = await import(\n \"@stll/anonymize-data/config/signing-clauses.json\"\n );\n const data: SigningClauseConfig =\n mod.default ?? mod;\n return data.patterns.map((p) => {\n // Build a pattern that matches the signing\n // clause prefix at the start of a line.\n // Note: prefix/suffix are regex fragments by\n // design (e.g. `(?:V|Ve)\\\\s+`), not literals.\n const prefix = p.prefix || \"\";\n const suffix = p.suffix || \"\";\n // Include prepositions so multi-word place\n // names like \"Ústí nad Labem\" are matched,\n // consistent with buildSigningClausePatterns\n // in detectors/regex.ts.\n const prepAlt =\n p.prepositions.length > 0\n ? p.prepositions.join(\"|\")\n : null;\n const place = prepAlt\n ? `\\\\p{Lu}\\\\p{Ll}+` +\n `(?:\\\\s+(?:${prepAlt})` +\n `\\\\s+\\\\p{Lu}\\\\p{Ll}+)*` +\n `(?:\\\\s+\\\\p{Lu}\\\\p{Ll}+)*`\n : `\\\\p{Lu}\\\\p{Ll}+` +\n `(?:[- ]\\\\p{Lu}\\\\p{Ll}+)*`;\n // Anchor to the start of the line. Each line is\n // already split on \\n, so ^ suffices without m.\n const combined =\n `^\\\\s*(?:${prefix}${place}${suffix})`;\n return new RegExp(combined, \"u\");\n });\n };\n\n/**\n * Ensure config data is loaded. Call once before\n * classifyZones. Safe to call multiple times.\n */\nexport const initZoneClassifier = (\n ctx: PipelineContext = defaultContext,\n): Promise<void> => {\n if (ctx.zoneInitPromise) return ctx.zoneInitPromise;\n ctx.zoneInitPromise = Promise.all([\n loadSectionHeadings(),\n loadSigningClauses(),\n ])\n .then(([headings, clauses]) => {\n ctx.zoneHeadingPatterns = headings;\n ctx.zoneSigningPatterns = clauses;\n })\n .catch((err: unknown) => {\n // Clear cached promise so a subsequent call\n // can retry after a transient failure.\n ctx.zoneInitPromise = null;\n throw err;\n });\n return ctx.zoneInitPromise;\n};\n\n// ── Table detection ──────────────────────────────\n\nconst MIN_TABS_FOR_TABLE = 2;\n\nconst isTableLine = (line: string): boolean => {\n let tabCount = 0;\n for (const ch of line) {\n if (ch === \"\\t\") tabCount++;\n if (tabCount >= MIN_TABS_FOR_TABLE) return true;\n }\n return false;\n};\n\n// ── Zone classification ──────────────────────────\n\n/**\n * Classify a document into zones based on\n * structural heuristics. Zones are non-overlapping\n * and cover the entire text.\n *\n * Must call `initZoneClassifier()` first.\n */\nexport const classifyZones = (\n fullText: string,\n ctx: PipelineContext = defaultContext,\n): ZoneSpan[] => {\n if (fullText.length === 0) return [];\n\n const headingRes = ctx.zoneHeadingPatterns;\n const signingRes = ctx.zoneSigningPatterns;\n\n if (!headingRes || !signingRes) {\n console.warn(\n \"[anonymize] classifyZones called before \" +\n \"initZoneClassifier(); returning body-only\",\n );\n return [\n { zone: \"body\", start: 0, end: fullText.length },\n ];\n }\n\n const lines = fullText.split(\"\\n\");\n const zones: ZoneSpan[] = [];\n\n // Find header end: first section heading line\n let headerEndLine = -1;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line === undefined) continue;\n for (const re of headingRes) {\n if (re.test(line)) {\n headerEndLine = i;\n break;\n }\n }\n if (headerEndLine !== -1) break;\n }\n\n // Find signature start: last signing clause line\n let signatureStartLine = -1;\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line === undefined) continue;\n for (const re of signingRes) {\n if (re.test(line)) {\n signatureStartLine = i;\n break;\n }\n }\n if (signatureStartLine !== -1) break;\n }\n\n // Build offset map: line index -> char offset\n const lineOffsets: number[] = [];\n let offset = 0;\n for (const line of lines) {\n lineOffsets.push(offset);\n // +1 for the newline character\n offset += line.length + 1;\n }\n\n // Determine zone boundaries\n let headerEndOffset =\n headerEndLine >= 0\n ? (lineOffsets[headerEndLine] ?? 0)\n : 0;\n\n const signatureStartOffset =\n signatureStartLine >= 0\n ? (lineOffsets[signatureStartLine] ??\n fullText.length)\n : fullText.length;\n\n // Guard: if the signing clause appears before\n // the first section heading, the zones would\n // overlap. Treat as degenerate layout: drop the\n // header so the signature zone takes priority.\n if (\n headerEndLine > 0 &&\n signatureStartLine >= 0 &&\n headerEndOffset > signatureStartOffset\n ) {\n headerEndLine = -1;\n headerEndOffset = 0;\n }\n\n // Add header zone if detected. Using > 0 (not\n // >= 0) intentionally: when the section heading is\n // on line 0, there is no preamble to classify as a\n // header — everything starts as body.\n if (headerEndLine > 0) {\n zones.push({\n zone: \"header\",\n start: 0,\n end: headerEndOffset,\n });\n }\n\n // Scan body region for table zones\n const bodyStart =\n headerEndLine > 0 ? headerEndOffset : 0;\n const bodyEnd =\n signatureStartLine >= 0\n ? signatureStartOffset\n : fullText.length;\n\n let tableStart = -1;\n for (\n let i = Math.max(headerEndLine, 0);\n i <\n (signatureStartLine >= 0\n ? signatureStartLine\n : lines.length);\n i++\n ) {\n const line = lines[i];\n if (line === undefined) continue;\n const lineStart = lineOffsets[i] ?? 0;\n const lineEnd = lineStart + line.length;\n\n if (isTableLine(line)) {\n if (tableStart === -1) {\n tableStart = lineStart;\n }\n } else if (tableStart !== -1) {\n zones.push({\n zone: \"table\",\n start: tableStart,\n end: lineStart,\n });\n tableStart = -1;\n }\n\n // Close table at the end of body range\n if (\n i ===\n (signatureStartLine >= 0\n ? signatureStartLine - 1\n : lines.length - 1) &&\n tableStart !== -1\n ) {\n zones.push({\n zone: \"table\",\n start: tableStart,\n end: Math.min(lineEnd + 1, bodyEnd),\n });\n tableStart = -1;\n }\n }\n\n // Fill body gaps between header/table/signature\n const sortedSpecial = zones.toSorted(\n (a, b) => a.start - b.start,\n );\n\n let cursor = bodyStart;\n const bodyZones: ZoneSpan[] = [];\n for (const span of sortedSpecial) {\n if (span.zone === \"header\") continue;\n if (span.start > cursor) {\n bodyZones.push({\n zone: \"body\",\n start: cursor,\n end: span.start,\n });\n }\n cursor = Math.max(cursor, span.end);\n }\n if (cursor < bodyEnd) {\n bodyZones.push({\n zone: \"body\",\n start: cursor,\n end: bodyEnd,\n });\n }\n\n for (const z of bodyZones) zones.push(z);\n\n // Add signature zone if detected\n if (signatureStartLine >= 0) {\n zones.push({\n zone: \"signature\",\n start: signatureStartOffset,\n end: fullText.length,\n });\n }\n\n return zones.toSorted(\n (a, b) => a.start - b.start,\n );\n};\n\n// ── Entity zone lookup ───────────────────────────\n\n/**\n * Find which zone an entity's midpoint falls in.\n * Returns \"body\" if no zone matches (defensive).\n */\nconst findZone = (\n midpoint: number,\n zones: ZoneSpan[],\n): DocumentZone => {\n for (const span of zones) {\n if (\n midpoint >= span.start &&\n midpoint < span.end\n ) {\n return span.zone;\n }\n }\n return \"body\";\n};\n\n/**\n * Apply zone-based score adjustments to entities.\n * Entities in header/signature/table zones get a\n * small additive boost reflecting the higher PII\n * density in those regions.\n *\n * Returns a new array; does not mutate inputs.\n */\nexport const applyZoneAdjustments = (\n entities: Entity[],\n zones: ZoneSpan[],\n): Entity[] => {\n if (zones.length === 0) {\n return entities.map((e) => ({ ...e }));\n }\n\n const result: Entity[] = [];\n for (const entity of entities) {\n const midpoint =\n (entity.start + entity.end) / 2;\n const zone = findZone(midpoint, zones);\n const adjustment = ZONE_SCORE_ADJUSTMENTS[zone];\n\n if (adjustment > 0) {\n result.push({\n ...entity,\n score: Math.min(\n 1,\n entity.score + adjustment,\n ),\n });\n } else {\n result.push({ ...entity });\n }\n }\n return result;\n};\n","import type { Match, PatternEntry } from \"@stll/text-search\";\n\nimport { getTextSearch } from \"../search-engine\";\nimport type { Entity } from \"../types\";\n\n// ── Types ───────────────────────────────────────────\n\nexport type HotwordRule = {\n hotwords: string[];\n targetLabels: string[];\n scoreAdjustment: number;\n reclassifyTo?: string;\n proximityBefore: number;\n proximityAfter: number;\n};\n\ntype HotwordRulesConfig = {\n rules: HotwordRule[];\n};\n\n// ── Lazy-loaded state ───────────────────────────────\n\nlet rules: HotwordRule[] | null = null;\nlet search: { findIter: (text: string) => Match[] } | null = null;\n/**\n * Maps each TextSearch pattern index back to the\n * rule index that owns it, so a single AC scan\n * resolves all hotword hits to their rule.\n */\nlet patternToRule: number[] | null = null;\nlet initPromise: Promise<void> | null = null;\n\n// ── Init ────────────────────────────────────────────\n\nconst loadRules = async (): Promise<void> => {\n const mod = await import(\n \"@stll/anonymize-data/config/hotword-rules.json\"\n );\n const data: HotwordRulesConfig = mod.default ?? mod;\n const loaded = data.rules;\n\n // Build a flat pattern list and the reverse map.\n const patterns: PatternEntry[] = [];\n const mapping: number[] = [];\n\n for (\n let ruleIdx = 0;\n ruleIdx < loaded.length;\n ruleIdx++\n ) {\n const rule = loaded[ruleIdx];\n if (!rule) continue;\n for (const hw of rule.hotwords) {\n patterns.push({\n pattern: hw,\n literal: true,\n caseInsensitive: true,\n });\n mapping.push(ruleIdx);\n }\n }\n\n const builtSearch =\n patterns.length > 0\n ? new (getTextSearch())(patterns, {\n overlapStrategy: \"all\",\n caseInsensitive: true,\n wholeWords: true,\n })\n : null;\n\n // Assign all module state atomically after all\n // failable operations succeed, so a mid-flight\n // error cannot leave a half-initialized state.\n patternToRule = mapping;\n search = builtSearch;\n rules = loaded;\n};\n\n/**\n * Load hotword rules from the data package.\n * Safe to call multiple times; subsequent calls\n * are no-ops.\n */\nexport const initHotwordRules =\n async (): Promise<void> => {\n if (rules !== null) return;\n if (initPromise !== null) return initPromise;\n initPromise = loadRules().catch((err) => {\n // Reset so callers can retry on transient failure.\n initPromise = null;\n throw err;\n });\n return initPromise;\n };\n\n// ── Application ─────────────────────────────────────\n\n/**\n * Apply hotword context rules to detected entities.\n *\n * Scans `fullText` once with a single AC automaton\n * for all hotwords across all rules, then checks\n * proximity to each entity. Distance-decayed\n * adjustment: closer hotwords give a stronger boost.\n *\n * Returns a new array; input entities are not mutated.\n */\nexport const applyHotwordRules = (\n entities: Entity[],\n fullText: string,\n): Entity[] => {\n if (\n rules === null ||\n rules.length === 0 ||\n search === null ||\n patternToRule === null\n ) {\n return entities;\n }\n\n // Single scan for all hotword positions.\n const hits = search.findIter(fullText);\n if (hits.length === 0) return entities;\n\n // Group hits by rule index for fast lookup.\n const hitsByRule = new Map<number, Match[]>();\n for (const hit of hits) {\n const ruleIdx = patternToRule[hit.pattern];\n if (ruleIdx === undefined) continue;\n let bucket = hitsByRule.get(ruleIdx);\n if (bucket === undefined) {\n bucket = [];\n hitsByRule.set(ruleIdx, bucket);\n }\n bucket.push(hit);\n }\n\n const result: Entity[] = [];\n\n for (const entity of entities) {\n let bestAdjustment = 0;\n let bestReclassify: string | undefined;\n\n for (\n let ruleIdx = 0;\n ruleIdx < rules.length;\n ruleIdx++\n ) {\n const rule = rules[ruleIdx];\n if (!rule) continue;\n\n // Check if entity label matches this rule.\n if (!rule.targetLabels.includes(entity.label)) {\n continue;\n }\n\n const ruleHits = hitsByRule.get(ruleIdx);\n if (ruleHits === undefined) continue;\n\n for (const hit of ruleHits) {\n // Asymmetric proximity check.\n // Hotword BEFORE entity: hotword end <=\n // entity start, distance = entity.start -\n // hit.end\n // Hotword AFTER entity: hotword start >=\n // entity end, distance = hit.start -\n // entity.end\n let distance: number;\n let maxDistance: number;\n\n if (hit.end <= entity.start) {\n // Hotword is before the entity.\n distance = entity.start - hit.end;\n maxDistance = rule.proximityBefore;\n } else if (hit.start >= entity.end) {\n // Hotword is after the entity.\n distance = hit.start - entity.end;\n maxDistance = rule.proximityAfter;\n } else {\n // Hotword overlaps the entity: distance 0,\n // use larger window for max.\n distance = 0;\n maxDistance = Math.max(\n rule.proximityBefore,\n rule.proximityAfter,\n );\n }\n\n if (distance > maxDistance) continue;\n\n // Distance-decayed adjustment.\n const decay =\n maxDistance === 0\n ? 1\n : 1 - distance / maxDistance;\n const adj = rule.scoreAdjustment * decay;\n\n if (Math.abs(adj) > Math.abs(bestAdjustment)) {\n bestAdjustment = adj;\n // Only carry reclassification from boost\n // rules; a penalty winner must not silently\n // overwrite a label set by a closer positive\n // rule.\n if (adj > 0) {\n bestReclassify = rule.reclassifyTo;\n } else {\n bestReclassify = undefined;\n }\n }\n }\n }\n\n if (bestAdjustment === 0) {\n result.push(entity);\n continue;\n }\n\n const newScore = Math.min(\n 1,\n Math.max(0, entity.score + bestAdjustment),\n );\n const newLabel =\n bestReclassify !== undefined\n ? bestReclassify\n : entity.label;\n\n result.push({\n ...entity,\n score: newScore,\n label: newLabel,\n });\n }\n\n return result;\n};\n","import type { Entity } from \"../types\";\n\n/** Max gap (in chars) between entities to merge. */\nconst MAX_GAP = 3;\n\n/**\n * Characters allowed in the gap between two adjacent\n * same-label entities that should be merged: spaces,\n * tabs, commas, and hyphens. Uses `[ \\t,\\-]` instead\n * of `\\s` to avoid merging entities across newlines.\n */\nconst GAP_PATTERN = /^[ \\t,\\-]+$/;\n\n/**\n * Build a set of word boundary offsets for the full\n * text using `Intl.Segmenter`. Returns a sorted array\n * of offsets where words start and end.\n */\nconst buildWordBoundaries = (\n text: string,\n): Set<number> => {\n // Use \"und\" (undetermined) locale for consistent\n // word-boundary results across environments.\n const segmenter = new Intl.Segmenter(\"und\", {\n granularity: \"word\",\n });\n const boundaries = new Set<number>();\n for (const seg of segmenter.segment(text)) {\n if (!seg.isWordLike) continue;\n boundaries.add(seg.index);\n boundaries.add(seg.index + seg.segment.length);\n }\n return boundaries;\n};\n\n/**\n * Characters that act as hard stops when scanning\n * backward for a word boundary. Entity boundaries\n * should never extend past these.\n */\nconst WORD_START_STOPS = new Set([\n \"\\n\", \"\\r\", \",\", \";\", \"(\", \")\", \"[\", \"]\",\n]);\n\n/**\n * Find the word-start offset at or before `pos`.\n * Scans left until a word boundary is found.\n */\nconst wordStartAt = (\n pos: number,\n boundaries: Set<number>,\n text: string,\n): number => {\n let p = pos;\n while (p > 0 && !boundaries.has(p)) {\n const prev = text[p - 1];\n if (\n prev !== undefined &&\n WORD_START_STOPS.has(prev)\n ) {\n return p;\n }\n p--;\n }\n return p;\n};\n\n/**\n * Characters that act as hard stops when scanning\n * forward for a word boundary. Entity boundaries\n * should never extend past these.\n */\nconst WORD_END_STOPS = new Set([\n \"\\n\", \"\\r\", \",\", \";\", \".\", \"(\", \")\", \"[\", \"]\",\n]);\n\n/**\n * Find the word-end offset at or after `pos`.\n * Scans right until a word boundary is found.\n */\nconst wordEndAt = (\n pos: number,\n boundaries: Set<number>,\n text: string,\n): number => {\n let p = pos;\n while (p < text.length && !boundaries.has(p)) {\n const ch = text[p];\n if (ch !== undefined && WORD_END_STOPS.has(ch)) {\n return p;\n }\n p++;\n }\n return p;\n};\n\n/**\n * Binary search: find the leftmost index in `arr`\n * where `arr[index].start >= value`.\n */\nconst lowerBound = (\n arr: Entity[],\n value: number,\n): number => {\n let lo = 0;\n let hi = arr.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const el = arr[mid];\n if (el && el.start < value) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n return lo;\n};\n\n/**\n * Merge adjacent same-label entities separated only by\n * whitespace, comma, or hyphen (max 3 chars). Also\n * merges same-label entities that partially overlap\n * (which can happen after word-boundary expansion).\n *\n * Looks for the last same-label entity in the result\n * (not just the very last entity) so that an\n * intervening different-label entity does not prevent\n * merging.\n *\n * Uses binary search for the `gapOccupied` check and\n * a Map for O(1) same-label prev lookup. O(n log n).\n */\nconst mergeAdjacent = (\n entities: Entity[],\n fullText: string,\n): Entity[] => {\n const sorted = entities.toSorted(\n (a, b) => a.start - b.start,\n );\n const result: Entity[] = [];\n // O(1) lookup for the last same-label entity in\n // result, replacing the O(n) backward scan.\n const lastByLabel = new Map<string, Entity>();\n\n for (const entity of sorted) {\n const prev = lastByLabel.get(entity.label);\n\n if (!prev) {\n const copy = { ...entity };\n result.push(copy);\n lastByLabel.set(entity.label, copy);\n continue;\n }\n\n // Handle overlap created by fixPartialWords:\n // two same-label entities may now partially overlap\n // after word-boundary expansion.\n if (entity.start < prev.end) {\n prev.end = Math.max(prev.end, entity.end);\n prev.text = fullText.slice(prev.start, prev.end);\n prev.score = Math.max(prev.score, entity.score);\n continue;\n }\n\n const gap = fullText.slice(prev.end, entity.start);\n // GAP_PATTERN uses `+` quantifier, so empty gaps\n // (zero-gap / touching entities) won't match.\n // Also reject merging when a different-label entity\n // occupies the gap range (would create cross-label\n // overlap). Use binary search to find candidates\n // in the gap range instead of scanning all entities.\n const gapStart = prev.end;\n const gapEnd = entity.start;\n const searchIdx = lowerBound(sorted, gapStart);\n let gapOccupied = false;\n for (let k = searchIdx; k < sorted.length; k++) {\n const other = sorted[k];\n if (!other || other.start >= gapEnd) break;\n if (\n other.label !== entity.label &&\n other.end > gapStart\n ) {\n gapOccupied = true;\n break;\n }\n }\n\n if (\n !gapOccupied &&\n gap.length <= MAX_GAP &&\n GAP_PATTERN.test(gap)\n ) {\n // Merge into prev\n prev.end = entity.end;\n prev.text = fullText.slice(prev.start, prev.end);\n prev.score = Math.max(prev.score, entity.score);\n } else {\n const copy = { ...entity };\n result.push(copy);\n lastByLabel.set(entity.label, copy);\n }\n }\n\n return result;\n};\n\n/**\n * Fix partial-word boundaries by extending entity\n * start/end to the nearest word boundary. Does not\n * extend across newlines or into spans occupied by\n * different-label entities.\n *\n * Uses binary search to skip irrelevant entries when\n * clamping at cross-label neighbors. O(n log n) in\n * the common case; O(n^2) worst case when many\n * same-label entities precede a cross-label boundary.\n */\nconst fixPartialWords = (\n entities: Entity[],\n fullText: string,\n): Entity[] => {\n const boundaries = buildWordBoundaries(fullText);\n const sorted = entities.toSorted(\n (a, b) => a.start - b.start,\n );\n\n // Build a secondary array sorted by end position\n // for efficient \"nearest entity ending before me\"\n // lookups. Each entry tracks the original entity.\n const byEnd = sorted\n .map((e, idx) => ({ entity: e, idx }))\n .sort((a, b) => a.entity.end - b.entity.end);\n const endPositions = byEnd.map((x) => x.entity.end);\n\n return sorted.map((e, eIdx) => {\n let newStart = wordStartAt(\n e.start,\n boundaries,\n fullText,\n );\n let newEnd = wordEndAt(\n e.end,\n boundaries,\n fullText,\n );\n\n // Clamp start: find different-label entities whose\n // end is in (newStart, e.start]. We search byEnd\n // for entities with end > newStart and end <= e.start.\n // Binary search for the first entry with\n // end > newStart.\n let lo = 0;\n let hi = endPositions.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (\n (endPositions[mid] ?? Number.POSITIVE_INFINITY) <=\n newStart\n ) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n // Scan forward from lo; all entries have end >\n // newStart. Stop when end > e.start.\n for (let k = lo; k < byEnd.length; k++) {\n const entry = byEnd[k];\n if (!entry || entry.entity.end > e.start) break;\n if (entry.idx === eIdx) continue;\n if (entry.entity.label === e.label) continue;\n // This entity's end is in (newStart, e.start]\n // and has a different label: clamp.\n newStart = Math.max(\n newStart,\n entry.entity.end,\n );\n }\n\n // Clamp end: find different-label entities whose\n // start is in [e.end, newEnd). Use the start-sorted\n // array with binary search.\n const startIdx = lowerBound(sorted, e.end);\n for (let k = startIdx; k < sorted.length; k++) {\n const other = sorted[k];\n if (!other || other.start >= newEnd) break;\n if (other === e) continue;\n if (other.label === e.label) continue;\n // This entity's start is in [e.end, newEnd)\n // and has a different label: clamp.\n newEnd = Math.min(newEnd, other.start);\n }\n\n if (newStart === e.start && newEnd === e.end) {\n return e;\n }\n return {\n ...e,\n start: newStart,\n end: newEnd,\n text: fullText.slice(newStart, newEnd),\n };\n });\n};\n\n/**\n * Deduplicate entities with identical [start, end, label].\n * Keeps the entry with the highest score.\n */\nconst deduplicateSpans = (\n entities: Entity[],\n): Entity[] => {\n const seen = new Map<string, Entity>();\n for (const entity of entities) {\n const key =\n `${entity.start}:${entity.end}:${entity.label}`;\n const existing = seen.get(key);\n if (\n !existing ||\n entity.score > existing.score\n ) {\n seen.set(key, entity);\n }\n }\n return [...seen.values()];\n};\n\n/**\n * Remove nested same-label entities. If a shorter\n * entity is fully contained within a longer entity\n * of the same label, drop the shorter one.\n *\n * Uses a \"max end seen\" sweep per label. O(n) after\n * the initial sort.\n */\nconst removeNestedSameLabel = (\n entities: Entity[],\n): Entity[] => {\n // Sort by start asc, then by length desc so the\n // longer entity comes first.\n const sorted = entities.toSorted((a, b) => {\n if (a.start !== b.start) return a.start - b.start;\n return b.end - a.end;\n });\n\n const result: Entity[] = [];\n // Track the furthest end seen per label. Any entity\n // whose end <= maxEnd for its label is nested inside\n // a previously seen entity of the same label.\n const maxEndByLabel = new Map<string, number>();\n\n for (const entity of sorted) {\n const maxEnd = maxEndByLabel.get(entity.label);\n if (\n maxEnd !== undefined &&\n entity.end <= maxEnd\n ) {\n // Nested inside a same-label entity: skip.\n continue;\n }\n maxEndByLabel.set(entity.label, entity.end);\n result.push(entity);\n }\n\n return result;\n};\n\n/**\n * Resolve cross-label overlaps that can arise when\n * `fixPartialWords` independently expands two\n * different-label entities toward the same word\n * boundary. The entity with the higher score (or\n * longer span on tie) keeps its boundary; the other\n * is trimmed so the overlap disappears.\n *\n * Preserved existing structure: sorted + early break\n * already gives good amortized behavior. O(n^2)\n * worst case but rare in practice.\n */\nconst resolveCrossLabelOverlaps = (\n entities: Entity[],\n fullText: string,\n): Entity[] => {\n const sorted = entities\n .map((e) => ({ ...e }))\n .sort((a, b) => a.start - b.start);\n\n for (let i = 0; i < sorted.length; i++) {\n for (let j = i + 1; j < sorted.length; j++) {\n const a = sorted[i];\n const b = sorted[j];\n if (!a || !b) continue;\n if (b.start >= a.end) break; // no overlap\n if (a.label === b.label) continue;\n\n // Skip full containment (one entity fully\n // inside another). Cross-label nesting is\n // valid and should be preserved.\n const aContainsB =\n a.start <= b.start && a.end >= b.end;\n const bContainsA =\n b.start <= a.start && b.end >= a.end;\n if (aContainsB || bContainsA) continue;\n\n // Partial overlap. Higher score wins; on tie\n // the longer span wins.\n const aLen = a.end - a.start;\n const bLen = b.end - b.start;\n const aWins =\n a.score > b.score ||\n (a.score === b.score && aLen >= bLen);\n\n if (aWins) {\n // Trim b's start to a's end\n b.start = a.end;\n b.text = fullText.slice(b.start, b.end);\n } else {\n // Trim a's end to b's start. Because the\n // array is sorted by start and a.end can\n // only decrease, all remaining j will have\n // b.start >= a.end so the break fires\n // immediately.\n a.end = b.start;\n a.text = fullText.slice(a.start, a.end);\n }\n }\n }\n\n // Drop any entity that was trimmed to zero width.\n return sorted.filter((e) => e.start < e.end);\n};\n\n/**\n * Post-processing pass for entity boundary consistency.\n * Runs after mergeAndDedup, before false-positive\n * filtering.\n *\n * 1. Fix partial-word boundaries (respects cross-label\n * neighbors to avoid introducing new overlaps)\n * 2. Resolve any remaining cross-label overlaps\n * 3. Deduplicate identical [start, end, label] spans\n * 4. Merge adjacent same-label entities (catches any\n * new adjacency/overlap from step 1)\n * 5. Remove nested same-label entities\n */\nexport const enforceBoundaryConsistency = (\n entities: Entity[],\n fullText: string,\n): Entity[] => {\n const fixed = fixPartialWords(entities, fullText);\n const resolved = resolveCrossLabelOverlaps(\n fixed,\n fullText,\n );\n const deduped = deduplicateSpans(resolved);\n const merged = mergeAdjacent(deduped, fullText);\n return removeNestedSameLabel(merged);\n};\n","/**\n * Build the unified search instances from all\n * detector pattern sources.\n *\n * Two TextSearch instances (not one) to avoid\n * 200K per-pattern object allocations:\n * 1. regex + triggers + legal-forms (mixed, ~140\n * patterns, caseInsensitive for trigger AC)\n * 2. deny-list + street-types + gazetteer\n * (caseInsensitive, overlap \"all\";\n * deny-list/street-type use per-pattern\n * wholeWords: true; gazetteer exact use\n * wholeWords: false; gazetteer fuzzy use\n * distance: 2 via @stll/fuzzy-search)\n *\n * All patterns are PatternEntry objects with\n * per-pattern literal/wholeWords settings.\n */\n\nimport type { PatternEntry, TextSearch } from \"@stll/text-search\";\n\nimport { getTextSearch } from \"./search-engine\";\n\nimport type {\n GazetteerEntry,\n PipelineConfig,\n} from \"./types\";\nimport type { RegexMeta } from \"./detectors/regex\";\nimport type { TriggerRule } from \"./types\";\nimport type { DenyListData } from \"./detectors/deny-list\";\nimport type { PipelineContext } from \"./context\";\nimport { defaultContext } from \"./context\";\n\nimport {\n REGEX_PATTERNS,\n REGEX_META,\n getCurrencyPatterns,\n CURRENCY_PATTERN_META,\n getDatePatterns,\n DATE_PATTERN_META,\n getSigningClausePatterns,\n SIGNING_CLAUSE_META,\n} from \"./detectors/regex\";\nimport {\n buildLegalFormPatterns,\n} from \"./detectors/legal-forms\";\nimport {\n buildTriggerPatterns,\n} from \"./detectors/triggers\";\nimport {\n buildDenyList,\n} from \"./detectors/deny-list\";\nimport {\n buildStreetTypePatterns,\n} from \"./detectors/address-seeds\";\nimport {\n buildGazetteerPatterns,\n} from \"./detectors/gazetteer\";\n\ntype PatternSlice = {\n start: number;\n end: number;\n};\n\nexport type GazetteerData = {\n /** Maps local pattern index to entry label. */\n labels: string[];\n /**\n * Whether each pattern is fuzzy (distance > 0).\n * Used by the post-processor to assign scores.\n */\n isFuzzy: boolean[];\n};\n\nexport type UnifiedSearchInstance = {\n /** Regex + triggers + legal-forms. */\n tsRegex: TextSearch;\n /** Deny-list + street-types + gazetteer. */\n tsLiterals: TextSearch;\n slices: {\n regex: PatternSlice;\n legalForms: PatternSlice;\n triggers: PatternSlice;\n denyList: PatternSlice;\n streetTypes: PatternSlice;\n gazetteer: PatternSlice;\n };\n regexMeta: readonly RegexMeta[];\n triggerRules: readonly TriggerRule[];\n denyListData: DenyListData | null;\n gazetteerData: GazetteerData | null;\n};\n\nexport const buildUnifiedSearch = async (\n config: PipelineConfig,\n gazetteerEntries: GazetteerEntry[] = [],\n ctx: PipelineContext = defaultContext,\n): Promise<UnifiedSearchInstance> => {\n const [\n legalForms,\n triggers,\n denyListData,\n streetTypes,\n currencyPatterns,\n datePatterns,\n signingPatterns,\n ] = await Promise.all([\n buildLegalFormPatterns(),\n config.enableTriggerPhrases\n ? buildTriggerPatterns()\n : Promise.resolve({\n patterns: [] as string[],\n rules: [] as TriggerRule[],\n }),\n config.enableDenyList\n ? buildDenyList(config, ctx)\n : Promise.resolve(null),\n buildStreetTypePatterns(),\n getCurrencyPatterns(),\n getDatePatterns(),\n getSigningClausePatterns(),\n ]);\n\n // ── Instance 1: regex + triggers + legal-forms ──\n // Trigger patterns are lowercased strings with\n // caseInsensitive on the AC. Regex patterns have\n // their own (?i) flags (caseInsensitive on AC\n // is ignored for regex since they route to\n // RegexSet). Legal-form patterns are regex too.\n //\n // Currency patterns (from currencies.json) are\n // appended after the static regex patterns; their\n // meta is spliced into regexMeta at the same offset.\n const allRegex = [\n ...(REGEX_PATTERNS as string[]),\n ...currencyPatterns,\n ...datePatterns,\n ...signingPatterns,\n ];\n const regexMeta: RegexMeta[] = [\n ...REGEX_META,\n ...currencyPatterns.map(\n () => CURRENCY_PATTERN_META,\n ),\n ...datePatterns.map(\n () => DATE_PATTERN_META,\n ),\n ...signingPatterns.map(\n () => SIGNING_CLAUSE_META,\n ),\n ];\n\n let offset = 0;\n\n const regexSlice = {\n start: offset,\n end: offset + allRegex.length,\n };\n offset = regexSlice.end;\n\n const legalFormsSlice = {\n start: offset,\n end: offset + legalForms.length,\n };\n offset = legalFormsSlice.end;\n\n const triggersSlice = {\n start: offset,\n end: offset + triggers.patterns.length,\n };\n\n // Trigger patterns need caseInsensitive on AC\n // (only ~120 objects, not 200K). Regex/legal-form\n // patterns are bare strings (auto-classified).\n const triggerEntries = triggers.patterns.map(\n (p) => ({\n pattern: p,\n literal: true as const,\n caseInsensitive: true,\n }),\n );\n\n const regexAllPatterns = [\n ...allRegex,\n ...legalForms,\n ...triggerEntries,\n ];\n\n // TextSearch auto-detects DFA state explosion\n // (build time > 2ms) and falls back to individual\n // engines. No manual maxAlternations needed.\n const tsRegex = new (getTextSearch())(regexAllPatterns);\n\n // ── Instance 2: deny-list + street-types + gaz ──\n // Deny-list and street-type patterns are plain\n // strings (allLiteral). Gazetteer adds exact\n // literals plus fuzzy PatternEntry objects for\n // terms >= 4 chars.\n offset = 0;\n\n const denyListOriginals =\n denyListData?.originals ?? [];\n const denyListSlice = {\n start: offset,\n end: offset + denyListOriginals.length,\n };\n offset = denyListSlice.end;\n\n const streetTypesSlice = {\n start: offset,\n end: offset + streetTypes.length,\n };\n offset = streetTypesSlice.end;\n\n // Gazetteer patterns (exact + fuzzy)\n const gazResult =\n config.enableGazetteer &&\n gazetteerEntries.length > 0\n ? buildGazetteerPatterns(gazetteerEntries)\n : null;\n\n const gazetteerSlice = {\n start: offset,\n end: offset +\n (gazResult?.patterns.length ?? 0),\n };\n offset = gazetteerSlice.end;\n\n // Build the combined pattern array.\n // Deny-list and street-type patterns use\n // per-pattern wholeWords: true (they are\n // known tokens). Gazetteer exact patterns\n // already set wholeWords: false in\n // buildGazetteerPatterns. The global\n // wholeWords is false so fuzzy patterns\n // (which don't support per-pattern override)\n // match without word-boundary constraints.\n const wrapWholeWord = (\n s: string,\n ): PatternEntry => ({\n pattern: s,\n literal: true as const,\n wholeWords: true,\n });\n const literalAllPatterns: PatternEntry[] = [\n ...denyListOriginals.map(wrapWholeWord),\n ...streetTypes.map(wrapWholeWord),\n ...(gazResult?.patterns ?? []),\n ];\n\n const tsLiterals =\n literalAllPatterns.length > 0\n ? new (getTextSearch())(literalAllPatterns, {\n caseInsensitive: true,\n overlapStrategy: \"all\",\n })\n : new (getTextSearch())([]);\n\n return {\n tsRegex,\n tsLiterals,\n slices: {\n regex: regexSlice,\n legalForms: legalFormsSlice,\n triggers: triggersSlice,\n denyList: denyListSlice,\n streetTypes: streetTypesSlice,\n gazetteer: gazetteerSlice,\n },\n regexMeta,\n triggerRules: triggers.rules,\n denyListData,\n gazetteerData: gazResult?.data ?? null,\n };\n};\n","/**\n * Run the two-instance unified search and return\n * raw matches. Two passes instead of six:\n * 1. regex + triggers + legal-forms\n * 2. deny-list + street-types (normalized text)\n */\n\nimport type { Match } from \"@stll/text-search\";\nimport type { UnifiedSearchInstance } from \"./build-unified-search\";\nimport { normalizeForSearch } from \"./util/normalize\";\n\nexport type UnifiedResult = {\n /** All matches from both instances combined. */\n regexMatches: Match[];\n literalMatches: Match[];\n};\n\nexport const runUnifiedSearch = (\n instance: UnifiedSearchInstance,\n fullText: string,\n): UnifiedResult => {\n // Pass 1: regex + triggers + legal-forms\n // on original text (regex patterns encode\n // their own case flags)\n const regexMatches =\n instance.tsRegex.findIter(fullText);\n\n // Pass 2: deny-list + street-types on\n // normalized text (NBSP, smart quotes folded)\n const normalized = normalizeForSearch(fullText);\n const literalMatches =\n instance.tsLiterals.findIter(normalized);\n\n return { regexMatches, literalMatches };\n};\n","import type { Entity } from \"../types\";\n\nconst MASK_TOKEN = \"[MASKED]\";\nconst MASK_LEN = MASK_TOKEN.length;\n\ntype OffsetSegment = {\n /** Start of this mask token in masked text */\n maskedStart: number;\n /** End of this mask token in masked text */\n maskedEnd: number;\n /** Cumulative shift: original - masked */\n shift: number;\n /** Original start of the masked span */\n origStart: number;\n /** Original end of the masked span */\n origEnd: number;\n};\n\nexport type MaskResult = {\n maskedText: string;\n /**\n * Maps masked-text offsets back to original offsets.\n * Returns null if the span overlaps a masked region.\n */\n offsetMap: (\n maskedStart: number,\n maskedEnd: number,\n ) => { start: number; end: number } | null;\n};\n\n/**\n * Replace detected entity spans with placeholder tokens.\n * Each entity span is replaced with \"[MASKED]\" (fixed\n * length). Returns the masked text and an offset mapping\n * function.\n */\nexport const maskDetectedSpans = (\n fullText: string,\n entities: Entity[],\n): MaskResult => {\n if (entities.length === 0) {\n return {\n maskedText: fullText,\n offsetMap: (s, e) => ({ start: s, end: e }),\n };\n }\n\n // Sort by start, then longest span first\n const sorted = entities.toSorted(\n (a, b) => a.start - b.start || b.end - a.end,\n );\n\n // Merge overlapping spans so we don't double-mask.\n // Adjacent (touching) spans are kept separate so each\n // produces its own [MASKED] token, preserving token\n // boundaries for the NER model.\n const spans: { start: number; end: number }[] = [];\n const first = sorted[0];\n if (!first) {\n return {\n maskedText: fullText,\n offsetMap: (s, e) => ({ start: s, end: e }),\n };\n }\n let cur = {\n start: first.start,\n end: first.end,\n };\n for (let i = 1; i < sorted.length; i++) {\n const s = sorted[i];\n if (!s) continue;\n if (s.start < cur.end) {\n cur.end = Math.max(cur.end, s.end);\n } else {\n spans.push(cur);\n cur = { start: s.start, end: s.end };\n }\n }\n spans.push(cur);\n\n // Build masked text and offset segments\n const segments: OffsetSegment[] = [];\n const parts: string[] = [];\n let prev = 0;\n let cumulativeShift = 0;\n\n for (const span of spans) {\n parts.push(fullText.slice(prev, span.start));\n parts.push(MASK_TOKEN);\n\n const origLen = span.end - span.start;\n const delta = origLen - MASK_LEN;\n cumulativeShift += delta;\n\n // Position of mask token in masked text\n const maskedStart =\n span.start - (cumulativeShift - delta);\n const maskedEnd = maskedStart + MASK_LEN;\n\n segments.push({\n maskedStart,\n maskedEnd,\n shift: cumulativeShift,\n origStart: span.start,\n origEnd: span.end,\n });\n\n prev = span.end;\n }\n parts.push(fullText.slice(prev));\n\n const maskedText = parts.join(\"\");\n\n const offsetMap = (\n maskedStart: number,\n maskedEnd: number,\n ): { start: number; end: number } | null => {\n // Check if span overlaps any masked region\n for (const seg of segments) {\n if (\n maskedStart < seg.maskedEnd &&\n maskedEnd > seg.maskedStart\n ) {\n return null;\n }\n }\n\n // Find cumulative shift for this position.\n // Since the overlap check above guarantees both\n // endpoints fall within the same gap zone, a\n // single shift value applies to both.\n let shift = 0;\n for (const seg of segments) {\n if (maskedStart >= seg.maskedEnd) {\n shift = seg.shift;\n } else {\n break;\n }\n }\n\n return {\n start: maskedStart + shift,\n end: maskedEnd + shift,\n };\n };\n\n return { maskedText, offsetMap };\n};\n\n/**\n * Map NER entities from masked-text offsets back to\n * original-text offsets. Discards any NER entity whose\n * mapped span overlaps a masked (rule-detected) region.\n */\nexport const unmaskNerEntities = (\n nerEntities: Entity[],\n maskResult: MaskResult,\n fullText: string,\n): Entity[] => {\n const result: Entity[] = [];\n\n for (const ner of nerEntities) {\n // offsetMap returns null when the mapped span\n // overlaps any merged rule-entity region, so no\n // secondary overlap check is needed.\n const mapped = maskResult.offsetMap(\n ner.start,\n ner.end,\n );\n if (mapped === null) continue;\n\n result.push({\n ...ner,\n start: mapped.start,\n end: mapped.end,\n text: fullText.slice(mapped.start, mapped.end),\n });\n }\n\n return result;\n};\n","import {\n extractDefinedTerms,\n findCoreferenceSpans,\n} from \"./detectors/coreference\";\nimport { processGazetteerMatches } from \"./detectors/gazetteer\";\nimport {\n detectNameCorpus,\n initNameCorpus,\n} from \"./detectors/names\";\nimport { processRegexMatches } from \"./detectors/regex\";\nimport { processLegalFormMatches } from \"./detectors/legal-forms\";\nimport { processTriggerMatches } from \"./detectors/triggers\";\nimport {\n ensureDenyListData,\n processDenyListMatches,\n} from \"./detectors/deny-list\";\nimport { processAddressSeeds } from \"./detectors/address-seeds\";\nimport { propagateOrgNames } from \"./detectors/org-propagation\";\nimport {\n boostNearMissEntities,\n detectStreetPatternsNearAddresses,\n detectOrphanStreetLines,\n initPrepositions,\n initStreetAbbrevs,\n} from \"./filters/confidence-boost\";\nimport {\n filterFalsePositives,\n loadGenericRoles,\n} from \"./filters/false-positives\";\nimport {\n applyZoneAdjustments,\n classifyZones,\n initZoneClassifier,\n type ZoneSpan,\n} from \"./filters/zone-classifier\";\nimport {\n applyHotwordRules,\n initHotwordRules,\n} from \"./filters/hotword-rules\";\nimport { enforceBoundaryConsistency } from \"./filters/boundary-consistency\";\nimport type {\n Entity,\n GazetteerEntry,\n PipelineConfig,\n} from \"./types\";\nimport { DETECTOR_PRIORITY } from \"./types\";\nimport {\n buildUnifiedSearch,\n type UnifiedSearchInstance,\n} from \"./build-unified-search\";\nimport { runUnifiedSearch } from \"./unified-search\";\nimport {\n maskDetectedSpans,\n unmaskNerEntities,\n} from \"./util/entity-masking\";\nimport type { PipelineContext } from \"./context\";\nimport { defaultContext } from \"./context\";\n\n/**\n * Sources backed by curated literal dictionaries.\n * Longer matches from these sources are more specific,\n * so the containment rule trusts their length.\n */\nconst LITERAL_SOURCES: ReadonlySet<string> = new Set([\n \"deny-list\",\n \"gazetteer\",\n]);\n\nconst shouldReplace = (\n a: Entity,\n b: Entity,\n): boolean => {\n const aLen = a.end - a.start;\n const bLen = b.end - b.start;\n // Containment: when a literal-match entity (deny-list\n // or gazetteer) fully contains a shorter entity with\n // the same label, prefer the longer one. Curated\n // dictionary entries are more specific when longer:\n // \"656 91 Brno\" (deny-list) should beat \"656 91\"\n // (regex) even though regex has higher priority.\n // Non-literal sources (trigger, regex, NER) are\n // excluded because their length does not reliably\n // indicate accuracy.\n if (\n a.label === b.label &&\n LITERAL_SOURCES.has(a.source) &&\n a.start <= b.start &&\n a.end >= b.end &&\n aLen > bLen\n ) {\n return true;\n }\n if (\n a.label === b.label &&\n LITERAL_SOURCES.has(b.source) &&\n b.start <= a.start &&\n b.end >= a.end &&\n bLen > aLen\n ) {\n return false;\n }\n const aPri = DETECTOR_PRIORITY[a.source] ?? 0;\n const bPri = DETECTOR_PRIORITY[b.source] ?? 0;\n if (aPri !== bPri) return aPri > bPri;\n return (\n a.score > b.score ||\n (a.score === b.score && aLen > bLen)\n );\n};\n\n/** Labels where colons are structurally significant. */\nconst COLON_LABELS = new Set([\n \"ip address\",\n \"mac address\",\n]);\n\n/** Strip leading/trailing whitespace and punctuation. */\nexport const sanitizeEntities = (\n entities: Entity[],\n): Entity[] =>\n entities.flatMap((e) => {\n const strip = COLON_LABELS.has(e.label)\n ? /[\\s,;]+/\n : /[\\s:,;]+/;\n const leadTrimmed = e.text.replace(\n new RegExp(`^${strip.source}`, strip.flags),\n \"\",\n );\n const lead = e.text.length - leadTrimmed.length;\n const cleaned = leadTrimmed.replace(\n new RegExp(`${strip.source}$`, strip.flags),\n \"\",\n );\n if (cleaned.length === 0) return [];\n // Reject entities with no alphanumeric content\n if (!/[\\p{L}\\p{N}]/u.test(cleaned)) return [];\n // Collapse internal whitespace runs (address entities\n // spanning multiple lines in structured documents)\n const collapsed = cleaned\n .replace(/\\s*\\n\\s*/g, \" \")\n .replace(/\\s{2,}/g, \" \");\n if (collapsed === e.text) return [e];\n return [{\n ...e,\n start: e.start + lead,\n end: e.start + lead + collapsed.length,\n text: collapsed,\n }];\n });\n\nexport const mergeAndDedup = (\n ...layers: Entity[][]\n): Entity[] => {\n const all: Entity[] = [];\n for (const layer of layers) {\n for (const entity of layer) {\n all.push(entity);\n }\n }\n if (all.length === 0) return [];\n\n const sorted = all.toSorted(\n (a, b) => a.start - b.start,\n );\n\n // Single-pass sweep-line: since entities are sorted\n // by start, a new entity can only overlap the tail\n // of merged[] (all earlier entries end before it).\n const first = sorted[0];\n if (!first) return [];\n const merged: Entity[] = [{ ...first }];\n\n for (let i = 1; i < sorted.length; i++) {\n const entity = sorted[i];\n const last = merged[merged.length - 1];\n if (!entity || !last) continue;\n\n if (last.end <= entity.start) {\n // No overlap: append.\n merged.push({ ...entity });\n } else if (shouldReplace(entity, last)) {\n // Overlap: new entity wins.\n merged[merged.length - 1] = { ...entity };\n }\n // else: overlap but existing wins; discard entity.\n }\n\n return sanitizeEntities(merged);\n};\n\nexport type NerInferenceFn = (\n fullText: string,\n labels: string[],\n threshold: number,\n signal?: AbortSignal,\n) => Promise<Entity[]>;\n\n/**\n * Extend monetary amount entities to include a trailing\n * \"(slovy ...)\" or \"(slovně ...)\" parenthetical that\n * spells out the amount in words. Common in Czech legal\n * documents, e.g. \"1 529,-Kč (slovy jeden-tisíc)\".\n *\n * Keywords are loaded from amount-words.json config so\n * new languages can be added without code changes.\n */\ntype AmountWordsConfig = {\n patterns: { lang: string; keywords: string[] }[];\n};\n\nconst escapeRegex = (s: string): string =>\n s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nlet amountWordsRe: RegExp | null = null;\nlet amountWordsLoaded = false;\n\nconst getAmountWordsRe = async (): Promise<RegExp> => {\n if (amountWordsLoaded && amountWordsRe) {\n return amountWordsRe;\n }\n try {\n const mod = await import(\n \"@stll/anonymize-data/config/amount-words.json\"\n );\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON module shape\n const data = (mod as { default: AmountWordsConfig })\n .default;\n const keywords = data.patterns.flatMap(\n (p) => p.keywords,\n );\n const alt = keywords\n .map(escapeRegex)\n .join(\"|\");\n amountWordsRe = new RegExp(\n `^[,;]?[^\\\\S\\\\n]*(\\\\((?:${alt})[:\\\\s][^)\\\\n]{1,120}\\\\))`,\n \"i\",\n );\n } catch {\n // Fallback: original Czech-only pattern\n amountWordsRe =\n /^[,;]?[^\\S\\n]*(\\((?:slovy|slovně)[:\\s][^)\\n]{1,120}\\))/i;\n }\n amountWordsLoaded = true;\n return amountWordsRe;\n};\n\nconst extendMonetaryAmountWords = (\n entities: Entity[],\n fullText: string,\n re: RegExp,\n): Entity[] =>\n entities.map((e) => {\n if (e.label !== \"monetary amount\") return e;\n const after = fullText.slice(e.end);\n const m = re.exec(after);\n if (!m) return e;\n const newEnd = e.end + m[0].length;\n return {\n ...e,\n end: newEnd,\n text: fullText.slice(e.start, newEnd),\n };\n });\n\nconst checkAbort = (signal?: AbortSignal): void => {\n if (signal?.aborted) {\n throw new DOMException(\n \"Pipeline aborted\",\n \"AbortError\",\n );\n }\n};\n\nconst configKey = (\n config: PipelineConfig,\n gazetteerEntries: GazetteerEntry[],\n): string => {\n // Gazetteer fingerprint: sorted entry IDs,\n // canonical forms, labels, and variants.\n // Skip when gazetteer is disabled to avoid\n // unnecessary cache misses.\n const gazFingerprint =\n config.enableGazetteer &&\n gazetteerEntries.length > 0\n ? gazetteerEntries\n .map(\n (e) =>\n `${e.id}:${e.canonical}:${e.label}:${[...e.variants].sort().join(\",\")}`,\n )\n .toSorted()\n .join(\";\")\n : \"\";\n return (\n `${config.enableDenyList}:` +\n `${config.enableTriggerPhrases}:` +\n `${config.denyListCountries?.toSorted().join(\",\") ?? \"\"}:` +\n `${config.denyListRegions?.toSorted().join(\",\") ?? \"\"}:` +\n `${config.denyListExcludeCategories?.toSorted().join(\",\") ?? \"\"}:` +\n `${config.enableGazetteer}:${gazFingerprint}`\n );\n};\n\n/**\n * Get or build a cached search instance. Cache state\n * lives on the provided PipelineContext, not at module\n * level.\n */\nconst getCachedSearch = async (\n config: PipelineConfig,\n gazetteerEntries: GazetteerEntry[],\n ctx: PipelineContext,\n): Promise<UnifiedSearchInstance> => {\n const key = configKey(config, gazetteerEntries);\n if (ctx.search && ctx.searchKey === key) {\n return ctx.search;\n }\n if (ctx.searchPromise && ctx.searchKey === key) {\n return ctx.searchPromise;\n }\n // Build new search. Null the cached instance first\n // so concurrent callers don't use stale data while\n // the new build is in flight.\n ctx.search = null;\n ctx.searchKey = key;\n const promise = buildUnifiedSearch(\n config,\n gazetteerEntries,\n ctx,\n );\n ctx.searchPromise = promise;\n const result = await promise;\n // Guard: another call may have replaced the key\n // while we were awaiting. Only cache if still ours.\n if (ctx.searchKey === key) {\n ctx.search = result;\n }\n return result;\n};\n\n/**\n * Options for {@link runPipeline}.\n *\n * @property cachedSearch Pre-built search instance.\n * When provided, `config` and `gazetteerEntries`\n * are not used for building; the caller must\n * ensure the instance matches both parameters.\n */\nexport type PipelineOptions = {\n fullText: string;\n config: PipelineConfig;\n gazetteerEntries: GazetteerEntry[];\n nerInference?: NerInferenceFn | null;\n onProgress?: (\n step: string,\n detail: string,\n ) => void;\n cachedSearch?: UnifiedSearchInstance;\n signal?: AbortSignal;\n context?: PipelineContext;\n};\n\n/**\n * Run the full detection pipeline.\n *\n * Two TextSearch instances scan the text (regex +\n * literals). Results are dispatched to each\n * detector's post-processor by pattern index range.\n *\n * Pass an AbortSignal to cancel the pipeline between\n * stages. Throws a DOMException with name \"AbortError\"\n * when cancelled.\n *\n * Pass an optional `context` to isolate cached state\n * from other pipeline runs. If omitted, a module-level\n * default context is used (backward compatible).\n */\nexport const runPipeline = async (\n options: PipelineOptions,\n): Promise<Entity[]> => {\n const {\n fullText,\n config,\n gazetteerEntries,\n nerInference = null,\n onProgress,\n cachedSearch,\n signal,\n context,\n } = options;\n const ctx = context ?? defaultContext;\n\n const log = (step: string, detail: string) => {\n onProgress?.(step, detail);\n };\n\n checkAbort(signal);\n\n // Ensure generic-roles data, zone config, hotword\n // rules, and prepositions are loaded before the\n // pipeline runs. All are no-ops after the first call.\n let zoneInitOk = false;\n const enableHotwords =\n config.enableHotwordRules === true;\n let hotwordInitOk = false;\n const hotwordInit = enableHotwords\n ? initHotwordRules()\n .then(() => {\n hotwordInitOk = true;\n })\n .catch((err: unknown) => {\n log(\"hotwords\", \"init failed; skipping\");\n console.warn(\n \"[anonymize] hotword rules init failed\",\n err,\n );\n })\n : Promise.resolve();\n if (config.enableZoneClassification) {\n const zoneInit = initZoneClassifier(ctx)\n .then(() => {\n zoneInitOk = true;\n })\n .catch((err: unknown) => {\n log(\"zones\", \"init failed; skipping\");\n console.warn(\n \"[anonymize] zone classifier init failed\",\n err,\n );\n });\n await Promise.all([\n loadGenericRoles(ctx),\n initPrepositions(),\n initStreetAbbrevs(),\n zoneInit,\n hotwordInit,\n ]);\n } else {\n await Promise.all([\n loadGenericRoles(ctx),\n initPrepositions(),\n initStreetAbbrevs(),\n hotwordInit,\n ]);\n }\n\n // When a pre-built search is provided, buildDenyList\n // was skipped for this context. Ensure stopwords,\n // allow list, and person stopwords are loaded so\n // processDenyListMatches filters correctly.\n if (cachedSearch && config.enableDenyList) {\n await ensureDenyListData(ctx);\n }\n\n // Classify document zones once up front\n let zones: ZoneSpan[] = [];\n if (config.enableZoneClassification && zoneInitOk) {\n zones = classifyZones(fullText, ctx);\n if (zones.length > 0) {\n const zoneNames = [\n ...new Set(zones.map((z) => z.zone)),\n ];\n log(\"zones\", zoneNames.join(\", \"));\n }\n }\n\n checkAbort(signal);\n\n const search =\n cachedSearch ??\n (await getCachedSearch(\n config,\n gazetteerEntries,\n ctx,\n ));\n\n checkAbort(signal);\n\n // Two-pass scan (regex + literals)\n const { regexMatches, literalMatches } =\n runUnifiedSearch(search, fullText);\n const { slices } = search;\n\n const regexEntities = config.enableRegex\n ? processRegexMatches(\n regexMatches,\n slices.regex.start,\n slices.regex.end,\n search.regexMeta,\n )\n : [];\n if (regexEntities.length > 0)\n log(\"regex\", `${regexEntities.length} matches`);\n\n const legalFormEntities = processLegalFormMatches(\n regexMatches,\n slices.legalForms.start,\n slices.legalForms.end,\n fullText,\n );\n if (legalFormEntities.length > 0)\n log(\n \"legal-forms\",\n `${legalFormEntities.length} matches`,\n );\n\n const triggerEntities =\n config.enableTriggerPhrases\n ? processTriggerMatches(\n regexMatches,\n slices.triggers.start,\n slices.triggers.end,\n fullText,\n search.triggerRules,\n )\n : [];\n if (triggerEntities.length > 0)\n log(\n \"trigger-phrases\",\n `${triggerEntities.length} matches`,\n );\n\n checkAbort(signal);\n\n let nameCorpusEntities: Entity[] = [];\n if (\n config.enableNameCorpus &&\n !config.enableDenyList\n ) {\n await initNameCorpus(ctx);\n checkAbort(signal);\n nameCorpusEntities = detectNameCorpus(fullText, ctx);\n log(\n \"name-corpus\",\n `${nameCorpusEntities.length} matches`,\n );\n }\n\n const denyListEntities =\n config.enableDenyList && search.denyListData\n ? processDenyListMatches(\n literalMatches,\n slices.denyList.start,\n slices.denyList.end,\n fullText,\n search.denyListData,\n ctx,\n )\n : [];\n if (denyListEntities.length > 0)\n log(\n \"deny-list\",\n `${denyListEntities.length} matches`,\n );\n\n // Gazetteer: unified into tsLiterals\n const gazetteerEntities =\n config.enableGazetteer && search.gazetteerData\n ? processGazetteerMatches(\n literalMatches,\n slices.gazetteer.start,\n slices.gazetteer.end,\n fullText,\n search.gazetteerData,\n )\n : [];\n if (gazetteerEntities.length > 0)\n log(\n \"gazetteer\",\n `${gazetteerEntities.length} matches`,\n );\n\n checkAbort(signal);\n\n // NER (mask rule-detected spans so the model doesn't\n // produce contradictory boundaries for known entities)\n let nerEntities: Entity[] = [];\n if (config.enableNer && nerInference) {\n const ruleEntities = [\n ...triggerEntities,\n ...regexEntities,\n ...legalFormEntities,\n ...nameCorpusEntities,\n ...denyListEntities,\n ...gazetteerEntities,\n ];\n const maskResult = maskDetectedSpans(\n fullText,\n ruleEntities,\n );\n log(\"ner\", \"running inference...\");\n const rawNer = await nerInference(\n maskResult.maskedText,\n config.labels,\n config.threshold,\n signal,\n );\n nerEntities = unmaskNerEntities(\n rawNer,\n maskResult,\n fullText,\n );\n const dropped = rawNer.length - nerEntities.length;\n log(\n \"ner\",\n `${nerEntities.length} entities` +\n (dropped > 0 ? ` (${dropped} masked)` : \"\"),\n );\n }\n\n checkAbort(signal);\n\n // Address seed expansion\n const preAddressEntities = [\n ...triggerEntities,\n ...regexEntities,\n ...legalFormEntities,\n ...nameCorpusEntities,\n ...denyListEntities,\n ...gazetteerEntities,\n ...nerEntities,\n ];\n const addressSeedEntities = await processAddressSeeds(\n literalMatches,\n slices.streetTypes.start,\n slices.streetTypes.end,\n fullText,\n preAddressEntities,\n );\n if (addressSeedEntities.length > 0)\n log(\"address-seeds\", `${addressSeedEntities.length} expanded`);\n\n checkAbort(signal);\n\n // Zone-based score adjustment: apply before\n // threshold filtering so entities in PII-dense zones\n // can cross the threshold.\n const zoneAdjusted = applyZoneAdjustments(\n [...preAddressEntities, ...addressSeedEntities],\n zones,\n );\n\n // Hotword context rules: boost or reclassify\n // entities near relevant keywords. Applied after\n // zone adjustments so both effects stack.\n const preBoostEntities =\n enableHotwords && hotwordInitOk\n ? applyHotwordRules(zoneAdjusted, fullText)\n : zoneAdjusted;\n\n // Confidence boost + threshold filter\n let allEntities: Entity[];\n if (config.enableConfidenceBoost) {\n allEntities = boostNearMissEntities(preBoostEntities, config.threshold);\n const boosted = allEntities.length -\n preBoostEntities.filter((e) => e.score >= config.threshold).length;\n if (boosted > 0) log(\"confidence-boost\", `${boosted} near-miss promoted`);\n } else {\n allEntities = preBoostEntities.filter((e) => e.score >= config.threshold);\n }\n\n // Street patterns near existing addresses\n // (e.g. \"Ostrovni 225/1\" near \"110 00 Praha 1\")\n const streetPatterns = detectStreetPatternsNearAddresses(\n fullText,\n allEntities,\n );\n if (streetPatterns.length > 0) {\n allEntities = [...allEntities, ...streetPatterns];\n log(\"street-context\", `${streetPatterns.length} street patterns near addresses`);\n }\n\n // Orphan street lines in header zone\n const orphanStreets = detectOrphanStreetLines(\n fullText,\n allEntities,\n );\n if (orphanStreets.length > 0) {\n allEntities = [...allEntities, ...orphanStreets];\n log(\"orphan-streets\", `${orphanStreets.length} header street lines`);\n }\n\n // Merge + dedup\n const rawMerged = mergeAndDedup(allEntities);\n log(\"merge\", `${rawMerged.length} after dedup`);\n\n // Extend monetary amounts to include trailing\n // \"(slovy ...)\" or \"(slovně ...)\" parentheticals.\n // Runs after dedup so each monetary span is unique,\n // preventing duplicate extensions from clobbering\n // unrelated entities between e.end and newEnd.\n const amountWordsRe = await getAmountWordsRe();\n const mergedExtended = extendMonetaryAmountWords(\n rawMerged,\n fullText,\n amountWordsRe,\n );\n\n // Boundary consistency (merge adjacent, fix partial\n // words, remove nested same-label)\n const consistent = enforceBoundaryConsistency(\n mergedExtended,\n fullText,\n );\n if (consistent.length < mergedExtended.length)\n log(\n \"boundary\",\n `${mergedExtended.length - consistent.length} consolidated`,\n );\n\n // Organization name propagation: strip legal form\n // suffixes from detected orgs and re-scan for bare\n // mentions of the base name. Gated by enableCoreference\n // since this is a coreference-like pass. Propagated\n // entities are filtered by the configured threshold to\n // ensure they respect the caller's confidence floor.\n let postOrgEntities = consistent;\n if (config.enableCoreference) {\n const orgPropagated = propagateOrgNames(\n consistent,\n fullText,\n );\n const thresholded = orgPropagated.filter(\n (e) => e.score >= config.threshold,\n );\n if (thresholded.length > 0) {\n postOrgEntities = mergeAndDedup(\n consistent,\n thresholded,\n );\n log(\n \"org-propagation\",\n `${thresholded.length} base names`,\n );\n }\n }\n\n // False-positive filtering\n const merged = filterFalsePositives(\n postOrgEntities,\n ctx,\n );\n if (merged.length < postOrgEntities.length)\n log(\n \"filter\",\n `removed ${postOrgEntities.length - merged.length} FPs`,\n );\n\n checkAbort(signal);\n\n // Coreference\n // Clear stale entries unconditionally so a reused\n // context doesn't leak sourceText across documents.\n ctx.corefSourceMap.clear();\n if (config.enableCoreference) {\n const terms = await extractDefinedTerms(\n fullText,\n merged,\n ctx,\n );\n if (terms.length > 0) {\n log(\"coreference\", `${terms.length} defined terms`);\n const corefSpans = findCoreferenceSpans(\n fullText,\n terms,\n ctx,\n );\n if (corefSpans.length > 0) {\n log(\"coreference-rescan\", `${corefSpans.length} aliases`);\n const corefMerged = mergeAndDedup(\n merged,\n corefSpans,\n );\n const corefConsistent =\n enforceBoundaryConsistency(\n corefMerged,\n fullText,\n );\n return sanitizeEntities(\n filterFalsePositives(\n corefConsistent,\n ctx,\n ),\n );\n }\n }\n }\n\n // Re-sanitize: enforceBoundaryConsistency may adjust\n // entity boundaries after mergeAndDedup's sanitization,\n // potentially re-introducing whitespace or punctuation.\n return sanitizeEntities(merged);\n};\n","import type {\n AnonymisationOperator,\n OperatorConfig,\n OperatorType,\n} from \"./types\";\n\n// ── Operator registry ──────────────────────────────────\n\nconst replaceOperator: AnonymisationOperator = {\n type: \"replace\",\n reversibility: \"reversible\",\n apply: (_text, _label, placeholder) => placeholder,\n};\n\nconst redactOperator: AnonymisationOperator = {\n type: \"redact\",\n reversibility: \"irreversible\",\n apply: (_text, _label, _placeholder, redactString) => redactString,\n};\n\nexport const OPERATOR_REGISTRY = {\n replace: replaceOperator,\n redact: redactOperator,\n} as const satisfies Record<OperatorType, AnonymisationOperator>;\n\nconst DEFAULT_REDACT_STRING = \"[REDACTED]\";\n\n/**\n * Default operator config: replace for all labels.\n * Preserves existing pipeline behaviour.\n */\nexport const DEFAULT_OPERATOR_CONFIG: OperatorConfig = {\n operators: {},\n redactString: DEFAULT_REDACT_STRING,\n};\n\n/**\n * Resolve the operator for a label, falling back to \"replace\".\n */\nexport const resolveOperator = (\n config: OperatorConfig,\n label: string,\n): OperatorType => config.operators[label] ?? \"replace\";\n","import {\n DEFAULT_OPERATOR_CONFIG,\n OPERATOR_REGISTRY,\n resolveOperator,\n} from \"./operators\";\nimport type {\n Entity,\n OperatorConfig,\n OperatorType,\n RedactionResult,\n} from \"./types\";\nimport type { PipelineContext } from \"./context\";\nimport { corefKey, defaultContext } from \"./context\";\n\nconst WHITESPACE_RE = /\\s+/g;\nconst PHONE_NOISE_RE = /[()\\s-]/g;\nconst SPACE_DASH_RE = /[\\s-]/g;\n\n/**\n * Normalize entity text so that surface-form variations\n * of the same real-world value map to a single canonical\n * key. Lowercased emails, stripped phone formatting, etc.\n */\nconst normalizeEntityText = (label: string, text: string): string => {\n const upper = label.toUpperCase().replace(WHITESPACE_RE, \"_\");\n\n if (upper === \"EMAIL_ADDRESS\" || upper === \"EMAIL\") {\n return text.toLowerCase().trim();\n }\n if (upper === \"PHONE_NUMBER\" || upper === \"PHONE\") {\n return text.replace(PHONE_NOISE_RE, \"\");\n }\n if (\n upper === \"IBAN\" ||\n upper === \"BANK_ACCOUNT_NUMBER\" ||\n upper === \"TAX_IDENTIFICATION_NUMBER\" ||\n upper === \"REGISTRATION_NUMBER\"\n ) {\n return text.replace(SPACE_DASH_RE, \"\").toUpperCase();\n }\n if (\n upper === \"PERSON\" ||\n upper === \"ORGANIZATION\" ||\n upper === \"ADDRESS\" ||\n upper === \"LAND_PARCEL\"\n ) {\n return text.replace(WHITESPACE_RE, \" \").toLowerCase().trim();\n }\n return text.trim();\n};\n\n/**\n * Build a stable mapping from entity text to numbered\n * placeholders. Same real-world value always maps to the\n * same placeholder (e.g., \"Dr. Muller\" and \"Dr. Muller\"\n * both become [PERSON_1]).\n *\n * Placeholder format: [LABEL_N] where LABEL is uppercase\n * and N is a 1-based counter per label.\n *\n * @param ctx Pipeline context. Must be the same instance\n * passed to `runPipeline` (or `findCoreferenceSpans`)\n * so coreference placeholder links are preserved.\n * Defaults to `defaultContext` for single-tenant usage.\n */\nexport const buildPlaceholderMap = (\n entities: Entity[],\n ctx: PipelineContext = defaultContext,\n): Map<string, string> => {\n const counters = new Map<string, number>();\n const textLabelToPlaceholder = new Map<string, string>();\n const normalizedToPlaceholder = new Map<string, string>();\n\n const sorted = entities.toSorted((a, b) => a.start - b.start);\n\n for (const entity of sorted) {\n const compositeKey = `${entity.label}\\0${entity.text}`;\n if (textLabelToPlaceholder.has(compositeKey)) {\n continue;\n }\n\n const labelKey = entity.label.toUpperCase().replace(WHITESPACE_RE, \"_\");\n\n // Coreference side-channel: if this entity is a\n // coref alias, look up the source entity's\n // placeholder so both get the same number.\n const sourceText = ctx.corefSourceMap.get(\n corefKey(entity),\n );\n if (sourceText !== undefined) {\n const sourceNormalized = normalizeEntityText(\n entity.label,\n sourceText,\n );\n const sourceNormalizedKey =\n `${labelKey}\\0${sourceNormalized}`;\n const sourceExisting =\n normalizedToPlaceholder.get(sourceNormalizedKey);\n if (sourceExisting) {\n textLabelToPlaceholder.set(\n compositeKey,\n sourceExisting,\n );\n continue;\n }\n }\n\n const normalized = normalizeEntityText(entity.label, entity.text);\n const normalizedKey = `${labelKey}\\0${normalized}`;\n const existing = normalizedToPlaceholder.get(normalizedKey);\n if (existing) {\n textLabelToPlaceholder.set(compositeKey, existing);\n continue;\n }\n\n const count = (counters.get(labelKey) ?? 0) + 1;\n counters.set(labelKey, count);\n\n const placeholder = `[${labelKey}_${count}]`;\n textLabelToPlaceholder.set(compositeKey, placeholder);\n normalizedToPlaceholder.set(normalizedKey, placeholder);\n }\n\n return textLabelToPlaceholder;\n};\n\n/**\n * Apply redactions to the source text, replacing each\n * confirmed entity span using the configured operator.\n *\n * Co-references are consistent: if the same text appears\n * multiple times, all occurrences get the same placeholder.\n *\n * @param ctx Pipeline context. Must be the same instance\n * passed to `runPipeline` (or `findCoreferenceSpans`)\n * so coreference placeholder links are preserved.\n * Defaults to `defaultContext` for single-tenant usage.\n */\nexport const redactText = (\n fullText: string,\n entities: Entity[],\n config: OperatorConfig = DEFAULT_OPERATOR_CONFIG,\n ctx: PipelineContext = defaultContext,\n): RedactionResult => {\n if (entities.length === 0) {\n return {\n redactedText: fullText,\n redactionMap: new Map(),\n operatorMap: new Map(),\n entityCount: 0,\n };\n }\n\n const placeholderMap = buildPlaceholderMap(entities, ctx);\n\n const sorted = entities.toSorted((a, b) => a.start - b.start);\n\n // Remove overlapping spans (keep first occurrence)\n const nonOverlapping: Entity[] = [];\n let lastEnd = 0;\n for (const entity of sorted) {\n if (entity.start >= lastEnd) {\n nonOverlapping.push(entity);\n lastEnd = entity.end;\n }\n }\n\n const parts: string[] = [];\n const redactionMap = new Map<string, string>();\n const operatorMap = new Map<string, OperatorType>();\n let cursor = 0;\n\n for (const entity of nonOverlapping) {\n if (entity.start > cursor) {\n parts.push(fullText.slice(cursor, entity.start));\n }\n\n const placeholder =\n placeholderMap.get(`${entity.label}\\0${entity.text}`) ??\n `[${entity.label.toUpperCase().replace(/\\s+/g, \"_\")}]`;\n\n const opType = resolveOperator(config, entity.label);\n const operator = OPERATOR_REGISTRY[opType];\n\n const replacement = operator.apply(\n entity.text,\n entity.label,\n placeholder,\n config.redactString,\n );\n\n parts.push(replacement);\n // operatorMap is keyed by the conceptual placeholder\n // ([LABEL_N]), not by the replacement text. For \"redact\"\n // operators the placeholder never appears in the output;\n // the map is only consulted via exportRedactionKey which\n // iterates redactionMap (replace entries only).\n operatorMap.set(placeholder, opType);\n\n // Only populate redactionMap for reversible operators\n if (\n operator.reversibility === \"reversible\" &&\n !redactionMap.has(placeholder)\n ) {\n redactionMap.set(placeholder, entity.text);\n }\n\n cursor = entity.end;\n }\n\n if (cursor < fullText.length) {\n parts.push(fullText.slice(cursor));\n }\n\n return {\n redactedText: parts.join(\"\"),\n redactionMap,\n operatorMap,\n entityCount: nonOverlapping.length,\n };\n};\n\n/**\n * Serialize the redaction key to JSON for export.\n * Includes operator metadata so the export is self-describing.\n */\nexport const exportRedactionKey = (\n redactionMap: Map<string, string>,\n operatorMap: Map<string, OperatorType>,\n): string => {\n const entries: Record<string, { original: string; operator: OperatorType }> =\n {};\n\n for (const [placeholder, value] of redactionMap) {\n entries[placeholder] = {\n original: value,\n operator: operatorMap.get(placeholder) ?? \"replace\",\n };\n }\n\n return JSON.stringify({ entries }, null, 2);\n};\n\n/**\n * De-anonymise text using a redaction key.\n * Replaces placeholders back with original values.\n * Only works for reversible operators (replace).\n */\nexport const deanonymise = (\n redactedText: string,\n redactionMap: Map<string, string>,\n): string => {\n let result = redactedText;\n\n for (const [placeholder, original] of redactionMap) {\n result = result.replaceAll(placeholder, original);\n }\n\n return result;\n};\n","/**\n * Decode ONNX model output into entity spans.\n *\n * The span-level model outputs a logits tensor of shape\n * [batch, inputLength, maxWidth, numEntities]. This module\n * applies sigmoid, thresholds, and greedy non-overlapping\n * selection to produce the final entity list.\n */\nimport type { RawInferenceResult } from \"./types\";\n\ntype Span = [string, number, number, string, number];\n\nconst sigmoid = (x: number): number => 1 / (1 + Math.exp(-x));\n\n/** Check if two spans overlap (optionally allowing multi-label). */\nconst hasOverlapping = (\n a: number[],\n b: number[],\n multiLabel: boolean,\n): boolean => {\n const a0 = a[0] ?? 0;\n const a1 = a[1] ?? 0;\n const b0 = b[0] ?? 0;\n const b1 = b[1] ?? 0;\n if (a0 === b0 && a1 === b1) {\n return !multiLabel;\n }\n return !(a0 > b1 || b0 > a1);\n};\n\n/**\n * Greedy non-overlapping span selection.\n * Sorts by score descending, keeps each span only if it\n * doesn't overlap with already-selected spans.\n */\nconst greedySearch = (\n spans: Span[],\n flatNer: boolean,\n multiLabel: boolean,\n): Span[] => {\n const sorted = spans.toSorted((a, b) => b[4] - a[4]);\n const selected: Span[] = [];\n\n for (const span of sorted) {\n const overlaps = selected.some((s) => {\n if (flatNer) {\n return hasOverlapping([span[1], span[2]], [s[1], s[2]], multiLabel);\n }\n // Non-flat: also allow nested spans\n const isNested =\n (span[1] <= s[1] && span[2] >= s[2]) ||\n (s[1] <= span[1] && s[2] >= span[2]);\n if (isNested) {\n return false;\n }\n return hasOverlapping([span[1], span[2]], [s[1], s[2]], multiLabel);\n });\n\n if (!overlaps) {\n selected.push(span);\n }\n }\n\n return selected.toSorted((a, b) => a[1] - b[1]);\n};\n\n/**\n * Decode span-level model logits into entity results.\n */\nexport const decodeSpans = (\n batchSize: number,\n inputLength: number,\n maxWidth: number,\n numEntities: number,\n texts: string[],\n batchIds: number[],\n batchWordsStartIdx: number[][],\n batchWordsEndIdx: number[][],\n idToClass: Record<number, string>,\n modelOutput: ArrayLike<number>,\n flatNer: boolean,\n threshold: number,\n multiLabel: boolean,\n): RawInferenceResult => {\n const spans: Span[][] = Array.from({ length: batchSize }, () => []);\n\n const batchPadding = inputLength * maxWidth * numEntities;\n const startTokenPadding = maxWidth * numEntities;\n const endTokenPadding = numEntities;\n\n for (let id = 0; id < modelOutput.length; id++) {\n const batch = Math.floor(id / batchPadding);\n const startToken = Math.floor(id / startTokenPadding) % inputLength;\n const endToken = startToken + (Math.floor(id / endTokenPadding) % maxWidth);\n const entity = id % numEntities;\n\n const prob = sigmoid(modelOutput[id] ?? 0);\n\n const batchStarts = batchWordsStartIdx[batch];\n const batchEnds = batchWordsEndIdx[batch];\n const batchSpans = spans[batch];\n if (!batchStarts || !batchEnds || !batchSpans) {\n continue;\n }\n\n if (\n prob >= threshold &&\n startToken < batchStarts.length &&\n endToken < batchEnds.length\n ) {\n const globalBatch = batchIds[batch] ?? 0;\n const startIdx = batchStarts[startToken] ?? 0;\n const endIdx = batchEnds[endToken] ?? 0;\n const spanText = (texts[globalBatch] ?? \"\").slice(startIdx, endIdx);\n batchSpans.push([\n spanText,\n startIdx,\n endIdx,\n idToClass[entity + 1] ?? \"\",\n prob,\n ]);\n }\n }\n\n return spans.map((batchSpans) =>\n greedySearch(batchSpans, flatNer, multiLabel),\n );\n};\n","/**\n * Token-level BIO decoder for GLiNER TokenGLiNER models\n * (e.g., gliner-pii-edge-v1.0).\n *\n * These models output logits of shape [B, L, C, 3] where:\n * B = batch size\n * L = number of words (text_lengths)\n * C = number of entity classes\n * 3 = BIO tags: [B(egin), I(nside), O(utside)]\n *\n * This decoder converts BIO-tagged logits into entity spans\n * with character offsets.\n */\nimport type { RawInferenceResult } from \"./types\";\n\ntype Span = [string, number, number, string, number];\n\nconst sigmoid = (x: number): number => 1 / (1 + Math.exp(-x));\n\nconst B_TAG = 0;\nconst I_TAG = 1;\n\n/**\n * Decode token-level BIO logits into entity spans.\n *\n * For each word, checks if the B(egin) logit for any class\n * exceeds the threshold. If so, extends the span by consuming\n * subsequent I(nside) tokens of the same class.\n */\nexport const decodeTokenSpans = (\n batchSize: number,\n numWords: number,\n numEntities: number,\n texts: string[],\n batchIds: number[],\n batchWordsStartIdx: number[][],\n batchWordsEndIdx: number[][],\n idToClass: Record<number, string>,\n modelOutput: ArrayLike<number>,\n threshold: number,\n): RawInferenceResult => {\n const results: Span[][] = Array.from({ length: batchSize }, () => []);\n\n const wordStride = numEntities * 3;\n const batchStride = numWords * wordStride;\n\n for (let b = 0; b < batchSize; b++) {\n const batchOffset = b * batchStride;\n const starts = batchWordsStartIdx[b];\n const ends = batchWordsEndIdx[b];\n const globalBatch = batchIds[b] ?? 0;\n const text = texts[globalBatch] ?? \"\";\n const batchSpans = results[b];\n\n if (!starts || !ends || !batchSpans) {\n continue;\n }\n\n const actualWords = starts.length;\n\n for (let e = 0; e < numEntities; e++) {\n let w = 0;\n\n while (w < actualWords) {\n const bLogitIdx = batchOffset + w * wordStride + e * 3 + B_TAG;\n const bScore = sigmoid(modelOutput[bLogitIdx] ?? 0);\n\n if (bScore < threshold) {\n w++;\n continue;\n }\n\n const spanStart = w;\n let spanEnd = w;\n let maxScore = bScore;\n\n while (spanEnd + 1 < actualWords) {\n const iLogitIdx =\n batchOffset + (spanEnd + 1) * wordStride + e * 3 + I_TAG;\n const iScore = sigmoid(modelOutput[iLogitIdx] ?? 0);\n\n if (iScore < threshold) {\n break;\n }\n\n spanEnd++;\n maxScore = Math.max(maxScore, iScore);\n }\n\n const charStart = starts[spanStart] ?? 0;\n const charEnd = ends[spanEnd] ?? 0;\n const spanText = text.slice(charStart, charEnd);\n const label = idToClass[e + 1] ?? \"\";\n\n if (spanText.trim().length > 0 && label) {\n batchSpans.push([spanText, charStart, charEnd, label, maxScore]);\n }\n\n w = spanEnd + 1;\n }\n }\n\n const selected: Span[] = [];\n for (const span of batchSpans.toSorted((x, y) => y[4] - x[4])) {\n const overlaps = selected.some((s) => span[1] < s[2] && span[2] > s[1]);\n if (!overlaps) {\n selected.push(span);\n }\n }\n\n results[b] = selected.toSorted((x, y) => x[1] - y[1]);\n }\n\n return results;\n};\n","/**\n * Tokenization and input preparation for GLiNER span model.\n *\n * Splits text into word tokens, encodes via HuggingFace\n * tokenizer, and builds the span index grid that the ONNX\n * model expects as input.\n */\nimport type { Encoding, Tokenizer } from \"@huggingface/tokenizers\";\n\nconst segmenter = new Intl.Segmenter(undefined, {\n granularity: \"word\",\n});\n\n/** Tokenize text into words with character offsets. */\nexport const tokenizeText = (\n text: string,\n): [words: string[], starts: number[], ends: number[]] => {\n const words: string[] = [];\n const starts: number[] = [];\n const ends: number[] = [];\n\n for (const { segment, index, isWordLike } of segmenter.segment(text)) {\n // Include words and numeric segments (Intl.Segmenter\n // marks pure digit sequences as non-word-like, but the\n // NER model needs them for entity detection).\n if (!isWordLike && !/\\d/u.test(segment)) {\n continue;\n }\n words.push(segment);\n starts.push(index);\n ends.push(index + segment.length);\n }\n\n return [words, starts, ends];\n};\n\n/** Build entity label <-> id mappings. */\nconst createMappings = (\n labels: string[],\n): {\n classToId: Record<string, number>;\n idToClass: Record<number, string>;\n} => {\n const classToId: Record<string, number> = {};\n const idToClass: Record<number, string> = {};\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n if (label === undefined) {\n continue;\n }\n const id = i + 1;\n classToId[label] = id;\n idToClass[id] = label;\n }\n return { classToId, idToClass };\n};\n\n/** Prepend entity prompt tokens to word tokens. */\nconst prepareTextInputs = (\n batchTokens: string[][],\n entities: string[],\n): [inputTexts: string[][], textLengths: number[], promptLengths: number[]] => {\n const inputTexts: string[][] = [];\n const promptLengths: number[] = [];\n const textLengths: number[] = [];\n\n for (const tokens of batchTokens) {\n textLengths.push(tokens.length);\n\n const prompt: string[] = [];\n for (const ent of entities) {\n prompt.push(\"<<ENT>>\");\n prompt.push(ent);\n }\n prompt.push(\"<<SEP>>\");\n\n promptLengths.push(prompt.length);\n inputTexts.push([...prompt, ...tokens]);\n }\n\n return [inputTexts, textLengths, promptLengths];\n};\n\n/** Encode word sequences into token IDs with masks. */\nconst encodeInputs = (\n tokenizer: Tokenizer,\n texts: string[][],\n promptLengths: number[],\n): [\n inputIds: number[][],\n attentionMasks: number[][],\n wordsMasks: number[][],\n] => {\n // Resolve special token IDs dynamically instead of\n // hardcoding DeBERTa-v3 values. Fallbacks (1, 2) match\n // the current model but future models may differ.\n const clsTokenId = tokenizer.token_to_id(\"[CLS]\") ?? 1;\n const sepTokenId = tokenizer.token_to_id(\"[SEP]\") ?? 2;\n\n const allInputIds: number[][] = [];\n const allAttentionMasks: number[][] = [];\n const allWordsMasks: number[][] = [];\n\n for (let idx = 0; idx < texts.length; idx++) {\n const promptLength = promptLengths[idx] ?? 0;\n const words = texts[idx];\n if (!words) {\n continue;\n }\n const wordsMask: number[] = [0];\n const inputIds: number[] = [clsTokenId];\n const attentionMask: number[] = [1];\n\n let wordCounter = 1;\n for (let wordId = 0; wordId < words.length; wordId++) {\n const word = words[wordId];\n if (word === undefined) {\n continue;\n }\n // encode() returns { ids, tokens, attention_mask }\n // with BOS/EOS; strip them with slice(1, -1)\n const encoded: Encoding = tokenizer.encode(word);\n const wordTokens: number[] = encoded.ids.slice(1, -1);\n\n for (let tokenId = 0; tokenId < wordTokens.length; tokenId++) {\n attentionMask.push(1);\n if (wordId < promptLength) {\n wordsMask.push(0);\n } else if (tokenId === 0) {\n wordsMask.push(wordCounter);\n wordCounter++;\n } else {\n wordsMask.push(0);\n }\n inputIds.push(wordTokens[tokenId] ?? 0);\n }\n }\n\n inputIds.push(sepTokenId);\n wordsMask.push(0);\n attentionMask.push(1);\n\n allInputIds.push(inputIds);\n allAttentionMasks.push(attentionMask);\n allWordsMasks.push(wordsMask);\n }\n\n return [allInputIds, allAttentionMasks, allWordsMasks];\n};\n\n/** Build span index pairs and masks for the model. */\nconst prepareSpans = (\n batchTokens: string[][],\n maxWidth: number,\n): { spanIdxs: number[][][]; spanMasks: boolean[][] } => {\n const spanIdxs: number[][][] = [];\n const spanMasks: boolean[][] = [];\n\n for (const tokens of batchTokens) {\n const len = tokens.length;\n const idx: number[][] = [];\n const mask: boolean[] = [];\n\n for (let i = 0; i < len; i++) {\n for (let j = 0; j < maxWidth; j++) {\n const endIdx = Math.min(i + j, len - 1);\n idx.push([i, endIdx]);\n mask.push(endIdx < len);\n }\n }\n\n spanIdxs.push(idx);\n spanMasks.push(mask);\n }\n\n return { spanIdxs, spanMasks };\n};\n\n/** Pad a 2D or 3D array to uniform inner length. */\nexport const padArray = <T>(arr: T[][], dimensions: number = 2): T[][] => {\n if (arr.length === 0) {\n return [];\n }\n const maxLength = Math.max(...arr.map((sub) => sub.length));\n // For 3D arrays, infer inner dimension from the first\n // non-empty element (arr[0] may be empty when a batch\n // element had zero word tokens).\n let finalDim = 0;\n if (dimensions === 3) {\n for (const sub of arr) {\n if (sub.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- 3D arrays have number[] inner elements\n const inner = sub[0] as unknown as number[];\n finalDim = inner.length;\n break;\n }\n }\n }\n\n return arr.map((sub) => {\n const padCount = maxLength - sub.length;\n const fill =\n dimensions === 3\n ? Array.from({ length: padCount }, () =>\n Array.from<number>({ length: finalDim }).fill(0),\n )\n : Array.from<number>({ length: padCount }).fill(0);\n // SAFETY: fill values (zero arrays) match the shape of T\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- generic padding for ONNX tensor arrays\n return [...sub, ...(fill as T[])] as T[];\n });\n};\n\n/** Prepare a complete batch for ONNX inference. */\nexport const prepareBatch = (\n tokenizer: Tokenizer,\n texts: string[],\n entities: string[],\n maxWidth: number,\n): {\n inputsIds: number[][];\n attentionMasks: number[][];\n wordsMasks: number[][];\n textLengths: number[];\n spanIdxs: number[][][];\n spanMasks: boolean[][];\n idToClass: Record<number, string>;\n batchTokens: string[][];\n batchWordsStartIdx: number[][];\n batchWordsEndIdx: number[][];\n} => {\n const batchTokens: string[][] = [];\n const batchWordsStartIdx: number[][] = [];\n const batchWordsEndIdx: number[][] = [];\n\n for (const text of texts) {\n const [words, starts, ends] = tokenizeText(text);\n batchTokens.push(words);\n batchWordsStartIdx.push(starts);\n batchWordsEndIdx.push(ends);\n }\n\n const { idToClass } = createMappings(entities);\n\n const [inputTokens, textLengths, promptLengths] = prepareTextInputs(\n batchTokens,\n entities,\n );\n\n let [inputsIds, attentionMasks, wordsMasks] = encodeInputs(\n tokenizer,\n inputTokens,\n promptLengths,\n );\n\n inputsIds = padArray(inputsIds);\n attentionMasks = padArray(attentionMasks);\n wordsMasks = padArray(wordsMasks);\n\n let { spanIdxs, spanMasks } = prepareSpans(batchTokens, maxWidth);\n\n spanIdxs = padArray(spanIdxs, 3);\n spanMasks = padArray(spanMasks);\n\n return {\n inputsIds,\n attentionMasks,\n wordsMasks,\n textLengths,\n spanIdxs,\n spanMasks,\n idToClass,\n batchTokens,\n batchWordsStartIdx,\n batchWordsEndIdx,\n };\n};\n","import type { Entity } from \"../types\";\n\nconst MAX_CHUNK_CHARS = 1500;\nconst OVERLAP_CHARS = 50;\nconst MIN_CHUNK_LENGTH = 10;\n\n/**\n * Split text into overlapping chunks for GLiNER's\n * ~512 token context window. Character-based splitting\n * (rough approximation of token limits).\n *\n * Tries to break at sentence boundaries when possible.\n */\nexport const chunkText = (text: string): string[] => {\n const chunks: string[] = [];\n let offset = 0;\n\n while (offset < text.length) {\n let end = Math.min(offset + MAX_CHUNK_CHARS, text.length);\n\n if (end < text.length) {\n const slice = text.slice(offset, end);\n const lastPeriod = slice.lastIndexOf(\". \");\n if (lastPeriod > MAX_CHUNK_CHARS * 0.5) {\n end = offset + lastPeriod + 2;\n }\n }\n\n const chunk = text.slice(offset, end);\n if (chunk.trim().length > MIN_CHUNK_LENGTH) {\n chunks.push(chunk);\n }\n offset = Math.max(offset + 1, end - OVERLAP_CHARS);\n }\n\n return chunks;\n};\n\n/**\n * Compute the byte offset of each chunk within the\n * original document text.\n */\nexport const computeChunkOffsets = (\n fullText: string,\n chunks: string[],\n): number[] => {\n const offsets: number[] = [];\n let searchFrom = 0;\n\n for (const chunk of chunks) {\n const idx = fullText.indexOf(chunk, searchFrom);\n offsets.push(idx !== -1 ? idx : searchFrom);\n searchFrom =\n idx !== -1 ? idx + Math.max(1, chunk.length - OVERLAP_CHARS) : searchFrom;\n }\n\n return offsets;\n};\n\nconst POSITION_THRESHOLD = 5;\n\n/**\n * Merge entities from overlapping chunks back to\n * document-level offsets. Deduplicates entities that\n * appear in overlap regions (keeps highest score).\n *\n * Dedup invariant: each incoming entity is compared\n * against the highest-scored same-label near-dup in\n * its proximity window. If it loses, it is dropped.\n * This does NOT guarantee that all pairwise near-dup\n * relationships in the output are resolved; a lower-\n * scored entity can survive if the bridging entity\n * that would have replaced it was itself dropped by\n * a higher-scored match.\n *\n * Uses a reverse-scan over the sorted merged array\n * so each entity only compares against nearby\n * predecessors — O(n * w) average where w is the max\n * entities per POSITION_THRESHOLD window, O(n²) worst\n * case when replacements dominate (splice is O(n)).\n */\nexport const mergeChunkEntities = (\n chunkOffsets: number[],\n chunkResults: Entity[][],\n): Entity[] => {\n const allEntities: Entity[] = [];\n\n for (let i = 0; i < chunkResults.length; i++) {\n const offset = chunkOffsets[i] ?? 0;\n const entities = chunkResults[i];\n if (!entities) {\n continue;\n }\n for (const entity of entities) {\n allEntities.push({\n ...entity,\n start: entity.start + offset,\n end: entity.end + offset,\n });\n }\n }\n\n const sorted = allEntities.toSorted(\n (a, b) => a.start - b.start,\n );\n const merged: Entity[] = [];\n\n for (const entity of sorted) {\n let bestDupIndex = -1;\n let bestDupScore = -1;\n\n // Reverse-scan the full proximity window. Collect\n // the highest-scored same-label match so we dedup\n // against the strongest existing entity, not just\n // the nearest one.\n for (let j = merged.length - 1; j >= 0; j--) {\n const existing = merged[j];\n if (existing === undefined) {\n continue;\n }\n // merged is kept sorted by start (splice+push\n // maintains this); elements further back have\n // even smaller starts, so we can break early.\n if (\n entity.start - existing.start\n >= POSITION_THRESHOLD\n ) {\n break;\n }\n if (\n existing.label === entity.label &&\n Math.abs(existing.end - entity.end)\n < POSITION_THRESHOLD &&\n existing.score > bestDupScore\n ) {\n bestDupIndex = j;\n bestDupScore = existing.score;\n }\n }\n\n if (bestDupIndex !== -1) {\n const existing = merged[bestDupIndex];\n if (\n existing !== undefined &&\n entity.score > existing.score\n ) {\n // Replace with winner. Splice out the old entry\n // and re-insert at the end to maintain sorted\n // order (entity.start >= all prior starts).\n merged.splice(bestDupIndex, 1);\n merged.push({ ...entity });\n }\n // Entity loses to the best match and is dropped.\n // Other lower-scored near-dups of this entity are\n // not revisited (see docstring dedup invariant).\n } else {\n merged.push({ ...entity });\n }\n }\n\n return merged;\n};\n","/**\n * Compute the Levenshtein edit distance between two\n * strings. O(n*m) time, O(min(n,m)) space using a\n * single-row DP approach.\n */\nexport const levenshtein = (rawA: string, rawB: string): number => {\n if (rawA === rawB) {\n return 0;\n }\n if (rawA.length === 0) {\n return rawB.length;\n }\n if (rawB.length === 0) {\n return rawA.length;\n }\n\n const [shorter, longer] =\n rawA.length <= rawB.length ? [rawA, rawB] : [rawB, rawA];\n\n const aLen = shorter.length;\n const bLen = longer.length;\n const row = new Uint16Array(aLen + 1);\n\n for (let i = 0; i <= aLen; i++) {\n row[i] = i;\n }\n\n for (let j = 1; j <= bLen; j++) {\n let prev = row[0] ?? 0;\n row[0] = j;\n\n for (let i = 1; i <= aLen; i++) {\n const cost = shorter[i - 1] === longer[j - 1] ? 0 : 1;\n const temp = row[i] ?? 0;\n row[i] = Math.min((row[i] ?? 0) + 1, (row[i - 1] ?? 0) + 1, prev + cost);\n prev = temp;\n }\n }\n\n return row[aLen] ?? 0;\n};\n","/* Browser/WASM entry point — loads TextSearch\n * from @stll/text-search-wasm and re-exports\n * the full anonymize API. */\n\nimport { TextSearch } from \"@stll/text-search-wasm\";\n\nimport { initTextSearch } from \"./search-engine\";\n\ninitTextSearch(TextSearch);\n\nexport * from \"./index-shared\";\n"],"mappings":"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CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACD;;;;;;AAOD,MAAa,aAAa;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;AAMD,MAAa,qBAAqB,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;AAMF,MAAa,gBAAgB;CAC3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;;;;;;;;;;AC/JD,MAAM,sBAAsB;AAE5B,MAAM,sBAAsB,OAC1B,oBAAoB,KAAK,GAAG,GAAG,KAAK,OAAO;AAI7C,MAAM,SAAS;;;;;AAMf,MAAa,WACX,UACsB;CACtB,MAAM,IAAI,OAAO,OAAO;AACxB,KAAI,CAAC,EACH,OAAM,IAAI,MACR,wBAAwB,MAAM,GAC/B;AAEH,QAAO,EAAE,MAAM,KAAK,UAAU,MAAM,KAAK;;;;;;;;;;AAW3C,MAAa,aAAa,UAA0B;AASlD,QAAO,IANQ,CAAC,GAFF,QAAQ,MAAM,CAEH,CAAC,MAAM,GAAG,MAAM;AACvC,MAAI,MAAM,IAAK,QAAO;AACtB,MAAI,MAAM,IAAK,QAAO;AACtB,SAAO,EAAE,cAAc,EAAE;GACzB,CACqB,IAAI,mBAAmB,CAC3B,KAAK,GAAG,CAAC;;;;;;;;AAS9B,MAAa,kBACX,UACW;AAOX,QALe,CAAC,GADF,QAAQ,MAAM,CACH,CAAC,MAAM,GAAG,MAAM;AACvC,MAAI,MAAM,IAAK,QAAO;AACtB,MAAI,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,eAAe;CACf,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,kBAAkB;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,IAAI;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EAAC;EAAM;EAAM;EAAK;CACxB,SAAS;EAAC;EAAM;EAAM;EAAM;EAAM;EAAK;CACvC,KAAK;EAAC;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAK;CACvE,aAAa;EAAC;EAAM;EAAM;EAAM;EAAM;EAAM;EAAK;CACjD,SAAS;EAAC;EAAM;EAAM;EAAK;CAC3B,YAAY;EAAC;EAAM;EAAM;EAAM;EAAM;EAAM;EAAK;CAChD,WAAW;EAAC;EAAM;EAAM;EAAM;EAAM;EAAK;CACzC,UAAU;EAAC;EAAM;EAAM;EAAM;EAAK;CAClC,eAAe;EAAC;EAAM;EAAM;EAA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"}
1
+ {"version":3,"file":"wasm.mjs","names":["_WebAssembly","_WebAssembly","defaultContext","__wasi","__wasmUrl","__emnapiContext","__sharedMemory","__napiInstance","__wasiModule","__napiModule","binding","initBinding","unpack","__wasi","__wasmUrl","__emnapiContext","__sharedMemory","__napiInstance","__wasiModule","__napiModule","binding","initBinding","normalizeEntry","unpack","PERSON_CHAIN_BREAK_RE","isInitialContinuationGap","segmenter","escapeRegex","URL","WHITESPACE_RE","sigmoid"],"sources":["../../../../node_modules/@emnapi/wasi-threads/dist/wasi-threads.esm-bundler.js","../../../../node_modules/tslib/tslib.es6.mjs","../../../../node_modules/@emnapi/core/dist/emnapi-core.esm-bundler.js","../../../../node_modules/@emnapi/runtime/dist/emnapi.esm-bundler.js","../../../../node_modules/@tybys/wasm-util/dist/wasm-util.esm-bundler.js","../../../../node_modules/@napi-rs/wasm-runtime/fs-proxy.js","../../../../node_modules/@stll/aho-corasick-wasm/dist/wasm.mjs","../../../../node_modules/@stll/fuzzy-search-wasm/dist/wasm.mjs","../../../../node_modules/@stll/regex-set-wasm/dist/wasm.mjs","../../../../node_modules/@stll/text-search-wasm/dist/wasm.mjs","../../src/search-engine.ts","../../src/types.ts","../../src/context.ts","../../src/util/lang-loader.ts","../../src/detectors/coreference.ts","../../src/detectors/gazetteer.ts","../../src/util/text.ts","../../src/detectors/names.ts","../../src/config/titles.ts","../../src/util/char-groups.ts","../../src/detectors/regex.ts","../../src/detectors/legal-forms.ts","../../src/config/legal-forms.ts","../../src/detectors/triggers.ts","../../src/regions.ts","../../src/filters/false-positives.ts","../../src/util/normalize.ts","../../src/detectors/deny-list.ts","../../src/detectors/address-seeds.ts","../../src/detectors/org-propagation.ts","../../src/filters/confidence-boost.ts","../../src/filters/zone-classifier.ts","../../src/filters/hotword-rules.ts","../../src/filters/boundary-consistency.ts","../../src/build-unified-search.ts","../../src/unified-search.ts","../../src/util/entity-masking.ts","../../src/pipeline.ts","../../src/operators.ts","../../src/redact.ts","../../src/gliner/decoder.ts","../../src/gliner/token-decoder.ts","../../src/gliner/processor.ts","../../src/util/chunker.ts","../../src/util/levenshtein.ts","../../src/wasm.ts"],"sourcesContent":["var _WebAssembly = typeof WebAssembly !== 'undefined'\n ? WebAssembly\n : typeof WXWebAssembly !== 'undefined'\n ? WXWebAssembly\n : undefined;\nvar ENVIRONMENT_IS_NODE = typeof process === 'object' && process !== null &&\n typeof process.versions === 'object' && process.versions !== null &&\n typeof process.versions.node === 'string';\nfunction getPostMessage(options) {\n return typeof (options === null || options === void 0 ? void 0 : options.postMessage) === 'function'\n ? options.postMessage\n : typeof postMessage === 'function'\n ? postMessage\n : undefined;\n}\nfunction serizeErrorToBuffer(sab, code, error) {\n var i32array = new Int32Array(sab);\n Atomics.store(i32array, 0, code);\n if (code > 1 && error) {\n var name_1 = error.name;\n var message = error.message;\n var stack = error.stack;\n var nameBuffer = new TextEncoder().encode(name_1);\n var messageBuffer = new TextEncoder().encode(message);\n var stackBuffer = new TextEncoder().encode(stack);\n Atomics.store(i32array, 1, nameBuffer.length);\n Atomics.store(i32array, 2, messageBuffer.length);\n Atomics.store(i32array, 3, stackBuffer.length);\n var buffer = new Uint8Array(sab);\n buffer.set(nameBuffer, 16);\n buffer.set(messageBuffer, 16 + nameBuffer.length);\n buffer.set(stackBuffer, 16 + nameBuffer.length + messageBuffer.length);\n }\n}\nfunction deserizeErrorFromBuffer(sab) {\n var _a, _b;\n var i32array = new Int32Array(sab);\n var status = Atomics.load(i32array, 0);\n if (status <= 1) {\n return null;\n }\n var nameLength = Atomics.load(i32array, 1);\n var messageLength = Atomics.load(i32array, 2);\n var stackLength = Atomics.load(i32array, 3);\n var buffer = new Uint8Array(sab);\n var nameBuffer = buffer.slice(16, 16 + nameLength);\n var messageBuffer = buffer.slice(16 + nameLength, 16 + nameLength + messageLength);\n var stackBuffer = buffer.slice(16 + nameLength + messageLength, 16 + nameLength + messageLength + stackLength);\n var name = new TextDecoder().decode(nameBuffer);\n var message = new TextDecoder().decode(messageBuffer);\n var stack = new TextDecoder().decode(stackBuffer);\n var ErrorConstructor = (_a = globalThis[name]) !== null && _a !== void 0 ? _a : (name === 'RuntimeError' ? ((_b = _WebAssembly.RuntimeError) !== null && _b !== void 0 ? _b : Error) : Error);\n var error = new ErrorConstructor(message);\n Object.defineProperty(error, 'stack', {\n value: stack,\n writable: true,\n enumerable: false,\n configurable: true\n });\n return error;\n}\n/** @public */\nfunction isSharedArrayBuffer(value) {\n return ((typeof SharedArrayBuffer === 'function' && value instanceof SharedArrayBuffer) ||\n (Object.prototype.toString.call(value) === '[object SharedArrayBuffer]'));\n}\n/** @public */\nfunction isTrapError(e) {\n try {\n return e instanceof _WebAssembly.RuntimeError;\n }\n catch (_) {\n return false;\n }\n}\n\nfunction createMessage(type, payload) {\n return {\n __emnapi__: {\n type: type,\n payload: payload\n }\n };\n}\n\nvar WASI_THREADS_MAX_TID = 0x1FFFFFFF;\nfunction checkSharedWasmMemory(wasmMemory) {\n if (wasmMemory) {\n if (!isSharedArrayBuffer(wasmMemory.buffer)) {\n throw new Error('Multithread features require shared wasm memory. ' +\n 'Try to compile with `-matomics -mbulk-memory` and use `--import-memory --shared-memory` during linking, ' +\n 'then create WebAssembly.Memory with `shared: true` option');\n }\n }\n else {\n if (typeof SharedArrayBuffer === 'undefined') {\n throw new Error('Current environment does not support SharedArrayBuffer, threads are not available!');\n }\n }\n}\nfunction getReuseWorker(value) {\n var _a;\n if (typeof value === 'boolean') {\n return value ? { size: 0, strict: false } : false;\n }\n if (typeof value === 'number') {\n if (!(value >= 0)) {\n throw new RangeError('reuseWorker: size must be a non-negative integer');\n }\n return { size: value, strict: false };\n }\n if (!value) {\n return false;\n }\n var size = (_a = Number(value.size)) !== null && _a !== void 0 ? _a : 0;\n var strict = Boolean(value.strict);\n if (!(size > 0) && strict) {\n throw new RangeError('reuseWorker: size must be set to positive integer if strict is set to true');\n }\n return { size: size, strict: strict };\n}\nvar nextWorkerID = 0;\n/** @public */\nvar ThreadManager = /*#__PURE__*/ (function () {\n function ThreadManager(options) {\n var _a;\n this.unusedWorkers = [];\n this.runningWorkers = [];\n this.pthreads = Object.create(null);\n this.wasmModule = null;\n this.wasmMemory = null;\n this.messageEvents = new WeakMap();\n if (!options) {\n throw new TypeError('ThreadManager(): options is not provided');\n }\n if ('childThread' in options) {\n this._childThread = Boolean(options.childThread);\n }\n else {\n this._childThread = false;\n }\n if (this._childThread) {\n this._onCreateWorker = undefined;\n this._reuseWorker = false;\n this._beforeLoad = undefined;\n }\n else {\n this._onCreateWorker = options.onCreateWorker;\n this._reuseWorker = getReuseWorker(options.reuseWorker);\n this._beforeLoad = options.beforeLoad;\n }\n this.printErr = (_a = options.printErr) !== null && _a !== void 0 ? _a : console.error.bind(console);\n this.threadSpawn = options.threadSpawn;\n }\n Object.defineProperty(ThreadManager.prototype, \"nextWorkerID\", {\n get: function () { return nextWorkerID; },\n enumerable: false,\n configurable: true\n });\n ThreadManager.prototype.init = function () {\n if (!this._childThread) {\n this.initMainThread();\n }\n };\n ThreadManager.prototype.initMainThread = function () {\n this.preparePool();\n };\n ThreadManager.prototype.preparePool = function () {\n if (this._reuseWorker) {\n if (this._reuseWorker.size) {\n var pthreadPoolSize = this._reuseWorker.size;\n while (pthreadPoolSize--) {\n var worker = this.allocateUnusedWorker();\n if (ENVIRONMENT_IS_NODE) {\n // https://github.com/nodejs/node/issues/53036\n worker.once('message', function () { });\n worker.unref();\n }\n }\n }\n }\n };\n ThreadManager.prototype.shouldPreloadWorkers = function () {\n return !this._childThread && this._reuseWorker && this._reuseWorker.size > 0;\n };\n ThreadManager.prototype.loadWasmModuleToAllWorkers = function () {\n var _this_1 = this;\n var promises = Array(this.unusedWorkers.length);\n var _loop_1 = function (i) {\n var worker = this_1.unusedWorkers[i];\n if (ENVIRONMENT_IS_NODE)\n worker.ref();\n promises[i] = this_1.loadWasmModuleToWorker(worker).then(function (w) {\n if (ENVIRONMENT_IS_NODE)\n worker.unref();\n return w;\n }, function (e) {\n if (ENVIRONMENT_IS_NODE)\n worker.unref();\n throw e;\n });\n };\n var this_1 = this;\n for (var i = 0; i < this.unusedWorkers.length; ++i) {\n _loop_1(i);\n }\n return Promise.all(promises).catch(function (err) {\n _this_1.terminateAllThreads();\n throw err;\n });\n };\n ThreadManager.prototype.preloadWorkers = function () {\n if (this.shouldPreloadWorkers()) {\n return this.loadWasmModuleToAllWorkers();\n }\n return Promise.resolve([]);\n };\n ThreadManager.prototype.setup = function (wasmModule, wasmMemory) {\n this.wasmModule = wasmModule;\n this.wasmMemory = wasmMemory;\n };\n ThreadManager.prototype.markId = function (worker) {\n if (worker.__emnapi_tid)\n return worker.__emnapi_tid;\n var tid = nextWorkerID + 43;\n nextWorkerID = (nextWorkerID + 1) % (WASI_THREADS_MAX_TID - 42);\n this.pthreads[tid] = worker;\n worker.__emnapi_tid = tid;\n return tid;\n };\n ThreadManager.prototype.returnWorkerToPool = function (worker) {\n var tid = worker.__emnapi_tid;\n if (tid !== undefined) {\n delete this.pthreads[tid];\n }\n this.unusedWorkers.push(worker);\n this.runningWorkers.splice(this.runningWorkers.indexOf(worker), 1);\n delete worker.__emnapi_tid;\n if (ENVIRONMENT_IS_NODE) {\n worker.unref();\n }\n };\n ThreadManager.prototype.loadWasmModuleToWorker = function (worker, sab) {\n var _this_1 = this;\n if (worker.whenLoaded)\n return worker.whenLoaded;\n var err = this.printErr;\n var beforeLoad = this._beforeLoad;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var _this = this;\n worker.whenLoaded = new Promise(function (resolve, reject) {\n var handleError = function (e) {\n var message = 'worker sent an error!';\n if (worker.__emnapi_tid !== undefined) {\n message = 'worker (tid = ' + worker.__emnapi_tid + ') sent an error!';\n }\n if ('message' in e) {\n err(message + ' ' + e.message);\n if (e.message.indexOf('RuntimeError') !== -1 || e.message.indexOf('unreachable') !== -1) {\n try {\n _this.terminateAllThreads();\n }\n catch (_) { }\n }\n }\n else {\n err(message);\n }\n reject(e);\n throw e;\n };\n var handleMessage = function (data) {\n if (data.__emnapi__) {\n var type = data.__emnapi__.type;\n var payload = data.__emnapi__.payload;\n if (type === 'loaded') {\n worker.loaded = true;\n if (ENVIRONMENT_IS_NODE && !worker.__emnapi_tid) {\n worker.unref();\n }\n resolve(worker);\n // if (payload.err) {\n // err('failed to load in child thread: ' + (payload.err.message || payload.err))\n // }\n }\n else if (type === 'cleanup-thread') {\n if (payload.tid in _this_1.pthreads) {\n _this_1.cleanThread(worker, payload.tid);\n }\n }\n else if (type === 'spawn-thread') {\n _this_1.threadSpawn(payload.startArg, payload.errorOrTid);\n }\n else if (type === 'terminate-all-threads') {\n _this_1.terminateAllThreads();\n }\n }\n };\n worker.onmessage = function (e) {\n handleMessage(e.data);\n _this_1.fireMessageEvent(worker, e);\n };\n worker.onerror = handleError;\n if (ENVIRONMENT_IS_NODE) {\n worker.on('message', function (data) {\n var _a, _b;\n (_b = (_a = worker).onmessage) === null || _b === void 0 ? void 0 : _b.call(_a, {\n data: data\n });\n });\n worker.on('error', function (e) {\n var _a, _b;\n (_b = (_a = worker).onerror) === null || _b === void 0 ? void 0 : _b.call(_a, e);\n });\n worker.on('detachedExit', function () { });\n }\n if (typeof beforeLoad === 'function') {\n beforeLoad(worker);\n }\n try {\n worker.postMessage(createMessage('load', {\n wasmModule: _this_1.wasmModule,\n wasmMemory: _this_1.wasmMemory,\n sab: sab\n }));\n }\n catch (err) {\n checkSharedWasmMemory(_this_1.wasmMemory);\n throw err;\n }\n });\n return worker.whenLoaded;\n };\n ThreadManager.prototype.allocateUnusedWorker = function () {\n var _onCreateWorker = this._onCreateWorker;\n if (typeof _onCreateWorker !== 'function') {\n throw new TypeError('`options.onCreateWorker` is not provided');\n }\n var worker = _onCreateWorker({ type: 'thread', name: 'emnapi-pthread' });\n this.unusedWorkers.push(worker);\n return worker;\n };\n ThreadManager.prototype.getNewWorker = function (sab) {\n if (this._reuseWorker) {\n if (this.unusedWorkers.length === 0) {\n if (this._reuseWorker.strict) {\n if (!ENVIRONMENT_IS_NODE) {\n var err = this.printErr;\n err('Tried to spawn a new thread, but the thread pool is exhausted.\\n' +\n 'This might result in a deadlock unless some threads eventually exit or the code explicitly breaks out to the event loop.');\n return;\n }\n }\n var worker_1 = this.allocateUnusedWorker();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.loadWasmModuleToWorker(worker_1, sab);\n }\n return this.unusedWorkers.pop();\n }\n var worker = this.allocateUnusedWorker();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.loadWasmModuleToWorker(worker, sab);\n return this.unusedWorkers.pop();\n };\n ThreadManager.prototype.cleanThread = function (worker, tid, force) {\n if (!force && this._reuseWorker) {\n this.returnWorkerToPool(worker);\n }\n else {\n delete this.pthreads[tid];\n var index = this.runningWorkers.indexOf(worker);\n if (index !== -1) {\n this.runningWorkers.splice(index, 1);\n }\n this.terminateWorker(worker);\n delete worker.__emnapi_tid;\n }\n };\n ThreadManager.prototype.terminateWorker = function (worker) {\n var _this_1 = this;\n var _a;\n var tid = worker.__emnapi_tid;\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n worker.terminate();\n (_a = this.messageEvents.get(worker)) === null || _a === void 0 ? void 0 : _a.clear();\n this.messageEvents.delete(worker);\n worker.onmessage = function (e) {\n if (e.data.__emnapi__) {\n var err = _this_1.printErr;\n err('received \"' + e.data.__emnapi__.type + '\" command from terminated worker: ' + tid);\n }\n };\n };\n ThreadManager.prototype.terminateAllThreads = function () {\n for (var i = 0; i < this.runningWorkers.length; ++i) {\n this.terminateWorker(this.runningWorkers[i]);\n }\n for (var i = 0; i < this.unusedWorkers.length; ++i) {\n this.terminateWorker(this.unusedWorkers[i]);\n }\n this.unusedWorkers = [];\n this.runningWorkers = [];\n this.pthreads = Object.create(null);\n this.preparePool();\n };\n ThreadManager.prototype.addMessageEventListener = function (worker, onMessage) {\n var listeners = this.messageEvents.get(worker);\n if (!listeners) {\n listeners = new Set();\n this.messageEvents.set(worker, listeners);\n }\n listeners.add(onMessage);\n return function () {\n listeners === null || listeners === void 0 ? void 0 : listeners.delete(onMessage);\n };\n };\n ThreadManager.prototype.fireMessageEvent = function (worker, e) {\n var listeners = this.messageEvents.get(worker);\n if (!listeners)\n return;\n var err = this.printErr;\n listeners.forEach(function (listener) {\n try {\n listener(e);\n }\n catch (e) {\n err(e.stack);\n }\n });\n };\n return ThreadManager;\n}());\n\nvar kIsProxy = Symbol('kIsProxy');\n/** @public */\nfunction createInstanceProxy(instance, memory) {\n if (instance[kIsProxy])\n return instance;\n // https://github.com/nodejs/help/issues/4102\n var originalExports = instance.exports;\n var createHandler = function (target) {\n var handlers = [\n 'apply',\n 'construct',\n 'defineProperty',\n 'deleteProperty',\n 'get',\n 'getOwnPropertyDescriptor',\n 'getPrototypeOf',\n 'has',\n 'isExtensible',\n 'ownKeys',\n 'preventExtensions',\n 'set',\n 'setPrototypeOf'\n ];\n var handler = {};\n var _loop_1 = function (i) {\n var name_1 = handlers[i];\n handler[name_1] = function () {\n var args = Array.prototype.slice.call(arguments, 1);\n args.unshift(target);\n return Reflect[name_1].apply(Reflect, args);\n };\n };\n for (var i = 0; i < handlers.length; i++) {\n _loop_1(i);\n }\n return handler;\n };\n var handler = createHandler(originalExports);\n var _initialize = function () { };\n var _start = function () { return 0; };\n handler.get = function (_target, p, receiver) {\n var _a;\n if (p === 'memory') {\n return (_a = (typeof memory === 'function' ? memory() : memory)) !== null && _a !== void 0 ? _a : Reflect.get(originalExports, p, receiver);\n }\n if (p === '_initialize') {\n return p in originalExports ? _initialize : undefined;\n }\n if (p === '_start') {\n return p in originalExports ? _start : undefined;\n }\n return Reflect.get(originalExports, p, receiver);\n };\n handler.has = function (_target, p) {\n if (p === 'memory')\n return true;\n return Reflect.has(originalExports, p);\n };\n var exportsProxy = new Proxy(Object.create(null), handler);\n return new Proxy(instance, {\n get: function (target, p, receiver) {\n if (p === 'exports') {\n return exportsProxy;\n }\n if (p === kIsProxy) {\n return true;\n }\n return Reflect.get(target, p, receiver);\n }\n });\n}\n\nvar patchedWasiInstances = new WeakMap();\n/** @public */\nvar WASIThreads = /*#__PURE__*/ (function () {\n function WASIThreads(options) {\n var _this_1 = this;\n if (!options) {\n throw new TypeError('WASIThreads(): options is not provided');\n }\n if (!options.wasi) {\n throw new TypeError('WASIThreads(): options.wasi is not provided');\n }\n patchedWasiInstances.set(this, new WeakSet());\n var wasi = options.wasi;\n patchWasiInstance(this, wasi);\n this.wasi = wasi;\n if ('childThread' in options) {\n this.childThread = Boolean(options.childThread);\n }\n else {\n this.childThread = false;\n }\n this.PThread = undefined;\n if ('threadManager' in options) {\n if (typeof options.threadManager === 'function') {\n this.PThread = options.threadManager();\n }\n else {\n this.PThread = options.threadManager;\n }\n }\n else {\n if (!this.childThread) {\n this.PThread = new ThreadManager(options);\n this.PThread.init();\n }\n }\n var waitThreadStart = false;\n if ('waitThreadStart' in options) {\n waitThreadStart = typeof options.waitThreadStart === 'number' ? options.waitThreadStart : Boolean(options.waitThreadStart);\n }\n var postMessage = getPostMessage(options);\n if (this.childThread && typeof postMessage !== 'function') {\n throw new TypeError('options.postMessage is not a function');\n }\n this.postMessage = postMessage;\n var wasm64 = Boolean(options.wasm64);\n var threadSpawn = function (startArg, errorOrTid) {\n var _a;\n var EAGAIN = 6;\n var isNewABI = errorOrTid !== undefined;\n try {\n checkSharedWasmMemory(_this_1.wasmMemory);\n }\n catch (err) {\n (_a = _this_1.PThread) === null || _a === void 0 ? void 0 : _a.printErr(err.stack);\n if (isNewABI) {\n var struct_1 = new Int32Array(_this_1.wasmMemory.buffer, errorOrTid, 2);\n Atomics.store(struct_1, 0, 1);\n Atomics.store(struct_1, 1, EAGAIN);\n Atomics.notify(struct_1, 1);\n return 1;\n }\n else {\n return -EAGAIN;\n }\n }\n if (!isNewABI) {\n var malloc = _this_1.wasmInstance.exports.malloc;\n errorOrTid = wasm64 ? Number(malloc(BigInt(8))) : (malloc(8) >>> 0);\n if (!errorOrTid) {\n return -48; /* ENOMEM */\n }\n }\n var _free = _this_1.wasmInstance.exports.free;\n var free = wasm64 ? function (ptr) { _free(BigInt(ptr)); } : _free;\n var struct = new Int32Array(_this_1.wasmMemory.buffer, errorOrTid, 2);\n Atomics.store(struct, 0, 0);\n Atomics.store(struct, 1, 0);\n if (_this_1.childThread) {\n postMessage(createMessage('spawn-thread', {\n startArg: startArg,\n errorOrTid: errorOrTid\n }));\n Atomics.wait(struct, 1, 0);\n var isError = Atomics.load(struct, 0);\n var result = Atomics.load(struct, 1);\n if (isNewABI) {\n return isError;\n }\n free(errorOrTid);\n return isError ? -result : result;\n }\n var shouldWait = waitThreadStart || (waitThreadStart === 0);\n var sab;\n if (shouldWait) {\n sab = new Int32Array(new SharedArrayBuffer(16 + 8192));\n Atomics.store(sab, 0, 0);\n }\n var worker;\n var tid;\n var PThread = _this_1.PThread;\n try {\n worker = PThread.getNewWorker(sab);\n if (!worker) {\n throw new Error('failed to get new worker');\n }\n tid = PThread.markId(worker);\n if (ENVIRONMENT_IS_NODE) {\n worker.unref();\n }\n worker.postMessage(createMessage('start', {\n tid: tid,\n arg: startArg,\n sab: sab\n }));\n if (shouldWait) {\n if (typeof waitThreadStart === 'number') {\n var waitResult = Atomics.wait(sab, 0, 0, waitThreadStart);\n if (waitResult === 'timed-out') {\n try {\n PThread.cleanThread(worker, tid, true);\n }\n catch (_) { }\n throw new Error('Spawning thread timed out. Please check if the worker is created successfully and if message is handled properly in the worker.');\n }\n }\n else {\n Atomics.wait(sab, 0, 0);\n }\n var r = Atomics.load(sab, 0);\n if (r > 1) {\n try {\n PThread.cleanThread(worker, tid, true);\n }\n catch (_) { }\n throw deserizeErrorFromBuffer(sab.buffer);\n }\n }\n }\n catch (e) {\n Atomics.store(struct, 0, 1);\n Atomics.store(struct, 1, EAGAIN);\n Atomics.notify(struct, 1);\n PThread === null || PThread === void 0 ? void 0 : PThread.printErr(e.stack);\n if (isNewABI) {\n return 1;\n }\n free(errorOrTid);\n return -EAGAIN;\n }\n Atomics.store(struct, 0, 0);\n Atomics.store(struct, 1, tid);\n Atomics.notify(struct, 1);\n PThread.runningWorkers.push(worker);\n if (!shouldWait) {\n worker.whenLoaded.catch(function (err) {\n delete worker.whenLoaded;\n PThread.cleanThread(worker, tid, true);\n throw err;\n });\n }\n if (isNewABI) {\n return 0;\n }\n free(errorOrTid);\n return tid;\n };\n this.threadSpawn = threadSpawn;\n if (this.PThread) {\n this.PThread.threadSpawn = threadSpawn;\n }\n }\n WASIThreads.prototype.getImportObject = function () {\n return {\n wasi: {\n 'thread-spawn': this.threadSpawn\n }\n };\n };\n WASIThreads.prototype.setup = function (wasmInstance, wasmModule, wasmMemory) {\n wasmMemory !== null && wasmMemory !== void 0 ? wasmMemory : (wasmMemory = wasmInstance.exports.memory);\n this.wasmInstance = wasmInstance;\n this.wasmMemory = wasmMemory;\n if (this.PThread) {\n this.PThread.setup(wasmModule, wasmMemory);\n }\n };\n WASIThreads.prototype.preloadWorkers = function () {\n if (this.PThread) {\n return this.PThread.preloadWorkers();\n }\n return Promise.resolve([]);\n };\n /**\n * It's ok to call this method to a WASI command module.\n *\n * in child thread, must call this method instead of {@link WASIThreads.start} even if it's a WASI command module\n *\n * @returns A proxied WebAssembly instance if in child thread, other wise the original instance\n */\n WASIThreads.prototype.initialize = function (instance, module, memory) {\n var exports$1 = instance.exports;\n memory !== null && memory !== void 0 ? memory : (memory = exports$1.memory);\n if (this.childThread) {\n instance = createInstanceProxy(instance, memory);\n }\n this.setup(instance, module, memory);\n var wasi = this.wasi;\n if (('_start' in exports$1) && (typeof exports$1._start === 'function')) {\n if (this.childThread) {\n wasi.start(instance);\n try {\n var kStarted = getWasiSymbol(wasi, 'kStarted');\n wasi[kStarted] = false;\n }\n catch (_) { }\n }\n else {\n setupInstance(wasi, instance);\n }\n }\n else {\n wasi.initialize(instance);\n }\n return instance;\n };\n /**\n * Equivalent to calling {@link WASIThreads.initialize} and then calling {@link WASIInstance.start}\n * ```js\n * this.initialize(instance, module, memory)\n * this.wasi.start(instance)\n * ```\n */\n WASIThreads.prototype.start = function (instance, module, memory) {\n var exports$1 = instance.exports;\n memory !== null && memory !== void 0 ? memory : (memory = exports$1.memory);\n if (this.childThread) {\n instance = createInstanceProxy(instance, memory);\n }\n this.setup(instance, module, memory);\n var exitCode = this.wasi.start(instance);\n return { exitCode: exitCode, instance: instance };\n };\n WASIThreads.prototype.terminateAllThreads = function () {\n var _a;\n if (!this.childThread) {\n (_a = this.PThread) === null || _a === void 0 ? void 0 : _a.terminateAllThreads();\n }\n else {\n this.postMessage(createMessage('terminate-all-threads', {}));\n }\n };\n return WASIThreads;\n}());\nfunction patchWasiInstance(wasiThreads, wasi) {\n var patched = patchedWasiInstances.get(wasiThreads);\n if (patched.has(wasi)) {\n return;\n }\n var _this = wasiThreads;\n var wasiImport = wasi.wasiImport;\n if (wasiImport) {\n var proc_exit_1 = wasiImport.proc_exit;\n wasiImport.proc_exit = function (code) {\n _this.terminateAllThreads();\n return proc_exit_1.call(this, code);\n };\n }\n if (!_this.childThread) {\n var start_1 = wasi.start;\n if (typeof start_1 === 'function') {\n wasi.start = function (instance) {\n try {\n return start_1.call(this, instance);\n }\n catch (err) {\n if (isTrapError(err)) {\n _this.terminateAllThreads();\n }\n throw err;\n }\n };\n }\n }\n patched.add(wasi);\n}\nfunction getWasiSymbol(wasi, description) {\n var symbols = Object.getOwnPropertySymbols(wasi);\n var selectDescription = function (description) { return function (s) {\n if (s.description) {\n return s.description === description;\n }\n return s.toString() === \"Symbol(\".concat(description, \")\");\n }; };\n if (Array.isArray(description)) {\n return description.map(function (d) { return symbols.filter(selectDescription(d))[0]; });\n }\n return symbols.filter(selectDescription(description))[0];\n}\nfunction setupInstance(wasi, instance) {\n var _a = getWasiSymbol(wasi, ['kInstance', 'kSetMemory']), kInstance = _a[0], kSetMemory = _a[1];\n wasi[kInstance] = instance;\n wasi[kSetMemory](instance.exports.memory);\n}\n\n/** @public */\nvar ThreadMessageHandler = /*#__PURE__*/ (function () {\n function ThreadMessageHandler(options) {\n var postMsg = getPostMessage(options);\n if (typeof postMsg !== 'function') {\n throw new TypeError('options.postMessage is not a function');\n }\n this.postMessage = postMsg;\n this.onLoad = options === null || options === void 0 ? void 0 : options.onLoad;\n this.onError = typeof (options === null || options === void 0 ? void 0 : options.onError) === 'function' ? options.onError : function (_type, err) { throw err; };\n this.instance = undefined;\n // this.module = undefined\n this.messagesBeforeLoad = [];\n }\n /** @virtual */\n ThreadMessageHandler.prototype.instantiate = function (data) {\n if (typeof this.onLoad === 'function') {\n return this.onLoad(data);\n }\n throw new Error('ThreadMessageHandler.prototype.instantiate is not implemented');\n };\n /** @virtual */\n ThreadMessageHandler.prototype.handle = function (e) {\n var _this = this;\n var _a;\n if ((_a = e === null || e === void 0 ? void 0 : e.data) === null || _a === void 0 ? void 0 : _a.__emnapi__) {\n var type = e.data.__emnapi__.type;\n var payload_1 = e.data.__emnapi__.payload;\n try {\n if (type === 'load') {\n this._load(payload_1);\n }\n else if (type === 'start') {\n this.handleAfterLoad(e, function () {\n _this._start(payload_1);\n });\n }\n }\n catch (err) {\n this.onError(err, type);\n }\n }\n };\n ThreadMessageHandler.prototype._load = function (payload) {\n var _this = this;\n if (this.instance !== undefined)\n return;\n var source;\n try {\n source = this.instantiate(payload);\n }\n catch (err) {\n this._loaded(err, null, payload);\n return;\n }\n var then = source && 'then' in source ? source.then : undefined;\n if (typeof then === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n then.call(source, function (source) { _this._loaded(null, source, payload); }, function (err) { _this._loaded(err, null, payload); });\n }\n else {\n this._loaded(null, source, payload);\n }\n };\n ThreadMessageHandler.prototype._start = function (payload) {\n var wasi_thread_start = this.instance.exports.wasi_thread_start;\n if (typeof wasi_thread_start !== 'function') {\n var err = new TypeError('wasi_thread_start is not exported');\n notifyPthreadCreateResult(payload.sab, 2, err);\n throw err;\n }\n var postMessage = this.postMessage;\n var tid = payload.tid;\n var startArg = payload.arg;\n notifyPthreadCreateResult(payload.sab, 1);\n try {\n wasi_thread_start(tid, startArg);\n }\n catch (err) {\n if (err !== 'unwind') {\n throw err;\n }\n else {\n return;\n }\n }\n postMessage(createMessage('cleanup-thread', { tid: tid }));\n };\n ThreadMessageHandler.prototype._loaded = function (err, source, payload) {\n if (err) {\n notifyPthreadCreateResult(payload.sab, 2, err);\n throw err;\n }\n if (source == null) {\n var err_1 = new TypeError('onLoad should return an object');\n notifyPthreadCreateResult(payload.sab, 2, err_1);\n throw err_1;\n }\n var instance = source.instance;\n if (!instance) {\n var err_2 = new TypeError('onLoad should return an object which includes \"instance\"');\n notifyPthreadCreateResult(payload.sab, 2, err_2);\n throw err_2;\n }\n this.instance = instance;\n var postMessage = this.postMessage;\n postMessage(createMessage('loaded', {}));\n var messages = this.messagesBeforeLoad;\n this.messagesBeforeLoad = [];\n for (var i = 0; i < messages.length; i++) {\n var data = messages[i];\n this.handle({ data: data });\n }\n };\n ThreadMessageHandler.prototype.handleAfterLoad = function (e, f) {\n if (this.instance !== undefined) {\n f.call(this, e);\n }\n else {\n this.messagesBeforeLoad.push(e.data);\n }\n };\n return ThreadMessageHandler;\n}());\nfunction notifyPthreadCreateResult(sab, result, error) {\n if (sab) {\n serizeErrorToBuffer(sab.buffer, result, error);\n Atomics.notify(sab, 0);\n }\n}\n\nexport { ThreadManager, ThreadMessageHandler, WASIThreads, createInstanceProxy, isSharedArrayBuffer, isTrapError };\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import { ThreadManager, WASIThreads, ThreadMessageHandler } from '@emnapi/wasi-threads';\nexport * from '@emnapi/wasi-threads';\nimport { __extends, __assign } from 'tslib';\n\n/* eslint-disable no-undef */\nvar _WebAssembly = typeof WebAssembly !== 'undefined'\n ? WebAssembly\n : typeof WXWebAssembly !== 'undefined'\n ? WXWebAssembly\n : undefined;\nfunction validateImports(imports) {\n if (imports && typeof imports !== 'object') {\n throw new TypeError('imports must be an object or undefined');\n }\n return true;\n}\nfunction load(wasmInput, imports) {\n if (!wasmInput)\n throw new TypeError('Invalid wasm source');\n validateImports(imports);\n imports = imports !== null && imports !== void 0 ? imports : {};\n // Promise<string | URL | Response | BufferSource | WebAssembly.Module>\n try {\n var then = typeof wasmInput === 'object' && wasmInput !== null && 'then' in wasmInput ? wasmInput.then : undefined;\n if (typeof then === 'function') {\n return then.call(wasmInput, function (input) { return load(input, imports); });\n }\n }\n catch (_) { }\n // BufferSource\n if (wasmInput instanceof ArrayBuffer || ArrayBuffer.isView(wasmInput)) {\n return _WebAssembly.instantiate(wasmInput, imports);\n }\n // WebAssembly.Module\n if (wasmInput instanceof _WebAssembly.Module) {\n return _WebAssembly.instantiate(wasmInput, imports).then(function (instance) {\n return { instance: instance, module: wasmInput };\n });\n }\n // Response\n if (typeof Response !== 'undefined' && wasmInput instanceof Response) {\n return wasmInput.arrayBuffer().then(function (buffer) {\n return _WebAssembly.instantiate(buffer, imports);\n });\n }\n // string | URL\n var inputIsString = typeof wasmInput === 'string';\n if (inputIsString || (typeof URL !== 'undefined' && wasmInput instanceof URL)) {\n if (inputIsString && typeof wx !== 'undefined' && typeof __wxConfig !== 'undefined') {\n return _WebAssembly.instantiate(wasmInput, imports);\n }\n if (typeof fetch !== 'function') {\n throw new TypeError('wasm source can not be a string or URL in this environment');\n }\n if (typeof _WebAssembly.instantiateStreaming === 'function') {\n try {\n return _WebAssembly.instantiateStreaming(fetch(wasmInput), imports).catch(function () {\n return load(fetch(wasmInput), imports);\n });\n }\n catch (_) {\n return load(fetch(wasmInput), imports);\n }\n }\n else {\n return load(fetch(wasmInput), imports);\n }\n }\n throw new TypeError('Invalid wasm source');\n}\nfunction loadSync(wasmInput, imports) {\n if (!wasmInput)\n throw new TypeError('Invalid wasm source');\n validateImports(imports);\n imports = imports !== null && imports !== void 0 ? imports : {};\n var module;\n if ((wasmInput instanceof ArrayBuffer) || ArrayBuffer.isView(wasmInput)) {\n module = new _WebAssembly.Module(wasmInput);\n }\n else if (wasmInput instanceof WebAssembly.Module) {\n module = wasmInput;\n }\n else {\n throw new TypeError('Invalid wasm source');\n }\n var instance = new _WebAssembly.Instance(module, imports);\n var source = { instance: instance, module: module };\n return source;\n}\n\nfunction createNapiModule(options) {\n var napiModule = (function () {\n var ENVIRONMENT_IS_NODE = typeof process === 'object' && process !== null && typeof process.versions === 'object' && process.versions !== null && typeof process.versions.node === 'string';\n var ENVIRONMENT_IS_PTHREAD = Boolean(options.childThread);\n var waitThreadStart = typeof options.waitThreadStart === 'number' ? options.waitThreadStart : Boolean(options.waitThreadStart);\n var wasmInstance;\n var wasmMemory;\n var wasmTable;\n var _malloc;\n var _free;\n function abort(msg) {\n if (typeof _WebAssembly.RuntimeError === 'function') {\n throw new _WebAssembly.RuntimeError(msg);\n }\n throw Error(msg);\n }\n var napiModule = {\n imports: {\n env: {},\n napi: {},\n emnapi: {}\n },\n exports: {},\n emnapi: {},\n loaded: false,\n filename: '',\n childThread: ENVIRONMENT_IS_PTHREAD,\n initWorker: undefined,\n waitThreadStart: waitThreadStart,\n PThread: undefined,\n init: function (options) {\n if (napiModule.loaded)\n return napiModule.exports;\n if (!options)\n throw new TypeError('Invalid napi init options');\n var instance = options.instance;\n if (!(instance === null || instance === void 0 ? void 0 : instance.exports))\n throw new TypeError('Invalid wasm instance');\n wasmInstance = instance;\n var exports$1 = instance.exports;\n var module = options.module;\n var memory = options.memory || exports$1.memory;\n var table = options.table || exports$1.__indirect_function_table;\n if (!(module instanceof _WebAssembly.Module))\n throw new TypeError('Invalid wasm module');\n if (!(memory instanceof _WebAssembly.Memory))\n throw new TypeError('Invalid wasm memory');\n if (!(table instanceof _WebAssembly.Table))\n throw new TypeError('Invalid wasm table');\n wasmMemory = memory;\n wasmTable = table;\n if (typeof exports$1.malloc !== 'function')\n throw new TypeError('malloc is not exported');\n if (typeof exports$1.free !== 'function')\n throw new TypeError('free is not exported');\n _malloc = exports$1.malloc;\n _free = exports$1.free;\n if (!napiModule.childThread) {\n // main thread only\n var moduleApiVersion = 8 /* Version.NODE_API_DEFAULT_MODULE_API_VERSION */;\n var node_api_module_get_api_version_v1 = instance.exports.node_api_module_get_api_version_v1;\n if (typeof node_api_module_get_api_version_v1 === 'function') {\n moduleApiVersion = node_api_module_get_api_version_v1();\n }\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n var envObject = napiModule.envObject || (napiModule.envObject = emnapiCtx.createEnv(napiModule.filename, moduleApiVersion, function (cb) { return (wasmTable.get(cb)); }, function (cb) { return (wasmTable.get(cb)); }, abort, emnapiNodeBinding));\n var scope_1 = emnapiCtx.openScope(envObject);\n try {\n envObject.callIntoModule(function (_envObject) {\n var exports$1 = napiModule.exports;\n var exportsHandle = scope_1.add(exports$1);\n var napi_register_wasm_v1 = instance.exports.napi_register_wasm_v1;\n var napiValue = napi_register_wasm_v1(_envObject.id, exportsHandle.id);\n napiModule.exports = (!napiValue) ? exports$1 : emnapiCtx.handleStore.get(napiValue).value;\n });\n }\n catch (e) {\n if (e !== 'unwind') {\n throw e;\n }\n }\n finally {\n emnapiCtx.closeScope(envObject, scope_1);\n }\n napiModule.loaded = true;\n delete napiModule.envObject;\n return napiModule.exports;\n }\n }\n };\n var emnapiCtx;\n var emnapiNodeBinding;\n var onCreateWorker = undefined;\n var err;\n if (!ENVIRONMENT_IS_PTHREAD) {\n var context = options.context;\n if (typeof context !== 'object' || context === null) {\n throw new TypeError(\"Invalid `options.context`. Use `import { getDefaultContext } from '@emnapi/runtime'`\");\n }\n emnapiCtx = context;\n }\n else {\n emnapiCtx = options === null || options === void 0 ? void 0 : options.context;\n var postMsg = typeof options.postMessage === 'function'\n ? options.postMessage\n : typeof postMessage === 'function'\n ? postMessage\n : undefined;\n if (typeof postMsg !== 'function') {\n throw new TypeError('No postMessage found');\n }\n napiModule.postMessage = postMsg;\n }\n if (typeof options.filename === 'string') {\n napiModule.filename = options.filename;\n }\n if (typeof options.onCreateWorker === 'function') {\n onCreateWorker = options.onCreateWorker;\n }\n if (typeof options.print === 'function') {\n options.print;\n }\n else {\n console.log.bind(console);\n }\n if (typeof options.printErr === 'function') {\n err = options.printErr;\n }\n else {\n err = console.warn.bind(console);\n }\n if ('nodeBinding' in options) {\n var nodeBinding = options.nodeBinding;\n if (typeof nodeBinding !== 'object' || nodeBinding === null) {\n throw new TypeError('Invalid `options.nodeBinding`. Use @emnapi/node-binding package');\n }\n emnapiNodeBinding = nodeBinding;\n }\n var emnapiAsyncWorkPoolSize = 0;\n if ('asyncWorkPoolSize' in options) {\n if (typeof options.asyncWorkPoolSize !== 'number') {\n throw new TypeError('options.asyncWorkPoolSize must be a integer');\n }\n emnapiAsyncWorkPoolSize = options.asyncWorkPoolSize >> 0;\n if (emnapiAsyncWorkPoolSize > 1024) {\n emnapiAsyncWorkPoolSize = 1024;\n }\n else if (emnapiAsyncWorkPoolSize < -1024) {\n emnapiAsyncWorkPoolSize = -1024;\n }\n }\n var singleThreadAsyncWork = ENVIRONMENT_IS_PTHREAD ? false : (emnapiAsyncWorkPoolSize <= 0);\n function _emnapi_async_work_pool_size() {\n return Math.abs(emnapiAsyncWorkPoolSize);\n }\n napiModule.imports.env._emnapi_async_work_pool_size = _emnapi_async_work_pool_size;\n // ------------------------------ pthread -------------------------------\n function emnapiAddSendListener(worker) {\n if (!worker)\n return false;\n if (worker._emnapiSendListener)\n return true;\n var handler = function (e) {\n var data = ENVIRONMENT_IS_NODE ? e : e.data;\n var __emnapi__ = data.__emnapi__;\n if (__emnapi__ && __emnapi__.type === 'async-send') {\n if (ENVIRONMENT_IS_PTHREAD) {\n var postMessage_1 = napiModule.postMessage;\n postMessage_1({ __emnapi__: __emnapi__ });\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var callback = __emnapi__.payload.callback;\n (wasmTable.get(callback))(__emnapi__.payload.data);\n }\n }\n };\n var dispose = function () {\n if (ENVIRONMENT_IS_NODE) {\n worker.off('message', handler);\n }\n else {\n worker.removeEventListener('message', handler, false);\n }\n delete worker._emnapiSendListener;\n };\n worker._emnapiSendListener = { handler: handler, dispose: dispose };\n if (ENVIRONMENT_IS_NODE) {\n worker.on('message', handler);\n }\n else {\n worker.addEventListener('message', handler, false);\n }\n return true;\n }\n napiModule.emnapi.addSendListener = emnapiAddSendListener;\n var PThread = new ThreadManager(ENVIRONMENT_IS_PTHREAD\n ? {\n printErr: err,\n childThread: true\n }\n : {\n printErr: err,\n beforeLoad: function (worker) {\n emnapiAddSendListener(worker);\n },\n reuseWorker: options.reuseWorker,\n onCreateWorker: onCreateWorker\n });\n napiModule.PThread = PThread;\n /**\n * @__sig ipiip\n */\n function napi_set_last_error(env, error_code, engine_error_code, engine_reserved) {\n var envObject = emnapiCtx.envStore.get(env);\n return envObject.setLastError(error_code, engine_error_code, engine_reserved);\n }\n /**\n * @__sig ip\n */\n function napi_clear_last_error(env) {\n var envObject = emnapiCtx.envStore.get(env);\n return envObject.clearLastError();\n }\n /**\n * @__sig vppp\n */\n function _emnapi_get_node_version(major, minor, patch) {\n major >>>= 0;\n minor >>>= 0;\n patch >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var versions = (typeof process === 'object' && process !== null &&\n typeof process.versions === 'object' && process.versions !== null &&\n typeof process.versions.node === 'string')\n ? process.versions.node.split('.').map(function (n) { return Number(n); })\n : [0, 0, 0];\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(major, versions[0], true);\n HEAP_DATA_VIEW.setUint32(minor, versions[1], true);\n HEAP_DATA_VIEW.setUint32(patch, versions[2], true);\n }\n /**\n * @__sig v\n * @__deps $runtimeKeepalivePush\n */\n function _emnapi_runtime_keepalive_push() {\n }\n /**\n * @__sig v\n * @__deps $runtimeKeepalivePop\n */\n function _emnapi_runtime_keepalive_pop() {\n }\n /**\n * @__sig vpp\n */\n function _emnapi_set_immediate(callback, data) {\n emnapiCtx.feature.setImmediate(function () {\n (wasmTable.get(callback))(data);\n });\n }\n /**\n * @__sig vpp\n */\n function _emnapi_next_tick(callback, data) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n Promise.resolve().then(function () {\n (wasmTable.get(callback))(data);\n });\n }\n /**\n * @__sig vipppi\n */\n function _emnapi_callback_into_module(forceUncaught, env, callback, data, close_scope_if_throw) {\n var envObject = emnapiCtx.envStore.get(env);\n var scope = emnapiCtx.openScope(envObject);\n try {\n envObject.callbackIntoModule(Boolean(forceUncaught), function () {\n (wasmTable.get(callback))(env, data);\n });\n }\n catch (err) {\n emnapiCtx.closeScope(envObject, scope);\n if (close_scope_if_throw) {\n emnapiCtx.closeScope(envObject);\n }\n throw err;\n }\n emnapiCtx.closeScope(envObject, scope);\n }\n /**\n * @__sig vipppp\n */\n function _emnapi_call_finalizer(forceUncaught, env, callback, data, hint) {\n var envObject = emnapiCtx.envStore.get(env);\n callback >>>= 0;\n envObject.callFinalizerInternal(forceUncaught, callback, data, hint);\n }\n /**\n * @__sig v\n */\n function _emnapi_ctx_increase_waiting_request_counter() {\n emnapiCtx.increaseWaitingRequestCounter();\n }\n /**\n * @__sig v\n */\n function _emnapi_ctx_decrease_waiting_request_counter() {\n emnapiCtx.decreaseWaitingRequestCounter();\n }\n /**\n * @__sig i\n */\n function _emnapi_is_main_runtime_thread() {\n return ENVIRONMENT_IS_PTHREAD ? 0 : 1;\n }\n /**\n * @__sig i\n */\n function _emnapi_is_main_browser_thread() {\n return (typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE) ? 1 : 0;\n }\n /**\n * @__sig v\n */\n function _emnapi_unwind() {\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw 'unwind';\n }\n /**\n * @__sig d\n */\n function _emnapi_get_now() {\n return performance.timeOrigin + performance.now();\n }\n function $emnapiSetValueI64(result, numberValue) {\n var tempDouble;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var tempI64 = [\n numberValue >>> 0,\n (tempDouble = numberValue, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)\n ];\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt32(result, tempI64[0], true);\n HEAP_DATA_VIEW.setInt32(result + 4, tempI64[1], true);\n }\n /**\n * @__deps $emnapiCtx\n * @__sig p\n */\n function _emnapi_open_handle_scope() {\n return emnapiCtx.openScope().id;\n }\n /**\n * @__deps $emnapiCtx\n * @__sig vp\n */\n function _emnapi_close_handle_scope(_scope) {\n return emnapiCtx.closeScope();\n }\n var utilMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n $emnapiSetValueI64: $emnapiSetValueI64,\n _emnapi_call_finalizer: _emnapi_call_finalizer,\n _emnapi_callback_into_module: _emnapi_callback_into_module,\n _emnapi_close_handle_scope: _emnapi_close_handle_scope,\n _emnapi_ctx_decrease_waiting_request_counter: _emnapi_ctx_decrease_waiting_request_counter,\n _emnapi_ctx_increase_waiting_request_counter: _emnapi_ctx_increase_waiting_request_counter,\n _emnapi_get_node_version: _emnapi_get_node_version,\n _emnapi_get_now: _emnapi_get_now,\n _emnapi_is_main_browser_thread: _emnapi_is_main_browser_thread,\n _emnapi_is_main_runtime_thread: _emnapi_is_main_runtime_thread,\n _emnapi_next_tick: _emnapi_next_tick,\n _emnapi_open_handle_scope: _emnapi_open_handle_scope,\n _emnapi_runtime_keepalive_pop: _emnapi_runtime_keepalive_pop,\n _emnapi_runtime_keepalive_push: _emnapi_runtime_keepalive_push,\n _emnapi_set_immediate: _emnapi_set_immediate,\n _emnapi_unwind: _emnapi_unwind,\n napi_clear_last_error: napi_clear_last_error,\n napi_set_last_error: napi_set_last_error\n });\n function emnapiGetWorkerByPthreadPtr(pthreadPtr) {\n var view = new DataView(wasmMemory.buffer);\n /**\n * wasi-sdk-20.0+threads\n *\n * struct pthread {\n * struct pthread *self; // 0\n * struct pthread *prev, *next; // 4, 8\n * uintptr_t sysinfo; // 12\n * uintptr_t canary; // 16\n * int tid; // 20\n * // ...\n * }\n */\n var tidOffset = 20;\n var tid = view.getInt32(pthreadPtr + tidOffset, true);\n var worker = PThread.pthreads[tid];\n return worker;\n }\n /** @__sig vp */\n function _emnapi_worker_ref(pthreadPtr) {\n if (ENVIRONMENT_IS_PTHREAD)\n return;\n pthreadPtr >>>= 0;\n var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr);\n if (worker && typeof worker.ref === 'function') {\n worker.ref();\n }\n }\n /** @__sig vp */\n function _emnapi_worker_unref(pthreadPtr) {\n if (ENVIRONMENT_IS_PTHREAD)\n return;\n pthreadPtr >>>= 0;\n var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr);\n if (worker && typeof worker.unref === 'function') {\n worker.unref();\n }\n }\n /** @__sig vipp */\n function _emnapi_async_send_js(type, callback, data) {\n if (ENVIRONMENT_IS_PTHREAD) {\n var postMessage_1 = napiModule.postMessage;\n postMessage_1({\n __emnapi__: {\n type: 'async-send',\n payload: {\n callback: callback,\n data: data\n }\n }\n });\n }\n else {\n switch (type) {\n case 0:\n _emnapi_set_immediate(callback, data);\n break;\n case 1:\n _emnapi_next_tick(callback, data);\n break;\n }\n }\n }\n // function ptrToString (ptr: number): string {\n // return '0x' + ('00000000' + ptr.toString(16)).slice(-8)\n // }\n var uvThreadpoolReadyResolve;\n var uvThreadpoolReady = new Promise(function (resolve) {\n uvThreadpoolReadyResolve = function () {\n uvThreadpoolReady.ready = true;\n resolve();\n };\n });\n uvThreadpoolReady.ready = false;\n /** @__sig vppi */\n function _emnapi_after_uvthreadpool_ready(callback, q, type) {\n if (uvThreadpoolReady.ready) {\n (wasmTable.get(callback))(q, type);\n }\n else {\n uvThreadpoolReady.then(function () {\n (wasmTable.get(callback))(q, type);\n });\n }\n }\n /** @__sig vpi */\n function _emnapi_tell_js_uvthreadpool(threads, size) {\n var p = [];\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n var _loop_1 = function (i) {\n var pthreadPtr = HEAP_DATA_VIEW.getUint32(threads + i * 4, true);\n var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr);\n p.push(new Promise(function (resolve) {\n var handler = function (e) {\n var data = ENVIRONMENT_IS_NODE ? e : e.data;\n var __emnapi__ = data.__emnapi__;\n if (__emnapi__ && __emnapi__.type === 'async-thread-ready') {\n resolve();\n if (worker && typeof worker.unref === 'function') {\n worker.unref();\n }\n if (ENVIRONMENT_IS_NODE) {\n worker.off('message', handler);\n }\n else {\n worker.removeEventListener('message', handler);\n }\n }\n };\n if (ENVIRONMENT_IS_NODE) {\n worker.on('message', handler);\n }\n else {\n worker.addEventListener('message', handler);\n }\n }));\n };\n for (var i = 0; i < size; i++) {\n _loop_1(i);\n }\n Promise.all(p).then(uvThreadpoolReadyResolve);\n }\n /** @__sig v */\n function _emnapi_emit_async_thread_ready() {\n if (!ENVIRONMENT_IS_PTHREAD)\n return;\n var postMessage = napiModule.postMessage;\n postMessage({\n __emnapi__: {\n type: 'async-thread-ready',\n payload: {}\n }\n });\n }\n var asyncMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n _emnapi_after_uvthreadpool_ready: _emnapi_after_uvthreadpool_ready,\n _emnapi_async_send_js: _emnapi_async_send_js,\n _emnapi_emit_async_thread_ready: _emnapi_emit_async_thread_ready,\n _emnapi_tell_js_uvthreadpool: _emnapi_tell_js_uvthreadpool,\n _emnapi_worker_ref: _emnapi_worker_ref,\n _emnapi_worker_unref: _emnapi_worker_unref\n });\n /** @__sig ipjp */\n function napi_adjust_external_memory(env, change_in_bytes, adjusted_value) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!adjusted_value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n // eslint-disable-next-line prefer-const\n var adjusted_memory = emnapiCtx.adjustAmountOfExternalAllocatedMemory(change_in_bytes);\n adjusted_value >>>= 0;\n if (emnapiCtx.feature.supportBigInt) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setBigInt64(adjusted_value, BigInt(adjusted_memory), true);\n }\n else {\n $emnapiSetValueI64(adjusted_value, Number(adjusted_memory));\n }\n return envObject.clearLastError();\n }\n var memoryMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_adjust_external_memory: napi_adjust_external_memory\n });\n /**\n * @__postset\n * ```\n * emnapiAWST.init();\n * ```\n */\n var emnapiAWST = {\n idGen: {},\n values: [undefined],\n queued: new Set(),\n pending: [],\n init: function () {\n var idGen = {\n nextId: 1,\n list: [],\n generate: function () {\n var id;\n if (idGen.list.length) {\n id = idGen.list.shift();\n }\n else {\n id = idGen.nextId;\n idGen.nextId++;\n }\n return id;\n },\n reuse: function (id) {\n idGen.list.push(id);\n }\n };\n emnapiAWST.idGen = idGen;\n emnapiAWST.values = [undefined];\n emnapiAWST.queued = new Set();\n emnapiAWST.pending = [];\n },\n create: function (env, resource, resourceName, execute, complete, data) {\n var asyncId = 0;\n var triggerAsyncId = 0;\n if (emnapiNodeBinding) {\n var asyncContext = emnapiNodeBinding.node.emitAsyncInit(resource, resourceName, -1);\n asyncId = asyncContext.asyncId;\n triggerAsyncId = asyncContext.triggerAsyncId;\n }\n var id = emnapiAWST.idGen.generate();\n emnapiAWST.values[id] = {\n env: env,\n id: id,\n resource: resource,\n asyncId: asyncId,\n triggerAsyncId: triggerAsyncId,\n status: 0,\n execute: execute,\n complete: complete,\n data: data\n };\n return id;\n },\n callComplete: function (work, status) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var complete = work.complete;\n var env = work.env;\n var data = work.data;\n var callback = function () {\n if (!complete)\n return;\n var envObject = emnapiCtx.envStore.get(env);\n var scope = emnapiCtx.openScope(envObject);\n try {\n envObject.callbackIntoModule(true, function () {\n (wasmTable.get(complete))(env, status, data);\n });\n }\n finally {\n emnapiCtx.closeScope(envObject, scope);\n }\n };\n if (emnapiNodeBinding) {\n emnapiNodeBinding.node.makeCallback(work.resource, callback, [], {\n asyncId: work.asyncId,\n triggerAsyncId: work.triggerAsyncId\n });\n }\n else {\n callback();\n }\n },\n queue: function (id) {\n var work = emnapiAWST.values[id];\n if (!work)\n return;\n if (work.status === 0) {\n work.status = 1;\n if (emnapiAWST.queued.size >= (Math.abs(emnapiAsyncWorkPoolSize) || 4)) {\n emnapiAWST.pending.push(id);\n return;\n }\n emnapiAWST.queued.add(id);\n var env_1 = work.env;\n var data_1 = work.data;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var execute = work.execute;\n work.status = 2;\n emnapiCtx.feature.setImmediate(function () {\n (wasmTable.get(execute))(env_1, data_1);\n emnapiAWST.queued.delete(id);\n work.status = 3;\n emnapiCtx.feature.setImmediate(function () {\n emnapiAWST.callComplete(work, 0 /* napi_status.napi_ok */);\n });\n if (emnapiAWST.pending.length > 0) {\n var nextWorkId = emnapiAWST.pending.shift();\n emnapiAWST.values[nextWorkId].status = 0;\n emnapiAWST.queue(nextWorkId);\n }\n });\n }\n },\n cancel: function (id) {\n var index = emnapiAWST.pending.indexOf(id);\n if (index !== -1) {\n var work_1 = emnapiAWST.values[id];\n if (work_1 && (work_1.status === 1)) {\n work_1.status = 4;\n emnapiAWST.pending.splice(index, 1);\n emnapiCtx.feature.setImmediate(function () {\n emnapiAWST.callComplete(work_1, 11 /* napi_status.napi_cancelled */);\n });\n return 0 /* napi_status.napi_ok */;\n }\n else {\n return 9 /* napi_status.napi_generic_failure */;\n }\n }\n return 9 /* napi_status.napi_generic_failure */;\n },\n remove: function (id) {\n var work = emnapiAWST.values[id];\n if (!work)\n return;\n if (emnapiNodeBinding) {\n emnapiNodeBinding.node.emitAsyncDestroy({\n asyncId: work.asyncId,\n triggerAsyncId: work.triggerAsyncId\n });\n }\n emnapiAWST.values[id] = undefined;\n emnapiAWST.idGen.reuse(id);\n }\n };\n /** @__sig vppdp */\n function _emnapi_node_emit_async_init(async_resource, async_resource_name, trigger_async_id, result) {\n if (!emnapiNodeBinding)\n return;\n var resource = emnapiCtx.handleStore.get(async_resource).value;\n var resource_name = emnapiCtx.handleStore.get(async_resource_name).value;\n var asyncContext = emnapiNodeBinding.node.emitAsyncInit(resource, resource_name, trigger_async_id);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var asyncId = asyncContext.asyncId;\n var triggerAsyncId = asyncContext.triggerAsyncId;\n if (result) {\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setFloat64(result, asyncId, true);\n HEAP_DATA_VIEW.setFloat64(result + 8, triggerAsyncId, true);\n }\n }\n /** @__sig vdd */\n function _emnapi_node_emit_async_destroy(async_id, trigger_async_id) {\n if (!emnapiNodeBinding)\n return;\n emnapiNodeBinding.node.emitAsyncDestroy({\n asyncId: async_id,\n triggerAsyncId: trigger_async_id\n });\n }\n /* vpddp export function _emnapi_node_open_callback_scope (async_resource: napi_value, async_id: double, trigger_async_id: double, result: Pointer<int64_t>): void {\n if (!emnapiNodeBinding || !result) return\n const resource = emnapiCtx.handleStore.get(async_resource)!.value\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const nativeCallbackScopePointer = emnapiNodeBinding.node.openCallbackScope(resource, {\n asyncId: async_id,\n triggerAsyncId: trigger_async_id\n })\n \n from64('result')\n $_TODO_makeSetValue('result', 0, 'nativeCallbackScopePointer', 'i64')\n }\n \n vp\n export function _emnapi_node_close_callback_scope (scope: Pointer<int64_t>): void {\n if (!emnapiNodeBinding || !scope) return\n from64('scope')\n const nativeCallbackScopePointer = $_TODO_makeGetValue('scope', 0, 'i64')\n emnapiNodeBinding.node.closeCallbackScope(BigInt(nativeCallbackScopePointer))\n } */\n /** @__sig ipppppddp */\n function _emnapi_node_make_callback(env, async_resource, cb, argv, size, async_id, trigger_async_id, result) {\n var i = 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v;\n if (!emnapiNodeBinding)\n return;\n var resource = emnapiCtx.handleStore.get(async_resource).value;\n var callback = emnapiCtx.handleStore.get(cb).value;\n argv >>>= 0;\n size >>>= 0;\n size = size >>> 0;\n var arr = Array(size);\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n for (; i < size; i++) {\n var argVal = HEAP_DATA_VIEW.getUint32(argv + i * 4, true);\n arr[i] = emnapiCtx.handleStore.get(argVal).value;\n }\n var ret = emnapiNodeBinding.node.makeCallback(resource, callback, arr, {\n asyncId: async_id,\n triggerAsyncId: trigger_async_id\n });\n if (result) {\n result >>>= 0;\n var envObject = emnapiCtx.envStore.get(env);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n v = envObject.ensureHandleId(ret);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n }\n }\n /** @__sig ippp */\n function _emnapi_async_init_js(async_resource, async_resource_name, result) {\n if (!emnapiNodeBinding) {\n return 9 /* napi_status.napi_generic_failure */;\n }\n var resource;\n if (async_resource) {\n resource = Object(emnapiCtx.handleStore.get(async_resource).value);\n }\n var name = emnapiCtx.handleStore.get(async_resource_name).value;\n var ret = emnapiNodeBinding.napi.asyncInit(resource, name);\n if (ret.status !== 0)\n return ret.status;\n var numberValue = ret.value;\n if (!((numberValue >= (BigInt(-1) * (BigInt(1) << BigInt(63)))) && (numberValue < (BigInt(1) << BigInt(63))))) {\n numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1));\n if (numberValue >= (BigInt(1) << BigInt(63))) {\n numberValue = numberValue - (BigInt(1) << BigInt(64));\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var low = Number(numberValue & BigInt(0xffffffff));\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var high = Number(numberValue >> BigInt(32));\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt32(result, low, true);\n HEAP_DATA_VIEW.setInt32(result + 4, high, true);\n return 0 /* napi_status.napi_ok */;\n }\n /** @__sig ip */\n function _emnapi_async_destroy_js(async_context) {\n if (!emnapiNodeBinding) {\n return 9 /* napi_status.napi_generic_failure */;\n }\n async_context >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n var low = HEAP_DATA_VIEW.getInt32(async_context, true);\n var high = HEAP_DATA_VIEW.getInt32(async_context + 4, true);\n var pointer = BigInt(low >>> 0) | (BigInt(high) << BigInt(32));\n var ret = emnapiNodeBinding.napi.asyncDestroy(pointer);\n if (ret.status !== 0)\n return ret.status;\n return 0 /* napi_status.napi_ok */;\n }\n // https://github.com/nodejs/node-addon-api/pull/1283\n /** @__sig ipppp */\n function napi_open_callback_scope(env, ignored, async_context_handle, result) {\n throw new Error('napi_open_callback_scope has not been implemented yet');\n }\n /** @__sig ipp */\n function napi_close_callback_scope(env, scope) {\n throw new Error('napi_close_callback_scope has not been implemented yet');\n }\n /** @__sig ippppppp */\n function napi_make_callback(env, async_context, recv, func, argc, argv, result) {\n var i = 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!emnapiNodeBinding) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n if (!recv)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (argc > 0) {\n if (!argv)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var v8recv = Object(emnapiCtx.handleStore.get(recv).value);\n var v8func = emnapiCtx.handleStore.get(func).value;\n if (typeof v8func !== 'function') {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n async_context >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n var low = HEAP_DATA_VIEW.getInt32(async_context, true);\n var high = HEAP_DATA_VIEW.getInt32(async_context + 4, true);\n var ctx = BigInt(low >>> 0) | (BigInt(high) << BigInt(32));\n argv >>>= 0;\n argc >>>= 0;\n argc = argc >>> 0;\n var arr = Array(argc);\n for (; i < argc; i++) {\n var argVal = HEAP_DATA_VIEW.getUint32(argv + i * 4, true);\n arr[i] = emnapiCtx.handleStore.get(argVal).value;\n }\n var ret = emnapiNodeBinding.napi.makeCallback(ctx, v8recv, v8func, arr);\n if (ret.error) {\n throw ret.error;\n }\n if (ret.status !== 0 /* napi_status.napi_ok */)\n return envObject.setLastError(ret.status);\n if (result) {\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n v = envObject.ensureHandleId(ret.value);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n }\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig vp */\n function _emnapi_env_check_gc_access(env) {\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n }\n var nodeMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n _emnapi_async_destroy_js: _emnapi_async_destroy_js,\n _emnapi_async_init_js: _emnapi_async_init_js,\n _emnapi_env_check_gc_access: _emnapi_env_check_gc_access,\n _emnapi_node_emit_async_destroy: _emnapi_node_emit_async_destroy,\n _emnapi_node_emit_async_init: _emnapi_node_emit_async_init,\n _emnapi_node_make_callback: _emnapi_node_make_callback,\n napi_close_callback_scope: napi_close_callback_scope,\n napi_make_callback: napi_make_callback,\n napi_open_callback_scope: napi_open_callback_scope\n });\n /**\n * @__deps malloc\n * @__deps free\n * @__postset\n * ```\n * emnapiTSFN.init();\n * ```\n */\n var emnapiTSFN = {\n _liveSet: {},\n offset: {\n __size__: 0,\n /* napi_ref */ resource: 0,\n /* double */ async_id: 0,\n /* double */ trigger_async_id: 0,\n /* size_t */ queue_size: 0,\n /* bool */ is_some: 0,\n /* void* */ queue: 0,\n // Reuse uv_async_t storage as JS-side wakeup state: pending event + scheduled drain.\n async_pending: 0,\n async_u_fd: 0,\n /* size_t */ thread_count: 0,\n /* int32_t */ state: 0,\n /* atomic_uchar */ dispatch_state: 0,\n /* void* */ context: 0,\n /* size_t */ max_queue_size: 0,\n /* napi_ref */ ref: 0,\n /* napi_env */ env: 0,\n /* void* */ finalize_data: 0,\n /* napi_finalize */ finalize_cb: 0,\n /* napi_threadsafe_function_call_js */ call_js_cb: 0,\n /* bool */ handles_closing: 0,\n /* bool */ async_ref: 0,\n /* int32_t */ mutex: 0,\n /* int32_t */ cond: 0\n },\n init: function () {\n emnapiTSFN._liveSet = new Set();\n emnapiTSFN.offset.__size__ = 184 /* NapiTSFNOffset32.__size__ */;\n emnapiTSFN.offset.resource = 0 /* NapiTSFNOffset32.async_resource_resource */;\n emnapiTSFN.offset.async_id = 8 /* NapiTSFNOffset32.async_resource_async_context_async_id */;\n emnapiTSFN.offset.trigger_async_id = 16 /* NapiTSFNOffset32.async_resource_async_context_trigger_async_id */;\n emnapiTSFN.offset.queue_size = 60 /* NapiTSFNOffset32.queue_size */;\n emnapiTSFN.offset.is_some = 24 /* NapiTSFNOffset32.async_resource_is_some */;\n emnapiTSFN.offset.queue = 64 /* NapiTSFNOffset32.queue */;\n emnapiTSFN.offset.async_pending = 132 /* NapiTSFNOffset32.async_pending */;\n emnapiTSFN.offset.async_u_fd = 96 /* NapiTSFNOffset32.async_u_fd */;\n emnapiTSFN.offset.thread_count = 136 /* NapiTSFNOffset32.thread_count */;\n emnapiTSFN.offset.state = 140 /* NapiTSFNOffset32.state */;\n emnapiTSFN.offset.dispatch_state = 144 /* NapiTSFNOffset32.dispatch_state */;\n emnapiTSFN.offset.context = 148 /* NapiTSFNOffset32.context */;\n emnapiTSFN.offset.max_queue_size = 152 /* NapiTSFNOffset32.max_queue_size */;\n emnapiTSFN.offset.ref = 156 /* NapiTSFNOffset32.ref */;\n emnapiTSFN.offset.env = 160 /* NapiTSFNOffset32.env */;\n emnapiTSFN.offset.finalize_data = 164 /* NapiTSFNOffset32.finalize_data */;\n emnapiTSFN.offset.finalize_cb = 168 /* NapiTSFNOffset32.finalize_cb */;\n emnapiTSFN.offset.call_js_cb = 172 /* NapiTSFNOffset32.call_js_cb */;\n emnapiTSFN.offset.handles_closing = 176 /* NapiTSFNOffset32.handles_closing */;\n emnapiTSFN.offset.async_ref = 180 /* NapiTSFNOffset32.async_ref */;\n emnapiTSFN.offset.mutex = 32 /* NapiTSFNOffset32.mutex */;\n emnapiTSFN.offset.cond = 56 /* NapiTSFNOffset32.cond */;\n emnapiTSFN.offset.mutex = emnapiTSFN.offset.mutex + 4;\n if (typeof PThread !== 'undefined') {\n PThread.unusedWorkers.forEach(emnapiTSFN.addListener);\n PThread.runningWorkers.forEach(emnapiTSFN.addListener);\n var __original_getNewWorker_1 = PThread.getNewWorker;\n PThread.getNewWorker = function () {\n var r = __original_getNewWorker_1.apply(this, arguments);\n emnapiTSFN.addListener(r);\n return r;\n };\n }\n },\n addListener: function (worker) {\n if (!worker)\n return false;\n if (worker._emnapiTSFNListener)\n return true;\n var handler = function (e) {\n var data = ENVIRONMENT_IS_NODE ? e : e.data;\n var __emnapi__ = data.__emnapi__;\n if (__emnapi__) {\n var type = __emnapi__.type;\n var payload = __emnapi__.payload;\n if (type === 'tsfn-send') {\n var pendng = payload.tsfn + emnapiTSFN.offset.async_pending;\n if (Atomics.load(new Int32Array(wasmMemory.buffer), pendng >>> 2) !== 0) {\n emnapiTSFN.enqueue(payload.tsfn);\n }\n }\n }\n };\n var dispose = function () {\n if (ENVIRONMENT_IS_NODE) {\n worker.off('message', handler);\n }\n else {\n worker.removeEventListener('message', handler, false);\n }\n delete worker._emnapiTSFNListener;\n };\n worker._emnapiTSFNListener = { handler: handler, dispose: dispose };\n if (ENVIRONMENT_IS_NODE) {\n worker.on('message', handler);\n }\n else {\n worker.addEventListener('message', handler, false);\n }\n return true;\n },\n initQueue: function (func) {\n var size = 2 * 4;\n var queue = _malloc(size);\n if (!queue)\n return false;\n queue >>>= 0;\n new Uint8Array(wasmMemory.buffer, queue, size).fill(0);\n emnapiTSFN.storeSizeTypeValue(func + emnapiTSFN.offset.queue, queue, false);\n return true;\n },\n destroyQueue: function (func) {\n var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false);\n if (queue) {\n var node = emnapiTSFN.loadSizeTypeValue(queue, false);\n while (node !== 0) {\n var next = emnapiTSFN.loadSizeTypeValue(node + 4, false);\n _free(node);\n node = next;\n }\n _free(queue);\n }\n },\n pushQueue: function (func, data) {\n var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false);\n var head = emnapiTSFN.loadSizeTypeValue(queue, false);\n var tail = emnapiTSFN.loadSizeTypeValue(queue + 4, false);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var size = 2 * 4;\n var node = _malloc(size);\n if (!node)\n throw new Error('OOM');\n node >>>= 0;\n emnapiTSFN.storeSizeTypeValue(node, data, false);\n emnapiTSFN.storeSizeTypeValue(node + 4, 0, false);\n if (head === 0 && tail === 0) {\n emnapiTSFN.storeSizeTypeValue(queue, node, false);\n emnapiTSFN.storeSizeTypeValue(queue + 4, node, false);\n }\n else {\n emnapiTSFN.storeSizeTypeValue(tail + 4, node, false);\n emnapiTSFN.storeSizeTypeValue(queue + 4, node, false);\n }\n emnapiTSFN.addQueueSize(func);\n },\n shiftQueue: function (func) {\n var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false);\n var head = emnapiTSFN.loadSizeTypeValue(queue, false);\n if (head === 0)\n return 0;\n var node = head;\n var next = emnapiTSFN.loadSizeTypeValue(head + 4, false);\n emnapiTSFN.storeSizeTypeValue(queue, next, false);\n if (next === 0) {\n emnapiTSFN.storeSizeTypeValue(queue + 4, 0, false);\n }\n emnapiTSFN.storeSizeTypeValue(node + 4, 0, false);\n var value = emnapiTSFN.loadSizeTypeValue(node, false);\n _free(node);\n emnapiTSFN.subQueueSize(func);\n return value;\n },\n push: function (func, data, mode) {\n var mutex = emnapiTSFN.getMutex(func);\n var cond = emnapiTSFN.getCond(func);\n var waitCondition = function () {\n var queueSize = emnapiTSFN.getQueueSize(func);\n var maxSize = emnapiTSFN.getMaxQueueSize(func);\n return queueSize >= maxSize && maxSize > 0 && emnapiTSFN.getState(func) === 0 /* State.kOpen */;\n };\n var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE;\n var shouldDelete = false;\n var ret = mutex.execute(function () {\n while (waitCondition()) {\n if (mode === 0 /* napi_threadsafe_function_call_mode.napi_tsfn_nonblocking */) {\n return 15 /* napi_status.napi_queue_full */;\n }\n /**\n * Browser JS main thread can not use `Atomics.wait`\n *\n * Related:\n * https://github.com/nodejs/node/pull/32689\n * https://github.com/nodejs/node/pull/33453\n */\n if (isBrowserMain) {\n return 21 /* napi_status.napi_would_deadlock */;\n }\n cond.wait();\n }\n if (emnapiTSFN.getState(func) === 0 /* State.kOpen */) {\n emnapiTSFN.pushQueue(func, data);\n emnapiTSFN.send(func);\n return 0 /* napi_status.napi_ok */;\n }\n if (emnapiTSFN.getThreadCount(func) === 0) {\n return 1 /* napi_status.napi_invalid_arg */;\n }\n emnapiTSFN.subThreadCount(func);\n if (!(emnapiTSFN.getState(func) === 2 /* State.kClosed */ && emnapiTSFN.getThreadCount(func) === 0)) {\n return 16 /* napi_status.napi_closing */;\n }\n shouldDelete = true;\n return 16 /* napi_status.napi_closing */;\n });\n if (shouldDelete) {\n emnapiTSFN.destroy(func);\n }\n return ret;\n },\n getMutex: function (func) {\n var index = func + emnapiTSFN.offset.mutex;\n var mutex = {\n lock: function () {\n var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE;\n var i32a = new Int32Array(wasmMemory.buffer, index, 1);\n if (isBrowserMain) {\n while (true) {\n var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);\n if (oldValue === 0) {\n return;\n }\n }\n }\n else {\n while (true) {\n var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);\n if (oldValue === 0) {\n return;\n }\n Atomics.wait(i32a, 0, 10);\n }\n }\n },\n /* lockAsync () {\n return new Promise<void>(resolve => {\n const again = (): void => { fn() }\n const fn = (): void => {\n const i32a = new Int32Array(wasmMemory.buffer, index, 1)\n const oldValue = Atomics.compareExchange(i32a, 0, 0, 10)\n if (oldValue === 0) {\n resolve()\n return\n }\n (Atomics as any).waitAsync(i32a, 0, 10).value.then(again)\n }\n fn()\n })\n }, */\n unlock: function () {\n var i32a = new Int32Array(wasmMemory.buffer, index, 1);\n var oldValue = Atomics.compareExchange(i32a, 0, 10, 0);\n if (oldValue !== 10) {\n throw new Error('Tried to unlock while not holding the mutex');\n }\n Atomics.notify(i32a, 0, 1);\n },\n execute: function (fn) {\n mutex.lock();\n try {\n return fn();\n }\n finally {\n mutex.unlock();\n }\n } /* ,\n executeAsync<T> (fn: () => Promise<T>): Promise<T> {\n return mutex.lockAsync().then(() => {\n const r = fn()\n mutex.unlock()\n return r\n }, (err) => {\n mutex.unlock()\n throw err\n })\n } */\n };\n return mutex;\n },\n getCond: function (func) {\n var index = func + emnapiTSFN.offset.cond;\n var mutex = emnapiTSFN.getMutex(func);\n var cond = {\n wait: function () {\n var i32a = new Int32Array(wasmMemory.buffer, index, 1);\n var value = Atomics.load(i32a, 0);\n mutex.unlock();\n Atomics.wait(i32a, 0, value);\n mutex.lock();\n },\n /* waitAsync () {\n const i32a = new Int32Array(wasmMemory.buffer, index, 1)\n const value = Atomics.load(i32a, 0)\n mutex.unlock()\n const lock = (): Promise<void> => mutex.lockAsync()\n try {\n return (Atomics as any).waitAsync(i32a, 0, value).value.then(lock, lock)\n } catch (err) {\n return lock()\n }\n }, */\n signal: function () {\n var i32a = new Int32Array(wasmMemory.buffer, index, 1);\n Atomics.add(i32a, 0, 1);\n Atomics.notify(i32a, 0, 1);\n }\n };\n return cond;\n },\n getQueueSize: function (func) {\n return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue_size, true);\n },\n addQueueSize: function (func) {\n var offset = emnapiTSFN.offset.queue_size;\n var arr, index;\n arr = new Uint32Array(wasmMemory.buffer);\n index = (func + offset) >>> 2;\n Atomics.add(arr, index, 1);\n },\n subQueueSize: function (func) {\n var offset = emnapiTSFN.offset.queue_size;\n var arr, index;\n arr = new Uint32Array(wasmMemory.buffer);\n index = (func + offset) >>> 2;\n Atomics.sub(arr, index, 1);\n },\n getThreadCount: function (func) {\n return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.thread_count, true);\n },\n addThreadCount: function (func) {\n var offset = emnapiTSFN.offset.thread_count;\n var arr, index;\n arr = new Uint32Array(wasmMemory.buffer);\n index = (func + offset) >>> 2;\n Atomics.add(arr, index, 1);\n },\n subThreadCount: function (func) {\n var offset = emnapiTSFN.offset.thread_count;\n var arr, index;\n arr = new Uint32Array(wasmMemory.buffer);\n index = (func + offset) >>> 2;\n Atomics.sub(arr, index, 1);\n },\n getState: function (func) {\n return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.state) >>> 2);\n },\n setState: function (func, value) {\n Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.state) >>> 2, value);\n },\n getHandlesClosing: function (func) {\n return Atomics.load(new Int8Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing));\n },\n setHandlesClosing: function (func, value) {\n Atomics.store(new Int8Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing), value);\n },\n getDispatchState: function (func) {\n return Atomics.load(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >>> 2);\n },\n getContext: function (func) {\n return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.context, false);\n },\n getMaxQueueSize: function (func) {\n return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.max_queue_size, true);\n },\n getEnv: function (func) {\n return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.env, false);\n },\n getCallJSCb: function (func) {\n return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.call_js_cb, false);\n },\n getRef: function (func) {\n return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.ref, false);\n },\n getResource: function (func) {\n return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.resource, false);\n },\n getFinalizeCb: function (func) {\n return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.finalize_cb, false);\n },\n getFinalizeData: function (func) {\n return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.finalize_data, false);\n },\n loadSizeTypeValue: function (offset, unsigned) {\n var ret;\n var arr;\n if (unsigned) {\n arr = new Uint32Array(wasmMemory.buffer);\n ret = Atomics.load(arr, offset >>> 2);\n return ret;\n }\n else {\n arr = new Int32Array(wasmMemory.buffer);\n ret = Atomics.load(arr, offset >>> 2);\n return ret;\n }\n },\n storeSizeTypeValue: function (offset, value, unsigned) {\n var arr;\n if (unsigned) {\n arr = new Uint32Array(wasmMemory.buffer);\n Atomics.store(arr, offset >>> 2, value);\n return undefined;\n }\n else {\n arr = new Int32Array(wasmMemory.buffer);\n Atomics.store(arr, offset >>> 2, value >>> 0);\n return undefined;\n }\n },\n releaseResources: function (func) {\n if (emnapiTSFN.getState(func) !== 2 /* State.kClosed */) {\n emnapiTSFN.setState(func, 2 /* State.kClosed */);\n var env = emnapiTSFN.getEnv(func);\n var envObject = emnapiCtx.envStore.get(env);\n var ref = emnapiTSFN.getRef(func);\n if (ref) {\n emnapiCtx.refStore.get(ref).dispose();\n }\n var resource = emnapiTSFN.getResource(func);\n emnapiCtx.refStore.get(resource).dispose();\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(func + emnapiTSFN.offset.is_some, 0, true);\n emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func);\n envObject.unref();\n var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >>> 2;\n var arr = new Uint32Array(wasmMemory.buffer);\n if (Atomics.load(arr, asyncRefOffset) > 0) {\n Atomics.store(arr, asyncRefOffset, 0);\n emnapiCtx.decreaseWaitingRequestCounter();\n }\n if (emnapiNodeBinding) {\n var view = new DataView(wasmMemory.buffer);\n var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);\n var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);\n _emnapi_node_emit_async_destroy(asyncId, triggerAsyncId);\n }\n }\n },\n destroy: function (func) {\n emnapiTSFN._liveSet.delete(func);\n emnapiTSFN.destroyQueue(func);\n emnapiTSFN.releaseResources(func);\n _free(func);\n },\n emptyQueue: function (func) {\n var drainQueue = [];\n emnapiTSFN.getMutex(func).execute(function () {\n while (emnapiTSFN.getQueueSize(func) > 0) {\n drainQueue.push(emnapiTSFN.shiftQueue(func));\n }\n });\n var callJsCb = emnapiTSFN.getCallJSCb(func);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var context = emnapiTSFN.getContext(func);\n var data;\n for (var i = 0; i < drainQueue.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n data = drainQueue[i];\n if (callJsCb) {\n (wasmTable.get(callJsCb))(0, 0, context, data);\n }\n }\n },\n maybeDelete: function (func) {\n var shouldDelete = false;\n emnapiTSFN.getMutex(func).execute(function () {\n if (emnapiTSFN.getThreadCount(func) > 0) {\n emnapiTSFN.releaseResources(func);\n }\n else {\n shouldDelete = true;\n }\n });\n if (shouldDelete) {\n emnapiTSFN.destroy(func);\n }\n },\n finalize: function (func) {\n var env = emnapiTSFN.getEnv(func);\n var envObject = emnapiCtx.envStore.get(env);\n emnapiCtx.openScope(envObject);\n var finalize = emnapiTSFN.getFinalizeCb(func);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var data = emnapiTSFN.getFinalizeData(func);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var context = emnapiTSFN.getContext(func);\n var f = function () {\n envObject.callFinalizerInternal(0, finalize, data, context);\n };\n try {\n emnapiTSFN.emptyQueue(func);\n if (finalize) {\n if (emnapiNodeBinding) {\n var resource = emnapiTSFN.getResource(func);\n var resource_value = emnapiCtx.refStore.get(resource).get();\n var resourceObject = emnapiCtx.handleStore.get(resource_value).value;\n var view = new DataView(wasmMemory.buffer);\n var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);\n var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);\n emnapiNodeBinding.node.makeCallback(resourceObject, f, [], {\n asyncId: asyncId,\n triggerAsyncId: triggerAsyncId\n });\n }\n else {\n f();\n }\n }\n emnapiTSFN.maybeDelete(func);\n }\n finally {\n emnapiCtx.closeScope(envObject);\n }\n },\n cleanup: function (func) {\n emnapiTSFN.closeHandlesAndMaybeDelete(func, 1);\n },\n closeHandlesAndMaybeDelete: function (func, set_closing) {\n var env = emnapiTSFN.getEnv(func);\n var envObject = emnapiCtx.envStore.get(env);\n emnapiCtx.openScope(envObject);\n try {\n if (set_closing) {\n emnapiTSFN.getMutex(func).execute(function () {\n emnapiTSFN.setState(func, 1 /* State.kClosing */);\n if (emnapiTSFN.getMaxQueueSize(func) > 0) {\n emnapiTSFN.getCond(func).signal();\n }\n });\n }\n if (emnapiTSFN.getHandlesClosing(func)) {\n return;\n }\n emnapiTSFN.setHandlesClosing(func, 1);\n Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.async_pending) >>> 2, 1);\n emnapiCtx.feature.setImmediate(function () {\n emnapiTSFN.finalize(func);\n });\n }\n finally {\n emnapiCtx.closeScope(envObject);\n }\n },\n dispatchOne: function (func) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var data = 0;\n var popped_value = false;\n var has_more = false;\n var mutex = emnapiTSFN.getMutex(func);\n var cond = emnapiTSFN.getCond(func);\n mutex.execute(function () {\n if (emnapiTSFN.getState(func) === 0 /* State.kOpen */) {\n var size = emnapiTSFN.getQueueSize(func);\n if (size > 0) {\n data = emnapiTSFN.shiftQueue(func);\n popped_value = true;\n var maxQueueSize = emnapiTSFN.getMaxQueueSize(func);\n if (size === maxQueueSize && maxQueueSize > 0) {\n cond.signal();\n }\n size--;\n }\n if (size === 0) {\n if (emnapiTSFN.getThreadCount(func) === 0) {\n emnapiTSFN.setState(func, 1 /* State.kClosing */);\n if (emnapiTSFN.getMaxQueueSize(func) > 0) {\n cond.signal();\n }\n emnapiTSFN.closeHandlesAndMaybeDelete(func, 0);\n }\n }\n else {\n has_more = true;\n }\n }\n else {\n emnapiTSFN.closeHandlesAndMaybeDelete(func, 0);\n }\n });\n if (popped_value) {\n var env = emnapiTSFN.getEnv(func);\n var envObject_1 = emnapiCtx.envStore.get(env);\n emnapiCtx.openScope(envObject_1);\n var f = function () {\n envObject_1.callbackIntoModule(false, function () {\n var callJsCb = emnapiTSFN.getCallJSCb(func);\n var ref = emnapiTSFN.getRef(func);\n var js_callback = ref ? emnapiCtx.refStore.get(ref).get() : 0;\n if (callJsCb) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var context = emnapiTSFN.getContext(func);\n (wasmTable.get(callJsCb))(env, js_callback, context, data);\n }\n else {\n var jsCallback = js_callback ? emnapiCtx.handleStore.get(js_callback).value : null;\n if (typeof jsCallback === 'function') {\n jsCallback();\n }\n }\n });\n };\n try {\n if (emnapiNodeBinding) {\n var resource = emnapiTSFN.getResource(func);\n var resource_value = emnapiCtx.refStore.get(resource).get();\n var resourceObject = emnapiCtx.handleStore.get(resource_value).value;\n var view = new DataView(wasmMemory.buffer);\n emnapiNodeBinding.node.makeCallback(resourceObject, f, [], {\n asyncId: view.getFloat64(func + emnapiTSFN.offset.async_id, true),\n triggerAsyncId: view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true)\n });\n }\n else {\n f();\n }\n }\n finally {\n emnapiCtx.closeScope(envObject_1);\n }\n }\n return has_more;\n },\n dispatch: function (func) {\n var has_more = true;\n var iterations_left = 1000;\n var ui32a = new Uint32Array(wasmMemory.buffer);\n var index = (func + emnapiTSFN.offset.dispatch_state) >>> 2;\n while (has_more && --iterations_left !== 0) {\n Atomics.store(ui32a, index, 1);\n has_more = emnapiTSFN.dispatchOne(func);\n if (Atomics.exchange(ui32a, index, 0) !== 1) {\n has_more = true;\n }\n }\n if (has_more) {\n emnapiTSFN.send(func);\n }\n },\n enqueue: function (func) {\n // `pending` means a worker thread has requested a wakeup that has not\n // been drained on the main thread yet.\n var pending = func + emnapiTSFN.offset.async_pending;\n // `scheduled` prevents queueing the same main-thread drain chain more than\n // once while a previous wakeup is still in flight.\n var scheduled = func + emnapiTSFN.offset.async_u_fd;\n var i32a = new Int32Array(wasmMemory.buffer);\n if (Atomics.exchange(i32a, scheduled >>> 2, 1) !== 0) {\n return;\n }\n // Match uv_async_send-style coalescing in JS: the first turn represents\n // the wakeup reaching the main thread, and the second turn performs the\n // actual TSFN drain after nearby Send/Signal calls have had a chance to\n // collapse into the shared AsyncProgressWorker state.\n emnapiCtx.feature.setImmediate(function () {\n if (!emnapiTSFN._liveSet.has(func)) {\n return;\n }\n if (Atomics.load(i32a, pending >>> 2) === 0) {\n Atomics.store(i32a, scheduled >>> 2, 0);\n return;\n }\n emnapiCtx.feature.setImmediate(function () {\n try {\n // Consume the coalesced wakeup once, then let dispatch() observe any\n // queue mutations through dispatch_state like the C implementation.\n if (Atomics.exchange(i32a, pending >>> 2, 0) === 0) {\n return;\n }\n // After destroy(), the func address is freed. Skip dispatch\n // to avoid use-after-free (JS-side lifecycle check).\n if (!emnapiTSFN._liveSet.has(func)) {\n return;\n }\n emnapiTSFN.dispatch(func);\n }\n finally {\n // Allow a later wakeup to schedule a new drain chain. If another\n // worker-thread send raced with this drain, enqueue one more turn.\n if (emnapiTSFN._liveSet.has(func)) {\n Atomics.store(i32a, scheduled >>> 2, 0);\n if (Atomics.load(i32a, pending >>> 2) !== 0) {\n emnapiTSFN.enqueue(func);\n }\n }\n }\n });\n });\n },\n send: function (func) {\n var current_state = Atomics.or(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >>> 2, 1 << 1);\n if ((current_state & 1) === 1) {\n return;\n }\n var pendng = func + emnapiTSFN.offset.async_pending;\n // A wakeup is already pending, so this send only needs to leave the queued\n // work in the TSFN queue and let the existing drain pick it up.\n if (Atomics.load(new Int32Array(wasmMemory.buffer), pendng >>> 2) !== 0) {\n return;\n }\n if (Atomics.exchange(new Int32Array(wasmMemory.buffer), pendng >>> 2, 1) === 0) {\n if ((typeof ENVIRONMENT_IS_PTHREAD !== 'undefined') && ENVIRONMENT_IS_PTHREAD) {\n // Worker threads only post a wakeup token. Main-thread draining is\n // serialized by enqueue() once the message is received.\n postMessage({\n __emnapi__: {\n type: 'tsfn-send',\n payload: {\n tsfn: func\n }\n }\n });\n }\n else {\n // On the main thread we can skip the cross-thread hop and schedule the\n // coalesced drain chain directly.\n emnapiTSFN.enqueue(func);\n }\n }\n }\n };\n /** @__sig ippppppppppp */\n function napi_create_threadsafe_function(env, func, async_resource, async_resource_name, max_queue_size, initial_thread_count, thread_finalize_data, thread_finalize_cb, context, call_js_cb, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!async_resource_name)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n max_queue_size >>>= 0;\n initial_thread_count >>>= 0;\n env >>>= 0;\n thread_finalize_data >>>= 0;\n thread_finalize_cb >>>= 0;\n context >>>= 0;\n call_js_cb >>>= 0;\n max_queue_size = max_queue_size >>> 0;\n initial_thread_count = initial_thread_count >>> 0;\n if (initial_thread_count === 0) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var ref = 0;\n func >>>= 0;\n if (!func) {\n if (!call_js_cb)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n else {\n var funcValue = emnapiCtx.handleStore.get(func).value;\n if (typeof funcValue !== 'function') {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ref = emnapiCtx.createReference(envObject, func, 1, 1 /* ReferenceOwnership.kUserland */).id;\n }\n var asyncResourceObject;\n if (async_resource) {\n asyncResourceObject = emnapiCtx.handleStore.get(async_resource).value;\n if (asyncResourceObject == null) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n asyncResourceObject = Object(asyncResourceObject);\n }\n else {\n asyncResourceObject = {};\n }\n var resource = envObject.ensureHandleId(asyncResourceObject);\n var asyncResourceName = emnapiCtx.handleStore.get(async_resource_name).value;\n if (typeof asyncResourceName === 'symbol') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n asyncResourceName = String(asyncResourceName);\n var resource_name = envObject.ensureHandleId(asyncResourceName);\n // tsfn create\n var sizeofTSFN = emnapiTSFN.offset.__size__;\n // eslint-disable-next-line prefer-const\n var tsfn = _malloc(sizeofTSFN);\n if (!tsfn)\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n tsfn >>>= 0;\n new Uint8Array(wasmMemory.buffer).subarray(tsfn, tsfn + sizeofTSFN).fill(0);\n var resourceRef = emnapiCtx.createReference(envObject, resource, 1, 1 /* ReferenceOwnership.kUserland */);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var resource_ = resourceRef.id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.resource, resource_, true);\n if (!emnapiTSFN.initQueue(tsfn)) {\n _free(tsfn);\n resourceRef.dispose();\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n _emnapi_node_emit_async_init(resource, resource_name, -1, tsfn + emnapiTSFN.offset.async_id);\n HEAP_DATA_VIEW.setInt8(tsfn + emnapiTSFN.offset.is_some, 1, true);\n HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.thread_count, initial_thread_count, true);\n HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.context, context, true);\n HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.max_queue_size, max_queue_size, true);\n HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.ref, ref, true);\n HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.env, env, true);\n HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.finalize_data, thread_finalize_data, true);\n HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.finalize_cb, thread_finalize_cb, true);\n HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.call_js_cb, call_js_cb, true);\n emnapiCtx.addCleanupHook(envObject, emnapiTSFN.cleanup, tsfn);\n emnapiTSFN._liveSet.add(tsfn);\n envObject.ref();\n emnapiCtx.increaseWaitingRequestCounter();\n HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.async_ref, 1, true);\n result >>>= 0;\n HEAP_DATA_VIEW.setUint32(result, tsfn, true);\n return envObject.clearLastError();\n }\n /** @__sig ipp */\n function napi_get_threadsafe_function_context(func, result) {\n if (!func || !result) {\n abort();\n return 1 /* napi_status.napi_invalid_arg */;\n }\n func >>>= 0;\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var context = emnapiTSFN.getContext(func);\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, context, true);\n return 0 /* napi_status.napi_ok */;\n }\n /** @__sig ippi */\n function napi_call_threadsafe_function(func, data, mode) {\n if (!func) {\n abort();\n return 1 /* napi_status.napi_invalid_arg */;\n }\n func >>>= 0;\n data >>>= 0;\n return emnapiTSFN.push(func, data, mode);\n }\n /** @__sig ip */\n function napi_acquire_threadsafe_function(func) {\n if (!func) {\n abort();\n return 1 /* napi_status.napi_invalid_arg */;\n }\n func >>>= 0;\n var mutex = emnapiTSFN.getMutex(func);\n return mutex.execute(function () {\n if (emnapiTSFN.getState(func) === 0 /* State.kOpen */) {\n emnapiTSFN.addThreadCount(func);\n return 0 /* napi_status.napi_ok */;\n }\n return 16 /* napi_status.napi_closing */;\n });\n }\n /** @__sig ipi */\n function napi_release_threadsafe_function(func, mode) {\n if (!func) {\n abort();\n return 1 /* napi_status.napi_invalid_arg */;\n }\n func >>>= 0;\n var mutex = emnapiTSFN.getMutex(func);\n var cond = emnapiTSFN.getCond(func);\n var shouldDelete = false;\n var ret = mutex.execute(function () {\n if (emnapiTSFN.getThreadCount(func) === 0) {\n return 1 /* napi_status.napi_invalid_arg */;\n }\n emnapiTSFN.subThreadCount(func);\n if (emnapiTSFN.getThreadCount(func) === 0 || mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) {\n if (emnapiTSFN.getState(func) === 0 /* State.kOpen */) {\n if (mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) {\n emnapiTSFN.setState(func, 1 /* State.kClosing */);\n }\n if (emnapiTSFN.getState(func) === 1 /* State.kClosing */ && emnapiTSFN.getMaxQueueSize(func) > 0) {\n cond.signal();\n }\n emnapiTSFN.send(func);\n }\n }\n if (!(emnapiTSFN.getState(func) === 2 /* State.kClosed */ && emnapiTSFN.getThreadCount(func) === 0)) {\n return 0 /* napi_status.napi_ok */;\n }\n shouldDelete = true;\n return 0 /* napi_status.napi_ok */;\n });\n if (shouldDelete) {\n emnapiTSFN.destroy(func);\n }\n return ret;\n }\n /** @__sig ipp */\n function napi_unref_threadsafe_function(env, func) {\n if (!func) {\n abort();\n return 1 /* napi_status.napi_invalid_arg */;\n }\n func >>>= 0;\n var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >>> 2;\n var arr = new Uint32Array(wasmMemory.buffer);\n var currentValue = Atomics.load(arr, asyncRefOffset);\n if (currentValue > 0) {\n Atomics.store(arr, asyncRefOffset, currentValue - 1);\n if (currentValue === 1) {\n emnapiCtx.decreaseWaitingRequestCounter();\n }\n }\n return 0 /* napi_status.napi_ok */;\n }\n /** @__sig ipp */\n function napi_ref_threadsafe_function(env, func) {\n if (!func) {\n abort();\n return 1 /* napi_status.napi_invalid_arg */;\n }\n func >>>= 0;\n var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >>> 2;\n var arr = new Uint32Array(wasmMemory.buffer);\n var currentValue = Atomics.load(arr, asyncRefOffset);\n if (!currentValue) {\n emnapiCtx.increaseWaitingRequestCounter();\n }\n Atomics.store(arr, asyncRefOffset, currentValue + 1);\n return 0 /* napi_status.napi_ok */;\n }\n var emnapiAWMT = {\n pool: [],\n workerReady: null,\n globalAddress: 0,\n globalOffset: {\n idle_threads: 0,\n q: 1 * 4,\n next: 1 * 4,\n prev: 2 * 4,\n mutex: 3 * 4,\n cond: 4 * 4,\n exit_message: 5 * 4,\n end: 7 * 4\n },\n offset: {\n /* napi_ref */ resource: 0,\n /* double */ async_id: 8,\n /* double */ trigger_async_id: 16,\n /* napi_env */ env: 24,\n /* int32_t */ status: 1 * 4 + 24, // 0 for pending, 1 for cancelled, 2 for completed\n queue: 2 * 4 + 24,\n queue_next: 2 * 4 + 24,\n queue_prev: 3 * 4 + 24,\n /* void* */ data: 4 * 4 + 24,\n /* napi_async_execute_callback */ execute: 5 * 4 + 24,\n /* napi_async_complete_callback */ complete: 6 * 4 + 24,\n end: 7 * 4 + 24\n },\n init: function () {\n emnapiAWMT.pool = [];\n emnapiAWMT.workerReady = null;\n if (typeof PThread !== 'undefined') {\n PThread.unusedWorkers.forEach(emnapiAWMT.addListener);\n PThread.runningWorkers.forEach(emnapiAWMT.addListener);\n var __original_getNewWorker_1 = PThread.getNewWorker;\n PThread.getNewWorker = function () {\n var r = __original_getNewWorker_1.apply(this, arguments);\n emnapiAWMT.addListener(r);\n return r;\n };\n }\n },\n addListener: function (worker) {\n if (!worker)\n return false;\n if (worker._emnapiAWMTListener)\n return true;\n var handler = function (e) {\n var data = ENVIRONMENT_IS_NODE ? e : e.data;\n var __emnapi__ = data.__emnapi__;\n if (__emnapi__) {\n var type = __emnapi__.type;\n var payload = __emnapi__.payload;\n if (type === 'async-work-complete') {\n emnapiAWMT.callComplete(payload.work, 0 /* napi_status.napi_ok */);\n }\n }\n };\n var dispose = function () {\n if (ENVIRONMENT_IS_NODE) {\n worker.off('message', handler);\n }\n else {\n worker.removeEventListener('message', handler, false);\n }\n delete worker._emnapiAWMTListener;\n };\n worker._emnapiAWMTListener = { handler: handler, dispose: dispose };\n if (ENVIRONMENT_IS_NODE) {\n worker.on('message', handler);\n }\n else {\n worker.addEventListener('message', handler, false);\n }\n return true;\n },\n initGlobal: function () {\n if (!emnapiAWMT.globalAddress) {\n emnapiAWMT.globalAddress = _malloc(emnapiAWMT.globalOffset.end);\n emnapiAWMT.globalAddress >>>= 0;\n var size = emnapiAWMT.globalOffset.end;\n var addr = emnapiAWMT.globalAddress;\n new Uint8Array(wasmMemory.buffer, addr, size).fill(0);\n emnapiAWMT.queueInit(emnapiAWMT.globalAddress + emnapiAWMT.globalOffset.q);\n emnapiAWMT.queueInit(emnapiAWMT.globalAddress + emnapiAWMT.globalOffset.exit_message);\n }\n },\n terminateWorkers: function () {\n emnapiAWMT.pool.forEach(function (w) {\n var _a, _b;\n (_a = w._emnapiAWMTListener) === null || _a === void 0 ? void 0 : _a.dispose();\n (_b = w._emnapiTSFNListener) === null || _b === void 0 ? void 0 : _b.dispose();\n w.terminate();\n });\n emnapiAWMT.pool.length = 0;\n },\n initWorkers: function (n) {\n if (ENVIRONMENT_IS_PTHREAD) {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n return emnapiAWMT.workerReady || (emnapiAWMT.workerReady = Promise.resolve());\n }\n if (emnapiAWMT.workerReady)\n return emnapiAWMT.workerReady;\n if (!('emnapi_async_worker_create' in wasmInstance.exports)) {\n throw new TypeError('`emnapi_async_worker_create` is not exported, please try to add `--export=emnapi_async_worker_create` to linker flags');\n }\n var emnapi_async_worker_create = wasmInstance.exports.emnapi_async_worker_create;\n var args = [];\n emnapiAWMT.initGlobal();\n for (var i = 0; i < n; ++i) {\n args.push(emnapi_async_worker_create(1, emnapiAWMT.globalAddress));\n }\n var promises = args.map(function (index) {\n if (index === 0) {\n return Promise.reject(new Error('Failed to create async worker'));\n }\n var worker;\n if (index < 0) {\n worker = emnapiAWMT.pool[-index - 1];\n if (worker)\n return worker.whenLoaded;\n }\n index >>>= 0;\n var view = new DataView(wasmMemory.buffer);\n var tidOffset = 20;\n var tid = view.getInt32(index + tidOffset, true);\n worker = PThread.pthreads[tid];\n return worker.whenLoaded;\n });\n emnapiAWMT.workerReady = Promise.all(promises);\n return emnapiAWMT.workerReady;\n },\n getResource: function (work) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n return HEAP_DATA_VIEW.getUint32(work + emnapiAWMT.offset.resource, true);\n },\n getExecute: function (work) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n return HEAP_DATA_VIEW.getUint32(work + emnapiAWMT.offset.execute, true);\n },\n getComplete: function (work) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n return HEAP_DATA_VIEW.getUint32(work + emnapiAWMT.offset.complete, true);\n },\n getEnv: function (work) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n return HEAP_DATA_VIEW.getUint32(work + emnapiAWMT.offset.env, true);\n },\n getData: function (work) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n return HEAP_DATA_VIEW.getUint32(work + emnapiAWMT.offset.data, true);\n },\n getMutex: function () {\n var index = emnapiAWMT.globalAddress + emnapiAWMT.globalOffset.mutex;\n var mutex = {\n lock: function () {\n var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE;\n var i32a = new Int32Array(wasmMemory.buffer, index, 1);\n if (isBrowserMain) {\n while (true) {\n var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);\n if (oldValue === 0) {\n return;\n }\n }\n }\n else {\n while (true) {\n var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);\n if (oldValue === 0) {\n return;\n }\n Atomics.wait(i32a, 0, 10);\n }\n }\n },\n unlock: function () {\n var i32a = new Int32Array(wasmMemory.buffer, index, 1);\n var oldValue = Atomics.compareExchange(i32a, 0, 10, 0);\n if (oldValue !== 10) {\n throw new Error('Tried to unlock while not holding the mutex');\n }\n Atomics.notify(i32a, 0, 1);\n },\n execute: function (fn) {\n mutex.lock();\n try {\n return fn();\n }\n finally {\n mutex.unlock();\n }\n }\n };\n return mutex;\n },\n getCond: function () {\n var index = emnapiAWMT.globalAddress + emnapiAWMT.globalOffset.cond;\n var mutex = emnapiAWMT.getMutex();\n var cond = {\n wait: function () {\n var i32a = new Int32Array(wasmMemory.buffer, index, 1);\n var value = Atomics.load(i32a, 0);\n mutex.unlock();\n Atomics.wait(i32a, 0, value);\n mutex.lock();\n },\n signal: function () {\n var i32a = new Int32Array(wasmMemory.buffer, index, 1);\n Atomics.add(i32a, 0, 1);\n Atomics.notify(i32a, 0, 1);\n }\n };\n return cond;\n },\n queueInit: function (q) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(q, q, true);\n HEAP_DATA_VIEW.setUint32(q + 4, q, true);\n },\n queueInsertTail: function (h, q) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(q, h, true);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var tempValue = HEAP_DATA_VIEW.getUint32(h + 4, true);\n HEAP_DATA_VIEW.setUint32(q + 4, tempValue, true);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var qprev = HEAP_DATA_VIEW.getUint32(q + 4, true);\n HEAP_DATA_VIEW.setUint32(qprev, q, true);\n HEAP_DATA_VIEW.setUint32(h + 4, q, true);\n },\n queueRemove: function (q) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var qprev = HEAP_DATA_VIEW.getUint32(q + 4, true);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var qnext = HEAP_DATA_VIEW.getUint32(q, true);\n HEAP_DATA_VIEW.setUint32(qprev, qnext, true);\n HEAP_DATA_VIEW.setUint32(qnext + 4, qprev, true);\n },\n queueEmpty: function (q) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n // eslint-disable-next-line eqeqeq\n return q == HEAP_DATA_VIEW.getUint32(q, true);\n },\n scheduleWork: function (work) {\n var _a;\n if (!((_a = emnapiAWMT.workerReady) === null || _a === void 0 ? void 0 : _a.ready)) {\n emnapiAWMT.initWorkers(_emnapi_async_work_pool_size()).then(function () {\n emnapiAWMT.workerReady.ready = true;\n }).catch(function (err) {\n emnapiAWMT.workerReady = null;\n throw err;\n });\n }\n emnapiCtx.increaseWaitingRequestCounter();\n var statusBuffer = new Int32Array(wasmMemory.buffer, work + emnapiAWMT.offset.status, 1);\n Atomics.store(statusBuffer, 0, 0 /* AsyncWorkStatus.Pending */);\n var mutex = emnapiAWMT.getMutex();\n var cond = emnapiAWMT.getCond();\n mutex.lock();\n try {\n emnapiAWMT.queueInsertTail(emnapiAWMT.globalAddress + emnapiAWMT.globalOffset.q, work + emnapiAWMT.offset.queue);\n }\n catch (err) {\n emnapiCtx.decreaseWaitingRequestCounter();\n mutex.unlock();\n throw err;\n }\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (HEAP_DATA_VIEW.getUint32(emnapiAWMT.globalAddress + emnapiAWMT.globalOffset.idle_threads, true) > 0) {\n cond.signal();\n }\n mutex.unlock();\n },\n cancelWork: function (work) {\n var cancelled = false;\n emnapiAWMT.getMutex().execute(function () {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n cancelled = !emnapiAWMT.queueEmpty(work + emnapiAWMT.offset.queue) && HEAP_DATA_VIEW.getInt32(work + emnapiAWMT.offset.status, true) !== 2 /* AsyncWorkStatus.Completed */;\n if (cancelled) {\n emnapiAWMT.queueRemove(work + emnapiAWMT.offset.queue);\n }\n });\n if (!cancelled) {\n return 9 /* napi_status.napi_generic_failure */;\n }\n if (Atomics.compareExchange(new Int32Array(wasmMemory.buffer, work + emnapiAWMT.offset.status, 1), 0, 0 /* AsyncWorkStatus.Pending */, 1 /* AsyncWorkStatus.Cancelled */) !== 0 /* AsyncWorkStatus.Pending */) {\n return 9 /* napi_status.napi_generic_failure */;\n }\n emnapiCtx.feature.setImmediate(function () {\n emnapiAWMT.callComplete(work, 11 /* napi_status.napi_cancelled */);\n });\n return 0 /* napi_status.napi_ok */;\n },\n callComplete: function (work, status) {\n emnapiCtx.decreaseWaitingRequestCounter();\n var complete = emnapiAWMT.getComplete(work);\n var env = emnapiAWMT.getEnv(work);\n var data = emnapiAWMT.getData(work);\n var envObject = emnapiCtx.envStore.get(env);\n var scope = emnapiCtx.openScope(envObject);\n var callback = function () {\n if (!complete)\n return;\n envObject.callbackIntoModule(true, function () {\n (wasmTable.get(complete))(env, status, data);\n });\n };\n try {\n if (emnapiNodeBinding) {\n var resource = emnapiAWMT.getResource(work);\n var resource_value = emnapiCtx.refStore.get(resource).get();\n var resourceObject = emnapiCtx.handleStore.get(resource_value).value;\n var view = new DataView(wasmMemory.buffer);\n var asyncId = view.getFloat64(work + emnapiAWMT.offset.async_id, true);\n var triggerAsyncId = view.getFloat64(work + emnapiAWMT.offset.trigger_async_id, true);\n emnapiNodeBinding.node.makeCallback(resourceObject, callback, [], {\n asyncId: asyncId,\n triggerAsyncId: triggerAsyncId\n });\n }\n else {\n callback();\n }\n }\n finally {\n emnapiCtx.closeScope(envObject, scope);\n }\n }\n };\n emnapiAWMT.init();\n /** @__sig ippppppp */\n var napi_create_async_work = singleThreadAsyncWork\n ? function (env, resource, resource_name, execute, complete, data, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!execute)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var resourceObject;\n if (resource) {\n resourceObject = Object(emnapiCtx.handleStore.get(resource).value);\n }\n else {\n resourceObject = {};\n }\n if (!resource_name)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var resourceName = String(emnapiCtx.handleStore.get(resource_name).value);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var id = emnapiAWST.create(env, resourceObject, resourceName, execute, complete, data);\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, id, true);\n return envObject.clearLastError();\n }\n : function (env, resource, resource_name, execute, complete, data, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!execute)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var resourceObject;\n if (resource) {\n resourceObject = Object(emnapiCtx.handleStore.get(resource).value);\n }\n else {\n resourceObject = {};\n }\n if (!resource_name)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var sizeofAW = emnapiAWMT.offset.end;\n var aw = _malloc(sizeofAW);\n if (!aw)\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n aw >>>= 0;\n new Uint8Array(wasmMemory.buffer).subarray(aw, aw + sizeofAW).fill(0);\n var s = envObject.ensureHandleId(resourceObject);\n var resourceRef = emnapiCtx.createReference(envObject, s, 1, 1 /* ReferenceOwnership.kUserland */);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var resource_ = resourceRef.id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(aw, resource_, true);\n _emnapi_node_emit_async_init(s, resource_name, -1, aw + emnapiAWMT.offset.async_id);\n HEAP_DATA_VIEW.setUint32(aw + emnapiAWMT.offset.env, env, true);\n HEAP_DATA_VIEW.setUint32(aw + emnapiAWMT.offset.execute, execute, true);\n HEAP_DATA_VIEW.setUint32(aw + emnapiAWMT.offset.complete, complete, true);\n HEAP_DATA_VIEW.setUint32(aw + emnapiAWMT.offset.data, data, true);\n emnapiAWMT.queueInit(aw + emnapiAWMT.offset.queue);\n result >>>= 0;\n HEAP_DATA_VIEW.setUint32(result, aw, true);\n return envObject.clearLastError();\n };\n /** @__sig ipp */\n var napi_delete_async_work = singleThreadAsyncWork\n ? function (env, work) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!work)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n work >>>= 0;\n emnapiAWST.remove(work);\n return envObject.clearLastError();\n }\n : function (env, work) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!work)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n work >>>= 0;\n var resource = emnapiAWMT.getResource(work);\n emnapiCtx.refStore.get(resource).dispose();\n if (emnapiNodeBinding) {\n var view = new DataView(wasmMemory.buffer);\n var asyncId = view.getFloat64(work + emnapiAWMT.offset.async_id, true);\n var triggerAsyncId = view.getFloat64(work + emnapiAWMT.offset.trigger_async_id, true);\n _emnapi_node_emit_async_destroy(asyncId, triggerAsyncId);\n }\n _free(work);\n return envObject.clearLastError();\n };\n /** @__sig ipp */\n var napi_queue_async_work = singleThreadAsyncWork\n ? function (env, work) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!work)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n work >>>= 0;\n emnapiAWST.queue(work);\n return envObject.clearLastError();\n }\n : function (env, work) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!work)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n work >>>= 0;\n emnapiAWMT.scheduleWork(work);\n return envObject.clearLastError();\n };\n /** @__sig ipp */\n var napi_cancel_async_work = singleThreadAsyncWork\n ? function (env, work) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!work)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n work >>>= 0;\n var status = emnapiAWST.cancel(work);\n if (status === 0 /* napi_status.napi_ok */)\n return envObject.clearLastError();\n return envObject.setLastError(status);\n }\n : function (env, work) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!work)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n work >>>= 0;\n var status = emnapiAWMT.cancelWork(work);\n if (status === 0 /* napi_status.napi_ok */)\n return envObject.clearLastError();\n return envObject.setLastError(status);\n };\n /** @__sig pp */\n function _emnapi_async_worker(globalAddress) {\n globalAddress >>>= 0;\n emnapiAWMT.globalAddress = globalAddress;\n var mutex = emnapiAWMT.getMutex();\n var cond = emnapiAWMT.getCond();\n mutex.lock();\n var exitMessageAddr = globalAddress + emnapiAWMT.globalOffset.exit_message;\n var idleThreadsAddr = globalAddress + emnapiAWMT.globalOffset.idle_threads;\n var workerQueueAddr = globalAddress + emnapiAWMT.globalOffset.q;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n for (;;) {\n while (emnapiAWMT.queueEmpty(workerQueueAddr)) {\n Atomics.add(new Int32Array(wasmMemory.buffer, idleThreadsAddr, 1), 0, 1);\n cond.wait();\n Atomics.sub(new Int32Array(wasmMemory.buffer, idleThreadsAddr, 1), 0, 1);\n }\n var q = HEAP_DATA_VIEW.getUint32(workerQueueAddr, true);\n if (q === exitMessageAddr) {\n cond.signal();\n mutex.unlock();\n break;\n }\n var work = q - emnapiAWMT.offset.queue;\n emnapiAWMT.queueRemove(q);\n emnapiAWMT.queueInit(q);\n mutex.unlock();\n var statusBuffer = new Int32Array(wasmMemory.buffer, work + emnapiAWMT.offset.status, 1);\n if (Atomics.load(statusBuffer, 0) === 1 /* AsyncWorkStatus.Cancelled */) {\n abort('unreachable');\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var execute = emnapiAWMT.getExecute(work);\n var env = emnapiAWMT.getEnv(work);\n var data = emnapiAWMT.getData(work);\n (wasmTable.get(execute))(env, data);\n Atomics.store(statusBuffer, 0, 2 /* AsyncWorkStatus.Completed */);\n var postMessage_1 = napiModule.postMessage;\n postMessage_1({\n __emnapi__: {\n type: 'async-work-complete',\n payload: { work: work }\n }\n });\n mutex.lock();\n }\n return 0;\n }\n /** @__sig ipp */\n function _emnapi_spawn_worker(f, globalAddress) {\n if (typeof onCreateWorker !== 'function') {\n throw new TypeError('`options.onCreateWorker` is not a function');\n }\n var promises = [];\n var args = [];\n if (!('emnapi_async_worker_create' in wasmInstance.exports)) {\n throw new TypeError('`emnapi_async_worker_create` is not exported, please try to add `--export=emnapi_async_worker_create` to linker flags');\n }\n args.push(wasmInstance.exports.emnapi_async_worker_create(0, 0));\n var handleError = function (e) {\n if ('message' in e && (e.message.indexOf('RuntimeError') !== -1 || e.message.indexOf('unreachable') !== -1)) {\n emnapiAWMT.terminateWorkers();\n }\n };\n var ret;\n try {\n var worker_1 = onCreateWorker({ type: 'async-work', name: 'emnapi-async-worker' });\n var p = PThread.loadWasmModuleToWorker(worker_1);\n if (ENVIRONMENT_IS_NODE) {\n worker_1.on('error', handleError);\n }\n else {\n worker_1.addEventListener('error', handleError, false);\n }\n emnapiAWMT.addListener(worker_1);\n emnapiTSFN.addListener(worker_1);\n promises.push(p.then(function () {\n if (typeof worker_1.unref === 'function') {\n worker_1.unref();\n }\n }));\n ret = emnapiAWMT.pool.push(worker_1) - 1;\n var arg = args[0];\n worker_1.threadBlockBase = arg;\n worker_1.postMessage({\n __emnapi__: {\n type: 'async-worker-init',\n payload: { arg: arg, func: [f, globalAddress] }\n }\n });\n }\n catch (err) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var arg = args[0];\n _free(arg);\n throw err;\n }\n return ret;\n }\n function initWorker(startArg, func) {\n if (napiModule.childThread) {\n if (typeof wasmInstance.exports.emnapi_async_worker_init !== 'function') {\n throw new TypeError('`emnapi_async_worker_init` is not exported, please try to add `--export=emnapi_async_worker_init` to linker flags');\n }\n wasmInstance.exports.emnapi_async_worker_init(startArg);\n (wasmTable.get(func[0]))(func[1]);\n }\n else {\n throw new Error('startThread is only available in child threads');\n }\n }\n napiModule.initWorker = initWorker;\n var asyncWorkMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n _emnapi_async_worker: _emnapi_async_worker,\n _emnapi_spawn_worker: _emnapi_spawn_worker,\n napi_cancel_async_work: napi_cancel_async_work,\n napi_create_async_work: napi_create_async_work,\n napi_delete_async_work: napi_delete_async_work,\n napi_queue_async_work: napi_queue_async_work\n });\n /**\n * @__deps malloc\n * @__deps free\n * @__postset\n * ```\n * emnapiExternalMemory.init();\n * ```\n */\n var emnapiExternalMemory = {\n registry: typeof FinalizationRegistry === 'function' ? new FinalizationRegistry(function (_pointer) { _free(_pointer); }) : undefined,\n table: new WeakMap(),\n wasmMemoryViewTable: new WeakMap(),\n init: function () {\n emnapiExternalMemory.registry = typeof FinalizationRegistry === 'function' ? new FinalizationRegistry(function (_pointer) { _free(_pointer); }) : undefined;\n emnapiExternalMemory.table = new WeakMap();\n emnapiExternalMemory.wasmMemoryViewTable = new WeakMap();\n },\n isSharedArrayBuffer: function (value) {\n return ((typeof SharedArrayBuffer === 'function' && value instanceof SharedArrayBuffer) ||\n (Object.prototype.toString.call(value) === '[object SharedArrayBuffer]'));\n },\n isDetachedArrayBuffer: function (arrayBuffer) {\n if (arrayBuffer.byteLength === 0) {\n try {\n // eslint-disable-next-line no-new\n new Uint8Array(arrayBuffer);\n }\n catch (_) {\n return true;\n }\n }\n return false;\n },\n getArrayBufferPointer: function (arrayBuffer, shouldCopy) {\n var _a;\n var info = {\n address: 0,\n ownership: 0 /* ReferenceOwnership.kRuntime */,\n runtimeAllocated: 0\n };\n if (arrayBuffer === wasmMemory.buffer) {\n return info;\n }\n var isDetached = emnapiExternalMemory.isDetachedArrayBuffer(arrayBuffer);\n if (emnapiExternalMemory.table.has(arrayBuffer)) {\n var cachedInfo = emnapiExternalMemory.table.get(arrayBuffer);\n if (isDetached) {\n cachedInfo.address = 0;\n return cachedInfo;\n }\n if (shouldCopy && cachedInfo.ownership === 0 /* ReferenceOwnership.kRuntime */ && cachedInfo.runtimeAllocated === 1) {\n new Uint8Array(wasmMemory.buffer).set(new Uint8Array(arrayBuffer), cachedInfo.address);\n }\n return cachedInfo;\n }\n if (isDetached || (arrayBuffer.byteLength === 0)) {\n return info;\n }\n if (!shouldCopy) {\n return info;\n }\n var pointer = _malloc(arrayBuffer.byteLength);\n if (!pointer)\n throw new Error('Out of memory');\n pointer >>>= 0;\n new Uint8Array(wasmMemory.buffer).set(new Uint8Array(arrayBuffer), pointer);\n info.address = pointer;\n info.ownership = emnapiExternalMemory.registry ? 0 /* ReferenceOwnership.kRuntime */ : 1 /* ReferenceOwnership.kUserland */;\n info.runtimeAllocated = 1;\n emnapiExternalMemory.table.set(arrayBuffer, info);\n (_a = emnapiExternalMemory.registry) === null || _a === void 0 ? void 0 : _a.register(arrayBuffer, pointer);\n return info;\n },\n getOrUpdateMemoryView: function (view) {\n if (view.buffer === wasmMemory.buffer) {\n if (!emnapiExternalMemory.wasmMemoryViewTable.has(view)) {\n emnapiExternalMemory.wasmMemoryViewTable.set(view, {\n Ctor: view.constructor,\n address: view.byteOffset,\n length: view instanceof DataView ? view.byteLength : view.length,\n ownership: 1 /* ReferenceOwnership.kUserland */,\n runtimeAllocated: 0\n });\n }\n return view;\n }\n var maybeOldWasmMemory = emnapiExternalMemory.isDetachedArrayBuffer(view.buffer) || emnapiExternalMemory.isSharedArrayBuffer(view.buffer);\n if (maybeOldWasmMemory && emnapiExternalMemory.wasmMemoryViewTable.has(view)) {\n var info = emnapiExternalMemory.wasmMemoryViewTable.get(view);\n var Ctor = info.Ctor;\n var newView = void 0;\n var Buffer_1 = emnapiCtx.feature.Buffer;\n if (typeof Buffer_1 === 'function' && Ctor === Buffer_1) {\n newView = Buffer_1.from(wasmMemory.buffer, info.address, info.length);\n }\n else {\n newView = new Ctor(wasmMemory.buffer, info.address, info.length);\n }\n emnapiExternalMemory.wasmMemoryViewTable.set(newView, info);\n return newView;\n }\n return view;\n },\n getViewPointer: function (view, shouldCopy) {\n view = emnapiExternalMemory.getOrUpdateMemoryView(view);\n if (view.buffer === wasmMemory.buffer) {\n if (emnapiExternalMemory.wasmMemoryViewTable.has(view)) {\n var _a = emnapiExternalMemory.wasmMemoryViewTable.get(view), address_1 = _a.address, ownership_1 = _a.ownership, runtimeAllocated_1 = _a.runtimeAllocated;\n return { address: address_1, ownership: ownership_1, runtimeAllocated: runtimeAllocated_1, view: view };\n }\n return { address: view.byteOffset, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0, view: view };\n }\n var _b = emnapiExternalMemory.getArrayBufferPointer(view.buffer, shouldCopy), address = _b.address, ownership = _b.ownership, runtimeAllocated = _b.runtimeAllocated;\n return { address: address === 0 ? 0 : (address + view.byteOffset), ownership: ownership, runtimeAllocated: runtimeAllocated, view: view };\n }\n };\n /* eslint-disable @typescript-eslint/indent */\n /**\n * @__postset\n * ```\n * emnapiString.init();\n * ```\n */\n var emnapiString = {\n utf8Decoder: undefined,\n utf16Decoder: undefined,\n init: function () {\n var fallbackDecoder = {\n decode: function (bytes) {\n var inputIndex = 0;\n var pendingSize = Math.min(0x1000, bytes.length + 1);\n var pending = new Uint16Array(pendingSize);\n var chunks = [];\n var pendingIndex = 0;\n for (;;) {\n var more = inputIndex < bytes.length;\n if (!more || (pendingIndex >= pendingSize - 1)) {\n var subarray = pending.subarray(0, pendingIndex);\n var arraylike = subarray;\n chunks.push(String.fromCharCode.apply(null, arraylike));\n if (!more) {\n return chunks.join('');\n }\n bytes = bytes.subarray(inputIndex);\n inputIndex = 0;\n pendingIndex = 0;\n }\n var byte1 = bytes[inputIndex++];\n if ((byte1 & 0x80) === 0) {\n pending[pendingIndex++] = byte1;\n }\n else if ((byte1 & 0xe0) === 0xc0) {\n var byte2 = bytes[inputIndex++] & 0x3f;\n pending[pendingIndex++] = ((byte1 & 0x1f) << 6) | byte2;\n }\n else if ((byte1 & 0xf0) === 0xe0) {\n var byte2 = bytes[inputIndex++] & 0x3f;\n var byte3 = bytes[inputIndex++] & 0x3f;\n pending[pendingIndex++] = ((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3;\n }\n else if ((byte1 & 0xf8) === 0xf0) {\n var byte2 = bytes[inputIndex++] & 0x3f;\n var byte3 = bytes[inputIndex++] & 0x3f;\n var byte4 = bytes[inputIndex++] & 0x3f;\n var codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;\n if (codepoint > 0xffff) {\n codepoint -= 0x10000;\n pending[pendingIndex++] = (codepoint >>> 10) & 0x3ff | 0xd800;\n codepoint = 0xdc00 | codepoint & 0x3ff;\n }\n pending[pendingIndex++] = codepoint;\n }\n else ;\n }\n }\n };\n var utf8Decoder;\n utf8Decoder = typeof TextDecoder === 'function' ? new TextDecoder() : fallbackDecoder;\n emnapiString.utf8Decoder = utf8Decoder;\n var fallbackDecoder2 = {\n decode: function (input) {\n var bytes = new Uint16Array(input.buffer, input.byteOffset, input.byteLength / 2);\n if (bytes.length <= 0x1000) {\n return String.fromCharCode.apply(null, bytes);\n }\n var chunks = [];\n var i = 0;\n var len = 0;\n for (; i < bytes.length; i += len) {\n len = Math.min(0x1000, bytes.length - i);\n chunks.push(String.fromCharCode.apply(null, bytes.subarray(i, i + len)));\n }\n return chunks.join('');\n }\n };\n var utf16Decoder;\n utf16Decoder = typeof TextDecoder === 'function' ? new TextDecoder('utf-16le') : fallbackDecoder2;\n emnapiString.utf16Decoder = utf16Decoder;\n },\n lengthBytesUTF8: function (str) {\n var c;\n var len = 0;\n for (var i = 0; i < str.length; ++i) {\n c = str.charCodeAt(i);\n if (c <= 0x7F) {\n len++;\n }\n else if (c <= 0x7FF) {\n len += 2;\n }\n else if (c >= 0xD800 && c <= 0xDFFF) {\n len += 4;\n ++i;\n }\n else {\n len += 3;\n }\n }\n return len;\n },\n UTF8ToString: function (ptr, length) {\n if (!ptr || !length)\n return '';\n ptr >>>= 0;\n var HEAPU8 = new Uint8Array(wasmMemory.buffer);\n var end = ptr;\n if (length === -1 || length === 4294967295) {\n for (; HEAPU8[end];)\n ++end;\n }\n else {\n end = ptr + (length >>> 0);\n }\n length = end - ptr;\n if (length <= 16) {\n var idx = ptr;\n var str = '';\n while (idx < end) {\n var u0 = HEAPU8[idx++];\n if (!(u0 & 0x80)) {\n str += String.fromCharCode(u0);\n continue;\n }\n var u1 = HEAPU8[idx++] & 63;\n if ((u0 & 0xE0) === 0xC0) {\n str += String.fromCharCode(((u0 & 31) << 6) | u1);\n continue;\n }\n var u2 = HEAPU8[idx++] & 63;\n if ((u0 & 0xF0) === 0xE0) {\n u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;\n }\n else {\n u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (HEAPU8[idx++] & 63);\n }\n if (u0 < 0x10000) {\n str += String.fromCharCode(u0);\n }\n else {\n var ch = u0 - 0x10000;\n str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\n }\n }\n return str;\n }\n return emnapiString.utf8Decoder.decode(((typeof SharedArrayBuffer === \"function\" && HEAPU8.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(HEAPU8.buffer) === \"[object SharedArrayBuffer]\")) ? HEAPU8.slice(ptr, end) : HEAPU8.subarray(ptr, end));\n },\n stringToUTF8: function (str, outPtr, maxBytesToWrite) {\n var HEAPU8 = new Uint8Array(wasmMemory.buffer);\n var outIdx = outPtr;\n outIdx >>>= 0;\n if (!(maxBytesToWrite > 0)) {\n return 0;\n }\n var startIdx = outIdx;\n var endIdx = outIdx + maxBytesToWrite - 1;\n for (var i = 0; i < str.length; ++i) {\n var u = str.charCodeAt(i);\n if (u >= 0xD800 && u <= 0xDFFF) {\n var u1 = str.charCodeAt(++i);\n u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);\n }\n if (u <= 0x7F) {\n if (outIdx >= endIdx)\n break;\n HEAPU8[outIdx++] = u;\n }\n else if (u <= 0x7FF) {\n if (outIdx + 1 >= endIdx)\n break;\n HEAPU8[outIdx++] = 0xC0 | (u >> 6);\n HEAPU8[outIdx++] = 0x80 | (u & 63);\n }\n else if (u <= 0xFFFF) {\n if (outIdx + 2 >= endIdx)\n break;\n HEAPU8[outIdx++] = 0xE0 | (u >> 12);\n HEAPU8[outIdx++] = 0x80 | ((u >> 6) & 63);\n HEAPU8[outIdx++] = 0x80 | (u & 63);\n }\n else {\n if (outIdx + 3 >= endIdx)\n break;\n HEAPU8[outIdx++] = 0xF0 | (u >> 18);\n HEAPU8[outIdx++] = 0x80 | ((u >> 12) & 63);\n HEAPU8[outIdx++] = 0x80 | ((u >> 6) & 63);\n HEAPU8[outIdx++] = 0x80 | (u & 63);\n }\n }\n HEAPU8[outIdx] = 0;\n return outIdx - startIdx;\n },\n UTF16ToString: function (ptr, length) {\n if (!ptr || !length)\n return '';\n ptr >>>= 0;\n var end = ptr;\n if (length === -1 || length === 4294967295) {\n var idx = end >>> 1;\n var HEAPU16 = new Uint16Array(wasmMemory.buffer);\n while (HEAPU16[idx])\n ++idx;\n end = (idx << 1) >>> 0;\n }\n else {\n end = ptr + (length >>> 0) * 2;\n }\n length = end - ptr;\n if (length <= 32) {\n return String.fromCharCode.apply(null, new Uint16Array(wasmMemory.buffer, ptr, length / 2));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var HEAPU8 = new Uint8Array(wasmMemory.buffer);\n return emnapiString.utf16Decoder.decode(((typeof SharedArrayBuffer === \"function\" && HEAPU8.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(HEAPU8.buffer) === \"[object SharedArrayBuffer]\")) ? HEAPU8.slice(ptr, end) : HEAPU8.subarray(ptr, end));\n },\n stringToUTF16: function (str, outPtr, maxBytesToWrite) {\n if (maxBytesToWrite === undefined) {\n maxBytesToWrite = 0x7FFFFFFF;\n }\n if (maxBytesToWrite < 2)\n return 0;\n maxBytesToWrite -= 2;\n var startPtr = outPtr;\n var numCharsToWrite = (maxBytesToWrite < str.length * 2) ? (maxBytesToWrite / 2) : str.length;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n for (var i = 0; i < numCharsToWrite; ++i) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var codeUnit = str.charCodeAt(i);\n HEAP_DATA_VIEW.setInt16(outPtr, codeUnit, true);\n outPtr += 2;\n }\n HEAP_DATA_VIEW.setInt16(outPtr, 0, true);\n return outPtr - startPtr;\n },\n newString: function (env, str, length, result, stringMaker) {\n length >>>= 0;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n var autoLength = length === -1 || length === 4294967295;\n var sizelength = length >>> 0;\n if (length !== 0) {\n if (!str)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!(autoLength || (sizelength <= 2147483647)))\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n str >>>= 0;\n var strValue = stringMaker(str, autoLength, sizelength);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope(strValue).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n },\n newExternalString: function (env, str, length, finalize_callback, finalize_hint, result, copied, createApi, stringMaker) {\n length >>>= 0;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n var autoLength = length === -1 || length === 4294967295;\n var sizelength = length >>> 0;\n if (length !== 0) {\n if (!str)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!(autoLength || (sizelength <= 2147483647)))\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var status = createApi(env, str, length, result);\n if (status === 0 /* napi_status.napi_ok */) {\n if (copied) {\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(copied, 1, true);\n }\n if (finalize_callback) {\n envObject.callFinalizer(finalize_callback, str, finalize_hint);\n }\n }\n return status;\n }\n };\n /**\n * @__sig ippp\n */\n function napi_get_array_length(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (!handle.isArray()) {\n return envObject.setLastError(8 /* napi_status.napi_array_expected */);\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v = handle.value.length >>> 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipppp\n */\n function napi_get_arraybuffer_info(env, arraybuffer, data, byte_length) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!arraybuffer)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(arraybuffer);\n if (!handle.isArrayBuffer() && !emnapiExternalMemory.isSharedArrayBuffer(handle.value)) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (data) {\n data >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var p = emnapiExternalMemory.getArrayBufferPointer(handle.value, true).address;\n HEAP_DATA_VIEW.setUint32(data, p, true);\n }\n if (byte_length) {\n byte_length >>>= 0;\n HEAP_DATA_VIEW.setUint32(byte_length, handle.value.byteLength, true);\n }\n return envObject.clearLastError();\n }\n /**\n * @__sig ippp\n */\n function node_api_set_prototype(env, object, value) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var obj = emnapiCtx.handleStore.get(object).value;\n if (obj == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var type = typeof obj;\n var v = void 0;\n try {\n v = (type === 'object' && obj !== null) || type === 'function' ? obj : Object(obj);\n }\n catch (_) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n var val = emnapiCtx.handleStore.get(value).value;\n Object.setPrototypeOf(v, val);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ippp\n */\n function napi_get_prototype(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (handle.value == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var v = void 0;\n try {\n v = handle.isObject() || handle.isFunction() ? handle.value : Object(handle.value);\n }\n catch (_) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var p = envObject.ensureHandleId(Object.getPrototypeOf(v));\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, p, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ippppppp\n */\n function napi_get_typedarray_info(env, typedarray, type, length, data, arraybuffer, byte_offset) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!typedarray)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(typedarray);\n if (!handle.isTypedArray()) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var v = handle.value;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (type) {\n type >>>= 0;\n var t = void 0;\n if (v instanceof Int8Array) {\n t = 0 /* napi_typedarray_type.napi_int8_array */;\n }\n else if (v instanceof Uint8Array) {\n t = 1 /* napi_typedarray_type.napi_uint8_array */;\n }\n else if (v instanceof Uint8ClampedArray) {\n t = 2 /* napi_typedarray_type.napi_uint8_clamped_array */;\n }\n else if (v instanceof Int16Array) {\n t = 3 /* napi_typedarray_type.napi_int16_array */;\n }\n else if (v instanceof Uint16Array) {\n t = 4 /* napi_typedarray_type.napi_uint16_array */;\n }\n else if (v instanceof Int32Array) {\n t = 5 /* napi_typedarray_type.napi_int32_array */;\n }\n else if (v instanceof Uint32Array) {\n t = 6 /* napi_typedarray_type.napi_uint32_array */;\n }\n else if (typeof Float16Array === 'function' && v instanceof Float16Array) {\n t = 11 /* napi_typedarray_type.napi_float16_array */;\n }\n else if (v instanceof Float32Array) {\n t = 7 /* napi_typedarray_type.napi_float32_array */;\n }\n else if (v instanceof Float64Array) {\n t = 8 /* napi_typedarray_type.napi_float64_array */;\n }\n else if (v instanceof BigInt64Array) {\n t = 9 /* napi_typedarray_type.napi_bigint64_array */;\n }\n else if (v instanceof BigUint64Array) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n t = 10 /* napi_typedarray_type.napi_biguint64_array */;\n }\n else {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n HEAP_DATA_VIEW.setInt32(type, t, true);\n }\n v = emnapiExternalMemory.getOrUpdateMemoryView(v);\n if (length) {\n length >>>= 0;\n HEAP_DATA_VIEW.setUint32(length, v.length, true);\n }\n if (data || arraybuffer) {\n if (data) {\n data >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var p = emnapiExternalMemory.getViewPointer(v, true).address;\n HEAP_DATA_VIEW.setUint32(data, p, true);\n }\n if (arraybuffer) {\n arraybuffer >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var ab = envObject.ensureHandleId(v.buffer);\n HEAP_DATA_VIEW.setUint32(arraybuffer, ab, true);\n }\n }\n if (byte_offset) {\n byte_offset >>>= 0;\n HEAP_DATA_VIEW.setUint32(byte_offset, v.byteOffset, true);\n }\n return envObject.clearLastError();\n }\n /**\n * @__sig ipppp\n */\n function napi_get_buffer_info(env, buffer, data, length) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!buffer)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(buffer);\n if (!handle.isBuffer(emnapiCtx.feature.Buffer))\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (handle.isDataView()) {\n return napi_get_dataview_info(env, buffer, length, data, 0, 0);\n }\n return napi_get_typedarray_info(env, buffer, 0, length, data, 0, 0);\n }\n /**\n * @__sig ipppppp\n */\n function napi_get_dataview_info(env, dataview, byte_length, data, arraybuffer, byte_offset) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!dataview)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(dataview);\n if (!handle.isDataView()) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var v = emnapiExternalMemory.getOrUpdateMemoryView(handle.value);\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (byte_length) {\n byte_length >>>= 0;\n HEAP_DATA_VIEW.setUint32(byte_length, v.byteLength, true);\n }\n if (data || arraybuffer) {\n if (data) {\n data >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var p = emnapiExternalMemory.getViewPointer(v, true).address;\n HEAP_DATA_VIEW.setUint32(data, p, true);\n }\n if (arraybuffer) {\n arraybuffer >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var ab = envObject.ensureHandleId(v.buffer);\n HEAP_DATA_VIEW.setUint32(arraybuffer, ab, true);\n }\n }\n if (byte_offset) {\n byte_offset >>>= 0;\n HEAP_DATA_VIEW.setUint32(byte_offset, v.byteOffset, true);\n }\n return envObject.clearLastError();\n }\n /**\n * @__sig ippp\n */\n function napi_get_date_value(env, value, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (!handle.isDate()) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n result >>>= 0;\n v = handle.value.valueOf();\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setFloat64(result, v, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ippp\n */\n function napi_get_value_bool(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (typeof handle.value !== 'boolean') {\n return envObject.setLastError(7 /* napi_status.napi_boolean_expected */);\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = handle.value ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ippp\n */\n function napi_get_value_double(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (typeof handle.value !== 'number') {\n return envObject.setLastError(6 /* napi_status.napi_number_expected */);\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = handle.value;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setFloat64(result, r, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ipppp\n */\n function napi_get_value_bigint_int64(env, value, result, lossless) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!emnapiCtx.feature.supportBigInt) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!lossless)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n var numberValue = handle.value;\n if (typeof numberValue !== 'bigint') {\n return envObject.setLastError(6 /* napi_status.napi_number_expected */);\n }\n lossless >>>= 0;\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if ((numberValue >= (BigInt(-1) * (BigInt(1) << BigInt(63)))) && (numberValue < (BigInt(1) << BigInt(63)))) {\n HEAP_DATA_VIEW.setInt8(lossless, 1, true);\n }\n else {\n HEAP_DATA_VIEW.setInt8(lossless, 0, true);\n numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1));\n if (numberValue >= (BigInt(1) << BigInt(63))) {\n numberValue = numberValue - (BigInt(1) << BigInt(64));\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var low = Number(numberValue & BigInt(0xffffffff));\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var high = Number(numberValue >> BigInt(32));\n HEAP_DATA_VIEW.setInt32(result, low, true);\n HEAP_DATA_VIEW.setInt32(result + 4, high, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ipppp\n */\n function napi_get_value_bigint_uint64(env, value, result, lossless) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!emnapiCtx.feature.supportBigInt) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!lossless)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n var numberValue = handle.value;\n if (typeof numberValue !== 'bigint') {\n return envObject.setLastError(6 /* napi_status.napi_number_expected */);\n }\n lossless >>>= 0;\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if ((numberValue >= BigInt(0)) && (numberValue < (BigInt(1) << BigInt(64)))) {\n HEAP_DATA_VIEW.setInt8(lossless, 1, true);\n }\n else {\n HEAP_DATA_VIEW.setInt8(lossless, 0, true);\n numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var low = Number(numberValue & BigInt(0xffffffff));\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var high = Number(numberValue >> BigInt(32));\n HEAP_DATA_VIEW.setUint32(result, low, true);\n HEAP_DATA_VIEW.setUint32(result + 4, high, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ippppp\n */\n function napi_get_value_bigint_words(env, value, sign_bit, word_count, words) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!emnapiCtx.feature.supportBigInt) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!word_count)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (!handle.isBigInt()) {\n return envObject.setLastError(17 /* napi_status.napi_bigint_expected */);\n }\n var isMinus = handle.value < BigInt(0);\n sign_bit >>>= 0;\n words >>>= 0;\n word_count >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n var word_count_int = HEAP_DATA_VIEW.getUint32(word_count, true);\n word_count_int >>>= 0;\n var wordCount = 0;\n var bigintValue = isMinus ? (handle.value * BigInt(-1)) : handle.value;\n while (bigintValue !== BigInt(0)) {\n wordCount++;\n bigintValue = bigintValue >> BigInt(64);\n }\n bigintValue = isMinus ? (handle.value * BigInt(-1)) : handle.value;\n if (!sign_bit && !words) {\n word_count_int = wordCount;\n HEAP_DATA_VIEW.setUint32(word_count, word_count_int, true);\n }\n else {\n if (!sign_bit)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!words)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var wordsArr = [];\n while (bigintValue !== BigInt(0)) {\n var uint64 = bigintValue & ((BigInt(1) << BigInt(64)) - BigInt(1));\n wordsArr.push(uint64);\n bigintValue = bigintValue >> BigInt(64);\n }\n var len = Math.min(word_count_int, wordsArr.length);\n for (var i = 0; i < len; i++) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var low = Number(wordsArr[i] & BigInt(0xffffffff));\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var high = Number(wordsArr[i] >> BigInt(32));\n HEAP_DATA_VIEW.setUint32(words + i * 8, low, true);\n HEAP_DATA_VIEW.setUint32(words + (i * 8 + 4), high, true);\n }\n HEAP_DATA_VIEW.setInt32(sign_bit, isMinus ? 1 : 0, true);\n HEAP_DATA_VIEW.setUint32(word_count, len, true);\n }\n return envObject.clearLastError();\n }\n /**\n * @__sig ippp\n */\n function napi_get_value_external(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (!handle.isExternal()) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var p = handle.data();\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, p, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ippp\n */\n function napi_get_value_int32(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (typeof handle.value !== 'number') {\n return envObject.setLastError(6 /* napi_status.napi_number_expected */);\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v = new Int32Array([handle.value])[0];\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt32(result, v, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ippp\n */\n function napi_get_value_int64(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (typeof handle.value !== 'number') {\n return envObject.setLastError(6 /* napi_status.napi_number_expected */);\n }\n var numberValue = handle.value;\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (numberValue === Number.POSITIVE_INFINITY || numberValue === Number.NEGATIVE_INFINITY || isNaN(numberValue)) {\n HEAP_DATA_VIEW.setInt32(result, 0, true);\n HEAP_DATA_VIEW.setInt32(result + 4, 0, true);\n }\n else if (numberValue < /* INT64_RANGE_NEGATIVE */ -9223372036854776e3) {\n HEAP_DATA_VIEW.setInt32(result, 0, true);\n HEAP_DATA_VIEW.setInt32(result + 4, 2147483648, true);\n }\n else if (numberValue >= /* INT64_RANGE_POSITIVE */ 9223372036854776000) {\n HEAP_DATA_VIEW.setUint32(result, 4294967295, true);\n HEAP_DATA_VIEW.setUint32(result + 4, 2147483647, true);\n }\n else {\n $emnapiSetValueI64(result, Math.trunc(numberValue));\n }\n return envObject.clearLastError();\n }\n /**\n * @__sig ippppp\n */\n function napi_get_value_string_latin1(env, value, buf, buf_size, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n buf >>>= 0;\n buf_size >>>= 0;\n buf_size = buf_size >>> 0;\n var handle = emnapiCtx.handleStore.get(value);\n if (typeof handle.value !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (!buf) {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n HEAP_DATA_VIEW.setUint32(result, handle.value.length, true);\n }\n else if (buf_size !== 0) {\n var copied = 0;\n var v = void 0;\n for (var i = 0; i < buf_size - 1; ++i) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n v = handle.value.charCodeAt(i) & 0xff;\n HEAP_DATA_VIEW.setUint8(buf + i, v, true);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n copied++;\n }\n HEAP_DATA_VIEW.setUint8(buf + copied, 0, true);\n if (result) {\n HEAP_DATA_VIEW.setUint32(result, copied, true);\n }\n }\n else if (result) {\n HEAP_DATA_VIEW.setUint32(result, 0, true);\n }\n return envObject.clearLastError();\n }\n /**\n * @__sig ippppp\n */\n function napi_get_value_string_utf8(env, value, buf, buf_size, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n buf >>>= 0;\n buf_size >>>= 0;\n buf_size = buf_size >>> 0;\n var handle = emnapiCtx.handleStore.get(value);\n if (typeof handle.value !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (!buf) {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var strLength = emnapiString.lengthBytesUTF8(handle.value);\n HEAP_DATA_VIEW.setUint32(result, strLength, true);\n }\n else if (buf_size !== 0) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var copied = emnapiString.stringToUTF8(handle.value, buf, buf_size);\n if (result) {\n HEAP_DATA_VIEW.setUint32(result, copied, true);\n }\n }\n else if (result) {\n HEAP_DATA_VIEW.setUint32(result, 0, true);\n }\n return envObject.clearLastError();\n }\n /**\n * @__sig ippppp\n */\n function napi_get_value_string_utf16(env, value, buf, buf_size, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n buf >>>= 0;\n buf_size >>>= 0;\n buf_size = buf_size >>> 0;\n var handle = emnapiCtx.handleStore.get(value);\n if (typeof handle.value !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (!buf) {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n HEAP_DATA_VIEW.setUint32(result, handle.value.length, true);\n }\n else if (buf_size !== 0) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var copied = emnapiString.stringToUTF16(handle.value, buf, buf_size * 2);\n if (result) {\n HEAP_DATA_VIEW.setUint32(result, copied / 2, true);\n }\n }\n else if (result) {\n HEAP_DATA_VIEW.setUint32(result, 0, true);\n }\n return envObject.clearLastError();\n }\n /**\n * @__sig ippp\n */\n function napi_get_value_uint32(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (typeof handle.value !== 'number') {\n return envObject.setLastError(6 /* napi_status.napi_number_expected */);\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v = new Uint32Array([handle.value])[0];\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.clearLastError();\n }\n var convert2cMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_get_array_length: napi_get_array_length,\n napi_get_arraybuffer_info: napi_get_arraybuffer_info,\n napi_get_buffer_info: napi_get_buffer_info,\n napi_get_dataview_info: napi_get_dataview_info,\n napi_get_date_value: napi_get_date_value,\n napi_get_prototype: napi_get_prototype,\n napi_get_typedarray_info: napi_get_typedarray_info,\n napi_get_value_bigint_int64: napi_get_value_bigint_int64,\n napi_get_value_bigint_uint64: napi_get_value_bigint_uint64,\n napi_get_value_bigint_words: napi_get_value_bigint_words,\n napi_get_value_bool: napi_get_value_bool,\n napi_get_value_double: napi_get_value_double,\n napi_get_value_external: napi_get_value_external,\n napi_get_value_int32: napi_get_value_int32,\n napi_get_value_int64: napi_get_value_int64,\n napi_get_value_string_latin1: napi_get_value_string_latin1,\n napi_get_value_string_utf16: napi_get_value_string_utf16,\n napi_get_value_string_utf8: napi_get_value_string_utf8,\n napi_get_value_uint32: napi_get_value_uint32,\n node_api_set_prototype: node_api_set_prototype\n });\n /**\n * @__sig ipip\n */\n function napi_create_int32(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v = emnapiCtx.addToCurrentScope(value).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ipip\n */\n function napi_create_uint32(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v = emnapiCtx.addToCurrentScope(value >>> 0).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ipjp\n */\n function napi_create_int64(env, low, high, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n var value;\n if (!high)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n value = Number(low);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v1 = emnapiCtx.addToCurrentScope(value).id;\n high >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(high, v1, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ipdp\n */\n function napi_create_double(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v = emnapiCtx.addToCurrentScope(value).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ipppp\n */\n function napi_create_string_latin1(env, str, length, result) {\n return emnapiString.newString(env, str, length, result, function (str, autoLength, sizeLength) {\n var latin1String = '';\n var len = 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (autoLength) {\n while (true) {\n var ch = HEAP_DATA_VIEW.getUint8(str, true);\n if (!ch)\n break;\n latin1String += String.fromCharCode(ch);\n str++;\n }\n }\n else {\n while (len < sizeLength) {\n var ch = HEAP_DATA_VIEW.getUint8(str, true);\n if (!ch)\n break;\n latin1String += String.fromCharCode(ch);\n len++;\n str++;\n }\n }\n return latin1String;\n });\n }\n /**\n * @__sig ipppp\n */\n function napi_create_string_utf16(env, str, length, result) {\n return emnapiString.newString(env, str, length, result, function (str) {\n return emnapiString.UTF16ToString(str, length);\n });\n }\n /**\n * @__sig ipppp\n */\n function napi_create_string_utf8(env, str, length, result) {\n return emnapiString.newString(env, str, length, result, function (str) {\n return emnapiString.UTF8ToString(str, length);\n });\n }\n /**\n * @__sig ippppppp\n */\n function node_api_create_external_string_latin1(env, str, length, finalize_callback, finalize_hint, result, copied) {\n return emnapiString.newExternalString(env, str, length, finalize_callback, finalize_hint, result, copied, napi_create_string_latin1, undefined);\n }\n /**\n * @__sig ippppppp\n */\n function node_api_create_external_string_utf16(env, str, length, finalize_callback, finalize_hint, result, copied) {\n return emnapiString.newExternalString(env, str, length, finalize_callback, finalize_hint, result, copied, napi_create_string_utf16, undefined);\n }\n /**\n * @__sig ipppp\n */\n function node_api_create_property_key_latin1(env, str, length, result) {\n return napi_create_string_latin1(env, str, length, result);\n }\n /**\n * @__sig ipppp\n */\n function node_api_create_property_key_utf8(env, str, length, result) {\n return napi_create_string_utf8(env, str, length, result);\n }\n /**\n * @__sig ipppp\n */\n function node_api_create_property_key_utf16(env, str, length, result) {\n return napi_create_string_utf16(env, str, length, result);\n }\n /**\n * @__sig ipjp\n */\n function napi_create_bigint_int64(env, low, high, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!emnapiCtx.feature.supportBigInt) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n var value;\n if (!high)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n value = low;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v1 = emnapiCtx.addToCurrentScope(value).id;\n high >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(high, v1, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ipjp\n */\n function napi_create_bigint_uint64(env, low, high, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!emnapiCtx.feature.supportBigInt) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n var value;\n if (!high)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n value = low & ((BigInt(1) << BigInt(64)) - BigInt(1));\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v1 = emnapiCtx.addToCurrentScope(value).id;\n high >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(high, v1, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ipippp\n */\n function napi_create_bigint_words(env, sign_bit, word_count, words, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v, i;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!emnapiCtx.feature.supportBigInt) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n words >>>= 0;\n word_count >>>= 0;\n word_count = word_count >>> 0;\n if (word_count > 2147483647) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n if (word_count > (1024 * 1024 / (4 * 8) / 2)) {\n throw new RangeError('Maximum BigInt size exceeded');\n }\n var value = BigInt(0);\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n for (i = 0; i < word_count; i++) {\n var low = HEAP_DATA_VIEW.getUint32(words + i * 8, true);\n var high = HEAP_DATA_VIEW.getUint32(words + (i * 8 + 4), true);\n var wordi = BigInt(low) | (BigInt(high) << BigInt(32));\n value += wordi << BigInt(64 * i);\n }\n value *= ((BigInt(sign_bit) % BigInt(2) === BigInt(0)) ? BigInt(1) : BigInt(-1));\n result >>>= 0;\n v = emnapiCtx.addToCurrentScope(value).id;\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n var convert2napiMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_create_bigint_int64: napi_create_bigint_int64,\n napi_create_bigint_uint64: napi_create_bigint_uint64,\n napi_create_bigint_words: napi_create_bigint_words,\n napi_create_double: napi_create_double,\n napi_create_int32: napi_create_int32,\n napi_create_int64: napi_create_int64,\n napi_create_string_latin1: napi_create_string_latin1,\n napi_create_string_utf16: napi_create_string_utf16,\n napi_create_string_utf8: napi_create_string_utf8,\n napi_create_uint32: napi_create_uint32,\n node_api_create_external_string_latin1: node_api_create_external_string_latin1,\n node_api_create_external_string_utf16: node_api_create_external_string_utf16,\n node_api_create_property_key_latin1: node_api_create_property_key_latin1,\n node_api_create_property_key_utf16: node_api_create_property_key_utf16,\n node_api_create_property_key_utf8: node_api_create_property_key_utf8\n });\n function emnapiCreateFunction(envObject, utf8name, length, cb, data) {\n utf8name >>>= 0;\n var functionName = (!utf8name || !length) ? '' : (emnapiString.UTF8ToString(utf8name, length));\n var f;\n var napiCallback = (wasmTable.get(cb));\n var callback = function (envObject) {\n return napiCallback(envObject.id, envObject.ctx.scopeStore.currentScope.id);\n };\n var makeFunction = function (envObject, callback) {\n return function () {\n var scope = envObject.ctx.openScope(envObject);\n var callbackInfo = scope.callbackInfo;\n callbackInfo.data = data;\n callbackInfo.args = arguments;\n callbackInfo.thiz = this;\n callbackInfo.fn = f;\n try {\n var napiValue = envObject.callIntoModule(callback);\n return (!napiValue) ? undefined : envObject.ctx.handleStore.get(napiValue).value;\n }\n finally {\n callbackInfo.data = 0;\n callbackInfo.args = undefined;\n callbackInfo.thiz = undefined;\n callbackInfo.fn = undefined;\n envObject.ctx.closeScope(envObject, scope);\n }\n };\n };\n if (functionName === '') {\n f = makeFunction(envObject, callback);\n return { status: 0 /* napi_status.napi_ok */, f: f };\n }\n if (!(/^[_$a-zA-Z][_$a-zA-Z0-9]*$/.test(functionName))) {\n return { status: 1 /* napi_status.napi_invalid_arg */, f: undefined };\n }\n if (emnapiCtx.feature.supportNewFunction) {\n var _ = makeFunction(envObject, callback);\n try {\n f = (new Function('_', 'return function ' + functionName + '(){' +\n '\"use strict\";' +\n 'return _.apply(this,arguments);' +\n '};'))(_);\n }\n catch (_err) {\n f = makeFunction(envObject, callback);\n if (emnapiCtx.feature.canSetFunctionName)\n Object.defineProperty(f, 'name', { value: functionName });\n }\n }\n else {\n f = makeFunction(envObject, callback);\n if (emnapiCtx.feature.canSetFunctionName)\n Object.defineProperty(f, 'name', { value: functionName });\n }\n return { status: 0 /* napi_status.napi_ok */, f: f };\n }\n function emnapiDefineProperty(envObject, obj, propertyName, method, getter, setter, value, attributes, data) {\n if (getter || setter) {\n var localGetter = void 0;\n var localSetter = void 0;\n if (getter) {\n localGetter = emnapiCreateFunction(envObject, 0, 0, getter, data).f;\n }\n if (setter) {\n localSetter = emnapiCreateFunction(envObject, 0, 0, setter, data).f;\n }\n var desc = {\n configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0,\n enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0,\n get: localGetter,\n set: localSetter\n };\n Object.defineProperty(obj, propertyName, desc);\n }\n else if (method) {\n var localMethod = emnapiCreateFunction(envObject, 0, 0, method, data).f;\n var desc = {\n configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0,\n enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0,\n writable: (attributes & 1 /* napi_property_attributes.napi_writable */) !== 0,\n value: localMethod\n };\n Object.defineProperty(obj, propertyName, desc);\n }\n else {\n var desc = {\n configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0,\n enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0,\n writable: (attributes & 1 /* napi_property_attributes.napi_writable */) !== 0,\n value: emnapiCtx.handleStore.get(value).value\n };\n Object.defineProperty(obj, propertyName, desc);\n }\n }\n function emnapiGetHandle(js_object) {\n var handle = emnapiCtx.handleStore.get(js_object);\n if (!(handle.isObject() || handle.isFunction())) {\n return { status: 1 /* napi_status.napi_invalid_arg */ };\n }\n if (typeof emnapiExternalMemory !== 'undefined' && ArrayBuffer.isView(handle.value)) {\n if (emnapiExternalMemory.wasmMemoryViewTable.has(handle.value)) {\n handle = emnapiCtx.addToCurrentScope(emnapiExternalMemory.wasmMemoryViewTable.get(handle.value));\n }\n }\n return { status: 0 /* napi_status.napi_ok */, handle: handle };\n }\n function emnapiWrap(env, js_object, native_object, finalize_cb, finalize_hint, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var referenceId;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!emnapiCtx.feature.supportFinalizer) {\n if (finalize_cb) {\n throw emnapiCtx.createNotSupportWeakRefError('napi_wrap', 'Parameter \"finalize_cb\" must be 0(NULL)');\n }\n if (result) {\n throw emnapiCtx.createNotSupportWeakRefError('napi_wrap', 'Parameter \"result\" must be 0(NULL)');\n }\n }\n if (!js_object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handleResult = emnapiGetHandle(js_object);\n if (handleResult.status !== 0 /* napi_status.napi_ok */) {\n return envObject.setLastError(handleResult.status);\n }\n var handle = handleResult.handle;\n if (envObject.getObjectBinding(handle.value).wrapped !== 0) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var reference = void 0;\n if (result) {\n if (!finalize_cb)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n reference = emnapiCtx.createReferenceWithFinalizer(envObject, handle.id, 0, 1 /* ReferenceOwnership.kUserland */, finalize_cb, native_object, finalize_hint);\n result >>>= 0;\n referenceId = reference.id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, referenceId, true);\n }\n else {\n if (finalize_cb) {\n reference = emnapiCtx.createReferenceWithFinalizer(envObject, handle.id, 0, 0 /* ReferenceOwnership.kRuntime */, finalize_cb, native_object, finalize_hint);\n }\n else {\n reference = emnapiCtx.createReferenceWithData(envObject, handle.id, 0, 0 /* ReferenceOwnership.kRuntime */, native_object);\n }\n }\n envObject.getObjectBinding(handle.value).wrapped = reference.id;\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n function emnapiUnwrap(env, js_object, result, action) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var data;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!js_object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (action === 0 /* UnwrapAction.KeepWrap */) {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var value = emnapiCtx.handleStore.get(js_object);\n if (!(value.isObject() || value.isFunction())) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var binding = envObject.getObjectBinding(value.value);\n var referenceId = binding.wrapped;\n var ref = emnapiCtx.refStore.get(referenceId);\n if (!ref)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (result) {\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n data = ref.data();\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, data, true);\n }\n if (action === 1 /* UnwrapAction.RemoveWrap */) {\n binding.wrapped = 0;\n if (ref.ownership() === 1 /* ReferenceOwnership.kUserland */) {\n // When the wrap is been removed, the finalizer should be reset.\n ref.resetFinalizer();\n }\n else {\n ref.dispose();\n }\n }\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipppppppp\n */\n function napi_define_class(env, utf8name, length, constructor, callback_data, property_count, properties, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var propPtr, valueHandleId, attributes;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!constructor)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n length >>>= 0;\n properties >>>= 0;\n property_count >>>= 0;\n property_count = property_count >>> 0;\n if (property_count > 0) {\n if (!properties)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n if (!((length >= -1 && length <= 2147483647) || length === 4294967295) || (!utf8name)) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var fresult = emnapiCreateFunction(envObject, utf8name, length, constructor, callback_data);\n if (fresult.status !== 0 /* napi_status.napi_ok */)\n return envObject.setLastError(fresult.status);\n var F = fresult.f;\n var propertyName = void 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n for (var i = 0; i < property_count; i++) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n propPtr = properties + (i * (4 * 8));\n var utf8Name = HEAP_DATA_VIEW.getUint32(propPtr, true);\n var name_1 = HEAP_DATA_VIEW.getUint32(propPtr + 4, true);\n var method = HEAP_DATA_VIEW.getUint32(propPtr + 8, true);\n var getter = HEAP_DATA_VIEW.getUint32(propPtr + 12, true);\n var setter = HEAP_DATA_VIEW.getUint32(propPtr + 16, true);\n var value = HEAP_DATA_VIEW.getUint32(propPtr + 20, true);\n attributes = HEAP_DATA_VIEW.getInt32(propPtr + 24, true);\n attributes >>>= 0;\n var data = HEAP_DATA_VIEW.getUint32(propPtr + 28, true);\n if (utf8Name) {\n propertyName = emnapiString.UTF8ToString(utf8Name, -1);\n }\n else {\n if (!name_1) {\n return envObject.setLastError(4 /* napi_status.napi_name_expected */);\n }\n propertyName = emnapiCtx.handleStore.get(name_1).value;\n if (typeof propertyName !== 'string' && typeof propertyName !== 'symbol') {\n return envObject.setLastError(4 /* napi_status.napi_name_expected */);\n }\n }\n if ((attributes & 1024 /* napi_property_attributes.napi_static */) !== 0) {\n emnapiDefineProperty(envObject, F, propertyName, method, getter, setter, value, attributes, data);\n continue;\n }\n emnapiDefineProperty(envObject, F.prototype, propertyName, method, getter, setter, value, attributes, data);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var valueHandle = emnapiCtx.addToCurrentScope(F);\n valueHandleId = valueHandle.id;\n result >>>= 0;\n HEAP_DATA_VIEW.setUint32(result, valueHandleId, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipppppp\n */\n function napi_wrap(env, js_object, native_object, finalize_cb, finalize_hint, result) {\n return emnapiWrap(env, js_object, native_object, finalize_cb, finalize_hint, result);\n }\n /**\n * @__sig ippp\n */\n function napi_unwrap(env, js_object, result) {\n return emnapiUnwrap(env, js_object, result, 0 /* UnwrapAction.KeepWrap */);\n }\n /**\n * @__sig ippp\n */\n function napi_remove_wrap(env, js_object, result) {\n return emnapiUnwrap(env, js_object, result, 1 /* UnwrapAction.RemoveWrap */);\n }\n /**\n * @__sig ippp\n */\n function napi_type_tag_object(env, object, type_tag) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!object) {\n return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);\n }\n var value = emnapiCtx.handleStore.get(object);\n if (!(value.isObject() || value.isFunction())) {\n return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 2 /* napi_status.napi_object_expected */);\n }\n type_tag >>>= 0;\n if (!type_tag) {\n return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);\n }\n var binding = envObject.getObjectBinding(value.value);\n if (binding.tag !== null) {\n return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);\n }\n var tag = new Uint8Array(16);\n tag.set(new Uint8Array(wasmMemory.buffer, type_tag, 16));\n binding.tag = new Uint32Array(tag.buffer);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipppp\n */\n function napi_check_object_type_tag(env, object, type_tag, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, one-var\n var ret = true;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!object) {\n return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);\n }\n var value = emnapiCtx.handleStore.get(object);\n if (!(value.isObject() || value.isFunction())) {\n return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 2 /* napi_status.napi_object_expected */);\n }\n if (!type_tag) {\n return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);\n }\n if (!result) {\n return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);\n }\n var binding = envObject.getObjectBinding(value.value);\n if (binding.tag !== null) {\n type_tag >>>= 0;\n var tag = binding.tag;\n var typeTag = new Uint32Array(wasmMemory.buffer, type_tag, 4);\n ret = (tag[0] === typeTag[0] &&\n tag[1] === typeTag[1] &&\n tag[2] === typeTag[2] &&\n tag[3] === typeTag[3]);\n }\n else {\n ret = false;\n }\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, ret ? 1 : 0, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipppppp\n */\n function napi_add_finalizer(env, js_object, finalize_data, finalize_cb, finalize_hint, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!emnapiCtx.feature.supportFinalizer) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n if (!js_object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!finalize_cb)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handleResult = emnapiGetHandle(js_object);\n if (handleResult.status !== 0 /* napi_status.napi_ok */) {\n return envObject.setLastError(handleResult.status);\n }\n var handle = handleResult.handle;\n var ownership = !result ? 0 /* ReferenceOwnership.kRuntime */ : 1 /* ReferenceOwnership.kUserland */;\n finalize_data >>>= 0;\n finalize_cb >>>= 0;\n finalize_hint >>>= 0;\n var reference = emnapiCtx.createReferenceWithFinalizer(envObject, handle.id, 0, ownership, finalize_cb, finalize_data, finalize_hint);\n if (result) {\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var referenceId = reference.id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, referenceId, true);\n }\n return envObject.clearLastError();\n }\n /**\n * @__sig ipppp\n */\n function node_api_post_finalizer(env, finalize_cb, finalize_data, finalize_hint) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n envObject.enqueueFinalizer(emnapiCtx.createTrackedFinalizer(envObject, finalize_cb, finalize_data, finalize_hint));\n return envObject.clearLastError();\n }\n var wrapMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_add_finalizer: napi_add_finalizer,\n napi_check_object_type_tag: napi_check_object_type_tag,\n napi_define_class: napi_define_class,\n napi_remove_wrap: napi_remove_wrap,\n napi_type_tag_object: napi_type_tag_object,\n napi_unwrap: napi_unwrap,\n napi_wrap: napi_wrap,\n node_api_post_finalizer: node_api_post_finalizer\n });\n /**\n * @__sig ipippppp\n */\n function emnapi_create_memory_view(env, typedarray_type, external_data, byte_length, finalize_cb, finalize_hint, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n byte_length >>>= 0;\n external_data >>>= 0;\n result >>>= 0;\n byte_length = byte_length >>> 0;\n if (!external_data) {\n byte_length = 0;\n }\n if (byte_length > 2147483647) {\n throw new RangeError('Cannot create a memory view larger than 2147483647 bytes');\n }\n if ((external_data + byte_length) > wasmMemory.buffer.byteLength) {\n throw new RangeError('Memory out of range');\n }\n if (!emnapiCtx.feature.supportFinalizer && finalize_cb) {\n throw emnapiCtx.createNotSupportWeakRefError('emnapi_create_memory_view', 'Parameter \"finalize_cb\" must be 0(NULL)');\n }\n var viewDescriptor = void 0;\n switch (typedarray_type) {\n case 0 /* emnapi_memory_view_type.emnapi_int8_array */:\n viewDescriptor = { Ctor: Int8Array, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 1 /* emnapi_memory_view_type.emnapi_uint8_array */:\n viewDescriptor = { Ctor: Uint8Array, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 2 /* emnapi_memory_view_type.emnapi_uint8_clamped_array */:\n viewDescriptor = { Ctor: Uint8ClampedArray, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 3 /* emnapi_memory_view_type.emnapi_int16_array */:\n viewDescriptor = { Ctor: Int16Array, address: external_data, length: byte_length >> 1, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 4 /* emnapi_memory_view_type.emnapi_uint16_array */:\n viewDescriptor = { Ctor: Uint16Array, address: external_data, length: byte_length >> 1, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 5 /* emnapi_memory_view_type.emnapi_int32_array */:\n viewDescriptor = { Ctor: Int32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 6 /* emnapi_memory_view_type.emnapi_uint32_array */:\n viewDescriptor = { Ctor: Uint32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 7 /* emnapi_memory_view_type.emnapi_float32_array */:\n viewDescriptor = { Ctor: Float32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 8 /* emnapi_memory_view_type.emnapi_float64_array */:\n viewDescriptor = { Ctor: Float64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 9 /* emnapi_memory_view_type.emnapi_bigint64_array */:\n viewDescriptor = { Ctor: BigInt64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 10 /* emnapi_memory_view_type.emnapi_biguint64_array */:\n viewDescriptor = { Ctor: BigUint64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case -1 /* emnapi_memory_view_type.emnapi_data_view */:\n viewDescriptor = { Ctor: DataView, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case 11 /* emnapi_memory_view_type.emnapi_float16_array */:\n if (typeof Float16Array !== 'function') {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n viewDescriptor = { Ctor: Float16Array, address: external_data, length: byte_length >> 1, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n case -2 /* emnapi_memory_view_type.emnapi_buffer */: {\n if (!emnapiCtx.feature.Buffer) {\n throw emnapiCtx.createNotSupportBufferError('emnapi_create_memory_view', '');\n }\n viewDescriptor = { Ctor: emnapiCtx.feature.Buffer, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };\n break;\n }\n default: return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var Ctor = viewDescriptor.Ctor;\n var typedArray = typedarray_type === -2 /* emnapi_memory_view_type.emnapi_buffer */\n ? emnapiCtx.feature.Buffer.from(wasmMemory.buffer, viewDescriptor.address, viewDescriptor.length)\n : new Ctor(wasmMemory.buffer, viewDescriptor.address, viewDescriptor.length);\n var handle = emnapiCtx.addToCurrentScope(typedArray);\n emnapiExternalMemory.wasmMemoryViewTable.set(typedArray, viewDescriptor);\n if (finalize_cb) {\n var status_1 = napi_add_finalizer(env, handle.id, external_data, finalize_cb, finalize_hint, /* NULL */ 0);\n if (status_1 === 10 /* napi_status.napi_pending_exception */) {\n var err = envObject.tryCatch.extractException();\n envObject.clearLastError();\n throw err;\n }\n else if (status_1 !== 0 /* napi_status.napi_ok */) {\n return envObject.setLastError(status_1);\n }\n }\n value = handle.id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig i\n */\n function emnapi_is_support_weakref() {\n return emnapiCtx.feature.supportFinalizer ? 1 : 0;\n }\n /**\n * @__sig i\n */\n function emnapi_is_support_bigint() {\n return emnapiCtx.feature.supportBigInt ? 1 : 0;\n }\n /**\n * @__sig i\n */\n function emnapi_is_node_binding_available() {\n return emnapiNodeBinding ? 1 : 0;\n }\n function $emnapiSyncMemory(js_to_wasm, arrayBufferOrView, offset, len) {\n offset = offset !== null && offset !== void 0 ? offset : 0;\n offset = offset >>> 0;\n var view;\n if (arrayBufferOrView instanceof ArrayBuffer || emnapiExternalMemory.isSharedArrayBuffer(arrayBufferOrView)) {\n var pointer = emnapiExternalMemory.getArrayBufferPointer(arrayBufferOrView, false).address;\n if (!pointer)\n throw new Error('Unknown ArrayBuffer address');\n if (typeof len !== 'number' || len === -1 || len === 4294967295) {\n len = arrayBufferOrView.byteLength - offset;\n }\n len = len >>> 0;\n if (len === 0)\n return arrayBufferOrView;\n view = new Uint8Array(arrayBufferOrView, offset, len);\n var wasmMemoryU8 = new Uint8Array(wasmMemory.buffer);\n if (!js_to_wasm) {\n view.set(wasmMemoryU8.subarray(pointer, pointer + len));\n }\n else {\n wasmMemoryU8.set(view, pointer);\n }\n return arrayBufferOrView;\n }\n if (ArrayBuffer.isView(arrayBufferOrView)) {\n var viewPointerInfo = emnapiExternalMemory.getViewPointer(arrayBufferOrView, false);\n var latestView = viewPointerInfo.view;\n var pointer = viewPointerInfo.address;\n if (!pointer)\n throw new Error('Unknown ArrayBuffer address');\n if (typeof len !== 'number' || len === -1 || len === 4294967295) {\n len = latestView.byteLength - offset;\n }\n len = len >>> 0;\n if (len === 0)\n return latestView;\n view = new Uint8Array(latestView.buffer, latestView.byteOffset + offset, len);\n var wasmMemoryU8 = new Uint8Array(wasmMemory.buffer);\n if (!js_to_wasm) {\n view.set(wasmMemoryU8.subarray(pointer, pointer + len));\n }\n else {\n wasmMemoryU8.set(view, pointer);\n }\n return latestView;\n }\n throw new TypeError('emnapiSyncMemory expect ArrayBuffer or ArrayBufferView as first parameter');\n }\n /**\n * @__sig ipippp\n */\n function emnapi_sync_memory(env, js_to_wasm, arraybuffer_or_view, offset, len) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!arraybuffer_or_view)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n arraybuffer_or_view >>>= 0;\n offset >>>= 0;\n len >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n var handleId = HEAP_DATA_VIEW.getUint32(arraybuffer_or_view, true);\n var handle = envObject.ctx.handleStore.get(handleId);\n if (!handle.isArrayBuffer() && !handle.isTypedArray() && !handle.isDataView() && !emnapiExternalMemory.isSharedArrayBuffer(handle.value)) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var ret = $emnapiSyncMemory(Boolean(js_to_wasm), handle.value, offset, len);\n if (handle.value !== ret) {\n arraybuffer_or_view >>>= 0;\n v = envObject.ensureHandleId(ret);\n HEAP_DATA_VIEW.setUint32(arraybuffer_or_view, v, true);\n }\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n function $emnapiGetMemoryAddress(arrayBufferOrView) {\n var isArrayBuffer = arrayBufferOrView instanceof ArrayBuffer;\n var isDataView = arrayBufferOrView instanceof DataView;\n var isTypedArray = ArrayBuffer.isView(arrayBufferOrView) && !isDataView;\n if (!isArrayBuffer && !isTypedArray && !isDataView && !emnapiExternalMemory.isSharedArrayBuffer(arrayBufferOrView)) {\n throw new TypeError('emnapiGetMemoryAddress expect ArrayBuffer or ArrayBufferView as first parameter');\n }\n var info;\n if (isArrayBuffer) {\n info = emnapiExternalMemory.getArrayBufferPointer(arrayBufferOrView, false);\n }\n else {\n info = emnapiExternalMemory.getViewPointer(arrayBufferOrView, false);\n }\n return {\n address: info.address,\n ownership: info.ownership,\n runtimeAllocated: info.runtimeAllocated\n };\n }\n /**\n * @__sig ipppp\n */\n function emnapi_get_memory_address(env, arraybuffer_or_view, address, ownership, runtime_allocated) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var p, runtimeAllocated, ownershipOut;\n var info;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!arraybuffer_or_view)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!address && !ownership && !runtime_allocated) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var handle = envObject.ctx.handleStore.get(arraybuffer_or_view);\n info = $emnapiGetMemoryAddress(handle.value);\n p = info.address;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (address) {\n address >>>= 0;\n HEAP_DATA_VIEW.setUint32(address, p, true);\n }\n if (ownership) {\n ownership >>>= 0;\n ownershipOut = info.ownership;\n HEAP_DATA_VIEW.setInt32(ownership, ownershipOut, true);\n }\n if (runtime_allocated) {\n runtime_allocated >>>= 0;\n runtimeAllocated = info.runtimeAllocated;\n HEAP_DATA_VIEW.setInt8(runtime_allocated, runtimeAllocated, true);\n }\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipp\n */\n function emnapi_get_runtime_version(env, version) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!version)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var runtimeVersion;\n try {\n runtimeVersion = emnapiCtx.getRuntimeVersions().version;\n }\n catch (_) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var versions = runtimeVersion.split('.')\n .map(function (n) { return Number(n); });\n version >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(version, versions[0], true);\n HEAP_DATA_VIEW.setUint32(version + 4, versions[1], true);\n HEAP_DATA_VIEW.setUint32(version + 8, versions[2], true);\n return envObject.clearLastError();\n }\n var emnapiMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n $emnapiGetMemoryAddress: $emnapiGetMemoryAddress,\n $emnapiSyncMemory: $emnapiSyncMemory,\n emnapi_create_memory_view: emnapi_create_memory_view,\n emnapi_get_memory_address: emnapi_get_memory_address,\n emnapi_get_runtime_version: emnapi_get_runtime_version,\n emnapi_is_node_binding_available: emnapi_is_node_binding_available,\n emnapi_is_support_bigint: emnapi_is_support_bigint,\n emnapi_is_support_weakref: emnapi_is_support_weakref,\n emnapi_sync_memory: emnapi_sync_memory\n });\n /**\n * @__sig ipp\n */\n function napi_create_array(env, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope([]).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ippp\n */\n function napi_create_array_with_length(env, length, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n length >>>= 0;\n result >>>= 0;\n length = length >>> 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope(new Array(length)).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n function emnapiCreateArrayBuffer(byte_length, data, shared) {\n byte_length >>>= 0;\n byte_length = byte_length >>> 0;\n var arrayBuffer = shared ? new SharedArrayBuffer(byte_length) : new ArrayBuffer(byte_length);\n if (data) {\n data >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var p = emnapiExternalMemory.getArrayBufferPointer(arrayBuffer, true).address;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(data, p, true);\n }\n return arrayBuffer;\n }\n /**\n * @__sig ipppp\n */\n function napi_create_arraybuffer(env, byte_length, data, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n var arrayBuffer = emnapiCreateArrayBuffer(byte_length, data, false);\n value = emnapiCtx.addToCurrentScope(arrayBuffer).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipppp\n */\n function node_api_create_sharedarraybuffer(env, byte_length, data, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n var arrayBuffer = emnapiCreateArrayBuffer(byte_length, data, true);\n value = emnapiCtx.addToCurrentScope(arrayBuffer).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipdp\n */\n function napi_create_date(env, time, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n value = emnapiCtx.addToCurrentScope(new Date(time)).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ippppp\n */\n function napi_create_external(env, data, finalize_cb, finalize_hint, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!emnapiCtx.feature.supportFinalizer && finalize_cb) {\n throw emnapiCtx.createNotSupportWeakRefError('napi_create_external', 'Parameter \"finalize_cb\" must be 0(NULL)');\n }\n var externalHandle = emnapiCtx.getCurrentScope().addExternal(data);\n if (finalize_cb) {\n emnapiCtx.createReferenceWithFinalizer(envObject, externalHandle.id, 0, 0 /* ReferenceOwnership.kRuntime */, finalize_cb, data, finalize_hint);\n }\n result >>>= 0;\n value = externalHandle.id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipppppp\n */\n function napi_create_external_arraybuffer(env, external_data, byte_length, finalize_cb, finalize_hint, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n byte_length >>>= 0;\n external_data >>>= 0;\n result >>>= 0;\n byte_length = byte_length >>> 0;\n if (!external_data) {\n byte_length = 0;\n }\n if ((external_data + byte_length) > wasmMemory.buffer.byteLength) {\n throw new RangeError('Memory out of range');\n }\n if (!emnapiCtx.feature.supportFinalizer && finalize_cb) {\n throw emnapiCtx.createNotSupportWeakRefError('napi_create_external_arraybuffer', 'Parameter \"finalize_cb\" must be 0(NULL)');\n }\n var arrayBuffer = new ArrayBuffer(byte_length);\n if (byte_length === 0) {\n try {\n var MessageChannel_1 = emnapiCtx.feature.MessageChannel;\n var messageChannel = new MessageChannel_1();\n messageChannel.port1.postMessage(arrayBuffer, [arrayBuffer]);\n }\n catch (_) { }\n }\n else {\n var u8arr = new Uint8Array(arrayBuffer);\n u8arr.set(new Uint8Array(wasmMemory.buffer).subarray(external_data, external_data + byte_length));\n emnapiExternalMemory.table.set(arrayBuffer, {\n address: external_data,\n ownership: 1 /* ReferenceOwnership.kUserland */,\n runtimeAllocated: 0\n });\n }\n var handle = emnapiCtx.addToCurrentScope(arrayBuffer);\n if (finalize_cb) {\n var status_1 = napi_add_finalizer(env, handle.id, external_data, finalize_cb, finalize_hint, /* NULL */ 0);\n if (status_1 === 10 /* napi_status.napi_pending_exception */) {\n var err = envObject.tryCatch.extractException();\n envObject.clearLastError();\n throw err;\n }\n else if (status_1 !== 0 /* napi_status.napi_ok */) {\n return envObject.setLastError(status_1);\n }\n }\n value = handle.id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipp\n */\n function napi_create_object(env, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope({}).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ipppppp\n */\n function node_api_create_object_with_properties(env, prototype_or_null, property_names, property_values, property_count, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n property_count >>>= 0;\n property_count = property_count >>> 0;\n if (property_count > 0) {\n if (!property_names)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!property_values)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var v8_prototype_or_null = prototype_or_null\n ? emnapiCtx.handleStore.get(prototype_or_null).value\n : null;\n var properties = {};\n property_names >>>= 0;\n property_values >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n for (var i = 0; i < property_count; i++) {\n var name_value = emnapiCtx.handleStore.get(HEAP_DATA_VIEW.getUint32(property_names + i * 4, true)).value;\n if (!(typeof name_value === \"string\" || typeof name_value === \"symbol\"))\n return envObject.setLastError(4 /* napi_status.napi_name_expected */);\n properties[name_value] = {\n value: emnapiCtx.handleStore.get(HEAP_DATA_VIEW.getUint32(property_values + i * 4, true)).value,\n writable: true,\n enumerable: true,\n configurable: true\n };\n }\n var obj;\n try {\n obj = Object.defineProperties(Object.create(v8_prototype_or_null), properties);\n }\n catch (_) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope(obj).id;\n result >>>= 0;\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n /**\n * @__sig ippp\n */\n function napi_create_symbol(env, description, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (!description) {\n // eslint-disable-next-line symbol-description, @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope(Symbol()).id;\n HEAP_DATA_VIEW.setUint32(result, value, true);\n }\n else {\n var handle = emnapiCtx.handleStore.get(description);\n var desc = handle.value;\n if (typeof desc !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v = emnapiCtx.addToCurrentScope(Symbol(desc)).id;\n HEAP_DATA_VIEW.setUint32(result, v, true);\n }\n return envObject.clearLastError();\n }\n /**\n * @__sig ipipppp\n */\n function napi_create_typedarray(env, type, length, arraybuffer, byte_offset, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!arraybuffer)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(arraybuffer);\n if (!handle.isArrayBuffer()) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var buffer = handle.value;\n byte_offset >>>= 0;\n length >>>= 0;\n var createTypedArray = function (envObject, Type, size_of_element, buffer, byte_offset, length) {\n var _a;\n byte_offset = byte_offset >>> 0;\n length = length >>> 0;\n if (size_of_element > 1) {\n if ((byte_offset) % (size_of_element) !== 0) {\n var err = new RangeError(\"start offset of \".concat((_a = Type.name) !== null && _a !== void 0 ? _a : '', \" should be a multiple of \").concat(size_of_element));\n err.code = 'ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT';\n envObject.tryCatch.setError(err);\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n }\n if (((length * size_of_element) + byte_offset) > buffer.byteLength) {\n var err = new RangeError('Invalid typed array length');\n err.code = 'ERR_NAPI_INVALID_TYPEDARRAY_LENGTH';\n envObject.tryCatch.setError(err);\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n var out = new Type(buffer, byte_offset, length);\n if (buffer === wasmMemory.buffer) {\n if (!emnapiExternalMemory.wasmMemoryViewTable.has(out)) {\n emnapiExternalMemory.wasmMemoryViewTable.set(out, {\n Ctor: Type,\n address: byte_offset,\n length: length,\n ownership: 1 /* ReferenceOwnership.kUserland */,\n runtimeAllocated: 0\n });\n }\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n value = emnapiCtx.addToCurrentScope(out).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n };\n switch (type) {\n case 0 /* napi_typedarray_type.napi_int8_array */:\n return createTypedArray(envObject, Int8Array, 1, buffer, byte_offset, length);\n case 1 /* napi_typedarray_type.napi_uint8_array */:\n return createTypedArray(envObject, Uint8Array, 1, buffer, byte_offset, length);\n case 2 /* napi_typedarray_type.napi_uint8_clamped_array */:\n return createTypedArray(envObject, Uint8ClampedArray, 1, buffer, byte_offset, length);\n case 3 /* napi_typedarray_type.napi_int16_array */:\n return createTypedArray(envObject, Int16Array, 2, buffer, byte_offset, length);\n case 4 /* napi_typedarray_type.napi_uint16_array */:\n return createTypedArray(envObject, Uint16Array, 2, buffer, byte_offset, length);\n case 5 /* napi_typedarray_type.napi_int32_array */:\n return createTypedArray(envObject, Int32Array, 4, buffer, byte_offset, length);\n case 6 /* napi_typedarray_type.napi_uint32_array */:\n return createTypedArray(envObject, Uint32Array, 4, buffer, byte_offset, length);\n case 7 /* napi_typedarray_type.napi_float32_array */:\n return createTypedArray(envObject, Float32Array, 4, buffer, byte_offset, length);\n case 8 /* napi_typedarray_type.napi_float64_array */:\n return createTypedArray(envObject, Float64Array, 8, buffer, byte_offset, length);\n case 9 /* napi_typedarray_type.napi_bigint64_array */:\n return createTypedArray(envObject, BigInt64Array, 8, buffer, byte_offset, length);\n case 10 /* napi_typedarray_type.napi_biguint64_array */:\n return createTypedArray(envObject, BigUint64Array, 8, buffer, byte_offset, length);\n case 11 /* napi_typedarray_type.napi_float16_array */:\n if (typeof Float16Array !== 'function') {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n return createTypedArray(envObject, Float16Array, 2, buffer, byte_offset, length);\n default:\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__deps malloc\n * @__sig ippp\n */\n function napi_create_buffer(env, size, data, result) {\n var _a;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value, pointer;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var Buffer = emnapiCtx.feature.Buffer;\n if (!Buffer) {\n throw emnapiCtx.createNotSupportBufferError('napi_create_buffer', '');\n }\n result >>>= 0;\n var buffer = void 0;\n size >>>= 0;\n size = size >>> 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (!data || (size === 0)) {\n buffer = Buffer.alloc(size);\n value = emnapiCtx.addToCurrentScope(buffer).id;\n HEAP_DATA_VIEW.setUint32(result, value, true);\n }\n else {\n pointer = _malloc(size);\n if (!pointer)\n throw new Error('Out of memory');\n pointer >>>= 0;\n new Uint8Array(wasmMemory.buffer).subarray(pointer, pointer + size).fill(0);\n var buffer_1 = Buffer.from(wasmMemory.buffer, pointer, size);\n var viewDescriptor = {\n Ctor: Buffer,\n address: pointer,\n length: size,\n ownership: emnapiExternalMemory.registry ? 0 /* ReferenceOwnership.kRuntime */ : 1 /* ReferenceOwnership.kUserland */,\n runtimeAllocated: 1\n };\n emnapiExternalMemory.wasmMemoryViewTable.set(buffer_1, viewDescriptor);\n (_a = emnapiExternalMemory.registry) === null || _a === void 0 ? void 0 : _a.register(viewDescriptor, pointer);\n value = emnapiCtx.addToCurrentScope(buffer_1).id;\n HEAP_DATA_VIEW.setUint32(result, value, true);\n data >>>= 0;\n HEAP_DATA_VIEW.setUint32(data, pointer, true);\n }\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ippppp\n */\n function napi_create_buffer_copy(env, length, data, result_data, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var Buffer = emnapiCtx.feature.Buffer;\n if (!Buffer) {\n throw emnapiCtx.createNotSupportBufferError('napi_create_buffer_copy', '');\n }\n var arrayBuffer = emnapiCreateArrayBuffer(length, result_data, false);\n var buffer = Buffer.from(arrayBuffer);\n data >>>= 0;\n length >>>= 0;\n buffer.set(new Uint8Array(wasmMemory.buffer).subarray(data, data + length));\n value = emnapiCtx.addToCurrentScope(buffer).id;\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipppppp\n */\n function napi_create_external_buffer(env, length, data, finalize_cb, finalize_hint, result) {\n return emnapi_create_memory_view(env, -2 /* emnapi_memory_view_type.emnapi_buffer */, data, length, finalize_cb, finalize_hint, result);\n }\n /**\n * @__sig ippppp\n */\n function node_api_create_buffer_from_arraybuffer(env, arraybuffer, byte_offset, byte_length, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!arraybuffer)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n byte_offset >>>= 0;\n byte_length >>>= 0;\n byte_offset = byte_offset >>> 0;\n byte_length = byte_length >>> 0;\n var handle = emnapiCtx.handleStore.get(arraybuffer);\n if (!handle.isArrayBuffer()) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var buffer = handle.value;\n if ((byte_length + byte_offset) > buffer.byteLength) {\n var err = new RangeError('The byte offset + length is out of range');\n err.code = 'ERR_OUT_OF_RANGE';\n throw err;\n }\n var Buffer = emnapiCtx.feature.Buffer;\n if (!Buffer) {\n throw emnapiCtx.createNotSupportBufferError('node_api_create_buffer_from_arraybuffer', '');\n }\n var out = Buffer.from(buffer, byte_offset, byte_length);\n if (buffer === wasmMemory.buffer) {\n if (!emnapiExternalMemory.wasmMemoryViewTable.has(out)) {\n emnapiExternalMemory.wasmMemoryViewTable.set(out, {\n Ctor: Buffer,\n address: byte_offset,\n length: byte_length,\n ownership: 1 /* ReferenceOwnership.kUserland */,\n runtimeAllocated: 0\n });\n }\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n value = emnapiCtx.addToCurrentScope(out).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ippppp\n */\n function napi_create_dataview(env, byte_length, arraybuffer, byte_offset, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!arraybuffer)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n byte_length >>>= 0;\n byte_offset >>>= 0;\n byte_length = byte_length >>> 0;\n byte_offset = byte_offset >>> 0;\n var value = emnapiCtx.handleStore.get(arraybuffer).value;\n var createDataview = function (buffer) {\n if ((byte_length + byte_offset) > buffer.byteLength) {\n var err = new RangeError('byte_offset + byte_length should be less than or equal to the size in bytes of the array passed in');\n err.code = 'ERR_NAPI_INVALID_DATAVIEW_ARGS';\n throw err;\n }\n var dataview = new DataView(buffer, byte_offset, byte_length);\n if (buffer === wasmMemory.buffer) {\n if (!emnapiExternalMemory.wasmMemoryViewTable.has(dataview)) {\n emnapiExternalMemory.wasmMemoryViewTable.set(dataview, {\n Ctor: DataView,\n address: byte_offset,\n length: byte_length,\n ownership: 1 /* ReferenceOwnership.kUserland */,\n runtimeAllocated: 0\n });\n }\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v = emnapiCtx.addToCurrentScope(dataview).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.getReturnStatus();\n };\n if (value instanceof ArrayBuffer || emnapiExternalMemory.isSharedArrayBuffer(value)) {\n return createDataview(value);\n }\n else {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /**\n * @__sig ipppp\n */\n function node_api_symbol_for(env, utf8description, length, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n length >>>= 0;\n utf8description >>>= 0;\n result >>>= 0;\n var autoLength = length === -1 || length === 4294967295;\n var sizelength = length >>> 0;\n if (length !== 0) {\n if (!utf8description)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n if (!(autoLength || (sizelength <= 2147483647))) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var descriptionString = emnapiString.UTF8ToString(utf8description, length);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope(Symbol.for(descriptionString)).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n var createMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_create_array: napi_create_array,\n napi_create_array_with_length: napi_create_array_with_length,\n napi_create_arraybuffer: napi_create_arraybuffer,\n napi_create_buffer: napi_create_buffer,\n napi_create_buffer_copy: napi_create_buffer_copy,\n napi_create_dataview: napi_create_dataview,\n napi_create_date: napi_create_date,\n napi_create_external: napi_create_external,\n napi_create_external_arraybuffer: napi_create_external_arraybuffer,\n napi_create_external_buffer: napi_create_external_buffer,\n napi_create_object: napi_create_object,\n napi_create_symbol: napi_create_symbol,\n napi_create_typedarray: napi_create_typedarray,\n node_api_create_buffer_from_arraybuffer: node_api_create_buffer_from_arraybuffer,\n node_api_create_object_with_properties: node_api_create_object_with_properties,\n node_api_create_sharedarraybuffer: node_api_create_sharedarraybuffer,\n node_api_symbol_for: node_api_symbol_for\n });\n /** @__sig ipip */\n function napi_get_boolean(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v = value === 0 ? 3 /* GlobalHandle.FALSE */ : 4 /* GlobalHandle.TRUE */;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.clearLastError();\n }\n /** @__sig ipp */\n function napi_get_global(env, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = 5 /* GlobalHandle.GLOBAL */;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n /** @__sig ipp */\n function napi_get_null(env, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = 2 /* GlobalHandle.NULL */;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n /** @__sig ipp */\n function napi_get_undefined(env, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = 1 /* GlobalHandle.UNDEFINED */;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n var globalMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_get_boolean: napi_get_boolean,\n napi_get_global: napi_get_global,\n napi_get_null: napi_get_null,\n napi_get_undefined: napi_get_undefined\n });\n /** @__sig ipppp */\n function napi_set_instance_data(env, data, finalize_cb, finalize_hint) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n data >>>= 0;\n finalize_cb >>>= 0;\n finalize_hint >>>= 0;\n envObject.setInstanceData(data, finalize_cb, finalize_hint);\n return envObject.clearLastError();\n }\n /** @__sig ipp */\n function napi_get_instance_data(env, data) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!data)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n data >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = envObject.getInstanceData();\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(data, value, true);\n return envObject.clearLastError();\n }\n var envMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_get_instance_data: napi_get_instance_data,\n napi_set_instance_data: napi_set_instance_data\n });\n /** @__sig vpppp */\n function _emnapi_get_last_error_info(env, error_code, engine_error_code, engine_reserved) {\n error_code >>>= 0;\n engine_error_code >>>= 0;\n engine_reserved >>>= 0;\n var envObject = emnapiCtx.envStore.get(env);\n var lastError = envObject.lastError;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var errorCode = lastError.errorCode;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var engineErrorCode = lastError.engineErrorCode >>> 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var engineReserved = lastError.engineReserved;\n engineReserved >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt32(error_code, errorCode, true);\n HEAP_DATA_VIEW.setUint32(engine_error_code, engineErrorCode, true);\n HEAP_DATA_VIEW.setUint32(engine_reserved, engineReserved, true);\n }\n /** @__sig ipp */\n function napi_throw(env, error) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!error)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n envObject.tryCatch.setError(emnapiCtx.handleStore.get(error).value);\n return envObject.clearLastError();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_throw_error(env, code, msg) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!msg)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n code >>>= 0;\n msg >>>= 0;\n var error = new Error(emnapiString.UTF8ToString(msg, -1));\n if (code)\n error.code = emnapiString.UTF8ToString(code, -1);\n envObject.tryCatch.setError(error);\n return envObject.clearLastError();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_throw_type_error(env, code, msg) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!msg)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n code >>>= 0;\n msg >>>= 0;\n var error = new TypeError(emnapiString.UTF8ToString(msg, -1));\n if (code)\n error.code = emnapiString.UTF8ToString(code, -1);\n envObject.tryCatch.setError(error);\n return envObject.clearLastError();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_throw_range_error(env, code, msg) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!msg)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n code >>>= 0;\n msg >>>= 0;\n var error = new RangeError(emnapiString.UTF8ToString(msg, -1));\n if (code)\n error.code = emnapiString.UTF8ToString(code, -1);\n envObject.tryCatch.setError(error);\n return envObject.clearLastError();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function node_api_throw_syntax_error(env, code, msg) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!msg)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n code >>>= 0;\n msg >>>= 0;\n var error = new SyntaxError(emnapiString.UTF8ToString(msg, -1));\n if (code)\n error.code = emnapiString.UTF8ToString(code, -1);\n envObject.tryCatch.setError(error);\n return envObject.clearLastError();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipp */\n function napi_is_exception_pending(env, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = envObject.tryCatch.hasCaught();\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true);\n return envObject.clearLastError();\n }\n /** @__sig ipppp */\n function napi_create_error(env, code, msg, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!msg)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var msgValue = emnapiCtx.handleStore.get(msg).value;\n if (typeof msgValue !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n var error = new Error(msgValue);\n if (code) {\n var codeValue = emnapiCtx.handleStore.get(code).value;\n if (typeof codeValue !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n error.code = codeValue;\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope(error).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n /** @__sig ipppp */\n function napi_create_type_error(env, code, msg, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!msg)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var msgValue = emnapiCtx.handleStore.get(msg).value;\n if (typeof msgValue !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n var error = new TypeError(msgValue);\n if (code) {\n var codeValue = emnapiCtx.handleStore.get(code).value;\n if (typeof codeValue !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n error.code = codeValue;\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope(error).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n /** @__sig ipppp */\n function napi_create_range_error(env, code, msg, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!msg)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var msgValue = emnapiCtx.handleStore.get(msg).value;\n if (typeof msgValue !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n var error = new RangeError(msgValue);\n if (code) {\n var codeValue = emnapiCtx.handleStore.get(code).value;\n if (typeof codeValue !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n error.code = codeValue;\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope(error).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n /** @__sig ipppp */\n function node_api_create_syntax_error(env, code, msg, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!msg)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var msgValue = emnapiCtx.handleStore.get(msg).value;\n if (typeof msgValue !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n var error = new SyntaxError(msgValue);\n if (code) {\n var codeValue = emnapiCtx.handleStore.get(code).value;\n if (typeof codeValue !== 'string') {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n error.code = codeValue;\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = emnapiCtx.addToCurrentScope(error).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n /** @__sig ipp */\n function napi_get_and_clear_last_exception(env, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (!envObject.tryCatch.hasCaught()) {\n HEAP_DATA_VIEW.setUint32(result, 1, true); // ID_UNDEFINED\n return envObject.clearLastError();\n }\n else {\n var err = envObject.tryCatch.exception();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = envObject.ensureHandleId(err);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n envObject.tryCatch.reset();\n }\n return envObject.clearLastError();\n }\n /** @__sig vpppp */\n function napi_fatal_error(location, location_len, message, message_len) {\n location >>>= 0;\n location_len >>>= 0;\n message >>>= 0;\n message_len >>>= 0;\n var locationStr = emnapiString.UTF8ToString(location, location_len);\n var messageStr = emnapiString.UTF8ToString(message, message_len);\n if (emnapiNodeBinding) {\n emnapiNodeBinding.napi.fatalError(locationStr, messageStr);\n }\n else {\n abort('FATAL ERROR: ' + locationStr + ' ' + messageStr);\n }\n }\n /** @__sig ipp */\n function napi_fatal_exception(env, err) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!err)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var error = envObject.ctx.handleStore.get(err);\n try {\n envObject.triggerFatalException(error.value);\n }\n catch (_) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n return envObject.clearLastError();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n var errorMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n _emnapi_get_last_error_info: _emnapi_get_last_error_info,\n napi_create_error: napi_create_error,\n napi_create_range_error: napi_create_range_error,\n napi_create_type_error: napi_create_type_error,\n napi_fatal_error: napi_fatal_error,\n napi_fatal_exception: napi_fatal_exception,\n napi_get_and_clear_last_exception: napi_get_and_clear_last_exception,\n napi_is_exception_pending: napi_is_exception_pending,\n napi_throw: napi_throw,\n napi_throw_error: napi_throw_error,\n napi_throw_range_error: napi_throw_range_error,\n napi_throw_type_error: napi_throw_type_error,\n node_api_create_syntax_error: node_api_create_syntax_error,\n node_api_throw_syntax_error: node_api_throw_syntax_error\n });\n /** @__sig ipppppp */\n function _emnapi_create_function(env, utf8name, length, cb, data, result) {\n length >>>= 0;\n var envObject = emnapiCtx.envStore.get(env);\n var fresult = emnapiCreateFunction(envObject, utf8name, length, cb, data);\n if (fresult.status !== 0 /* napi_status.napi_ok */)\n return envObject.setLastError(fresult.status);\n var f = fresult.f;\n var valueHandle = emnapiCtx.addToCurrentScope(f);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = valueHandle.id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n /** @__sig ipppppp */\n function napi_create_function(env, utf8name, length, cb, data, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!cb)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n return _emnapi_create_function(env, utf8name, length, cb, data, result);\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipppppp */\n function napi_get_cb_info(env, cbinfo, argc, argv, this_arg, data) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!cbinfo)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var cbinfoValue = emnapiCtx.scopeStore.get(cbinfo).callbackInfo;\n argc >>>= 0;\n argv >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (argv) {\n if (!argc)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var argcValue = HEAP_DATA_VIEW.getUint32(argc, true);\n argcValue >>>= 0;\n var len = cbinfoValue.args.length;\n var arrlen = argcValue < len ? argcValue : len;\n var i = 0;\n for (; i < arrlen; i++) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var argVal = envObject.ensureHandleId(cbinfoValue.args[i]);\n HEAP_DATA_VIEW.setUint32(argv + i * 4, argVal, true);\n }\n if (i < argcValue) {\n for (; i < argcValue; i++) {\n HEAP_DATA_VIEW.setUint32(argv + i * 4, 1, true);\n }\n }\n }\n if (argc) {\n HEAP_DATA_VIEW.setUint32(argc, cbinfoValue.args.length, true);\n }\n if (this_arg) {\n this_arg >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v = envObject.ensureHandleId(cbinfoValue.thiz);\n HEAP_DATA_VIEW.setUint32(this_arg, v, true);\n }\n if (data) {\n data >>>= 0;\n HEAP_DATA_VIEW.setUint32(data, cbinfoValue.data, true);\n }\n return envObject.clearLastError();\n }\n /** @__sig ipppppp */\n function napi_call_function(env, recv, func, argc, argv, result) {\n var i = 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!recv)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n argc >>>= 0;\n argv >>>= 0;\n result >>>= 0;\n argc = argc >>> 0;\n if (argc > 0) {\n if (!argv)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var v8recv = emnapiCtx.handleStore.get(recv).value;\n if (!func)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var v8func = emnapiCtx.handleStore.get(func).value;\n if (typeof v8func !== 'function')\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var args = [];\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n for (; i < argc; i++) {\n var argVal = HEAP_DATA_VIEW.getUint32(argv + i * 4, true);\n args.push(emnapiCtx.handleStore.get(argVal).value);\n }\n var ret = v8func.apply(v8recv, args);\n if (result) {\n v = envObject.ensureHandleId(ret);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n }\n return envObject.clearLastError();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippppp */\n function napi_new_instance(env, constructor, argc, argv, result) {\n var i;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!constructor)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n argc >>>= 0;\n argv >>>= 0;\n result >>>= 0;\n argc = argc >>> 0;\n if (argc > 0) {\n if (!argv)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var Ctor = emnapiCtx.handleStore.get(constructor).value;\n if (typeof Ctor !== 'function')\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var ret = void 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (emnapiCtx.feature.supportReflect) {\n var argList = Array(argc);\n for (i = 0; i < argc; i++) {\n var argVal = HEAP_DATA_VIEW.getUint32(argv + i * 4, true);\n argList[i] = emnapiCtx.handleStore.get(argVal).value;\n }\n ret = Reflect.construct(Ctor, argList, Ctor);\n }\n else {\n var args = Array(argc + 1);\n args[0] = undefined;\n for (i = 0; i < argc; i++) {\n var argVal = HEAP_DATA_VIEW.getUint32(argv + i * 4, true);\n args[i + 1] = emnapiCtx.handleStore.get(argVal).value;\n }\n var BoundCtor = Ctor.bind.apply(Ctor, args);\n ret = new BoundCtor();\n }\n if (result) {\n v = envObject.ensureHandleId(ret);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n }\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_get_new_target(env, cbinfo, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!cbinfo)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n var cbinfoValue = emnapiCtx.scopeStore.get(cbinfo).callbackInfo;\n var thiz = cbinfoValue.thiz, fn = cbinfoValue.fn;\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain, @typescript-eslint/no-unused-vars\n var value = thiz == null || thiz.constructor == null\n ? 0\n : thiz instanceof fn\n ? envObject.ensureHandleId(thiz.constructor)\n : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n var functionMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n _emnapi_create_function: _emnapi_create_function,\n napi_call_function: napi_call_function,\n napi_create_function: napi_create_function,\n napi_get_cb_info: napi_get_cb_info,\n napi_get_new_target: napi_get_new_target,\n napi_new_instance: napi_new_instance\n });\n /** @__sig ipp */\n function napi_open_handle_scope(env, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var scope = emnapiCtx.openScope(envObject);\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, scope.id, true);\n return envObject.clearLastError();\n }\n /** @__sig ipp */\n function napi_close_handle_scope(env, scope) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!scope)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if ((envObject.openHandleScopes === 0)) {\n return 13 /* napi_status.napi_handle_scope_mismatch */;\n }\n emnapiCtx.closeScope(envObject);\n return envObject.clearLastError();\n }\n /** @__sig ipp */\n function napi_open_escapable_handle_scope(env, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var scope = emnapiCtx.openScope(envObject);\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, scope.id, true);\n return envObject.clearLastError();\n }\n /** @__sig ipp */\n function napi_close_escapable_handle_scope(env, scope) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!scope)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if ((envObject.openHandleScopes === 0)) {\n return 13 /* napi_status.napi_handle_scope_mismatch */;\n }\n emnapiCtx.closeScope(envObject);\n return envObject.clearLastError();\n }\n /** @__sig ipppp */\n function napi_escape_handle(env, scope, escapee, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!scope)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!escapee)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var scopeObject = emnapiCtx.scopeStore.get(scope);\n if (!scopeObject.escapeCalled()) {\n escapee >>>= 0;\n result >>>= 0;\n var newHandle = scopeObject.escape(escapee);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = newHandle ? newHandle.id : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.clearLastError();\n }\n return envObject.setLastError(12 /* napi_status.napi_escape_called_twice */);\n }\n /** @__sig ippip */\n function napi_create_reference(env, value, initial_refcount, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (envObject.moduleApiVersion < 10) {\n if (!(handle.isObject() || handle.isFunction() || handle.isSymbol())) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var ref = emnapiCtx.createReference(envObject, handle.id, initial_refcount >>> 0, 1 /* ReferenceOwnership.kUserland */);\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, ref.id, true);\n return envObject.clearLastError();\n }\n /** @__sig ipp */\n function napi_delete_reference(env, ref) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!ref)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n emnapiCtx.refStore.get(ref).dispose();\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_reference_ref(env, ref, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!ref)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var count = emnapiCtx.refStore.get(ref).ref();\n if (result) {\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, count, true);\n }\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_reference_unref(env, ref, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!ref)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var reference = emnapiCtx.refStore.get(ref);\n var refcount = reference.refcount();\n if (refcount === 0) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var count = reference.unref();\n if (result) {\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, count, true);\n }\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_get_reference_value(env, ref, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!ref)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var reference = emnapiCtx.refStore.get(ref);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var handleId = reference.get(envObject);\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, handleId, true);\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_add_env_cleanup_hook(env, fun, arg) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!fun)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n fun >>>= 0;\n arg >>>= 0;\n emnapiCtx.addCleanupHook(envObject, fun, arg);\n return 0 /* napi_status.napi_ok */;\n }\n /** @__sig ippp */\n function napi_remove_env_cleanup_hook(env, fun, arg) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!fun)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n fun >>>= 0;\n arg >>>= 0;\n emnapiCtx.removeCleanupHook(envObject, fun, arg);\n return 0 /* napi_status.napi_ok */;\n }\n /** @__sig vp */\n function _emnapi_env_ref(env) {\n var envObject = emnapiCtx.envStore.get(env);\n envObject.ref();\n }\n /** @__sig vp */\n function _emnapi_env_unref(env) {\n var envObject = emnapiCtx.envStore.get(env);\n envObject.unref();\n }\n var lifeMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n _emnapi_env_ref: _emnapi_env_ref,\n _emnapi_env_unref: _emnapi_env_unref,\n napi_add_env_cleanup_hook: napi_add_env_cleanup_hook,\n napi_close_escapable_handle_scope: napi_close_escapable_handle_scope,\n napi_close_handle_scope: napi_close_handle_scope,\n napi_create_reference: napi_create_reference,\n napi_delete_reference: napi_delete_reference,\n napi_escape_handle: napi_escape_handle,\n napi_get_reference_value: napi_get_reference_value,\n napi_open_escapable_handle_scope: napi_open_escapable_handle_scope,\n napi_open_handle_scope: napi_open_handle_scope,\n napi_reference_ref: napi_reference_ref,\n napi_reference_unref: napi_reference_unref,\n napi_remove_env_cleanup_hook: napi_remove_env_cleanup_hook\n });\n /** @__sig ippi */\n function _emnapi_get_filename(env, buf, len) {\n var envObject = emnapiCtx.envStore.get(env);\n var filename = envObject.filename;\n if (!buf) {\n return emnapiString.lengthBytesUTF8(filename);\n }\n return emnapiString.stringToUTF8(filename, buf, len);\n }\n var miscellaneousMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n _emnapi_get_filename: _emnapi_get_filename\n });\n /** @__sig ippp */\n function napi_create_promise(env, deferred, promise) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var deferredObjectId, value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!deferred)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!promise)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n var p = new Promise(function (resolve, reject) {\n var deferredObject = emnapiCtx.createDeferred({ resolve: resolve, reject: reject });\n deferredObjectId = deferredObject.id;\n deferred >>>= 0;\n HEAP_DATA_VIEW.setUint32(deferred, deferredObjectId, true);\n });\n promise >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n value = emnapiCtx.addToCurrentScope(p).id;\n HEAP_DATA_VIEW.setUint32(promise, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_resolve_deferred(env, deferred, resolution) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!deferred)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!resolution)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var deferredObject = emnapiCtx.deferredStore.get(deferred);\n deferredObject.resolve(emnapiCtx.handleStore.get(resolution).value);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_reject_deferred(env, deferred, resolution) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!deferred)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!resolution)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var deferredObject = emnapiCtx.deferredStore.get(deferred);\n deferredObject.reject(emnapiCtx.handleStore.get(resolution).value);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_is_promise(env, value, is_promise) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!is_promise)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(value);\n is_promise >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = h.isPromise() ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(is_promise, r, true);\n return envObject.clearLastError();\n }\n var promiseMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_create_promise: napi_create_promise,\n napi_is_promise: napi_is_promise,\n napi_reject_deferred: napi_reject_deferred,\n napi_resolve_deferred: napi_resolve_deferred\n });\n /** @__sig ippiiip */\n function napi_get_all_property_names(env, object, key_mode, key_filter, key_conversion, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (h.value == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var obj = void 0;\n try {\n obj = h.isObject() || h.isFunction() ? h.value : Object(h.value);\n }\n catch (_) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n if (key_mode !== 0 /* napi_key_collection_mode.napi_key_include_prototypes */ && key_mode !== 1 /* napi_key_collection_mode.napi_key_own_only */) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n if (key_conversion !== 0 /* napi_key_conversion.napi_key_keep_numbers */ && key_conversion !== 1 /* napi_key_conversion.napi_key_numbers_to_strings */) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var props = [];\n var names = void 0;\n var symbols = void 0;\n var i = void 0;\n var own = true;\n var integerIndiceRegex = /^(0|[1-9][0-9]*)$/;\n do {\n names = Object.getOwnPropertyNames(obj);\n symbols = Object.getOwnPropertySymbols(obj);\n for (i = 0; i < names.length; i++) {\n props.push({\n name: integerIndiceRegex.test(names[i]) ? Number(names[i]) : names[i],\n desc: Object.getOwnPropertyDescriptor(obj, names[i]),\n own: own\n });\n }\n for (i = 0; i < symbols.length; i++) {\n props.push({\n name: symbols[i],\n desc: Object.getOwnPropertyDescriptor(obj, symbols[i]),\n own: own\n });\n }\n if (key_mode === 1 /* napi_key_collection_mode.napi_key_own_only */) {\n break;\n }\n obj = Object.getPrototypeOf(obj);\n own = false;\n } while (obj);\n var ret = [];\n var addName = function (ret, name, key_filter, conversion_mode) {\n if (ret.indexOf(name) !== -1)\n return;\n if (conversion_mode === 0 /* napi_key_conversion.napi_key_keep_numbers */) {\n ret.push(name);\n }\n else if (conversion_mode === 1 /* napi_key_conversion.napi_key_numbers_to_strings */) {\n var realName = typeof name === 'number' ? String(name) : name;\n if (typeof realName === 'string') {\n if (!(key_filter & 8 /* napi_key_filter.napi_key_skip_strings */)) {\n ret.push(realName);\n }\n }\n else {\n ret.push(realName);\n }\n }\n };\n for (i = 0; i < props.length; i++) {\n var prop = props[i];\n var name_1 = prop.name;\n var desc = prop.desc;\n if (key_filter === 0 /* napi_key_filter.napi_key_all_properties */) {\n addName(ret, name_1, key_filter, key_conversion);\n }\n else {\n if (key_filter & 8 /* napi_key_filter.napi_key_skip_strings */ && typeof name_1 === 'string') {\n continue;\n }\n if (key_filter & 16 /* napi_key_filter.napi_key_skip_symbols */ && typeof name_1 === 'symbol') {\n continue;\n }\n var shouldAdd = true;\n switch (key_filter & 7) {\n case 1 /* napi_key_filter.napi_key_writable */: {\n shouldAdd = Boolean(desc.writable);\n break;\n }\n case 2 /* napi_key_filter.napi_key_enumerable */: {\n shouldAdd = Boolean(desc.enumerable);\n break;\n }\n case (1 /* napi_key_filter.napi_key_writable */ | 2 /* napi_key_filter.napi_key_enumerable */): {\n shouldAdd = Boolean(desc.writable && desc.enumerable);\n break;\n }\n case 4 /* napi_key_filter.napi_key_configurable */: {\n shouldAdd = Boolean(desc.configurable);\n break;\n }\n case (4 /* napi_key_filter.napi_key_configurable */ | 1 /* napi_key_filter.napi_key_writable */): {\n shouldAdd = Boolean(desc.configurable && desc.writable);\n break;\n }\n case (4 /* napi_key_filter.napi_key_configurable */ | 2 /* napi_key_filter.napi_key_enumerable */): {\n shouldAdd = Boolean(desc.configurable && desc.enumerable);\n break;\n }\n case (4 /* napi_key_filter.napi_key_configurable */ | 2 /* napi_key_filter.napi_key_enumerable */ | 1 /* napi_key_filter.napi_key_writable */): {\n shouldAdd = Boolean(desc.configurable && desc.enumerable && desc.writable);\n break;\n }\n }\n if (shouldAdd) {\n addName(ret, name_1, key_filter, key_conversion);\n }\n }\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n value = emnapiCtx.addToCurrentScope(ret).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_get_property_names(env, object, result) {\n return napi_get_all_property_names(env, object, 0 /* napi_key_collection_mode.napi_key_include_prototypes */, 2 /* napi_key_filter.napi_key_enumerable */ | 16 /* napi_key_filter.napi_key_skip_symbols */, 1 /* napi_key_conversion.napi_key_numbers_to_strings */, result);\n }\n /** @__sig ipppp */\n function napi_set_property(env, object, key, value) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!key)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (!(h.isObject() || h.isFunction())) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n h.value[emnapiCtx.handleStore.get(key).value] = emnapiCtx.handleStore.get(value).value;\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipppp */\n function napi_has_property(env, object, key, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!key)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (h.value == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var v = void 0;\n try {\n v = h.isObject() || h.isFunction() ? h.value : Object(h.value);\n }\n catch (_) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n result >>>= 0;\n r = (emnapiCtx.handleStore.get(key).value in v) ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipppp */\n function napi_get_property(env, object, key, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!key)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (h.value == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var v = void 0;\n try {\n v = h.isObject() || h.isFunction() ? h.value : Object(h.value);\n }\n catch (_) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n value = envObject.ensureHandleId(v[emnapiCtx.handleStore.get(key).value]);\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipppp */\n function napi_delete_property(env, object, key, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!key)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (!(h.isObject() || h.isFunction())) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n var propertyKey = emnapiCtx.handleStore.get(key).value;\n if (emnapiCtx.feature.supportReflect) {\n r = Reflect.deleteProperty(h.value, propertyKey);\n }\n else {\n try {\n r = delete h.value[propertyKey];\n }\n catch (_) {\n r = false;\n }\n }\n if (result) {\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true);\n }\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipppp */\n function napi_has_own_property(env, object, key, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!key)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (h.value == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var v = void 0;\n try {\n v = h.isObject() || h.isFunction() ? h.value : Object(h.value);\n }\n catch (_) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n var prop = emnapiCtx.handleStore.get(key).value;\n if (typeof prop !== 'string' && typeof prop !== 'symbol') {\n return envObject.setLastError(4 /* napi_status.napi_name_expected */);\n }\n r = Object.prototype.hasOwnProperty.call(v, emnapiCtx.handleStore.get(key).value);\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipppp */\n function napi_set_named_property(env, object, cname, value) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (!(h.isObject() || h.isFunction())) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n if (!cname) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n cname >>>= 0;\n emnapiCtx.handleStore.get(object).value[emnapiString.UTF8ToString(cname, -1)] = emnapiCtx.handleStore.get(value).value;\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipppp */\n function napi_has_named_property(env, object, utf8name, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!utf8name) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var h = emnapiCtx.handleStore.get(object);\n if (h.value == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var v = void 0;\n try {\n v = h.isObject() || h.isFunction() ? h.value : Object(h.value);\n }\n catch (_) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n utf8name >>>= 0;\n result >>>= 0;\n r = emnapiString.UTF8ToString(utf8name, -1) in v;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipppp */\n function napi_get_named_property(env, object, utf8name, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!utf8name) {\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var h = emnapiCtx.handleStore.get(object);\n if (h.value == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var v = void 0;\n try {\n v = h.isObject() || h.isFunction() ? h.value : Object(h.value);\n }\n catch (_) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n utf8name >>>= 0;\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n value = envObject.ensureHandleId(v[emnapiString.UTF8ToString(utf8name, -1)]);\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippip */\n function napi_set_element(env, object, index, value) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (!(h.isObject() || h.isFunction())) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n h.value[index >>> 0] = emnapiCtx.handleStore.get(value).value;\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippip */\n function napi_has_element(env, object, index, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (h.value == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var v = void 0;\n try {\n v = h.isObject() || h.isFunction() ? h.value : Object(h.value);\n }\n catch (_) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n result >>>= 0;\n r = ((index >>> 0) in v) ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippip */\n function napi_get_element(env, object, index, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (h.value == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var v = void 0;\n try {\n v = h.isObject() || h.isFunction() ? h.value : Object(h.value);\n }\n catch (_) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n value = envObject.ensureHandleId(v[index >>> 0]);\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippip */\n function napi_delete_element(env, object, index, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n if (!(h.isObject() || h.isFunction())) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n if (emnapiCtx.feature.supportReflect) {\n r = Reflect.deleteProperty(h.value, index >>> 0);\n }\n else {\n try {\n r = delete h.value[index >>> 0];\n }\n catch (_) {\n r = false;\n }\n }\n if (result) {\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true);\n }\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipppp */\n function napi_define_properties(env, object, property_count, properties) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var propPtr, attributes;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n properties >>>= 0;\n property_count >>>= 0;\n property_count = property_count >>> 0;\n if (property_count > 0) {\n if (!properties)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n var maybeObject = h.value;\n if (!(h.isObject() || h.isFunction())) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n var propertyName = void 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n for (var i = 0; i < property_count; i++) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n propPtr = properties + (i * (4 * 8));\n var utf8Name = HEAP_DATA_VIEW.getUint32(propPtr, true);\n var name_2 = HEAP_DATA_VIEW.getUint32(propPtr + 4, true);\n var method = HEAP_DATA_VIEW.getUint32(propPtr + 8, true);\n var getter = HEAP_DATA_VIEW.getUint32(propPtr + 12, true);\n var setter = HEAP_DATA_VIEW.getUint32(propPtr + 16, true);\n var value = HEAP_DATA_VIEW.getUint32(propPtr + 20, true);\n attributes = HEAP_DATA_VIEW.getInt32(propPtr + 24, true);\n attributes >>>= 0;\n var data = HEAP_DATA_VIEW.getUint32(propPtr + 28, true);\n if (utf8Name) {\n propertyName = emnapiString.UTF8ToString(utf8Name, -1);\n }\n else {\n if (!name_2) {\n return envObject.setLastError(4 /* napi_status.napi_name_expected */);\n }\n propertyName = emnapiCtx.handleStore.get(name_2).value;\n if (typeof propertyName !== 'string' && typeof propertyName !== 'symbol') {\n return envObject.setLastError(4 /* napi_status.napi_name_expected */);\n }\n }\n emnapiDefineProperty(envObject, maybeObject, propertyName, method, getter, setter, value, attributes, data);\n }\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipp */\n function napi_object_freeze(env, object) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n var maybeObject = h.value;\n if (!(h.isObject() || h.isFunction())) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n Object.freeze(maybeObject);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipp */\n function napi_object_seal(env, object) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(object);\n var maybeObject = h.value;\n if (!(h.isObject() || h.isFunction())) {\n return envObject.setLastError(2 /* napi_status.napi_object_expected */);\n }\n Object.seal(maybeObject);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n var propertyMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_define_properties: napi_define_properties,\n napi_delete_element: napi_delete_element,\n napi_delete_property: napi_delete_property,\n napi_get_all_property_names: napi_get_all_property_names,\n napi_get_element: napi_get_element,\n napi_get_named_property: napi_get_named_property,\n napi_get_property: napi_get_property,\n napi_get_property_names: napi_get_property_names,\n napi_has_element: napi_has_element,\n napi_has_named_property: napi_has_named_property,\n napi_has_own_property: napi_has_own_property,\n napi_has_property: napi_has_property,\n napi_object_freeze: napi_object_freeze,\n napi_object_seal: napi_object_seal,\n napi_set_element: napi_set_element,\n napi_set_named_property: napi_set_named_property,\n napi_set_property: napi_set_property\n });\n /** @__sig ippp */\n function napi_run_script(env, script, result) {\n var status;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!script)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var v8Script = emnapiCtx.handleStore.get(script);\n if (!v8Script.isString()) {\n return envObject.setLastError(3 /* napi_status.napi_string_expected */);\n }\n var g = emnapiCtx.handleStore.get(5 /* GlobalHandle.GLOBAL */).value;\n var ret = g.eval(v8Script.value);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n value = envObject.ensureHandleId(ret);\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, value, true);\n status = envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n return status;\n }\n var scriptMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_run_script: napi_run_script\n });\n /** @__sig ippp */\n function napi_typeof(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var v = emnapiCtx.handleStore.get(value);\n result >>>= 0;\n var r;\n if (v.isNumber()) {\n r = 3 /* napi_valuetype.napi_number */;\n }\n else if (v.isBigInt()) {\n r = 9 /* napi_valuetype.napi_bigint */;\n }\n else if (v.isString()) {\n r = 4 /* napi_valuetype.napi_string */;\n }\n else if (v.isFunction()) {\n // This test has to come before IsObject because IsFunction\n // implies IsObject\n r = 7 /* napi_valuetype.napi_function */;\n }\n else if (v.isExternal()) {\n // This test has to come before IsObject because IsExternal\n // implies IsObject\n r = 8 /* napi_valuetype.napi_external */;\n }\n else if (v.isObject()) {\n r = 6 /* napi_valuetype.napi_object */;\n }\n else if (v.isBoolean()) {\n r = 2 /* napi_valuetype.napi_boolean */;\n }\n else if (v.isUndefined()) {\n r = 0 /* napi_valuetype.napi_undefined */;\n }\n else if (v.isSymbol()) {\n r = 5 /* napi_valuetype.napi_symbol */;\n }\n else if (v.isNull()) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n r = 1 /* napi_valuetype.napi_null */;\n }\n else {\n // Should not get here unless V8 has added some new kind of value.\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n }\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt32(result, r, true);\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_coerce_to_bool(env, value, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n result >>>= 0;\n v = handle.value ? 4 /* GlobalHandle.TRUE */ : 3 /* GlobalHandle.FALSE */;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_coerce_to_number(env, value, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (handle.isBigInt()) {\n throw new TypeError('Cannot convert a BigInt value to a number');\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n v = emnapiCtx.addToCurrentScope(Number(handle.value)).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_coerce_to_object(env, value, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (handle.value == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n v = envObject.ensureHandleId(Object(handle.value));\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_coerce_to_string(env, value, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var v;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var handle = emnapiCtx.handleStore.get(value);\n if (handle.isSymbol()) {\n throw new TypeError('Cannot convert a Symbol value to a string');\n }\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n v = emnapiCtx.addToCurrentScope(String(handle.value)).id;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, v, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipppp */\n function napi_instanceof(env, object, constructor, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!object)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!constructor)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, 0, true);\n var ctor = emnapiCtx.handleStore.get(constructor);\n if (!ctor.isFunction()) {\n return envObject.setLastError(5 /* napi_status.napi_function_expected */);\n }\n var val = emnapiCtx.handleStore.get(object).value;\n var ret = val instanceof ctor.value;\n r = ret ? 1 : 0;\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ippp */\n function napi_is_array(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(value);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = h.isArray() ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_is_arraybuffer(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(value);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = h.isArrayBuffer() ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function node_api_is_sharedarraybuffer(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(value);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = ((typeof SharedArrayBuffer === 'function' && h.value instanceof SharedArrayBuffer) ||\n (Object.prototype.toString.call(h.value) === '[object SharedArrayBuffer]'))\n ? 1\n : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_is_date(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(value);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = h.isDate() ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_is_error(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var val = emnapiCtx.handleStore.get(value).value;\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = (val instanceof Error) ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_is_typedarray(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(value);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = h.isTypedArray() ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_is_buffer(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(value);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = h.isBuffer(emnapiCtx.feature.Buffer) ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_is_dataview(env, value, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!value)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(value);\n result >>>= 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r = h.isDataView() ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.clearLastError();\n }\n /** @__sig ipppp */\n function napi_strict_equals(env, lhs, rhs, result) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var r;\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!lhs)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!rhs)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var lv = emnapiCtx.handleStore.get(lhs).value;\n var rv = emnapiCtx.handleStore.get(rhs).value;\n result >>>= 0;\n r = (lv === rv) ? 1 : 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setInt8(result, r, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n /** @__sig ipp */\n function napi_detach_arraybuffer(env, arraybuffer) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!arraybuffer)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var value = emnapiCtx.handleStore.get(arraybuffer).value;\n if (!(value instanceof ArrayBuffer)) {\n if (typeof SharedArrayBuffer === 'function' && (value instanceof SharedArrayBuffer)) {\n return envObject.setLastError(20 /* napi_status.napi_detachable_arraybuffer_expected */);\n }\n return envObject.setLastError(19 /* napi_status.napi_arraybuffer_expected */);\n }\n try {\n var MessageChannel_1 = emnapiCtx.feature.MessageChannel;\n var messageChannel = new MessageChannel_1();\n messageChannel.port1.postMessage(value, [value]);\n }\n catch (_) {\n return envObject.setLastError(9 /* napi_status.napi_generic_failure */);\n }\n return envObject.clearLastError();\n }\n /** @__sig ippp */\n function napi_is_detached_arraybuffer(env, arraybuffer, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n // @ts-expect-error\n var envObject = emnapiCtx.envStore.get(env);\n envObject.checkGCAccess();\n if (!envObject.tryCatch.isEmpty())\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n if (!envObject.canCallIntoJs())\n return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);\n envObject.clearLastError();\n try {\n if (!arraybuffer)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n var h = emnapiCtx.handleStore.get(arraybuffer);\n result >>>= 0;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n if (h.isArrayBuffer() && h.value.byteLength === 0) {\n try {\n // eslint-disable-next-line no-new\n new Uint8Array(h.value);\n }\n catch (_) {\n HEAP_DATA_VIEW.setInt8(result, 1, true);\n return envObject.getReturnStatus();\n }\n }\n HEAP_DATA_VIEW.setInt8(result, 0, true);\n return envObject.getReturnStatus();\n }\n catch (err) {\n envObject.tryCatch.setError(err);\n return envObject.setLastError(10 /* napi_status.napi_pending_exception */);\n }\n }\n var valueOperationMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_coerce_to_bool: napi_coerce_to_bool,\n napi_coerce_to_number: napi_coerce_to_number,\n napi_coerce_to_object: napi_coerce_to_object,\n napi_coerce_to_string: napi_coerce_to_string,\n napi_detach_arraybuffer: napi_detach_arraybuffer,\n napi_instanceof: napi_instanceof,\n napi_is_array: napi_is_array,\n napi_is_arraybuffer: napi_is_arraybuffer,\n napi_is_buffer: napi_is_buffer,\n napi_is_dataview: napi_is_dataview,\n napi_is_date: napi_is_date,\n napi_is_detached_arraybuffer: napi_is_detached_arraybuffer,\n napi_is_error: napi_is_error,\n napi_is_typedarray: napi_is_typedarray,\n napi_strict_equals: napi_strict_equals,\n napi_typeof: napi_typeof,\n node_api_is_sharedarraybuffer: node_api_is_sharedarraybuffer\n });\n /** @__sig ipp */\n function napi_get_version(env, result) {\n if (!env)\n return 1 /* napi_status.napi_invalid_arg */;\n var envObject = emnapiCtx.envStore.get(env);\n if (!result)\n return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var NODE_API_SUPPORTED_VERSION_MAX = 10 /* Version.NODE_API_SUPPORTED_VERSION_MAX */;\n var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);\n HEAP_DATA_VIEW.setUint32(result, NODE_API_SUPPORTED_VERSION_MAX, true);\n return envObject.clearLastError();\n }\n var versionMod = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n napi_get_version: napi_get_version\n });\n emnapiAWST.init();\n emnapiExternalMemory.init();\n emnapiString.init();\n emnapiTSFN.init();\n PThread.init();\n napiModule.emnapi.syncMemory = $emnapiSyncMemory;\n napiModule.emnapi.getMemoryAddress = $emnapiGetMemoryAddress;\n function addImports(mod) {\n var keys = Object.keys(mod);\n for (var i = 0; i < keys.length; ++i) {\n var k = keys[i];\n if (k.indexOf('$') === 0)\n continue;\n if (k.indexOf('emnapi_') === 0) {\n napiModule.imports.emnapi[k] = mod[k];\n }\n else if (k.indexOf('_emnapi_') === 0 || k === 'napi_set_last_error' || k === 'napi_clear_last_error') {\n napiModule.imports.env[k] = mod[k];\n }\n else {\n napiModule.imports.napi[k] = mod[k];\n }\n }\n }\n addImports(asyncMod);\n addImports(memoryMod);\n addImports(asyncWorkMod);\n addImports(utilMod);\n addImports(convert2cMod);\n addImports(convert2napiMod);\n addImports(createMod);\n addImports(globalMod);\n addImports(wrapMod);\n addImports(envMod);\n addImports(emnapiMod);\n addImports(errorMod);\n addImports(functionMod);\n addImports(lifeMod);\n addImports(miscellaneousMod);\n addImports(nodeMod);\n addImports(promiseMod);\n addImports(propertyMod);\n addImports(scriptMod);\n addImports(valueOperationMod);\n addImports(versionMod);\n napiModule.imports.napi.napi_create_threadsafe_function = napi_create_threadsafe_function;\n napiModule.imports.napi.napi_get_threadsafe_function_context = napi_get_threadsafe_function_context;\n napiModule.imports.napi.napi_call_threadsafe_function = napi_call_threadsafe_function;\n napiModule.imports.napi.napi_acquire_threadsafe_function = napi_acquire_threadsafe_function;\n napiModule.imports.napi.napi_release_threadsafe_function = napi_release_threadsafe_function;\n napiModule.imports.napi.napi_unref_threadsafe_function = napi_unref_threadsafe_function;\n napiModule.imports.napi.napi_ref_threadsafe_function = napi_ref_threadsafe_function;\n return napiModule;\n })();\n return napiModule;\n}\n\nfunction loadNapiModuleImpl(loadFn, userNapiModule, wasmInput, options) {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n options = options !== null && options !== void 0 ? options : {};\n var getMemory = options.getMemory;\n var getTable = options.getTable;\n var beforeInit = options.beforeInit;\n if (getMemory != null && typeof getMemory !== 'function') {\n throw new TypeError('options.getMemory is not a function');\n }\n if (getTable != null && typeof getTable !== 'function') {\n throw new TypeError('options.getTable is not a function');\n }\n if (beforeInit != null && typeof beforeInit !== 'function') {\n throw new TypeError('options.beforeInit is not a function');\n }\n var napiModule;\n var isLoad = typeof userNapiModule === 'object' && userNapiModule !== null;\n if (isLoad) {\n if (userNapiModule.loaded) {\n throw new Error('napiModule has already loaded');\n }\n napiModule = userNapiModule;\n }\n else {\n napiModule = createNapiModule(options);\n }\n var wasi = options.wasi;\n var wasiThreads;\n var importObject = {\n env: napiModule.imports.env,\n napi: napiModule.imports.napi,\n emnapi: napiModule.imports.emnapi\n };\n if (wasi) {\n wasiThreads = new WASIThreads(napiModule.childThread\n ? {\n wasi: wasi,\n childThread: true,\n postMessage: napiModule.postMessage\n }\n : {\n wasi: wasi,\n threadManager: napiModule.PThread,\n waitThreadStart: napiModule.waitThreadStart\n });\n Object.assign(importObject, typeof wasi.getImportObject === 'function'\n ? wasi.getImportObject()\n : { wasi_snapshot_preview1: wasi.wasiImport });\n Object.assign(importObject, wasiThreads.getImportObject());\n }\n var overwriteImports = options.overwriteImports;\n if (typeof overwriteImports === 'function') {\n var newImportObject = overwriteImports(importObject);\n if (typeof newImportObject === 'object' && newImportObject !== null) {\n importObject = newImportObject;\n }\n }\n return loadFn(wasmInput, importObject, function (err, source) {\n if (err) {\n throw err;\n }\n var originalInstance = source.instance;\n var instance = originalInstance;\n var originalExports = originalInstance.exports;\n var exportMemory = 'memory' in originalExports;\n var importMemory = 'memory' in importObject.env;\n var memory = getMemory\n ? getMemory(originalExports)\n : exportMemory\n ? originalExports.memory\n : importMemory\n ? importObject.env.memory\n : undefined;\n if (!memory) {\n throw new Error('memory is neither exported nor imported');\n }\n var table = getTable ? getTable(originalExports) : originalExports.__indirect_function_table;\n if (wasi && !exportMemory) {\n var exports_1 = Object.create(null);\n Object.assign(exports_1, originalExports, { memory: memory });\n instance = { exports: exports_1 };\n }\n var module = source.module;\n if (wasi) {\n instance = wasiThreads.initialize(instance, module, memory);\n }\n else {\n napiModule.PThread.setup(module, memory);\n }\n var emnapiInit = function () {\n if (beforeInit) {\n beforeInit({\n instance: originalInstance,\n module: module\n });\n }\n napiModule.init({\n instance: instance,\n module: module,\n memory: memory,\n table: table\n });\n var ret = {\n instance: originalInstance,\n module: module,\n usedInstance: instance\n };\n if (!isLoad) {\n ret.napiModule = napiModule;\n }\n return ret;\n };\n if (napiModule.PThread.shouldPreloadWorkers()) {\n var poolReady = napiModule.PThread.loadWasmModuleToAllWorkers();\n if (loadFn === loadCallback) {\n return poolReady.then(emnapiInit);\n }\n else {\n throw new Error('Synchronous loading is not supported with worker pool (reuseWorker.size > 0)');\n }\n }\n return emnapiInit();\n });\n}\nfunction loadCallback(wasmInput, importObject, callback) {\n return load(wasmInput, importObject).then(function (source) {\n return callback(null, source);\n }, function (err) {\n return callback(err);\n });\n}\nfunction loadSyncCallback(wasmInput, importObject, callback) {\n var source;\n try {\n source = loadSync(wasmInput, importObject);\n }\n catch (err) {\n return callback(err);\n }\n return callback(null, source);\n}\n/** @public */\nfunction loadNapiModule(napiModule, \n/** Only support `BufferSource` or `WebAssembly.Module` on Node.js */\nwasmInput, options) {\n if (typeof napiModule !== 'object' || napiModule === null) {\n throw new TypeError('Invalid napiModule');\n }\n return loadNapiModuleImpl(loadCallback, napiModule, wasmInput, options);\n}\n/** @public */\nfunction loadNapiModuleSync(napiModule, wasmInput, options) {\n if (typeof napiModule !== 'object' || napiModule === null) {\n throw new TypeError('Invalid napiModule');\n }\n return loadNapiModuleImpl(loadSyncCallback, napiModule, wasmInput, options);\n}\n/** @public */\nfunction instantiateNapiModule(\n/** Only support `BufferSource` or `WebAssembly.Module` on Node.js */\nwasmInput, options) {\n return loadNapiModuleImpl(loadCallback, undefined, wasmInput, options);\n}\n/** @public */\nfunction instantiateNapiModuleSync(wasmInput, options) {\n return loadNapiModuleImpl(loadSyncCallback, undefined, wasmInput, options);\n}\n\n/** @public */\nvar MessageHandler = /*#__PURE__*/ (function (_super) {\n __extends(MessageHandler, _super);\n function MessageHandler(options) {\n var _this = this;\n if (typeof options.onLoad !== 'function') {\n throw new TypeError('options.onLoad is not a function');\n }\n var userOnError = options.onError;\n _this = _super.call(this, __assign(__assign({}, options), { onError: function (err, type) {\n var _a;\n var emnapi_thread_crashed = (_a = _this.instance) === null || _a === void 0 ? void 0 : _a.exports.emnapi_thread_crashed;\n if (typeof emnapi_thread_crashed === 'function') {\n emnapi_thread_crashed();\n } /* else {\n tryWakeUpPthreadJoin(this.instance!)\n } */\n if (typeof userOnError === 'function') {\n userOnError(err, type);\n }\n else {\n throw err;\n }\n } })) || this;\n _this.napiModule = undefined;\n return _this;\n }\n MessageHandler.prototype.instantiate = function (data) {\n var _this = this;\n var source = this.onLoad(data);\n var then = source.then;\n if (typeof then === 'function') {\n return source.then(function (result) {\n _this.napiModule = result.napiModule;\n return result;\n });\n }\n this.napiModule = source.napiModule;\n return source;\n };\n MessageHandler.prototype.handle = function (e) {\n var _this = this;\n var _a;\n _super.prototype.handle.call(this, e);\n if ((_a = e === null || e === void 0 ? void 0 : e.data) === null || _a === void 0 ? void 0 : _a.__emnapi__) {\n var type = e.data.__emnapi__.type;\n var payload_1 = e.data.__emnapi__.payload;\n try {\n if (type === 'async-worker-init') {\n this.handleAfterLoad(e, function () {\n _this.napiModule.initWorker(payload_1.arg, payload_1.func);\n });\n }\n }\n catch (err) {\n this.onError(err, type);\n }\n }\n };\n return MessageHandler;\n}(ThreadMessageHandler));\n// function tryWakeUpPthreadJoin (instance: WebAssembly.Instance): void {\n// // https://github.com/WebAssembly/wasi-libc/blob/574b88da481569b65a237cb80daf9a2d5aeaf82d/libc-top-half/musl/src/thread/pthread_join.c#L18-L21\n// const pthread_self = instance.exports.pthread_self as () => number\n// const memory = instance.exports.memory as WebAssembly.Memory\n// if (typeof pthread_self === 'function') {\n// const selfThread = pthread_self()\n// if (selfThread && memory) {\n// // https://github.com/WebAssembly/wasi-libc/blob/574b88da481569b65a237cb80daf9a2d5aeaf82d/libc-top-half/musl/src/internal/pthread_impl.h#L45\n// const detatchState = new Int32Array(memory.buffer, selfThread + 7 * 4 /** detach_state */, 1)\n// Atomics.store(detatchState, 0, 0)\n// Atomics.notify(detatchState, 0, Infinity)\n// }\n// }\n// }\n\nvar version = \"1.10.0\";\n\nexport { MessageHandler, createNapiModule, instantiateNapiModule, instantiateNapiModuleSync, loadNapiModule, loadNapiModuleSync, version };\n","import { __extends } from 'tslib';\n\nvar externalValue = new WeakMap();\n/** @public */\nfunction isExternal(object) {\n return externalValue.has(object);\n}\n/** @public */ // eslint-disable-next-line @typescript-eslint/no-redeclare\nvar External = (function () {\n function External(value) {\n Object.setPrototypeOf(this, null);\n externalValue.set(this, value);\n }\n External.prototype = null;\n return External;\n})();\n/** @public */\nfunction getExternalValue(external) {\n if (!isExternal(external)) {\n throw new TypeError('not external');\n }\n return externalValue.get(external);\n}\n\nvar supportNewFunction = /*#__PURE__*/ (function () {\n var f;\n try {\n f = new Function();\n }\n catch (_) {\n return false;\n }\n return typeof f === 'function';\n})();\nvar _global = /*#__PURE__*/ (function () {\n if (typeof globalThis !== 'undefined')\n return globalThis;\n var g = (function () { return this; })();\n if (!g && supportNewFunction) {\n try {\n g = new Function('return this')();\n }\n catch (_) { }\n }\n if (!g) {\n if (typeof __webpack_public_path__ === 'undefined') {\n if (typeof global !== 'undefined')\n return global;\n }\n if (typeof window !== 'undefined')\n return window;\n if (typeof self !== 'undefined')\n return self;\n }\n return g;\n})();\nvar TryCatch = /*#__PURE__*/ (function () {\n function TryCatch() {\n this._exception = undefined;\n this._caught = false;\n }\n TryCatch.prototype.isEmpty = function () {\n return !this._caught;\n };\n TryCatch.prototype.hasCaught = function () {\n return this._caught;\n };\n TryCatch.prototype.exception = function () {\n return this._exception;\n };\n TryCatch.prototype.setError = function (err) {\n this._caught = true;\n this._exception = err;\n };\n TryCatch.prototype.reset = function () {\n this._caught = false;\n this._exception = undefined;\n };\n TryCatch.prototype.extractException = function () {\n var e = this._exception;\n this.reset();\n return e;\n };\n return TryCatch;\n}());\nvar canSetFunctionName = /*#__PURE__*/ (function () {\n var _a;\n try {\n return Boolean((_a = Object.getOwnPropertyDescriptor(Function.prototype, 'name')) === null || _a === void 0 ? void 0 : _a.configurable);\n }\n catch (_) {\n return false;\n }\n})();\nvar supportReflect = typeof Reflect === 'object';\nvar supportFinalizer = (typeof FinalizationRegistry !== 'undefined') && (typeof WeakRef !== 'undefined');\nvar supportWeakSymbol = /*#__PURE__*/ (function () {\n try {\n // eslint-disable-next-line symbol-description\n var sym = Symbol();\n // eslint-disable-next-line no-new\n new WeakRef(sym);\n new WeakMap().set(sym, undefined);\n }\n catch (_) {\n return false;\n }\n return true;\n})();\nvar supportBigInt = typeof BigInt !== 'undefined';\nfunction isReferenceType(v) {\n return (typeof v === 'object' && v !== null) || typeof v === 'function';\n}\nvar _require = /*#__PURE__*/ (function () {\n var nativeRequire;\n if (typeof __webpack_public_path__ !== 'undefined') {\n nativeRequire = (function () {\n return typeof __non_webpack_require__ !== 'undefined' ? __non_webpack_require__ : undefined;\n })();\n }\n else {\n nativeRequire = (function () {\n return typeof __webpack_public_path__ !== 'undefined' ? (typeof __non_webpack_require__ !== 'undefined' ? __non_webpack_require__ : undefined) : (typeof require !== 'undefined' ? require : undefined);\n })();\n }\n return nativeRequire;\n})();\nvar _MessageChannel = typeof MessageChannel === 'function'\n ? MessageChannel\n : /*#__PURE__*/ (function () {\n try {\n return _require('worker_threads').MessageChannel;\n }\n catch (_) { }\n return undefined;\n })();\nvar _setImmediate = typeof setImmediate === 'function'\n ? setImmediate\n : function (callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('The \"callback\" argument must be of type function');\n }\n if (_MessageChannel) {\n var channel_1 = new _MessageChannel();\n channel_1.port1.onmessage = function () {\n channel_1.port1.onmessage = null;\n channel_1 = undefined;\n callback();\n };\n channel_1.port2.postMessage(null);\n }\n else {\n setTimeout(callback, 0);\n }\n };\nvar _Buffer = typeof Buffer === 'function'\n ? Buffer\n : /*#__PURE__*/ (function () {\n try {\n return _require('buffer').Buffer;\n }\n catch (_) { }\n return undefined;\n })();\nvar version = \"1.10.0\";\nvar NODE_API_SUPPORTED_VERSION_MIN = 1 /* Version.NODE_API_SUPPORTED_VERSION_MIN */;\nvar NODE_API_SUPPORTED_VERSION_MAX = 10 /* Version.NODE_API_SUPPORTED_VERSION_MAX */;\nvar NAPI_VERSION_EXPERIMENTAL = 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */;\nvar NODE_API_DEFAULT_MODULE_API_VERSION = 8 /* Version.NODE_API_DEFAULT_MODULE_API_VERSION */;\n\nvar Handle = /*#__PURE__*/ (function () {\n function Handle(id, value) {\n this.id = id;\n this.value = value;\n }\n Handle.prototype.data = function () {\n return getExternalValue(this.value);\n };\n Handle.prototype.isNumber = function () {\n return typeof this.value === 'number';\n };\n Handle.prototype.isBigInt = function () {\n return typeof this.value === 'bigint';\n };\n Handle.prototype.isString = function () {\n return typeof this.value === 'string';\n };\n Handle.prototype.isFunction = function () {\n return typeof this.value === 'function';\n };\n Handle.prototype.isExternal = function () {\n return isExternal(this.value);\n };\n Handle.prototype.isObject = function () {\n return typeof this.value === 'object' && this.value !== null;\n };\n Handle.prototype.isArray = function () {\n return Array.isArray(this.value);\n };\n Handle.prototype.isArrayBuffer = function () {\n return (this.value instanceof ArrayBuffer);\n };\n Handle.prototype.isTypedArray = function () {\n return (ArrayBuffer.isView(this.value)) && !(this.value instanceof DataView);\n };\n Handle.prototype.isBuffer = function (BufferConstructor) {\n if (ArrayBuffer.isView(this.value))\n return true;\n BufferConstructor !== null && BufferConstructor !== void 0 ? BufferConstructor : (BufferConstructor = _Buffer);\n return typeof BufferConstructor === 'function' && BufferConstructor.isBuffer(this.value);\n };\n Handle.prototype.isDataView = function () {\n return (this.value instanceof DataView);\n };\n Handle.prototype.isDate = function () {\n return (this.value instanceof Date);\n };\n Handle.prototype.isPromise = function () {\n return (this.value instanceof Promise);\n };\n Handle.prototype.isBoolean = function () {\n return typeof this.value === 'boolean';\n };\n Handle.prototype.isUndefined = function () {\n return this.value === undefined;\n };\n Handle.prototype.isSymbol = function () {\n return typeof this.value === 'symbol';\n };\n Handle.prototype.isNull = function () {\n return this.value === null;\n };\n Handle.prototype.dispose = function () {\n this.value = undefined;\n };\n return Handle;\n}());\nvar ConstHandle = /*#__PURE__*/ (function (_super) {\n __extends(ConstHandle, _super);\n function ConstHandle(id, value) {\n return _super.call(this, id, value) || this;\n }\n ConstHandle.prototype.dispose = function () { };\n return ConstHandle;\n}(Handle));\nvar HandleStore = /*#__PURE__*/ (function () {\n function HandleStore() {\n this._values = [\n undefined,\n HandleStore.UNDEFINED,\n HandleStore.NULL,\n HandleStore.FALSE,\n HandleStore.TRUE,\n HandleStore.GLOBAL\n ];\n this._next = HandleStore.MIN_ID;\n }\n HandleStore.prototype.push = function (value) {\n var h;\n var next = this._next;\n var values = this._values;\n if (next < values.length) {\n h = values[next];\n h.value = value;\n }\n else {\n h = new Handle(next, value);\n values[next] = h;\n }\n this._next++;\n return h;\n };\n HandleStore.prototype.erase = function (start, end) {\n this._next = start;\n var values = this._values;\n for (var i = start; i < end; ++i) {\n values[i].dispose();\n }\n };\n HandleStore.prototype.get = function (id) {\n return this._values[id];\n };\n HandleStore.prototype.swap = function (a, b) {\n var values = this._values;\n var h = values[a];\n values[a] = values[b];\n values[a].id = Number(a);\n values[b] = h;\n h.id = Number(b);\n };\n HandleStore.prototype.dispose = function () {\n this._values.length = HandleStore.MIN_ID;\n this._next = HandleStore.MIN_ID;\n };\n HandleStore.UNDEFINED = new ConstHandle(1 /* GlobalHandle.UNDEFINED */, undefined);\n HandleStore.NULL = new ConstHandle(2 /* GlobalHandle.NULL */, null);\n HandleStore.FALSE = new ConstHandle(3 /* GlobalHandle.FALSE */, false);\n HandleStore.TRUE = new ConstHandle(4 /* GlobalHandle.TRUE */, true);\n HandleStore.GLOBAL = new ConstHandle(5 /* GlobalHandle.GLOBAL */, _global);\n HandleStore.MIN_ID = 6;\n return HandleStore;\n}());\n\nvar HandleScope = /*#__PURE__*/ (function () {\n function HandleScope(handleStore, id, parentScope, start, end) {\n if (end === void 0) { end = start; }\n this.handleStore = handleStore;\n this.id = id;\n this.parent = parentScope;\n this.child = null;\n if (parentScope !== null)\n parentScope.child = this;\n this.start = start;\n this.end = end;\n this._escapeCalled = false;\n this.callbackInfo = {\n thiz: undefined,\n data: 0,\n args: undefined,\n fn: undefined\n };\n }\n HandleScope.prototype.add = function (value) {\n var h = this.handleStore.push(value);\n this.end++;\n return h;\n };\n HandleScope.prototype.addExternal = function (data) {\n return this.add(new External(data));\n };\n HandleScope.prototype.dispose = function () {\n if (this._escapeCalled)\n this._escapeCalled = false;\n if (this.start === this.end)\n return;\n this.handleStore.erase(this.start, this.end);\n };\n HandleScope.prototype.escape = function (handle) {\n if (this._escapeCalled)\n return null;\n this._escapeCalled = true;\n if (handle < this.start || handle >= this.end) {\n return null;\n }\n this.handleStore.swap(handle, this.start);\n var h = this.handleStore.get(this.start);\n this.start++;\n this.parent.end++;\n return h;\n };\n HandleScope.prototype.escapeCalled = function () {\n return this._escapeCalled;\n };\n return HandleScope;\n}());\n\nvar ScopeStore = /*#__PURE__*/ (function () {\n function ScopeStore() {\n this._rootScope = new HandleScope(null, 0, null, 1, HandleStore.MIN_ID);\n this.currentScope = this._rootScope;\n this._values = [undefined];\n }\n ScopeStore.prototype.get = function (id) {\n return this._values[id];\n };\n ScopeStore.prototype.openScope = function (handleStore) {\n var currentScope = this.currentScope;\n var scope = currentScope.child;\n if (scope !== null) {\n scope.start = scope.end = currentScope.end;\n }\n else {\n var id = currentScope.id + 1;\n scope = new HandleScope(handleStore, id, currentScope, currentScope.end);\n this._values[id] = scope;\n }\n this.currentScope = scope;\n return scope;\n };\n ScopeStore.prototype.closeScope = function () {\n var scope = this.currentScope;\n this.currentScope = scope.parent;\n scope.dispose();\n };\n ScopeStore.prototype.dispose = function () {\n this.currentScope = this._rootScope;\n this._values.length = 1;\n };\n return ScopeStore;\n}());\n\nvar RefTracker = /*#__PURE__*/ (function () {\n function RefTracker() {\n this._next = null;\n this._prev = null;\n }\n /** @virtual */\n RefTracker.prototype.dispose = function () { };\n /** @virtual */\n RefTracker.prototype.finalize = function () { };\n RefTracker.prototype.link = function (list) {\n this._prev = list;\n this._next = list._next;\n if (this._next !== null) {\n this._next._prev = this;\n }\n list._next = this;\n };\n RefTracker.prototype.unlink = function () {\n if (this._prev !== null) {\n this._prev._next = this._next;\n }\n if (this._next !== null) {\n this._next._prev = this._prev;\n }\n this._prev = null;\n this._next = null;\n };\n RefTracker.finalizeAll = function (list) {\n while (list._next !== null) {\n list._next.finalize();\n }\n };\n return RefTracker;\n}());\n\nvar Finalizer = /*#__PURE__*/ (function () {\n function Finalizer(envObject, _finalizeCallback, _finalizeData, _finalizeHint) {\n if (_finalizeCallback === void 0) { _finalizeCallback = 0; }\n if (_finalizeData === void 0) { _finalizeData = 0; }\n if (_finalizeHint === void 0) { _finalizeHint = 0; }\n this.envObject = envObject;\n this._finalizeCallback = _finalizeCallback;\n this._finalizeData = _finalizeData;\n this._finalizeHint = _finalizeHint;\n this._makeDynCall_vppp = envObject.makeDynCall_vppp;\n }\n Finalizer.prototype.callback = function () { return this._finalizeCallback; };\n Finalizer.prototype.data = function () { return this._finalizeData; };\n Finalizer.prototype.hint = function () { return this._finalizeHint; };\n Finalizer.prototype.resetEnv = function () {\n this.envObject = undefined;\n };\n Finalizer.prototype.resetFinalizer = function () {\n this._finalizeCallback = 0;\n this._finalizeData = 0;\n this._finalizeHint = 0;\n };\n Finalizer.prototype.callFinalizer = function () {\n var finalize_callback = this._finalizeCallback;\n var finalize_data = this._finalizeData;\n var finalize_hint = this._finalizeHint;\n this.resetFinalizer();\n if (!finalize_callback)\n return;\n var fini = Number(finalize_callback);\n if (!this.envObject) {\n this._makeDynCall_vppp(fini)(0, finalize_data, finalize_hint);\n }\n else {\n this.envObject.callFinalizer(fini, finalize_data, finalize_hint);\n }\n };\n Finalizer.prototype.dispose = function () {\n this.envObject = undefined;\n this._makeDynCall_vppp = undefined;\n };\n return Finalizer;\n}());\n\nvar TrackedFinalizer = /*#__PURE__*/ (function (_super) {\n __extends(TrackedFinalizer, _super);\n function TrackedFinalizer(envObject, finalize_callback, finalize_data, finalize_hint) {\n var _this = _super.call(this) || this;\n _this._finalizer = new Finalizer(envObject, finalize_callback, finalize_data, finalize_hint);\n return _this;\n }\n TrackedFinalizer.create = function (envObject, finalize_callback, finalize_data, finalize_hint) {\n var finalizer = new TrackedFinalizer(envObject, finalize_callback, finalize_data, finalize_hint);\n finalizer.link(envObject.finalizing_reflist);\n return finalizer;\n };\n TrackedFinalizer.prototype.data = function () {\n return this._finalizer.data();\n };\n TrackedFinalizer.prototype.dispose = function () {\n if (!this._finalizer)\n return;\n this.unlink();\n this._finalizer.envObject.dequeueFinalizer(this);\n this._finalizer.dispose();\n this._finalizer = undefined;\n _super.prototype.dispose.call(this);\n };\n TrackedFinalizer.prototype.finalize = function () {\n this.unlink();\n var error;\n var caught = false;\n try {\n this._finalizer.callFinalizer();\n }\n catch (err) {\n caught = true;\n error = err;\n }\n this.dispose();\n if (caught) {\n throw error;\n }\n };\n return TrackedFinalizer;\n}(RefTracker));\n\nfunction throwNodeApiVersionError(moduleName, moduleApiVersion) {\n var errorMessage = \"\".concat(moduleName, \" requires Node-API version \").concat(moduleApiVersion, \", but this version of Node.js only supports version \").concat(NODE_API_SUPPORTED_VERSION_MAX, \" add-ons.\");\n throw new Error(errorMessage);\n}\nfunction handleThrow(envObject, value) {\n if (envObject.terminatedOrTerminating()) {\n return;\n }\n throw value;\n}\nvar Env = /*#__PURE__*/ (function () {\n function Env(ctx, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort) {\n this.ctx = ctx;\n this.moduleApiVersion = moduleApiVersion;\n this.makeDynCall_vppp = makeDynCall_vppp;\n this.makeDynCall_vp = makeDynCall_vp;\n this.abort = abort;\n this.openHandleScopes = 0;\n this.instanceData = null;\n this.tryCatch = new TryCatch();\n this.refs = 1;\n this.reflist = new RefTracker();\n this.finalizing_reflist = new RefTracker();\n this.pendingFinalizers = [];\n this.lastError = {\n errorCode: 0 /* napi_status.napi_ok */,\n engineErrorCode: 0,\n engineReserved: 0\n };\n this.inGcFinalizer = false;\n this._bindingMap = new WeakMap();\n this.id = 0;\n }\n /** @virtual */\n Env.prototype.canCallIntoJs = function () {\n return true;\n };\n Env.prototype.terminatedOrTerminating = function () {\n return !this.canCallIntoJs();\n };\n Env.prototype.ref = function () {\n this.refs++;\n };\n Env.prototype.unref = function () {\n this.refs--;\n if (this.refs === 0) {\n this.dispose();\n }\n };\n Env.prototype.ensureHandle = function (value) {\n return this.ctx.ensureHandle(value);\n };\n Env.prototype.ensureHandleId = function (value) {\n return this.ensureHandle(value).id;\n };\n Env.prototype.clearLastError = function () {\n var lastError = this.lastError;\n if (lastError.errorCode !== 0 /* napi_status.napi_ok */)\n lastError.errorCode = 0 /* napi_status.napi_ok */;\n if (lastError.engineErrorCode !== 0)\n lastError.engineErrorCode = 0;\n if (lastError.engineReserved !== 0)\n lastError.engineReserved = 0;\n return 0 /* napi_status.napi_ok */;\n };\n Env.prototype.setLastError = function (error_code, engine_error_code, engine_reserved) {\n if (engine_error_code === void 0) { engine_error_code = 0; }\n if (engine_reserved === void 0) { engine_reserved = 0; }\n var lastError = this.lastError;\n if (lastError.errorCode !== error_code)\n lastError.errorCode = error_code;\n if (lastError.engineErrorCode !== engine_error_code)\n lastError.engineErrorCode = engine_error_code;\n if (lastError.engineReserved !== engine_reserved)\n lastError.engineReserved = engine_reserved;\n return error_code;\n };\n Env.prototype.getReturnStatus = function () {\n return !this.tryCatch.hasCaught() ? 0 /* napi_status.napi_ok */ : this.setLastError(10 /* napi_status.napi_pending_exception */);\n };\n Env.prototype.callIntoModule = function (fn, handleException) {\n if (handleException === void 0) { handleException = handleThrow; }\n var openHandleScopesBefore = this.openHandleScopes;\n this.clearLastError();\n var r = fn(this);\n if (openHandleScopesBefore !== this.openHandleScopes) {\n this.abort('open_handle_scopes != open_handle_scopes_before');\n }\n if (this.tryCatch.hasCaught()) {\n var err = this.tryCatch.extractException();\n handleException(this, err);\n }\n return r;\n };\n Env.prototype.invokeFinalizerFromGC = function (finalizer) {\n if (this.moduleApiVersion !== NAPI_VERSION_EXPERIMENTAL) {\n this.enqueueFinalizer(finalizer);\n }\n else {\n var saved = this.inGcFinalizer;\n this.inGcFinalizer = true;\n try {\n finalizer.finalize();\n }\n finally {\n this.inGcFinalizer = saved;\n }\n }\n };\n Env.prototype.checkGCAccess = function () {\n if (this.moduleApiVersion === NAPI_VERSION_EXPERIMENTAL && this.inGcFinalizer) {\n this.abort('Finalizer is calling a function that may affect GC state.\\n' +\n 'The finalizers are run directly from GC and must not affect GC ' +\n 'state.\\n' +\n 'Use `node_api_post_finalizer` from inside of the finalizer to work ' +\n 'around this issue.\\n' +\n 'It schedules the call as a new task in the event loop.');\n }\n };\n /** @virtual */\n Env.prototype.enqueueFinalizer = function (finalizer) {\n if (this.pendingFinalizers.indexOf(finalizer) === -1) {\n this.pendingFinalizers.push(finalizer);\n }\n };\n /** @virtual */\n Env.prototype.dequeueFinalizer = function (finalizer) {\n var index = this.pendingFinalizers.indexOf(finalizer);\n if (index !== -1) {\n this.pendingFinalizers.splice(index, 1);\n }\n };\n /** @virtual */\n Env.prototype.deleteMe = function () {\n RefTracker.finalizeAll(this.finalizing_reflist);\n RefTracker.finalizeAll(this.reflist);\n this.tryCatch.extractException();\n this.ctx.envStore.remove(this.id);\n };\n Env.prototype.dispose = function () {\n if (this.id === 0)\n return;\n this.deleteMe();\n this.finalizing_reflist.dispose();\n this.reflist.dispose();\n this.id = 0;\n };\n Env.prototype.initObjectBinding = function (value) {\n var binding = {\n wrapped: 0,\n tag: null\n };\n this._bindingMap.set(value, binding);\n return binding;\n };\n Env.prototype.getObjectBinding = function (value) {\n if (this._bindingMap.has(value)) {\n return this._bindingMap.get(value);\n }\n return this.initObjectBinding(value);\n };\n Env.prototype.setInstanceData = function (data, finalize_cb, finalize_hint) {\n if (this.instanceData) {\n this.instanceData.dispose();\n }\n this.instanceData = TrackedFinalizer.create(this, finalize_cb, data, finalize_hint);\n };\n Env.prototype.getInstanceData = function () {\n return this.instanceData ? this.instanceData.data() : 0;\n };\n return Env;\n}());\nvar NodeEnv = /*#__PURE__*/ (function (_super) {\n __extends(NodeEnv, _super);\n function NodeEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) {\n var _this = _super.call(this, ctx, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort) || this;\n _this.filename = filename;\n _this.nodeBinding = nodeBinding;\n _this.destructing = false;\n _this.finalizationScheduled = false;\n return _this;\n }\n NodeEnv.prototype.deleteMe = function () {\n this.destructing = true;\n this.drainFinalizerQueue();\n _super.prototype.deleteMe.call(this);\n };\n NodeEnv.prototype.canCallIntoJs = function () {\n return _super.prototype.canCallIntoJs.call(this) && this.ctx.canCallIntoJs();\n };\n NodeEnv.prototype.triggerFatalException = function (err) {\n if (this.nodeBinding) {\n this.nodeBinding.napi.fatalException(err);\n }\n else {\n if (typeof process === 'object' && process !== null && typeof process._fatalException === 'function') {\n var handled = process._fatalException(err);\n if (!handled) {\n console.error(err);\n process.exit(1);\n }\n }\n else {\n throw err;\n }\n }\n };\n NodeEnv.prototype.callbackIntoModule = function (enforceUncaughtExceptionPolicy, fn) {\n return this.callIntoModule(fn, function (envObject, err) {\n if (envObject.terminatedOrTerminating()) {\n return;\n }\n var hasProcess = typeof process === 'object' && process !== null;\n var hasForceFlag = hasProcess ? Boolean(process.execArgv && (process.execArgv.indexOf('--force-node-api-uncaught-exceptions-policy') !== -1)) : false;\n if (envObject.moduleApiVersion < 10 && !hasForceFlag && !enforceUncaughtExceptionPolicy) {\n var warn = hasProcess && typeof process.emitWarning === 'function'\n ? process.emitWarning\n : function (warning, type, code) {\n if (warning instanceof Error) {\n console.warn(warning.toString());\n }\n else {\n var prefix = code ? \"[\".concat(code, \"] \") : '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n console.warn(\"\".concat(prefix).concat(type || 'Warning', \": \").concat(warning));\n }\n };\n warn('Uncaught Node-API callback exception detected, please run node with option --force-node-api-uncaught-exceptions-policy=true to handle those exceptions properly.', 'DeprecationWarning', 'DEP0168');\n return;\n }\n envObject.triggerFatalException(err);\n });\n };\n NodeEnv.prototype.callFinalizer = function (cb, data, hint) {\n this.callFinalizerInternal(1, cb, data, hint);\n };\n NodeEnv.prototype.callFinalizerInternal = function (forceUncaught, cb, data, hint) {\n var f = this.makeDynCall_vppp(cb);\n var env = this.id;\n var scope = this.ctx.openScope(this);\n try {\n this.callbackIntoModule(Boolean(forceUncaught), function () { f(env, data, hint); });\n }\n finally {\n this.ctx.closeScope(this, scope);\n }\n };\n NodeEnv.prototype.enqueueFinalizer = function (finalizer) {\n var _this = this;\n _super.prototype.enqueueFinalizer.call(this, finalizer);\n if (!this.finalizationScheduled && !this.destructing) {\n this.finalizationScheduled = true;\n this.ref();\n _setImmediate(function () {\n _this.finalizationScheduled = false;\n _this.unref();\n _this.drainFinalizerQueue();\n });\n }\n };\n NodeEnv.prototype.drainFinalizerQueue = function () {\n while (this.pendingFinalizers.length > 0) {\n var refTracker = this.pendingFinalizers.shift();\n refTracker.finalize();\n }\n };\n return NodeEnv;\n}(Env));\nfunction newEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) {\n moduleApiVersion = typeof moduleApiVersion !== 'number' ? NODE_API_DEFAULT_MODULE_API_VERSION : moduleApiVersion;\n // Validate module_api_version.\n if (moduleApiVersion < NODE_API_DEFAULT_MODULE_API_VERSION) {\n moduleApiVersion = NODE_API_DEFAULT_MODULE_API_VERSION;\n }\n else if (moduleApiVersion > NODE_API_SUPPORTED_VERSION_MAX && moduleApiVersion !== NAPI_VERSION_EXPERIMENTAL) {\n throwNodeApiVersionError(filename, moduleApiVersion);\n }\n var env = new NodeEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding);\n ctx.envStore.add(env);\n ctx.addCleanupHook(env, function () { env.unref(); }, 0);\n return env;\n}\n\nvar EmnapiError = /*#__PURE__*/ (function (_super) {\n __extends(EmnapiError, _super);\n function EmnapiError(message) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, message) || this;\n var ErrorConstructor = _newTarget;\n var proto = ErrorConstructor.prototype;\n if (!(_this instanceof EmnapiError)) {\n var setPrototypeOf = Object.setPrototypeOf;\n if (typeof setPrototypeOf === 'function') {\n setPrototypeOf.call(Object, _this, proto);\n }\n else {\n // eslint-disable-next-line no-proto\n _this.__proto__ = proto;\n }\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(_this, ErrorConstructor);\n }\n }\n return _this;\n }\n return EmnapiError;\n}(Error));\nObject.defineProperty(EmnapiError.prototype, 'name', {\n configurable: true,\n writable: true,\n value: 'EmnapiError'\n});\nvar NotSupportWeakRefError = /*#__PURE__*/ (function (_super) {\n __extends(NotSupportWeakRefError, _super);\n function NotSupportWeakRefError(api, message) {\n return _super.call(this, \"\".concat(api, \": The current runtime does not support \\\"FinalizationRegistry\\\" and \\\"WeakRef\\\".\").concat(message ? \" \".concat(message) : '')) || this;\n }\n return NotSupportWeakRefError;\n}(EmnapiError));\nObject.defineProperty(NotSupportWeakRefError.prototype, 'name', {\n configurable: true,\n writable: true,\n value: 'NotSupportWeakRefError'\n});\nvar NotSupportBufferError = /*#__PURE__*/ (function (_super) {\n __extends(NotSupportBufferError, _super);\n function NotSupportBufferError(api, message) {\n return _super.call(this, \"\".concat(api, \": The current runtime does not support \\\"Buffer\\\". Consider using buffer polyfill to make sure `globalThis.Buffer` is defined.\").concat(message ? \" \".concat(message) : '')) || this;\n }\n return NotSupportBufferError;\n}(EmnapiError));\nObject.defineProperty(NotSupportBufferError.prototype, 'name', {\n configurable: true,\n writable: true,\n value: 'NotSupportBufferError'\n});\n\nvar StrongRef = /*#__PURE__*/ (function () {\n function StrongRef(value) {\n this._value = value;\n }\n StrongRef.prototype.deref = function () {\n return this._value;\n };\n StrongRef.prototype.dispose = function () {\n this._value = undefined;\n };\n return StrongRef;\n}());\nvar Persistent = /*#__PURE__*/ (function () {\n function Persistent(value) {\n this._ref = new StrongRef(value);\n }\n Persistent.prototype.setWeak = function (param, callback) {\n if (!supportFinalizer || this._ref === undefined || this._ref instanceof WeakRef)\n return;\n var value = this._ref.deref();\n try {\n Persistent._registry.register(value, this, this);\n var weakRef = new WeakRef(value);\n this._ref.dispose();\n this._ref = weakRef;\n this._param = param;\n this._callback = callback;\n }\n catch (err) {\n if (typeof value === 'symbol') ;\n else {\n throw err;\n }\n }\n };\n Persistent.prototype.clearWeak = function () {\n if (!supportFinalizer || this._ref === undefined)\n return;\n if (this._ref instanceof WeakRef) {\n try {\n Persistent._registry.unregister(this);\n }\n catch (_) { }\n this._param = undefined;\n this._callback = undefined;\n var value = this._ref.deref();\n if (value === undefined) {\n this._ref = value;\n }\n else {\n this._ref = new StrongRef(value);\n }\n }\n };\n Persistent.prototype.reset = function () {\n if (supportFinalizer) {\n try {\n Persistent._registry.unregister(this);\n }\n catch (_) { }\n }\n this._param = undefined;\n this._callback = undefined;\n if (this._ref instanceof StrongRef) {\n this._ref.dispose();\n }\n this._ref = undefined;\n };\n Persistent.prototype.isEmpty = function () {\n return this._ref === undefined;\n };\n Persistent.prototype.deref = function () {\n if (this._ref === undefined)\n return undefined;\n return this._ref.deref();\n };\n Persistent._registry = supportFinalizer\n ? new FinalizationRegistry(function (value) {\n value._ref = undefined;\n var callback = value._callback;\n var param = value._param;\n value._callback = undefined;\n value._param = undefined;\n if (typeof callback === 'function') {\n callback(param);\n }\n })\n : undefined;\n return Persistent;\n}());\n\nvar ReferenceOwnership;\n(function (ReferenceOwnership) {\n ReferenceOwnership[ReferenceOwnership[\"kRuntime\"] = 0] = \"kRuntime\";\n ReferenceOwnership[ReferenceOwnership[\"kUserland\"] = 1] = \"kUserland\";\n})(ReferenceOwnership || (ReferenceOwnership = {}));\nfunction canBeHeldWeakly(value) {\n return value.isObject() || value.isFunction() || value.isSymbol();\n}\nvar Reference = /*#__PURE__*/ (function (_super) {\n __extends(Reference, _super);\n function Reference(envObject, handle_id, initialRefcount, ownership) {\n var _this = _super.call(this) || this;\n _this.envObject = envObject;\n _this._refcount = initialRefcount;\n _this._ownership = ownership;\n var handle = envObject.ctx.handleStore.get(handle_id);\n _this.canBeWeak = canBeHeldWeakly(handle);\n _this.persistent = new Persistent(handle.value);\n _this.id = 0;\n if (initialRefcount === 0) {\n _this._setWeak();\n }\n return _this;\n }\n Reference.weakCallback = function (ref) {\n ref.persistent.reset();\n ref.invokeFinalizerFromGC();\n };\n Reference.create = function (envObject, handle_id, initialRefcount, ownership, _unused1, _unused2, _unused3) {\n var ref = new Reference(envObject, handle_id, initialRefcount, ownership);\n envObject.ctx.refStore.add(ref);\n ref.link(envObject.reflist);\n return ref;\n };\n Reference.prototype.ref = function () {\n if (this.persistent.isEmpty()) {\n return 0;\n }\n if (++this._refcount === 1 && this.canBeWeak) {\n this.persistent.clearWeak();\n }\n return this._refcount;\n };\n Reference.prototype.unref = function () {\n if (this.persistent.isEmpty() || this._refcount === 0) {\n return 0;\n }\n if (--this._refcount === 0) {\n this._setWeak();\n }\n return this._refcount;\n };\n Reference.prototype.get = function (envObject) {\n if (envObject === void 0) { envObject = this.envObject; }\n if (this.persistent.isEmpty()) {\n return 0;\n }\n var obj = this.persistent.deref();\n var handle = envObject.ensureHandle(obj);\n return handle.id;\n };\n /** @virtual */\n Reference.prototype.resetFinalizer = function () { };\n /** @virtual */\n Reference.prototype.data = function () { return 0; };\n Reference.prototype.refcount = function () { return this._refcount; };\n Reference.prototype.ownership = function () { return this._ownership; };\n /** @virtual */\n Reference.prototype.callUserFinalizer = function () { };\n /** @virtual */\n Reference.prototype.invokeFinalizerFromGC = function () {\n this.finalize();\n };\n Reference.prototype._setWeak = function () {\n if (this.canBeWeak) {\n this.persistent.setWeak(this, Reference.weakCallback);\n }\n else {\n this.persistent.reset();\n }\n };\n Reference.prototype.finalize = function () {\n this.persistent.reset();\n var deleteMe = this._ownership === ReferenceOwnership.kRuntime;\n this.unlink();\n this.callUserFinalizer();\n if (deleteMe) {\n this.dispose();\n }\n };\n Reference.prototype.dispose = function () {\n if (this.id === 0)\n return;\n this.unlink();\n this.persistent.reset();\n this.envObject.ctx.refStore.remove(this.id);\n _super.prototype.dispose.call(this);\n this.envObject = undefined;\n this.id = 0;\n };\n return Reference;\n}(RefTracker));\nvar ReferenceWithData = /*#__PURE__*/ (function (_super) {\n __extends(ReferenceWithData, _super);\n function ReferenceWithData(envObject, value, initialRefcount, ownership, _data) {\n var _this = _super.call(this, envObject, value, initialRefcount, ownership) || this;\n _this._data = _data;\n return _this;\n }\n ReferenceWithData.create = function (envObject, value, initialRefcount, ownership, data) {\n var reference = new ReferenceWithData(envObject, value, initialRefcount, ownership, data);\n envObject.ctx.refStore.add(reference);\n reference.link(envObject.reflist);\n return reference;\n };\n ReferenceWithData.prototype.data = function () {\n return this._data;\n };\n return ReferenceWithData;\n}(Reference));\nvar ReferenceWithFinalizer = /*#__PURE__*/ (function (_super) {\n __extends(ReferenceWithFinalizer, _super);\n function ReferenceWithFinalizer(envObject, value, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) {\n var _this = _super.call(this, envObject, value, initialRefcount, ownership) || this;\n _this._finalizer = new Finalizer(envObject, finalize_callback, finalize_data, finalize_hint);\n return _this;\n }\n ReferenceWithFinalizer.create = function (envObject, value, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) {\n var reference = new ReferenceWithFinalizer(envObject, value, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint);\n envObject.ctx.refStore.add(reference);\n reference.link(envObject.finalizing_reflist);\n return reference;\n };\n ReferenceWithFinalizer.prototype.resetFinalizer = function () {\n this._finalizer.resetFinalizer();\n };\n ReferenceWithFinalizer.prototype.data = function () {\n return this._finalizer.data();\n };\n ReferenceWithFinalizer.prototype.callUserFinalizer = function () {\n this._finalizer.callFinalizer();\n };\n ReferenceWithFinalizer.prototype.invokeFinalizerFromGC = function () {\n this._finalizer.envObject.invokeFinalizerFromGC(this);\n };\n ReferenceWithFinalizer.prototype.dispose = function () {\n if (!this._finalizer)\n return;\n this._finalizer.envObject.dequeueFinalizer(this);\n this._finalizer.dispose();\n _super.prototype.dispose.call(this);\n this._finalizer = undefined;\n };\n return ReferenceWithFinalizer;\n}(Reference));\n\nvar Deferred = /*#__PURE__*/ (function () {\n function Deferred(ctx, value) {\n this.id = 0;\n this.ctx = ctx;\n this.value = value;\n }\n Deferred.create = function (ctx, value) {\n var deferred = new Deferred(ctx, value);\n ctx.deferredStore.add(deferred);\n return deferred;\n };\n Deferred.prototype.resolve = function (value) {\n this.value.resolve(value);\n this.dispose();\n };\n Deferred.prototype.reject = function (reason) {\n this.value.reject(reason);\n this.dispose();\n };\n Deferred.prototype.dispose = function () {\n this.ctx.deferredStore.remove(this.id);\n this.id = 0;\n this.value = null;\n this.ctx = null;\n };\n return Deferred;\n}());\n\nvar Store = /*#__PURE__*/ (function () {\n function Store() {\n this._values = [undefined];\n this._values.length = 4;\n this._size = 1;\n this._freeList = [];\n }\n Store.prototype.add = function (value) {\n var id;\n if (this._freeList.length) {\n id = this._freeList.shift();\n }\n else {\n id = this._size;\n this._size++;\n var capacity = this._values.length;\n if (id >= capacity) {\n this._values.length = capacity + (capacity >> 1) + 16;\n }\n }\n value.id = id;\n this._values[id] = value;\n };\n Store.prototype.get = function (id) {\n return this._values[id];\n };\n Store.prototype.has = function (id) {\n return this._values[id] !== undefined;\n };\n Store.prototype.remove = function (id) {\n var value = this._values[id];\n if (value) {\n value.id = 0;\n this._values[id] = undefined;\n this._freeList.push(Number(id));\n }\n };\n Store.prototype.dispose = function () {\n for (var i = 1; i < this._size; ++i) {\n var value = this._values[i];\n value === null || value === void 0 ? void 0 : value.dispose();\n }\n this._values = [undefined];\n this._size = 1;\n this._freeList = [];\n };\n return Store;\n}());\n\nvar kMaxReasonableBytes = BigInt(1) << BigInt(60);\nvar kMinReasonableBytes = -kMaxReasonableBytes;\nvar ExternalMemory = /*#__PURE__*/ (function () {\n function ExternalMemory(onChange) {\n this.total = BigInt(0);\n this.onChange = onChange !== null && onChange !== void 0 ? onChange : null;\n }\n ExternalMemory.prototype.adjust = function (changeInBytes) {\n changeInBytes = BigInt(changeInBytes);\n if (!(kMinReasonableBytes <= changeInBytes && changeInBytes < kMaxReasonableBytes)) {\n throw new RangeError(\"changeInBytes \".concat(changeInBytes, \" is out of reasonable range\"));\n }\n var old = this.total;\n this.total += changeInBytes;\n var amount = this.total;\n var onChange = this.onChange;\n if (changeInBytes) {\n onChange === null || onChange === void 0 ? void 0 : onChange(amount, old, changeInBytes);\n }\n return amount;\n };\n return ExternalMemory;\n}());\n\nvar CleanupHookCallback = /*#__PURE__*/ (function () {\n function CleanupHookCallback(envObject, fn, arg, order) {\n this.envObject = envObject;\n this.fn = fn;\n this.arg = arg;\n this.order = order;\n }\n return CleanupHookCallback;\n}());\nvar CleanupQueue = /*#__PURE__*/ (function () {\n function CleanupQueue() {\n this._cleanupHooks = [];\n this._cleanupHookCounter = 0;\n }\n CleanupQueue.prototype.empty = function () {\n return this._cleanupHooks.length === 0;\n };\n CleanupQueue.prototype.add = function (envObject, fn, arg) {\n if (this._cleanupHooks.filter(function (hook) { return (hook.envObject === envObject && hook.fn === fn && hook.arg === arg); }).length > 0) {\n throw new Error('Can not add same fn and arg twice');\n }\n this._cleanupHooks.push(new CleanupHookCallback(envObject, fn, arg, this._cleanupHookCounter++));\n };\n CleanupQueue.prototype.remove = function (envObject, fn, arg) {\n for (var i = 0; i < this._cleanupHooks.length; ++i) {\n var hook = this._cleanupHooks[i];\n if (hook.envObject === envObject && hook.fn === fn && hook.arg === arg) {\n this._cleanupHooks.splice(i, 1);\n return;\n }\n }\n };\n CleanupQueue.prototype.drain = function () {\n var hooks = this._cleanupHooks.slice();\n hooks.sort(function (a, b) { return (b.order - a.order); });\n for (var i = 0; i < hooks.length; ++i) {\n var cb = hooks[i];\n if (typeof cb.fn === 'number') {\n cb.envObject.makeDynCall_vp(cb.fn)(cb.arg);\n }\n else {\n cb.fn(cb.arg);\n }\n this._cleanupHooks.splice(this._cleanupHooks.indexOf(cb), 1);\n }\n };\n CleanupQueue.prototype.dispose = function () {\n this._cleanupHooks.length = 0;\n this._cleanupHookCounter = 0;\n };\n return CleanupQueue;\n}());\nvar NodejsWaitingRequestCounter = /*#__PURE__*/ (function () {\n function NodejsWaitingRequestCounter() {\n this.refHandle = new _MessageChannel().port1;\n this.count = 0;\n }\n NodejsWaitingRequestCounter.prototype.increase = function () {\n if (this.count === 0) {\n if (this.refHandle.ref) {\n this.refHandle.ref();\n }\n }\n this.count++;\n };\n NodejsWaitingRequestCounter.prototype.decrease = function () {\n if (this.count === 0)\n return;\n if (this.count === 1) {\n if (this.refHandle.unref) {\n this.refHandle.unref();\n }\n }\n this.count--;\n };\n return NodejsWaitingRequestCounter;\n}());\nvar Context = /*#__PURE__*/ (function () {\n function Context(options) {\n var _this = this;\n this._isStopping = false;\n this._canCallIntoJs = true;\n this._suppressDestroy = false;\n this.envStore = new Store();\n this.scopeStore = new ScopeStore();\n this.refStore = new Store();\n this.deferredStore = new Store();\n this.handleStore = new HandleStore();\n this.feature = {\n supportReflect: supportReflect,\n supportFinalizer: supportFinalizer,\n supportWeakSymbol: supportWeakSymbol,\n supportBigInt: supportBigInt,\n supportNewFunction: supportNewFunction,\n canSetFunctionName: canSetFunctionName,\n setImmediate: _setImmediate,\n Buffer: _Buffer,\n MessageChannel: _MessageChannel\n };\n this.cleanupQueue = new CleanupQueue();\n this._externalMemory = new ExternalMemory(options === null || options === void 0 ? void 0 : options.onExternalMemoryChange);\n if (typeof process === 'object' && process !== null && typeof process.once === 'function') {\n this.refCounter = new NodejsWaitingRequestCounter();\n process.once('beforeExit', function () {\n if (!_this._suppressDestroy) {\n _this.destroy();\n }\n });\n }\n }\n /**\n * Suppress the destroy on `beforeExit` event in Node.js.\n * Call this method if you want to keep the context and\n * all associated {@link Env | Env} alive,\n * this also means that cleanup hooks will not be called.\n * After call this method, you should call\n * {@link Context.destroy | `Context.prototype.destroy`} method manually.\n */\n Context.prototype.suppressDestroy = function () {\n this._suppressDestroy = true;\n };\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n Context.prototype.getRuntimeVersions = function () {\n return {\n version: version,\n NODE_API_SUPPORTED_VERSION_MAX: NODE_API_SUPPORTED_VERSION_MAX,\n NAPI_VERSION_EXPERIMENTAL: NAPI_VERSION_EXPERIMENTAL,\n NODE_API_DEFAULT_MODULE_API_VERSION: NODE_API_DEFAULT_MODULE_API_VERSION\n };\n };\n Context.prototype.createNotSupportWeakRefError = function (api, message) {\n return new NotSupportWeakRefError(api, message);\n };\n Context.prototype.createNotSupportBufferError = function (api, message) {\n return new NotSupportBufferError(api, message);\n };\n Context.prototype.createReference = function (envObject, handle_id, initialRefcount, ownership) {\n return Reference.create(envObject, handle_id, initialRefcount, ownership);\n };\n Context.prototype.createReferenceWithData = function (envObject, handle_id, initialRefcount, ownership, data) {\n return ReferenceWithData.create(envObject, handle_id, initialRefcount, ownership, data);\n };\n Context.prototype.createReferenceWithFinalizer = function (envObject, handle_id, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) {\n if (finalize_callback === void 0) { finalize_callback = 0; }\n if (finalize_data === void 0) { finalize_data = 0; }\n if (finalize_hint === void 0) { finalize_hint = 0; }\n return ReferenceWithFinalizer.create(envObject, handle_id, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint);\n };\n Context.prototype.createDeferred = function (value) {\n return Deferred.create(this, value);\n };\n Context.prototype.adjustAmountOfExternalAllocatedMemory = function (changeInBytes) {\n return this._externalMemory.adjust(changeInBytes);\n };\n Context.prototype.createEnv = function (filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) {\n return newEnv(this, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding);\n };\n Context.prototype.createTrackedFinalizer = function (envObject, finalize_callback, finalize_data, finalize_hint) {\n return TrackedFinalizer.create(envObject, finalize_callback, finalize_data, finalize_hint);\n };\n Context.prototype.getCurrentScope = function () {\n return this.scopeStore.currentScope;\n };\n Context.prototype.addToCurrentScope = function (value) {\n return this.scopeStore.currentScope.add(value);\n };\n Context.prototype.openScope = function (envObject) {\n var scope = this.scopeStore.openScope(this.handleStore);\n if (envObject)\n envObject.openHandleScopes++;\n return scope;\n };\n Context.prototype.closeScope = function (envObject, _scope) {\n if (envObject && envObject.openHandleScopes === 0)\n return;\n this.scopeStore.closeScope();\n if (envObject)\n envObject.openHandleScopes--;\n };\n Context.prototype.ensureHandle = function (value) {\n switch (value) {\n case undefined: return HandleStore.UNDEFINED;\n case null: return HandleStore.NULL;\n case true: return HandleStore.TRUE;\n case false: return HandleStore.FALSE;\n case _global: return HandleStore.GLOBAL;\n }\n return this.addToCurrentScope(value);\n };\n Context.prototype.addCleanupHook = function (envObject, fn, arg) {\n this.cleanupQueue.add(envObject, fn, arg);\n };\n Context.prototype.removeCleanupHook = function (envObject, fn, arg) {\n this.cleanupQueue.remove(envObject, fn, arg);\n };\n Context.prototype.runCleanup = function () {\n while (!this.cleanupQueue.empty()) {\n this.cleanupQueue.drain();\n }\n };\n Context.prototype.increaseWaitingRequestCounter = function () {\n var _a;\n (_a = this.refCounter) === null || _a === void 0 ? void 0 : _a.increase();\n };\n Context.prototype.decreaseWaitingRequestCounter = function () {\n var _a;\n (_a = this.refCounter) === null || _a === void 0 ? void 0 : _a.decrease();\n };\n Context.prototype.setCanCallIntoJs = function (value) {\n this._canCallIntoJs = value;\n };\n Context.prototype.setStopping = function (value) {\n this._isStopping = value;\n };\n Context.prototype.canCallIntoJs = function () {\n return this._canCallIntoJs && !this._isStopping;\n };\n /**\n * Destroy the context and call cleanup hooks.\n * Associated {@link Env | Env} will be destroyed.\n */\n Context.prototype.destroy = function () {\n this.setStopping(true);\n this.setCanCallIntoJs(false);\n this.runCleanup();\n };\n return Context;\n}());\nvar defaultContext;\nfunction createContext(options) {\n return new Context(options);\n}\nfunction getDefaultContext() {\n if (!defaultContext) {\n defaultContext = createContext();\n }\n return defaultContext;\n}\n\nexport { ConstHandle, Context, Deferred, EmnapiError, Env, External, Finalizer, Handle, HandleScope, HandleStore, NAPI_VERSION_EXPERIMENTAL, NODE_API_DEFAULT_MODULE_API_VERSION, NODE_API_SUPPORTED_VERSION_MAX, NODE_API_SUPPORTED_VERSION_MIN, NodeEnv, NotSupportBufferError, NotSupportWeakRefError, Persistent, RefTracker, Reference, ReferenceOwnership, ReferenceWithData, ReferenceWithFinalizer, ScopeStore, Store, TrackedFinalizer, TryCatch, createContext, getDefaultContext, getExternalValue, isExternal, isReferenceType, version };\n","const _WebAssembly = typeof WebAssembly !== 'undefined'\n ? WebAssembly\n : typeof WXWebAssembly !== 'undefined'\n ? WXWebAssembly\n : undefined;\nif (!_WebAssembly) {\n throw new Error('WebAssembly is not supported in this environment');\n}\n\n/* eslint-disable spaced-comment */\n\nfunction validateObject(value, name) {\n if (value === null || typeof value !== 'object') {\n throw new TypeError(`${name} must be an object. Received ${value === null ? 'null' : typeof value}`);\n }\n}\nfunction validateArray(value, name) {\n if (!Array.isArray(value)) {\n throw new TypeError(`${name} must be an array. Received ${value === null ? 'null' : typeof value}`);\n }\n}\nfunction validateBoolean(value, name) {\n if (typeof value !== 'boolean') {\n throw new TypeError(`${name} must be a boolean. Received ${value === null ? 'null' : typeof value}`);\n }\n}\nfunction validateString(value, name) {\n if (typeof value !== 'string') {\n throw new TypeError(`${name} must be a string. Received ${value === null ? 'null' : typeof value}`);\n }\n}\nfunction validateFunction(value, name) {\n if (typeof value !== 'function') {\n throw new TypeError(`${name} must be a function. Received ${value === null ? 'null' : typeof value}`);\n }\n}\nfunction validateUndefined(value, name) {\n if (value !== undefined) {\n throw new TypeError(`${name} must be undefined. Received ${value === null ? 'null' : typeof value}`);\n }\n}\nfunction isPromiseLike(obj) {\n return !!(obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function');\n}\nfunction wrapInstanceExports(exports, mapFn) {\n const newExports = Object.create(null);\n Object.keys(exports).forEach(name => {\n const exportValue = exports[name];\n Object.defineProperty(newExports, name, {\n enumerable: true,\n value: mapFn(exportValue, name)\n });\n });\n return newExports;\n}\nfunction sleepBreakIf(delay, breakIf) {\n const start = Date.now();\n const end = start + delay;\n let ret = false;\n while (Date.now() < end) {\n if (breakIf()) {\n ret = true;\n break;\n }\n }\n return ret;\n}\nfunction unsharedSlice(view, start, end) {\n return ((typeof SharedArrayBuffer === 'function' && view.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(view.buffer.constructor) === '[object SharedArrayBuffer]'))\n ? view.slice(start, end)\n : view.subarray(start, end);\n}\n\nconst ignoreNames = [\n 'asyncify_get_state',\n 'asyncify_start_rewind',\n 'asyncify_start_unwind',\n 'asyncify_stop_rewind',\n 'asyncify_stop_unwind'\n];\nfunction tryAllocate(instance, wasm64, size, mallocName) {\n if (typeof instance.exports[mallocName] !== 'function' || size <= 0) {\n return {\n wasm64,\n dataPtr: 16,\n start: wasm64 ? 32 : 24,\n end: 1024\n };\n }\n const malloc = instance.exports[mallocName];\n const dataPtr = wasm64 ? Number(malloc(BigInt(16) + BigInt(size))) : malloc(8 + size);\n if (dataPtr === 0) {\n throw new Error('Allocate asyncify data failed');\n }\n return wasm64\n ? { wasm64, dataPtr, start: dataPtr + 16, end: dataPtr + 16 + size }\n : { wasm64, dataPtr, start: dataPtr + 8, end: dataPtr + 8 + size };\n}\n/** @public */\nclass Asyncify {\n constructor() {\n this.value = undefined;\n this.exports = undefined;\n this.dataPtr = 0;\n }\n init(memory, instance, options) {\n var _a, _b;\n if (this.exports) {\n throw new Error('Asyncify has been initialized');\n }\n if (!(memory instanceof _WebAssembly.Memory)) {\n throw new TypeError('Require WebAssembly.Memory object');\n }\n const exports = instance.exports;\n for (let i = 0; i < ignoreNames.length; ++i) {\n if (typeof exports[ignoreNames[i]] !== 'function') {\n throw new TypeError('Invalid asyncify wasm');\n }\n }\n let address;\n const wasm64 = Boolean(options.wasm64);\n if (!options.tryAllocate) {\n address = {\n wasm64,\n dataPtr: 16,\n start: wasm64 ? 32 : 24,\n end: 1024\n };\n }\n else {\n if (options.tryAllocate === true) {\n address = tryAllocate(instance, wasm64, 4096, 'malloc');\n }\n else {\n address = tryAllocate(instance, wasm64, (_a = options.tryAllocate.size) !== null && _a !== void 0 ? _a : 4096, (_b = options.tryAllocate.name) !== null && _b !== void 0 ? _b : 'malloc');\n }\n }\n this.dataPtr = address.dataPtr;\n if (wasm64) {\n new BigInt64Array(memory.buffer, this.dataPtr).set([BigInt(address.start), BigInt(address.end)]);\n }\n else {\n new Int32Array(memory.buffer, this.dataPtr).set([address.start, address.end]);\n }\n this.exports = this.wrapExports(exports, options.wrapExports);\n const asyncifiedInstance = Object.create(_WebAssembly.Instance.prototype);\n Object.defineProperty(asyncifiedInstance, 'exports', { value: this.exports });\n // Object.setPrototypeOf(instance, Instance.prototype)\n return asyncifiedInstance;\n }\n assertState() {\n if (this.exports.asyncify_get_state() !== 0 /* AsyncifyState.NONE */) {\n throw new Error('Asyncify state error');\n }\n }\n wrapImportFunction(f) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this;\n return (function () {\n // eslint-disable-next-line no-unreachable-loop\n while (_this.exports.asyncify_get_state() === 2 /* AsyncifyState.REWINDING */) {\n _this.exports.asyncify_stop_rewind();\n return _this.value;\n }\n _this.assertState();\n const v = f.apply(this, arguments);\n if (!isPromiseLike(v))\n return v;\n _this.exports.asyncify_start_unwind(_this.dataPtr);\n _this.value = v;\n });\n }\n wrapImports(imports) {\n const importObject = {};\n Object.keys(imports).forEach(k => {\n const mod = imports[k];\n const newModule = {};\n Object.keys(mod).forEach(name => {\n const importValue = mod[name];\n if (typeof importValue === 'function') {\n newModule[name] = this.wrapImportFunction(importValue);\n }\n else {\n newModule[name] = importValue;\n }\n });\n importObject[k] = newModule;\n });\n return importObject;\n }\n wrapExportFunction(f) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this;\n return (async function () {\n _this.assertState();\n let ret = f.apply(this, arguments);\n while (_this.exports.asyncify_get_state() === 1 /* AsyncifyState.UNWINDING */) {\n _this.exports.asyncify_stop_unwind();\n _this.value = await _this.value;\n _this.assertState();\n _this.exports.asyncify_start_rewind(_this.dataPtr);\n ret = f.call(this);\n }\n _this.assertState();\n return ret;\n });\n }\n wrapExports(exports, needWrap) {\n return wrapInstanceExports(exports, (exportValue, name) => {\n let ignore = ignoreNames.indexOf(name) !== -1 || typeof exportValue !== 'function';\n if (Array.isArray(needWrap)) {\n ignore = ignore || (needWrap.indexOf(name) === -1);\n }\n return ignore ? exportValue : this.wrapExportFunction(exportValue);\n });\n }\n}\n\nfunction validateImports(imports) {\n if (imports && typeof imports !== 'object') {\n throw new TypeError('imports must be an object or undefined');\n }\n}\nfunction fetchWasm(urlOrBuffer, imports) {\n if (typeof wx !== 'undefined' && typeof __wxConfig !== 'undefined') {\n return _WebAssembly.instantiate(urlOrBuffer, imports);\n }\n return fetch(urlOrBuffer)\n .then(response => response.arrayBuffer())\n .then(buffer => _WebAssembly.instantiate(buffer, imports));\n}\n/** @public */\nfunction load(wasmInput, imports) {\n validateImports(imports);\n imports = imports !== null && imports !== void 0 ? imports : {};\n let source;\n if (wasmInput instanceof ArrayBuffer || ArrayBuffer.isView(wasmInput)) {\n return _WebAssembly.instantiate(wasmInput, imports);\n }\n if (wasmInput instanceof _WebAssembly.Module) {\n return _WebAssembly.instantiate(wasmInput, imports).then((instance) => {\n return { instance, module: wasmInput };\n });\n }\n if (typeof wasmInput !== 'string' && !(wasmInput instanceof URL)) {\n throw new TypeError('Invalid source');\n }\n if (typeof _WebAssembly.instantiateStreaming === 'function') {\n let responsePromise;\n try {\n responsePromise = fetch(wasmInput);\n source = _WebAssembly.instantiateStreaming(responsePromise, imports).catch(() => {\n return fetchWasm(wasmInput, imports);\n });\n }\n catch (_) {\n source = fetchWasm(wasmInput, imports);\n }\n }\n else {\n source = fetchWasm(wasmInput, imports);\n }\n return source;\n}\n/** @public */\nfunction asyncifyLoad(asyncify, urlOrBuffer, imports) {\n validateImports(imports);\n imports = imports !== null && imports !== void 0 ? imports : {};\n const asyncifyHelper = new Asyncify();\n imports = asyncifyHelper.wrapImports(imports);\n return load(urlOrBuffer, imports).then(source => {\n var _a;\n const memory = source.instance.exports.memory || ((_a = imports.env) === null || _a === void 0 ? void 0 : _a.memory);\n return { module: source.module, instance: asyncifyHelper.init(memory, source.instance, asyncify) };\n });\n}\n/** @public */\nfunction loadSync(wasmInput, imports) {\n validateImports(imports);\n imports = imports !== null && imports !== void 0 ? imports : {};\n let module;\n if ((wasmInput instanceof ArrayBuffer) || ArrayBuffer.isView(wasmInput)) {\n module = new _WebAssembly.Module(wasmInput);\n }\n else if (wasmInput instanceof WebAssembly.Module) {\n module = wasmInput;\n }\n else {\n throw new TypeError('Invalid source');\n }\n const instance = new _WebAssembly.Instance(module, imports);\n const source = { instance, module };\n return source;\n}\n/** @public */\nfunction asyncifyLoadSync(asyncify, buffer, imports) {\n var _a;\n validateImports(imports);\n imports = imports !== null && imports !== void 0 ? imports : {};\n const asyncifyHelper = new Asyncify();\n imports = asyncifyHelper.wrapImports(imports);\n const source = loadSync(buffer, imports);\n const memory = source.instance.exports.memory || ((_a = imports.env) === null || _a === void 0 ? void 0 : _a.memory);\n return { module: source.module, instance: asyncifyHelper.init(memory, source.instance, asyncify) };\n}\n\nconst CHAR_DOT = 46; /* . */\nconst CHAR_FORWARD_SLASH = 47; /* / */\nfunction isPosixPathSeparator(code) {\n return code === CHAR_FORWARD_SLASH;\n}\nfunction normalizeString(path, allowAboveRoot, separator, isPathSeparator) {\n let res = '';\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n let code = 0;\n for (let i = 0; i <= path.length; ++i) {\n if (i < path.length) {\n code = path.charCodeAt(i);\n }\n else if (isPathSeparator(code)) {\n break;\n }\n else {\n code = CHAR_FORWARD_SLASH;\n }\n if (isPathSeparator(code)) {\n if (lastSlash === i - 1 || dots === 1) ;\n else if (dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 ||\n res.charCodeAt(res.length - 1) !== CHAR_DOT ||\n res.charCodeAt(res.length - 2) !== CHAR_DOT) {\n if (res.length > 2) {\n const lastSlashIndex = res.indexOf(separator);\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n }\n else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength =\n res.length - 1 - res.indexOf(separator);\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n else if (res.length !== 0) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n res += res.length > 0 ? `${separator}..` : '..';\n lastSegmentLength = 2;\n }\n }\n else {\n if (res.length > 0) {\n res += `${separator}${path.slice(lastSlash + 1, i)}`;\n }\n else {\n res = path.slice(lastSlash + 1, i);\n }\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n }\n else if (code === CHAR_DOT && dots !== -1) {\n ++dots;\n }\n else {\n dots = -1;\n }\n }\n return res;\n}\nfunction resolve(...args) {\n let resolvedPath = '';\n let resolvedAbsolute = false;\n for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n const path = i >= 0 ? args[i] : '/';\n validateString(path, 'path');\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n resolvedPath = `${path}/${resolvedPath}`;\n resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n }\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n // Normalize the path\n resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, '/', isPosixPathSeparator);\n if (resolvedAbsolute) {\n return `/${resolvedPath}`;\n }\n return resolvedPath.length > 0 ? resolvedPath : '.';\n}\n\nconst FD_DATASYNC = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(0));\nconst FD_READ = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(1));\nconst FD_SEEK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(2));\nconst FD_FDSTAT_SET_FLAGS = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(3));\nconst FD_SYNC = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(4));\nconst FD_TELL = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(5));\nconst FD_WRITE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(6));\nconst FD_ADVISE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(7));\nconst FD_ALLOCATE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(8));\nconst PATH_CREATE_DIRECTORY = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(9));\nconst PATH_CREATE_FILE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(10));\nconst PATH_LINK_SOURCE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(11));\nconst PATH_LINK_TARGET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(12));\nconst PATH_OPEN = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(13));\nconst FD_READDIR = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(14));\nconst PATH_READLINK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(15));\nconst PATH_RENAME_SOURCE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(16));\nconst PATH_RENAME_TARGET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(17));\nconst PATH_FILESTAT_GET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(18));\nconst PATH_FILESTAT_SET_SIZE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(19));\nconst PATH_FILESTAT_SET_TIMES = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(20));\nconst FD_FILESTAT_GET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(21));\nconst FD_FILESTAT_SET_SIZE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(22));\nconst FD_FILESTAT_SET_TIMES = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(23));\nconst PATH_SYMLINK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(24));\nconst PATH_REMOVE_DIRECTORY = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(25));\nconst PATH_UNLINK_FILE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(26));\nconst POLL_FD_READWRITE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(27));\nconst SOCK_SHUTDOWN = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(28));\nconst SOCK_ACCEPT = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(29));\nconst WasiRights = {\n FD_DATASYNC,\n FD_READ,\n FD_SEEK,\n FD_FDSTAT_SET_FLAGS,\n FD_SYNC,\n FD_TELL,\n FD_WRITE,\n FD_ADVISE,\n FD_ALLOCATE,\n PATH_CREATE_DIRECTORY,\n PATH_CREATE_FILE,\n PATH_LINK_SOURCE,\n PATH_LINK_TARGET,\n PATH_OPEN,\n FD_READDIR,\n PATH_READLINK,\n PATH_RENAME_SOURCE,\n PATH_RENAME_TARGET,\n PATH_FILESTAT_GET,\n PATH_FILESTAT_SET_SIZE,\n PATH_FILESTAT_SET_TIMES,\n FD_FILESTAT_GET,\n FD_FILESTAT_SET_SIZE,\n FD_FILESTAT_SET_TIMES,\n PATH_SYMLINK,\n PATH_REMOVE_DIRECTORY,\n PATH_UNLINK_FILE,\n POLL_FD_READWRITE,\n SOCK_SHUTDOWN,\n SOCK_ACCEPT\n};\n\nfunction strerror(errno) {\n switch (errno) {\n case 0 /* WasiErrno.ESUCCESS */: return 'Success';\n case 1 /* WasiErrno.E2BIG */: return 'Argument list too long';\n case 2 /* WasiErrno.EACCES */: return 'Permission denied';\n case 3 /* WasiErrno.EADDRINUSE */: return 'Address in use';\n case 4 /* WasiErrno.EADDRNOTAVAIL */: return 'Address not available';\n case 5 /* WasiErrno.EAFNOSUPPORT */: return 'Address family not supported by protocol';\n case 6 /* WasiErrno.EAGAIN */: return 'Resource temporarily unavailable';\n case 7 /* WasiErrno.EALREADY */: return 'Operation already in progress';\n case 8 /* WasiErrno.EBADF */: return 'Bad file descriptor';\n case 9 /* WasiErrno.EBADMSG */: return 'Bad message';\n case 10 /* WasiErrno.EBUSY */: return 'Resource busy';\n case 11 /* WasiErrno.ECANCELED */: return 'Operation canceled';\n case 12 /* WasiErrno.ECHILD */: return 'No child process';\n case 13 /* WasiErrno.ECONNABORTED */: return 'Connection aborted';\n case 14 /* WasiErrno.ECONNREFUSED */: return 'Connection refused';\n case 15 /* WasiErrno.ECONNRESET */: return 'Connection reset by peer';\n case 16 /* WasiErrno.EDEADLK */: return 'Resource deadlock would occur';\n case 17 /* WasiErrno.EDESTADDRREQ */: return 'Destination address required';\n case 18 /* WasiErrno.EDOM */: return 'Domain error';\n case 19 /* WasiErrno.EDQUOT */: return 'Quota exceeded';\n case 20 /* WasiErrno.EEXIST */: return 'File exists';\n case 21 /* WasiErrno.EFAULT */: return 'Bad address';\n case 22 /* WasiErrno.EFBIG */: return 'File too large';\n case 23 /* WasiErrno.EHOSTUNREACH */: return 'Host is unreachable';\n case 24 /* WasiErrno.EIDRM */: return 'Identifier removed';\n case 25 /* WasiErrno.EILSEQ */: return 'Illegal byte sequence';\n case 26 /* WasiErrno.EINPROGRESS */: return 'Operation in progress';\n case 27 /* WasiErrno.EINTR */: return 'Interrupted system call';\n case 28 /* WasiErrno.EINVAL */: return 'Invalid argument';\n case 29 /* WasiErrno.EIO */: return 'I/O error';\n case 30 /* WasiErrno.EISCONN */: return 'Socket is connected';\n case 31 /* WasiErrno.EISDIR */: return 'Is a directory';\n case 32 /* WasiErrno.ELOOP */: return 'Symbolic link loop';\n case 33 /* WasiErrno.EMFILE */: return 'No file descriptors available';\n case 34 /* WasiErrno.EMLINK */: return 'Too many links';\n case 35 /* WasiErrno.EMSGSIZE */: return 'Message too large';\n case 36 /* WasiErrno.EMULTIHOP */: return 'Multihop attempted';\n case 37 /* WasiErrno.ENAMETOOLONG */: return 'Filename too long';\n case 38 /* WasiErrno.ENETDOWN */: return 'Network is down';\n case 39 /* WasiErrno.ENETRESET */: return 'Connection reset by network';\n case 40 /* WasiErrno.ENETUNREACH */: return 'Network unreachable';\n case 41 /* WasiErrno.ENFILE */: return 'Too many files open in system';\n case 42 /* WasiErrno.ENOBUFS */: return 'No buffer space available';\n case 43 /* WasiErrno.ENODEV */: return 'No such device';\n case 44 /* WasiErrno.ENOENT */: return 'No such file or directory';\n case 45 /* WasiErrno.ENOEXEC */: return 'Exec format error';\n case 46 /* WasiErrno.ENOLCK */: return 'No locks available';\n case 47 /* WasiErrno.ENOLINK */: return 'Link has been severed';\n case 48 /* WasiErrno.ENOMEM */: return 'Out of memory';\n case 49 /* WasiErrno.ENOMSG */: return 'No message of the desired type';\n case 50 /* WasiErrno.ENOPROTOOPT */: return 'Protocol not available';\n case 51 /* WasiErrno.ENOSPC */: return 'No space left on device';\n case 52 /* WasiErrno.ENOSYS */: return 'Function not implemented';\n case 53 /* WasiErrno.ENOTCONN */: return 'Socket not connected';\n case 54 /* WasiErrno.ENOTDIR */: return 'Not a directory';\n case 55 /* WasiErrno.ENOTEMPTY */: return 'Directory not empty';\n case 56 /* WasiErrno.ENOTRECOVERABLE */: return 'State not recoverable';\n case 57 /* WasiErrno.ENOTSOCK */: return 'Not a socket';\n case 58 /* WasiErrno.ENOTSUP */: return 'Not supported';\n case 59 /* WasiErrno.ENOTTY */: return 'Not a tty';\n case 60 /* WasiErrno.ENXIO */: return 'No such device or address';\n case 61 /* WasiErrno.EOVERFLOW */: return 'Value too large for data type';\n case 62 /* WasiErrno.EOWNERDEAD */: return 'Previous owner died';\n case 63 /* WasiErrno.EPERM */: return 'Operation not permitted';\n case 64 /* WasiErrno.EPIPE */: return 'Broken pipe';\n case 65 /* WasiErrno.EPROTO */: return 'Protocol error';\n case 66 /* WasiErrno.EPROTONOSUPPORT */: return 'Protocol not supported';\n case 67 /* WasiErrno.EPROTOTYPE */: return 'Protocol wrong type for socket';\n case 68 /* WasiErrno.ERANGE */: return 'Result not representable';\n case 69 /* WasiErrno.EROFS */: return 'Read-only file system';\n case 70 /* WasiErrno.ESPIPE */: return 'Invalid seek';\n case 71 /* WasiErrno.ESRCH */: return 'No such process';\n case 72 /* WasiErrno.ESTALE */: return 'Stale file handle';\n case 73 /* WasiErrno.ETIMEDOUT */: return 'Operation timed out';\n case 74 /* WasiErrno.ETXTBSY */: return 'Text file busy';\n case 75 /* WasiErrno.EXDEV */: return 'Cross-device link';\n case 76 /* WasiErrno.ENOTCAPABLE */: return 'Capabilities insufficient';\n default: return 'Unknown error';\n }\n}\nclass WasiError extends Error {\n constructor(message, errno) {\n super(message);\n this.errno = errno;\n }\n getErrorMessage() {\n return strerror(this.errno);\n }\n}\nObject.defineProperty(WasiError.prototype, 'name', {\n configurable: true,\n writable: true,\n value: 'WasiError'\n});\n\nconst RIGHTS_ALL = WasiRights.FD_DATASYNC |\n WasiRights.FD_READ |\n WasiRights.FD_SEEK |\n WasiRights.FD_FDSTAT_SET_FLAGS |\n WasiRights.FD_SYNC |\n WasiRights.FD_TELL |\n WasiRights.FD_WRITE |\n WasiRights.FD_ADVISE |\n WasiRights.FD_ALLOCATE |\n WasiRights.PATH_CREATE_DIRECTORY |\n WasiRights.PATH_CREATE_FILE |\n WasiRights.PATH_LINK_SOURCE |\n WasiRights.PATH_LINK_TARGET |\n WasiRights.PATH_OPEN |\n WasiRights.FD_READDIR |\n WasiRights.PATH_READLINK |\n WasiRights.PATH_RENAME_SOURCE |\n WasiRights.PATH_RENAME_TARGET |\n WasiRights.PATH_FILESTAT_GET |\n WasiRights.PATH_FILESTAT_SET_SIZE |\n WasiRights.PATH_FILESTAT_SET_TIMES |\n WasiRights.FD_FILESTAT_GET |\n WasiRights.FD_FILESTAT_SET_TIMES |\n WasiRights.FD_FILESTAT_SET_SIZE |\n WasiRights.PATH_SYMLINK |\n WasiRights.PATH_UNLINK_FILE |\n WasiRights.PATH_REMOVE_DIRECTORY |\n WasiRights.POLL_FD_READWRITE |\n WasiRights.SOCK_SHUTDOWN |\n WasiRights.SOCK_ACCEPT;\nconst BLOCK_DEVICE_BASE = RIGHTS_ALL;\nconst BLOCK_DEVICE_INHERITING = RIGHTS_ALL;\nconst CHARACTER_DEVICE_BASE = RIGHTS_ALL;\nconst CHARACTER_DEVICE_INHERITING = RIGHTS_ALL;\nconst REGULAR_FILE_BASE = WasiRights.FD_DATASYNC |\n WasiRights.FD_READ |\n WasiRights.FD_SEEK |\n WasiRights.FD_FDSTAT_SET_FLAGS |\n WasiRights.FD_SYNC |\n WasiRights.FD_TELL |\n WasiRights.FD_WRITE |\n WasiRights.FD_ADVISE |\n WasiRights.FD_ALLOCATE |\n WasiRights.FD_FILESTAT_GET |\n WasiRights.FD_FILESTAT_SET_SIZE |\n WasiRights.FD_FILESTAT_SET_TIMES |\n WasiRights.POLL_FD_READWRITE;\nconst REGULAR_FILE_INHERITING = /*#__PURE__*/ BigInt(0);\nconst DIRECTORY_BASE = WasiRights.FD_FDSTAT_SET_FLAGS |\n WasiRights.FD_SYNC |\n WasiRights.FD_ADVISE |\n WasiRights.PATH_CREATE_DIRECTORY |\n WasiRights.PATH_CREATE_FILE |\n WasiRights.PATH_LINK_SOURCE |\n WasiRights.PATH_LINK_TARGET |\n WasiRights.PATH_OPEN |\n WasiRights.FD_READDIR |\n WasiRights.PATH_READLINK |\n WasiRights.PATH_RENAME_SOURCE |\n WasiRights.PATH_RENAME_TARGET |\n WasiRights.PATH_FILESTAT_GET |\n WasiRights.PATH_FILESTAT_SET_SIZE |\n WasiRights.PATH_FILESTAT_SET_TIMES |\n WasiRights.FD_FILESTAT_GET |\n WasiRights.FD_FILESTAT_SET_TIMES |\n WasiRights.PATH_SYMLINK |\n WasiRights.PATH_UNLINK_FILE |\n WasiRights.PATH_REMOVE_DIRECTORY |\n WasiRights.POLL_FD_READWRITE;\nconst DIRECTORY_INHERITING = DIRECTORY_BASE | REGULAR_FILE_BASE;\nconst SOCKET_BASE = (WasiRights.FD_READ |\n WasiRights.FD_FDSTAT_SET_FLAGS |\n WasiRights.FD_WRITE |\n WasiRights.FD_FILESTAT_GET |\n WasiRights.POLL_FD_READWRITE |\n WasiRights.SOCK_SHUTDOWN);\nconst SOCKET_INHERITING = RIGHTS_ALL;\nconst TTY_BASE = WasiRights.FD_READ |\n WasiRights.FD_FDSTAT_SET_FLAGS |\n WasiRights.FD_WRITE |\n WasiRights.FD_FILESTAT_GET |\n WasiRights.POLL_FD_READWRITE;\nconst TTY_INHERITING = /*#__PURE__*/ BigInt(0);\nfunction getRights(stdio, fd, flags, type) {\n const ret = {\n base: BigInt(0),\n inheriting: BigInt(0)\n };\n if (type === 0 /* WasiFileType.UNKNOWN */) {\n throw new WasiError('Unknown file type', 28 /* WasiErrno.EINVAL */);\n }\n switch (type) {\n case 4 /* WasiFileType.REGULAR_FILE */:\n ret.base = REGULAR_FILE_BASE;\n ret.inheriting = REGULAR_FILE_INHERITING;\n break;\n case 3 /* WasiFileType.DIRECTORY */:\n ret.base = DIRECTORY_BASE;\n ret.inheriting = DIRECTORY_INHERITING;\n break;\n case 6 /* WasiFileType.SOCKET_STREAM */:\n case 5 /* WasiFileType.SOCKET_DGRAM */:\n ret.base = SOCKET_BASE;\n ret.inheriting = SOCKET_INHERITING;\n break;\n case 2 /* WasiFileType.CHARACTER_DEVICE */:\n if (stdio.indexOf(fd) !== -1) {\n ret.base = TTY_BASE;\n ret.inheriting = TTY_INHERITING;\n }\n else {\n ret.base = CHARACTER_DEVICE_BASE;\n ret.inheriting = CHARACTER_DEVICE_INHERITING;\n }\n break;\n case 1 /* WasiFileType.BLOCK_DEVICE */:\n ret.base = BLOCK_DEVICE_BASE;\n ret.inheriting = BLOCK_DEVICE_INHERITING;\n break;\n default:\n ret.base = BigInt(0);\n ret.inheriting = BigInt(0);\n }\n /* Disable read/write bits depending on access mode. */\n const read_or_write_only = flags & (0 | 1 | 2);\n if (read_or_write_only === 0) {\n ret.base &= ~WasiRights.FD_WRITE;\n }\n else if (read_or_write_only === 1) {\n ret.base &= ~WasiRights.FD_READ;\n }\n return ret;\n}\n\nfunction concatBuffer(buffers, size) {\n let total = 0;\n if (typeof size === 'number' && size >= 0) {\n total = size;\n }\n else {\n for (let i = 0; i < buffers.length; i++) {\n const buffer = buffers[i];\n total += buffer.length;\n }\n }\n let pos = 0;\n const ret = new Uint8Array(total);\n for (let i = 0; i < buffers.length; i++) {\n const buffer = buffers[i];\n ret.set(buffer, pos);\n pos += buffer.length;\n }\n return ret;\n}\nclass FileDescriptor {\n constructor(id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen) {\n this.id = id;\n this.fd = fd;\n this.path = path;\n this.realPath = realPath;\n this.type = type;\n this.rightsBase = rightsBase;\n this.rightsInheriting = rightsInheriting;\n this.preopen = preopen;\n this.pos = BigInt(0);\n this.size = BigInt(0);\n }\n seek(offset, whence) {\n if (whence === 0 /* WasiWhence.SET */) {\n this.pos = BigInt(offset);\n }\n else if (whence === 1 /* WasiWhence.CUR */) {\n this.pos += BigInt(offset);\n }\n else if (whence === 2 /* WasiWhence.END */) {\n this.pos = BigInt(this.size) - BigInt(offset);\n }\n else {\n throw new WasiError('Unknown whence', 29 /* WasiErrno.EIO */);\n }\n return this.pos;\n }\n}\nclass StandardOutput extends FileDescriptor {\n constructor(log, id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen) {\n super(id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen);\n this._log = log;\n this._buf = null;\n }\n write(buffer) {\n const originalBuffer = buffer;\n if (this._buf) {\n buffer = concatBuffer([this._buf, buffer]);\n this._buf = null;\n }\n if (buffer.indexOf(10) === -1) {\n this._buf = buffer;\n return originalBuffer.byteLength;\n }\n let written = 0;\n let lastBegin = 0;\n let index;\n while ((index = buffer.indexOf(10, written)) !== -1) {\n const str = new TextDecoder().decode(buffer.subarray(lastBegin, index));\n this._log(str);\n written += index - lastBegin + 1;\n lastBegin = index + 1;\n }\n if (written < buffer.length) {\n this._buf = buffer.slice(written);\n }\n return originalBuffer.byteLength;\n }\n}\nfunction toFileType(stat) {\n if (stat.isBlockDevice())\n return 1 /* WasiFileType.BLOCK_DEVICE */;\n if (stat.isCharacterDevice())\n return 2 /* WasiFileType.CHARACTER_DEVICE */;\n if (stat.isDirectory())\n return 3 /* WasiFileType.DIRECTORY */;\n if (stat.isSocket())\n return 6 /* WasiFileType.SOCKET_STREAM */;\n if (stat.isFile())\n return 4 /* WasiFileType.REGULAR_FILE */;\n if (stat.isSymbolicLink())\n return 7 /* WasiFileType.SYMBOLIC_LINK */;\n return 0 /* WasiFileType.UNKNOWN */;\n}\nfunction toFileStat(view, buf, stat) {\n view.setBigUint64(buf, stat.dev, true);\n view.setBigUint64(buf + 8, stat.ino, true);\n view.setBigUint64(buf + 16, BigInt(toFileType(stat)), true);\n view.setBigUint64(buf + 24, stat.nlink, true);\n view.setBigUint64(buf + 32, stat.size, true);\n view.setBigUint64(buf + 40, stat.atimeMs * BigInt(1000000), true);\n view.setBigUint64(buf + 48, stat.mtimeMs * BigInt(1000000), true);\n view.setBigUint64(buf + 56, stat.ctimeMs * BigInt(1000000), true);\n}\nclass FileDescriptorTable {\n constructor(options) {\n this.used = 0;\n this.size = options.size;\n this.fds = Array(options.size);\n this.stdio = [options.in, options.out, options.err];\n this.print = options.print;\n this.printErr = options.printErr;\n this.insertStdio(options.in, 0, '<stdin>');\n this.insertStdio(options.out, 1, '<stdout>');\n this.insertStdio(options.err, 2, '<stderr>');\n }\n insertStdio(fd, expected, name) {\n const type = 2 /* WasiFileType.CHARACTER_DEVICE */;\n const { base, inheriting } = getRights(this.stdio, fd, 2 /* FileControlFlag.O_RDWR */, type);\n const wrap = this.insert(fd, name, name, type, base, inheriting, 0);\n if (wrap.id !== expected) {\n throw new WasiError(`id: ${wrap.id} !== expected: ${expected}`, 8 /* WasiErrno.EBADF */);\n }\n return wrap;\n }\n insert(fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen) {\n var _a, _b;\n let index = -1;\n if (this.used >= this.size) {\n const newSize = this.size * 2;\n this.fds.length = newSize;\n index = this.size;\n this.size = newSize;\n }\n else {\n for (let i = 0; i < this.size; ++i) {\n if (this.fds[i] == null) {\n index = i;\n break;\n }\n }\n }\n let entry;\n if (mappedPath === '<stdout>') {\n entry = new StandardOutput((_a = this.print) !== null && _a !== void 0 ? _a : console.log, index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen);\n }\n else if (mappedPath === '<stderr>') {\n entry = new StandardOutput((_b = this.printErr) !== null && _b !== void 0 ? _b : console.error, index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen);\n }\n else {\n entry = new FileDescriptor(index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen);\n }\n this.fds[index] = entry;\n this.used++;\n return entry;\n }\n get(id, base, inheriting) {\n if (id >= this.size) {\n throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);\n }\n const entry = this.fds[id];\n if (!entry || entry.id !== id) {\n throw new WasiError('Bad file descriptor', 8 /* WasiErrno.EBADF */);\n }\n /* Validate that the fd has the necessary rights. */\n if ((~entry.rightsBase & base) !== BigInt(0) || (~entry.rightsInheriting & inheriting) !== BigInt(0)) {\n throw new WasiError('Capabilities insufficient', 76 /* WasiErrno.ENOTCAPABLE */);\n }\n return entry;\n }\n remove(id) {\n if (id >= this.size) {\n throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);\n }\n const entry = this.fds[id];\n if (!entry || entry.id !== id) {\n throw new WasiError('Bad file descriptor', 8 /* WasiErrno.EBADF */);\n }\n this.fds[id] = undefined;\n this.used--;\n }\n}\nclass SyncTable extends FileDescriptorTable {\n constructor(options) {\n super(options);\n this.fs = options.fs;\n }\n getFileTypeByFd(fd) {\n const stats = this.fs.fstatSync(fd, { bigint: true });\n return toFileType(stats);\n }\n insertPreopen(fd, mappedPath, realPath) {\n const type = this.getFileTypeByFd(fd);\n if (type !== 3 /* WasiFileType.DIRECTORY */) {\n throw new WasiError(`Preopen not dir: [\"${mappedPath}\", \"${realPath}\"]`, 54 /* WasiErrno.ENOTDIR */);\n }\n const result = getRights(this.stdio, fd, 0, type);\n return this.insert(fd, mappedPath, realPath, type, result.base, result.inheriting, 1);\n }\n renumber(dst, src) {\n if (dst === src)\n return;\n if (dst >= this.size || src >= this.size) {\n throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);\n }\n const dstEntry = this.fds[dst];\n const srcEntry = this.fds[src];\n if (!dstEntry || !srcEntry || dstEntry.id !== dst || srcEntry.id !== src) {\n throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);\n }\n this.fs.closeSync(dstEntry.fd);\n this.fds[dst] = this.fds[src];\n this.fds[dst].id = dst;\n this.fds[src] = undefined;\n this.used--;\n }\n}\nclass AsyncTable extends FileDescriptorTable {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(options) {\n super(options);\n }\n async getFileTypeByFd(fd) {\n const stats = await fd.stat({ bigint: true });\n return toFileType(stats);\n }\n async insertPreopen(fd, mappedPath, realPath) {\n const type = await this.getFileTypeByFd(fd);\n if (type !== 3 /* WasiFileType.DIRECTORY */) {\n throw new WasiError(`Preopen not dir: [\"${mappedPath}\", \"${realPath}\"]`, 54 /* WasiErrno.ENOTDIR */);\n }\n const result = getRights(this.stdio, fd.fd, 0, type);\n return this.insert(fd, mappedPath, realPath, type, result.base, result.inheriting, 1);\n }\n async renumber(dst, src) {\n if (dst === src)\n return;\n if (dst >= this.size || src >= this.size) {\n throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);\n }\n const dstEntry = this.fds[dst];\n const srcEntry = this.fds[src];\n if (!dstEntry || !srcEntry || dstEntry.id !== dst || srcEntry.id !== src) {\n throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);\n }\n await dstEntry.fd.close();\n this.fds[dst] = this.fds[src];\n this.fds[dst].id = dst;\n this.fds[src] = undefined;\n this.used--;\n }\n}\n\n/** @public */\nconst WebAssemblyMemory = /*#__PURE__*/ (function () { return _WebAssembly.Memory; })();\n/** @public */\nclass Memory extends WebAssemblyMemory {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(descriptor) {\n super(descriptor);\n }\n get HEAP8() { return new Int8Array(super.buffer); }\n get HEAPU8() { return new Uint8Array(super.buffer); }\n get HEAP16() { return new Int16Array(super.buffer); }\n get HEAPU16() { return new Uint16Array(super.buffer); }\n get HEAP32() { return new Int32Array(super.buffer); }\n get HEAPU32() { return new Uint32Array(super.buffer); }\n get HEAP64() { return new BigInt64Array(super.buffer); }\n get HEAPU64() { return new BigUint64Array(super.buffer); }\n get HEAPF32() { return new Float32Array(super.buffer); }\n get HEAPF64() { return new Float64Array(super.buffer); }\n get view() { return new DataView(super.buffer); }\n}\n/** @public */\nfunction extendMemory(memory) {\n if (Object.getPrototypeOf(memory) === _WebAssembly.Memory.prototype) {\n Object.setPrototypeOf(memory, Memory.prototype);\n }\n return memory;\n}\n\nfunction checkWebAssemblyFunction() {\n const WebAssemblyFunction = _WebAssembly.Function;\n if (typeof WebAssemblyFunction !== 'function') {\n throw new Error('WebAssembly.Function is not supported in this environment.' +\n ' If you are using V8 based browser like Chrome, try to specify' +\n ' --js-flags=\"--wasm-staging --experimental-wasm-stack-switching\"');\n }\n return WebAssemblyFunction;\n}\n/** @public */\nfunction wrapAsyncImport(f, parameterType, returnType) {\n const WebAssemblyFunction = checkWebAssemblyFunction();\n if (typeof f !== 'function') {\n throw new TypeError('Function required');\n }\n const parameters = parameterType.slice(0);\n parameters.unshift('externref');\n return new WebAssemblyFunction({ parameters, results: returnType }, f, { suspending: 'first' });\n}\n/** @public */\nfunction wrapAsyncExport(f) {\n const WebAssemblyFunction = checkWebAssemblyFunction();\n if (typeof f !== 'function') {\n throw new TypeError('Function required');\n }\n return new WebAssemblyFunction({ parameters: [...WebAssemblyFunction.type(f).parameters.slice(1)], results: ['externref'] }, f, { promising: 'first' });\n}\n/** @public */\nfunction wrapExports(exports, needWrap) {\n return wrapInstanceExports(exports, (exportValue, name) => {\n let ignore = typeof exportValue !== 'function';\n if (Array.isArray(needWrap)) {\n ignore = ignore || (needWrap.indexOf(name) === -1);\n }\n return ignore ? exportValue : wrapAsyncExport(exportValue);\n });\n}\n\nfunction copyMemory(targets, src) {\n if (targets.length === 0 || src.length === 0)\n return 0;\n let copied = 0;\n let left = src.length - copied;\n for (let i = 0; i < targets.length; ++i) {\n const target = targets[i];\n if (left < target.length) {\n target.set(src.subarray(copied, copied + left), 0);\n copied += left;\n left = 0;\n return copied;\n }\n target.set(src.subarray(copied, copied + target.length), 0);\n copied += target.length;\n left -= target.length;\n }\n return copied;\n}\nconst _memory = new WeakMap();\nconst _wasi = new WeakMap();\nconst _fs = new WeakMap();\nfunction getMemory(wasi) {\n return _memory.get(wasi);\n}\nfunction getFs(wasi) {\n const fs = _fs.get(wasi);\n if (!fs)\n throw new Error('filesystem is unavailable');\n return fs;\n}\nfunction handleError(err) {\n if (err instanceof WasiError) {\n if (((process.env.NODE_ENV)) !== 'production') {\n console.warn(err);\n }\n return err.errno;\n }\n switch (err.code) {\n case 'ENOENT': return 44 /* WasiErrno.ENOENT */;\n case 'EBADF': return 8 /* WasiErrno.EBADF */;\n case 'EINVAL': return 28 /* WasiErrno.EINVAL */;\n case 'EPERM': return 63 /* WasiErrno.EPERM */;\n case 'EPROTO': return 65 /* WasiErrno.EPROTO */;\n case 'EEXIST': return 20 /* WasiErrno.EEXIST */;\n case 'ENOTDIR': return 54 /* WasiErrno.ENOTDIR */;\n case 'EMFILE': return 33 /* WasiErrno.EMFILE */;\n case 'EACCES': return 2 /* WasiErrno.EACCES */;\n case 'EISDIR': return 31 /* WasiErrno.EISDIR */;\n case 'ENOTEMPTY': return 55 /* WasiErrno.ENOTEMPTY */;\n case 'ENOSYS': return 52 /* WasiErrno.ENOSYS */;\n }\n throw err;\n}\nfunction defineName(name, f) {\n Object.defineProperty(f, 'name', { value: name });\n return f;\n}\nfunction tryCall(f, wasi, args) {\n let r;\n try {\n r = f.apply(wasi, args);\n }\n catch (err) {\n return handleError(err);\n }\n if (isPromiseLike(r)) {\n return r.then(_ => _, handleError);\n }\n return r;\n}\nfunction syscallWrap(self, name, f) {\n let debug = false;\n const NODE_DEBUG_NATIVE = (() => {\n try {\n return process.env.NODE_DEBUG_NATIVE;\n }\n catch (_) {\n return undefined;\n }\n })();\n if (typeof NODE_DEBUG_NATIVE === 'string' && NODE_DEBUG_NATIVE.split(',').includes('wasi')) {\n debug = true;\n }\n return debug\n ? defineName(name, function () {\n const args = Array.prototype.slice.call(arguments);\n let debugArgs = [`${name}(${Array.from({ length: arguments.length }).map(() => '%d').join(', ')})`];\n debugArgs = debugArgs.concat(args);\n console.debug.apply(console, debugArgs);\n return tryCall(f, self, args);\n })\n : defineName(name, function () {\n return tryCall(f, self, arguments);\n });\n}\nfunction resolvePathSync(fs, fileDescriptor, path, flags) {\n let resolvedPath = resolve(fileDescriptor.realPath, path);\n if ((flags & 1) === 1) {\n try {\n resolvedPath = fs.readlinkSync(resolvedPath);\n }\n catch (err) {\n if (err.code !== 'EINVAL' && err.code !== 'ENOENT') {\n throw err;\n }\n }\n }\n return resolvedPath;\n}\nasync function resolvePathAsync(fs, fileDescriptor, path, flags) {\n let resolvedPath = resolve(fileDescriptor.realPath, path);\n if ((flags & 1) === 1) {\n try {\n resolvedPath = await fs.promises.readlink(resolvedPath);\n }\n catch (err) {\n if (err.code !== 'EINVAL' && err.code !== 'ENOENT') {\n throw err;\n }\n }\n }\n return resolvedPath;\n}\n// eslint-disable-next-line spaced-comment\nconst encoder = /*#__PURE__*/ new TextEncoder();\n// eslint-disable-next-line spaced-comment\nconst decoder = /*#__PURE__*/ new TextDecoder();\nconst INT64_MAX = (BigInt(1) << BigInt(63)) - BigInt(1);\nfunction readStdin() {\n const value = window.prompt();\n if (value === null)\n return new Uint8Array();\n const buffer = new TextEncoder().encode(value + '\\n');\n return buffer;\n}\nfunction validateFstFlagsOrReturn(flags) {\n return (Boolean((flags) & ~(1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */ |\n 4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */)) ||\n ((flags) & (1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */)) ===\n (1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */) ||\n ((flags) & (4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */)) ===\n (4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */));\n}\nclass WASI$1 {\n constructor(args, env, fds, asyncFs, fs, asyncify) {\n this.args_get = syscallWrap(this, 'args_get', function (argv, argv_buf) {\n argv = Number(argv);\n argv_buf = Number(argv_buf);\n if (argv === 0 || argv_buf === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const args = wasi.args;\n for (let i = 0; i < args.length; ++i) {\n const arg = args[i];\n view.setInt32(argv, argv_buf, true);\n argv += 4;\n const data = encoder.encode(arg + '\\0');\n HEAPU8.set(data, argv_buf);\n argv_buf += data.length;\n }\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.args_sizes_get = syscallWrap(this, 'args_sizes_get', function (argc, argv_buf_size) {\n argc = Number(argc);\n argv_buf_size = Number(argv_buf_size);\n if (argc === 0 || argv_buf_size === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { view } = getMemory(this);\n const wasi = _wasi.get(this);\n const args = wasi.args;\n view.setUint32(argc, args.length, true);\n view.setUint32(argv_buf_size, encoder.encode(args.join('\\0') + '\\0').length, true);\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.environ_get = syscallWrap(this, 'environ_get', function (environ, environ_buf) {\n environ = Number(environ);\n environ_buf = Number(environ_buf);\n if (environ === 0 || environ_buf === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const env = wasi.env;\n for (let i = 0; i < env.length; ++i) {\n const pair = env[i];\n view.setInt32(environ, environ_buf, true);\n environ += 4;\n const data = encoder.encode(pair + '\\0');\n HEAPU8.set(data, environ_buf);\n environ_buf += data.length;\n }\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.environ_sizes_get = syscallWrap(this, 'environ_sizes_get', function (len, buflen) {\n len = Number(len);\n buflen = Number(buflen);\n if (len === 0 || buflen === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { view } = getMemory(this);\n const wasi = _wasi.get(this);\n view.setUint32(len, wasi.env.length, true);\n view.setUint32(buflen, encoder.encode(wasi.env.join('\\0') + '\\0').length, true);\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.clock_res_get = syscallWrap(this, 'clock_res_get', function (id, resolution) {\n resolution = Number(resolution);\n if (resolution === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { view } = getMemory(this);\n switch (id) {\n case 0 /* WasiClockid.REALTIME */:\n view.setBigUint64(resolution, BigInt(1000000), true);\n return 0 /* WasiErrno.ESUCCESS */;\n case 1 /* WasiClockid.MONOTONIC */:\n case 2 /* WasiClockid.PROCESS_CPUTIME_ID */:\n case 3 /* WasiClockid.THREAD_CPUTIME_ID */:\n view.setBigUint64(resolution, BigInt(1000), true);\n return 0 /* WasiErrno.ESUCCESS */;\n default: return 28 /* WasiErrno.EINVAL */;\n }\n });\n this.clock_time_get = syscallWrap(this, 'clock_time_get', function (id, _percision, time) {\n time = Number(time);\n if (time === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { view } = getMemory(this);\n switch (id) {\n case 0 /* WasiClockid.REALTIME */:\n view.setBigUint64(time, BigInt(Date.now()) * BigInt(1000000), true);\n return 0 /* WasiErrno.ESUCCESS */;\n case 1 /* WasiClockid.MONOTONIC */:\n case 2 /* WasiClockid.PROCESS_CPUTIME_ID */:\n case 3 /* WasiClockid.THREAD_CPUTIME_ID */: {\n const t = performance.now() / 1000;\n const s = Math.trunc(t);\n const ms = Math.floor((t - s) * 1000);\n const result = BigInt(s) * BigInt(1000000000) + BigInt(ms) * BigInt(1000000);\n view.setBigUint64(time, result, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }\n default: return 28 /* WasiErrno.EINVAL */;\n }\n });\n this.fd_advise = syscallWrap(this, 'fd_advise', function (_fd, _offset, _len, _advice) {\n return 52 /* WasiErrno.ENOSYS */;\n });\n this.fd_fdstat_get = syscallWrap(this, 'fd_fdstat_get', function (fd, fdstat) {\n fdstat = Number(fdstat);\n if (fdstat === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));\n const { view } = getMemory(this);\n view.setUint16(fdstat, fileDescriptor.type, true);\n view.setUint16(fdstat + 2, 0, true);\n view.setBigUint64(fdstat + 8, fileDescriptor.rightsBase, true);\n view.setBigUint64(fdstat + 16, fileDescriptor.rightsInheriting, true);\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.fd_fdstat_set_flags = syscallWrap(this, 'fd_fdstat_set_flags', function (_fd, _flags) {\n return 52 /* WasiErrno.ENOSYS */;\n });\n this.fd_fdstat_set_rights = syscallWrap(this, 'fd_fdstat_set_rights', function (fd, rightsBase, rightsInheriting) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));\n if ((rightsBase | fileDescriptor.rightsBase) > fileDescriptor.rightsBase) {\n return 76 /* WasiErrno.ENOTCAPABLE */;\n }\n if ((rightsInheriting | fileDescriptor.rightsInheriting) >\n fileDescriptor.rightsInheriting) {\n return 76 /* WasiErrno.ENOTCAPABLE */;\n }\n fileDescriptor.rightsBase = rightsBase;\n fileDescriptor.rightsInheriting = rightsInheriting;\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.fd_prestat_get = syscallWrap(this, 'fd_prestat_get', function (fd, prestat) {\n prestat = Number(prestat);\n if (prestat === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const wasi = _wasi.get(this);\n let fileDescriptor;\n try {\n fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));\n }\n catch (err) {\n if (err instanceof WasiError)\n return err.errno;\n throw err;\n }\n if (fileDescriptor.preopen !== 1)\n return 28 /* WasiErrno.EINVAL */;\n const { view } = getMemory(this);\n // preopen type is dir(0)\n view.setUint32(prestat, 0, true);\n view.setUint32(prestat + 4, encoder.encode(fileDescriptor.path).length, true);\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.fd_prestat_dir_name = syscallWrap(this, 'fd_prestat_dir_name', function (fd, path, path_len) {\n path = Number(path);\n path_len = Number(path_len);\n if (path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));\n if (fileDescriptor.preopen !== 1)\n return 8 /* WasiErrno.EBADF */;\n const buffer = encoder.encode(fileDescriptor.path);\n const size = buffer.length;\n if (size > path_len)\n return 42 /* WasiErrno.ENOBUFS */;\n const { HEAPU8 } = getMemory(this);\n HEAPU8.set(buffer, path);\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.fd_seek = syscallWrap(this, 'fd_seek', function (fd, offset, whence, newOffset) {\n newOffset = Number(newOffset);\n if (newOffset === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n if (fd === 0 || fd === 1 || fd === 2)\n return 0 /* WasiErrno.ESUCCESS */;\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SEEK, BigInt(0));\n const r = fileDescriptor.seek(offset, whence);\n const { view } = getMemory(this);\n view.setBigUint64(newOffset, r, true);\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.fd_tell = syscallWrap(this, 'fd_tell', function (fd, offset) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_TELL, BigInt(0));\n const pos = BigInt(fileDescriptor.pos);\n const { view } = getMemory(this);\n view.setBigUint64(Number(offset), pos, true);\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.poll_oneoff = syscallWrap(this, 'poll_oneoff', function (in_ptr, out_ptr, nsubscriptions, nevents) {\n in_ptr = Number(in_ptr);\n out_ptr = Number(out_ptr);\n nevents = Number(nevents);\n nsubscriptions = Number(nsubscriptions);\n nsubscriptions = nsubscriptions >>> 0;\n if (in_ptr === 0 || out_ptr === 0 || nsubscriptions === 0 || nevents === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { view } = getMemory(this);\n view.setUint32(nevents, 0, true);\n let i = 0;\n let timer_userdata = BigInt(0);\n let cur_timeout = BigInt(0);\n let has_timeout = 0;\n let min_timeout = BigInt(0);\n let sub;\n const subscriptions = Array(nsubscriptions);\n for (i = 0; i < nsubscriptions; i++) {\n sub = in_ptr + i * 48;\n const userdata = view.getBigUint64(sub, true);\n const type = view.getUint8(sub + 8);\n const clockIdOrFd = view.getUint32(sub + 16, true);\n const timeout = view.getBigUint64(sub + 24, true);\n const precision = view.getBigUint64(sub + 32, true);\n const flags = view.getUint16(sub + 40, true);\n subscriptions[i] = {\n userdata,\n type,\n u: {\n clock: {\n clock_id: clockIdOrFd,\n timeout,\n precision,\n flags\n },\n fd_readwrite: {\n fd: clockIdOrFd\n }\n }\n };\n }\n const fdevents = [];\n for (i = 0; i < nsubscriptions; i++) {\n sub = subscriptions[i];\n switch (sub.type) {\n case 0 /* WasiEventType.CLOCK */: {\n if (sub.u.clock.flags === 1 /* WasiSubclockflags.ABSTIME */) {\n /* Convert absolute time to relative delay. */\n const now = BigInt(Date.now()) * BigInt(1000000);\n cur_timeout = sub.u.clock.timeout - now;\n }\n else {\n cur_timeout = sub.u.clock.timeout;\n }\n if (has_timeout === 0 || cur_timeout < min_timeout) {\n min_timeout = cur_timeout;\n timer_userdata = sub.userdata;\n has_timeout = 1;\n }\n break;\n }\n case 1 /* WasiEventType.FD_READ */:\n case 2 /* WasiEventType.FD_WRITE */:\n fdevents.push(sub);\n break;\n default: return 28 /* WasiErrno.EINVAL */;\n }\n }\n if (fdevents.length > 0) {\n for (i = 0; i < fdevents.length; i++) {\n const fdevent = fdevents[i];\n const event = out_ptr + 32 * i;\n view.setBigUint64(event, fdevent.userdata, true);\n view.setUint32(event + 8, 52 /* WasiErrno.ENOSYS */, true);\n view.setUint32(event + 12, fdevent.type, true);\n view.setBigUint64(event + 16, BigInt(0), true);\n view.setUint16(event + 24, 0, true);\n view.setUint32(nevents, 1, true);\n }\n view.setUint32(nevents, fdevents.length, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }\n if (has_timeout) {\n const delay = Number(min_timeout / BigInt(1000000));\n // if (isMainThread || typeof SharedArrayBuffer !== 'function') {\n sleepBreakIf(delay, () => false);\n // } else {\n // const buf = new SharedArrayBuffer(4)\n // const arr = new Int32Array(buf)\n // postMsg({\n // __tybys_wasm_util_wasi__: {\n // type: 'set-timeout',\n // payload: {\n // buffer: buf,\n // delay\n // }\n // }\n // })\n // Atomics.wait(arr, 0, 0)\n // }\n const event = out_ptr;\n view.setBigUint64(event, timer_userdata, true);\n view.setUint32(event + 8, 0 /* WasiErrno.ESUCCESS */, true);\n view.setUint32(event + 12, 0 /* WasiEventType.CLOCK */, true);\n view.setUint32(nevents, 1, true);\n }\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.proc_exit = syscallWrap(this, 'proc_exit', function (rval) {\n if ((typeof process === 'object') && (process !== null) && (typeof process.exit === 'function')) {\n process.exit(rval);\n }\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.proc_raise = syscallWrap(this, 'proc_raise', function (_sig) {\n return 52 /* WasiErrno.ENOSYS */;\n });\n this.sched_yield = syscallWrap(this, 'sched_yield', function () {\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.random_get = typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function'\n ? syscallWrap(this, 'random_get', function (buf, buf_len) {\n buf = Number(buf);\n if (buf === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n buf_len = Number(buf_len);\n const { HEAPU8, view } = getMemory(this);\n if ((typeof SharedArrayBuffer === 'function' && HEAPU8.buffer instanceof SharedArrayBuffer) ||\n (Object.prototype.toString.call(HEAPU8.buffer) === '[object SharedArrayBuffer]')) {\n for (let i = buf; i < buf + buf_len; ++i) {\n view.setUint8(i, Math.floor(Math.random() * 256));\n }\n return 0 /* WasiErrno.ESUCCESS */;\n }\n let pos;\n const stride = 65536;\n for (pos = 0; pos + stride < buf_len; pos += stride) {\n crypto.getRandomValues(HEAPU8.subarray(buf + pos, buf + pos + stride));\n }\n crypto.getRandomValues(HEAPU8.subarray(buf + pos, buf + buf_len));\n return 0 /* WasiErrno.ESUCCESS */;\n })\n : syscallWrap(this, 'random_get', function (buf, buf_len) {\n buf = Number(buf);\n if (buf === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n buf_len = Number(buf_len);\n const { view } = getMemory(this);\n for (let i = buf; i < buf + buf_len; ++i) {\n view.setUint8(i, Math.floor(Math.random() * 256));\n }\n return 0 /* WasiErrno.ESUCCESS */;\n });\n this.sock_recv = syscallWrap(this, 'sock_recv', function () {\n return 58 /* WasiErrno.ENOTSUP */;\n });\n this.sock_send = syscallWrap(this, 'sock_send', function () {\n return 58 /* WasiErrno.ENOTSUP */;\n });\n this.sock_shutdown = syscallWrap(this, 'sock_shutdown', function () {\n return 58 /* WasiErrno.ENOTSUP */;\n });\n this.sock_accept = syscallWrap(this, 'sock_accept', function () {\n return 58 /* WasiErrno.ENOTSUP */;\n });\n _wasi.set(this, {\n fds,\n args,\n env\n });\n if (fs)\n _fs.set(this, fs);\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this;\n function defineImport(name, syncVersion, asyncVersion, parameterType, returnType) {\n if (asyncFs) {\n if (asyncify) {\n _this[name] = asyncify.wrapImportFunction(syscallWrap(_this, name, asyncVersion));\n }\n else {\n _this[name] = wrapAsyncImport(syscallWrap(_this, name, asyncVersion), parameterType, returnType);\n }\n }\n else {\n _this[name] = syscallWrap(_this, name, syncVersion);\n }\n }\n defineImport('fd_allocate', function fd_allocate(fd, offset, len) {\n const wasi = _wasi.get(this);\n const fs = getFs(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_ALLOCATE, BigInt(0));\n const stat = fs.fstatSync(fileDescriptor.fd, { bigint: true });\n if (stat.size < offset + len) {\n fs.ftruncateSync(fileDescriptor.fd, Number(offset + len));\n }\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_allocate(fd, offset, len) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_ALLOCATE, BigInt(0));\n const h = fileDescriptor.fd;\n const stat = await h.stat({ bigint: true });\n if (stat.size < offset + len) {\n await h.truncate(Number(offset + len));\n }\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i64', 'f64'], ['i32']);\n defineImport('fd_close', function fd_close(fd) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));\n const fs = getFs(this);\n fs.closeSync(fileDescriptor.fd);\n wasi.fds.remove(fd);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_close(fd) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));\n await fileDescriptor.fd.close();\n wasi.fds.remove(fd);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32'], ['i32']);\n defineImport('fd_datasync', function fd_datasync(fd) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_DATASYNC, BigInt(0));\n const fs = getFs(this);\n fs.fdatasyncSync(fileDescriptor.fd);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_datasync(fd) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_DATASYNC, BigInt(0));\n await fileDescriptor.fd.datasync();\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32'], ['i32']);\n defineImport('fd_filestat_get', function fd_filestat_get(fd, buf) {\n buf = Number(buf);\n if (buf === 0)\n return 28 /* WasiErrno.EINVAL */;\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_GET, BigInt(0));\n const fs = getFs(this);\n const stat = fs.fstatSync(fileDescriptor.fd, { bigint: true });\n const { view } = getMemory(this);\n toFileStat(view, buf, stat);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_filestat_get(fd, buf) {\n buf = Number(buf);\n if (buf === 0)\n return 28 /* WasiErrno.EINVAL */;\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_GET, BigInt(0));\n const h = fileDescriptor.fd;\n const stat = await h.stat({ bigint: true });\n const { view } = getMemory(this);\n toFileStat(view, buf, stat);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32'], ['i32']);\n defineImport('fd_filestat_set_size', function fd_filestat_set_size(fd, size) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_SIZE, BigInt(0));\n const fs = getFs(this);\n fs.ftruncateSync(fileDescriptor.fd, Number(size));\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_filestat_set_size(fd, size) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_SIZE, BigInt(0));\n const h = fileDescriptor.fd;\n await h.truncate(Number(size));\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i64'], ['i32']);\n function fdFilestatGetTimes(fd, atim, mtim, flags) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_TIMES, BigInt(0));\n if ((flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) {\n atim = BigInt(Date.now() * 1000000);\n }\n if ((flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) {\n mtim = BigInt(Date.now() * 1000000);\n }\n return { fileDescriptor, atim, mtim };\n }\n defineImport('fd_filestat_set_times', function fd_filestat_set_times(fd, atim, mtim, flags) {\n if (validateFstFlagsOrReturn(flags)) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { fileDescriptor, atim: atimRes, mtim: mtimRes } = fdFilestatGetTimes.call(this, fd, atim, mtim, flags);\n const fs = getFs(this);\n fs.futimesSync(fileDescriptor.fd, Number(atimRes), Number(mtimRes));\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_filestat_set_times(fd, atim, mtim, flags) {\n if (validateFstFlagsOrReturn(flags)) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { fileDescriptor, atim: atimRes, mtim: mtimRes } = fdFilestatGetTimes.call(this, fd, atim, mtim, flags);\n const h = fileDescriptor.fd;\n await h.utimes(Number(atimRes), Number(mtimRes));\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i64', 'i64', 'i32'], ['i32']);\n defineImport('fd_pread', function fd_pread(fd, iovs, iovslen, offset, size) {\n iovs = Number(iovs);\n size = Number(size);\n if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ | WasiRights.FD_SEEK, BigInt(0));\n if (!iovslen) {\n view.setUint32(size, 0, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }\n let totalSize = 0;\n const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => {\n const offset = iovs + (i * 8);\n const buf = view.getInt32(offset, true);\n const bufLen = view.getUint32(offset + 4, true);\n totalSize += bufLen;\n return HEAPU8.subarray(buf, buf + bufLen);\n });\n let nread = 0;\n const buffer = (() => {\n try {\n return new Uint8Array(new SharedArrayBuffer(totalSize));\n }\n catch (_) {\n return new Uint8Array(totalSize);\n }\n })();\n buffer._isBuffer = true;\n const fs = getFs(this);\n const bytesRead = fs.readSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(offset));\n nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0;\n view.setUint32(size, nread, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function (fd, iovs, iovslen, offset, size) {\n iovs = Number(iovs);\n size = Number(size);\n if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ | WasiRights.FD_SEEK, BigInt(0));\n if (!iovslen) {\n view.setUint32(size, 0, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }\n let totalSize = 0;\n const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => {\n const offset = iovs + (i * 8);\n const buf = view.getInt32(offset, true);\n const bufLen = view.getUint32(offset + 4, true);\n totalSize += bufLen;\n return HEAPU8.subarray(buf, buf + bufLen);\n });\n let nread = 0;\n const buffer = new Uint8Array(totalSize);\n buffer._isBuffer = true;\n const { bytesRead } = await fileDescriptor.fd.read(buffer, 0, buffer.length, Number(offset));\n nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0;\n view.setUint32(size, nread, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']);\n defineImport('fd_pwrite', function fd_pwrite(fd, iovs, iovslen, offset, size) {\n iovs = Number(iovs);\n size = Number(size);\n if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE | WasiRights.FD_SEEK, BigInt(0));\n if (!iovslen) {\n view.setUint32(size, 0, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }\n const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => {\n const offset = iovs + (i * 8);\n const buf = view.getInt32(offset, true);\n const bufLen = view.getUint32(offset + 4, true);\n return HEAPU8.subarray(buf, buf + bufLen);\n }));\n const fs = getFs(this);\n const nwritten = fs.writeSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(offset));\n view.setUint32(size, nwritten, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_pwrite(fd, iovs, iovslen, offset, size) {\n iovs = Number(iovs);\n size = Number(size);\n if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE | WasiRights.FD_SEEK, BigInt(0));\n if (!iovslen) {\n view.setUint32(size, 0, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }\n const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => {\n const offset = iovs + (i * 8);\n const buf = view.getInt32(offset, true);\n const bufLen = view.getUint32(offset + 4, true);\n return HEAPU8.subarray(buf, buf + bufLen);\n }));\n const { bytesWritten } = await fileDescriptor.fd.write(buffer, 0, buffer.length, Number(offset));\n view.setUint32(size, bytesWritten, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']);\n defineImport('fd_read', function fd_read(fd, iovs, iovslen, size) {\n iovs = Number(iovs);\n size = Number(size);\n if ((iovs === 0 && iovslen) || size === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ, BigInt(0));\n if (!iovslen) {\n view.setUint32(size, 0, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }\n let totalSize = 0;\n const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => {\n const offset = iovs + (i * 8);\n const buf = view.getInt32(offset, true);\n const bufLen = view.getUint32(offset + 4, true);\n totalSize += bufLen;\n return HEAPU8.subarray(buf, buf + bufLen);\n });\n let buffer;\n let nread = 0;\n if (fd === 0) {\n if (typeof window === 'undefined' || typeof window.prompt !== 'function') {\n return 58 /* WasiErrno.ENOTSUP */;\n }\n buffer = readStdin();\n nread = buffer ? copyMemory(ioVecs, buffer) : 0;\n }\n else {\n buffer = (() => {\n try {\n return new Uint8Array(new SharedArrayBuffer(totalSize));\n }\n catch (_) {\n return new Uint8Array(totalSize);\n }\n })();\n buffer._isBuffer = true;\n const fs = getFs(this);\n const bytesRead = fs.readSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(fileDescriptor.pos));\n nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0;\n fileDescriptor.pos += BigInt(nread);\n }\n view.setUint32(size, nread, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_read(fd, iovs, iovslen, size) {\n iovs = Number(iovs);\n size = Number(size);\n if ((iovs === 0 && iovslen) || size === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ, BigInt(0));\n if (!iovslen) {\n view.setUint32(size, 0, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }\n let totalSize = 0;\n const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => {\n const offset = iovs + (i * 8);\n const buf = view.getInt32(offset, true);\n const bufLen = view.getUint32(offset + 4, true);\n totalSize += bufLen;\n return HEAPU8.subarray(buf, buf + bufLen);\n });\n let buffer;\n let nread = 0;\n if (fd === 0) {\n if (typeof window === 'undefined' || typeof window.prompt !== 'function') {\n return 58 /* WasiErrno.ENOTSUP */;\n }\n buffer = readStdin();\n nread = buffer ? copyMemory(ioVecs, buffer) : 0;\n }\n else {\n buffer = new Uint8Array(totalSize);\n buffer._isBuffer = true;\n const { bytesRead } = await fileDescriptor.fd.read(buffer, 0, buffer.length, Number(fileDescriptor.pos));\n nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0;\n fileDescriptor.pos += BigInt(nread);\n }\n view.setUint32(size, nread, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i32'], ['i32']);\n defineImport('fd_readdir', function fd_readdir(fd, buf, buf_len, cookie, bufused) {\n buf = Number(buf);\n buf_len = Number(buf_len);\n bufused = Number(bufused);\n if (buf === 0 || bufused === 0)\n return 0 /* WasiErrno.ESUCCESS */;\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READDIR, BigInt(0));\n const fs = getFs(this);\n const entries = fs.readdirSync(fileDescriptor.realPath, { withFileTypes: true });\n const { HEAPU8, view } = getMemory(this);\n let bufferUsed = 0;\n for (let i = Number(cookie); i < entries.length; i++) {\n const nameData = encoder.encode(entries[i].name);\n const entryInfo = fs.statSync(resolve(fileDescriptor.realPath, entries[i].name), { bigint: true });\n const entryData = new Uint8Array(24 + nameData.byteLength);\n const entryView = new DataView(entryData.buffer);\n entryView.setBigUint64(0, BigInt(i + 1), true);\n entryView.setBigUint64(8, BigInt(entryInfo.ino ? entryInfo.ino : 0), true);\n entryView.setUint32(16, nameData.byteLength, true);\n let type;\n if (entries[i].isFile()) {\n type = 4 /* WasiFileType.REGULAR_FILE */;\n }\n else if (entries[i].isDirectory()) {\n type = 3 /* WasiFileType.DIRECTORY */;\n }\n else if (entries[i].isSymbolicLink()) {\n type = 7 /* WasiFileType.SYMBOLIC_LINK */;\n }\n else if (entries[i].isCharacterDevice()) {\n type = 2 /* WasiFileType.CHARACTER_DEVICE */;\n }\n else if (entries[i].isBlockDevice()) {\n type = 1 /* WasiFileType.BLOCK_DEVICE */;\n }\n else if (entries[i].isSocket()) {\n type = 6 /* WasiFileType.SOCKET_STREAM */;\n }\n else {\n type = 0 /* WasiFileType.UNKNOWN */;\n }\n entryView.setUint8(20, type);\n entryData.set(nameData, 24);\n const data = entryData.slice(0, Math.min(entryData.length, buf_len - bufferUsed));\n HEAPU8.set(data, buf + bufferUsed);\n bufferUsed += data.byteLength;\n }\n view.setUint32(bufused, bufferUsed, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_readdir(fd, buf, buf_len, cookie, bufused) {\n buf = Number(buf);\n buf_len = Number(buf_len);\n bufused = Number(bufused);\n if (buf === 0 || bufused === 0)\n return 0 /* WasiErrno.ESUCCESS */;\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READDIR, BigInt(0));\n const fs = getFs(this);\n const entries = await fs.promises.readdir(fileDescriptor.realPath, { withFileTypes: true });\n const { HEAPU8, view } = getMemory(this);\n let bufferUsed = 0;\n for (let i = Number(cookie); i < entries.length; i++) {\n const nameData = encoder.encode(entries[i].name);\n const entryInfo = await fs.promises.stat(resolve(fileDescriptor.realPath, entries[i].name), { bigint: true });\n const entryData = new Uint8Array(24 + nameData.byteLength);\n const entryView = new DataView(entryData.buffer);\n entryView.setBigUint64(0, BigInt(i + 1), true);\n entryView.setBigUint64(8, BigInt(entryInfo.ino ? entryInfo.ino : 0), true);\n entryView.setUint32(16, nameData.byteLength, true);\n let type;\n if (entries[i].isFile()) {\n type = 4 /* WasiFileType.REGULAR_FILE */;\n }\n else if (entries[i].isDirectory()) {\n type = 3 /* WasiFileType.DIRECTORY */;\n }\n else if (entries[i].isSymbolicLink()) {\n type = 7 /* WasiFileType.SYMBOLIC_LINK */;\n }\n else if (entries[i].isCharacterDevice()) {\n type = 2 /* WasiFileType.CHARACTER_DEVICE */;\n }\n else if (entries[i].isBlockDevice()) {\n type = 1 /* WasiFileType.BLOCK_DEVICE */;\n }\n else if (entries[i].isSocket()) {\n type = 6 /* WasiFileType.SOCKET_STREAM */;\n }\n else {\n type = 0 /* WasiFileType.UNKNOWN */;\n }\n entryView.setUint8(20, type);\n entryData.set(nameData, 24);\n const data = entryData.slice(0, Math.min(entryData.length, buf_len - bufferUsed));\n HEAPU8.set(data, buf + bufferUsed);\n bufferUsed += data.byteLength;\n }\n view.setUint32(bufused, bufferUsed, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']);\n defineImport('fd_renumber', function fd_renumber(from, to) {\n const wasi = _wasi.get(this);\n wasi.fds.renumber(to, from);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_renumber(from, to) {\n const wasi = _wasi.get(this);\n await wasi.fds.renumber(to, from);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32'], ['i32']);\n defineImport('fd_sync', function fd_sync(fd) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SYNC, BigInt(0));\n const fs = getFs(this);\n fs.fsyncSync(fileDescriptor.fd);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_sync(fd) {\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SYNC, BigInt(0));\n await fileDescriptor.fd.sync();\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32'], ['i32']);\n defineImport('fd_write', function fd_write(fd, iovs, iovslen, size) {\n iovs = Number(iovs);\n size = Number(size);\n if ((iovs === 0 && iovslen) || size === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE, BigInt(0));\n if (!iovslen) {\n view.setUint32(size, 0, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }\n const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => {\n const offset = iovs + (i * 8);\n const buf = view.getInt32(offset, true);\n const bufLen = view.getUint32(offset + 4, true);\n return HEAPU8.subarray(buf, buf + bufLen);\n }));\n let nwritten;\n if (fd === 1 || fd === 2) {\n nwritten = fileDescriptor.write(buffer);\n }\n else {\n const fs = getFs(this);\n nwritten = fs.writeSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(fileDescriptor.pos));\n fileDescriptor.pos += BigInt(nwritten);\n }\n view.setUint32(size, nwritten, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function fd_write(fd, iovs, iovslen, size) {\n iovs = Number(iovs);\n size = Number(size);\n if ((iovs === 0 && iovslen) || size === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE, BigInt(0));\n if (!iovslen) {\n view.setUint32(size, 0, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }\n const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => {\n const offset = iovs + (i * 8);\n const buf = view.getInt32(offset, true);\n const bufLen = view.getUint32(offset + 4, true);\n return HEAPU8.subarray(buf, buf + bufLen);\n }));\n let nwritten;\n if (fd === 1 || fd === 2) {\n nwritten = fileDescriptor.write(buffer);\n }\n else {\n nwritten = await (await (fileDescriptor.fd.write(buffer, 0, buffer.length, Number(fileDescriptor.pos)))).bytesWritten;\n fileDescriptor.pos += BigInt(nwritten);\n }\n view.setUint32(size, nwritten, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i32'], ['i32']);\n defineImport('path_create_directory', function path_create_directory(fd, path, path_len) {\n path = Number(path);\n path_len = Number(path_len);\n if (path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8 } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_CREATE_DIRECTORY, BigInt(0));\n let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n pathString = resolve(fileDescriptor.realPath, pathString);\n const fs = getFs(this);\n fs.mkdirSync(pathString);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function path_create_directory(fd, path, path_len) {\n path = Number(path);\n path_len = Number(path_len);\n if (path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8 } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_CREATE_DIRECTORY, BigInt(0));\n let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n pathString = resolve(fileDescriptor.realPath, pathString);\n const fs = getFs(this);\n await fs.promises.mkdir(pathString);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32'], ['i32']);\n defineImport('path_filestat_get', function path_filestat_get(fd, flags, path, path_len, filestat) {\n path = Number(path);\n path_len = Number(path_len);\n filestat = Number(filestat);\n if (path === 0 || filestat === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_GET, BigInt(0));\n let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n const fs = getFs(this);\n pathString = resolve(fileDescriptor.realPath, pathString);\n let stat;\n if ((flags & 1) === 1) {\n stat = fs.statSync(pathString, { bigint: true });\n }\n else {\n stat = fs.lstatSync(pathString, { bigint: true });\n }\n toFileStat(view, filestat, stat);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function path_filestat_get(fd, flags, path, path_len, filestat) {\n path = Number(path);\n path_len = Number(path_len);\n filestat = Number(filestat);\n if (path === 0 || filestat === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_GET, BigInt(0));\n let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n const fs = getFs(this);\n pathString = resolve(fileDescriptor.realPath, pathString);\n let stat;\n if ((flags & 1) === 1) {\n stat = await fs.promises.stat(pathString, { bigint: true });\n }\n else {\n stat = await fs.promises.lstat(pathString, { bigint: true });\n }\n toFileStat(view, filestat, stat);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i32', 'i32'], ['i32']);\n defineImport('path_filestat_set_times', function path_filestat_set_times(fd, flags, path, path_len, atim, mtim, fst_flags) {\n path = Number(path);\n path_len = Number(path_len);\n if (path === 0)\n return 28 /* WasiErrno.EINVAL */;\n const { HEAPU8 } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_SET_TIMES, BigInt(0));\n if (validateFstFlagsOrReturn(fst_flags)) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const fs = getFs(this);\n const resolvedPath = resolvePathSync(fs, fileDescriptor, decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)), flags);\n if ((fst_flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) {\n atim = BigInt(Date.now() * 1000000);\n }\n if ((fst_flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) {\n mtim = BigInt(Date.now() * 1000000);\n }\n fs.utimesSync(resolvedPath, Number(atim), Number(mtim));\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function path_filestat_set_times(fd, flags, path, path_len, atim, mtim, fst_flags) {\n path = Number(path);\n path_len = Number(path_len);\n if (path === 0)\n return 28 /* WasiErrno.EINVAL */;\n const { HEAPU8 } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_SET_TIMES, BigInt(0));\n if (validateFstFlagsOrReturn(fst_flags)) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const fs = getFs(this);\n const resolvedPath = await resolvePathAsync(fs, fileDescriptor, decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)), flags);\n if ((fst_flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) {\n atim = BigInt(Date.now() * 1000000);\n }\n if ((fst_flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) {\n mtim = BigInt(Date.now() * 1000000);\n }\n await fs.promises.utimes(resolvedPath, Number(atim), Number(mtim));\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i32', 'i64', 'i64', 'i32'], ['i32']);\n defineImport('path_link', function path_link(old_fd, old_flags, old_path, old_path_len, new_fd, new_path, new_path_len) {\n old_path = Number(old_path);\n old_path_len = Number(old_path_len);\n new_path = Number(new_path);\n new_path_len = Number(new_path_len);\n if (old_path === 0 || new_path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const wasi = _wasi.get(this);\n let oldWrap;\n let newWrap;\n if (old_fd === new_fd) {\n oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE | WasiRights.PATH_LINK_TARGET, BigInt(0));\n }\n else {\n oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE, BigInt(0));\n newWrap = wasi.fds.get(new_fd, WasiRights.PATH_LINK_TARGET, BigInt(0));\n }\n const { HEAPU8 } = getMemory(this);\n const fs = getFs(this);\n const resolvedOldPath = resolvePathSync(fs, oldWrap, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)), old_flags);\n const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)));\n fs.linkSync(resolvedOldPath, resolvedNewPath);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function path_link(old_fd, old_flags, old_path, old_path_len, new_fd, new_path, new_path_len) {\n old_path = Number(old_path);\n old_path_len = Number(old_path_len);\n new_path = Number(new_path);\n new_path_len = Number(new_path_len);\n if (old_path === 0 || new_path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const wasi = _wasi.get(this);\n let oldWrap;\n let newWrap;\n if (old_fd === new_fd) {\n oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE | WasiRights.PATH_LINK_TARGET, BigInt(0));\n }\n else {\n oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE, BigInt(0));\n newWrap = wasi.fds.get(new_fd, WasiRights.PATH_LINK_TARGET, BigInt(0));\n }\n const { HEAPU8 } = getMemory(this);\n const fs = getFs(this);\n const resolvedOldPath = await resolvePathAsync(fs, oldWrap, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)), old_flags);\n const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)));\n await fs.promises.link(resolvedOldPath, resolvedNewPath);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']);\n function pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags) {\n const read = (fs_rights_base & (WasiRights.FD_READ |\n WasiRights.FD_READDIR)) !== BigInt(0);\n const write = (fs_rights_base & (WasiRights.FD_DATASYNC |\n WasiRights.FD_WRITE |\n WasiRights.FD_ALLOCATE |\n WasiRights.FD_FILESTAT_SET_SIZE)) !== BigInt(0);\n let flags = write ? read ? 2 /* FileControlFlag.O_RDWR */ : 1 /* FileControlFlag.O_WRONLY */ : 0 /* FileControlFlag.O_RDONLY */;\n let needed_base = WasiRights.PATH_OPEN;\n let needed_inheriting = fs_rights_base | fs_rights_inheriting;\n if ((o_flags & 1 /* WasiFileControlFlag.O_CREAT */) !== 0) {\n flags |= 64 /* FileControlFlag.O_CREAT */;\n needed_base |= WasiRights.PATH_CREATE_FILE;\n }\n if ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0) {\n flags |= 65536 /* FileControlFlag.O_DIRECTORY */;\n }\n if ((o_flags & 4 /* WasiFileControlFlag.O_EXCL */) !== 0) {\n flags |= 128 /* FileControlFlag.O_EXCL */;\n }\n if ((o_flags & 8 /* WasiFileControlFlag.O_TRUNC */) !== 0) {\n flags |= 512 /* FileControlFlag.O_TRUNC */;\n needed_base |= WasiRights.PATH_FILESTAT_SET_SIZE;\n }\n if ((fs_flags & 1 /* WasiFdFlag.APPEND */) !== 0) {\n flags |= 1024 /* FileControlFlag.O_APPEND */;\n }\n if ((fs_flags & 2 /* WasiFdFlag.DSYNC */) !== 0) {\n // flags |= FileControlFlag.O_DSYNC;\n needed_inheriting |= WasiRights.FD_DATASYNC;\n }\n if ((fs_flags & 4 /* WasiFdFlag.NONBLOCK */) !== 0) {\n flags |= 2048 /* FileControlFlag.O_NONBLOCK */;\n }\n if ((fs_flags & 8 /* WasiFdFlag.RSYNC */) !== 0) {\n flags |= 1052672 /* FileControlFlag.O_SYNC */;\n needed_inheriting |= WasiRights.FD_SYNC;\n }\n if ((fs_flags & 16 /* WasiFdFlag.SYNC */) !== 0) {\n flags |= 1052672 /* FileControlFlag.O_SYNC */;\n needed_inheriting |= WasiRights.FD_SYNC;\n }\n if (write && (flags & (1024 /* FileControlFlag.O_APPEND */ | 512 /* FileControlFlag.O_TRUNC */)) === 0) {\n needed_inheriting |= WasiRights.FD_SEEK;\n }\n return { flags, needed_base, needed_inheriting };\n }\n defineImport('path_open', function path_open(dirfd, dirflags, path, path_len, o_flags, fs_rights_base, fs_rights_inheriting, fs_flags, fd) {\n path = Number(path);\n fd = Number(fd);\n if (path === 0 || fd === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n path_len = Number(path_len);\n fs_rights_base = BigInt(fs_rights_base);\n fs_rights_inheriting = BigInt(fs_rights_inheriting);\n const { flags: flagsRes, needed_base: neededBase, needed_inheriting: neededInheriting } = pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(dirfd, neededBase, neededInheriting);\n const memory = getMemory(this);\n const HEAPU8 = memory.HEAPU8;\n const pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n const fs = getFs(this);\n const resolved_path = resolvePathSync(fs, fileDescriptor, pathString, dirflags);\n const r = fs.openSync(resolved_path, flagsRes, 0o666);\n const filetype = wasi.fds.getFileTypeByFd(r);\n if ((filetype !== 3 /* WasiFileType.DIRECTORY */) &&\n ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0 ||\n (resolved_path.endsWith('/')))) {\n return 54 /* WasiErrno.ENOTDIR */;\n }\n const { base: max_base, inheriting: max_inheriting } = getRights(wasi.fds.stdio, r, flagsRes, filetype);\n const wrap = wasi.fds.insert(r, resolved_path, resolved_path, filetype, fs_rights_base & max_base, fs_rights_inheriting & max_inheriting, 0);\n const stat = fs.fstatSync(r, { bigint: true });\n if (stat.isFile()) {\n wrap.size = stat.size;\n if ((flagsRes & 1024 /* FileControlFlag.O_APPEND */) !== 0) {\n wrap.pos = stat.size;\n }\n }\n const view = memory.view;\n view.setInt32(fd, wrap.id, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function path_open(dirfd, dirflags, path, path_len, o_flags, fs_rights_base, fs_rights_inheriting, fs_flags, fd) {\n path = Number(path);\n fd = Number(fd);\n if (path === 0 || fd === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n path_len = Number(path_len);\n fs_rights_base = BigInt(fs_rights_base);\n fs_rights_inheriting = BigInt(fs_rights_inheriting);\n const { flags: flagsRes, needed_base: neededBase, needed_inheriting: neededInheriting } = pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(dirfd, neededBase, neededInheriting);\n const memory = getMemory(this);\n const HEAPU8 = memory.HEAPU8;\n const pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n const fs = getFs(this);\n const resolved_path = await resolvePathAsync(fs, fileDescriptor, pathString, dirflags);\n const r = await fs.promises.open(resolved_path, flagsRes, 0o666);\n const filetype = await wasi.fds.getFileTypeByFd(r);\n if ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0 && filetype !== 3 /* WasiFileType.DIRECTORY */) {\n return 54 /* WasiErrno.ENOTDIR */;\n }\n const { base: max_base, inheriting: max_inheriting } = getRights(wasi.fds.stdio, r.fd, flagsRes, filetype);\n const wrap = wasi.fds.insert(r, resolved_path, resolved_path, filetype, fs_rights_base & max_base, fs_rights_inheriting & max_inheriting, 0);\n const stat = await r.stat({ bigint: true });\n if (stat.isFile()) {\n wrap.size = stat.size;\n if ((flagsRes & 1024 /* FileControlFlag.O_APPEND */) !== 0) {\n wrap.pos = stat.size;\n }\n }\n const view = memory.view;\n view.setInt32(fd, wrap.id, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i64', 'i64', 'i32', 'i32'], ['i32']);\n defineImport('path_readlink', function path_readlink(fd, path, path_len, buf, buf_len, bufused) {\n path = Number(path);\n path_len = Number(path_len);\n buf = Number(buf);\n buf_len = Number(buf_len);\n bufused = Number(bufused);\n if (path === 0 || buf === 0 || bufused === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_READLINK, BigInt(0));\n let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n pathString = resolve(fileDescriptor.realPath, pathString);\n const fs = getFs(this);\n const link = fs.readlinkSync(pathString);\n const linkData = encoder.encode(link);\n const len = Math.min(linkData.length, buf_len);\n if (len >= buf_len)\n return 42 /* WasiErrno.ENOBUFS */;\n HEAPU8.set(linkData.subarray(0, len), buf);\n HEAPU8[buf + len] = 0;\n view.setUint32(bufused, len, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function path_readlink(fd, path, path_len, buf, buf_len, bufused) {\n path = Number(path);\n path_len = Number(path_len);\n buf = Number(buf);\n buf_len = Number(buf_len);\n bufused = Number(bufused);\n if (path === 0 || buf === 0 || bufused === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8, view } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_READLINK, BigInt(0));\n let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n pathString = resolve(fileDescriptor.realPath, pathString);\n const fs = getFs(this);\n const link = await fs.promises.readlink(pathString);\n const linkData = encoder.encode(link);\n const len = Math.min(linkData.length, buf_len);\n if (len >= buf_len)\n return 42 /* WasiErrno.ENOBUFS */;\n HEAPU8.set(linkData.subarray(0, len), buf);\n HEAPU8[buf + len] = 0;\n view.setUint32(bufused, len, true);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']);\n defineImport('path_remove_directory', function path_remove_directory(fd, path, path_len) {\n path = Number(path);\n path_len = Number(path_len);\n if (path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8 } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_REMOVE_DIRECTORY, BigInt(0));\n let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n pathString = resolve(fileDescriptor.realPath, pathString);\n const fs = getFs(this);\n fs.rmdirSync(pathString);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function path_remove_directory(fd, path, path_len) {\n path = Number(path);\n path_len = Number(path_len);\n if (path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8 } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_REMOVE_DIRECTORY, BigInt(0));\n let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n pathString = resolve(fileDescriptor.realPath, pathString);\n const fs = getFs(this);\n await fs.promises.rmdir(pathString);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32'], ['i32']);\n defineImport('path_rename', function path_rename(old_fd, old_path, old_path_len, new_fd, new_path, new_path_len) {\n old_path = Number(old_path);\n old_path_len = Number(old_path_len);\n new_path = Number(new_path);\n new_path_len = Number(new_path_len);\n if (old_path === 0 || new_path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const wasi = _wasi.get(this);\n let oldWrap;\n let newWrap;\n if (old_fd === new_fd) {\n oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE | WasiRights.PATH_RENAME_TARGET, BigInt(0));\n }\n else {\n oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE, BigInt(0));\n newWrap = wasi.fds.get(new_fd, WasiRights.PATH_RENAME_TARGET, BigInt(0));\n }\n const { HEAPU8 } = getMemory(this);\n const resolvedOldPath = resolve(oldWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)));\n const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)));\n const fs = getFs(this);\n fs.renameSync(resolvedOldPath, resolvedNewPath);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function path_rename(old_fd, old_path, old_path_len, new_fd, new_path, new_path_len) {\n old_path = Number(old_path);\n old_path_len = Number(old_path_len);\n new_path = Number(new_path);\n new_path_len = Number(new_path_len);\n if (old_path === 0 || new_path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const wasi = _wasi.get(this);\n let oldWrap;\n let newWrap;\n if (old_fd === new_fd) {\n oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE | WasiRights.PATH_RENAME_TARGET, BigInt(0));\n }\n else {\n oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE, BigInt(0));\n newWrap = wasi.fds.get(new_fd, WasiRights.PATH_RENAME_TARGET, BigInt(0));\n }\n const { HEAPU8 } = getMemory(this);\n const resolvedOldPath = resolve(oldWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)));\n const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)));\n const fs = getFs(this);\n await fs.promises.rename(resolvedOldPath, resolvedNewPath);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']);\n defineImport('path_symlink', function path_symlink(old_path, old_path_len, fd, new_path, new_path_len) {\n old_path = Number(old_path);\n old_path_len = Number(old_path_len);\n new_path = Number(new_path);\n new_path_len = Number(new_path_len);\n if (old_path === 0 || new_path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8 } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_SYMLINK, BigInt(0));\n const oldPath = decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len));\n if (oldPath.length > 0 && oldPath[0] === '/') {\n return 63 /* WasiErrno.EPERM */;\n }\n let newPath = decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len));\n newPath = resolve(fileDescriptor.realPath, newPath);\n const fs = getFs(this);\n fs.symlinkSync(oldPath, newPath);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function path_symlink(old_path, old_path_len, fd, new_path, new_path_len) {\n old_path = Number(old_path);\n old_path_len = Number(old_path_len);\n new_path = Number(new_path);\n new_path_len = Number(new_path_len);\n if (old_path === 0 || new_path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8 } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_SYMLINK, BigInt(0));\n const oldPath = decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len));\n let newPath = decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len));\n newPath = resolve(fileDescriptor.realPath, newPath);\n const fs = getFs(this);\n await fs.promises.symlink(oldPath, newPath);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32', 'i32', 'i32'], ['i32']);\n defineImport('path_unlink_file', function path_unlink_file(fd, path, path_len) {\n path = Number(path);\n path_len = Number(path_len);\n if (path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8 } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_UNLINK_FILE, BigInt(0));\n let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n pathString = resolve(fileDescriptor.realPath, pathString);\n const fs = getFs(this);\n fs.unlinkSync(pathString);\n return 0 /* WasiErrno.ESUCCESS */;\n }, async function path_unlink_file(fd, path, path_len) {\n path = Number(path);\n path_len = Number(path_len);\n if (path === 0) {\n return 28 /* WasiErrno.EINVAL */;\n }\n const { HEAPU8 } = getMemory(this);\n const wasi = _wasi.get(this);\n const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_UNLINK_FILE, BigInt(0));\n let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));\n pathString = resolve(fileDescriptor.realPath, pathString);\n const fs = getFs(this);\n await fs.promises.unlink(pathString);\n return 0 /* WasiErrno.ESUCCESS */;\n }, ['i32', 'i32', 'i32'], ['i32']);\n this._setMemory = function setMemory(m) {\n if (!(m instanceof _WebAssembly.Memory)) {\n throw new TypeError('\"instance.exports.memory\" property must be a WebAssembly.Memory');\n }\n _memory.set(_this, extendMemory(m));\n };\n }\n static createSync(args, env, preopens, stdio, fs, print, printErr) {\n const fds = new SyncTable({\n size: 3,\n in: stdio[0],\n out: stdio[1],\n err: stdio[2],\n fs,\n print,\n printErr\n });\n const _this = new WASI$1(args, env, fds, false, fs);\n if (preopens.length > 0) {\n for (let i = 0; i < preopens.length; ++i) {\n const realPath = fs.realpathSync(preopens[i].realPath, 'utf8');\n const fd = fs.openSync(realPath, 'r', 0o666);\n fds.insertPreopen(fd, preopens[i].mappedPath, realPath);\n }\n }\n return _this;\n }\n static async createAsync(args, env, preopens, stdio, fs, print, printErr, asyncify) {\n const fds = new AsyncTable({\n size: 3,\n in: stdio[0],\n out: stdio[1],\n err: stdio[2],\n print,\n printErr\n });\n const _this = new WASI$1(args, env, fds, true, fs, asyncify);\n if (preopens.length > 0) {\n for (let i = 0; i < preopens.length; ++i) {\n const entry = preopens[i];\n const realPath = await fs.promises.realpath(entry.realPath);\n const fd = await fs.promises.open(realPath, 'r', 0o666);\n await fds.insertPreopen(fd, entry.mappedPath, realPath);\n }\n }\n return _this;\n }\n}\n\n// eslint-disable-next-line spaced-comment\nconst kEmptyObject = /*#__PURE__*/ Object.freeze(/*#__PURE__*/ Object.create(null));\nconst kExitCode = Symbol('kExitCode');\nconst kSetMemory = Symbol('kSetMemory');\nconst kStarted = Symbol('kStarted');\nconst kInstance = Symbol('kInstance');\nconst kBindingName = Symbol('kBindingName');\nfunction validateOptions(options) {\n var _a;\n validateObject(options, 'options');\n let _WASI;\n if (options.version !== undefined) {\n validateString(options.version, 'options.version');\n switch (options.version) {\n case 'unstable':\n _WASI = WASI$1;\n this[kBindingName] = 'wasi_unstable';\n break;\n case 'preview1':\n _WASI = WASI$1;\n this[kBindingName] = 'wasi_snapshot_preview1';\n break;\n default:\n throw new TypeError(`unsupported WASI version \"${options.version}\"`);\n }\n }\n else {\n _WASI = WASI$1;\n this[kBindingName] = 'wasi_snapshot_preview1';\n }\n if (options.args !== undefined) {\n validateArray(options.args, 'options.args');\n }\n const args = ((_a = options.args) !== null && _a !== void 0 ? _a : []).map(String);\n const env = [];\n if (options.env !== undefined) {\n validateObject(options.env, 'options.env');\n Object.entries(options.env).forEach(({ 0: key, 1: value }) => {\n if (value !== undefined) {\n env.push(`${key}=${value}`);\n }\n });\n }\n const preopens = [];\n if (options.preopens !== undefined) {\n validateObject(options.preopens, 'options.preopens');\n Object.entries(options.preopens).forEach(({ 0: key, 1: value }) => preopens.push({ mappedPath: String(key), realPath: String(value) }));\n }\n if (preopens.length > 0) {\n if (options.fs === undefined) {\n throw new Error('filesystem is disabled, can not preopen directory');\n }\n try {\n validateObject(options.fs, 'options.fs');\n }\n catch (_) {\n throw new TypeError('Node.js fs like implementation is not provided');\n }\n }\n // if (options.filesystem !== undefined) {\n // validateObject(options.filesystem, 'options.filesystem')\n // validateString(options.filesystem.type, 'options.filesystem.type')\n // if (options.filesystem.type !== 'memfs' && options.filesystem.type !== 'file-system-access-api') {\n // throw new Error(`Filesystem type ${(options.filesystem as any).type as string} is not supported, only \"memfs\" and \"file-system-access-api\" is supported currently`)\n // }\n // try {\n // validateObject(options.filesystem.fs, 'options.filesystem.fs')\n // } catch (_) {\n // throw new Error('Node.js fs like implementation is not provided')\n // }\n // }\n if (options.print !== undefined)\n validateFunction(options.print, 'options.print');\n if (options.printErr !== undefined)\n validateFunction(options.printErr, 'options.printErr');\n if (options.returnOnExit !== undefined) {\n validateBoolean(options.returnOnExit, 'options.returnOnExit');\n }\n // const { stdin = 0, stdout = 1, stderr = 2 } = options\n // validateInt32(stdin, 'options.stdin', 0)\n // validateInt32(stdout, 'options.stdout', 0)\n // validateInt32(stderr, 'options.stderr', 0)\n // const stdio = [stdin, stdout, stderr] as const\n const stdio = [0, 1, 2];\n return {\n args,\n env,\n preopens,\n stdio,\n _WASI\n };\n}\nfunction initWASI(setMemory, wrap) {\n this[kSetMemory] = setMemory;\n this.wasiImport = wrap;\n this[kStarted] = false;\n this[kExitCode] = 0;\n this[kInstance] = undefined;\n}\n/** @public */\nclass WASI {\n constructor(options = kEmptyObject) {\n const { args, env, preopens, stdio, _WASI } = validateOptions.call(this, options);\n const wrap = _WASI.createSync(args, env, preopens, stdio, options.fs, options.print, options.printErr);\n const setMemory = wrap._setMemory;\n delete wrap._setMemory;\n initWASI.call(this, setMemory, wrap);\n if (options.returnOnExit) {\n wrap.proc_exit = wasiReturnOnProcExit.bind(this);\n }\n }\n finalizeBindings(instance, _a) {\n var _b;\n var { memory = (_b = instance === null || instance === void 0 ? void 0 : instance.exports) === null || _b === void 0 ? void 0 : _b.memory } = _a === void 0 ? {} : _a;\n if (this[kStarted]) {\n throw new Error('WASI instance has already started');\n }\n validateObject(instance, 'instance');\n validateObject(instance.exports, 'instance.exports');\n this[kSetMemory](memory);\n this[kInstance] = instance;\n this[kStarted] = true;\n }\n // Must not export _initialize, must export _start\n start(instance) {\n this.finalizeBindings(instance);\n const { _start, _initialize } = this[kInstance].exports;\n validateFunction(_start, 'instance.exports._start');\n validateUndefined(_initialize, 'instance.exports._initialize');\n let ret;\n try {\n ret = _start();\n }\n catch (err) {\n if (err !== kExitCode) {\n throw err;\n }\n }\n if (ret instanceof Promise) {\n return ret.then(() => this[kExitCode], (err) => {\n if (err !== kExitCode) {\n throw err;\n }\n return this[kExitCode];\n });\n }\n return this[kExitCode];\n }\n // Must not export _start, may optionally export _initialize\n initialize(instance) {\n this.finalizeBindings(instance);\n const { _start, _initialize } = this[kInstance].exports;\n validateUndefined(_start, 'instance.exports._start');\n if (_initialize !== undefined) {\n validateFunction(_initialize, 'instance.exports._initialize');\n return _initialize();\n }\n }\n getImportObject() {\n return { [this[kBindingName]]: this.wasiImport };\n }\n}\nfunction wasiReturnOnProcExit(rval) {\n this[kExitCode] = rval;\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw kExitCode;\n}\n/** @public */\nasync function createAsyncWASI(options = kEmptyObject) {\n const _this = Object.create(WASI.prototype);\n const { args, env, preopens, stdio, _WASI } = validateOptions.call(_this, options);\n if (options.asyncify !== undefined) {\n validateObject(options.asyncify, 'options.asyncify');\n validateFunction(options.asyncify.wrapImportFunction, 'options.asyncify.wrapImportFunction');\n }\n const wrap = await _WASI.createAsync(args, env, preopens, stdio, options.fs, options.print, options.printErr, options.asyncify);\n const setMemory = wrap._setMemory;\n delete wrap._setMemory;\n initWASI.call(_this, setMemory, wrap);\n if (options.returnOnExit) {\n wrap.proc_exit = wasiReturnOnProcExit.bind(_this);\n }\n return _this;\n}\n\nexport { Asyncify, Memory, WASI, WebAssemblyMemory, asyncifyLoad, asyncifyLoadSync, createAsyncWASI, extendMemory, load, loadSync, wrapAsyncExport, wrapAsyncImport, wrapExports };\n","// @ts-check\n\n/**\n * @param {unknown} value\n */\nconst getType = (value) => {\n if (value === undefined) return 0\n if (value === null) return 1\n const t = typeof value\n if (t === 'boolean') return 2\n if (t === 'number') return 3\n if (t === 'string') return 4\n if (t === 'object') return 6\n if (t === 'bigint') return 9\n return -1\n}\n\nconst RESPONSE_HEADER_SIZE = 16\nconst RESPONSE_PAYLOAD_SIZE = 10240\nconst RESPONSE_BUFFER_SIZE = RESPONSE_HEADER_SIZE + RESPONSE_PAYLOAD_SIZE\n\n/**\n * @param {Int32Array} sab\n * @param {Uint8Array} payload\n */\nconst writeResponsePayload = (sab, payload) => {\n if (payload.length > RESPONSE_PAYLOAD_SIZE) {\n throw new RangeError('payload overflow')\n }\n new Uint8Array(sab.buffer).set(payload, RESPONSE_HEADER_SIZE)\n}\n\n/**\n * @param {import('memfs').IFs} memfs\n * @param {any} value\n * @param {ReturnType<typeof getType>} type\n * @returns {Uint8Array}\n */\nconst encodeValue = (memfs, value, type) => {\n switch (type) {\n case 0:\n case 1:\n return new Uint8Array(0)\n case 2: {\n const view = new Int32Array(1)\n view[0] = value ? 1 : 0\n return new Uint8Array(view.buffer)\n }\n case 3: {\n const view = new Float64Array(1)\n view[0] = value\n return new Uint8Array(view.buffer)\n }\n case 4: {\n const view = new TextEncoder().encode(value)\n return view\n }\n case 6: {\n function storeConstructor(obj, memfs, processed = new WeakSet()) {\n if (!obj || typeof obj !== 'object') {\n return\n }\n\n if (processed.has(obj)) {\n return\n }\n\n processed.add(obj)\n\n const [entry] =\n Object.entries(memfs).filter(([_, v]) => v === obj.constructor)[0] ??\n []\n if (entry) {\n Object.defineProperty(obj, '__constructor__', {\n configurable: true,\n writable: true,\n enumerable: true,\n value: entry,\n })\n }\n\n for (const value of Object.values(obj)) {\n storeConstructor(value, memfs, processed)\n }\n }\n\n storeConstructor(value, memfs)\n\n const json = JSON.stringify(value, (_, value) => {\n if (typeof value === 'bigint') {\n return `BigInt(${String(value)})`\n }\n if (value instanceof Error) {\n return {\n ...value,\n message: value.message,\n stack: value.stack,\n __error__: value.constructor.name,\n }\n }\n return value\n })\n const view = new TextEncoder().encode(json)\n return view\n }\n case 9: {\n return new TextEncoder().encode(String(value))\n }\n case -1:\n default:\n throw new Error('unsupported data')\n }\n}\n\n/**\n * @param {typeof import('memfs')} memfs\n * @param {Uint8Array} payload\n * @param {number} type\n * @returns {any}\n */\nconst decodeValue = (memfs, payload, type) => {\n if (type === 0) return undefined\n if (type === 1) return null\n if (type === 2)\n return Boolean(new Int32Array(payload.buffer, payload.byteOffset, 1)[0])\n if (type === 3)\n return new Float64Array(payload.buffer, payload.byteOffset, 1)[0]\n if (type === 4) return new TextDecoder().decode(payload.slice())\n if (type === 6) {\n const obj = JSON.parse(\n new TextDecoder().decode(payload.slice()),\n (_key, value) => {\n if (typeof value === 'string') {\n const matched = value.match(/^BigInt\\((-?\\d+)\\)$/)\n if (matched && matched[1]) {\n return BigInt(matched[1])\n }\n }\n return value\n },\n )\n\n function loadConstructor(obj, memfs, processed = new WeakSet()) {\n if (!obj || typeof obj !== 'object') {\n return\n }\n\n if (processed.has(obj)) {\n return\n }\n\n processed.add(obj)\n\n if (obj.__constructor__) {\n const ctor = obj.__constructor__\n delete obj.__constructor__\n Object.setPrototypeOf(obj, memfs[ctor].prototype)\n }\n\n for (const value of Object.values(obj)) {\n loadConstructor(value, memfs, processed)\n }\n }\n\n loadConstructor(obj, memfs)\n\n if (obj.__error__) {\n const name = obj.__error__\n const ErrorConstructor = globalThis[name] || Error\n delete obj.__error__\n const err = new ErrorConstructor(obj.message)\n Object.defineProperty(err, 'stack', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: err.stack,\n })\n Object.defineProperty(err, Symbol.toStringTag, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: name,\n })\n for (const [k, v] of Object.entries(obj)) {\n if (k === 'message' || k === 'stack') continue\n err[k] = v\n }\n return err\n }\n return obj\n }\n if (type === 9) {\n return BigInt(new TextDecoder().decode(payload.slice()))\n }\n throw new Error('unsupported data')\n}\n\n/**\n * @param {import('memfs').IFs} fs\n * @returns {(e: { data: { __fs__: { sab: Int32Array, type: keyof import('memfs').IFs, payload: any[] } } }) => void}\n */\n// oxlint-disable-next-line no-unused-vars -- fixed in an upcoming release\nexport const createOnMessage = (fs) =>\n function onMessage(e) {\n if (e.data.__fs__) {\n /**\n * 0..4 status(int32_t): 21(waiting) 0(success) 1(error)\n * 5..8 type(napi_valuetype): 0(undefined) 1(null) 2(boolean) 3(number) 4(string) 6(jsonstring) 9(bigint) -1(unsupported)\n * 9..16 payload_size(uint32_t) <= 10240\n * 16..16 + payload_size payload_content\n */\n const { sab, type, payload } = e.data.__fs__\n const fn = fs[type]\n try {\n const ret = fn.apply(fs, payload)\n const t = getType(ret)\n Atomics.store(sab, 1, t)\n const v = encodeValue(fs, ret, t)\n Atomics.store(sab, 2, v.length)\n writeResponsePayload(sab, v)\n Atomics.store(sab, 0, 0) // success\n } catch (/** @type {any} */ err) {\n let t = getType(err)\n let v\n try {\n if (t === -1) {\n throw new Error('unsupported data')\n }\n v = encodeValue(fs, err, t)\n } catch {\n const fallback = (() => {\n try {\n return String(err)\n } catch {\n return 'Unserializable thrown value'\n }\n })()\n t = getType(fallback)\n v = encodeValue(fs, fallback, t)\n }\n if (v.length > RESPONSE_PAYLOAD_SIZE) {\n const overflowErr = new RangeError('payload overflow')\n t = getType(overflowErr)\n v = encodeValue(fs, overflowErr, t)\n }\n Atomics.store(sab, 1, t)\n Atomics.store(sab, 2, v.length)\n writeResponsePayload(sab, v)\n Atomics.store(sab, 0, 1) // error\n } finally {\n Atomics.notify(sab, 0)\n }\n }\n }\n\n/**\n * @param {typeof import('memfs')} memfs\n */\nexport const createFsProxy = (memfs) =>\n new Proxy(\n {},\n {\n get(_target, p, _receiver) {\n /**\n * @param {any[]} args\n */\n return function (...args) {\n const sab = new SharedArrayBuffer(RESPONSE_BUFFER_SIZE)\n const i32arr = new Int32Array(sab)\n Atomics.store(i32arr, 0, 21)\n\n postMessage({\n __fs__: {\n sab: i32arr,\n type: p,\n payload: args,\n },\n })\n\n Atomics.wait(i32arr, 0, 21)\n\n const status = Atomics.load(i32arr, 0)\n const type = Atomics.load(i32arr, 1)\n const size = Atomics.load(i32arr, 2)\n const content = new Uint8Array(sab, RESPONSE_HEADER_SIZE, size)\n const value = decodeValue(memfs, content, type)\n if (status === 1) {\n throw value\n }\n return value\n }\n },\n },\n )\n","import { WASI, getDefaultContext, instantiateNapiModuleSync } from \"@napi-rs/wasm-runtime\";\n//#region aho-corasick.wasi-browser.js\nconst __wasi = new WASI({ version: \"preview1\" });\nconst __wasmUrl = new URL(\"./aho-corasick.wasm32-wasi.wasm\", import.meta.url).href;\nconst __emnapiContext = getDefaultContext();\nconst __sharedMemory = new WebAssembly.Memory({\n\tinitial: 4e3,\n\tmaximum: 65536,\n\tshared: true\n});\nconst { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule } = instantiateNapiModuleSync(await fetch(__wasmUrl).then(async (res) => {\n\tconst bytes = await res.arrayBuffer();\n\tconst view = new Uint8Array(bytes);\n\tif (view.length < 4 || view[0] !== 0 || view[1] !== 97 || view[2] !== 115 || view[3] !== 109) throw new Error(\"@stll/aho-corasick-wasm failed to load its .wasm binary. The response did not contain WebAssembly bytes, which commonly happens when a bundler (Vite, webpack dev server, etc.) rewrites import.meta.url during pre-bundling.\\n\\nIf you are using Vite, import the bundled plugin:\\n import stllWasm from \\\"@stll/aho-corasick-wasm/vite\\\"\\n // ...\\n plugins: [stllWasm()]\");\n\treturn bytes;\n}), {\n\tcontext: __emnapiContext,\n\tasyncWorkPoolSize: 4,\n\twasi: __wasi,\n\tonCreateWorker() {\n\t\treturn new Worker(new URL(\"./wasi-worker-browser.mjs\", import.meta.url), { type: \"module\" });\n\t},\n\toverwriteImports(importObject) {\n\t\timportObject.env = {\n\t\t\t...importObject.env,\n\t\t\t...importObject.napi,\n\t\t\t...importObject.emnapi,\n\t\t\tmemory: __sharedMemory\n\t\t};\n\t\treturn importObject;\n\t},\n\tbeforeInit({ instance }) {\n\t\tfor (const name of Object.keys(instance.exports)) if (name.startsWith(\"__napi_register__\")) instance.exports[name]();\n\t}\n});\nvar aho_corasick_wasi_browser_default = __napiModule.exports;\n__napiModule.exports.AhoCorasick;\n__napiModule.exports.StreamMatcher;\n__napiModule.exports.MatchKind;\n//#endregion\n//#region src/core.ts\nlet binding;\n/** Set the native backend. Must be called once\n* before any class constructor. */\nconst initBinding = (b) => {\n\tbinding = b;\n};\nfunction unpack(packed, haystack, names) {\n\tconst len = packed.length;\n\tconst matches = new Array(len / 3);\n\tfor (let i = 0, j = 0; i < len; i += 3, j++) {\n\t\tconst idx = packed[i];\n\t\tconst start = packed[i + 1];\n\t\tconst end = packed[i + 2];\n\t\tif (idx === void 0 || start === void 0 || end === void 0) throw new Error(`Malformed packed matches at offset ${String(i)}`);\n\t\tconst m = {\n\t\t\tpattern: idx,\n\t\t\tstart,\n\t\t\tend,\n\t\t\ttext: haystack.slice(start, end)\n\t\t};\n\t\tif (names && names[idx] !== void 0) m.name = names[idx];\n\t\tmatches[j] = m;\n\t}\n\treturn matches;\n}\nfunction isWordCharUnicode(ch) {\n\treturn /[\\p{L}\\p{N}_]/u.test(ch);\n}\nfunction isWordCharAscii(ch) {\n\treturn /[a-zA-Z0-9_]/.test(ch);\n}\nfunction checkBoundary(haystack, pos, ascii) {\n\tconst isWc = ascii ? isWordCharAscii : isWordCharUnicode;\n\treturn (pos > 0 && isWc(haystack.charAt(pos - 1))) !== (pos < haystack.length && isWc(haystack.charAt(pos)));\n}\nfunction filterWholeWords(matches, haystack, ascii) {\n\treturn matches.filter((m) => checkBoundary(haystack, m.start, ascii) && checkBoundary(haystack, m.end, ascii));\n}\nfunction normalizePatterns(patterns) {\n\tconst strings = [];\n\tconst names = [];\n\tlet hasNames = false;\n\tfor (const p of patterns) if (typeof p === \"string\") {\n\t\tstrings.push(p);\n\t\tnames.push(void 0);\n\t} else if (typeof p === \"object\" && p !== null && \"pattern\" in p) {\n\t\tstrings.push(p.pattern);\n\t\tif (p.name !== void 0) {\n\t\t\thasNames = true;\n\t\t\tnames.push(p.name);\n\t\t} else names.push(void 0);\n\t} else throw new TypeError(\"Pattern must be a string or { pattern: string; name?: string }\");\n\treturn {\n\t\tstrings,\n\t\tnames: hasNames ? names : null\n\t};\n}\n/**\n* Aho-Corasick automaton for multi-pattern string\n* searching.\n*\n* @throws {Error} If the automaton cannot be built\n* (e.g. patterns exceed internal size limits).\n*\n* @example\n* ```ts\n* const ac = new AhoCorasick([\"foo\", \"bar\"]);\n* ac.findIter(\"foo bar\");\n* // [\n* // { pattern: 0, start: 0, end: 3,\n* // text: \"foo\" },\n* // { pattern: 1, start: 4, end: 7,\n* // text: \"bar\" },\n* // ]\n* ```\n*/\nvar AhoCorasick = class {\n\t_inner;\n\t_names;\n\t_jsWholeWords;\n\tconstructor(patterns, options) {\n\t\tconst { strings, names } = normalizePatterns(patterns);\n\t\tthis._names = names;\n\t\tthis._jsWholeWords = !(options?.unicodeBoundaries ?? true) && (options?.wholeWords ?? false);\n\t\tconst nativeOpts = options ? { ...options } : void 0;\n\t\tif (nativeOpts) {\n\t\t\tdelete nativeOpts.unicodeBoundaries;\n\t\t\tif (this._jsWholeWords) nativeOpts.wholeWords = false;\n\t\t}\n\t\tthis._inner = new binding.AhoCorasick(strings, nativeOpts);\n\t}\n\t/** Number of patterns in the automaton. */\n\tget patternCount() {\n\t\treturn this._inner.patternCount;\n\t}\n\t/** Returns `true` if any pattern matches. */\n\tisMatch(haystack) {\n\t\tif (!this._jsWholeWords) return this._inner.isMatch(haystack);\n\t\treturn this.findIter(haystack).length > 0;\n\t}\n\t/** Find all non-overlapping matches. */\n\tfindIter(haystack) {\n\t\tlet matches = unpack(this._inner._findIterPacked(haystack), haystack, this._names);\n\t\tif (this._jsWholeWords) matches = filterWholeWords(matches, haystack, true);\n\t\treturn matches;\n\t}\n\t/** Find all overlapping matches. */\n\tfindOverlappingIter(haystack) {\n\t\tlet matches = unpack(this._inner._findOverlappingIterPacked(haystack), haystack, this._names);\n\t\tif (this._jsWholeWords) matches = filterWholeWords(matches, haystack, true);\n\t\treturn matches;\n\t}\n\t/**\n\t* Replace all non-overlapping matches.\n\t* `replacements[i]` replaces pattern `i`.\n\t*\n\t* @throws {Error} If `replacements.length` does\n\t* not equal `patternCount`.\n\t*/\n\treplaceAll(haystack, replacements) {\n\t\tif (replacements.length !== this.patternCount) throw new Error(`Expected ${this.patternCount} replacements, got ${replacements.length}`);\n\t\tif (!this._jsWholeWords) return this._inner.replaceAll(haystack, replacements);\n\t\tconst matches = this.findIter(haystack);\n\t\tlet result = \"\";\n\t\tlet last = 0;\n\t\tfor (const m of matches) {\n\t\t\tresult += haystack.slice(last, m.start);\n\t\t\tresult += replacements[m.pattern];\n\t\t\tlast = m.end;\n\t\t}\n\t\tresult += haystack.slice(last);\n\t\treturn result;\n\t}\n\t/**\n\t* Find matches in a `Buffer` / `Uint8Array`.\n\t* Returns **byte offsets** (not UTF-16).\n\t*/\n\tfindIterBuf(haystack) {\n\t\treturn this._inner.findIterBuf(haystack);\n\t}\n\t/**\n\t* Check whether any pattern matches in a\n\t* `Buffer` / `Uint8Array`.\n\t*/\n\tisMatchBuf(haystack) {\n\t\treturn this._inner.isMatchBuf(haystack);\n\t}\n};\n/**\n* Streaming matcher that handles chunk boundaries.\n*\n* @example\n* ```ts\n* const sm = new StreamMatcher([\"needle\"]);\n* for await (const chunk of stream) {\n* for (const m of sm.write(chunk)) {\n* console.log(`Pattern ${m.pattern} at`\n* + ` byte ${m.start}..${m.end}`);\n* }\n* }\n* sm.flush();\n* ```\n*/\nvar StreamMatcher = class {\n\t_inner;\n\tconstructor(patterns, options) {\n\t\tconst nativeOpts = options ? { ...options } : void 0;\n\t\tif (nativeOpts) delete nativeOpts.unicodeBoundaries;\n\t\tthis._inner = new binding.StreamMatcher(patterns, nativeOpts);\n\t}\n\t/** Feed a chunk, get matches with global byte\n\t* offsets. */\n\twrite(chunk) {\n\t\treturn this._inner.write(chunk);\n\t}\n\t/** Flush remaining state. */\n\tflush() {\n\t\treturn this._inner.flush();\n\t}\n\t/** Reset for reuse. */\n\treset() {\n\t\treturn this._inner.reset();\n\t}\n};\n//#endregion\n//#region src/wasm.ts\ninitBinding(aho_corasick_wasi_browser_default);\n//#endregion\nexport { AhoCorasick, StreamMatcher };\n\n//# sourceMappingURL=wasm.mjs.map","import { WASI, getDefaultContext, instantiateNapiModuleSync } from \"@napi-rs/wasm-runtime\";\n//#region fuzzy-search.wasi-browser.js\nconst __wasi = new WASI({ version: \"preview1\" });\nconst __wasmUrl = new URL(\"./fuzzy-search.wasm32-wasi.wasm\", import.meta.url).href;\nconst __emnapiContext = getDefaultContext();\nconst __sharedMemory = new WebAssembly.Memory({\n\tinitial: 4e3,\n\tmaximum: 65536,\n\tshared: true\n});\nconst { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule } = instantiateNapiModuleSync(await fetch(__wasmUrl).then(async (res) => {\n\tconst bytes = await res.arrayBuffer();\n\tconst view = new Uint8Array(bytes);\n\tif (view.length < 4 || view[0] !== 0 || view[1] !== 97 || view[2] !== 115 || view[3] !== 109) throw new Error(\"@stll/fuzzy-search-wasm failed to load its .wasm binary. The response did not contain WebAssembly bytes, which commonly happens when a bundler (Vite, webpack dev server, etc.) rewrites import.meta.url during pre-bundling.\\n\\nIf you are using Vite, import the bundled plugin:\\n import stllWasm from \\\"@stll/fuzzy-search-wasm/vite\\\"\\n // ...\\n plugins: [stllWasm()]\");\n\treturn bytes;\n}), {\n\tcontext: __emnapiContext,\n\tasyncWorkPoolSize: 4,\n\twasi: __wasi,\n\tonCreateWorker() {\n\t\treturn new Worker(new URL(\"./wasi-worker-browser.mjs\", import.meta.url), { type: \"module\" });\n\t},\n\toverwriteImports(importObject) {\n\t\timportObject.env = {\n\t\t\t...importObject.env,\n\t\t\t...importObject.napi,\n\t\t\t...importObject.emnapi,\n\t\t\tmemory: __sharedMemory\n\t\t};\n\t\treturn importObject;\n\t},\n\tbeforeInit({ instance }) {\n\t\tfor (const name of Object.keys(instance.exports)) if (name.startsWith(\"__napi_register__\")) instance.exports[name]();\n\t}\n});\nvar fuzzy_search_wasi_browser_default = __napiModule.exports;\n__napiModule.exports.FuzzySearch;\n__napiModule.exports.distance;\n__napiModule.exports.Metric;\n//#endregion\n//#region src/core.ts\nlet binding;\n/** Set the native backend. Must be called once\n* before any class constructor. */\nconst initBinding = (b) => {\n\tbinding = b;\n};\nconst resolveDistance = (dist, patternLength) => {\n\tif (dist !== \"auto\") return dist;\n\tif (patternLength <= 2) return 0;\n\tif (patternLength <= 5) return 1;\n\treturn 2;\n};\nconst normalizeEntry = (p, i) => {\n\tif (typeof p === \"string\") return { pattern: p };\n\tif (typeof p === \"object\" && p !== null && typeof p.pattern === \"string\") {\n\t\tif (p.distance === \"auto\") return {\n\t\t\t...p,\n\t\t\tdistance: resolveDistance(\"auto\", p.pattern.length)\n\t\t};\n\t\treturn p;\n\t}\n\tthrow new TypeError(`Pattern at index ${i} must be a string or { pattern, distance?, name? }`);\n};\nconst unpack = (packed, haystack, names) => {\n\tconst len = packed.length;\n\tconst matches = [];\n\tfor (let i = 0; i < len; i += 4) {\n\t\tconst idx = packed[i];\n\t\tconst start = packed[i + 1];\n\t\tconst end = packed[i + 2];\n\t\tconst distance = packed[i + 3];\n\t\tif (idx === void 0 || start === void 0 || end === void 0 || distance === void 0) throw new Error(`Malformed packed array at offset ${String(i)}`);\n\t\tconst m = {\n\t\t\tpattern: idx,\n\t\t\tstart,\n\t\t\tend,\n\t\t\ttext: haystack.slice(start, end),\n\t\t\tdistance\n\t\t};\n\t\tif (names[idx] !== void 0) m.name = names[idx];\n\t\tmatches.push(m);\n\t}\n\treturn matches;\n};\n/**\n* Fuzzy string matcher. Finds approximate\n* matches within edit distance k, immune to\n* typos, OCR errors, and diacritics variants.\n*\n* Uses Myers' bit-parallel algorithm for O(n)\n* scanning per pattern (patterns up to 64 chars).\n*\n* @throws {Error} If a pattern is empty, too\n* long (> 64 chars), or distance > 3.\n*\n* @example\n* ```ts\n* const fs = new FuzzySearch([\n* { pattern: \"Gaislerova\", distance: 1 },\n* { pattern: \"Novak\", distance: 1 },\n* ], {\n* normalizeDiacritics: true,\n* wholeWords: true,\n* });\n*\n* fs.findIter(\"Gais1erova a Nowak\");\n* // [\n* // { pattern: 0, start: 0, end: 10,\n* // text: \"Gais1erova\", distance: 1 },\n* // { pattern: 1, start: 13, end: 18,\n* // text: \"Nowak\", distance: 1 },\n* // ]\n* ```\n*/\nvar FuzzySearch = class {\n\t_names;\n\t_inner;\n\tconstructor(patterns, options) {\n\t\tconst entries = patterns.map(normalizeEntry);\n\t\tthis._names = entries.map((e) => e.name);\n\t\tthis._inner = new binding.FuzzySearch(entries, options);\n\t}\n\t/** Number of patterns in the matcher. */\n\tget patternCount() {\n\t\treturn this._inner.patternCount;\n\t}\n\t/**\n\t* Returns `true` if any pattern matches\n\t* within its edit distance.\n\t*/\n\tisMatch(haystack) {\n\t\treturn this._inner.isMatch(haystack);\n\t}\n\t/** Find all non-overlapping fuzzy matches. */\n\tfindIter(haystack) {\n\t\treturn unpack(this._inner._findIterPacked(haystack), haystack, this._names);\n\t}\n\t/**\n\t* Replace all fuzzy matches.\n\t* `replacements[i]` replaces pattern `i`.\n\t*\n\t* @throws {Error} If `replacements.length`\n\t* does not equal `patternCount`.\n\t*/\n\treplaceAll(haystack, replacements) {\n\t\treturn this._inner.replaceAll(haystack, replacements);\n\t}\n};\n/**\n* Compute edit distance between two strings.\n*\n* Uses Unicode characters (not UTF-16 code units),\n* so emoji and supplementary plane characters are\n* handled correctly.\n*\n* @example\n* ```ts\n* distance(\"Novak\", \"Nowak\"); // 1\n* distance(\"abcd\", \"abdc\"); // 2\n* distance(\"abcd\", \"abdc\",\n* \"damerau-levenshtein\"); // 1\n* ```\n*/\nconst distance = (a, b, metric) => binding.distance(a, b, metric ?? null);\n//#endregion\n//#region src/wasm.ts\ninitBinding(fuzzy_search_wasi_browser_default);\n//#endregion\nexport { FuzzySearch, distance };\n\n//# sourceMappingURL=wasm.mjs.map","import { WASI, getDefaultContext, instantiateNapiModuleSync } from \"@napi-rs/wasm-runtime\";\n//#region regex-set.wasi-browser.js\nconst __wasi = new WASI({ version: \"preview1\" });\nconst __wasmUrl = new URL(\"./regex-set.wasm32-wasi.wasm\", import.meta.url).href;\nconst __emnapiContext = getDefaultContext();\nconst __sharedMemory = new WebAssembly.Memory({\n\tinitial: 4e3,\n\tmaximum: 65536,\n\tshared: true\n});\nconst { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule } = instantiateNapiModuleSync(await fetch(__wasmUrl).then(async (res) => {\n\tconst bytes = await res.arrayBuffer();\n\tconst view = new Uint8Array(bytes);\n\tif (view.length < 4 || view[0] !== 0 || view[1] !== 97 || view[2] !== 115 || view[3] !== 109) throw new Error(\"@stll/regex-set-wasm failed to load its .wasm binary. The response did not contain WebAssembly bytes, which commonly happens when a bundler (Vite, webpack dev server, etc.) rewrites import.meta.url during pre-bundling.\\n\\nIf you are using Vite, import the bundled plugin:\\n import stllWasm from \\\"@stll/regex-set-wasm/vite\\\"\\n // ...\\n plugins: [stllWasm()]\");\n\treturn bytes;\n}), {\n\tcontext: __emnapiContext,\n\tasyncWorkPoolSize: 4,\n\twasi: __wasi,\n\tonCreateWorker() {\n\t\treturn new Worker(new URL(\"./wasi-worker-browser.mjs\", import.meta.url), { type: \"module\" });\n\t},\n\toverwriteImports(importObject) {\n\t\timportObject.env = {\n\t\t\t...importObject.env,\n\t\t\t...importObject.napi,\n\t\t\t...importObject.emnapi,\n\t\t\tmemory: __sharedMemory\n\t\t};\n\t\treturn importObject;\n\t},\n\tbeforeInit({ instance }) {\n\t\tfor (const name of Object.keys(instance.exports)) if (name.startsWith(\"__napi_register__\")) instance.exports[name]();\n\t}\n});\nvar regex_set_wasi_browser_default = __napiModule.exports;\n__napiModule.exports.RegexSet;\n__napiModule.exports._uax29Boundaries;\n//#endregion\n//#region src/core.ts\nlet binding;\n/** Set the native backend. Must be called once\n* before any class constructor. */\nconst initBinding = (b) => {\n\tbinding = b;\n};\nfunction unpack(packed, haystack, names) {\n\tconst len = packed.length;\n\tconst matches = new Array(len / 3);\n\tfor (let i = 0, j = 0; i < len; i += 3, j++) {\n\t\tconst idx = packed[i];\n\t\tconst s = packed[i + 1];\n\t\tconst e = packed[i + 2];\n\t\tif (idx === void 0 || s === void 0 || e === void 0) throw new Error(`Corrupt packed match data at offset ${i}`);\n\t\tconst m = {\n\t\t\tpattern: idx,\n\t\t\tstart: s,\n\t\t\tend: e,\n\t\t\ttext: haystack.slice(s, e)\n\t\t};\n\t\tif (names && names[idx] !== void 0) m.name = names[idx];\n\t\tmatches[j] = m;\n\t}\n\treturn matches;\n}\n/**\n* Replace unescaped `\\b` and `\\B` with their\n* ASCII-only equivalents `(?-u:\\b)` / `(?-u:\\B)`.\n* Skips character classes `[...]` (where `\\b` means\n* backspace) and escaped backslashes `\\\\b`.\n*/\nfunction asciiBoundaries(src) {\n\tlet result = \"\";\n\tlet inClass = false;\n\tlet i = 0;\n\twhile (i < src.length) if (src.charAt(i) === \"\\\\\" && i + 1 < src.length) {\n\t\tconst next = src.charAt(i + 1);\n\t\tif (!inClass && (next === \"b\" || next === \"B\")) {\n\t\t\tresult += `(?-u:\\\\${next})`;\n\t\t\ti += 2;\n\t\t} else {\n\t\t\tresult += src.charAt(i) + src.charAt(i + 1);\n\t\t\ti += 2;\n\t\t}\n\t} else {\n\t\tif (src.charAt(i) === \"[\") inClass = true;\n\t\tif (src.charAt(i) === \"]\") inClass = false;\n\t\tresult += src.charAt(i);\n\t\ti++;\n\t}\n\treturn result;\n}\n/**\n* Convert a RegExp to Rust regex syntax string.\n*/\nfunction regexpToRust(re) {\n\tlet flags = \"\";\n\tif (re.flags.includes(\"i\")) flags += \"i\";\n\tif (re.flags.includes(\"m\")) flags += \"m\";\n\tif (re.flags.includes(\"s\")) flags += \"s\";\n\tif (!flags) return re.source;\n\tif (!flags.includes(\"i\")) return `(?${flags})${re.source}`;\n\tlet src = re.source;\n\tlet leading = \"\";\n\tlet trailing = \"\";\n\tif (src.startsWith(\"\\\\b\")) {\n\t\tleading = \"\\\\b\";\n\t\tsrc = src.slice(2);\n\t} else if (src.startsWith(\"\\\\B\")) {\n\t\tleading = \"\\\\B\";\n\t\tsrc = src.slice(2);\n\t}\n\tif (src.length >= 2) {\n\t\tconst last = src.charAt(src.length - 1);\n\t\tif (last === \"b\" || last === \"B\") {\n\t\t\tlet bs = 0;\n\t\t\tlet k = src.length - 2;\n\t\t\twhile (k >= 0 && src.charAt(k) === \"\\\\\") {\n\t\t\t\tbs++;\n\t\t\t\tk--;\n\t\t\t}\n\t\t\tif (bs > 0 && bs % 2 === 1) {\n\t\t\t\ttrailing = \"\\\\\" + last;\n\t\t\t\tsrc = src.slice(0, -2);\n\t\t\t}\n\t\t}\n\t}\n\tconst uFlag = needsAsciiMode(src) && !hasNonAscii(src) ? \"-u\" : \"\";\n\treturn `${leading}(?${flags}${uFlag}:${src})${trailing}`;\n}\n/**\n* Check if content uses character class shortcuts\n* (\\w, \\W, \\d, \\D, \\s, \\S, \\b, \\B) that have\n* Unicode-aware versions. Only these benefit from\n* -u (ASCII-only mode). Literal strings like\n* \"dollars\" produce identical DFAs with or without\n* -u, so skipping -u for them is zero-cost.\n*/\nfunction needsAsciiMode(s) {\n\treturn /\\\\[wWdDsSbB]/.test(s);\n}\n/**\n* Check if a string contains non-ASCII characters.\n* When true, -u MUST NOT be added: regex-automata\n* rejects (?-u) alongside non-ASCII content like\n* [ACDE] or literal zlotych.\n*/\nfunction hasNonAscii(s) {\n\tfor (let i = 0; i < s.length; i++) if (s.charCodeAt(i) > 127) return true;\n\treturn false;\n}\n/**\n* Convert inline (?i) flags to (?i-u) for ASCII\n* case folding. Handles bare and scoped groups.\n*\n* Bare (?i) at the start of a pattern is converted\n* to a scoped group (?i-u:...) with edge \\b pulled\n* outside, matching the RegExp path behaviour. This\n* prevents -u from affecting \\b word boundary\n* semantics (which should remain Unicode when\n* unicodeBoundaries is true).\n*\n* NOTE: -u also disables Unicode character classes\n* (\\w, \\d, \\s become ASCII-only), matching the\n* behaviour of regexpToRust() for /i RegExps.\n*/\nfunction scopeInlineFlags(src) {\n\tconst leadingBare = src.match(/^\\(\\?([ims]+)(?:-([imsu]+))?\\)/);\n\tconst enableGroup = leadingBare?.[1];\n\tif (leadingBare && enableGroup?.includes(\"i\")) {\n\t\tconst enable = enableGroup;\n\t\tconst disable = leadingBare[2] ?? \"\";\n\t\tlet rest = src.slice(leadingBare[0].length);\n\t\tlet leading = \"\";\n\t\tlet trailing = \"\";\n\t\tif (rest.startsWith(\"\\\\b\")) {\n\t\t\tleading = \"\\\\b\";\n\t\t\trest = rest.slice(2);\n\t\t} else if (rest.startsWith(\"\\\\B\")) {\n\t\t\tleading = \"\\\\B\";\n\t\t\trest = rest.slice(2);\n\t\t}\n\t\tif (rest.length >= 2) {\n\t\t\tconst last = rest.charAt(rest.length - 1);\n\t\t\tif (last === \"b\" || last === \"B\") {\n\t\t\t\tlet bs = 0;\n\t\t\t\tlet k = rest.length - 2;\n\t\t\t\twhile (k >= 0 && rest.charAt(k) === \"\\\\\") {\n\t\t\t\t\tbs++;\n\t\t\t\t\tk--;\n\t\t\t\t}\n\t\t\t\tif (bs > 0 && bs % 2 === 1) {\n\t\t\t\t\ttrailing = \"\\\\\" + last;\n\t\t\t\t\trest = rest.slice(0, -2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst inner = scopeInnerFlags(rest);\n\t\tconst merged = needsAsciiMode(rest) && !hasNonAscii(rest) && !disable.includes(\"u\") ? disable + \"u\" : disable;\n\t\tconst disablePart = merged ? `-${merged}` : \"\";\n\t\treturn `${leading}(?${enable}${disablePart}:${inner})${trailing}`;\n\t}\n\treturn scopeInnerFlags(src);\n}\n/**\n* Replace inline (?i) / (?i:...) groups with -u\n* variants. Does not handle leading bare flags\n* (that's done by scopeInlineFlags above).\n*/\nfunction scopeInnerFlags(src) {\n\tlet result = \"\";\n\tlet inClass = false;\n\tlet i = 0;\n\twhile (i < src.length) {\n\t\tif (src[i] === \"\\\\\" && i + 1 < src.length) {\n\t\t\tresult += src.charAt(i) + src.charAt(i + 1);\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (src.charAt(i) === \"[\") inClass = true;\n\t\tif (src.charAt(i) === \"]\") inClass = false;\n\t\tif (!inClass && src.charAt(i) === \"(\" && src.charAt(i + 1) === \"?\") {\n\t\t\tlet j = i + 2;\n\t\t\tlet enable = \"\";\n\t\t\twhile (j < src.length && \"ims\".includes(src.charAt(j))) {\n\t\t\t\tenable += src.charAt(j);\n\t\t\t\tj++;\n\t\t\t}\n\t\t\tlet disable = \"\";\n\t\t\tif (j < src.length && src.charAt(j) === \"-\") {\n\t\t\t\tj++;\n\t\t\t\twhile (j < src.length && \"imsu\".includes(src.charAt(j))) {\n\t\t\t\t\tdisable += src.charAt(j);\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (enable.length > 0 && (src.charAt(j) === \")\" || src.charAt(j) === \":\")) {\n\t\t\t\tif (enable.includes(\"i\")) if (disable.length > 0) result += `(?${enable}-${disable}${src.charAt(j)}`;\n\t\t\t\telse result += `(?${enable}${src.charAt(j)}`;\n\t\t\t\telse if (disable.length > 0) result += `(?${enable}-${disable}${src.charAt(j)}`;\n\t\t\t\telse result += `(?${enable}${src.charAt(j)}`;\n\t\t\t\ti = j + 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tresult += src.charAt(i);\n\t\ti++;\n\t}\n\treturn result;\n}\n/**\n* Normalize a pattern entry to { pattern, name }.\n*/\nfunction normalizeEntry(p, i) {\n\tif (typeof p === \"string\") return {\n\t\tpattern: scopeInlineFlags(p),\n\t\tname: void 0\n\t};\n\tif (p instanceof RegExp) return {\n\t\tpattern: regexpToRust(p),\n\t\tname: void 0\n\t};\n\tif (typeof p === \"object\" && p !== null && \"pattern\" in p) {\n\t\tif (typeof p.pattern !== \"string\" && !(p.pattern instanceof RegExp)) throw new TypeError(`Pattern at index ${i}: \"pattern\" field must be a string or RegExp`);\n\t\tconst inner = p.pattern instanceof RegExp ? { pattern: regexpToRust(p.pattern) } : { pattern: scopeInlineFlags(p.pattern) };\n\t\tif (p.name !== void 0 && typeof p.name !== \"string\") throw new TypeError(`Pattern at index ${i}: \"name\" field must be a string`);\n\t\treturn {\n\t\t\tpattern: inner.pattern,\n\t\t\tname: p.name\n\t\t};\n\t}\n\tthrow new TypeError(`Pattern at index ${i} must be a string, RegExp, or { pattern, name }`);\n}\n/**\n* Multi-pattern regex matcher.\n*\n* Compiles multiple regex patterns into a single\n* automaton for the main matching path. Standard\n* scans use Rust's DFA engine without catastrophic\n* backtracking. Some lookaround cases may use a\n* targeted fallback verifier to preserve\n* correctness. Uses Rust regex syntax for string\n* patterns (no lookaheads/backreferences).\n*\n* @example\n* ```ts\n* // Simple\n* new RegexSet([/\\d{8}/, \"\\\\+?\\\\d{9,12}\"]);\n*\n* // Named\n* new RegexSet([\n* { pattern: /\\d{8}/, name: \"ico\" },\n* { pattern: /\\d{2}\\.\\d{2}\\.\\d{4}/, name: \"date\" },\n* ]);\n* // match.name === \"date\"\n* ```\n*/\nvar RegexSet = class {\n\t_inner;\n\t_names;\n\t_hasNames;\n\tconstructor(patterns, options) {\n\t\tconst entries = patterns.map(normalizeEntry);\n\t\tthis._names = entries.map((e) => e.name);\n\t\tthis._hasNames = entries.some((e) => e.name !== void 0);\n\t\tconst unicode = options?.unicodeBoundaries ?? true;\n\t\tconst ci = options?.caseInsensitive ?? false;\n\t\tlet processed = entries.map((e) => e.pattern);\n\t\tif (ci) processed = processed.map((p) => {\n\t\t\tif (/^(?:\\\\[bB]|\\(\\?[ims]+(?:-[imsu]+)?\\))*\\(\\?[ims]*i[ims]*(?:-[imsu]+)?[:(]/.test(p)) return p;\n\t\t\tlet src = p;\n\t\t\tlet flagPrefix = \"\";\n\t\t\tconst bareFlagMatch = src.match(/^\\(\\?[ims]+(?:-[imsu]+)?\\)/);\n\t\t\tif (bareFlagMatch) {\n\t\t\t\tflagPrefix = bareFlagMatch[0];\n\t\t\t\tsrc = src.slice(flagPrefix.length);\n\t\t\t}\n\t\t\tlet leading = \"\";\n\t\t\tlet trailing = \"\";\n\t\t\tif (src.startsWith(\"\\\\b\")) {\n\t\t\t\tleading = \"\\\\b\";\n\t\t\t\tsrc = src.slice(2);\n\t\t\t} else if (src.startsWith(\"\\\\B\")) {\n\t\t\t\tleading = \"\\\\B\";\n\t\t\t\tsrc = src.slice(2);\n\t\t\t}\n\t\t\tif (src.length >= 2) {\n\t\t\t\tconst last = src.charAt(src.length - 1);\n\t\t\t\tif (last === \"b\" || last === \"B\") {\n\t\t\t\t\tlet bs = 0;\n\t\t\t\t\tlet k = src.length - 2;\n\t\t\t\t\twhile (k >= 0 && src.charAt(k) === \"\\\\\") {\n\t\t\t\t\t\tbs++;\n\t\t\t\t\t\tk--;\n\t\t\t\t\t}\n\t\t\t\t\tif (bs > 0 && bs % 2 === 1) {\n\t\t\t\t\t\ttrailing = \"\\\\\" + last;\n\t\t\t\t\t\tsrc = src.slice(0, -2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst uFlag = needsAsciiMode(src) && !hasNonAscii(src) ? \"-u\" : \"\";\n\t\t\treturn `${flagPrefix}${leading}(?i${uFlag}:${src})${trailing}`;\n\t\t});\n\t\tif (!unicode) processed = processed.map(asciiBoundaries);\n\t\tconst nativeOpts = options ? {\n\t\t\twholeWords: options.wholeWords,\n\t\t\tunicodeBoundaries: options.unicodeBoundaries\n\t\t} : void 0;\n\t\tthis._inner = new binding.RegexSet(processed, nativeOpts);\n\t}\n\t/** Number of patterns. */\n\tget patternCount() {\n\t\treturn this._inner.patternCount;\n\t}\n\t/** Returns `true` if any pattern matches. */\n\tisMatch(haystack) {\n\t\treturn this._inner._isMatchBuf(Buffer.from(haystack));\n\t}\n\t/** Find all non-overlapping matches. */\n\tfindIter(haystack) {\n\t\treturn unpack(this._inner._findIterPackedBuf(Buffer.from(haystack)), haystack, this._hasNames ? this._names : null);\n\t}\n\t/** Which pattern indices matched (not where). */\n\twhichMatch(haystack) {\n\t\treturn this._inner.whichMatch(haystack);\n\t}\n\t/**\n\t* Replace all non-overlapping matches.\n\t* `replacements[i]` replaces pattern `i`.\n\t*/\n\treplaceAll(haystack, replacements) {\n\t\treturn this._inner.replaceAll(haystack, replacements);\n\t}\n};\n//#endregion\n//#region src/wasm.ts\ninitBinding(regex_set_wasi_browser_default);\n//#endregion\nexport { RegexSet };\n\n//# sourceMappingURL=wasm.mjs.map","import { AhoCorasick } from \"@stll/aho-corasick-wasm\";\nimport { FuzzySearch } from \"@stll/fuzzy-search-wasm\";\nimport { RegexSet } from \"@stll/regex-set-wasm\";\n//#region src/engines.ts\nlet engines;\nconst initEngines = (e) => {\n\tengines = e;\n};\nconst getEngines = () => {\n\tif (!engines) throw new Error(\"Engines not initialized. Import from @stll/text-search or @stll/text-search-wasm, not from internal modules.\");\n\treturn engines;\n};\n//#endregion\n//#region src/classify.ts\n/**\n* Check if a string is a pure literal (no regex\n* metacharacters). Pure literals are routed to\n* Aho-Corasick instead of the regex DFA.\n*/\nfunction isLiteralPattern(pattern) {\n\tfor (let i = 0; i < pattern.length; i++) {\n\t\tconst ch = pattern.charAt(i);\n\t\tif (ch === \"\\\\\" || ch === \".\" || ch === \"^\" || ch === \"$\" || ch === \"*\" || ch === \"+\" || ch === \"?\" || ch === \"{\" || ch === \"}\" || ch === \"(\" || ch === \")\" || ch === \"[\" || ch === \"]\" || ch === \"|\") return false;\n\t}\n\treturn pattern.length > 0;\n}\n/**\n* Count the maximum alternation branches at any\n* depth in a regex string. Used to detect patterns\n* with large alternations (even nested inside\n* groups) that should be isolated into their own\n* RegexSet to prevent DFA state explosion.\n*\n* \"a|b|c\" → 3\n* \"(a|b)|c\" → 2 (max of top=2, depth1=2)\n* \"(?:Ing\\\\.|Mgr\\\\.|Dr\\\\.)\" → 3 (depth 1)\n*/\nfunction countAlternations(pattern) {\n\tlet depth = 0;\n\tlet inClass = false;\n\tlet i = 0;\n\tlet max = 1;\n\tlet currentCount = 1;\n\tconst stack = [];\n\twhile (i < pattern.length) {\n\t\tconst ch = pattern[i];\n\t\tif (ch === \"\\\\\" && i + 1 < pattern.length) {\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"[\") inClass = true;\n\t\tif (ch === \"]\") inClass = false;\n\t\tif (!inClass) {\n\t\t\tif (ch === \"(\") {\n\t\t\t\tstack.push(currentCount);\n\t\t\t\tcurrentCount = 1;\n\t\t\t\tdepth++;\n\t\t\t}\n\t\t\tif (ch === \")\") {\n\t\t\t\tif (currentCount > max) max = currentCount;\n\t\t\t\tcurrentCount = stack.pop() ?? 1;\n\t\t\t\tdepth--;\n\t\t\t}\n\t\t\tif (ch === \"|\") currentCount++;\n\t\t}\n\t\ti++;\n\t}\n\tif (currentCount > max) max = currentCount;\n\treturn max;\n}\n/**\n* Classify and normalize pattern entries.\n*/\nfunction classifyPatterns(entries, allLiteral = false) {\n\treturn entries.map((entry, i) => {\n\t\tif (typeof entry === \"string\") return {\n\t\t\toriginalIndex: i,\n\t\t\tpattern: entry,\n\t\t\talternationCount: allLiteral ? 0 : countAlternations(entry),\n\t\t\tisLiteral: allLiteral || isLiteralPattern(entry)\n\t\t};\n\t\tif (entry instanceof RegExp) return {\n\t\t\toriginalIndex: i,\n\t\t\tpattern: entry,\n\t\t\talternationCount: countAlternations(entry.source),\n\t\t\tisLiteral: false\n\t\t};\n\t\tif (\"distance\" in entry) {\n\t\t\tconst result = {\n\t\t\t\toriginalIndex: i,\n\t\t\t\tpattern: entry.pattern,\n\t\t\t\talternationCount: 0,\n\t\t\t\tisLiteral: false,\n\t\t\t\tfuzzyDistance: entry.distance\n\t\t\t};\n\t\t\tif (entry.name !== void 0) result.name = entry.name;\n\t\t\treturn result;\n\t\t}\n\t\tif (\"literal\" in entry && entry.literal) {\n\t\t\tconst hasPerPatternOpts = \"caseInsensitive\" in entry || \"wholeWords\" in entry;\n\t\t\tconst result = {\n\t\t\t\toriginalIndex: i,\n\t\t\t\tpattern: entry.pattern,\n\t\t\t\talternationCount: 0,\n\t\t\t\tisLiteral: true\n\t\t\t};\n\t\t\tif (entry.name !== void 0) result.name = entry.name;\n\t\t\tif (hasPerPatternOpts) {\n\t\t\t\tconst opts = {};\n\t\t\t\tif (entry.caseInsensitive !== void 0) opts.caseInsensitive = entry.caseInsensitive;\n\t\t\t\tif (entry.wholeWords !== void 0) opts.wholeWords = entry.wholeWords;\n\t\t\t\tresult.acOptions = opts;\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\tconst pat = entry.pattern;\n\t\tconst source = pat instanceof RegExp ? pat.source : pat;\n\t\tconst result = {\n\t\t\toriginalIndex: i,\n\t\t\tpattern: pat,\n\t\t\talternationCount: allLiteral ? 0 : countAlternations(source),\n\t\t\tisLiteral: typeof pat === \"string\" && (allLiteral || isLiteralPattern(pat))\n\t\t};\n\t\tif (entry.name !== void 0) result.name = entry.name;\n\t\treturn result;\n\t});\n}\n//#endregion\n//#region src/merge.ts\n/**\n* Merge matches from multiple engines, sort by\n* position, and select non-overlapping (longest\n* first at ties). Same algorithm as regex-set's\n* internal select_non_overlapping.\n*/\nfunction mergeAndSelect(matches) {\n\tif (matches.length <= 1) return matches;\n\tmatches.sort((a, b) => {\n\t\tif (a.start !== b.start) return a.start - b.start;\n\t\treturn b.end - b.start - (a.end - a.start);\n\t});\n\tconst selected = [];\n\tlet lastEnd = 0;\n\tfor (const m of matches) if (m.start >= lastEnd) {\n\t\tselected.push(m);\n\t\tlastEnd = m.end;\n\t}\n\treturn selected;\n}\n//#endregion\n//#region src/text-search.ts\n/**\n* Multi-engine text search orchestrator.\n*\n* Routes patterns to the optimal engine\n* configuration:\n* - Large alternation patterns get their own\n* RegexSet instance (prevents DFA state explosion)\n* - Normal patterns share a single RegexSet\n* (single-pass multi-pattern DFA)\n*\n* Merges results from all engines into a unified\n* non-overlapping Match[] sorted by position.\n*/\nvar TextSearch = class {\n\tengines = [];\n\tpatternCount;\n\toverlapAll;\n\t/**\n\t* True when there's exactly one engine and all\n\t* patterns map to identity indices (0→0, 1→1, ...).\n\t* Enables zero-overhead findIter: return raw engine\n\t* output without remapping or object allocation.\n\t*/\n\tzeroOverhead = false;\n\tconstructor(patterns, options) {\n\t\tthis.patternCount = patterns.length;\n\t\tthis.overlapAll = options?.overlapStrategy === \"all\";\n\t\tconst maxAlt = options?.maxAlternations ?? 50;\n\t\tconst classified = classifyPatterns(patterns, options?.allLiteral ?? false);\n\t\tconst fuzzy = [];\n\t\tconst literals = [];\n\t\tconst shared = [];\n\t\tconst isolated = [];\n\t\tfor (const cp of classified) if (cp.fuzzyDistance !== void 0) fuzzy.push(cp);\n\t\telse if (cp.isLiteral) literals.push(cp);\n\t\telse if (cp.alternationCount > maxAlt) isolated.push(cp);\n\t\telse shared.push(cp);\n\t\tconst rsOptions = {\n\t\t\tunicodeBoundaries: options?.unicodeBoundaries ?? true,\n\t\t\twholeWords: options?.wholeWords ?? false,\n\t\t\tcaseInsensitive: options?.caseInsensitive ?? false\n\t\t};\n\t\tif (fuzzy.length > 0) {\n\t\t\tconst fuzzyOpts = {\n\t\t\t\tunicodeBoundaries: rsOptions.unicodeBoundaries,\n\t\t\t\twholeWords: rsOptions.wholeWords\n\t\t\t};\n\t\t\tif (options?.fuzzyMetric !== void 0) fuzzyOpts.metric = options.fuzzyMetric;\n\t\t\tif (options?.normalizeDiacritics !== void 0) fuzzyOpts.normalizeDiacritics = options.normalizeDiacritics;\n\t\t\tif (options?.caseInsensitive !== void 0) fuzzyOpts.caseInsensitive = options.caseInsensitive;\n\t\t\tthis.engines.push(buildFuzzyEngine(fuzzy, fuzzyOpts));\n\t\t}\n\t\tif (literals.length > 0) {\n\t\t\tconst groups = /* @__PURE__ */ new Map();\n\t\t\tfor (const cp of literals) {\n\t\t\t\tconst ci = cp.acOptions?.caseInsensitive ?? rsOptions.caseInsensitive;\n\t\t\t\tconst ww = cp.acOptions?.wholeWords ?? rsOptions.wholeWords;\n\t\t\t\tconst key = `${ci ? 1 : 0}:${ww ? 1 : 0}`;\n\t\t\t\tconst group = groups.get(key);\n\t\t\t\tif (group) group.push(cp);\n\t\t\t\telse groups.set(key, [cp]);\n\t\t\t}\n\t\t\tfor (const [key, group] of groups) {\n\t\t\t\tconst [ci, ww] = key.split(\":\");\n\t\t\t\tthis.engines.push(buildAcEngine(group, {\n\t\t\t\t\t...rsOptions,\n\t\t\t\t\tcaseInsensitive: ci === \"1\",\n\t\t\t\t\twholeWords: ww === \"1\"\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t\tif (shared.length > 1) {\n\t\t\tconst combined = buildRegexEngine(shared, rsOptions);\n\t\t\tconst probe = \"Hello World 123 test@example.com 2025-01-01 +420 123 456 789 Ing. Jan Novák, s.r.o. Praha 1 \".repeat(10);\n\t\t\tconst t0 = performance.now();\n\t\t\tcombined.rs.findIter(probe);\n\t\t\tconst combinedMs = performance.now() - t0;\n\t\t\tlet individualMs = 0;\n\t\t\tconst individualEngines = [];\n\t\t\tfor (const cp of shared) {\n\t\t\t\tconst eng = buildRegexEngine([cp], rsOptions);\n\t\t\t\tconst t1 = performance.now();\n\t\t\t\teng.rs.findIter(probe);\n\t\t\t\tindividualMs += performance.now() - t1;\n\t\t\t\tindividualEngines.push(eng);\n\t\t\t}\n\t\t\tif (combinedMs > individualMs * 1.5) for (const eng of individualEngines) this.engines.push(eng);\n\t\t\telse this.engines.push(combined);\n\t\t} else if (shared.length === 1) this.engines.push(buildRegexEngine(shared, rsOptions));\n\t\tfor (const cp of isolated) this.engines.push(buildRegexEngine([cp], rsOptions));\n\t\tif (this.engines.length === 1) {\n\t\t\tconst engine = this.engines[0];\n\t\t\tif (engine === void 0) throw new Error(\"Expected single engine after length check\");\n\t\t\tif (!engine.nameMap.some((n) => n !== void 0)) this.zeroOverhead = true;\n\t\t}\n\t}\n\t/** Number of patterns. */\n\tget length() {\n\t\treturn this.patternCount;\n\t}\n\t/** Returns true if any pattern matches. */\n\tisMatch(haystack) {\n\t\tfor (const engine of this.engines) if (engineIsMatch(engine, haystack)) return true;\n\t\treturn false;\n\t}\n\t/**\n\t* Find matches in text.\n\t*\n\t* With `overlapStrategy: \"longest\"` (default):\n\t* returns non-overlapping matches, longest wins.\n\t*\n\t* With `overlapStrategy: \"all\"`: returns all\n\t* matches including overlaps, sorted by position.\n\t*/\n\tfindIter(haystack) {\n\t\tif (this.zeroOverhead) {\n\t\t\tconst engine = this.engines[0];\n\t\t\tif (engine === void 0) throw new Error(\"Zero-overhead path requires a single engine\");\n\t\t\treturn engineFindIter(engine, haystack);\n\t\t}\n\t\tif (this.engines.length === 1) {\n\t\t\tconst engine = this.engines[0];\n\t\t\tif (engine === void 0) throw new Error(\"Expected single engine after length check\");\n\t\t\treturn remapMatches(engineFindIter(engine, haystack), engine);\n\t\t}\n\t\tconst all = [];\n\t\tfor (const engine of this.engines) {\n\t\t\tconst matches = engineFindIter(engine, haystack);\n\t\t\tfor (const m of remapMatches(matches, engine)) all.push(m);\n\t\t}\n\t\tif (this.overlapAll) return all.sort((a, b) => a.start - b.start);\n\t\treturn mergeAndSelect(all);\n\t}\n\t/** Which pattern indices matched (not where). */\n\twhichMatch(haystack) {\n\t\tconst seen = /* @__PURE__ */ new Set();\n\t\tfor (const engine of this.engines) {\n\t\t\tconst matches = engineFindIter(engine, haystack);\n\t\t\tfor (const m of matches) {\n\t\t\t\tconst idx = engine.indexMap[m.pattern];\n\t\t\t\tif (idx === void 0) throw new Error(`Missing indexMap entry for pattern ${m.pattern}`);\n\t\t\t\tseen.add(idx);\n\t\t\t}\n\t\t}\n\t\treturn [...seen];\n\t}\n\t/**\n\t* Replace all non-overlapping matches.\n\t* replacements[i] replaces pattern i.\n\t*/\n\treplaceAll(haystack, replacements) {\n\t\tif (replacements.length !== this.patternCount) throw new Error(`Expected ${this.patternCount} replacements, got ${replacements.length}`);\n\t\tconst all = [];\n\t\tfor (const engine of this.engines) {\n\t\t\tconst matches = engineFindIter(engine, haystack);\n\t\t\tfor (const m of remapMatches(matches, engine)) all.push(m);\n\t\t}\n\t\tconst matches = mergeAndSelect(all);\n\t\tlet result = \"\";\n\t\tlet last = 0;\n\t\tfor (const m of matches) {\n\t\t\tresult += haystack.slice(last, m.start);\n\t\t\tconst replacement = replacements[m.pattern];\n\t\t\tif (replacement === void 0) throw new Error(`Missing replacement for pattern ${m.pattern}`);\n\t\t\tresult += replacement;\n\t\t\tlast = m.end;\n\t\t}\n\t\tresult += haystack.slice(last);\n\t\treturn result;\n\t}\n};\n/**\n* Build a RegexSet engine from classified patterns.\n*/\nfunction buildRegexEngine(patterns, options) {\n\tconst rsPatterns = [];\n\tconst indexMap = [];\n\tconst nameMap = [];\n\tfor (const cp of patterns) {\n\t\tif (cp.name !== void 0) rsPatterns.push({\n\t\t\tpattern: cp.pattern,\n\t\t\tname: cp.name\n\t\t});\n\t\telse rsPatterns.push(cp.pattern);\n\t\tindexMap.push(cp.originalIndex);\n\t\tnameMap.push(cp.name);\n\t}\n\tconst { RegexSet } = getEngines();\n\treturn {\n\t\ttype: \"regex\",\n\t\trs: new RegexSet(rsPatterns, options),\n\t\tindexMap,\n\t\tnameMap\n\t};\n}\n/**\n* Build an Aho-Corasick engine from literal patterns.\n*/\nfunction buildAcEngine(patterns, options) {\n\tconst literals = [];\n\tconst indexMap = [];\n\tconst nameMap = [];\n\tfor (const cp of patterns) {\n\t\tliterals.push(cp.pattern);\n\t\tindexMap.push(cp.originalIndex);\n\t\tnameMap.push(cp.name);\n\t}\n\tconst { AhoCorasick } = getEngines();\n\treturn {\n\t\ttype: \"ac\",\n\t\tac: new AhoCorasick(literals, {\n\t\t\twholeWords: options.wholeWords,\n\t\t\tunicodeBoundaries: options.unicodeBoundaries,\n\t\t\tcaseInsensitive: options.caseInsensitive\n\t\t}),\n\t\tindexMap,\n\t\tnameMap\n\t};\n}\n/**\n* Build a FuzzySearch engine from fuzzy patterns.\n*/\nfunction buildFuzzyEngine(patterns, options) {\n\tconst fsPatterns = [];\n\tconst indexMap = [];\n\tconst nameMap = [];\n\tfor (const cp of patterns) {\n\t\tconst entry = { pattern: cp.pattern };\n\t\tif (cp.fuzzyDistance !== void 0) entry.distance = cp.fuzzyDistance;\n\t\tif (cp.name !== void 0) entry.name = cp.name;\n\t\tfsPatterns.push(entry);\n\t\tindexMap.push(cp.originalIndex);\n\t\tnameMap.push(cp.name);\n\t}\n\tconst fsOptions = {\n\t\tunicodeBoundaries: options.unicodeBoundaries,\n\t\twholeWords: options.wholeWords\n\t};\n\tif (options.metric !== void 0) fsOptions.metric = options.metric;\n\tif (options.normalizeDiacritics !== void 0) fsOptions.normalizeDiacritics = options.normalizeDiacritics;\n\tif (options.caseInsensitive !== void 0) fsOptions.caseInsensitive = options.caseInsensitive;\n\tconst { FuzzySearch } = getEngines();\n\treturn {\n\t\ttype: \"fuzzy\",\n\t\tfs: new FuzzySearch(fsPatterns, fsOptions),\n\t\tindexMap,\n\t\tnameMap\n\t};\n}\n/**\n* Dispatch isMatch to the correct engine.\n*/\nfunction engineIsMatch(engine, haystack) {\n\tswitch (engine.type) {\n\t\tcase \"ac\": return engine.ac.isMatch(haystack);\n\t\tcase \"fuzzy\": return engine.fs.isMatch(haystack);\n\t\tcase \"regex\": return engine.rs.isMatch(haystack);\n\t}\n}\n/**\n* Dispatch findIter to the correct engine.\n*/\nfunction engineFindIter(engine, haystack) {\n\tswitch (engine.type) {\n\t\tcase \"ac\": return engine.ac.findIter(haystack);\n\t\tcase \"fuzzy\": return engine.fs.findIter(haystack);\n\t\tcase \"regex\": return engine.rs.findIter(haystack);\n\t}\n}\n/**\n* Remap engine-local match indices to original\n* input indices and add names.\n*/\nfunction remapMatches(matches, engine) {\n\treturn matches.map((m) => {\n\t\tconst originalIdx = engine.indexMap[m.pattern];\n\t\tif (originalIdx === void 0) throw new Error(`Missing indexMap entry for pattern ${m.pattern}`);\n\t\tconst name = engine.nameMap[m.pattern];\n\t\tconst result = {\n\t\t\tpattern: originalIdx,\n\t\t\tstart: m.start,\n\t\t\tend: m.end,\n\t\t\ttext: m.text\n\t\t};\n\t\tif (name !== void 0) result.name = name;\n\t\tif (\"distance\" in m && m.distance !== void 0) result.distance = m.distance;\n\t\treturn result;\n\t});\n}\n//#endregion\n//#region src/wasm.ts\ninitEngines({\n\tAhoCorasick,\n\tFuzzySearch,\n\tRegexSet\n});\n//#endregion\nexport { TextSearch };\n\n//# sourceMappingURL=wasm.mjs.map","/**\n * Late-bound TextSearch constructor.\n *\n * Native entry injects @stll/text-search,\n * WASM entry injects @stll/text-search-wasm.\n * Both expose the same API.\n */\n\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\ntype TextSearchCtor = new (...args: any[]) => any;\n\nlet _TextSearch: TextSearchCtor | undefined;\n\nexport const initTextSearch = (ctor: TextSearchCtor): void => {\n _TextSearch = ctor;\n};\n\nexport const getTextSearch = (): TextSearchCtor => {\n if (!_TextSearch) {\n throw new Error(\n \"TextSearch not initialized. Import from \" +\n \"@stll/anonymize or @stll/anonymize-wasm, \" +\n \"not from internal modules.\",\n );\n }\n return _TextSearch;\n};\n","/**\n * Source of a detected entity span.\n * Ordered by detection layer in the pipeline.\n */\nexport const DETECTION_SOURCES = {\n TRIGGER: \"trigger\",\n REGEX: \"regex\",\n DENY_LIST: \"deny-list\",\n LEGAL_FORM: \"legal-form\",\n GAZETTEER: \"gazetteer\",\n NER: \"ner\",\n COREFERENCE: \"coreference\",\n} as const;\n\nexport type DetectionSource =\n (typeof DETECTION_SOURCES)[keyof typeof DETECTION_SOURCES];\n\n/**\n * Priority levels for detection sources.\n * Higher = more structurally reliable. Used during\n * overlap resolution so deterministic detectors beat\n * probabilistic ones regardless of raw score.\n */\nexport const DETECTOR_PRIORITY: Record<DetectionSource, number> = {\n gazetteer: 5,\n trigger: 4,\n \"legal-form\": 3,\n regex: 3,\n \"deny-list\": 2,\n coreference: 2,\n ner: 1,\n};\n\n/**\n * A detected PII entity span in the source text.\n * Every detection layer produces these.\n */\nexport type Entity = {\n start: number;\n end: number;\n label: string;\n text: string;\n score: number;\n source: DetectionSource;\n};\n\n/**\n * Entity after human review. Extends the base Entity\n * with a review decision.\n */\nexport type ReviewDecision = \"confirmed\" | \"rejected\" | \"relabeled\";\n\nexport type ReviewedEntity = Entity & {\n decision?: ReviewDecision;\n originalLabel?: string;\n};\n\n/**\n * A single entry in the workspace-scoped gazetteer\n * (deny list). Persisted in IndexedDB.\n */\nexport type GazetteerEntry = {\n id: string;\n canonical: string;\n label: string;\n variants: string[];\n workspaceId: string;\n createdAt: number;\n source: \"manual\" | \"confirmed-from-model\";\n};\n\n/** Extraction strategy — closed discriminated union. */\nexport type TriggerStrategy =\n | { type: \"to-next-comma\" }\n | { type: \"to-end-of-line\" }\n | { type: \"n-words\"; count: number }\n | { type: \"company-id-value\" }\n | { type: \"address\"; maxChars?: number };\n\n/** Validation rules — closed discriminated union. */\nexport type TriggerValidation =\n | { type: \"starts-uppercase\" }\n | { type: \"min-length\"; min: number }\n | { type: \"max-length\"; max: number }\n | { type: \"no-digits\" }\n | { type: \"has-digits\" }\n | {\n type: \"matches-pattern\";\n pattern: string;\n flags?: string;\n };\n\n/** Auto-generated trigger variants — closed set. */\nexport type TriggerExtension =\n | \"add-colon\"\n | \"add-trailing-space\"\n | \"add-colon-space\"\n | \"normalize-spaces\";\n\n/** V2 trigger config entry (JSON shape). */\nexport type TriggerGroupConfig = {\n id?: string;\n triggers: string[];\n label: string;\n strategy: TriggerStrategy;\n extensions?: TriggerExtension[];\n validations?: TriggerValidation[];\n /** When true, include the trigger text in the\n * entity span (e.g., court names). */\n includeTrigger?: boolean;\n};\n\n/** Compiled validation with pre-built regex. */\nexport type CompiledValidation =\n | { type: \"starts-uppercase\"; re: RegExp }\n | { type: \"min-length\"; min: number }\n | { type: \"max-length\"; max: number }\n | { type: \"no-digits\"; re: RegExp }\n | { type: \"has-digits\"; re: RegExp }\n | { type: \"matches-pattern\"; re: RegExp };\n\n/**\n * Runtime rule — one per trigger string after\n * expansion. Fed to the Aho-Corasick automaton.\n */\nexport type TriggerRule = {\n trigger: string;\n label: string;\n strategy: TriggerStrategy;\n validations: CompiledValidation[];\n includeTrigger: boolean;\n};\n\n/**\n * Anonymisation operator types. Each operator defines\n * how a confirmed entity is replaced in the output.\n */\nexport const OPERATOR_TYPES = [\"replace\", \"redact\"] as const;\n\nexport type OperatorType = (typeof OPERATOR_TYPES)[number];\n\n/** Per-label operator selection. Key is the entity label. */\nexport type OperatorConfig = {\n /** Operator per label. Missing labels default to \"replace\". */\n operators: Record<string, OperatorType>;\n /** Custom replacement string for the redact operator. */\n redactString: string;\n};\n\n/** Whether an operator produces a reversible redaction entry. */\ntype OperatorReversibility = \"reversible\" | \"irreversible\";\n\nexport type AnonymisationOperator = {\n type: OperatorType;\n reversibility: OperatorReversibility;\n /**\n * Apply the operator to a single entity occurrence.\n * Returns the replacement string to embed in the document.\n */\n apply: (\n text: string,\n label: string,\n placeholder: string,\n redactString: string,\n ) => string;\n};\n\n/**\n * Redacted document output with stable entity mapping.\n */\nexport type RedactionResult = {\n redactedText: string;\n /**\n * Maps placeholder to original text. Only populated for\n * reversible operators (replace). Empty for redact.\n */\n redactionMap: Map<string, string>;\n /** Maps placeholder to the operator that produced it. */\n operatorMap: Map<string, OperatorType>;\n entityCount: number;\n};\n\n/**\n * Configuration for the detection pipeline.\n */\nexport type DenyListCategory =\n | \"Names\"\n | \"Places\"\n | \"Addresses\"\n | \"Courts\"\n | \"Financial\"\n | \"Government\"\n | \"Healthcare\"\n | \"Education\"\n | \"Political\"\n | \"Organizations\"\n | \"International\";\n\nexport type PipelineConfig = {\n threshold: number;\n enableTriggerPhrases: boolean;\n enableRegex: boolean;\n /**\n * Enables legal-form organization detection.\n * Required for typed callers; legacy untyped\n * callers that omit this field are treated as\n * enabled at runtime for backward compatibility.\n */\n enableLegalForms: boolean;\n /**\n * Enables first-name/surname/title corpus matching.\n * When deny-list mode is enabled, this also controls\n * whether name-corpus entries are injected into the\n * deny-list search automaton.\n */\n enableNameCorpus: boolean;\n enableDenyList: boolean;\n denyListCountries?: string[];\n denyListRegions?: string[];\n denyListExcludeCategories?: string[];\n enableGazetteer: boolean;\n enableNer: boolean;\n enableConfidenceBoost: boolean;\n enableCoreference: boolean;\n enableZoneClassification?: boolean;\n enableHotwordRules?: boolean;\n /**\n * Requested output labels. An empty array means\n * \"do not filter by label\" for deterministic\n * detectors; NER falls back to DEFAULT_ENTITY_LABELS.\n */\n labels: string[];\n workspaceId: string;\n};\n\n/**\n * Canonical entity labels used across the pipeline.\n * NER models may use different native labels; the bench\n * NER wrapper maps model output to these canonical names.\n *\n * These labels are ephemeral: entities are regenerated on\n * every pipeline run and never persisted to the database.\n * Renaming a label here requires no migration.\n */\nexport const DEFAULT_ENTITY_LABELS = [\n \"person\",\n \"organization\",\n \"phone number\",\n \"address\",\n \"email address\",\n \"date\",\n \"date of birth\",\n \"bank account number\",\n \"iban\",\n \"tax identification number\",\n \"identity card number\",\n \"registration number\",\n \"credit card number\",\n \"passport number\",\n \"monetary amount\",\n \"land parcel\",\n] as const;\n\nexport const isLegalFormsEnabled = (\n config: Pick<PipelineConfig, \"enableLegalForms\">,\n): boolean => config.enableLegalForms !== false;\n","import type { UnifiedSearchInstance } from \"./build-unified-search\";\nimport type { Entity } from \"./types\";\n\n/**\n * Build a stable cache key for an entity that survives\n * shallow copies (spread). Uses position + label so the\n * key is identical for the original object and any\n * `{ ...entity }` copy produced by mergeAndDedup.\n */\nexport const corefKey = (e: Entity): string => `${e.start}:${e.end}:${e.label}`;\n\n/**\n * Compiled RegExp pattern used for coreference\n * definition extraction.\n */\nexport type DefinitionPattern = {\n pattern: RegExp;\n};\n\n/**\n * Cached data for the name corpus detector.\n * Populated by initNameCorpus; consumed by\n * detectNameCorpus and deny-list AC integration.\n */\nexport type NameCorpusData = {\n firstNames: ReadonlySet<string>;\n surnames: ReadonlySet<string>;\n titleTokens: ReadonlySet<string>;\n excludedWords: ReadonlySet<string>;\n /** Raw arrays exposed for deny-list AC integration. */\n firstNamesList: readonly string[];\n surnamesList: readonly string[];\n titlesList: readonly string[];\n excludedList: readonly string[];\n};\n\n/**\n * All cached state for a single pipeline run (or\n * sequence of runs sharing the same config). Replacing\n * module-level singletons with this object enables\n * concurrent pipelines with different configs and\n * simplifies testing.\n *\n * Each field starts null and is populated lazily on\n * first use by the corresponding loader function.\n */\nexport type PipelineContext = {\n // ── Unified search cache ──────────────────────\n search: UnifiedSearchInstance | null;\n searchKey: string;\n searchPromise: Promise<UnifiedSearchInstance> | null;\n\n // ── Name corpus ───────────────────────────────\n nameCorpus: NameCorpusData | null;\n nameCorpusPromise: Promise<void> | null;\n\n // ── Deny-list data sets ───────────────────────\n stopwords: ReadonlySet<string> | null;\n stopwordsPromise: Promise<ReadonlySet<string>> | null;\n allowList: ReadonlySet<string> | null;\n allowListPromise: Promise<ReadonlySet<string>> | null;\n personStopwords: ReadonlySet<string> | null;\n personStopwordsPromise: Promise<ReadonlySet<string>> | null;\n /** First-name exclusions for stopword filtering. */\n firstNameExclusions: ReadonlySet<string> | null;\n firstNameExclusionCorpusLen: number;\n\n // ── Generic roles (false-positive filter) ─────\n genericRoles: ReadonlySet<string> | null;\n genericRolesPromise: Promise<ReadonlySet<string>> | null;\n\n // ── Coreference ───────────────────────────────\n corefPatterns: DefinitionPattern[] | null;\n corefPatternsPromise: Promise<DefinitionPattern[]> | null;\n corefLoadAttempted: boolean;\n roleStopSet: ReadonlySet<string> | null;\n roleStopSetPromise: Promise<ReadonlySet<string>> | null;\n\n // ── Zone classifier ───────────────────────────\n zoneHeadingPatterns: RegExp[] | null;\n zoneSigningPatterns: RegExp[] | null;\n zoneInitPromise: Promise<void> | null;\n\n // ── Coreference source map ────────────────────\n /**\n * Maps coreference entities to their source entity\n * text. Populated by findCoreferenceSpans, consumed\n * by buildPlaceholderMap for consistent placeholder\n * numbering across aliases and source entities.\n *\n * Keyed by `start:end:label` composite string so\n * lookups survive shallow copies (e.g. from\n * mergeAndDedup's spread operator).\n */\n corefSourceMap: Map<string, string>;\n};\n\n/** Create a fresh, empty pipeline context. */\nexport const createPipelineContext = (): PipelineContext => ({\n search: null,\n searchKey: \"\",\n searchPromise: null,\n\n nameCorpus: null,\n nameCorpusPromise: null,\n\n stopwords: null,\n stopwordsPromise: null,\n allowList: null,\n allowListPromise: null,\n personStopwords: null,\n personStopwordsPromise: null,\n firstNameExclusions: null,\n firstNameExclusionCorpusLen: 0,\n\n genericRoles: null,\n genericRolesPromise: null,\n\n corefPatterns: null,\n corefPatternsPromise: null,\n corefLoadAttempted: false,\n roleStopSet: null,\n roleStopSetPromise: null,\n\n zoneHeadingPatterns: null,\n zoneSigningPatterns: null,\n zoneInitPromise: null,\n\n corefSourceMap: new Map(),\n});\n\n/**\n * Module-level default context. Used when callers\n * don't provide an explicit context, preserving full\n * backward compatibility with the existing API.\n */\nexport const defaultContext: PipelineContext = createPipelineContext();\n","/**\n * Language manifest loader and config auto-discovery.\n *\n * Reads `manifest.json` from @stll/anonymize-data to\n * determine which languages have which config types,\n * then loads them via a static registry of import()\n * calls (string literals for bundler compatibility).\n */\n\n// ── Types ────────────────────────────────────────────\n\ntype ManifestLanguage = {\n triggers?: boolean;\n coreference?: boolean;\n};\n\ntype Manifest = {\n languages: Record<string, ManifestLanguage>;\n};\n\ntype ConfigType = \"triggers\" | \"coreference\";\n\n// ── Manifest loader (cached) ─────────────────────────\n\nlet _manifest: Manifest | null = null;\nlet _manifestPromise: Promise<Manifest> | null = null;\n\nconst loadManifest = (): Promise<Manifest> => {\n if (_manifest) {\n return Promise.resolve(_manifest);\n }\n if (_manifestPromise) {\n return _manifestPromise;\n }\n _manifestPromise = (async () => {\n try {\n const mod = await import(\"@stll/anonymize-data/config/manifest.json\");\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON manifest\n const parsed = (mod.default ?? mod) as Manifest;\n if (\n !parsed ||\n typeof parsed.languages !== \"object\" ||\n parsed.languages === null ||\n Array.isArray(parsed.languages)\n ) {\n console.warn(\n \"[anonymize] lang-loader: manifest has \" +\n \"unexpected structure, falling back \" +\n \"to hardcoded list\",\n );\n _manifest = { languages: {} };\n return _manifest;\n }\n _manifest = parsed;\n return _manifest;\n } catch (err) {\n // Manifest not available (old data package version\n // or unexpected import error). Cache the empty\n // result so we don't retry the failed import.\n console.warn(\n \"[anonymize] lang-loader: manifest not \" +\n \"available, falling back to hardcoded \" +\n \"language list:\",\n err,\n );\n _manifest = { languages: {} };\n return _manifest;\n }\n })();\n return _manifestPromise;\n};\n\n// ── Static import registries ─────────────────────────\n// String literals so bundlers can statically analyze\n// the import paths. Each registry maps language code\n// to a lazy loader thunk.\n\nconst TRIGGER_LOADERS: Record<string, () => Promise<unknown>> = {\n cs: () => import(\"@stll/anonymize-data/config/triggers.cs.json\"),\n de: () => import(\"@stll/anonymize-data/config/triggers.de.json\"),\n en: () => import(\"@stll/anonymize-data/config/triggers.en.json\"),\n es: () => import(\"@stll/anonymize-data/config/triggers.es.json\"),\n fr: () => import(\"@stll/anonymize-data/config/triggers.fr.json\"),\n hu: () => import(\"@stll/anonymize-data/config/triggers.hu.json\"),\n it: () => import(\"@stll/anonymize-data/config/triggers.it.json\"),\n pl: () => import(\"@stll/anonymize-data/config/triggers.pl.json\"),\n ro: () => import(\"@stll/anonymize-data/config/triggers.ro.json\"),\n sk: () => import(\"@stll/anonymize-data/config/triggers.sk.json\"),\n sv: () => import(\"@stll/anonymize-data/config/triggers.sv.json\"),\n};\n\nconst COREFERENCE_LOADERS: Record<string, () => Promise<unknown>> = {\n cs: () => import(\"@stll/anonymize-data/config/coreference.cs.json\"),\n de: () => import(\"@stll/anonymize-data/config/coreference.de.json\"),\n en: () => import(\"@stll/anonymize-data/config/coreference.en.json\"),\n sk: () => import(\"@stll/anonymize-data/config/coreference.sk.json\"),\n};\n\nconst LOADER_REGISTRIES: Record<\n ConfigType,\n Record<string, () => Promise<unknown>>\n> = {\n triggers: TRIGGER_LOADERS,\n coreference: COREFERENCE_LOADERS,\n};\n\n// ── Fallback language lists ──────────────────────────\n// Used when the manifest is unavailable (old data\n// package). Matches the hardcoded lists that existed\n// before the manifest was introduced.\n\nconst FALLBACK_LANGUAGES: Record<ConfigType, readonly string[]> = {\n triggers: [\"cs\", \"de\", \"en\", \"es\", \"fr\", \"hu\", \"it\", \"pl\", \"ro\", \"sk\", \"sv\"],\n coreference: [\"cs\", \"de\", \"en\", \"sk\"],\n};\n\n// ── Public API ───────────────────────────────────────\n\n/**\n * Load all config files of a given type for all\n * languages enabled in the manifest.\n *\n * Falls back to the hardcoded language list when the\n * manifest is unavailable (backward compatibility).\n */\nexport const loadLanguageConfigs = async <T extends NonNullable<unknown>>(\n configType: ConfigType,\n mapFn: (mod: unknown) => T,\n): Promise<T[]> => {\n const manifest = await loadManifest();\n const registry = LOADER_REGISTRIES[configType];\n\n // Determine which language codes to load\n const hasManifestLanguages = Object.keys(manifest.languages).length > 0;\n\n const codes = hasManifestLanguages\n ? Object.entries(manifest.languages)\n .filter(([code, lang]) => {\n if (!lang || typeof lang !== \"object\") {\n console.warn(\n `[anonymize] lang-loader: manifest ` +\n `entry for \"${code}\" is not an ` +\n `object, skipping`,\n );\n return false;\n }\n return lang[configType] === true;\n })\n .map(([code]) => code)\n : [...FALLBACK_LANGUAGES[configType]];\n\n // Use indexed assignment so results preserve\n // manifest declaration order regardless of import\n // resolution timing.\n const results: (T | undefined)[] = new Array(codes.length);\n\n const loads = codes.map(async (code, i) => {\n const loader = registry[code];\n if (!loader) {\n console.warn(\n `[anonymize] lang-loader: language \"${code}\" ` +\n `is enabled in the manifest for ` +\n `\"${configType}\" but has no loader in ` +\n `the static registry`,\n );\n return;\n }\n let mod: unknown;\n try {\n mod = await loader();\n } catch (err) {\n console.warn(\n `[anonymize] lang-loader: failed to ` +\n `import \"${configType}\" config for ` +\n `\"${code}\":`,\n err,\n );\n return;\n }\n let result: T;\n try {\n result = mapFn(mod);\n } catch (err) {\n console.warn(\n `[anonymize] lang-loader: mapFn failed ` +\n `for \"${code}\" (${configType}):`,\n err,\n );\n return;\n }\n results[i] = result;\n });\n\n await Promise.all(loads);\n return results.filter((r): r is T => r !== undefined);\n};\n\n/**\n * Reset cached manifest. Exposed for testing only.\n */\nexport const _resetManifestCache = (): void => {\n _manifest = null;\n _manifestPromise = null;\n};\n","import { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\nimport type { DefinitionPattern, PipelineContext } from \"../context\";\nimport { corefKey, defaultContext } from \"../context\";\nimport { loadLanguageConfigs } from \"../util/lang-loader\";\n\ntype CoreferenceConfigRow = {\n pattern: string;\n flags: string;\n label: string;\n};\n\n/**\n * Load coreference definition patterns from per-language\n * JSON configs in @stll/anonymize-data. Uses the\n * language manifest for auto-discovery.\n */\nconst loadDefinitionPatterns = async (): Promise<DefinitionPattern[]> => {\n const patterns: DefinitionPattern[] = [];\n\n const allRows = await loadLanguageConfigs<readonly CoreferenceConfigRow[]>(\n \"coreference\",\n (mod) => {\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON config\n const m = mod as {\n default?: readonly CoreferenceConfigRow[];\n };\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON config\n return (m.default ?? mod) as readonly CoreferenceConfigRow[];\n },\n );\n\n for (const rows of allRows) {\n if (!Array.isArray(rows)) {\n console.warn(\n \"[anonymize] coreference: unexpected \" + \"config shape, skipping\",\n );\n continue;\n }\n for (const row of rows) {\n try {\n patterns.push({\n pattern: new RegExp(row.pattern, row.flags),\n });\n } catch (err) {\n console.warn(\n `[anonymize] coreference: invalid ` + `regex \"${row.pattern}\":`,\n err,\n );\n }\n }\n }\n\n return patterns;\n};\n\n/**\n * Load generic role terms that should NOT be treated\n * as PII coreferences. \"Prodávající\" (Seller),\n * \"Kupující\" (Buyer), etc. are legal roles, not\n * identifying information.\n */\nconst getRoleStopSet = async (\n ctx: PipelineContext,\n): Promise<ReadonlySet<string>> => {\n if (ctx.roleStopSet) return ctx.roleStopSet;\n if (ctx.roleStopSetPromise) return ctx.roleStopSetPromise;\n const promise = (async () => {\n let result: ReadonlySet<string>;\n try {\n const mod =\n await import(\"@stll/anonymize-data/config/generic-roles.json\");\n const data = (mod.default ?? mod) as {\n roles: string[];\n };\n result = new Set(data.roles.map((r: string) => r.toLowerCase()));\n } catch {\n result = new Set();\n }\n ctx.roleStopSet = result;\n return result;\n })();\n ctx.roleStopSetPromise = promise;\n return promise;\n};\n\nconst getDefinitionPatterns = async (\n ctx: PipelineContext,\n): Promise<DefinitionPattern[]> => {\n if (ctx.corefPatterns) {\n return ctx.corefPatterns;\n }\n if (ctx.corefPatternsPromise) {\n return ctx.corefPatternsPromise;\n }\n ctx.corefPatternsPromise = loadDefinitionPatterns();\n const patterns = await ctx.corefPatternsPromise;\n if (patterns.length === 0) {\n // All loads failed; cache empty array permanently\n // to avoid retrying dynamic imports and flooding\n // logs on every call in high-volume pipelines.\n ctx.corefPatterns = patterns;\n if (!ctx.corefLoadAttempted) {\n ctx.corefLoadAttempted = true;\n console.warn(\n \"[anonymize] coreference: no definition \" +\n \"patterns loaded; coreference detection \" +\n \"will be inactive\",\n );\n }\n return patterns;\n }\n ctx.corefPatterns = patterns;\n return patterns;\n};\n\nconst SEARCH_WINDOW = 200;\n\n/**\n * Check whether an alias has textual similarity to\n * the source entity. Prevents roles and structural\n * terms from being treated as name aliases.\n *\n * Three checks (any passes → similar):\n * 1. Word overlap: a word in the alias appears in the\n * entity (case-insensitive, min 2 chars)\n * 2. Initials: alias letters match first letters of\n * entity words (\"TB\" ↔ \"Tomas Bata\")\n * 3. Substring: alias is a substring of the entity\n * or vice versa (min 3 chars)\n */\nconst hasEntitySimilarity = (alias: string, entityText: string): boolean => {\n const aliasLower = alias.toLowerCase();\n const entityLower = entityText.toLowerCase();\n\n // Substring check (min 3 chars to avoid noise)\n if (aliasLower.length >= 3 && entityLower.includes(aliasLower)) {\n return true;\n }\n if (entityLower.length >= 3 && aliasLower.includes(entityLower)) {\n return true;\n }\n\n // Word overlap: split both into words, check for\n // any shared word of 2+ characters\n const aliasWords = aliasLower\n .split(/[\\s.,;:'\"()/-]+/)\n .filter((w) => w.length >= 2);\n const entityWords = entityLower\n .split(/[\\s.,;:'\"()/-]+/)\n .filter((w) => w.length >= 2);\n const entityWordSet = new Set(entityWords);\n for (const word of aliasWords) {\n if (entityWordSet.has(word)) {\n return true;\n }\n }\n\n // Initials: alias is all uppercase and each letter\n // matches the first letter of a consecutive run of\n // entity words. \"TP\" ↔ \"Ing. Tomáš Procházka\"\n // (skips \"Ing.\" and matches T+P). Check all\n // starting positions to handle title prefixes.\n if (\n /^[\\p{Lu}]+$/u.test(alias) &&\n alias.length >= 2 &&\n alias.length <= entityWords.length\n ) {\n for (let start = 0; start <= entityWords.length - alias.length; start++) {\n const initials = entityWords\n .slice(start, start + alias.length)\n .map((w) => w.charAt(0))\n .join(\"\");\n if (initials === aliasLower) {\n return true;\n }\n }\n }\n\n return false;\n};\n\ntype DefinedTerm = {\n alias: string;\n label: string;\n /** Position of the definition in the source text */\n definitionStart: number;\n /** Original entity text the alias refers to */\n sourceText: string;\n};\n\n/**\n * Scan for defined-term patterns near known entities.\n *\n * Legal documents universally follow:\n * \"Dr. Heinrich Muller (hereinafter 'the Seller')...\"\n *\n * After NER detects the entity, this function scans for\n * definitional patterns within +/-200 chars and extracts\n * the alias. Returns alias + label pairs that can be added\n * to the gazetteer for a full-text re-scan.\n */\n/**\n * Labels that can be the source of a coreference alias.\n * Only parties (person, organization) have defined-term\n * aliases in legal text. Dates, addresses, IDs do not.\n */\nconst COREF_SOURCE_LABELS = new Set([\"person\", \"organization\"]);\n\nexport const extractDefinedTerms = async (\n fullText: string,\n entities: Entity[],\n ctx: PipelineContext = defaultContext,\n): Promise<DefinedTerm[]> => {\n const [definitionPatterns, roleStops] = await Promise.all([\n getDefinitionPatterns(ctx),\n getRoleStopSet(ctx),\n ]);\n const terms: DefinedTerm[] = [];\n const seen = new Set<string>();\n\n // Sort entities by position for nearest-preceding lookup\n const sorted = [...entities].sort((a, b) => a.start - b.start);\n\n // Strategy: find all \"dále jen\" definitions in the\n // text, then for each one, find the nearest PRECEDING\n // person/organization entity. This is more accurate\n // than \"any entity within 200 chars\" because:\n // - The alias always refers to a party defined BEFORE\n // the parenthetical, not after\n // - Multiple entities (name, IČO, address) may appear\n // between the party name and the \"dále jen\"; only\n // the party name is the referent\n\n for (const { pattern } of definitionPatterns) {\n pattern.lastIndex = 0;\n\n for (\n let match = pattern.exec(fullText);\n match !== null;\n match = pattern.exec(fullText)\n ) {\n const alias = match[1]?.trim();\n if (!alias || alias.length < 2) {\n continue;\n }\n\n // Skip generic legal roles — \"Prodávající\",\n // \"Kupující\", \"Seller\", etc. are NOT PII.\n // Only track aliases that are themselves\n // identifying (initials, name fragments, etc.)\n if (roleStops.has(alias.toLowerCase())) {\n continue;\n }\n\n const defPos = match.index;\n\n // Find the nearest preceding person/org entity\n // within SEARCH_WINDOW chars before this definition\n let bestEntity: Entity | null = null;\n for (let i = sorted.length - 1; i >= 0; i--) {\n const e = sorted[i];\n if (e === undefined) {\n continue;\n }\n // Must be before the definition\n if (e.end > defPos) {\n continue;\n }\n // Must be within the search window\n if (defPos - e.end > SEARCH_WINDOW) {\n break;\n }\n // Must be a party label\n if (!COREF_SOURCE_LABELS.has(e.label)) {\n continue;\n }\n bestEntity = e;\n break;\n }\n\n if (bestEntity === null) {\n continue;\n }\n\n // Clause-boundary gate: reject if a semicolon or\n // sentence-ending period sits between the source\n // entity and the definition. Periods inside\n // abbreviations like \"r.č.\" should not block an\n // otherwise valid definition.\n const gapText = fullText.slice(bestEntity.end, defPos);\n if (/(?:;|\\.(?=\\s*(?:[\"'„‚(]*\\p{Lu}|$)))/u.test(gapText)) {\n continue;\n }\n\n // Similarity gate: the alias must have textual\n // overlap with the source entity. Prevents roles\n // (\"Executive\", \"Seller\") and structural terms\n // (\"Agreement\", \"Effective Date\") from being\n // treated as name aliases.\n if (!hasEntitySimilarity(alias, bestEntity.text)) {\n continue;\n }\n\n const key = `${alias.toLowerCase()}::${bestEntity.label}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n\n terms.push({\n alias,\n label: bestEntity.label,\n definitionStart: defPos,\n sourceText: bestEntity.text,\n });\n }\n }\n\n return terms;\n};\n\n/**\n * Check if a character is a Unicode word character\n * (letter, digit, or combining mark). Used for word\n * boundary checks in coreference matching.\n */\nconst isWordChar = (ch: string | undefined): boolean => {\n if (ch === undefined) {\n return false;\n }\n return /[\\p{L}\\p{M}\\p{N}]/u.test(ch);\n};\n\n/**\n * Find all occurrences of defined-term aliases in the\n * full text. Returns Entity spans for each match.\n *\n * Respects word boundaries: \"Kupující\" must not match\n * inside \"Kupujícímu\". A match is valid only if the\n * character before the start and after the end are NOT\n * word characters (letter/digit).\n *\n * Populates `ctx.corefSourceMap` with entries linking\n * each coref entity to its source entity text, for\n * consistent placeholder numbering.\n */\nexport const findCoreferenceSpans = (\n fullText: string,\n terms: DefinedTerm[],\n ctx: PipelineContext = defaultContext,\n): Entity[] => {\n const results: Entity[] = [];\n\n for (const term of terms) {\n let searchFrom = 0;\n while (searchFrom < fullText.length) {\n const idx = fullText.indexOf(term.alias, searchFrom);\n if (idx === -1) {\n break;\n }\n\n const matchEnd = idx + term.alias.length;\n\n // Word boundary check: the character before the\n // match and after the match must not be a word\n // character. This prevents \"Kupující\" matching\n // inside \"Kupujícímu\".\n const charBefore = idx > 0 ? fullText[idx - 1] : undefined;\n const charAfter = fullText[matchEnd];\n\n if (isWordChar(charBefore) || isWordChar(charAfter)) {\n // Not at a word boundary — skip\n searchFrom = idx + 1;\n continue;\n }\n\n const entity: Entity = {\n start: idx,\n end: matchEnd,\n label: term.label,\n text: term.alias,\n score: 0.95,\n source: DETECTION_SOURCES.COREFERENCE,\n };\n ctx.corefSourceMap.set(corefKey(entity), term.sourceText);\n results.push(entity);\n\n searchFrom = matchEnd;\n }\n }\n\n return results;\n};\n","import type { Match, PatternEntry } from \"@stll/text-search\";\n\nimport { DETECTION_SOURCES } from \"../types\";\nimport type { Entity, GazetteerEntry } from \"../types\";\nimport type { GazetteerData } from \"../build-unified-search\";\n\nconst MAX_EDIT_DISTANCE = 2;\nconst MIN_FUZZY_LENGTH = 4;\n// \" s.r.o.\" = 7 bytes (space + 6 chars). Must be\n// at least 7 to capture the most common Czech LLC\n// suffix without truncating the trailing dot.\nconst MAX_PREFIX_OVERSHOOT = 7;\n\n/**\n * Collect all searchable strings (canonical + variants)\n * from gazetteer entries, mapped to their labels and\n * entry IDs.\n */\nexport const buildSearchTerms = (\n entries: GazetteerEntry[],\n): Map<string, { label: string; entryId: string }> => {\n const terms = new Map<string, { label: string; entryId: string }>();\n for (const entry of entries) {\n const meta = {\n label: entry.label,\n entryId: entry.id,\n };\n terms.set(entry.canonical, meta);\n for (const variant of entry.variants) {\n terms.set(variant, meta);\n }\n }\n return terms;\n};\n\n/**\n * Build TextSearch-compatible patterns from gazetteer\n * entries. Returns:\n * - Exact literal patterns for all terms\n * - Fuzzy patterns (distance: 2) for terms >= 4 chars\n * - Parallel metadata arrays for post-processing\n *\n * Patterns are ordered: all exact first, then all\n * fuzzy. The isFuzzy array marks which are which.\n */\nexport const buildGazetteerPatterns = (\n entries: GazetteerEntry[],\n): {\n patterns: PatternEntry[];\n data: GazetteerData;\n} => {\n const terms = buildSearchTerms(entries);\n\n const patterns: PatternEntry[] = [];\n const labels: string[] = [];\n const isFuzzy: boolean[] = [];\n\n // Pass 1: exact literals (all terms).\n // Use per-pattern wholeWords: false because\n // user-supplied entries may contain dots or\n // special chars (e.g. \"a.s.\", \"AT&T\") that\n // break word-boundary matching. Deny-list and\n // street-type patterns use per-pattern\n // wholeWords: true instead.\n for (const [term, meta] of terms) {\n patterns.push({\n pattern: term,\n literal: true as const,\n wholeWords: false,\n });\n labels.push(meta.label);\n\n isFuzzy.push(false);\n }\n\n // Pass 2: fuzzy patterns (terms >= 4 chars).\n // These are separate patterns with distance: 2,\n // routed to @stll/fuzzy-search by TextSearch.\n for (const [term, meta] of terms) {\n if (term.length < MIN_FUZZY_LENGTH) {\n continue;\n }\n patterns.push({\n pattern: term,\n distance: MAX_EDIT_DISTANCE,\n });\n labels.push(meta.label);\n\n isFuzzy.push(true);\n }\n\n return {\n patterns,\n data: { labels, isFuzzy },\n };\n};\n\n/**\n * Process gazetteer matches from the unified literal\n * search. Receives all matches; filters to the\n * gazetteer slice via sliceStart/sliceEnd.\n *\n * Exact matches get score 0.9; fuzzy matches get\n * 0.85. Fuzzy matches that overlap an exact match\n * are dropped.\n *\n * For exact matches, attempts prefix extension for\n * legal suffixes (\"a.s.\", \"GmbH\", \"s.r.o.\" after\n * the matched term).\n */\nexport const processGazetteerMatches = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText: string,\n data: GazetteerData,\n): Entity[] => {\n const results: Entity[] = [];\n // Track exact-match spans for overlap filtering\n const exactSpans: Array<{\n start: number;\n end: number;\n }> = [];\n\n // Pass 1: exact matches (isFuzzy === false)\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n const localIdx = idx - sliceStart;\n if (data.isFuzzy[localIdx]) {\n continue;\n }\n\n const label = data.labels[localIdx];\n if (!label) {\n continue;\n }\n\n // Try prefix extension for legal entity suffixes\n const extended = tryPrefixExtension(fullText, match.start, match.end);\n const end = extended?.end ?? match.end;\n const text = extended?.text ?? fullText.slice(match.start, match.end);\n\n exactSpans.push({\n start: match.start,\n end,\n });\n results.push({\n start: match.start,\n end,\n label,\n text,\n score: 0.9,\n source: DETECTION_SOURCES.GAZETTEER,\n });\n }\n\n // Pass 2: fuzzy matches (isFuzzy === true),\n // skipping those that overlap exact spans\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n const localIdx = idx - sliceStart;\n if (!data.isFuzzy[localIdx]) {\n continue;\n }\n\n // Skip distance-0 fuzzy hits (already caught\n // as exact matches above)\n if (match.distance === 0) {\n continue;\n }\n\n const label = data.labels[localIdx];\n if (!label) {\n continue;\n }\n\n // Skip if overlapping any exact span\n const overlapsExact = exactSpans.some(\n (e) => match.start < e.end && match.end > e.start,\n );\n if (overlapsExact) {\n continue;\n }\n\n const matchText = fullText.slice(match.start, match.end);\n results.push({\n start: match.start,\n end: match.end,\n label,\n text: matchText,\n score: 0.85,\n source: DETECTION_SOURCES.GAZETTEER,\n });\n }\n\n return results;\n};\n\n/**\n * Try to extend an exact match to capture one\n * trailing token (max 6 chars) that may be a legal\n * entity suffix (e.g., \"a.s.\", \"GmbH\", \"s.r.o.\").\n *\n * Does not validate the token against a legal-forms\n * list; false extensions are filtered by mergeAndDedup\n * when a legal-form detector produces a competing\n * entity with the correct span.\n */\nconst tryPrefixExtension = (\n fullText: string,\n start: number,\n end: number,\n): { end: number; text: string } | null => {\n const maxEnd = Math.min(end + MAX_PREFIX_OVERSHOOT, fullText.length);\n if (maxEnd <= end + 1) {\n return null;\n }\n\n const after = fullText.slice(end, maxEnd);\n if (!after.startsWith(\" \")) {\n return null;\n }\n const nextSpace = after.indexOf(\" \", 1);\n const suffixEnd = nextSpace !== -1 ? nextSpace : after.length;\n if (suffixEnd <= 1) {\n return null;\n }\n\n const newEnd = end + suffixEnd;\n return {\n end: newEnd,\n text: fullText.slice(start, newEnd),\n };\n};\n\n// Deprecated exports (kept for API compat).\n","/**\n * Shared text utilities for detectors.\n *\n * Extracted from names.ts and deny-list.ts to avoid\n * duplicating regex constants and helper functions.\n */\n\n/** Matches a string that starts with an uppercase letter. */\nexport const UPPER_START_RE = /^\\p{Lu}/u;\n\n/** Matches a string consisting entirely of uppercase letters. */\nexport const ALL_UPPER_RE = /^\\p{Lu}+$/u;\n\nconst SENTENCE_END_RE = /[.!?]/;\n\n/**\n * Detect whether a position is at the start of a sentence.\n * Looks backward past whitespace for sentence-ending\n * punctuation (.!?). Position 0 and positions preceded\n * only by whitespace are considered sentence starts.\n */\nexport const isSentenceStart = (text: string, pos: number): boolean => {\n if (pos === 0) {\n return true;\n }\n let i = pos - 1;\n while (i >= 0 && /\\s/.test(text[i] ?? \"\")) {\n i--;\n }\n if (i < 0) {\n return true;\n }\n return SENTENCE_END_RE.test(text[i] ?? \"\");\n};\n","import { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\nimport type { PipelineContext, NameCorpusData } from \"../context\";\nimport { defaultContext } from \"../context\";\nimport { ALL_UPPER_RE, UPPER_START_RE, isSentenceStart } from \"../util/text\";\n\n// ── Name corpus ──────────────────────────────────────\n// Per-language first names and surnames loaded from\n// Wikidata-sourced dictionaries in @stll/anonymize-data,\n// plus legacy config/names-*.json for backwards compat.\n// Merged at init time across all configured languages.\n\n// ── Accessors (read from context) ────────────────────\n\nconst getCorpus = (ctx: PipelineContext): NameCorpusData | null =>\n ctx.nameCorpus;\n\n// Exported accessors for deny-list.ts AC integration.\nexport const getNameCorpusFirstNames = (\n ctx: PipelineContext = defaultContext,\n): readonly string[] => ctx.nameCorpus?.firstNamesList ?? [];\nexport const getNameCorpusSurnames = (\n ctx: PipelineContext = defaultContext,\n): readonly string[] => ctx.nameCorpus?.surnamesList ?? [];\nexport const getNameCorpusTitles = (\n ctx: PipelineContext = defaultContext,\n): readonly string[] => ctx.nameCorpus?.titlesList ?? [];\nexport const getNameCorpusExcluded = (\n ctx: PipelineContext = defaultContext,\n): readonly string[] => ctx.nameCorpus?.excludedList ?? [];\n\n/**\n * Languages with per-language first/surname\n * dictionaries in @stll/anonymize-data.\n */\nconst NAME_LANGUAGES = [\n \"cs\",\n \"sk\",\n \"de\",\n \"pl\",\n \"hu\",\n \"ro\",\n \"fr\",\n \"es\",\n \"it\",\n \"en\",\n \"sv\",\n] as const;\n\ntype JsonArrayModule = {\n default: readonly string[];\n};\n\n/**\n * Try importing a JSON module; return empty array\n * if not found.\n */\nconst tryImportArray = async (path: string): Promise<readonly string[]> => {\n try {\n const mod = (await import(path)) as JsonArrayModule;\n return mod.default;\n } catch {\n return [];\n }\n};\n\n/**\n * Load name corpus data from per-language dictionary\n * files and legacy config files. Merges all sources.\n *\n * Safe to call multiple times; only loads once per\n * context. Must be called before detectNameCorpus or\n * the getNameCorpus*() accessors are used.\n */\nexport const initNameCorpus = (\n ctx: PipelineContext = defaultContext,\n): Promise<void> => {\n if (ctx.nameCorpusPromise) return ctx.nameCorpusPromise;\n const promise = (async () => {\n try {\n // Load legacy config files (backwards compat)\n const [legacyFirstMod, legacySurnameMod, titleMod, exclusionMod] =\n await Promise.all([\n import(\"@stll/anonymize-data/config/names-first.json\") as Promise<{\n default: { names: string[] };\n }>,\n import(\"@stll/anonymize-data/config/names-surnames.json\") as Promise<{\n default: { names: string[] };\n }>,\n import(\"@stll/anonymize-data/config/names-title-tokens.json\") as Promise<{\n default: { tokens: string[] };\n }>,\n import(\"@stll/anonymize-data/config/names-exclusions.json\") as Promise<{\n default: { words: string[] };\n }>,\n ]);\n\n // Load per-language dictionaries in parallel\n const firstImports = NAME_LANGUAGES.map((lang) =>\n tryImportArray(\n `@stll/anonymize-data/dictionaries/names/first/${lang}.json`,\n ),\n );\n const surnameImports = NAME_LANGUAGES.map((lang) =>\n tryImportArray(\n `@stll/anonymize-data/dictionaries/names/surnames/${lang}.json`,\n ),\n );\n\n const [firstResults, surnameResults] = await Promise.all([\n Promise.all(firstImports),\n Promise.all(surnameImports),\n ]);\n\n // Merge: legacy config + all per-language files\n const firstNames: string[] = [...legacyFirstMod.default.names];\n for (const names of firstResults) {\n for (const name of names) {\n firstNames.push(name);\n }\n }\n\n const surnames: string[] = [...legacySurnameMod.default.names];\n for (const names of surnameResults) {\n for (const name of names) {\n surnames.push(name);\n }\n }\n\n // Deduplicate (preserve first occurrence)\n const dedup = (arr: string[]): string[] => {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const item of arr) {\n if (seen.has(item)) continue;\n seen.add(item);\n result.push(item);\n }\n return result;\n };\n\n const dedupFirst = dedup(firstNames);\n const dedupSurnames = dedup(surnames);\n const titles = titleMod.default.tokens;\n const exclusions = exclusionMod.default.words;\n\n ctx.nameCorpus = {\n firstNames: Object.freeze(new Set(dedupFirst)),\n surnames: Object.freeze(new Set(dedupSurnames)),\n titleTokens: Object.freeze(new Set(titles)),\n excludedWords: Object.freeze(new Set(exclusions)),\n firstNamesList: Object.freeze(dedupFirst),\n surnamesList: Object.freeze(dedupSurnames),\n titlesList: Object.freeze(titles),\n excludedList: Object.freeze(exclusions),\n };\n } catch (err) {\n // Reset so the next call retries the load rather\n // than returning this (already-resolved) failed\n // promise. Current awaiters still get a resolved\n // (not rejected) Promise; ctx.nameCorpus stays null.\n ctx.nameCorpusPromise = null;\n console.warn(\n \"[anonymize] Failed to load name corpus JSON\" +\n \" — name detection disabled:\",\n err,\n );\n }\n })();\n ctx.nameCorpusPromise = promise;\n return promise;\n};\n\n// ── Czech/Slovak suffix stripping ────────────────────\n// Case suffixes commonly appended to names in declined\n// Czech/Slovak text. Ordered longest-first.\n\nconst INFLECTION_SUFFIXES = [\n \"ovi\", // dative\n \"em\", // instrumental\n \"om\", // instrumental (some stems)\n \"ou\", // instrumental feminine\n \"é\", // dative/locative feminine\n \"a\", // genitive\n \"u\", // accusative/locative\n] as const;\n\n/**\n * Strip common Czech/Slovak case suffixes from a token.\n * Returns candidate base forms if stripping produces a\n * plausible name (capitalised, length >= 3).\n *\n * For the \"-ou\" instrumental feminine suffix, also yields\n * base + \"a\" (e.g., \"Editou\" → \"Edit\" and \"Edita\")\n * because Czech feminine names decline -a → -ou.\n */\nconst stripInflection = (token: string): string[] => {\n const candidates: string[] = [];\n for (const suffix of INFLECTION_SUFFIXES) {\n if (token.length > suffix.length + 2 && token.endsWith(suffix)) {\n const base = token.slice(0, -suffix.length);\n if (/^\\p{Lu}/u.test(base)) {\n candidates.push(base);\n // Czech feminine: -a → -ou (instrumental),\n // -a → -é (dative/locative), -a → -u (accusative)\n if (suffix === \"ou\" || suffix === \"é\" || suffix === \"u\") {\n candidates.push(`${base}a`);\n }\n // Czech feminine: -a → -ovi is not valid, but\n // -e → -em is (e.g., \"Kalhousem\" → \"Kalhous\")\n // which is already handled by stripping \"em\".\n }\n }\n }\n return candidates;\n};\n\n// ── Token types ──────────────────────────────────────\n\nconst TOKEN_TYPE = {\n NAME: \"name\",\n SURNAME: \"surname\",\n TITLE: \"title\",\n ABBREVIATION: \"abbreviation\",\n CAPITALIZED: \"capitalized\",\n OTHER: \"other\",\n} as const;\n\ntype TokenType = (typeof TOKEN_TYPE)[keyof typeof TOKEN_TYPE];\n\ntype ClassifiedToken = {\n text: string;\n type: TokenType;\n start: number;\n end: number;\n};\n\nconst PERSON_CHAIN_BREAK_RE = /[!?;:]/u;\n\nconst isInitialContinuationGap = (text: string, gap: string): boolean =>\n (/^\\p{Lu}$/u.test(text) && /^\\.[^\\S\\n]{1,2}$/u.test(gap)) ||\n /^[^\\S\\n]{1,2}(?:\\p{Lu}\\.[^\\S\\n]{1,2})+$/u.test(gap);\n\n// ── Helpers ──────────────────────────────────────────\n\n/**\n * Check if a token is in the first-name set, either\n * directly or after stripping Czech/Slovak inflection.\n */\nconst isFirstNameToken = (token: string, corpus: NameCorpusData): boolean => {\n if (corpus.firstNames.has(token)) {\n return true;\n }\n return stripInflection(token).some((b) => corpus.firstNames.has(b));\n};\n\n/**\n * Check if a token is in the surname set, either\n * directly or after stripping Czech/Slovak inflection.\n */\nconst isSurnameToken = (token: string, corpus: NameCorpusData): boolean => {\n if (corpus.surnames.has(token)) {\n return true;\n }\n return stripInflection(token).some((b) => corpus.surnames.has(b));\n};\n\n/**\n * Check if a token looks like a single-letter\n * abbreviation: \"J.\", \"M.\", etc.\n */\nconst isAbbreviation = (token: string): boolean =>\n token.length === 2 && /^\\p{Lu}$/u.test(token[0] ?? \"\") && token[1] === \".\";\n\n// ── Word segmentation ────────────────────────────────\n\nconst segmenter = new Intl.Segmenter(undefined, {\n granularity: \"word\",\n});\n\ntype WordSegment = {\n text: string;\n start: number;\n end: number;\n};\n\n/**\n * Split text into word segments using Intl.Segmenter.\n * Only returns segments flagged as words.\n */\nconst segmentWords = (fullText: string): WordSegment[] => {\n const words: WordSegment[] = [];\n for (const seg of segmenter.segment(fullText)) {\n if (seg.isWordLike) {\n words.push({\n text: seg.segment,\n start: seg.index,\n end: seg.index + seg.segment.length,\n });\n }\n }\n return words;\n};\n\n// ── Helpers for chain scoring ────────────────────────\n\n/** NAME or SURNAME — both represent corpus-matched tokens */\nconst isCorpusMatch = (type: TokenType): boolean =>\n type === TOKEN_TYPE.NAME || type === TOKEN_TYPE.SURNAME;\n\n// ── Token classification ─────────────────────────────\n\nconst classifyToken = (\n word: WordSegment,\n corpus: NameCorpusData,\n): ClassifiedToken => {\n const { text, start, end } = word;\n const lower = text.toLowerCase();\n\n // Strip trailing period for title check (e.g., \"Ing.\")\n const stripped = text.endsWith(\".\") ? text.slice(0, -1).toLowerCase() : lower;\n\n if (corpus.titleTokens.has(stripped)) {\n return { text, type: TOKEN_TYPE.TITLE, start, end };\n }\n\n if (isAbbreviation(text)) {\n return {\n text,\n type: TOKEN_TYPE.ABBREVIATION,\n start,\n end,\n };\n }\n\n // Skip excluded words\n if (corpus.excludedWords.has(lower)) {\n return { text, type: TOKEN_TYPE.OTHER, start, end };\n }\n\n // Minimum length 3\n if (text.length < 3) {\n return { text, type: TOKEN_TYPE.OTHER, start, end };\n }\n\n // Skip all-uppercase tokens > 3 chars (likely acronyms)\n if (text.length > 3 && ALL_UPPER_RE.test(text)) {\n return { text, type: TOKEN_TYPE.OTHER, start, end };\n }\n\n // Must start with uppercase\n if (!UPPER_START_RE.test(text)) {\n return { text, type: TOKEN_TYPE.OTHER, start, end };\n }\n\n if (isFirstNameToken(text, corpus)) {\n return { text, type: TOKEN_TYPE.NAME, start, end };\n }\n\n if (isSurnameToken(text, corpus)) {\n return { text, type: TOKEN_TYPE.SURNAME, start, end };\n }\n\n // Capitalised word (not in corpus but starts uppercase)\n return {\n text,\n type: TOKEN_TYPE.CAPITALIZED,\n start,\n end,\n };\n};\n\n// ── Chain assembly ───────────────────────────────────\n\n/**\n * Detect person names by looking up tokens against the\n * name corpus, then chaining adjacent name-like tokens.\n *\n * Requires initNameCorpus() to have been called first.\n * If not initialized, returns an empty array.\n *\n * Scoring:\n * TITLE + NAME/SURNAME → 0.95\n * NAME + NAME/SURNAME → 0.9\n * SURNAME + NAME/SURNAME → 0.9\n * NAME + CAPITALIZED → 0.7\n * ABBREVIATION + NAME → 0.7\n * Standalone NAME → 0.5 (low confidence)\n * Standalone SURNAME → skip (too ambiguous)\n */\nexport const detectNameCorpus = (\n fullText: string,\n ctx: PipelineContext = defaultContext,\n): Entity[] => {\n const corpus = getCorpus(ctx);\n if (!corpus) {\n return [];\n }\n\n const words = segmentWords(fullText);\n const tokens = words.map((w) => classifyToken(w, corpus));\n const entities: Entity[] = [];\n const consumed = new Set<number>();\n\n for (let i = 0; i < tokens.length; i++) {\n if (consumed.has(i)) {\n continue;\n }\n\n const token = tokens[i];\n if (!token) {\n continue;\n }\n\n // Only start chains from TITLE, NAME, SURNAME,\n // or ABBREVIATION\n if (\n token.type !== TOKEN_TYPE.TITLE &&\n token.type !== TOKEN_TYPE.NAME &&\n token.type !== TOKEN_TYPE.SURNAME &&\n token.type !== TOKEN_TYPE.ABBREVIATION\n ) {\n continue;\n }\n\n // Build a chain of adjacent relevant tokens.\n // Max 5 tokens to prevent merging independent names\n // (e.g., \"Jan Novák Pavel Moc\" should be two entities).\n const MAX_CHAIN = 5;\n const chain: ClassifiedToken[] = [token];\n let j = i + 1;\n\n while (j < tokens.length && chain.length < MAX_CHAIN) {\n const next = tokens[j];\n if (!next) {\n break;\n }\n\n // Break chain if there's a newline between tokens\n const prev = chain.at(-1);\n if (prev) {\n const gap = fullText.slice(prev.end, next.start);\n const breaksOnPeriod =\n gap.includes(\".\") && !isInitialContinuationGap(prev.text, gap);\n if (\n gap.includes(\"\\n\") ||\n PERSON_CHAIN_BREAK_RE.test(gap) ||\n breaksOnPeriod\n ) {\n break;\n }\n }\n\n // Only chain NAME, SURNAME, TITLE, ABBREVIATION,\n // CAPITALIZED\n if (\n next.type === TOKEN_TYPE.NAME ||\n next.type === TOKEN_TYPE.SURNAME ||\n next.type === TOKEN_TYPE.TITLE ||\n next.type === TOKEN_TYPE.ABBREVIATION ||\n next.type === TOKEN_TYPE.CAPITALIZED\n ) {\n chain.push(next);\n j++;\n } else {\n break;\n }\n }\n\n // Score the chain\n const hasTitle = chain.some((t) => t.type === TOKEN_TYPE.TITLE);\n const hasCorpusName = chain.some((t) => isCorpusMatch(t.type));\n const hasFirstName = chain.some((t) => t.type === TOKEN_TYPE.NAME);\n const hasAbbreviation = chain.some(\n (t) => t.type === TOKEN_TYPE.ABBREVIATION,\n );\n const corpusCount = chain.filter((t) => isCorpusMatch(t.type)).length;\n const capitalizedCount = chain.filter(\n (t) => t.type === TOKEN_TYPE.CAPITALIZED,\n ).length;\n\n // Determine score based on chain composition\n let score = 0;\n\n if (hasTitle && hasCorpusName) {\n // TITLE + NAME/SURNAME → high confidence\n score = 0.95;\n } else if (corpusCount >= 2) {\n // NAME + NAME, NAME + SURNAME, etc. → high confidence\n score = 0.9;\n } else if (hasCorpusName && capitalizedCount > 0) {\n // NAME/SURNAME + CAPITALIZED → medium confidence\n score = 0.7;\n } else if (hasAbbreviation && hasCorpusName) {\n // ABBREVIATION + NAME/SURNAME → medium confidence\n score = 0.7;\n } else if (hasFirstName && chain.length === 1) {\n // Standalone first NAME → low confidence\n // Skip if at sentence start (likely not a name)\n if (isSentenceStart(fullText, token.start)) {\n continue;\n }\n score = 0.5;\n } else if (\n !hasFirstName &&\n chain.length === 1 &&\n chain[0]?.type === TOKEN_TYPE.SURNAME\n ) {\n // Standalone SURNAME → skip (too ambiguous alone)\n continue;\n } else if (hasTitle && chain.length === 1) {\n // Standalone TITLE → skip (not a name by itself)\n continue;\n } else {\n // No corpus match in chain → skip\n if (!hasCorpusName) {\n continue;\n }\n score = 0.5;\n }\n\n // Build entity span from first to last token in chain\n const first = chain.at(0);\n const last = chain.at(-1);\n if (!first || !last) {\n continue;\n }\n\n const start = first.start;\n const end = last.end;\n const text = fullText.slice(start, end);\n\n // Mark all chain tokens as consumed\n for (let k = i; k < i + chain.length; k++) {\n consumed.add(k);\n }\n\n entities.push({\n start,\n end,\n label: \"person\",\n text,\n score,\n source: DETECTION_SOURCES.REGEX,\n });\n }\n\n return entities;\n};\n","/**\n * Academic and professional title prefixes.\n * Plain text; the detector auto-escapes for regex.\n * Sorted longest-first at build time.\n */\nexport const TITLE_PREFIXES = [\n // Czech/Slovak pre-nominal\n \"Ing.\",\n \"Mgr.\",\n \"MgA.\",\n \"Bc.\",\n \"BcA.\",\n \"JUDr.\",\n \"MUDr.\",\n \"MVDr.\",\n \"MDDr.\",\n \"PhDr.\",\n \"RNDr.\",\n \"PaedDr.\",\n \"ThDr.\",\n \"ThLic.\",\n \"ICDr.\",\n \"RSDr.\",\n \"PharmDr.\",\n \"artD.\",\n \"akad.\",\n \"doc.\",\n \"prof.\",\n\n // Professor variants (AT/DE)\n \"ao. Univ.-Prof.\",\n \"o. Univ.-Prof.\",\n \"Univ.-Prof.\",\n \"Hon.-Prof.\",\n \"em. Prof.\",\n\n // German doctoral (compound before simple)\n \"Dr. med. dent.\",\n \"Dr. med. vet.\",\n \"Dr. med.\",\n \"Dr. rer. nat.\",\n \"Dr. rer. soc.\",\n \"Dr. rer. pol.\",\n \"Dr. sc. tech.\",\n \"Dr. sc. nat.\",\n \"Dr. sc. hum.\",\n \"Dr. iur.\",\n \"Dr. jur.\",\n \"Dr. theol.\",\n \"Dr. oec.\",\n \"Dr. techn.\",\n \"Dr. h. c.\",\n \"Dr. phil.\",\n \"Dr.-Ing.\",\n \"Dr. Ing.\",\n \"Dr.\",\n\n // German Diplom variants (longest first)\n \"Dipl.-Wirt.-Ing.\",\n \"Dipl.-Betriebsw.\",\n \"Dipl.-Inform.\",\n \"Dipl.-Volksw.\",\n \"Dipl.-Psych.\",\n \"Dipl.-Phys.\",\n \"Dipl.-Chem.\",\n \"Dipl.-Biol.\",\n \"Dipl.-Math.\",\n \"Dipl.-Päd.\",\n \"Dipl.-Soz.\",\n \"Dipl.-Kfm.\",\n \"Dipl.-Jur.\",\n \"Dipl. Ing.\",\n \"Dipl.-Ing.\",\n\n // Austrian Mag/Bakk variants\n \"Mag. rer. soc. oec.\",\n \"Mag. rer. nat.\",\n \"Mag. phil.\",\n \"Mag. iur.\",\n \"Mag. arch.\",\n \"Mag. pharm.\",\n \"Mag. (FH)\",\n \"Mag.\",\n \"Bakk. rer. nat.\",\n \"Bakk. techn.\",\n \"Bakk. phil.\",\n \"Bakk.\",\n\n // Swiss Lic variants\n \"Lic. phil.\",\n \"Lic. iur.\",\n \"Lic. oec.\",\n \"Lic. theol.\",\n \"Lic.\",\n\n // Other German/Austrian\n \"Priv.-Doz.\",\n \"PD\",\n \"RA\",\n] as const;\n\n/**\n * Courtesy/honorific titles that precede a person's\n * name. Sorted alphabetically. The detector escapes\n * dots and adds \\b for entries in HONORIFIC_BOUNDARY.\n */\nexport const HONORIFICS = [\n \"Avv.\",\n \"Dame\",\n \"Doamna\",\n \"Domnul\",\n \"Don\",\n \"Doña\",\n \"Dott.\",\n \"Judge\",\n \"Justice\",\n \"Lady\",\n \"Lord\",\n \"M.\",\n \"Madame\",\n \"Mademoiselle\",\n \"Maître\",\n \"Me\",\n \"Messrs\",\n \"Miss\",\n \"Mlle\",\n \"Mme\",\n \"Monsieur\",\n \"Mr\",\n \"Mrs\",\n \"Ms\",\n \"President\",\n \"Señor\",\n \"Señora\",\n \"Sig.\",\n \"Sig.ra\",\n \"Signor\",\n \"Signora\",\n \"Signorina\",\n \"Sir\",\n \"Sr.\",\n \"Sra.\",\n] as const;\n\n/**\n * Honorifics that need \\b word-boundary anchors\n * (short or common words that could match mid-word).\n */\nexport const HONORIFIC_BOUNDARY = new Set([\n \"Don\",\n \"Doña\",\n \"M.\",\n \"Me\",\n \"Señor\",\n \"Señora\",\n]);\n\n/**\n * Post-nominal degrees (comma or space separated after name).\n * Plain text; the detector auto-escapes for regex.\n */\nexport const POST_NOMINALS = [\n \"Ph.D.\",\n \"Ph.D\",\n \"CSc.\",\n \"DrSc.\",\n \"ArtD.\",\n \"D.Phil.\",\n \"DPhil.\",\n \"MPhil.\",\n \"MBA\",\n \"MPA\",\n \"LL.M.\",\n \"LL.B.\",\n \"M.Sc.\",\n \"B.Sc.\",\n \"MSc.\",\n \"BSc.\",\n \"M.Eng.\",\n \"B.Eng.\",\n \"M.A.\",\n \"B.A.\",\n \"JCD\",\n \"JD\",\n \"DiS.\",\n \"ACCA\",\n \"FCCA\",\n \"CIPM\",\n \"CIPT\",\n \"CIPP/E\",\n \"CIPP\",\n] as const;\n","/**\n * Centralized Unicode character equivalence groups.\n *\n * Loads char-groups.json from @stll/anonymize-data and\n * provides helpers to build regex character classes that\n * match all typographic variants of a character type\n * (dashes, spaces, quotes, etc.).\n *\n * The JSON is statically imported so the bundler inlines\n * it, avoiding a runtime require() that breaks browsers.\n */\n\nimport charGroupsJson from \"@stll/anonymize-data/config/char-groups.json\";\n\ntype CharEntry = {\n char: string;\n name: string;\n code: string;\n};\n\ntype CharGroup = {\n description: string;\n chars: readonly CharEntry[];\n};\n\ntype CharGroupsConfig = {\n _comment: string;\n groups: Record<string, CharGroup>;\n};\n\n/** Chars that need escaping inside a regex char class. */\nconst REGEX_CLASS_SPECIAL = /[\\\\\\]^-]/;\n\nconst escapeForCharClass = (ch: string): string =>\n REGEX_CLASS_SPECIAL.test(ch) ? `\\\\${ch}` : ch;\n\n// SAFETY: JSON shape matches CharGroupsConfig by contract\n// with @stll/anonymize-data.\nconst config = charGroupsJson as CharGroupsConfig;\n\n/**\n * Get the raw characters for a named group.\n * Throws if the group does not exist.\n */\nexport const charSet = (group: string): readonly string[] => {\n const g = config.groups[group];\n if (!g) {\n throw new Error(`Unknown char group: \"${group}\"`);\n }\n return g.chars.map((entry) => entry.char);\n};\n\n/**\n * Build a regex character class string for a named\n * group. E.g., charClass(\"dash\") returns a string\n * like \"[-\\u2013\\u2014\\u2010\\u2011\\u2212\\u2043]\".\n *\n * The hyphen-minus is placed first so it is treated\n * as a literal, not a range indicator.\n */\nexport const charClass = (group: string): string => {\n const chars = charSet(group);\n // Place hyphen-minus first to avoid range issues.\n const sorted = [...chars].sort((a, b) => {\n if (a === \"-\") return -1;\n if (b === \"-\") return 1;\n return a.localeCompare(b);\n });\n const escaped = sorted.map(escapeForCharClass);\n return `[${escaped.join(\"\")}]`;\n};\n\n/**\n * Return the inner content of a character class (without\n * the surrounding brackets). Useful for embedding a group\n * inside a larger character class, e.g.:\n * `[\\\\s&,.${charClassInner(\"dash\")}]`\n */\nexport const charClassInner = (group: string): string => {\n const chars = charSet(group);\n const sorted = [...chars].sort((a, b) => {\n if (a === \"-\") return -1;\n if (b === \"-\") return 1;\n return a.localeCompare(b);\n });\n return sorted.map(escapeForCharClass).join(\"\");\n};\n\n/**\n * Build a regex alternation pattern for a named group.\n * Unlike charClass, this uses (?:a|b|c) syntax which\n * is useful when chars need individual escaping or\n * when embedding in complex patterns.\n */\nexport const charPattern = (group: string): string => {\n const chars = charSet(group);\n // SAFETY: length === 1 guarantees index 0 exists.\n if (chars.length === 1) return chars[0]!;\n const escaped = chars.map((ch) => ch.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n return `(?:${escaped.join(\"|\")})`;\n};\n\n// ── Pre-built constants for common groups ──────\n\n/** Regex char class matching all dash variants. */\nexport const DASH = charClass(\"dash\");\n\n/**\n * Inner content of the dash char class (no brackets).\n * For embedding inside a larger character class:\n * `[\\\\s&,.${DASH_INNER}]`\n */\nexport const DASH_INNER = charClassInner(\"dash\");\n\n/** Regex char class matching all space variants. */\nexport const SPACE = charClass(\"space\");\n\n/** Regex char class matching all double-quote variants. */\nexport const QUOTE_DOUBLE = charClass(\"quote-double\");\n\n/** Regex char class matching all single-quote variants. */\nexport const QUOTE_SINGLE = charClass(\"quote-single\");\n\n/** Regex char class matching all slash variants. */\nexport const SLASH = charClass(\"slash\");\n\n/** Regex char class matching all dot variants. */\nexport const DOT = charClass(\"dot\");\n\n/** Regex char class matching all colon variants. */\nexport const COLON = charClass(\"colon\");\n","import type { Match } from \"@stll/text-search\";\nimport type { Validator } from \"@stll/stdnum\";\nimport {\n at,\n be,\n bg,\n cz,\n cy,\n de,\n dk,\n ee,\n es,\n fi,\n fr,\n gb,\n gr,\n hr,\n hu,\n ie,\n it,\n lt,\n lu,\n lv,\n mt,\n nl,\n pl,\n pt,\n ro,\n se,\n si,\n sk,\n} from \"@stll/stdnum\";\nimport { toRegex } from \"@stll/stdnum/patterns\";\n\nimport {\n HONORIFIC_BOUNDARY,\n HONORIFICS,\n POST_NOMINALS,\n TITLE_PREFIXES,\n} from \"../config/titles\";\nimport { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\nimport { DASH, DASH_INNER } from \"../util/char-groups\";\n\nconst MIN_PHONE_LENGTH = 7;\nconst MIN_MONTH_NAME_LENGTH = 3;\n\n// ── Shared helpers ──────────────────────────────────\n\nconst escapeTitle = (title: string): string =>\n title\n // eslint-disable-next-line no-useless-escape\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\s+/g, \"\\\\s*\");\n\n/** Escape for use inside a regex alternation. */\nconst escapeRegex = (s: string): string =>\n // eslint-disable-next-line no-useless-escape\n s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/** Escape for use inside a regex character class. */\nconst escapeCharClass = (s: string): string => s.replace(/[\\]\\\\^-]/g, \"\\\\$&\");\n\nconst TITLE_PREFIX = TITLE_PREFIXES.toSorted((a, b) => b.length - a.length)\n .map(escapeTitle)\n .join(\"|\");\n\nconst POST_NOMINAL = POST_NOMINALS.toSorted((a, b) => b.length - a.length)\n .map(escapeTitle)\n .join(\"|\");\n\n// biome-ignore lint/security/noSecrets: diacritics char class\nconst UPPER_CZ = \"A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ\";\n// biome-ignore lint/security/noSecrets: diacritics char class\nconst LOWER_CZ = \"a-záčďéěíňóřšťúůýžäöüß\";\nconst NAME_WORD = `[${UPPER_CZ}][${LOWER_CZ}]+`;\n\nconst PARTICLE =\n `(?:van der|van den|de la|della|` +\n `von|van|dos|ibn|ben|bin|del|zum|zur|ten|ter|` +\n `da|de|di|al|el|le|la|zu|af|av)`;\n\n// Non-newline whitespace\nconst SP = \"[^\\\\S\\\\n\\\\t]\";\n\n/** Honorific alternation built from titles.ts config. */\nconst HONORIFIC_ALT = [...HONORIFICS]\n .toSorted((a, b) => b.length - a.length)\n .map((h) => {\n const escaped = escapeRegex(h);\n return HONORIFIC_BOUNDARY.has(h) ? `\\\\b${escaped}` : escaped;\n })\n .join(\"|\");\n\n// ── Pattern definitions ─────────────────────────────\n\nexport type RegexMeta = {\n label: string;\n score: number;\n /** Post-match stdnum validator for confirmation. */\n validator?: Validator;\n};\n\ntype RegexDef = {\n pattern: string;\n label: string;\n score: number;\n validator?: Validator;\n};\n\n// ── stdnum validator entries ────────────────────────\n// Each entry pairs a @stll/stdnum validator with a\n// label and confidence score. The pattern derived via\n// toRegex(validator).source is used as the regex; the\n// validator itself is stored in META for post-match\n// confirmation (see processRegexMatches).\n\ntype StdnumEntry = {\n validator: Validator;\n label: string;\n score: number;\n pattern: string;\n};\n\nconst toEntry = (\n validator: Validator,\n label: string,\n score: number,\n): StdnumEntry | null => {\n const pattern = toRegex(validator).source;\n if (!pattern) return null;\n return {\n validator,\n label,\n score,\n pattern,\n };\n};\n\n/**\n * Stdnum validators for national/company IDs.\n *\n * Selection criteria: only patterns specific enough\n * to avoid excessive false positives (country-prefixed\n * VAT numbers, structured personal IDs). Generic\n * digit-only patterns (e.g. \\d{8}) are excluded unless\n * the validator's checksum is strong enough to filter.\n */\nconst STDNUM_ENTRIES: readonly StdnumEntry[] = [\n // ── Original PR #28 patterns (were 15-21) ────────\n toEntry(hu.vat, \"tax identification number\", 0.95),\n toEntry(it.codiceFiscale, \"national identification number\", 0.95),\n toEntry(es.dni, \"national identification number\", 0.9),\n toEntry(es.nie, \"national identification number\", 0.95),\n toEntry(se.personnummer, \"national identification number\", 0.9),\n toEntry(ro.cnp, \"national identification number\", 0.95),\n toEntry(fr.nir, \"social security number\", 0.9),\n\n // ── CZ validators ────────────────────────────────\n toEntry(cz.dic, \"tax identification number\", 0.95),\n // cz.ico and cz.rc omitted: cz.ico is \\d{8} (too\n // generic), cz.rc is \\d{6}/\\d{3,4} (handled by\n // pattern 7: czech birth number)\n\n // ── DE validators ────────────────────────────────\n toEntry(de.vat, \"tax identification number\", 0.95),\n toEntry(de.idnr, \"tax identification number\", 0.9),\n toEntry(de.stnr, \"tax identification number\", 0.9),\n toEntry(de.svnr, \"social security number\", 0.9),\n\n // ── PL validators ────────────────────────────────\n toEntry(pl.nip, \"tax identification number\", 0.95),\n toEntry(pl.pesel, \"national identification number\", 0.9),\n // pl.regon omitted: \\d{9,14} too generic\n\n // ── GB validators ────────────────────────────────\n toEntry(gb.vat, \"tax identification number\", 0.95),\n toEntry(gb.nino, \"social security number\", 0.95),\n // gb.utr omitted: \\d{10} too generic\n\n // ── AT validators ────────────────────────────────\n toEntry(at.uid, \"tax identification number\", 0.95),\n toEntry(at.tin, \"tax identification number\", 0.9),\n toEntry(at.businessid, \"registration number\", 0.95),\n\n // ── BE validators ────────────────────────────────\n toEntry(be.vat, \"tax identification number\", 0.95),\n toEntry(be.nn, \"national identification number\", 0.9),\n\n // ── NL validators ────────────────────────────────\n toEntry(nl.vat, \"tax identification number\", 0.95),\n // nl.bsn omitted: \\d{9} too generic\n\n // ── DK validators ────────────────────────────────\n toEntry(dk.vat, \"tax identification number\", 0.95),\n toEntry(dk.cpr, \"national identification number\", 0.9),\n\n // ── FI validators ────────────────────────────────\n toEntry(fi.vat, \"tax identification number\", 0.95),\n toEntry(fi.hetu, \"national identification number\", 0.95),\n toEntry(fi.ytunnus, \"registration number\", 0.9),\n\n // ── BG validators ────────────────────────────────\n toEntry(bg.vat, \"tax identification number\", 0.95),\n\n // ── SK validators ────────────────────────────────\n toEntry(sk.dic, \"tax identification number\", 0.95),\n // sk.ico: \\d{8} too generic; sk.rc overlaps with\n // czech birth number pattern\n\n // ── ES additional validators ─────────────────────\n toEntry(es.cif, \"registration number\", 0.95),\n toEntry(es.vat, \"tax identification number\", 0.95),\n toEntry(es.nss, \"social security number\", 0.9),\n\n // ── FR additional validators ─────────────────────\n toEntry(fr.tva, \"tax identification number\", 0.95),\n toEntry(fr.siren, \"registration number\", 0.9),\n toEntry(fr.siret, \"registration number\", 0.9),\n\n // ── IT additional validators ─────────────────────\n toEntry(it.iva, \"tax identification number\", 0.95),\n\n // ── IE validators ────────────────────────────────\n toEntry(ie.vat, \"tax identification number\", 0.95),\n toEntry(ie.pps, \"national identification number\", 0.9),\n\n // ── PT validators ────────────────────────────────\n toEntry(pt.vat, \"tax identification number\", 0.95),\n toEntry(pt.cc, \"national identification number\", 0.9),\n\n // ── RO additional validators ─────────────────────\n toEntry(ro.vat, \"tax identification number\", 0.95),\n\n // ── GR validators ────────────────────────────────\n toEntry(gr.vat, \"tax identification number\", 0.95),\n\n // ── HR validators ────────────────────────────────\n toEntry(hr.vat, \"tax identification number\", 0.95),\n\n // ── SI validators ────────────────────────────────\n toEntry(si.vat, \"tax identification number\", 0.95),\n\n // ── LT validators ────────────────────────────────\n toEntry(lt.vat, \"tax identification number\", 0.95),\n toEntry(lt.asmens, \"national identification number\", 0.9),\n\n // ── LV validators ────────────────────────────────\n toEntry(lv.vat, \"tax identification number\", 0.95),\n\n // ── EE validators ────────────────────────────────\n toEntry(ee.vat, \"tax identification number\", 0.95),\n toEntry(ee.ik, \"national identification number\", 0.9),\n\n // ── CY validators ────────────────────────────────\n toEntry(cy.vat, \"tax identification number\", 0.95),\n\n // ── MT validators ────────────────────────────────\n toEntry(mt.vat, \"tax identification number\", 0.95),\n\n // ── LU validators ────────────────────────────────\n toEntry(lu.vat, \"tax identification number\", 0.95),\n].filter((e): e is StdnumEntry => e !== null);\n\n// ── Named pattern definitions ────────────────────────\n\nconst TITLED_PERSON: RegexDef = {\n pattern:\n `(?:${TITLE_PREFIX})` +\n `(?:${SP}+(?:${TITLE_PREFIX}))*` +\n `${SP}+` +\n `(?:${NAME_WORD})` +\n `(?:${SP}{1,4}(?:${PARTICLE}${SP}+)?` +\n `${NAME_WORD}){1,3}` +\n `(?:,?${SP}+(?:${POST_NOMINAL})(?:,?${SP}+(?:${POST_NOMINAL}))*)?`,\n label: \"person\",\n score: 0.95,\n};\n\nconst HONORIFIC_PERSON: RegexDef = {\n pattern:\n `(?:${HONORIFIC_ALT})` +\n `\\\\.?${SP}+${NAME_WORD}` +\n `(?:(?:${SP}|-){1,2}(?:${PARTICLE}${SP}+)?` +\n `${NAME_WORD}){0,3}` +\n `(?:${SP}+(?:QC|KC|SC|LJ|AG))?`,\n label: \"person\",\n score: 0.95,\n};\n\nconst IBAN: RegexDef = {\n pattern:\n `\\\\b[A-Z]{2}\\\\d{2}\\\\s?[\\\\dA-Z]{4}\\\\s?[\\\\dA-Z]{4}` +\n `\\\\s?[\\\\dA-Z]{4}\\\\s?[\\\\dA-Z]{4}` +\n `\\\\s?[\\\\dA-Z]{0,14}\\\\b`,\n label: \"iban\",\n score: 1,\n};\n\nconst EMAIL: RegexDef = {\n pattern: `\\\\b[\\\\w.+\\\\-]+@[\\\\w\\\\-]+(?:\\\\.[\\\\w\\\\-]+)+\\\\b`,\n label: \"email address\",\n score: 1,\n};\n\n// [^\\S\\n] instead of \\s: separators must not\n// match newlines (prevents cross-line bleeding).\nconst INTL_PHONE: RegexDef = {\n pattern:\n `\\\\+\\\\d{1,3}(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\(?\\\\d{2,4}\\\\)?` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{2,4}` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{0,4}\\\\b`,\n label: \"phone number\",\n score: 1,\n};\n\n// Czech phone numbers: mobiles start with 6/7,\n// landlines with 2-5. Restrict to [2-7] but require\n// the full 9-digit pattern to avoid matching monetary\n// amounts. The negative lookahead prevents bank\n// account patterns (digits/digits).\nconst CZ_PHONE: RegexDef = {\n pattern:\n `\\\\b[2-7]\\\\d{2}(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}` +\n `(?!(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d*/\\\\d)` +\n `(?![^\\\\S\\\\n]*(?:Kč|,-|korun|EUR|USD|€|\\\\$))\\\\b`,\n label: \"phone number\",\n score: 0.85,\n};\n\n/**\n * Phone numbers prefixed with \"tel.:\" or \"telefon:\".\n * Captures the number after the prefix, including\n * optional international code (+420).\n */\nconst TEL_PREFIX_PHONE: RegexDef = {\n pattern:\n `(?:\\\\b[Tt]el(?:efon)?\\\\.?\\\\s*:?\\\\s*)` +\n `(?:\\\\+?\\\\d{1,3}[^\\\\S\\\\n]?)?` +\n `\\\\d{3}(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}\\\\b`,\n label: \"phone number\",\n score: 0.95,\n};\n\nconst CREDIT_CARD: RegexDef = {\n pattern:\n `\\\\b(?:4\\\\d{3}|5[1-5]\\\\d{2}|3[47]\\\\d{2})` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{4}(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{4}` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{2,4}\\\\b`,\n label: \"credit card number\",\n score: 1,\n};\n\nconst CZ_BIRTH_NUMBER: RegexDef = {\n pattern: `\\\\b\\\\d{6}/\\\\d{3,4}\\\\b`,\n label: \"czech birth number\",\n score: 1,\n validator: cz.rc,\n};\n\nconst DATE_NUMERIC: RegexDef = {\n pattern:\n `\\\\b(?:\\\\d{1,2}[./]\\\\d{1,2}[./]\\\\d{2,4}` +\n `|\\\\d{4}-\\\\d{2}-\\\\d{2}` +\n `|\\\\d{4}\\\\.\\\\d{2}\\\\.\\\\d{2})\\\\b`,\n label: \"date\",\n score: 1,\n};\n\nconst DATE_CZ_SPACED: RegexDef = {\n pattern: `\\\\b\\\\d{1,2}\\\\.[^\\\\S\\\\n]+\\\\d{1,2}\\\\.[^\\\\S\\\\n]+\\\\d{4}\\\\b`,\n label: \"date\",\n score: 1,\n};\n\nconst IP_ADDRESS: RegexDef = {\n pattern:\n `\\\\b(?:(?:25[0-5]|2[0-4]\\\\d|[01]?\\\\d\\\\d?)\\\\.){3}` +\n `(?:25[0-5]|2[0-4]\\\\d|[01]?\\\\d\\\\d?)\\\\b`,\n label: \"ip address\",\n score: 1,\n};\n\nconst CZ_BANK_ACCOUNT: RegexDef = {\n pattern: `\\\\b(?:\\\\d{1,6}-)?\\\\d{6,10}/\\\\d{4}(?!\\\\d)`,\n label: \"bank account number\",\n score: 0.95,\n};\n\n// Hungarian Budapest landline (+36 1 XXX XXXX).\n// 2+ digit area codes handled by INTL_PHONE.\nconst HU_LANDLINE: RegexDef = {\n pattern:\n `\\\\+36(?:[^\\\\S\\\\n]|[.\\\\-])?1(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{3}` +\n `(?:[^\\\\S\\\\n]|[.\\\\-])?\\\\d{4}\\\\b`,\n label: \"phone number\",\n score: 0.9,\n};\n\n// Czech license plates (SPZ/RZ).\n// New format: 3SJ 0753 — digit, two letters, space?,\n// four digits. Old format: 1A2 3456 — digit, letter,\n// digit, space?, four digits.\n\n// Czech/Slovak postal code: \"110 00\", \"120 00\".\n// The distinctive XXX XX format with mandatory\n// space is specific enough to avoid most false\n// positives.\nconst CZ_POSTAL: RegexDef = {\n pattern: `\\\\b\\\\d{3}[^\\\\S\\\\n]\\\\d{2}\\\\b`,\n label: \"address\",\n score: 0.7,\n};\n\n// URL: scheme + host + optional port + path + query +\n// fragment. Trailing prose punctuation excluded but\n// ? = & # kept for query strings.\n// Allow missing // after http:/https: — common OCR\n// artifact (\"http:example.cz\" instead of\n// \"http://example.cz\"). Lookahead ensures bare scheme\n// is not matched in isolation (e.g., \"http:\" at EOL).\nconst URL: RegexDef = {\n pattern:\n `(?:https?://|https?:(?=[^\\\\s])|www\\\\.)` +\n `[\\\\w\\\\-]+(?:\\\\.[\\\\w\\\\-]+)+` +\n `(?::\\\\d+)?` +\n `(?:[/?#][^\\\\s)\\\\]>]*[^\\\\s.,;:!?)\\\\]>])?`,\n label: \"url\",\n score: 1,\n};\n\n// Bare domain: no protocol/www prefix, ends with a\n// known TLD. Catches \"fondkinematografie.cz\" etc.\n// Uses [a-zA-Z0-9] (no underscores — invalid in\n// hostnames). Short ambiguous TLDs (de, at, no, se,\n// fi, dk, be, it, uk) require at least one subdomain\n// dot to reduce false positives in European legal\n// text; unambiguous TLDs allow bare second-level\n// domains (e.g., \"fondkinematografie.cz\").\nconst LONG_TLDS =\n \"com|org|net|eu|cz|sk|pl|hu|ro|fr|es\" + \"|co\\\\.uk|nl|ch|info|io|dev\";\nconst SHORT_TLDS = \"de|at|be|se|fi|dk|no|it|uk\";\n// RFC 1123: labels cannot start or end with hyphen.\nconst HOST_LABEL = `[a-zA-Z0-9](?:[a-zA-Z0-9\\\\-]*[a-zA-Z0-9])?`;\nconst BARE_HOST = `\\\\b[a-zA-Z0-9][a-zA-Z0-9\\\\-]+[a-zA-Z0-9]`;\nconst PATH_SUFFIX = `(?:[/?#][^\\\\s)\\\\]>]*[^\\\\s.,;:!?)\\\\]>])?`;\nconst BARE_DOMAIN: RegexDef = {\n pattern:\n // Unambiguous TLDs: bare SLDs ok (one dot)\n `${BARE_HOST}(?:\\\\.${HOST_LABEL})*` +\n `\\\\.(?:${LONG_TLDS})\\\\b${PATH_SUFFIX}` +\n `|` +\n // Short/ambiguous TLDs: require subdomain (two+ dots)\n `${BARE_HOST}(?:\\\\.${HOST_LABEL})+` +\n `\\\\.(?:${SHORT_TLDS})\\\\b${PATH_SUFFIX}`,\n label: \"url\",\n score: 0.9,\n};\n\n// Full RFC 5952 IPv6. :: compressed form replaces\n// 1+ zero groups. Right side: 1-7 hex groups.\nconst IPV6_ADDRESS: RegexDef = {\n pattern:\n `\\\\b(?:[0-9a-fA-F]{1,4}:){7}` +\n `[0-9a-fA-F]{1,4}\\\\b` +\n `|\\\\b(?:[0-9a-fA-F]{1,4}:){1,7}:\\\\b` +\n `|::(?:[0-9a-fA-F]{1,4}:){0,6}` +\n `[0-9a-fA-F]{1,4}`,\n label: \"ip address\",\n score: 1,\n};\n\n// MAC: colon-only OR hyphen-only (no mixed).\nconst MAC_ADDRESS: RegexDef = {\n pattern:\n `\\\\b(?:[0-9a-fA-F]{2}:){5}` +\n `[0-9a-fA-F]{2}\\\\b` +\n `|\\\\b(?:[0-9a-fA-F]{2}-){5}` +\n `[0-9a-fA-F]{2}\\\\b`,\n label: \"mac address\",\n score: 1,\n};\n\n// SWIFT/BIC moved to trigger-based detection\n// (triggers.global.json) for better composability.\n\n// 12-hour time: \"5:00 p.m.\", \"12:30 AM\", \"5:00p.m.\",\n// \"11:00 a.m. Eastern Time\". Captures HH:MM and the\n// am/pm marker; optional timezone suffix is not\n// included (it's not PII). Case spelled out explicitly\n// (no (?i)) because DFA compilation fails with\n// Unicode + case-insensitive flag on this pattern.\nconst TIME_12H: RegexDef = {\n pattern:\n `\\\\b(?:1[0-2]|0?[1-9]):[0-5]\\\\d` +\n `[^\\\\S\\\\n]?(?:[aApP]\\\\.?[mM]\\\\.?)` +\n `(?=[\\\\s,;!?)]|$)`,\n label: \"date\",\n score: 0.9,\n};\n\n// ── Collected definitions ────────────────────────────\n\n/**\n * All static PII regex definitions. Scanned in a\n * single pass by @stll/regex-set (Rust DFA).\n *\n * Hand-written patterns (0-17) followed by\n * stdnum-derived patterns (18+). Each stdnum entry\n * has a post-match validator for confirmation.\n *\n * Monetary amount patterns are built dynamically from\n * currencies.json via `getCurrencyPatterns()`.\n *\n * Date patterns using written month names are built\n * dynamically from date-months.json via\n * `getDatePatterns()`.\n */\nconst ALL_REGEX_DEFS: readonly RegexDef[] = [\n TITLED_PERSON,\n HONORIFIC_PERSON,\n IBAN,\n EMAIL,\n INTL_PHONE,\n CZ_PHONE,\n TEL_PREFIX_PHONE,\n CREDIT_CARD,\n CZ_BIRTH_NUMBER,\n DATE_NUMERIC,\n DATE_CZ_SPACED,\n IP_ADDRESS,\n CZ_BANK_ACCOUNT,\n HU_LANDLINE,\n CZ_POSTAL,\n URL,\n IPV6_ADDRESS,\n MAC_ADDRESS,\n BARE_DOMAIN,\n TIME_12H,\n ...STDNUM_ENTRIES,\n];\n\n/** Flat pattern array for text-search. */\nexport const REGEX_PATTERNS: readonly string[] = ALL_REGEX_DEFS.map(\n (d) => d.pattern,\n);\n\n/** Parallel metadata. Index = pattern index. */\nexport const REGEX_META: readonly RegexMeta[] = ALL_REGEX_DEFS.map(\n (d): RegexMeta => {\n const meta: RegexMeta = {\n label: d.label,\n score: d.score,\n };\n if (d.validator) {\n meta.validator = d.validator;\n }\n return meta;\n },\n);\n\n// ── Dynamic date patterns (22 languages) ────────────\n\n/**\n * JSON shape: language codes map to string arrays;\n * metadata keys (prefixed `_`) map to strings.\n * The `_` keys are skipped by `buildMonthAlternation`.\n */\ntype DateMonths = Record<string, string[] | string>;\n\n/**\n * Build month-name alternation from date-months.json.\n * Deduplicates across all 22 languages, filters names\n * shorter than 3 chars (too many false positives), and\n * sorts longest-first so the regex engine prefers the\n * longest match.\n */\nconst buildMonthAlternation = (months: DateMonths): string => {\n const seen = new Set<string>();\n for (const [key, value] of Object.entries(months)) {\n if (key.startsWith(\"_\")) continue;\n const names = Array.isArray(value) ? value : [value];\n for (const name of names) {\n // Strip trailing dots for the regex; date patterns\n // use `\\\\.?` after the alternation to match optional\n // abbreviation dots.\n const clean = name.replace(/\\.$/, \"\").toLowerCase();\n if (clean.length >= MIN_MONTH_NAME_LENGTH) {\n seen.add(clean);\n }\n }\n }\n return [...seen]\n .toSorted((a, b) => b.length - a.length)\n .map(escapeRegex)\n .join(\"|\");\n};\n\n/**\n * Build date patterns from a month-name alternation.\n * Returns 6 patterns covering the major written-date\n * formats across all supported languages.\n */\nconst buildDatePatternsFromMonths = (alt: string): string[] => {\n if (!alt) {\n // No month names survived filtering — return nothing\n // rather than emitting patterns with (?:) that match\n // arbitrary whitespace.\n return [];\n }\n // Optional time suffix: \"19:45:50\" or \"19:45\"\n const TIME = `(?:\\\\s+\\\\d{1,2}:\\\\d{2}(?::\\\\d{2})?)`;\n return [\n // a. DD[.] Month[.] YYYY [HH:MM[:SS]]\n `(?i)\\\\b\\\\d{1,2}\\\\.?\\\\s+(?:${alt})\\\\.?\\\\s+\\\\d{4}${TIME}?\\\\b`,\n // b. Month[.] DD[,] YYYY — \"March 7, 2023\" (US format)\n `(?i)\\\\b(?:${alt})\\\\.?\\\\s+\\\\d{1,2},?\\\\s+\\\\d{4}\\\\b`,\n // g. Month[.] DD — \"December 31\" (no year, US format)\n `(?i)\\\\b(?:${alt})\\\\.?\\\\s+\\\\d{1,2}(?=\\\\s|[.,;!?)]|$)`,\n // c. DDst/nd/rd/th Month[.] [YYYY] — \"1st January 2025\"\n `(?i)\\\\b\\\\d{1,2}(?:st|nd|rd|th)\\\\s+(?:${alt})\\\\.?` +\n `(?:\\\\s+\\\\d{4})?(?=\\\\s|[.,;!?)]|$)`,\n // d. Month[.] YYYY — \"October 1983\"\n `(?i)\\\\b(?:${alt})\\\\.?\\\\s+\\\\d{4}\\\\b`,\n // e. YYYY. Month[.] DD. — Hungarian \"2025. január 7.\"\n `(?i)\\\\b\\\\d{4}\\\\.\\\\s+(?:${alt})\\\\.?\\\\s+\\\\d{1,2}\\\\.?(?=\\\\s|[.,;!?)]|$)`,\n // f. DD de Month[.] [de] YYYY — Spanish \"7 de enero de 2025\"\n `(?i)\\\\b\\\\d{1,2}\\\\s+de\\\\s+(?:${alt})\\\\.?` + `(?:\\\\s+de)?\\\\s+\\\\d{4}\\\\b`,\n ];\n};\n\n/** Cached promise for date patterns. Loaded once. */\nlet datePatternPromise: Promise<string[]> | null = null;\n\nconst loadDatePatterns = async (): Promise<string[]> => {\n const mod = await import(\"@stll/anonymize-data/config/date-months.json\");\n // Dynamic import of JSON returns { default, ...keys }.\n // Use `default` if present (ESM wrapper), else the\n // module itself.\n const months: DateMonths = mod.default ?? mod;\n const alt = buildMonthAlternation(months);\n return buildDatePatternsFromMonths(alt);\n};\n\n/**\n * Get dynamically built date patterns from\n * date-months.json. Returns a cached promise; the JSON\n * is loaded only once.\n */\nexport const getDatePatterns = (): Promise<string[]> => {\n if (!datePatternPromise) {\n datePatternPromise = loadDatePatterns().catch((err) => {\n datePatternPromise = null;\n throw err;\n });\n }\n return datePatternPromise;\n};\n\n/** Date pattern metadata (all are score 1 dates). */\nexport const DATE_PATTERN_META: Readonly<RegexMeta> = Object.freeze({\n label: \"date\",\n score: 1,\n});\n\n// ── Dynamic currency patterns ──────────────────────\n\n/**\n * JSON shape from currencies.json: ISO 4217 codes,\n * common currency symbols, and local currency names.\n */\ntype CurrenciesData = {\n codes: string[];\n symbols: string[];\n localNames?: string[];\n};\n\n/**\n * Build symbol character class, code alternation,\n * and local-name alternation from currencies.json,\n * then return two monetary amount patterns: leading\n * symbol and trailing code/name.\n *\n * The number sub-pattern accepts both grouped\n * thousands (1,000) and plain integers (100000)\n * via `\\d{1,9}` to catch unformatted amounts.\n */\nconst buildCurrencyPatterns = (data: CurrenciesData): string[] => {\n const symbols = data.symbols.map(escapeCharClass).join(\"\");\n\n // Build trailing alternation: ISO codes (case-\n // sensitive, always uppercase) + local names.\n // Local names that contain only ASCII letters\n // are wrapped in (?i:...) for case-insensitive\n // matching; abbreviations with non-ASCII or\n // punctuation (Kč, zł, Fr.) stay case-sensitive.\n // Sorted longest-first to avoid partial matches.\n const isAsciiAlpha = /^[a-zA-Z\\s]+$/;\n\n type TrailingPart = { len: number; alt: string };\n const parts: TrailingPart[] = data.codes.map((code) => ({\n len: code.length,\n alt: escapeRegex(code),\n }));\n\n // Minimum length for case-insensitive wrapping.\n // Short abbreviations like \"Ft\" (2 chars) stay\n // case-sensitive to avoid collisions (Ft vs ft/feet).\n const MIN_CI_LENGTH = 3;\n\n if (data.localNames) {\n for (const name of data.localNames) {\n const escaped = escapeRegex(name);\n const wrapCI = isAsciiAlpha.test(name) && name.length >= MIN_CI_LENGTH;\n if (wrapCI) {\n parts.push({\n len: name.length,\n alt: `(?i:${escaped})`,\n });\n } else {\n parts.push({ len: name.length, alt: escaped });\n }\n }\n }\n\n // Also include currency symbols as trailing\n // alternatives (e.g., \"126 €\", \"8 190 £\").\n // These are common in European notation.\n if (symbols) {\n for (const ch of data.symbols) {\n parts.push({\n len: ch.length,\n alt: escapeRegex(ch),\n });\n }\n }\n\n const trailingAlt = parts\n .toSorted((a, b) => b.len - a.len)\n .map((p) => p.alt)\n .join(\"|\");\n\n if (!symbols && !trailingAlt) return [];\n\n // Number sub-pattern: grouped thousands OR plain\n // integer up to 9 digits (covers unformatted\n // amounts like \"100000 CZK\").\n const NUM = `(?:\\\\d{1,3}(?:[,.'[^\\\\S\\\\n\\\\t]]\\\\d{3})+` + `|\\\\d{1,9})`;\n\n const patterns: string[] = [];\n\n // Decimal part: dot/comma must be followed by at\n // least one digit or dash. Without this, a trailing\n // sentence period (\"$25,000,000.\") gets consumed by\n // the optional group, breaking the \\b anchor.\n // Use lookahead (?=\\d|DASH) after [.,] to ensure\n // the separator is actually a decimal marker.\n const DECIMAL =\n `(?:[.,](?=\\\\d|[${DASH_INNER}])` +\n `[^\\\\S\\\\n\\\\t]?` +\n `(?:\\\\d{1,2}${DASH}?|${DASH}{1,2}))?`;\n const END = `(?:\\\\b|(?=\\\\s|[.,;!?)]|$))`;\n\n // Leading symbol: $100, €1,000.50, € 100000\n if (symbols) {\n patterns.push(\n `(?:[${symbols}])` + `[^\\\\S\\\\n\\\\t]?` + `${NUM}${DECIMAL}${END}`,\n );\n }\n\n // Leading multi-char code: \"Kč 10,—\", \"Fr. 500\"\n if (trailingAlt) {\n patterns.push(\n `\\\\b(?:${trailingAlt})` + `[^\\\\S\\\\n\\\\t]{0,2}` + `${NUM}${DECIMAL}${END}`,\n );\n }\n\n // Trailing code/name: 100 USD, 1,000.50 CZK,\n // 100000 Kč, 500 korun, 100 Fr.\n if (trailingAlt) {\n patterns.push(\n `\\\\b${NUM}${DECIMAL}[^\\\\S\\\\n\\\\t]{0,4}` + `(?:${trailingAlt})${END}`,\n );\n }\n\n return patterns;\n};\n\n/** Cached promise for currency patterns. Loaded once. */\nlet currencyPatternPromise: Promise<string[]> | null = null;\n\nconst loadCurrencyPatterns = async (): Promise<string[]> => {\n const mod = await import(\"@stll/anonymize-data/config/currencies.json\");\n const data: CurrenciesData = mod.default ?? mod;\n return buildCurrencyPatterns(data);\n};\n\n/**\n * Get dynamically built monetary amount patterns from\n * currencies.json. Returns a cached promise; the JSON\n * is loaded only once.\n */\nexport const getCurrencyPatterns = (): Promise<string[]> => {\n if (!currencyPatternPromise) {\n currencyPatternPromise = loadCurrencyPatterns().catch((err) => {\n currencyPatternPromise = null;\n throw err;\n });\n }\n return currencyPatternPromise;\n};\n\n/** Currency pattern metadata (score 0.9). */\nexport const CURRENCY_PATTERN_META: Readonly<RegexMeta> = Object.freeze({\n label: \"monetary amount\",\n score: 0.9,\n});\n\n// ── Public API ──────────────────────────────────────\n\n/**\n * Process regex matches from the unified search.\n * Receives all matches; filters to the regex slice\n * via sliceStart/sliceEnd. Local index into META is\n * match.pattern - sliceStart.\n *\n * For stdnum-derived patterns (those with a validator\n * in META), the matched text is passed through the\n * validator's validate() method. If validation fails,\n * the match is discarded as a false positive.\n */\nexport const processRegexMatches = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n meta_: readonly RegexMeta[],\n): Entity[] => {\n const results: Entity[] = [];\n\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n\n const localIdx = idx - sliceStart;\n const meta = meta_[localIdx];\n if (!meta) {\n continue;\n }\n if (meta.label === \"phone number\" && match.text.length < MIN_PHONE_LENGTH) {\n continue;\n }\n\n // Post-match validation: if the pattern came from\n // a stdnum validator, compact (strip separators)\n // then validate. The candidate regex may capture\n // spaced/dashed variants that validate() rejects\n // without compaction.\n if (meta.validator) {\n const compacted = meta.validator.compact(match.text);\n const result = meta.validator.validate(compacted);\n if (!result.valid) {\n continue;\n }\n }\n\n results.push({\n start: match.start,\n end: match.end,\n label: meta.label,\n text: match.text,\n score: meta.score,\n source: DETECTION_SOURCES.REGEX,\n });\n }\n\n return results;\n};\n\n// ── Dynamic signing clause patterns ────────────────\n\ntype SigningClauseConfig = {\n patterns: Array<{\n lang: string;\n prefix: string;\n suffix: string;\n prepositions: string[];\n }>;\n};\n\n/**\n * Build signing clause place-name patterns from\n * signing-clauses.json. Each pattern captures the\n * city/place name from contract signing locations.\n *\n * The place name sub-pattern:\n * \\p{Lu}\\p{Ll}+ (capitalized word)\n * optionally followed by preposition + capitalized\n * word (for \"nad Nisou\", \"am Main\", etc.)\n * optionally followed by more capitalized words\n * (for \"Hradec Králové\", \"New York\", etc.)\n */\nconst buildSigningClausePatterns = (data: SigningClauseConfig): string[] => {\n const patterns: string[] = [];\n\n for (const entry of data.patterns) {\n const prepAlt =\n entry.prepositions.length > 0 ? entry.prepositions.join(\"|\") : null;\n\n // Place name: Uppercase word, optionally with\n // preposition + uppercase, optionally more caps\n const place = prepAlt\n ? `(\\\\p{Lu}\\\\p{Ll}+` +\n `(?:\\\\s+(?:${prepAlt})\\\\s+\\\\p{Lu}\\\\p{Ll}+)*` +\n `(?:\\\\s+\\\\p{Lu}\\\\p{Ll}+)*)`\n : `(\\\\p{Lu}\\\\p{Ll}+(?:[- ]\\\\p{Lu}\\\\p{Ll}+)*)`;\n\n const full =\n `(?:^|\\\\n|[^\\\\S\\\\n])` +\n entry.prefix +\n place +\n (entry.suffix ? `(?:${entry.suffix})` : \"\");\n\n patterns.push(full);\n }\n\n return patterns;\n};\n\nexport const SIGNING_CLAUSE_META: Readonly<RegexMeta> = {\n label: \"address\",\n score: 0.9,\n};\n\nlet signingPatternPromise: Promise<string[]> | null = null;\n\nconst loadSigningPatterns = async (): Promise<string[]> => {\n const mod = await import(\"@stll/anonymize-data/config/signing-clauses.json\");\n const data: SigningClauseConfig = mod.default ?? mod;\n return buildSigningClausePatterns(data);\n};\n\nexport const getSigningClausePatterns = (): Promise<string[]> => {\n if (!signingPatternPromise) {\n signingPatternPromise = loadSigningPatterns().catch((err) => {\n signingPatternPromise = null;\n throw err;\n });\n }\n return signingPatternPromise;\n};\n","/**\n * Legal form detection for company/organization names.\n *\n * Detects company names by finding legal form suffixes\n * (s.r.o., GmbH, a.s., etc.) and extending backwards\n * to capture preceding capitalised words.\n *\n * Exports pattern definitions for the unified builder\n * and a match processor for post-processing.\n */\n\nimport type { Match } from \"@stll/text-search\";\n\nimport { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\nimport { DASH_INNER } from \"../util/char-groups\";\n\nconst UPPER = \"A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽÄÖÜÀÂÆÇÈÊËÎÏÔÙÛŸÑ\\\\u0130\";\nconst LOWER = \"a-záčďéěíňóřšťúůýžäöüßàâæçèêëîïôùûÿñ\\\\u0131\";\nconst CAP_WORD = `(?:[${UPPER}]{2,}|[${UPPER}][${LOWER}${UPPER}]+)`;\n// ANY_WORD: mixed-case word, short all-caps token\n// (2-3 chars, e.g. \"CZ\" in \"Metrostav CZ s.r.o.\"),\n// or digit-only token (1-4 digits, e.g. \"2028\" in\n// \"Invest 2028 s.r.o.\" or \"12\" in \"Praha 12 s.r.o.\").\nconst ANY_WORD =\n `(?:[${UPPER}${LOWER}][${LOWER}${UPPER}]+` +\n `|[${UPPER}]{2,3}` +\n `|\\\\d{1,4})`;\n// All-caps word: 2+ uppercase letters, no lowercase.\n// For company names like \"EAGLES BRNO\", max 3 words.\nconst ALLCAP_WORD = `[${UPPER}]{2,}`;\n\nconst ROMAN_NUMERAL_RE =\n /^(?=[IVXLCDM])M{0,3}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})$/;\n\nconst escapeForRegex = (form: string): string =>\n form\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\s+/g, \"\\\\s+\")\n // Use [^\\S\\n]? (optional horizontal whitespace)\n // instead of \\s* to prevent greedy matching across\n // newlines which causes DFA failures in regex-set.\n .replace(/\\\\\\./g, \"\\\\.[^\\\\S\\\\n]?\");\n\nconst isShortForm = (form: string): boolean =>\n form.replace(/[.\\s]/g, \"\").length <= 3 && !form.includes(\" \");\n\nconst buildPatternString = (forms: string[]): string | null => {\n if (forms.length === 0) {\n return null;\n }\n\n const sorted = forms.toSorted((a, b) => b.length - a.length);\n const alt = sorted.map(escapeForRegex).join(\"|\");\n // Separator between name words: space, ampersand,\n // comma, dot, hyphen (1-4 chars). Connector words\n // (a, and, und, et, e, y, i) are allowed only when\n // followed by a lowercase-starting word — this\n // prevents greedy extension across entity boundaries\n // like \"Foo s.r.o. a BAR s.r.o.\"\n const LOWER_CONNECTOR = `\\\\s+(?:a|and|und|et|e|y|i)\\\\s+(?=[${LOWER}])`;\n const SEPARATOR = `(?:[\\\\s&,.${DASH_INNER}]{1,4}|${LOWER_CONNECTOR})`;\n const prefix = `(?:${CAP_WORD})` + `(?:${SEPARATOR}(?:${ANY_WORD})){0,10}`;\n const separator = `(?:\\\\s+|,\\\\s*)`;\n\n return `${prefix}${separator}(?:${alt})(?![${LOWER}])`;\n};\n\n// ── Pattern builder for unified search ──────────────\n\n/**\n * Build legal form regex pattern strings.\n * Returns an array of regex strings for the unified\n * TextSearch builder. Empty if data package is not\n * installed.\n */\nexport const buildLegalFormPatterns = async (): Promise<string[]> => {\n let data: Record<string, string[]> = {};\n\n try {\n const mod = await import(\"@stll/anonymize-data/config/legal-forms.json\");\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON module shape\n data = (mod as { default: Record<string, string[]> }).default;\n } catch {\n return [];\n }\n\n const allForms: string[] = [];\n const seen = new Set<string>();\n\n for (const forms of Object.values(data)) {\n for (const form of forms) {\n const key = form.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n allForms.push(form);\n }\n }\n }\n\n const patterns: string[] = [];\n\n const longPattern = buildPatternString(\n allForms.filter((f) => !isShortForm(f)),\n );\n if (longPattern) {\n patterns.push(longPattern);\n }\n\n const shortPattern = buildPatternString(allForms.filter(isShortForm));\n if (shortPattern) {\n patterns.push(shortPattern);\n }\n\n // All-caps company names: \"EAGLES BRNO, z.s.\"\n // Up to 3 all-caps words before any legal form.\n // Uses all forms (both long and short).\n // No connectors — backward extension handles them.\n const allcapPrefix =\n `(?:${ALLCAP_WORD})` +\n `(?:[\\\\s&,.${DASH_INNER}]{1,4}(?:${ALLCAP_WORD})){0,2}`;\n const allcapAlt = allForms\n .toSorted((a, b) => b.length - a.length)\n .map(escapeForRegex)\n .join(\"|\");\n patterns.push(\n `${allcapPrefix}(?:\\\\s+|,\\\\s*)` + `(?:${allcapAlt})(?![${LOWER}])`,\n );\n\n return patterns;\n};\n\n// ── Backward extension ──────────────────────────────\n\nconst CONNECTOR_RE = /^(?:a|and|und|et|e|y|i|&)$/i;\nconst LEADING_CLAUSE_RE = /(?:^|\\s)(?:by\\s+and\\s+between|is\\s+between)\\s+/giu;\n\n/**\n * Find the word ending just before `pos` in `text`,\n * skipping any whitespace (not newlines).\n * Returns null if no word is found (e.g., at start\n * of text, or preceded by non-word chars like \".\").\n */\nconst findWordBefore = (\n text: string,\n pos: number,\n): { word: string; start: number } | null => {\n let scan = pos - 1;\n // Skip horizontal whitespace\n while (scan >= 0) {\n const ch = text.charAt(scan);\n if (ch === \"\\n\" || !/\\s/.test(ch)) break;\n scan--;\n }\n if (scan < 0 || text.charAt(scan) === \"\\n\") {\n return null;\n }\n\n const wordEnd = scan + 1;\n while (scan >= 0 && /[\\p{L}\\p{M}&]/u.test(text.charAt(scan))) {\n scan--;\n }\n const wordStart = scan + 1;\n const word = text.slice(wordStart, wordEnd);\n if (word.length === 0) return null;\n return { word, start: wordStart };\n};\n\n/**\n * Extend a match backward through uppercase words and\n * lowercase connectors. Stops at start of text,\n * newline, or a word that doesn't qualify.\n *\n * Connectors (a, and, und, et, ...) are only consumed\n * when there is a valid word before them — a trailing\n * connector at an entity boundary is not consumed.\n */\nconst extendBackward = (fullText: string, matchStart: number): number => {\n let pos = matchStart;\n\n while (pos > 0) {\n const found = findWordBefore(fullText, pos);\n if (!found) break;\n\n const { word, start: wordStart } = found;\n\n const isUpper = /^\\p{Lu}/u.test(word);\n const isConnector = CONNECTOR_RE.test(word);\n\n if (isUpper) {\n // Uppercase word — always accept\n pos = wordStart;\n } else if (isConnector) {\n // Connector — only accept if there is a valid\n // (uppercase-starting) word before it\n const prev = findWordBefore(fullText, wordStart);\n if (!prev) break;\n const prevIsUpper = /^\\p{Lu}/u.test(prev.word);\n if (!prevIsUpper) break;\n // Move pos back to the start of the word that\n // precedes the connector; the connector and all\n // whitespace between it and prev.start are\n // included implicitly in the entity slice.\n pos = prev.start;\n } else {\n break;\n }\n }\n\n return pos;\n};\n\nconst trimLeadingClause = (text: string): { offset: number; text: string } => {\n let cut = -1;\n\n for (const match of text.matchAll(LEADING_CLAUSE_RE)) {\n cut = match.index + match[0].length;\n }\n\n if (cut <= 0) {\n return { offset: 0, text };\n }\n\n const trimmed = text.slice(cut);\n const leadingWs = trimmed.match(/^\\s*/u)?.[0].length ?? 0;\n\n return {\n offset: cut + leadingWs,\n text: trimmed.slice(leadingWs),\n };\n};\n\n// ── Match processor ─────────────────────────────────\n\n/**\n * Process legal form matches from the unified search.\n * Receives all matches; filters to the legal forms\n * slice via sliceStart/sliceEnd.\n */\nexport const processLegalFormMatches = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText?: string,\n): Entity[] => {\n const results: Entity[] = [];\n\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n\n const text = match.text.trimEnd();\n if (text.length < 5) {\n continue;\n }\n\n if (text.includes(\"\\n\")) {\n continue;\n }\n\n // Extend backward through connectors if fullText\n // is available (captures \"Be a Future\" from just\n // \"Future s.r.o.\")\n let entityStart = match.start;\n let entityText = text;\n if (fullText) {\n const extended = extendBackward(fullText, match.start);\n if (extended < match.start) {\n entityStart = extended;\n entityText = fullText\n .slice(extended, match.start + text.length)\n .trimEnd();\n }\n }\n\n const clauseTrim = trimLeadingClause(entityText);\n if (clauseTrim.offset > 0) {\n entityStart += clauseTrim.offset;\n entityText = clauseTrim.text;\n }\n\n // Reject all-caps matches only if the entire\n // surrounding line is all-caps (section headings\n // like \"KUPNÍ SMLOUVA\"). If only the company name\n // is all-caps (\"uzavřená s EAGLES BRNO, z.s.\"),\n // keep it — max 3 all-caps words are allowed.\n const getPrefixInfo = (value: string) => {\n const prefixEnd =\n value.lastIndexOf(\",\") !== -1\n ? value.lastIndexOf(\",\")\n : value.lastIndexOf(\" \");\n const prefixPart =\n prefixEnd > 0\n ? value.slice(0, prefixEnd).replace(/[^a-zA-ZÀ-ž]/g, \"\")\n : value.replace(/[^a-zA-ZÀ-ž]/g, \"\");\n return { prefixEnd, prefixPart };\n };\n let { prefixEnd, prefixPart } = getPrefixInfo(entityText);\n let isAllCapsMatch =\n prefixPart.length > 2 && prefixPart === prefixPart.toUpperCase();\n\n if (isAllCapsMatch && fullText) {\n // Check: is the surrounding line also all-caps?\n const lineStart = fullText.lastIndexOf(\"\\n\", entityStart);\n const lineEnd = fullText.indexOf(\"\\n\", entityStart + entityText.length);\n const line = fullText.slice(\n lineStart + 1,\n lineEnd === -1 ? fullText.length : lineEnd,\n );\n const lineLetters = line.replace(/[^a-zA-ZÀ-ž]/g, \"\");\n const upperCount = [...lineLetters].filter(\n (c) => c === c.toUpperCase(),\n ).length;\n const lineIsAllCaps =\n lineLetters.length > 5 && upperCount / lineLetters.length >= 0.95;\n if (lineIsAllCaps) {\n // Entire line is all-caps → heading, skip\n continue;\n }\n // Only the company name is all-caps → keep it\n // (but limit to 3 words in prefix)\n const wordCount =\n prefixPart.length > 0\n ? entityText\n .slice(0, prefixEnd > 0 ? prefixEnd : entityText.length)\n .trim()\n .split(/\\s+/).length\n : 0;\n if (wordCount > 3) {\n // Keep the original regex match if backward\n // extension alone pushed the name past the\n // all-caps 3-word guard.\n entityStart = match.start;\n entityText = text;\n ({ prefixEnd, prefixPart } = getPrefixInfo(entityText));\n isAllCapsMatch =\n prefixPart.length > 2 && prefixPart === prefixPart.toUpperCase();\n }\n } else if (isAllCapsMatch) {\n // No fullText available — fall back to rejecting\n continue;\n }\n\n // Reject Roman numeral suffixes\n const lastSpace = entityText.lastIndexOf(\" \");\n const rawSuffix = lastSpace !== -1 ? entityText.slice(lastSpace + 1) : \"\";\n const suffixClean = rawSuffix.replace(/[.,]/g, \"\");\n if (suffixClean.length > 0 && ROMAN_NUMERAL_RE.test(suffixClean)) {\n continue;\n }\n\n // Short ASCII-only suffixes (NA, PA, LP, PC) are\n // US-specific. Reject if the prefix contains non-\n // ASCII chars (Czech/Slovak diacritics) — a US\n // legal entity wouldn't have \"ÚČASTI MSP NA\".\n // Test for dots in the raw suffix (before dot\n // stripping) to protect Czech dotted forms like\n // \"a.s.\" and \"k.s.\".\n if (\n suffixClean.length <= 2 &&\n !/\\./.test(rawSuffix) &&\n /[^\\x00-\\x7F]/.test(\n entityText.slice(0, lastSpace !== -1 ? lastSpace : entityText.length),\n )\n ) {\n continue;\n }\n\n // Definitive legal forms (s.r.o., a.s., GmbH, etc.)\n // get score 0.95 to beat person names in dedup.\n results.push({\n start: entityStart,\n end: entityStart + entityText.length,\n label: \"organization\",\n text: entityText,\n score: 0.95,\n source: DETECTION_SOURCES.LEGAL_FORM,\n });\n }\n\n return results;\n};\n","/**\n * Known legal form suffixes. Shared between trigger\n * detection (reclassification) and org-propagation\n * (suffix stripping). Within each family of related\n * forms, longer variants come first so that\n * \"spol. s r.o.\" matches before \"s.r.o.\" and\n * \"s. r. o.\" matches before \"s.r.o.\".\n */\nexport const LEGAL_SUFFIXES = [\n \"spol. s r.o.\",\n \"s.r.o.\",\n \"s. r. o.\",\n \"a.s.\",\n \"a. s.\",\n \"v.o.s.\",\n \"v. o. s.\",\n \"k.s.\",\n \"k. s.\",\n \"z.s.\",\n \"z. s.\",\n \"z.ú.\",\n \"z. ú.\",\n \"o.p.s.\",\n \"o. p. s.\",\n \"s.p.\",\n \"s. p.\",\n \"GmbH\",\n \"AG\",\n \"SE\",\n \"KG\",\n \"OHG\",\n \"Ltd.\",\n \"Ltd\",\n \"LLC\",\n \"LLP\",\n \"Inc.\",\n \"S.A.\",\n \"SA\",\n \"SAS\",\n \"SARL\",\n \"Sp. z o.o.\",\n \"S.p.A.\",\n] as const;\n","import type { Match } from \"@stll/text-search\";\n\nimport { DETECTION_SOURCES } from \"../types\";\nimport type {\n CompiledValidation,\n Entity,\n TriggerGroupConfig,\n TriggerRule,\n TriggerValidation,\n} from \"../types\";\nimport { POST_NOMINALS } from \"../config/titles\";\nimport { LEGAL_SUFFIXES } from \"../config/legal-forms\";\nimport { loadLanguageConfigs } from \"../util/lang-loader\";\nimport { DASH } from \"../util/char-groups\";\n\nconst TRIGGER_SCORE = 0.95;\nconst WHITESPACE_RE = /\\s+/;\nconst LETTER_RE = /\\p{L}/u;\n/**\n * Decimal-comma pattern: comma followed by digit or\n * dash notation (\"0,05%\", \"1.529,50 Kč\", \"98.000,- Kč\").\n */\nconst DECIMAL_COMMA_RE = new RegExp(`^,(?:\\\\d|${DASH}{1,2})`);\n\n/**\n * Post-nominal degree regex. When a comma-stop is\n * followed by a known post-nominal (Ph.D., CSc., MBA\n * etc.), skip the comma and degree, then continue.\n */\nconst POST_NOMINAL_RE = new RegExp(\n `^,\\\\s*(?:${POST_NOMINALS.toSorted((a, b) => b.length - a.length)\n .map((d) =>\n d.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\\\\\./g, \"\\\\.\\\\s*\"),\n )\n .join(\"|\")})\\\\.?`,\n \"i\",\n);\n\n// Definitive legal form suffixes (case-sensitive).\n// When a person-labeled trigger captures text containing\n// one of these, the entity is reclassified as\n// \"organization\". No \"i\" flag: short uppercase-only\n// forms (SE, SA, AG) must NOT match Czech/Slovak\n// reflexive pronouns \"se\", \"sa\" which appear in\n// person-trigger captures like\n// \"Ing. Jan Novák, se sídlem...\".\nconst DEFINITIVE_LEGAL_FORMS = LEGAL_SUFFIXES;\n// Build case-sensitive regex. Short dot-free forms\n// (AG, SE, KG) get word boundaries to prevent substring\n// matches. All forms are uppercase in the list; the\n// regex is case-sensitive so \"se\"/\"sa\" won't match.\nconst LEGAL_FORM_CHECK_RE = new RegExp(\n DEFINITIVE_LEGAL_FORMS.map((f) => {\n const escaped = f\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\\\\\./g, \"\\\\.\\\\s*\");\n const isDotFree = !f.includes(\".\");\n const isShort = f.length <= 4;\n return isDotFree && isShort ? `\\\\b${escaped}\\\\b` : escaped;\n }).join(\"|\"),\n);\n\n// ── Validation compilation ─────────────────────────\n\nconst compileValidations = (\n validations: TriggerValidation[],\n): CompiledValidation[] =>\n validations.map((v): CompiledValidation => {\n switch (v.type) {\n case \"starts-uppercase\":\n return {\n type: \"starts-uppercase\",\n re: /^\\p{Lu}/u,\n };\n case \"min-length\":\n return { type: \"min-length\", min: v.min };\n case \"max-length\":\n return { type: \"max-length\", max: v.max };\n case \"no-digits\":\n return { type: \"no-digits\", re: /\\d/ };\n case \"has-digits\":\n return { type: \"has-digits\", re: /\\d/ };\n case \"matches-pattern\":\n return {\n type: \"matches-pattern\",\n // Strip g/y flags: the compiled regex is shared\n // across all rules in the group and must be\n // stateless (no lastIndex advancement).\n re: new RegExp(v.pattern, (v.flags ?? \"\").replace(/[gy]/g, \"\")),\n };\n default: {\n // TriggerValidation is a public export; custom\n // configs may bypass the build-time validator.\n const _exhaustive: never = v;\n throw new Error(\n `Unknown validation type: ${JSON.stringify(_exhaustive)}`,\n );\n }\n }\n });\n\nconst applyValidations = (\n text: string,\n validations: CompiledValidation[],\n): boolean => {\n for (const v of validations) {\n switch (v.type) {\n case \"starts-uppercase\":\n if (!v.re.test(text)) return false;\n break;\n case \"min-length\":\n if (text.length < v.min) return false;\n break;\n case \"max-length\":\n if (text.length > v.max) return false;\n break;\n case \"no-digits\":\n if (v.re.test(text)) return false;\n break;\n case \"has-digits\":\n if (!v.re.test(text)) return false;\n break;\n case \"matches-pattern\":\n if (!v.re.test(text)) return false;\n break;\n default: {\n const _exhaustive: never = v;\n throw new Error(\n `Unknown compiled validation type: ${JSON.stringify(_exhaustive)}`,\n );\n }\n }\n }\n return true;\n};\n\n// ── Trigger expansion ──────────────────────────────\n\nconst expandTriggerGroups = (groups: TriggerGroupConfig[]): TriggerRule[] => {\n const rules: TriggerRule[] = [];\n for (const group of groups) {\n const extensions = group.extensions ?? [];\n const compiled = compileValidations(group.validations ?? []);\n\n // Generate trigger variants from the original\n // trigger strings. Extensions are applied once to\n // the base set only (not combinatorially); e.g.,\n // [\"add-colon\", \"normalize-spaces\"] produces\n // \"trigger:\", \"trigger\\u00A0\", but NOT\n // \"trigger\\u00A0:\". This is intentional to avoid\n // exponential variant growth.\n const allTriggers = new Set(group.triggers);\n for (const trigger of group.triggers) {\n if (extensions.includes(\"add-colon\") && !trigger.endsWith(\":\"))\n allTriggers.add(`${trigger}:`);\n if (extensions.includes(\"add-trailing-space\") && !trigger.endsWith(\" \"))\n allTriggers.add(`${trigger} `);\n if (\n extensions.includes(\"add-colon-space\") &&\n !trigger.endsWith(\": \") &&\n !trigger.endsWith(\":\")\n )\n allTriggers.add(`${trigger}: `);\n if (extensions.includes(\"normalize-spaces\")) {\n if (trigger.includes(\" \")) {\n allTriggers.add(trigger.replace(/ /g, \"\\u00A0\"));\n }\n }\n }\n\n const includeTrigger = group.includeTrigger ?? false;\n\n for (const trigger of allTriggers) {\n rules.push({\n trigger,\n label: group.label,\n strategy: group.strategy,\n validations: compiled,\n includeTrigger,\n });\n }\n }\n return rules;\n};\n\n// ── Pattern builder for unified search ──────────────\n\n/**\n * Build trigger patterns and rules from data configs.\n * Returns string[] for the unified TextSearch\n * builder and the parallel rules array.\n */\nexport const buildTriggerPatterns = async (): Promise<{\n patterns: string[];\n rules: TriggerRule[];\n}> => {\n const rules: TriggerRule[] = [];\n\n const allGroups = await loadLanguageConfigs<readonly TriggerGroupConfig[]>(\n \"triggers\",\n (mod) => {\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON config\n const m = mod as {\n default?: readonly TriggerGroupConfig[];\n };\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON config\n return (m.default ?? mod) as readonly TriggerGroupConfig[];\n },\n );\n for (const groups of allGroups) {\n if (!Array.isArray(groups)) {\n console.warn(\n \"[anonymize] triggers: unexpected \" + \"config shape, skipping\",\n );\n continue;\n }\n rules.push(...expandTriggerGroups(groups as TriggerGroupConfig[]));\n }\n\n // Load global triggers (language-agnostic)\n try {\n const globalMod =\n await import(\"@stll/anonymize-data/config/triggers.global.json\");\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON config\n const globalGroups = ((globalMod as { default?: unknown }).default ??\n globalMod) as TriggerGroupConfig[];\n if (Array.isArray(globalGroups)) {\n rules.push(...expandTriggerGroups(globalGroups));\n }\n } catch (err) {\n // Only suppress \"module not found\"; re-throw\n // other errors (JSON parse, etc.).\n if (\n !(err instanceof Error) ||\n !err.message.includes(\"Cannot find module\")\n ) {\n throw err;\n }\n }\n\n // Load year-words from JSON dictionary and create\n // date triggers: \"rok 2022\" → date entity.\n try {\n const yearMod = await import(\"@stll/anonymize-data/config/year-words.json\");\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON\n const data = ((yearMod as { default?: unknown }).default ??\n yearMod) as Record<string, string | string[]>;\n const seen = new Set<string>();\n const yearValidation = compileValidations([\n {\n type: \"matches-pattern\",\n pattern: \"^(?:19|20)\\\\d{2}\\\\.?$\",\n },\n ]);\n for (const [key, words] of Object.entries(data)) {\n if (key.startsWith(\"_\") || !Array.isArray(words)) {\n continue;\n }\n for (const word of words) {\n const lc = word.toLowerCase();\n if (seen.has(lc)) continue;\n seen.add(lc);\n rules.push({\n trigger: word,\n label: \"date\",\n strategy: { type: \"n-words\", count: 1 },\n validations: yearValidation,\n includeTrigger: false,\n });\n }\n }\n } catch {\n // year-words.json not available — skip\n }\n\n // Warn about cross-group trigger duplicates.\n // Duplicates cause redundant AC matches but are\n // not fatal (mergeAndDedup handles overlap).\n const seen = new Map<string, { label: string; strategy: string }>();\n for (const rule of rules) {\n const key = rule.trigger.toLowerCase();\n const prev = seen.get(key);\n if (prev !== undefined) {\n const labelDiff = prev.label !== rule.label;\n const stratDiff = prev.strategy !== rule.strategy.type;\n if (labelDiff || stratDiff) {\n console.warn(\n `[anonymize] duplicate trigger` +\n ` \"${rule.trigger}\":` +\n (labelDiff\n ? ` labels \"${prev.label}\" vs` + ` \"${rule.label}\"`\n : \"\") +\n (stratDiff\n ? ` strategies \"${prev.strategy}\" vs` + ` \"${rule.strategy.type}\"`\n : \"\"),\n );\n }\n }\n seen.set(key, {\n label: rule.label,\n strategy: rule.strategy.type,\n });\n }\n\n // Build patterns from lowercased trigger strings.\n // rules[i] corresponds to patterns[i].\n // Plain lowercased strings — the unified builder\n // sets caseInsensitive globally on the AC.\n const patterns: string[] = rules.map((r) => r.trigger.toLowerCase());\n\n return { patterns, rules };\n};\n\n// ── Value extraction ────────────────────────────────\n\nconst LEADING_PUNCT = /^[„\"\"»«'\"()\\s]+/;\nconst TRAILING_PUNCT = /[\"\"»«'\"()\\s]+$/;\n\nconst stripQuotes = (value: {\n start: number;\n end: number;\n text: string;\n}): {\n start: number;\n end: number;\n text: string;\n} | null => {\n const leadingMatch = LEADING_PUNCT.exec(value.text);\n const leadingLen = leadingMatch ? leadingMatch[0].length : 0;\n const stripped = value.text.slice(leadingLen).replace(TRAILING_PUNCT, \"\");\n if (stripped.length === 0) {\n return null;\n }\n return {\n start: value.start + leadingLen,\n end: value.start + leadingLen + stripped.length,\n text: stripped,\n };\n};\n\n/** Hard stop characters for to-next-comma scanning. */\nconst COMMA_STOP_CHARS = new Set([\"\\n\", \"(\", \"\\t\"]);\n\n/**\n * Field-label keywords that terminate address scanning.\n * When a comma in the address strategy is followed by\n * one of these, the address stops before the keyword.\n */\nconst ADDRESS_STOP_KEYWORDS = [\n \"číslo účtu\",\n \"registrační\",\n \"zastoupen\",\n \"bankovní\",\n \"e-mail\",\n \"telefon\",\n \"jednatel\",\n \"ředitel\",\n \"datová\",\n \"vložka\",\n \"sp.zn.\",\n \"oddíl\",\n \"swift\",\n \"email\",\n \"iban\",\n \"dič\",\n \"ičo\",\n \"tel\",\n \"č.ú.\",\n \"bic\",\n \"ič\",\n];\n\nconst extractValue = (\n text: string,\n triggerEnd: number,\n strategy: TriggerRule[\"strategy\"],\n label?: string,\n): {\n start: number;\n end: number;\n text: string;\n} | null => {\n const remaining = text.slice(triggerEnd);\n // Strip leading whitespace, colons, semicolons —\n // triggers are often followed by \": \\t\\t\\t\" in\n // formatted documents.\n const stripped = remaining.replace(/^[\\s:;]+/, \"\");\n const trimmedOffset = remaining.length - stripped.length;\n const valueStart = triggerEnd + trimmedOffset;\n const valueText = stripped;\n\n if (valueText.length === 0) {\n return null;\n }\n\n switch (strategy.type) {\n case \"to-next-comma\": {\n // Stop at comma, newline, or opening parenthesis.\n // Parens mark defined-term clauses in legal text\n // (e.g., \"(dále jen ...)\") and should not be\n // captured as part of a name/address.\n // When a comma is followed by a known post-nominal\n // degree (Ph.D., CSc., MBA), skip it and continue\n // so \"RNDr. Filipem Hartvichem, Ph.D., CSc.\"\n // captures the full name with degrees.\n let end = 0;\n let foundStop = false;\n\n while (end < valueText.length) {\n const ch = valueText[end];\n // Hard stops: newline, paren, tab\n if (ch !== undefined && COMMA_STOP_CHARS.has(ch)) {\n foundStop = true;\n break;\n }\n // Comma: for person triggers, check if followed\n // by a post-nominal degree (Ph.D., CSc.) and\n // skip past it. Non-person triggers stop here.\n if (ch === \",\") {\n const afterComma = valueText.slice(end);\n // Decimal separator: comma followed by digit or\n // dash notation (\"0,05%\", \"1.529,50 Kč\",\n // \"98.000,- Kč\", \"98.000,-- Kč\")\n if (DECIMAL_COMMA_RE.test(afterComma)) {\n end++;\n continue;\n }\n const degreeMatch =\n label === \"person\" ? POST_NOMINAL_RE.exec(afterComma) : null;\n if (degreeMatch) {\n // Skip the comma + degree, continue scan\n end += degreeMatch[0].length;\n continue;\n }\n // Regular comma — stop here\n foundStop = true;\n break;\n }\n end++;\n }\n\n // Only cap at 100 chars when no stop char was\n // found (fallback for unterminated values). When\n // a stop char exists, respect its position even\n // if > 100.\n if (!foundStop) {\n end = Math.min(end, 100);\n }\n\n const rawSlice = valueText.slice(0, end);\n const extracted = rawSlice.trim();\n if (extracted.length === 0) {\n return null;\n }\n const trailingSpaces = rawSlice.length - rawSlice.trimEnd().length;\n return {\n start: valueStart,\n end: valueStart + end - trailingSpaces,\n text: extracted,\n };\n }\n\n case \"to-end-of-line\": {\n // Stop at newline or tab (tab separates cells\n // in DOCX table rows).\n const LINE_STOPS = [\"\\n\"];\n let end = valueText.length;\n for (const ch of LINE_STOPS) {\n const idx = valueText.indexOf(ch);\n if (idx !== -1 && idx < end) {\n end = idx;\n }\n }\n const rawSlice = valueText.slice(0, end);\n const extracted = rawSlice.trim();\n if (extracted.length === 0) {\n return null;\n }\n const trailingSpaces = rawSlice.length - rawSlice.trimEnd().length;\n return {\n start: valueStart,\n end: valueStart + end - trailingSpaces,\n text: extracted,\n };\n }\n\n case \"n-words\": {\n // Respect tab as a cell boundary (DOCX table\n // rows use tabs between columns).\n const tabIdx = valueText.indexOf(\"\\t\");\n const cellText = tabIdx !== -1 ? valueText.slice(0, tabIdx) : valueText;\n // Skip punctuation-only tokens (colons, dashes)\n // so \"datová schránka : hsaxra8\" captures\n // \"hsaxra8\" not \":\"\n const PUNCT_ONLY = /^[\\p{P}\\p{S}]+$/u;\n const allTokens = cellText.split(WHITESPACE_RE);\n const words = allTokens\n .filter((w) => !PUNCT_ONLY.test(w))\n .slice(0, strategy.count);\n if (words.length === 0) {\n return null;\n }\n // Find span of the first real word\n const firstWord = words[0];\n if (firstWord === undefined) {\n return null;\n }\n const firstIdx = cellText.indexOf(firstWord);\n let actualEnd = firstIdx + firstWord.length;\n // If multiple words, extend to last one\n let searchPos = actualEnd;\n for (let wi = 1; wi < words.length; wi++) {\n const w = words[wi];\n if (w === undefined) {\n break;\n }\n const wIdx = cellText.indexOf(w, searchPos);\n if (wIdx === -1) break;\n actualEnd = wIdx + w.length;\n searchPos = actualEnd;\n }\n return {\n start: valueStart + firstIdx,\n end: valueStart + actualEnd,\n text: cellText.slice(firstIdx, actualEnd),\n };\n }\n\n case \"company-id-value\": {\n // Work from the raw remaining text (before the\n // upstream trimStart) so we can require at least\n // a colon or whitespace separator between the\n // keyword and value (e.g., \"IČO: 12345678\" or\n // \"IČO 12345678\", but not \"IČO12345678\").\n const raw = text.slice(triggerEnd);\n const sepMatch = /^(?:\\s*:\\s*|\\s+)/.exec(raw);\n if (!sepMatch) {\n return null;\n }\n const afterSep = raw.slice(sepMatch[0].length);\n const idMatch = /^[A-Z]{0,6}\\s?\\d[\\d\\s\\-/]{4,}/i.exec(afterSep);\n if (!idMatch) {\n return null;\n }\n const idText = idMatch[0].trim();\n const leadingSpaces = idMatch[0].length - idMatch[0].trimStart().length;\n const idStart =\n triggerEnd +\n sepMatch[0].length +\n // idMatch.index is always 0 (anchored ^ regex)\n leadingSpaces;\n return {\n start: idStart,\n end: idStart + idText.length,\n text: idText,\n };\n }\n\n case \"address\": {\n // Walk through comma-separated segments.\n // Continue through a comma if the next segment\n // starts with a digit (PSČ like \"110 00\") or\n // an uppercase letter (city like \"Praha\").\n // Stop at: newline, opening paren \"(\", tab,\n // or a period that is NOT an abbreviation\n // (abbreviation = period followed by a space\n // and a lowercase letter, e.g. \"nábř. \").\n const maxLen = strategy.maxChars ?? 120;\n const UPPER_RE = /\\p{Lu}/u;\n let end = 0;\n\n while (end < valueText.length && end < maxLen) {\n const ch = valueText[end];\n\n // Hard stops: newline, opening paren.\n // Tabs are NOT hard stops — they appear as\n // formatting in structured documents between\n // trigger and value.\n if (ch === \"\\n\" || ch === \"(\") {\n break;\n }\n\n // Period: stop unless it's an abbreviation.\n // Abbreviation patterns in Czech addresses:\n // \"nábř. Kpt.\" — period + space + letter\n // \"č.p.\" — period + letter (no space)\n // \"1000/7.\" — period at end of address\n if (ch === \".\") {\n const next = valueText[end + 1];\n const afterNext = valueText[end + 2];\n // \"č.p.\" or \"Kpt.J\" — period immediately\n // followed by letter or digit\n if (next !== undefined && (/\\p{L}/u.test(next) || /\\d/.test(next))) {\n end++;\n continue;\n }\n // \"nábř. Kpt.\" or \"ul. nová\" — period +\n // space + any letter or digit. In address\n // context, this is always an abbreviation,\n // not end of sentence.\n if (\n next === \" \" &&\n afterNext !== undefined &&\n (/\\p{L}/u.test(afterNext) || /\\d/.test(afterNext))\n ) {\n end++;\n continue;\n }\n // Period at end of address — stop but\n // don't include the period\n break;\n }\n\n // Comma: look ahead to see if address continues\n if (ch === \",\") {\n // Skip comma + whitespace, check next char\n let peek = end + 1;\n while (\n peek < valueText.length &&\n (valueText[peek] === \" \" || valueText[peek] === \"\\t\")\n ) {\n peek++;\n }\n const peekCh = valueText[peek];\n if (peekCh === undefined) {\n break;\n }\n // Check for field-label keywords after\n // comma before continuing. Keywords like\n // \"IČ\", \"DIČ\" start new fields.\n const afterComma = valueText\n .slice(end + 1)\n .trimStart()\n .toLowerCase();\n const hitsKeyword = ADDRESS_STOP_KEYWORDS.some((kw) => {\n if (!afterComma.startsWith(kw)) return false;\n // Guard: next char must be a delimiter\n // or digit to avoid truncating city\n // names like \"Telč\" on \"tel\". Digits\n // are included so \"IČ25672541\" (no\n // space) still triggers a stop.\n const next = afterComma[kw.length];\n return next === undefined || /[\\s:;.,!?()\\d]/.test(next);\n });\n if (hitsKeyword) {\n break;\n }\n // Continue if next segment starts with\n // digit (PSČ) or uppercase (city name)\n if (/\\d/.test(peekCh) || UPPER_RE.test(peekCh)) {\n end++;\n continue;\n }\n // Otherwise stop at this comma\n break;\n }\n\n end++;\n }\n\n // When the loop stopped at maxLen, trim back to\n // the last word boundary so fixPartialWords does\n // not extend the entity beyond the configured max.\n if (end >= maxLen) {\n const lastSpace = valueText.lastIndexOf(\" \", end - 1);\n if (lastSpace > 0) {\n end = lastSpace;\n }\n }\n\n const rawSlice = valueText.slice(0, end);\n const extracted = rawSlice.trim();\n if (extracted.length === 0) {\n return null;\n }\n const trailingSpaces = rawSlice.length - rawSlice.trimEnd().length;\n return {\n start: valueStart,\n end: valueStart + end - trailingSpaces,\n text: extracted,\n };\n }\n\n default:\n return null;\n }\n};\n\n// ── Match processor ─────────────────────────────────\n\n/**\n * Process trigger matches from the unified search.\n * Receives all matches; filters to the trigger slice\n * via sliceStart/sliceEnd. Uses fullText for value\n * extraction (the unified search runs on lowercased\n * text, but extraction needs original casing).\n */\nexport const processTriggerMatches = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText: string,\n rules: readonly TriggerRule[],\n): Entity[] => {\n const results: Entity[] = [];\n\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n\n const localIdx = idx - sliceStart;\n\n // Left word-boundary: reject if preceded by a\n // letter (prevents partial keyword matches).\n if (match.start > 0 && LETTER_RE.test(fullText[match.start - 1] ?? \"\")) {\n continue;\n }\n\n const rule = rules[localIdx];\n if (!rule) {\n continue;\n }\n\n // Right word-boundary: reject if followed by a\n // letter — but skip this check when the trigger\n // itself ends with whitespace (e.g., \"pan \",\n // \"město \") since the trailing space already\n // acts as a boundary delimiter.\n if (\n !rule.trigger.endsWith(\" \") &&\n LETTER_RE.test(fullText[match.end] ?? \"\")\n ) {\n continue;\n }\n\n const triggerEnd = match.end;\n const rawValue = extractValue(\n fullText,\n triggerEnd,\n rule.strategy,\n rule.label,\n );\n const value = rawValue ? stripQuotes(rawValue) : null;\n\n if (value) {\n // Apply declarative validations to the captured\n // value text (not the full entity including\n // trigger). This is intentional: validations\n // like min-length should test the extracted\n // value, not the trigger keyword itself.\n if (!applyValidations(value.text, rule.validations)) {\n continue;\n }\n\n // When includeTrigger is set, the entity span\n // starts at the trigger match, not the value.\n const entityStart = rule.includeTrigger ? match.start : value.start;\n const entityEnd = value.end;\n const entityText = fullText.slice(entityStart, entityEnd);\n\n // Legal form reclassification: any person-labeled\n // trigger whose captured text contains a definitive\n // legal form suffix is reclassified as organization.\n // This is universal — every person with a legal form\n // is an organisation, no per-group config needed.\n const effectiveLabel =\n rule.label === \"person\" && LEGAL_FORM_CHECK_RE.test(entityText)\n ? \"organization\"\n : rule.label;\n\n results.push({\n start: entityStart,\n end: entityEnd,\n label: effectiveLabel,\n text: entityText,\n score: TRIGGER_SCORE,\n source: DETECTION_SOURCES.TRIGGER,\n });\n }\n }\n\n return results;\n};\n\n// Re-export for testing\nexport { expandTriggerGroups, compileValidations, applyValidations };\n","/**\n * Geographic regions and country code mappings for\n * scoping deny list dictionaries.\n */\n\nexport const REGIONS = {\n Global: null,\n International: null,\n Europe: [\n \"AL\",\n \"AD\",\n \"AT\",\n \"BE\",\n \"BA\",\n \"BG\",\n \"HR\",\n \"CY\",\n \"CZ\",\n \"DK\",\n \"EE\",\n \"FI\",\n \"FR\",\n \"DE\",\n \"GR\",\n \"HU\",\n \"IS\",\n \"IE\",\n \"IT\",\n \"XK\",\n \"LV\",\n \"LI\",\n \"LT\",\n \"LU\",\n \"MD\",\n \"ME\",\n \"MK\",\n \"MT\",\n \"MC\",\n \"NL\",\n \"NO\",\n \"PL\",\n \"PT\",\n \"RO\",\n \"RS\",\n \"SK\",\n \"SI\",\n \"ES\",\n \"SE\",\n \"CH\",\n \"UA\",\n \"GB\",\n ],\n Americas: [\n \"US\",\n \"CA\",\n \"MX\",\n \"BR\",\n \"AR\",\n \"CL\",\n \"CO\",\n \"PE\",\n \"EC\",\n \"VE\",\n \"UY\",\n \"PY\",\n \"BO\",\n \"CR\",\n \"PA\",\n \"DO\",\n \"GT\",\n \"HN\",\n \"SV\",\n \"NI\",\n \"CU\",\n ],\n AsiaPacific: [\n \"AU\",\n \"NZ\",\n \"JP\",\n \"KR\",\n \"CN\",\n \"TW\",\n \"SG\",\n \"MY\",\n \"TH\",\n \"VN\",\n \"PH\",\n \"ID\",\n \"IN\",\n \"PK\",\n \"BD\",\n \"LK\",\n \"NP\",\n \"HK\",\n \"MO\",\n ],\n MENA: [\n \"AE\",\n \"SA\",\n \"IL\",\n \"TR\",\n \"EG\",\n \"JO\",\n \"LB\",\n \"IQ\",\n \"IR\",\n \"QA\",\n \"KW\",\n \"BH\",\n \"OM\",\n \"MA\",\n \"TN\",\n \"DZ\",\n \"LY\",\n \"SY\",\n \"YE\",\n \"PS\",\n ],\n SubSaharanAfrica: [\n \"ZA\",\n \"NG\",\n \"KE\",\n \"GH\",\n \"TZ\",\n \"ET\",\n \"SN\",\n \"CI\",\n \"CM\",\n \"UG\",\n \"RW\",\n \"MZ\",\n \"AO\",\n \"ZW\",\n \"BW\",\n \"NA\",\n \"MU\",\n ],\n EU: [\n \"AT\",\n \"BE\",\n \"BG\",\n \"HR\",\n \"CY\",\n \"CZ\",\n \"DK\",\n \"EE\",\n \"FI\",\n \"FR\",\n \"DE\",\n \"GR\",\n \"HU\",\n \"IE\",\n \"IT\",\n \"LV\",\n \"LT\",\n \"LU\",\n \"MT\",\n \"NL\",\n \"PL\",\n \"PT\",\n \"RO\",\n \"SK\",\n \"SI\",\n \"ES\",\n \"SE\",\n ],\n DACH: [\"DE\", \"AT\", \"CH\"],\n Nordics: [\"DK\", \"SE\", \"NO\", \"FI\", \"IS\"],\n CEE: [\"CZ\", \"SK\", \"PL\", \"HU\", \"RO\", \"BG\", \"HR\", \"SI\", \"LT\", \"LV\", \"EE\"],\n Anglosphere: [\"GB\", \"US\", \"CA\", \"AU\", \"NZ\", \"IE\"],\n Benelux: [\"BE\", \"NL\", \"LU\"],\n GulfStates: [\"AE\", \"SA\", \"QA\", \"KW\", \"BH\", \"OM\"],\n SouthAsia: [\"IN\", \"PK\", \"BD\", \"LK\", \"NP\"],\n EastAsia: [\"CN\", \"JP\", \"KR\", \"TW\"],\n SoutheastAsia: [\"SG\", \"MY\", \"TH\", \"VN\", \"PH\", \"ID\"],\n Oceania: [\"AU\", \"NZ\"],\n} as const;\n\nexport type RegionId = keyof typeof REGIONS;\n\ntype RegionArrays = {\n [K in RegionId]: (typeof REGIONS)[K];\n};\n\ntype NonNullRegion = {\n [K in RegionId as RegionArrays[K] extends null ? never : K]: RegionArrays[K];\n};\n\nexport type CountryCode = NonNullRegion[keyof NonNullRegion][number];\n\n/**\n * Expand region names to country codes and merge with\n * explicit country codes. Returns null when both inputs\n * are empty/undefined (meaning \"match all countries\").\n */\nexport const resolveCountries = (\n regions?: string[],\n countries?: string[],\n): Set<string> | null => {\n const hasRegions = regions && regions.length > 0;\n const hasCountries = countries && countries.length > 0;\n\n if (!hasRegions && !hasCountries) {\n return null;\n }\n\n const result = new Set<string>();\n\n const isRegion = (name: string): name is RegionId => name in REGIONS;\n\n if (hasRegions) {\n for (const name of regions) {\n if (!isRegion(name)) {\n continue;\n }\n const codes = REGIONS[name];\n if (codes === null) {\n // Global/International: return null (all)\n return null;\n }\n for (const code of codes) {\n result.add(code);\n }\n }\n }\n\n if (hasCountries) {\n for (const code of countries) {\n result.add(code);\n }\n }\n\n return result;\n};\n","import type { Entity } from \"../types\";\nimport type { PipelineContext } from \"../context\";\nimport { defaultContext } from \"../context\";\n\nconst TEMPLATE_PLACEHOLDER_RE = /^(?:\\.{3,}|_{3,}|\\[[\\w\\s]+\\]|\\{[\\w\\s]+\\})$/;\n\n// Patterns that indicate a genuine address (not prose).\nconst POSTAL_CODE_RE = /\\d{3}\\s?\\d{2}/;\nconst HAS_DIGIT_RE = /\\d/;\nconst ADDRESS_COMPONENTS_RE =\n /(?:^|\\s)(?:ul\\.|ulice|nám\\.|náměstí|tř\\.|třída|nábř\\.|nábřeží|č\\.p\\.|č\\.ev\\.|č\\.|sídliště|bulvár)(?=[\\s,./]|$)/i;\n\n// Jurisdiction patterns: \"State of X\", \"Commonwealth of X\",\n// \"District of X\", \"Territory of X\"\n// — valid address entities without digits or street words.\nconst JURISDICTION_RE = /^(?:state|commonwealth|district|territory)\\s+of\\s+/i;\n\n// Max entity text length by label. Prevents runaway\n// trigger extractions (e.g., \"město Dobříš i okolních\n// obcí...\") from producing absurdly long entities.\nconst MAX_ENTITY_LENGTH: Partial<Record<string, number>> = {\n organization: 80,\n person: 60,\n};\n// Section/clause numbers: \"§ 3\", \"3.2.1\", \"12.\" but NOT\n// dates like \"4.3.2026\" or long digit strings like IČO.\n// A section number has 1-3 digit groups of 1-3 digits each,\n// never ending with a 4-digit group (that's a year).\nconst SECTION_NUMBER_RE = /^(?:§\\s*)?\\d{1,3}(?:\\.\\d{1,3}){0,4}\\.?$/;\nconst STANDALONE_YEAR_RE = /^(?:19|20)\\d{2}$/;\n\n// Number-abbreviation prefixes: \"č.\", \"Nr.\", \"No.\", \"nr.\",\n// \"no.\", \"n.\", \"čís.\" — when a numeric entity is preceded\n// by one of these, it's a reference number, not PII.\nconst NUMBER_ABBREV_RE = /(?:^|[\\s(])(?:č|čís|nr|no|n)\\.\\s*$/i;\nconst SIGNING_CLAUSE_ADDRESS_RE = /^(?:v|ve)\\s+[^\\d,\\n]{1,40},?\\s+dne$/iu;\nconst PERSON_TRAILING_NOUNS: ReadonlySet<string> = new Set([\n \"association\",\n \"period\",\n \"reform\",\n]);\nconst LEGAL_FORM_HEADING_RE = /\\b(?:agreement|amendment|contract|exhibit)\\b/iu;\nconst LEADING_ARTIFACT_RE = /^(?:\\.\\s)+/u;\nconst ADDRESS_ROLE_PREFIX_RE =\n /^(?:prodávajícího|kupujícího|objednatele|zhotovitele|pronajímatele|dodavatele|odběratele|zaměstnance|zaměstnavatele|nájemce)\\s+(?=(?:\\p{Lu}|\\d|ul\\.?|ulice|nám\\.?|náměstí|tř\\.?|třída|nábř\\.?|nábřeží|č\\.p\\.?|č\\.ev\\.?|sídliště))/iu;\nconst ADDRESS_INLINE_ABBREV_AFTER_RE =\n /^(?:\\p{Lu}[\\p{L}\\p{M}]{0,3}\\.|ul\\.?|nám\\.?|tř\\.?|nábř\\.?|č\\.p\\.?|č\\.ev\\.?)/u;\nconst ADDRESS_INLINE_ABBREV_BEFORE_RE =\n /(?:^|[\\s,])(?:st|ave|rd|dr|blvd|ln|hwy|pkwy|cir|ct|pl|sq|ter|trl|ste|apt|bldg|fl|ul|nám|tř|nábř|č\\.p|č\\.ev)$/iu;\nconst ADDRESS_CONTINUATION_WORD_RE =\n /^(?:suite|building|floor|unit|apartment|room|tower|wing|block|bldg|ste|apt|fl)\\b/iu;\n\nconst trimTrailingAddressProse = (text: string): string => {\n for (const match of text.matchAll(/\\.(?=\\s+\\p{Lu})/gu)) {\n const cutoff = match.index;\n if (cutoff === undefined) {\n continue;\n }\n const before = text.slice(0, cutoff);\n if (!HAS_DIGIT_RE.test(before)) {\n continue;\n }\n const after = text.slice(cutoff + 1).trimStart();\n if (\n after.length < 5 ||\n ADDRESS_INLINE_ABBREV_AFTER_RE.test(after) ||\n ADDRESS_INLINE_ABBREV_BEFORE_RE.test(before.trimEnd()) ||\n ADDRESS_CONTINUATION_WORD_RE.test(after)\n ) {\n continue;\n }\n return before.trimEnd();\n }\n\n return text;\n};\n\nconst normalizeEntity = (entity: Entity): Entity | null => {\n let start = entity.start;\n let text = entity.text;\n\n const trimLeading = (re: RegExp) => {\n const match = re.exec(text);\n if (!match) {\n return;\n }\n start += match[0].length;\n text = text.slice(match[0].length);\n };\n\n trimLeading(LEADING_ARTIFACT_RE);\n trimLeading(/^\\s+/u);\n\n if (entity.label === \"address\") {\n trimLeading(ADDRESS_ROLE_PREFIX_RE);\n text = trimTrailingAddressProse(text);\n }\n\n const trailingMatch = /[,\\s]+$/u.exec(text);\n if (trailingMatch) {\n text = text.slice(0, text.length - trailingMatch[0].length);\n }\n\n if (text.length === 0) {\n return null;\n }\n\n return {\n ...entity,\n start,\n end: start + text.length,\n text,\n };\n};\n\n// ── Generic roles (lazy-loaded from JSON) ────────────\n\nconst EMPTY_GENERIC_ROLES: ReadonlySet<string> = new Set();\n\n/**\n * Load generic-roles.json and cache the result on the\n * given context. Must be awaited during pipeline init\n * so the sync accessor is populated before\n * filterFalsePositives runs.\n */\nexport const loadGenericRoles = (\n ctx: PipelineContext = defaultContext,\n): Promise<ReadonlySet<string>> => {\n if (ctx.genericRolesPromise) {\n return ctx.genericRolesPromise;\n }\n ctx.genericRolesPromise = (async () => {\n try {\n const mod: {\n default?: { roles?: string[] };\n } = await import(\"@stll/anonymize-data/config/generic-roles.json\");\n const set: ReadonlySet<string> = new Set(mod.default?.roles ?? []);\n ctx.genericRoles = set;\n return set;\n } catch {\n const empty: ReadonlySet<string> = new Set();\n ctx.genericRoles = empty;\n return empty;\n }\n })();\n return ctx.genericRolesPromise;\n};\n\n/** Sync accessor — returns empty set before init. */\nconst getGenericRoles = (ctx: PipelineContext): ReadonlySet<string> =>\n ctx.genericRoles ?? EMPTY_GENERIC_ROLES;\n\n/**\n * Filter out entities that are likely false positives:\n * template placeholders, clause/section numbers,\n * standalone years, and generic legal role terms.\n *\n * Runs as a post-processing step after all detection\n * layers have merged.\n */\nexport const filterFalsePositives = (\n entities: Entity[],\n ctx: PipelineContext = defaultContext,\n fullText?: string,\n): Entity[] => {\n const filtered: Entity[] = [];\n const roles = getGenericRoles(ctx);\n\n for (const entity of entities) {\n const normalized = normalizeEntity(entity);\n if (!normalized) {\n continue;\n }\n\n // Strip leading \". \" artifacts from trigger extraction\n // after abbreviations (\"dat. nar.\", \"č.p.\").\n const trimmed = normalized.text;\n\n if (TEMPLATE_PLACEHOLDER_RE.test(trimmed)) {\n continue;\n }\n // Reject entities exceeding max length for their\n // label (prevents runaway trigger extractions).\n // Exempt legal-form entities: their span is already\n // bounded by the regex pattern, not open-ended.\n const maxLen = MAX_ENTITY_LENGTH[normalized.label];\n if (\n maxLen &&\n trimmed.length > maxLen &&\n normalized.source !== \"legal-form\"\n ) {\n continue;\n }\n // Section numbers (§ 3, 3.2.1, 12.) are false\n // positives unless they were captured by a trigger\n // phrase (e.g., \"č.p. 92\" is an address, not a\n // section number).\n if (SECTION_NUMBER_RE.test(trimmed) && normalized.source !== \"trigger\") {\n continue;\n }\n // Standalone years (2022, 1995) without a trigger\n // context are noise. Trigger-sourced years are\n // valid (\"rok 2022\", \"year 2019\").\n if (STANDALONE_YEAR_RE.test(trimmed) && normalized.source !== \"trigger\") {\n continue;\n }\n\n // Numeric entities preceded by a number abbreviation\n // (\"č.\", \"Nr.\", \"No.\") are usually reference\n // numbers, not PII. Apply this only to non-trigger\n // entities: trigger-based detections intentionally\n // use these abbreviations as their semantic anchor\n // (e.g. \"parc. č. 852/2\", \"LV č. 154\",\n // \"Flurstück Nr. 1234\").\n if (\n fullText &&\n normalized.source !== \"trigger\" &&\n /^\\d/.test(trimmed) &&\n NUMBER_ABBREV_RE.test(\n fullText.slice(Math.max(0, normalized.start - 10), normalized.start),\n )\n ) {\n continue;\n }\n\n if (\n normalized.label === \"registration number\" &&\n /^[\\p{L}]{1,2}$/u.test(trimmed)\n ) {\n continue;\n }\n\n // Person names never contain digits.\n // \"Solution Pack ABL90 Flex\" → reject.\n if (normalized.label === \"person\" && HAS_DIGIT_RE.test(trimmed)) {\n continue;\n }\n\n if (normalized.label === \"person\") {\n const tokens = trimmed.split(/\\s+/u);\n const last = tokens\n .at(-1)\n ?.replace(/[.,;:!?]+$/u, \"\")\n .toLowerCase();\n if (tokens.length > 1 && last && PERSON_TRAILING_NOUNS.has(last)) {\n continue;\n }\n }\n\n if (\n (normalized.label === \"person\" || normalized.label === \"organization\") &&\n roles.has(trimmed.toLowerCase())\n ) {\n continue;\n }\n\n if (\n normalized.label === \"organization\" &&\n normalized.source === \"legal-form\" &&\n trimmed === trimmed.toUpperCase() &&\n LEGAL_FORM_HEADING_RE.test(trimmed)\n ) {\n continue;\n }\n\n // Reject long address entities that look like prose:\n // no digits, no postal code, no known address\n // component (street abbreviations, etc.).\n if (\n normalized.label === \"address\" &&\n trimmed.length > 40 &&\n !POSTAL_CODE_RE.test(trimmed) &&\n !HAS_DIGIT_RE.test(trimmed) &&\n !ADDRESS_COMPONENTS_RE.test(trimmed) &&\n !JURISDICTION_RE.test(trimmed)\n ) {\n continue;\n }\n\n // Reject ANY trigger-sourced address without digits\n // and without a known street-type word. Catches\n // non-address text like \"Nejsme plátci DPH !\".\n // Exempt jurisdiction patterns (\"State of ...\",\n // \"Commonwealth of ...\") which are valid addresses\n // without digits.\n if (\n normalized.label === \"address\" &&\n normalized.source === \"trigger\" &&\n !HAS_DIGIT_RE.test(trimmed) &&\n !ADDRESS_COMPONENTS_RE.test(trimmed) &&\n !JURISDICTION_RE.test(trimmed)\n ) {\n continue;\n }\n\n if (\n normalized.label === \"address\" &&\n SIGNING_CLAUSE_ADDRESS_RE.test(trimmed)\n ) {\n continue;\n }\n\n filtered.push(normalized);\n }\n\n return filtered;\n};\n","/**\n * Normalize typographic variants for search matching.\n *\n * Legal documents (especially Czech/German) use\n * non-breaking spaces, smart quotes, and en/em dashes\n * that differ from their ASCII equivalents. Since all\n * replacements are same-length (single code unit →\n * single code unit), character offsets remain valid.\n *\n * Lives here (application layer) rather than in the\n * AC library: what to normalize is domain-specific.\n *\n * Uses a char-code lookup (`Map<number, number>`) and\n * `Uint16Array` instead of 7 sequential `replaceAll`\n * calls. For a 50 KB document this eliminates ~350 KB\n * of intermediate string allocations.\n *\n * When no replaceable characters are present (common\n * for plain-text inputs), a fast-path scan returns the\n * original string without any allocation. When special\n * characters exist, the string is scanned twice: once\n * to detect, once to build the replacement array.\n */\n\nconst REPLACEMENTS: readonly [number, number][] = [\n [0x00a0, 0x0020], // NBSP → space\n [0x2007, 0x0020], // figure space → space\n [0x202f, 0x0020], // narrow NBSP → space\n [0x2013, 0x002d], // en-dash → hyphen\n [0x2014, 0x002d], // em-dash → hyphen\n [0x201c, 0x0022], // left smart quote → \"\n [0x201d, 0x0022], // right smart quote → \"\n];\n\nconst CHAR_MAP = new Map<number, number>(REPLACEMENTS);\n\n/** Chunk size for `String.fromCharCode` to avoid\n * hitting the call-stack limit on very large strings. */\nconst CHUNK_SIZE = 8192;\n\nexport const normalizeForSearch = (text: string): string => {\n // Fast path: skip allocation when nothing to replace.\n let hasSpecial = false;\n for (let i = 0; i < text.length; i++) {\n if (CHAR_MAP.has(text.charCodeAt(i))) {\n hasSpecial = true;\n break;\n }\n }\n if (!hasSpecial) return text;\n\n // Second pass: build output via Uint16Array.\n const len = text.length;\n const codes = new Uint16Array(len);\n for (let i = 0; i < len; i++) {\n const code = text.charCodeAt(i);\n codes[i] = CHAR_MAP.get(code) ?? code;\n }\n\n // Convert in chunks to avoid stack overflow on\n // spread of large arrays.\n if (len <= CHUNK_SIZE) {\n return String.fromCharCode(...codes);\n }\n\n let result = \"\";\n for (let offset = 0; offset < len; offset += CHUNK_SIZE) {\n const end = Math.min(offset + CHUNK_SIZE, len);\n result += String.fromCharCode(...codes.subarray(offset, end));\n }\n return result;\n};\n","import type { Match } from \"@stll/text-search\";\n\nimport {\n getNameCorpusFirstNames,\n getNameCorpusSurnames,\n getNameCorpusTitles,\n initNameCorpus,\n} from \"./names\";\nimport { resolveCountries } from \"../regions\";\nimport { DETECTION_SOURCES } from \"../types\";\nimport type { Entity, PipelineConfig } from \"../types\";\nimport type { PipelineContext } from \"../context\";\nimport { defaultContext } from \"../context\";\nimport { loadGenericRoles } from \"../filters/false-positives\";\nimport { normalizeForSearch } from \"../util/normalize\";\nimport { ALL_UPPER_RE, UPPER_START_RE } from \"../util/text\";\nimport { DASH } from \"../util/char-groups\";\n\n/**\n * Try to load the optional @stll/anonymize-data package.\n * Returns null if not installed.\n */\nconst loadDataModule = async (): Promise<\n typeof import(\"@stll/anonymize-data\") | null\n> => {\n try {\n return await import(\"@stll/anonymize-data\");\n } catch {\n return null;\n }\n};\n\nexport type DenyListConfig = Pick<\n PipelineConfig,\n | \"enableDenyList\"\n | \"enableNameCorpus\"\n | \"denyListCountries\"\n | \"denyListRegions\"\n | \"denyListExcludeCategories\"\n>;\n\n// ── Allow list (lazy-loaded from JSON) ───────────────\n\nconst loadAllowList = (ctx: PipelineContext): Promise<ReadonlySet<string>> => {\n if (ctx.allowListPromise) return ctx.allowListPromise;\n ctx.allowListPromise = (async () => {\n try {\n const mod: {\n default?: { words?: string[] };\n } = await import(\"@stll/anonymize-data/config/allow-list.json\");\n const set: ReadonlySet<string> = new Set(mod.default?.words ?? []);\n ctx.allowList = set;\n return set;\n } catch {\n const empty: ReadonlySet<string> = new Set();\n ctx.allowList = empty;\n return empty;\n }\n })();\n return ctx.allowListPromise;\n};\n\nconst EMPTY_ALLOW_LIST: ReadonlySet<string> = new Set();\n\n/** Sync accessor — returns empty set before init. */\nconst getAllowList = (ctx: PipelineContext): ReadonlySet<string> =>\n ctx.allowList ?? EMPTY_ALLOW_LIST;\n\n/**\n * Common EU given names present in the stopwords-iso dataset\n * but absent from the first-name corpus. Without this\n * supplementary set, these names would pass through the\n * corpus-based filter and remain in the stopwords, silently\n * suppressing person detection.\n *\n * Sourced from EU member state birth registries (top-100\n * names) cross-referenced with stopwords.json.\n */\nconst SUPPLEMENTARY_NAME_EXCLUSIONS: ReadonlySet<string> = new Set([\n \"ana\",\n \"ben\",\n \"dan\",\n \"eden\",\n \"ella\",\n \"ina\",\n \"jo\",\n \"kai\",\n \"lena\",\n \"may\",\n \"mia\",\n \"sam\",\n \"sara\",\n \"sue\",\n \"tim\",\n \"tom\",\n]);\n\n/**\n * Names from the first-name corpus (lowercased) that also\n * appear in the stopwords-iso dataset, plus supplementary\n * common EU given names not in the corpus. These must be\n * kept out of global STOPWORDS so that person detection is\n * not silently suppressed for real given names.\n *\n * Computed lazily after initNameCorpus() has populated\n * the first-name corpus. Re-builds if corpus size changes.\n */\nconst getFirstNameExclusions = (ctx: PipelineContext): ReadonlySet<string> => {\n const corpus = getNameCorpusFirstNames(ctx);\n // Re-build if corpus has been populated since last call\n if (\n ctx.firstNameExclusions &&\n corpus.length === ctx.firstNameExclusionCorpusLen\n ) {\n return ctx.firstNameExclusions;\n }\n ctx.firstNameExclusionCorpusLen = corpus.length;\n const set: ReadonlySet<string> = new Set([\n ...corpus.map((n) => n.toLowerCase()),\n ...SUPPLEMENTARY_NAME_EXCLUSIONS,\n ]);\n ctx.firstNameExclusions = set;\n return set;\n};\n\n/**\n * Global stopwords: common words across 23 EU languages\n * sourced from the stopwords-iso dataset (MIT license).\n * Checked case-insensitively against matches.\n *\n * Entries that collide with the first-name corpus are\n * excluded so they can still be detected as person names.\n *\n * Regenerate: bun packages/data/scripts/generate-stopwords.ts\n */\n\n// INVARIANT: must be called after initNameCorpus() has\n// resolved, so getFirstNameExclusions() sees the full\n// corpus. buildDenyList() enforces this ordering.\nconst loadStopwords = (ctx: PipelineContext): Promise<ReadonlySet<string>> => {\n if (ctx.stopwordsPromise) return ctx.stopwordsPromise;\n ctx.stopwordsPromise = (async () => {\n try {\n const mod: { default?: string[] } =\n await import(\"@stll/anonymize-data/config/stopwords.json\");\n const list = (mod.default ?? []).filter(\n (w: string) => !getFirstNameExclusions(ctx).has(w),\n );\n const set: ReadonlySet<string> = new Set(list);\n ctx.stopwords = set;\n return set;\n } catch (err) {\n console.warn(\n \"[anonymize] Failed to load stopwords.json\" +\n \" — stopword filtering disabled:\",\n err,\n );\n const empty: ReadonlySet<string> = new Set();\n ctx.stopwords = empty;\n return empty;\n }\n })();\n return ctx.stopwordsPromise;\n};\n\nconst EMPTY_STOPWORDS: ReadonlySet<string> = new Set();\n\n/** Sync accessor — returns empty set before init. */\nconst getStopwords = (ctx: PipelineContext): ReadonlySet<string> =>\n ctx.stopwords ?? EMPTY_STOPWORDS;\n\n// ── Person stopwords (lazy-loaded from JSON) ─────────\n\nconst loadPersonStopwords = (\n ctx: PipelineContext,\n): Promise<ReadonlySet<string>> => {\n if (ctx.personStopwordsPromise) {\n return ctx.personStopwordsPromise;\n }\n ctx.personStopwordsPromise = (async () => {\n try {\n const mod: {\n default?: { words?: string[] };\n } = await import(\"@stll/anonymize-data/config/person-stopwords.json\");\n const set: ReadonlySet<string> = new Set(mod.default?.words ?? []);\n ctx.personStopwords = set;\n return set;\n } catch {\n const empty: ReadonlySet<string> = new Set();\n ctx.personStopwords = empty;\n return empty;\n }\n })();\n return ctx.personStopwordsPromise;\n};\n\nconst EMPTY_PERSON_STOPWORDS: ReadonlySet<string> = new Set();\n\n/** Sync accessor — returns empty set before init. */\nconst getPersonStopwords = (ctx: PipelineContext): ReadonlySet<string> =>\n ctx.personStopwords ?? EMPTY_PERSON_STOPWORDS;\n\nconst PERSON_CHAIN_BREAK_RE = /[!?;:]|,/u;\n\nconst isInitialContinuationGap = (text: string, gap: string): boolean =>\n (/^\\p{Lu}$/u.test(text) && /^\\.[^\\S\\n]{1,2}$/u.test(gap)) ||\n /^[^\\S\\n]{1,2}(?:\\p{Lu}\\.[^\\S\\n]{1,2})+$/u.test(gap);\n\n/**\n * Source tag for each pattern in the automaton.\n * \"deny-list\" = standard deny list entry\n * \"first-name\" = name corpus first name\n * \"surname\" = name corpus surname\n * \"title\" = academic/professional title\n */\ntype PatternSource = \"deny-list\" | \"first-name\" | \"surname\" | \"title\";\n\n/**\n * Pre-built deny list data. Constructed once by\n * `buildDenyList`, reused across `processDenyListMatches`\n * calls. Contains PatternEntry[] for the unified builder\n * plus parallel label/source arrays for post-processing.\n */\nexport type DenyListData = {\n /**\n * Maps pattern index → entity labels (plural).\n * Same pattern can have multiple labels when it\n * appears in multiple dictionaries (e.g., \"Denver\"\n * is both a person name and a city name).\n */\n labels: string[][];\n /** Maps pattern index → original pattern text. */\n originals: string[];\n /** Maps pattern index → source types (plural). */\n sources: PatternSource[][];\n};\n\n/**\n * Resolve which dictionaries to load based on country\n * and category filters, load them, and build the deny\n * list data. The returned data provides PatternEntry[]\n * for the unified builder and parallel arrays for\n * post-processing.\n *\n * Requires `@stll/anonymize-data` to be installed.\n * Returns null if the data package is not available.\n */\nexport const buildDenyList = async (\n config: DenyListConfig,\n ctx: PipelineContext = defaultContext,\n): Promise<DenyListData | null> => {\n // Pre-load name corpus so getNameCorpus*() accessors\n // and getFirstNameExclusions() are populated before\n // stopwords filtering runs.\n await initNameCorpus(ctx);\n // Pre-load all JSON data so sync accessors are\n // populated before processDenyListMatches runs.\n await Promise.all([\n loadStopwords(ctx),\n loadAllowList(ctx),\n loadPersonStopwords(ctx),\n loadGenericRoles(ctx),\n ]);\n const dataModule = await loadDataModule();\n if (!dataModule) {\n return null;\n }\n\n const allowedCountries = resolveCountries(\n config.denyListRegions,\n config.denyListCountries,\n );\n\n const excluded = config.denyListExcludeCategories;\n const excludeCategories = excluded ? new Set(excluded) : new Set<string>();\n\n const allIds = [...dataModule.ALL_DICTIONARY_IDS];\n\n const ids = allIds.filter((id) => {\n const meta = dataModule.DICTIONARY_META[id];\n if (!meta) {\n return false;\n }\n\n if (!config.enableNameCorpus && meta.category === \"Names\") {\n return false;\n }\n\n if (excludeCategories.has(meta.category)) {\n return false;\n }\n\n if (allowedCountries === null) {\n return true;\n }\n\n if (meta.country === null) {\n return true;\n }\n\n return allowedCountries.has(meta.country);\n });\n\n const patternList: string[] = [];\n const labelList: string[][] = [];\n const sourceList: PatternSource[][] = [];\n // Maps lowercased pattern → index in patternList\n // for accumulating labels from multiple dictionaries\n const patternIndex = new Map<string, number>();\n\n const results = await Promise.all(\n ids.map(async (id) => {\n const entries = await dataModule.loadDictionary(id);\n return { id, entries };\n }),\n );\n\n const addDenyListEntry = (entry: string, label: string) => {\n // Strip | and \\ only — these caused the 12K FP\n // bug (| creates empty regex alternation, \\ is\n // an escape prefix). Other chars like () [] are\n // kept since they appear in real dictionary\n // entries and are matched literally by AC.\n const normalized = normalizeForSearch(entry).replace(/[|\\\\]/g, \"\");\n if (normalized.length === 0) {\n return;\n }\n const lower = normalized.toLowerCase();\n const existing = patternIndex.get(lower);\n if (existing !== undefined) {\n if (!labelList[existing]!.includes(label)) {\n labelList[existing]!.push(label);\n }\n if (!sourceList[existing]!.includes(\"deny-list\")) {\n sourceList[existing]!.push(\"deny-list\");\n }\n } else {\n patternIndex.set(lower, patternList.length);\n patternList.push(normalized);\n labelList.push([label]);\n sourceList.push([\"deny-list\"]);\n }\n };\n\n for (const { id, entries } of results) {\n const meta = dataModule.DICTIONARY_META[id];\n if (!meta) {\n continue;\n }\n for (const entry of entries) {\n addDenyListEntry(entry, meta.label);\n }\n }\n\n // Load city dictionaries dynamically for all\n // allowed countries. Cities cover 230 countries\n // via GeoNames and are loaded separately from\n // the static dictionary registry.\n if (!excludeCategories.has(\"Places\")) {\n const cityCountries =\n allowedCountries !== null\n ? [...allowedCountries]\n : // No country filter — load all. In practice\n // this would be massive, so limit to a\n // reasonable set of common legal jurisdictions.\n [\n \"AT\",\n \"AU\",\n \"BE\",\n \"BG\",\n \"BR\",\n \"CA\",\n \"CH\",\n \"CZ\",\n \"DE\",\n \"DK\",\n \"ES\",\n \"FI\",\n \"FR\",\n \"GB\",\n \"GR\",\n \"HR\",\n \"HU\",\n \"IE\",\n \"IT\",\n \"LU\",\n \"NL\",\n \"NO\",\n \"NZ\",\n \"PL\",\n \"PT\",\n \"RO\",\n \"SE\",\n \"SI\",\n \"SK\",\n \"US\",\n ];\n const cityEntries = await dataModule.loadCityDictionaries(cityCountries);\n for (const entry of cityEntries) {\n addDenyListEntry(entry, \"address\");\n }\n }\n\n // Add name corpus entries — accumulate labels\n // for entries that already exist from deny-list.\n const addNameEntry = (name: string, source: PatternSource) => {\n // Normalize same as deny-list entries so name\n // patterns match against normalizeForSearch(text).\n const normalized = normalizeForSearch(name).replace(/[|\\\\]/g, \"\");\n if (normalized.length === 0) {\n return;\n }\n const lower = normalized.toLowerCase();\n const existing = patternIndex.get(lower);\n if (existing !== undefined) {\n if (!labelList[existing]!.includes(\"person\")) {\n labelList[existing]!.push(\"person\");\n }\n if (!sourceList[existing]!.includes(source)) {\n sourceList[existing]!.push(source);\n }\n } else {\n patternIndex.set(lower, patternList.length);\n patternList.push(normalized);\n labelList.push([\"person\"]);\n sourceList.push([source]);\n }\n };\n\n if (config.enableNameCorpus && !excludeCategories.has(\"Names\")) {\n for (const name of getNameCorpusFirstNames(ctx)) {\n addNameEntry(name, \"first-name\");\n }\n for (const name of getNameCorpusSurnames(ctx)) {\n addNameEntry(name, \"surname\");\n }\n for (const title of getNameCorpusTitles(ctx)) {\n const norm = normalizeForSearch(title).replace(/[|\\\\]/g, \"\");\n if (norm.length === 0) continue;\n const lower = norm.toLowerCase();\n const existing = patternIndex.get(lower);\n if (existing !== undefined) {\n if (!sourceList[existing]!.includes(\"title\")) {\n sourceList[existing]!.push(\"title\");\n }\n } else {\n patternIndex.set(lower, patternList.length);\n patternList.push(norm);\n labelList.push([\"person\"]);\n sourceList.push([\"title\"]);\n }\n }\n }\n\n if (patternList.length === 0) {\n return null;\n }\n\n return {\n labels: labelList,\n originals: patternList,\n sources: sourceList,\n };\n};\n\ntype RawMatch = {\n start: number;\n end: number;\n /** All labels for this pattern (e.g., [\"person\", \"address\"]). */\n labels: string[];\n text: string;\n patternIdx: number;\n};\n\n/**\n * Ensure all deny-list support data (stopwords, allow\n * list, person stopwords, generic roles) is loaded on\n * the given context. Call this before\n * processDenyListMatches / filterFalsePositives when\n * the search instance was built on a different context\n * (e.g. cachedSearch).\n */\nexport const ensureDenyListData = async (\n ctx: PipelineContext = defaultContext,\n): Promise<void> => {\n // INVARIANT: initNameCorpus must resolve before\n // loadStopwords so first-name exclusions are\n // available when computing the stopword set.\n await initNameCorpus(ctx);\n await Promise.all([\n loadStopwords(ctx),\n loadAllowList(ctx),\n loadPersonStopwords(ctx),\n loadGenericRoles(ctx),\n ]);\n};\n\n// ── Match processor ─────────────────────────────────\n\n/**\n * Process deny list matches from the unified search.\n * Receives all matches; filters to the deny list slice\n * via sliceStart/sliceEnd. Local index into data.labels,\n * data.originals, data.sources is match.pattern - sliceStart.\n *\n * Two-pass approach to reduce false positives:\n * 1. Collect all matches (case-insensitive,\n * whole-word via Rust automaton)\n * 2. Require uppercase start in source text\n * 3. For person names, require at least one\n * mid-sentence occurrence to prove proper noun\n * 4. Return all occurrences of validated terms\n */\nexport const processDenyListMatches = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText: string,\n data: DenyListData,\n ctx: PipelineContext = defaultContext,\n): Entity[] => {\n // Pass 1: collect valid matches grouped by pattern\n const matchesByPattern = new Map<number, RawMatch[]>();\n\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n\n const localIdx = idx - sliceStart;\n\n const sourceChar = fullText[match.start] ?? \"\";\n if (!UPPER_START_RE.test(sourceChar)) {\n continue;\n }\n\n // Use original text for display; normalized was\n // only for the AC search.\n const matchText = fullText.slice(match.start, match.end);\n const keyword = matchText.toLowerCase();\n if (getStopwords(ctx).has(keyword) || getAllowList(ctx).has(keyword)) {\n continue;\n }\n\n // Skip ALL-CAPS tokens (likely acronyms, not PII)\n // unless surrounding context is also all-caps\n if (ALL_UPPER_RE.test(matchText)) {\n continue;\n }\n\n const labels = data.labels[localIdx];\n if (!labels || labels.length === 0) {\n continue;\n }\n\n const entry: RawMatch = {\n start: match.start,\n end: match.end,\n labels,\n text: matchText,\n patternIdx: localIdx,\n };\n\n const existing = matchesByPattern.get(localIdx);\n if (existing) {\n existing.push(entry);\n } else {\n matchesByPattern.set(localIdx, [entry]);\n }\n }\n\n // Pass 2: process all matches\n const results: Entity[] = [];\n const nameHits: RawMatch[] = [];\n\n for (const [, matches] of Array.from(matchesByPattern)) {\n const first = matches[0];\n if (!first) {\n continue;\n }\n\n const hasPerson = first.labels.includes(\"person\");\n const nonPersonLabels = first.labels.filter((l) => l !== \"person\");\n\n // Person hits go to chain scoring (Pass 2b).\n // Skip words that are valid places/orgs but not\n // person names (months, states, languages).\n if (hasPerson) {\n const keyword = first.text.toLowerCase();\n if (!getPersonStopwords(ctx).has(keyword)) {\n for (const m of matches) {\n nameHits.push(m);\n }\n }\n }\n\n // Emit entities for all non-person labels\n for (const m of matches) {\n for (const label of nonPersonLabels) {\n results.push({\n start: m.start,\n end: m.end,\n label,\n text: m.text,\n score: 0.9,\n source: DETECTION_SOURCES.DENY_LIST,\n });\n }\n }\n }\n\n // Pass 2b: person hits — chain adjacent hits and\n // extend to following capitalised words.\n nameHits.sort((a, b) => a.start - b.start);\n\n const nameConsumed = new Set<number>();\n for (let i = 0; i < nameHits.length; i++) {\n if (nameConsumed.has(i)) {\n continue;\n }\n const hit = nameHits[i];\n if (!hit) {\n continue;\n }\n\n // Build chain of adjacent person hits\n const chain: RawMatch[] = [hit];\n let j = i + 1;\n\n while (j < nameHits.length && chain.length < 5) {\n const next = nameHits[j];\n if (!next) {\n break;\n }\n const prev = chain.at(-1);\n if (!prev) {\n break;\n }\n\n const gap = fullText.slice(prev.end, next.start);\n const breaksOnPeriod =\n gap.includes(\".\") && !isInitialContinuationGap(prev.text, gap);\n if (\n gap.length > 4 ||\n gap.length === 0 ||\n gap.includes(\"\\n\") ||\n gap.includes(\"\\t\") ||\n PERSON_CHAIN_BREAK_RE.test(gap) ||\n breaksOnPeriod\n ) {\n break;\n }\n\n chain.push(next);\n j++;\n }\n\n // Mark chain members consumed\n for (let k = i; k < i + chain.length; k++) {\n nameConsumed.add(k);\n }\n\n // Extend to following capitalised word (for\n // unknown surnames not in the corpus)\n const first = chain.at(0);\n const last = chain.at(-1);\n if (!first || !last) {\n continue;\n }\n\n const extended = extendPersonName(fullText, first.start, last.end, ctx);\n\n // Score: chained names get 0.9, single names 0.5\n const score = chain.length >= 2 ? 0.9 : 0.5;\n\n // Single-word deny-list matches are too noisy:\n // \"Rate\", \"Server\", \"Code\" etc. are surnames but\n // also common English words. Only accept single-\n // word matches when the next word is also uppercase\n // (likely a full name: \"Alena Zemanová\").\n if (chain.length === 1) {\n const afterEnd = last.end;\n const rest = fullText.slice(afterEnd).trimStart();\n const nextIsUpper = rest.length > 1 && /^\\p{Lu}\\p{Ll}/u.test(rest);\n if (!nextIsUpper) {\n continue;\n }\n }\n\n results.push({\n start: first.start,\n end: extended.end,\n label: \"person\",\n text: extended.text,\n score,\n source: DETECTION_SOURCES.DENY_LIST,\n });\n }\n\n // Post-process: extend city/address matches to\n // include adjacent trailing district numbers (e.g.,\n // \"Praha 1\", \"Brno 2\"). Czech and Slovak cities\n // commonly have numbered districts that are part of\n // the address.\n extendCityDistricts(results, fullText);\n\n return results;\n};\n\n/**\n * Extend address-label entities to absorb adjacent\n * integers: trailing district numbers (\"Praha 1\") and\n * leading postal codes (\"80336 München\").\n * Mutates the entities in place.\n */\n// District suffixes: digits (\"Praha 1\") or Roman\n// numerals (\"Příbram II\", \"Brno III\")\n// Valid Roman numerals only (I-XXX range, no invalid\n// combos like IC, LC, VC). Covers district suffixes\n// up to Praha XXX which is more than enough.\n// Roman numeral district suffixes II-XXX. Standalone\n// \"I\" and \"V\" excluded: \"V\" clashes with Czech\n// preposition \"in\"; \"I\" is too ambiguous.\nconst ROMAN_DISTRICT =\n \"XXX|XXIX|XXVIII|XXVII|XXVI|XXV|XXIV|XXIII\" +\n \"|XXII|XXI|XX|XIX|XVIII|XVII|XVI|XV|XIV|XIII\" +\n \"|XII|XI|X|IX|VIII|VII|VI|IV|III|II\";\nconst DISTRICT_SUFFIX_RE = new RegExp(\n `^ (\\\\d{1,2}(?!\\\\d)|(?:${ROMAN_DISTRICT}))` + `(?=[\\\\s,;.)\"\\\\n]|$)`,\n);\n// Postal code before city: \"163 00 \", \"16300 \",\n// \"16300 - \" (with dash separator).\nconst POSTAL_PREFIX_RE = new RegExp(\n `(?:\\\\d{5}|\\\\d{3}\\\\s\\\\d{2})\\\\s*${DASH}?\\\\s*$`,\n);\n\n// Words that must NOT be absorbed into an address span\n// when they follow a postal-code + city pattern. Party\n// roles, organizational nouns, and common legal terms.\nconst TRAILING_WORD_EXCLUSIONS: ReadonlySet<string> = new Set([\n // CZ/SK party roles\n \"nájemce\",\n \"pronajímatel\",\n \"kupující\",\n \"prodávající\",\n \"objednatel\",\n \"zhotovitel\",\n \"dodavatel\",\n \"odběratel\",\n \"věřitel\",\n \"dlužník\",\n \"zadavatel\",\n \"uchazeč\",\n \"příjemce\",\n \"plátce\",\n // Organizational nouns\n \"správa\",\n \"sekretariát\",\n \"kancelář\",\n \"odbor\",\n \"oddělení\",\n \"úřad\",\n \"inspekce\",\n \"agentura\",\n // Legal clause starters\n \"článek\",\n \"smlouva\",\n \"dodatek\",\n \"příloha\",\n \"předmět\",\n \"podmínky\",\n \"ustanovení\",\n]);\n\nconst extendCityDistricts = (entities: Entity[], fullText: string): void => {\n for (const entity of entities) {\n if (entity.label !== \"address\") {\n continue;\n }\n\n // Trailing: \"Praha\" + \" 1\" → \"Praha 1\"\n // Trailing: \"Praha\" + \" 1\" → \"Praha 1\"\n const afterMatch = fullText.slice(entity.end);\n const suffixM = DISTRICT_SUFFIX_RE.exec(afterMatch);\n if (suffixM) {\n entity.end += suffixM[0].length;\n entity.text = fullText.slice(entity.start, entity.end);\n }\n\n // Dash-separated district name:\n // \"Praha 10 - Strašnice\", \"Havířov – Město\"\n const afterDistrict = fullText.slice(entity.end);\n const dashDistrictM = /^[\\s]*[-–][\\s]*(\\p{Lu}\\p{Ll}+)/u.exec(afterDistrict);\n if (dashDistrictM && !dashDistrictM[0].includes(\"\\n\")) {\n entity.end += dashDistrictM[0].length;\n entity.text = fullText.slice(entity.start, entity.end);\n }\n\n // Leading: \"80336 \" + \"München\" → \"80336 München\"\n // Absorbs 3-5 digit postal codes before the city.\n const beforeMatch = fullText.slice(\n Math.max(0, entity.start - 10),\n entity.start,\n );\n const prefixM = POSTAL_PREFIX_RE.exec(beforeMatch);\n if (prefixM) {\n entity.start -= prefixM[0].length;\n entity.text = fullText.slice(entity.start, entity.end);\n }\n\n // Trailing uppercase word: \"434 01\" + \" Most\" →\n // \"434 01 Most\". Absorb if the next word starts\n // with uppercase and is on the same line.\n // Guard: skip party-role or organizational terms.\n const afterExt = fullText.slice(entity.end);\n // Max 4 spaces gap — more means different column\n const trailingWordM = /^[\\s]{1,4}(\\p{Lu}\\p{Ll}+)/u.exec(afterExt);\n if (trailingWordM && !trailingWordM[0].includes(\"\\n\")) {\n const candidate = (trailingWordM[1] ?? \"\").toLowerCase();\n if (!TRAILING_WORD_EXCLUSIONS.has(candidate)) {\n entity.end += trailingWordM[0].length;\n entity.text = fullText.slice(entity.start, entity.end);\n }\n }\n }\n};\n\n/**\n * Extend a person name match to include subsequent\n * capitalized words. \"Pavel\" + \" Heřmánek\" → \"Pavel\n * Heřmánek\". Stops at lowercase words, punctuation,\n * or end of text. Also extends backward if preceded\n * by a capitalized word (for \"Miroslav Braňka\" when\n * only \"Braňka\" matched).\n */\nconst extendPersonName = (\n text: string,\n start: number,\n end: number,\n ctx: PipelineContext,\n): { end: number; text: string } => {\n let newEnd = end;\n\n // Extend forward: skip whitespace, check if next\n // word starts with uppercase\n let pos = newEnd;\n while (pos < text.length) {\n // Skip single whitespace\n if (pos < text.length && text[pos] === \" \") {\n const wordStart = pos + 1;\n if (wordStart >= text.length) {\n break;\n }\n\n const char = text[wordStart] ?? \"\";\n if (!UPPER_START_RE.test(char)) {\n break;\n }\n\n // Find end of this word\n let wordEnd = wordStart;\n while (wordEnd < text.length && !/\\s/.test(text[wordEnd] ?? \"\")) {\n wordEnd++;\n }\n\n // Skip trailing punctuation (commas, etc.)\n const word = text.slice(wordStart, wordEnd);\n const stripped = word.replace(/[,;.]+$/, \"\");\n if (stripped.length < 2) {\n break;\n }\n\n // Don't extend into global or person stopwords\n const lower = stripped.toLowerCase();\n if (getStopwords(ctx).has(lower) || getPersonStopwords(ctx).has(lower)) {\n break;\n }\n\n newEnd = wordStart + stripped.length;\n pos = newEnd;\n } else {\n break;\n }\n }\n\n return {\n end: newEnd,\n text: text.slice(start, newEnd),\n };\n};\n","/**\n * Address detection via seed expansion.\n *\n * 1. Find \"address seeds\" — high-confidence address\n * components (postal codes, cities, street types)\n * 2. Cluster nearby seeds (within ~150 chars)\n * 3. Expand each cluster to the full address span\n * 4. Score by seed diversity (more types = higher)\n *\n * Language-agnostic: street type words and boundary\n * words are loaded from data dictionaries, not\n * hardcoded per language.\n */\n\nimport type { Match } from \"@stll/text-search\";\n\nimport { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\n\n// ── Seed types ──────────────────────────────────────\n\ntype SeedType =\n | \"street-word\"\n | \"house-number\"\n | \"postal-code\"\n | \"city\"\n | \"address-trigger\";\n\ntype Seed = {\n type: SeedType;\n start: number;\n end: number;\n text: string;\n};\n\n// ── Dictionary loading ──────────────────────────────\n\ntype DictionaryConfig = Record<string, string[] | string>;\n\nlet cachedBoundaryRe: RegExp | null = null;\n\nconst loadBoundaryWords = async (): Promise<DictionaryConfig> => {\n try {\n const mod =\n await import(\"@stll/anonymize-data/config/address-boundaries.json\");\n return mod.default as DictionaryConfig;\n } catch {\n return {};\n }\n};\n\n/**\n * Build regex for boundary words. Matches any\n * boundary word preceded by a word boundary.\n */\nconst getBoundaryRe = async (): Promise<RegExp> => {\n if (cachedBoundaryRe) {\n return cachedBoundaryRe;\n }\n const config = await loadBoundaryWords();\n const words: string[] = [];\n for (const entries of Object.values(config)) {\n if (!Array.isArray(entries)) {\n continue;\n }\n for (const word of entries) {\n // Escape regex special chars\n words.push(word.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n }\n }\n // Sort longest first so longer phrases match first\n words.sort((a, b) => b.length - a.length);\n cachedBoundaryRe =\n words.length > 0 ? new RegExp(`\\\\b(?:${words.join(\"|\")})\\\\b`, \"i\") : /(?!)/; // never matches\n return cachedBoundaryRe;\n};\n\n// ── Pattern builder for unified search ──────────────\n\n/**\n * Build street type patterns for the unified search.\n * Returns string[] for the unified TextSearch\n * builder. Empty if data package is not installed.\n */\nexport const buildStreetTypePatterns = async (): Promise<string[]> => {\n let config: DictionaryConfig = {};\n try {\n const mod =\n await import(\"@stll/anonymize-data/config/address-street-types.json\");\n config = mod.default as DictionaryConfig;\n } catch {\n return [];\n }\n\n // Plain strings — the unified builder sets\n // caseInsensitive + wholeWords globally.\n const words: string[] = [];\n for (const values of Object.values(config)) {\n if (!Array.isArray(values)) {\n continue;\n }\n for (const word of values) {\n words.push(word);\n }\n }\n return words;\n};\n\n// ── Seed collection ─────────────────────────────────\n\nconst collectSeeds = (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText: string,\n existingEntities: Entity[],\n): Seed[] => {\n const seeds: Seed[] = [];\n\n // 1. Street type words from unified search matches\n for (const match of allMatches) {\n const idx = match.pattern;\n if (idx < sliceStart || idx >= sliceEnd) {\n continue;\n }\n seeds.push({\n type: \"street-word\",\n start: match.start,\n end: match.end,\n text: match.text,\n });\n }\n\n // 2. Cities and postal codes from existing entities\n for (const e of existingEntities) {\n if (e.label !== \"address\") {\n continue;\n }\n if (e.source === \"deny-list\") {\n seeds.push({\n type: \"city\",\n start: e.start,\n end: e.end,\n text: e.text,\n });\n } else if (e.source === \"trigger\" && /^\\d/.test(e.text)) {\n seeds.push({\n type: \"postal-code\",\n start: e.start,\n end: e.end,\n text: e.text,\n });\n } else if (e.source === \"trigger\") {\n seeds.push({\n type: \"address-trigger\",\n start: e.start,\n end: e.end,\n text: e.text,\n });\n }\n }\n\n // 3. Standalone postal codes (multiple formats):\n // Czech/Slovak: NNN NN (e.g., 140 00)\n // Polish: NN-NNN (e.g., 00-950)\n const postalRe = /\\b(?:\\d{3}\\s\\d{2}|\\d{2}-\\d{3})\\b/g;\n let postalMatch;\n while ((postalMatch = postalRe.exec(fullText)) !== null) {\n const start = postalMatch.index;\n const end = start + postalMatch[0].length;\n const alreadyCovered = seeds.some((s) => s.start <= start && s.end >= end);\n if (!alreadyCovered) {\n seeds.push({\n type: \"postal-code\",\n start,\n end,\n text: postalMatch[0],\n });\n }\n }\n\n // 4. Street name + house number pattern:\n // [CapitalizedWord] [number](/[number])?,\n // e.g., \"Olbrachtova 1929/62,\" or \"Kamínky 5,\"\n const streetNumRe =\n /\\b(\\p{Lu}\\p{Ll}{2,})\\s+(\\d{1,5}(?:\\/\\d{1,5})?)\\s*[,\\n]/gu;\n let streetMatch;\n while ((streetMatch = streetNumRe.exec(fullText)) !== null) {\n const matchedStreet = streetMatch[1];\n const matchedNum = streetMatch[2];\n if (!matchedStreet || !matchedNum) {\n continue;\n }\n const start = streetMatch.index;\n const end = start + matchedStreet.length + 1 + matchedNum.length;\n seeds.push({\n type: \"street-word\",\n start,\n end,\n text: fullText.slice(start, end),\n });\n }\n\n return seeds.sort((a, b) => a.start - b.start);\n};\n\n// ── Cluster nearby seeds ────────────────────────────\n\ntype SeedCluster = {\n seeds: Seed[];\n start: number;\n end: number;\n};\n\nconst clusterSeeds = (seeds: Seed[], maxGap: number): SeedCluster[] => {\n const first = seeds[0];\n if (!first) {\n return [];\n }\n\n const clusters: SeedCluster[] = [];\n let current: SeedCluster = {\n seeds: [first],\n start: first.start,\n end: first.end,\n };\n\n for (let i = 1; i < seeds.length; i++) {\n const seed = seeds.at(i);\n if (!seed) {\n continue;\n }\n if (seed.start - current.end <= maxGap) {\n current.seeds.push(seed);\n current.end = Math.max(current.end, seed.end);\n } else {\n clusters.push(current);\n current = {\n seeds: [seed],\n start: seed.start,\n end: seed.end,\n };\n }\n }\n clusters.push(current);\n\n return clusters;\n};\n\n// ── Score a cluster ─────────────────────────────────\n\nconst scoreCluster = (cluster: SeedCluster): number => {\n const types = new Set(cluster.seeds.map((s) => s.type));\n\n // Need at least 2 different seed types for an\n // address (e.g., city + postal code, or street\n // word + house number)\n if (types.size < 2) {\n return 0;\n }\n\n let score = 0.5;\n\n if (types.has(\"postal-code\")) score += 0.15;\n if (types.has(\"city\")) score += 0.15;\n if (types.has(\"street-word\")) score += 0.15;\n if (types.has(\"address-trigger\")) score += 0.1;\n\n return Math.min(score, 0.95);\n};\n\n// ── Expand cluster to full address span ─────────────\n\nconst NON_ADDRESS_LABELS = new Set([\n \"registration number\",\n \"tax identification number\",\n \"person\",\n \"bank account number\",\n \"email address\",\n \"phone number\",\n \"organization\",\n \"iban\",\n]);\n\nconst expandCluster = async (\n fullText: string,\n cluster: SeedCluster,\n existingEntities: Entity[],\n): Promise<{ start: number; end: number }> => {\n const { start, end } = cluster;\n\n // Find the nearest non-address entity to the LEFT\n let leftBound = 0;\n for (const e of existingEntities) {\n if (\n NON_ADDRESS_LABELS.has(e.label) &&\n e.end <= start &&\n e.end > leftBound\n ) {\n leftBound = e.end;\n }\n }\n\n // Expand left: include preceding capitalized words\n // and numbers (street name before the street type)\n let leftPos = start;\n while (leftPos > leftBound) {\n let p = leftPos - 1;\n while (p >= 0 && (fullText[p] === \" \" || fullText[p] === \",\")) {\n p--;\n }\n if (p < 0) break;\n\n let wordEnd = p + 1;\n while (p >= 0 && /\\S/.test(fullText[p] ?? \"\")) {\n p--;\n }\n const word = fullText.slice(p + 1, wordEnd);\n\n if (word.length < 2 || (!/^\\p{Lu}/u.test(word) && !/^\\d/.test(word))) {\n break;\n }\n\n if (fullText.slice(p + 1, leftPos).includes(\"\\n\")) {\n break;\n }\n\n leftPos = p + 1;\n }\n\n // Expand right: include following text until we\n // hit a boundary word, non-address entity,\n // double newline, or 200 char cap.\n let rightPos = end;\n const remaining = fullText.slice(rightPos);\n let nearestBoundary = Math.min(remaining.length, 200);\n\n // Stop at dictionary-defined boundary words\n const boundaryRe = await getBoundaryRe();\n const boundaryMatch = boundaryRe.exec(remaining);\n if (boundaryMatch && boundaryMatch.index < nearestBoundary) {\n nearestBoundary = boundaryMatch.index;\n }\n\n // Stop at non-address entities\n for (const e of existingEntities) {\n if (!NON_ADDRESS_LABELS.has(e.label)) {\n continue;\n }\n const offset = e.start - rightPos;\n if (offset > 0 && offset < nearestBoundary) {\n nearestBoundary = offset;\n }\n }\n\n // Stop at double newline (paragraph break)\n const doubleNewline = remaining.indexOf(\"\\n\\n\");\n if (doubleNewline !== -1 && doubleNewline < nearestBoundary) {\n nearestBoundary = doubleNewline;\n }\n\n const expanded = remaining.slice(0, nearestBoundary).trimEnd();\n rightPos = end + expanded.length;\n\n // Trim trailing punctuation\n while (rightPos > end && /[,;:\\s]/.test(fullText[rightPos - 1] ?? \"\")) {\n rightPos--;\n }\n\n return {\n start: Math.min(leftPos, start),\n end: Math.max(rightPos, end),\n };\n};\n\n// ── Public API ──────────────────────────────────────\n\n/**\n * Process address seeds from the unified search.\n * Receives all matches; filters to the street types\n * slice via sliceStart/sliceEnd. Uses fullText and\n * existingEntities for seed collection, clustering,\n * expansion, and scoring.\n *\n * Runs as a post-processor after all other detectors,\n * using their output as seed sources.\n */\nexport const processAddressSeeds = async (\n allMatches: Match[],\n sliceStart: number,\n sliceEnd: number,\n fullText: string,\n existingEntities: Entity[],\n): Promise<Entity[]> => {\n const seeds = collectSeeds(\n allMatches,\n sliceStart,\n sliceEnd,\n fullText,\n existingEntities,\n );\n const clusters = clusterSeeds(seeds, 150);\n\n const results: Entity[] = [];\n\n for (const cluster of clusters) {\n const score = scoreCluster(cluster);\n if (score < 0.6) {\n continue;\n }\n\n const { start, end } = await expandCluster(\n fullText,\n cluster,\n existingEntities,\n );\n const text = fullText.slice(start, end).trim();\n\n // Skip very short or very long spans\n if (text.length < 5 || text.length > 300) {\n continue;\n }\n\n // Skip if it contains a newline (likely crossed\n // a structural boundary)\n if (text.includes(\"\\n\")) {\n continue;\n }\n\n results.push({\n start,\n end: start + text.length,\n label: \"address\",\n text,\n score,\n source: DETECTION_SOURCES.REGEX,\n });\n }\n\n return results;\n};\n","import { DETECTION_SOURCES } from \"../types\";\nimport type { Entity } from \"../types\";\nimport { LEGAL_SUFFIXES } from \"../config/legal-forms\";\n\nconst TRAILING_SEP = /[,\\s]+$/;\nconst WORD_CHAR_RE = /[\\p{L}\\p{N}]/u;\nconst ORG_PROPAGATION_SCORE = 0.9;\n\ntype Seed = {\n baseName: string;\n label: string;\n};\n\n/**\n * After the main detection pass, collect organization\n * entities with a legal form suffix, strip the suffix\n * to get the base name, and re-scan the full text for\n * bare mentions of that base name. Returns new entities\n * for occurrences not already covered.\n */\nexport const propagateOrgNames = (\n entities: Entity[],\n fullText: string,\n): Entity[] => {\n const seeds: Seed[] = [];\n const seenBases = new Set<string>();\n\n for (const e of entities) {\n if (e.label !== \"organization\") continue;\n for (const suffix of LEGAL_SUFFIXES) {\n if (e.text.endsWith(suffix)) {\n const base = e.text\n .slice(0, -suffix.length)\n .replace(TRAILING_SEP, \"\")\n .trim();\n if (base.length >= 3 && !seenBases.has(base)) {\n seenBases.add(base);\n seeds.push({\n baseName: base,\n label: e.label,\n });\n }\n break;\n }\n }\n }\n\n if (seeds.length === 0) return [];\n\n // Build a mutable array of already-covered spans\n // for overlap checks. Updated as new entities are\n // emitted to prevent duplicate propagation.\n const covered: [number, number][] = entities.map((e) => [e.start, e.end]);\n const isOverlapping = (start: number, end: number): boolean =>\n covered.some(([cs, ce]) => start < ce && end > cs);\n\n const results: Entity[] = [];\n\n for (const seed of seeds) {\n const { baseName, label } = seed;\n let searchFrom = 0;\n while (searchFrom < fullText.length) {\n const idx = fullText.indexOf(baseName, searchFrom);\n if (idx === -1) break;\n\n const matchEnd = idx + baseName.length;\n\n // Word boundary: reject if preceded or followed\n // by a letter or digit (prevents substring\n // matches like \"ACME\" inside \"ACME2\").\n const prevCh = fullText[idx - 1] ?? \"\";\n const nextCh = fullText[matchEnd] ?? \"\";\n if (WORD_CHAR_RE.test(prevCh) || WORD_CHAR_RE.test(nextCh)) {\n searchFrom = idx + 1;\n continue;\n }\n\n // Skip if already covered by an existing entity\n // or a previously propagated result.\n if (!isOverlapping(idx, matchEnd)) {\n results.push({\n start: idx,\n end: matchEnd,\n label,\n text: baseName,\n score: ORG_PROPAGATION_SCORE,\n source: DETECTION_SOURCES.COREFERENCE,\n });\n covered.push([idx, matchEnd]);\n }\n\n searchFrom = matchEnd;\n }\n }\n\n return results;\n};\n","import type { Entity } from \"../types\";\n\n// Common Czech words that start uppercase at sentence\n// beginnings but are not street names. Module-level\n// to avoid allocation in a hot loop.\nconst BARE_STOPWORDS = new Set([\n \"Příloha\",\n \"Smlouva\",\n \"Článek\",\n \"Dodatek\",\n \"Celkem\",\n \"Strana\",\n \"Faktura\",\n \"Částka\",\n \"Položka\",\n \"Kapitola\",\n \"Zákon\",\n \"Vyhláška\",\n \"Nařízení\",\n \"Usnesení\",\n \"Rozsudek\",\n \"Bod\",\n \"Odstavec\",\n \"Záloha\",\n \"Zbývá\",\n \"Dne\",\n \"Platba\",\n \"Datum\",\n \"Splatnost\",\n \"Variabilní\",\n \"Konstantní\",\n \"Specifický\",\n]);\n\nconst NEAR_MISS_BAND = 0.15;\nconst BOOST_PER_NEIGHBOUR = 0.05;\nconst CONTEXT_WINDOW_CHARS = 150;\nconst HIGH_CONFIDENCE_FLOOR = 0.9;\n\n/**\n * Boost confidence of near-miss NER entities that appear\n * near high-confidence detections (regex, trigger phrase).\n *\n * If an NER entity scored between (threshold - 0.15) and\n * threshold, count how many confirmed entities exist within\n * a 150-char window. Add +0.05 per co-located entity.\n * If the boosted score crosses the threshold, include it.\n *\n * Only mutates score on near-miss entities; high-confidence\n * entities pass through unchanged.\n */\nexport const boostNearMissEntities = (\n entities: Entity[],\n threshold: number,\n): Entity[] => {\n const nearMissBand = Math.max(0, threshold - NEAR_MISS_BAND);\n const confirmed = entities.filter((e) => e.score >= HIGH_CONFIDENCE_FLOOR);\n\n const boosted: Entity[] = [];\n\n for (const entity of entities) {\n if (entity.score >= threshold) {\n boosted.push(entity);\n continue;\n }\n\n if (entity.score < nearMissBand) {\n continue;\n }\n\n const midpoint = (entity.start + entity.end) / 2;\n let neighbourCount = 0;\n\n for (const anchor of confirmed) {\n const anchorMid = (anchor.start + anchor.end) / 2;\n if (Math.abs(midpoint - anchorMid) <= CONTEXT_WINDOW_CHARS) {\n neighbourCount++;\n }\n }\n\n const boostedScore = entity.score + neighbourCount * BOOST_PER_NEIGHBOUR;\n\n if (boostedScore >= threshold) {\n boosted.push({ ...entity, score: boostedScore });\n }\n }\n\n return boosted;\n};\n\n// ── Address backward scan ────────────────────────────\n\nconst UPPER_WORD_RE = /\\p{Lu}/u;\n\n/** Header zone: top 15% of document */\nconst HEADER_ZONE_FRACTION = 0.15;\n\n/** Context window for address adjacency */\nconst STREET_CONTEXT_WINDOW = 200;\n\n// ── Preposition data (lazy-loaded from JSON) ────────\n\ntype PrepositionData = {\n address: Record<string, string[] | string>;\n temporal: Record<string, string[] | string>;\n};\n\nlet _addressPreps: ReadonlySet<string> | null = null;\nlet _temporalPreps: ReadonlySet<string> | null = null;\nlet _prepsPromise: Promise<void> | null = null;\n\nconst loadPrepositions = async (): Promise<void> => {\n try {\n const mod =\n await import(\"@stll/anonymize-data/config/address-prepositions.json\");\n const data: PrepositionData = mod.default ?? mod;\n // Merge all languages into flat sets\n const addr = new Set<string>();\n const temp = new Set<string>();\n for (const words of Object.values(data.address)) {\n if (Array.isArray(words)) {\n for (const w of words) addr.add(w.toLowerCase());\n }\n }\n for (const words of Object.values(data.temporal)) {\n if (Array.isArray(words)) {\n for (const w of words) temp.add(w.toLowerCase());\n }\n }\n _addressPreps = addr;\n _temporalPreps = temp;\n } catch {\n _addressPreps = new Set();\n _temporalPreps = new Set();\n }\n};\n\n/** Ensure preposition data is loaded. */\nexport const initPrepositions = (): Promise<void> => {\n if (!_prepsPromise) {\n _prepsPromise = loadPrepositions();\n }\n return _prepsPromise;\n};\n\nconst getAddressPreps = (): ReadonlySet<string> => _addressPreps ?? new Set();\n\nconst getTemporalPreps = (): ReadonlySet<string> => _temporalPreps ?? new Set();\n\n// ── Street type abbreviations (lazy-loaded) ─────────\n\nlet _streetAbbrevs: ReadonlySet<string> | null = null;\nlet _streetAbbrevsPromise: Promise<void> | null = null;\n\nconst loadStreetAbbrevs = async (): Promise<void> => {\n try {\n const mod =\n await import(\"@stll/anonymize-data/config/address-street-types.json\");\n const data: Record<string, string[] | string> = mod.default ?? mod;\n const abbrevs = new Set<string>();\n for (const [key, words] of Object.entries(data)) {\n if (key.startsWith(\"_\")) continue;\n if (!Array.isArray(words)) continue;\n for (const w of words) {\n // Only keep abbreviated forms (with dots)\n if (w.includes(\".\")) {\n abbrevs.add(w.toLowerCase());\n }\n }\n }\n _streetAbbrevs = abbrevs;\n } catch {\n _streetAbbrevs = new Set();\n }\n};\n\n/** Ensure street abbreviation data is loaded. */\nexport const initStreetAbbrevs = (): Promise<void> => {\n if (!_streetAbbrevsPromise) {\n _streetAbbrevsPromise = loadStreetAbbrevs();\n }\n return _streetAbbrevsPromise;\n};\n\nconst getStreetAbbrevs = (): ReadonlySet<string> => _streetAbbrevs ?? new Set();\n\n/**\n * Scan backwards from known address entities and\n * house number patterns to find street names.\n *\n * Strategy (a): from a house number like \"2512/2a\",\n * walk left to find the first uppercase word — that's\n * the street name start. \"Mezi úvozy 2512/2a\" →\n * captures \"Mezi úvozy 2512/2a\".\n *\n * Strategy (b): if a colon \":\" appears within 3 chars\n * before the street start, boost confidence. Colons\n * signal \"label: value\" pairs universal in contracts.\n *\n * Strategy (c): in the header zone (top 15% of doc),\n * be more aggressive — detect street patterns even\n * without nearby address entities.\n */\nexport const detectStreetPatternsNearAddresses = (\n fullText: string,\n existingEntities: Entity[],\n): Entity[] => {\n const results: Entity[] = [];\n const addressEntities = existingEntities.filter((e) => e.label === \"address\");\n const headerEnd = Math.floor(fullText.length * HEADER_ZONE_FRACTION);\n\n // Find all house number positions in the text.\n // Slash-style house numbers only: either with a letter\n // suffix (\"2512/2a\") or primary >= 100 (\"853/12\").\n // This excludes date-like patterns (\"31/12\", \"1/1\").\n // Require either a letter suffix (2512/2a) or a\n // primary part > 31 to avoid matching Czech slash\n // dates like \"31/12\" or \"1/1\". Slash house numbers\n // in Czech addresses almost always have primary > 99\n // or carry a letter suffix.\n const houseNumRe =\n /\\b(?:\\d{1,4}\\/\\d+[a-zA-Z]\\b|\\d{3,4}\\/\\d+\\b|(?:1[3-9]|[2-9]\\d)\\/\\d{3,}\\b)/g;\n houseNumRe.lastIndex = 0;\n\n for (\n let m = houseNumRe.exec(fullText);\n m !== null;\n m = houseNumRe.exec(fullText)\n ) {\n const numStart = m.index;\n const numEnd = numStart + m[0].length;\n\n // Skip if already covered by an existing entity\n if (existingEntities.some((e) => e.start <= numStart && e.end >= numEnd)) {\n continue;\n }\n\n // Is this near a known address entity OR in header?\n const inHeader = numStart < headerEnd;\n const nearAddress = addressEntities.some(\n (e) =>\n Math.abs(e.start - numEnd) < STREET_CONTEXT_WINDOW ||\n Math.abs(e.end - numStart) < STREET_CONTEXT_WINDOW,\n );\n\n if (!inHeader && !nearAddress) {\n continue;\n }\n\n // Backward scan: find street name before the\n // house number. Walk left over whitespace, then\n // collect words that start with uppercase.\n let scanPos = numStart - 1;\n\n // Skip whitespace before the number (including\n // non-breaking spaces from PDF extraction)\n while (scanPos >= 0 && /[\\s\\u00A0]/.test(fullText[scanPos] ?? \"\")) {\n scanPos--;\n }\n\n if (scanPos < 0) {\n continue;\n }\n\n // Track if any temporal preposition was passed\n // through during the scan (e.g., \"do\", \"od\").\n // If so, the result is likely a date expression\n // even if wordCount > 1 (\"Praha do 225/1\").\n let hasTemporalPrep = false;\n\n // Collect words backwards until we hit:\n // - a non-letter character (except space/dot)\n // - a newline\n // - start of text\n // - a lowercase-only word (not a street name)\n let streetStart = scanPos + 1;\n let wordCount = 0;\n const MAX_WORDS = 5;\n\n while (scanPos >= 0 && wordCount < MAX_WORDS) {\n // Find end of current word. If we're on a dot,\n // include it (street abbreviations: \"ul.\", \"nám.\")\n let wordEnd = scanPos + 1;\n const hasDot = fullText[scanPos] === \".\";\n if (hasDot) {\n scanPos--;\n }\n\n // Walk back through word chars (letters, marks,\n // and digits for tokens like \"28\" in \"28. října\").\n while (scanPos >= 0 && /[\\p{L}\\p{M}\\d]/u.test(fullText[scanPos] ?? \"\")) {\n scanPos--;\n }\n const wordStart = scanPos + 1;\n const rawWord = fullText.slice(wordStart, wordEnd);\n // Strip trailing dot for word checks\n const word = hasDot ? rawWord.slice(0, -1) : rawWord;\n\n if (word.length === 0) {\n break;\n }\n\n // Check if this is a known street abbreviation\n // (e.g., \"ul.\", \"nám.\", \"tř.\", \"nábř.\")\n const isStreetAbbrev =\n hasDot && getStreetAbbrevs().has(rawWord.toLowerCase());\n\n // Word must start with uppercase (street name),\n // be a known preposition, a street abbreviation,\n // or a digit-starting token (e.g., \"28.\" in\n // \"28. října 1168/102\").\n const isUpper = UPPER_WORD_RE.test(word[0] ?? \"\");\n const isPrep = getAddressPreps().has(word.toLowerCase());\n const isDigitToken = /^\\d{1,2}$/.test(word);\n\n if (!isUpper && !isPrep && !isStreetAbbrev && !isDigitToken) {\n break;\n }\n\n // Track temporal prepositions passed through\n if (isPrep && getTemporalPreps().has(word.toLowerCase())) {\n hasTemporalPrep = true;\n }\n\n streetStart = wordStart;\n wordCount++;\n\n // Skip whitespace before this word (inc. NBSP)\n while (scanPos >= 0 && /[\\s\\u00A0]/.test(fullText[scanPos] ?? \"\")) {\n scanPos--;\n }\n\n // Stop at newline, tab, comma, semicolon\n const prevCh = fullText[scanPos];\n if (\n prevCh === \"\\n\" ||\n prevCh === \"\\t\" ||\n prevCh === \";\" ||\n prevCh === undefined\n ) {\n break;\n }\n\n // Comma: stop (it separates address from\n // previous clause)\n if (prevCh === \",\") {\n break;\n }\n }\n\n if (wordCount === 0) {\n continue;\n }\n\n const streetText = fullText.slice(streetStart, numEnd);\n\n // Skip if too short (single digit without name)\n if (streetText.length < 4) {\n continue;\n }\n\n // Guard: reject if any temporal preposition was\n // encountered during the backward scan. Catches\n // both \"do 225/1\" (wordCount=1) and \"Praha do\n // 225/1\" (wordCount=2).\n if (hasTemporalPrep) {\n continue;\n }\n\n // Skip if already covered\n if (\n existingEntities.some((e) => e.start <= streetStart && e.end >= numEnd)\n ) {\n continue;\n }\n\n // Colon boost: if \":\" appears within 5 chars\n // before street start, this is a \"label: value\"\n // pair — very high confidence.\n const beforeStreet = fullText.slice(\n Math.max(0, streetStart - 5),\n streetStart,\n );\n const hasColon = beforeStreet.includes(\":\");\n const score = hasColon ? 0.95 : inHeader ? 0.85 : 0.8;\n\n results.push({\n start: streetStart,\n end: numEnd,\n label: \"address\",\n text: streetText,\n score,\n source: \"regex\",\n });\n }\n\n // ── Second scan: bare house numbers near addresses ─\n // \"Vinohradská 46\" near \"Praha 2\" → address.\n // Uppercase word + space + 1-3 digit number, no slash.\n // Capped at 3 digits to exclude year numbers (2024).\n const bareHouseRe = /(?<=\\s|^)(\\p{Lu}\\p{Ll}[\\p{Ll}\\p{Lu}]+\\s+\\d{1,3})\\b/gu;\n bareHouseRe.lastIndex = 0;\n\n // Merge existing + newly found entities for proximity\n const allAddr = [...addressEntities, ...results];\n\n for (\n let m = bareHouseRe.exec(fullText);\n m !== null;\n m = bareHouseRe.exec(fullText)\n ) {\n const captured = m[1];\n if (captured === undefined) continue;\n\n const start = m.index;\n const end = start + captured.length;\n\n // Must be on the same line as a confirmed address\n // entity and within 50 chars.\n const nearAddr = allAddr.some((e) => {\n const dist = Math.min(Math.abs(e.start - end), Math.abs(e.end - start));\n if (dist > 50) return false;\n // Ensure same line: no newline between\n const lo = Math.min(e.start, start);\n const hi = Math.max(e.end, end);\n const between = fullText.slice(lo, hi);\n return !between.includes(\"\\n\");\n });\n\n if (!nearAddr) continue;\n\n // Extract the uppercase word to check stopwords\n const spaceIdx = captured.search(/\\s+\\d/);\n const word = spaceIdx > 0 ? captured.slice(0, spaceIdx) : captured;\n\n if (BARE_STOPWORDS.has(word)) continue;\n\n // Skip if overlapping an existing entity\n const allEntities = [...existingEntities, ...results];\n const overlaps = allEntities.some((e) => e.start < end && e.end > start);\n if (overlaps) continue;\n\n results.push({\n start,\n end,\n label: \"address\",\n text: captured,\n score: 0.75,\n source: \"regex\",\n });\n }\n\n return results;\n};\n\n// ── Orphan street lines in header zone ──────────────\n\n// Orphan street: first word uppercase, subsequent words\n// can be lowercase (Czech: \"Karlínské náměstí 7\",\n// \"Pražská ulice 12\") or uppercase (\"Národní třída 1\").\n// House number requires 2+ digits to avoid matching\n// contract headings like \"Příloha 1\" or \"Smlouva 3\".\nconst ORPHAN_STREET_RE =\n /^\\s*(\\p{Lu}[\\p{Ll}\\p{Lu}]+(?:\\s+[\\p{Lu}\\p{Ll}][\\p{Ll}]+)*\\s+\\d{2,4}[a-zA-Z]?)\\s*$/gmu;\n\n/**\n * In the header zone (top 15%), find standalone lines\n * matching \"[Uppercase word(s)] [number]\" that sit\n * between other detected entities. These are almost\n * certainly street addresses in party definitions.\n *\n * Example: \"Evropská 710\" on its own line between\n * an organization entity and a postal code entity.\n */\nexport const detectOrphanStreetLines = (\n fullText: string,\n existingEntities: Entity[],\n): Entity[] => {\n const headerEnd = Math.floor(fullText.length * HEADER_ZONE_FRACTION);\n const results: Entity[] = [];\n ORPHAN_STREET_RE.lastIndex = 0;\n\n for (\n let m = ORPHAN_STREET_RE.exec(fullText);\n m !== null;\n m = ORPHAN_STREET_RE.exec(fullText)\n ) {\n const captured = m[1];\n if (captured === undefined) {\n continue;\n }\n const start = m.index + m[0].indexOf(captured);\n const end = start + captured.length;\n\n // Only in header zone\n if (start >= headerEnd) {\n continue;\n }\n\n // Skip if already covered\n if (existingEntities.some((e) => e.start <= start && e.end >= end)) {\n continue;\n }\n\n // Must have a nearby entity (within 200 chars)\n const hasContext = existingEntities.some(\n (e) => Math.abs(e.start - end) < 200 || Math.abs(e.end - start) < 200,\n );\n if (!hasContext) {\n continue;\n }\n\n results.push({\n start,\n end,\n label: \"address\",\n text: captured,\n score: 0.85,\n source: \"regex\",\n });\n }\n\n return results;\n};\n","import type { Entity } from \"../types\";\nimport type { PipelineContext } from \"../context\";\nimport { defaultContext } from \"../context\";\n\n// ── Zone types ───────────────────────────────────\n\nexport type DocumentZone = \"header\" | \"signature\" | \"body\" | \"table\";\n\nexport type ZoneSpan = {\n zone: DocumentZone;\n start: number;\n end: number;\n};\n\n// ── Score adjustments per zone ───────────────────\n\n/**\n * Additive score adjustments per document zone.\n * Header and signature blocks are dense with PII;\n * tables often contain structured identifying data.\n */\nexport const ZONE_SCORE_ADJUSTMENTS = {\n header: 0.1,\n signature: 0.15,\n body: 0,\n table: 0.05,\n} as const satisfies Record<DocumentZone, number>;\n\n// ── Lazy-loaded config ───────────────────────────\n\ntype SectionHeadingsConfig = {\n patterns: Array<{ re: string; flags: string }>;\n};\n\ntype SigningClauseConfig = {\n patterns: Array<{\n lang: string;\n prefix: string;\n suffix: string;\n prepositions: string[];\n }>;\n};\n\nconst loadSectionHeadings = async (): Promise<RegExp[]> => {\n const mod = await import(\"@stll/anonymize-data/config/section-headings.json\");\n const data: SectionHeadingsConfig = mod.default ?? mod;\n return data.patterns.map((p) => new RegExp(p.re, p.flags));\n};\n\nconst loadSigningClauses = async (): Promise<RegExp[]> => {\n const mod = await import(\"@stll/anonymize-data/config/signing-clauses.json\");\n const data: SigningClauseConfig = mod.default ?? mod;\n return data.patterns.map((p) => {\n // Build a pattern that matches the signing\n // clause prefix at the start of a line.\n // Note: prefix/suffix are regex fragments by\n // design (e.g. `(?:V|Ve)\\\\s+`), not literals.\n const prefix = p.prefix || \"\";\n const suffix = p.suffix || \"\";\n // Include prepositions so multi-word place\n // names like \"Ústí nad Labem\" are matched,\n // consistent with buildSigningClausePatterns\n // in detectors/regex.ts.\n const prepAlt = p.prepositions.length > 0 ? p.prepositions.join(\"|\") : null;\n const place = prepAlt\n ? `\\\\p{Lu}\\\\p{Ll}+` +\n `(?:\\\\s+(?:${prepAlt})` +\n `\\\\s+\\\\p{Lu}\\\\p{Ll}+)*` +\n `(?:\\\\s+\\\\p{Lu}\\\\p{Ll}+)*`\n : `\\\\p{Lu}\\\\p{Ll}+` + `(?:[- ]\\\\p{Lu}\\\\p{Ll}+)*`;\n // Anchor to the start of the line. Each line is\n // already split on \\n, so ^ suffices without m.\n const combined = `^\\\\s*(?:${prefix}${place}${suffix})`;\n return new RegExp(combined, \"u\");\n });\n};\n\n/**\n * Ensure config data is loaded. Call once before\n * classifyZones. Safe to call multiple times.\n */\nexport const initZoneClassifier = (\n ctx: PipelineContext = defaultContext,\n): Promise<void> => {\n if (ctx.zoneInitPromise) return ctx.zoneInitPromise;\n ctx.zoneInitPromise = Promise.all([\n loadSectionHeadings(),\n loadSigningClauses(),\n ])\n .then(([headings, clauses]) => {\n ctx.zoneHeadingPatterns = headings;\n ctx.zoneSigningPatterns = clauses;\n })\n .catch((err: unknown) => {\n // Clear cached promise so a subsequent call\n // can retry after a transient failure.\n ctx.zoneInitPromise = null;\n throw err;\n });\n return ctx.zoneInitPromise;\n};\n\n// ── Table detection ──────────────────────────────\n\nconst MIN_TABS_FOR_TABLE = 2;\n\nconst isTableLine = (line: string): boolean => {\n let tabCount = 0;\n for (const ch of line) {\n if (ch === \"\\t\") tabCount++;\n if (tabCount >= MIN_TABS_FOR_TABLE) return true;\n }\n return false;\n};\n\n// ── Zone classification ──────────────────────────\n\n/**\n * Classify a document into zones based on\n * structural heuristics. Zones are non-overlapping\n * and cover the entire text.\n *\n * Must call `initZoneClassifier()` first.\n */\nexport const classifyZones = (\n fullText: string,\n ctx: PipelineContext = defaultContext,\n): ZoneSpan[] => {\n if (fullText.length === 0) return [];\n\n const headingRes = ctx.zoneHeadingPatterns;\n const signingRes = ctx.zoneSigningPatterns;\n\n if (!headingRes || !signingRes) {\n console.warn(\n \"[anonymize] classifyZones called before \" +\n \"initZoneClassifier(); returning body-only\",\n );\n return [{ zone: \"body\", start: 0, end: fullText.length }];\n }\n\n const lines = fullText.split(\"\\n\");\n const zones: ZoneSpan[] = [];\n\n // Find header end: first section heading line\n let headerEndLine = -1;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line === undefined) continue;\n for (const re of headingRes) {\n if (re.test(line)) {\n headerEndLine = i;\n break;\n }\n }\n if (headerEndLine !== -1) break;\n }\n\n // Find signature start: last signing clause line\n let signatureStartLine = -1;\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line === undefined) continue;\n for (const re of signingRes) {\n if (re.test(line)) {\n signatureStartLine = i;\n break;\n }\n }\n if (signatureStartLine !== -1) break;\n }\n\n // Build offset map: line index -> char offset\n const lineOffsets: number[] = [];\n let offset = 0;\n for (const line of lines) {\n lineOffsets.push(offset);\n // +1 for the newline character\n offset += line.length + 1;\n }\n\n // Determine zone boundaries\n let headerEndOffset =\n headerEndLine >= 0 ? (lineOffsets[headerEndLine] ?? 0) : 0;\n\n const signatureStartOffset =\n signatureStartLine >= 0\n ? (lineOffsets[signatureStartLine] ?? fullText.length)\n : fullText.length;\n\n // Guard: if the signing clause appears before\n // the first section heading, the zones would\n // overlap. Treat as degenerate layout: drop the\n // header so the signature zone takes priority.\n if (\n headerEndLine > 0 &&\n signatureStartLine >= 0 &&\n headerEndOffset > signatureStartOffset\n ) {\n headerEndLine = -1;\n headerEndOffset = 0;\n }\n\n // Add header zone if detected. Using > 0 (not\n // >= 0) intentionally: when the section heading is\n // on line 0, there is no preamble to classify as a\n // header — everything starts as body.\n if (headerEndLine > 0) {\n zones.push({\n zone: \"header\",\n start: 0,\n end: headerEndOffset,\n });\n }\n\n // Scan body region for table zones\n const bodyStart = headerEndLine > 0 ? headerEndOffset : 0;\n const bodyEnd =\n signatureStartLine >= 0 ? signatureStartOffset : fullText.length;\n\n let tableStart = -1;\n for (\n let i = Math.max(headerEndLine, 0);\n i < (signatureStartLine >= 0 ? signatureStartLine : lines.length);\n i++\n ) {\n const line = lines[i];\n if (line === undefined) continue;\n const lineStart = lineOffsets[i] ?? 0;\n const lineEnd = lineStart + line.length;\n\n if (isTableLine(line)) {\n if (tableStart === -1) {\n tableStart = lineStart;\n }\n } else if (tableStart !== -1) {\n zones.push({\n zone: \"table\",\n start: tableStart,\n end: lineStart,\n });\n tableStart = -1;\n }\n\n // Close table at the end of body range\n if (\n i ===\n (signatureStartLine >= 0 ? signatureStartLine - 1 : lines.length - 1) &&\n tableStart !== -1\n ) {\n zones.push({\n zone: \"table\",\n start: tableStart,\n end: Math.min(lineEnd + 1, bodyEnd),\n });\n tableStart = -1;\n }\n }\n\n // Fill body gaps between header/table/signature\n const sortedSpecial = zones.toSorted((a, b) => a.start - b.start);\n\n let cursor = bodyStart;\n const bodyZones: ZoneSpan[] = [];\n for (const span of sortedSpecial) {\n if (span.zone === \"header\") continue;\n if (span.start > cursor) {\n bodyZones.push({\n zone: \"body\",\n start: cursor,\n end: span.start,\n });\n }\n cursor = Math.max(cursor, span.end);\n }\n if (cursor < bodyEnd) {\n bodyZones.push({\n zone: \"body\",\n start: cursor,\n end: bodyEnd,\n });\n }\n\n for (const z of bodyZones) zones.push(z);\n\n // Add signature zone if detected\n if (signatureStartLine >= 0) {\n zones.push({\n zone: \"signature\",\n start: signatureStartOffset,\n end: fullText.length,\n });\n }\n\n return zones.toSorted((a, b) => a.start - b.start);\n};\n\n// ── Entity zone lookup ───────────────────────────\n\n/**\n * Find which zone an entity's midpoint falls in.\n * Returns \"body\" if no zone matches (defensive).\n */\nconst findZone = (midpoint: number, zones: ZoneSpan[]): DocumentZone => {\n for (const span of zones) {\n if (midpoint >= span.start && midpoint < span.end) {\n return span.zone;\n }\n }\n return \"body\";\n};\n\n/**\n * Apply zone-based score adjustments to entities.\n * Entities in header/signature/table zones get a\n * small additive boost reflecting the higher PII\n * density in those regions.\n *\n * Returns a new array; does not mutate inputs.\n */\nexport const applyZoneAdjustments = (\n entities: Entity[],\n zones: ZoneSpan[],\n): Entity[] => {\n if (zones.length === 0) {\n return entities.map((e) => ({ ...e }));\n }\n\n const result: Entity[] = [];\n for (const entity of entities) {\n const midpoint = (entity.start + entity.end) / 2;\n const zone = findZone(midpoint, zones);\n const adjustment = ZONE_SCORE_ADJUSTMENTS[zone];\n\n if (adjustment > 0) {\n result.push({\n ...entity,\n score: Math.min(1, entity.score + adjustment),\n });\n } else {\n result.push({ ...entity });\n }\n }\n return result;\n};\n","import type { Match, PatternEntry } from \"@stll/text-search\";\n\nimport { getTextSearch } from \"../search-engine\";\nimport type { Entity } from \"../types\";\n\n// ── Types ───────────────────────────────────────────\n\nexport type HotwordRule = {\n hotwords: string[];\n targetLabels: string[];\n scoreAdjustment: number;\n reclassifyTo?: string;\n proximityBefore: number;\n proximityAfter: number;\n};\n\ntype HotwordRulesConfig = {\n rules: HotwordRule[];\n};\n\n// ── Lazy-loaded state ───────────────────────────────\n\nlet rules: HotwordRule[] | null = null;\nlet search: { findIter: (text: string) => Match[] } | null = null;\n/**\n * Maps each TextSearch pattern index back to the\n * rule index that owns it, so a single AC scan\n * resolves all hotword hits to their rule.\n */\nlet patternToRule: number[] | null = null;\nlet initPromise: Promise<void> | null = null;\n\n// ── Init ────────────────────────────────────────────\n\nconst loadRules = async (): Promise<void> => {\n const mod = await import(\"@stll/anonymize-data/config/hotword-rules.json\");\n const data: HotwordRulesConfig = mod.default ?? mod;\n const loaded = data.rules;\n\n // Build a flat pattern list and the reverse map.\n const patterns: PatternEntry[] = [];\n const mapping: number[] = [];\n\n for (let ruleIdx = 0; ruleIdx < loaded.length; ruleIdx++) {\n const rule = loaded[ruleIdx];\n if (!rule) continue;\n for (const hw of rule.hotwords) {\n patterns.push({\n pattern: hw,\n literal: true,\n caseInsensitive: true,\n });\n mapping.push(ruleIdx);\n }\n }\n\n const builtSearch =\n patterns.length > 0\n ? new (getTextSearch())(patterns, {\n overlapStrategy: \"all\",\n caseInsensitive: true,\n wholeWords: true,\n })\n : null;\n\n // Assign all module state atomically after all\n // failable operations succeed, so a mid-flight\n // error cannot leave a half-initialized state.\n patternToRule = mapping;\n search = builtSearch;\n rules = loaded;\n};\n\n/**\n * Load hotword rules from the data package.\n * Safe to call multiple times; subsequent calls\n * are no-ops.\n */\nexport const initHotwordRules = async (): Promise<void> => {\n if (rules !== null) return;\n if (initPromise !== null) return initPromise;\n initPromise = loadRules().catch((err) => {\n // Reset so callers can retry on transient failure.\n initPromise = null;\n throw err;\n });\n return initPromise;\n};\n\n/**\n * Expand requested output labels with any source labels\n * that hotword rules may reclassify into them.\n *\n * Example: requesting only \"date of birth\" still needs\n * \"date\" candidates to survive until the hotword pass.\n * If rules are not initialized, or if no labels were\n * requested, returns the input labels unchanged.\n */\nexport const expandLabelsForHotwordRules = (\n requestedLabels: readonly string[],\n): readonly string[] => {\n if (rules === null || requestedLabels.length === 0) {\n return requestedLabels;\n }\n\n const requested = new Set(requestedLabels);\n const expanded = new Set(requestedLabels);\n\n for (const rule of rules) {\n if (rule.reclassifyTo === undefined || !requested.has(rule.reclassifyTo)) {\n continue;\n }\n for (const label of rule.targetLabels) {\n expanded.add(label);\n }\n }\n\n return [...expanded];\n};\n\n// ── Application ─────────────────────────────────────\n\n/**\n * Apply hotword context rules to detected entities.\n *\n * Scans `fullText` once with a single AC automaton\n * for all hotwords across all rules, then checks\n * proximity to each entity. Distance-decayed\n * adjustment: closer hotwords give a stronger boost.\n *\n * Returns a new array; input entities are not mutated.\n */\nexport const applyHotwordRules = (\n entities: Entity[],\n fullText: string,\n): Entity[] => {\n if (\n rules === null ||\n rules.length === 0 ||\n search === null ||\n patternToRule === null\n ) {\n return entities;\n }\n\n // Single scan for all hotword positions.\n const hits = search.findIter(fullText);\n if (hits.length === 0) return entities;\n\n // Group hits by rule index for fast lookup.\n const hitsByRule = new Map<number, Match[]>();\n for (const hit of hits) {\n const ruleIdx = patternToRule[hit.pattern];\n if (ruleIdx === undefined) continue;\n let bucket = hitsByRule.get(ruleIdx);\n if (bucket === undefined) {\n bucket = [];\n hitsByRule.set(ruleIdx, bucket);\n }\n bucket.push(hit);\n }\n\n const result: Entity[] = [];\n\n for (const entity of entities) {\n let bestAdjustment = 0;\n let bestReclassify: string | undefined;\n\n for (let ruleIdx = 0; ruleIdx < rules.length; ruleIdx++) {\n const rule = rules[ruleIdx];\n if (!rule) continue;\n\n // Check if entity label matches this rule.\n if (!rule.targetLabels.includes(entity.label)) {\n continue;\n }\n\n const ruleHits = hitsByRule.get(ruleIdx);\n if (ruleHits === undefined) continue;\n\n for (const hit of ruleHits) {\n // Asymmetric proximity check.\n // Hotword BEFORE entity: hotword end <=\n // entity start, distance = entity.start -\n // hit.end\n // Hotword AFTER entity: hotword start >=\n // entity end, distance = hit.start -\n // entity.end\n let distance: number;\n let maxDistance: number;\n\n if (hit.end <= entity.start) {\n // Hotword is before the entity.\n distance = entity.start - hit.end;\n maxDistance = rule.proximityBefore;\n } else if (hit.start >= entity.end) {\n // Hotword is after the entity.\n distance = hit.start - entity.end;\n maxDistance = rule.proximityAfter;\n } else {\n // Hotword overlaps the entity: distance 0,\n // use larger window for max.\n distance = 0;\n maxDistance = Math.max(rule.proximityBefore, rule.proximityAfter);\n }\n\n if (distance > maxDistance) continue;\n\n // Distance-decayed adjustment.\n const decay = maxDistance === 0 ? 1 : 1 - distance / maxDistance;\n const adj = rule.scoreAdjustment * decay;\n\n if (Math.abs(adj) > Math.abs(bestAdjustment)) {\n bestAdjustment = adj;\n // Only carry reclassification from boost\n // rules; a penalty winner must not silently\n // overwrite a label set by a closer positive\n // rule.\n if (adj > 0) {\n bestReclassify = rule.reclassifyTo;\n } else {\n bestReclassify = undefined;\n }\n }\n }\n }\n\n if (bestAdjustment === 0) {\n result.push(entity);\n continue;\n }\n\n const newScore = Math.min(1, Math.max(0, entity.score + bestAdjustment));\n const newLabel =\n bestReclassify !== undefined ? bestReclassify : entity.label;\n\n result.push({\n ...entity,\n score: newScore,\n label: newLabel,\n });\n }\n\n return result;\n};\n","import type { Entity } from \"../types\";\n\n/** Max gap (in chars) between entities to merge. */\nconst MAX_GAP = 3;\n\n/**\n * Characters allowed in the gap between two adjacent\n * same-label entities that should be merged: spaces,\n * tabs, commas, and hyphens. Uses `[ \\t,\\-]` instead\n * of `\\s` to avoid merging entities across newlines.\n */\nconst GAP_PATTERN = /^[ \\t,\\-]+$/;\n\n/**\n * Build a set of word boundary offsets for the full\n * text using `Intl.Segmenter`. Returns a sorted array\n * of offsets where words start and end.\n */\nconst buildWordBoundaries = (text: string): Set<number> => {\n // Use \"und\" (undetermined) locale for consistent\n // word-boundary results across environments.\n const segmenter = new Intl.Segmenter(\"und\", {\n granularity: \"word\",\n });\n const boundaries = new Set<number>();\n for (const seg of segmenter.segment(text)) {\n if (!seg.isWordLike) continue;\n boundaries.add(seg.index);\n boundaries.add(seg.index + seg.segment.length);\n }\n return boundaries;\n};\n\n/**\n * Characters that act as hard stops when scanning\n * backward for a word boundary. Entity boundaries\n * should never extend past these.\n */\nconst WORD_START_STOPS = new Set([\n \"\\n\",\n \"\\r\",\n \",\",\n \";\",\n \"(\",\n \")\",\n \"[\",\n \"]\",\n \"&\",\n]);\n\n/**\n * Find the word-start offset at or before `pos`.\n * Scans left until a word boundary is found.\n */\nconst wordStartAt = (\n pos: number,\n boundaries: Set<number>,\n text: string,\n): number => {\n let p = pos;\n while (p > 0 && !boundaries.has(p)) {\n const prev = text[p - 1];\n if (prev !== undefined && WORD_START_STOPS.has(prev)) {\n return p;\n }\n p--;\n }\n return p;\n};\n\n/**\n * Characters that act as hard stops when scanning\n * forward for a word boundary. Entity boundaries\n * should never extend past these.\n */\nconst WORD_END_STOPS = new Set([\n \"\\n\",\n \"\\r\",\n \",\",\n \";\",\n \".\",\n \"(\",\n \")\",\n \"[\",\n \"]\",\n \"&\",\n]);\n\n/**\n * Find the word-end offset at or after `pos`.\n * Scans right until a word boundary is found.\n */\nconst wordEndAt = (\n pos: number,\n boundaries: Set<number>,\n text: string,\n): number => {\n let p = pos;\n while (p < text.length && !boundaries.has(p)) {\n const ch = text[p];\n if (ch !== undefined && WORD_END_STOPS.has(ch)) {\n return p;\n }\n p++;\n }\n return p;\n};\n\n/**\n * Binary search: find the leftmost index in `arr`\n * where `arr[index].start >= value`.\n */\nconst lowerBound = (arr: Entity[], value: number): number => {\n let lo = 0;\n let hi = arr.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const el = arr[mid];\n if (el && el.start < value) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n return lo;\n};\n\n/**\n * Merge adjacent same-label entities separated only by\n * whitespace, comma, or hyphen (max 3 chars). Also\n * merges same-label entities that partially overlap\n * (which can happen after word-boundary expansion).\n *\n * Looks for the last same-label entity in the result\n * (not just the very last entity) so that an\n * intervening different-label entity does not prevent\n * merging.\n *\n * Uses binary search for the `gapOccupied` check and\n * a Map for O(1) same-label prev lookup. O(n log n).\n */\nconst mergeAdjacent = (entities: Entity[], fullText: string): Entity[] => {\n const sorted = entities.toSorted((a, b) => a.start - b.start);\n const result: Entity[] = [];\n // O(1) lookup for the last same-label entity in\n // result, replacing the O(n) backward scan.\n const lastByLabel = new Map<string, Entity>();\n\n for (const entity of sorted) {\n const prev = lastByLabel.get(entity.label);\n\n if (!prev) {\n const copy = { ...entity };\n result.push(copy);\n lastByLabel.set(entity.label, copy);\n continue;\n }\n\n // Handle overlap created by fixPartialWords:\n // two same-label entities may now partially overlap\n // after word-boundary expansion.\n if (entity.start < prev.end) {\n prev.end = Math.max(prev.end, entity.end);\n prev.text = fullText.slice(prev.start, prev.end);\n prev.score = Math.max(prev.score, entity.score);\n continue;\n }\n\n const gap = fullText.slice(prev.end, entity.start);\n // GAP_PATTERN uses `+` quantifier, so empty gaps\n // (zero-gap / touching entities) won't match.\n // Also reject merging when a different-label entity\n // occupies the gap range (would create cross-label\n // overlap). Use binary search to find candidates\n // in the gap range instead of scanning all entities.\n const gapStart = prev.end;\n const gapEnd = entity.start;\n const searchIdx = lowerBound(sorted, gapStart);\n let gapOccupied = false;\n for (let k = searchIdx; k < sorted.length; k++) {\n const other = sorted[k];\n if (!other || other.start >= gapEnd) break;\n if (other.label !== entity.label && other.end > gapStart) {\n gapOccupied = true;\n break;\n }\n }\n\n if (!gapOccupied && gap.length <= MAX_GAP && GAP_PATTERN.test(gap)) {\n // Merge into prev\n prev.end = entity.end;\n prev.text = fullText.slice(prev.start, prev.end);\n prev.score = Math.max(prev.score, entity.score);\n } else {\n const copy = { ...entity };\n result.push(copy);\n lastByLabel.set(entity.label, copy);\n }\n }\n\n return result;\n};\n\n/**\n * Fix partial-word boundaries by extending entity\n * start/end to the nearest word boundary. Does not\n * extend across newlines or into spans occupied by\n * different-label entities.\n *\n * Uses binary search to skip irrelevant entries when\n * clamping at cross-label neighbors. O(n log n) in\n * the common case; O(n^2) worst case when many\n * same-label entities precede a cross-label boundary.\n */\nconst fixPartialWords = (entities: Entity[], fullText: string): Entity[] => {\n const boundaries = buildWordBoundaries(fullText);\n const sorted = entities.toSorted((a, b) => a.start - b.start);\n\n // Build a secondary array sorted by end position\n // for efficient \"nearest entity ending before me\"\n // lookups. Each entry tracks the original entity.\n const byEnd = sorted\n .map((e, idx) => ({ entity: e, idx }))\n .sort((a, b) => a.entity.end - b.entity.end);\n const endPositions = byEnd.map((x) => x.entity.end);\n\n return sorted.map((e, eIdx) => {\n let newStart = wordStartAt(e.start, boundaries, fullText);\n let newEnd = wordEndAt(e.end, boundaries, fullText);\n\n // Clamp start: find different-label entities whose\n // end is in (newStart, e.start]. We search byEnd\n // for entities with end > newStart and end <= e.start.\n // Binary search for the first entry with\n // end > newStart.\n let lo = 0;\n let hi = endPositions.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((endPositions[mid] ?? Number.POSITIVE_INFINITY) <= newStart) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n // Scan forward from lo; all entries have end >\n // newStart. Stop when end > e.start.\n for (let k = lo; k < byEnd.length; k++) {\n const entry = byEnd[k];\n if (!entry || entry.entity.end > e.start) break;\n if (entry.idx === eIdx) continue;\n if (entry.entity.label === e.label) continue;\n // This entity's end is in (newStart, e.start]\n // and has a different label: clamp.\n newStart = Math.max(newStart, entry.entity.end);\n }\n\n // Clamp end: find different-label entities whose\n // start is in [e.end, newEnd). Use the start-sorted\n // array with binary search.\n const startIdx = lowerBound(sorted, e.end);\n for (let k = startIdx; k < sorted.length; k++) {\n const other = sorted[k];\n if (!other || other.start >= newEnd) break;\n if (other === e) continue;\n if (other.label === e.label) continue;\n // This entity's start is in [e.end, newEnd)\n // and has a different label: clamp.\n newEnd = Math.min(newEnd, other.start);\n }\n\n if (newStart === e.start && newEnd === e.end) {\n return e;\n }\n return {\n ...e,\n start: newStart,\n end: newEnd,\n text: fullText.slice(newStart, newEnd),\n };\n });\n};\n\n/**\n * Deduplicate entities with identical [start, end, label].\n * Keeps the entry with the highest score.\n */\nconst deduplicateSpans = (entities: Entity[]): Entity[] => {\n const seen = new Map<string, Entity>();\n for (const entity of entities) {\n const key = `${entity.start}:${entity.end}:${entity.label}`;\n const existing = seen.get(key);\n if (!existing || entity.score > existing.score) {\n seen.set(key, entity);\n }\n }\n return [...seen.values()];\n};\n\n/**\n * Remove nested same-label entities. If a shorter\n * entity is fully contained within a longer entity\n * of the same label, drop the shorter one.\n *\n * Uses a \"max end seen\" sweep per label. O(n) after\n * the initial sort.\n */\nconst removeNestedSameLabel = (entities: Entity[]): Entity[] => {\n // Sort by start asc, then by length desc so the\n // longer entity comes first.\n const sorted = entities.toSorted((a, b) => {\n if (a.start !== b.start) return a.start - b.start;\n return b.end - a.end;\n });\n\n const result: Entity[] = [];\n // Track the furthest end seen per label. Any entity\n // whose end <= maxEnd for its label is nested inside\n // a previously seen entity of the same label.\n const maxEndByLabel = new Map<string, number>();\n\n for (const entity of sorted) {\n const maxEnd = maxEndByLabel.get(entity.label);\n if (maxEnd !== undefined && entity.end <= maxEnd) {\n // Nested inside a same-label entity: skip.\n continue;\n }\n maxEndByLabel.set(entity.label, entity.end);\n result.push(entity);\n }\n\n return result;\n};\n\n/**\n * Resolve cross-label overlaps that can arise when\n * `fixPartialWords` independently expands two\n * different-label entities toward the same word\n * boundary. The entity with the higher score (or\n * longer span on tie) keeps its boundary; the other\n * is trimmed so the overlap disappears.\n *\n * Preserved existing structure: sorted + early break\n * already gives good amortized behavior. O(n^2)\n * worst case but rare in practice.\n */\nconst resolveCrossLabelOverlaps = (\n entities: Entity[],\n fullText: string,\n): Entity[] => {\n const sorted = entities\n .map((e) => ({ ...e }))\n .sort((a, b) => a.start - b.start);\n\n for (let i = 0; i < sorted.length; i++) {\n for (let j = i + 1; j < sorted.length; j++) {\n const a = sorted[i];\n const b = sorted[j];\n if (!a || !b) continue;\n if (b.start >= a.end) break; // no overlap\n if (a.label === b.label) continue;\n\n // Skip full containment (one entity fully\n // inside another). Cross-label nesting is\n // valid and should be preserved.\n const aContainsB = a.start <= b.start && a.end >= b.end;\n const bContainsA = b.start <= a.start && b.end >= a.end;\n if (aContainsB || bContainsA) continue;\n\n // Partial overlap. Higher score wins; on tie\n // the longer span wins.\n const aLen = a.end - a.start;\n const bLen = b.end - b.start;\n const aWins = a.score > b.score || (a.score === b.score && aLen >= bLen);\n\n if (aWins) {\n // Trim b's start to a's end\n b.start = a.end;\n b.text = fullText.slice(b.start, b.end);\n } else {\n // Trim a's end to b's start. Because the\n // array is sorted by start and a.end can\n // only decrease, all remaining j will have\n // b.start >= a.end so the break fires\n // immediately.\n a.end = b.start;\n a.text = fullText.slice(a.start, a.end);\n }\n }\n }\n\n // Drop any entity that was trimmed to zero width.\n return sorted.filter((e) => e.start < e.end);\n};\n\n/**\n * Post-processing pass for entity boundary consistency.\n * Runs after mergeAndDedup, before false-positive\n * filtering.\n *\n * 1. Fix partial-word boundaries (respects cross-label\n * neighbors to avoid introducing new overlaps)\n * 2. Resolve any remaining cross-label overlaps\n * 3. Deduplicate identical [start, end, label] spans\n * 4. Merge adjacent same-label entities (catches any\n * new adjacency/overlap from step 1)\n * 5. Remove nested same-label entities\n */\nexport const enforceBoundaryConsistency = (\n entities: Entity[],\n fullText: string,\n): Entity[] => {\n const fixed = fixPartialWords(entities, fullText);\n const resolved = resolveCrossLabelOverlaps(fixed, fullText);\n const deduped = deduplicateSpans(resolved);\n const merged = mergeAdjacent(deduped, fullText);\n return removeNestedSameLabel(merged);\n};\n","/**\n * Build the unified search instances from all\n * detector pattern sources.\n *\n * Two TextSearch instances (not one) to avoid\n * 200K per-pattern object allocations:\n * 1. regex + triggers + legal-forms (mixed, ~140\n * patterns, caseInsensitive for trigger AC)\n * 2. deny-list + street-types + gazetteer\n * (caseInsensitive, overlap \"all\";\n * deny-list/street-type use per-pattern\n * wholeWords: true; gazetteer exact use\n * wholeWords: false; gazetteer fuzzy use\n * distance: 2 via @stll/fuzzy-search)\n *\n * All patterns are PatternEntry objects with\n * per-pattern literal/wholeWords settings.\n */\n\nimport type { PatternEntry, TextSearch } from \"@stll/text-search\";\n\nimport { getTextSearch } from \"./search-engine\";\n\nimport {\n isLegalFormsEnabled,\n type GazetteerEntry,\n type PipelineConfig,\n} from \"./types\";\nimport type { RegexMeta } from \"./detectors/regex\";\nimport type { TriggerRule } from \"./types\";\nimport type { DenyListData } from \"./detectors/deny-list\";\nimport type { PipelineContext } from \"./context\";\nimport { defaultContext } from \"./context\";\n\nimport {\n REGEX_PATTERNS,\n REGEX_META,\n getCurrencyPatterns,\n CURRENCY_PATTERN_META,\n getDatePatterns,\n DATE_PATTERN_META,\n getSigningClausePatterns,\n SIGNING_CLAUSE_META,\n} from \"./detectors/regex\";\nimport { buildLegalFormPatterns } from \"./detectors/legal-forms\";\nimport { buildTriggerPatterns } from \"./detectors/triggers\";\nimport { buildDenyList } from \"./detectors/deny-list\";\nimport { buildStreetTypePatterns } from \"./detectors/address-seeds\";\nimport { buildGazetteerPatterns } from \"./detectors/gazetteer\";\n\ntype PatternSlice = {\n start: number;\n end: number;\n};\n\nexport type GazetteerData = {\n /** Maps local pattern index to entry label. */\n labels: string[];\n /**\n * Whether each pattern is fuzzy (distance > 0).\n * Used by the post-processor to assign scores.\n */\n isFuzzy: boolean[];\n};\n\nexport type UnifiedSearchInstance = {\n /** Regex + triggers + legal-forms. */\n tsRegex: TextSearch;\n /** Deny-list + street-types + gazetteer. */\n tsLiterals: TextSearch;\n slices: {\n regex: PatternSlice;\n legalForms: PatternSlice;\n triggers: PatternSlice;\n denyList: PatternSlice;\n streetTypes: PatternSlice;\n gazetteer: PatternSlice;\n };\n regexMeta: readonly RegexMeta[];\n triggerRules: readonly TriggerRule[];\n denyListData: DenyListData | null;\n gazetteerData: GazetteerData | null;\n};\n\nexport const buildUnifiedSearch = async (\n config: PipelineConfig,\n gazetteerEntries: GazetteerEntry[] = [],\n ctx: PipelineContext = defaultContext,\n): Promise<UnifiedSearchInstance> => {\n const legalFormsEnabled = isLegalFormsEnabled(config);\n const [\n legalForms,\n triggers,\n denyListData,\n streetTypes,\n currencyPatterns,\n datePatterns,\n signingPatterns,\n ] = await Promise.all([\n legalFormsEnabled\n ? buildLegalFormPatterns()\n : Promise.resolve([] as string[]),\n config.enableTriggerPhrases\n ? buildTriggerPatterns()\n : Promise.resolve({\n patterns: [] as string[],\n rules: [] as TriggerRule[],\n }),\n config.enableDenyList ? buildDenyList(config, ctx) : Promise.resolve(null),\n buildStreetTypePatterns(),\n getCurrencyPatterns(),\n getDatePatterns(),\n getSigningClausePatterns(),\n ]);\n\n // ── Instance 1: regex + triggers + legal-forms ──\n // Trigger patterns are lowercased strings with\n // caseInsensitive on the AC. Regex patterns have\n // their own (?i) flags (caseInsensitive on AC\n // is ignored for regex since they route to\n // RegexSet). Legal-form patterns are regex too.\n //\n // Currency patterns (from currencies.json) are\n // appended after the static regex patterns; their\n // meta is spliced into regexMeta at the same offset.\n const allRegex = [\n ...(REGEX_PATTERNS as string[]),\n ...currencyPatterns,\n ...datePatterns,\n ...signingPatterns,\n ];\n const regexMeta: RegexMeta[] = [\n ...REGEX_META,\n ...currencyPatterns.map(() => CURRENCY_PATTERN_META),\n ...datePatterns.map(() => DATE_PATTERN_META),\n ...signingPatterns.map(() => SIGNING_CLAUSE_META),\n ];\n\n let offset = 0;\n\n const regexSlice = {\n start: offset,\n end: offset + allRegex.length,\n };\n offset = regexSlice.end;\n\n const legalFormsSlice = {\n start: offset,\n end: offset + legalForms.length,\n };\n offset = legalFormsSlice.end;\n\n const triggersSlice = {\n start: offset,\n end: offset + triggers.patterns.length,\n };\n\n // Trigger patterns need caseInsensitive on AC\n // (only ~120 objects, not 200K). Regex/legal-form\n // patterns are bare strings (auto-classified).\n const triggerEntries = triggers.patterns.map((p) => ({\n pattern: p,\n literal: true as const,\n caseInsensitive: true,\n }));\n\n const regexAllPatterns = [...allRegex, ...legalForms, ...triggerEntries];\n\n // TextSearch auto-detects DFA state explosion\n // (build time > 2ms) and falls back to individual\n // engines. No manual maxAlternations needed.\n const tsRegex = new (getTextSearch())(regexAllPatterns);\n\n // ── Instance 2: deny-list + street-types + gaz ──\n // Deny-list and street-type patterns are plain\n // strings (allLiteral). Gazetteer adds exact\n // literals plus fuzzy PatternEntry objects for\n // terms >= 4 chars.\n offset = 0;\n\n const denyListOriginals = denyListData?.originals ?? [];\n const denyListSlice = {\n start: offset,\n end: offset + denyListOriginals.length,\n };\n offset = denyListSlice.end;\n\n const streetTypesSlice = {\n start: offset,\n end: offset + streetTypes.length,\n };\n offset = streetTypesSlice.end;\n\n // Gazetteer patterns (exact + fuzzy)\n const gazResult =\n config.enableGazetteer && gazetteerEntries.length > 0\n ? buildGazetteerPatterns(gazetteerEntries)\n : null;\n\n const gazetteerSlice = {\n start: offset,\n end: offset + (gazResult?.patterns.length ?? 0),\n };\n offset = gazetteerSlice.end;\n\n // Build the combined pattern array.\n // Deny-list and street-type patterns use\n // per-pattern wholeWords: true (they are\n // known tokens). Gazetteer exact patterns\n // already set wholeWords: false in\n // buildGazetteerPatterns. The global\n // wholeWords is false so fuzzy patterns\n // (which don't support per-pattern override)\n // match without word-boundary constraints.\n const wrapWholeWord = (s: string): PatternEntry => ({\n pattern: s,\n literal: true as const,\n wholeWords: true,\n });\n const literalAllPatterns: PatternEntry[] = [\n ...denyListOriginals.map(wrapWholeWord),\n ...streetTypes.map(wrapWholeWord),\n ...(gazResult?.patterns ?? []),\n ];\n\n const tsLiterals =\n literalAllPatterns.length > 0\n ? new (getTextSearch())(literalAllPatterns, {\n caseInsensitive: true,\n overlapStrategy: \"all\",\n })\n : new (getTextSearch())([]);\n\n return {\n tsRegex,\n tsLiterals,\n slices: {\n regex: regexSlice,\n legalForms: legalFormsSlice,\n triggers: triggersSlice,\n denyList: denyListSlice,\n streetTypes: streetTypesSlice,\n gazetteer: gazetteerSlice,\n },\n regexMeta,\n triggerRules: triggers.rules,\n denyListData,\n gazetteerData: gazResult?.data ?? null,\n };\n};\n","/**\n * Run the two-instance unified search and return\n * raw matches. Two passes instead of six:\n * 1. regex + triggers + legal-forms\n * 2. deny-list + street-types (normalized text)\n */\n\nimport type { Match } from \"@stll/text-search\";\nimport type { UnifiedSearchInstance } from \"./build-unified-search\";\nimport { normalizeForSearch } from \"./util/normalize\";\n\nexport type UnifiedResult = {\n /** All matches from both instances combined. */\n regexMatches: Match[];\n literalMatches: Match[];\n};\n\nexport const runUnifiedSearch = (\n instance: UnifiedSearchInstance,\n fullText: string,\n): UnifiedResult => {\n // Pass 1: regex + triggers + legal-forms\n // on original text (regex patterns encode\n // their own case flags)\n const regexMatches = instance.tsRegex.findIter(fullText);\n\n // Pass 2: deny-list + street-types on\n // normalized text (NBSP, smart quotes folded)\n const normalized = normalizeForSearch(fullText);\n const literalMatches = instance.tsLiterals.findIter(normalized);\n\n return { regexMatches, literalMatches };\n};\n","import type { Entity } from \"../types\";\n\nconst MASK_TOKEN = \"[MASKED]\";\nconst MASK_LEN = MASK_TOKEN.length;\n\ntype OffsetSegment = {\n /** Start of this mask token in masked text */\n maskedStart: number;\n /** End of this mask token in masked text */\n maskedEnd: number;\n /** Cumulative shift: original - masked */\n shift: number;\n /** Original start of the masked span */\n origStart: number;\n /** Original end of the masked span */\n origEnd: number;\n};\n\nexport type MaskResult = {\n maskedText: string;\n /**\n * Maps masked-text offsets back to original offsets.\n * Returns null if the span overlaps a masked region.\n */\n offsetMap: (\n maskedStart: number,\n maskedEnd: number,\n ) => { start: number; end: number } | null;\n};\n\n/**\n * Replace detected entity spans with placeholder tokens.\n * Each entity span is replaced with \"[MASKED]\" (fixed\n * length). Returns the masked text and an offset mapping\n * function.\n */\nexport const maskDetectedSpans = (\n fullText: string,\n entities: Entity[],\n): MaskResult => {\n if (entities.length === 0) {\n return {\n maskedText: fullText,\n offsetMap: (s, e) => ({ start: s, end: e }),\n };\n }\n\n // Sort by start, then longest span first\n const sorted = entities.toSorted(\n (a, b) => a.start - b.start || b.end - a.end,\n );\n\n // Merge overlapping spans so we don't double-mask.\n // Adjacent (touching) spans are kept separate so each\n // produces its own [MASKED] token, preserving token\n // boundaries for the NER model.\n const spans: { start: number; end: number }[] = [];\n const first = sorted[0];\n if (!first) {\n return {\n maskedText: fullText,\n offsetMap: (s, e) => ({ start: s, end: e }),\n };\n }\n let cur = {\n start: first.start,\n end: first.end,\n };\n for (let i = 1; i < sorted.length; i++) {\n const s = sorted[i];\n if (!s) continue;\n if (s.start < cur.end) {\n cur.end = Math.max(cur.end, s.end);\n } else {\n spans.push(cur);\n cur = { start: s.start, end: s.end };\n }\n }\n spans.push(cur);\n\n // Build masked text and offset segments\n const segments: OffsetSegment[] = [];\n const parts: string[] = [];\n let prev = 0;\n let cumulativeShift = 0;\n\n for (const span of spans) {\n parts.push(fullText.slice(prev, span.start));\n parts.push(MASK_TOKEN);\n\n const origLen = span.end - span.start;\n const delta = origLen - MASK_LEN;\n cumulativeShift += delta;\n\n // Position of mask token in masked text\n const maskedStart = span.start - (cumulativeShift - delta);\n const maskedEnd = maskedStart + MASK_LEN;\n\n segments.push({\n maskedStart,\n maskedEnd,\n shift: cumulativeShift,\n origStart: span.start,\n origEnd: span.end,\n });\n\n prev = span.end;\n }\n parts.push(fullText.slice(prev));\n\n const maskedText = parts.join(\"\");\n\n const offsetMap = (\n maskedStart: number,\n maskedEnd: number,\n ): { start: number; end: number } | null => {\n // Check if span overlaps any masked region\n for (const seg of segments) {\n if (maskedStart < seg.maskedEnd && maskedEnd > seg.maskedStart) {\n return null;\n }\n }\n\n // Find cumulative shift for this position.\n // Since the overlap check above guarantees both\n // endpoints fall within the same gap zone, a\n // single shift value applies to both.\n let shift = 0;\n for (const seg of segments) {\n if (maskedStart >= seg.maskedEnd) {\n shift = seg.shift;\n } else {\n break;\n }\n }\n\n return {\n start: maskedStart + shift,\n end: maskedEnd + shift,\n };\n };\n\n return { maskedText, offsetMap };\n};\n\n/**\n * Map NER entities from masked-text offsets back to\n * original-text offsets. Discards any NER entity whose\n * mapped span overlaps a masked (rule-detected) region.\n */\nexport const unmaskNerEntities = (\n nerEntities: Entity[],\n maskResult: MaskResult,\n fullText: string,\n): Entity[] => {\n const result: Entity[] = [];\n\n for (const ner of nerEntities) {\n // offsetMap returns null when the mapped span\n // overlaps any merged rule-entity region, so no\n // secondary overlap check is needed.\n const mapped = maskResult.offsetMap(ner.start, ner.end);\n if (mapped === null) continue;\n\n result.push({\n ...ner,\n start: mapped.start,\n end: mapped.end,\n text: fullText.slice(mapped.start, mapped.end),\n });\n }\n\n return result;\n};\n","import {\n extractDefinedTerms,\n findCoreferenceSpans,\n} from \"./detectors/coreference\";\nimport { processGazetteerMatches } from \"./detectors/gazetteer\";\nimport { detectNameCorpus, initNameCorpus } from \"./detectors/names\";\nimport { processRegexMatches } from \"./detectors/regex\";\nimport { processLegalFormMatches } from \"./detectors/legal-forms\";\nimport { processTriggerMatches } from \"./detectors/triggers\";\nimport {\n ensureDenyListData,\n processDenyListMatches,\n} from \"./detectors/deny-list\";\nimport { processAddressSeeds } from \"./detectors/address-seeds\";\nimport { propagateOrgNames } from \"./detectors/org-propagation\";\nimport {\n boostNearMissEntities,\n detectStreetPatternsNearAddresses,\n detectOrphanStreetLines,\n initPrepositions,\n initStreetAbbrevs,\n} from \"./filters/confidence-boost\";\nimport {\n filterFalsePositives,\n loadGenericRoles,\n} from \"./filters/false-positives\";\nimport {\n applyZoneAdjustments,\n classifyZones,\n initZoneClassifier,\n type ZoneSpan,\n} from \"./filters/zone-classifier\";\nimport {\n applyHotwordRules,\n expandLabelsForHotwordRules,\n initHotwordRules,\n} from \"./filters/hotword-rules\";\nimport { enforceBoundaryConsistency } from \"./filters/boundary-consistency\";\nimport type { Entity, GazetteerEntry, PipelineConfig } from \"./types\";\nimport {\n DEFAULT_ENTITY_LABELS,\n DETECTOR_PRIORITY,\n isLegalFormsEnabled,\n} from \"./types\";\nimport {\n buildUnifiedSearch,\n type UnifiedSearchInstance,\n} from \"./build-unified-search\";\nimport { runUnifiedSearch } from \"./unified-search\";\nimport { maskDetectedSpans, unmaskNerEntities } from \"./util/entity-masking\";\nimport type { PipelineContext } from \"./context\";\nimport { defaultContext } from \"./context\";\n\n/**\n * Sources backed by curated literal dictionaries.\n * Longer matches from these sources are more specific,\n * so the containment rule trusts their length.\n */\nconst LITERAL_SOURCES: ReadonlySet<string> = new Set([\n \"deny-list\",\n \"gazetteer\",\n]);\n\nconst shouldReplace = (a: Entity, b: Entity): boolean => {\n const aLen = a.end - a.start;\n const bLen = b.end - b.start;\n // Containment: when a literal-match entity (deny-list\n // or gazetteer) fully contains a shorter entity with\n // the same label, prefer the longer one. Curated\n // dictionary entries are more specific when longer:\n // \"656 91 Brno\" (deny-list) should beat \"656 91\"\n // (regex) even though regex has higher priority.\n // Non-literal sources (trigger, regex, NER) are\n // excluded because their length does not reliably\n // indicate accuracy.\n if (\n a.label === b.label &&\n LITERAL_SOURCES.has(a.source) &&\n a.start <= b.start &&\n a.end >= b.end &&\n aLen > bLen\n ) {\n return true;\n }\n if (\n a.label === b.label &&\n LITERAL_SOURCES.has(b.source) &&\n b.start <= a.start &&\n b.end >= a.end &&\n bLen > aLen\n ) {\n return false;\n }\n const aPri = DETECTOR_PRIORITY[a.source] ?? 0;\n const bPri = DETECTOR_PRIORITY[b.source] ?? 0;\n if (aPri !== bPri) return aPri > bPri;\n return a.score > b.score || (a.score === b.score && aLen > bLen);\n};\n\n/** Labels where colons are structurally significant. */\nconst COLON_LABELS = new Set([\"ip address\", \"mac address\"]);\n\n/** Strip leading/trailing whitespace and punctuation. */\nexport const sanitizeEntities = (entities: Entity[]): Entity[] =>\n entities.flatMap((e) => {\n const strip = COLON_LABELS.has(e.label) ? /[\\s,;]+/ : /[\\s:,;]+/;\n // Also strip leading dots followed by whitespace —\n // artifact from trigger extraction after abbreviations\n // like \"dat. nar.\" or \"č.p.\" where the extraction\n // starts at the trailing dot of the abbreviation.\n const leadTrimmed = e.text\n .replace(/^(?:\\.\\s)+/, \"\")\n .replace(new RegExp(`^${strip.source}`, strip.flags), \"\");\n const lead = e.text.length - leadTrimmed.length;\n const cleaned = leadTrimmed.replace(\n new RegExp(`${strip.source}$`, strip.flags),\n \"\",\n );\n if (cleaned.length === 0) return [];\n // Reject entities with no alphanumeric content\n if (!/[\\p{L}\\p{N}]/u.test(cleaned)) return [];\n // Collapse internal whitespace runs (address entities\n // spanning multiple lines in structured documents)\n const collapsed = cleaned.replace(/\\s*\\n\\s*/g, \" \").replace(/\\s{2,}/g, \" \");\n if (collapsed === e.text) return [e];\n return [\n {\n ...e,\n start: e.start + lead,\n end: e.start + lead + collapsed.length,\n text: collapsed,\n },\n ];\n });\n\nexport const mergeAndDedup = (...layers: Entity[][]): Entity[] => {\n const all: Entity[] = [];\n for (const layer of layers) {\n for (const entity of layer) {\n all.push(entity);\n }\n }\n if (all.length === 0) return [];\n\n const sorted = all.toSorted((a, b) => a.start - b.start);\n\n // Single-pass sweep-line: since entities are sorted\n // by start, a new entity can only overlap the tail\n // of merged[] (all earlier entries end before it).\n const first = sorted[0];\n if (!first) return [];\n const merged: Entity[] = [{ ...first }];\n\n for (let i = 1; i < sorted.length; i++) {\n const entity = sorted[i];\n const last = merged[merged.length - 1];\n if (!entity || !last) continue;\n\n if (last.end <= entity.start) {\n // No overlap: append.\n merged.push({ ...entity });\n } else if (shouldReplace(entity, last)) {\n // Overlap: new entity wins.\n merged[merged.length - 1] = { ...entity };\n }\n // else: overlap but existing wins; discard entity.\n }\n\n return sanitizeEntities(merged);\n};\n\nexport type NerInferenceFn = (\n fullText: string,\n labels: string[],\n threshold: number,\n signal?: AbortSignal,\n) => Promise<Entity[]>;\n\n/**\n * Extend monetary amount entities to include a trailing\n * \"(slovy ...)\" or \"(slovně ...)\" parenthetical that\n * spells out the amount in words. Common in Czech legal\n * documents, e.g. \"1 529,-Kč (slovy jeden-tisíc)\".\n *\n * Keywords are loaded from amount-words.json config so\n * new languages can be added without code changes.\n */\ntype AmountWordsConfig = {\n patterns: { lang: string; keywords: string[] }[];\n};\n\nconst escapeRegex = (s: string): string =>\n s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nlet amountWordsRe: RegExp | null = null;\nlet amountWordsLoaded = false;\n\nconst getAmountWordsRe = async (): Promise<RegExp> => {\n if (amountWordsLoaded && amountWordsRe) {\n return amountWordsRe;\n }\n try {\n const mod = await import(\"@stll/anonymize-data/config/amount-words.json\");\n // eslint-disable-next-line no-unsafe-type-assertion -- JSON module shape\n const data = (mod as { default: AmountWordsConfig }).default;\n const keywords = data.patterns.flatMap((p) => p.keywords);\n const alt = keywords.map(escapeRegex).join(\"|\");\n amountWordsRe = new RegExp(\n `^[,;]?[^\\\\S\\\\n]*(\\\\((?:${alt})[:\\\\s][^)\\\\n]{1,120}\\\\))`,\n \"i\",\n );\n } catch {\n // Fallback: original Czech-only pattern\n amountWordsRe = /^[,;]?[^\\S\\n]*(\\((?:slovy|slovně)[:\\s][^)\\n]{1,120}\\))/i;\n }\n amountWordsLoaded = true;\n return amountWordsRe;\n};\n\nconst extendMonetaryAmountWords = (\n entities: Entity[],\n fullText: string,\n re: RegExp,\n): Entity[] =>\n entities.map((e) => {\n if (e.label !== \"monetary amount\") return e;\n const after = fullText.slice(e.end);\n const m = re.exec(after);\n if (!m) return e;\n const newEnd = e.end + m[0].length;\n return {\n ...e,\n end: newEnd,\n text: fullText.slice(e.start, newEnd),\n };\n });\n\ntype AllowedLabelSet = ReadonlySet<string> | null;\n\nconst createAllowedLabelSetFromLabels = (\n labels: readonly string[],\n): AllowedLabelSet => (labels.length > 0 ? new Set(labels) : null);\n\nconst createAllowedLabelSet = (config: PipelineConfig): AllowedLabelSet =>\n createAllowedLabelSetFromLabels(config.labels);\n\nconst filterAllowedLabels = (\n entities: Entity[],\n allowedLabels: AllowedLabelSet,\n): Entity[] => {\n if (!allowedLabels) {\n return entities;\n }\n return entities.filter((e) => allowedLabels.has(e.label));\n};\n\nconst labelIsAllowed = (\n label: string,\n allowedLabels: AllowedLabelSet,\n): boolean => !allowedLabels || allowedLabels.has(label);\n\nconst getRequestedNerLabels = (\n config: PipelineConfig,\n expandForHotwords = false,\n): readonly string[] => {\n const labels =\n config.labels.length > 0 ? config.labels : DEFAULT_ENTITY_LABELS;\n return expandForHotwords ? expandLabelsForHotwordRules(labels) : labels;\n};\n\nconst checkAbort = (signal?: AbortSignal): void => {\n if (signal?.aborted) {\n throw new DOMException(\"Pipeline aborted\", \"AbortError\");\n }\n};\n\nconst configKey = (\n config: PipelineConfig,\n gazetteerEntries: GazetteerEntry[],\n): string => {\n const legalFormsEnabled = isLegalFormsEnabled(config);\n // Gazetteer fingerprint: sorted entry IDs,\n // canonical forms, labels, and variants.\n // Skip when gazetteer is disabled to avoid\n // unnecessary cache misses.\n const gazFingerprint =\n config.enableGazetteer && gazetteerEntries.length > 0\n ? gazetteerEntries\n .map(\n (e) =>\n `${e.id}:${e.canonical}:${e.label}:${[...e.variants].sort().join(\",\")}`,\n )\n .toSorted()\n .join(\";\")\n : \"\";\n return (\n `${config.enableDenyList}:` +\n `${config.enableTriggerPhrases}:` +\n `${legalFormsEnabled}:` +\n `${config.enableNameCorpus}:` +\n `${config.denyListCountries?.toSorted().join(\",\") ?? \"\"}:` +\n `${config.denyListRegions?.toSorted().join(\",\") ?? \"\"}:` +\n `${config.denyListExcludeCategories?.toSorted().join(\",\") ?? \"\"}:` +\n `${config.enableGazetteer}:${gazFingerprint}`\n );\n};\n\n/**\n * Get or build a cached search instance. Cache state\n * lives on the provided PipelineContext, not at module\n * level.\n */\nconst getCachedSearch = async (\n config: PipelineConfig,\n gazetteerEntries: GazetteerEntry[],\n ctx: PipelineContext,\n): Promise<UnifiedSearchInstance> => {\n const key = configKey(config, gazetteerEntries);\n if (ctx.search && ctx.searchKey === key) {\n return ctx.search;\n }\n if (ctx.searchPromise && ctx.searchKey === key) {\n return ctx.searchPromise;\n }\n // Build new search. Null the cached instance first\n // so concurrent callers don't use stale data while\n // the new build is in flight.\n ctx.search = null;\n ctx.searchKey = key;\n const promise = buildUnifiedSearch(config, gazetteerEntries, ctx);\n ctx.searchPromise = promise;\n const result = await promise;\n // Guard: another call may have replaced the key\n // while we were awaiting. Only cache if still ours.\n if (ctx.searchKey === key) {\n ctx.search = result;\n }\n return result;\n};\n\n/**\n * Options for {@link runPipeline}.\n *\n * @property cachedSearch Pre-built search instance.\n * When provided, `config` and `gazetteerEntries`\n * are not used for building; the caller must\n * ensure the instance matches both parameters.\n */\nexport type PipelineOptions = {\n fullText: string;\n config: PipelineConfig;\n gazetteerEntries: GazetteerEntry[];\n nerInference?: NerInferenceFn | null;\n onProgress?: (step: string, detail: string) => void;\n cachedSearch?: UnifiedSearchInstance;\n signal?: AbortSignal;\n context?: PipelineContext;\n};\n\n/**\n * Run the full detection pipeline.\n *\n * Two TextSearch instances scan the text (regex +\n * literals). Results are dispatched to each\n * detector's post-processor by pattern index range.\n *\n * Pass an AbortSignal to cancel the pipeline between\n * stages. Throws a DOMException with name \"AbortError\"\n * when cancelled.\n *\n * Pass an optional `context` to isolate cached state\n * from other pipeline runs. If omitted, a module-level\n * default context is used (backward compatible).\n */\nexport const runPipeline = async (\n options: PipelineOptions,\n): Promise<Entity[]> => {\n const {\n fullText,\n config,\n gazetteerEntries,\n nerInference = null,\n onProgress,\n cachedSearch,\n signal,\n context,\n } = options;\n const ctx = context ?? defaultContext;\n const allowedLabels = createAllowedLabelSet(config);\n const legalFormsEnabled = isLegalFormsEnabled(config);\n\n const log = (step: string, detail: string) => {\n onProgress?.(step, detail);\n };\n\n checkAbort(signal);\n\n // Ensure generic-roles data, zone config, hotword\n // rules, and prepositions are loaded before the\n // pipeline runs. All are no-ops after the first call.\n let zoneInitOk = false;\n const enableHotwords = config.enableHotwordRules === true;\n let hotwordInitOk = false;\n const hotwordInit = enableHotwords\n ? initHotwordRules()\n .then(() => {\n hotwordInitOk = true;\n })\n .catch((err: unknown) => {\n log(\"hotwords\", \"init failed; skipping\");\n console.warn(\"[anonymize] hotword rules init failed\", err);\n })\n : Promise.resolve();\n if (config.enableZoneClassification) {\n const zoneInit = initZoneClassifier(ctx)\n .then(() => {\n zoneInitOk = true;\n })\n .catch((err: unknown) => {\n log(\"zones\", \"init failed; skipping\");\n console.warn(\"[anonymize] zone classifier init failed\", err);\n });\n await Promise.all([\n loadGenericRoles(ctx),\n initPrepositions(),\n initStreetAbbrevs(),\n zoneInit,\n hotwordInit,\n ]);\n } else {\n await Promise.all([\n loadGenericRoles(ctx),\n initPrepositions(),\n initStreetAbbrevs(),\n hotwordInit,\n ]);\n }\n\n // When a pre-built search is provided, buildDenyList\n // was skipped for this context. Ensure stopwords,\n // allow list, and person stopwords are loaded so\n // processDenyListMatches filters correctly.\n if (cachedSearch && config.enableDenyList) {\n await ensureDenyListData(ctx);\n }\n\n // Classify document zones once up front\n let zones: ZoneSpan[] = [];\n if (config.enableZoneClassification && zoneInitOk) {\n zones = classifyZones(fullText, ctx);\n if (zones.length > 0) {\n const zoneNames = [...new Set(zones.map((z) => z.zone))];\n log(\"zones\", zoneNames.join(\", \"));\n }\n }\n\n checkAbort(signal);\n\n const hotwordsActive = enableHotwords && hotwordInitOk;\n const preHotwordAllowedLabels = hotwordsActive\n ? createAllowedLabelSetFromLabels(\n expandLabelsForHotwordRules(config.labels),\n )\n : allowedLabels;\n\n const search =\n cachedSearch ?? (await getCachedSearch(config, gazetteerEntries, ctx));\n\n checkAbort(signal);\n\n // Two-pass scan (regex + literals)\n const { regexMatches, literalMatches } = runUnifiedSearch(search, fullText);\n const { slices } = search;\n\n const rawRegexEntities = config.enableRegex\n ? processRegexMatches(\n regexMatches,\n slices.regex.start,\n slices.regex.end,\n search.regexMeta,\n )\n : [];\n const regexEntities = filterAllowedLabels(\n rawRegexEntities,\n preHotwordAllowedLabels,\n );\n if (regexEntities.length > 0) log(\"regex\", `${regexEntities.length} matches`);\n\n const rawLegalFormEntities = legalFormsEnabled\n ? processLegalFormMatches(\n regexMatches,\n slices.legalForms.start,\n slices.legalForms.end,\n fullText,\n )\n : [];\n const legalFormEntities = filterAllowedLabels(\n rawLegalFormEntities,\n preHotwordAllowedLabels,\n );\n if (legalFormEntities.length > 0)\n log(\"legal-forms\", `${legalFormEntities.length} matches`);\n\n const rawTriggerEntities = config.enableTriggerPhrases\n ? processTriggerMatches(\n regexMatches,\n slices.triggers.start,\n slices.triggers.end,\n fullText,\n search.triggerRules,\n )\n : [];\n const triggerEntities = filterAllowedLabels(\n rawTriggerEntities,\n preHotwordAllowedLabels,\n );\n if (triggerEntities.length > 0)\n log(\"trigger-phrases\", `${triggerEntities.length} matches`);\n\n checkAbort(signal);\n\n let rawNameCorpusEntities: Entity[] = [];\n let nameCorpusEntities: Entity[] = [];\n if (config.enableNameCorpus && !config.enableDenyList) {\n await initNameCorpus(ctx);\n checkAbort(signal);\n rawNameCorpusEntities = detectNameCorpus(fullText, ctx);\n nameCorpusEntities = filterAllowedLabels(\n rawNameCorpusEntities,\n preHotwordAllowedLabels,\n );\n log(\"name-corpus\", `${nameCorpusEntities.length} matches`);\n }\n\n const rawDenyListEntities =\n config.enableDenyList && search.denyListData\n ? processDenyListMatches(\n literalMatches,\n slices.denyList.start,\n slices.denyList.end,\n fullText,\n search.denyListData,\n ctx,\n )\n : [];\n const denyListEntities = filterAllowedLabels(\n rawDenyListEntities,\n preHotwordAllowedLabels,\n );\n if (denyListEntities.length > 0)\n log(\"deny-list\", `${denyListEntities.length} matches`);\n\n // Gazetteer: unified into tsLiterals\n const rawGazetteerEntities =\n config.enableGazetteer && search.gazetteerData\n ? processGazetteerMatches(\n literalMatches,\n slices.gazetteer.start,\n slices.gazetteer.end,\n fullText,\n search.gazetteerData,\n )\n : [];\n const gazetteerEntities = filterAllowedLabels(\n rawGazetteerEntities,\n preHotwordAllowedLabels,\n );\n if (gazetteerEntities.length > 0)\n log(\"gazetteer\", `${gazetteerEntities.length} matches`);\n\n checkAbort(signal);\n\n const ruleContextEntities = [\n ...rawTriggerEntities,\n ...rawRegexEntities,\n ...rawLegalFormEntities,\n ...rawNameCorpusEntities,\n ...rawDenyListEntities,\n ...rawGazetteerEntities,\n ];\n\n // NER (mask rule-detected spans so the model doesn't\n // produce contradictory boundaries for known entities)\n let rawNerEntities: Entity[] = [];\n let nerEntities: Entity[] = [];\n if (config.enableNer && nerInference) {\n const maskResult = maskDetectedSpans(fullText, ruleContextEntities);\n log(\"ner\", \"running inference...\");\n const rawNer = await nerInference(\n maskResult.maskedText,\n [...getRequestedNerLabels(config, hotwordsActive)],\n config.threshold,\n signal,\n );\n rawNerEntities = unmaskNerEntities(rawNer, maskResult, fullText);\n nerEntities = filterAllowedLabels(rawNerEntities, preHotwordAllowedLabels);\n const masked = rawNer.length - rawNerEntities.length;\n const labelFiltered = rawNerEntities.length - nerEntities.length;\n log(\n \"ner\",\n `${nerEntities.length} entities` +\n (masked > 0 ? ` (${masked} masked)` : \"\") +\n (labelFiltered > 0 ? ` (${labelFiltered} label-filtered)` : \"\"),\n );\n }\n\n checkAbort(signal);\n\n // Address seed expansion\n const preAddressEntities = [\n ...triggerEntities,\n ...regexEntities,\n ...legalFormEntities,\n ...nameCorpusEntities,\n ...denyListEntities,\n ...gazetteerEntities,\n ...nerEntities,\n ];\n const addressSeedEntities = labelIsAllowed(\"address\", allowedLabels)\n ? await processAddressSeeds(\n literalMatches,\n slices.streetTypes.start,\n slices.streetTypes.end,\n fullText,\n [...ruleContextEntities, ...rawNerEntities],\n )\n : [];\n if (addressSeedEntities.length > 0)\n log(\"address-seeds\", `${addressSeedEntities.length} expanded`);\n\n checkAbort(signal);\n\n // Zone-based score adjustment: apply before\n // threshold filtering so entities in PII-dense zones\n // can cross the threshold.\n const zoneAdjusted = applyZoneAdjustments(\n [...preAddressEntities, ...addressSeedEntities],\n zones,\n );\n\n // Hotword context rules: boost or reclassify\n // entities near relevant keywords. Applied after\n // zone adjustments so both effects stack.\n const preBoostEntities = hotwordsActive\n ? filterAllowedLabels(\n applyHotwordRules(zoneAdjusted, fullText),\n allowedLabels,\n )\n : zoneAdjusted;\n\n // Confidence boost + threshold filter\n let allEntities: Entity[];\n if (config.enableConfidenceBoost) {\n allEntities = boostNearMissEntities(preBoostEntities, config.threshold);\n const boosted =\n allEntities.length -\n preBoostEntities.filter((e) => e.score >= config.threshold).length;\n if (boosted > 0) log(\"confidence-boost\", `${boosted} near-miss promoted`);\n } else {\n allEntities = preBoostEntities.filter((e) => e.score >= config.threshold);\n }\n\n // Street patterns near existing addresses\n // (e.g. \"Ostrovni 225/1\" near \"110 00 Praha 1\")\n const streetPatterns = labelIsAllowed(\"address\", allowedLabels)\n ? detectStreetPatternsNearAddresses(fullText, allEntities)\n : [];\n if (streetPatterns.length > 0) {\n allEntities = [...allEntities, ...streetPatterns];\n log(\n \"street-context\",\n `${streetPatterns.length} street patterns near addresses`,\n );\n }\n\n // Orphan street lines in header zone\n const orphanStreets = labelIsAllowed(\"address\", allowedLabels)\n ? detectOrphanStreetLines(fullText, allEntities)\n : [];\n if (orphanStreets.length > 0) {\n allEntities = [...allEntities, ...orphanStreets];\n log(\"orphan-streets\", `${orphanStreets.length} header street lines`);\n }\n\n // Merge + dedup\n const rawMerged = mergeAndDedup(allEntities);\n log(\"merge\", `${rawMerged.length} after dedup`);\n\n // Extend monetary amounts to include trailing\n // \"(slovy ...)\" or \"(slovně ...)\" parentheticals.\n // Runs after dedup so each monetary span is unique,\n // preventing duplicate extensions from clobbering\n // unrelated entities between e.end and newEnd.\n const amountWordsRe = await getAmountWordsRe();\n const mergedExtended = extendMonetaryAmountWords(\n rawMerged,\n fullText,\n amountWordsRe,\n );\n\n // Boundary consistency (merge adjacent, fix partial\n // words, remove nested same-label)\n const consistent = enforceBoundaryConsistency(mergedExtended, fullText);\n if (consistent.length < mergedExtended.length)\n log(\n \"boundary\",\n `${mergedExtended.length - consistent.length} consolidated`,\n );\n\n // Organization name propagation: strip legal form\n // suffixes from detected orgs and re-scan for bare\n // mentions of the base name. Gated by enableCoreference\n // since this is a coreference-like pass. Propagated\n // entities are filtered by the configured threshold to\n // ensure they respect the caller's confidence floor.\n let postOrgEntities = consistent;\n if (\n config.enableCoreference &&\n labelIsAllowed(\"organization\", allowedLabels)\n ) {\n const orgPropagated = propagateOrgNames(consistent, fullText);\n const thresholded = orgPropagated.filter(\n (e) => e.score >= config.threshold,\n );\n if (thresholded.length > 0) {\n postOrgEntities = mergeAndDedup(consistent, thresholded);\n log(\"org-propagation\", `${thresholded.length} base names`);\n }\n }\n\n // False-positive filtering\n const merged = filterFalsePositives(postOrgEntities, ctx, fullText);\n if (merged.length < postOrgEntities.length)\n log(\"filter\", `removed ${postOrgEntities.length - merged.length} FPs`);\n\n checkAbort(signal);\n\n // Coreference\n // Clear stale entries unconditionally so a reused\n // context doesn't leak sourceText across documents.\n ctx.corefSourceMap.clear();\n if (config.enableCoreference) {\n const terms = await extractDefinedTerms(fullText, merged, ctx);\n if (terms.length > 0) {\n log(\"coreference\", `${terms.length} defined terms`);\n const corefSpans = findCoreferenceSpans(fullText, terms, ctx);\n if (corefSpans.length > 0) {\n log(\"coreference-rescan\", `${corefSpans.length} aliases`);\n const corefMerged = mergeAndDedup(merged, corefSpans);\n const corefConsistent = enforceBoundaryConsistency(\n corefMerged,\n fullText,\n );\n return sanitizeEntities(\n filterAllowedLabels(\n filterFalsePositives(corefConsistent, ctx, fullText),\n allowedLabels,\n ),\n );\n }\n }\n }\n\n // Re-sanitize: enforceBoundaryConsistency may adjust\n // entity boundaries after mergeAndDedup's sanitization,\n // potentially re-introducing whitespace or punctuation.\n return sanitizeEntities(filterAllowedLabels(merged, allowedLabels));\n};\n","import type {\n AnonymisationOperator,\n OperatorConfig,\n OperatorType,\n} from \"./types\";\n\n// ── Operator registry ──────────────────────────────────\n\nconst replaceOperator: AnonymisationOperator = {\n type: \"replace\",\n reversibility: \"reversible\",\n apply: (_text, _label, placeholder) => placeholder,\n};\n\nconst redactOperator: AnonymisationOperator = {\n type: \"redact\",\n reversibility: \"irreversible\",\n apply: (_text, _label, _placeholder, redactString) => redactString,\n};\n\nexport const OPERATOR_REGISTRY = {\n replace: replaceOperator,\n redact: redactOperator,\n} as const satisfies Record<OperatorType, AnonymisationOperator>;\n\nconst DEFAULT_REDACT_STRING = \"[REDACTED]\";\n\n/**\n * Default operator config: replace for all labels.\n * Preserves existing pipeline behaviour.\n */\nexport const DEFAULT_OPERATOR_CONFIG: OperatorConfig = {\n operators: {},\n redactString: DEFAULT_REDACT_STRING,\n};\n\n/**\n * Resolve the operator for a label, falling back to \"replace\".\n */\nexport const resolveOperator = (\n config: OperatorConfig,\n label: string,\n): OperatorType => config.operators[label] ?? \"replace\";\n","import {\n DEFAULT_OPERATOR_CONFIG,\n OPERATOR_REGISTRY,\n resolveOperator,\n} from \"./operators\";\nimport type {\n Entity,\n OperatorConfig,\n OperatorType,\n RedactionResult,\n} from \"./types\";\nimport type { PipelineContext } from \"./context\";\nimport { corefKey, defaultContext } from \"./context\";\n\nconst WHITESPACE_RE = /\\s+/g;\nconst PHONE_NOISE_RE = /[()\\s-]/g;\nconst SPACE_DASH_RE = /[\\s-]/g;\n\n/**\n * Normalize entity text so that surface-form variations\n * of the same real-world value map to a single canonical\n * key. Lowercased emails, stripped phone formatting, etc.\n */\nconst normalizeEntityText = (label: string, text: string): string => {\n const upper = label.toUpperCase().replace(WHITESPACE_RE, \"_\");\n\n if (upper === \"EMAIL_ADDRESS\" || upper === \"EMAIL\") {\n return text.toLowerCase().trim();\n }\n if (upper === \"PHONE_NUMBER\" || upper === \"PHONE\") {\n return text.replace(PHONE_NOISE_RE, \"\");\n }\n if (\n upper === \"IBAN\" ||\n upper === \"BANK_ACCOUNT_NUMBER\" ||\n upper === \"TAX_IDENTIFICATION_NUMBER\" ||\n upper === \"REGISTRATION_NUMBER\"\n ) {\n return text.replace(SPACE_DASH_RE, \"\").toUpperCase();\n }\n if (\n upper === \"PERSON\" ||\n upper === \"ORGANIZATION\" ||\n upper === \"ADDRESS\" ||\n upper === \"LAND_PARCEL\"\n ) {\n return text.replace(WHITESPACE_RE, \" \").toLowerCase().trim();\n }\n return text.trim();\n};\n\n/**\n * Build a stable mapping from entity text to numbered\n * placeholders. Same real-world value always maps to the\n * same placeholder (e.g., \"Dr. Muller\" and \"Dr. Muller\"\n * both become [PERSON_1]).\n *\n * Placeholder format: [LABEL_N] where LABEL is uppercase\n * and N is a 1-based counter per label.\n *\n * @param ctx Pipeline context. Must be the same instance\n * passed to `runPipeline` (or `findCoreferenceSpans`)\n * so coreference placeholder links are preserved.\n * Defaults to `defaultContext` for single-tenant usage.\n */\nexport const buildPlaceholderMap = (\n entities: Entity[],\n ctx: PipelineContext = defaultContext,\n): Map<string, string> => {\n const counters = new Map<string, number>();\n const textLabelToPlaceholder = new Map<string, string>();\n const normalizedToPlaceholder = new Map<string, string>();\n\n const sorted = entities.toSorted((a, b) => a.start - b.start);\n\n for (const entity of sorted) {\n const compositeKey = `${entity.label}\\0${entity.text}`;\n if (textLabelToPlaceholder.has(compositeKey)) {\n continue;\n }\n\n const labelKey = entity.label.toUpperCase().replace(WHITESPACE_RE, \"_\");\n\n // Coreference side-channel: if this entity is a\n // coref alias, look up the source entity's\n // placeholder so both get the same number.\n const sourceText = ctx.corefSourceMap.get(corefKey(entity));\n if (sourceText !== undefined) {\n const sourceNormalized = normalizeEntityText(entity.label, sourceText);\n const sourceNormalizedKey = `${labelKey}\\0${sourceNormalized}`;\n const sourceExisting = normalizedToPlaceholder.get(sourceNormalizedKey);\n if (sourceExisting) {\n textLabelToPlaceholder.set(compositeKey, sourceExisting);\n continue;\n }\n }\n\n const normalized = normalizeEntityText(entity.label, entity.text);\n const normalizedKey = `${labelKey}\\0${normalized}`;\n const existing = normalizedToPlaceholder.get(normalizedKey);\n if (existing) {\n textLabelToPlaceholder.set(compositeKey, existing);\n continue;\n }\n\n const count = (counters.get(labelKey) ?? 0) + 1;\n counters.set(labelKey, count);\n\n const placeholder = `[${labelKey}_${count}]`;\n textLabelToPlaceholder.set(compositeKey, placeholder);\n normalizedToPlaceholder.set(normalizedKey, placeholder);\n }\n\n return textLabelToPlaceholder;\n};\n\n/**\n * Apply redactions to the source text, replacing each\n * confirmed entity span using the configured operator.\n *\n * Co-references are consistent: if the same text appears\n * multiple times, all occurrences get the same placeholder.\n *\n * @param ctx Pipeline context. Must be the same instance\n * passed to `runPipeline` (or `findCoreferenceSpans`)\n * so coreference placeholder links are preserved.\n * Defaults to `defaultContext` for single-tenant usage.\n */\nexport const redactText = (\n fullText: string,\n entities: Entity[],\n config: OperatorConfig = DEFAULT_OPERATOR_CONFIG,\n ctx: PipelineContext = defaultContext,\n): RedactionResult => {\n if (entities.length === 0) {\n return {\n redactedText: fullText,\n redactionMap: new Map(),\n operatorMap: new Map(),\n entityCount: 0,\n };\n }\n\n const placeholderMap = buildPlaceholderMap(entities, ctx);\n\n const sorted = entities.toSorted((a, b) => a.start - b.start);\n\n // Remove overlapping spans (keep first occurrence)\n const nonOverlapping: Entity[] = [];\n let lastEnd = 0;\n for (const entity of sorted) {\n if (entity.start >= lastEnd) {\n nonOverlapping.push(entity);\n lastEnd = entity.end;\n }\n }\n\n const parts: string[] = [];\n const redactionMap = new Map<string, string>();\n const operatorMap = new Map<string, OperatorType>();\n let cursor = 0;\n\n for (const entity of nonOverlapping) {\n if (entity.start > cursor) {\n parts.push(fullText.slice(cursor, entity.start));\n }\n\n const placeholder =\n placeholderMap.get(`${entity.label}\\0${entity.text}`) ??\n `[${entity.label.toUpperCase().replace(/\\s+/g, \"_\")}]`;\n\n const opType = resolveOperator(config, entity.label);\n const operator = OPERATOR_REGISTRY[opType];\n\n const replacement = operator.apply(\n entity.text,\n entity.label,\n placeholder,\n config.redactString,\n );\n\n parts.push(replacement);\n // operatorMap is keyed by the conceptual placeholder\n // ([LABEL_N]), not by the replacement text. For \"redact\"\n // operators the placeholder never appears in the output;\n // the map is only consulted via exportRedactionKey which\n // iterates redactionMap (replace entries only).\n operatorMap.set(placeholder, opType);\n\n // Only populate redactionMap for reversible operators\n if (\n operator.reversibility === \"reversible\" &&\n !redactionMap.has(placeholder)\n ) {\n redactionMap.set(placeholder, entity.text);\n }\n\n cursor = entity.end;\n }\n\n if (cursor < fullText.length) {\n parts.push(fullText.slice(cursor));\n }\n\n return {\n redactedText: parts.join(\"\"),\n redactionMap,\n operatorMap,\n entityCount: nonOverlapping.length,\n };\n};\n\n/**\n * Serialize the redaction key to JSON for export.\n * Includes operator metadata so the export is self-describing.\n */\nexport const exportRedactionKey = (\n redactionMap: Map<string, string>,\n operatorMap: Map<string, OperatorType>,\n): string => {\n const entries: Record<string, { original: string; operator: OperatorType }> =\n {};\n\n for (const [placeholder, value] of redactionMap) {\n entries[placeholder] = {\n original: value,\n operator: operatorMap.get(placeholder) ?? \"replace\",\n };\n }\n\n return JSON.stringify({ entries }, null, 2);\n};\n\n/**\n * De-anonymise text using a redaction key.\n * Replaces placeholders back with original values.\n * Only works for reversible operators (replace).\n */\nexport const deanonymise = (\n redactedText: string,\n redactionMap: Map<string, string>,\n): string => {\n let result = redactedText;\n\n for (const [placeholder, original] of redactionMap) {\n result = result.replaceAll(placeholder, original);\n }\n\n return result;\n};\n","/**\n * Decode ONNX model output into entity spans.\n *\n * The span-level model outputs a logits tensor of shape\n * [batch, inputLength, maxWidth, numEntities]. This module\n * applies sigmoid, thresholds, and greedy non-overlapping\n * selection to produce the final entity list.\n */\nimport type { RawInferenceResult } from \"./types\";\n\ntype Span = [string, number, number, string, number];\n\nconst sigmoid = (x: number): number => 1 / (1 + Math.exp(-x));\n\n/** Check if two spans overlap (optionally allowing multi-label). */\nconst hasOverlapping = (\n a: number[],\n b: number[],\n multiLabel: boolean,\n): boolean => {\n const a0 = a[0] ?? 0;\n const a1 = a[1] ?? 0;\n const b0 = b[0] ?? 0;\n const b1 = b[1] ?? 0;\n if (a0 === b0 && a1 === b1) {\n return !multiLabel;\n }\n return !(a0 > b1 || b0 > a1);\n};\n\n/**\n * Greedy non-overlapping span selection.\n * Sorts by score descending, keeps each span only if it\n * doesn't overlap with already-selected spans.\n */\nconst greedySearch = (\n spans: Span[],\n flatNer: boolean,\n multiLabel: boolean,\n): Span[] => {\n const sorted = spans.toSorted((a, b) => b[4] - a[4]);\n const selected: Span[] = [];\n\n for (const span of sorted) {\n const overlaps = selected.some((s) => {\n if (flatNer) {\n return hasOverlapping([span[1], span[2]], [s[1], s[2]], multiLabel);\n }\n // Non-flat: also allow nested spans\n const isNested =\n (span[1] <= s[1] && span[2] >= s[2]) ||\n (s[1] <= span[1] && s[2] >= span[2]);\n if (isNested) {\n return false;\n }\n return hasOverlapping([span[1], span[2]], [s[1], s[2]], multiLabel);\n });\n\n if (!overlaps) {\n selected.push(span);\n }\n }\n\n return selected.toSorted((a, b) => a[1] - b[1]);\n};\n\n/**\n * Decode span-level model logits into entity results.\n */\nexport const decodeSpans = (\n batchSize: number,\n inputLength: number,\n maxWidth: number,\n numEntities: number,\n texts: string[],\n batchIds: number[],\n batchWordsStartIdx: number[][],\n batchWordsEndIdx: number[][],\n idToClass: Record<number, string>,\n modelOutput: ArrayLike<number>,\n flatNer: boolean,\n threshold: number,\n multiLabel: boolean,\n): RawInferenceResult => {\n const spans: Span[][] = Array.from({ length: batchSize }, () => []);\n\n const batchPadding = inputLength * maxWidth * numEntities;\n const startTokenPadding = maxWidth * numEntities;\n const endTokenPadding = numEntities;\n\n for (let id = 0; id < modelOutput.length; id++) {\n const batch = Math.floor(id / batchPadding);\n const startToken = Math.floor(id / startTokenPadding) % inputLength;\n const endToken = startToken + (Math.floor(id / endTokenPadding) % maxWidth);\n const entity = id % numEntities;\n\n const prob = sigmoid(modelOutput[id] ?? 0);\n\n const batchStarts = batchWordsStartIdx[batch];\n const batchEnds = batchWordsEndIdx[batch];\n const batchSpans = spans[batch];\n if (!batchStarts || !batchEnds || !batchSpans) {\n continue;\n }\n\n if (\n prob >= threshold &&\n startToken < batchStarts.length &&\n endToken < batchEnds.length\n ) {\n const globalBatch = batchIds[batch] ?? 0;\n const startIdx = batchStarts[startToken] ?? 0;\n const endIdx = batchEnds[endToken] ?? 0;\n const spanText = (texts[globalBatch] ?? \"\").slice(startIdx, endIdx);\n batchSpans.push([\n spanText,\n startIdx,\n endIdx,\n idToClass[entity + 1] ?? \"\",\n prob,\n ]);\n }\n }\n\n return spans.map((batchSpans) =>\n greedySearch(batchSpans, flatNer, multiLabel),\n );\n};\n","/**\n * Token-level BIO decoder for GLiNER TokenGLiNER models\n * (e.g., gliner-pii-edge-v1.0).\n *\n * These models output logits of shape [B, L, C, 3] where:\n * B = batch size\n * L = number of words (text_lengths)\n * C = number of entity classes\n * 3 = BIO tags: [B(egin), I(nside), O(utside)]\n *\n * This decoder converts BIO-tagged logits into entity spans\n * with character offsets.\n */\nimport type { RawInferenceResult } from \"./types\";\n\ntype Span = [string, number, number, string, number];\n\nconst sigmoid = (x: number): number => 1 / (1 + Math.exp(-x));\n\nconst B_TAG = 0;\nconst I_TAG = 1;\n\n/**\n * Decode token-level BIO logits into entity spans.\n *\n * For each word, checks if the B(egin) logit for any class\n * exceeds the threshold. If so, extends the span by consuming\n * subsequent I(nside) tokens of the same class.\n */\nexport const decodeTokenSpans = (\n batchSize: number,\n numWords: number,\n numEntities: number,\n texts: string[],\n batchIds: number[],\n batchWordsStartIdx: number[][],\n batchWordsEndIdx: number[][],\n idToClass: Record<number, string>,\n modelOutput: ArrayLike<number>,\n threshold: number,\n): RawInferenceResult => {\n const results: Span[][] = Array.from({ length: batchSize }, () => []);\n\n const wordStride = numEntities * 3;\n const batchStride = numWords * wordStride;\n\n for (let b = 0; b < batchSize; b++) {\n const batchOffset = b * batchStride;\n const starts = batchWordsStartIdx[b];\n const ends = batchWordsEndIdx[b];\n const globalBatch = batchIds[b] ?? 0;\n const text = texts[globalBatch] ?? \"\";\n const batchSpans = results[b];\n\n if (!starts || !ends || !batchSpans) {\n continue;\n }\n\n const actualWords = starts.length;\n\n for (let e = 0; e < numEntities; e++) {\n let w = 0;\n\n while (w < actualWords) {\n const bLogitIdx = batchOffset + w * wordStride + e * 3 + B_TAG;\n const bScore = sigmoid(modelOutput[bLogitIdx] ?? 0);\n\n if (bScore < threshold) {\n w++;\n continue;\n }\n\n const spanStart = w;\n let spanEnd = w;\n let maxScore = bScore;\n\n while (spanEnd + 1 < actualWords) {\n const iLogitIdx =\n batchOffset + (spanEnd + 1) * wordStride + e * 3 + I_TAG;\n const iScore = sigmoid(modelOutput[iLogitIdx] ?? 0);\n\n if (iScore < threshold) {\n break;\n }\n\n spanEnd++;\n maxScore = Math.max(maxScore, iScore);\n }\n\n const charStart = starts[spanStart] ?? 0;\n const charEnd = ends[spanEnd] ?? 0;\n const spanText = text.slice(charStart, charEnd);\n const label = idToClass[e + 1] ?? \"\";\n\n if (spanText.trim().length > 0 && label) {\n batchSpans.push([spanText, charStart, charEnd, label, maxScore]);\n }\n\n w = spanEnd + 1;\n }\n }\n\n const selected: Span[] = [];\n for (const span of batchSpans.toSorted((x, y) => y[4] - x[4])) {\n const overlaps = selected.some((s) => span[1] < s[2] && span[2] > s[1]);\n if (!overlaps) {\n selected.push(span);\n }\n }\n\n results[b] = selected.toSorted((x, y) => x[1] - y[1]);\n }\n\n return results;\n};\n","/**\n * Tokenization and input preparation for GLiNER span model.\n *\n * Splits text into word tokens, encodes via HuggingFace\n * tokenizer, and builds the span index grid that the ONNX\n * model expects as input.\n */\nimport type { Encoding, Tokenizer } from \"@huggingface/tokenizers\";\n\nconst segmenter = new Intl.Segmenter(undefined, {\n granularity: \"word\",\n});\n\n/** Tokenize text into words with character offsets. */\nexport const tokenizeText = (\n text: string,\n): [words: string[], starts: number[], ends: number[]] => {\n const words: string[] = [];\n const starts: number[] = [];\n const ends: number[] = [];\n\n for (const { segment, index, isWordLike } of segmenter.segment(text)) {\n // Include words and numeric segments (Intl.Segmenter\n // marks pure digit sequences as non-word-like, but the\n // NER model needs them for entity detection).\n if (!isWordLike && !/\\d/u.test(segment)) {\n continue;\n }\n words.push(segment);\n starts.push(index);\n ends.push(index + segment.length);\n }\n\n return [words, starts, ends];\n};\n\n/** Build entity label <-> id mappings. */\nconst createMappings = (\n labels: string[],\n): {\n classToId: Record<string, number>;\n idToClass: Record<number, string>;\n} => {\n const classToId: Record<string, number> = {};\n const idToClass: Record<number, string> = {};\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n if (label === undefined) {\n continue;\n }\n const id = i + 1;\n classToId[label] = id;\n idToClass[id] = label;\n }\n return { classToId, idToClass };\n};\n\n/** Prepend entity prompt tokens to word tokens. */\nconst prepareTextInputs = (\n batchTokens: string[][],\n entities: string[],\n): [inputTexts: string[][], textLengths: number[], promptLengths: number[]] => {\n const inputTexts: string[][] = [];\n const promptLengths: number[] = [];\n const textLengths: number[] = [];\n\n for (const tokens of batchTokens) {\n textLengths.push(tokens.length);\n\n const prompt: string[] = [];\n for (const ent of entities) {\n prompt.push(\"<<ENT>>\");\n prompt.push(ent);\n }\n prompt.push(\"<<SEP>>\");\n\n promptLengths.push(prompt.length);\n inputTexts.push([...prompt, ...tokens]);\n }\n\n return [inputTexts, textLengths, promptLengths];\n};\n\n/** Encode word sequences into token IDs with masks. */\nconst encodeInputs = (\n tokenizer: Tokenizer,\n texts: string[][],\n promptLengths: number[],\n): [\n inputIds: number[][],\n attentionMasks: number[][],\n wordsMasks: number[][],\n] => {\n // Resolve special token IDs dynamically instead of\n // hardcoding DeBERTa-v3 values. Fallbacks (1, 2) match\n // the current model but future models may differ.\n const clsTokenId = tokenizer.token_to_id(\"[CLS]\") ?? 1;\n const sepTokenId = tokenizer.token_to_id(\"[SEP]\") ?? 2;\n\n const allInputIds: number[][] = [];\n const allAttentionMasks: number[][] = [];\n const allWordsMasks: number[][] = [];\n\n for (let idx = 0; idx < texts.length; idx++) {\n const promptLength = promptLengths[idx] ?? 0;\n const words = texts[idx];\n if (!words) {\n continue;\n }\n const wordsMask: number[] = [0];\n const inputIds: number[] = [clsTokenId];\n const attentionMask: number[] = [1];\n\n let wordCounter = 1;\n for (let wordId = 0; wordId < words.length; wordId++) {\n const word = words[wordId];\n if (word === undefined) {\n continue;\n }\n // encode() returns { ids, tokens, attention_mask }\n // with BOS/EOS; strip them with slice(1, -1)\n const encoded: Encoding = tokenizer.encode(word);\n const wordTokens: number[] = encoded.ids.slice(1, -1);\n\n for (let tokenId = 0; tokenId < wordTokens.length; tokenId++) {\n attentionMask.push(1);\n if (wordId < promptLength) {\n wordsMask.push(0);\n } else if (tokenId === 0) {\n wordsMask.push(wordCounter);\n wordCounter++;\n } else {\n wordsMask.push(0);\n }\n inputIds.push(wordTokens[tokenId] ?? 0);\n }\n }\n\n inputIds.push(sepTokenId);\n wordsMask.push(0);\n attentionMask.push(1);\n\n allInputIds.push(inputIds);\n allAttentionMasks.push(attentionMask);\n allWordsMasks.push(wordsMask);\n }\n\n return [allInputIds, allAttentionMasks, allWordsMasks];\n};\n\n/** Build span index pairs and masks for the model. */\nconst prepareSpans = (\n batchTokens: string[][],\n maxWidth: number,\n): { spanIdxs: number[][][]; spanMasks: boolean[][] } => {\n const spanIdxs: number[][][] = [];\n const spanMasks: boolean[][] = [];\n\n for (const tokens of batchTokens) {\n const len = tokens.length;\n const idx: number[][] = [];\n const mask: boolean[] = [];\n\n for (let i = 0; i < len; i++) {\n for (let j = 0; j < maxWidth; j++) {\n const endIdx = Math.min(i + j, len - 1);\n idx.push([i, endIdx]);\n mask.push(endIdx < len);\n }\n }\n\n spanIdxs.push(idx);\n spanMasks.push(mask);\n }\n\n return { spanIdxs, spanMasks };\n};\n\n/** Pad a 2D or 3D array to uniform inner length. */\nexport const padArray = <T>(arr: T[][], dimensions: number = 2): T[][] => {\n if (arr.length === 0) {\n return [];\n }\n const maxLength = Math.max(...arr.map((sub) => sub.length));\n // For 3D arrays, infer inner dimension from the first\n // non-empty element (arr[0] may be empty when a batch\n // element had zero word tokens).\n let finalDim = 0;\n if (dimensions === 3) {\n for (const sub of arr) {\n if (sub.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- 3D arrays have number[] inner elements\n const inner = sub[0] as unknown as number[];\n finalDim = inner.length;\n break;\n }\n }\n }\n\n return arr.map((sub) => {\n const padCount = maxLength - sub.length;\n const fill =\n dimensions === 3\n ? Array.from({ length: padCount }, () =>\n Array.from<number>({ length: finalDim }).fill(0),\n )\n : Array.from<number>({ length: padCount }).fill(0);\n // SAFETY: fill values (zero arrays) match the shape of T\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- generic padding for ONNX tensor arrays\n return [...sub, ...(fill as T[])] as T[];\n });\n};\n\n/** Prepare a complete batch for ONNX inference. */\nexport const prepareBatch = (\n tokenizer: Tokenizer,\n texts: string[],\n entities: string[],\n maxWidth: number,\n): {\n inputsIds: number[][];\n attentionMasks: number[][];\n wordsMasks: number[][];\n textLengths: number[];\n spanIdxs: number[][][];\n spanMasks: boolean[][];\n idToClass: Record<number, string>;\n batchTokens: string[][];\n batchWordsStartIdx: number[][];\n batchWordsEndIdx: number[][];\n} => {\n const batchTokens: string[][] = [];\n const batchWordsStartIdx: number[][] = [];\n const batchWordsEndIdx: number[][] = [];\n\n for (const text of texts) {\n const [words, starts, ends] = tokenizeText(text);\n batchTokens.push(words);\n batchWordsStartIdx.push(starts);\n batchWordsEndIdx.push(ends);\n }\n\n const { idToClass } = createMappings(entities);\n\n const [inputTokens, textLengths, promptLengths] = prepareTextInputs(\n batchTokens,\n entities,\n );\n\n let [inputsIds, attentionMasks, wordsMasks] = encodeInputs(\n tokenizer,\n inputTokens,\n promptLengths,\n );\n\n inputsIds = padArray(inputsIds);\n attentionMasks = padArray(attentionMasks);\n wordsMasks = padArray(wordsMasks);\n\n let { spanIdxs, spanMasks } = prepareSpans(batchTokens, maxWidth);\n\n spanIdxs = padArray(spanIdxs, 3);\n spanMasks = padArray(spanMasks);\n\n return {\n inputsIds,\n attentionMasks,\n wordsMasks,\n textLengths,\n spanIdxs,\n spanMasks,\n idToClass,\n batchTokens,\n batchWordsStartIdx,\n batchWordsEndIdx,\n };\n};\n","import type { Entity } from \"../types\";\n\nconst MAX_CHUNK_CHARS = 1500;\nconst OVERLAP_CHARS = 50;\nconst MIN_CHUNK_LENGTH = 10;\n\n/**\n * Split text into overlapping chunks for GLiNER's\n * ~512 token context window. Character-based splitting\n * (rough approximation of token limits).\n *\n * Tries to break at sentence boundaries when possible.\n */\nexport const chunkText = (text: string): string[] => {\n const chunks: string[] = [];\n let offset = 0;\n\n while (offset < text.length) {\n let end = Math.min(offset + MAX_CHUNK_CHARS, text.length);\n\n if (end < text.length) {\n const slice = text.slice(offset, end);\n const lastPeriod = slice.lastIndexOf(\". \");\n if (lastPeriod > MAX_CHUNK_CHARS * 0.5) {\n end = offset + lastPeriod + 2;\n }\n }\n\n const chunk = text.slice(offset, end);\n if (chunk.trim().length > MIN_CHUNK_LENGTH) {\n chunks.push(chunk);\n }\n offset = Math.max(offset + 1, end - OVERLAP_CHARS);\n }\n\n return chunks;\n};\n\n/**\n * Compute the byte offset of each chunk within the\n * original document text.\n */\nexport const computeChunkOffsets = (\n fullText: string,\n chunks: string[],\n): number[] => {\n const offsets: number[] = [];\n let searchFrom = 0;\n\n for (const chunk of chunks) {\n const idx = fullText.indexOf(chunk, searchFrom);\n offsets.push(idx !== -1 ? idx : searchFrom);\n searchFrom =\n idx !== -1 ? idx + Math.max(1, chunk.length - OVERLAP_CHARS) : searchFrom;\n }\n\n return offsets;\n};\n\nconst POSITION_THRESHOLD = 5;\n\n/**\n * Merge entities from overlapping chunks back to\n * document-level offsets. Deduplicates entities that\n * appear in overlap regions (keeps highest score).\n *\n * Dedup invariant: each incoming entity is compared\n * against the highest-scored same-label near-dup in\n * its proximity window. If it loses, it is dropped.\n * This does NOT guarantee that all pairwise near-dup\n * relationships in the output are resolved; a lower-\n * scored entity can survive if the bridging entity\n * that would have replaced it was itself dropped by\n * a higher-scored match.\n *\n * Uses a reverse-scan over the sorted merged array\n * so each entity only compares against nearby\n * predecessors — O(n * w) average where w is the max\n * entities per POSITION_THRESHOLD window, O(n²) worst\n * case when replacements dominate (splice is O(n)).\n */\nexport const mergeChunkEntities = (\n chunkOffsets: number[],\n chunkResults: Entity[][],\n): Entity[] => {\n const allEntities: Entity[] = [];\n\n for (let i = 0; i < chunkResults.length; i++) {\n const offset = chunkOffsets[i] ?? 0;\n const entities = chunkResults[i];\n if (!entities) {\n continue;\n }\n for (const entity of entities) {\n allEntities.push({\n ...entity,\n start: entity.start + offset,\n end: entity.end + offset,\n });\n }\n }\n\n const sorted = allEntities.toSorted((a, b) => a.start - b.start);\n const merged: Entity[] = [];\n\n for (const entity of sorted) {\n let bestDupIndex = -1;\n let bestDupScore = -1;\n\n // Reverse-scan the full proximity window. Collect\n // the highest-scored same-label match so we dedup\n // against the strongest existing entity, not just\n // the nearest one.\n for (let j = merged.length - 1; j >= 0; j--) {\n const existing = merged[j];\n if (existing === undefined) {\n continue;\n }\n // merged is kept sorted by start (splice+push\n // maintains this); elements further back have\n // even smaller starts, so we can break early.\n if (entity.start - existing.start >= POSITION_THRESHOLD) {\n break;\n }\n if (\n existing.label === entity.label &&\n Math.abs(existing.end - entity.end) < POSITION_THRESHOLD &&\n existing.score > bestDupScore\n ) {\n bestDupIndex = j;\n bestDupScore = existing.score;\n }\n }\n\n if (bestDupIndex !== -1) {\n const existing = merged[bestDupIndex];\n if (existing !== undefined && entity.score > existing.score) {\n // Replace with winner. Splice out the old entry\n // and re-insert at the end to maintain sorted\n // order (entity.start >= all prior starts).\n merged.splice(bestDupIndex, 1);\n merged.push({ ...entity });\n }\n // Entity loses to the best match and is dropped.\n // Other lower-scored near-dups of this entity are\n // not revisited (see docstring dedup invariant).\n } else {\n merged.push({ ...entity });\n }\n }\n\n return merged;\n};\n","/**\n * Compute the Levenshtein edit distance between two\n * strings. O(n*m) time, O(min(n,m)) space using a\n * single-row DP approach.\n */\nexport const levenshtein = (rawA: string, rawB: string): number => {\n if (rawA === rawB) {\n return 0;\n }\n if (rawA.length === 0) {\n return rawB.length;\n }\n if (rawB.length === 0) {\n return rawA.length;\n }\n\n const [shorter, longer] =\n rawA.length <= rawB.length ? [rawA, rawB] : [rawB, rawA];\n\n const aLen = shorter.length;\n const bLen = longer.length;\n const row = new Uint16Array(aLen + 1);\n\n for (let i = 0; i <= aLen; i++) {\n row[i] = i;\n }\n\n for (let j = 1; j <= bLen; j++) {\n let prev = row[0] ?? 0;\n row[0] = j;\n\n for (let i = 1; i <= aLen; i++) {\n const cost = shorter[i - 1] === longer[j - 1] ? 0 : 1;\n const temp = row[i] ?? 0;\n row[i] = Math.min((row[i] ?? 0) + 1, (row[i - 1] ?? 0) + 1, prev + cost);\n prev = temp;\n }\n }\n\n return row[aLen] ?? 0;\n};\n","/* Browser/WASM entry point — loads TextSearch\n * from @stll/text-search-wasm and re-exports\n * the full anonymize API. */\n\nimport { TextSearch } from \"@stll/text-search-wasm\";\n\nimport { initTextSearch } from \"./search-engine\";\n\ninitTextSearch(TextSearch);\n\nexport * from \"./index-shared\";\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9],"mappings":"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"}